Files
Dramlog-Prod/.next/static/webpack/app/page.695770bacabf85e1.hot-update.js
2025-12-17 23:12:53 +01:00

523 lines
2.0 MiB
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"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/).
*/
self["webpackHotUpdate_N_E"]("app/page",{
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js":
/*!********************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js ***!
\********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n\nconst AuthAdminApi = _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (AuthAdminApi); //# sourceMappingURL=AuthAdminApi.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9BdXRoQWRtaW5BcGkuanMiLCJtYXBwaW5ncyI6Ijs7QUFBOEM7QUFDOUMsTUFBTUMsZUFBZUQsdURBQWNBO0FBQ25DLCtEQUFlQyxZQUFZQSxFQUFDLENBQzVCLHdDQUF3QyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvQXV0aEFkbWluQXBpLmpzPzIwNjEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEdvVHJ1ZUFkbWluQXBpIGZyb20gJy4vR29UcnVlQWRtaW5BcGknO1xuY29uc3QgQXV0aEFkbWluQXBpID0gR29UcnVlQWRtaW5BcGk7XG5leHBvcnQgZGVmYXVsdCBBdXRoQWRtaW5BcGk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdXRoQWRtaW5BcGkuanMubWFwIl0sIm5hbWVzIjpbIkdvVHJ1ZUFkbWluQXBpIiwiQXV0aEFkbWluQXBpIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js":
/*!******************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/AuthClient.js ***!
\******************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _GoTrueClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueClient */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\");\n\nconst AuthClient = _GoTrueClient__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n/* harmony default export */ __webpack_exports__[\"default\"] = (AuthClient); //# sourceMappingURL=AuthClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9BdXRoQ2xpZW50LmpzIiwibWFwcGluZ3MiOiI7O0FBQTBDO0FBQzFDLE1BQU1DLGFBQWFELHFEQUFZQTtBQUMvQiwrREFBZUMsVUFBVUEsRUFBQyxDQUMxQixzQ0FBc0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL0F1dGhDbGllbnQuanM/NGY4ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR29UcnVlQ2xpZW50IGZyb20gJy4vR29UcnVlQ2xpZW50JztcbmNvbnN0IEF1dGhDbGllbnQgPSBHb1RydWVDbGllbnQ7XG5leHBvcnQgZGVmYXVsdCBBdXRoQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXV0aENsaWVudC5qcy5tYXAiXSwibmFtZXMiOlsiR29UcnVlQ2xpZW50IiwiQXV0aENsaWVudCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js":
/*!**********************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js ***!
\**********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ GoTrueAdminApi; }\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tslib */ \"(app-pages-browser)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _lib_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/fetch */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js\");\n/* harmony import */ var _lib_helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/helpers */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n/* harmony import */ var _lib_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/types */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/types.js\");\n/* harmony import */ var _lib_errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/errors */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n\n\n\n\n\nclass GoTrueAdminApi {\n /**\n * Removes a logged-in session.\n * @param jwt A valid, logged-in JWT.\n * @param scope The logout sope.\n */ async signOut(jwt) {\n let scope = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : _lib_types__WEBPACK_IMPORTED_MODULE_2__.SIGN_OUT_SCOPES[0];\n if (_lib_types__WEBPACK_IMPORTED_MODULE_2__.SIGN_OUT_SCOPES.indexOf(scope) < 0) {\n throw new Error(\"@supabase/auth-js: Parameter scope must be one of \".concat(_lib_types__WEBPACK_IMPORTED_MODULE_2__.SIGN_OUT_SCOPES.join(\", \")));\n }\n try {\n await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/logout?scope=\").concat(scope), {\n headers: this.headers,\n jwt,\n noResolveJson: true\n });\n return {\n data: null,\n error: null\n };\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: null,\n error\n };\n }\n throw error;\n }\n }\n /**\n * Sends an invite link to an email address.\n * @param email The email address of the user.\n * @param options Additional options to be included when inviting.\n */ async inviteUserByEmail(email) {\n let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/invite\"), {\n body: {\n email,\n data: options.data\n },\n headers: this.headers,\n redirectTo: options.redirectTo,\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_0__._userResponse\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: {\n user: null\n },\n error\n };\n }\n throw error;\n }\n }\n /**\n * Generates email links and OTPs to be sent via a custom email provider.\n * @param email The user's email.\n * @param options.password User password. For signup only.\n * @param options.data Optional user metadata. For signup only.\n * @param options.redirectTo The redirect url which should be appended to the generated link\n */ async generateLink(params) {\n try {\n const { options } = params, rest = (0,tslib__WEBPACK_IMPORTED_MODULE_4__.__rest)(params, [\n \"options\"\n ]);\n const body = Object.assign(Object.assign({}, rest), options);\n if (\"newEmail\" in rest) {\n // replace newEmail with new_email in request body\n body.new_email = rest === null || rest === void 0 ? void 0 : rest.newEmail;\n delete body[\"newEmail\"];\n }\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/admin/generate_link\"), {\n body: body,\n headers: this.headers,\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_0__._generateLinkResponse,\n redirectTo: options === null || options === void 0 ? void 0 : options.redirectTo\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: {\n properties: null,\n user: null\n },\n error\n };\n }\n throw error;\n }\n }\n // User Admin API\n /**\n * Creates a new user.\n * This function should only be called on a server. Never expose your `service_role` key in the browser.\n */ async createUser(attributes) {\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/admin/users\"), {\n body: attributes,\n headers: this.headers,\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_0__._userResponse\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: {\n user: null\n },\n error\n };\n }\n throw error;\n }\n }\n /**\n * Get a list of users.\n *\n * This function should only be called on a server. Never expose your `service_role` key in the browser.\n * @param params An object which supports `page` and `perPage` as numbers, to alter the paginated results.\n */ async listUsers(params) {\n var _a, _b, _c, _d, _e, _f, _g;\n try {\n const pagination = {\n nextPage: null,\n lastPage: 0,\n total: 0\n };\n const response = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"GET\", \"\".concat(this.url, \"/admin/users\"), {\n headers: this.headers,\n noResolveJson: true,\n query: {\n page: (_b = (_a = params === null || params === void 0 ? void 0 : params.page) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : \"\",\n per_page: (_d = (_c = params === null || params === void 0 ? void 0 : params.perPage) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : \"\"\n },\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_0__._noResolveJsonResponse\n });\n if (response.error) throw response.error;\n const users = await response.json();\n const total = (_e = response.headers.get(\"x-total-count\")) !== null && _e !== void 0 ? _e : 0;\n const links = (_g = (_f = response.headers.get(\"link\")) === null || _f === void 0 ? void 0 : _f.split(\",\")) !== null && _g !== void 0 ? _g : [];\n if (links.length > 0) {\n links.forEach((link)=>{\n const page = parseInt(link.split(\";\")[0].split(\"=\")[1].substring(0, 1));\n const rel = JSON.parse(link.split(\";\")[1].split(\"=\")[1]);\n pagination[\"\".concat(rel, \"Page\")] = page;\n });\n pagination.total = parseInt(total);\n }\n return {\n data: Object.assign(Object.assign({}, users), pagination),\n error: null\n };\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: {\n users: []\n },\n error\n };\n }\n throw error;\n }\n }\n /**\n * Get user by id.\n *\n * @param uid The user's unique identifier\n *\n * This function should only be called on a server. Never expose your `service_role` key in the browser.\n */ async getUserById(uid) {\n (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_1__.validateUUID)(uid);\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"GET\", \"\".concat(this.url, \"/admin/users/\").concat(uid), {\n headers: this.headers,\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_0__._userResponse\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: {\n user: null\n },\n error\n };\n }\n throw error;\n }\n }\n /**\n * Updates the user data.\n *\n * @param attributes The data you want to update.\n *\n * This function should only be called on a server. Never expose your `service_role` key in the browser.\n */ async updateUserById(uid, attributes) {\n (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_1__.validateUUID)(uid);\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"PUT\", \"\".concat(this.url, \"/admin/users/\").concat(uid), {\n body: attributes,\n headers: this.headers,\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_0__._userResponse\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: {\n user: null\n },\n error\n };\n }\n throw error;\n }\n }\n /**\n * Delete a user. Requires a `service_role` key.\n *\n * @param id The user id you want to remove.\n * @param shouldSoftDelete If true, then the user will be soft-deleted from the auth schema. Soft deletion allows user identification from the hashed user ID but is not reversible.\n * Defaults to false for backward compatibility.\n *\n * This function should only be called on a server. Never expose your `service_role` key in the browser.\n */ async deleteUser(id) {\n let shouldSoftDelete = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;\n (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_1__.validateUUID)(id);\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"DELETE\", \"\".concat(this.url, \"/admin/users/\").concat(id), {\n headers: this.headers,\n body: {\n should_soft_delete: shouldSoftDelete\n },\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_0__._userResponse\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: {\n user: null\n },\n error\n };\n }\n throw error;\n }\n }\n async _listFactors(params) {\n (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_1__.validateUUID)(params.userId);\n try {\n const { data, error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"GET\", \"\".concat(this.url, \"/admin/users/\").concat(params.userId, \"/factors\"), {\n headers: this.headers,\n xform: (factors)=>{\n return {\n data: {\n factors\n },\n error: null\n };\n }\n });\n return {\n data,\n error\n };\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: null,\n error\n };\n }\n throw error;\n }\n }\n async _deleteFactor(params) {\n (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_1__.validateUUID)(params.userId);\n (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_1__.validateUUID)(params.id);\n try {\n const data = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"DELETE\", \"\".concat(this.url, \"/admin/users/\").concat(params.userId, \"/factors/\").concat(params.id), {\n headers: this.headers\n });\n return {\n data,\n error: null\n };\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: null,\n error\n };\n }\n throw error;\n }\n }\n /**\n * Lists all OAuth clients with optional pagination.\n * Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.\n *\n * This function should only be called on a server. Never expose your `service_role` key in the browser.\n */ async _listOAuthClients(params) {\n var _a, _b, _c, _d, _e, _f, _g;\n try {\n const pagination = {\n nextPage: null,\n lastPage: 0,\n total: 0\n };\n const response = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"GET\", \"\".concat(this.url, \"/admin/oauth/clients\"), {\n headers: this.headers,\n noResolveJson: true,\n query: {\n page: (_b = (_a = params === null || params === void 0 ? void 0 : params.page) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : \"\",\n per_page: (_d = (_c = params === null || params === void 0 ? void 0 : params.perPage) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : \"\"\n },\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_0__._noResolveJsonResponse\n });\n if (response.error) throw response.error;\n const clients = await response.json();\n const total = (_e = response.headers.get(\"x-total-count\")) !== null && _e !== void 0 ? _e : 0;\n const links = (_g = (_f = response.headers.get(\"link\")) === null || _f === void 0 ? void 0 : _f.split(\",\")) !== null && _g !== void 0 ? _g : [];\n if (links.length > 0) {\n links.forEach((link)=>{\n const page = parseInt(link.split(\";\")[0].split(\"=\")[1].substring(0, 1));\n const rel = JSON.parse(link.split(\";\")[1].split(\"=\")[1]);\n pagination[\"\".concat(rel, \"Page\")] = page;\n });\n pagination.total = parseInt(total);\n }\n return {\n data: Object.assign(Object.assign({}, clients), pagination),\n error: null\n };\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: {\n clients: []\n },\n error\n };\n }\n throw error;\n }\n }\n /**\n * Creates a new OAuth client.\n * Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.\n *\n * This function should only be called on a server. Never expose your `service_role` key in the browser.\n */ async _createOAuthClient(params) {\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/admin/oauth/clients\"), {\n body: params,\n headers: this.headers,\n xform: (client)=>{\n return {\n data: client,\n error: null\n };\n }\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: null,\n error\n };\n }\n throw error;\n }\n }\n /**\n * Gets details of a specific OAuth client.\n * Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.\n *\n * This function should only be called on a server. Never expose your `service_role` key in the browser.\n */ async _getOAuthClient(clientId) {\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"GET\", \"\".concat(this.url, \"/admin/oauth/clients/\").concat(clientId), {\n headers: this.headers,\n xform: (client)=>{\n return {\n data: client,\n error: null\n };\n }\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: null,\n error\n };\n }\n throw error;\n }\n }\n /**\n * Updates an existing OAuth client.\n * Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.\n *\n * This function should only be called on a server. Never expose your `service_role` key in the browser.\n */ async _updateOAuthClient(clientId, params) {\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"PUT\", \"\".concat(this.url, \"/admin/oauth/clients/\").concat(clientId), {\n body: params,\n headers: this.headers,\n xform: (client)=>{\n return {\n data: client,\n error: null\n };\n }\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: null,\n error\n };\n }\n throw error;\n }\n }\n /**\n * Deletes an OAuth client.\n * Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.\n *\n * This function should only be called on a server. Never expose your `service_role` key in the browser.\n */ async _deleteOAuthClient(clientId) {\n try {\n await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"DELETE\", \"\".concat(this.url, \"/admin/oauth/clients/\").concat(clientId), {\n headers: this.headers,\n noResolveJson: true\n });\n return {\n data: null,\n error: null\n };\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: null,\n error\n };\n }\n throw error;\n }\n }\n /**\n * Regenerates the secret for an OAuth client.\n * Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.\n *\n * This function should only be called on a server. Never expose your `service_role` key in the browser.\n */ async _regenerateOAuthClientSecret(clientId) {\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/admin/oauth/clients/\").concat(clientId, \"/regenerate_secret\"), {\n headers: this.headers,\n xform: (client)=>{\n return {\n data: client,\n error: null\n };\n }\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_3__.isAuthError)(error)) {\n return {\n data: null,\n error\n };\n }\n throw error;\n }\n }\n /**\n * Creates an admin API client that can be used to manage users and OAuth clients.\n *\n * @example\n * ```ts\n * import { GoTrueAdminApi } from '@supabase/auth-js'\n *\n * const admin = new GoTrueAdminApi({\n * url: 'https://xyzcompany.supabase.co/auth/v1',\n * headers: { Authorization: `Bearer ${process.env.SUPABASE_SERVICE_ROLE_KEY}` },\n * })\n * ```\n */ constructor({ url = \"\", headers = {}, fetch }){\n this.url = url;\n this.headers = headers;\n this.fetch = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_1__.resolveFetch)(fetch);\n this.mfa = {\n listFactors: this._listFactors.bind(this),\n deleteFactor: this._deleteFactor.bind(this)\n };\n this.oauth = {\n listClients: this._listOAuthClients.bind(this),\n createClient: this._createOAuthClient.bind(this),\n getClient: this._getOAuthClient.bind(this),\n updateClient: this._updateOAuthClient.bind(this),\n deleteClient: this._deleteOAuthClient.bind(this),\n regenerateClientSecret: this._regenerateOAuthClientSecret.bind(this)\n };\n }\n} //# sourceMappingURL=GoTrueAdminApi.js.map\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9Hb1RydWVBZG1pbkFwaS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBK0I7QUFDdUU7QUFDM0M7QUFDWjtBQUNKO0FBQzVCLE1BQU1TO0lBK0JqQjs7OztLQUlDLEdBQ0QsTUFBTUMsUUFBUUMsR0FBRyxFQUE4QjtZQUE1QkMsUUFBQUEsaUVBQVFMLHVEQUFlLENBQUMsRUFBRTtRQUN6QyxJQUFJQSx1REFBZUEsQ0FBQ00sT0FBTyxDQUFDRCxTQUFTLEdBQUc7WUFDcEMsTUFBTSxJQUFJRSxNQUFNLHFEQUFnRixPQUEzQlAsdURBQWVBLENBQUNRLElBQUksQ0FBQztRQUM5RjtRQUNBLElBQUk7WUFDQSxNQUFNWixvREFBUUEsQ0FBQyxJQUFJLENBQUNhLEtBQUssRUFBRSxRQUFRLEdBQTRCSixPQUF6QixJQUFJLENBQUNLLEdBQUcsRUFBQyxrQkFBc0IsT0FBTkwsUUFBUztnQkFDcEVNLFNBQVMsSUFBSSxDQUFDQSxPQUFPO2dCQUNyQlA7Z0JBQ0FRLGVBQWU7WUFDbkI7WUFDQSxPQUFPO2dCQUFFQyxNQUFNO2dCQUFNQyxPQUFPO1lBQUs7UUFDckMsRUFDQSxPQUFPQSxPQUFPO1lBQ1YsSUFBSWIsd0RBQVdBLENBQUNhLFFBQVE7Z0JBQ3BCLE9BQU87b0JBQUVELE1BQU07b0JBQU1DO2dCQUFNO1lBQy9CO1lBQ0EsTUFBTUE7UUFDVjtJQUNKO0lBQ0E7Ozs7S0FJQyxHQUNELE1BQU1DLGtCQUFrQkMsS0FBSyxFQUFnQjtZQUFkQyxVQUFBQSxpRUFBVSxDQUFDO1FBQ3RDLElBQUk7WUFDQSxPQUFPLE1BQU1yQixvREFBUUEsQ0FBQyxJQUFJLENBQUNhLEtBQUssRUFBRSxRQUFRLEdBQVksT0FBVCxJQUFJLENBQUNDLEdBQUcsRUFBQyxZQUFVO2dCQUM1RFEsTUFBTTtvQkFBRUY7b0JBQU9ILE1BQU1JLFFBQVFKLElBQUk7Z0JBQUM7Z0JBQ2xD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LGlCQUFpQixDQUFDWSxJQUFJLENBQUMsSUFBSTtZQUM3Q0ksY0FBYyxJQUFJLENBQUNkLGtCQUFrQixDQUFDVSxJQUFJLENBQUMsSUFBSTtZQUMvQ0ssV0FBVyxJQUFJLENBQUNiLGVBQWUsQ0FBQ1EsSUFBSSxDQUFDLElBQUk7WUFDekNNLGNBQWMsSUFBSSxDQUFDWixrQkFBa0IsQ0FBQ00sSUFBSSxDQUFDLElBQUk7WUFDL0NPLGNBQWMsSUFBSSxDQUFDWixrQkFBa0IsQ0FBQ0ssSUFBSSxDQUFDLElBQUk7WUFDL0NRLHdCQUF3QixJQUFJLENBQUNaLDRCQUE0QixDQUFDSSxJQUFJLENBQUMsSUFBSTtRQUN2RTtJQUNKO0FBaVpKLEVBQ0EsMENBQTBDO0FBRHpDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9Hb1RydWVBZG1pbkFwaS5qcz80YTA4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgX2dlbmVyYXRlTGlua1Jlc3BvbnNlLCBfbm9SZXNvbHZlSnNvblJlc3BvbnNlLCBfcmVxdWVzdCwgX3VzZXJSZXNwb25zZSwgfSBmcm9tICcuL2xpYi9mZXRjaCc7XG5pbXBvcnQgeyByZXNvbHZlRmV0Y2gsIHZhbGlkYXRlVVVJRCB9IGZyb20gJy4vbGliL2hlbHBlcnMnO1xuaW1wb3J0IHsgU0lHTl9PVVRfU0NPUEVTLCB9IGZyb20gJy4vbGliL3R5cGVzJztcbmltcG9ydCB7IGlzQXV0aEVycm9yIH0gZnJvbSAnLi9saWIvZXJyb3JzJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdvVHJ1ZUFkbWluQXBpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFkbWluIEFQSSBjbGllbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBtYW5hZ2UgdXNlcnMgYW5kIE9BdXRoIGNsaWVudHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgR29UcnVlQWRtaW5BcGkgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAgICAgKlxuICAgICAqIGNvbnN0IGFkbWluID0gbmV3IEdvVHJ1ZUFkbWluQXBpKHtcbiAgICAgKiAgIHVybDogJ2h0dHBzOi8veHl6Y29tcGFueS5zdXBhYmFzZS5jby9hdXRoL3YxJyxcbiAgICAgKiAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Byb2Nlc3MuZW52LlNVUEFCQVNFX1NFUlZJQ0VfUk9MRV9LRVl9YCB9LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoeyB1cmwgPSAnJywgaGVhZGVycyA9IHt9LCBmZXRjaCwgfSkge1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgdGhpcy5mZXRjaCA9IHJlc29sdmVGZXRjaChmZXRjaCk7XG4gICAgICAgIHRoaXMubWZhID0ge1xuICAgICAgICAgICAgbGlzdEZhY3RvcnM6IHRoaXMuX2xpc3RGYWN0b3JzLmJpbmQodGhpcyksXG4gICAgICAgICAgICBkZWxldGVGYWN0b3I6IHRoaXMuX2RlbGV0ZUZhY3Rvci5iaW5kKHRoaXMpLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9hdXRoID0ge1xuICAgICAgICAgICAgbGlzdENsaWVudHM6IHRoaXMuX2xpc3RPQXV0aENsaWVudHMuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGNyZWF0ZUNsaWVudDogdGhpcy5fY3JlYXRlT0F1dGhDbGllbnQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGdldENsaWVudDogdGhpcy5fZ2V0T0F1dGhDbGllbnQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHVwZGF0ZUNsaWVudDogdGhpcy5fdXBkYXRlT0F1dGhDbGllbnQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGRlbGV0ZUNsaWVudDogdGhpcy5fZGVsZXRlT0F1dGhDbGllbnQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJlZ2VuZXJhdGVDbGllbnRTZWNyZXQ6IHRoaXMuX3JlZ2VuZXJhdGVPQXV0aENsaWVudFNlY3JldC5iaW5kKHRoaXMpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgbG9nZ2VkLWluIHNlc3Npb24uXG4gICAgICogQHBhcmFtIGp3dCBBIHZhbGlkLCBsb2dnZWQtaW4gSldULlxuICAgICAqIEBwYXJhbSBzY29wZSBUaGUgbG9nb3V0IHNvcGUuXG4gICAgICovXG4gICAgYXN5bmMgc2lnbk91dChqd3QsIHNjb3BlID0gU0lHTl9PVVRfU0NPUEVTWzBdKSB7XG4gICAgICAgIGlmIChTSUdOX09VVF9TQ09QRVMuaW5kZXhPZihzY29wZSkgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBQYXJhbWV0ZXIgc2NvcGUgbXVzdCBiZSBvbmUgb2YgJHtTSUdOX09VVF9TQ09QRVMuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vbG9nb3V0P3Njb3BlPSR7c2NvcGV9YCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBqd3QsXG4gICAgICAgICAgICAgICAgbm9SZXNvbHZlSnNvbjogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYW4gaW52aXRlIGxpbmsgdG8gYW4gZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAcGFyYW0gZW1haWwgVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHVzZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQWRkaXRpb25hbCBvcHRpb25zIHRvIGJlIGluY2x1ZGVkIHdoZW4gaW52aXRpbmcuXG4gICAgICovXG4gICAgYXN5bmMgaW52aXRlVXNlckJ5RW1haWwoZW1haWwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L2ludml0ZWAsIHtcbiAgICAgICAgICAgICAgICBib2R5OiB7IGVtYWlsLCBkYXRhOiBvcHRpb25zLmRhdGEgfSxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RUbzogb3B0aW9ucy5yZWRpcmVjdFRvLFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfdXNlclJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBudWxsIH0sIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgZW1haWwgbGlua3MgYW5kIE9UUHMgdG8gYmUgc2VudCB2aWEgYSBjdXN0b20gZW1haWwgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIGVtYWlsIFRoZSB1c2VyJ3MgZW1haWwuXG4gICAgICogQHBhcmFtIG9wdGlvbnMucGFzc3dvcmQgVXNlciBwYXNzd29yZC4gRm9yIHNpZ251cCBvbmx5LlxuICAgICAqIEBwYXJhbSBvcHRpb25zLmRhdGEgT3B0aW9uYWwgdXNlciBtZXRhZGF0YS4gRm9yIHNpZ251cCBvbmx5LlxuICAgICAqIEBwYXJhbSBvcHRpb25zLnJlZGlyZWN0VG8gVGhlIHJlZGlyZWN0IHVybCB3aGljaCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlIGdlbmVyYXRlZCBsaW5rXG4gICAgICovXG4gICAgYXN5bmMgZ2VuZXJhdGVMaW5rKHBhcmFtcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJhbXMsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJvcHRpb25zXCJdKTtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3QpLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmICgnbmV3RW1haWwnIGluIHJlc3QpIHtcbiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIG5ld0VtYWlsIHdpdGggbmV3X2VtYWlsIGluIHJlcXVlc3QgYm9keVxuICAgICAgICAgICAgICAgIGJvZHkubmV3X2VtYWlsID0gcmVzdCA9PT0gbnVsbCB8fCByZXN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXN0Lm5ld0VtYWlsO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBib2R5WyduZXdFbWFpbCddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L2FkbWluL2dlbmVyYXRlX2xpbmtgLCB7XG4gICAgICAgICAgICAgICAgYm9keTogYm9keSxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IF9nZW5lcmF0ZUxpbmtSZXNwb25zZSxcbiAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucmVkaXJlY3RUbyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVXNlciBBZG1pbiBBUElcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHVzZXIuXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVVc2VyKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9hZG1pbi91c2Vyc2AsIHtcbiAgICAgICAgICAgICAgICBib2R5OiBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3VzZXJSZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEgbGlzdCBvZiB1c2Vycy5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICogQHBhcmFtIHBhcmFtcyBBbiBvYmplY3Qgd2hpY2ggc3VwcG9ydHMgYHBhZ2VgIGFuZCBgcGVyUGFnZWAgYXMgbnVtYmVycywgdG8gYWx0ZXIgdGhlIHBhZ2luYXRlZCByZXN1bHRzLlxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RVc2VycyhwYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGFnaW5hdGlvbiA9IHsgbmV4dFBhZ2U6IG51bGwsIGxhc3RQYWdlOiAwLCB0b3RhbDogMCB9O1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L2FkbWluL3VzZXJzYCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBub1Jlc29sdmVKc29uOiB0cnVlLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IChfYiA9IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wYWdlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudG9TdHJpbmcoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJycsXG4gICAgICAgICAgICAgICAgICAgIHBlcl9wYWdlOiAoX2QgPSAoX2MgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMucGVyUGFnZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnRvU3RyaW5nKCkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICcnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeGZvcm06IF9ub1Jlc29sdmVKc29uUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvcilcbiAgICAgICAgICAgICAgICB0aHJvdyByZXNwb25zZS5lcnJvcjtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgY29uc3QgdG90YWwgPSAoX2UgPSByZXNwb25zZS5oZWFkZXJzLmdldCgneC10b3RhbC1jb3VudCcpKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICAgICAgY29uc3QgbGlua3MgPSAoX2cgPSAoX2YgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnbGluaycpKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Yuc3BsaXQoJywnKSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogW107XG4gICAgICAgICAgICBpZiAobGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxpbmtzLmZvckVhY2goKGxpbmspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IHBhcnNlSW50KGxpbmsuc3BsaXQoJzsnKVswXS5zcGxpdCgnPScpWzFdLnN1YnN0cmluZygwLCAxKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbCA9IEpTT04ucGFyc2UobGluay5zcGxpdCgnOycpWzFdLnNwbGl0KCc9JylbMV0pO1xuICAgICAgICAgICAgICAgICAgICBwYWdpbmF0aW9uW2Ake3JlbH1QYWdlYF0gPSBwYWdlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhZ2luYXRpb24udG90YWwgPSBwYXJzZUludCh0b3RhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHVzZXJzKSwgcGFnaW5hdGlvbiksIGVycm9yOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyczogW10gfSwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB1c2VyIGJ5IGlkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVpZCBUaGUgdXNlcidzIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFVzZXJCeUlkKHVpZCkge1xuICAgICAgICB2YWxpZGF0ZVVVSUQodWlkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L2FkbWluL3VzZXJzLyR7dWlkfWAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IF91c2VyUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IG51bGwgfSwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHVzZXIgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIFRoZSBkYXRhIHlvdSB3YW50IHRvIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlVXNlckJ5SWQodWlkLCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHZhbGlkYXRlVVVJRCh1aWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQVVQnLCBgJHt0aGlzLnVybH0vYWRtaW4vdXNlcnMvJHt1aWR9YCwge1xuICAgICAgICAgICAgICAgIGJvZHk6IGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfdXNlclJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBudWxsIH0sIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYSB1c2VyLiBSZXF1aXJlcyBhIGBzZXJ2aWNlX3JvbGVgIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgdXNlciBpZCB5b3Ugd2FudCB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHNob3VsZFNvZnREZWxldGUgSWYgdHJ1ZSwgdGhlbiB0aGUgdXNlciB3aWxsIGJlIHNvZnQtZGVsZXRlZCBmcm9tIHRoZSBhdXRoIHNjaGVtYS4gU29mdCBkZWxldGlvbiBhbGxvd3MgdXNlciBpZGVudGlmaWNhdGlvbiBmcm9tIHRoZSBoYXNoZWQgdXNlciBJRCBidXQgaXMgbm90IHJldmVyc2libGUuXG4gICAgICogRGVmYXVsdHMgdG8gZmFsc2UgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZVVzZXIoaWQsIHNob3VsZFNvZnREZWxldGUgPSBmYWxzZSkge1xuICAgICAgICB2YWxpZGF0ZVVVSUQoaWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdERUxFVEUnLCBgJHt0aGlzLnVybH0vYWRtaW4vdXNlcnMvJHtpZH1gLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkX3NvZnRfZGVsZXRlOiBzaG91bGRTb2Z0RGVsZXRlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeGZvcm06IF91c2VyUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IG51bGwgfSwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9saXN0RmFjdG9ycyhwYXJhbXMpIHtcbiAgICAgICAgdmFsaWRhdGVVVUlEKHBhcmFtcy51c2VySWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0dFVCcsIGAke3RoaXMudXJsfS9hZG1pbi91c2Vycy8ke3BhcmFtcy51c2VySWR9L2ZhY3RvcnNgLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiAoZmFjdG9ycykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IGZhY3RvcnMgfSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfZGVsZXRlRmFjdG9yKHBhcmFtcykge1xuICAgICAgICB2YWxpZGF0ZVVVSUQocGFyYW1zLnVzZXJJZCk7XG4gICAgICAgIHZhbGlkYXRlVVVJRChwYXJhbXMuaWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdERUxFVEUnLCBgJHt0aGlzLnVybH0vYWRtaW4vdXNlcnMvJHtwYXJhbXMudXNlcklkfS9mYWN0b3JzLyR7cGFyYW1zLmlkfWAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3RzIGFsbCBPQXV0aCBjbGllbnRzIHdpdGggb3B0aW9uYWwgcGFnaW5hdGlvbi5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBfbGlzdE9BdXRoQ2xpZW50cyhwYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGFnaW5hdGlvbiA9IHsgbmV4dFBhZ2U6IG51bGwsIGxhc3RQYWdlOiAwLCB0b3RhbDogMCB9O1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L2FkbWluL29hdXRoL2NsaWVudHNgLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIG5vUmVzb2x2ZUpzb246IHRydWUsXG4gICAgICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZTogKF9iID0gKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgcGVyX3BhZ2U6IChfZCA9IChfYyA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wZXJQYWdlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudG9TdHJpbmcoKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX25vUmVzb2x2ZUpzb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKVxuICAgICAgICAgICAgICAgIHRocm93IHJlc3BvbnNlLmVycm9yO1xuICAgICAgICAgICAgY29uc3QgY2xpZW50cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gKF9lID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtdG90YWwtY291bnQnKSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtzID0gKF9nID0gKF9mID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2xpbmsnKSkgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLnNwbGl0KCcsJykpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IFtdO1xuICAgICAgICAgICAgaWYgKGxpbmtzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBwYXJzZUludChsaW5rLnNwbGl0KCc7JylbMF0uc3BsaXQoJz0nKVsxXS5zdWJzdHJpbmcoMCwgMSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWwgPSBKU09OLnBhcnNlKGxpbmsuc3BsaXQoJzsnKVsxXS5zcGxpdCgnPScpWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgcGFnaW5hdGlvbltgJHtyZWx9UGFnZWBdID0gcGFnZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYWdpbmF0aW9uLnRvdGFsID0gcGFyc2VJbnQodG90YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjbGllbnRzKSwgcGFnaW5hdGlvbiksIGVycm9yOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyBjbGllbnRzOiBbXSB9LCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBPQXV0aCBjbGllbnQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHRoZSBPQXV0aCAyLjEgc2VydmVyIGlzIGVuYWJsZWQgaW4gU3VwYWJhc2UgQXV0aC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgX2NyZWF0ZU9BdXRoQ2xpZW50KHBhcmFtcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L2FkbWluL29hdXRoL2NsaWVudHNgLCB7XG4gICAgICAgICAgICAgICAgYm9keTogcGFyYW1zLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogKGNsaWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBjbGllbnQsIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGRldGFpbHMgb2YgYSBzcGVjaWZpYyBPQXV0aCBjbGllbnQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHRoZSBPQXV0aCAyLjEgc2VydmVyIGlzIGVuYWJsZWQgaW4gU3VwYWJhc2UgQXV0aC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgX2dldE9BdXRoQ2xpZW50KGNsaWVudElkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0dFVCcsIGAke3RoaXMudXJsfS9hZG1pbi9vYXV0aC9jbGllbnRzLyR7Y2xpZW50SWR9YCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogKGNsaWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBjbGllbnQsIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGFuIGV4aXN0aW5nIE9BdXRoIGNsaWVudC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBfdXBkYXRlT0F1dGhDbGllbnQoY2xpZW50SWQsIHBhcmFtcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQVVQnLCBgJHt0aGlzLnVybH0vYWRtaW4vb2F1dGgvY2xpZW50cy8ke2NsaWVudElkfWAsIHtcbiAgICAgICAgICAgICAgICBib2R5OiBwYXJhbXMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiAoY2xpZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGNsaWVudCwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgYW4gT0F1dGggY2xpZW50LlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIF9kZWxldGVPQXV0aENsaWVudChjbGllbnRJZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0RFTEVURScsIGAke3RoaXMudXJsfS9hZG1pbi9vYXV0aC9jbGllbnRzLyR7Y2xpZW50SWR9YCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBub1Jlc29sdmVKc29uOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdlbmVyYXRlcyB0aGUgc2VjcmV0IGZvciBhbiBPQXV0aCBjbGllbnQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHRoZSBPQXV0aCAyLjEgc2VydmVyIGlzIGVuYWJsZWQgaW4gU3VwYWJhc2UgQXV0aC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgX3JlZ2VuZXJhdGVPQXV0aENsaWVudFNlY3JldChjbGllbnRJZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L2FkbWluL29hdXRoL2NsaWVudHMvJHtjbGllbnRJZH0vcmVnZW5lcmF0ZV9zZWNyZXRgLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiAoY2xpZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGNsaWVudCwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R29UcnVlQWRtaW5BcGkuanMubWFwIl0sIm5hbWVzIjpbIl9fcmVzdCIsIl9nZW5lcmF0ZUxpbmtSZXNwb25zZSIsIl9ub1Jlc29sdmVKc29uUmVzcG9uc2UiLCJfcmVxdWVzdCIsIl91c2VyUmVzcG9uc2UiLCJyZXNvbHZlRmV0Y2giLCJ2YWxpZGF0ZVVVSUQiLCJTSUdOX09VVF9TQ09QRVMiLCJpc0F1dGhFcnJvciIsIkdvVHJ1ZUFkbWluQXBpIiwic2lnbk91dCIsImp3dCIsInNjb3BlIiwiaW5kZXhPZiIsIkVycm9yIiwiam9pbiIsImZldGNoIiwidXJsIiwiaGVhZGVycyIsIm5vUmVzb2x2ZUpzb24iLCJkYXRhIiwiZXJyb3IiLCJpbnZpdGVVc2VyQnlFbWFpbCIsImVtYWlsIiwib3B0aW9ucyIsImJvZHkiLCJyZWRpcmVjdFRvIiwieGZvcm0iLCJ1c2VyIiwiZ2VuZXJhdGVMaW5rIiwicGFyYW1zIiwicmVzdCIsIk9iamVjdCIsImFzc2lnbiIsIm5ld19lbWFpbCIsIm5ld0VtYWlsIiwicHJvcGVydGllcyIsImNyZWF0ZVVzZXIiLCJhdHRyaWJ1dGVzIiwibGlzdFVzZXJzIiwiX2EiLCJfYiIsIl9jIiwiX2QiLCJfZSIsIl9mIiwiX2ciLCJwYWdpbmF0aW9uIiwibmV4dFBhZ2UiLCJsYXN0UGFnZSIsInRvdGFsIiwicmVzcG9uc2UiLCJxdWVyeSIsInBhZ2UiLCJ0b1N0cmluZyIsInBlcl9wYWdlIiwicGVyUGFnZSIsInVzZXJzIiwianNvbiIsImdldCIsImxpbmtzIiwic3BsaXQiLCJsZW5ndGgiLCJmb3JFYWNoIiwibGluayIsInBhcnNlSW50Iiwic3Vic3RyaW5nIiwicmVsIiwiSlNPTiIsInBhcnNlIiwiZ2V0VXNlckJ5SWQiLCJ1aWQiLCJ1cGRhdGVVc2VyQnlJZCIsImRlbGV0ZVVzZXIiLCJpZCIsInNob3VsZFNvZnREZWxldGUiLCJzaG91bGRfc29mdF9kZWxldGUiLCJfbGlzdEZhY3RvcnMiLCJ1c2VySWQiLCJmYWN0b3JzIiwiX2RlbGV0ZUZhY3RvciIsIl9saXN0T0F1dGhDbGllbnRzIiwiY2xpZW50cyIsIl9jcmVhdGVPQXV0aENsaWVudCIsImNsaWVudCIsIl9nZXRPQXV0aENsaWVudCIsImNsaWVudElkIiwiX3VwZGF0ZU9BdXRoQ2xpZW50IiwiX2RlbGV0ZU9BdXRoQ2xpZW50IiwiX3JlZ2VuZXJhdGVPQXV0aENsaWVudFNlY3JldCIsImNvbnN0cnVjdG9yIiwibWZhIiwibGlzdEZhY3RvcnMiLCJiaW5kIiwiZGVsZXRlRmFjdG9yIiwib2F1dGgiLCJsaXN0Q2xpZW50cyIsImNyZWF0ZUNsaWVudCIsImdldENsaWVudCIsInVwZGF0ZUNsaWVudCIsImRlbGV0ZUNsaWVudCIsInJlZ2VuZXJhdGVDbGllbnRTZWNyZXQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js":
/*!********************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js ***!
\********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/constants */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\");\n/* harmony import */ var _lib_errors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/errors */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _lib_fetch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/fetch */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js\");\n/* harmony import */ var _lib_helpers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/helpers */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n/* harmony import */ var _lib_local_storage__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib/local-storage */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js\");\n/* harmony import */ var _lib_locks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lib/locks */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js\");\n/* harmony import */ var _lib_polyfills__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lib/polyfills */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js\");\n/* harmony import */ var _lib_version__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./lib/version */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/version.js\");\n/* harmony import */ var _lib_base64url__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./lib/base64url */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js\");\n/* harmony import */ var _lib_web3_ethereum__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./lib/web3/ethereum */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js\");\n/* harmony import */ var _lib_webauthn__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./lib/webauthn */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n(0,_lib_polyfills__WEBPACK_IMPORTED_MODULE_7__.polyfillGlobalThis)(); // Make \"globalThis\" available\nconst DEFAULT_OPTIONS = {\n url: _lib_constants__WEBPACK_IMPORTED_MODULE_1__.GOTRUE_URL,\n storageKey: _lib_constants__WEBPACK_IMPORTED_MODULE_1__.STORAGE_KEY,\n autoRefreshToken: true,\n persistSession: true,\n detectSessionInUrl: true,\n headers: _lib_constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_HEADERS,\n flowType: \"implicit\",\n debug: false,\n hasCustomAuthorizationHeader: false,\n throwOnError: false\n};\nasync function lockNoOp(name, acquireTimeout, fn) {\n return await fn();\n}\n/**\n * Caches JWKS values for all clients created in the same environment. This is\n * especially useful for shared-memory execution environments such as Vercel's\n * Fluid Compute, AWS Lambda or Supabase's Edge Functions. Regardless of how\n * many clients are created, if they share the same storage key they will use\n * the same JWKS cache, significantly speeding up getClaims() with asymmetric\n * JWTs.\n */ const GLOBAL_JWKS = {};\nclass GoTrueClient {\n /**\n * The JWKS used for verifying asymmetric JWTs\n */ get jwks() {\n var _a, _b;\n return (_b = (_a = GLOBAL_JWKS[this.storageKey]) === null || _a === void 0 ? void 0 : _a.jwks) !== null && _b !== void 0 ? _b : {\n keys: []\n };\n }\n set jwks(value) {\n GLOBAL_JWKS[this.storageKey] = Object.assign(Object.assign({}, GLOBAL_JWKS[this.storageKey]), {\n jwks: value\n });\n }\n get jwks_cached_at() {\n var _a, _b;\n return (_b = (_a = GLOBAL_JWKS[this.storageKey]) === null || _a === void 0 ? void 0 : _a.cachedAt) !== null && _b !== void 0 ? _b : Number.MIN_SAFE_INTEGER;\n }\n set jwks_cached_at(value) {\n GLOBAL_JWKS[this.storageKey] = Object.assign(Object.assign({}, GLOBAL_JWKS[this.storageKey]), {\n cachedAt: value\n });\n }\n /**\n * Returns whether error throwing mode is enabled for this client.\n */ isThrowOnErrorEnabled() {\n return this.throwOnError;\n }\n /**\n * Centralizes return handling with optional error throwing. When `throwOnError` is enabled\n * and the provided result contains a non-nullish error, the error is thrown instead of\n * being returned. This ensures consistent behavior across all public API methods.\n */ _returnResult(result) {\n if (this.throwOnError && result && result.error) {\n throw result.error;\n }\n return result;\n }\n _logPrefix() {\n return \"GoTrueClient@\" + \"\".concat(this.storageKey, \":\").concat(this.instanceID, \" (\").concat(_lib_version__WEBPACK_IMPORTED_MODULE_8__.version, \") \").concat(new Date().toISOString());\n }\n _debug() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n if (this.logDebugMessages) {\n this.logger(this._logPrefix(), ...args);\n }\n return this;\n }\n /**\n * Initializes the client session either from the url or from storage.\n * This method is automatically called when instantiating the client, but should also be called\n * manually when checking for an error from an auth redirect (oauth, magiclink, password recovery, etc).\n */ async initialize() {\n if (this.initializePromise) {\n return await this.initializePromise;\n }\n this.initializePromise = (async ()=>{\n return await this._acquireLock(-1, async ()=>{\n return await this._initialize();\n });\n })();\n return await this.initializePromise;\n }\n /**\n * IMPORTANT:\n * 1. Never throw in this method, as it is called from the constructor\n * 2. Never return a session from this method as it would be cached over\n * the whole lifetime of the client\n */ async _initialize() {\n var _a;\n try {\n let params = {};\n let callbackUrlType = \"none\";\n if ((0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)()) {\n params = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.parseParametersFromURL)(window.location.href);\n if (this._isImplicitGrantCallback(params)) {\n callbackUrlType = \"implicit\";\n } else if (await this._isPKCECallback(params)) {\n callbackUrlType = \"pkce\";\n }\n }\n /**\n * Attempt to get the session from the URL only if these conditions are fulfilled\n *\n * Note: If the URL isn't one of the callback url types (implicit or pkce),\n * then there could be an existing session so we don't want to prematurely remove it\n */ if ((0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)() && this.detectSessionInUrl && callbackUrlType !== \"none\") {\n const { data, error } = await this._getSessionFromURL(params, callbackUrlType);\n if (error) {\n this._debug(\"#_initialize()\", \"error detecting session from URL\", error);\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthImplicitGrantRedirectError)(error)) {\n const errorCode = (_a = error.details) === null || _a === void 0 ? void 0 : _a.code;\n if (errorCode === \"identity_already_exists\" || errorCode === \"identity_not_found\" || errorCode === \"single_identity_not_deletable\") {\n return {\n error\n };\n }\n }\n // failed login attempt via url,\n // remove old session as in verifyOtp, signUp and signInWith*\n await this._removeSession();\n return {\n error\n };\n }\n const { session, redirectType } = data;\n this._debug(\"#_initialize()\", \"detected session in URL\", session, \"redirect type\", redirectType);\n await this._saveSession(session);\n setTimeout(async ()=>{\n if (redirectType === \"recovery\") {\n await this._notifyAllSubscribers(\"PASSWORD_RECOVERY\", session);\n } else {\n await this._notifyAllSubscribers(\"SIGNED_IN\", session);\n }\n }, 0);\n return {\n error: null\n };\n }\n // no login attempt via callback url try to recover session from storage\n await this._recoverAndRefresh();\n return {\n error: null\n };\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n error\n });\n }\n return this._returnResult({\n error: new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthUnknownError(\"Unexpected error during initialization\", error)\n });\n } finally{\n await this._handleVisibilityChange();\n this._debug(\"#_initialize()\", \"end\");\n }\n }\n /**\n * Creates a new anonymous user.\n *\n * @returns A session where the is_anonymous claim in the access token JWT set to true\n */ async signInAnonymously(credentials) {\n var _a, _b, _c;\n try {\n const res = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/signup\"), {\n headers: this.headers,\n body: {\n data: (_b = (_a = credentials === null || credentials === void 0 ? void 0 : credentials.options) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : {},\n gotrue_meta_security: {\n captcha_token: (_c = credentials === null || credentials === void 0 ? void 0 : credentials.options) === null || _c === void 0 ? void 0 : _c.captchaToken\n }\n },\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponse\n });\n const { data, error } = res;\n if (error || !data) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error: error\n });\n }\n const session = data.session;\n const user = data.user;\n if (data.session) {\n await this._saveSession(data.session);\n await this._notifyAllSubscribers(\"SIGNED_IN\", session);\n }\n return this._returnResult({\n data: {\n user,\n session\n },\n error: null\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Creates a new user.\n *\n * Be aware that if a user account exists in the system you may get back an\n * error message that attempts to hide this information from the user.\n * This method has support for PKCE via email signups. The PKCE flow cannot be used when autoconfirm is enabled.\n *\n * @returns A logged-in session if the server has \"autoconfirm\" ON\n * @returns A user if the server has \"autoconfirm\" OFF\n */ async signUp(credentials) {\n var _a, _b, _c;\n try {\n let res;\n if (\"email\" in credentials) {\n const { email, password, options } = credentials;\n let codeChallenge = null;\n let codeChallengeMethod = null;\n if (this.flowType === \"pkce\") {\n ;\n [codeChallenge, codeChallengeMethod] = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getCodeChallengeAndMethod)(this.storage, this.storageKey);\n }\n res = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/signup\"), {\n headers: this.headers,\n redirectTo: options === null || options === void 0 ? void 0 : options.emailRedirectTo,\n body: {\n email,\n password,\n data: (_a = options === null || options === void 0 ? void 0 : options.data) !== null && _a !== void 0 ? _a : {},\n gotrue_meta_security: {\n captcha_token: options === null || options === void 0 ? void 0 : options.captchaToken\n },\n code_challenge: codeChallenge,\n code_challenge_method: codeChallengeMethod\n },\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponse\n });\n } else if (\"phone\" in credentials) {\n const { phone, password, options } = credentials;\n res = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/signup\"), {\n headers: this.headers,\n body: {\n phone,\n password,\n data: (_b = options === null || options === void 0 ? void 0 : options.data) !== null && _b !== void 0 ? _b : {},\n channel: (_c = options === null || options === void 0 ? void 0 : options.channel) !== null && _c !== void 0 ? _c : \"sms\",\n gotrue_meta_security: {\n captcha_token: options === null || options === void 0 ? void 0 : options.captchaToken\n }\n },\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponse\n });\n } else {\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidCredentialsError(\"You must provide either an email or phone number and a password\");\n }\n const { data, error } = res;\n if (error || !data) {\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error: error\n });\n }\n const session = data.session;\n const user = data.user;\n if (data.session) {\n await this._saveSession(data.session);\n await this._notifyAllSubscribers(\"SIGNED_IN\", session);\n }\n return this._returnResult({\n data: {\n user,\n session\n },\n error: null\n });\n } catch (error) {\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Log in an existing user with an email and password or phone and password.\n *\n * Be aware that you may get back an error message that will not distinguish\n * between the cases where the account does not exist or that the\n * email/phone and password combination is wrong or that the account can only\n * be accessed via social login.\n */ async signInWithPassword(credentials) {\n try {\n let res;\n if (\"email\" in credentials) {\n const { email, password, options } = credentials;\n res = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/token?grant_type=password\"), {\n headers: this.headers,\n body: {\n email,\n password,\n gotrue_meta_security: {\n captcha_token: options === null || options === void 0 ? void 0 : options.captchaToken\n }\n },\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponsePassword\n });\n } else if (\"phone\" in credentials) {\n const { phone, password, options } = credentials;\n res = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/token?grant_type=password\"), {\n headers: this.headers,\n body: {\n phone,\n password,\n gotrue_meta_security: {\n captcha_token: options === null || options === void 0 ? void 0 : options.captchaToken\n }\n },\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponsePassword\n });\n } else {\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidCredentialsError(\"You must provide either an email or phone number and a password\");\n }\n const { data, error } = res;\n if (error) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n } else if (!data || !data.session || !data.user) {\n const invalidTokenError = new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidTokenResponseError();\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error: invalidTokenError\n });\n }\n if (data.session) {\n await this._saveSession(data.session);\n await this._notifyAllSubscribers(\"SIGNED_IN\", data.session);\n }\n return this._returnResult({\n data: Object.assign({\n user: data.user,\n session: data.session\n }, data.weak_password ? {\n weakPassword: data.weak_password\n } : null),\n error\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Log in an existing user via a third-party provider.\n * This method supports the PKCE flow.\n */ async signInWithOAuth(credentials) {\n var _a, _b, _c, _d;\n return await this._handleProviderSignIn(credentials.provider, {\n redirectTo: (_a = credentials.options) === null || _a === void 0 ? void 0 : _a.redirectTo,\n scopes: (_b = credentials.options) === null || _b === void 0 ? void 0 : _b.scopes,\n queryParams: (_c = credentials.options) === null || _c === void 0 ? void 0 : _c.queryParams,\n skipBrowserRedirect: (_d = credentials.options) === null || _d === void 0 ? void 0 : _d.skipBrowserRedirect\n });\n }\n /**\n * Log in an existing user by exchanging an Auth Code issued during the PKCE flow.\n */ async exchangeCodeForSession(authCode) {\n await this.initializePromise;\n return this._acquireLock(-1, async ()=>{\n return this._exchangeCodeForSession(authCode);\n });\n }\n /**\n * Signs in a user by verifying a message signed by the user's private key.\n * Supports Ethereum (via Sign-In-With-Ethereum) & Solana (Sign-In-With-Solana) standards,\n * both of which derive from the EIP-4361 standard\n * With slight variation on Solana's side.\n * @reference https://eips.ethereum.org/EIPS/eip-4361\n */ async signInWithWeb3(credentials) {\n const { chain } = credentials;\n switch(chain){\n case \"ethereum\":\n return await this.signInWithEthereum(credentials);\n case \"solana\":\n return await this.signInWithSolana(credentials);\n default:\n throw new Error('@supabase/auth-js: Unsupported chain \"'.concat(chain, '\"'));\n }\n }\n async signInWithEthereum(credentials) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;\n // TODO: flatten type\n let message;\n let signature;\n if (\"message\" in credentials) {\n message = credentials.message;\n signature = credentials.signature;\n } else {\n const { chain, wallet, statement, options } = credentials;\n let resolvedWallet;\n if (!(0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)()) {\n if (typeof wallet !== \"object\" || !(options === null || options === void 0 ? void 0 : options.url)) {\n throw new Error(\"@supabase/auth-js: Both wallet and url must be specified in non-browser environments.\");\n }\n resolvedWallet = wallet;\n } else if (typeof wallet === \"object\") {\n resolvedWallet = wallet;\n } else {\n const windowAny = window;\n if (\"ethereum\" in windowAny && typeof windowAny.ethereum === \"object\" && \"request\" in windowAny.ethereum && typeof windowAny.ethereum.request === \"function\") {\n resolvedWallet = windowAny.ethereum;\n } else {\n throw new Error(\"@supabase/auth-js: No compatible Ethereum wallet interface on the window object (window.ethereum) detected. Make sure the user already has a wallet installed and connected for this app. Prefer passing the wallet interface object directly to signInWithWeb3({ chain: 'ethereum', wallet: resolvedUserWallet }) instead.\");\n }\n }\n const url = new URL((_a = options === null || options === void 0 ? void 0 : options.url) !== null && _a !== void 0 ? _a : window.location.href);\n const accounts = await resolvedWallet.request({\n method: \"eth_requestAccounts\"\n }).then((accs)=>accs).catch(()=>{\n throw new Error(\"@supabase/auth-js: Wallet method eth_requestAccounts is missing or invalid\");\n });\n if (!accounts || accounts.length === 0) {\n throw new Error(\"@supabase/auth-js: No accounts available. Please ensure the wallet is connected.\");\n }\n const address = (0,_lib_web3_ethereum__WEBPACK_IMPORTED_MODULE_10__.getAddress)(accounts[0]);\n let chainId = (_b = options === null || options === void 0 ? void 0 : options.signInWithEthereum) === null || _b === void 0 ? void 0 : _b.chainId;\n if (!chainId) {\n const chainIdHex = await resolvedWallet.request({\n method: \"eth_chainId\"\n });\n chainId = (0,_lib_web3_ethereum__WEBPACK_IMPORTED_MODULE_10__.fromHex)(chainIdHex);\n }\n const siweMessage = {\n domain: url.host,\n address: address,\n statement: statement,\n uri: url.href,\n version: \"1\",\n chainId: chainId,\n nonce: (_c = options === null || options === void 0 ? void 0 : options.signInWithEthereum) === null || _c === void 0 ? void 0 : _c.nonce,\n issuedAt: (_e = (_d = options === null || options === void 0 ? void 0 : options.signInWithEthereum) === null || _d === void 0 ? void 0 : _d.issuedAt) !== null && _e !== void 0 ? _e : new Date(),\n expirationTime: (_f = options === null || options === void 0 ? void 0 : options.signInWithEthereum) === null || _f === void 0 ? void 0 : _f.expirationTime,\n notBefore: (_g = options === null || options === void 0 ? void 0 : options.signInWithEthereum) === null || _g === void 0 ? void 0 : _g.notBefore,\n requestId: (_h = options === null || options === void 0 ? void 0 : options.signInWithEthereum) === null || _h === void 0 ? void 0 : _h.requestId,\n resources: (_j = options === null || options === void 0 ? void 0 : options.signInWithEthereum) === null || _j === void 0 ? void 0 : _j.resources\n };\n message = (0,_lib_web3_ethereum__WEBPACK_IMPORTED_MODULE_10__.createSiweMessage)(siweMessage);\n // Sign message\n signature = await resolvedWallet.request({\n method: \"personal_sign\",\n params: [\n (0,_lib_web3_ethereum__WEBPACK_IMPORTED_MODULE_10__.toHex)(message),\n address\n ]\n });\n }\n try {\n const { data, error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/token?grant_type=web3\"), {\n headers: this.headers,\n body: Object.assign({\n chain: \"ethereum\",\n message,\n signature\n }, ((_k = credentials.options) === null || _k === void 0 ? void 0 : _k.captchaToken) ? {\n gotrue_meta_security: {\n captcha_token: (_l = credentials.options) === null || _l === void 0 ? void 0 : _l.captchaToken\n }\n } : null),\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponse\n });\n if (error) {\n throw error;\n }\n if (!data || !data.session || !data.user) {\n const invalidTokenError = new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidTokenResponseError();\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error: invalidTokenError\n });\n }\n if (data.session) {\n await this._saveSession(data.session);\n await this._notifyAllSubscribers(\"SIGNED_IN\", data.session);\n }\n return this._returnResult({\n data: Object.assign({}, data),\n error\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n }\n async signInWithSolana(credentials) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;\n let message;\n let signature;\n if (\"message\" in credentials) {\n message = credentials.message;\n signature = credentials.signature;\n } else {\n const { chain, wallet, statement, options } = credentials;\n let resolvedWallet;\n if (!(0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)()) {\n if (typeof wallet !== \"object\" || !(options === null || options === void 0 ? void 0 : options.url)) {\n throw new Error(\"@supabase/auth-js: Both wallet and url must be specified in non-browser environments.\");\n }\n resolvedWallet = wallet;\n } else if (typeof wallet === \"object\") {\n resolvedWallet = wallet;\n } else {\n const windowAny = window;\n if (\"solana\" in windowAny && typeof windowAny.solana === \"object\" && (\"signIn\" in windowAny.solana && typeof windowAny.solana.signIn === \"function\" || \"signMessage\" in windowAny.solana && typeof windowAny.solana.signMessage === \"function\")) {\n resolvedWallet = windowAny.solana;\n } else {\n throw new Error(\"@supabase/auth-js: No compatible Solana wallet interface on the window object (window.solana) detected. Make sure the user already has a wallet installed and connected for this app. Prefer passing the wallet interface object directly to signInWithWeb3({ chain: 'solana', wallet: resolvedUserWallet }) instead.\");\n }\n }\n const url = new URL((_a = options === null || options === void 0 ? void 0 : options.url) !== null && _a !== void 0 ? _a : window.location.href);\n if (\"signIn\" in resolvedWallet && resolvedWallet.signIn) {\n const output = await resolvedWallet.signIn(Object.assign(Object.assign(Object.assign({\n issuedAt: new Date().toISOString()\n }, options === null || options === void 0 ? void 0 : options.signInWithSolana), {\n // non-overridable properties\n version: \"1\",\n domain: url.host,\n uri: url.href\n }), statement ? {\n statement\n } : null));\n let outputToProcess;\n if (Array.isArray(output) && output[0] && typeof output[0] === \"object\") {\n outputToProcess = output[0];\n } else if (output && typeof output === \"object\" && \"signedMessage\" in output && \"signature\" in output) {\n outputToProcess = output;\n } else {\n throw new Error(\"@supabase/auth-js: Wallet method signIn() returned unrecognized value\");\n }\n if (\"signedMessage\" in outputToProcess && \"signature\" in outputToProcess && (typeof outputToProcess.signedMessage === \"string\" || outputToProcess.signedMessage instanceof Uint8Array) && outputToProcess.signature instanceof Uint8Array) {\n message = typeof outputToProcess.signedMessage === \"string\" ? outputToProcess.signedMessage : new TextDecoder().decode(outputToProcess.signedMessage);\n signature = outputToProcess.signature;\n } else {\n throw new Error(\"@supabase/auth-js: Wallet method signIn() API returned object without signedMessage and signature fields\");\n }\n } else {\n if (!(\"signMessage\" in resolvedWallet) || typeof resolvedWallet.signMessage !== \"function\" || !(\"publicKey\" in resolvedWallet) || typeof resolvedWallet !== \"object\" || !resolvedWallet.publicKey || !(\"toBase58\" in resolvedWallet.publicKey) || typeof resolvedWallet.publicKey.toBase58 !== \"function\") {\n throw new Error(\"@supabase/auth-js: Wallet does not have a compatible signMessage() and publicKey.toBase58() API\");\n }\n message = [\n \"\".concat(url.host, \" wants you to sign in with your Solana account:\"),\n resolvedWallet.publicKey.toBase58(),\n ...statement ? [\n \"\",\n statement,\n \"\"\n ] : [\n \"\"\n ],\n \"Version: 1\",\n \"URI: \".concat(url.href),\n \"Issued At: \".concat((_c = (_b = options === null || options === void 0 ? void 0 : options.signInWithSolana) === null || _b === void 0 ? void 0 : _b.issuedAt) !== null && _c !== void 0 ? _c : new Date().toISOString()),\n ...((_d = options === null || options === void 0 ? void 0 : options.signInWithSolana) === null || _d === void 0 ? void 0 : _d.notBefore) ? [\n \"Not Before: \".concat(options.signInWithSolana.notBefore)\n ] : [],\n ...((_e = options === null || options === void 0 ? void 0 : options.signInWithSolana) === null || _e === void 0 ? void 0 : _e.expirationTime) ? [\n \"Expiration Time: \".concat(options.signInWithSolana.expirationTime)\n ] : [],\n ...((_f = options === null || options === void 0 ? void 0 : options.signInWithSolana) === null || _f === void 0 ? void 0 : _f.chainId) ? [\n \"Chain ID: \".concat(options.signInWithSolana.chainId)\n ] : [],\n ...((_g = options === null || options === void 0 ? void 0 : options.signInWithSolana) === null || _g === void 0 ? void 0 : _g.nonce) ? [\n \"Nonce: \".concat(options.signInWithSolana.nonce)\n ] : [],\n ...((_h = options === null || options === void 0 ? void 0 : options.signInWithSolana) === null || _h === void 0 ? void 0 : _h.requestId) ? [\n \"Request ID: \".concat(options.signInWithSolana.requestId)\n ] : [],\n ...((_k = (_j = options === null || options === void 0 ? void 0 : options.signInWithSolana) === null || _j === void 0 ? void 0 : _j.resources) === null || _k === void 0 ? void 0 : _k.length) ? [\n \"Resources\",\n ...options.signInWithSolana.resources.map((resource)=>\"- \".concat(resource))\n ] : []\n ].join(\"\\n\");\n const maybeSignature = await resolvedWallet.signMessage(new TextEncoder().encode(message), \"utf8\");\n if (!maybeSignature || !(maybeSignature instanceof Uint8Array)) {\n throw new Error(\"@supabase/auth-js: Wallet signMessage() API returned an recognized value\");\n }\n signature = maybeSignature;\n }\n }\n try {\n const { data, error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/token?grant_type=web3\"), {\n headers: this.headers,\n body: Object.assign({\n chain: \"solana\",\n message,\n signature: (0,_lib_base64url__WEBPACK_IMPORTED_MODULE_9__.bytesToBase64URL)(signature)\n }, ((_l = credentials.options) === null || _l === void 0 ? void 0 : _l.captchaToken) ? {\n gotrue_meta_security: {\n captcha_token: (_m = credentials.options) === null || _m === void 0 ? void 0 : _m.captchaToken\n }\n } : null),\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponse\n });\n if (error) {\n throw error;\n }\n if (!data || !data.session || !data.user) {\n const invalidTokenError = new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidTokenResponseError();\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error: invalidTokenError\n });\n }\n if (data.session) {\n await this._saveSession(data.session);\n await this._notifyAllSubscribers(\"SIGNED_IN\", data.session);\n }\n return this._returnResult({\n data: Object.assign({}, data),\n error\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n }\n async _exchangeCodeForSession(authCode) {\n const storageItem = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n const [codeVerifier, redirectType] = (storageItem !== null && storageItem !== void 0 ? storageItem : \"\").split(\"/\");\n try {\n if (!codeVerifier && this.flowType === \"pkce\") {\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthPKCECodeVerifierMissingError();\n }\n const { data, error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/token?grant_type=pkce\"), {\n headers: this.headers,\n body: {\n auth_code: authCode,\n code_verifier: codeVerifier\n },\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponse\n });\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n if (error) {\n throw error;\n }\n if (!data || !data.session || !data.user) {\n const invalidTokenError = new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidTokenResponseError();\n return this._returnResult({\n data: {\n user: null,\n session: null,\n redirectType: null\n },\n error: invalidTokenError\n });\n }\n if (data.session) {\n await this._saveSession(data.session);\n await this._notifyAllSubscribers(\"SIGNED_IN\", data.session);\n }\n return this._returnResult({\n data: Object.assign(Object.assign({}, data), {\n redirectType: redirectType !== null && redirectType !== void 0 ? redirectType : null\n }),\n error\n });\n } catch (error) {\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null,\n redirectType: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Allows signing in with an OIDC ID token. The authentication provider used\n * should be enabled and configured.\n */ async signInWithIdToken(credentials) {\n try {\n const { options, provider, token, access_token, nonce } = credentials;\n const res = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/token?grant_type=id_token\"), {\n headers: this.headers,\n body: {\n provider,\n id_token: token,\n access_token,\n nonce,\n gotrue_meta_security: {\n captcha_token: options === null || options === void 0 ? void 0 : options.captchaToken\n }\n },\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponse\n });\n const { data, error } = res;\n if (error) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n } else if (!data || !data.session || !data.user) {\n const invalidTokenError = new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidTokenResponseError();\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error: invalidTokenError\n });\n }\n if (data.session) {\n await this._saveSession(data.session);\n await this._notifyAllSubscribers(\"SIGNED_IN\", data.session);\n }\n return this._returnResult({\n data,\n error\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Log in a user using magiclink or a one-time password (OTP).\n *\n * If the `{{ .ConfirmationURL }}` variable is specified in the email template, a magiclink will be sent.\n * If the `{{ .Token }}` variable is specified in the email template, an OTP will be sent.\n * If you're using phone sign-ins, only an OTP will be sent. You won't be able to send a magiclink for phone sign-ins.\n *\n * Be aware that you may get back an error message that will not distinguish\n * between the cases where the account does not exist or, that the account\n * can only be accessed via social login.\n *\n * Do note that you will need to configure a Whatsapp sender on Twilio\n * if you are using phone sign in with the 'whatsapp' channel. The whatsapp\n * channel is not supported on other providers\n * at this time.\n * This method supports PKCE when an email is passed.\n */ async signInWithOtp(credentials) {\n var _a, _b, _c, _d, _e;\n try {\n if (\"email\" in credentials) {\n const { email, options } = credentials;\n let codeChallenge = null;\n let codeChallengeMethod = null;\n if (this.flowType === \"pkce\") {\n ;\n [codeChallenge, codeChallengeMethod] = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getCodeChallengeAndMethod)(this.storage, this.storageKey);\n }\n const { error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/otp\"), {\n headers: this.headers,\n body: {\n email,\n data: (_a = options === null || options === void 0 ? void 0 : options.data) !== null && _a !== void 0 ? _a : {},\n create_user: (_b = options === null || options === void 0 ? void 0 : options.shouldCreateUser) !== null && _b !== void 0 ? _b : true,\n gotrue_meta_security: {\n captcha_token: options === null || options === void 0 ? void 0 : options.captchaToken\n },\n code_challenge: codeChallenge,\n code_challenge_method: codeChallengeMethod\n },\n redirectTo: options === null || options === void 0 ? void 0 : options.emailRedirectTo\n });\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n if (\"phone\" in credentials) {\n const { phone, options } = credentials;\n const { data, error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/otp\"), {\n headers: this.headers,\n body: {\n phone,\n data: (_c = options === null || options === void 0 ? void 0 : options.data) !== null && _c !== void 0 ? _c : {},\n create_user: (_d = options === null || options === void 0 ? void 0 : options.shouldCreateUser) !== null && _d !== void 0 ? _d : true,\n gotrue_meta_security: {\n captcha_token: options === null || options === void 0 ? void 0 : options.captchaToken\n },\n channel: (_e = options === null || options === void 0 ? void 0 : options.channel) !== null && _e !== void 0 ? _e : \"sms\"\n }\n });\n return this._returnResult({\n data: {\n user: null,\n session: null,\n messageId: data === null || data === void 0 ? void 0 : data.message_id\n },\n error\n });\n }\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidCredentialsError(\"You must provide either an email or phone number.\");\n } catch (error) {\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Log in a user given a User supplied OTP or TokenHash received through mobile or email.\n */ async verifyOtp(params) {\n var _a, _b;\n try {\n let redirectTo = undefined;\n let captchaToken = undefined;\n if (\"options\" in params) {\n redirectTo = (_a = params.options) === null || _a === void 0 ? void 0 : _a.redirectTo;\n captchaToken = (_b = params.options) === null || _b === void 0 ? void 0 : _b.captchaToken;\n }\n const { data, error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/verify\"), {\n headers: this.headers,\n body: Object.assign(Object.assign({}, params), {\n gotrue_meta_security: {\n captcha_token: captchaToken\n }\n }),\n redirectTo,\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponse\n });\n if (error) {\n throw error;\n }\n if (!data) {\n const tokenVerificationError = new Error(\"An error occurred on token verification.\");\n throw tokenVerificationError;\n }\n const session = data.session;\n const user = data.user;\n if (session === null || session === void 0 ? void 0 : session.access_token) {\n await this._saveSession(session);\n await this._notifyAllSubscribers(params.type == \"recovery\" ? \"PASSWORD_RECOVERY\" : \"SIGNED_IN\", session);\n }\n return this._returnResult({\n data: {\n user,\n session\n },\n error: null\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Attempts a single-sign on using an enterprise Identity Provider. A\n * successful SSO attempt will redirect the current page to the identity\n * provider authorization page. The redirect URL is implementation and SSO\n * protocol specific.\n *\n * You can use it by providing a SSO domain. Typically you can extract this\n * domain by asking users for their email address. If this domain is\n * registered on the Auth instance the redirect will use that organization's\n * currently active SSO Identity Provider for the login.\n *\n * If you have built an organization-specific login page, you can use the\n * organization's SSO Identity Provider UUID directly instead.\n */ async signInWithSSO(params) {\n var _a, _b, _c, _d, _e;\n try {\n let codeChallenge = null;\n let codeChallengeMethod = null;\n if (this.flowType === \"pkce\") {\n ;\n [codeChallenge, codeChallengeMethod] = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getCodeChallengeAndMethod)(this.storage, this.storageKey);\n }\n const result = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/sso\"), {\n body: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, \"providerId\" in params ? {\n provider_id: params.providerId\n } : null), \"domain\" in params ? {\n domain: params.domain\n } : null), {\n redirect_to: (_b = (_a = params.options) === null || _a === void 0 ? void 0 : _a.redirectTo) !== null && _b !== void 0 ? _b : undefined\n }), ((_c = params === null || params === void 0 ? void 0 : params.options) === null || _c === void 0 ? void 0 : _c.captchaToken) ? {\n gotrue_meta_security: {\n captcha_token: params.options.captchaToken\n }\n } : null), {\n skip_http_redirect: true,\n code_challenge: codeChallenge,\n code_challenge_method: codeChallengeMethod\n }),\n headers: this.headers,\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._ssoResponse\n });\n // Automatically redirect in browser unless skipBrowserRedirect is true\n if (((_d = result.data) === null || _d === void 0 ? void 0 : _d.url) && (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)() && !((_e = params.options) === null || _e === void 0 ? void 0 : _e.skipBrowserRedirect)) {\n window.location.assign(result.data.url);\n }\n return this._returnResult(result);\n } catch (error) {\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n /**\n * Sends a reauthentication OTP to the user's email or phone number.\n * Requires the user to be signed-in.\n */ async reauthenticate() {\n await this.initializePromise;\n return await this._acquireLock(-1, async ()=>{\n return await this._reauthenticate();\n });\n }\n async _reauthenticate() {\n try {\n return await this._useSession(async (result)=>{\n const { data: { session }, error: sessionError } = result;\n if (sessionError) throw sessionError;\n if (!session) throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError();\n const { error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"GET\", \"\".concat(this.url, \"/reauthenticate\"), {\n headers: this.headers,\n jwt: session.access_token\n });\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Resends an existing signup confirmation email, email change email, SMS OTP or phone change OTP.\n */ async resend(credentials) {\n try {\n const endpoint = \"\".concat(this.url, \"/resend\");\n if (\"email\" in credentials) {\n const { email, type, options } = credentials;\n const { error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", endpoint, {\n headers: this.headers,\n body: {\n email,\n type,\n gotrue_meta_security: {\n captcha_token: options === null || options === void 0 ? void 0 : options.captchaToken\n }\n },\n redirectTo: options === null || options === void 0 ? void 0 : options.emailRedirectTo\n });\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n } else if (\"phone\" in credentials) {\n const { phone, type, options } = credentials;\n const { data, error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", endpoint, {\n headers: this.headers,\n body: {\n phone,\n type,\n gotrue_meta_security: {\n captcha_token: options === null || options === void 0 ? void 0 : options.captchaToken\n }\n }\n });\n return this._returnResult({\n data: {\n user: null,\n session: null,\n messageId: data === null || data === void 0 ? void 0 : data.message_id\n },\n error\n });\n }\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidCredentialsError(\"You must provide either an email or phone number and a type\");\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Returns the session, refreshing it if necessary.\n *\n * The session returned can be null if the session is not detected which can happen in the event a user is not signed-in or has logged out.\n *\n * **IMPORTANT:** This method loads values directly from the storage attached\n * to the client. If that storage is based on request cookies for example,\n * the values in it may not be authentic and therefore it's strongly advised\n * against using this method and its results in such circumstances. A warning\n * will be emitted if this is detected. Use {@link #getUser()} instead.\n */ async getSession() {\n await this.initializePromise;\n const result = await this._acquireLock(-1, async ()=>{\n return this._useSession(async (result)=>{\n return result;\n });\n });\n return result;\n }\n /**\n * Acquires a global lock based on the storage key.\n */ async _acquireLock(acquireTimeout, fn) {\n this._debug(\"#_acquireLock\", \"begin\", acquireTimeout);\n try {\n if (this.lockAcquired) {\n const last = this.pendingInLock.length ? this.pendingInLock[this.pendingInLock.length - 1] : Promise.resolve();\n const result = (async ()=>{\n await last;\n return await fn();\n })();\n this.pendingInLock.push((async ()=>{\n try {\n await result;\n } catch (e) {\n // we just care if it finished\n }\n })());\n return result;\n }\n return await this.lock(\"lock:\".concat(this.storageKey), acquireTimeout, async ()=>{\n this._debug(\"#_acquireLock\", \"lock acquired for storage key\", this.storageKey);\n try {\n this.lockAcquired = true;\n const result = fn();\n this.pendingInLock.push((async ()=>{\n try {\n await result;\n } catch (e) {\n // we just care if it finished\n }\n })());\n await result;\n // keep draining the queue until there's nothing to wait on\n while(this.pendingInLock.length){\n const waitOn = [\n ...this.pendingInLock\n ];\n await Promise.all(waitOn);\n this.pendingInLock.splice(0, waitOn.length);\n }\n return await result;\n } finally{\n this._debug(\"#_acquireLock\", \"lock released for storage key\", this.storageKey);\n this.lockAcquired = false;\n }\n });\n } finally{\n this._debug(\"#_acquireLock\", \"end\");\n }\n }\n /**\n * Use instead of {@link #getSession} inside the library. It is\n * semantically usually what you want, as getting a session involves some\n * processing afterwards that requires only one client operating on the\n * session at once across multiple tabs or processes.\n */ async _useSession(fn) {\n this._debug(\"#_useSession\", \"begin\");\n try {\n // the use of __loadSession here is the only correct use of the function!\n const result = await this.__loadSession();\n return await fn(result);\n } finally{\n this._debug(\"#_useSession\", \"end\");\n }\n }\n /**\n * NEVER USE DIRECTLY!\n *\n * Always use {@link #_useSession}.\n */ async __loadSession() {\n this._debug(\"#__loadSession()\", \"begin\");\n if (!this.lockAcquired) {\n this._debug(\"#__loadSession()\", \"used outside of an acquired lock!\", new Error().stack);\n }\n try {\n let currentSession = null;\n const maybeSession = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getItemAsync)(this.storage, this.storageKey);\n this._debug(\"#getSession()\", \"session from storage\", maybeSession);\n if (maybeSession !== null) {\n if (this._isValidSession(maybeSession)) {\n currentSession = maybeSession;\n } else {\n this._debug(\"#getSession()\", \"session from storage is not valid\");\n await this._removeSession();\n }\n }\n if (!currentSession) {\n return {\n data: {\n session: null\n },\n error: null\n };\n }\n // A session is considered expired before the access token _actually_\n // expires. When the autoRefreshToken option is off (or when the tab is\n // in the background), very eager users of getSession() -- like\n // realtime-js -- might send a valid JWT which will expire by the time it\n // reaches the server.\n const hasExpired = currentSession.expires_at ? currentSession.expires_at * 1000 - Date.now() < _lib_constants__WEBPACK_IMPORTED_MODULE_1__.EXPIRY_MARGIN_MS : false;\n this._debug(\"#__loadSession()\", \"session has\".concat(hasExpired ? \"\" : \" not\", \" expired\"), \"expires_at\", currentSession.expires_at);\n if (!hasExpired) {\n if (this.userStorage) {\n const maybeUser = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getItemAsync)(this.userStorage, this.storageKey + \"-user\");\n if (maybeUser === null || maybeUser === void 0 ? void 0 : maybeUser.user) {\n currentSession.user = maybeUser.user;\n } else {\n currentSession.user = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.userNotAvailableProxy)();\n }\n }\n // Wrap the user object with a warning proxy on the server\n // This warns when properties of the user are accessed, not when session.user itself is accessed\n if (this.storage.isServer && currentSession.user && !currentSession.user.__isUserNotAvailableProxy) {\n const suppressWarningRef = {\n value: this.suppressGetSessionWarning\n };\n currentSession.user = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.insecureUserWarningProxy)(currentSession.user, suppressWarningRef);\n // Update the client-level suppression flag when the proxy suppresses the warning\n if (suppressWarningRef.value) {\n this.suppressGetSessionWarning = true;\n }\n }\n return {\n data: {\n session: currentSession\n },\n error: null\n };\n }\n const { data: session, error } = await this._callRefreshToken(currentSession.refresh_token);\n if (error) {\n return this._returnResult({\n data: {\n session: null\n },\n error\n });\n }\n return this._returnResult({\n data: {\n session\n },\n error: null\n });\n } finally{\n this._debug(\"#__loadSession()\", \"end\");\n }\n }\n /**\n * Gets the current user details if there is an existing session. This method\n * performs a network request to the Supabase Auth server, so the returned\n * value is authentic and can be used to base authorization rules on.\n *\n * @param jwt Takes in an optional access token JWT. If no JWT is provided, the JWT from the current session is used.\n */ async getUser(jwt) {\n if (jwt) {\n return await this._getUser(jwt);\n }\n await this.initializePromise;\n const result = await this._acquireLock(-1, async ()=>{\n return await this._getUser();\n });\n if (result.data.user) {\n this.suppressGetSessionWarning = true;\n }\n return result;\n }\n async _getUser(jwt) {\n try {\n if (jwt) {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"GET\", \"\".concat(this.url, \"/user\"), {\n headers: this.headers,\n jwt: jwt,\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._userResponse\n });\n }\n return await this._useSession(async (result)=>{\n var _a, _b, _c;\n const { data, error } = result;\n if (error) {\n throw error;\n }\n // returns an error if there is no access_token or custom authorization header\n if (!((_a = data.session) === null || _a === void 0 ? void 0 : _a.access_token) && !this.hasCustomAuthorizationHeader) {\n return {\n data: {\n user: null\n },\n error: new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError()\n };\n }\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"GET\", \"\".concat(this.url, \"/user\"), {\n headers: this.headers,\n jwt: (_c = (_b = data.session) === null || _b === void 0 ? void 0 : _b.access_token) !== null && _c !== void 0 ? _c : undefined,\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._userResponse\n });\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthSessionMissingError)(error)) {\n // JWT contains a `session_id` which does not correspond to an active\n // session in the database, indicating the user is signed out.\n await this._removeSession();\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n }\n return this._returnResult({\n data: {\n user: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Updates user data for a logged in user.\n */ async updateUser(attributes) {\n let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n await this.initializePromise;\n return await this._acquireLock(-1, async ()=>{\n return await this._updateUser(attributes, options);\n });\n }\n async _updateUser(attributes) {\n let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n try {\n return await this._useSession(async (result)=>{\n const { data: sessionData, error: sessionError } = result;\n if (sessionError) {\n throw sessionError;\n }\n if (!sessionData.session) {\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError();\n }\n const session = sessionData.session;\n let codeChallenge = null;\n let codeChallengeMethod = null;\n if (this.flowType === \"pkce\" && attributes.email != null) {\n ;\n [codeChallenge, codeChallengeMethod] = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getCodeChallengeAndMethod)(this.storage, this.storageKey);\n }\n const { data, error: userError } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"PUT\", \"\".concat(this.url, \"/user\"), {\n headers: this.headers,\n redirectTo: options === null || options === void 0 ? void 0 : options.emailRedirectTo,\n body: Object.assign(Object.assign({}, attributes), {\n code_challenge: codeChallenge,\n code_challenge_method: codeChallengeMethod\n }),\n jwt: session.access_token,\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._userResponse\n });\n if (userError) {\n throw userError;\n }\n session.user = data.user;\n await this._saveSession(session);\n await this._notifyAllSubscribers(\"USER_UPDATED\", session);\n return this._returnResult({\n data: {\n user: session.user\n },\n error: null\n });\n });\n } catch (error) {\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Sets the session data from the current session. If the current session is expired, setSession will take care of refreshing it to obtain a new session.\n * If the refresh token or access token in the current session is invalid, an error will be thrown.\n * @param currentSession The current session that minimally contains an access token and refresh token.\n */ async setSession(currentSession) {\n await this.initializePromise;\n return await this._acquireLock(-1, async ()=>{\n return await this._setSession(currentSession);\n });\n }\n async _setSession(currentSession) {\n try {\n if (!currentSession.access_token || !currentSession.refresh_token) {\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError();\n }\n const timeNow = Date.now() / 1000;\n let expiresAt = timeNow;\n let hasExpired = true;\n let session = null;\n const { payload } = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.decodeJWT)(currentSession.access_token);\n if (payload.exp) {\n expiresAt = payload.exp;\n hasExpired = expiresAt <= timeNow;\n }\n if (hasExpired) {\n const { data: refreshedSession, error } = await this._callRefreshToken(currentSession.refresh_token);\n if (error) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error: error\n });\n }\n if (!refreshedSession) {\n return {\n data: {\n user: null,\n session: null\n },\n error: null\n };\n }\n session = refreshedSession;\n } else {\n const { data, error } = await this._getUser(currentSession.access_token);\n if (error) {\n throw error;\n }\n session = {\n access_token: currentSession.access_token,\n refresh_token: currentSession.refresh_token,\n user: data.user,\n token_type: \"bearer\",\n expires_in: expiresAt - timeNow,\n expires_at: expiresAt\n };\n await this._saveSession(session);\n await this._notifyAllSubscribers(\"SIGNED_IN\", session);\n }\n return this._returnResult({\n data: {\n user: session.user,\n session\n },\n error: null\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n session: null,\n user: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Returns a new session, regardless of expiry status.\n * Takes in an optional current session. If not passed in, then refreshSession() will attempt to retrieve it from getSession().\n * If the current session's refresh token is invalid, an error will be thrown.\n * @param currentSession The current session. If passed in, it must contain a refresh token.\n */ async refreshSession(currentSession) {\n await this.initializePromise;\n return await this._acquireLock(-1, async ()=>{\n return await this._refreshSession(currentSession);\n });\n }\n async _refreshSession(currentSession) {\n try {\n return await this._useSession(async (result)=>{\n var _a;\n if (!currentSession) {\n const { data, error } = result;\n if (error) {\n throw error;\n }\n currentSession = (_a = data.session) !== null && _a !== void 0 ? _a : undefined;\n }\n if (!(currentSession === null || currentSession === void 0 ? void 0 : currentSession.refresh_token)) {\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError();\n }\n const { data: session, error } = await this._callRefreshToken(currentSession.refresh_token);\n if (error) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error: error\n });\n }\n if (!session) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error: null\n });\n }\n return this._returnResult({\n data: {\n user: session.user,\n session\n },\n error: null\n });\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Gets the session data from a URL string\n */ async _getSessionFromURL(params, callbackUrlType) {\n try {\n if (!(0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)()) throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthImplicitGrantRedirectError(\"No browser detected.\");\n // If there's an error in the URL, it doesn't matter what flow it is, we just return the error.\n if (params.error || params.error_description || params.error_code) {\n // The error class returned implies that the redirect is from an implicit grant flow\n // but it could also be from a redirect error from a PKCE flow.\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthImplicitGrantRedirectError(params.error_description || \"Error in URL with unspecified error_description\", {\n error: params.error || \"unspecified_error\",\n code: params.error_code || \"unspecified_code\"\n });\n }\n // Checks for mismatches between the flowType initialised in the client and the URL parameters\n switch(callbackUrlType){\n case \"implicit\":\n if (this.flowType === \"pkce\") {\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthPKCEGrantCodeExchangeError(\"Not a valid PKCE flow url.\");\n }\n break;\n case \"pkce\":\n if (this.flowType === \"implicit\") {\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthImplicitGrantRedirectError(\"Not a valid implicit grant flow url.\");\n }\n break;\n default:\n }\n // Since this is a redirect for PKCE, we attempt to retrieve the code from the URL for the code exchange\n if (callbackUrlType === \"pkce\") {\n this._debug(\"#_initialize()\", \"begin\", \"is PKCE flow\", true);\n if (!params.code) throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthPKCEGrantCodeExchangeError(\"No code detected.\");\n const { data, error } = await this._exchangeCodeForSession(params.code);\n if (error) throw error;\n const url = new URL(window.location.href);\n url.searchParams.delete(\"code\");\n window.history.replaceState(window.history.state, \"\", url.toString());\n return {\n data: {\n session: data.session,\n redirectType: null\n },\n error: null\n };\n }\n const { provider_token, provider_refresh_token, access_token, refresh_token, expires_in, expires_at, token_type } = params;\n if (!access_token || !expires_in || !refresh_token || !token_type) {\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthImplicitGrantRedirectError(\"No session defined in URL\");\n }\n const timeNow = Math.round(Date.now() / 1000);\n const expiresIn = parseInt(expires_in);\n let expiresAt = timeNow + expiresIn;\n if (expires_at) {\n expiresAt = parseInt(expires_at);\n }\n const actuallyExpiresIn = expiresAt - timeNow;\n if (actuallyExpiresIn * 1000 <= _lib_constants__WEBPACK_IMPORTED_MODULE_1__.AUTO_REFRESH_TICK_DURATION_MS) {\n console.warn(\"@supabase/gotrue-js: Session as retrieved from URL expires in \".concat(actuallyExpiresIn, \"s, should have been closer to \").concat(expiresIn, \"s\"));\n }\n const issuedAt = expiresAt - expiresIn;\n if (timeNow - issuedAt >= 120) {\n console.warn(\"@supabase/gotrue-js: Session as retrieved from URL was issued over 120s ago, URL could be stale\", issuedAt, expiresAt, timeNow);\n } else if (timeNow - issuedAt < 0) {\n console.warn(\"@supabase/gotrue-js: Session as retrieved from URL was issued in the future? Check the device clock for skew\", issuedAt, expiresAt, timeNow);\n }\n const { data, error } = await this._getUser(access_token);\n if (error) throw error;\n const session = {\n provider_token,\n provider_refresh_token,\n access_token,\n expires_in: expiresIn,\n expires_at: expiresAt,\n refresh_token,\n token_type: token_type,\n user: data.user\n };\n // Remove tokens from URL\n window.location.hash = \"\";\n this._debug(\"#_getSessionFromURL()\", \"clearing window.location.hash\");\n return this._returnResult({\n data: {\n session,\n redirectType: params.type\n },\n error: null\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n session: null,\n redirectType: null\n },\n error\n });\n }\n throw error;\n }\n }\n /**\n * Checks if the current URL contains parameters given by an implicit oauth grant flow (https://www.rfc-editor.org/rfc/rfc6749.html#section-4.2)\n *\n * If `detectSessionInUrl` is a function, it will be called with the URL and params to determine\n * if the URL should be processed as a Supabase auth callback. This allows users to exclude\n * URLs from other OAuth providers (e.g., Facebook Login) that also return access_token in the fragment.\n */ _isImplicitGrantCallback(params) {\n if (typeof this.detectSessionInUrl === \"function\") {\n return this.detectSessionInUrl(new URL(window.location.href), params);\n }\n return Boolean(params.access_token || params.error_description);\n }\n /**\n * Checks if the current URL and backing storage contain parameters given by a PKCE flow\n */ async _isPKCECallback(params) {\n const currentStorageContent = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n return !!(params.code && currentStorageContent);\n }\n /**\n * Inside a browser context, `signOut()` will remove the logged in user from the browser session and log them out - removing all items from localstorage and then trigger a `\"SIGNED_OUT\"` event.\n *\n * For server-side management, you can revoke all refresh tokens for a user by passing a user's JWT through to `auth.api.signOut(JWT: string)`.\n * There is no way to revoke a user's access token jwt until it expires. It is recommended to set a shorter expiry on the jwt for this reason.\n *\n * If using `others` scope, no `SIGNED_OUT` event is fired!\n */ async signOut() {\n let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {\n scope: \"global\"\n };\n await this.initializePromise;\n return await this._acquireLock(-1, async ()=>{\n return await this._signOut(options);\n });\n }\n async _signOut() {\n let { scope } = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {\n scope: \"global\"\n };\n return await this._useSession(async (result)=>{\n var _a;\n const { data, error: sessionError } = result;\n if (sessionError) {\n return this._returnResult({\n error: sessionError\n });\n }\n const accessToken = (_a = data.session) === null || _a === void 0 ? void 0 : _a.access_token;\n if (accessToken) {\n const { error } = await this.admin.signOut(accessToken, scope);\n if (error) {\n // ignore 404s since user might not exist anymore\n // ignore 401s since an invalid or expired JWT should sign out the current session\n if (!((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthApiError)(error) && (error.status === 404 || error.status === 401 || error.status === 403))) {\n return this._returnResult({\n error\n });\n }\n }\n }\n if (scope !== \"others\") {\n await this._removeSession();\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n }\n return this._returnResult({\n error: null\n });\n });\n }\n onAuthStateChange(callback) {\n const id = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.generateCallbackId)();\n const subscription = {\n id,\n callback,\n unsubscribe: ()=>{\n this._debug(\"#unsubscribe()\", \"state change callback with id removed\", id);\n this.stateChangeEmitters.delete(id);\n }\n };\n this._debug(\"#onAuthStateChange()\", \"registered callback with id\", id);\n this.stateChangeEmitters.set(id, subscription);\n (async ()=>{\n await this.initializePromise;\n await this._acquireLock(-1, async ()=>{\n this._emitInitialSession(id);\n });\n })();\n return {\n data: {\n subscription\n }\n };\n }\n async _emitInitialSession(id) {\n return await this._useSession(async (result)=>{\n var _a, _b;\n try {\n const { data: { session }, error } = result;\n if (error) throw error;\n await ((_a = this.stateChangeEmitters.get(id)) === null || _a === void 0 ? void 0 : _a.callback(\"INITIAL_SESSION\", session));\n this._debug(\"INITIAL_SESSION\", \"callback id\", id, \"session\", session);\n } catch (err) {\n await ((_b = this.stateChangeEmitters.get(id)) === null || _b === void 0 ? void 0 : _b.callback(\"INITIAL_SESSION\", null));\n this._debug(\"INITIAL_SESSION\", \"callback id\", id, \"error\", err);\n console.error(err);\n }\n });\n }\n /**\n * Sends a password reset request to an email address. This method supports the PKCE flow.\n *\n * @param email The email address of the user.\n * @param options.redirectTo The URL to send the user to after they click the password reset link.\n * @param options.captchaToken Verification token received when the user completes the captcha on the site.\n */ async resetPasswordForEmail(email) {\n let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n let codeChallenge = null;\n let codeChallengeMethod = null;\n if (this.flowType === \"pkce\") {\n ;\n [codeChallenge, codeChallengeMethod] = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getCodeChallengeAndMethod)(this.storage, this.storageKey, true // isPasswordRecovery\n );\n }\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/recover\"), {\n body: {\n email,\n code_challenge: codeChallenge,\n code_challenge_method: codeChallengeMethod,\n gotrue_meta_security: {\n captcha_token: options.captchaToken\n }\n },\n headers: this.headers,\n redirectTo: options.redirectTo\n });\n } catch (error) {\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n /**\n * Gets all the identities linked to a user.\n */ async getUserIdentities() {\n var _a;\n try {\n const { data, error } = await this.getUser();\n if (error) throw error;\n return this._returnResult({\n data: {\n identities: (_a = data.user.identities) !== null && _a !== void 0 ? _a : []\n },\n error: null\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n async linkIdentity(credentials) {\n if (\"token\" in credentials) {\n return this.linkIdentityIdToken(credentials);\n }\n return this.linkIdentityOAuth(credentials);\n }\n async linkIdentityOAuth(credentials) {\n var _a;\n try {\n const { data, error } = await this._useSession(async (result)=>{\n var _a, _b, _c, _d, _e;\n const { data, error } = result;\n if (error) throw error;\n const url = await this._getUrlForProvider(\"\".concat(this.url, \"/user/identities/authorize\"), credentials.provider, {\n redirectTo: (_a = credentials.options) === null || _a === void 0 ? void 0 : _a.redirectTo,\n scopes: (_b = credentials.options) === null || _b === void 0 ? void 0 : _b.scopes,\n queryParams: (_c = credentials.options) === null || _c === void 0 ? void 0 : _c.queryParams,\n skipBrowserRedirect: true\n });\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"GET\", url, {\n headers: this.headers,\n jwt: (_e = (_d = data.session) === null || _d === void 0 ? void 0 : _d.access_token) !== null && _e !== void 0 ? _e : undefined\n });\n });\n if (error) throw error;\n if ((0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)() && !((_a = credentials.options) === null || _a === void 0 ? void 0 : _a.skipBrowserRedirect)) {\n window.location.assign(data === null || data === void 0 ? void 0 : data.url);\n }\n return this._returnResult({\n data: {\n provider: credentials.provider,\n url: data === null || data === void 0 ? void 0 : data.url\n },\n error: null\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n provider: credentials.provider,\n url: null\n },\n error\n });\n }\n throw error;\n }\n }\n async linkIdentityIdToken(credentials) {\n return await this._useSession(async (result)=>{\n var _a;\n try {\n const { error: sessionError, data: { session } } = result;\n if (sessionError) throw sessionError;\n const { options, provider, token, access_token, nonce } = credentials;\n const res = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/token?grant_type=id_token\"), {\n headers: this.headers,\n jwt: (_a = session === null || session === void 0 ? void 0 : session.access_token) !== null && _a !== void 0 ? _a : undefined,\n body: {\n provider,\n id_token: token,\n access_token,\n nonce,\n link_identity: true,\n gotrue_meta_security: {\n captcha_token: options === null || options === void 0 ? void 0 : options.captchaToken\n }\n },\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponse\n });\n const { data, error } = res;\n if (error) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n } else if (!data || !data.session || !data.user) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error: new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidTokenResponseError()\n });\n }\n if (data.session) {\n await this._saveSession(data.session);\n await this._notifyAllSubscribers(\"USER_UPDATED\", data.session);\n }\n return this._returnResult({\n data,\n error\n });\n } catch (error) {\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n user: null,\n session: null\n },\n error\n });\n }\n throw error;\n }\n });\n }\n /**\n * Unlinks an identity from a user by deleting it. The user will no longer be able to sign in with that identity once it's unlinked.\n */ async unlinkIdentity(identity) {\n try {\n return await this._useSession(async (result)=>{\n var _a, _b;\n const { data, error } = result;\n if (error) {\n throw error;\n }\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"DELETE\", \"\".concat(this.url, \"/user/identities/\").concat(identity.identity_id), {\n headers: this.headers,\n jwt: (_b = (_a = data.session) === null || _a === void 0 ? void 0 : _a.access_token) !== null && _b !== void 0 ? _b : undefined\n });\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n /**\n * Generates a new JWT.\n * @param refreshToken A valid refresh token that was returned on login.\n */ async _refreshAccessToken(refreshToken) {\n const debugName = \"#_refreshAccessToken(\".concat(refreshToken.substring(0, 5), \"...)\");\n this._debug(debugName, \"begin\");\n try {\n const startedAt = Date.now();\n // will attempt to refresh the token with exponential backoff\n return await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.retryable)(async (attempt)=>{\n if (attempt > 0) {\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.sleep)(200 * Math.pow(2, attempt - 1)); // 200, 400, 800, ...\n }\n this._debug(debugName, \"refreshing attempt\", attempt);\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/token?grant_type=refresh_token\"), {\n body: {\n refresh_token: refreshToken\n },\n headers: this.headers,\n xform: _lib_fetch__WEBPACK_IMPORTED_MODULE_3__._sessionResponse\n });\n }, (attempt, error)=>{\n const nextBackOffInterval = 200 * Math.pow(2, attempt);\n return error && (0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthRetryableFetchError)(error) && // retryable only if the request can be sent before the backoff overflows the tick duration\n Date.now() + nextBackOffInterval - startedAt < _lib_constants__WEBPACK_IMPORTED_MODULE_1__.AUTO_REFRESH_TICK_DURATION_MS;\n });\n } catch (error) {\n this._debug(debugName, \"error\", error);\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: {\n session: null,\n user: null\n },\n error\n });\n }\n throw error;\n } finally{\n this._debug(debugName, \"end\");\n }\n }\n _isValidSession(maybeSession) {\n const isValidSession = typeof maybeSession === \"object\" && maybeSession !== null && \"access_token\" in maybeSession && \"refresh_token\" in maybeSession && \"expires_at\" in maybeSession;\n return isValidSession;\n }\n async _handleProviderSignIn(provider, options) {\n const url = await this._getUrlForProvider(\"\".concat(this.url, \"/authorize\"), provider, {\n redirectTo: options.redirectTo,\n scopes: options.scopes,\n queryParams: options.queryParams\n });\n this._debug(\"#_handleProviderSignIn()\", \"provider\", provider, \"options\", options, \"url\", url);\n // try to open on the browser\n if ((0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)() && !options.skipBrowserRedirect) {\n window.location.assign(url);\n }\n return {\n data: {\n provider,\n url\n },\n error: null\n };\n }\n /**\n * Recovers the session from LocalStorage and refreshes the token\n * Note: this method is async to accommodate for AsyncStorage e.g. in React native.\n */ async _recoverAndRefresh() {\n var _a, _b;\n const debugName = \"#_recoverAndRefresh()\";\n this._debug(debugName, \"begin\");\n try {\n const currentSession = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getItemAsync)(this.storage, this.storageKey);\n if (currentSession && this.userStorage) {\n let maybeUser = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getItemAsync)(this.userStorage, this.storageKey + \"-user\");\n if (!this.storage.isServer && Object.is(this.storage, this.userStorage) && !maybeUser) {\n // storage and userStorage are the same storage medium, for example\n // window.localStorage if userStorage does not have the user from\n // storage stored, store it first thereby migrating the user object\n // from storage -> userStorage\n maybeUser = {\n user: currentSession.user\n };\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.setItemAsync)(this.userStorage, this.storageKey + \"-user\", maybeUser);\n }\n currentSession.user = (_a = maybeUser === null || maybeUser === void 0 ? void 0 : maybeUser.user) !== null && _a !== void 0 ? _a : (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.userNotAvailableProxy)();\n } else if (currentSession && !currentSession.user) {\n // user storage is not set, let's check if it was previously enabled so\n // we bring back the storage as it should be\n if (!currentSession.user) {\n // test if userStorage was previously enabled and the storage medium was the same, to move the user back under the same key\n const separateUser = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getItemAsync)(this.storage, this.storageKey + \"-user\");\n if (separateUser && (separateUser === null || separateUser === void 0 ? void 0 : separateUser.user)) {\n currentSession.user = separateUser.user;\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, this.storageKey + \"-user\");\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.setItemAsync)(this.storage, this.storageKey, currentSession);\n } else {\n currentSession.user = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.userNotAvailableProxy)();\n }\n }\n }\n this._debug(debugName, \"session from storage\", currentSession);\n if (!this._isValidSession(currentSession)) {\n this._debug(debugName, \"session is not valid\");\n if (currentSession !== null) {\n await this._removeSession();\n }\n return;\n }\n const expiresWithMargin = ((_b = currentSession.expires_at) !== null && _b !== void 0 ? _b : Infinity) * 1000 - Date.now() < _lib_constants__WEBPACK_IMPORTED_MODULE_1__.EXPIRY_MARGIN_MS;\n this._debug(debugName, \"session has\".concat(expiresWithMargin ? \"\" : \" not\", \" expired with margin of \").concat(_lib_constants__WEBPACK_IMPORTED_MODULE_1__.EXPIRY_MARGIN_MS, \"s\"));\n if (expiresWithMargin) {\n if (this.autoRefreshToken && currentSession.refresh_token) {\n const { error } = await this._callRefreshToken(currentSession.refresh_token);\n if (error) {\n console.error(error);\n if (!(0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthRetryableFetchError)(error)) {\n this._debug(debugName, \"refresh failed with a non-retryable error, removing the session\", error);\n await this._removeSession();\n }\n }\n }\n } else if (currentSession.user && currentSession.user.__isUserNotAvailableProxy === true) {\n // If we have a proxy user, try to get the real user data\n try {\n const { data, error: userError } = await this._getUser(currentSession.access_token);\n if (!userError && (data === null || data === void 0 ? void 0 : data.user)) {\n currentSession.user = data.user;\n await this._saveSession(currentSession);\n await this._notifyAllSubscribers(\"SIGNED_IN\", currentSession);\n } else {\n this._debug(debugName, \"could not get user data, skipping SIGNED_IN notification\");\n }\n } catch (getUserError) {\n console.error(\"Error getting user data:\", getUserError);\n this._debug(debugName, \"error getting user data, skipping SIGNED_IN notification\", getUserError);\n }\n } else {\n // no need to persist currentSession again, as we just loaded it from\n // local storage; persisting it again may overwrite a value saved by\n // another client with access to the same local storage\n await this._notifyAllSubscribers(\"SIGNED_IN\", currentSession);\n }\n } catch (err) {\n this._debug(debugName, \"error\", err);\n console.error(err);\n return;\n } finally{\n this._debug(debugName, \"end\");\n }\n }\n async _callRefreshToken(refreshToken) {\n var _a, _b;\n if (!refreshToken) {\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError();\n }\n // refreshing is already in progress\n if (this.refreshingDeferred) {\n return this.refreshingDeferred.promise;\n }\n const debugName = \"#_callRefreshToken(\".concat(refreshToken.substring(0, 5), \"...)\");\n this._debug(debugName, \"begin\");\n try {\n this.refreshingDeferred = new _lib_helpers__WEBPACK_IMPORTED_MODULE_4__.Deferred();\n const { data, error } = await this._refreshAccessToken(refreshToken);\n if (error) throw error;\n if (!data.session) throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError();\n await this._saveSession(data.session);\n await this._notifyAllSubscribers(\"TOKEN_REFRESHED\", data.session);\n const result = {\n data: data.session,\n error: null\n };\n this.refreshingDeferred.resolve(result);\n return result;\n } catch (error) {\n this._debug(debugName, \"error\", error);\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n const result = {\n data: null,\n error\n };\n if (!(0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthRetryableFetchError)(error)) {\n await this._removeSession();\n }\n (_a = this.refreshingDeferred) === null || _a === void 0 ? void 0 : _a.resolve(result);\n return result;\n }\n (_b = this.refreshingDeferred) === null || _b === void 0 ? void 0 : _b.reject(error);\n throw error;\n } finally{\n this.refreshingDeferred = null;\n this._debug(debugName, \"end\");\n }\n }\n async _notifyAllSubscribers(event, session) {\n let broadcast = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;\n const debugName = \"#_notifyAllSubscribers(\".concat(event, \")\");\n this._debug(debugName, \"begin\", session, \"broadcast = \".concat(broadcast));\n try {\n if (this.broadcastChannel && broadcast) {\n this.broadcastChannel.postMessage({\n event,\n session\n });\n }\n const errors = [];\n const promises = Array.from(this.stateChangeEmitters.values()).map(async (x)=>{\n try {\n await x.callback(event, session);\n } catch (e) {\n errors.push(e);\n }\n });\n await Promise.all(promises);\n if (errors.length > 0) {\n for(let i = 0; i < errors.length; i += 1){\n console.error(errors[i]);\n }\n throw errors[0];\n }\n } finally{\n this._debug(debugName, \"end\");\n }\n }\n /**\n * set currentSession and currentUser\n * process to _startAutoRefreshToken if possible\n */ async _saveSession(session) {\n this._debug(\"#_saveSession()\", session);\n // _saveSession is always called whenever a new session has been acquired\n // so we can safely suppress the warning returned by future getSession calls\n this.suppressGetSessionWarning = true;\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, \"\".concat(this.storageKey, \"-code-verifier\"));\n // Create a shallow copy to work with, to avoid mutating the original session object if it's used elsewhere\n const sessionToProcess = Object.assign({}, session);\n const userIsProxy = sessionToProcess.user && sessionToProcess.user.__isUserNotAvailableProxy === true;\n if (this.userStorage) {\n if (!userIsProxy && sessionToProcess.user) {\n // If it's a real user object, save it to userStorage.\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.setItemAsync)(this.userStorage, this.storageKey + \"-user\", {\n user: sessionToProcess.user\n });\n } else if (userIsProxy) {\n // If it's the proxy, it means user was not found in userStorage.\n // We should ensure no stale user data for this key exists in userStorage if we were to save null,\n // or simply not save the proxy. For now, we don't save the proxy here.\n // If there's a need to clear userStorage if user becomes proxy, that logic would go here.\n }\n // Prepare the main session data for primary storage: remove the user property before cloning\n // This is important because the original session.user might be the proxy\n const mainSessionData = Object.assign({}, sessionToProcess);\n delete mainSessionData.user; // Remove user (real or proxy) before cloning for main storage\n const clonedMainSessionData = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.deepClone)(mainSessionData);\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.setItemAsync)(this.storage, this.storageKey, clonedMainSessionData);\n } else {\n // No userStorage is configured.\n // In this case, session.user should ideally not be a proxy.\n // If it were, structuredClone would fail. This implies an issue elsewhere if user is a proxy here\n const clonedSession = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.deepClone)(sessionToProcess); // sessionToProcess still has its original user property\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.setItemAsync)(this.storage, this.storageKey, clonedSession);\n }\n }\n async _removeSession() {\n this._debug(\"#_removeSession()\");\n this.suppressGetSessionWarning = false;\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, this.storageKey);\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, this.storageKey + \"-code-verifier\");\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.storage, this.storageKey + \"-user\");\n if (this.userStorage) {\n await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.removeItemAsync)(this.userStorage, this.storageKey + \"-user\");\n }\n await this._notifyAllSubscribers(\"SIGNED_OUT\", null);\n }\n /**\n * Removes any registered visibilitychange callback.\n *\n * {@see #startAutoRefresh}\n * {@see #stopAutoRefresh}\n */ _removeVisibilityChangedCallback() {\n this._debug(\"#_removeVisibilityChangedCallback()\");\n const callback = this.visibilityChangedCallback;\n this.visibilityChangedCallback = null;\n try {\n if (callback && (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)() && (window === null || window === void 0 ? void 0 : window.removeEventListener)) {\n window.removeEventListener(\"visibilitychange\", callback);\n }\n } catch (e) {\n console.error(\"removing visibilitychange callback failed\", e);\n }\n }\n /**\n * This is the private implementation of {@link #startAutoRefresh}. Use this\n * within the library.\n */ async _startAutoRefresh() {\n await this._stopAutoRefresh();\n this._debug(\"#_startAutoRefresh()\");\n const ticker = setInterval(()=>this._autoRefreshTokenTick(), _lib_constants__WEBPACK_IMPORTED_MODULE_1__.AUTO_REFRESH_TICK_DURATION_MS);\n this.autoRefreshTicker = ticker;\n if (ticker && typeof ticker === \"object\" && typeof ticker.unref === \"function\") {\n // ticker is a NodeJS Timeout object that has an `unref` method\n // https://nodejs.org/api/timers.html#timeoutunref\n // When auto refresh is used in NodeJS (like for testing) the\n // `setInterval` is preventing the process from being marked as\n // finished and tests run endlessly. This can be prevented by calling\n // `unref()` on the returned object.\n ticker.unref();\n // @ts-expect-error TS has no context of Deno\n } else if (typeof Deno !== \"undefined\" && typeof Deno.unrefTimer === \"function\") {\n // similar like for NodeJS, but with the Deno API\n // https://deno.land/api@latest?unstable&s=Deno.unrefTimer\n // @ts-expect-error TS has no context of Deno\n Deno.unrefTimer(ticker);\n }\n // run the tick immediately, but in the next pass of the event loop so that\n // #_initialize can be allowed to complete without recursively waiting on\n // itself\n setTimeout(async ()=>{\n await this.initializePromise;\n await this._autoRefreshTokenTick();\n }, 0);\n }\n /**\n * This is the private implementation of {@link #stopAutoRefresh}. Use this\n * within the library.\n */ async _stopAutoRefresh() {\n this._debug(\"#_stopAutoRefresh()\");\n const ticker = this.autoRefreshTicker;\n this.autoRefreshTicker = null;\n if (ticker) {\n clearInterval(ticker);\n }\n }\n /**\n * Starts an auto-refresh process in the background. The session is checked\n * every few seconds. Close to the time of expiration a process is started to\n * refresh the session. If refreshing fails it will be retried for as long as\n * necessary.\n *\n * If you set the {@link GoTrueClientOptions#autoRefreshToken} you don't need\n * to call this function, it will be called for you.\n *\n * On browsers the refresh process works only when the tab/window is in the\n * foreground to conserve resources as well as prevent race conditions and\n * flooding auth with requests. If you call this method any managed\n * visibility change callback will be removed and you must manage visibility\n * changes on your own.\n *\n * On non-browser platforms the refresh process works *continuously* in the\n * background, which may not be desirable. You should hook into your\n * platform's foreground indication mechanism and call these methods\n * appropriately to conserve resources.\n *\n * {@see #stopAutoRefresh}\n */ async startAutoRefresh() {\n this._removeVisibilityChangedCallback();\n await this._startAutoRefresh();\n }\n /**\n * Stops an active auto refresh process running in the background (if any).\n *\n * If you call this method any managed visibility change callback will be\n * removed and you must manage visibility changes on your own.\n *\n * See {@link #startAutoRefresh} for more details.\n */ async stopAutoRefresh() {\n this._removeVisibilityChangedCallback();\n await this._stopAutoRefresh();\n }\n /**\n * Runs the auto refresh token tick.\n */ async _autoRefreshTokenTick() {\n this._debug(\"#_autoRefreshTokenTick()\", \"begin\");\n try {\n await this._acquireLock(0, async ()=>{\n try {\n const now = Date.now();\n try {\n return await this._useSession(async (result)=>{\n const { data: { session } } = result;\n if (!session || !session.refresh_token || !session.expires_at) {\n this._debug(\"#_autoRefreshTokenTick()\", \"no session\");\n return;\n }\n // session will expire in this many ticks (or has already expired if <= 0)\n const expiresInTicks = Math.floor((session.expires_at * 1000 - now) / _lib_constants__WEBPACK_IMPORTED_MODULE_1__.AUTO_REFRESH_TICK_DURATION_MS);\n this._debug(\"#_autoRefreshTokenTick()\", \"access token expires in \".concat(expiresInTicks, \" ticks, a tick lasts \").concat(_lib_constants__WEBPACK_IMPORTED_MODULE_1__.AUTO_REFRESH_TICK_DURATION_MS, \"ms, refresh threshold is \").concat(_lib_constants__WEBPACK_IMPORTED_MODULE_1__.AUTO_REFRESH_TICK_THRESHOLD, \" ticks\"));\n if (expiresInTicks <= _lib_constants__WEBPACK_IMPORTED_MODULE_1__.AUTO_REFRESH_TICK_THRESHOLD) {\n await this._callRefreshToken(session.refresh_token);\n }\n });\n } catch (e) {\n console.error(\"Auto refresh tick failed with error. This is likely a transient error.\", e);\n }\n } finally{\n this._debug(\"#_autoRefreshTokenTick()\", \"end\");\n }\n });\n } catch (e) {\n if (e.isAcquireTimeout || e instanceof _lib_locks__WEBPACK_IMPORTED_MODULE_6__.LockAcquireTimeoutError) {\n this._debug(\"auto refresh token tick lock not available\");\n } else {\n throw e;\n }\n }\n }\n /**\n * Registers callbacks on the browser / platform, which in-turn run\n * algorithms when the browser window/tab are in foreground. On non-browser\n * platforms it assumes always foreground.\n */ async _handleVisibilityChange() {\n this._debug(\"#_handleVisibilityChange()\");\n if (!(0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)() || !(window === null || window === void 0 ? void 0 : window.addEventListener)) {\n if (this.autoRefreshToken) {\n // in non-browser environments the refresh token ticker runs always\n this.startAutoRefresh();\n }\n return false;\n }\n try {\n this.visibilityChangedCallback = async ()=>await this._onVisibilityChanged(false);\n window === null || window === void 0 ? void 0 : window.addEventListener(\"visibilitychange\", this.visibilityChangedCallback);\n // now immediately call the visbility changed callback to setup with the\n // current visbility state\n await this._onVisibilityChanged(true); // initial call\n } catch (error) {\n console.error(\"_handleVisibilityChange\", error);\n }\n }\n /**\n * Callback registered with `window.addEventListener('visibilitychange')`.\n */ async _onVisibilityChanged(calledFromInitialize) {\n const methodName = \"#_onVisibilityChanged(\".concat(calledFromInitialize, \")\");\n this._debug(methodName, \"visibilityState\", document.visibilityState);\n if (document.visibilityState === \"visible\") {\n if (this.autoRefreshToken) {\n // in browser environments the refresh token ticker runs only on focused tabs\n // which prevents race conditions\n this._startAutoRefresh();\n }\n if (!calledFromInitialize) {\n // called when the visibility has changed, i.e. the browser\n // transitioned from hidden -> visible so we need to see if the session\n // should be recovered immediately... but to do that we need to acquire\n // the lock first asynchronously\n await this.initializePromise;\n await this._acquireLock(-1, async ()=>{\n if (document.visibilityState !== \"visible\") {\n this._debug(methodName, \"acquired the lock to recover the session, but the browser visibilityState is no longer visible, aborting\");\n // visibility has changed while waiting for the lock, abort\n return;\n }\n // recover the session\n await this._recoverAndRefresh();\n });\n }\n } else if (document.visibilityState === \"hidden\") {\n if (this.autoRefreshToken) {\n this._stopAutoRefresh();\n }\n }\n }\n /**\n * Generates the relevant login URL for a third-party provider.\n * @param options.redirectTo A URL or mobile address to send the user to after they are confirmed.\n * @param options.scopes A space-separated list of scopes granted to the OAuth application.\n * @param options.queryParams An object of key-value pairs containing query parameters granted to the OAuth application.\n */ async _getUrlForProvider(url, provider, options) {\n const urlParams = [\n \"provider=\".concat(encodeURIComponent(provider))\n ];\n if (options === null || options === void 0 ? void 0 : options.redirectTo) {\n urlParams.push(\"redirect_to=\".concat(encodeURIComponent(options.redirectTo)));\n }\n if (options === null || options === void 0 ? void 0 : options.scopes) {\n urlParams.push(\"scopes=\".concat(encodeURIComponent(options.scopes)));\n }\n if (this.flowType === \"pkce\") {\n const [codeChallenge, codeChallengeMethod] = await (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getCodeChallengeAndMethod)(this.storage, this.storageKey);\n const flowParams = new URLSearchParams({\n code_challenge: \"\".concat(encodeURIComponent(codeChallenge)),\n code_challenge_method: \"\".concat(encodeURIComponent(codeChallengeMethod))\n });\n urlParams.push(flowParams.toString());\n }\n if (options === null || options === void 0 ? void 0 : options.queryParams) {\n const query = new URLSearchParams(options.queryParams);\n urlParams.push(query.toString());\n }\n if (options === null || options === void 0 ? void 0 : options.skipBrowserRedirect) {\n urlParams.push(\"skip_http_redirect=\".concat(options.skipBrowserRedirect));\n }\n return \"\".concat(url, \"?\").concat(urlParams.join(\"&\"));\n }\n async _unenroll(params) {\n try {\n return await this._useSession(async (result)=>{\n var _a;\n const { data: sessionData, error: sessionError } = result;\n if (sessionError) {\n return this._returnResult({\n data: null,\n error: sessionError\n });\n }\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"DELETE\", \"\".concat(this.url, \"/factors/\").concat(params.factorId), {\n headers: this.headers,\n jwt: (_a = sessionData === null || sessionData === void 0 ? void 0 : sessionData.session) === null || _a === void 0 ? void 0 : _a.access_token\n });\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n async _enroll(params) {\n try {\n return await this._useSession(async (result)=>{\n var _a, _b;\n const { data: sessionData, error: sessionError } = result;\n if (sessionError) {\n return this._returnResult({\n data: null,\n error: sessionError\n });\n }\n const body = Object.assign({\n friendly_name: params.friendlyName,\n factor_type: params.factorType\n }, params.factorType === \"phone\" ? {\n phone: params.phone\n } : params.factorType === \"totp\" ? {\n issuer: params.issuer\n } : {});\n const { data, error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/factors\"), {\n body,\n headers: this.headers,\n jwt: (_a = sessionData === null || sessionData === void 0 ? void 0 : sessionData.session) === null || _a === void 0 ? void 0 : _a.access_token\n });\n if (error) {\n return this._returnResult({\n data: null,\n error\n });\n }\n if (params.factorType === \"totp\" && data.type === \"totp\" && ((_b = data === null || data === void 0 ? void 0 : data.totp) === null || _b === void 0 ? void 0 : _b.qr_code)) {\n data.totp.qr_code = \"data:image/svg+xml;utf-8,\".concat(data.totp.qr_code);\n }\n return this._returnResult({\n data,\n error: null\n });\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n async _verify(params) {\n return this._acquireLock(-1, async ()=>{\n try {\n return await this._useSession(async (result)=>{\n var _a;\n const { data: sessionData, error: sessionError } = result;\n if (sessionError) {\n return this._returnResult({\n data: null,\n error: sessionError\n });\n }\n const body = Object.assign({\n challenge_id: params.challengeId\n }, \"webauthn\" in params ? {\n webauthn: Object.assign(Object.assign({}, params.webauthn), {\n credential_response: params.webauthn.type === \"create\" ? (0,_lib_webauthn__WEBPACK_IMPORTED_MODULE_11__.serializeCredentialCreationResponse)(params.webauthn.credential_response) : (0,_lib_webauthn__WEBPACK_IMPORTED_MODULE_11__.serializeCredentialRequestResponse)(params.webauthn.credential_response)\n })\n } : {\n code: params.code\n });\n const { data, error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/factors/\").concat(params.factorId, \"/verify\"), {\n body,\n headers: this.headers,\n jwt: (_a = sessionData === null || sessionData === void 0 ? void 0 : sessionData.session) === null || _a === void 0 ? void 0 : _a.access_token\n });\n if (error) {\n return this._returnResult({\n data: null,\n error\n });\n }\n await this._saveSession(Object.assign({\n expires_at: Math.round(Date.now() / 1000) + data.expires_in\n }, data));\n await this._notifyAllSubscribers(\"MFA_CHALLENGE_VERIFIED\", data);\n return this._returnResult({\n data,\n error\n });\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n });\n }\n async _challenge(params) {\n return this._acquireLock(-1, async ()=>{\n try {\n return await this._useSession(async (result)=>{\n var _a;\n const { data: sessionData, error: sessionError } = result;\n if (sessionError) {\n return this._returnResult({\n data: null,\n error: sessionError\n });\n }\n const response = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/factors/\").concat(params.factorId, \"/challenge\"), {\n body: params,\n headers: this.headers,\n jwt: (_a = sessionData === null || sessionData === void 0 ? void 0 : sessionData.session) === null || _a === void 0 ? void 0 : _a.access_token\n });\n if (response.error) {\n return response;\n }\n const { data } = response;\n if (data.type !== \"webauthn\") {\n return {\n data,\n error: null\n };\n }\n switch(data.webauthn.type){\n case \"create\":\n return {\n data: Object.assign(Object.assign({}, data), {\n webauthn: Object.assign(Object.assign({}, data.webauthn), {\n credential_options: Object.assign(Object.assign({}, data.webauthn.credential_options), {\n publicKey: (0,_lib_webauthn__WEBPACK_IMPORTED_MODULE_11__.deserializeCredentialCreationOptions)(data.webauthn.credential_options.publicKey)\n })\n })\n }),\n error: null\n };\n case \"request\":\n return {\n data: Object.assign(Object.assign({}, data), {\n webauthn: Object.assign(Object.assign({}, data.webauthn), {\n credential_options: Object.assign(Object.assign({}, data.webauthn.credential_options), {\n publicKey: (0,_lib_webauthn__WEBPACK_IMPORTED_MODULE_11__.deserializeCredentialRequestOptions)(data.webauthn.credential_options.publicKey)\n })\n })\n }),\n error: null\n };\n }\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n });\n }\n /**\n * {@see GoTrueMFAApi#challengeAndVerify}\n */ async _challengeAndVerify(params) {\n // both _challenge and _verify independently acquire the lock, so no need\n // to acquire it here\n const { data: challengeData, error: challengeError } = await this._challenge({\n factorId: params.factorId\n });\n if (challengeError) {\n return this._returnResult({\n data: null,\n error: challengeError\n });\n }\n return await this._verify({\n factorId: params.factorId,\n challengeId: challengeData.id,\n code: params.code\n });\n }\n /**\n * {@see GoTrueMFAApi#listFactors}\n */ async _listFactors() {\n var _a;\n // use #getUser instead of #_getUser as the former acquires a lock\n const { data: { user }, error: userError } = await this.getUser();\n if (userError) {\n return {\n data: null,\n error: userError\n };\n }\n const data = {\n all: [],\n phone: [],\n totp: [],\n webauthn: []\n };\n // loop over the factors ONCE\n for (const factor of (_a = user === null || user === void 0 ? void 0 : user.factors) !== null && _a !== void 0 ? _a : []){\n data.all.push(factor);\n if (factor.status === \"verified\") {\n ;\n data[factor.factor_type].push(factor);\n }\n }\n return {\n data,\n error: null\n };\n }\n /**\n * {@see GoTrueMFAApi#getAuthenticatorAssuranceLevel}\n */ async _getAuthenticatorAssuranceLevel() {\n var _a, _b;\n const { data: { session }, error: sessionError } = await this.getSession();\n if (sessionError) {\n return this._returnResult({\n data: null,\n error: sessionError\n });\n }\n if (!session) {\n return {\n data: {\n currentLevel: null,\n nextLevel: null,\n currentAuthenticationMethods: []\n },\n error: null\n };\n }\n const { payload } = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.decodeJWT)(session.access_token);\n let currentLevel = null;\n if (payload.aal) {\n currentLevel = payload.aal;\n }\n let nextLevel = currentLevel;\n const verifiedFactors = (_b = (_a = session.user.factors) === null || _a === void 0 ? void 0 : _a.filter((factor)=>factor.status === \"verified\")) !== null && _b !== void 0 ? _b : [];\n if (verifiedFactors.length > 0) {\n nextLevel = \"aal2\";\n }\n const currentAuthenticationMethods = payload.amr || [];\n return {\n data: {\n currentLevel,\n nextLevel,\n currentAuthenticationMethods\n },\n error: null\n };\n }\n /**\n * Retrieves details about an OAuth authorization request.\n * Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.\n *\n * Returns authorization details including client info, scopes, and user information.\n * If the API returns a redirect_uri, it means consent was already given - the caller\n * should handle the redirect manually if needed.\n */ async _getAuthorizationDetails(authorizationId) {\n try {\n return await this._useSession(async (result)=>{\n const { data: { session }, error: sessionError } = result;\n if (sessionError) {\n return this._returnResult({\n data: null,\n error: sessionError\n });\n }\n if (!session) {\n return this._returnResult({\n data: null,\n error: new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError()\n });\n }\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"GET\", \"\".concat(this.url, \"/oauth/authorizations/\").concat(authorizationId), {\n headers: this.headers,\n jwt: session.access_token,\n xform: (data)=>({\n data,\n error: null\n })\n });\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n /**\n * Approves an OAuth authorization request.\n * Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.\n */ async _approveAuthorization(authorizationId, options) {\n try {\n return await this._useSession(async (result)=>{\n const { data: { session }, error: sessionError } = result;\n if (sessionError) {\n return this._returnResult({\n data: null,\n error: sessionError\n });\n }\n if (!session) {\n return this._returnResult({\n data: null,\n error: new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError()\n });\n }\n const response = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/oauth/authorizations/\").concat(authorizationId, \"/consent\"), {\n headers: this.headers,\n jwt: session.access_token,\n body: {\n action: \"approve\"\n },\n xform: (data)=>({\n data,\n error: null\n })\n });\n if (response.data && response.data.redirect_url) {\n // Automatically redirect in browser unless skipBrowserRedirect is true\n if ((0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)() && !(options === null || options === void 0 ? void 0 : options.skipBrowserRedirect)) {\n window.location.assign(response.data.redirect_url);\n }\n }\n return response;\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n /**\n * Denies an OAuth authorization request.\n * Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.\n */ async _denyAuthorization(authorizationId, options) {\n try {\n return await this._useSession(async (result)=>{\n const { data: { session }, error: sessionError } = result;\n if (sessionError) {\n return this._returnResult({\n data: null,\n error: sessionError\n });\n }\n if (!session) {\n return this._returnResult({\n data: null,\n error: new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError()\n });\n }\n const response = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"POST\", \"\".concat(this.url, \"/oauth/authorizations/\").concat(authorizationId, \"/consent\"), {\n headers: this.headers,\n jwt: session.access_token,\n body: {\n action: \"deny\"\n },\n xform: (data)=>({\n data,\n error: null\n })\n });\n if (response.data && response.data.redirect_url) {\n // Automatically redirect in browser unless skipBrowserRedirect is true\n if ((0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)() && !(options === null || options === void 0 ? void 0 : options.skipBrowserRedirect)) {\n window.location.assign(response.data.redirect_url);\n }\n }\n return response;\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n /**\n * Lists all OAuth grants that the authenticated user has authorized.\n * Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.\n */ async _listOAuthGrants() {\n try {\n return await this._useSession(async (result)=>{\n const { data: { session }, error: sessionError } = result;\n if (sessionError) {\n return this._returnResult({\n data: null,\n error: sessionError\n });\n }\n if (!session) {\n return this._returnResult({\n data: null,\n error: new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError()\n });\n }\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"GET\", \"\".concat(this.url, \"/user/oauth/grants\"), {\n headers: this.headers,\n jwt: session.access_token,\n xform: (data)=>({\n data,\n error: null\n })\n });\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n /**\n * Revokes a user's OAuth grant for a specific client.\n * Only relevant when the OAuth 2.1 server is enabled in Supabase Auth.\n */ async _revokeOAuthGrant(options) {\n try {\n return await this._useSession(async (result)=>{\n const { data: { session }, error: sessionError } = result;\n if (sessionError) {\n return this._returnResult({\n data: null,\n error: sessionError\n });\n }\n if (!session) {\n return this._returnResult({\n data: null,\n error: new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError()\n });\n }\n await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"DELETE\", \"\".concat(this.url, \"/user/oauth/grants\"), {\n headers: this.headers,\n jwt: session.access_token,\n query: {\n client_id: options.clientId\n },\n noResolveJson: true\n });\n return {\n data: {},\n error: null\n };\n });\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n async fetchJwk(kid) {\n let jwks = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {\n keys: []\n };\n // try fetching from the supplied jwks\n let jwk = jwks.keys.find((key)=>key.kid === kid);\n if (jwk) {\n return jwk;\n }\n const now = Date.now();\n // try fetching from cache\n jwk = this.jwks.keys.find((key)=>key.kid === kid);\n // jwk exists and jwks isn't stale\n if (jwk && this.jwks_cached_at + _lib_constants__WEBPACK_IMPORTED_MODULE_1__.JWKS_TTL > now) {\n return jwk;\n }\n // jwk isn't cached in memory so we need to fetch it from the well-known endpoint\n const { data, error } = await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_3__._request)(this.fetch, \"GET\", \"\".concat(this.url, \"/.well-known/jwks.json\"), {\n headers: this.headers\n });\n if (error) {\n throw error;\n }\n if (!data.keys || data.keys.length === 0) {\n return null;\n }\n this.jwks = data;\n this.jwks_cached_at = now;\n // Find the signing key\n jwk = data.keys.find((key)=>key.kid === kid);\n if (!jwk) {\n return null;\n }\n return jwk;\n }\n /**\n * Extracts the JWT claims present in the access token by first verifying the\n * JWT against the server's JSON Web Key Set endpoint\n * `/.well-known/jwks.json` which is often cached, resulting in significantly\n * faster responses. Prefer this method over {@link #getUser} which always\n * sends a request to the Auth server for each JWT.\n *\n * If the project is not using an asymmetric JWT signing key (like ECC or\n * RSA) it always sends a request to the Auth server (similar to {@link\n * #getUser}) to verify the JWT.\n *\n * @param jwt An optional specific JWT you wish to verify, not the one you\n * can obtain from {@link #getSession}.\n * @param options Various additional options that allow you to customize the\n * behavior of this method.\n */ async getClaims(jwt) {\n let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n try {\n let token = jwt;\n if (!token) {\n const { data, error } = await this.getSession();\n if (error || !data.session) {\n return this._returnResult({\n data: null,\n error\n });\n }\n token = data.session.access_token;\n }\n const { header, payload, signature, raw: { header: rawHeader, payload: rawPayload } } = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.decodeJWT)(token);\n if (!(options === null || options === void 0 ? void 0 : options.allowExpired)) {\n // Reject expired JWTs should only happen if jwt argument was passed\n (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.validateExp)(payload.exp);\n }\n const signingKey = !header.alg || header.alg.startsWith(\"HS\") || !header.kid || !(\"crypto\" in globalThis && \"subtle\" in globalThis.crypto) ? null : await this.fetchJwk(header.kid, (options === null || options === void 0 ? void 0 : options.keys) ? {\n keys: options.keys\n } : options === null || options === void 0 ? void 0 : options.jwks);\n // If symmetric algorithm or WebCrypto API is unavailable, fallback to getUser()\n if (!signingKey) {\n const { error } = await this.getUser(token);\n if (error) {\n throw error;\n }\n // getUser succeeds so the claims in the JWT can be trusted\n return {\n data: {\n claims: payload,\n header,\n signature\n },\n error: null\n };\n }\n const algorithm = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.getAlgorithm)(header.alg);\n // Convert JWK to CryptoKey\n const publicKey = await crypto.subtle.importKey(\"jwk\", signingKey, algorithm, true, [\n \"verify\"\n ]);\n // Verify the signature\n const isValid = await crypto.subtle.verify(algorithm, publicKey, signature, (0,_lib_base64url__WEBPACK_IMPORTED_MODULE_9__.stringToUint8Array)(\"\".concat(rawHeader, \".\").concat(rawPayload)));\n if (!isValid) {\n throw new _lib_errors__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidJwtError(\"Invalid JWT signature\");\n }\n // If verification succeeds, decode and return claims\n return {\n data: {\n claims: payload,\n header,\n signature\n },\n error: null\n };\n } catch (error) {\n if ((0,_lib_errors__WEBPACK_IMPORTED_MODULE_2__.isAuthError)(error)) {\n return this._returnResult({\n data: null,\n error\n });\n }\n throw error;\n }\n }\n /**\n * Create a new client for use in the browser.\n *\n * @example\n * ```ts\n * import { GoTrueClient } from '@supabase/auth-js'\n *\n * const auth = new GoTrueClient({\n * url: 'https://xyzcompany.supabase.co/auth/v1',\n * headers: { apikey: 'public-anon-key' },\n * storageKey: 'supabase-auth',\n * })\n * ```\n */ constructor(options){\n var _a, _b, _c;\n /**\n * @experimental\n */ this.userStorage = null;\n this.memoryStorage = null;\n this.stateChangeEmitters = new Map();\n this.autoRefreshTicker = null;\n this.visibilityChangedCallback = null;\n this.refreshingDeferred = null;\n /**\n * Keeps track of the async client initialization.\n * When null or not yet resolved the auth state is `unknown`\n * Once resolved the auth state is known and it's safe to call any further client methods.\n * Keep extra care to never reject or throw uncaught errors\n */ this.initializePromise = null;\n this.detectSessionInUrl = true;\n this.hasCustomAuthorizationHeader = false;\n this.suppressGetSessionWarning = false;\n this.lockAcquired = false;\n this.pendingInLock = [];\n /**\n * Used to broadcast state change events to other tabs listening.\n */ this.broadcastChannel = null;\n this.logger = console.log;\n const settings = Object.assign(Object.assign({}, DEFAULT_OPTIONS), options);\n this.storageKey = settings.storageKey;\n this.instanceID = (_a = GoTrueClient.nextInstanceID[this.storageKey]) !== null && _a !== void 0 ? _a : 0;\n GoTrueClient.nextInstanceID[this.storageKey] = this.instanceID + 1;\n this.logDebugMessages = !!settings.debug;\n if (typeof settings.debug === \"function\") {\n this.logger = settings.debug;\n }\n if (this.instanceID > 0 && (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)()) {\n const message = \"\".concat(this._logPrefix(), \" Multiple GoTrueClient instances detected in the same browser context. It is not an error, but this should be avoided as it may produce undefined behavior when used concurrently under the same storage key.\");\n console.warn(message);\n if (this.logDebugMessages) {\n console.trace(message);\n }\n }\n this.persistSession = settings.persistSession;\n this.autoRefreshToken = settings.autoRefreshToken;\n this.admin = new _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__[\"default\"]({\n url: settings.url,\n headers: settings.headers,\n fetch: settings.fetch\n });\n this.url = settings.url;\n this.headers = settings.headers;\n this.fetch = (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.resolveFetch)(settings.fetch);\n this.lock = settings.lock || lockNoOp;\n this.detectSessionInUrl = settings.detectSessionInUrl;\n this.flowType = settings.flowType;\n this.hasCustomAuthorizationHeader = settings.hasCustomAuthorizationHeader;\n this.throwOnError = settings.throwOnError;\n if (settings.lock) {\n this.lock = settings.lock;\n } else if (this.persistSession && (0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)() && ((_b = globalThis === null || globalThis === void 0 ? void 0 : globalThis.navigator) === null || _b === void 0 ? void 0 : _b.locks)) {\n this.lock = _lib_locks__WEBPACK_IMPORTED_MODULE_6__.navigatorLock;\n } else {\n this.lock = lockNoOp;\n }\n if (!this.jwks) {\n this.jwks = {\n keys: []\n };\n this.jwks_cached_at = Number.MIN_SAFE_INTEGER;\n }\n this.mfa = {\n verify: this._verify.bind(this),\n enroll: this._enroll.bind(this),\n unenroll: this._unenroll.bind(this),\n challenge: this._challenge.bind(this),\n listFactors: this._listFactors.bind(this),\n challengeAndVerify: this._challengeAndVerify.bind(this),\n getAuthenticatorAssuranceLevel: this._getAuthenticatorAssuranceLevel.bind(this),\n webauthn: new _lib_webauthn__WEBPACK_IMPORTED_MODULE_11__.WebAuthnApi(this)\n };\n this.oauth = {\n getAuthorizationDetails: this._getAuthorizationDetails.bind(this),\n approveAuthorization: this._approveAuthorization.bind(this),\n denyAuthorization: this._denyAuthorization.bind(this),\n listGrants: this._listOAuthGrants.bind(this),\n revokeGrant: this._revokeOAuthGrant.bind(this)\n };\n if (this.persistSession) {\n if (settings.storage) {\n this.storage = settings.storage;\n } else {\n if ((0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.supportsLocalStorage)()) {\n this.storage = globalThis.localStorage;\n } else {\n this.memoryStorage = {};\n this.storage = (0,_lib_local_storage__WEBPACK_IMPORTED_MODULE_5__.memoryLocalStorageAdapter)(this.memoryStorage);\n }\n }\n if (settings.userStorage) {\n this.userStorage = settings.userStorage;\n }\n } else {\n this.memoryStorage = {};\n this.storage = (0,_lib_local_storage__WEBPACK_IMPORTED_MODULE_5__.memoryLocalStorageAdapter)(this.memoryStorage);\n }\n if ((0,_lib_helpers__WEBPACK_IMPORTED_MODULE_4__.isBrowser)() && globalThis.BroadcastChannel && this.persistSession && this.storageKey) {\n try {\n this.broadcastChannel = new globalThis.BroadcastChannel(this.storageKey);\n } catch (e) {\n console.error(\"Failed to create a new BroadcastChannel, multi-tab state changes will not be available\", e);\n }\n (_c = this.broadcastChannel) === null || _c === void 0 ? void 0 : _c.addEventListener(\"message\", async (event)=>{\n this._debug(\"received broadcast notification from other tab or client\", event);\n await this._notifyAllSubscribers(event.data.event, event.data.session, false); // broadcast = false so we don't get an endless loop of messages\n });\n }\n this.initialize();\n }\n}\nGoTrueClient.nextInstanceID = {};\n/* harmony default export */ __webpack_exports__[\"default\"] = (GoTrueClient); //# sourceMappingURL=GoTrueClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9Hb1RydWVDbGllbnQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUE4QztBQUNzSDtBQUM4TTtBQUNqUTtBQUNnTjtBQUNqUTtBQUNLO0FBQ2hCO0FBQ2I7QUFDK0I7QUFDYztBQUM2RztBQUNsTStDLGtFQUFrQkEsSUFBSSw4QkFBOEI7QUFDcEQsTUFBTWEsa0JBQWtCO0lBQ3BCQyxLQUFLeEQsc0RBQVVBO0lBQ2Z5RCxZQUFZdkQsdURBQVdBO0lBQ3ZCd0Qsa0JBQWtCO0lBQ2xCQyxnQkFBZ0I7SUFDaEJDLG9CQUFvQjtJQUNwQkMsU0FBUy9ELDJEQUFlQTtJQUN4QmdFLFVBQVU7SUFDVkMsT0FBTztJQUNQQyw4QkFBOEI7SUFDOUJDLGNBQWM7QUFDbEI7QUFDQSxlQUFlQyxTQUFTQyxJQUFJLEVBQUVDLGNBQWMsRUFBRUMsRUFBRTtJQUM1QyxPQUFPLE1BQU1BO0FBQ2pCO0FBQ0E7Ozs7Ozs7Q0FPQyxHQUNELE1BQU1DLGNBQWMsQ0FBQztBQUNyQixNQUFNQztJQUNGOztLQUVDLEdBQ0QsSUFBSUMsT0FBTztRQUNQLElBQUlDLElBQUlDO1FBQ1IsT0FBTyxDQUFDQSxLQUFLLENBQUNELEtBQUtILFdBQVcsQ0FBQyxJQUFJLENBQUNiLFVBQVUsQ0FBQyxNQUFNLFFBQVFnQixPQUFPLEtBQUssSUFBSSxLQUFLLElBQUlBLEdBQUdELElBQUksTUFBTSxRQUFRRSxPQUFPLEtBQUssSUFBSUEsS0FBSztZQUFFQyxNQUFNLEVBQUU7UUFBQztJQUMvSTtJQUNBLElBQUlILEtBQUtJLEtBQUssRUFBRTtRQUNaTixXQUFXLENBQUMsSUFBSSxDQUFDYixVQUFVLENBQUMsR0FBR29CLE9BQU9DLE1BQU0sQ0FBQ0QsT0FBT0MsTUFBTSxDQUFDLENBQUMsR0FBR1IsV0FBVyxDQUFDLElBQUksQ0FBQ2IsVUFBVSxDQUFDLEdBQUc7WUFBRWUsTUFBTUk7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M1AsSUFBSSxDQUFDMlAsS0FBSyxFQUFFQSxNQUFNM1AsSUFBSSxDQUFDTSxPQUFPLEVBQUUsUUFBUSxnRUFBZ0U7WUFDbko7UUFDSjtRQUNBLElBQUksQ0FBQ2pCLFVBQVU7SUFDbkI7QUF5aUZKO0FBQ0F4QixhQUFhZ1osY0FBYyxHQUFHLENBQUM7QUFDL0IsK0RBQWVoWixZQUFZQSxFQUFDLENBQzVCLHdDQUF3QyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvR29UcnVlQ2xpZW50LmpzP2Y2NzAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEdvVHJ1ZUFkbWluQXBpIGZyb20gJy4vR29UcnVlQWRtaW5BcGknO1xuaW1wb3J0IHsgQVVUT19SRUZSRVNIX1RJQ0tfRFVSQVRJT05fTVMsIEFVVE9fUkVGUkVTSF9USUNLX1RIUkVTSE9MRCwgREVGQVVMVF9IRUFERVJTLCBFWFBJUllfTUFSR0lOX01TLCBHT1RSVUVfVVJMLCBKV0tTX1RUTCwgU1RPUkFHRV9LRVksIH0gZnJvbSAnLi9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IEF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciwgQXV0aEludmFsaWRDcmVkZW50aWFsc0Vycm9yLCBBdXRoSW52YWxpZEp3dEVycm9yLCBBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvciwgQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3IsIEF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvciwgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IsIEF1dGhVbmtub3duRXJyb3IsIGlzQXV0aEFwaUVycm9yLCBpc0F1dGhFcnJvciwgaXNBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IsIGlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IsIGlzQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IsIH0gZnJvbSAnLi9saWIvZXJyb3JzJztcbmltcG9ydCB7IF9yZXF1ZXN0LCBfc2Vzc2lvblJlc3BvbnNlLCBfc2Vzc2lvblJlc3BvbnNlUGFzc3dvcmQsIF9zc29SZXNwb25zZSwgX3VzZXJSZXNwb25zZSwgfSBmcm9tICcuL2xpYi9mZXRjaCc7XG5pbXBvcnQgeyBkZWNvZGVKV1QsIGRlZXBDbG9uZSwgRGVmZXJyZWQsIGdlbmVyYXRlQ2FsbGJhY2tJZCwgZ2V0QWxnb3JpdGhtLCBnZXRDb2RlQ2hhbGxlbmdlQW5kTWV0aG9kLCBnZXRJdGVtQXN5bmMsIGluc2VjdXJlVXNlcldhcm5pbmdQcm94eSwgaXNCcm93c2VyLCBwYXJzZVBhcmFtZXRlcnNGcm9tVVJMLCByZW1vdmVJdGVtQXN5bmMsIHJlc29sdmVGZXRjaCwgcmV0cnlhYmxlLCBzZXRJdGVtQXN5bmMsIHNsZWVwLCBzdXBwb3J0c0xvY2FsU3RvcmFnZSwgdXNlck5vdEF2YWlsYWJsZVByb3h5LCB2YWxpZGF0ZUV4cCwgfSBmcm9tICcuL2xpYi9oZWxwZXJzJztcbmltcG9ydCB7IG1lbW9yeUxvY2FsU3RvcmFnZUFkYXB0ZXIgfSBmcm9tICcuL2xpYi9sb2NhbC1zdG9yYWdlJztcbmltcG9ydCB7IExvY2tBY3F1aXJlVGltZW91dEVycm9yLCBuYXZpZ2F0b3JMb2NrIH0gZnJvbSAnLi9saWIvbG9ja3MnO1xuaW1wb3J0IHsgcG9seWZpbGxHbG9iYWxUaGlzIH0gZnJvbSAnLi9saWIvcG9seWZpbGxzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL2xpYi92ZXJzaW9uJztcbmltcG9ydCB7IGJ5dGVzVG9CYXNlNjRVUkwsIHN0cmluZ1RvVWludDhBcnJheSB9IGZyb20gJy4vbGliL2Jhc2U2NHVybCc7XG5pbXBvcnQgeyBjcmVhdGVTaXdlTWVzc2FnZSwgZnJvbUhleCwgZ2V0QWRkcmVzcywgdG9IZXgsIH0gZnJvbSAnLi9saWIvd2ViMy9ldGhlcmV1bSc7XG5pbXBvcnQgeyBkZXNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMsIGRlc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zLCBzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25SZXNwb25zZSwgc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RSZXNwb25zZSwgV2ViQXV0aG5BcGksIH0gZnJvbSAnLi9saWIvd2ViYXV0aG4nO1xucG9seWZpbGxHbG9iYWxUaGlzKCk7IC8vIE1ha2UgXCJnbG9iYWxUaGlzXCIgYXZhaWxhYmxlXG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG4gICAgdXJsOiBHT1RSVUVfVVJMLFxuICAgIHN0b3JhZ2VLZXk6IFNUT1JBR0VfS0VZLFxuICAgIGF1dG9SZWZyZXNoVG9rZW46IHRydWUsXG4gICAgcGVyc2lzdFNlc3Npb246IHRydWUsXG4gICAgZGV0ZWN0U2Vzc2lvbkluVXJsOiB0cnVlLFxuICAgIGhlYWRlcnM6IERFRkFVTFRfSEVBREVSUyxcbiAgICBmbG93VHlwZTogJ2ltcGxpY2l0JyxcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgaGFzQ3VzdG9tQXV0aG9yaXphdGlvbkhlYWRlcjogZmFsc2UsXG4gICAgdGhyb3dPbkVycm9yOiBmYWxzZSxcbn07XG5hc3luYyBmdW5jdGlvbiBsb2NrTm9PcChuYW1lLCBhY3F1aXJlVGltZW91dCwgZm4pIHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbn1cbi8qKlxuICogQ2FjaGVzIEpXS1MgdmFsdWVzIGZvciBhbGwgY2xpZW50cyBjcmVhdGVkIGluIHRoZSBzYW1lIGVudmlyb25tZW50LiBUaGlzIGlzXG4gKiBlc3BlY2lhbGx5IHVzZWZ1bCBmb3Igc2hhcmVkLW1lbW9yeSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHN1Y2ggYXMgVmVyY2VsJ3NcbiAqIEZsdWlkIENvbXB1dGUsIEFXUyBMYW1iZGEgb3IgU3VwYWJhc2UncyBFZGdlIEZ1bmN0aW9ucy4gUmVnYXJkbGVzcyBvZiBob3dcbiAqIG1hbnkgY2xpZW50cyBhcmUgY3JlYXRlZCwgaWYgdGhleSBzaGFyZSB0aGUgc2FtZSBzdG9yYWdlIGtleSB0aGV5IHdpbGwgdXNlXG4gKiB0aGUgc2FtZSBKV0tTIGNhY2hlLCBzaWduaWZpY2FudGx5IHNwZWVkaW5nIHVwIGdldENsYWltcygpIHdpdGggYXN5bW1ldHJpY1xuICogSldUcy5cbiAqL1xuY29uc3QgR0xPQkFMX0pXS1MgPSB7fTtcbmNsYXNzIEdvVHJ1ZUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIEpXS1MgdXNlZCBmb3IgdmVyaWZ5aW5nIGFzeW1tZXRyaWMgSldUc1xuICAgICAqL1xuICAgIGdldCBqd2tzKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gR0xPQkFMX0pXS1NbdGhpcy5zdG9yYWdlS2V5XSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmp3a3MpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHsga2V5czogW10gfTtcbiAgICB9XG4gICAgc2V0IGp3a3ModmFsdWUpIHtcbiAgICAgICAgR0xPQkFMX0pXS1NbdGhpcy5zdG9yYWdlS2V5XSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgR0xPQkFMX0pXS1NbdGhpcy5zdG9yYWdlS2V5XSksIHsgandrczogdmFsdWUgfSk7XG4gICAgfVxuICAgIGdldCBqd2tzX2NhY2hlZF9hdCgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IEdMT0JBTF9KV0tTW3RoaXMuc3RvcmFnZUtleV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWNoZWRBdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgfVxuICAgIHNldCBqd2tzX2NhY2hlZF9hdCh2YWx1ZSkge1xuICAgICAgICBHTE9CQUxfSldLU1t0aGlzLnN0b3JhZ2VLZXldID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBHTE9CQUxfSldLU1t0aGlzLnN0b3JhZ2VLZXldKSwgeyBjYWNoZWRBdDogdmFsdWUgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBjbGllbnQgZm9yIHVzZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBHb1RydWVDbGllbnQgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAgICAgKlxuICAgICAqIGNvbnN0IGF1dGggPSBuZXcgR29UcnVlQ2xpZW50KHtcbiAgICAgKiAgIHVybDogJ2h0dHBzOi8veHl6Y29tcGFueS5zdXBhYmFzZS5jby9hdXRoL3YxJyxcbiAgICAgKiAgIGhlYWRlcnM6IHsgYXBpa2V5OiAncHVibGljLWFub24ta2V5JyB9LFxuICAgICAqICAgc3RvcmFnZUtleTogJ3N1cGFiYXNlLWF1dGgnLFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXNlclN0b3JhZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLm1lbW9yeVN0b3JhZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlRW1pdHRlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuYXV0b1JlZnJlc2hUaWNrZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2sgPSBudWxsO1xuICAgICAgICB0aGlzLnJlZnJlc2hpbmdEZWZlcnJlZCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgYXN5bmMgY2xpZW50IGluaXRpYWxpemF0aW9uLlxuICAgICAgICAgKiBXaGVuIG51bGwgb3Igbm90IHlldCByZXNvbHZlZCB0aGUgYXV0aCBzdGF0ZSBpcyBgdW5rbm93bmBcbiAgICAgICAgICogT25jZSByZXNvbHZlZCB0aGUgYXV0aCBzdGF0ZSBpcyBrbm93biBhbmQgaXQncyBzYWZlIHRvIGNhbGwgYW55IGZ1cnRoZXIgY2xpZW50IG1ldGhvZHMuXG4gICAgICAgICAqIEtlZXAgZXh0cmEgY2FyZSB0byBuZXZlciByZWplY3Qgb3IgdGhyb3cgdW5jYXVnaHQgZXJyb3JzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluaXRpYWxpemVQcm9taXNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZXRlY3RTZXNzaW9uSW5VcmwgPSB0cnVlO1xuICAgICAgICB0aGlzLmhhc0N1c3RvbUF1dGhvcml6YXRpb25IZWFkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0dldFNlc3Npb25XYXJuaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9ja0FjcXVpcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGVuZGluZ0luTG9jayA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBicm9hZGNhc3Qgc3RhdGUgY2hhbmdlIGV2ZW50cyB0byBvdGhlciB0YWJzIGxpc3RlbmluZy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYnJvYWRjYXN0Q2hhbm5lbCA9IG51bGw7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gY29uc29sZS5sb2c7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMpLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlS2V5ID0gc2V0dGluZ3Muc3RvcmFnZUtleTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZUlEID0gKF9hID0gR29UcnVlQ2xpZW50Lm5leHRJbnN0YW5jZUlEW3RoaXMuc3RvcmFnZUtleV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgIEdvVHJ1ZUNsaWVudC5uZXh0SW5zdGFuY2VJRFt0aGlzLnN0b3JhZ2VLZXldID0gdGhpcy5pbnN0YW5jZUlEICsgMTtcbiAgICAgICAgdGhpcy5sb2dEZWJ1Z01lc3NhZ2VzID0gISFzZXR0aW5ncy5kZWJ1ZztcbiAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5kZWJ1ZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIgPSBzZXR0aW5ncy5kZWJ1ZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZUlEID4gMCAmJiBpc0Jyb3dzZXIoKSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGAke3RoaXMuX2xvZ1ByZWZpeCgpfSBNdWx0aXBsZSBHb1RydWVDbGllbnQgaW5zdGFuY2VzIGRldGVjdGVkIGluIHRoZSBzYW1lIGJyb3dzZXIgY29udGV4dC4gSXQgaXMgbm90IGFuIGVycm9yLCBidXQgdGhpcyBzaG91bGQgYmUgYXZvaWRlZCBhcyBpdCBtYXkgcHJvZHVjZSB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiB1c2VkIGNvbmN1cnJlbnRseSB1bmRlciB0aGUgc2FtZSBzdG9yYWdlIGtleS5gO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICAgICAgaWYgKHRoaXMubG9nRGVidWdNZXNzYWdlcykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUudHJhY2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZXJzaXN0U2Vzc2lvbiA9IHNldHRpbmdzLnBlcnNpc3RTZXNzaW9uO1xuICAgICAgICB0aGlzLmF1dG9SZWZyZXNoVG9rZW4gPSBzZXR0aW5ncy5hdXRvUmVmcmVzaFRva2VuO1xuICAgICAgICB0aGlzLmFkbWluID0gbmV3IEdvVHJ1ZUFkbWluQXBpKHtcbiAgICAgICAgICAgIHVybDogc2V0dGluZ3MudXJsLFxuICAgICAgICAgICAgaGVhZGVyczogc2V0dGluZ3MuaGVhZGVycyxcbiAgICAgICAgICAgIGZldGNoOiBzZXR0aW5ncy5mZXRjaCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXJsID0gc2V0dGluZ3MudXJsO1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBzZXR0aW5ncy5oZWFkZXJzO1xuICAgICAgICB0aGlzLmZldGNoID0gcmVzb2x2ZUZldGNoKHNldHRpbmdzLmZldGNoKTtcbiAgICAgICAgdGhpcy5sb2NrID0gc2V0dGluZ3MubG9jayB8fCBsb2NrTm9PcDtcbiAgICAgICAgdGhpcy5kZXRlY3RTZXNzaW9uSW5VcmwgPSBzZXR0aW5ncy5kZXRlY3RTZXNzaW9uSW5Vcmw7XG4gICAgICAgIHRoaXMuZmxvd1R5cGUgPSBzZXR0aW5ncy5mbG93VHlwZTtcbiAgICAgICAgdGhpcy5oYXNDdXN0b21BdXRob3JpemF0aW9uSGVhZGVyID0gc2V0dGluZ3MuaGFzQ3VzdG9tQXV0aG9yaXphdGlvbkhlYWRlcjtcbiAgICAgICAgdGhpcy50aHJvd09uRXJyb3IgPSBzZXR0aW5ncy50aHJvd09uRXJyb3I7XG4gICAgICAgIGlmIChzZXR0aW5ncy5sb2NrKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2sgPSBzZXR0aW5ncy5sb2NrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucGVyc2lzdFNlc3Npb24gJiYgaXNCcm93c2VyKCkgJiYgKChfYiA9IGdsb2JhbFRoaXMgPT09IG51bGwgfHwgZ2xvYmFsVGhpcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ2xvYmFsVGhpcy5uYXZpZ2F0b3IpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5sb2NrcykpIHtcbiAgICAgICAgICAgIHRoaXMubG9jayA9IG5hdmlnYXRvckxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvY2sgPSBsb2NrTm9PcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuandrcykge1xuICAgICAgICAgICAgdGhpcy5qd2tzID0geyBrZXlzOiBbXSB9O1xuICAgICAgICAgICAgdGhpcy5qd2tzX2NhY2hlZF9hdCA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWZhID0ge1xuICAgICAgICAgICAgdmVyaWZ5OiB0aGlzLl92ZXJpZnkuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGVucm9sbDogdGhpcy5fZW5yb2xsLmJpbmQodGhpcyksXG4gICAgICAgICAgICB1bmVucm9sbDogdGhpcy5fdW5lbnJvbGwuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGNoYWxsZW5nZTogdGhpcy5fY2hhbGxlbmdlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBsaXN0RmFjdG9yczogdGhpcy5fbGlzdEZhY3RvcnMuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGNoYWxsZW5nZUFuZFZlcmlmeTogdGhpcy5fY2hhbGxlbmdlQW5kVmVyaWZ5LmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRBdXRoZW50aWNhdG9yQXNzdXJhbmNlTGV2ZWw6IHRoaXMuX2dldEF1dGhlbnRpY2F0b3JBc3N1cmFuY2VMZXZlbC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgd2ViYXV0aG46IG5ldyBXZWJBdXRobkFwaSh0aGlzKSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vYXV0aCA9IHtcbiAgICAgICAgICAgIGdldEF1dGhvcml6YXRpb25EZXRhaWxzOiB0aGlzLl9nZXRBdXRob3JpemF0aW9uRGV0YWlscy5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgYXBwcm92ZUF1dGhvcml6YXRpb246IHRoaXMuX2FwcHJvdmVBdXRob3JpemF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgICAgICBkZW55QXV0aG9yaXphdGlvbjogdGhpcy5fZGVueUF1dGhvcml6YXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGxpc3RHcmFudHM6IHRoaXMuX2xpc3RPQXV0aEdyYW50cy5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcmV2b2tlR3JhbnQ6IHRoaXMuX3Jldm9rZU9BdXRoR3JhbnQuYmluZCh0aGlzKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMucGVyc2lzdFNlc3Npb24pIHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zdG9yYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlID0gc2V0dGluZ3Muc3RvcmFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZSA9IGdsb2JhbFRoaXMubG9jYWxTdG9yYWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlID0ge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZSA9IG1lbW9yeUxvY2FsU3RvcmFnZUFkYXB0ZXIodGhpcy5tZW1vcnlTdG9yYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MudXNlclN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJTdG9yYWdlID0gc2V0dGluZ3MudXNlclN0b3JhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1lbW9yeVN0b3JhZ2UgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZSA9IG1lbW9yeUxvY2FsU3RvcmFnZUFkYXB0ZXIodGhpcy5tZW1vcnlTdG9yYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNCcm93c2VyKCkgJiYgZ2xvYmFsVGhpcy5Ccm9hZGNhc3RDaGFubmVsICYmIHRoaXMucGVyc2lzdFNlc3Npb24gJiYgdGhpcy5zdG9yYWdlS2V5KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0Q2hhbm5lbCA9IG5ldyBnbG9iYWxUaGlzLkJyb2FkY2FzdENoYW5uZWwodGhpcy5zdG9yYWdlS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBCcm9hZGNhc3RDaGFubmVsLCBtdWx0aS10YWIgc3RhdGUgY2hhbmdlcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUnLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChfYyA9IHRoaXMuYnJvYWRjYXN0Q2hhbm5lbCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygncmVjZWl2ZWQgYnJvYWRjYXN0IG5vdGlmaWNhdGlvbiBmcm9tIG90aGVyIHRhYiBvciBjbGllbnQnLCBldmVudCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoZXZlbnQuZGF0YS5ldmVudCwgZXZlbnQuZGF0YS5zZXNzaW9uLCBmYWxzZSk7IC8vIGJyb2FkY2FzdCA9IGZhbHNlIHNvIHdlIGRvbid0IGdldCBhbiBlbmRsZXNzIGxvb3Agb2YgbWVzc2FnZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgZXJyb3IgdGhyb3dpbmcgbW9kZSBpcyBlbmFibGVkIGZvciB0aGlzIGNsaWVudC5cbiAgICAgKi9cbiAgICBpc1Rocm93T25FcnJvckVuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRocm93T25FcnJvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2VudHJhbGl6ZXMgcmV0dXJuIGhhbmRsaW5nIHdpdGggb3B0aW9uYWwgZXJyb3IgdGhyb3dpbmcuIFdoZW4gYHRocm93T25FcnJvcmAgaXMgZW5hYmxlZFxuICAgICAqIGFuZCB0aGUgcHJvdmlkZWQgcmVzdWx0IGNvbnRhaW5zIGEgbm9uLW51bGxpc2ggZXJyb3IsIHRoZSBlcnJvciBpcyB0aHJvd24gaW5zdGVhZCBvZlxuICAgICAqIGJlaW5nIHJldHVybmVkLiBUaGlzIGVuc3VyZXMgY29uc2lzdGVudCBiZWhhdmlvciBhY3Jvc3MgYWxsIHB1YmxpYyBBUEkgbWV0aG9kcy5cbiAgICAgKi9cbiAgICBfcmV0dXJuUmVzdWx0KHJlc3VsdCkge1xuICAgICAgICBpZiAodGhpcy50aHJvd09uRXJyb3IgJiYgcmVzdWx0ICYmIHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIF9sb2dQcmVmaXgoKSB7XG4gICAgICAgIHJldHVybiAoJ0dvVHJ1ZUNsaWVudEAnICtcbiAgICAgICAgICAgIGAke3RoaXMuc3RvcmFnZUtleX06JHt0aGlzLmluc3RhbmNlSUR9ICgke3ZlcnNpb259KSAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gKTtcbiAgICB9XG4gICAgX2RlYnVnKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMubG9nRGVidWdNZXNzYWdlcykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIodGhpcy5fbG9nUHJlZml4KCksIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgY2xpZW50IHNlc3Npb24gZWl0aGVyIGZyb20gdGhlIHVybCBvciBmcm9tIHN0b3JhZ2UuXG4gICAgICogVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBjbGllbnQsIGJ1dCBzaG91bGQgYWxzbyBiZSBjYWxsZWRcbiAgICAgKiBtYW51YWxseSB3aGVuIGNoZWNraW5nIGZvciBhbiBlcnJvciBmcm9tIGFuIGF1dGggcmVkaXJlY3QgKG9hdXRoLCBtYWdpY2xpbmssIHBhc3N3b3JkIHJlY292ZXJ5LCBldGMpLlxuICAgICAqL1xuICAgIGFzeW5jIGluaXRpYWxpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluaXRpYWxpemVQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hY3F1aXJlTG9jaygtMSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9pbml0aWFsaXplKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElNUE9SVEFOVDpcbiAgICAgKiAxLiBOZXZlciB0aHJvdyBpbiB0aGlzIG1ldGhvZCwgYXMgaXQgaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yXG4gICAgICogMi4gTmV2ZXIgcmV0dXJuIGEgc2Vzc2lvbiBmcm9tIHRoaXMgbWV0aG9kIGFzIGl0IHdvdWxkIGJlIGNhY2hlZCBvdmVyXG4gICAgICogICAgdGhlIHdob2xlIGxpZmV0aW1lIG9mIHRoZSBjbGllbnRcbiAgICAgKi9cbiAgICBhc3luYyBfaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgbGV0IGNhbGxiYWNrVXJsVHlwZSA9ICdub25lJztcbiAgICAgICAgICAgIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcnNlUGFyYW1ldGVyc0Zyb21VUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0ltcGxpY2l0R3JhbnRDYWxsYmFjayhwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrVXJsVHlwZSA9ICdpbXBsaWNpdCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF3YWl0IHRoaXMuX2lzUEtDRUNhbGxiYWNrKHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tVcmxUeXBlID0gJ3BrY2UnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQXR0ZW1wdCB0byBnZXQgdGhlIHNlc3Npb24gZnJvbSB0aGUgVVJMIG9ubHkgaWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgZnVsZmlsbGVkXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogTm90ZTogSWYgdGhlIFVSTCBpc24ndCBvbmUgb2YgdGhlIGNhbGxiYWNrIHVybCB0eXBlcyAoaW1wbGljaXQgb3IgcGtjZSksXG4gICAgICAgICAgICAgKiB0aGVuIHRoZXJlIGNvdWxkIGJlIGFuIGV4aXN0aW5nIHNlc3Npb24gc28gd2UgZG9uJ3Qgd2FudCB0byBwcmVtYXR1cmVseSByZW1vdmUgaXRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKGlzQnJvd3NlcigpICYmIHRoaXMuZGV0ZWN0U2Vzc2lvbkluVXJsICYmIGNhbGxiYWNrVXJsVHlwZSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fZ2V0U2Vzc2lvbkZyb21VUkwocGFyYW1zLCBjYWxsYmFja1VybFR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19pbml0aWFsaXplKCknLCAnZXJyb3IgZGV0ZWN0aW5nIHNlc3Npb24gZnJvbSBVUkwnLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0F1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IChfYSA9IGVycm9yLmRldGFpbHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ2lkZW50aXR5X2FscmVhZHlfZXhpc3RzJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9PT0gJ2lkZW50aXR5X25vdF9mb3VuZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPT09ICdzaW5nbGVfaWRlbnRpdHlfbm90X2RlbGV0YWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCBsb2dpbiBhdHRlbXB0IHZpYSB1cmwsXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBvbGQgc2Vzc2lvbiBhcyBpbiB2ZXJpZnlPdHAsIHNpZ25VcCBhbmQgc2lnbkluV2l0aCpcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVtb3ZlU2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IHNlc3Npb24sIHJlZGlyZWN0VHlwZSB9ID0gZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19pbml0aWFsaXplKCknLCAnZGV0ZWN0ZWQgc2Vzc2lvbiBpbiBVUkwnLCBzZXNzaW9uLCAncmVkaXJlY3QgdHlwZScsIHJlZGlyZWN0VHlwZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdFR5cGUgPT09ICdyZWNvdmVyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdQQVNTV09SRF9SRUNPVkVSWScsIHNlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1NJR05FRF9JTicsIHNlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG5vIGxvZ2luIGF0dGVtcHQgdmlhIGNhbGxiYWNrIHVybCB0cnkgdG8gcmVjb3ZlciBzZXNzaW9uIGZyb20gc3RvcmFnZVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVjb3ZlckFuZFJlZnJlc2goKTtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBBdXRoVW5rbm93bkVycm9yKCdVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBpbml0aWFsaXphdGlvbicsIGVycm9yKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5faGFuZGxlVmlzaWJpbGl0eUNoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfaW5pdGlhbGl6ZSgpJywgJ2VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYW5vbnltb3VzIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHNlc3Npb24gd2hlcmUgdGhlIGlzX2Fub255bW91cyBjbGFpbSBpbiB0aGUgYWNjZXNzIHRva2VuIEpXVCBzZXQgdG8gdHJ1ZVxuICAgICAqL1xuICAgIGFzeW5jIHNpZ25JbkFub255bW91c2x5KGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vc2lnbnVwYCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IChfYiA9IChfYSA9IGNyZWRlbnRpYWxzID09PSBudWxsIHx8IGNyZWRlbnRpYWxzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGF0YSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDoge30sXG4gICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IChfYyA9IGNyZWRlbnRpYWxzID09PSBudWxsIHx8IGNyZWRlbnRpYWxzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2FwdGNoYVRva2VuIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzO1xuICAgICAgICAgICAgaWYgKGVycm9yIHx8ICFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvcjogZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gZGF0YS5zZXNzaW9uO1xuICAgICAgICAgICAgY29uc3QgdXNlciA9IGRhdGEudXNlcjtcbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdXNlci5cbiAgICAgKlxuICAgICAqIEJlIGF3YXJlIHRoYXQgaWYgYSB1c2VyIGFjY291bnQgZXhpc3RzIGluIHRoZSBzeXN0ZW0geW91IG1heSBnZXQgYmFjayBhblxuICAgICAqIGVycm9yIG1lc3NhZ2UgdGhhdCBhdHRlbXB0cyB0byBoaWRlIHRoaXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgdXNlci5cbiAgICAgKiBUaGlzIG1ldGhvZCBoYXMgc3VwcG9ydCBmb3IgUEtDRSB2aWEgZW1haWwgc2lnbnVwcy4gVGhlIFBLQ0UgZmxvdyBjYW5ub3QgYmUgdXNlZCB3aGVuIGF1dG9jb25maXJtIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGxvZ2dlZC1pbiBzZXNzaW9uIGlmIHRoZSBzZXJ2ZXIgaGFzIFwiYXV0b2NvbmZpcm1cIiBPTlxuICAgICAqIEByZXR1cm5zIEEgdXNlciBpZiB0aGUgc2VydmVyIGhhcyBcImF1dG9jb25maXJtXCIgT0ZGXG4gICAgICovXG4gICAgYXN5bmMgc2lnblVwKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlcztcbiAgICAgICAgICAgIGlmICgnZW1haWwnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlbWFpbCwgcGFzc3dvcmQsIG9wdGlvbnMgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIGxldCBjb2RlQ2hhbGxlbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgY29kZUNoYWxsZW5nZU1ldGhvZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmxvd1R5cGUgPT09ICdwa2NlJykge1xuICAgICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgICAgIFtjb2RlQ2hhbGxlbmdlLCBjb2RlQ2hhbGxlbmdlTWV0aG9kXSA9IGF3YWl0IGdldENvZGVDaGFsbGVuZ2VBbmRNZXRob2QodGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXMgPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9zaWdudXBgLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RUbzogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmVtYWlsUmVkaXJlY3RUbyxcbiAgICAgICAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kYXRhKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfY2hhbGxlbmdlOiBjb2RlQ2hhbGxlbmdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9jaGFsbGVuZ2VfbWV0aG9kOiBjb2RlQ2hhbGxlbmdlTWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCdwaG9uZScgaW4gY3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHBob25lLCBwYXNzd29yZCwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vc2lnbnVwYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGF0YSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsOiAoX2MgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY2hhbm5lbCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJ3NtcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY2FwdGNoYVRva2VuIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHhmb3JtOiBfc2Vzc2lvblJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvcignWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyIGFuZCBhIHBhc3N3b3JkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSByZXM7XG4gICAgICAgICAgICBpZiAoZXJyb3IgfHwgIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSBkYXRhLnNlc3Npb247XG4gICAgICAgICAgICBjb25zdCB1c2VyID0gZGF0YS51c2VyO1xuICAgICAgICAgICAgaWYgKGRhdGEuc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1NJR05FRF9JTicsIHNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2cgaW4gYW4gZXhpc3RpbmcgdXNlciB3aXRoIGFuIGVtYWlsIGFuZCBwYXNzd29yZCBvciBwaG9uZSBhbmQgcGFzc3dvcmQuXG4gICAgICpcbiAgICAgKiBCZSBhd2FyZSB0aGF0IHlvdSBtYXkgZ2V0IGJhY2sgYW4gZXJyb3IgbWVzc2FnZSB0aGF0IHdpbGwgbm90IGRpc3Rpbmd1aXNoXG4gICAgICogYmV0d2VlbiB0aGUgY2FzZXMgd2hlcmUgdGhlIGFjY291bnQgZG9lcyBub3QgZXhpc3Qgb3IgdGhhdCB0aGVcbiAgICAgKiBlbWFpbC9waG9uZSBhbmQgcGFzc3dvcmQgY29tYmluYXRpb24gaXMgd3Jvbmcgb3IgdGhhdCB0aGUgYWNjb3VudCBjYW4gb25seVxuICAgICAqIGJlIGFjY2Vzc2VkIHZpYSBzb2NpYWwgbG9naW4uXG4gICAgICovXG4gICAgYXN5bmMgc2lnbkluV2l0aFBhc3N3b3JkKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzO1xuICAgICAgICAgICAgaWYgKCdlbWFpbCcgaW4gY3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVtYWlsLCBwYXNzd29yZCwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT1wYXNzd29yZGAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZVBhc3N3b3JkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoJ3Bob25lJyBpbiBjcmVkZW50aWFscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgcGhvbmUsIHBhc3N3b3JkLCBvcHRpb25zIH0gPSBjcmVkZW50aWFscztcbiAgICAgICAgICAgICAgICByZXMgPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS90b2tlbj9ncmFudF90eXBlPXBhc3N3b3JkYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY2FwdGNoYVRva2VuIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHhmb3JtOiBfc2Vzc2lvblJlc3BvbnNlUGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aEludmFsaWRDcmVkZW50aWFsc0Vycm9yKCdZb3UgbXVzdCBwcm92aWRlIGVpdGhlciBhbiBlbWFpbCBvciBwaG9uZSBudW1iZXIgYW5kIGEgcGFzc3dvcmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IHJlcztcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghZGF0YSB8fCAhZGF0YS5zZXNzaW9uIHx8ICFkYXRhLnVzZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnZhbGlkVG9rZW5FcnJvciA9IG5ldyBBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3I6IGludmFsaWRUb2tlbkVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEuc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1NJR05FRF9JTicsIGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHtcbiAgICAgICAgICAgICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHsgdXNlcjogZGF0YS51c2VyLCBzZXNzaW9uOiBkYXRhLnNlc3Npb24gfSwgKGRhdGEud2Vha19wYXNzd29yZCA/IHsgd2Vha1Bhc3N3b3JkOiBkYXRhLndlYWtfcGFzc3dvcmQgfSA6IG51bGwpKSxcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2cgaW4gYW4gZXhpc3RpbmcgdXNlciB2aWEgYSB0aGlyZC1wYXJ0eSBwcm92aWRlci5cbiAgICAgKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgUEtDRSBmbG93LlxuICAgICAqL1xuICAgIGFzeW5jIHNpZ25JbldpdGhPQXV0aChjcmVkZW50aWFscykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9oYW5kbGVQcm92aWRlclNpZ25JbihjcmVkZW50aWFscy5wcm92aWRlciwge1xuICAgICAgICAgICAgcmVkaXJlY3RUbzogKF9hID0gY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlZGlyZWN0VG8sXG4gICAgICAgICAgICBzY29wZXM6IChfYiA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zY29wZXMsXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogKF9jID0gY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgICAgc2tpcEJyb3dzZXJSZWRpcmVjdDogKF9kID0gY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLnNraXBCcm93c2VyUmVkaXJlY3QsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2cgaW4gYW4gZXhpc3RpbmcgdXNlciBieSBleGNoYW5naW5nIGFuIEF1dGggQ29kZSBpc3N1ZWQgZHVyaW5nIHRoZSBQS0NFIGZsb3cuXG4gICAgICovXG4gICAgYXN5bmMgZXhjaGFuZ2VDb2RlRm9yU2Vzc2lvbihhdXRoQ29kZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgICAgICByZXR1cm4gdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9leGNoYW5nZUNvZGVGb3JTZXNzaW9uKGF1dGhDb2RlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpZ25zIGluIGEgdXNlciBieSB2ZXJpZnlpbmcgYSBtZXNzYWdlIHNpZ25lZCBieSB0aGUgdXNlcidzIHByaXZhdGUga2V5LlxuICAgICAqIFN1cHBvcnRzIEV0aGVyZXVtICh2aWEgU2lnbi1Jbi1XaXRoLUV0aGVyZXVtKSAmIFNvbGFuYSAoU2lnbi1Jbi1XaXRoLVNvbGFuYSkgc3RhbmRhcmRzLFxuICAgICAqIGJvdGggb2Ygd2hpY2ggZGVyaXZlIGZyb20gdGhlIEVJUC00MzYxIHN0YW5kYXJkXG4gICAgICogV2l0aCBzbGlnaHQgdmFyaWF0aW9uIG9uIFNvbGFuYSdzIHNpZGUuXG4gICAgICogQHJlZmVyZW5jZSBodHRwczovL2VpcHMuZXRoZXJldW0ub3JnL0VJUFMvZWlwLTQzNjFcbiAgICAgKi9cbiAgICBhc3luYyBzaWduSW5XaXRoV2ViMyhjcmVkZW50aWFscykge1xuICAgICAgICBjb25zdCB7IGNoYWluIH0gPSBjcmVkZW50aWFscztcbiAgICAgICAgc3dpdGNoIChjaGFpbikge1xuICAgICAgICAgICAgY2FzZSAnZXRoZXJldW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNpZ25JbldpdGhFdGhlcmV1bShjcmVkZW50aWFscyk7XG4gICAgICAgICAgICBjYXNlICdzb2xhbmEnOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNpZ25JbldpdGhTb2xhbmEoY3JlZGVudGlhbHMpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBVbnN1cHBvcnRlZCBjaGFpbiBcIiR7Y2hhaW59XCJgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBzaWduSW5XaXRoRXRoZXJldW0oY3JlZGVudGlhbHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbDtcbiAgICAgICAgLy8gVE9ETzogZmxhdHRlbiB0eXBlXG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICBsZXQgc2lnbmF0dXJlO1xuICAgICAgICBpZiAoJ21lc3NhZ2UnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gY3JlZGVudGlhbHMubWVzc2FnZTtcbiAgICAgICAgICAgIHNpZ25hdHVyZSA9IGNyZWRlbnRpYWxzLnNpZ25hdHVyZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgY2hhaW4sIHdhbGxldCwgc3RhdGVtZW50LCBvcHRpb25zIH0gPSBjcmVkZW50aWFscztcbiAgICAgICAgICAgIGxldCByZXNvbHZlZFdhbGxldDtcbiAgICAgICAgICAgIGlmICghaXNCcm93c2VyKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdhbGxldCAhPT0gJ29iamVjdCcgfHwgIShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudXJsKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BzdXBhYmFzZS9hdXRoLWpzOiBCb3RoIHdhbGxldCBhbmQgdXJsIG11c3QgYmUgc3BlY2lmaWVkIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRXYWxsZXQgPSB3YWxsZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygd2FsbGV0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHJlc29sdmVkV2FsbGV0ID0gd2FsbGV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93QW55ID0gd2luZG93O1xuICAgICAgICAgICAgICAgIGlmICgnZXRoZXJldW0nIGluIHdpbmRvd0FueSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygd2luZG93QW55LmV0aGVyZXVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICAncmVxdWVzdCcgaW4gd2luZG93QW55LmV0aGVyZXVtICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB3aW5kb3dBbnkuZXRoZXJldW0ucmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFdhbGxldCA9IHdpbmRvd0FueS5ldGhlcmV1bTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IE5vIGNvbXBhdGlibGUgRXRoZXJldW0gd2FsbGV0IGludGVyZmFjZSBvbiB0aGUgd2luZG93IG9iamVjdCAod2luZG93LmV0aGVyZXVtKSBkZXRlY3RlZC4gTWFrZSBzdXJlIHRoZSB1c2VyIGFscmVhZHkgaGFzIGEgd2FsbGV0IGluc3RhbGxlZCBhbmQgY29ubmVjdGVkIGZvciB0aGlzIGFwcC4gUHJlZmVyIHBhc3NpbmcgdGhlIHdhbGxldCBpbnRlcmZhY2Ugb2JqZWN0IGRpcmVjdGx5IHRvIHNpZ25JbldpdGhXZWIzKHsgY2hhaW46ICdldGhlcmV1bScsIHdhbGxldDogcmVzb2x2ZWRVc2VyV2FsbGV0IH0pIGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCgoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudXJsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IHJlc29sdmVkV2FsbGV0XG4gICAgICAgICAgICAgICAgLnJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ2V0aF9yZXF1ZXN0QWNjb3VudHMnLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbigoYWNjcykgPT4gYWNjcylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IFdhbGxldCBtZXRob2QgZXRoX3JlcXVlc3RBY2NvdW50cyBpcyBtaXNzaW5nIG9yIGludmFsaWRgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFhY2NvdW50cyB8fCBhY2NvdW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBObyBhY2NvdW50cyBhdmFpbGFibGUuIFBsZWFzZSBlbnN1cmUgdGhlIHdhbGxldCBpcyBjb25uZWN0ZWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhZGRyZXNzID0gZ2V0QWRkcmVzcyhhY2NvdW50c1swXSk7XG4gICAgICAgICAgICBsZXQgY2hhaW5JZCA9IChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoRXRoZXJldW0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jaGFpbklkO1xuICAgICAgICAgICAgaWYgKCFjaGFpbklkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhaW5JZEhleCA9IGF3YWl0IHJlc29sdmVkV2FsbGV0LnJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdldGhfY2hhaW5JZCcsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2hhaW5JZCA9IGZyb21IZXgoY2hhaW5JZEhleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaXdlTWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBkb21haW46IHVybC5ob3N0LFxuICAgICAgICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3MsXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiBzdGF0ZW1lbnQsXG4gICAgICAgICAgICAgICAgdXJpOiB1cmwuaHJlZixcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMScsXG4gICAgICAgICAgICAgICAgY2hhaW5JZDogY2hhaW5JZCxcbiAgICAgICAgICAgICAgICBub25jZTogKF9jID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhFdGhlcmV1bSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLm5vbmNlLFxuICAgICAgICAgICAgICAgIGlzc3VlZEF0OiAoX2UgPSAoX2QgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aEV0aGVyZXVtKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuaXNzdWVkQXQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgZXhwaXJhdGlvblRpbWU6IChfZiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoRXRoZXJldW0pID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5leHBpcmF0aW9uVGltZSxcbiAgICAgICAgICAgICAgICBub3RCZWZvcmU6IChfZyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoRXRoZXJldW0pID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5ub3RCZWZvcmUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdElkOiAoX2ggPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aEV0aGVyZXVtKSA9PT0gbnVsbCB8fCBfaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2gucmVxdWVzdElkLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogKF9qID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhFdGhlcmV1bSkgPT09IG51bGwgfHwgX2ogPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9qLnJlc291cmNlcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBtZXNzYWdlID0gY3JlYXRlU2l3ZU1lc3NhZ2Uoc2l3ZU1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gU2lnbiBtZXNzYWdlXG4gICAgICAgICAgICBzaWduYXR1cmUgPSAoYXdhaXQgcmVzb2x2ZWRXYWxsZXQucmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAncGVyc29uYWxfc2lnbicsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBbdG9IZXgobWVzc2FnZSksIGFkZHJlc3NdLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS90b2tlbj9ncmFudF90eXBlPXdlYjNgLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IE9iamVjdC5hc3NpZ24oeyBjaGFpbjogJ2V0aGVyZXVtJywgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlIH0sICgoKF9rID0gY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9rLmNhcHRjaGFUb2tlbilcbiAgICAgICAgICAgICAgICAgICAgPyB7IGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IChfbCA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9sID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbC5jYXB0Y2hhVG9rZW4gfSB9XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCkpLFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfc2Vzc2lvblJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5zZXNzaW9uIHx8ICFkYXRhLnVzZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnZhbGlkVG9rZW5FcnJvciA9IG5ldyBBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3I6IGludmFsaWRUb2tlbkVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEuc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1NJR05FRF9JTicsIGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZGF0YSksIGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBzaWduSW5XaXRoU29sYW5hKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tO1xuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgbGV0IHNpZ25hdHVyZTtcbiAgICAgICAgaWYgKCdtZXNzYWdlJyBpbiBjcmVkZW50aWFscykge1xuICAgICAgICAgICAgbWVzc2FnZSA9IGNyZWRlbnRpYWxzLm1lc3NhZ2U7XG4gICAgICAgICAgICBzaWduYXR1cmUgPSBjcmVkZW50aWFscy5zaWduYXR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGNoYWluLCB3YWxsZXQsIHN0YXRlbWVudCwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICBsZXQgcmVzb2x2ZWRXYWxsZXQ7XG4gICAgICAgICAgICBpZiAoIWlzQnJvd3NlcigpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3YWxsZXQgIT09ICdvYmplY3QnIHx8ICEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc3VwYWJhc2UvYXV0aC1qczogQm90aCB3YWxsZXQgYW5kIHVybCBtdXN0IGJlIHNwZWNpZmllZCBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmVkV2FsbGV0ID0gd2FsbGV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHdhbGxldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlZFdhbGxldCA9IHdhbGxldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvd0FueSA9IHdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoJ3NvbGFuYScgaW4gd2luZG93QW55ICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB3aW5kb3dBbnkuc29sYW5hID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICAoKCdzaWduSW4nIGluIHdpbmRvd0FueS5zb2xhbmEgJiYgdHlwZW9mIHdpbmRvd0FueS5zb2xhbmEuc2lnbkluID09PSAnZnVuY3Rpb24nKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKCdzaWduTWVzc2FnZScgaW4gd2luZG93QW55LnNvbGFuYSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB3aW5kb3dBbnkuc29sYW5hLnNpZ25NZXNzYWdlID09PSAnZnVuY3Rpb24nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRXYWxsZXQgPSB3aW5kb3dBbnkuc29sYW5hO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogTm8gY29tcGF0aWJsZSBTb2xhbmEgd2FsbGV0IGludGVyZmFjZSBvbiB0aGUgd2luZG93IG9iamVjdCAod2luZG93LnNvbGFuYSkgZGV0ZWN0ZWQuIE1ha2Ugc3VyZSB0aGUgdXNlciBhbHJlYWR5IGhhcyBhIHdhbGxldCBpbnN0YWxsZWQgYW5kIGNvbm5lY3RlZCBmb3IgdGhpcyBhcHAuIFByZWZlciBwYXNzaW5nIHRoZSB3YWxsZXQgaW50ZXJmYWNlIG9iamVjdCBkaXJlY3RseSB0byBzaWduSW5XaXRoV2ViMyh7IGNoYWluOiAnc29sYW5hJywgd2FsbGV0OiByZXNvbHZlZFVzZXJXYWxsZXQgfSkgaW5zdGVhZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy51cmwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgICAgIGlmICgnc2lnbkluJyBpbiByZXNvbHZlZFdhbGxldCAmJiByZXNvbHZlZFdhbGxldC5zaWduSW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByZXNvbHZlZFdhbGxldC5zaWduSW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBpc3N1ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0sIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoU29sYW5hKSwgeyBcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9uLW92ZXJyaWRhYmxlIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzEnLCBkb21haW46IHVybC5ob3N0LCB1cmk6IHVybC5ocmVmIH0pLCAoc3RhdGVtZW50ID8geyBzdGF0ZW1lbnQgfSA6IG51bGwpKSk7XG4gICAgICAgICAgICAgICAgbGV0IG91dHB1dFRvUHJvY2VzcztcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRwdXQpICYmIG91dHB1dFswXSAmJiB0eXBlb2Ygb3V0cHV0WzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRUb1Byb2Nlc3MgPSBvdXRwdXRbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG91dHB1dCAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb3V0cHV0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICAnc2lnbmVkTWVzc2FnZScgaW4gb3V0cHV0ICYmXG4gICAgICAgICAgICAgICAgICAgICdzaWduYXR1cmUnIGluIG91dHB1dCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRUb1Byb2Nlc3MgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BzdXBhYmFzZS9hdXRoLWpzOiBXYWxsZXQgbWV0aG9kIHNpZ25JbigpIHJldHVybmVkIHVucmVjb2duaXplZCB2YWx1ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoJ3NpZ25lZE1lc3NhZ2UnIGluIG91dHB1dFRvUHJvY2VzcyAmJlxuICAgICAgICAgICAgICAgICAgICAnc2lnbmF0dXJlJyBpbiBvdXRwdXRUb1Byb2Nlc3MgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBvdXRwdXRUb1Byb2Nlc3Muc2lnbmVkTWVzc2FnZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRvUHJvY2Vzcy5zaWduZWRNZXNzYWdlIGluc3RhbmNlb2YgVWludDhBcnJheSkgJiZcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0VG9Qcm9jZXNzLnNpZ25hdHVyZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb3V0cHV0VG9Qcm9jZXNzLnNpZ25lZE1lc3NhZ2UgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvdXRwdXRUb1Byb2Nlc3Muc2lnbmVkTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG91dHB1dFRvUHJvY2Vzcy5zaWduZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gb3V0cHV0VG9Qcm9jZXNzLnNpZ25hdHVyZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQHN1cGFiYXNlL2F1dGgtanM6IFdhbGxldCBtZXRob2Qgc2lnbkluKCkgQVBJIHJldHVybmVkIG9iamVjdCB3aXRob3V0IHNpZ25lZE1lc3NhZ2UgYW5kIHNpZ25hdHVyZSBmaWVsZHMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoISgnc2lnbk1lc3NhZ2UnIGluIHJlc29sdmVkV2FsbGV0KSB8fFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzb2x2ZWRXYWxsZXQuc2lnbk1lc3NhZ2UgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgICAgICAgICAgISgncHVibGljS2V5JyBpbiByZXNvbHZlZFdhbGxldCkgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc29sdmVkV2FsbGV0ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICAgICAgICAgICAgICAhcmVzb2x2ZWRXYWxsZXQucHVibGljS2V5IHx8XG4gICAgICAgICAgICAgICAgICAgICEoJ3RvQmFzZTU4JyBpbiByZXNvbHZlZFdhbGxldC5wdWJsaWNLZXkpIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXNvbHZlZFdhbGxldC5wdWJsaWNLZXkudG9CYXNlNTggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc3VwYWJhc2UvYXV0aC1qczogV2FsbGV0IGRvZXMgbm90IGhhdmUgYSBjb21wYXRpYmxlIHNpZ25NZXNzYWdlKCkgYW5kIHB1YmxpY0tleS50b0Jhc2U1OCgpIEFQSScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gW1xuICAgICAgICAgICAgICAgICAgICBgJHt1cmwuaG9zdH0gd2FudHMgeW91IHRvIHNpZ24gaW4gd2l0aCB5b3VyIFNvbGFuYSBhY2NvdW50OmAsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkV2FsbGV0LnB1YmxpY0tleS50b0Jhc2U1OCgpLFxuICAgICAgICAgICAgICAgICAgICAuLi4oc3RhdGVtZW50ID8gWycnLCBzdGF0ZW1lbnQsICcnXSA6IFsnJ10pLFxuICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbjogMScsXG4gICAgICAgICAgICAgICAgICAgIGBVUkk6ICR7dXJsLmhyZWZ9YCxcbiAgICAgICAgICAgICAgICAgICAgYElzc3VlZCBBdDogJHsoX2MgPSAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aFNvbGFuYSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmlzc3VlZEF0KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCxcbiAgICAgICAgICAgICAgICAgICAgLi4uKCgoX2QgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aFNvbGFuYSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLm5vdEJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW2BOb3QgQmVmb3JlOiAke29wdGlvbnMuc2lnbkluV2l0aFNvbGFuYS5ub3RCZWZvcmV9YF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oKChfZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoU29sYW5hKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UuZXhwaXJhdGlvblRpbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtgRXhwaXJhdGlvbiBUaW1lOiAke29wdGlvbnMuc2lnbkluV2l0aFNvbGFuYS5leHBpcmF0aW9uVGltZX1gXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgICAgIC4uLigoKF9mID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5jaGFpbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbYENoYWluIElEOiAke29wdGlvbnMuc2lnbkluV2l0aFNvbGFuYS5jaGFpbklkfWBdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKCgoX2cgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aFNvbGFuYSkgPT09IG51bGwgfHwgX2cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nLm5vbmNlKSA/IFtgTm9uY2U6ICR7b3B0aW9ucy5zaWduSW5XaXRoU29sYW5hLm5vbmNlfWBdIDogW10pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oKChfaCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoU29sYW5hKSA9PT0gbnVsbCB8fCBfaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2gucmVxdWVzdElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbYFJlcXVlc3QgSUQ6ICR7b3B0aW9ucy5zaWduSW5XaXRoU29sYW5hLnJlcXVlc3RJZH1gXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgICAgIC4uLigoKF9rID0gKF9qID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEpID09PSBudWxsIHx8IF9qID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfai5yZXNvdXJjZXMpID09PSBudWxsIHx8IF9rID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfay5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmVzb3VyY2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vcHRpb25zLnNpZ25JbldpdGhTb2xhbmEucmVzb3VyY2VzLm1hcCgocmVzb3VyY2UpID0+IGAtICR7cmVzb3VyY2V9YCksXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heWJlU2lnbmF0dXJlID0gYXdhaXQgcmVzb2x2ZWRXYWxsZXQuc2lnbk1lc3NhZ2UobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1lc3NhZ2UpLCAndXRmOCcpO1xuICAgICAgICAgICAgICAgIGlmICghbWF5YmVTaWduYXR1cmUgfHwgIShtYXliZVNpZ25hdHVyZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQHN1cGFiYXNlL2F1dGgtanM6IFdhbGxldCBzaWduTWVzc2FnZSgpIEFQSSByZXR1cm5lZCBhbiByZWNvZ25pemVkIHZhbHVlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IG1heWJlU2lnbmF0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS90b2tlbj9ncmFudF90eXBlPXdlYjNgLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IE9iamVjdC5hc3NpZ24oeyBjaGFpbjogJ3NvbGFuYScsIG1lc3NhZ2UsIHNpZ25hdHVyZTogYnl0ZXNUb0Jhc2U2NFVSTChzaWduYXR1cmUpIH0sICgoKF9sID0gY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2wgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9sLmNhcHRjaGFUb2tlbilcbiAgICAgICAgICAgICAgICAgICAgPyB7IGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IChfbSA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9tID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbS5jYXB0Y2hhVG9rZW4gfSB9XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCkpLFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfc2Vzc2lvblJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5zZXNzaW9uIHx8ICFkYXRhLnVzZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnZhbGlkVG9rZW5FcnJvciA9IG5ldyBBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3I6IGludmFsaWRUb2tlbkVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEuc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1NJR05FRF9JTicsIGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZGF0YSksIGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfZXhjaGFuZ2VDb2RlRm9yU2Vzc2lvbihhdXRoQ29kZSkge1xuICAgICAgICBjb25zdCBzdG9yYWdlSXRlbSA9IGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICBjb25zdCBbY29kZVZlcmlmaWVyLCByZWRpcmVjdFR5cGVdID0gKHN0b3JhZ2VJdGVtICE9PSBudWxsICYmIHN0b3JhZ2VJdGVtICE9PSB2b2lkIDAgPyBzdG9yYWdlSXRlbSA6ICcnKS5zcGxpdCgnLycpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFjb2RlVmVyaWZpZXIgJiYgdGhpcy5mbG93VHlwZSA9PT0gJ3BrY2UnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS90b2tlbj9ncmFudF90eXBlPXBrY2VgLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgYXV0aF9jb2RlOiBhdXRoQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZV92ZXJpZmllcjogY29kZVZlcmlmaWVyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeGZvcm06IF9zZXNzaW9uUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEuc2Vzc2lvbiB8fCAhZGF0YS51c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52YWxpZFRva2VuRXJyb3IgPSBuZXcgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsLCByZWRpcmVjdFR5cGU6IG51bGwgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGludmFsaWRUb2tlbkVycm9yLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEuc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1NJR05FRF9JTicsIGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkYXRhKSwgeyByZWRpcmVjdFR5cGU6IHJlZGlyZWN0VHlwZSAhPT0gbnVsbCAmJiByZWRpcmVjdFR5cGUgIT09IHZvaWQgMCA/IHJlZGlyZWN0VHlwZSA6IG51bGwgfSksIGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCwgcmVkaXJlY3RUeXBlOiBudWxsIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxsb3dzIHNpZ25pbmcgaW4gd2l0aCBhbiBPSURDIElEIHRva2VuLiBUaGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgdXNlZFxuICAgICAqIHNob3VsZCBiZSBlbmFibGVkIGFuZCBjb25maWd1cmVkLlxuICAgICAqL1xuICAgIGFzeW5jIHNpZ25JbldpdGhJZFRva2VuKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IG9wdGlvbnMsIHByb3ZpZGVyLCB0b2tlbiwgYWNjZXNzX3Rva2VuLCBub25jZSB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS90b2tlbj9ncmFudF90eXBlPWlkX3Rva2VuYCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLFxuICAgICAgICAgICAgICAgICAgICBpZF90b2tlbjogdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICAgICAgbm9uY2UsXG4gICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfc2Vzc2lvblJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSByZXM7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWRhdGEgfHwgIWRhdGEuc2Vzc2lvbiB8fCAhZGF0YS51c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52YWxpZFRva2VuRXJyb3IgPSBuZXcgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBpbnZhbGlkVG9rZW5FcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGEsIGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2cgaW4gYSB1c2VyIHVzaW5nIG1hZ2ljbGluayBvciBhIG9uZS10aW1lIHBhc3N3b3JkIChPVFApLlxuICAgICAqXG4gICAgICogSWYgdGhlIGB7eyAuQ29uZmlybWF0aW9uVVJMIH19YCB2YXJpYWJsZSBpcyBzcGVjaWZpZWQgaW4gdGhlIGVtYWlsIHRlbXBsYXRlLCBhIG1hZ2ljbGluayB3aWxsIGJlIHNlbnQuXG4gICAgICogSWYgdGhlIGB7eyAuVG9rZW4gfX1gIHZhcmlhYmxlIGlzIHNwZWNpZmllZCBpbiB0aGUgZW1haWwgdGVtcGxhdGUsIGFuIE9UUCB3aWxsIGJlIHNlbnQuXG4gICAgICogSWYgeW91J3JlIHVzaW5nIHBob25lIHNpZ24taW5zLCBvbmx5IGFuIE9UUCB3aWxsIGJlIHNlbnQuIFlvdSB3b24ndCBiZSBhYmxlIHRvIHNlbmQgYSBtYWdpY2xpbmsgZm9yIHBob25lIHNpZ24taW5zLlxuICAgICAqXG4gICAgICogQmUgYXdhcmUgdGhhdCB5b3UgbWF5IGdldCBiYWNrIGFuIGVycm9yIG1lc3NhZ2UgdGhhdCB3aWxsIG5vdCBkaXN0aW5ndWlzaFxuICAgICAqIGJldHdlZW4gdGhlIGNhc2VzIHdoZXJlIHRoZSBhY2NvdW50IGRvZXMgbm90IGV4aXN0IG9yLCB0aGF0IHRoZSBhY2NvdW50XG4gICAgICogY2FuIG9ubHkgYmUgYWNjZXNzZWQgdmlhIHNvY2lhbCBsb2dpbi5cbiAgICAgKlxuICAgICAqIERvIG5vdGUgdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIGNvbmZpZ3VyZSBhIFdoYXRzYXBwIHNlbmRlciBvbiBUd2lsaW9cbiAgICAgKiBpZiB5b3UgYXJlIHVzaW5nIHBob25lIHNpZ24gaW4gd2l0aCB0aGUgJ3doYXRzYXBwJyBjaGFubmVsLiBUaGUgd2hhdHNhcHBcbiAgICAgKiBjaGFubmVsIGlzIG5vdCBzdXBwb3J0ZWQgb24gb3RoZXIgcHJvdmlkZXJzXG4gICAgICogYXQgdGhpcyB0aW1lLlxuICAgICAqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIFBLQ0Ugd2hlbiBhbiBlbWFpbCBpcyBwYXNzZWQuXG4gICAgICovXG4gICAgYXN5bmMgc2lnbkluV2l0aE90cChjcmVkZW50aWFscykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCdlbWFpbCcgaW4gY3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVtYWlsLCBvcHRpb25zIH0gPSBjcmVkZW50aWFscztcbiAgICAgICAgICAgICAgICBsZXQgY29kZUNoYWxsZW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2VNZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgICAgICBbY29kZUNoYWxsZW5nZSwgY29kZUNoYWxsZW5nZU1ldGhvZF0gPSBhd2FpdCBnZXRDb2RlQ2hhbGxlbmdlQW5kTWV0aG9kKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vb3RwYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRhdGEpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX3VzZXI6IChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaG91bGRDcmVhdGVVc2VyKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9jaGFsbGVuZ2U6IGNvZGVDaGFsbGVuZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2NoYWxsZW5nZV9tZXRob2Q6IGNvZGVDaGFsbGVuZ2VNZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5lbWFpbFJlZGlyZWN0VG8sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgncGhvbmUnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwaG9uZSwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vb3RwYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogKF9jID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRhdGEpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX3VzZXI6IChfZCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaG91bGRDcmVhdGVVc2VyKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogKF9lID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNoYW5uZWwpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6ICdzbXMnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwsIG1lc3NhZ2VJZDogZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYXRhLm1lc3NhZ2VfaWQgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXV0aEludmFsaWRDcmVkZW50aWFsc0Vycm9yKCdZb3UgbXVzdCBwcm92aWRlIGVpdGhlciBhbiBlbWFpbCBvciBwaG9uZSBudW1iZXIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGluIGEgdXNlciBnaXZlbiBhIFVzZXIgc3VwcGxpZWQgT1RQIG9yIFRva2VuSGFzaCByZWNlaXZlZCB0aHJvdWdoIG1vYmlsZSBvciBlbWFpbC5cbiAgICAgKi9cbiAgICBhc3luYyB2ZXJpZnlPdHAocGFyYW1zKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVkaXJlY3RUbyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBjYXB0Y2hhVG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoJ29wdGlvbnMnIGluIHBhcmFtcykge1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VG8gPSAoX2EgPSBwYXJhbXMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlZGlyZWN0VG87XG4gICAgICAgICAgICAgICAgY2FwdGNoYVRva2VuID0gKF9iID0gcGFyYW1zLm9wdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYXB0Y2hhVG9rZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS92ZXJpZnlgLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKSwgeyBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiBjYXB0Y2hhVG9rZW4gfSB9KSxcbiAgICAgICAgICAgICAgICByZWRpcmVjdFRvLFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfc2Vzc2lvblJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuVmVyaWZpY2F0aW9uRXJyb3IgPSBuZXcgRXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIG9uIHRva2VuIHZlcmlmaWNhdGlvbi4nKTtcbiAgICAgICAgICAgICAgICB0aHJvdyB0b2tlblZlcmlmaWNhdGlvbkVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGRhdGEuc2Vzc2lvbjtcbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBkYXRhLnVzZXI7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PT0gbnVsbCB8fCBzZXNzaW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXNzaW9uLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKHBhcmFtcy50eXBlID09ICdyZWNvdmVyeScgPyAnUEFTU1dPUkRfUkVDT1ZFUlknIDogJ1NJR05FRF9JTicsIHNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdHMgYSBzaW5nbGUtc2lnbiBvbiB1c2luZyBhbiBlbnRlcnByaXNlIElkZW50aXR5IFByb3ZpZGVyLiBBXG4gICAgICogc3VjY2Vzc2Z1bCBTU08gYXR0ZW1wdCB3aWxsIHJlZGlyZWN0IHRoZSBjdXJyZW50IHBhZ2UgdG8gdGhlIGlkZW50aXR5XG4gICAgICogcHJvdmlkZXIgYXV0aG9yaXphdGlvbiBwYWdlLiBUaGUgcmVkaXJlY3QgVVJMIGlzIGltcGxlbWVudGF0aW9uIGFuZCBTU09cbiAgICAgKiBwcm90b2NvbCBzcGVjaWZpYy5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gdXNlIGl0IGJ5IHByb3ZpZGluZyBhIFNTTyBkb21haW4uIFR5cGljYWxseSB5b3UgY2FuIGV4dHJhY3QgdGhpc1xuICAgICAqIGRvbWFpbiBieSBhc2tpbmcgdXNlcnMgZm9yIHRoZWlyIGVtYWlsIGFkZHJlc3MuIElmIHRoaXMgZG9tYWluIGlzXG4gICAgICogcmVnaXN0ZXJlZCBvbiB0aGUgQXV0aCBpbnN0YW5jZSB0aGUgcmVkaXJlY3Qgd2lsbCB1c2UgdGhhdCBvcmdhbml6YXRpb24nc1xuICAgICAqIGN1cnJlbnRseSBhY3RpdmUgU1NPIElkZW50aXR5IFByb3ZpZGVyIGZvciB0aGUgbG9naW4uXG4gICAgICpcbiAgICAgKiBJZiB5b3UgaGF2ZSBidWlsdCBhbiBvcmdhbml6YXRpb24tc3BlY2lmaWMgbG9naW4gcGFnZSwgeW91IGNhbiB1c2UgdGhlXG4gICAgICogb3JnYW5pemF0aW9uJ3MgU1NPIElkZW50aXR5IFByb3ZpZGVyIFVVSUQgZGlyZWN0bHkgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBhc3luYyBzaWduSW5XaXRoU1NPKHBhcmFtcykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2UgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2VNZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuZmxvd1R5cGUgPT09ICdwa2NlJykge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICBbY29kZUNoYWxsZW5nZSwgY29kZUNoYWxsZW5nZU1ldGhvZF0gPSBhd2FpdCBnZXRDb2RlQ2hhbGxlbmdlQW5kTWV0aG9kKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L3Nzb2AsIHtcbiAgICAgICAgICAgICAgICBib2R5OiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sICgncHJvdmlkZXJJZCcgaW4gcGFyYW1zID8geyBwcm92aWRlcl9pZDogcGFyYW1zLnByb3ZpZGVySWQgfSA6IG51bGwpKSwgKCdkb21haW4nIGluIHBhcmFtcyA/IHsgZG9tYWluOiBwYXJhbXMuZG9tYWluIH0gOiBudWxsKSksIHsgcmVkaXJlY3RfdG86IChfYiA9IChfYSA9IHBhcmFtcy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVkaXJlY3RUbykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdW5kZWZpbmVkIH0pLCAoKChfYyA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2FwdGNoYVRva2VuKVxuICAgICAgICAgICAgICAgICAgICA/IHsgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogcGFyYW1zLm9wdGlvbnMuY2FwdGNoYVRva2VuIH0gfVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwpKSwgeyBza2lwX2h0dHBfcmVkaXJlY3Q6IHRydWUsIGNvZGVfY2hhbGxlbmdlOiBjb2RlQ2hhbGxlbmdlLCBjb2RlX2NoYWxsZW5nZV9tZXRob2Q6IGNvZGVDaGFsbGVuZ2VNZXRob2QgfSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfc3NvUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgcmVkaXJlY3QgaW4gYnJvd3NlciB1bmxlc3Mgc2tpcEJyb3dzZXJSZWRpcmVjdCBpcyB0cnVlXG4gICAgICAgICAgICBpZiAoKChfZCA9IHJlc3VsdC5kYXRhKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QudXJsKSAmJiBpc0Jyb3dzZXIoKSAmJiAhKChfZSA9IHBhcmFtcy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Uuc2tpcEJyb3dzZXJSZWRpcmVjdCkpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHJlc3VsdC5kYXRhLnVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIHJlYXV0aGVudGljYXRpb24gT1RQIHRvIHRoZSB1c2VyJ3MgZW1haWwgb3IgcGhvbmUgbnVtYmVyLlxuICAgICAqIFJlcXVpcmVzIHRoZSB1c2VyIHRvIGJlIHNpZ25lZC1pbi5cbiAgICAgKi9cbiAgICBhc3luYyByZWF1dGhlbnRpY2F0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVhdXRoZW50aWNhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIF9yZWF1dGhlbnRpY2F0ZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9LCBlcnJvcjogc2Vzc2lvbkVycm9yLCB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNlc3Npb25FcnJvcjtcbiAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vcmVhdXRoZW50aWNhdGVgLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgand0OiBzZXNzaW9uLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2VuZHMgYW4gZXhpc3Rpbmcgc2lnbnVwIGNvbmZpcm1hdGlvbiBlbWFpbCwgZW1haWwgY2hhbmdlIGVtYWlsLCBTTVMgT1RQIG9yIHBob25lIGNoYW5nZSBPVFAuXG4gICAgICovXG4gICAgYXN5bmMgcmVzZW5kKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMudXJsfS9yZXNlbmRgO1xuICAgICAgICAgICAgaWYgKCdlbWFpbCcgaW4gY3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVtYWlsLCB0eXBlLCBvcHRpb25zIH0gPSBjcmVkZW50aWFscztcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVycm9yIH0gPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGVuZHBvaW50LCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZW1haWxSZWRpcmVjdFRvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgncGhvbmUnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwaG9uZSwgdHlwZSwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBlbmRwb2ludCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsLCBtZXNzYWdlSWQ6IGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS5tZXNzYWdlX2lkIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvcignWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyIGFuZCBhIHR5cGUnKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiwgcmVmcmVzaGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gICAgICpcbiAgICAgKiBUaGUgc2Vzc2lvbiByZXR1cm5lZCBjYW4gYmUgbnVsbCBpZiB0aGUgc2Vzc2lvbiBpcyBub3QgZGV0ZWN0ZWQgd2hpY2ggY2FuIGhhcHBlbiBpbiB0aGUgZXZlbnQgYSB1c2VyIGlzIG5vdCBzaWduZWQtaW4gb3IgaGFzIGxvZ2dlZCBvdXQuXG4gICAgICpcbiAgICAgKiAqKklNUE9SVEFOVDoqKiBUaGlzIG1ldGhvZCBsb2FkcyB2YWx1ZXMgZGlyZWN0bHkgZnJvbSB0aGUgc3RvcmFnZSBhdHRhY2hlZFxuICAgICAqIHRvIHRoZSBjbGllbnQuIElmIHRoYXQgc3RvcmFnZSBpcyBiYXNlZCBvbiByZXF1ZXN0IGNvb2tpZXMgZm9yIGV4YW1wbGUsXG4gICAgICogdGhlIHZhbHVlcyBpbiBpdCBtYXkgbm90IGJlIGF1dGhlbnRpYyBhbmQgdGhlcmVmb3JlIGl0J3Mgc3Ryb25nbHkgYWR2aXNlZFxuICAgICAqIGFnYWluc3QgdXNpbmcgdGhpcyBtZXRob2QgYW5kIGl0cyByZXN1bHRzIGluIHN1Y2ggY2lyY3Vtc3RhbmNlcy4gQSB3YXJuaW5nXG4gICAgICogd2lsbCBiZSBlbWl0dGVkIGlmIHRoaXMgaXMgZGV0ZWN0ZWQuIFVzZSB7QGxpbmsgI2dldFVzZXIoKX0gaW5zdGVhZC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRTZXNzaW9uKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9hY3F1aXJlTG9jaygtMSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjcXVpcmVzIGEgZ2xvYmFsIGxvY2sgYmFzZWQgb24gdGhlIHN0b3JhZ2Uga2V5LlxuICAgICAqL1xuICAgIGFzeW5jIF9hY3F1aXJlTG9jayhhY3F1aXJlVGltZW91dCwgZm4pIHtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfYWNxdWlyZUxvY2snLCAnYmVnaW4nLCBhY3F1aXJlVGltZW91dCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2NrQWNxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gdGhpcy5wZW5kaW5nSW5Mb2NrLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMucGVuZGluZ0luTG9ja1t0aGlzLnBlbmRpbmdJbkxvY2subGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsYXN0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0luTG9jay5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGp1c3QgY2FyZSBpZiBpdCBmaW5pc2hlZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvY2soYGxvY2s6JHt0aGlzLnN0b3JhZ2VLZXl9YCwgYWNxdWlyZVRpbWVvdXQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19hY3F1aXJlTG9jaycsICdsb2NrIGFjcXVpcmVkIGZvciBzdG9yYWdlIGtleScsIHRoaXMuc3RvcmFnZUtleSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NrQWNxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmbigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdJbkxvY2sucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGp1c3QgY2FyZSBpZiBpdCBmaW5pc2hlZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGRyYWluaW5nIHRoZSBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vdGhpbmcgdG8gd2FpdCBvblxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5wZW5kaW5nSW5Mb2NrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FpdE9uID0gWy4uLnRoaXMucGVuZGluZ0luTG9ja107XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0T24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nSW5Mb2NrLnNwbGljZSgwLCB3YWl0T24ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfYWNxdWlyZUxvY2snLCAnbG9jayByZWxlYXNlZCBmb3Igc3RvcmFnZSBrZXknLCB0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2tBY3F1aXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfYWNxdWlyZUxvY2snLCAnZW5kJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlIGluc3RlYWQgb2Yge0BsaW5rICNnZXRTZXNzaW9ufSBpbnNpZGUgdGhlIGxpYnJhcnkuIEl0IGlzXG4gICAgICogc2VtYW50aWNhbGx5IHVzdWFsbHkgd2hhdCB5b3Ugd2FudCwgYXMgZ2V0dGluZyBhIHNlc3Npb24gaW52b2x2ZXMgc29tZVxuICAgICAqIHByb2Nlc3NpbmcgYWZ0ZXJ3YXJkcyB0aGF0IHJlcXVpcmVzIG9ubHkgb25lIGNsaWVudCBvcGVyYXRpbmcgb24gdGhlXG4gICAgICogc2Vzc2lvbiBhdCBvbmNlIGFjcm9zcyBtdWx0aXBsZSB0YWJzIG9yIHByb2Nlc3Nlcy5cbiAgICAgKi9cbiAgICBhc3luYyBfdXNlU2Vzc2lvbihmbikge1xuICAgICAgICB0aGlzLl9kZWJ1ZygnI191c2VTZXNzaW9uJywgJ2JlZ2luJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB0aGUgdXNlIG9mIF9fbG9hZFNlc3Npb24gaGVyZSBpcyB0aGUgb25seSBjb3JyZWN0IHVzZSBvZiB0aGUgZnVuY3Rpb24hXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9fbG9hZFNlc3Npb24oKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbihyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfdXNlU2Vzc2lvbicsICdlbmQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBORVZFUiBVU0UgRElSRUNUTFkhXG4gICAgICpcbiAgICAgKiBBbHdheXMgdXNlIHtAbGluayAjX3VzZVNlc3Npb259LlxuICAgICAqL1xuICAgIGFzeW5jIF9fbG9hZFNlc3Npb24oKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX19sb2FkU2Vzc2lvbigpJywgJ2JlZ2luJyk7XG4gICAgICAgIGlmICghdGhpcy5sb2NrQWNxdWlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX19sb2FkU2Vzc2lvbigpJywgJ3VzZWQgb3V0c2lkZSBvZiBhbiBhY3F1aXJlZCBsb2NrIScsIG5ldyBFcnJvcigpLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IG1heWJlU2Vzc2lvbiA9IGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSk7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI2dldFNlc3Npb24oKScsICdzZXNzaW9uIGZyb20gc3RvcmFnZScsIG1heWJlU2Vzc2lvbik7XG4gICAgICAgICAgICBpZiAobWF5YmVTZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzVmFsaWRTZXNzaW9uKG1heWJlU2Vzc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24gPSBtYXliZVNlc3Npb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI2dldFNlc3Npb24oKScsICdzZXNzaW9uIGZyb20gc3RvcmFnZSBpcyBub3QgdmFsaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVtb3ZlU2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHNlc3Npb246IG51bGwgfSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEEgc2Vzc2lvbiBpcyBjb25zaWRlcmVkIGV4cGlyZWQgYmVmb3JlIHRoZSBhY2Nlc3MgdG9rZW4gX2FjdHVhbGx5X1xuICAgICAgICAgICAgLy8gZXhwaXJlcy4gV2hlbiB0aGUgYXV0b1JlZnJlc2hUb2tlbiBvcHRpb24gaXMgb2ZmIChvciB3aGVuIHRoZSB0YWIgaXNcbiAgICAgICAgICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kKSwgdmVyeSBlYWdlciB1c2VycyBvZiBnZXRTZXNzaW9uKCkgLS0gbGlrZVxuICAgICAgICAgICAgLy8gcmVhbHRpbWUtanMgLS0gbWlnaHQgc2VuZCBhIHZhbGlkIEpXVCB3aGljaCB3aWxsIGV4cGlyZSBieSB0aGUgdGltZSBpdFxuICAgICAgICAgICAgLy8gcmVhY2hlcyB0aGUgc2VydmVyLlxuICAgICAgICAgICAgY29uc3QgaGFzRXhwaXJlZCA9IGN1cnJlbnRTZXNzaW9uLmV4cGlyZXNfYXRcbiAgICAgICAgICAgICAgICA/IGN1cnJlbnRTZXNzaW9uLmV4cGlyZXNfYXQgKiAxMDAwIC0gRGF0ZS5ub3coKSA8IEVYUElSWV9NQVJHSU5fTVNcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfX2xvYWRTZXNzaW9uKCknLCBgc2Vzc2lvbiBoYXMke2hhc0V4cGlyZWQgPyAnJyA6ICcgbm90J30gZXhwaXJlZGAsICdleHBpcmVzX2F0JywgY3VycmVudFNlc3Npb24uZXhwaXJlc19hdCk7XG4gICAgICAgICAgICBpZiAoIWhhc0V4cGlyZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51c2VyU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXliZVVzZXIgPSAoYXdhaXQgZ2V0SXRlbUFzeW5jKHRoaXMudXNlclN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSArICctdXNlcicpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heWJlVXNlciA9PT0gbnVsbCB8fCBtYXliZVVzZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1heWJlVXNlci51c2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2Vzc2lvbi51c2VyID0gbWF5YmVVc2VyLnVzZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2Vzc2lvbi51c2VyID0gdXNlck5vdEF2YWlsYWJsZVByb3h5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV3JhcCB0aGUgdXNlciBvYmplY3Qgd2l0aCBhIHdhcm5pbmcgcHJveHkgb24gdGhlIHNlcnZlclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgd2FybnMgd2hlbiBwcm9wZXJ0aWVzIG9mIHRoZSB1c2VyIGFyZSBhY2Nlc3NlZCwgbm90IHdoZW4gc2Vzc2lvbi51c2VyIGl0c2VsZiBpcyBhY2Nlc3NlZFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0b3JhZ2UuaXNTZXJ2ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciAmJlxuICAgICAgICAgICAgICAgICAgICAhY3VycmVudFNlc3Npb24udXNlci5fX2lzVXNlck5vdEF2YWlsYWJsZVByb3h5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1cHByZXNzV2FybmluZ1JlZiA9IHsgdmFsdWU6IHRoaXMuc3VwcHJlc3NHZXRTZXNzaW9uV2FybmluZyB9O1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2Vzc2lvbi51c2VyID0gaW5zZWN1cmVVc2VyV2FybmluZ1Byb3h5KGN1cnJlbnRTZXNzaW9uLnVzZXIsIHN1cHByZXNzV2FybmluZ1JlZik7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY2xpZW50LWxldmVsIHN1cHByZXNzaW9uIGZsYWcgd2hlbiB0aGUgcHJveHkgc3VwcHJlc3NlcyB0aGUgd2FybmluZ1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcHJlc3NXYXJuaW5nUmVmLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cHByZXNzR2V0U2Vzc2lvbldhcm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgc2Vzc2lvbjogY3VycmVudFNlc3Npb24gfSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogc2Vzc2lvbiwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX2NhbGxSZWZyZXNoVG9rZW4oY3VycmVudFNlc3Npb24ucmVmcmVzaF90b2tlbik7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX19sb2FkU2Vzc2lvbigpJywgJ2VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdXNlciBkZXRhaWxzIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHNlc3Npb24uIFRoaXMgbWV0aG9kXG4gICAgICogcGVyZm9ybXMgYSBuZXR3b3JrIHJlcXVlc3QgdG8gdGhlIFN1cGFiYXNlIEF1dGggc2VydmVyLCBzbyB0aGUgcmV0dXJuZWRcbiAgICAgKiB2YWx1ZSBpcyBhdXRoZW50aWMgYW5kIGNhbiBiZSB1c2VkIHRvIGJhc2UgYXV0aG9yaXphdGlvbiBydWxlcyBvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBqd3QgVGFrZXMgaW4gYW4gb3B0aW9uYWwgYWNjZXNzIHRva2VuIEpXVC4gSWYgbm8gSldUIGlzIHByb3ZpZGVkLCB0aGUgSldUIGZyb20gdGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyB1c2VkLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFVzZXIoand0KSB7XG4gICAgICAgIGlmIChqd3QpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9nZXRVc2VyKGp3dCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9nZXRVc2VyKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LmRhdGEudXNlcikge1xuICAgICAgICAgICAgdGhpcy5zdXBwcmVzc0dldFNlc3Npb25XYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyBfZ2V0VXNlcihqd3QpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChqd3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0dFVCcsIGAke3RoaXMudXJsfS91c2VyYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogand0LFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3VzZXJSZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm5zIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vIGFjY2Vzc190b2tlbiBvciBjdXN0b20gYXV0aG9yaXphdGlvbiBoZWFkZXJcbiAgICAgICAgICAgICAgICBpZiAoISgoX2EgPSBkYXRhLnNlc3Npb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY2Nlc3NfdG9rZW4pICYmICF0aGlzLmhhc0N1c3RvbUF1dGhvcml6YXRpb25IZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBudWxsIH0sIGVycm9yOiBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0dFVCcsIGAke3RoaXMudXJsfS91c2VyYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogKF9jID0gKF9iID0gZGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuYWNjZXNzX3Rva2VuKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHhmb3JtOiBfdXNlclJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEpXVCBjb250YWlucyBhIGBzZXNzaW9uX2lkYCB3aGljaCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFuIGFjdGl2ZVxuICAgICAgICAgICAgICAgICAgICAvLyBzZXNzaW9uIGluIHRoZSBkYXRhYmFzZSwgaW5kaWNhdGluZyB0aGUgdXNlciBpcyBzaWduZWQgb3V0LlxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yZW1vdmVTZXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB1c2VyIGRhdGEgZm9yIGEgbG9nZ2VkIGluIHVzZXIuXG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlVXNlcihhdHRyaWJ1dGVzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXBkYXRlVXNlcihhdHRyaWJ1dGVzLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIF91cGRhdGVVc2VyKGF0dHJpYnV0ZXMsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogc2Vzc2lvbkRhdGEsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNlc3Npb25FcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uRGF0YS5zZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gc2Vzc2lvbkRhdGEuc2Vzc2lvbjtcbiAgICAgICAgICAgICAgICBsZXQgY29kZUNoYWxsZW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2VNZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScgJiYgYXR0cmlidXRlcy5lbWFpbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAgICAgW2NvZGVDaGFsbGVuZ2UsIGNvZGVDaGFsbGVuZ2VNZXRob2RdID0gYXdhaXQgZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZCh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3I6IHVzZXJFcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BVVCcsIGAke3RoaXMudXJsfS91c2VyYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5lbWFpbFJlZGlyZWN0VG8sXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYXR0cmlidXRlcyksIHsgY29kZV9jaGFsbGVuZ2U6IGNvZGVDaGFsbGVuZ2UsIGNvZGVfY2hhbGxlbmdlX21ldGhvZDogY29kZUNoYWxsZW5nZU1ldGhvZCB9KSxcbiAgICAgICAgICAgICAgICAgICAgand0OiBzZXNzaW9uLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICAgICAgeGZvcm06IF91c2VyUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXJFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyB1c2VyRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlc3Npb24udXNlciA9IGRhdGEudXNlcjtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnVVNFUl9VUERBVEVEJywgc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyIH0sIGVycm9yOiBudWxsIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2Vzc2lvbiBkYXRhIGZyb20gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gSWYgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyBleHBpcmVkLCBzZXRTZXNzaW9uIHdpbGwgdGFrZSBjYXJlIG9mIHJlZnJlc2hpbmcgaXQgdG8gb2J0YWluIGEgbmV3IHNlc3Npb24uXG4gICAgICogSWYgdGhlIHJlZnJlc2ggdG9rZW4gb3IgYWNjZXNzIHRva2VuIGluIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgaW52YWxpZCwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAgICogQHBhcmFtIGN1cnJlbnRTZXNzaW9uIFRoZSBjdXJyZW50IHNlc3Npb24gdGhhdCBtaW5pbWFsbHkgY29udGFpbnMgYW4gYWNjZXNzIHRva2VuIGFuZCByZWZyZXNoIHRva2VuLlxuICAgICAqL1xuICAgIGFzeW5jIHNldFNlc3Npb24oY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fc2V0U2Vzc2lvbihjdXJyZW50U2Vzc2lvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBfc2V0U2Vzc2lvbihjdXJyZW50U2Vzc2lvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50U2Vzc2lvbi5hY2Nlc3NfdG9rZW4gfHwgIWN1cnJlbnRTZXNzaW9uLnJlZnJlc2hfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRpbWVOb3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICAgICAgICAgIGxldCBleHBpcmVzQXQgPSB0aW1lTm93O1xuICAgICAgICAgICAgbGV0IGhhc0V4cGlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgeyBwYXlsb2FkIH0gPSBkZWNvZGVKV1QoY3VycmVudFNlc3Npb24uYWNjZXNzX3Rva2VuKTtcbiAgICAgICAgICAgIGlmIChwYXlsb2FkLmV4cCkge1xuICAgICAgICAgICAgICAgIGV4cGlyZXNBdCA9IHBheWxvYWQuZXhwO1xuICAgICAgICAgICAgICAgIGhhc0V4cGlyZWQgPSBleHBpcmVzQXQgPD0gdGltZU5vdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNFeHBpcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiByZWZyZXNoZWRTZXNzaW9uLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fY2FsbFJlZnJlc2hUb2tlbihjdXJyZW50U2Vzc2lvbi5yZWZyZXNoX3Rva2VuKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvcjogZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVmcmVzaGVkU2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHJlZnJlc2hlZFNlc3Npb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCB0aGlzLl9nZXRVc2VyKGN1cnJlbnRTZXNzaW9uLmFjY2Vzc190b2tlbik7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXNzaW9uID0ge1xuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46IGN1cnJlbnRTZXNzaW9uLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogY3VycmVudFNlc3Npb24ucmVmcmVzaF90b2tlbixcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogZGF0YS51c2VyLFxuICAgICAgICAgICAgICAgICAgICB0b2tlbl90eXBlOiAnYmVhcmVyJyxcbiAgICAgICAgICAgICAgICAgICAgZXhwaXJlc19pbjogZXhwaXJlc0F0IC0gdGltZU5vdyxcbiAgICAgICAgICAgICAgICAgICAgZXhwaXJlc19hdDogZXhwaXJlc0F0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1NJR05FRF9JTicsIHNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHNlc3Npb246IG51bGwsIHVzZXI6IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IHNlc3Npb24sIHJlZ2FyZGxlc3Mgb2YgZXhwaXJ5IHN0YXR1cy5cbiAgICAgKiBUYWtlcyBpbiBhbiBvcHRpb25hbCBjdXJyZW50IHNlc3Npb24uIElmIG5vdCBwYXNzZWQgaW4sIHRoZW4gcmVmcmVzaFNlc3Npb24oKSB3aWxsIGF0dGVtcHQgdG8gcmV0cmlldmUgaXQgZnJvbSBnZXRTZXNzaW9uKCkuXG4gICAgICogSWYgdGhlIGN1cnJlbnQgc2Vzc2lvbidzIHJlZnJlc2ggdG9rZW4gaXMgaW52YWxpZCwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAgICogQHBhcmFtIGN1cnJlbnRTZXNzaW9uIFRoZSBjdXJyZW50IHNlc3Npb24uIElmIHBhc3NlZCBpbiwgaXQgbXVzdCBjb250YWluIGEgcmVmcmVzaCB0b2tlbi5cbiAgICAgKi9cbiAgICBhc3luYyByZWZyZXNoU2Vzc2lvbihjdXJyZW50U2Vzc2lvbikge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZWZyZXNoU2Vzc2lvbihjdXJyZW50U2Vzc2lvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBfcmVmcmVzaFNlc3Npb24oY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50U2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24gPSAoX2EgPSBkYXRhLnNlc3Npb24pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCEoY3VycmVudFNlc3Npb24gPT09IG51bGwgfHwgY3VycmVudFNlc3Npb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN1cnJlbnRTZXNzaW9uLnJlZnJlc2hfdG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHNlc3Npb24sIGVycm9yIH0gPSBhd2FpdCB0aGlzLl9jYWxsUmVmcmVzaFRva2VuKGN1cnJlbnRTZXNzaW9uLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIGRhdGEgZnJvbSBhIFVSTCBzdHJpbmdcbiAgICAgKi9cbiAgICBhc3luYyBfZ2V0U2Vzc2lvbkZyb21VUkwocGFyYW1zLCBjYWxsYmFja1VybFR5cGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghaXNCcm93c2VyKCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvcignTm8gYnJvd3NlciBkZXRlY3RlZC4nKTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gZXJyb3IgaW4gdGhlIFVSTCwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCBmbG93IGl0IGlzLCB3ZSBqdXN0IHJldHVybiB0aGUgZXJyb3IuXG4gICAgICAgICAgICBpZiAocGFyYW1zLmVycm9yIHx8IHBhcmFtcy5lcnJvcl9kZXNjcmlwdGlvbiB8fCBwYXJhbXMuZXJyb3JfY29kZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBlcnJvciBjbGFzcyByZXR1cm5lZCBpbXBsaWVzIHRoYXQgdGhlIHJlZGlyZWN0IGlzIGZyb20gYW4gaW1wbGljaXQgZ3JhbnQgZmxvd1xuICAgICAgICAgICAgICAgIC8vIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIGZyb20gYSByZWRpcmVjdCBlcnJvciBmcm9tIGEgUEtDRSBmbG93LlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IocGFyYW1zLmVycm9yX2Rlc2NyaXB0aW9uIHx8ICdFcnJvciBpbiBVUkwgd2l0aCB1bnNwZWNpZmllZCBlcnJvcl9kZXNjcmlwdGlvbicsIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHBhcmFtcy5lcnJvciB8fCAndW5zcGVjaWZpZWRfZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBwYXJhbXMuZXJyb3JfY29kZSB8fCAndW5zcGVjaWZpZWRfY29kZScsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVja3MgZm9yIG1pc21hdGNoZXMgYmV0d2VlbiB0aGUgZmxvd1R5cGUgaW5pdGlhbGlzZWQgaW4gdGhlIGNsaWVudCBhbmQgdGhlIFVSTCBwYXJhbWV0ZXJzXG4gICAgICAgICAgICBzd2l0Y2ggKGNhbGxiYWNrVXJsVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2ltcGxpY2l0JzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmxvd1R5cGUgPT09ICdwa2NlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvcignTm90IGEgdmFsaWQgUEtDRSBmbG93IHVybC4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdwa2NlJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmxvd1R5cGUgPT09ICdpbXBsaWNpdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IoJ05vdCBhIHZhbGlkIGltcGxpY2l0IGdyYW50IGZsb3cgdXJsLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gdGhlcmUncyBubyBtaXNtYXRjaCBzbyB3ZSBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIHJlZGlyZWN0IGZvciBQS0NFLCB3ZSBhdHRlbXB0IHRvIHJldHJpZXZlIHRoZSBjb2RlIGZyb20gdGhlIFVSTCBmb3IgdGhlIGNvZGUgZXhjaGFuZ2VcbiAgICAgICAgICAgIGlmIChjYWxsYmFja1VybFR5cGUgPT09ICdwa2NlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2luaXRpYWxpemUoKScsICdiZWdpbicsICdpcyBQS0NFIGZsb3cnLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5jb2RlKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFBLQ0VHcmFudENvZGVFeGNoYW5nZUVycm9yKCdObyBjb2RlIGRldGVjdGVkLicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX2V4Y2hhbmdlQ29kZUZvclNlc3Npb24ocGFyYW1zLmNvZGUpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoJ2NvZGUnKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUod2luZG93Lmhpc3Rvcnkuc3RhdGUsICcnLCB1cmwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyBzZXNzaW9uOiBkYXRhLnNlc3Npb24sIHJlZGlyZWN0VHlwZTogbnVsbCB9LCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBwcm92aWRlcl90b2tlbiwgcHJvdmlkZXJfcmVmcmVzaF90b2tlbiwgYWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VuLCBleHBpcmVzX2luLCBleHBpcmVzX2F0LCB0b2tlbl90eXBlLCB9ID0gcGFyYW1zO1xuICAgICAgICAgICAgaWYgKCFhY2Nlc3NfdG9rZW4gfHwgIWV4cGlyZXNfaW4gfHwgIXJlZnJlc2hfdG9rZW4gfHwgIXRva2VuX3R5cGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yKCdObyBzZXNzaW9uIGRlZmluZWQgaW4gVVJMJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0aW1lTm93ID0gTWF0aC5yb3VuZChEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgICAgICBjb25zdCBleHBpcmVzSW4gPSBwYXJzZUludChleHBpcmVzX2luKTtcbiAgICAgICAgICAgIGxldCBleHBpcmVzQXQgPSB0aW1lTm93ICsgZXhwaXJlc0luO1xuICAgICAgICAgICAgaWYgKGV4cGlyZXNfYXQpIHtcbiAgICAgICAgICAgICAgICBleHBpcmVzQXQgPSBwYXJzZUludChleHBpcmVzX2F0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjdHVhbGx5RXhwaXJlc0luID0gZXhwaXJlc0F0IC0gdGltZU5vdztcbiAgICAgICAgICAgIGlmIChhY3R1YWxseUV4cGlyZXNJbiAqIDEwMDAgPD0gQVVUT19SRUZSRVNIX1RJQ0tfRFVSQVRJT05fTVMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEBzdXBhYmFzZS9nb3RydWUtanM6IFNlc3Npb24gYXMgcmV0cmlldmVkIGZyb20gVVJMIGV4cGlyZXMgaW4gJHthY3R1YWxseUV4cGlyZXNJbn1zLCBzaG91bGQgaGF2ZSBiZWVuIGNsb3NlciB0byAke2V4cGlyZXNJbn1zYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc3N1ZWRBdCA9IGV4cGlyZXNBdCAtIGV4cGlyZXNJbjtcbiAgICAgICAgICAgIGlmICh0aW1lTm93IC0gaXNzdWVkQXQgPj0gMTIwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdAc3VwYWJhc2UvZ290cnVlLWpzOiBTZXNzaW9uIGFzIHJldHJpZXZlZCBmcm9tIFVSTCB3YXMgaXNzdWVkIG92ZXIgMTIwcyBhZ28sIFVSTCBjb3VsZCBiZSBzdGFsZScsIGlzc3VlZEF0LCBleHBpcmVzQXQsIHRpbWVOb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGltZU5vdyAtIGlzc3VlZEF0IDwgMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQHN1cGFiYXNlL2dvdHJ1ZS1qczogU2Vzc2lvbiBhcyByZXRyaWV2ZWQgZnJvbSBVUkwgd2FzIGlzc3VlZCBpbiB0aGUgZnV0dXJlPyBDaGVjayB0aGUgZGV2aWNlIGNsb2NrIGZvciBza2V3JywgaXNzdWVkQXQsIGV4cGlyZXNBdCwgdGltZU5vdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCB0aGlzLl9nZXRVc2VyKGFjY2Vzc190b2tlbik7XG4gICAgICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0ge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyX3Rva2VuLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyX3JlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgIGV4cGlyZXNfaW46IGV4cGlyZXNJbixcbiAgICAgICAgICAgICAgICBleHBpcmVzX2F0OiBleHBpcmVzQXQsXG4gICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbixcbiAgICAgICAgICAgICAgICB0b2tlbl90eXBlOiB0b2tlbl90eXBlLFxuICAgICAgICAgICAgICAgIHVzZXI6IGRhdGEudXNlcixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBSZW1vdmUgdG9rZW5zIGZyb20gVVJMXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfZ2V0U2Vzc2lvbkZyb21VUkwoKScsICdjbGVhcmluZyB3aW5kb3cubG9jYXRpb24uaGFzaCcpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgc2Vzc2lvbiwgcmVkaXJlY3RUeXBlOiBwYXJhbXMudHlwZSB9LCBlcnJvcjogbnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyBzZXNzaW9uOiBudWxsLCByZWRpcmVjdFR5cGU6IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgVVJMIGNvbnRhaW5zIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgYW4gaW1wbGljaXQgb2F1dGggZ3JhbnQgZmxvdyAoaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzY3NDkuaHRtbCNzZWN0aW9uLTQuMilcbiAgICAgKlxuICAgICAqIElmIGBkZXRlY3RTZXNzaW9uSW5VcmxgIGlzIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIFVSTCBhbmQgcGFyYW1zIHRvIGRldGVybWluZVxuICAgICAqIGlmIHRoZSBVUkwgc2hvdWxkIGJlIHByb2Nlc3NlZCBhcyBhIFN1cGFiYXNlIGF1dGggY2FsbGJhY2suIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGV4Y2x1ZGVcbiAgICAgKiBVUkxzIGZyb20gb3RoZXIgT0F1dGggcHJvdmlkZXJzIChlLmcuLCBGYWNlYm9vayBMb2dpbikgdGhhdCBhbHNvIHJldHVybiBhY2Nlc3NfdG9rZW4gaW4gdGhlIGZyYWdtZW50LlxuICAgICAqL1xuICAgIF9pc0ltcGxpY2l0R3JhbnRDYWxsYmFjayhwYXJhbXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRldGVjdFNlc3Npb25JblVybCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0ZWN0U2Vzc2lvbkluVXJsKG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBCb29sZWFuKHBhcmFtcy5hY2Nlc3NfdG9rZW4gfHwgcGFyYW1zLmVycm9yX2Rlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IFVSTCBhbmQgYmFja2luZyBzdG9yYWdlIGNvbnRhaW4gcGFyYW1ldGVycyBnaXZlbiBieSBhIFBLQ0UgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIF9pc1BLQ0VDYWxsYmFjayhwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0b3JhZ2VDb250ZW50ID0gYXdhaXQgZ2V0SXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgIHJldHVybiAhIShwYXJhbXMuY29kZSAmJiBjdXJyZW50U3RvcmFnZUNvbnRlbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNpZGUgYSBicm93c2VyIGNvbnRleHQsIGBzaWduT3V0KClgIHdpbGwgcmVtb3ZlIHRoZSBsb2dnZWQgaW4gdXNlciBmcm9tIHRoZSBicm93c2VyIHNlc3Npb24gYW5kIGxvZyB0aGVtIG91dCAtIHJlbW92aW5nIGFsbCBpdGVtcyBmcm9tIGxvY2Fsc3RvcmFnZSBhbmQgdGhlbiB0cmlnZ2VyIGEgYFwiU0lHTkVEX09VVFwiYCBldmVudC5cbiAgICAgKlxuICAgICAqIEZvciBzZXJ2ZXItc2lkZSBtYW5hZ2VtZW50LCB5b3UgY2FuIHJldm9rZSBhbGwgcmVmcmVzaCB0b2tlbnMgZm9yIGEgdXNlciBieSBwYXNzaW5nIGEgdXNlcidzIEpXVCB0aHJvdWdoIHRvIGBhdXRoLmFwaS5zaWduT3V0KEpXVDogc3RyaW5nKWAuXG4gICAgICogVGhlcmUgaXMgbm8gd2F5IHRvIHJldm9rZSBhIHVzZXIncyBhY2Nlc3MgdG9rZW4gand0IHVudGlsIGl0IGV4cGlyZXMuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHNldCBhIHNob3J0ZXIgZXhwaXJ5IG9uIHRoZSBqd3QgZm9yIHRoaXMgcmVhc29uLlxuICAgICAqXG4gICAgICogSWYgdXNpbmcgYG90aGVyc2Agc2NvcGUsIG5vIGBTSUdORURfT1VUYCBldmVudCBpcyBmaXJlZCFcbiAgICAgKi9cbiAgICBhc3luYyBzaWduT3V0KG9wdGlvbnMgPSB7IHNjb3BlOiAnZ2xvYmFsJyB9KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hY3F1aXJlTG9jaygtMSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3NpZ25PdXQob3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBfc2lnbk91dCh7IHNjb3BlIH0gPSB7IHNjb3BlOiAnZ2xvYmFsJyB9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3I6IHNlc3Npb25FcnJvciB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBlcnJvcjogc2Vzc2lvbkVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSAoX2EgPSBkYXRhLnNlc3Npb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY2Nlc3NfdG9rZW47XG4gICAgICAgICAgICBpZiAoYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVycm9yIH0gPSBhd2FpdCB0aGlzLmFkbWluLnNpZ25PdXQoYWNjZXNzVG9rZW4sIHNjb3BlKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIDQwNHMgc2luY2UgdXNlciBtaWdodCBub3QgZXhpc3QgYW55bW9yZVxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgNDAxcyBzaW5jZSBhbiBpbnZhbGlkIG9yIGV4cGlyZWQgSldUIHNob3VsZCBzaWduIG91dCB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgIGlmICghKGlzQXV0aEFwaUVycm9yKGVycm9yKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yLnN0YXR1cyA9PT0gNDA0IHx8IGVycm9yLnN0YXR1cyA9PT0gNDAxIHx8IGVycm9yLnN0YXR1cyA9PT0gNDAzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzY29wZSAhPT0gJ290aGVycycpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yZW1vdmVTZXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvbkF1dGhTdGF0ZUNoYW5nZShjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBpZCA9IGdlbmVyYXRlQ2FsbGJhY2tJZCgpO1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgdW5zdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI3Vuc3Vic2NyaWJlKCknLCAnc3RhdGUgY2hhbmdlIGNhbGxiYWNrIHdpdGggaWQgcmVtb3ZlZCcsIGlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlRW1pdHRlcnMuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjb25BdXRoU3RhdGVDaGFuZ2UoKScsICdyZWdpc3RlcmVkIGNhbGxiYWNrIHdpdGggaWQnLCBpZCk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VFbWl0dGVycy5zZXQoaWQsIHN1YnNjcmlwdGlvbik7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0SW5pdGlhbFNlc3Npb24oaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHsgc3Vic2NyaXB0aW9uIH0gfTtcbiAgICB9XG4gICAgYXN5bmMgX2VtaXRJbml0aWFsU2Vzc2lvbihpZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9LCBlcnJvciwgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIGF3YWl0ICgoX2EgPSB0aGlzLnN0YXRlQ2hhbmdlRW1pdHRlcnMuZ2V0KGlkKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGxiYWNrKCdJTklUSUFMX1NFU1NJT04nLCBzZXNzaW9uKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJ0lOSVRJQUxfU0VTU0lPTicsICdjYWxsYmFjayBpZCcsIGlkLCAnc2Vzc2lvbicsIHNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGF3YWl0ICgoX2IgPSB0aGlzLnN0YXRlQ2hhbmdlRW1pdHRlcnMuZ2V0KGlkKSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGxiYWNrKCdJTklUSUFMX1NFU1NJT04nLCBudWxsKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJ0lOSVRJQUxfU0VTU0lPTicsICdjYWxsYmFjayBpZCcsIGlkLCAnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcGFzc3dvcmQgcmVzZXQgcmVxdWVzdCB0byBhbiBlbWFpbCBhZGRyZXNzLiBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgUEtDRSBmbG93LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVtYWlsIFRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSB1c2VyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLnJlZGlyZWN0VG8gVGhlIFVSTCB0byBzZW5kIHRoZSB1c2VyIHRvIGFmdGVyIHRoZXkgY2xpY2sgdGhlIHBhc3N3b3JkIHJlc2V0IGxpbmsuXG4gICAgICogQHBhcmFtIG9wdGlvbnMuY2FwdGNoYVRva2VuIFZlcmlmaWNhdGlvbiB0b2tlbiByZWNlaXZlZCB3aGVuIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgY2FwdGNoYSBvbiB0aGUgc2l0ZS5cbiAgICAgKi9cbiAgICBhc3luYyByZXNldFBhc3N3b3JkRm9yRW1haWwoZW1haWwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgY29kZUNoYWxsZW5nZSA9IG51bGw7XG4gICAgICAgIGxldCBjb2RlQ2hhbGxlbmdlTWV0aG9kID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuZmxvd1R5cGUgPT09ICdwa2NlJykge1xuICAgICAgICAgICAgO1xuICAgICAgICAgICAgW2NvZGVDaGFsbGVuZ2UsIGNvZGVDaGFsbGVuZ2VNZXRob2RdID0gYXdhaXQgZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZCh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSwgdHJ1ZSAvLyBpc1Bhc3N3b3JkUmVjb3ZlcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9yZWNvdmVyYCwge1xuICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICAgICAgICAgIGNvZGVfY2hhbGxlbmdlOiBjb2RlQ2hhbGxlbmdlLFxuICAgICAgICAgICAgICAgICAgICBjb2RlX2NoYWxsZW5nZV9tZXRob2Q6IGNvZGVDaGFsbGVuZ2VNZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMuY2FwdGNoYVRva2VuIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RUbzogb3B0aW9ucy5yZWRpcmVjdFRvLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCB0aGUgaWRlbnRpdGllcyBsaW5rZWQgdG8gYSB1c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFVzZXJJZGVudGl0aWVzKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoKTtcbiAgICAgICAgICAgIGlmIChlcnJvcilcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IGlkZW50aXRpZXM6IChfYSA9IGRhdGEudXNlci5pZGVudGl0aWVzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXSB9LCBlcnJvcjogbnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBsaW5rSWRlbnRpdHkoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgaWYgKCd0b2tlbicgaW4gY3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpbmtJZGVudGl0eUlkVG9rZW4oY3JlZGVudGlhbHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmtJZGVudGl0eU9BdXRoKGNyZWRlbnRpYWxzKTtcbiAgICB9XG4gICAgYXN5bmMgbGlua0lkZW50aXR5T0F1dGgoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLl9nZXRVcmxGb3JQcm92aWRlcihgJHt0aGlzLnVybH0vdXNlci9pZGVudGl0aWVzL2F1dGhvcml6ZWAsIGNyZWRlbnRpYWxzLnByb3ZpZGVyLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86IChfYSA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWRpcmVjdFRvLFxuICAgICAgICAgICAgICAgICAgICBzY29wZXM6IChfYiA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zY29wZXMsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiAoX2MgPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHNraXBCcm93c2VyUmVkaXJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCB1cmwsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IChfZSA9IChfZCA9IGRhdGEuc2Vzc2lvbikgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmFjY2Vzc190b2tlbikgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICBpZiAoaXNCcm93c2VyKCkgJiYgISgoX2EgPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2tpcEJyb3dzZXJSZWRpcmVjdCkpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgZGF0YTogeyBwcm92aWRlcjogY3JlZGVudGlhbHMucHJvdmlkZXIsIHVybDogZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYXRhLnVybCB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgcHJvdmlkZXI6IGNyZWRlbnRpYWxzLnByb3ZpZGVyLCB1cmw6IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBsaW5rSWRlbnRpdHlJZFRva2VuKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvcjogc2Vzc2lvbkVycm9yLCBkYXRhOiB7IHNlc3Npb24gfSwgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVycm9yKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzZXNzaW9uRXJyb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBvcHRpb25zLCBwcm92aWRlciwgdG9rZW4sIGFjY2Vzc190b2tlbiwgbm9uY2UgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L3Rva2VuP2dyYW50X3R5cGU9aWRfdG9rZW5gLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgand0OiAoX2EgPSBzZXNzaW9uID09PSBudWxsIHx8IHNlc3Npb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlc3Npb24uYWNjZXNzX3Rva2VuKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWRfdG9rZW46IHRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9uY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rX2lkZW50aXR5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSByZXM7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFkYXRhIHx8ICFkYXRhLnNlc3Npb24gfHwgIWRhdGEudXNlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvcigpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnVVNFUl9VUERBVEVEJywgZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGEsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVubGlua3MgYW4gaWRlbnRpdHkgZnJvbSBhIHVzZXIgYnkgZGVsZXRpbmcgaXQuIFRoZSB1c2VyIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gc2lnbiBpbiB3aXRoIHRoYXQgaWRlbnRpdHkgb25jZSBpdCdzIHVubGlua2VkLlxuICAgICAqL1xuICAgIGFzeW5jIHVubGlua0lkZW50aXR5KGlkZW50aXR5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0RFTEVURScsIGAke3RoaXMudXJsfS91c2VyL2lkZW50aXRpZXMvJHtpZGVudGl0eS5pZGVudGl0eV9pZH1gLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgand0OiAoX2IgPSAoX2EgPSBkYXRhLnNlc3Npb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY2Nlc3NfdG9rZW4pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIG5ldyBKV1QuXG4gICAgICogQHBhcmFtIHJlZnJlc2hUb2tlbiBBIHZhbGlkIHJlZnJlc2ggdG9rZW4gdGhhdCB3YXMgcmV0dXJuZWQgb24gbG9naW4uXG4gICAgICovXG4gICAgYXN5bmMgX3JlZnJlc2hBY2Nlc3NUb2tlbihyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgY29uc3QgZGVidWdOYW1lID0gYCNfcmVmcmVzaEFjY2Vzc1Rva2VuKCR7cmVmcmVzaFRva2VuLnN1YnN0cmluZygwLCA1KX0uLi4pYDtcbiAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnYmVnaW4nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAvLyB3aWxsIGF0dGVtcHQgdG8gcmVmcmVzaCB0aGUgdG9rZW4gd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmV0cnlhYmxlKGFzeW5jIChhdHRlbXB0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKDIwMCAqIE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKSk7IC8vIDIwMCwgNDAwLCA4MDAsIC4uLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZyhkZWJ1Z05hbWUsICdyZWZyZXNoaW5nIGF0dGVtcHQnLCBhdHRlbXB0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuYCwge1xuICAgICAgICAgICAgICAgICAgICBib2R5OiB7IHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbiB9LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIHhmb3JtOiBfc2Vzc2lvblJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgKGF0dGVtcHQsIGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEJhY2tPZmZJbnRlcnZhbCA9IDIwMCAqIE1hdGgucG93KDIsIGF0dGVtcHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiAoZXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvcihlcnJvcikgJiZcbiAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlhYmxlIG9ubHkgaWYgdGhlIHJlcXVlc3QgY2FuIGJlIHNlbnQgYmVmb3JlIHRoZSBiYWNrb2ZmIG92ZXJmbG93cyB0aGUgdGljayBkdXJhdGlvblxuICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpICsgbmV4dEJhY2tPZmZJbnRlcnZhbCAtIHN0YXJ0ZWRBdCA8IEFVVE9fUkVGUkVTSF9USUNLX0RVUkFUSU9OX01TKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgc2Vzc2lvbjogbnVsbCwgdXNlcjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnZW5kJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2lzVmFsaWRTZXNzaW9uKG1heWJlU2Vzc2lvbikge1xuICAgICAgICBjb25zdCBpc1ZhbGlkU2Vzc2lvbiA9IHR5cGVvZiBtYXliZVNlc3Npb24gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICBtYXliZVNlc3Npb24gIT09IG51bGwgJiZcbiAgICAgICAgICAgICdhY2Nlc3NfdG9rZW4nIGluIG1heWJlU2Vzc2lvbiAmJlxuICAgICAgICAgICAgJ3JlZnJlc2hfdG9rZW4nIGluIG1heWJlU2Vzc2lvbiAmJlxuICAgICAgICAgICAgJ2V4cGlyZXNfYXQnIGluIG1heWJlU2Vzc2lvbjtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWRTZXNzaW9uO1xuICAgIH1cbiAgICBhc3luYyBfaGFuZGxlUHJvdmlkZXJTaWduSW4ocHJvdmlkZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5fZ2V0VXJsRm9yUHJvdmlkZXIoYCR7dGhpcy51cmx9L2F1dGhvcml6ZWAsIHByb3ZpZGVyLCB7XG4gICAgICAgICAgICByZWRpcmVjdFRvOiBvcHRpb25zLnJlZGlyZWN0VG8sXG4gICAgICAgICAgICBzY29wZXM6IG9wdGlvbnMuc2NvcGVzLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IG9wdGlvbnMucXVlcnlQYXJhbXMsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9kZWJ1ZygnI19oYW5kbGVQcm92aWRlclNpZ25JbigpJywgJ3Byb3ZpZGVyJywgcHJvdmlkZXIsICdvcHRpb25zJywgb3B0aW9ucywgJ3VybCcsIHVybCk7XG4gICAgICAgIC8vIHRyeSB0byBvcGVuIG9uIHRoZSBicm93c2VyXG4gICAgICAgIGlmIChpc0Jyb3dzZXIoKSAmJiAhb3B0aW9ucy5za2lwQnJvd3NlclJlZGlyZWN0KSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YTogeyBwcm92aWRlciwgdXJsIH0sIGVycm9yOiBudWxsIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlY292ZXJzIHRoZSBzZXNzaW9uIGZyb20gTG9jYWxTdG9yYWdlIGFuZCByZWZyZXNoZXMgdGhlIHRva2VuXG4gICAgICogTm90ZTogdGhpcyBtZXRob2QgaXMgYXN5bmMgdG8gYWNjb21tb2RhdGUgZm9yIEFzeW5jU3RvcmFnZSBlLmcuIGluIFJlYWN0IG5hdGl2ZS5cbiAgICAgKi9cbiAgICBhc3luYyBfcmVjb3ZlckFuZFJlZnJlc2goKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IGRlYnVnTmFtZSA9ICcjX3JlY292ZXJBbmRSZWZyZXNoKCknO1xuICAgICAgICB0aGlzLl9kZWJ1ZyhkZWJ1Z05hbWUsICdiZWdpbicpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFNlc3Npb24gPSAoYXdhaXQgZ2V0SXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5KSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFNlc3Npb24gJiYgdGhpcy51c2VyU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgIGxldCBtYXliZVVzZXIgPSAoYXdhaXQgZ2V0SXRlbUFzeW5jKHRoaXMudXNlclN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSArICctdXNlcicpKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3RvcmFnZS5pc1NlcnZlciAmJiBPYmplY3QuaXModGhpcy5zdG9yYWdlLCB0aGlzLnVzZXJTdG9yYWdlKSAmJiAhbWF5YmVVc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0b3JhZ2UgYW5kIHVzZXJTdG9yYWdlIGFyZSB0aGUgc2FtZSBzdG9yYWdlIG1lZGl1bSwgZm9yIGV4YW1wbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93LmxvY2FsU3RvcmFnZSBpZiB1c2VyU3RvcmFnZSBkb2VzIG5vdCBoYXZlIHRoZSB1c2VyIGZyb21cbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmFnZSBzdG9yZWQsIHN0b3JlIGl0IGZpcnN0IHRoZXJlYnkgbWlncmF0aW5nIHRoZSB1c2VyIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHN0b3JhZ2UgLT4gdXNlclN0b3JhZ2VcbiAgICAgICAgICAgICAgICAgICAgbWF5YmVVc2VyID0geyB1c2VyOiBjdXJyZW50U2Vzc2lvbi51c2VyIH07XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNldEl0ZW1Bc3luYyh0aGlzLnVzZXJTdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkgKyAnLXVzZXInLCBtYXliZVVzZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50U2Vzc2lvbi51c2VyID0gKF9hID0gbWF5YmVVc2VyID09PSBudWxsIHx8IG1heWJlVXNlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWF5YmVVc2VyLnVzZXIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHVzZXJOb3RBdmFpbGFibGVQcm94eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudFNlc3Npb24gJiYgIWN1cnJlbnRTZXNzaW9uLnVzZXIpIHtcbiAgICAgICAgICAgICAgICAvLyB1c2VyIHN0b3JhZ2UgaXMgbm90IHNldCwgbGV0J3MgY2hlY2sgaWYgaXQgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCBzb1xuICAgICAgICAgICAgICAgIC8vIHdlIGJyaW5nIGJhY2sgdGhlIHN0b3JhZ2UgYXMgaXQgc2hvdWxkIGJlXG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50U2Vzc2lvbi51c2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRlc3QgaWYgdXNlclN0b3JhZ2Ugd2FzIHByZXZpb3VzbHkgZW5hYmxlZCBhbmQgdGhlIHN0b3JhZ2UgbWVkaXVtIHdhcyB0aGUgc2FtZSwgdG8gbW92ZSB0aGUgdXNlciBiYWNrIHVuZGVyIHRoZSBzYW1lIGtleVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXBhcmF0ZVVzZXIgPSAoYXdhaXQgZ2V0SXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5ICsgJy11c2VyJykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VwYXJhdGVVc2VyICYmIChzZXBhcmF0ZVVzZXIgPT09IG51bGwgfHwgc2VwYXJhdGVVc2VyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXBhcmF0ZVVzZXIudXNlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXNzaW9uLnVzZXIgPSBzZXBhcmF0ZVVzZXIudXNlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSArICctdXNlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2V0SXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5LCBjdXJyZW50U2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2Vzc2lvbi51c2VyID0gdXNlck5vdEF2YWlsYWJsZVByb3h5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZyhkZWJ1Z05hbWUsICdzZXNzaW9uIGZyb20gc3RvcmFnZScsIGN1cnJlbnRTZXNzaW9uKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5faXNWYWxpZFNlc3Npb24oY3VycmVudFNlc3Npb24pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnc2Vzc2lvbiBpcyBub3QgdmFsaWQnKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNlc3Npb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVtb3ZlU2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleHBpcmVzV2l0aE1hcmdpbiA9ICgoX2IgPSBjdXJyZW50U2Vzc2lvbi5leHBpcmVzX2F0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBJbmZpbml0eSkgKiAxMDAwIC0gRGF0ZS5ub3coKSA8IEVYUElSWV9NQVJHSU5fTVM7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZyhkZWJ1Z05hbWUsIGBzZXNzaW9uIGhhcyR7ZXhwaXJlc1dpdGhNYXJnaW4gPyAnJyA6ICcgbm90J30gZXhwaXJlZCB3aXRoIG1hcmdpbiBvZiAke0VYUElSWV9NQVJHSU5fTVN9c2ApO1xuICAgICAgICAgICAgaWYgKGV4cGlyZXNXaXRoTWFyZ2luKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0b1JlZnJlc2hUb2tlbiAmJiBjdXJyZW50U2Vzc2lvbi5yZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX2NhbGxSZWZyZXNoVG9rZW4oY3VycmVudFNlc3Npb24ucmVmcmVzaF90b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAncmVmcmVzaCBmYWlsZWQgd2l0aCBhIG5vbi1yZXRyeWFibGUgZXJyb3IsIHJlbW92aW5nIHRoZSBzZXNzaW9uJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlbW92ZVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRTZXNzaW9uLnVzZXIgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50U2Vzc2lvbi51c2VyLl9faXNVc2VyTm90QXZhaWxhYmxlUHJveHkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcHJveHkgdXNlciwgdHJ5IHRvIGdldCB0aGUgcmVhbCB1c2VyIGRhdGFcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yOiB1c2VyRXJyb3IgfSA9IGF3YWl0IHRoaXMuX2dldFVzZXIoY3VycmVudFNlc3Npb24uYWNjZXNzX3Rva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VyRXJyb3IgJiYgKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS51c2VyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciA9IGRhdGEudXNlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKGN1cnJlbnRTZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBjdXJyZW50U2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZyhkZWJ1Z05hbWUsICdjb3VsZCBub3QgZ2V0IHVzZXIgZGF0YSwgc2tpcHBpbmcgU0lHTkVEX0lOIG5vdGlmaWNhdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChnZXRVc2VyRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0dGluZyB1c2VyIGRhdGE6JywgZ2V0VXNlckVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnZXJyb3IgZ2V0dGluZyB1c2VyIGRhdGEsIHNraXBwaW5nIFNJR05FRF9JTiBub3RpZmljYXRpb24nLCBnZXRVc2VyRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcGVyc2lzdCBjdXJyZW50U2Vzc2lvbiBhZ2FpbiwgYXMgd2UganVzdCBsb2FkZWQgaXQgZnJvbVxuICAgICAgICAgICAgICAgIC8vIGxvY2FsIHN0b3JhZ2U7IHBlcnNpc3RpbmcgaXQgYWdhaW4gbWF5IG92ZXJ3cml0ZSBhIHZhbHVlIHNhdmVkIGJ5XG4gICAgICAgICAgICAgICAgLy8gYW5vdGhlciBjbGllbnQgd2l0aCBhY2Nlc3MgdG8gdGhlIHNhbWUgbG9jYWwgc3RvcmFnZVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBjdXJyZW50U2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnZW5kJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX2NhbGxSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWZyZXNoaW5nIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiAgICAgICAgaWYgKHRoaXMucmVmcmVzaGluZ0RlZmVycmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoaW5nRGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWJ1Z05hbWUgPSBgI19jYWxsUmVmcmVzaFRva2VuKCR7cmVmcmVzaFRva2VuLnN1YnN0cmluZygwLCA1KX0uLi4pYDtcbiAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnYmVnaW4nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaGluZ0RlZmVycmVkID0gbmV3IERlZmVycmVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCB0aGlzLl9yZWZyZXNoQWNjZXNzVG9rZW4ocmVmcmVzaFRva2VuKTtcbiAgICAgICAgICAgIGlmIChlcnJvcilcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIGlmICghZGF0YS5zZXNzaW9uKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdUT0tFTl9SRUZSRVNIRUQnLCBkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyBkYXRhOiBkYXRhLnNlc3Npb24sIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hpbmdEZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgICAgIGlmICghaXNBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVtb3ZlU2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLnJlZnJlc2hpbmdEZWZlcnJlZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKF9iID0gdGhpcy5yZWZyZXNoaW5nRGVmZXJyZWQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hpbmdEZWZlcnJlZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZyhkZWJ1Z05hbWUsICdlbmQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfbm90aWZ5QWxsU3Vic2NyaWJlcnMoZXZlbnQsIHNlc3Npb24sIGJyb2FkY2FzdCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgZGVidWdOYW1lID0gYCNfbm90aWZ5QWxsU3Vic2NyaWJlcnMoJHtldmVudH0pYDtcbiAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnYmVnaW4nLCBzZXNzaW9uLCBgYnJvYWRjYXN0ID0gJHticm9hZGNhc3R9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5icm9hZGNhc3RDaGFubmVsICYmIGJyb2FkY2FzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0Q2hhbm5lbC5wb3N0TWVzc2FnZSh7IGV2ZW50LCBzZXNzaW9uIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlcyA9IEFycmF5LmZyb20odGhpcy5zdGF0ZUNoYW5nZUVtaXR0ZXJzLnZhbHVlcygpKS5tYXAoYXN5bmMgKHgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB4LmNhbGxiYWNrKGV2ZW50LCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yc1swXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHNldCBjdXJyZW50U2Vzc2lvbiBhbmQgY3VycmVudFVzZXJcbiAgICAgKiBwcm9jZXNzIHRvIF9zdGFydEF1dG9SZWZyZXNoVG9rZW4gaWYgcG9zc2libGVcbiAgICAgKi9cbiAgICBhc3luYyBfc2F2ZVNlc3Npb24oc2Vzc2lvbikge1xuICAgICAgICB0aGlzLl9kZWJ1ZygnI19zYXZlU2Vzc2lvbigpJywgc2Vzc2lvbik7XG4gICAgICAgIC8vIF9zYXZlU2Vzc2lvbiBpcyBhbHdheXMgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IHNlc3Npb24gaGFzIGJlZW4gYWNxdWlyZWRcbiAgICAgICAgLy8gc28gd2UgY2FuIHNhZmVseSBzdXBwcmVzcyB0aGUgd2FybmluZyByZXR1cm5lZCBieSBmdXR1cmUgZ2V0U2Vzc2lvbiBjYWxsc1xuICAgICAgICB0aGlzLnN1cHByZXNzR2V0U2Vzc2lvbldhcm5pbmcgPSB0cnVlO1xuICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgc2hhbGxvdyBjb3B5IHRvIHdvcmsgd2l0aCwgdG8gYXZvaWQgbXV0YXRpbmcgdGhlIG9yaWdpbmFsIHNlc3Npb24gb2JqZWN0IGlmIGl0J3MgdXNlZCBlbHNld2hlcmVcbiAgICAgICAgY29uc3Qgc2Vzc2lvblRvUHJvY2VzcyA9IE9iamVjdC5hc3NpZ24oe30sIHNlc3Npb24pO1xuICAgICAgICBjb25zdCB1c2VySXNQcm94eSA9IHNlc3Npb25Ub1Byb2Nlc3MudXNlciAmJiBzZXNzaW9uVG9Qcm9jZXNzLnVzZXIuX19pc1VzZXJOb3RBdmFpbGFibGVQcm94eSA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMudXNlclN0b3JhZ2UpIHtcbiAgICAgICAgICAgIGlmICghdXNlcklzUHJveHkgJiYgc2Vzc2lvblRvUHJvY2Vzcy51c2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgaXQncyBhIHJlYWwgdXNlciBvYmplY3QsIHNhdmUgaXQgdG8gdXNlclN0b3JhZ2UuXG4gICAgICAgICAgICAgICAgYXdhaXQgc2V0SXRlbUFzeW5jKHRoaXMudXNlclN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSArICctdXNlcicsIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogc2Vzc2lvblRvUHJvY2Vzcy51c2VyLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodXNlcklzUHJveHkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIHRoZSBwcm94eSwgaXQgbWVhbnMgdXNlciB3YXMgbm90IGZvdW5kIGluIHVzZXJTdG9yYWdlLlxuICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBlbnN1cmUgbm8gc3RhbGUgdXNlciBkYXRhIGZvciB0aGlzIGtleSBleGlzdHMgaW4gdXNlclN0b3JhZ2UgaWYgd2Ugd2VyZSB0byBzYXZlIG51bGwsXG4gICAgICAgICAgICAgICAgLy8gb3Igc2ltcGx5IG5vdCBzYXZlIHRoZSBwcm94eS4gRm9yIG5vdywgd2UgZG9uJ3Qgc2F2ZSB0aGUgcHJveHkgaGVyZS5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgbmVlZCB0byBjbGVhciB1c2VyU3RvcmFnZSBpZiB1c2VyIGJlY29tZXMgcHJveHksIHRoYXQgbG9naWMgd291bGQgZ28gaGVyZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFByZXBhcmUgdGhlIG1haW4gc2Vzc2lvbiBkYXRhIGZvciBwcmltYXJ5IHN0b3JhZ2U6IHJlbW92ZSB0aGUgdXNlciBwcm9wZXJ0eSBiZWZvcmUgY2xvbmluZ1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgb3JpZ2luYWwgc2Vzc2lvbi51c2VyIG1pZ2h0IGJlIHRoZSBwcm94eVxuICAgICAgICAgICAgY29uc3QgbWFpblNlc3Npb25EYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgc2Vzc2lvblRvUHJvY2Vzcyk7XG4gICAgICAgICAgICBkZWxldGUgbWFpblNlc3Npb25EYXRhLnVzZXI7IC8vIFJlbW92ZSB1c2VyIChyZWFsIG9yIHByb3h5KSBiZWZvcmUgY2xvbmluZyBmb3IgbWFpbiBzdG9yYWdlXG4gICAgICAgICAgICBjb25zdCBjbG9uZWRNYWluU2Vzc2lvbkRhdGEgPSBkZWVwQ2xvbmUobWFpblNlc3Npb25EYXRhKTtcbiAgICAgICAgICAgIGF3YWl0IHNldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSwgY2xvbmVkTWFpblNlc3Npb25EYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIHVzZXJTdG9yYWdlIGlzIGNvbmZpZ3VyZWQuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHNlc3Npb24udXNlciBzaG91bGQgaWRlYWxseSBub3QgYmUgYSBwcm94eS5cbiAgICAgICAgICAgIC8vIElmIGl0IHdlcmUsIHN0cnVjdHVyZWRDbG9uZSB3b3VsZCBmYWlsLiBUaGlzIGltcGxpZXMgYW4gaXNzdWUgZWxzZXdoZXJlIGlmIHVzZXIgaXMgYSBwcm94eSBoZXJlXG4gICAgICAgICAgICBjb25zdCBjbG9uZWRTZXNzaW9uID0gZGVlcENsb25lKHNlc3Npb25Ub1Byb2Nlc3MpOyAvLyBzZXNzaW9uVG9Qcm9jZXNzIHN0aWxsIGhhcyBpdHMgb3JpZ2luYWwgdXNlciBwcm9wZXJ0eVxuICAgICAgICAgICAgYXdhaXQgc2V0SXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5LCBjbG9uZWRTZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfcmVtb3ZlU2Vzc2lvbigpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfcmVtb3ZlU2Vzc2lvbigpJyk7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NHZXRTZXNzaW9uV2FybmluZyA9IGZhbHNlO1xuICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkgKyAnLWNvZGUtdmVyaWZpZXInKTtcbiAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5ICsgJy11c2VyJyk7XG4gICAgICAgIGlmICh0aGlzLnVzZXJTdG9yYWdlKSB7XG4gICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy51c2VyU3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5ICsgJy11c2VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1NJR05FRF9PVVQnLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbnkgcmVnaXN0ZXJlZCB2aXNpYmlsaXR5Y2hhbmdlIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICoge0BzZWUgI3N0YXJ0QXV0b1JlZnJlc2h9XG4gICAgICoge0BzZWUgI3N0b3BBdXRvUmVmcmVzaH1cbiAgICAgKi9cbiAgICBfcmVtb3ZlVmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjaygpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfcmVtb3ZlVmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjaygpJyk7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy52aXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrO1xuICAgICAgICB0aGlzLnZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2sgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrICYmIGlzQnJvd3NlcigpICYmICh3aW5kb3cgPT09IG51bGwgfHwgd2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigncmVtb3ZpbmcgdmlzaWJpbGl0eWNoYW5nZSBjYWxsYmFjayBmYWlsZWQnLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayAjc3RhcnRBdXRvUmVmcmVzaH0uIFVzZSB0aGlzXG4gICAgICogd2l0aGluIHRoZSBsaWJyYXJ5LlxuICAgICAqL1xuICAgIGFzeW5jIF9zdGFydEF1dG9SZWZyZXNoKCkge1xuICAgICAgICBhd2FpdCB0aGlzLl9zdG9wQXV0b1JlZnJlc2goKTtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfc3RhcnRBdXRvUmVmcmVzaCgpJyk7XG4gICAgICAgIGNvbnN0IHRpY2tlciA9IHNldEludGVydmFsKCgpID0+IHRoaXMuX2F1dG9SZWZyZXNoVG9rZW5UaWNrKCksIEFVVE9fUkVGUkVTSF9USUNLX0RVUkFUSU9OX01TKTtcbiAgICAgICAgdGhpcy5hdXRvUmVmcmVzaFRpY2tlciA9IHRpY2tlcjtcbiAgICAgICAgaWYgKHRpY2tlciAmJiB0eXBlb2YgdGlja2VyID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGlja2VyLnVucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyB0aWNrZXIgaXMgYSBOb2RlSlMgVGltZW91dCBvYmplY3QgdGhhdCBoYXMgYW4gYHVucmVmYCBtZXRob2RcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvdGltZXJzLmh0bWwjdGltZW91dHVucmVmXG4gICAgICAgICAgICAvLyBXaGVuIGF1dG8gcmVmcmVzaCBpcyB1c2VkIGluIE5vZGVKUyAobGlrZSBmb3IgdGVzdGluZykgdGhlXG4gICAgICAgICAgICAvLyBgc2V0SW50ZXJ2YWxgIGlzIHByZXZlbnRpbmcgdGhlIHByb2Nlc3MgZnJvbSBiZWluZyBtYXJrZWQgYXNcbiAgICAgICAgICAgIC8vIGZpbmlzaGVkIGFuZCB0ZXN0cyBydW4gZW5kbGVzc2x5LiBUaGlzIGNhbiBiZSBwcmV2ZW50ZWQgYnkgY2FsbGluZ1xuICAgICAgICAgICAgLy8gYHVucmVmKClgIG9uIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gICAgICAgICAgICB0aWNrZXIudW5yZWYoKTtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVFMgaGFzIG5vIGNvbnRleHQgb2YgRGVub1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgRGVuby51bnJlZlRpbWVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBzaW1pbGFyIGxpa2UgZm9yIE5vZGVKUywgYnV0IHdpdGggdGhlIERlbm8gQVBJXG4gICAgICAgICAgICAvLyBodHRwczovL2Rlbm8ubGFuZC9hcGlAbGF0ZXN0P3Vuc3RhYmxlJnM9RGVuby51bnJlZlRpbWVyXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRTIGhhcyBubyBjb250ZXh0IG9mIERlbm9cbiAgICAgICAgICAgIERlbm8udW5yZWZUaW1lcih0aWNrZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJ1biB0aGUgdGljayBpbW1lZGlhdGVseSwgYnV0IGluIHRoZSBuZXh0IHBhc3Mgb2YgdGhlIGV2ZW50IGxvb3Agc28gdGhhdFxuICAgICAgICAvLyAjX2luaXRpYWxpemUgY2FuIGJlIGFsbG93ZWQgdG8gY29tcGxldGUgd2l0aG91dCByZWN1cnNpdmVseSB3YWl0aW5nIG9uXG4gICAgICAgIC8vIGl0c2VsZlxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9hdXRvUmVmcmVzaFRva2VuVGljaygpO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgI3N0b3BBdXRvUmVmcmVzaH0uIFVzZSB0aGlzXG4gICAgICogd2l0aGluIHRoZSBsaWJyYXJ5LlxuICAgICAqL1xuICAgIGFzeW5jIF9zdG9wQXV0b1JlZnJlc2goKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX3N0b3BBdXRvUmVmcmVzaCgpJyk7XG4gICAgICAgIGNvbnN0IHRpY2tlciA9IHRoaXMuYXV0b1JlZnJlc2hUaWNrZXI7XG4gICAgICAgIHRoaXMuYXV0b1JlZnJlc2hUaWNrZXIgPSBudWxsO1xuICAgICAgICBpZiAodGlja2VyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRpY2tlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIGFuIGF1dG8tcmVmcmVzaCBwcm9jZXNzIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGUgc2Vzc2lvbiBpcyBjaGVja2VkXG4gICAgICogZXZlcnkgZmV3IHNlY29uZHMuIENsb3NlIHRvIHRoZSB0aW1lIG9mIGV4cGlyYXRpb24gYSBwcm9jZXNzIGlzIHN0YXJ0ZWQgdG9cbiAgICAgKiByZWZyZXNoIHRoZSBzZXNzaW9uLiBJZiByZWZyZXNoaW5nIGZhaWxzIGl0IHdpbGwgYmUgcmV0cmllZCBmb3IgYXMgbG9uZyBhc1xuICAgICAqIG5lY2Vzc2FyeS5cbiAgICAgKlxuICAgICAqIElmIHlvdSBzZXQgdGhlIHtAbGluayBHb1RydWVDbGllbnRPcHRpb25zI2F1dG9SZWZyZXNoVG9rZW59IHlvdSBkb24ndCBuZWVkXG4gICAgICogdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCBmb3IgeW91LlxuICAgICAqXG4gICAgICogT24gYnJvd3NlcnMgdGhlIHJlZnJlc2ggcHJvY2VzcyB3b3JrcyBvbmx5IHdoZW4gdGhlIHRhYi93aW5kb3cgaXMgaW4gdGhlXG4gICAgICogZm9yZWdyb3VuZCB0byBjb25zZXJ2ZSByZXNvdXJjZXMgYXMgd2VsbCBhcyBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBhbmRcbiAgICAgKiBmbG9vZGluZyBhdXRoIHdpdGggcmVxdWVzdHMuIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kIGFueSBtYW5hZ2VkXG4gICAgICogdmlzaWJpbGl0eSBjaGFuZ2UgY2FsbGJhY2sgd2lsbCBiZSByZW1vdmVkIGFuZCB5b3UgbXVzdCBtYW5hZ2UgdmlzaWJpbGl0eVxuICAgICAqIGNoYW5nZXMgb24geW91ciBvd24uXG4gICAgICpcbiAgICAgKiBPbiBub24tYnJvd3NlciBwbGF0Zm9ybXMgdGhlIHJlZnJlc2ggcHJvY2VzcyB3b3JrcyAqY29udGludW91c2x5KiBpbiB0aGVcbiAgICAgKiBiYWNrZ3JvdW5kLCB3aGljaCBtYXkgbm90IGJlIGRlc2lyYWJsZS4gWW91IHNob3VsZCBob29rIGludG8geW91clxuICAgICAqIHBsYXRmb3JtJ3MgZm9yZWdyb3VuZCBpbmRpY2F0aW9uIG1lY2hhbmlzbSBhbmQgY2FsbCB0aGVzZSBtZXRob2RzXG4gICAgICogYXBwcm9wcmlhdGVseSB0byBjb25zZXJ2ZSByZXNvdXJjZXMuXG4gICAgICpcbiAgICAgKiB7QHNlZSAjc3RvcEF1dG9SZWZyZXNofVxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0QXV0b1JlZnJlc2goKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZVZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RhcnRBdXRvUmVmcmVzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9wcyBhbiBhY3RpdmUgYXV0byByZWZyZXNoIHByb2Nlc3MgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZCAoaWYgYW55KS5cbiAgICAgKlxuICAgICAqIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kIGFueSBtYW5hZ2VkIHZpc2liaWxpdHkgY2hhbmdlIGNhbGxiYWNrIHdpbGwgYmVcbiAgICAgKiByZW1vdmVkIGFuZCB5b3UgbXVzdCBtYW5hZ2UgdmlzaWJpbGl0eSBjaGFuZ2VzIG9uIHlvdXIgb3duLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayAjc3RhcnRBdXRvUmVmcmVzaH0gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBhc3luYyBzdG9wQXV0b1JlZnJlc2goKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZVZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RvcEF1dG9SZWZyZXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJ1bnMgdGhlIGF1dG8gcmVmcmVzaCB0b2tlbiB0aWNrLlxuICAgICAqL1xuICAgIGFzeW5jIF9hdXRvUmVmcmVzaFRva2VuVGljaygpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfYXV0b1JlZnJlc2hUb2tlblRpY2soKScsICdiZWdpbicpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSwgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24gfHwgIXNlc3Npb24ucmVmcmVzaF90b2tlbiB8fCAhc2Vzc2lvbi5leHBpcmVzX2F0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2F1dG9SZWZyZXNoVG9rZW5UaWNrKCknLCAnbm8gc2Vzc2lvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlc3Npb24gd2lsbCBleHBpcmUgaW4gdGhpcyBtYW55IHRpY2tzIChvciBoYXMgYWxyZWFkeSBleHBpcmVkIGlmIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwaXJlc0luVGlja3MgPSBNYXRoLmZsb29yKChzZXNzaW9uLmV4cGlyZXNfYXQgKiAxMDAwIC0gbm93KSAvIEFVVE9fUkVGUkVTSF9USUNLX0RVUkFUSU9OX01TKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19hdXRvUmVmcmVzaFRva2VuVGljaygpJywgYGFjY2VzcyB0b2tlbiBleHBpcmVzIGluICR7ZXhwaXJlc0luVGlja3N9IHRpY2tzLCBhIHRpY2sgbGFzdHMgJHtBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NU31tcywgcmVmcmVzaCB0aHJlc2hvbGQgaXMgJHtBVVRPX1JFRlJFU0hfVElDS19USFJFU0hPTER9IHRpY2tzYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGlyZXNJblRpY2tzIDw9IEFVVE9fUkVGUkVTSF9USUNLX1RIUkVTSE9MRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jYWxsUmVmcmVzaFRva2VuKHNlc3Npb24ucmVmcmVzaF90b2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F1dG8gcmVmcmVzaCB0aWNrIGZhaWxlZCB3aXRoIGVycm9yLiBUaGlzIGlzIGxpa2VseSBhIHRyYW5zaWVudCBlcnJvci4nLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfYXV0b1JlZnJlc2hUb2tlblRpY2soKScsICdlbmQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUuaXNBY3F1aXJlVGltZW91dCB8fCBlIGluc3RhbmNlb2YgTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnYXV0byByZWZyZXNoIHRva2VuIHRpY2sgbG9jayBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBjYWxsYmFja3Mgb24gdGhlIGJyb3dzZXIgLyBwbGF0Zm9ybSwgd2hpY2ggaW4tdHVybiBydW5cbiAgICAgKiBhbGdvcml0aG1zIHdoZW4gdGhlIGJyb3dzZXIgd2luZG93L3RhYiBhcmUgaW4gZm9yZWdyb3VuZC4gT24gbm9uLWJyb3dzZXJcbiAgICAgKiBwbGF0Zm9ybXMgaXQgYXNzdW1lcyBhbHdheXMgZm9yZWdyb3VuZC5cbiAgICAgKi9cbiAgICBhc3luYyBfaGFuZGxlVmlzaWJpbGl0eUNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfaGFuZGxlVmlzaWJpbGl0eUNoYW5nZSgpJyk7XG4gICAgICAgIGlmICghaXNCcm93c2VyKCkgfHwgISh3aW5kb3cgPT09IG51bGwgfHwgd2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9SZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAvLyBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMgdGhlIHJlZnJlc2ggdG9rZW4gdGlja2VyIHJ1bnMgYWx3YXlzXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydEF1dG9SZWZyZXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjayA9IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuX29uVmlzaWJpbGl0eUNoYW5nZWQoZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93ID09PSBudWxsIHx8IHdpbmRvdyA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLnZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgICAgICAgLy8gbm93IGltbWVkaWF0ZWx5IGNhbGwgdGhlIHZpc2JpbGl0eSBjaGFuZ2VkIGNhbGxiYWNrIHRvIHNldHVwIHdpdGggdGhlXG4gICAgICAgICAgICAvLyBjdXJyZW50IHZpc2JpbGl0eSBzdGF0ZVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fb25WaXNpYmlsaXR5Q2hhbmdlZCh0cnVlKTsgLy8gaW5pdGlhbCBjYWxsXG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdfaGFuZGxlVmlzaWJpbGl0eUNoYW5nZScsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayByZWdpc3RlcmVkIHdpdGggYHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJylgLlxuICAgICAqL1xuICAgIGFzeW5jIF9vblZpc2liaWxpdHlDaGFuZ2VkKGNhbGxlZEZyb21Jbml0aWFsaXplKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBgI19vblZpc2liaWxpdHlDaGFuZ2VkKCR7Y2FsbGVkRnJvbUluaXRpYWxpemV9KWA7XG4gICAgICAgIHRoaXMuX2RlYnVnKG1ldGhvZE5hbWUsICd2aXNpYmlsaXR5U3RhdGUnLCBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUpO1xuICAgICAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9SZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAvLyBpbiBicm93c2VyIGVudmlyb25tZW50cyB0aGUgcmVmcmVzaCB0b2tlbiB0aWNrZXIgcnVucyBvbmx5IG9uIGZvY3VzZWQgdGFic1xuICAgICAgICAgICAgICAgIC8vIHdoaWNoIHByZXZlbnRzIHJhY2UgY29uZGl0aW9uc1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0QXV0b1JlZnJlc2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2FsbGVkRnJvbUluaXRpYWxpemUpIHtcbiAgICAgICAgICAgICAgICAvLyBjYWxsZWQgd2hlbiB0aGUgdmlzaWJpbGl0eSBoYXMgY2hhbmdlZCwgaS5lLiB0aGUgYnJvd3NlclxuICAgICAgICAgICAgICAgIC8vIHRyYW5zaXRpb25lZCBmcm9tIGhpZGRlbiAtPiB2aXNpYmxlIHNvIHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBzZXNzaW9uXG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHJlY292ZXJlZCBpbW1lZGlhdGVseS4uLiBidXQgdG8gZG8gdGhhdCB3ZSBuZWVkIHRvIGFjcXVpcmVcbiAgICAgICAgICAgICAgICAvLyB0aGUgbG9jayBmaXJzdCBhc3luY2hyb25vdXNseVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSAhPT0gJ3Zpc2libGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZyhtZXRob2ROYW1lLCAnYWNxdWlyZWQgdGhlIGxvY2sgdG8gcmVjb3ZlciB0aGUgc2Vzc2lvbiwgYnV0IHRoZSBicm93c2VyIHZpc2liaWxpdHlTdGF0ZSBpcyBubyBsb25nZXIgdmlzaWJsZSwgYWJvcnRpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZpc2liaWxpdHkgaGFzIGNoYW5nZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGxvY2ssIGFib3J0XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciB0aGUgc2Vzc2lvblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yZWNvdmVyQW5kUmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9SZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9wQXV0b1JlZnJlc2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIHJlbGV2YW50IGxvZ2luIFVSTCBmb3IgYSB0aGlyZC1wYXJ0eSBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRpcmVjdFRvIEEgVVJMIG9yIG1vYmlsZSBhZGRyZXNzIHRvIHNlbmQgdGhlIHVzZXIgdG8gYWZ0ZXIgdGhleSBhcmUgY29uZmlybWVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLnNjb3BlcyBBIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHNjb3BlcyBncmFudGVkIHRvIHRoZSBPQXV0aCBhcHBsaWNhdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5xdWVyeVBhcmFtcyBBbiBvYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIGNvbnRhaW5pbmcgcXVlcnkgcGFyYW1ldGVycyBncmFudGVkIHRvIHRoZSBPQXV0aCBhcHBsaWNhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBfZ2V0VXJsRm9yUHJvdmlkZXIodXJsLCBwcm92aWRlciwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBbYHByb3ZpZGVyPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb3ZpZGVyKX1gXTtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZWRpcmVjdFRvKSB7XG4gICAgICAgICAgICB1cmxQYXJhbXMucHVzaChgcmVkaXJlY3RfdG89JHtlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5yZWRpcmVjdFRvKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNjb3Blcykge1xuICAgICAgICAgICAgdXJsUGFyYW1zLnB1c2goYHNjb3Blcz0ke2VuY29kZVVSSUNvbXBvbmVudChvcHRpb25zLnNjb3Blcyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmxvd1R5cGUgPT09ICdwa2NlJykge1xuICAgICAgICAgICAgY29uc3QgW2NvZGVDaGFsbGVuZ2UsIGNvZGVDaGFsbGVuZ2VNZXRob2RdID0gYXdhaXQgZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZCh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSk7XG4gICAgICAgICAgICBjb25zdCBmbG93UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgICAgICAgICAgY29kZV9jaGFsbGVuZ2U6IGAke2VuY29kZVVSSUNvbXBvbmVudChjb2RlQ2hhbGxlbmdlKX1gLFxuICAgICAgICAgICAgICAgIGNvZGVfY2hhbGxlbmdlX21ldGhvZDogYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvZGVDaGFsbGVuZ2VNZXRob2QpfWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVybFBhcmFtcy5wdXNoKGZsb3dQYXJhbXMudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5xdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKG9wdGlvbnMucXVlcnlQYXJhbXMpO1xuICAgICAgICAgICAgdXJsUGFyYW1zLnB1c2gocXVlcnkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5za2lwQnJvd3NlclJlZGlyZWN0KSB7XG4gICAgICAgICAgICB1cmxQYXJhbXMucHVzaChgc2tpcF9odHRwX3JlZGlyZWN0PSR7b3B0aW9ucy5za2lwQnJvd3NlclJlZGlyZWN0fWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHt1cmx9PyR7dXJsUGFyYW1zLmpvaW4oJyYnKX1gO1xuICAgIH1cbiAgICBhc3luYyBfdW5lbnJvbGwocGFyYW1zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogc2Vzc2lvbkRhdGEsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0RFTEVURScsIGAke3RoaXMudXJsfS9mYWN0b3JzLyR7cGFyYW1zLmZhY3RvcklkfWAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IChfYSA9IHNlc3Npb25EYXRhID09PSBudWxsIHx8IHNlc3Npb25EYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXNzaW9uRGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX2Vucm9sbChwYXJhbXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogc2Vzc2lvbkRhdGEsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gT2JqZWN0LmFzc2lnbih7IGZyaWVuZGx5X25hbWU6IHBhcmFtcy5mcmllbmRseU5hbWUsIGZhY3Rvcl90eXBlOiBwYXJhbXMuZmFjdG9yVHlwZSB9LCAocGFyYW1zLmZhY3RvclR5cGUgPT09ICdwaG9uZSdcbiAgICAgICAgICAgICAgICAgICAgPyB7IHBob25lOiBwYXJhbXMucGhvbmUgfVxuICAgICAgICAgICAgICAgICAgICA6IHBhcmFtcy5mYWN0b3JUeXBlID09PSAndG90cCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8geyBpc3N1ZXI6IHBhcmFtcy5pc3N1ZXIgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IChhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9mYWN0b3JzYCwge1xuICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogKF9hID0gc2Vzc2lvbkRhdGEgPT09IG51bGwgfHwgc2Vzc2lvbkRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlc3Npb25EYXRhLnNlc3Npb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZmFjdG9yVHlwZSA9PT0gJ3RvdHAnICYmIGRhdGEudHlwZSA9PT0gJ3RvdHAnICYmICgoX2IgPSBkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEudG90cCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnFyX2NvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEudG90cC5xcl9jb2RlID0gYGRhdGE6aW1hZ2Uvc3ZnK3htbDt1dGYtOCwke2RhdGEudG90cC5xcl9jb2RlfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhLCBlcnJvcjogbnVsbCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF92ZXJpZnkocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3F1aXJlTG9jaygtMSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBzZXNzaW9uRGF0YSwgZXJyb3I6IHNlc3Npb25FcnJvciB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gT2JqZWN0LmFzc2lnbih7IGNoYWxsZW5nZV9pZDogcGFyYW1zLmNoYWxsZW5nZUlkIH0sICgnd2ViYXV0aG4nIGluIHBhcmFtc1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViYXV0aG46IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zLndlYmF1dGhuKSwgeyBjcmVkZW50aWFsX3Jlc3BvbnNlOiBwYXJhbXMud2ViYXV0aG4udHlwZSA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2VyaWFsaXplQ3JlZGVudGlhbENyZWF0aW9uUmVzcG9uc2UocGFyYW1zLndlYmF1dGhuLmNyZWRlbnRpYWxfcmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0UmVzcG9uc2UocGFyYW1zLndlYmF1dGhuLmNyZWRlbnRpYWxfcmVzcG9uc2UpIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGNvZGU6IHBhcmFtcy5jb2RlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vZmFjdG9ycy8ke3BhcmFtcy5mYWN0b3JJZH0vdmVyaWZ5YCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGp3dDogKF9hID0gc2Vzc2lvbkRhdGEgPT09IG51bGwgfHwgc2Vzc2lvbkRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlc3Npb25EYXRhLnNlc3Npb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihPYmplY3QuYXNzaWduKHsgZXhwaXJlc19hdDogTWF0aC5yb3VuZChEYXRlLm5vdygpIC8gMTAwMCkgKyBkYXRhLmV4cGlyZXNfaW4gfSwgZGF0YSkpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnTUZBX0NIQUxMRU5HRV9WRVJJRklFRCcsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YSwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBfY2hhbGxlbmdlKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogc2Vzc2lvbkRhdGEsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vZmFjdG9ycy8ke3BhcmFtcy5mYWN0b3JJZH0vY2hhbGxlbmdlYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgand0OiAoX2EgPSBzZXNzaW9uRGF0YSA9PT0gbnVsbCB8fCBzZXNzaW9uRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2Vzc2lvbkRhdGEuc2Vzc2lvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS50eXBlICE9PSAnd2ViYXV0aG4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGF0YS53ZWJhdXRobi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjcmVhdGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0YSksIHsgd2ViYXV0aG46IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0YS53ZWJhdXRobiksIHsgY3JlZGVudGlhbF9vcHRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGEud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zKSwgeyBwdWJsaWNLZXk6IGRlc2VyaWFsaXplQ3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyhkYXRhLndlYmF1dGhuLmNyZWRlbnRpYWxfb3B0aW9ucy5wdWJsaWNLZXkpIH0pIH0pIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVxdWVzdCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkYXRhKSwgeyB3ZWJhdXRobjogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkYXRhLndlYmF1dGhuKSwgeyBjcmVkZW50aWFsX29wdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0YS53ZWJhdXRobi5jcmVkZW50aWFsX29wdGlvbnMpLCB7IHB1YmxpY0tleTogZGVzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMoZGF0YS53ZWJhdXRobi5jcmVkZW50aWFsX29wdGlvbnMucHVibGljS2V5KSB9KSB9KSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BzZWUgR29UcnVlTUZBQXBpI2NoYWxsZW5nZUFuZFZlcmlmeX1cbiAgICAgKi9cbiAgICBhc3luYyBfY2hhbGxlbmdlQW5kVmVyaWZ5KHBhcmFtcykge1xuICAgICAgICAvLyBib3RoIF9jaGFsbGVuZ2UgYW5kIF92ZXJpZnkgaW5kZXBlbmRlbnRseSBhY3F1aXJlIHRoZSBsb2NrLCBzbyBubyBuZWVkXG4gICAgICAgIC8vIHRvIGFjcXVpcmUgaXQgaGVyZVxuICAgICAgICBjb25zdCB7IGRhdGE6IGNoYWxsZW5nZURhdGEsIGVycm9yOiBjaGFsbGVuZ2VFcnJvciB9ID0gYXdhaXQgdGhpcy5fY2hhbGxlbmdlKHtcbiAgICAgICAgICAgIGZhY3RvcklkOiBwYXJhbXMuZmFjdG9ySWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY2hhbGxlbmdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogY2hhbGxlbmdlRXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3ZlcmlmeSh7XG4gICAgICAgICAgICBmYWN0b3JJZDogcGFyYW1zLmZhY3RvcklkLFxuICAgICAgICAgICAgY2hhbGxlbmdlSWQ6IGNoYWxsZW5nZURhdGEuaWQsXG4gICAgICAgICAgICBjb2RlOiBwYXJhbXMuY29kZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAc2VlIEdvVHJ1ZU1GQUFwaSNsaXN0RmFjdG9yc31cbiAgICAgKi9cbiAgICBhc3luYyBfbGlzdEZhY3RvcnMoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gdXNlICNnZXRVc2VyIGluc3RlYWQgb2YgI19nZXRVc2VyIGFzIHRoZSBmb3JtZXIgYWNxdWlyZXMgYSBsb2NrXG4gICAgICAgIGNvbnN0IHsgZGF0YTogeyB1c2VyIH0sIGVycm9yOiB1c2VyRXJyb3IsIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoKTtcbiAgICAgICAgaWYgKHVzZXJFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3I6IHVzZXJFcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBhbGw6IFtdLFxuICAgICAgICAgICAgcGhvbmU6IFtdLFxuICAgICAgICAgICAgdG90cDogW10sXG4gICAgICAgICAgICB3ZWJhdXRobjogW10sXG4gICAgICAgIH07XG4gICAgICAgIC8vIGxvb3Agb3ZlciB0aGUgZmFjdG9ycyBPTkNFXG4gICAgICAgIGZvciAoY29uc3QgZmFjdG9yIG9mIChfYSA9IHVzZXIgPT09IG51bGwgfHwgdXNlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogdXNlci5mYWN0b3JzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXSkge1xuICAgICAgICAgICAgZGF0YS5hbGwucHVzaChmYWN0b3IpO1xuICAgICAgICAgICAgaWYgKGZhY3Rvci5zdGF0dXMgPT09ICd2ZXJpZmllZCcpIHtcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgZGF0YVtmYWN0b3IuZmFjdG9yX3R5cGVdLnB1c2goZmFjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QHNlZSBHb1RydWVNRkFBcGkjZ2V0QXV0aGVudGljYXRvckFzc3VyYW5jZUxldmVsfVxuICAgICAqL1xuICAgIGFzeW5jIF9nZXRBdXRoZW50aWNhdG9yQXNzdXJhbmNlTGV2ZWwoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0sIGVycm9yOiBzZXNzaW9uRXJyb3IsIH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKTtcbiAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IHsgY3VycmVudExldmVsOiBudWxsLCBuZXh0TGV2ZWw6IG51bGwsIGN1cnJlbnRBdXRoZW50aWNhdGlvbk1ldGhvZHM6IFtdIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gZGVjb2RlSldUKHNlc3Npb24uYWNjZXNzX3Rva2VuKTtcbiAgICAgICAgbGV0IGN1cnJlbnRMZXZlbCA9IG51bGw7XG4gICAgICAgIGlmIChwYXlsb2FkLmFhbCkge1xuICAgICAgICAgICAgY3VycmVudExldmVsID0gcGF5bG9hZC5hYWw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHRMZXZlbCA9IGN1cnJlbnRMZXZlbDtcbiAgICAgICAgY29uc3QgdmVyaWZpZWRGYWN0b3JzID0gKF9iID0gKF9hID0gc2Vzc2lvbi51c2VyLmZhY3RvcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5maWx0ZXIoKGZhY3RvcikgPT4gZmFjdG9yLnN0YXR1cyA9PT0gJ3ZlcmlmaWVkJykpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdO1xuICAgICAgICBpZiAodmVyaWZpZWRGYWN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5leHRMZXZlbCA9ICdhYWwyJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50QXV0aGVudGljYXRpb25NZXRob2RzID0gcGF5bG9hZC5hbXIgfHwgW107XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHsgY3VycmVudExldmVsLCBuZXh0TGV2ZWwsIGN1cnJlbnRBdXRoZW50aWNhdGlvbk1ldGhvZHMgfSwgZXJyb3I6IG51bGwgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGRldGFpbHMgYWJvdXQgYW4gT0F1dGggYXV0aG9yaXphdGlvbiByZXF1ZXN0LlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGF1dGhvcml6YXRpb24gZGV0YWlscyBpbmNsdWRpbmcgY2xpZW50IGluZm8sIHNjb3BlcywgYW5kIHVzZXIgaW5mb3JtYXRpb24uXG4gICAgICogSWYgdGhlIEFQSSByZXR1cm5zIGEgcmVkaXJlY3RfdXJpLCBpdCBtZWFucyBjb25zZW50IHdhcyBhbHJlYWR5IGdpdmVuIC0gdGhlIGNhbGxlclxuICAgICAqIHNob3VsZCBoYW5kbGUgdGhlIHJlZGlyZWN0IG1hbnVhbGx5IGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBfZ2V0QXV0aG9yaXphdGlvbkRldGFpbHMoYXV0aG9yaXphdGlvbklkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSwgZXJyb3I6IHNlc3Npb25FcnJvciwgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vb2F1dGgvYXV0aG9yaXphdGlvbnMvJHthdXRob3JpemF0aW9uSWR9YCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIHhmb3JtOiAoZGF0YSkgPT4gKHsgZGF0YSwgZXJyb3I6IG51bGwgfSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHByb3ZlcyBhbiBPQXV0aCBhdXRob3JpemF0aW9uIHJlcXVlc3QuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHRoZSBPQXV0aCAyLjEgc2VydmVyIGlzIGVuYWJsZWQgaW4gU3VwYWJhc2UgQXV0aC5cbiAgICAgKi9cbiAgICBhc3luYyBfYXBwcm92ZUF1dGhvcml6YXRpb24oYXV0aG9yaXphdGlvbklkLCBvcHRpb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSwgZXJyb3I6IHNlc3Npb25FcnJvciwgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9vYXV0aC9hdXRob3JpemF0aW9ucy8ke2F1dGhvcml6YXRpb25JZH0vY29uc2VudGAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IHNlc3Npb24uYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7IGFjdGlvbjogJ2FwcHJvdmUnIH0sXG4gICAgICAgICAgICAgICAgICAgIHhmb3JtOiAoZGF0YSkgPT4gKHsgZGF0YSwgZXJyb3I6IG51bGwgfSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEgJiYgcmVzcG9uc2UuZGF0YS5yZWRpcmVjdF91cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXV0b21hdGljYWxseSByZWRpcmVjdCBpbiBicm93c2VyIHVubGVzcyBza2lwQnJvd3NlclJlZGlyZWN0IGlzIHRydWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQnJvd3NlcigpICYmICEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNraXBCcm93c2VyUmVkaXJlY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHJlc3BvbnNlLmRhdGEucmVkaXJlY3RfdXJsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZW5pZXMgYW4gT0F1dGggYXV0aG9yaXphdGlvbiByZXF1ZXN0LlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICovXG4gICAgYXN5bmMgX2RlbnlBdXRob3JpemF0aW9uKGF1dGhvcml6YXRpb25JZCwgb3B0aW9ucykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0sIGVycm9yOiBzZXNzaW9uRXJyb3IsIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vb2F1dGgvYXV0aG9yaXphdGlvbnMvJHthdXRob3JpemF0aW9uSWR9L2NvbnNlbnRgLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgand0OiBzZXNzaW9uLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogeyBhY3Rpb246ICdkZW55JyB9LFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogKGRhdGEpID0+ICh7IGRhdGEsIGVycm9yOiBudWxsIH0pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEucmVkaXJlY3RfdXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgcmVkaXJlY3QgaW4gYnJvd3NlciB1bmxlc3Mgc2tpcEJyb3dzZXJSZWRpcmVjdCBpcyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0Jyb3dzZXIoKSAmJiAhKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5za2lwQnJvd3NlclJlZGlyZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihyZXNwb25zZS5kYXRhLnJlZGlyZWN0X3VybCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdHMgYWxsIE9BdXRoIGdyYW50cyB0aGF0IHRoZSBhdXRoZW50aWNhdGVkIHVzZXIgaGFzIGF1dGhvcml6ZWQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHRoZSBPQXV0aCAyLjEgc2VydmVyIGlzIGVuYWJsZWQgaW4gU3VwYWJhc2UgQXV0aC5cbiAgICAgKi9cbiAgICBhc3luYyBfbGlzdE9BdXRoR3JhbnRzKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0sIGVycm9yOiBzZXNzaW9uRXJyb3IsIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L3VzZXIvb2F1dGgvZ3JhbnRzYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIHhmb3JtOiAoZGF0YSkgPT4gKHsgZGF0YSwgZXJyb3I6IG51bGwgfSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXZva2VzIGEgdXNlcidzIE9BdXRoIGdyYW50IGZvciBhIHNwZWNpZmljIGNsaWVudC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqL1xuICAgIGFzeW5jIF9yZXZva2VPQXV0aEdyYW50KG9wdGlvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9LCBlcnJvcjogc2Vzc2lvbkVycm9yLCB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnREVMRVRFJywgYCR7dGhpcy51cmx9L3VzZXIvb2F1dGgvZ3JhbnRzYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiB7IGNsaWVudF9pZDogb3B0aW9ucy5jbGllbnRJZCB9LFxuICAgICAgICAgICAgICAgICAgICBub1Jlc29sdmVKc29uOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZmV0Y2hKd2soa2lkLCBqd2tzID0geyBrZXlzOiBbXSB9KSB7XG4gICAgICAgIC8vIHRyeSBmZXRjaGluZyBmcm9tIHRoZSBzdXBwbGllZCBqd2tzXG4gICAgICAgIGxldCBqd2sgPSBqd2tzLmtleXMuZmluZCgoa2V5KSA9PiBrZXkua2lkID09PSBraWQpO1xuICAgICAgICBpZiAoandrKSB7XG4gICAgICAgICAgICByZXR1cm4gandrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIHRyeSBmZXRjaGluZyBmcm9tIGNhY2hlXG4gICAgICAgIGp3ayA9IHRoaXMuandrcy5rZXlzLmZpbmQoKGtleSkgPT4ga2V5LmtpZCA9PT0ga2lkKTtcbiAgICAgICAgLy8gandrIGV4aXN0cyBhbmQgandrcyBpc24ndCBzdGFsZVxuICAgICAgICBpZiAoandrICYmIHRoaXMuandrc19jYWNoZWRfYXQgKyBKV0tTX1RUTCA+IG5vdykge1xuICAgICAgICAgICAgcmV0dXJuIGp3aztcbiAgICAgICAgfVxuICAgICAgICAvLyBqd2sgaXNuJ3QgY2FjaGVkIGluIG1lbW9yeSBzbyB3ZSBuZWVkIHRvIGZldGNoIGl0IGZyb20gdGhlIHdlbGwta25vd24gZW5kcG9pbnRcbiAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0dFVCcsIGAke3RoaXMudXJsfS8ud2VsbC1rbm93bi9qd2tzLmpzb25gLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGF0YS5rZXlzIHx8IGRhdGEua2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuandrcyA9IGRhdGE7XG4gICAgICAgIHRoaXMuandrc19jYWNoZWRfYXQgPSBub3c7XG4gICAgICAgIC8vIEZpbmQgdGhlIHNpZ25pbmcga2V5XG4gICAgICAgIGp3ayA9IGRhdGEua2V5cy5maW5kKChrZXkpID0+IGtleS5raWQgPT09IGtpZCk7XG4gICAgICAgIGlmICghandrKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gandrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgSldUIGNsYWltcyBwcmVzZW50IGluIHRoZSBhY2Nlc3MgdG9rZW4gYnkgZmlyc3QgdmVyaWZ5aW5nIHRoZVxuICAgICAqIEpXVCBhZ2FpbnN0IHRoZSBzZXJ2ZXIncyBKU09OIFdlYiBLZXkgU2V0IGVuZHBvaW50XG4gICAgICogYC8ud2VsbC1rbm93bi9qd2tzLmpzb25gIHdoaWNoIGlzIG9mdGVuIGNhY2hlZCwgcmVzdWx0aW5nIGluIHNpZ25pZmljYW50bHlcbiAgICAgKiBmYXN0ZXIgcmVzcG9uc2VzLiBQcmVmZXIgdGhpcyBtZXRob2Qgb3ZlciB7QGxpbmsgI2dldFVzZXJ9IHdoaWNoIGFsd2F5c1xuICAgICAqIHNlbmRzIGEgcmVxdWVzdCB0byB0aGUgQXV0aCBzZXJ2ZXIgZm9yIGVhY2ggSldULlxuICAgICAqXG4gICAgICogSWYgdGhlIHByb2plY3QgaXMgbm90IHVzaW5nIGFuIGFzeW1tZXRyaWMgSldUIHNpZ25pbmcga2V5IChsaWtlIEVDQyBvclxuICAgICAqIFJTQSkgaXQgYWx3YXlzIHNlbmRzIGEgcmVxdWVzdCB0byB0aGUgQXV0aCBzZXJ2ZXIgKHNpbWlsYXIgdG8ge0BsaW5rXG4gICAgICogI2dldFVzZXJ9KSB0byB2ZXJpZnkgdGhlIEpXVC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBqd3QgQW4gb3B0aW9uYWwgc3BlY2lmaWMgSldUIHlvdSB3aXNoIHRvIHZlcmlmeSwgbm90IHRoZSBvbmUgeW91XG4gICAgICogICAgICAgICAgICBjYW4gb2J0YWluIGZyb20ge0BsaW5rICNnZXRTZXNzaW9ufS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBWYXJpb3VzIGFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IGFsbG93IHlvdSB0byBjdXN0b21pemUgdGhlXG4gICAgICogICAgICAgICAgICAgICAgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0Q2xhaW1zKGp3dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgdG9rZW4gPSBqd3Q7XG4gICAgICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIHx8ICFkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0b2tlbiA9IGRhdGEuc2Vzc2lvbi5hY2Nlc3NfdG9rZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGhlYWRlciwgcGF5bG9hZCwgc2lnbmF0dXJlLCByYXc6IHsgaGVhZGVyOiByYXdIZWFkZXIsIHBheWxvYWQ6IHJhd1BheWxvYWQgfSwgfSA9IGRlY29kZUpXVCh0b2tlbik7XG4gICAgICAgICAgICBpZiAoIShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYWxsb3dFeHBpcmVkKSkge1xuICAgICAgICAgICAgICAgIC8vIFJlamVjdCBleHBpcmVkIEpXVHMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIGp3dCBhcmd1bWVudCB3YXMgcGFzc2VkXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVFeHAocGF5bG9hZC5leHApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2lnbmluZ0tleSA9ICFoZWFkZXIuYWxnIHx8XG4gICAgICAgICAgICAgICAgaGVhZGVyLmFsZy5zdGFydHNXaXRoKCdIUycpIHx8XG4gICAgICAgICAgICAgICAgIWhlYWRlci5raWQgfHxcbiAgICAgICAgICAgICAgICAhKCdjcnlwdG8nIGluIGdsb2JhbFRoaXMgJiYgJ3N1YnRsZScgaW4gZ2xvYmFsVGhpcy5jcnlwdG8pXG4gICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmZldGNoSndrKGhlYWRlci5raWQsIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMua2V5cykgPyB7IGtleXM6IG9wdGlvbnMua2V5cyB9IDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmp3a3MpO1xuICAgICAgICAgICAgLy8gSWYgc3ltbWV0cmljIGFsZ29yaXRobSBvciBXZWJDcnlwdG8gQVBJIGlzIHVuYXZhaWxhYmxlLCBmYWxsYmFjayB0byBnZXRVc2VyKClcbiAgICAgICAgICAgIGlmICghc2lnbmluZ0tleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IGF3YWl0IHRoaXMuZ2V0VXNlcih0b2tlbik7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBnZXRVc2VyIHN1Y2NlZWRzIHNvIHRoZSBjbGFpbXMgaW4gdGhlIEpXVCBjYW4gYmUgdHJ1c3RlZFxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYWltczogcGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsZ29yaXRobSA9IGdldEFsZ29yaXRobShoZWFkZXIuYWxnKTtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgSldLIHRvIENyeXB0b0tleVxuICAgICAgICAgICAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoJ2p3aycsIHNpZ25pbmdLZXksIGFsZ29yaXRobSwgdHJ1ZSwgW1xuICAgICAgICAgICAgICAgICd2ZXJpZnknLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBWZXJpZnkgdGhlIHNpZ25hdHVyZVxuICAgICAgICAgICAgY29uc3QgaXNWYWxpZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUudmVyaWZ5KGFsZ29yaXRobSwgcHVibGljS2V5LCBzaWduYXR1cmUsIHN0cmluZ1RvVWludDhBcnJheShgJHtyYXdIZWFkZXJ9LiR7cmF3UGF5bG9hZH1gKSk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aEludmFsaWRKd3RFcnJvcignSW52YWxpZCBKV1Qgc2lnbmF0dXJlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB2ZXJpZmljYXRpb24gc3VjY2VlZHMsIGRlY29kZSBhbmQgcmV0dXJuIGNsYWltc1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsYWltczogcGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyLFxuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG59XG5Hb1RydWVDbGllbnQubmV4dEluc3RhbmNlSUQgPSB7fTtcbmV4cG9ydCBkZWZhdWx0IEdvVHJ1ZUNsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdvVHJ1ZUNsaWVudC5qcy5tYXAiXSwibmFtZXMiOlsiR29UcnVlQWRtaW5BcGkiLCJBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyIsIkFVVE9fUkVGUkVTSF9USUNLX1RIUkVTSE9MRCIsIkRFRkFVTFRfSEVBREVSUyIsIkVYUElSWV9NQVJHSU5fTVMiLCJHT1RSVUVfVVJMIiwiSldLU19UVEwiLCJTVE9SQUdFX0tFWSIsIkF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciIsIkF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvciIsIkF1dGhJbnZhbGlkSnd0RXJyb3IiLCJBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvciIsIkF1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yIiwiQXV0aFBLQ0VHcmFudENvZGVFeGNoYW5nZUVycm9yIiwiQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IiLCJBdXRoVW5rbm93bkVycm9yIiwiaXNBdXRoQXBpRXJyb3IiLCJpc0F1dGhFcnJvciIsImlzQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yIiwiaXNBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvciIsImlzQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IiLCJfcmVxdWVzdCIsIl9zZXNzaW9uUmVzcG9uc2UiLCJfc2Vzc2lvblJlc3BvbnNlUGFzc3dvcmQiLCJfc3NvUmVzcG9uc2UiLCJfdXNlclJlc3BvbnNlIiwiZGVjb2RlSldUIiwiZGVlcENsb25lIiwiRGVmZXJyZWQiLCJnZW5lcmF0ZUNhbGxiYWNrSWQiLCJnZXRBbGdvcml0aG0iLCJnZXRDb2RlQ2hhbGxlbmdlQW5kTWV0aG9kIiwiZ2V0SXRlbUFzeW5jIiwiaW5zZWN1cmVVc2VyV2FybmluZ1Byb3h5IiwiaXNCcm93c2VyIiwicGFyc2VQYXJhbWV0ZXJzRnJvbVVSTCIsInJlbW92ZUl0ZW1Bc3luYyIsInJlc29sdmVGZXRjaCIsInJldHJ5YWJsZSIsInNldEl0ZW1Bc3luYyIsInNsZWVwIiwic3VwcG9ydHNMb2NhbFN0b3JhZ2UiLCJ1c2VyTm90QXZhaWxhYmxlUHJveHkiLCJ2YWxpZGF0ZUV4cCIsIm1lbW9yeUxvY2FsU3RvcmFnZUFkYXB0ZXIiLCJMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciIsIm5hdmlnYXRvckxvY2siLCJwb2x5ZmlsbEdsb2JhbFRoaXMiLCJ2ZXJzaW9uIiwiYnl0ZXNUb0Jhc2U2NFVSTCIsInN0cmluZ1RvVWludDhBcnJheSIsImNyZWF0ZVNpd2VNZXNzYWdlIiwiZnJvbUhleCIsImdldEFkZHJlc3MiLCJ0b0hleCIsImRlc2VyaWFsaXplQ3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyIsImRlc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zIiwic2VyaWFsaXplQ3JlZGVudGlhbENyZWF0aW9uUmVzcG9uc2UiLCJzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdFJlc3BvbnNlIiwiV2ViQXV0aG5BcGkiLCJERUZBVUxUX09QVElPTlMiLCJ1cmwiLCJzdG9yYWdlS2V5IiwiYXV0b1JlZnJlc2hUb2tlbiIsInBlcnNpc3RTZXNzaW9uIiwiZGV0ZWN0U2Vzc2lvbkluVXJsIiwiaGVhZGVycyIsImZsb3dUeXBlIiwiZGVidWciLCJoYXNDdXN0b21BdXRob3JpemF0aW9uSGVhZGVyIiwidGhyb3dPbkVycm9yIiwibG9ja05vT3AiLCJuYW1lIiwiYWNxdWlyZVRpbWVvdXQiLCJmbiIsIkdMT0JBTF9KV0tTIiwiR29UcnVlQ2xpZW50IiwiandrcyIsIl9hIiwiX2IiLCJrZXlzIiwidmFsdWUiLCJPYmplY3QiLCJhc3NpZ24iLCJqd2tzX2NhY2hlZF9hdCIsImNhY2hlZEF0IiwiTnVtYmVyIiwiTUlOX1NBRkVfSU5URUdFUiIsImlzVGhyb3dPbkVycm9yRW5hYmxlZCIsIl9yZXR1cm5SZXN1bHQiLCJyZXN1bHQiLCJlcnJvciIsIl9sb2dQcmVmaXgiLCJpbnN0YW5jZUlEIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwiX2RlYnVnIiwiYXJncyIsImxvZ0RlYnVnTWVzc2FnZXMiLCJsb2dnZXIiLCJpbml0aWFsaXplIiwiaW5pdGlhbGl6ZVByb21pc2UiLCJfYWNxdWlyZUxvY2siLCJfaW5pdGlhbGl6ZSIsInBhcmFtcyIsImNhbGxiYWNrVXJsVHlwZSIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsIl9pc0ltcGxpY2l0R3JhbnRDYWxsYmFjayIsIl9pc1BLQ0VDYWxsYmFjayIsImRhdGEiLCJfZ2V0U2Vzc2lvbkZyb21VUkwiLCJlcnJvckNvZGUiLCJkZXRhaWxzIiwiY29kZSIsIl9yZW1vdmVTZXNzaW9uIiwic2Vzc2lvbiIsInJlZGlyZWN0VHlwZSIsIl9zYXZlU2Vzc2lvbiIsInNldFRpbWVvdXQiLCJfbm90aWZ5QWxsU3Vic2NyaWJlcnMiLCJfcmVjb3ZlckFuZFJlZnJlc2giLCJfaGFuZGxlVmlzaWJpbGl0eUNoYW5nZSIsInNpZ25JbkFub255bW91c2x5IiwiY3JlZGVudGlhbHMiLCJfYyIsInJlcyIsImZldGNoIiwiYm9keSIsIm9wdGlvbnMiLCJnb3RydWVfbWV0YV9zZWN1cml0eSIsImNhcHRjaGFfdG9rZW4iLCJjYXB0Y2hhVG9rZW4iLCJ4Zm9ybSIsInVzZXIiLCJzaWduVXAiLCJlbWFpbCIsInBhc3N3b3JkIiwiY29kZUNoYWxsZW5nZSIsImNvZGVDaGFsbGVuZ2VNZXRob2QiLCJzdG9yYWdlIiwicmVkaXJlY3RUbyIsImVtYWlsUmVkaXJlY3RUbyIsImNvZGVfY2hhbGxlbmdlIiwiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIiwicGhvbmUiLCJjaGFubmVsIiwic2lnbkluV2l0aFBhc3N3b3JkIiwiaW52YWxpZFRva2VuRXJyb3IiLCJ3ZWFrX3Bhc3N3b3JkIiwid2Vha1Bhc3N3b3JkIiwic2lnbkluV2l0aE9BdXRoIiwiX2QiLCJfaGFuZGxlUHJvdmlkZXJTaWduSW4iLCJwcm92aWRlciIsInNjb3BlcyIsInF1ZXJ5UGFyYW1zIiwic2tpcEJyb3dzZXJSZWRpcmVjdCIsImV4Y2hhbmdlQ29kZUZvclNlc3Npb24iLCJhdXRoQ29kZSIsIl9leGNoYW5nZUNvZGVGb3JTZXNzaW9uIiwic2lnbkluV2l0aFdlYjMiLCJjaGFpbiIsInNpZ25JbldpdGhFdGhlcmV1bSIsInNpZ25JbldpdGhTb2xhbmEiLCJFcnJvciIsIl9lIiwiX2YiLCJfZyIsIl9oIiwiX2oiLCJfayIsIl9sIiwibWVzc2FnZSIsInNpZ25hdHVyZSIsIndhbGxldCIsInN0YXRlbWVudCIsInJlc29sdmVkV2FsbGV0Iiwid2luZG93QW55IiwiZXRoZXJldW0iLCJyZXF1ZXN0IiwiVVJMIiwiYWNjb3VudHMiLCJtZXRob2QiLCJ0aGVuIiwiYWNjcyIsImNhdGNoIiwibGVuZ3RoIiwiYWRkcmVzcyIsImNoYWluSWQiLCJjaGFpbklkSGV4Iiwic2l3ZU1lc3NhZ2UiLCJkb21haW4iLCJob3N0IiwidXJpIiwibm9uY2UiLCJpc3N1ZWRBdCIsImV4cGlyYXRpb25UaW1lIiwibm90QmVmb3JlIiwicmVxdWVzdElkIiwicmVzb3VyY2VzIiwiX20iLCJzb2xhbmEiLCJzaWduSW4iLCJzaWduTWVzc2FnZSIsIm91dHB1dCIsIm91dHB1dFRvUHJvY2VzcyIsIkFycmF5IiwiaXNBcnJheSIsInNpZ25lZE1lc3NhZ2UiLCJVaW50OEFycmF5IiwiVGV4dERlY29kZXIiLCJkZWNvZGUiLCJwdWJsaWNLZXkiLCJ0b0Jhc2U1OCIsIm1hcCIsInJlc291cmNlIiwiam9pbiIsIm1heWJlU2lnbmF0dXJlIiwiVGV4dEVuY29kZXIiLCJlbmNvZGUiLCJzdG9yYWdlSXRlbSIsImNvZGVWZXJpZmllciIsInNwbGl0IiwiYXV0aF9jb2RlIiwiY29kZV92ZXJpZmllciIsInNpZ25JbldpdGhJZFRva2VuIiwidG9rZW4iLCJhY2Nlc3NfdG9rZW4iLCJpZF90b2tlbiIsInNpZ25JbldpdGhPdHAiLCJjcmVhdGVfdXNlciIsInNob3VsZENyZWF0ZVVzZXIiLCJtZXNzYWdlSWQiLCJtZXNzYWdlX2lkIiwidmVyaWZ5T3RwIiwidW5kZWZpbmVkIiwidG9rZW5WZXJpZmljYXRpb25FcnJvciIsInR5cGUiLCJzaWduSW5XaXRoU1NPIiwicHJvdmlkZXJfaWQiLCJwcm92aWRlcklkIiwicmVkaXJlY3RfdG8iLCJza2lwX2h0dHBfcmVkaXJlY3QiLCJyZWF1dGhlbnRpY2F0ZSIsIl9yZWF1dGhlbnRpY2F0ZSIsIl91c2VTZXNzaW9uIiwic2Vzc2lvbkVycm9yIiwiand0IiwicmVzZW5kIiwiZW5kcG9pbnQiLCJnZXRTZXNzaW9uIiwibG9ja0FjcXVpcmVkIiwibGFzdCIsInBlbmRpbmdJbkxvY2siLCJQcm9taXNlIiwicmVzb2x2ZSIsInB1c2giLCJlIiwibG9jayIsIndhaXRPbiIsImFsbCIsInNwbGljZSIsIl9fbG9hZFNlc3Npb24iLCJzdGFjayIsImN1cnJlbnRTZXNzaW9uIiwibWF5YmVTZXNzaW9uIiwiX2lzVmFsaWRTZXNzaW9uIiwiaGFzRXhwaXJlZCIsImV4cGlyZXNfYXQiLCJub3ciLCJ1c2VyU3RvcmFnZSIsIm1heWJlVXNlciIsImlzU2VydmVyIiwiX19pc1VzZXJOb3RBdmFpbGFibGVQcm94eSIsInN1cHByZXNzV2FybmluZ1JlZiIsInN1cHByZXNzR2V0U2Vzc2lvbldhcm5pbmciLCJfY2FsbFJlZnJlc2hUb2tlbiIsInJlZnJlc2hfdG9rZW4iLCJnZXRVc2VyIiwiX2dldFVzZXIiLCJ1cGRhdGVVc2VyIiwiYXR0cmlidXRlcyIsIl91cGRhdGVVc2VyIiwic2Vzc2lvbkRhdGEiLCJ1c2VyRXJyb3IiLCJzZXRTZXNzaW9uIiwiX3NldFNlc3Npb24iLCJ0aW1lTm93IiwiZXhwaXJlc0F0IiwicGF5bG9hZCIsImV4cCIsInJlZnJlc2hlZFNlc3Npb24iLCJ0b2tlbl90eXBlIiwiZXhwaXJlc19pbiIsInJlZnJlc2hTZXNzaW9uIiwiX3JlZnJlc2hTZXNzaW9uIiwiZXJyb3JfZGVzY3JpcHRpb24iLCJlcnJvcl9jb2RlIiwic2VhcmNoUGFyYW1zIiwiZGVsZXRlIiwiaGlzdG9yeSIsInJlcGxhY2VTdGF0ZSIsInN0YXRlIiwidG9TdHJpbmciLCJwcm92aWRlcl90b2tlbiIsInByb3ZpZGVyX3JlZnJlc2hfdG9rZW4iLCJNYXRoIiwicm91bmQiLCJleHBpcmVzSW4iLCJwYXJzZUludCIsImFjdHVhbGx5RXhwaXJlc0luIiwiY29uc29sZSIsIndhcm4iLCJoYXNoIiwiQm9vbGVhbiIsImN1cnJlbnRTdG9yYWdlQ29udGVudCIsInNpZ25PdXQiLCJzY29wZSIsIl9zaWduT3V0IiwiYWNjZXNzVG9rZW4iLCJhZG1pbiIsInN0YXR1cyIsIm9uQXV0aFN0YXRlQ2hhbmdlIiwiY2FsbGJhY2siLCJpZCIsInN1YnNjcmlwdGlvbiIsInVuc3Vic2NyaWJlIiwic3RhdGVDaGFuZ2VFbWl0dGVycyIsInNldCIsIl9lbWl0SW5pdGlhbFNlc3Npb24iLCJnZXQiLCJlcnIiLCJyZXNldFBhc3N3b3JkRm9yRW1haWwiLCJnZXRVc2VySWRlbnRpdGllcyIsImlkZW50aXRpZXMiLCJsaW5rSWRlbnRpdHkiLCJsaW5rSWRlbnRpdHlJZFRva2VuIiwibGlua0lkZW50aXR5T0F1dGgiLCJfZ2V0VXJsRm9yUHJvdmlkZXIiLCJsaW5rX2lkZW50aXR5IiwidW5saW5rSWRlbnRpdHkiLCJpZGVudGl0eSIsImlkZW50aXR5X2lkIiwiX3JlZnJlc2hBY2Nlc3NUb2tlbiIsInJlZnJlc2hUb2tlbiIsImRlYnVnTmFtZSIsInN1YnN0cmluZyIsInN0YXJ0ZWRBdCIsImF0dGVtcHQiLCJwb3ciLCJuZXh0QmFja09mZkludGVydmFsIiwiaXNWYWxpZFNlc3Npb24iLCJpcyIsInNlcGFyYXRlVXNlciIsImV4cGlyZXNXaXRoTWFyZ2luIiwiSW5maW5pdHkiLCJnZXRVc2VyRXJyb3IiLCJyZWZyZXNoaW5nRGVmZXJyZWQiLCJwcm9taXNlIiwicmVqZWN0IiwiZXZlbnQiLCJicm9hZGNhc3QiLCJicm9hZGNhc3RDaGFubmVsIiwicG9zdE1lc3NhZ2UiLCJlcnJvcnMiLCJwcm9taXNlcyIsImZyb20iLCJ2YWx1ZXMiLCJ4IiwiaSIsInNlc3Npb25Ub1Byb2Nlc3MiLCJ1c2VySXNQcm94eSIsIm1haW5TZXNzaW9uRGF0YSIsImNsb25lZE1haW5TZXNzaW9uRGF0YSIsImNsb25lZFNlc3Npb24iLCJfcmVtb3ZlVmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjayIsInZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2siLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiX3N0YXJ0QXV0b1JlZnJlc2giLCJfc3RvcEF1dG9SZWZyZXNoIiwidGlja2VyIiwic2V0SW50ZXJ2YWwiLCJfYXV0b1JlZnJlc2hUb2tlblRpY2siLCJhdXRvUmVmcmVzaFRpY2tlciIsInVucmVmIiwiRGVubyIsInVucmVmVGltZXIiLCJjbGVhckludGVydmFsIiwic3RhcnRBdXRvUmVmcmVzaCIsInN0b3BBdXRvUmVmcmVzaCIsImV4cGlyZXNJblRpY2tzIiwiZmxvb3IiLCJpc0FjcXVpcmVUaW1lb3V0IiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9vblZpc2liaWxpdHlDaGFuZ2VkIiwiY2FsbGVkRnJvbUluaXRpYWxpemUiLCJtZXRob2ROYW1lIiwiZG9jdW1lbnQiLCJ2aXNpYmlsaXR5U3RhdGUiLCJ1cmxQYXJhbXMiLCJlbmNvZGVVUklDb21wb25lbnQiLCJmbG93UGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwicXVlcnkiLCJfdW5lbnJvbGwiLCJmYWN0b3JJZCIsIl9lbnJvbGwiLCJmcmllbmRseV9uYW1lIiwiZnJpZW5kbHlOYW1lIiwiZmFjdG9yX3R5cGUiLCJmYWN0b3JUeXBlIiwiaXNzdWVyIiwidG90cCIsInFyX2NvZGUiLCJfdmVyaWZ5IiwiY2hhbGxlbmdlX2lkIiwiY2hhbGxlbmdlSWQiLCJ3ZWJhdXRobiIsImNyZWRlbnRpYWxfcmVzcG9uc2UiLCJfY2hhbGxlbmdlIiwicmVzcG9uc2UiLCJjcmVkZW50aWFsX29wdGlvbnMiLCJfY2hhbGxlbmdlQW5kVmVyaWZ5IiwiY2hhbGxlbmdlRGF0YSIsImNoYWxsZW5nZUVycm9yIiwiX2xpc3RGYWN0b3JzIiwiZmFjdG9yIiwiZmFjdG9ycyIsIl9nZXRBdXRoZW50aWNhdG9yQXNzdXJhbmNlTGV2ZWwiLCJjdXJyZW50TGV2ZWwiLCJuZXh0TGV2ZWwiLCJjdXJyZW50QXV0aGVudGljYXRpb25NZXRob2RzIiwiYWFsIiwidmVyaWZpZWRGYWN0b3JzIiwiZmlsdGVyIiwiYW1yIiwiX2dldEF1dGhvcml6YXRpb25EZXRhaWxzIiwiYXV0aG9yaXphdGlvbklkIiwiX2FwcHJvdmVBdXRob3JpemF0aW9uIiwiYWN0aW9uIiwicmVkaXJlY3RfdXJsIiwiX2RlbnlBdXRob3JpemF0aW9uIiwiX2xpc3RPQXV0aEdyYW50cyIsIl9yZXZva2VPQXV0aEdyYW50IiwiY2xpZW50X2lkIiwiY2xpZW50SWQiLCJub1Jlc29sdmVKc29uIiwiZmV0Y2hKd2siLCJraWQiLCJqd2siLCJmaW5kIiwia2V5IiwiZ2V0Q2xhaW1zIiwiaGVhZGVyIiwicmF3IiwicmF3SGVhZGVyIiwicmF3UGF5bG9hZCIsImFsbG93RXhwaXJlZCIsInNpZ25pbmdLZXkiLCJhbGciLCJzdGFydHNXaXRoIiwiZ2xvYmFsVGhpcyIsImNyeXB0byIsImNsYWltcyIsImFsZ29yaXRobSIsInN1YnRsZSIsImltcG9ydEtleSIsImlzVmFsaWQiLCJ2ZXJpZnkiLCJjb25zdHJ1Y3RvciIsIm1lbW9yeVN0b3JhZ2UiLCJNYXAiLCJsb2ciLCJzZXR0aW5ncyIsIm5leHRJbnN0YW5jZUlEIiwidHJhY2UiLCJuYXZpZ2F0b3IiLCJsb2NrcyIsIm1mYSIsImJpbmQiLCJlbnJvbGwiLCJ1bmVucm9sbCIsImNoYWxsZW5nZSIsImxpc3RGYWN0b3JzIiwiY2hhbGxlbmdlQW5kVmVyaWZ5IiwiZ2V0QXV0aGVudGljYXRvckFzc3VyYW5jZUxldmVsIiwib2F1dGgiLCJnZXRBdXRob3JpemF0aW9uRGV0YWlscyIsImFwcHJvdmVBdXRob3JpemF0aW9uIiwiZGVueUF1dGhvcml6YXRpb24iLCJsaXN0R3JhbnRzIiwicmV2b2tlR3JhbnQiLCJsb2NhbFN0b3JhZ2UiLCJCcm9hZGNhc3RDaGFubmVsIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/index.js":
/*!*************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/index.js ***!
\*************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthAdminApi: function() { return /* reexport safe */ _AuthAdminApi__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; },\n/* harmony export */ AuthApiError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthApiError; },\n/* harmony export */ AuthClient: function() { return /* reexport safe */ _AuthClient__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; },\n/* harmony export */ AuthError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthError; },\n/* harmony export */ AuthImplicitGrantRedirectError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthImplicitGrantRedirectError; },\n/* harmony export */ AuthInvalidCredentialsError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthInvalidCredentialsError; },\n/* harmony export */ AuthInvalidJwtError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthInvalidJwtError; },\n/* harmony export */ AuthInvalidTokenResponseError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthInvalidTokenResponseError; },\n/* harmony export */ AuthPKCECodeVerifierMissingError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthPKCECodeVerifierMissingError; },\n/* harmony export */ AuthPKCEGrantCodeExchangeError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthPKCEGrantCodeExchangeError; },\n/* harmony export */ AuthRetryableFetchError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthRetryableFetchError; },\n/* harmony export */ AuthSessionMissingError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthSessionMissingError; },\n/* harmony export */ AuthUnknownError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthUnknownError; },\n/* harmony export */ AuthWeakPasswordError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthWeakPasswordError; },\n/* harmony export */ CustomAuthError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.CustomAuthError; },\n/* harmony export */ GoTrueAdminApi: function() { return /* reexport safe */ _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; },\n/* harmony export */ GoTrueClient: function() { return /* reexport safe */ _GoTrueClient__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; },\n/* harmony export */ NavigatorLockAcquireTimeoutError: function() { return /* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.NavigatorLockAcquireTimeoutError; },\n/* harmony export */ SIGN_OUT_SCOPES: function() { return /* reexport safe */ _lib_types__WEBPACK_IMPORTED_MODULE_4__.SIGN_OUT_SCOPES; },\n/* harmony export */ isAuthApiError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthApiError; },\n/* harmony export */ isAuthError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthError; },\n/* harmony export */ isAuthImplicitGrantRedirectError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthImplicitGrantRedirectError; },\n/* harmony export */ isAuthPKCECodeVerifierMissingError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthPKCECodeVerifierMissingError; },\n/* harmony export */ isAuthRetryableFetchError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthRetryableFetchError; },\n/* harmony export */ isAuthSessionMissingError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthSessionMissingError; },\n/* harmony export */ isAuthWeakPasswordError: function() { return /* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthWeakPasswordError; },\n/* harmony export */ lockInternals: function() { return /* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.internals; },\n/* harmony export */ navigatorLock: function() { return /* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.navigatorLock; },\n/* harmony export */ processLock: function() { return /* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.processLock; }\n/* harmony export */ });\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n/* harmony import */ var _GoTrueClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./GoTrueClient */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\");\n/* harmony import */ var _AuthAdminApi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AuthAdminApi */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js\");\n/* harmony import */ var _AuthClient__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AuthClient */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js\");\n/* harmony import */ var _lib_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/types */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/types.js\");\n/* harmony import */ var _lib_errors__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib/errors */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _lib_locks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lib/locks */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js\");\n\n\n\n\n\n\n\n //# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBOEM7QUFDSjtBQUNBO0FBQ0o7QUFDNEI7QUFDdEM7QUFDQztBQUMyRixDQUN4SCxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2luZGV4LmpzPzU1MDgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEdvVHJ1ZUFkbWluQXBpIGZyb20gJy4vR29UcnVlQWRtaW5BcGknO1xuaW1wb3J0IEdvVHJ1ZUNsaWVudCBmcm9tICcuL0dvVHJ1ZUNsaWVudCc7XG5pbXBvcnQgQXV0aEFkbWluQXBpIGZyb20gJy4vQXV0aEFkbWluQXBpJztcbmltcG9ydCBBdXRoQ2xpZW50IGZyb20gJy4vQXV0aENsaWVudCc7XG5leHBvcnQgeyBHb1RydWVBZG1pbkFwaSwgR29UcnVlQ2xpZW50LCBBdXRoQWRtaW5BcGksIEF1dGhDbGllbnQgfTtcbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Vycm9ycyc7XG5leHBvcnQgeyBuYXZpZ2F0b3JMb2NrLCBOYXZpZ2F0b3JMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciwgaW50ZXJuYWxzIGFzIGxvY2tJbnRlcm5hbHMsIHByb2Nlc3NMb2NrLCB9IGZyb20gJy4vbGliL2xvY2tzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJuYW1lcyI6WyJHb1RydWVBZG1pbkFwaSIsIkdvVHJ1ZUNsaWVudCIsIkF1dGhBZG1pbkFwaSIsIkF1dGhDbGllbnQiLCJuYXZpZ2F0b3JMb2NrIiwiTmF2aWdhdG9yTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IiLCJpbnRlcm5hbHMiLCJsb2NrSW50ZXJuYWxzIiwicHJvY2Vzc0xvY2siXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/index.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js":
/*!*********************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/base64url.js ***!
\*********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ base64UrlToUint8Array: function() { return /* binding */ base64UrlToUint8Array; },\n/* harmony export */ byteFromBase64URL: function() { return /* binding */ byteFromBase64URL; },\n/* harmony export */ byteToBase64URL: function() { return /* binding */ byteToBase64URL; },\n/* harmony export */ bytesToBase64URL: function() { return /* binding */ bytesToBase64URL; },\n/* harmony export */ codepointToUTF8: function() { return /* binding */ codepointToUTF8; },\n/* harmony export */ stringFromBase64URL: function() { return /* binding */ stringFromBase64URL; },\n/* harmony export */ stringFromUTF8: function() { return /* binding */ stringFromUTF8; },\n/* harmony export */ stringToBase64URL: function() { return /* binding */ stringToBase64URL; },\n/* harmony export */ stringToUTF8: function() { return /* binding */ stringToUTF8; },\n/* harmony export */ stringToUint8Array: function() { return /* binding */ stringToUint8Array; }\n/* harmony export */ });\n/**\n * Avoid modifying this file. It's part of\n * https://github.com/supabase-community/base64url-js. Submit all fixes on\n * that repo!\n */ /**\n * An array of characters that encode 6 bits into a Base64-URL alphabet\n * character.\n */ const TO_BASE64URL = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\".split(\"\");\n/**\n * An array of characters that can appear in a Base64-URL encoded string but\n * should be ignored.\n */ const IGNORE_BASE64URL = \" \t\\n\\r=\".split(\"\");\n/**\n * An array of 128 numbers that map a Base64-URL character to 6 bits, or if -2\n * used to skip the character, or if -1 used to error out.\n */ const FROM_BASE64URL = (()=>{\n const charMap = new Array(128);\n for(let i = 0; i < charMap.length; i += 1){\n charMap[i] = -1;\n }\n for(let i = 0; i < IGNORE_BASE64URL.length; i += 1){\n charMap[IGNORE_BASE64URL[i].charCodeAt(0)] = -2;\n }\n for(let i = 0; i < TO_BASE64URL.length; i += 1){\n charMap[TO_BASE64URL[i].charCodeAt(0)] = i;\n }\n return charMap;\n})();\n/**\n * Converts a byte to a Base64-URL string.\n *\n * @param byte The byte to convert, or null to flush at the end of the byte sequence.\n * @param state The Base64 conversion state. Pass an initial value of `{ queue: 0, queuedBits: 0 }`.\n * @param emit A function called with the next Base64 character when ready.\n */ function byteToBase64URL(byte, state, emit) {\n if (byte !== null) {\n state.queue = state.queue << 8 | byte;\n state.queuedBits += 8;\n while(state.queuedBits >= 6){\n const pos = state.queue >> state.queuedBits - 6 & 63;\n emit(TO_BASE64URL[pos]);\n state.queuedBits -= 6;\n }\n } else if (state.queuedBits > 0) {\n state.queue = state.queue << 6 - state.queuedBits;\n state.queuedBits = 6;\n while(state.queuedBits >= 6){\n const pos = state.queue >> state.queuedBits - 6 & 63;\n emit(TO_BASE64URL[pos]);\n state.queuedBits -= 6;\n }\n }\n}\n/**\n * Converts a String char code (extracted using `string.charCodeAt(position)`) to a sequence of Base64-URL characters.\n *\n * @param charCode The char code of the JavaScript string.\n * @param state The Base64 state. Pass an initial value of `{ queue: 0, queuedBits: 0 }`.\n * @param emit A function called with the next byte.\n */ function byteFromBase64URL(charCode, state, emit) {\n const bits = FROM_BASE64URL[charCode];\n if (bits > -1) {\n // valid Base64-URL character\n state.queue = state.queue << 6 | bits;\n state.queuedBits += 6;\n while(state.queuedBits >= 8){\n emit(state.queue >> state.queuedBits - 8 & 0xff);\n state.queuedBits -= 8;\n }\n } else if (bits === -2) {\n // ignore spaces, tabs, newlines, =\n return;\n } else {\n throw new Error('Invalid Base64-URL character \"'.concat(String.fromCharCode(charCode), '\"'));\n }\n}\n/**\n * Converts a JavaScript string (which may include any valid character) into a\n * Base64-URL encoded string. The string is first encoded in UTF-8 which is\n * then encoded as Base64-URL.\n *\n * @param str The string to convert.\n */ function stringToBase64URL(str) {\n const base64 = [];\n const emitter = (char)=>{\n base64.push(char);\n };\n const state = {\n queue: 0,\n queuedBits: 0\n };\n stringToUTF8(str, (byte)=>{\n byteToBase64URL(byte, state, emitter);\n });\n byteToBase64URL(null, state, emitter);\n return base64.join(\"\");\n}\n/**\n * Converts a Base64-URL encoded string into a JavaScript string. It is assumed\n * that the underlying string has been encoded as UTF-8.\n *\n * @param str The Base64-URL encoded string.\n */ function stringFromBase64URL(str) {\n const conv = [];\n const utf8Emit = (codepoint)=>{\n conv.push(String.fromCodePoint(codepoint));\n };\n const utf8State = {\n utf8seq: 0,\n codepoint: 0\n };\n const b64State = {\n queue: 0,\n queuedBits: 0\n };\n const byteEmit = (byte)=>{\n stringFromUTF8(byte, utf8State, utf8Emit);\n };\n for(let i = 0; i < str.length; i += 1){\n byteFromBase64URL(str.charCodeAt(i), b64State, byteEmit);\n }\n return conv.join(\"\");\n}\n/**\n * Converts a Unicode codepoint to a multi-byte UTF-8 sequence.\n *\n * @param codepoint The Unicode codepoint.\n * @param emit Function which will be called for each UTF-8 byte that represents the codepoint.\n */ function codepointToUTF8(codepoint, emit) {\n if (codepoint <= 0x7f) {\n emit(codepoint);\n return;\n } else if (codepoint <= 0x7ff) {\n emit(0xc0 | codepoint >> 6);\n emit(0x80 | codepoint & 0x3f);\n return;\n } else if (codepoint <= 0xffff) {\n emit(0xe0 | codepoint >> 12);\n emit(0x80 | codepoint >> 6 & 0x3f);\n emit(0x80 | codepoint & 0x3f);\n return;\n } else if (codepoint <= 0x10ffff) {\n emit(0xf0 | codepoint >> 18);\n emit(0x80 | codepoint >> 12 & 0x3f);\n emit(0x80 | codepoint >> 6 & 0x3f);\n emit(0x80 | codepoint & 0x3f);\n return;\n }\n throw new Error(\"Unrecognized Unicode codepoint: \".concat(codepoint.toString(16)));\n}\n/**\n * Converts a JavaScript string to a sequence of UTF-8 bytes.\n *\n * @param str The string to convert to UTF-8.\n * @param emit Function which will be called for each UTF-8 byte of the string.\n */ function stringToUTF8(str, emit) {\n for(let i = 0; i < str.length; i += 1){\n let codepoint = str.charCodeAt(i);\n if (codepoint > 0xd7ff && codepoint <= 0xdbff) {\n // most UTF-16 codepoints are Unicode codepoints, except values in this\n // range where the next UTF-16 codepoint needs to be combined with the\n // current one to get the Unicode codepoint\n const highSurrogate = (codepoint - 0xd800) * 0x400 & 0xffff;\n const lowSurrogate = str.charCodeAt(i + 1) - 0xdc00 & 0xffff;\n codepoint = (lowSurrogate | highSurrogate) + 0x10000;\n i += 1;\n }\n codepointToUTF8(codepoint, emit);\n }\n}\n/**\n * Converts a UTF-8 byte to a Unicode codepoint.\n *\n * @param byte The UTF-8 byte next in the sequence.\n * @param state The shared state between consecutive UTF-8 bytes in the\n * sequence, an object with the shape `{ utf8seq: 0, codepoint: 0 }`.\n * @param emit Function which will be called for each codepoint.\n */ function stringFromUTF8(byte, state, emit) {\n if (state.utf8seq === 0) {\n if (byte <= 0x7f) {\n emit(byte);\n return;\n }\n // count the number of 1 leading bits until you reach 0\n for(let leadingBit = 1; leadingBit < 6; leadingBit += 1){\n if ((byte >> 7 - leadingBit & 1) === 0) {\n state.utf8seq = leadingBit;\n break;\n }\n }\n if (state.utf8seq === 2) {\n state.codepoint = byte & 31;\n } else if (state.utf8seq === 3) {\n state.codepoint = byte & 15;\n } else if (state.utf8seq === 4) {\n state.codepoint = byte & 7;\n } else {\n throw new Error(\"Invalid UTF-8 sequence\");\n }\n state.utf8seq -= 1;\n } else if (state.utf8seq > 0) {\n if (byte <= 0x7f) {\n throw new Error(\"Invalid UTF-8 sequence\");\n }\n state.codepoint = state.codepoint << 6 | byte & 63;\n state.utf8seq -= 1;\n if (state.utf8seq === 0) {\n emit(state.codepoint);\n }\n }\n}\n/**\n * Helper functions to convert different types of strings to Uint8Array\n */ function base64UrlToUint8Array(str) {\n const result = [];\n const state = {\n queue: 0,\n queuedBits: 0\n };\n const onByte = (byte)=>{\n result.push(byte);\n };\n for(let i = 0; i < str.length; i += 1){\n byteFromBase64URL(str.charCodeAt(i), state, onByte);\n }\n return new Uint8Array(result);\n}\nfunction stringToUint8Array(str) {\n const result = [];\n stringToUTF8(str, (byte)=>result.push(byte));\n return new Uint8Array(result);\n}\nfunction bytesToBase64URL(bytes) {\n const result = [];\n const state = {\n queue: 0,\n queuedBits: 0\n };\n const onChar = (char)=>{\n result.push(char);\n };\n bytes.forEach((byte)=>byteToBase64URL(byte, state, onChar));\n // always call with `null` after processing all bytes\n byteToBase64URL(null, state, onChar);\n return result.join(\"\");\n} //# sourceMappingURL=base64url.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvYmFzZTY0dXJsLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztDQUlDLEdBQ0Q7OztDQUdDLEdBQ0QsTUFBTUEsZUFBZSxtRUFBbUVDLEtBQUssQ0FBQztBQUM5Rjs7O0NBR0MsR0FDRCxNQUFNQyxtQkFBbUIsVUFBV0QsS0FBSyxDQUFDO0FBQzFDOzs7Q0FHQyxHQUNELE1BQU1FLGlCQUFpQixDQUFDO0lBQ3BCLE1BQU1DLFVBQVUsSUFBSUMsTUFBTTtJQUMxQixJQUFLLElBQUlDLElBQUksR0FBR0EsSUFBSUYsUUFBUUcsTUFBTSxFQUFFRCxLQUFLLEVBQUc7UUFDeENGLE9BQU8sQ0FBQ0UsRUFBRSxHQUFHLENBQUM7SUFDbEI7SUFDQSxJQUFLLElBQUlBLElBQUksR0FBR0EsSUFBSUosaUJBQWlCSyxNQUFNLEVBQUVELEtBQUssRUFBRztRQUNqREYsT0FBTyxDQUFDRixnQkFBZ0IsQ0FBQ0ksRUFBRSxDQUFDRSxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDbEQ7SUFDQSxJQUFLLElBQUlGLElBQUksR0FBR0EsSUFBSU4sYUFBYU8sTUFBTSxFQUFFRCxLQUFLLEVBQUc7UUFDN0NGLE9BQU8sQ0FBQ0osWUFBWSxDQUFDTSxFQUFFLENBQUNFLFVBQVUsQ0FBQyxHQUFHLEdBQUdGO0lBQzdDO0lBQ0EsT0FBT0Y7QUFDWDtBQUNBOzs7Ozs7Q0FNQyxHQUNNLFNBQVNLLGdCQUFnQkMsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLElBQUk7SUFDN0MsSUFBSUYsU0FBUyxNQUFNO1FBQ2ZDLE1BQU1FLEtBQUssR0FBRyxNQUFPQSxLQUFLLElBQUksSUFBS0g7UUFDbkNDLE1BQU1HLFVBQVUsSUFBSTtRQUNwQixNQUFPSCxNQUFNRyxVQUFVLElBQUksRUFBRztZQUMxQixNQUFNQyxNQUFNLE1BQU9GLEtBQUssSUFBS0YsTUFBTUcs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QVNJLGlCQUFpQkMsS0FBSztJQUNsQyxNQUFNTCxTQUFTLEVBQUU7SUFDakIsTUFBTW5DLFFBQVE7UUFBRUUsT0FBTztRQUFHQyxZQUFZO0lBQUU7SUFDeEMsTUFBTXNDLFNBQVMsQ0FBQzFCO1FBQ1pvQixPQUFPbkIsSUFBSSxDQUFDRDtJQUNoQjtJQUNBeUIsTUFBTUUsT0FBTyxDQUFDLENBQUMzQyxPQUFTRCxnQkFBZ0JDLE1BQU1DLE9BQU95QztJQUNyRCxxREFBcUQ7SUFDckQzQyxnQkFBZ0IsTUFBTUUsT0FBT3lDO0lBQzdCLE9BQU9OLE9BQU9qQixJQUFJLENBQUM7QUFDdkIsRUFDQSxxQ0FBcUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi9iYXNlNjR1cmwuanM/MTVkZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF2b2lkIG1vZGlmeWluZyB0aGlzIGZpbGUuIEl0J3MgcGFydCBvZlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N1cGFiYXNlLWNvbW11bml0eS9iYXNlNjR1cmwtanMuICBTdWJtaXQgYWxsIGZpeGVzIG9uXG4gKiB0aGF0IHJlcG8hXG4gKi9cbi8qKlxuICogQW4gYXJyYXkgb2YgY2hhcmFjdGVycyB0aGF0IGVuY29kZSA2IGJpdHMgaW50byBhIEJhc2U2NC1VUkwgYWxwaGFiZXRcbiAqIGNoYXJhY3Rlci5cbiAqL1xuY29uc3QgVE9fQkFTRTY0VVJMID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV8nLnNwbGl0KCcnKTtcbi8qKlxuICogQW4gYXJyYXkgb2YgY2hhcmFjdGVycyB0aGF0IGNhbiBhcHBlYXIgaW4gYSBCYXNlNjQtVVJMIGVuY29kZWQgc3RyaW5nIGJ1dFxuICogc2hvdWxkIGJlIGlnbm9yZWQuXG4gKi9cbmNvbnN0IElHTk9SRV9CQVNFNjRVUkwgPSAnIFxcdFxcblxccj0nLnNwbGl0KCcnKTtcbi8qKlxuICogQW4gYXJyYXkgb2YgMTI4IG51bWJlcnMgdGhhdCBtYXAgYSBCYXNlNjQtVVJMIGNoYXJhY3RlciB0byA2IGJpdHMsIG9yIGlmIC0yXG4gKiB1c2VkIHRvIHNraXAgdGhlIGNoYXJhY3Rlciwgb3IgaWYgLTEgdXNlZCB0byBlcnJvciBvdXQuXG4gKi9cbmNvbnN0IEZST01fQkFTRTY0VVJMID0gKCgpID0+IHtcbiAgICBjb25zdCBjaGFyTWFwID0gbmV3IEFycmF5KDEyOCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyTWFwLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNoYXJNYXBbaV0gPSAtMTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBJR05PUkVfQkFTRTY0VVJMLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNoYXJNYXBbSUdOT1JFX0JBU0U2NFVSTFtpXS5jaGFyQ29kZUF0KDApXSA9IC0yO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRPX0JBU0U2NFVSTC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjaGFyTWFwW1RPX0JBU0U2NFVSTFtpXS5jaGFyQ29kZUF0KDApXSA9IGk7XG4gICAgfVxuICAgIHJldHVybiBjaGFyTWFwO1xufSkoKTtcbi8qKlxuICogQ29udmVydHMgYSBieXRlIHRvIGEgQmFzZTY0LVVSTCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGJ5dGUgVGhlIGJ5dGUgdG8gY29udmVydCwgb3IgbnVsbCB0byBmbHVzaCBhdCB0aGUgZW5kIG9mIHRoZSBieXRlIHNlcXVlbmNlLlxuICogQHBhcmFtIHN0YXRlIFRoZSBCYXNlNjQgY29udmVyc2lvbiBzdGF0ZS4gUGFzcyBhbiBpbml0aWFsIHZhbHVlIG9mIGB7IHF1ZXVlOiAwLCBxdWV1ZWRCaXRzOiAwIH1gLlxuICogQHBhcmFtIGVtaXQgQSBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgbmV4dCBCYXNlNjQgY2hhcmFjdGVyIHdoZW4gcmVhZHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlVG9CYXNlNjRVUkwoYnl0ZSwgc3RhdGUsIGVtaXQpIHtcbiAgICBpZiAoYnl0ZSAhPT0gbnVsbCkge1xuICAgICAgICBzdGF0ZS5xdWV1ZSA9IChzdGF0ZS5xdWV1ZSA8PCA4KSB8IGJ5dGU7XG4gICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgKz0gODtcbiAgICAgICAgd2hpbGUgKHN0YXRlLnF1ZXVlZEJpdHMgPj0gNikge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gKHN0YXRlLnF1ZXVlID4+IChzdGF0ZS5xdWV1ZWRCaXRzIC0gNikpICYgNjM7XG4gICAgICAgICAgICBlbWl0KFRPX0JBU0U2NFVSTFtwb3NdKTtcbiAgICAgICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgLT0gNjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzdGF0ZS5xdWV1ZWRCaXRzID4gMCkge1xuICAgICAgICBzdGF0ZS5xdWV1ZSA9IHN0YXRlLnF1ZXVlIDw8ICg2IC0gc3RhdGUucXVldWVkQml0cyk7XG4gICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgPSA2O1xuICAgICAgICB3aGlsZSAoc3RhdGUucXVldWVkQml0cyA+PSA2KSB7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSAoc3RhdGUucXVldWUgPj4gKHN0YXRlLnF1ZXVlZEJpdHMgLSA2KSkgJiA2MztcbiAgICAgICAgICAgIGVtaXQoVE9fQkFTRTY0VVJMW3Bvc10pO1xuICAgICAgICAgICAgc3RhdGUucXVldWVkQml0cyAtPSA2O1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBDb252ZXJ0cyBhIFN0cmluZyBjaGFyIGNvZGUgKGV4dHJhY3RlZCB1c2luZyBgc3RyaW5nLmNoYXJDb2RlQXQocG9zaXRpb24pYCkgdG8gYSBzZXF1ZW5jZSBvZiBCYXNlNjQtVVJMIGNoYXJhY3RlcnMuXG4gKlxuICogQHBhcmFtIGNoYXJDb2RlIFRoZSBjaGFyIGNvZGUgb2YgdGhlIEphdmFTY3JpcHQgc3RyaW5nLlxuICogQHBhcmFtIHN0YXRlIFRoZSBCYXNlNjQgc3RhdGUuIFBhc3MgYW4gaW5pdGlhbCB2YWx1ZSBvZiBgeyBxdWV1ZTogMCwgcXVldWVkQml0czogMCB9YC5cbiAqIEBwYXJhbSBlbWl0IEEgZnVuY3Rpb24gY2FsbGVkIHdpdGggdGhlIG5leHQgYnl0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVGcm9tQmFzZTY0VVJMKGNoYXJDb2RlLCBzdGF0ZSwgZW1pdCkge1xuICAgIGNvbnN0IGJpdHMgPSBGUk9NX0JBU0U2NFVSTFtjaGFyQ29kZV07XG4gICAgaWYgKGJpdHMgPiAtMSkge1xuICAgICAgICAvLyB2YWxpZCBCYXNlNjQtVVJMIGNoYXJhY3RlclxuICAgICAgICBzdGF0ZS5xdWV1ZSA9IChzdGF0ZS5xdWV1ZSA8PCA2KSB8IGJpdHM7XG4gICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgKz0gNjtcbiAgICAgICAgd2hpbGUgKHN0YXRlLnF1ZXVlZEJpdHMgPj0gOCkge1xuICAgICAgICAgICAgZW1pdCgoc3RhdGUucXVldWUgPj4gKHN0YXRlLnF1ZXVlZEJpdHMgLSA4KSkgJiAweGZmKTtcbiAgICAgICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgLT0gODtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChiaXRzID09PSAtMikge1xuICAgICAgICAvLyBpZ25vcmUgc3BhY2VzLCB0YWJzLCBuZXdsaW5lcywgPVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgQmFzZTY0LVVSTCBjaGFyYWN0ZXIgXCIke1N0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpfVwiYCk7XG4gICAgfVxufVxuLyoqXG4gKiBDb252ZXJ0cyBhIEphdmFTY3JpcHQgc3RyaW5nICh3aGljaCBtYXkgaW5jbHVkZSBhbnkgdmFsaWQgY2hhcmFjdGVyKSBpbnRvIGFcbiAqIEJhc2U2NC1VUkwgZW5jb2RlZCBzdHJpbmcuIFRoZSBzdHJpbmcgaXMgZmlyc3QgZW5jb2RlZCBpbiBVVEYtOCB3aGljaCBpc1xuICogdGhlbiBlbmNvZGVkIGFzIEJhc2U2NC1VUkwuXG4gKlxuICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb0Jhc2U2NFVSTChzdHIpIHtcbiAgICBjb25zdCBiYXNlNjQgPSBbXTtcbiAgICBjb25zdCBlbWl0dGVyID0gKGNoYXIpID0+IHtcbiAgICAgICAgYmFzZTY0LnB1c2goY2hhcik7XG4gICAgfTtcbiAgICBjb25zdCBzdGF0ZSA9IHsgcXVldWU6IDAsIHF1ZXVlZEJpdHM6IDAgfTtcbiAgICBzdHJpbmdUb1VURjgoc3RyLCAoYnl0ZSkgPT4ge1xuICAgICAgICBieXRlVG9CYXNlNjRVUkwoYnl0ZSwgc3RhdGUsIGVtaXR0ZXIpO1xuICAgIH0pO1xuICAgIGJ5dGVUb0Jhc2U2NFVSTChudWxsLCBzdGF0ZSwgZW1pdHRlcik7XG4gICAgcmV0dXJuIGJhc2U2NC5qb2luKCcnKTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBCYXNlNjQtVVJMIGVuY29kZWQgc3RyaW5nIGludG8gYSBKYXZhU2NyaXB0IHN0cmluZy4gSXQgaXMgYXNzdW1lZFxuICogdGhhdCB0aGUgdW5kZXJseWluZyBzdHJpbmcgaGFzIGJlZW4gZW5jb2RlZCBhcyBVVEYtOC5cbiAqXG4gKiBAcGFyYW0gc3RyIFRoZSBCYXNlNjQtVVJMIGVuY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRnJvbUJhc2U2NFVSTChzdHIpIHtcbiAgICBjb25zdCBjb252ID0gW107XG4gICAgY29uc3QgdXRmOEVtaXQgPSAoY29kZXBvaW50KSA9PiB7XG4gICAgICAgIGNvbnYucHVzaChTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlcG9pbnQpKTtcbiAgICB9O1xuICAgIGNvbnN0IHV0ZjhTdGF0ZSA9IHtcbiAgICAgICAgdXRmOHNlcTogMCxcbiAgICAgICAgY29kZXBvaW50OiAwLFxuICAgIH07XG4gICAgY29uc3QgYjY0U3RhdGUgPSB7IHF1ZXVlOiAwLCBxdWV1ZWRCaXRzOiAwIH07XG4gICAgY29uc3QgYnl0ZUVtaXQgPSAoYnl0ZSkgPT4ge1xuICAgICAgICBzdHJpbmdGcm9tVVRGOChieXRlLCB1dGY4U3RhdGUsIHV0ZjhFbWl0KTtcbiAgICB9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGJ5dGVGcm9tQmFzZTY0VVJMKHN0ci5jaGFyQ29kZUF0KGkpLCBiNjRTdGF0ZSwgYnl0ZUVtaXQpO1xuICAgIH1cbiAgICByZXR1cm4gY29udi5qb2luKCcnKTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBVbmljb2RlIGNvZGVwb2ludCB0byBhIG11bHRpLWJ5dGUgVVRGLTggc2VxdWVuY2UuXG4gKlxuICogQHBhcmFtIGNvZGVwb2ludCBUaGUgVW5pY29kZSBjb2RlcG9pbnQuXG4gKiBAcGFyYW0gZW1pdCAgICAgIEZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIFVURi04IGJ5dGUgdGhhdCByZXByZXNlbnRzIHRoZSBjb2RlcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2RlcG9pbnRUb1VURjgoY29kZXBvaW50LCBlbWl0KSB7XG4gICAgaWYgKGNvZGVwb2ludCA8PSAweDdmKSB7XG4gICAgICAgIGVtaXQoY29kZXBvaW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHg3ZmYpIHtcbiAgICAgICAgZW1pdCgweGMwIHwgKGNvZGVwb2ludCA+PiA2KSk7XG4gICAgICAgIGVtaXQoMHg4MCB8IChjb2RlcG9pbnQgJiAweDNmKSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4ZmZmZikge1xuICAgICAgICBlbWl0KDB4ZTAgfCAoY29kZXBvaW50ID4+IDEyKSk7XG4gICAgICAgIGVtaXQoMHg4MCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHgzZikpO1xuICAgICAgICBlbWl0KDB4ODAgfCAoY29kZXBvaW50ICYgMHgzZikpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweDEwZmZmZikge1xuICAgICAgICBlbWl0KDB4ZjAgfCAoY29kZXBvaW50ID4+IDE4KSk7XG4gICAgICAgIGVtaXQoMHg4MCB8ICgoY29kZXBvaW50ID4+IDEyKSAmIDB4M2YpKTtcbiAgICAgICAgZW1pdCgweDgwIHwgKChjb2RlcG9pbnQgPj4gNikgJiAweDNmKSk7XG4gICAgICAgIGVtaXQoMHg4MCB8IChjb2RlcG9pbnQgJiAweDNmKSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgVW5pY29kZSBjb2RlcG9pbnQ6ICR7Y29kZXBvaW50LnRvU3RyaW5nKDE2KX1gKTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBKYXZhU2NyaXB0IHN0cmluZyB0byBhIHNlcXVlbmNlIG9mIFVURi04IGJ5dGVzLlxuICpcbiAqIEBwYXJhbSBzdHIgIFRoZSBzdHJpbmcgdG8gY29udmVydCB0byBVVEYtOC5cbiAqIEBwYXJhbSBlbWl0IEZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIFVURi04IGJ5dGUgb2YgdGhlIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvVVRGOChzdHIsIGVtaXQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBsZXQgY29kZXBvaW50ID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjb2RlcG9pbnQgPiAweGQ3ZmYgJiYgY29kZXBvaW50IDw9IDB4ZGJmZikge1xuICAgICAgICAgICAgLy8gbW9zdCBVVEYtMTYgY29kZXBvaW50cyBhcmUgVW5pY29kZSBjb2RlcG9pbnRzLCBleGNlcHQgdmFsdWVzIGluIHRoaXNcbiAgICAgICAgICAgIC8vIHJhbmdlIHdoZXJlIHRoZSBuZXh0IFVURi0xNiBjb2RlcG9pbnQgbmVlZHMgdG8gYmUgY29tYmluZWQgd2l0aCB0aGVcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgb25lIHRvIGdldCB0aGUgVW5pY29kZSBjb2RlcG9pbnRcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hTdXJyb2dhdGUgPSAoKGNvZGVwb2ludCAtIDB4ZDgwMCkgKiAweDQwMCkgJiAweGZmZmY7XG4gICAgICAgICAgICBjb25zdCBsb3dTdXJyb2dhdGUgPSAoc3RyLmNoYXJDb2RlQXQoaSArIDEpIC0gMHhkYzAwKSAmIDB4ZmZmZjtcbiAgICAgICAgICAgIGNvZGVwb2ludCA9IChsb3dTdXJyb2dhdGUgfCBoaWdoU3Vycm9nYXRlKSArIDB4MTAwMDA7XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgY29kZXBvaW50VG9VVEY4KGNvZGVwb2ludCwgZW1pdCk7XG4gICAgfVxufVxuLyoqXG4gKiBDb252ZXJ0cyBhIFVURi04IGJ5dGUgdG8gYSBVbmljb2RlIGNvZGVwb2ludC5cbiAqXG4gKiBAcGFyYW0gYnl0ZSAgVGhlIFVURi04IGJ5dGUgbmV4dCBpbiB0aGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0gc3RhdGUgVGhlIHNoYXJlZCBzdGF0ZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIFVURi04IGJ5dGVzIGluIHRoZVxuICogICAgICAgICAgICAgIHNlcXVlbmNlLCBhbiBvYmplY3Qgd2l0aCB0aGUgc2hhcGUgYHsgdXRmOHNlcTogMCwgY29kZXBvaW50OiAwIH1gLlxuICogQHBhcmFtIGVtaXQgIEZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGNvZGVwb2ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0Zyb21VVEY4KGJ5dGUsIHN0YXRlLCBlbWl0KSB7XG4gICAgaWYgKHN0YXRlLnV0ZjhzZXEgPT09IDApIHtcbiAgICAgICAgaWYgKGJ5dGUgPD0gMHg3Zikge1xuICAgICAgICAgICAgZW1pdChieXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb3VudCB0aGUgbnVtYmVyIG9mIDEgbGVhZGluZyBiaXRzIHVudGlsIHlvdSByZWFjaCAwXG4gICAgICAgIGZvciAobGV0IGxlYWRpbmdCaXQgPSAxOyBsZWFkaW5nQml0IDwgNjsgbGVhZGluZ0JpdCArPSAxKSB7XG4gICAgICAgICAgICBpZiAoKChieXRlID4+ICg3IC0gbGVhZGluZ0JpdCkpICYgMSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS51dGY4c2VxID0gbGVhZGluZ0JpdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUudXRmOHNlcSA9PT0gMikge1xuICAgICAgICAgICAgc3RhdGUuY29kZXBvaW50ID0gYnl0ZSAmIDMxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLnV0ZjhzZXEgPT09IDMpIHtcbiAgICAgICAgICAgIHN0YXRlLmNvZGVwb2ludCA9IGJ5dGUgJiAxNTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS51dGY4c2VxID09PSA0KSB7XG4gICAgICAgICAgICBzdGF0ZS5jb2RlcG9pbnQgPSBieXRlICYgNztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBVVEYtOCBzZXF1ZW5jZScpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnV0ZjhzZXEgLT0gMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc3RhdGUudXRmOHNlcSA+IDApIHtcbiAgICAgICAgaWYgKGJ5dGUgPD0gMHg3Zikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFVURi04IHNlcXVlbmNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuY29kZXBvaW50ID0gKHN0YXRlLmNvZGVwb2ludCA8PCA2KSB8IChieXRlICYgNjMpO1xuICAgICAgICBzdGF0ZS51dGY4c2VxIC09IDE7XG4gICAgICAgIGlmIChzdGF0ZS51dGY4c2VxID09PSAwKSB7XG4gICAgICAgICAgICBlbWl0KHN0YXRlLmNvZGVwb2ludCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgdG8gY29udmVydCBkaWZmZXJlbnQgdHlwZXMgb2Ygc3RyaW5ncyB0byBVaW50OEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRVcmxUb1VpbnQ4QXJyYXkoc3RyKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3Qgc3RhdGUgPSB7IHF1ZXVlOiAwLCBxdWV1ZWRCaXRzOiAwIH07XG4gICAgY29uc3Qgb25CeXRlID0gKGJ5dGUpID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2goYnl0ZSk7XG4gICAgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBieXRlRnJvbUJhc2U2NFVSTChzdHIuY2hhckNvZGVBdChpKSwgc3RhdGUsIG9uQnl0ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZXN1bHQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvVWludDhBcnJheShzdHIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBzdHJpbmdUb1VURjgoc3RyLCAoYnl0ZSkgPT4gcmVzdWx0LnB1c2goYnl0ZSkpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZXN1bHQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9CYXNlNjRVUkwoYnl0ZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBzdGF0ZSA9IHsgcXVldWU6IDAsIHF1ZXVlZEJpdHM6IDAgfTtcbiAgICBjb25zdCBvbkNoYXIgPSAoY2hhcikgPT4ge1xuICAgICAgICByZXN1bHQucHVzaChjaGFyKTtcbiAgICB9O1xuICAgIGJ5dGVzLmZvckVhY2goKGJ5dGUpID0+IGJ5dGVUb0Jhc2U2NFVSTChieXRlLCBzdGF0ZSwgb25DaGFyKSk7XG4gICAgLy8gYWx3YXlzIGNhbGwgd2l0aCBgbnVsbGAgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgYnl0ZXNcbiAgICBieXRlVG9CYXNlNjRVUkwobnVsbCwgc3RhdGUsIG9uQ2hhcik7XG4gICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2U2NHVybC5qcy5tYXAiXSwibmFtZXMiOlsiVE9fQkFTRTY0VVJMIiwic3BsaXQiLCJJR05PUkVfQkFTRTY0VVJMIiwiRlJPTV9CQVNFNjRVUkwiLCJjaGFyTWFwIiwiQXJyYXkiLCJpIiwibGVuZ3RoIiwiY2hhckNvZGVBdCIsImJ5dGVUb0Jhc2U2NFVSTCIsImJ5dGUiLCJzdGF0ZSIsImVtaXQiLCJxdWV1ZSIsInF1ZXVlZEJpdHMiLCJwb3MiLCJieXRlRnJvbUJhc2U2NFVSTCIsImNoYXJDb2RlIiwiYml0cyIsIkVycm9yIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwic3RyaW5nVG9CYXNlNjRVUkwiLCJzdHIiLCJiYXNlNjQiLCJlbWl0dGVyIiwiY2hhciIsInB1c2giLCJzdHJpbmdUb1VURjgiLCJqb2luIiwic3RyaW5nRnJvbUJhc2U2NFVSTCIsImNvbnYiLCJ1dGY4RW1pdCIsImNvZGVwb2ludCIsImZyb21Db2RlUG9pbnQiLCJ1dGY4U3RhdGUiLCJ1dGY4c2VxIiwiYjY0U3RhdGUiLCJieXRlRW1pdCIsInN0cmluZ0Zyb21VVEY4IiwiY29kZXBvaW50VG9VVEY4IiwidG9TdHJpbmciLCJoaWdoU3Vycm9nYXRlIiwibG93U3Vycm9nYXRlIiwibGVhZGluZ0JpdCIsImJhc2U2NFVybFRvVWludDhBcnJheSIsInJlc3VsdCIsIm9uQnl0ZSIsIlVpbnQ4QXJyYXkiLCJzdHJpbmdUb1VpbnQ4QXJyYXkiLCJieXRlc1RvQmFzZTY0VVJMIiwiYnl0ZXMiLCJvbkNoYXIiLCJmb3JFYWNoIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js":
/*!*********************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/constants.js ***!
\*********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ API_VERSIONS: function() { return /* binding */ API_VERSIONS; },\n/* harmony export */ API_VERSION_HEADER_NAME: function() { return /* binding */ API_VERSION_HEADER_NAME; },\n/* harmony export */ AUDIENCE: function() { return /* binding */ AUDIENCE; },\n/* harmony export */ AUTO_REFRESH_TICK_DURATION_MS: function() { return /* binding */ AUTO_REFRESH_TICK_DURATION_MS; },\n/* harmony export */ AUTO_REFRESH_TICK_THRESHOLD: function() { return /* binding */ AUTO_REFRESH_TICK_THRESHOLD; },\n/* harmony export */ BASE64URL_REGEX: function() { return /* binding */ BASE64URL_REGEX; },\n/* harmony export */ DEFAULT_HEADERS: function() { return /* binding */ DEFAULT_HEADERS; },\n/* harmony export */ EXPIRY_MARGIN_MS: function() { return /* binding */ EXPIRY_MARGIN_MS; },\n/* harmony export */ GOTRUE_URL: function() { return /* binding */ GOTRUE_URL; },\n/* harmony export */ JWKS_TTL: function() { return /* binding */ JWKS_TTL; },\n/* harmony export */ NETWORK_FAILURE: function() { return /* binding */ NETWORK_FAILURE; },\n/* harmony export */ STORAGE_KEY: function() { return /* binding */ STORAGE_KEY; }\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./version */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/version.js\");\n\n/** Current session will be checked for refresh at this interval. */ const AUTO_REFRESH_TICK_DURATION_MS = 30 * 1000;\n/**\n * A token refresh will be attempted this many ticks before the current session expires. */ const AUTO_REFRESH_TICK_THRESHOLD = 3;\n/*\n * Earliest time before an access token expires that the session should be refreshed.\n */ const EXPIRY_MARGIN_MS = AUTO_REFRESH_TICK_THRESHOLD * AUTO_REFRESH_TICK_DURATION_MS;\nconst GOTRUE_URL = \"http://localhost:9999\";\nconst STORAGE_KEY = \"supabase.auth.token\";\nconst AUDIENCE = \"\";\nconst DEFAULT_HEADERS = {\n \"X-Client-Info\": \"gotrue-js/\".concat(_version__WEBPACK_IMPORTED_MODULE_0__.version)\n};\nconst NETWORK_FAILURE = {\n MAX_RETRIES: 10,\n RETRY_INTERVAL: 2\n};\nconst API_VERSION_HEADER_NAME = \"X-Supabase-Api-Version\";\nconst API_VERSIONS = {\n \"2024-01-01\": {\n timestamp: Date.parse(\"2024-01-01T00:00:00.0Z\"),\n name: \"2024-01-01\"\n }\n};\nconst BASE64URL_REGEX = /^([a-z0-9_-]{4})*($|[a-z0-9_-]{3}$|[a-z0-9_-]{2}$)$/i;\nconst JWKS_TTL = 10 * 60 * 1000; // 10 minutes\n //# sourceMappingURL=constants.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvY29uc3RhbnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBb0M7QUFDcEMsa0VBQWtFLEdBQzNELE1BQU1DLGdDQUFnQyxLQUFLLEtBQUs7QUFDdkQ7eUZBQ3lGLEdBQ2xGLE1BQU1DLDhCQUE4QixFQUFFO0FBQzdDOztDQUVDLEdBQ00sTUFBTUMsbUJBQW1CRCw4QkFBOEJELDhCQUE4QjtBQUNyRixNQUFNRyxhQUFhLHdCQUF3QjtBQUMzQyxNQUFNQyxjQUFjLHNCQUFzQjtBQUMxQyxNQUFNQyxXQUFXLEdBQUc7QUFDcEIsTUFBTUMsa0JBQWtCO0lBQUUsaUJBQWlCLGFBQXFCLE9BQVJQLDZDQUFPQTtBQUFHLEVBQUU7QUFDcEUsTUFBTVEsa0JBQWtCO0lBQzNCQyxhQUFhO0lBQ2JDLGdCQUFnQjtBQUNwQixFQUFFO0FBQ0ssTUFBTUMsMEJBQTBCLHlCQUF5QjtBQUN6RCxNQUFNQyxlQUFlO0lBQ3hCLGNBQWM7UUFDVkMsV0FBV0MsS0FBS0MsS0FBSyxDQUFDO1FBQ3RCQyxNQUFNO0lBQ1Y7QUFDSixFQUFFO0FBQ0ssTUFBTUMsa0JBQWtCLHVEQUF1RDtBQUMvRSxNQUFNQyxXQUFXLEtBQUssS0FBSyxLQUFLLENBQUMsYUFBYTtDQUNyRCxxQ0FBcUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi9jb25zdGFudHMuanM/ZjA0OCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcbi8qKiBDdXJyZW50IHNlc3Npb24gd2lsbCBiZSBjaGVja2VkIGZvciByZWZyZXNoIGF0IHRoaXMgaW50ZXJ2YWwuICovXG5leHBvcnQgY29uc3QgQVVUT19SRUZSRVNIX1RJQ0tfRFVSQVRJT05fTVMgPSAzMCAqIDEwMDA7XG4vKipcbiAqIEEgdG9rZW4gcmVmcmVzaCB3aWxsIGJlIGF0dGVtcHRlZCB0aGlzIG1hbnkgdGlja3MgYmVmb3JlIHRoZSBjdXJyZW50IHNlc3Npb24gZXhwaXJlcy4gKi9cbmV4cG9ydCBjb25zdCBBVVRPX1JFRlJFU0hfVElDS19USFJFU0hPTEQgPSAzO1xuLypcbiAqIEVhcmxpZXN0IHRpbWUgYmVmb3JlIGFuIGFjY2VzcyB0b2tlbiBleHBpcmVzIHRoYXQgdGhlIHNlc3Npb24gc2hvdWxkIGJlIHJlZnJlc2hlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVYUElSWV9NQVJHSU5fTVMgPSBBVVRPX1JFRlJFU0hfVElDS19USFJFU0hPTEQgKiBBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUztcbmV4cG9ydCBjb25zdCBHT1RSVUVfVVJMID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6OTk5OSc7XG5leHBvcnQgY29uc3QgU1RPUkFHRV9LRVkgPSAnc3VwYWJhc2UuYXV0aC50b2tlbic7XG5leHBvcnQgY29uc3QgQVVESUVOQ0UgPSAnJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX0hFQURFUlMgPSB7ICdYLUNsaWVudC1JbmZvJzogYGdvdHJ1ZS1qcy8ke3ZlcnNpb259YCB9O1xuZXhwb3J0IGNvbnN0IE5FVFdPUktfRkFJTFVSRSA9IHtcbiAgICBNQVhfUkVUUklFUzogMTAsXG4gICAgUkVUUllfSU5URVJWQUw6IDIsIC8vIGluIGRlY2lzZWNvbmRzXG59O1xuZXhwb3J0IGNvbnN0IEFQSV9WRVJTSU9OX0hFQURFUl9OQU1FID0gJ1gtU3VwYWJhc2UtQXBpLVZlcnNpb24nO1xuZXhwb3J0IGNvbnN0IEFQSV9WRVJTSU9OUyA9IHtcbiAgICAnMjAyNC0wMS0wMSc6IHtcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLnBhcnNlKCcyMDI0LTAxLTAxVDAwOjAwOjAwLjBaJyksXG4gICAgICAgIG5hbWU6ICcyMDI0LTAxLTAxJyxcbiAgICB9LFxufTtcbmV4cG9ydCBjb25zdCBCQVNFNjRVUkxfUkVHRVggPSAvXihbYS16MC05Xy1dezR9KSooJHxbYS16MC05Xy1dezN9JHxbYS16MC05Xy1dezJ9JCkkL2k7XG5leHBvcnQgY29uc3QgSldLU19UVEwgPSAxMCAqIDYwICogMTAwMDsgLy8gMTAgbWludXRlc1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCJdLCJuYW1lcyI6WyJ2ZXJzaW9uIiwiQVVUT19SRUZSRVNIX1RJQ0tfRFVSQVRJT05fTVMiLCJBVVRPX1JFRlJFU0hfVElDS19USFJFU0hPTEQiLCJFWFBJUllfTUFSR0lOX01TIiwiR09UUlVFX1VSTCIsIlNUT1JBR0VfS0VZIiwiQVVESUVOQ0UiLCJERUZBVUxUX0hFQURFUlMiLCJORVRXT1JLX0ZBSUxVUkUiLCJNQVhfUkVUUklFUyIsIlJFVFJZX0lOVEVSVkFMIiwiQVBJX1ZFUlNJT05fSEVBREVSX05BTUUiLCJBUElfVkVSU0lPTlMiLCJ0aW1lc3RhbXAiLCJEYXRlIiwicGFyc2UiLCJuYW1lIiwiQkFTRTY0VVJMX1JFR0VYIiwiSldLU19UVEwiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js":
/*!******************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/errors.js ***!
\******************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthApiError: function() { return /* binding */ AuthApiError; },\n/* harmony export */ AuthError: function() { return /* binding */ AuthError; },\n/* harmony export */ AuthImplicitGrantRedirectError: function() { return /* binding */ AuthImplicitGrantRedirectError; },\n/* harmony export */ AuthInvalidCredentialsError: function() { return /* binding */ AuthInvalidCredentialsError; },\n/* harmony export */ AuthInvalidJwtError: function() { return /* binding */ AuthInvalidJwtError; },\n/* harmony export */ AuthInvalidTokenResponseError: function() { return /* binding */ AuthInvalidTokenResponseError; },\n/* harmony export */ AuthPKCECodeVerifierMissingError: function() { return /* binding */ AuthPKCECodeVerifierMissingError; },\n/* harmony export */ AuthPKCEGrantCodeExchangeError: function() { return /* binding */ AuthPKCEGrantCodeExchangeError; },\n/* harmony export */ AuthRetryableFetchError: function() { return /* binding */ AuthRetryableFetchError; },\n/* harmony export */ AuthSessionMissingError: function() { return /* binding */ AuthSessionMissingError; },\n/* harmony export */ AuthUnknownError: function() { return /* binding */ AuthUnknownError; },\n/* harmony export */ AuthWeakPasswordError: function() { return /* binding */ AuthWeakPasswordError; },\n/* harmony export */ CustomAuthError: function() { return /* binding */ CustomAuthError; },\n/* harmony export */ isAuthApiError: function() { return /* binding */ isAuthApiError; },\n/* harmony export */ isAuthError: function() { return /* binding */ isAuthError; },\n/* harmony export */ isAuthImplicitGrantRedirectError: function() { return /* binding */ isAuthImplicitGrantRedirectError; },\n/* harmony export */ isAuthPKCECodeVerifierMissingError: function() { return /* binding */ isAuthPKCECodeVerifierMissingError; },\n/* harmony export */ isAuthRetryableFetchError: function() { return /* binding */ isAuthRetryableFetchError; },\n/* harmony export */ isAuthSessionMissingError: function() { return /* binding */ isAuthSessionMissingError; },\n/* harmony export */ isAuthWeakPasswordError: function() { return /* binding */ isAuthWeakPasswordError; }\n/* harmony export */ });\n/**\n * Base error thrown by Supabase Auth helpers.\n *\n * @example\n * ```ts\n * import { AuthError } from '@supabase/auth-js'\n *\n * throw new AuthError('Unexpected auth error', 500, 'unexpected')\n * ```\n */ class AuthError extends Error {\n constructor(message, status, code){\n super(message);\n this.__isAuthError = true;\n this.name = \"AuthError\";\n this.status = status;\n this.code = code;\n }\n}\nfunction isAuthError(error) {\n return typeof error === \"object\" && error !== null && \"__isAuthError\" in error;\n}\n/**\n * Error returned directly from the GoTrue REST API.\n *\n * @example\n * ```ts\n * import { AuthApiError } from '@supabase/auth-js'\n *\n * throw new AuthApiError('Invalid credentials', 400, 'invalid_credentials')\n * ```\n */ class AuthApiError extends AuthError {\n constructor(message, status, code){\n super(message, status, code);\n this.name = \"AuthApiError\";\n this.status = status;\n this.code = code;\n }\n}\nfunction isAuthApiError(error) {\n return isAuthError(error) && error.name === \"AuthApiError\";\n}\n/**\n * Wraps non-standard errors so callers can inspect the root cause.\n *\n * @example\n * ```ts\n * import { AuthUnknownError } from '@supabase/auth-js'\n *\n * try {\n * await someAuthCall()\n * } catch (err) {\n * throw new AuthUnknownError('Auth failed', err)\n * }\n * ```\n */ class AuthUnknownError extends AuthError {\n constructor(message, originalError){\n super(message);\n this.name = \"AuthUnknownError\";\n this.originalError = originalError;\n }\n}\n/**\n * Flexible error class used to create named auth errors at runtime.\n *\n * @example\n * ```ts\n * import { CustomAuthError } from '@supabase/auth-js'\n *\n * throw new CustomAuthError('My custom auth error', 'MyAuthError', 400, 'custom_code')\n * ```\n */ class CustomAuthError extends AuthError {\n constructor(message, name, status, code){\n super(message, status, code);\n this.name = name;\n this.status = status;\n }\n}\n/**\n * Error thrown when an operation requires a session but none is present.\n *\n * @example\n * ```ts\n * import { AuthSessionMissingError } from '@supabase/auth-js'\n *\n * throw new AuthSessionMissingError()\n * ```\n */ class AuthSessionMissingError extends CustomAuthError {\n constructor(){\n super(\"Auth session missing!\", \"AuthSessionMissingError\", 400, undefined);\n }\n}\nfunction isAuthSessionMissingError(error) {\n return isAuthError(error) && error.name === \"AuthSessionMissingError\";\n}\n/**\n * Error thrown when the token response is malformed.\n *\n * @example\n * ```ts\n * import { AuthInvalidTokenResponseError } from '@supabase/auth-js'\n *\n * throw new AuthInvalidTokenResponseError()\n * ```\n */ class AuthInvalidTokenResponseError extends CustomAuthError {\n constructor(){\n super(\"Auth session or user missing\", \"AuthInvalidTokenResponseError\", 500, undefined);\n }\n}\n/**\n * Error thrown when email/password credentials are invalid.\n *\n * @example\n * ```ts\n * import { AuthInvalidCredentialsError } from '@supabase/auth-js'\n *\n * throw new AuthInvalidCredentialsError('Email or password is incorrect')\n * ```\n */ class AuthInvalidCredentialsError extends CustomAuthError {\n constructor(message){\n super(message, \"AuthInvalidCredentialsError\", 400, undefined);\n }\n}\n/**\n * Error thrown when implicit grant redirects contain an error.\n *\n * @example\n * ```ts\n * import { AuthImplicitGrantRedirectError } from '@supabase/auth-js'\n *\n * throw new AuthImplicitGrantRedirectError('OAuth redirect failed', {\n * error: 'access_denied',\n * code: 'oauth_error',\n * })\n * ```\n */ class AuthImplicitGrantRedirectError extends CustomAuthError {\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n details: this.details\n };\n }\n constructor(message, details = null){\n super(message, \"AuthImplicitGrantRedirectError\", 500, undefined);\n this.details = null;\n this.details = details;\n }\n}\nfunction isAuthImplicitGrantRedirectError(error) {\n return isAuthError(error) && error.name === \"AuthImplicitGrantRedirectError\";\n}\n/**\n * Error thrown during PKCE code exchanges.\n *\n * @example\n * ```ts\n * import { AuthPKCEGrantCodeExchangeError } from '@supabase/auth-js'\n *\n * throw new AuthPKCEGrantCodeExchangeError('PKCE exchange failed')\n * ```\n */ class AuthPKCEGrantCodeExchangeError extends CustomAuthError {\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n details: this.details\n };\n }\n constructor(message, details = null){\n super(message, \"AuthPKCEGrantCodeExchangeError\", 500, undefined);\n this.details = null;\n this.details = details;\n }\n}\n/**\n * Error thrown when the PKCE code verifier is not found in storage.\n * This typically happens when the auth flow was initiated in a different\n * browser, device, or the storage was cleared.\n *\n * @example\n * ```ts\n * import { AuthPKCECodeVerifierMissingError } from '@supabase/auth-js'\n *\n * throw new AuthPKCECodeVerifierMissingError()\n * ```\n */ class AuthPKCECodeVerifierMissingError extends CustomAuthError {\n constructor(){\n super(\"PKCE code verifier not found in storage. \" + \"This can happen if the auth flow was initiated in a different browser or device, \" + \"or if the storage was cleared. For SSR frameworks (Next.js, SvelteKit, etc.), \" + \"use @supabase/ssr on both the server and client to store the code verifier in cookies.\", \"AuthPKCECodeVerifierMissingError\", 400, \"pkce_code_verifier_not_found\");\n }\n}\nfunction isAuthPKCECodeVerifierMissingError(error) {\n return isAuthError(error) && error.name === \"AuthPKCECodeVerifierMissingError\";\n}\n/**\n * Error thrown when a transient fetch issue occurs.\n *\n * @example\n * ```ts\n * import { AuthRetryableFetchError } from '@supabase/auth-js'\n *\n * throw new AuthRetryableFetchError('Service temporarily unavailable', 503)\n * ```\n */ class AuthRetryableFetchError extends CustomAuthError {\n constructor(message, status){\n super(message, \"AuthRetryableFetchError\", status, undefined);\n }\n}\nfunction isAuthRetryableFetchError(error) {\n return isAuthError(error) && error.name === \"AuthRetryableFetchError\";\n}\n/**\n * This error is thrown on certain methods when the password used is deemed\n * weak. Inspect the reasons to identify what password strength rules are\n * inadequate.\n */ /**\n * Error thrown when a supplied password is considered weak.\n *\n * @example\n * ```ts\n * import { AuthWeakPasswordError } from '@supabase/auth-js'\n *\n * throw new AuthWeakPasswordError('Password too short', 400, ['min_length'])\n * ```\n */ class AuthWeakPasswordError extends CustomAuthError {\n constructor(message, status, reasons){\n super(message, \"AuthWeakPasswordError\", status, \"weak_password\");\n this.reasons = reasons;\n }\n}\nfunction isAuthWeakPasswordError(error) {\n return isAuthError(error) && error.name === \"AuthWeakPasswordError\";\n}\n/**\n * Error thrown when a JWT cannot be verified or parsed.\n *\n * @example\n * ```ts\n * import { AuthInvalidJwtError } from '@supabase/auth-js'\n *\n * throw new AuthInvalidJwtError('Token signature is invalid')\n * ```\n */ class AuthInvalidJwtError extends CustomAuthError {\n constructor(message){\n super(message, \"AuthInvalidJwtError\", 400, \"invalid_jwt\");\n }\n} //# sourceMappingURL=errors.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvZXJyb3JzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTUEsa0JBQWtCQztJQUMzQkMsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksQ0FBRTtRQUMvQixLQUFLLENBQUNGO1FBQ04sSUFBSSxDQUFDRyxhQUFhLEdBQUc7UUFDckIsSUFBSSxDQUFDQyxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNILE1BQU0sR0FBR0E7UUFDZCxJQUFJLENBQUNDLElBQUksR0FBR0E7SUFDaEI7QUFDSjtBQUNPLFNBQVNHLFlBQVlDLEtBQUs7SUFDN0IsT0FBTyxPQUFPQSxVQUFVLFlBQVlBLFVBQVUsUUFBUSxtQkFBbUJBO0FBQzdFO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTUMscUJBQXFCVjtJQUM5QkUsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksQ0FBRTtRQUMvQixLQUFLLENBQUNGLFNBQVNDLFFBQVFDO1FBQ3ZCLElBQUksQ0FBQ0UsSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDSCxNQUFNLEdBQUdBO1FBQ2QsSUFBSSxDQUFDQyxJQUFJLEdBQUdBO0lBQ2hCO0FBQ0o7QUFDTyxTQUFTTSxlQUFlRixLQUFLO0lBQ2hDLE9BQU9ELFlBQVlDLFVBQVVBLE1BQU1GLElBQUksS0FBSztBQUNoRDtBQUNBOzs7Ozs7Ozs7Ozs7O0NBYUMsR0FDTSxNQUFNSyx5QkFBeUJaO0lBQ2xDRSxZQUFZQyxPQUFPLEVBQUVVLGFBQWEsQ0FBRTtRQUNoQyxLQUFLLENBQUNWO1FBQ04sSUFBSSxDQUFDSSxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNNLGFBQWEsR0FBR0E7SUFDekI7QUFDSjtBQUNBOzs7Ozs7Ozs7Q0FTQyxHQUNNLE1BQU1DLHdCQUF3QmQ7SUFDakNFLFlB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SUFDekMsT0FBT0QsWUFBWUMsVUFBVUEsTUFBTUYsSUFBSSxLQUFLO0FBQ2hEO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTXlCLDRCQUE0QmxCO0lBQ3JDWixZQUFZQyxPQUFPLENBQUU7UUFDakIsS0FBSyxDQUFDQSxTQUFTLHVCQUF1QixLQUFLO0lBQy9DO0FBQ0osRUFDQSxrQ0FBa0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi9lcnJvcnMuanM/ZGRlZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJhc2UgZXJyb3IgdGhyb3duIGJ5IFN1cGFiYXNlIEF1dGggaGVscGVycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoRXJyb3IoJ1VuZXhwZWN0ZWQgYXV0aCBlcnJvcicsIDUwMCwgJ3VuZXhwZWN0ZWQnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCBjb2RlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLl9faXNBdXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICB0aGlzLm5hbWUgPSAnQXV0aEVycm9yJztcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aEVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ19faXNBdXRoRXJyb3InIGluIGVycm9yO1xufVxuLyoqXG4gKiBFcnJvciByZXR1cm5lZCBkaXJlY3RseSBmcm9tIHRoZSBHb1RydWUgUkVTVCBBUEkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoQXBpRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aEFwaUVycm9yKCdJbnZhbGlkIGNyZWRlbnRpYWxzJywgNDAwLCAnaW52YWxpZF9jcmVkZW50aWFscycpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhBcGlFcnJvciBleHRlbmRzIEF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCBjb2RlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIHN0YXR1cywgY29kZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdBdXRoQXBpRXJyb3InO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoQXBpRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gaXNBdXRoRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBdXRoQXBpRXJyb3InO1xufVxuLyoqXG4gKiBXcmFwcyBub24tc3RhbmRhcmQgZXJyb3JzIHNvIGNhbGxlcnMgY2FuIGluc3BlY3QgdGhlIHJvb3QgY2F1c2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoVW5rbm93bkVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdHJ5IHtcbiAqICAgYXdhaXQgc29tZUF1dGhDYWxsKClcbiAqIH0gY2F0Y2ggKGVycikge1xuICogICB0aHJvdyBuZXcgQXV0aFVua25vd25FcnJvcignQXV0aCBmYWlsZWQnLCBlcnIpXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhVbmtub3duRXJyb3IgZXh0ZW5kcyBBdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIG9yaWdpbmFsRXJyb3IpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdBdXRoVW5rbm93bkVycm9yJztcbiAgICAgICAgdGhpcy5vcmlnaW5hbEVycm9yID0gb3JpZ2luYWxFcnJvcjtcbiAgICB9XG59XG4vKipcbiAqIEZsZXhpYmxlIGVycm9yIGNsYXNzIHVzZWQgdG8gY3JlYXRlIG5hbWVkIGF1dGggZXJyb3JzIGF0IHJ1bnRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBDdXN0b21BdXRoRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQ3VzdG9tQXV0aEVycm9yKCdNeSBjdXN0b20gYXV0aCBlcnJvcicsICdNeUF1dGhFcnJvcicsIDQwMCwgJ2N1c3RvbV9jb2RlJylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ3VzdG9tQXV0aEVycm9yIGV4dGVuZHMgQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBuYW1lLCBzdGF0dXMsIGNvZGUpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgc3RhdHVzLCBjb2RlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gcmVxdWlyZXMgYSBzZXNzaW9uIGJ1dCBub25lIGlzIHByZXNlbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yIGV4dGVuZHMgQ3VzdG9tQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ0F1dGggc2Vzc2lvbiBtaXNzaW5nIScsICdBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcicsIDQwMCwgdW5kZWZpbmVkKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcihlcnJvcikge1xuICAgIHJldHVybiBpc0F1dGhFcnJvcihlcnJvcikgJiYgZXJyb3IubmFtZSA9PT0gJ0F1dGhTZXNzaW9uTWlzc2luZ0Vycm9yJztcbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIHRva2VuIHJlc3BvbnNlIGlzIG1hbGZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhJbnZhbGlkVG9rZW5SZXNwb25zZUVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhJbnZhbGlkVG9rZW5SZXNwb25zZUVycm9yKClcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignQXV0aCBzZXNzaW9uIG9yIHVzZXIgbWlzc2luZycsICdBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvcicsIDUwMCwgdW5kZWZpbmVkKTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGVtYWlsL3Bhc3N3b3JkIGNyZWRlbnRpYWxzIGFyZSBpbnZhbGlkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aEludmFsaWRDcmVkZW50aWFsc0Vycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvcignRW1haWwgb3IgcGFzc3dvcmQgaXMgaW5jb3JyZWN0JylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aEludmFsaWRDcmVkZW50aWFsc0Vycm9yIGV4dGVuZHMgQ3VzdG9tQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsICdBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3InLCA0MDAsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBpbXBsaWNpdCBncmFudCByZWRpcmVjdHMgY29udGFpbiBhbiBlcnJvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IoJ09BdXRoIHJlZGlyZWN0IGZhaWxlZCcsIHtcbiAqICAgZXJyb3I6ICdhY2Nlc3NfZGVuaWVkJyxcbiAqICAgY29kZTogJ29hdXRoX2Vycm9yJyxcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgZGV0YWlscyA9IG51bGwpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgJ0F1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvcicsIDUwMCwgdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZGV0YWlscyxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gaXNBdXRoRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3InO1xufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gZHVyaW5nIFBLQ0UgY29kZSBleGNoYW5nZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aFBLQ0VHcmFudENvZGVFeGNoYW5nZUVycm9yKCdQS0NFIGV4Y2hhbmdlIGZhaWxlZCcpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgZGV0YWlscyA9IG51bGwpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgJ0F1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvcicsIDUwMCwgdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZGV0YWlscyxcbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSBQS0NFIGNvZGUgdmVyaWZpZXIgaXMgbm90IGZvdW5kIGluIHN0b3JhZ2UuXG4gKiBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gdGhlIGF1dGggZmxvdyB3YXMgaW5pdGlhdGVkIGluIGEgZGlmZmVyZW50XG4gKiBicm93c2VyLCBkZXZpY2UsIG9yIHRoZSBzdG9yYWdlIHdhcyBjbGVhcmVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3IoKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdQS0NFIGNvZGUgdmVyaWZpZXIgbm90IGZvdW5kIGluIHN0b3JhZ2UuICcgK1xuICAgICAgICAgICAgJ1RoaXMgY2FuIGhhcHBlbiBpZiB0aGUgYXV0aCBmbG93IHdhcyBpbml0aWF0ZWQgaW4gYSBkaWZmZXJlbnQgYnJvd3NlciBvciBkZXZpY2UsICcgK1xuICAgICAgICAgICAgJ29yIGlmIHRoZSBzdG9yYWdlIHdhcyBjbGVhcmVkLiBGb3IgU1NSIGZyYW1ld29ya3MgKE5leHQuanMsIFN2ZWx0ZUtpdCwgZXRjLiksICcgK1xuICAgICAgICAgICAgJ3VzZSBAc3VwYWJhc2Uvc3NyIG9uIGJvdGggdGhlIHNlcnZlciBhbmQgY2xpZW50IHRvIHN0b3JlIHRoZSBjb2RlIHZlcmlmaWVyIGluIGNvb2tpZXMuJywgJ0F1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yJywgNDAwLCAncGtjZV9jb2RlX3ZlcmlmaWVyX25vdF9mb3VuZCcpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGlzQXV0aEVycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3InO1xufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhIHRyYW5zaWVudCBmZXRjaCBpc3N1ZSBvY2N1cnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvcignU2VydmljZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZScsIDUwMylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCAnQXV0aFJldHJ5YWJsZUZldGNoRXJyb3InLCBzdGF0dXMsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gaXNBdXRoRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvcic7XG59XG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIG9uIGNlcnRhaW4gbWV0aG9kcyB3aGVuIHRoZSBwYXNzd29yZCB1c2VkIGlzIGRlZW1lZFxuICogd2Vhay4gSW5zcGVjdCB0aGUgcmVhc29ucyB0byBpZGVudGlmeSB3aGF0IHBhc3N3b3JkIHN0cmVuZ3RoIHJ1bGVzIGFyZVxuICogaW5hZGVxdWF0ZS5cbiAqL1xuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhIHN1cHBsaWVkIHBhc3N3b3JkIGlzIGNvbnNpZGVyZWQgd2Vhay5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhXZWFrUGFzc3dvcmRFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoV2Vha1Bhc3N3b3JkRXJyb3IoJ1Bhc3N3b3JkIHRvbyBzaG9ydCcsIDQwMCwgWydtaW5fbGVuZ3RoJ10pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhXZWFrUGFzc3dvcmRFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCByZWFzb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsICdBdXRoV2Vha1Bhc3N3b3JkRXJyb3InLCBzdGF0dXMsICd3ZWFrX3Bhc3N3b3JkJyk7XG4gICAgICAgIHRoaXMucmVhc29ucyA9IHJlYXNvbnM7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aFdlYWtQYXNzd29yZEVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGlzQXV0aEVycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQXV0aFdlYWtQYXNzd29yZEVycm9yJztcbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSBKV1QgY2Fubm90IGJlIHZlcmlmaWVkIG9yIHBhcnNlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhJbnZhbGlkSnd0RXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aEludmFsaWRKd3RFcnJvcignVG9rZW4gc2lnbmF0dXJlIGlzIGludmFsaWQnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoSW52YWxpZEp3dEVycm9yIGV4dGVuZHMgQ3VzdG9tQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsICdBdXRoSW52YWxpZEp3dEVycm9yJywgNDAwLCAnaW52YWxpZF9qd3QnKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIl0sIm5hbWVzIjpbIkF1dGhFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJtZXNzYWdlIiwic3RhdHVzIiwiY29kZSIsIl9faXNBdXRoRXJyb3IiLCJuYW1lIiwiaXNBdXRoRXJyb3IiLCJlcnJvciIsIkF1dGhBcGlFcnJvciIsImlzQXV0aEFwaUVycm9yIiwiQXV0aFVua25vd25FcnJvciIsIm9yaWdpbmFsRXJyb3IiLCJDdXN0b21BdXRoRXJyb3IiLCJBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvciIsInVuZGVmaW5lZCIsImlzQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IiLCJBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvciIsIkF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvciIsIkF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciIsInRvSlNPTiIsImRldGFpbHMiLCJpc0F1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciIsIkF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvciIsIkF1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yIiwiaXNBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvciIsIkF1dGhSZXRyeWFibGVGZXRjaEVycm9yIiwiaXNBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvciIsIkF1dGhXZWFrUGFzc3dvcmRFcnJvciIsInJlYXNvbnMiLCJpc0F1dGhXZWFrUGFzc3dvcmRFcnJvciIsIkF1dGhJbnZhbGlkSnd0RXJyb3IiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js":
/*!*****************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/fetch.js ***!
\*****************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ _generateLinkResponse: function() { return /* binding */ _generateLinkResponse; },\n/* harmony export */ _noResolveJsonResponse: function() { return /* binding */ _noResolveJsonResponse; },\n/* harmony export */ _request: function() { return /* binding */ _request; },\n/* harmony export */ _sessionResponse: function() { return /* binding */ _sessionResponse; },\n/* harmony export */ _sessionResponsePassword: function() { return /* binding */ _sessionResponsePassword; },\n/* harmony export */ _ssoResponse: function() { return /* binding */ _ssoResponse; },\n/* harmony export */ _userResponse: function() { return /* binding */ _userResponse; },\n/* harmony export */ handleError: function() { return /* binding */ handleError; }\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tslib */ \"(app-pages-browser)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./errors */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n\n\n\n\nconst _getErrorMessage = (err)=>err.msg || err.message || err.error_description || err.error || JSON.stringify(err);\nconst NETWORK_ERROR_CODES = [\n 502,\n 503,\n 504\n];\nasync function handleError(error) {\n var _a;\n if (!(0,_helpers__WEBPACK_IMPORTED_MODULE_1__.looksLikeFetchResponse)(error)) {\n throw new _errors__WEBPACK_IMPORTED_MODULE_2__.AuthRetryableFetchError(_getErrorMessage(error), 0);\n }\n if (NETWORK_ERROR_CODES.includes(error.status)) {\n // status in 500...599 range - server had an error, request might be retryed.\n throw new _errors__WEBPACK_IMPORTED_MODULE_2__.AuthRetryableFetchError(_getErrorMessage(error), error.status);\n }\n let data;\n try {\n data = await error.json();\n } catch (e) {\n throw new _errors__WEBPACK_IMPORTED_MODULE_2__.AuthUnknownError(_getErrorMessage(e), e);\n }\n let errorCode = undefined;\n const responseAPIVersion = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.parseResponseAPIVersion)(error);\n if (responseAPIVersion && responseAPIVersion.getTime() >= _constants__WEBPACK_IMPORTED_MODULE_0__.API_VERSIONS[\"2024-01-01\"].timestamp && typeof data === \"object\" && data && typeof data.code === \"string\") {\n errorCode = data.code;\n } else if (typeof data === \"object\" && data && typeof data.error_code === \"string\") {\n errorCode = data.error_code;\n }\n if (!errorCode) {\n // Legacy support for weak password errors, when there were no error codes\n if (typeof data === \"object\" && data && typeof data.weak_password === \"object\" && data.weak_password && Array.isArray(data.weak_password.reasons) && data.weak_password.reasons.length && data.weak_password.reasons.reduce((a, i)=>a && typeof i === \"string\", true)) {\n throw new _errors__WEBPACK_IMPORTED_MODULE_2__.AuthWeakPasswordError(_getErrorMessage(data), error.status, data.weak_password.reasons);\n }\n } else if (errorCode === \"weak_password\") {\n throw new _errors__WEBPACK_IMPORTED_MODULE_2__.AuthWeakPasswordError(_getErrorMessage(data), error.status, ((_a = data.weak_password) === null || _a === void 0 ? void 0 : _a.reasons) || []);\n } else if (errorCode === \"session_not_found\") {\n // The `session_id` inside the JWT does not correspond to a row in the\n // `sessions` table. This usually means the user has signed out, has been\n // deleted, or their session has somehow been terminated.\n throw new _errors__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError();\n }\n throw new _errors__WEBPACK_IMPORTED_MODULE_2__.AuthApiError(_getErrorMessage(data), error.status || 500, errorCode);\n}\nconst _getRequestParams = (method, options, parameters, body)=>{\n const params = {\n method,\n headers: (options === null || options === void 0 ? void 0 : options.headers) || {}\n };\n if (method === \"GET\") {\n return params;\n }\n params.headers = Object.assign({\n \"Content-Type\": \"application/json;charset=UTF-8\"\n }, options === null || options === void 0 ? void 0 : options.headers);\n params.body = JSON.stringify(body);\n return Object.assign(Object.assign({}, params), parameters);\n};\nasync function _request(fetcher, method, url, options) {\n var _a;\n const headers = Object.assign({}, options === null || options === void 0 ? void 0 : options.headers);\n if (!headers[_constants__WEBPACK_IMPORTED_MODULE_0__.API_VERSION_HEADER_NAME]) {\n headers[_constants__WEBPACK_IMPORTED_MODULE_0__.API_VERSION_HEADER_NAME] = _constants__WEBPACK_IMPORTED_MODULE_0__.API_VERSIONS[\"2024-01-01\"].name;\n }\n if (options === null || options === void 0 ? void 0 : options.jwt) {\n headers[\"Authorization\"] = \"Bearer \".concat(options.jwt);\n }\n const qs = (_a = options === null || options === void 0 ? void 0 : options.query) !== null && _a !== void 0 ? _a : {};\n if (options === null || options === void 0 ? void 0 : options.redirectTo) {\n qs[\"redirect_to\"] = options.redirectTo;\n }\n const queryString = Object.keys(qs).length ? \"?\" + new URLSearchParams(qs).toString() : \"\";\n const data = await _handleRequest(fetcher, method, url + queryString, {\n headers,\n noResolveJson: options === null || options === void 0 ? void 0 : options.noResolveJson\n }, {}, options === null || options === void 0 ? void 0 : options.body);\n return (options === null || options === void 0 ? void 0 : options.xform) ? options === null || options === void 0 ? void 0 : options.xform(data) : {\n data: Object.assign({}, data),\n error: null\n };\n}\nasync function _handleRequest(fetcher, method, url, options, parameters, body) {\n const requestParams = _getRequestParams(method, options, parameters, body);\n let result;\n try {\n result = await fetcher(url, Object.assign({}, requestParams));\n } catch (e) {\n console.error(e);\n // fetch failed, likely due to a network or CORS error\n throw new _errors__WEBPACK_IMPORTED_MODULE_2__.AuthRetryableFetchError(_getErrorMessage(e), 0);\n }\n if (!result.ok) {\n await handleError(result);\n }\n if (options === null || options === void 0 ? void 0 : options.noResolveJson) {\n return result;\n }\n try {\n return await result.json();\n } catch (e) {\n await handleError(e);\n }\n}\nfunction _sessionResponse(data) {\n var _a;\n let session = null;\n if (hasSession(data)) {\n session = Object.assign({}, data);\n if (!data.expires_at) {\n session.expires_at = (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.expiresAt)(data.expires_in);\n }\n }\n const user = (_a = data.user) !== null && _a !== void 0 ? _a : data;\n return {\n data: {\n session,\n user\n },\n error: null\n };\n}\nfunction _sessionResponsePassword(data) {\n const response = _sessionResponse(data);\n if (!response.error && data.weak_password && typeof data.weak_password === \"object\" && Array.isArray(data.weak_password.reasons) && data.weak_password.reasons.length && data.weak_password.message && typeof data.weak_password.message === \"string\" && data.weak_password.reasons.reduce((a, i)=>a && typeof i === \"string\", true)) {\n response.data.weak_password = data.weak_password;\n }\n return response;\n}\nfunction _userResponse(data) {\n var _a;\n const user = (_a = data.user) !== null && _a !== void 0 ? _a : data;\n return {\n data: {\n user\n },\n error: null\n };\n}\nfunction _ssoResponse(data) {\n return {\n data,\n error: null\n };\n}\nfunction _generateLinkResponse(data) {\n const { action_link, email_otp, hashed_token, redirect_to, verification_type } = data, rest = (0,tslib__WEBPACK_IMPORTED_MODULE_3__.__rest)(data, [\n \"action_link\",\n \"email_otp\",\n \"hashed_token\",\n \"redirect_to\",\n \"verification_type\"\n ]);\n const properties = {\n action_link,\n email_otp,\n hashed_token,\n redirect_to,\n verification_type\n };\n const user = Object.assign({}, rest);\n return {\n data: {\n properties,\n user\n },\n error: null\n };\n}\nfunction _noResolveJsonResponse(data) {\n return data;\n}\n/**\n * hasSession checks if the response object contains a valid session\n * @param data A response object\n * @returns true if a session is in the response\n */ function hasSession(data) {\n return data.access_token && data.refresh_token && data.expires_in;\n} //# sourceMappingURL=fetch.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvZmV0Y2guanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQStCO0FBQ3FDO0FBQ21CO0FBQzZDO0FBQ3BJLE1BQU1XLG1CQUFtQixDQUFDQyxNQUFRQSxJQUFJQyxHQUFHLElBQUlELElBQUlFLE9BQU8sSUFBSUYsSUFBSUcsaUJBQWlCLElBQUlILElBQUlJLEtBQUssSUFBSUMsS0FBS0MsU0FBUyxDQUFDTjtBQUNqSCxNQUFNTyxzQkFBc0I7SUFBQztJQUFLO0lBQUs7Q0FBSTtBQUNwQyxlQUFlQyxZQUFZSixLQUFLO0lBQ25DLElBQUlLO0lBQ0osSUFBSSxDQUFDakIsZ0VBQXNCQSxDQUFDWSxRQUFRO1FBQ2hDLE1BQU0sSUFBSVQsNERBQXVCQSxDQUFDSSxpQkFBaUJLLFFBQVE7SUFDL0Q7SUFDQSxJQUFJRyxvQkFBb0JHLFFBQVEsQ0FBQ04sTUFBTU8sTUFBTSxHQUFHO1FBQzVDLDZFQUE2RTtRQUM3RSxNQUFNLElBQUloQiw0REFBdUJBLENBQUNJLGlCQUFpQkssUUFBUUEsTUFBTU8sTUFBTTtJQUMzRTtJQUNBLElBQUlDO0lBQ0osSUFBSTtRQUNBQSxPQUFPLE1BQU1SLE1BQU1TLElBQUk7SUFDM0IsRUFDQSxPQUFPQyxHQUFHO1FBQ04sTUFBTSxJQUFJakIscURBQWdCQSxDQUFDRSxpQkFBaUJlLElBQUlBO0lBQ3BEO0lBQ0EsSUFBSUMsWUFBWUM7SUFDaEIsTUFBTUMscUJBQXFCeEIsaUVBQXVCQSxDQUFDVztJQUNuRCxJQUFJYSxzQkFDQUEsbUJBQW1CQyxPQUFPLE1BQU03QixvREFBWSxDQUFDLGFBQWEsQ0FBQzhCLFNBQVMsSUFDcEUsT0FBT1AsU0FBUyxZQUNoQkEsUUFDQSxPQUFPQSxLQUFLUSxJQUFJLEtBQUssVUFBVTtRQUMvQkwsWUFBWUgsS0FBS1EsSUFBSTtJQUN6QixPQUNLLElBQUksT0FBT1IsU0FBUyxZ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QUNVLGFBQWEsR0FBR1YsS0FBS1UsYUFBYTtJQUNwRDtJQUNBLE9BQU8yQztBQUNYO0FBQ08sU0FBU0MsY0FBY3RELElBQUk7SUFDOUIsSUFBSUg7SUFDSixNQUFNc0QsT0FBTyxDQUFDdEQsS0FBS0csS0FBS21ELElBQUksTUFBTSxRQUFRdEQsT0FBTyxLQUFLLElBQUlBLEtBQUtHO0lBQy9ELE9BQU87UUFBRUEsTUFBTTtZQUFFbUQ7UUFBSztRQUFHM0QsT0FBTztJQUFLO0FBQ3pDO0FBQ08sU0FBUytELGFBQWF2RCxJQUFJO0lBQzdCLE9BQU87UUFBRUE7UUFBTVIsT0FBTztJQUFLO0FBQy9CO0FBQ08sU0FBU2dFLHNCQUFzQnhELElBQUk7SUFDdEMsTUFBTSxFQUFFeUQsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLFlBQVksRUFBRUMsV0FBVyxFQUFFQyxpQkFBaUIsRUFBRSxHQUFHN0QsTUFBTThELE9BQU90Riw2Q0FBTUEsQ0FBQ3dCLE1BQU07UUFBQztRQUFlO1FBQWE7UUFBZ0I7UUFBZTtLQUFvQjtJQUMzTCxNQUFNK0QsYUFBYTtRQUNmTjtRQUNBQztRQUNBQztRQUNBQztRQUNBQztJQUNKO0lBQ0EsTUFBTVYsT0FBTzFCLE9BQU9DLE1BQU0sQ0FBQyxDQUFDLEdBQUdvQztJQUMvQixPQUFPO1FBQ0g5RCxNQUFNO1lBQ0YrRDtZQUNBWjtRQUNKO1FBQ0EzRCxPQUFPO0lBQ1g7QUFDSjtBQUNPLFNBQVN3RSx1QkFBdUJoRSxJQUFJO0lBQ3ZDLE9BQU9BO0FBQ1g7QUFDQTs7OztDQUlDLEdBQ0QsU0FBU2dELFdBQVdoRCxJQUFJO0lBQ3BCLE9BQU9BLEtBQUtpRSxZQUFZLElBQUlqRSxLQUFLa0UsYUFBYSxJQUFJbEUsS0FBS2tELFVBQVU7QUFDckUsRUFDQSxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi9mZXRjaC5qcz8wMjMwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQVBJX1ZFUlNJT05TLCBBUElfVkVSU0lPTl9IRUFERVJfTkFNRSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGV4cGlyZXNBdCwgbG9va3NMaWtlRmV0Y2hSZXNwb25zZSwgcGFyc2VSZXNwb25zZUFQSVZlcnNpb24gfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgQXV0aEFwaUVycm9yLCBBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvciwgQXV0aFdlYWtQYXNzd29yZEVycm9yLCBBdXRoVW5rbm93bkVycm9yLCBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvciwgfSBmcm9tICcuL2Vycm9ycyc7XG5jb25zdCBfZ2V0RXJyb3JNZXNzYWdlID0gKGVycikgPT4gZXJyLm1zZyB8fCBlcnIubWVzc2FnZSB8fCBlcnIuZXJyb3JfZGVzY3JpcHRpb24gfHwgZXJyLmVycm9yIHx8IEpTT04uc3RyaW5naWZ5KGVycik7XG5jb25zdCBORVRXT1JLX0VSUk9SX0NPREVTID0gWzUwMiwgNTAzLCA1MDRdO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICghbG9va3NMaWtlRmV0Y2hSZXNwb25zZShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhSZXRyeWFibGVGZXRjaEVycm9yKF9nZXRFcnJvck1lc3NhZ2UoZXJyb3IpLCAwKTtcbiAgICB9XG4gICAgaWYgKE5FVFdPUktfRVJST1JfQ09ERVMuaW5jbHVkZXMoZXJyb3Iuc3RhdHVzKSkge1xuICAgICAgICAvLyBzdGF0dXMgaW4gNTAwLi4uNTk5IHJhbmdlIC0gc2VydmVyIGhhZCBhbiBlcnJvciwgcmVxdWVzdCBtaWdodCBiZSByZXRyeWVkLlxuICAgICAgICB0aHJvdyBuZXcgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoX2dldEVycm9yTWVzc2FnZShlcnJvciksIGVycm9yLnN0YXR1cyk7XG4gICAgfVxuICAgIGxldCBkYXRhO1xuICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBhd2FpdCBlcnJvci5qc29uKCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoVW5rbm93bkVycm9yKF9nZXRFcnJvck1lc3NhZ2UoZSksIGUpO1xuICAgIH1cbiAgICBsZXQgZXJyb3JDb2RlID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc3BvbnNlQVBJVmVyc2lvbiA9IHBhcnNlUmVzcG9uc2VBUElWZXJzaW9uKGVycm9yKTtcbiAgICBpZiAocmVzcG9uc2VBUElWZXJzaW9uICYmXG4gICAgICAgIHJlc3BvbnNlQVBJVmVyc2lvbi5nZXRUaW1lKCkgPj0gQVBJX1ZFUlNJT05TWycyMDI0LTAxLTAxJ10udGltZXN0YW1wICYmXG4gICAgICAgIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBkYXRhICYmXG4gICAgICAgIHR5cGVvZiBkYXRhLmNvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGVycm9yQ29kZSA9IGRhdGEuY29kZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmIGRhdGEgJiYgdHlwZW9mIGRhdGEuZXJyb3JfY29kZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZXJyb3JDb2RlID0gZGF0YS5lcnJvcl9jb2RlO1xuICAgIH1cbiAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAvLyBMZWdhY3kgc3VwcG9ydCBmb3Igd2VhayBwYXNzd29yZCBlcnJvcnMsIHdoZW4gdGhlcmUgd2VyZSBubyBlcnJvciBjb2Rlc1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICBkYXRhICYmXG4gICAgICAgICAgICB0eXBlb2YgZGF0YS53ZWFrX3Bhc3N3b3JkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgZGF0YS53ZWFrX3Bhc3N3b3JkICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGRhdGEud2Vha19wYXNzd29yZC5yZWFzb25zKSAmJlxuICAgICAgICAgICAgZGF0YS53ZWFrX3Bhc3N3b3JkLnJlYXNvbnMubGVuZ3RoICYmXG4gICAgICAgICAgICBkYXRhLndlYWtfcGFzc3dvcmQucmVhc29ucy5yZWR1Y2UoKGEsIGkpID0+IGEgJiYgdHlwZW9mIGkgPT09ICdzdHJpbmcnLCB0cnVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhXZWFrUGFzc3dvcmRFcnJvcihfZ2V0RXJyb3JNZXNzYWdlKGRhdGEpLCBlcnJvci5zdGF0dXMsIGRhdGEud2Vha19wYXNzd29yZC5yZWFzb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvckNvZGUgPT09ICd3ZWFrX3Bhc3N3b3JkJykge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aFdlYWtQYXNzd29yZEVycm9yKF9nZXRFcnJvck1lc3NhZ2UoZGF0YSksIGVycm9yLnN0YXR1cywgKChfYSA9IGRhdGEud2Vha19wYXNzd29yZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlYXNvbnMpIHx8IFtdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3JDb2RlID09PSAnc2Vzc2lvbl9ub3RfZm91bmQnKSB7XG4gICAgICAgIC8vIFRoZSBgc2Vzc2lvbl9pZGAgaW5zaWRlIHRoZSBKV1QgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHJvdyBpbiB0aGVcbiAgICAgICAgLy8gYHNlc3Npb25zYCB0YWJsZS4gVGhpcyB1c3VhbGx5IG1lYW5zIHRoZSB1c2VyIGhhcyBzaWduZWQgb3V0LCBoYXMgYmVlblxuICAgICAgICAvLyBkZWxldGVkLCBvciB0aGVpciBzZXNzaW9uIGhhcyBzb21laG93IGJlZW4gdGVybWluYXRlZC5cbiAgICAgICAgdGhyb3cgbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBBdXRoQXBpRXJyb3IoX2dldEVycm9yTWVzc2FnZShkYXRhKSwgZXJyb3Iuc3RhdHVzIHx8IDUwMCwgZXJyb3JDb2RlKTtcbn1cbmNvbnN0IF9nZXRSZXF1ZXN0UGFyYW1zID0gKG1ldGhvZCwgb3B0aW9ucywgcGFyYW1ldGVycywgYm9keSkgPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHsgbWV0aG9kLCBoZWFkZXJzOiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlYWRlcnMpIHx8IHt9IH07XG4gICAgaWYgKG1ldGhvZCA9PT0gJ0dFVCcpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG4gICAgcGFyYW1zLmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnIH0sIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oZWFkZXJzKTtcbiAgICBwYXJhbXMuYm9keSA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyksIHBhcmFtZXRlcnMpO1xufTtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfcmVxdWVzdChmZXRjaGVyLCBtZXRob2QsIHVybCwgb3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlYWRlcnMpO1xuICAgIGlmICghaGVhZGVyc1tBUElfVkVSU0lPTl9IRUFERVJfTkFNRV0pIHtcbiAgICAgICAgaGVhZGVyc1tBUElfVkVSU0lPTl9IRUFERVJfTkFNRV0gPSBBUElfVkVSU0lPTlNbJzIwMjQtMDEtMDEnXS5uYW1lO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmp3dCkge1xuICAgICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7b3B0aW9ucy5qd3R9YDtcbiAgICB9XG4gICAgY29uc3QgcXMgPSAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucXVlcnkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9O1xuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucmVkaXJlY3RUbykge1xuICAgICAgICBxc1sncmVkaXJlY3RfdG8nXSA9IG9wdGlvbnMucmVkaXJlY3RUbztcbiAgICB9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBPYmplY3Qua2V5cyhxcykubGVuZ3RoID8gJz8nICsgbmV3IFVSTFNlYXJjaFBhcmFtcyhxcykudG9TdHJpbmcoKSA6ICcnO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBfaGFuZGxlUmVxdWVzdChmZXRjaGVyLCBtZXRob2QsIHVybCArIHF1ZXJ5U3RyaW5nLCB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIG5vUmVzb2x2ZUpzb246IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ub1Jlc29sdmVKc29uLFxuICAgIH0sIHt9LCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9keSk7XG4gICAgcmV0dXJuIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueGZvcm0pID8gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnhmb3JtKGRhdGEpIDogeyBkYXRhOiBPYmplY3QuYXNzaWduKHt9LCBkYXRhKSwgZXJyb3I6IG51bGwgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIF9oYW5kbGVSZXF1ZXN0KGZldGNoZXIsIG1ldGhvZCwgdXJsLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KSB7XG4gICAgY29uc3QgcmVxdWVzdFBhcmFtcyA9IF9nZXRSZXF1ZXN0UGFyYW1zKG1ldGhvZCwgb3B0aW9ucywgcGFyYW1ldGVycywgYm9keSk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmZXRjaGVyKHVybCwgT2JqZWN0LmFzc2lnbih7fSwgcmVxdWVzdFBhcmFtcykpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAvLyBmZXRjaCBmYWlsZWQsIGxpa2VseSBkdWUgdG8gYSBuZXR3b3JrIG9yIENPUlMgZXJyb3JcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhSZXRyeWFibGVGZXRjaEVycm9yKF9nZXRFcnJvck1lc3NhZ2UoZSksIDApO1xuICAgIH1cbiAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICBhd2FpdCBoYW5kbGVFcnJvcihyZXN1bHQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm5vUmVzb2x2ZUpzb24pIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3VsdC5qc29uKCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZUVycm9yKGUpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBfc2Vzc2lvblJlc3BvbnNlKGRhdGEpIHtcbiAgICB2YXIgX2E7XG4gICAgbGV0IHNlc3Npb24gPSBudWxsO1xuICAgIGlmIChoYXNTZXNzaW9uKGRhdGEpKSB7XG4gICAgICAgIHNlc3Npb24gPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhKTtcbiAgICAgICAgaWYgKCFkYXRhLmV4cGlyZXNfYXQpIHtcbiAgICAgICAgICAgIHNlc3Npb24uZXhwaXJlc19hdCA9IGV4cGlyZXNBdChkYXRhLmV4cGlyZXNfaW4pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHVzZXIgPSAoX2EgPSBkYXRhLnVzZXIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGRhdGE7XG4gICAgcmV0dXJuIHsgZGF0YTogeyBzZXNzaW9uLCB1c2VyIH0sIGVycm9yOiBudWxsIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX3Nlc3Npb25SZXNwb25zZVBhc3N3b3JkKGRhdGEpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IF9zZXNzaW9uUmVzcG9uc2UoZGF0YSk7XG4gICAgaWYgKCFyZXNwb25zZS5lcnJvciAmJlxuICAgICAgICBkYXRhLndlYWtfcGFzc3dvcmQgJiZcbiAgICAgICAgdHlwZW9mIGRhdGEud2Vha19wYXNzd29yZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShkYXRhLndlYWtfcGFzc3dvcmQucmVhc29ucykgJiZcbiAgICAgICAgZGF0YS53ZWFrX3Bhc3N3b3JkLnJlYXNvbnMubGVuZ3RoICYmXG4gICAgICAgIGRhdGEud2Vha19wYXNzd29yZC5tZXNzYWdlICYmXG4gICAgICAgIHR5cGVvZiBkYXRhLndlYWtfcGFzc3dvcmQubWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgZGF0YS53ZWFrX3Bhc3N3b3JkLnJlYXNvbnMucmVkdWNlKChhLCBpKSA9PiBhICYmIHR5cGVvZiBpID09PSAnc3RyaW5nJywgdHJ1ZSkpIHtcbiAgICAgICAgcmVzcG9uc2UuZGF0YS53ZWFrX3Bhc3N3b3JkID0gZGF0YS53ZWFrX3Bhc3N3b3JkO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gX3VzZXJSZXNwb25zZShkYXRhKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHVzZXIgPSAoX2EgPSBkYXRhLnVzZXIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGRhdGE7XG4gICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyIH0sIGVycm9yOiBudWxsIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX3Nzb1Jlc3BvbnNlKGRhdGEpIHtcbiAgICByZXR1cm4geyBkYXRhLCBlcnJvcjogbnVsbCB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9nZW5lcmF0ZUxpbmtSZXNwb25zZShkYXRhKSB7XG4gICAgY29uc3QgeyBhY3Rpb25fbGluaywgZW1haWxfb3RwLCBoYXNoZWRfdG9rZW4sIHJlZGlyZWN0X3RvLCB2ZXJpZmljYXRpb25fdHlwZSB9ID0gZGF0YSwgcmVzdCA9IF9fcmVzdChkYXRhLCBbXCJhY3Rpb25fbGlua1wiLCBcImVtYWlsX290cFwiLCBcImhhc2hlZF90b2tlblwiLCBcInJlZGlyZWN0X3RvXCIsIFwidmVyaWZpY2F0aW9uX3R5cGVcIl0pO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgICAgIGFjdGlvbl9saW5rLFxuICAgICAgICBlbWFpbF9vdHAsXG4gICAgICAgIGhhc2hlZF90b2tlbixcbiAgICAgICAgcmVkaXJlY3RfdG8sXG4gICAgICAgIHZlcmlmaWNhdGlvbl90eXBlLFxuICAgIH07XG4gICAgY29uc3QgdXNlciA9IE9iamVjdC5hc3NpZ24oe30sIHJlc3QpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICB1c2VyLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9ub1Jlc29sdmVKc29uUmVzcG9uc2UoZGF0YSkge1xuICAgIHJldHVybiBkYXRhO1xufVxuLyoqXG4gKiBoYXNTZXNzaW9uIGNoZWNrcyBpZiB0aGUgcmVzcG9uc2Ugb2JqZWN0IGNvbnRhaW5zIGEgdmFsaWQgc2Vzc2lvblxuICogQHBhcmFtIGRhdGEgQSByZXNwb25zZSBvYmplY3RcbiAqIEByZXR1cm5zIHRydWUgaWYgYSBzZXNzaW9uIGlzIGluIHRoZSByZXNwb25zZVxuICovXG5mdW5jdGlvbiBoYXNTZXNzaW9uKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS5hY2Nlc3NfdG9rZW4gJiYgZGF0YS5yZWZyZXNoX3Rva2VuICYmIGRhdGEuZXhwaXJlc19pbjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZldGNoLmpzLm1hcCJdLCJuYW1lcyI6WyJfX3Jlc3QiLCJBUElfVkVSU0lPTlMiLCJBUElfVkVSU0lPTl9IRUFERVJfTkFNRSIsImV4cGlyZXNBdCIsImxvb2tzTGlrZUZldGNoUmVzcG9uc2UiLCJwYXJzZVJlc3BvbnNlQVBJVmVyc2lvbiIsIkF1dGhBcGlFcnJvciIsIkF1dGhSZXRyeWFibGVGZXRjaEVycm9yIiwiQXV0aFdlYWtQYXNzd29yZEVycm9yIiwiQXV0aFVua25vd25FcnJvciIsIkF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yIiwiX2dldEVycm9yTWVzc2FnZSIsImVyciIsIm1zZyIsIm1lc3NhZ2UiLCJlcnJvcl9kZXNjcmlwdGlvbiIsImVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsIk5FVFdPUktfRVJST1JfQ09ERVMiLCJoYW5kbGVFcnJvciIsIl9hIiwiaW5jbHVkZXMiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsImUiLCJlcnJvckNvZGUiLCJ1bmRlZmluZWQiLCJyZXNwb25zZUFQSVZlcnNpb24iLCJnZXRUaW1lIiwidGltZXN0YW1wIiwiY29kZSIsImVycm9yX2NvZGUiLCJ3ZWFrX3Bhc3N3b3JkIiwiQXJyYXkiLCJpc0FycmF5IiwicmVhc29ucyIsImxlbmd0aCIsInJlZHVjZSIsImEiLCJpIiwiX2dldFJlcXVlc3RQYXJhbXMiLCJtZXRob2QiLCJvcHRpb25zIiwicGFyYW1ldGVycyIsImJvZHkiLCJwYXJhbXMiLCJoZWFkZXJzIiwiT2JqZWN0IiwiYXNzaWduIiwiX3JlcXVlc3QiLCJmZXRjaGVyIiwidXJsIiwibmFtZSIsImp3dCIsInFzIiwicXVlcnkiLCJyZWRpcmVjdFRvIiwicXVlcnlTdHJpbmciLCJrZXlzIiwiVVJMU2VhcmNoUGFyYW1zIiwidG9TdHJpbmciLCJfaGFuZGxlUmVxdWVzdCIsIm5vUmVzb2x2ZUpzb24iLCJ4Zm9ybSIsInJlcXVlc3RQYXJhbXMiLCJyZXN1bHQiLCJjb25zb2xlIiwib2siLCJfc2Vzc2lvblJlc3BvbnNlIiwic2Vzc2lvbiIsImhhc1Nlc3Npb24iLCJleHBpcmVzX2F0IiwiZXhwaXJlc19pbiIsInVzZXIiLCJfc2Vzc2lvblJlc3BvbnNlUGFzc3dvcmQiLCJyZXNwb25zZSIsIl91c2VyUmVzcG9uc2UiLCJfc3NvUmVzcG9uc2UiLCJfZ2VuZXJhdGVMaW5rUmVzcG9uc2UiLCJhY3Rpb25fbGluayIsImVtYWlsX290cCIsImhhc2hlZF90b2tlbiIsInJlZGlyZWN0X3RvIiwidmVyaWZpY2F0aW9uX3R5cGUiLCJyZXN0IiwicHJvcGVydGllcyIsIl9ub1Jlc29sdmVKc29uUmVzcG9uc2UiLCJhY2Nlc3NfdG9rZW4iLCJyZWZyZXNoX3Rva2VuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js":
/*!*******************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/helpers.js ***!
\*******************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Deferred: function() { return /* binding */ Deferred; },\n/* harmony export */ decodeJWT: function() { return /* binding */ decodeJWT; },\n/* harmony export */ deepClone: function() { return /* binding */ deepClone; },\n/* harmony export */ expiresAt: function() { return /* binding */ expiresAt; },\n/* harmony export */ generateCallbackId: function() { return /* binding */ generateCallbackId; },\n/* harmony export */ generatePKCEChallenge: function() { return /* binding */ generatePKCEChallenge; },\n/* harmony export */ generatePKCEVerifier: function() { return /* binding */ generatePKCEVerifier; },\n/* harmony export */ getAlgorithm: function() { return /* binding */ getAlgorithm; },\n/* harmony export */ getCodeChallengeAndMethod: function() { return /* binding */ getCodeChallengeAndMethod; },\n/* harmony export */ getItemAsync: function() { return /* binding */ getItemAsync; },\n/* harmony export */ insecureUserWarningProxy: function() { return /* binding */ insecureUserWarningProxy; },\n/* harmony export */ isBrowser: function() { return /* binding */ isBrowser; },\n/* harmony export */ looksLikeFetchResponse: function() { return /* binding */ looksLikeFetchResponse; },\n/* harmony export */ parseParametersFromURL: function() { return /* binding */ parseParametersFromURL; },\n/* harmony export */ parseResponseAPIVersion: function() { return /* binding */ parseResponseAPIVersion; },\n/* harmony export */ removeItemAsync: function() { return /* binding */ removeItemAsync; },\n/* harmony export */ resolveFetch: function() { return /* binding */ resolveFetch; },\n/* harmony export */ retryable: function() { return /* binding */ retryable; },\n/* harmony export */ setItemAsync: function() { return /* binding */ setItemAsync; },\n/* harmony export */ sleep: function() { return /* binding */ sleep; },\n/* harmony export */ supportsLocalStorage: function() { return /* binding */ supportsLocalStorage; },\n/* harmony export */ userNotAvailableProxy: function() { return /* binding */ userNotAvailableProxy; },\n/* harmony export */ validateExp: function() { return /* binding */ validateExp; },\n/* harmony export */ validateUUID: function() { return /* binding */ validateUUID; }\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./errors */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _base64url__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base64url */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js\");\n\n\n\nfunction expiresAt(expiresIn) {\n const timeNow = Math.round(Date.now() / 1000);\n return timeNow + expiresIn;\n}\n/**\n * Generates a unique identifier for internal callback subscriptions.\n *\n * This function uses JavaScript Symbols to create guaranteed-unique identifiers\n * for auth state change callbacks. Symbols are ideal for this use case because:\n * - They are guaranteed unique by the JavaScript runtime\n * - They work in all environments (browser, SSR, Node.js)\n * - They avoid issues with Next.js 16 deterministic rendering requirements\n * - They are perfect for internal, non-serializable identifiers\n *\n * Note: This function is only used for internal subscription management,\n * not for security-critical operations like session tokens.\n */ function generateCallbackId() {\n return Symbol(\"auth-callback\");\n}\nconst isBrowser = ()=> true && typeof document !== \"undefined\";\nconst localStorageWriteTests = {\n tested: false,\n writable: false\n};\n/**\n * Checks whether localStorage is supported on this browser.\n */ const supportsLocalStorage = ()=>{\n if (!isBrowser()) {\n return false;\n }\n try {\n if (typeof globalThis.localStorage !== \"object\") {\n return false;\n }\n } catch (e) {\n // DOM exception when accessing `localStorage`\n return false;\n }\n if (localStorageWriteTests.tested) {\n return localStorageWriteTests.writable;\n }\n const randomKey = \"lswt-\".concat(Math.random()).concat(Math.random());\n try {\n globalThis.localStorage.setItem(randomKey, randomKey);\n globalThis.localStorage.removeItem(randomKey);\n localStorageWriteTests.tested = true;\n localStorageWriteTests.writable = true;\n } catch (e) {\n // localStorage can't be written to\n // https://www.chromium.org/for-testers/bug-reporting-guidelines/uncaught-securityerror-failed-to-read-the-localstorage-property-from-window-access-is-denied-for-this-document\n localStorageWriteTests.tested = true;\n localStorageWriteTests.writable = false;\n }\n return localStorageWriteTests.writable;\n};\n/**\n * Extracts parameters encoded in the URL both in the query and fragment.\n */ function parseParametersFromURL(href) {\n const result = {};\n const url = new URL(href);\n if (url.hash && url.hash[0] === \"#\") {\n try {\n const hashSearchParams = new URLSearchParams(url.hash.substring(1));\n hashSearchParams.forEach((value, key)=>{\n result[key] = value;\n });\n } catch (e) {\n // hash is not a query string\n }\n }\n // search parameters take precedence over hash parameters\n url.searchParams.forEach((value, key)=>{\n result[key] = value;\n });\n return result;\n}\nconst resolveFetch = (customFetch)=>{\n if (customFetch) {\n return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return customFetch(...args);\n };\n }\n return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return fetch(...args);\n };\n};\nconst looksLikeFetchResponse = (maybeResponse)=>{\n return typeof maybeResponse === \"object\" && maybeResponse !== null && \"status\" in maybeResponse && \"ok\" in maybeResponse && \"json\" in maybeResponse && typeof maybeResponse.json === \"function\";\n};\n// Storage helpers\nconst setItemAsync = async (storage, key, data)=>{\n await storage.setItem(key, JSON.stringify(data));\n};\nconst getItemAsync = async (storage, key)=>{\n const value = await storage.getItem(key);\n if (!value) {\n return null;\n }\n try {\n return JSON.parse(value);\n } catch (_a) {\n return value;\n }\n};\nconst removeItemAsync = async (storage, key)=>{\n await storage.removeItem(key);\n};\n/**\n * A deferred represents some asynchronous work that is not yet finished, which\n * may or may not culminate in a value.\n * Taken from: https://github.com/mike-north/types/blob/master/src/async.ts\n */ class Deferred {\n constructor(){\n // eslint-disable-next-line @typescript-eslint/no-extra-semi\n ;\n this.promise = new Deferred.promiseConstructor((res, rej)=>{\n // eslint-disable-next-line @typescript-eslint/no-extra-semi\n ;\n this.resolve = res;\n this.reject = rej;\n });\n }\n}\nDeferred.promiseConstructor = Promise;\nfunction decodeJWT(token) {\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n throw new _errors__WEBPACK_IMPORTED_MODULE_1__.AuthInvalidJwtError(\"Invalid JWT structure\");\n }\n // Regex checks for base64url format\n for(let i = 0; i < parts.length; i++){\n if (!_constants__WEBPACK_IMPORTED_MODULE_0__.BASE64URL_REGEX.test(parts[i])) {\n throw new _errors__WEBPACK_IMPORTED_MODULE_1__.AuthInvalidJwtError(\"JWT not in base64url format\");\n }\n }\n const data = {\n // using base64url lib\n header: JSON.parse((0,_base64url__WEBPACK_IMPORTED_MODULE_2__.stringFromBase64URL)(parts[0])),\n payload: JSON.parse((0,_base64url__WEBPACK_IMPORTED_MODULE_2__.stringFromBase64URL)(parts[1])),\n signature: (0,_base64url__WEBPACK_IMPORTED_MODULE_2__.base64UrlToUint8Array)(parts[2]),\n raw: {\n header: parts[0],\n payload: parts[1]\n }\n };\n return data;\n}\n/**\n * Creates a promise that resolves to null after some time.\n */ async function sleep(time) {\n return await new Promise((accept)=>{\n setTimeout(()=>accept(null), time);\n });\n}\n/**\n * Converts the provided async function into a retryable function. Each result\n * or thrown error is sent to the isRetryable function which should return true\n * if the function should run again.\n */ function retryable(fn, isRetryable) {\n const promise = new Promise((accept, reject)=>{\n // eslint-disable-next-line @typescript-eslint/no-extra-semi\n ;\n (async ()=>{\n for(let attempt = 0; attempt < Infinity; attempt++){\n try {\n const result = await fn(attempt);\n if (!isRetryable(attempt, null, result)) {\n accept(result);\n return;\n }\n } catch (e) {\n if (!isRetryable(attempt, e)) {\n reject(e);\n return;\n }\n }\n }\n })();\n });\n return promise;\n}\nfunction dec2hex(dec) {\n return (\"0\" + dec.toString(16)).substr(-2);\n}\n// Functions below taken from: https://stackoverflow.com/questions/63309409/creating-a-code-verifier-and-challenge-for-pkce-auth-on-spotify-api-in-reactjs\nfunction generatePKCEVerifier() {\n const verifierLength = 56;\n const array = new Uint32Array(verifierLength);\n if (typeof crypto === \"undefined\") {\n const charSet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~\";\n const charSetLen = charSet.length;\n let verifier = \"\";\n for(let i = 0; i < verifierLength; i++){\n verifier += charSet.charAt(Math.floor(Math.random() * charSetLen));\n }\n return verifier;\n }\n crypto.getRandomValues(array);\n return Array.from(array, dec2hex).join(\"\");\n}\nasync function sha256(randomString) {\n const encoder = new TextEncoder();\n const encodedData = encoder.encode(randomString);\n const hash = await crypto.subtle.digest(\"SHA-256\", encodedData);\n const bytes = new Uint8Array(hash);\n return Array.from(bytes).map((c)=>String.fromCharCode(c)).join(\"\");\n}\nasync function generatePKCEChallenge(verifier) {\n const hasCryptoSupport = typeof crypto !== \"undefined\" && typeof crypto.subtle !== \"undefined\" && typeof TextEncoder !== \"undefined\";\n if (!hasCryptoSupport) {\n console.warn(\"WebCrypto API is not supported. Code challenge method will default to use plain instead of sha256.\");\n return verifier;\n }\n const hashed = await sha256(verifier);\n return btoa(hashed).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\nasync function getCodeChallengeAndMethod(storage, storageKey) {\n let isPasswordRecovery = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;\n const codeVerifier = generatePKCEVerifier();\n let storedCodeVerifier = codeVerifier;\n if (isPasswordRecovery) {\n storedCodeVerifier += \"/PASSWORD_RECOVERY\";\n }\n await setItemAsync(storage, \"\".concat(storageKey, \"-code-verifier\"), storedCodeVerifier);\n const codeChallenge = await generatePKCEChallenge(codeVerifier);\n const codeChallengeMethod = codeVerifier === codeChallenge ? \"plain\" : \"s256\";\n return [\n codeChallenge,\n codeChallengeMethod\n ];\n}\n/** Parses the API version which is 2YYY-MM-DD. */ const API_VERSION_REGEX = /^2[0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$/i;\nfunction parseResponseAPIVersion(response) {\n const apiVersion = response.headers.get(_constants__WEBPACK_IMPORTED_MODULE_0__.API_VERSION_HEADER_NAME);\n if (!apiVersion) {\n return null;\n }\n if (!apiVersion.match(API_VERSION_REGEX)) {\n return null;\n }\n try {\n const date = new Date(\"\".concat(apiVersion, \"T00:00:00.0Z\"));\n return date;\n } catch (e) {\n return null;\n }\n}\nfunction validateExp(exp) {\n if (!exp) {\n throw new Error(\"Missing exp claim\");\n }\n const timeNow = Math.floor(Date.now() / 1000);\n if (exp <= timeNow) {\n throw new Error(\"JWT has expired\");\n }\n}\nfunction getAlgorithm(alg) {\n switch(alg){\n case \"RS256\":\n return {\n name: \"RSASSA-PKCS1-v1_5\",\n hash: {\n name: \"SHA-256\"\n }\n };\n case \"ES256\":\n return {\n name: \"ECDSA\",\n namedCurve: \"P-256\",\n hash: {\n name: \"SHA-256\"\n }\n };\n default:\n throw new Error(\"Invalid alg claim\");\n }\n}\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\nfunction validateUUID(str) {\n if (!UUID_REGEX.test(str)) {\n throw new Error(\"@supabase/auth-js: Expected parameter to be UUID but is not\");\n }\n}\nfunction userNotAvailableProxy() {\n const proxyTarget = {};\n return new Proxy(proxyTarget, {\n get: (target, prop)=>{\n if (prop === \"__isUserNotAvailableProxy\") {\n return true;\n }\n // Preventative check for common problematic symbols during cloning/inspection\n // These symbols might be accessed by structuredClone or other internal mechanisms.\n if (typeof prop === \"symbol\") {\n const sProp = prop.toString();\n if (sProp === \"Symbol(Symbol.toPrimitive)\" || sProp === \"Symbol(Symbol.toStringTag)\" || sProp === \"Symbol(util.inspect.custom)\") {\n // Node.js util.inspect\n return undefined;\n }\n }\n throw new Error('@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Accessing the \"'.concat(prop, '\" property of the session object is not supported. Please use getUser() instead.'));\n },\n set: (_target, prop)=>{\n throw new Error('@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Setting the \"'.concat(prop, '\" property of the session object is not supported. Please use getUser() to fetch a user object you can manipulate.'));\n },\n deleteProperty: (_target, prop)=>{\n throw new Error('@supabase/auth-js: client was created with userStorage option and there was no user stored in the user storage. Deleting the \"'.concat(prop, '\" property of the session object is not supported. Please use getUser() to fetch a user object you can manipulate.'));\n }\n });\n}\n/**\n * Creates a proxy around a user object that warns when properties are accessed on the server.\n * This is used to alert developers that using user data from getSession() on the server is insecure.\n *\n * @param user The actual user object to wrap\n * @param suppressWarningRef An object with a 'value' property that controls warning suppression\n * @returns A proxied user object that warns on property access\n */ function insecureUserWarningProxy(user, suppressWarningRef) {\n return new Proxy(user, {\n get: (target, prop, receiver)=>{\n // Allow internal checks without warning\n if (prop === \"__isInsecureUserWarningProxy\") {\n return true;\n }\n // Preventative check for common problematic symbols during cloning/inspection\n // These symbols might be accessed by structuredClone or other internal mechanisms\n if (typeof prop === \"symbol\") {\n const sProp = prop.toString();\n if (sProp === \"Symbol(Symbol.toPrimitive)\" || sProp === \"Symbol(Symbol.toStringTag)\" || sProp === \"Symbol(util.inspect.custom)\" || sProp === \"Symbol(nodejs.util.inspect.custom)\") {\n // Return the actual value for these symbols to allow proper inspection\n return Reflect.get(target, prop, receiver);\n }\n }\n // Emit warning on first property access\n if (!suppressWarningRef.value && typeof prop === \"string\") {\n console.warn(\"Using the user object as returned from supabase.auth.getSession() or from some supabase.auth.onAuthStateChange() events could be insecure! This value comes directly from the storage medium (usually cookies on the server) and may not be authentic. Use supabase.auth.getUser() instead which authenticates the data by contacting the Supabase Auth server.\");\n suppressWarningRef.value = true;\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n}\n/**\n * Deep clones a JSON-serializable object using JSON.parse(JSON.stringify(obj)).\n * Note: Only works for JSON-safe data.\n */ function deepClone(obj) {\n return JSON.parse(JSON.stringify(obj));\n} //# sourceMappingURL=helpers.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvaGVscGVycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBdUU7QUFDeEI7QUFDMEI7QUFDbEUsU0FBU0ssVUFBVUMsU0FBUztJQUMvQixNQUFNQyxVQUFVQyxLQUFLQyxLQUFLLENBQUNDLEtBQUtDLEdBQUcsS0FBSztJQUN4QyxPQUFPSixVQUFVRDtBQUNyQjtBQUNBOzs7Ozs7Ozs7Ozs7Q0FZQyxHQUNNLFNBQVNNO0lBQ1osT0FBT0MsT0FBTztBQUNsQjtBQUNPLE1BQU1DLFlBQVksSUFBTSxLQUFrQixJQUFlLE9BQU9DLGFBQWEsWUFBWTtBQUNoRyxNQUFNQyx5QkFBeUI7SUFDM0JDLFFBQVE7SUFDUkMsVUFBVTtBQUNkO0FBQ0E7O0NBRUMsR0FDTSxNQUFNQyx1QkFBdUI7SUFDaEMsSUFBSSxDQUFDTCxhQUFhO1FBQ2QsT0FBTztJQUNYO0lBQ0EsSUFBSTtRQUNBLElBQUksT0FBT00sV0FBV0MsWUFBWSxLQUFLLFVBQVU7WUFDN0MsT0FBTztRQUNYO0lBQ0osRUFDQSxPQUFPQyxHQUFHO1FBQ04sOENBQThDO1FBQzlDLE9BQU87SUFDWDtJQUNBLElBQUlOLHVCQUF1QkMsTUFBTSxFQUFFO1FBQy9CLE9BQU9ELHVCQUF1QkUsUUFBUTtJQUMxQztJQUNBLE1BQU1LLFlBQVksUUFBd0JmLE9BQWhCQSxLQUFLZ0IsTUFBTSxJQUFtQixPQUFkaEIsS0FBS2dCLE1BQU07SUFDckQsSUFBSTtRQUNBSixXQUFXQyxZQUFZLENBQUNJLE9BQU8sQ0FBQ0YsV0FBV0E7UUFDM0NILFdBQVdDLFlBQVksQ0FBQ0ssVUFBVSxDQUFDSDtRQUNuQ1AsdUJBQXVCQyxNQUFNLEdBQUc7UUFDaENELHVCQUF1QkUsUUFBUSxHQUFHO0lBQ3RDLEVBQ0EsT0FBT0ksR0FBRztRQUNOLG1DQUFtQztRQUNuQywrS0FBK0s7UUFD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VSxnQ0FDVkEsVUFBVSxnQ0FDVkEsVUFBVSxpQ0FDVkEsVUFBVSxzQ0FBc0M7b0JBQ2hELHVFQUF1RTtvQkFDdkUsT0FBT1MsUUFBUTNCLEdBQUcsQ0FBQ2dCLFFBQVFDLE1BQU1TO2dCQUNyQztZQUNKO1lBQ0Esd0NBQXdDO1lBQ3hDLElBQUksQ0FBQ0QsbUJBQW1CN0gsS0FBSyxJQUFJLE9BQU9xSCxTQUFTLFVBQVU7Z0JBQ3ZEbEMsUUFBUUMsSUFBSSxDQUFDO2dCQUNieUMsbUJBQW1CN0gsS0FBSyxHQUFHO1lBQy9CO1lBQ0EsT0FBTytILFFBQVEzQixHQUFHLENBQUNnQixRQUFRQyxNQUFNUztRQUNyQztJQUNKO0FBQ0o7QUFDQTs7O0NBR0MsR0FDTSxTQUFTRSxVQUFVQyxHQUFHO0lBQ3pCLE9BQU9wSCxLQUFLSSxLQUFLLENBQUNKLEtBQUtDLFNBQVMsQ0FBQ21IO0FBQ3JDLEVBQ0EsbUNBQW1DIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvaGVscGVycy5qcz81YTY4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQSV9WRVJTSU9OX0hFQURFUl9OQU1FLCBCQVNFNjRVUkxfUkVHRVggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBdXRoSW52YWxpZEp3dEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgYmFzZTY0VXJsVG9VaW50OEFycmF5LCBzdHJpbmdGcm9tQmFzZTY0VVJMIH0gZnJvbSAnLi9iYXNlNjR1cmwnO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGlyZXNBdChleHBpcmVzSW4pIHtcbiAgICBjb25zdCB0aW1lTm93ID0gTWF0aC5yb3VuZChEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgcmV0dXJuIHRpbWVOb3cgKyBleHBpcmVzSW47XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBpbnRlcm5hbCBjYWxsYmFjayBzdWJzY3JpcHRpb25zLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBKYXZhU2NyaXB0IFN5bWJvbHMgdG8gY3JlYXRlIGd1YXJhbnRlZWQtdW5pcXVlIGlkZW50aWZpZXJzXG4gKiBmb3IgYXV0aCBzdGF0ZSBjaGFuZ2UgY2FsbGJhY2tzLiBTeW1ib2xzIGFyZSBpZGVhbCBmb3IgdGhpcyB1c2UgY2FzZSBiZWNhdXNlOlxuICogLSBUaGV5IGFyZSBndWFyYW50ZWVkIHVuaXF1ZSBieSB0aGUgSmF2YVNjcmlwdCBydW50aW1lXG4gKiAtIFRoZXkgd29yayBpbiBhbGwgZW52aXJvbm1lbnRzIChicm93c2VyLCBTU1IsIE5vZGUuanMpXG4gKiAtIFRoZXkgYXZvaWQgaXNzdWVzIHdpdGggTmV4dC5qcyAxNiBkZXRlcm1pbmlzdGljIHJlbmRlcmluZyByZXF1aXJlbWVudHNcbiAqIC0gVGhleSBhcmUgcGVyZmVjdCBmb3IgaW50ZXJuYWwsIG5vbi1zZXJpYWxpemFibGUgaWRlbnRpZmllcnNcbiAqXG4gKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3IgaW50ZXJuYWwgc3Vic2NyaXB0aW9uIG1hbmFnZW1lbnQsXG4gKiBub3QgZm9yIHNlY3VyaXR5LWNyaXRpY2FsIG9wZXJhdGlvbnMgbGlrZSBzZXNzaW9uIHRva2Vucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ2FsbGJhY2tJZCgpIHtcbiAgICByZXR1cm4gU3ltYm9sKCdhdXRoLWNhbGxiYWNrJyk7XG59XG5leHBvcnQgY29uc3QgaXNCcm93c2VyID0gKCkgPT4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbmNvbnN0IGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMgPSB7XG4gICAgdGVzdGVkOiBmYWxzZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG59O1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBsb2NhbFN0b3JhZ2UgaXMgc3VwcG9ydGVkIG9uIHRoaXMgYnJvd3Nlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHN1cHBvcnRzTG9jYWxTdG9yYWdlID0gKCkgPT4ge1xuICAgIGlmICghaXNCcm93c2VyKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMubG9jYWxTdG9yYWdlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIERPTSBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcgYGxvY2FsU3RvcmFnZWBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobG9jYWxTdG9yYWdlV3JpdGVUZXN0cy50ZXN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMud3JpdGFibGU7XG4gICAgfVxuICAgIGNvbnN0IHJhbmRvbUtleSA9IGBsc3d0LSR7TWF0aC5yYW5kb20oKX0ke01hdGgucmFuZG9tKCl9YDtcbiAgICB0cnkge1xuICAgICAgICBnbG9iYWxUaGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHJhbmRvbUtleSwgcmFuZG9tS2V5KTtcbiAgICAgICAgZ2xvYmFsVGhpcy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShyYW5kb21LZXkpO1xuICAgICAgICBsb2NhbFN0b3JhZ2VXcml0ZVRlc3RzLnRlc3RlZCA9IHRydWU7XG4gICAgICAgIGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMud3JpdGFibGUgPSB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAvLyBsb2NhbFN0b3JhZ2UgY2FuJ3QgYmUgd3JpdHRlbiB0b1xuICAgICAgICAvLyBodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvZm9yLXRlc3RlcnMvYnVnLXJlcG9ydGluZy1ndWlkZWxpbmVzL3VuY2F1Z2h0LXNlY3VyaXR5ZXJyb3ItZmFpbGVkLXRvLXJlYWQtdGhlLWxvY2Fsc3RvcmFnZS1wcm9wZXJ0eS1mcm9tLXdpbmRvdy1hY2Nlc3MtaXMtZGVuaWVkLWZvci10aGlzLWRvY3VtZW50XG4gICAgICAgIGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMudGVzdGVkID0gdHJ1ZTtcbiAgICAgICAgbG9jYWxTdG9yYWdlV3JpdGVUZXN0cy53cml0YWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlV3JpdGVUZXN0cy53cml0YWJsZTtcbn07XG4vKipcbiAqIEV4dHJhY3RzIHBhcmFtZXRlcnMgZW5jb2RlZCBpbiB0aGUgVVJMIGJvdGggaW4gdGhlIHF1ZXJ5IGFuZCBmcmFnbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGFyYW1ldGVyc0Zyb21VUkwoaHJlZikge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoaHJlZik7XG4gICAgaWYgKHVybC5oYXNoICYmIHVybC5oYXNoWzBdID09PSAnIycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhhc2hTZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5oYXNoLnN1YnN0cmluZygxKSk7XG4gICAgICAgICAgICBoYXNoU2VhcmNoUGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGhhc2ggaXMgbm90IGEgcXVlcnkgc3RyaW5nXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gc2VhcmNoIHBhcmFtZXRlcnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgaGFzaCBwYXJhbWV0ZXJzXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCByZXNvbHZlRmV0Y2ggPSAoY3VzdG9tRmV0Y2gpID0+IHtcbiAgICBpZiAoY3VzdG9tRmV0Y2gpIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiBjdXN0b21GZXRjaCguLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiBmZXRjaCguLi5hcmdzKTtcbn07XG5leHBvcnQgY29uc3QgbG9va3NMaWtlRmV0Y2hSZXNwb25zZSA9IChtYXliZVJlc3BvbnNlKSA9PiB7XG4gICAgcmV0dXJuICh0eXBlb2YgbWF5YmVSZXNwb25zZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgbWF5YmVSZXNwb25zZSAhPT0gbnVsbCAmJlxuICAgICAgICAnc3RhdHVzJyBpbiBtYXliZVJlc3BvbnNlICYmXG4gICAgICAgICdvaycgaW4gbWF5YmVSZXNwb25zZSAmJlxuICAgICAgICAnanNvbicgaW4gbWF5YmVSZXNwb25zZSAmJlxuICAgICAgICB0eXBlb2YgbWF5YmVSZXNwb25zZS5qc29uID09PSAnZnVuY3Rpb24nKTtcbn07XG4vLyBTdG9yYWdlIGhlbHBlcnNcbmV4cG9ydCBjb25zdCBzZXRJdGVtQXN5bmMgPSBhc3luYyAoc3RvcmFnZSwga2V5LCBkYXRhKSA9PiB7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRJdGVtQXN5bmMgPSBhc3luYyAoc3RvcmFnZSwga2V5KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBzdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCByZW1vdmVJdGVtQXN5bmMgPSBhc3luYyAoc3RvcmFnZSwga2V5KSA9PiB7XG4gICAgYXdhaXQgc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG59O1xuLyoqXG4gKiBBIGRlZmVycmVkIHJlcHJlc2VudHMgc29tZSBhc3luY2hyb25vdXMgd29yayB0aGF0IGlzIG5vdCB5ZXQgZmluaXNoZWQsIHdoaWNoXG4gKiBtYXkgb3IgbWF5IG5vdCBjdWxtaW5hdGUgaW4gYSB2YWx1ZS5cbiAqIFRha2VuIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9taWtlLW5vcnRoL3R5cGVzL2Jsb2IvbWFzdGVyL3NyYy9hc3luYy50c1xuICovXG5leHBvcnQgY2xhc3MgRGVmZXJyZWQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4dHJhLXNlbWlcbiAgICAgICAgO1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgRGVmZXJyZWQucHJvbWlzZUNvbnN0cnVjdG9yKChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHRyYS1zZW1pXG4gICAgICAgICAgICA7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXM7XG4gICAgICAgICAgICB0aGlzLnJlamVjdCA9IHJlajtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuRGVmZXJyZWQucHJvbWlzZUNvbnN0cnVjdG9yID0gUHJvbWlzZTtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVKV1QodG9rZW4pIHtcbiAgICBjb25zdCBwYXJ0cyA9IHRva2VuLnNwbGl0KCcuJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEludmFsaWRKd3RFcnJvcignSW52YWxpZCBKV1Qgc3RydWN0dXJlJyk7XG4gICAgfVxuICAgIC8vIFJlZ2V4IGNoZWNrcyBmb3IgYmFzZTY0dXJsIGZvcm1hdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFCQVNFNjRVUkxfUkVHRVgudGVzdChwYXJ0c1tpXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBdXRoSW52YWxpZEp3dEVycm9yKCdKV1Qgbm90IGluIGJhc2U2NHVybCBmb3JtYXQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAvLyB1c2luZyBiYXNlNjR1cmwgbGliXG4gICAgICAgIGhlYWRlcjogSlNPTi5wYXJzZShzdHJpbmdGcm9tQmFzZTY0VVJMKHBhcnRzWzBdKSksXG4gICAgICAgIHBheWxvYWQ6IEpTT04ucGFyc2Uoc3RyaW5nRnJvbUJhc2U2NFVSTChwYXJ0c1sxXSkpLFxuICAgICAgICBzaWduYXR1cmU6IGJhc2U2NFVybFRvVWludDhBcnJheShwYXJ0c1syXSksXG4gICAgICAgIHJhdzoge1xuICAgICAgICAgICAgaGVhZGVyOiBwYXJ0c1swXSxcbiAgICAgICAgICAgIHBheWxvYWQ6IHBhcnRzWzFdLFxuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIGRhdGE7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gbnVsbCBhZnRlciBzb21lIHRpbWUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcCh0aW1lKSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChhY2NlcHQpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBhY2NlcHQobnVsbCksIHRpbWUpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgcHJvdmlkZWQgYXN5bmMgZnVuY3Rpb24gaW50byBhIHJldHJ5YWJsZSBmdW5jdGlvbi4gRWFjaCByZXN1bHRcbiAqIG9yIHRocm93biBlcnJvciBpcyBzZW50IHRvIHRoZSBpc1JldHJ5YWJsZSBmdW5jdGlvbiB3aGljaCBzaG91bGQgcmV0dXJuIHRydWVcbiAqIGlmIHRoZSBmdW5jdGlvbiBzaG91bGQgcnVuIGFnYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV0cnlhYmxlKGZuLCBpc1JldHJ5YWJsZSkge1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoYWNjZXB0LCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHRyYS1zZW1pXG4gICAgICAgIDtcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgSW5maW5pdHk7IGF0dGVtcHQrKykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGF0dGVtcHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUmV0cnlhYmxlKGF0dGVtcHQsIG51bGwsIHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNSZXRyeWFibGUoYXR0ZW1wdCwgZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGRlYzJoZXgoZGVjKSB7XG4gICAgcmV0dXJuICgnMCcgKyBkZWMudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTIpO1xufVxuLy8gRnVuY3Rpb25zIGJlbG93IHRha2VuIGZyb206IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYzMzA5NDA5L2NyZWF0aW5nLWEtY29kZS12ZXJpZmllci1hbmQtY2hhbGxlbmdlLWZvci1wa2NlLWF1dGgtb24tc3BvdGlmeS1hcGktaW4tcmVhY3Rqc1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUEtDRVZlcmlmaWVyKCkge1xuICAgIGNvbnN0IHZlcmlmaWVyTGVuZ3RoID0gNTY7XG4gICAgY29uc3QgYXJyYXkgPSBuZXcgVWludDMyQXJyYXkodmVyaWZpZXJMZW5ndGgpO1xuICAgIGlmICh0eXBlb2YgY3J5cHRvID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCBjaGFyU2V0ID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LS5ffic7XG4gICAgICAgIGNvbnN0IGNoYXJTZXRMZW4gPSBjaGFyU2V0Lmxlbmd0aDtcbiAgICAgICAgbGV0IHZlcmlmaWVyID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVyaWZpZXJMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmVyaWZpZXIgKz0gY2hhclNldC5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhclNldExlbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2ZXJpZmllcjtcbiAgICB9XG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oYXJyYXksIGRlYzJoZXgpLmpvaW4oJycpO1xufVxuYXN5bmMgZnVuY3Rpb24gc2hhMjU2KHJhbmRvbVN0cmluZykge1xuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICBjb25zdCBlbmNvZGVkRGF0YSA9IGVuY29kZXIuZW5jb2RlKHJhbmRvbVN0cmluZyk7XG4gICAgY29uc3QgaGFzaCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgZW5jb2RlZERhdGEpO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoaGFzaCk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMpXG4gICAgICAgIC5tYXAoKGMpID0+IFN0cmluZy5mcm9tQ2hhckNvZGUoYykpXG4gICAgICAgIC5qb2luKCcnKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBLQ0VDaGFsbGVuZ2UodmVyaWZpZXIpIHtcbiAgICBjb25zdCBoYXNDcnlwdG9TdXBwb3J0ID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIGNyeXB0by5zdWJ0bGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgaWYgKCFoYXNDcnlwdG9TdXBwb3J0KSB7XG4gICAgICAgIGNvbnNvbGUud2FybignV2ViQ3J5cHRvIEFQSSBpcyBub3Qgc3VwcG9ydGVkLiBDb2RlIGNoYWxsZW5nZSBtZXRob2Qgd2lsbCBkZWZhdWx0IHRvIHVzZSBwbGFpbiBpbnN0ZWFkIG9mIHNoYTI1Ni4nKTtcbiAgICAgICAgcmV0dXJuIHZlcmlmaWVyO1xuICAgIH1cbiAgICBjb25zdCBoYXNoZWQgPSBhd2FpdCBzaGEyNTYodmVyaWZpZXIpO1xuICAgIHJldHVybiBidG9hKGhhc2hlZCkucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvZGVDaGFsbGVuZ2VBbmRNZXRob2Qoc3RvcmFnZSwgc3RvcmFnZUtleSwgaXNQYXNzd29yZFJlY292ZXJ5ID0gZmFsc2UpIHtcbiAgICBjb25zdCBjb2RlVmVyaWZpZXIgPSBnZW5lcmF0ZVBLQ0VWZXJpZmllcigpO1xuICAgIGxldCBzdG9yZWRDb2RlVmVyaWZpZXIgPSBjb2RlVmVyaWZpZXI7XG4gICAgaWYgKGlzUGFzc3dvcmRSZWNvdmVyeSkge1xuICAgICAgICBzdG9yZWRDb2RlVmVyaWZpZXIgKz0gJy9QQVNTV09SRF9SRUNPVkVSWSc7XG4gICAgfVxuICAgIGF3YWl0IHNldEl0ZW1Bc3luYyhzdG9yYWdlLCBgJHtzdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCwgc3RvcmVkQ29kZVZlcmlmaWVyKTtcbiAgICBjb25zdCBjb2RlQ2hhbGxlbmdlID0gYXdhaXQgZ2VuZXJhdGVQS0NFQ2hhbGxlbmdlKGNvZGVWZXJpZmllcik7XG4gICAgY29uc3QgY29kZUNoYWxsZW5nZU1ldGhvZCA9IGNvZGVWZXJpZmllciA9PT0gY29kZUNoYWxsZW5nZSA/ICdwbGFpbicgOiAnczI1Nic7XG4gICAgcmV0dXJuIFtjb2RlQ2hhbGxlbmdlLCBjb2RlQ2hhbGxlbmdlTWV0aG9kXTtcbn1cbi8qKiBQYXJzZXMgdGhlIEFQSSB2ZXJzaW9uIHdoaWNoIGlzIDJZWVktTU0tREQuICovXG5jb25zdCBBUElfVkVSU0lPTl9SRUdFWCA9IC9eMlswLTldezN9LSgwWzEtOV18MVswLTJdKS0oMFsxLTldfDFbMC05XXwyWzAtOV18M1swLTFdKSQvaTtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlc3BvbnNlQVBJVmVyc2lvbihyZXNwb25zZSkge1xuICAgIGNvbnN0IGFwaVZlcnNpb24gPSByZXNwb25zZS5oZWFkZXJzLmdldChBUElfVkVSU0lPTl9IRUFERVJfTkFNRSk7XG4gICAgaWYgKCFhcGlWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoIWFwaVZlcnNpb24ubWF0Y2goQVBJX1ZFUlNJT05fUkVHRVgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoYCR7YXBpVmVyc2lvbn1UMDA6MDA6MDAuMFpgKTtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUV4cChleHApIHtcbiAgICBpZiAoIWV4cCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZXhwIGNsYWltJyk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVOb3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBpZiAoZXhwIDw9IHRpbWVOb3cpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdKV1QgaGFzIGV4cGlyZWQnKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxnb3JpdGhtKGFsZykge1xuICAgIHN3aXRjaCAoYWxnKSB7XG4gICAgICAgIGNhc2UgJ1JTMjU2JzpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQVNTQS1QS0NTMS12MV81JyxcbiAgICAgICAgICAgICAgICBoYXNoOiB7IG5hbWU6ICdTSEEtMjU2JyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnRVMyNTYnOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRUNEU0EnLFxuICAgICAgICAgICAgICAgIG5hbWVkQ3VydmU6ICdQLTI1NicsXG4gICAgICAgICAgICAgICAgaGFzaDogeyBuYW1lOiAnU0hBLTI1NicgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYWxnIGNsYWltJyk7XG4gICAgfVxufVxuY29uc3QgVVVJRF9SRUdFWCA9IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC87XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVVVUlEKHN0cikge1xuICAgIGlmICghVVVJRF9SRUdFWC50ZXN0KHN0cikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc3VwYWJhc2UvYXV0aC1qczogRXhwZWN0ZWQgcGFyYW1ldGVyIHRvIGJlIFVVSUQgYnV0IGlzIG5vdCcpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VyTm90QXZhaWxhYmxlUHJveHkoKSB7XG4gICAgY29uc3QgcHJveHlUYXJnZXQgPSB7fTtcbiAgICByZXR1cm4gbmV3IFByb3h5KHByb3h5VGFyZ2V0LCB7XG4gICAgICAgIGdldDogKHRhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdfX2lzVXNlck5vdEF2YWlsYWJsZVByb3h5Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUHJldmVudGF0aXZlIGNoZWNrIGZvciBjb21tb24gcHJvYmxlbWF0aWMgc3ltYm9scyBkdXJpbmcgY2xvbmluZy9pbnNwZWN0aW9uXG4gICAgICAgICAgICAvLyBUaGVzZSBzeW1ib2xzIG1pZ2h0IGJlIGFjY2Vzc2VkIGJ5IHN0cnVjdHVyZWRDbG9uZSBvciBvdGhlciBpbnRlcm5hbCBtZWNoYW5pc21zLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNQcm9wID0gcHJvcC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmIChzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9QcmltaXRpdmUpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9TdHJpbmdUYWcpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbCh1dGlsLmluc3BlY3QuY3VzdG9tKScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm9kZS5qcyB1dGlsLmluc3BlY3RcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBjbGllbnQgd2FzIGNyZWF0ZWQgd2l0aCB1c2VyU3RvcmFnZSBvcHRpb24gYW5kIHRoZXJlIHdhcyBubyB1c2VyIHN0b3JlZCBpbiB0aGUgdXNlciBzdG9yYWdlLiBBY2Nlc3NpbmcgdGhlIFwiJHtwcm9wfVwiIHByb3BlcnR5IG9mIHRoZSBzZXNzaW9uIG9iamVjdCBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIGdldFVzZXIoKSBpbnN0ZWFkLmApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBjbGllbnQgd2FzIGNyZWF0ZWQgd2l0aCB1c2VyU3RvcmFnZSBvcHRpb24gYW5kIHRoZXJlIHdhcyBubyB1c2VyIHN0b3JlZCBpbiB0aGUgdXNlciBzdG9yYWdlLiBTZXR0aW5nIHRoZSBcIiR7cHJvcH1cIiBwcm9wZXJ0eSBvZiB0aGUgc2Vzc2lvbiBvYmplY3QgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBnZXRVc2VyKCkgdG8gZmV0Y2ggYSB1c2VyIG9iamVjdCB5b3UgY2FuIG1hbmlwdWxhdGUuYCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZVByb3BlcnR5OiAoX3RhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogY2xpZW50IHdhcyBjcmVhdGVkIHdpdGggdXNlclN0b3JhZ2Ugb3B0aW9uIGFuZCB0aGVyZSB3YXMgbm8gdXNlciBzdG9yZWQgaW4gdGhlIHVzZXIgc3RvcmFnZS4gRGVsZXRpbmcgdGhlIFwiJHtwcm9wfVwiIHByb3BlcnR5IG9mIHRoZSBzZXNzaW9uIG9iamVjdCBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIGdldFVzZXIoKSB0byBmZXRjaCBhIHVzZXIgb2JqZWN0IHlvdSBjYW4gbWFuaXB1bGF0ZS5gKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHByb3h5IGFyb3VuZCBhIHVzZXIgb2JqZWN0IHRoYXQgd2FybnMgd2hlbiBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZCBvbiB0aGUgc2VydmVyLlxuICogVGhpcyBpcyB1c2VkIHRvIGFsZXJ0IGRldmVsb3BlcnMgdGhhdCB1c2luZyB1c2VyIGRhdGEgZnJvbSBnZXRTZXNzaW9uKCkgb24gdGhlIHNlcnZlciBpcyBpbnNlY3VyZS5cbiAqXG4gKiBAcGFyYW0gdXNlciBUaGUgYWN0dWFsIHVzZXIgb2JqZWN0IHRvIHdyYXBcbiAqIEBwYXJhbSBzdXBwcmVzc1dhcm5pbmdSZWYgQW4gb2JqZWN0IHdpdGggYSAndmFsdWUnIHByb3BlcnR5IHRoYXQgY29udHJvbHMgd2FybmluZyBzdXBwcmVzc2lvblxuICogQHJldHVybnMgQSBwcm94aWVkIHVzZXIgb2JqZWN0IHRoYXQgd2FybnMgb24gcHJvcGVydHkgYWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlY3VyZVVzZXJXYXJuaW5nUHJveHkodXNlciwgc3VwcHJlc3NXYXJuaW5nUmVmKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh1c2VyLCB7XG4gICAgICAgIGdldDogKHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgICAgIC8vIEFsbG93IGludGVybmFsIGNoZWNrcyB3aXRob3V0IHdhcm5pbmdcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnX19pc0luc2VjdXJlVXNlcldhcm5pbmdQcm94eScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFByZXZlbnRhdGl2ZSBjaGVjayBmb3IgY29tbW9uIHByb2JsZW1hdGljIHN5bWJvbHMgZHVyaW5nIGNsb25pbmcvaW5zcGVjdGlvblxuICAgICAgICAgICAgLy8gVGhlc2Ugc3ltYm9scyBtaWdodCBiZSBhY2Nlc3NlZCBieSBzdHJ1Y3R1cmVkQ2xvbmUgb3Igb3RoZXIgaW50ZXJuYWwgbWVjaGFuaXNtc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNQcm9wID0gcHJvcC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmIChzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9QcmltaXRpdmUpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9TdHJpbmdUYWcpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbCh1dGlsLmluc3BlY3QuY3VzdG9tKScgfHxcbiAgICAgICAgICAgICAgICAgICAgc1Byb3AgPT09ICdTeW1ib2wobm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20pJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGFjdHVhbCB2YWx1ZSBmb3IgdGhlc2Ugc3ltYm9scyB0byBhbGxvdyBwcm9wZXIgaW5zcGVjdGlvblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW1pdCB3YXJuaW5nIG9uIGZpcnN0IHByb3BlcnR5IGFjY2Vzc1xuICAgICAgICAgICAgaWYgKCFzdXBwcmVzc1dhcm5pbmdSZWYudmFsdWUgJiYgdHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdVc2luZyB0aGUgdXNlciBvYmplY3QgYXMgcmV0dXJuZWQgZnJvbSBzdXBhYmFzZS5hdXRoLmdldFNlc3Npb24oKSBvciBmcm9tIHNvbWUgc3VwYWJhc2UuYXV0aC5vbkF1dGhTdGF0ZUNoYW5nZSgpIGV2ZW50cyBjb3VsZCBiZSBpbnNlY3VyZSEgVGhpcyB2YWx1ZSBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBzdG9yYWdlIG1lZGl1bSAodXN1YWxseSBjb29raWVzIG9uIHRoZSBzZXJ2ZXIpIGFuZCBtYXkgbm90IGJlIGF1dGhlbnRpYy4gVXNlIHN1cGFiYXNlLmF1dGguZ2V0VXNlcigpIGluc3RlYWQgd2hpY2ggYXV0aGVudGljYXRlcyB0aGUgZGF0YSBieSBjb250YWN0aW5nIHRoZSBTdXBhYmFzZSBBdXRoIHNlcnZlci4nKTtcbiAgICAgICAgICAgICAgICBzdXBwcmVzc1dhcm5pbmdSZWYudmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuLyoqXG4gKiBEZWVwIGNsb25lcyBhIEpTT04tc2VyaWFsaXphYmxlIG9iamVjdCB1c2luZyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpLlxuICogTm90ZTogT25seSB3b3JrcyBmb3IgSlNPTi1zYWZlIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmUob2JqKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXJzLmpzLm1hcCJdLCJuYW1lcyI6WyJBUElfVkVSU0lPTl9IRUFERVJfTkFNRSIsIkJBU0U2NFVSTF9SRUdFWCIsIkF1dGhJbnZhbGlkSnd0RXJyb3IiLCJiYXNlNjRVcmxUb1VpbnQ4QXJyYXkiLCJzdHJpbmdGcm9tQmFzZTY0VVJMIiwiZXhwaXJlc0F0IiwiZXhwaXJlc0luIiwidGltZU5vdyIsIk1hdGgiLCJyb3VuZCIsIkRhdGUiLCJub3ciLCJnZW5lcmF0ZUNhbGxiYWNrSWQiLCJTeW1ib2wiLCJpc0Jyb3dzZXIiLCJkb2N1bWVudCIsImxvY2FsU3RvcmFnZVdyaXRlVGVzdHMiLCJ0ZXN0ZWQiLCJ3cml0YWJsZSIsInN1cHBvcnRzTG9jYWxTdG9yYWdlIiwiZ2xvYmFsVGhpcyIsImxvY2FsU3RvcmFnZSIsImUiLCJyYW5kb21LZXkiLCJyYW5kb20iLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsInBhcnNlUGFyYW1ldGVyc0Zyb21VUkwiLCJocmVmIiwicmVzdWx0IiwidXJsIiwiVVJMIiwiaGFzaCIsImhhc2hTZWFyY2hQYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJzdWJzdHJpbmciLCJmb3JFYWNoIiwidmFsdWUiLCJrZXkiLCJzZWFyY2hQYXJhbXMiLCJyZXNvbHZlRmV0Y2giLCJjdXN0b21GZXRjaCIsImFyZ3MiLCJmZXRjaCIsImxvb2tzTGlrZUZldGNoUmVzcG9uc2UiLCJtYXliZVJlc3BvbnNlIiwianNvbiIsInNldEl0ZW1Bc3luYyIsInN0b3JhZ2UiLCJkYXRhIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldEl0ZW1Bc3luYyIsImdldEl0ZW0iLCJwYXJzZSIsIl9hIiwicmVtb3ZlSXRlbUFzeW5jIiwiRGVmZXJyZWQiLCJjb25zdHJ1Y3RvciIsInByb21pc2UiLCJwcm9taXNlQ29uc3RydWN0b3IiLCJyZXMiLCJyZWoiLCJyZXNvbHZlIiwicmVqZWN0IiwiUHJvbWlzZSIsImRlY29kZUpXVCIsInRva2VuIiwicGFydHMiLCJzcGxpdCIsImxlbmd0aCIsImkiLCJ0ZXN0IiwiaGVhZGVyIiwicGF5bG9hZCIsInNpZ25hdHVyZSIsInJhdyIsInNsZWVwIiwidGltZSIsImFjY2VwdCIsInNldFRpbWVvdXQiLCJyZXRyeWFibGUiLCJmbiIsImlzUmV0cnlhYmxlIiwiYXR0ZW1wdCIsIkluZmluaXR5IiwiZGVjMmhleCIsImRlYyIsInRvU3RyaW5nIiwic3Vic3RyIiwiZ2VuZXJhdGVQS0NFVmVyaWZpZXIiLCJ2ZXJpZmllckxlbmd0aCIsImFycmF5IiwiVWludDMyQXJyYXkiLCJjcnlwdG8iLCJjaGFyU2V0IiwiY2hhclNldExlbiIsInZlcmlmaWVyIiwiY2hhckF0IiwiZmxvb3IiLCJnZXRSYW5kb21WYWx1ZXMiLCJBcnJheSIsImZyb20iLCJqb2luIiwic2hhMjU2IiwicmFuZG9tU3RyaW5nIiwiZW5jb2RlciIsIlRleHRFbmNvZGVyIiwiZW5jb2RlZERhdGEiLCJlbmNvZGUiLCJzdWJ0bGUiLCJkaWdlc3QiLCJieXRlcyIsIlVpbnQ4QXJyYXkiLCJtYXAiLCJjIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiZ2VuZXJhdGVQS0NFQ2hhbGxlbmdlIiwiaGFzQ3J5cHRvU3VwcG9ydCIsImNvbnNvbGUiLCJ3YXJuIiwiaGFzaGVkIiwiYnRvYSIsInJlcGxhY2UiLCJnZXRDb2RlQ2hhbGxlbmdlQW5kTWV0aG9kIiwic3RvcmFnZUtleSIsImlzUGFzc3dvcmRSZWNvdmVyeSIsImNvZGVWZXJpZmllciIsInN0b3JlZENvZGVWZXJpZmllciIsImNvZGVDaGFsbGVuZ2UiLCJjb2RlQ2hhbGxlbmdlTWV0aG9kIiwiQVBJX1ZFUlNJT05fUkVHRVgiLCJwYXJzZVJlc3BvbnNlQVBJVmVyc2lvbiIsInJlc3BvbnNlIiwiYXBpVmVyc2lvbiIsImhlYWRlcnMiLCJnZXQiLCJtYXRjaCIsImRhdGUiLCJ2YWxpZGF0ZUV4cCIsImV4cCIsIkVycm9yIiwiZ2V0QWxnb3JpdGhtIiwiYWxnIiwibmFtZSIsIm5hbWVkQ3VydmUiLCJVVUlEX1JFR0VYIiwidmFsaWRhdGVVVUlEIiwic3RyIiwidXNlck5vdEF2YWlsYWJsZVByb3h5IiwicHJveHlUYXJnZXQiLCJQcm94eSIsInRhcmdldCIsInByb3AiLCJzUHJvcCIsInVuZGVmaW5lZCIsInNldCIsIl90YXJnZXQiLCJkZWxldGVQcm9wZXJ0eSIsImluc2VjdXJlVXNlcldhcm5pbmdQcm94eSIsInVzZXIiLCJzdXBwcmVzc1dhcm5pbmdSZWYiLCJyZWNlaXZlciIsIlJlZmxlY3QiLCJkZWVwQ2xvbmUiLCJvYmoiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js":
/*!*************************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js ***!
\*************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ memoryLocalStorageAdapter: function() { return /* binding */ memoryLocalStorageAdapter; }\n/* harmony export */ });\n/**\n * Returns a localStorage-like object that stores the key-value pairs in\n * memory.\n */ function memoryLocalStorageAdapter() {\n let store = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n return {\n getItem: (key)=>{\n return store[key] || null;\n },\n setItem: (key, value)=>{\n store[key] = value;\n },\n removeItem: (key)=>{\n delete store[key];\n }\n };\n} //# sourceMappingURL=local-storage.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvbG9jYWwtc3RvcmFnZS5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7OztDQUdDLEdBQ00sU0FBU0E7UUFBMEJDLFFBQUFBLGlFQUFRLENBQUM7SUFDL0MsT0FBTztRQUNIQyxTQUFTLENBQUNDO1lBQ04sT0FBT0YsS0FBSyxDQUFDRSxJQUFJLElBQUk7UUFDekI7UUFDQUMsU0FBUyxDQUFDRCxLQUFLRTtZQUNYSixLQUFLLENBQUNFLElBQUksR0FBR0U7UUFDakI7UUFDQUMsWUFBWSxDQUFDSDtZQUNULE9BQU9GLEtBQUssQ0FBQ0UsSUFBSTtRQUNyQjtJQUNKO0FBQ0osRUFDQSx5Q0FBeUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi9sb2NhbC1zdG9yYWdlLmpzPzIzYzIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXR1cm5zIGEgbG9jYWxTdG9yYWdlLWxpa2Ugb2JqZWN0IHRoYXQgc3RvcmVzIHRoZSBrZXktdmFsdWUgcGFpcnMgaW5cbiAqIG1lbW9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9yeUxvY2FsU3RvcmFnZUFkYXB0ZXIoc3RvcmUgPSB7fSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldEl0ZW06IChrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZVtrZXldIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldEl0ZW06IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBzdG9yZVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZUl0ZW06IChrZXkpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBzdG9yZVtrZXldO1xuICAgICAgICB9LFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2NhbC1zdG9yYWdlLmpzLm1hcCJdLCJuYW1lcyI6WyJtZW1vcnlMb2NhbFN0b3JhZ2VBZGFwdGVyIiwic3RvcmUiLCJnZXRJdGVtIiwia2V5Iiwic2V0SXRlbSIsInZhbHVlIiwicmVtb3ZlSXRlbSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js":
/*!*****************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/locks.js ***!
\*****************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LockAcquireTimeoutError: function() { return /* binding */ LockAcquireTimeoutError; },\n/* harmony export */ NavigatorLockAcquireTimeoutError: function() { return /* binding */ NavigatorLockAcquireTimeoutError; },\n/* harmony export */ ProcessLockAcquireTimeoutError: function() { return /* binding */ ProcessLockAcquireTimeoutError; },\n/* harmony export */ internals: function() { return /* binding */ internals; },\n/* harmony export */ navigatorLock: function() { return /* binding */ navigatorLock; },\n/* harmony export */ processLock: function() { return /* binding */ processLock; }\n/* harmony export */ });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n\n/**\n * @experimental\n */ const internals = {\n /**\n * @experimental\n */ debug: !!(globalThis && (0,_helpers__WEBPACK_IMPORTED_MODULE_0__.supportsLocalStorage)() && globalThis.localStorage && globalThis.localStorage.getItem(\"supabase.gotrue-js.locks.debug\") === \"true\")\n};\n/**\n * An error thrown when a lock cannot be acquired after some amount of time.\n *\n * Use the {@link #isAcquireTimeout} property instead of checking with `instanceof`.\n *\n * @example\n * ```ts\n * import { LockAcquireTimeoutError } from '@supabase/auth-js'\n *\n * class CustomLockError extends LockAcquireTimeoutError {\n * constructor() {\n * super('Lock timed out')\n * }\n * }\n * ```\n */ class LockAcquireTimeoutError extends Error {\n constructor(message){\n super(message);\n this.isAcquireTimeout = true;\n }\n}\n/**\n * Error thrown when the browser Navigator Lock API fails to acquire a lock.\n *\n * @example\n * ```ts\n * import { NavigatorLockAcquireTimeoutError } from '@supabase/auth-js'\n *\n * throw new NavigatorLockAcquireTimeoutError('Lock timed out')\n * ```\n */ class NavigatorLockAcquireTimeoutError extends LockAcquireTimeoutError {\n}\n/**\n * Error thrown when the process-level lock helper cannot acquire a lock.\n *\n * @example\n * ```ts\n * import { ProcessLockAcquireTimeoutError } from '@supabase/auth-js'\n *\n * throw new ProcessLockAcquireTimeoutError('Lock timed out')\n * ```\n */ class ProcessLockAcquireTimeoutError extends LockAcquireTimeoutError {\n}\n/**\n * Implements a global exclusive lock using the Navigator LockManager API. It\n * is available on all browsers released after 2022-03-15 with Safari being the\n * last one to release support. If the API is not available, this function will\n * throw. Make sure you check availablility before configuring {@link\n * GoTrueClient}.\n *\n * You can turn on debugging by setting the `supabase.gotrue-js.locks.debug`\n * local storage item to `true`.\n *\n * Internals:\n *\n * Since the LockManager API does not preserve stack traces for the async\n * function passed in the `request` method, a trick is used where acquiring the\n * lock releases a previously started promise to run the operation in the `fn`\n * function. The lock waits for that promise to finish (with or without error),\n * while the function will finally wait for the result anyway.\n *\n * @param name Name of the lock to be acquired.\n * @param acquireTimeout If negative, no timeout. If 0 an error is thrown if\n * the lock can't be acquired without waiting. If positive, the lock acquire\n * will time out after so many milliseconds. An error is\n * a timeout if it has `isAcquireTimeout` set to true.\n * @param fn The operation to run once the lock is acquired.\n * @example\n * ```ts\n * await navigatorLock('sync-user', 1000, async () => {\n * await refreshSession()\n * })\n * ```\n */ async function navigatorLock(name, acquireTimeout, fn) {\n if (internals.debug) {\n console.log(\"@supabase/gotrue-js: navigatorLock: acquire lock\", name, acquireTimeout);\n }\n const abortController = new globalThis.AbortController();\n if (acquireTimeout > 0) {\n setTimeout(()=>{\n abortController.abort();\n if (internals.debug) {\n console.log(\"@supabase/gotrue-js: navigatorLock acquire timed out\", name);\n }\n }, acquireTimeout);\n }\n // MDN article: https://developer.mozilla.org/en-US/docs/Web/API/LockManager/request\n // Wrapping navigator.locks.request() with a plain Promise is done as some\n // libraries like zone.js patch the Promise object to track the execution\n // context. However, it appears that most browsers use an internal promise\n // implementation when using the navigator.locks.request() API causing them\n // to lose context and emit confusing log messages or break certain features.\n // This wrapping is believed to help zone.js track the execution context\n // better.\n return await Promise.resolve().then(()=>globalThis.navigator.locks.request(name, acquireTimeout === 0 ? {\n mode: \"exclusive\",\n ifAvailable: true\n } : {\n mode: \"exclusive\",\n signal: abortController.signal\n }, async (lock)=>{\n if (lock) {\n if (internals.debug) {\n console.log(\"@supabase/gotrue-js: navigatorLock: acquired\", name, lock.name);\n }\n try {\n return await fn();\n } finally{\n if (internals.debug) {\n console.log(\"@supabase/gotrue-js: navigatorLock: released\", name, lock.name);\n }\n }\n } else {\n if (acquireTimeout === 0) {\n if (internals.debug) {\n console.log(\"@supabase/gotrue-js: navigatorLock: not immediately available\", name);\n }\n throw new NavigatorLockAcquireTimeoutError('Acquiring an exclusive Navigator LockManager lock \"'.concat(name, '\" immediately failed'));\n } else {\n if (internals.debug) {\n try {\n const result = await globalThis.navigator.locks.query();\n console.log(\"@supabase/gotrue-js: Navigator LockManager state\", JSON.stringify(result, null, \" \"));\n } catch (e) {\n console.warn(\"@supabase/gotrue-js: Error when querying Navigator LockManager state\", e);\n }\n }\n // Browser is not following the Navigator LockManager spec, it\n // returned a null lock when we didn't use ifAvailable. So we can\n // pretend the lock is acquired in the name of backward compatibility\n // and user experience and just run the function.\n console.warn(\"@supabase/gotrue-js: Navigator LockManager returned a null lock when using #request without ifAvailable set to true, it appears this browser is not following the LockManager spec https://developer.mozilla.org/en-US/docs/Web/API/LockManager/request\");\n return await fn();\n }\n }\n }));\n}\nconst PROCESS_LOCKS = {};\n/**\n * Implements a global exclusive lock that works only in the current process.\n * Useful for environments like React Native or other non-browser\n * single-process (i.e. no concept of \"tabs\") environments.\n *\n * Use {@link #navigatorLock} in browser environments.\n *\n * @param name Name of the lock to be acquired.\n * @param acquireTimeout If negative, no timeout. If 0 an error is thrown if\n * the lock can't be acquired without waiting. If positive, the lock acquire\n * will time out after so many milliseconds. An error is\n * a timeout if it has `isAcquireTimeout` set to true.\n * @param fn The operation to run once the lock is acquired.\n * @example\n * ```ts\n * await processLock('migrate', 5000, async () => {\n * await runMigration()\n * })\n * ```\n */ async function processLock(name, acquireTimeout, fn) {\n var _a;\n const previousOperation = (_a = PROCESS_LOCKS[name]) !== null && _a !== void 0 ? _a : Promise.resolve();\n const currentOperation = Promise.race([\n previousOperation.catch(()=>{\n // ignore error of previous operation that we're waiting to finish\n return null;\n }),\n acquireTimeout >= 0 ? new Promise((_, reject)=>{\n setTimeout(()=>{\n reject(new ProcessLockAcquireTimeoutError('Acquiring process lock with name \"'.concat(name, '\" timed out')));\n }, acquireTimeout);\n }) : null\n ].filter((x)=>x)).catch((e)=>{\n if (e && e.isAcquireTimeout) {\n throw e;\n }\n return null;\n }).then(async ()=>{\n // previous operations finished and we didn't get a race on the acquire\n // timeout, so the current operation can finally start\n return await fn();\n });\n PROCESS_LOCKS[name] = currentOperation.catch(async (e)=>{\n if (e && e.isAcquireTimeout) {\n // if the current operation timed out, it doesn't mean that the previous\n // operation finished, so we need contnue waiting for it to finish\n await previousOperation;\n return null;\n }\n throw e;\n });\n // finally wait for the current operation to finish successfully, with an\n // error or with an acquire timeout error\n return await currentOperation;\n} //# sourceMappingURL=locks.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvbG9ja3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFpRDtBQUNqRDs7Q0FFQyxHQUNNLE1BQU1DLFlBQVk7SUFDckI7O0tBRUMsR0FDREMsT0FBTyxDQUFDLENBQUVDLENBQUFBLGNBQ05ILDhEQUFvQkEsTUFDcEJHLFdBQVdDLFlBQVksSUFDdkJELFdBQVdDLFlBQVksQ0FBQ0MsT0FBTyxDQUFDLHNDQUFzQyxNQUFLO0FBQ25GLEVBQUU7QUFDRjs7Ozs7Ozs7Ozs7Ozs7O0NBZUMsR0FDTSxNQUFNQyxnQ0FBZ0NDO0lBQ3pDQyxZQUFZQyxPQUFPLENBQUU7UUFDakIsS0FBSyxDQUFDQTtRQUNOLElBQUksQ0FBQ0MsZ0JBQWdCLEdBQUc7SUFDNUI7QUFDSjtBQUNBOzs7Ozs7Ozs7Q0FTQyxHQUNNLE1BQU1DLHlDQUF5Q0w7QUFDdEQ7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNTSx1Q0FBdUNOO0FBQ3BEO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThCQyxHQUNNLGVBQWVPLGNBQWNDLElBQUksRUFBRUMsY0FBYyxFQUFFQyxFQUFFO0lBQ3hELElBQUlmLFVBQVVDLEtBQUssRUFBRTtRQUNqQmUsUUFBUUMsR0FBRyxDQUFDLG9EQUFvREosTUFBTUM7SUFDMUU7SUFDQSxNQUFNSSxrQkFBa0IsSUFBSWhCLFdBQVdpQixlQUFlO0lBQ3RELElBQUlMLGlCQUFpQixHQUFHO1FBQ3BCTSxXQUFXO1lBQ1BGLGdCQUFnQkcsS0FBSztZQUNyQixJQUFJckIsVUFBVUMsS0FBSyxFQUFFO2dCQUNqQmUsUUFBUUMsR0FBRyxDQUFDLHdEQUF3REo7WUFDeEU7UUFDSixHQUFHQztJQUNQO0lBQ0Esb0ZBQW9GO0lBQ3BGLDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSw2RUFBNkU7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IjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi9sb2Nrcy5qcz8wMzg3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN1cHBvcnRzTG9jYWxTdG9yYWdlIH0gZnJvbSAnLi9oZWxwZXJzJztcbi8qKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY29uc3QgaW50ZXJuYWxzID0ge1xuICAgIC8qKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKi9cbiAgICBkZWJ1ZzogISEoZ2xvYmFsVGhpcyAmJlxuICAgICAgICBzdXBwb3J0c0xvY2FsU3RvcmFnZSgpICYmXG4gICAgICAgIGdsb2JhbFRoaXMubG9jYWxTdG9yYWdlICYmXG4gICAgICAgIGdsb2JhbFRoaXMubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N1cGFiYXNlLmdvdHJ1ZS1qcy5sb2Nrcy5kZWJ1ZycpID09PSAndHJ1ZScpLFxufTtcbi8qKlxuICogQW4gZXJyb3IgdGhyb3duIHdoZW4gYSBsb2NrIGNhbm5vdCBiZSBhY3F1aXJlZCBhZnRlciBzb21lIGFtb3VudCBvZiB0aW1lLlxuICpcbiAqIFVzZSB0aGUge0BsaW5rICNpc0FjcXVpcmVUaW1lb3V0fSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGNoZWNraW5nIHdpdGggYGluc3RhbmNlb2ZgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiBjbGFzcyBDdXN0b21Mb2NrRXJyb3IgZXh0ZW5kcyBMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKCdMb2NrIHRpbWVkIG91dCcpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5pc0FjcXVpcmVUaW1lb3V0ID0gdHJ1ZTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSBicm93c2VyIE5hdmlnYXRvciBMb2NrIEFQSSBmYWlscyB0byBhY3F1aXJlIGEgbG9jay5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IE5hdmlnYXRvckxvY2tBY3F1aXJlVGltZW91dEVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IE5hdmlnYXRvckxvY2tBY3F1aXJlVGltZW91dEVycm9yKCdMb2NrIHRpbWVkIG91dCcpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5hdmlnYXRvckxvY2tBY3F1aXJlVGltZW91dEVycm9yIGV4dGVuZHMgTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3Ige1xufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGUgcHJvY2Vzcy1sZXZlbCBsb2NrIGhlbHBlciBjYW5ub3QgYWNxdWlyZSBhIGxvY2suXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBQcm9jZXNzTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgUHJvY2Vzc0xvY2tBY3F1aXJlVGltZW91dEVycm9yKCdMb2NrIHRpbWVkIG91dCcpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFByb2Nlc3NMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciBleHRlbmRzIExvY2tBY3F1aXJlVGltZW91dEVycm9yIHtcbn1cbi8qKlxuICogSW1wbGVtZW50cyBhIGdsb2JhbCBleGNsdXNpdmUgbG9jayB1c2luZyB0aGUgTmF2aWdhdG9yIExvY2tNYW5hZ2VyIEFQSS4gSXRcbiAqIGlzIGF2YWlsYWJsZSBvbiBhbGwgYnJvd3NlcnMgcmVsZWFzZWQgYWZ0ZXIgMjAyMi0wMy0xNSB3aXRoIFNhZmFyaSBiZWluZyB0aGVcbiAqIGxhc3Qgb25lIHRvIHJlbGVhc2Ugc3VwcG9ydC4gSWYgdGhlIEFQSSBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGZ1bmN0aW9uIHdpbGxcbiAqIHRocm93LiBNYWtlIHN1cmUgeW91IGNoZWNrIGF2YWlsYWJsaWxpdHkgYmVmb3JlIGNvbmZpZ3VyaW5nIHtAbGlua1xuICogR29UcnVlQ2xpZW50fS5cbiAqXG4gKiBZb3UgY2FuIHR1cm4gb24gZGVidWdnaW5nIGJ5IHNldHRpbmcgdGhlIGBzdXBhYmFzZS5nb3RydWUtanMubG9ja3MuZGVidWdgXG4gKiBsb2NhbCBzdG9yYWdlIGl0ZW0gdG8gYHRydWVgLlxuICpcbiAqIEludGVybmFsczpcbiAqXG4gKiBTaW5jZSB0aGUgTG9ja01hbmFnZXIgQVBJIGRvZXMgbm90IHByZXNlcnZlIHN0YWNrIHRyYWNlcyBmb3IgdGhlIGFzeW5jXG4gKiBmdW5jdGlvbiBwYXNzZWQgaW4gdGhlIGByZXF1ZXN0YCBtZXRob2QsIGEgdHJpY2sgaXMgdXNlZCB3aGVyZSBhY3F1aXJpbmcgdGhlXG4gKiBsb2NrIHJlbGVhc2VzIGEgcHJldmlvdXNseSBzdGFydGVkIHByb21pc2UgdG8gcnVuIHRoZSBvcGVyYXRpb24gaW4gdGhlIGBmbmBcbiAqIGZ1bmN0aW9uLiBUaGUgbG9jayB3YWl0cyBmb3IgdGhhdCBwcm9taXNlIHRvIGZpbmlzaCAod2l0aCBvciB3aXRob3V0IGVycm9yKSxcbiAqIHdoaWxlIHRoZSBmdW5jdGlvbiB3aWxsIGZpbmFsbHkgd2FpdCBmb3IgdGhlIHJlc3VsdCBhbnl3YXkuXG4gKlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbG9jayB0byBiZSBhY3F1aXJlZC5cbiAqIEBwYXJhbSBhY3F1aXJlVGltZW91dCBJZiBuZWdhdGl2ZSwgbm8gdGltZW91dC4gSWYgMCBhbiBlcnJvciBpcyB0aHJvd24gaWZcbiAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgbG9jayBjYW4ndCBiZSBhY3F1aXJlZCB3aXRob3V0IHdhaXRpbmcuIElmIHBvc2l0aXZlLCB0aGUgbG9jayBhY3F1aXJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCB0aW1lIG91dCBhZnRlciBzbyBtYW55IG1pbGxpc2Vjb25kcy4gQW4gZXJyb3IgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICBhIHRpbWVvdXQgaWYgaXQgaGFzIGBpc0FjcXVpcmVUaW1lb3V0YCBzZXQgdG8gdHJ1ZS5cbiAqIEBwYXJhbSBmbiBUaGUgb3BlcmF0aW9uIHRvIHJ1biBvbmNlIHRoZSBsb2NrIGlzIGFjcXVpcmVkLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBhd2FpdCBuYXZpZ2F0b3JMb2NrKCdzeW5jLXVzZXInLCAxMDAwLCBhc3luYyAoKSA9PiB7XG4gKiAgIGF3YWl0IHJlZnJlc2hTZXNzaW9uKClcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRvckxvY2sobmFtZSwgYWNxdWlyZVRpbWVvdXQsIGZuKSB7XG4gICAgaWYgKGludGVybmFscy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZygnQHN1cGFiYXNlL2dvdHJ1ZS1qczogbmF2aWdhdG9yTG9jazogYWNxdWlyZSBsb2NrJywgbmFtZSwgYWNxdWlyZVRpbWVvdXQpO1xuICAgIH1cbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIoKTtcbiAgICBpZiAoYWNxdWlyZVRpbWVvdXQgPiAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0BzdXBhYmFzZS9nb3RydWUtanM6IG5hdmlnYXRvckxvY2sgYWNxdWlyZSB0aW1lZCBvdXQnLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgYWNxdWlyZVRpbWVvdXQpO1xuICAgIH1cbiAgICAvLyBNRE4gYXJ0aWNsZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0xvY2tNYW5hZ2VyL3JlcXVlc3RcbiAgICAvLyBXcmFwcGluZyBuYXZpZ2F0b3IubG9ja3MucmVxdWVzdCgpIHdpdGggYSBwbGFpbiBQcm9taXNlIGlzIGRvbmUgYXMgc29tZVxuICAgIC8vIGxpYnJhcmllcyBsaWtlIHpvbmUuanMgcGF0Y2ggdGhlIFByb21pc2Ugb2JqZWN0IHRvIHRyYWNrIHRoZSBleGVjdXRpb25cbiAgICAvLyBjb250ZXh0LiBIb3dldmVyLCBpdCBhcHBlYXJzIHRoYXQgbW9zdCBicm93c2VycyB1c2UgYW4gaW50ZXJuYWwgcHJvbWlzZVxuICAgIC8vIGltcGxlbWVudGF0aW9uIHdoZW4gdXNpbmcgdGhlIG5hdmlnYXRvci5sb2Nrcy5yZXF1ZXN0KCkgQVBJIGNhdXNpbmcgdGhlbVxuICAgIC8vIHRvIGxvc2UgY29udGV4dCBhbmQgZW1pdCBjb25mdXNpbmcgbG9nIG1lc3NhZ2VzIG9yIGJyZWFrIGNlcnRhaW4gZmVhdHVyZXMuXG4gICAgLy8gVGhpcyB3cmFwcGluZyBpcyBiZWxpZXZlZCB0byBoZWxwIHpvbmUuanMgdHJhY2sgdGhlIGV4ZWN1dGlvbiBjb250ZXh0XG4gICAgLy8gYmV0dGVyLlxuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGdsb2JhbFRoaXMubmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QobmFtZSwgYWNxdWlyZVRpbWVvdXQgPT09IDBcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBtb2RlOiAnZXhjbHVzaXZlJyxcbiAgICAgICAgICAgIGlmQXZhaWxhYmxlOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgbW9kZTogJ2V4Y2x1c2l2ZScsXG4gICAgICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIH0sIGFzeW5jIChsb2NrKSA9PiB7XG4gICAgICAgIGlmIChsb2NrKSB7XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0BzdXBhYmFzZS9nb3RydWUtanM6IG5hdmlnYXRvckxvY2s6IGFjcXVpcmVkJywgbmFtZSwgbG9jay5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdAc3VwYWJhc2UvZ290cnVlLWpzOiBuYXZpZ2F0b3JMb2NrOiByZWxlYXNlZCcsIG5hbWUsIGxvY2submFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGFjcXVpcmVUaW1lb3V0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGludGVybmFscy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQHN1cGFiYXNlL2dvdHJ1ZS1qczogbmF2aWdhdG9yTG9jazogbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZScsIG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmF2aWdhdG9yTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IoYEFjcXVpcmluZyBhbiBleGNsdXNpdmUgTmF2aWdhdG9yIExvY2tNYW5hZ2VyIGxvY2sgXCIke25hbWV9XCIgaW1tZWRpYXRlbHkgZmFpbGVkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnbG9iYWxUaGlzLm5hdmlnYXRvci5sb2Nrcy5xdWVyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0BzdXBhYmFzZS9nb3RydWUtanM6IE5hdmlnYXRvciBMb2NrTWFuYWdlciBzdGF0ZScsIEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgJyAgJykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0BzdXBhYmFzZS9nb3RydWUtanM6IEVycm9yIHdoZW4gcXVlcnlpbmcgTmF2aWdhdG9yIExvY2tNYW5hZ2VyIHN0YXRlJywgZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQnJvd3NlciBpcyBub3QgZm9sbG93aW5nIHRoZSBOYXZpZ2F0b3IgTG9ja01hbmFnZXIgc3BlYywgaXRcbiAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBhIG51bGwgbG9jayB3aGVuIHdlIGRpZG4ndCB1c2UgaWZBdmFpbGFibGUuIFNvIHdlIGNhblxuICAgICAgICAgICAgICAgIC8vIHByZXRlbmQgdGhlIGxvY2sgaXMgYWNxdWlyZWQgaW4gdGhlIG5hbWUgb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICAgIC8vIGFuZCB1c2VyIGV4cGVyaWVuY2UgYW5kIGp1c3QgcnVuIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0BzdXBhYmFzZS9nb3RydWUtanM6IE5hdmlnYXRvciBMb2NrTWFuYWdlciByZXR1cm5lZCBhIG51bGwgbG9jayB3aGVuIHVzaW5nICNyZXF1ZXN0IHdpdGhvdXQgaWZBdmFpbGFibGUgc2V0IHRvIHRydWUsIGl0IGFwcGVhcnMgdGhpcyBicm93c2VyIGlzIG5vdCBmb2xsb3dpbmcgdGhlIExvY2tNYW5hZ2VyIHNwZWMgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0xvY2tNYW5hZ2VyL3JlcXVlc3QnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcbn1cbmNvbnN0IFBST0NFU1NfTE9DS1MgPSB7fTtcbi8qKlxuICogSW1wbGVtZW50cyBhIGdsb2JhbCBleGNsdXNpdmUgbG9jayB0aGF0IHdvcmtzIG9ubHkgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy5cbiAqIFVzZWZ1bCBmb3IgZW52aXJvbm1lbnRzIGxpa2UgUmVhY3QgTmF0aXZlIG9yIG90aGVyIG5vbi1icm93c2VyXG4gKiBzaW5nbGUtcHJvY2VzcyAoaS5lLiBubyBjb25jZXB0IG9mIFwidGFic1wiKSBlbnZpcm9ubWVudHMuXG4gKlxuICogVXNlIHtAbGluayAjbmF2aWdhdG9yTG9ja30gaW4gYnJvd3NlciBlbnZpcm9ubWVudHMuXG4gKlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbG9jayB0byBiZSBhY3F1aXJlZC5cbiAqIEBwYXJhbSBhY3F1aXJlVGltZW91dCBJZiBuZWdhdGl2ZSwgbm8gdGltZW91dC4gSWYgMCBhbiBlcnJvciBpcyB0aHJvd24gaWZcbiAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgbG9jayBjYW4ndCBiZSBhY3F1aXJlZCB3aXRob3V0IHdhaXRpbmcuIElmIHBvc2l0aXZlLCB0aGUgbG9jayBhY3F1aXJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCB0aW1lIG91dCBhZnRlciBzbyBtYW55IG1pbGxpc2Vjb25kcy4gQW4gZXJyb3IgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICBhIHRpbWVvdXQgaWYgaXQgaGFzIGBpc0FjcXVpcmVUaW1lb3V0YCBzZXQgdG8gdHJ1ZS5cbiAqIEBwYXJhbSBmbiBUaGUgb3BlcmF0aW9uIHRvIHJ1biBvbmNlIHRoZSBsb2NrIGlzIGFjcXVpcmVkLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBhd2FpdCBwcm9jZXNzTG9jaygnbWlncmF0ZScsIDUwMDAsIGFzeW5jICgpID0+IHtcbiAqICAgYXdhaXQgcnVuTWlncmF0aW9uKClcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NMb2NrKG5hbWUsIGFjcXVpcmVUaW1lb3V0LCBmbikge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBwcmV2aW91c09wZXJhdGlvbiA9IChfYSA9IFBST0NFU1NfTE9DS1NbbmFtZV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRPcGVyYXRpb24gPSBQcm9taXNlLnJhY2UoW1xuICAgICAgICBwcmV2aW91c09wZXJhdGlvbi5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3Igb2YgcHJldmlvdXMgb3BlcmF0aW9uIHRoYXQgd2UncmUgd2FpdGluZyB0byBmaW5pc2hcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9KSxcbiAgICAgICAgYWNxdWlyZVRpbWVvdXQgPj0gMFxuICAgICAgICAgICAgPyBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgUHJvY2Vzc0xvY2tBY3F1aXJlVGltZW91dEVycm9yKGBBY3F1aXJpbmcgcHJvY2VzcyBsb2NrIHdpdGggbmFtZSBcIiR7bmFtZX1cIiB0aW1lZCBvdXRgKSk7XG4gICAgICAgICAgICAgICAgfSwgYWNxdWlyZVRpbWVvdXQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICBdLmZpbHRlcigoeCkgPT4geCkpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBpZiAoZSAmJiBlLmlzQWNxdWlyZVRpbWVvdXQpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSlcbiAgICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBwcmV2aW91cyBvcGVyYXRpb25zIGZpbmlzaGVkIGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmFjZSBvbiB0aGUgYWNxdWlyZVxuICAgICAgICAvLyB0aW1lb3V0LCBzbyB0aGUgY3VycmVudCBvcGVyYXRpb24gY2FuIGZpbmFsbHkgc3RhcnRcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSk7XG4gICAgUFJPQ0VTU19MT0NLU1tuYW1lXSA9IGN1cnJlbnRPcGVyYXRpb24uY2F0Y2goYXN5bmMgKGUpID0+IHtcbiAgICAgICAgaWYgKGUgJiYgZS5pc0FjcXVpcmVUaW1lb3V0KSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBvcGVyYXRpb24gdGltZWQgb3V0LCBpdCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUgcHJldmlvdXNcbiAgICAgICAgICAgIC8vIG9wZXJhdGlvbiBmaW5pc2hlZCwgc28gd2UgbmVlZCBjb250bnVlIHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaFxuICAgICAgICAgICAgYXdhaXQgcHJldmlvdXNPcGVyYXRpb247XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICAgIC8vIGZpbmFsbHkgd2FpdCBmb3IgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIHRvIGZpbmlzaCBzdWNjZXNzZnVsbHksIHdpdGggYW5cbiAgICAvLyBlcnJvciBvciB3aXRoIGFuIGFjcXVpcmUgdGltZW91dCBlcnJvclxuICAgIHJldHVybiBhd2FpdCBjdXJyZW50T3BlcmF0aW9uO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9ja3MuanMubWFwIl0sIm5hbWVzIjpbInN1cHBvcnRzTG9jYWxTdG9yYWdlIiwiaW50ZXJuYWxzIiwiZGVidWciLCJnbG9iYWxUaGlzIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkxvY2tBY3F1aXJlVGltZW91dEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm1lc3NhZ2UiLCJpc0FjcXVpcmVUaW1lb3V0IiwiTmF2aWdhdG9yTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IiLCJQcm9jZXNzTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IiLCJuYXZpZ2F0b3JMb2NrIiwibmFtZSIsImFjcXVpcmVUaW1lb3V0IiwiZm4iLCJjb25zb2xlIiwibG9nIiwiYWJvcnRDb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwic2V0VGltZW91dCIsImFib3J0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwibmF2aWdhdG9yIiwibG9ja3MiLCJyZXF1ZXN0IiwibW9kZSIsImlmQXZhaWxhYmxlIiwic2lnbmFsIiwibG9jayIsInJlc3VsdCIsInF1ZXJ5IiwiSlNPTiIsInN0cmluZ2lmeSIsImUiLCJ3YXJuIiwiUFJPQ0VTU19MT0NLUyIsInByb2Nlc3NMb2NrIiwiX2EiLCJwcmV2aW91c09wZXJhdGlvbiIsImN1cnJlbnRPcGVyYXRpb24iLCJyYWNlIiwiY2F0Y2giLCJfIiwicmVqZWN0IiwiZmlsdGVyIiwieCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js":
/*!*********************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js ***!
\*********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ polyfillGlobalThis: function() { return /* binding */ polyfillGlobalThis; }\n/* harmony export */ });\n/**\n * https://mathiasbynens.be/notes/globalthis\n */ function polyfillGlobalThis() {\n if (typeof globalThis === \"object\") return;\n try {\n Object.defineProperty(Object.prototype, \"__magic__\", {\n get: function() {\n return this;\n },\n configurable: true\n });\n // @ts-expect-error 'Allow access to magic'\n __magic__.globalThis = __magic__;\n // @ts-expect-error 'Allow access to magic'\n delete Object.prototype.__magic__;\n } catch (e) {\n if (typeof self !== \"undefined\") {\n // @ts-expect-error 'Allow access to globals'\n self.globalThis = self;\n }\n }\n} //# sourceMappingURL=polyfills.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvcG9seWZpbGxzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7Q0FFQyxHQUNNLFNBQVNBO0lBQ1osSUFBSSxPQUFPQyxlQUFlLFVBQ3RCO0lBQ0osSUFBSTtRQUNBQyxPQUFPQyxjQUFjLENBQUNELE9BQU9FLFNBQVMsRUFBRSxhQUFhO1lBQ2pEQyxLQUFLO2dCQUNELE9BQU8sSUFBSTtZQUNmO1lBQ0FDLGNBQWM7UUFDbEI7UUFDQSwyQ0FBMkM7UUFDM0NDLFVBQVVOLFVBQVUsR0FBR007UUFDdkIsMkNBQTJDO1FBQzNDLE9BQU9MLE9BQU9FLFNBQVMsQ0FBQ0csU0FBUztJQUNyQyxFQUNBLE9BQU9DLEdBQUc7UUFDTixJQUFJLE9BQU9DLFNBQVMsYUFBYTtZQUM3Qiw2Q0FBNkM7WUFDN0NBLEtBQUtSLFVBQVUsR0FBR1E7UUFDdEI7SUFDSjtBQUNKLEVBQ0EscUNBQXFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvcG9seWZpbGxzLmpzPzYzZTUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvZ2xvYmFsdGhpc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcG9seWZpbGxHbG9iYWxUaGlzKCkge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgJ19fbWFnaWNfXycsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgJ0FsbG93IGFjY2VzcyB0byBtYWdpYydcbiAgICAgICAgX19tYWdpY19fLmdsb2JhbFRoaXMgPSBfX21hZ2ljX187XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgJ0FsbG93IGFjY2VzcyB0byBtYWdpYydcbiAgICAgICAgZGVsZXRlIE9iamVjdC5wcm90b3R5cGUuX19tYWdpY19fO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yICdBbGxvdyBhY2Nlc3MgdG8gZ2xvYmFscydcbiAgICAgICAgICAgIHNlbGYuZ2xvYmFsVGhpcyA9IHNlbGY7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2x5ZmlsbHMuanMubWFwIl0sIm5hbWVzIjpbInBvbHlmaWxsR2xvYmFsVGhpcyIsImdsb2JhbFRoaXMiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInByb3RvdHlwZSIsImdldCIsImNvbmZpZ3VyYWJsZSIsIl9fbWFnaWNfXyIsImUiLCJzZWxmIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/types.js":
/*!*****************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/types.js ***!
\*****************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SIGN_OUT_SCOPES: function() { return /* binding */ SIGN_OUT_SCOPES; }\n/* harmony export */ });\nconst WeakPasswordReasons = [\n \"length\",\n \"characters\",\n \"pwned\"\n];\nconst AMRMethods = [\n \"password\",\n \"otp\",\n \"oauth\",\n \"totp\",\n \"mfa/totp\",\n \"mfa/phone\",\n \"mfa/webauthn\",\n \"anonymous\",\n \"sso/saml\",\n \"magiclink\",\n \"web3\"\n];\nconst FactorTypes = [\n \"totp\",\n \"phone\",\n \"webauthn\"\n];\nconst FactorVerificationStatuses = [\n \"verified\",\n \"unverified\"\n];\nconst MFATOTPChannels = [\n \"sms\",\n \"whatsapp\"\n];\nconst SIGN_OUT_SCOPES = [\n \"global\",\n \"local\",\n \"others\"\n]; //# sourceMappingURL=types.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvdHlwZXMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE1BQU1BLHNCQUFzQjtJQUFDO0lBQVU7SUFBYztDQUFRO0FBQzdELE1BQU1DLGFBQWE7SUFDZjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0NBQ0g7QUFDRCxNQUFNQyxjQUFjO0lBQUM7SUFBUTtJQUFTO0NBQVc7QUFDakQsTUFBTUMsNkJBQTZCO0lBQUM7SUFBWTtDQUFhO0FBQzdELE1BQU1DLGtCQUFrQjtJQUFDO0lBQU87Q0FBVztBQUNwQyxNQUFNQyxrQkFBa0I7SUFBQztJQUFVO0lBQVM7Q0FBUyxDQUFDLENBQzdELGlDQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3R5cGVzLmpzPzFmNjEiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgV2Vha1Bhc3N3b3JkUmVhc29ucyA9IFsnbGVuZ3RoJywgJ2NoYXJhY3RlcnMnLCAncHduZWQnXTtcbmNvbnN0IEFNUk1ldGhvZHMgPSBbXG4gICAgJ3Bhc3N3b3JkJyxcbiAgICAnb3RwJyxcbiAgICAnb2F1dGgnLFxuICAgICd0b3RwJyxcbiAgICAnbWZhL3RvdHAnLFxuICAgICdtZmEvcGhvbmUnLFxuICAgICdtZmEvd2ViYXV0aG4nLFxuICAgICdhbm9ueW1vdXMnLFxuICAgICdzc28vc2FtbCcsXG4gICAgJ21hZ2ljbGluaycsXG4gICAgJ3dlYjMnLFxuXTtcbmNvbnN0IEZhY3RvclR5cGVzID0gWyd0b3RwJywgJ3Bob25lJywgJ3dlYmF1dGhuJ107XG5jb25zdCBGYWN0b3JWZXJpZmljYXRpb25TdGF0dXNlcyA9IFsndmVyaWZpZWQnLCAndW52ZXJpZmllZCddO1xuY29uc3QgTUZBVE9UUENoYW5uZWxzID0gWydzbXMnLCAnd2hhdHNhcHAnXTtcbmV4cG9ydCBjb25zdCBTSUdOX09VVF9TQ09QRVMgPSBbJ2dsb2JhbCcsICdsb2NhbCcsICdvdGhlcnMnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCJdLCJuYW1lcyI6WyJXZWFrUGFzc3dvcmRSZWFzb25zIiwiQU1STWV0aG9kcyIsIkZhY3RvclR5cGVzIiwiRmFjdG9yVmVyaWZpY2F0aW9uU3RhdHVzZXMiLCJNRkFUT1RQQ2hhbm5lbHMiLCJTSUdOX09VVF9TQ09QRVMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/types.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/version.js":
/*!*******************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/version.js ***!
\*******************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ version: function() { return /* binding */ version; }\n/* harmony export */ });\n// Generated automatically during releases by scripts/update-version-files.ts\n// This file provides runtime access to the package version for:\n// - HTTP request headers (e.g., X-Client-Info header for API requests)\n// - Debugging and support (identifying which version is running)\n// - Telemetry and logging (version reporting in errors/analytics)\n// - Ensuring build artifacts match the published package version\nconst version = \"2.88.0\"; //# sourceMappingURL=version.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvdmVyc2lvbi5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUEsNkVBQTZFO0FBQzdFLGdFQUFnRTtBQUNoRSx1RUFBdUU7QUFDdkUsaUVBQWlFO0FBQ2pFLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDMUQsTUFBTUEsVUFBVSxTQUFTLENBQ2hDLG1DQUFtQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3ZlcnNpb24uanM/OTc3YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgcmVsZWFzZXMgYnkgc2NyaXB0cy91cGRhdGUtdmVyc2lvbi1maWxlcy50c1xuLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHJ1bnRpbWUgYWNjZXNzIHRvIHRoZSBwYWNrYWdlIHZlcnNpb24gZm9yOlxuLy8gLSBIVFRQIHJlcXVlc3QgaGVhZGVycyAoZS5nLiwgWC1DbGllbnQtSW5mbyBoZWFkZXIgZm9yIEFQSSByZXF1ZXN0cylcbi8vIC0gRGVidWdnaW5nIGFuZCBzdXBwb3J0IChpZGVudGlmeWluZyB3aGljaCB2ZXJzaW9uIGlzIHJ1bm5pbmcpXG4vLyAtIFRlbGVtZXRyeSBhbmQgbG9nZ2luZyAodmVyc2lvbiByZXBvcnRpbmcgaW4gZXJyb3JzL2FuYWx5dGljcylcbi8vIC0gRW5zdXJpbmcgYnVpbGQgYXJ0aWZhY3RzIG1hdGNoIHRoZSBwdWJsaXNoZWQgcGFja2FnZSB2ZXJzaW9uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICcyLjg4LjAnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVyc2lvbi5qcy5tYXAiXSwibmFtZXMiOlsidmVyc2lvbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/version.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js":
/*!*************************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js ***!
\*************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createSiweMessage: function() { return /* binding */ createSiweMessage; },\n/* harmony export */ fromHex: function() { return /* binding */ fromHex; },\n/* harmony export */ getAddress: function() { return /* binding */ getAddress; },\n/* harmony export */ toHex: function() { return /* binding */ toHex; }\n/* harmony export */ });\n// types and functions copied over from viem so this library doesn't depend on it\nfunction getAddress(address) {\n if (!/^0x[a-fA-F0-9]{40}$/.test(address)) {\n throw new Error('@supabase/auth-js: Address \"'.concat(address, '\" is invalid.'));\n }\n return address.toLowerCase();\n}\nfunction fromHex(hex) {\n return parseInt(hex, 16);\n}\nfunction toHex(value) {\n const bytes = new TextEncoder().encode(value);\n const hex = Array.from(bytes, (byte)=>byte.toString(16).padStart(2, \"0\")).join(\"\");\n return \"0x\" + hex;\n}\n/**\n * Creates EIP-4361 formatted message.\n */ function createSiweMessage(parameters) {\n var _a;\n const { chainId, domain, expirationTime, issuedAt = new Date(), nonce, notBefore, requestId, resources, scheme, uri, version } = parameters;\n // Validate fields\n {\n if (!Number.isInteger(chainId)) throw new Error('@supabase/auth-js: Invalid SIWE message field \"chainId\". Chain ID must be a EIP-155 chain ID. Provided value: '.concat(chainId));\n if (!domain) throw new Error('@supabase/auth-js: Invalid SIWE message field \"domain\". Domain must be provided.');\n if (nonce && nonce.length < 8) throw new Error('@supabase/auth-js: Invalid SIWE message field \"nonce\". Nonce must be at least 8 characters. Provided value: '.concat(nonce));\n if (!uri) throw new Error('@supabase/auth-js: Invalid SIWE message field \"uri\". URI must be provided.');\n if (version !== \"1\") throw new Error(\"@supabase/auth-js: Invalid SIWE message field \\\"version\\\". Version must be '1'. Provided value: \".concat(version));\n if ((_a = parameters.statement) === null || _a === void 0 ? void 0 : _a.includes(\"\\n\")) throw new Error(\"@supabase/auth-js: Invalid SIWE message field \\\"statement\\\". Statement must not include '\\\\n'. Provided value: \".concat(parameters.statement));\n }\n // Construct message\n const address = getAddress(parameters.address);\n const origin = scheme ? \"\".concat(scheme, \"://\").concat(domain) : domain;\n const statement = parameters.statement ? \"\".concat(parameters.statement, \"\\n\") : \"\";\n const prefix = \"\".concat(origin, \" wants you to sign in with your Ethereum account:\\n\").concat(address, \"\\n\\n\").concat(statement);\n let suffix = \"URI: \".concat(uri, \"\\nVersion: \").concat(version, \"\\nChain ID: \").concat(chainId).concat(nonce ? \"\\nNonce: \".concat(nonce) : \"\", \"\\nIssued At: \").concat(issuedAt.toISOString());\n if (expirationTime) suffix += \"\\nExpiration Time: \".concat(expirationTime.toISOString());\n if (notBefore) suffix += \"\\nNot Before: \".concat(notBefore.toISOString());\n if (requestId) suffix += \"\\nRequest ID: \".concat(requestId);\n if (resources) {\n let content = \"\\nResources:\";\n for (const resource of resources){\n if (!resource || typeof resource !== \"string\") throw new Error('@supabase/auth-js: Invalid SIWE message field \"resources\". Every resource must be a valid string. Provided value: '.concat(resource));\n content += \"\\n- \".concat(resource);\n }\n suffix += content;\n }\n return \"\".concat(prefix, \"\\n\").concat(suffix);\n} //# sourceMappingURL=ethereum.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvd2ViMy9ldGhlcmV1bS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsaUZBQWlGO0FBQzFFLFNBQVNBLFdBQVdDLE9BQU87SUFDOUIsSUFBSSxDQUFDLHNCQUFzQkMsSUFBSSxDQUFDRCxVQUFVO1FBQ3RDLE1BQU0sSUFBSUUsTUFBTSwrQkFBdUMsT0FBUkYsU0FBUTtJQUMzRDtJQUNBLE9BQU9BLFFBQVFHLFdBQVc7QUFDOUI7QUFDTyxTQUFTQyxRQUFRQyxHQUFHO0lBQ3ZCLE9BQU9DLFNBQVNELEtBQUs7QUFDekI7QUFDTyxTQUFTRSxNQUFNQyxLQUFLO0lBQ3ZCLE1BQU1DLFFBQVEsSUFBSUMsY0FBY0MsTUFBTSxDQUFDSDtJQUN2QyxNQUFNSCxNQUFNTyxNQUFNQyxJQUFJLENBQUNKLE9BQU8sQ0FBQ0ssT0FBU0EsS0FBS0MsUUFBUSxDQUFDLElBQUlDLFFBQVEsQ0FBQyxHQUFHLE1BQU1DLElBQUksQ0FBQztJQUNqRixPQUFRLE9BQU9aO0FBQ25CO0FBQ0E7O0NBRUMsR0FDTSxTQUFTYSxrQkFBa0JDLFVBQVU7SUFDeEMsSUFBSUM7SUFDSixNQUFNLEVBQUVDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxjQUFjLEVBQUVDLFdBQVcsSUFBSUMsTUFBTSxFQUFFQyxLQUFLLEVBQUVDLFNBQVMsRUFBRUMsU0FBUyxFQUFFQyxTQUFTLEVBQUVDLE1BQU0sRUFBRUMsR0FBRyxFQUFFQyxPQUFPLEVBQUcsR0FBR2I7SUFDbEksa0JBQWtCO0lBQ2xCO1FBQ0ksSUFBSSxDQUFDYyxPQUFPQyxTQUFTLENBQUNiLFVBQ2xCLE1BQU0sSUFBSW5CLE1BQU0saUhBQXlILE9BQVJtQjtRQUNySSxJQUFJLENBQUNDLFFBQ0QsTUFBTSxJQUFJcEIsTUFBTztRQUNyQixJQUFJd0IsU0FBU0EsTUFBTVMsTUFBTSxHQUFHLEdBQ3hCLE1BQU0sSUFBSWpDLE1BQU0sK0dBQXFILE9BQU53QjtRQUNuSSxJQUFJLENBQUNLLEtBQ0QsTUFBTSxJQUFJN0IsTUFBTztRQUNyQixJQUFJOEIsWUFBWSxLQUNaLE1BQU0sSUFBSTlCLE1BQU0sbUdBQXlHLE9BQVI4QjtRQUNySCxJQUFJLENBQUNaLEtBQUtELFdBQVdpQixTQUFTLE1BQU0sUUFBUWhCLE9BQU8sS0FBSyxJQUFJLEtBQUssSUFBSUEsR0FBR2lCLFFBQVEsQ0FBQyxPQUM3RSxNQUFNLElBQUluQyxNQUFNLGtIQUFxSSxPQUFyQmlCLFdBQVdpQixTQUFTO0lBQzVKO0lBQ0Esb0JBQW9CO0lBQ3BCLE1BQU1wQyxVQUFVRCxXQUFXb0IsV0FBV25CLE9BQU87SUFDN0MsTUFBTXNDLFNBQVNSLFNBQVMsR0FBZVIsT0FBWlEsUUFBTyxPQUFZLE9BQVBSLFVBQVdBO0lBQ2xELE1BQU1jLFlBQVlqQixXQUFXaUIsU0FBUyxHQUFHLEdBQXdCLE9BQXJCakIsV0FBV2lCLFNBQVMsRUFBQyxRQUFNO0lBQ3ZFLE1BQU1HLFNBQVMsR0FBK0R2QyxPQUE1RHNDLFFBQU8sdURBQW1FRixPQUFkcEMsU0FBUSxRQUFnQixPQUFWb0M7SUFDNUYsSUFBSUksU0FBUyxRQUF5QlIsT0FBakJELEtBQUksZUFBbUNWLE9BQXRCVyxTQUFRLGdCQUF3Qk4sT0FBVkwsU0FBMERHLE9BQWhERSxRQUFRLFlBQWtCLE9BQU5BLFNBQVUsSUFBRyxpQkFBc0MsT0FBdkJGLFNBQVNpQixXQUFXO0lBQzFJLElBQUlsQixnQkFDQWlCLFVBQVUsc0JBQW1ELE9BQTdCakIsZUFBZWtCLFdBQVc7SUFDOUQsSUFBSWQsV0FDQWEsVUFBVSxpQkFBeUMsT0FBeEJiLFVBQVVjLFdBQVc7SUFDcEQsSUFBSWIsV0FDQVksVUFBVSxpQkFBMkIsT0FBVlo7SUFDL0IsSUFBSUMsV0FBVztRQUNYLElBQUlhLFVBQVU7UUFDZCxLQUFLLE1BQU1DLFlBQVlkLFVBQVc7WUFDOUIsSUFBSSxDQUFDYyxZQUFZLE9BQU9BLGFBQWEsVUFDakMsTUFBTSxJQUFJekMsTUFBTSxxSEFBOEgsT0FBVHlDO1lBQ3pJRCxXQUFXLE9BQWdCLE9BQVRDO1FBQ3RCO1FBQ0FILFVBQVVFO0lBQ2Q7SUFDQSxPQUFPLEdBQWNGLE9BQVhELFFBQU8sTUFBVyxPQUFQQztBQUN6QixFQUNBLG9DQUFvQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3dlYjMvZXRoZXJldW0uanM/MjBkNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0eXBlcyBhbmQgZnVuY3Rpb25zIGNvcGllZCBvdmVyIGZyb20gdmllbSBzbyB0aGlzIGxpYnJhcnkgZG9lc24ndCBkZXBlbmQgb24gaXRcbmV4cG9ydCBmdW5jdGlvbiBnZXRBZGRyZXNzKGFkZHJlc3MpIHtcbiAgICBpZiAoIS9eMHhbYS1mQS1GMC05XXs0MH0kLy50ZXN0KGFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IEFkZHJlc3MgXCIke2FkZHJlc3N9XCIgaXMgaW52YWxpZC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmcm9tSGV4KGhleCkge1xuICAgIHJldHVybiBwYXJzZUludChoZXgsIDE2KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b0hleCh2YWx1ZSkge1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKTtcbiAgICBjb25zdCBoZXggPSBBcnJheS5mcm9tKGJ5dGVzLCAoYnl0ZSkgPT4gYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuICgnMHgnICsgaGV4KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBFSVAtNDM2MSBmb3JtYXR0ZWQgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNpd2VNZXNzYWdlKHBhcmFtZXRlcnMpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgeyBjaGFpbklkLCBkb21haW4sIGV4cGlyYXRpb25UaW1lLCBpc3N1ZWRBdCA9IG5ldyBEYXRlKCksIG5vbmNlLCBub3RCZWZvcmUsIHJlcXVlc3RJZCwgcmVzb3VyY2VzLCBzY2hlbWUsIHVyaSwgdmVyc2lvbiwgfSA9IHBhcmFtZXRlcnM7XG4gICAgLy8gVmFsaWRhdGUgZmllbGRzXG4gICAge1xuICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoY2hhaW5JZCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBJbnZhbGlkIFNJV0UgbWVzc2FnZSBmaWVsZCBcImNoYWluSWRcIi4gQ2hhaW4gSUQgbXVzdCBiZSBhIEVJUC0xNTUgY2hhaW4gSUQuIFByb3ZpZGVkIHZhbHVlOiAke2NoYWluSWR9YCk7XG4gICAgICAgIGlmICghZG9tYWluKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJkb21haW5cIi4gRG9tYWluIG11c3QgYmUgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlmIChub25jZSAmJiBub25jZS5sZW5ndGggPCA4KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJub25jZVwiLiBOb25jZSBtdXN0IGJlIGF0IGxlYXN0IDggY2hhcmFjdGVycy4gUHJvdmlkZWQgdmFsdWU6ICR7bm9uY2V9YCk7XG4gICAgICAgIGlmICghdXJpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJ1cmlcIi4gVVJJIG11c3QgYmUgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlmICh2ZXJzaW9uICE9PSAnMScpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBJbnZhbGlkIFNJV0UgbWVzc2FnZSBmaWVsZCBcInZlcnNpb25cIi4gVmVyc2lvbiBtdXN0IGJlICcxJy4gUHJvdmlkZWQgdmFsdWU6ICR7dmVyc2lvbn1gKTtcbiAgICAgICAgaWYgKChfYSA9IHBhcmFtZXRlcnMuc3RhdGVtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5jbHVkZXMoJ1xcbicpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJzdGF0ZW1lbnRcIi4gU3RhdGVtZW50IG11c3Qgbm90IGluY2x1ZGUgJ1xcXFxuJy4gUHJvdmlkZWQgdmFsdWU6ICR7cGFyYW1ldGVycy5zdGF0ZW1lbnR9YCk7XG4gICAgfVxuICAgIC8vIENvbnN0cnVjdCBtZXNzYWdlXG4gICAgY29uc3QgYWRkcmVzcyA9IGdldEFkZHJlc3MocGFyYW1ldGVycy5hZGRyZXNzKTtcbiAgICBjb25zdCBvcmlnaW4gPSBzY2hlbWUgPyBgJHtzY2hlbWV9Oi8vJHtkb21haW59YCA6IGRvbWFpbjtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBwYXJhbWV0ZXJzLnN0YXRlbWVudCA/IGAke3BhcmFtZXRlcnMuc3RhdGVtZW50fVxcbmAgOiAnJztcbiAgICBjb25zdCBwcmVmaXggPSBgJHtvcmlnaW59IHdhbnRzIHlvdSB0byBzaWduIGluIHdpdGggeW91ciBFdGhlcmV1bSBhY2NvdW50OlxcbiR7YWRkcmVzc31cXG5cXG4ke3N0YXRlbWVudH1gO1xuICAgIGxldCBzdWZmaXggPSBgVVJJOiAke3VyaX1cXG5WZXJzaW9uOiAke3ZlcnNpb259XFxuQ2hhaW4gSUQ6ICR7Y2hhaW5JZH0ke25vbmNlID8gYFxcbk5vbmNlOiAke25vbmNlfWAgOiAnJ31cXG5Jc3N1ZWQgQXQ6ICR7aXNzdWVkQXQudG9JU09TdHJpbmcoKX1gO1xuICAgIGlmIChleHBpcmF0aW9uVGltZSlcbiAgICAgICAgc3VmZml4ICs9IGBcXG5FeHBpcmF0aW9uIFRpbWU6ICR7ZXhwaXJhdGlvblRpbWUudG9JU09TdHJpbmcoKX1gO1xuICAgIGlmIChub3RCZWZvcmUpXG4gICAgICAgIHN1ZmZpeCArPSBgXFxuTm90IEJlZm9yZTogJHtub3RCZWZvcmUudG9JU09TdHJpbmcoKX1gO1xuICAgIGlmIChyZXF1ZXN0SWQpXG4gICAgICAgIHN1ZmZpeCArPSBgXFxuUmVxdWVzdCBJRDogJHtyZXF1ZXN0SWR9YDtcbiAgICBpZiAocmVzb3VyY2VzKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gJ1xcblJlc291cmNlczonO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFyZXNvdXJjZSB8fCB0eXBlb2YgcmVzb3VyY2UgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IEludmFsaWQgU0lXRSBtZXNzYWdlIGZpZWxkIFwicmVzb3VyY2VzXCIuIEV2ZXJ5IHJlc291cmNlIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcuIFByb3ZpZGVkIHZhbHVlOiAke3Jlc291cmNlfWApO1xuICAgICAgICAgICAgY29udGVudCArPSBgXFxuLSAke3Jlc291cmNlfWA7XG4gICAgICAgIH1cbiAgICAgICAgc3VmZml4ICs9IGNvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9XFxuJHtzdWZmaXh9YDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV0aGVyZXVtLmpzLm1hcCJdLCJuYW1lcyI6WyJnZXRBZGRyZXNzIiwiYWRkcmVzcyIsInRlc3QiLCJFcnJvciIsInRvTG93ZXJDYXNlIiwiZnJvbUhleCIsImhleCIsInBhcnNlSW50IiwidG9IZXgiLCJ2YWx1ZSIsImJ5dGVzIiwiVGV4dEVuY29kZXIiLCJlbmNvZGUiLCJBcnJheSIsImZyb20iLCJieXRlIiwidG9TdHJpbmciLCJwYWRTdGFydCIsImpvaW4iLCJjcmVhdGVTaXdlTWVzc2FnZSIsInBhcmFtZXRlcnMiLCJfYSIsImNoYWluSWQiLCJkb21haW4iLCJleHBpcmF0aW9uVGltZSIsImlzc3VlZEF0IiwiRGF0ZSIsIm5vbmNlIiwibm90QmVmb3JlIiwicmVxdWVzdElkIiwicmVzb3VyY2VzIiwic2NoZW1lIiwidXJpIiwidmVyc2lvbiIsIk51bWJlciIsImlzSW50ZWdlciIsImxlbmd0aCIsInN0YXRlbWVudCIsImluY2x1ZGVzIiwib3JpZ2luIiwicHJlZml4Iiwic3VmZml4IiwidG9JU09TdHJpbmciLCJjb250ZW50IiwicmVzb3VyY2UiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js":
/*!***************************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js ***!
\***************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAuthnError: function() { return /* binding */ WebAuthnError; },\n/* harmony export */ WebAuthnUnknownError: function() { return /* binding */ WebAuthnUnknownError; },\n/* harmony export */ identifyAuthenticationError: function() { return /* binding */ identifyAuthenticationError; },\n/* harmony export */ identifyRegistrationError: function() { return /* binding */ identifyRegistrationError; },\n/* harmony export */ isWebAuthnError: function() { return /* binding */ isWebAuthnError; }\n/* harmony export */ });\n/* harmony import */ var _webauthn__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webauthn */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js\");\n/* eslint-disable @typescript-eslint/ban-ts-comment */ \n/**\n * A custom Error used to return a more nuanced error detailing _why_ one of the eight documented\n * errors in the spec was raised after calling `navigator.credentials.create()` or\n * `navigator.credentials.get()`:\n *\n * - `AbortError`\n * - `ConstraintError`\n * - `InvalidStateError`\n * - `NotAllowedError`\n * - `NotSupportedError`\n * - `SecurityError`\n * - `TypeError`\n * - `UnknownError`\n *\n * Error messages were determined through investigation of the spec to determine under which\n * scenarios a given error would be raised.\n */ class WebAuthnError extends Error {\n constructor({ message, code, cause, name }){\n var _a;\n // @ts-ignore: help Rollup understand that `cause` is okay to set\n super(message, {\n cause\n });\n this.__isWebAuthnError = true;\n this.name = (_a = name !== null && name !== void 0 ? name : cause instanceof Error ? cause.name : undefined) !== null && _a !== void 0 ? _a : \"Unknown Error\";\n this.code = code;\n }\n}\n/**\n * Error class for unknown WebAuthn errors.\n * Wraps unexpected errors that don't match known WebAuthn error conditions.\n */ class WebAuthnUnknownError extends WebAuthnError {\n constructor(message, originalError){\n super({\n code: \"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY\",\n cause: originalError,\n message\n });\n this.name = \"WebAuthnUnknownError\";\n this.originalError = originalError;\n }\n}\n/**\n * Type guard to check if an error is a WebAuthnError.\n * @param {unknown} error - The error to check\n * @returns {boolean} True if the error is a WebAuthnError\n */ function isWebAuthnError(error) {\n return typeof error === \"object\" && error !== null && \"__isWebAuthnError\" in error;\n}\n/**\n * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.create()`.\n * Maps browser errors to specific WebAuthn error codes for better debugging.\n * @param {Object} params - Error identification parameters\n * @param {Error} params.error - The error thrown by the browser\n * @param {CredentialCreationOptions} params.options - The options passed to credentials.create()\n * @returns {WebAuthnError} A WebAuthnError with a specific error code\n * @see {@link https://w3c.github.io/webauthn/#sctn-createCredential W3C WebAuthn Spec - Create Credential}\n */ function identifyRegistrationError(param) {\n let { error, options } = param;\n var _a, _b, _c;\n const { publicKey } = options;\n if (!publicKey) {\n throw Error(\"options was missing required publicKey property\");\n }\n if (error.name === \"AbortError\") {\n if (options.signal instanceof AbortSignal) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16)\n return new WebAuthnError({\n message: \"Registration ceremony was sent an abort signal\",\n code: \"ERROR_CEREMONY_ABORTED\",\n cause: error\n });\n }\n } else if (error.name === \"ConstraintError\") {\n if (((_a = publicKey.authenticatorSelection) === null || _a === void 0 ? void 0 : _a.requireResidentKey) === true) {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 4)\n return new WebAuthnError({\n message: \"Discoverable credentials were required but no available authenticator supported it\",\n code: \"ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT\",\n cause: error\n });\n } else if (// @ts-ignore: `mediation` doesn't yet exist on CredentialCreationOptions but it's possible as of Sept 2024\n options.mediation === \"conditional\" && ((_b = publicKey.authenticatorSelection) === null || _b === void 0 ? void 0 : _b.userVerification) === \"required\") {\n // https://w3c.github.io/webauthn/#sctn-createCredential (Step 22.4)\n return new WebAuthnError({\n message: \"User verification was required during automatic registration but it could not be performed\",\n code: \"ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE\",\n cause: error\n });\n } else if (((_c = publicKey.authenticatorSelection) === null || _c === void 0 ? void 0 : _c.userVerification) === \"required\") {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 5)\n return new WebAuthnError({\n message: \"User verification was required but no available authenticator supported it\",\n code: \"ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT\",\n cause: error\n });\n }\n } else if (error.name === \"InvalidStateError\") {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 20)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 3)\n return new WebAuthnError({\n message: \"The authenticator was previously registered\",\n code: \"ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED\",\n cause: error\n });\n } else if (error.name === \"NotAllowedError\") {\n /**\n * Pass the error directly through. Platforms are overloading this error beyond what the spec\n * defines and we don't want to overwrite potentially useful error messages.\n */ return new WebAuthnError({\n message: error.message,\n code: \"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY\",\n cause: error\n });\n } else if (error.name === \"NotSupportedError\") {\n const validPubKeyCredParams = publicKey.pubKeyCredParams.filter((param)=>param.type === \"public-key\");\n if (validPubKeyCredParams.length === 0) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 10)\n return new WebAuthnError({\n message: 'No entry in pubKeyCredParams was of type \"public-key\"',\n code: \"ERROR_MALFORMED_PUBKEYCREDPARAMS\",\n cause: error\n });\n }\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 2)\n return new WebAuthnError({\n message: \"No available authenticator supported any of the specified pubKeyCredParams algorithms\",\n code: \"ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG\",\n cause: error\n });\n } else if (error.name === \"SecurityError\") {\n const effectiveDomain = window.location.hostname;\n if (!(0,_webauthn__WEBPACK_IMPORTED_MODULE_0__.isValidDomain)(effectiveDomain)) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 7)\n return new WebAuthnError({\n message: \"\".concat(window.location.hostname, \" is an invalid domain\"),\n code: \"ERROR_INVALID_DOMAIN\",\n cause: error\n });\n } else if (publicKey.rp.id !== effectiveDomain) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 8)\n return new WebAuthnError({\n message: 'The RP ID \"'.concat(publicKey.rp.id, '\" is invalid for this domain'),\n code: \"ERROR_INVALID_RP_ID\",\n cause: error\n });\n }\n } else if (error.name === \"TypeError\") {\n if (publicKey.user.id.byteLength < 1 || publicKey.user.id.byteLength > 64) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 5)\n return new WebAuthnError({\n message: \"User ID was not between 1 and 64 characters\",\n code: \"ERROR_INVALID_USER_ID_LENGTH\",\n cause: error\n });\n }\n } else if (error.name === \"UnknownError\") {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 1)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-make-cred (Step 8)\n return new WebAuthnError({\n message: \"The authenticator was unable to process the specified options, or could not create a new credential\",\n code: \"ERROR_AUTHENTICATOR_GENERAL_ERROR\",\n cause: error\n });\n }\n return new WebAuthnError({\n message: \"a Non-Webauthn related error has occurred\",\n code: \"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY\",\n cause: error\n });\n}\n/**\n * Attempt to intuit _why_ an error was raised after calling `navigator.credentials.get()`.\n * Maps browser errors to specific WebAuthn error codes for better debugging.\n * @param {Object} params - Error identification parameters\n * @param {Error} params.error - The error thrown by the browser\n * @param {CredentialRequestOptions} params.options - The options passed to credentials.get()\n * @returns {WebAuthnError} A WebAuthnError with a specific error code\n * @see {@link https://w3c.github.io/webauthn/#sctn-getAssertion W3C WebAuthn Spec - Get Assertion}\n */ function identifyAuthenticationError(param) {\n let { error, options } = param;\n const { publicKey } = options;\n if (!publicKey) {\n throw Error(\"options was missing required publicKey property\");\n }\n if (error.name === \"AbortError\") {\n if (options.signal instanceof AbortSignal) {\n // https://www.w3.org/TR/webauthn-2/#sctn-createCredential (Step 16)\n return new WebAuthnError({\n message: \"Authentication ceremony was sent an abort signal\",\n code: \"ERROR_CEREMONY_ABORTED\",\n cause: error\n });\n }\n } else if (error.name === \"NotAllowedError\") {\n /**\n * Pass the error directly through. Platforms are overloading this error beyond what the spec\n * defines and we don't want to overwrite potentially useful error messages.\n */ return new WebAuthnError({\n message: error.message,\n code: \"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY\",\n cause: error\n });\n } else if (error.name === \"SecurityError\") {\n const effectiveDomain = window.location.hostname;\n if (!(0,_webauthn__WEBPACK_IMPORTED_MODULE_0__.isValidDomain)(effectiveDomain)) {\n // https://www.w3.org/TR/webauthn-2/#sctn-discover-from-external-source (Step 5)\n return new WebAuthnError({\n message: \"\".concat(window.location.hostname, \" is an invalid domain\"),\n code: \"ERROR_INVALID_DOMAIN\",\n cause: error\n });\n } else if (publicKey.rpId !== effectiveDomain) {\n // https://www.w3.org/TR/webauthn-2/#sctn-discover-from-external-source (Step 6)\n return new WebAuthnError({\n message: 'The RP ID \"'.concat(publicKey.rpId, '\" is invalid for this domain'),\n code: \"ERROR_INVALID_RP_ID\",\n cause: error\n });\n }\n } else if (error.name === \"UnknownError\") {\n // https://www.w3.org/TR/webauthn-2/#sctn-op-get-assertion (Step 1)\n // https://www.w3.org/TR/webauthn-2/#sctn-op-get-assertion (Step 12)\n return new WebAuthnError({\n message: \"The authenticator was unable to process the specified options, or could not create a new assertion signature\",\n code: \"ERROR_AUTHENTICATOR_GENERAL_ERROR\",\n cause: error\n });\n }\n return new WebAuthnError({\n message: \"a Non-Webauthn related error has occurred\",\n code: \"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY\",\n cause: error\n });\n} //# sourceMappingURL=webauthn.errors.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvd2ViYXV0aG4uZXJyb3JzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLG9EQUFvRCxHQUNUO0FBQzNDOzs7Ozs7Ozs7Ozs7Ozs7O0NBZ0JDLEdBQ00sTUFBTUMsc0JBQXNCQztJQUMvQkMsWUFBWSxFQUFFQyxPQUFPLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFFQyxJQUFJLEVBQUcsQ0FBRTtRQUN6QyxJQUFJQztRQUNKLGlFQUFpRTtRQUNqRSxLQUFLLENBQUNKLFNBQVM7WUFBRUU7UUFBTTtRQUN2QixJQUFJLENBQUNHLGlCQUFpQixHQUFHO1FBQ3pCLElBQUksQ0FBQ0YsSUFBSSxHQUFHLENBQUNDLEtBQUtELFNBQVMsUUFBUUEsU0FBUyxLQUFLLElBQUlBLE9BQVFELGlCQUFpQkosUUFBUUksTUFBTUMsSUFBSSxHQUFHRyxTQUFTLE1BQU8sUUFBUUYsT0FBTyxLQUFLLElBQUlBLEtBQUs7UUFDaEosSUFBSSxDQUFDSCxJQUFJLEdBQUdBO0lBQ2hCO0FBQ0o7QUFDQTs7O0NBR0MsR0FDTSxNQUFNTSw2QkFBNkJWO0lBQ3RDRSxZQUFZQyxPQUFPLEVBQUVRLGFBQWEsQ0FBRTtRQUNoQyxLQUFLLENBQUM7WUFDRlAsTUFBTTtZQUNOQyxPQUFPTTtZQUNQUjtRQUNKO1FBQ0EsSUFBSSxDQUFDRyxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNLLGFBQWEsR0FBR0E7SUFDekI7QUFDSjtBQUNBOzs7O0NBSUMsR0FDTSxTQUFTQyxnQkFBZ0JDLEtBQUs7SUFDakMsT0FBTyxPQUFPQSxVQUFVLFlBQVlBLFVBQVUsUUFBUSx1QkFBdUJBO0FBQ2pGO0FBQ0E7Ozs7Ozs7O0NBUUMsR0FDTSxTQUFTQywwQkFBMEIsS0FBbUI7UUFBbkIsRUFBRUQsS0FBSyxFQUFFRSxPQUFPLEVBQUcsR0FBbkI7SUFDdEMsSUFBSVIsSUFBSVMsSUFBSUM7SUFD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T0FDSyxJQUFJQSxNQUFNUCxJQUFJLEtBQUssaUJBQWlCO1FBQ3JDLE1BQU15QixrQkFBa0JDLE9BQU9DLFFBQVEsQ0FBQ0MsUUFBUTtRQUNoRCxJQUFJLENBQUNuQyx3REFBYUEsQ0FBQ2dDLGtCQUFrQjtZQUNqQyxnRkFBZ0Y7WUFDaEYsT0FBTyxJQUFJL0IsY0FBYztnQkFDckJHLFNBQVMsR0FBNEIsT0FBekI2QixPQUFPQyxRQUFRLENBQUNDLFFBQVEsRUFBQztnQkFDckM5QixNQUFNO2dCQUNOQyxPQUFPUTtZQUNYO1FBQ0osT0FDSyxJQUFJSyxVQUFVc0IsSUFBSSxLQUFLVCxpQkFBaUI7WUFDekMsZ0ZBQWdGO1lBQ2hGLE9BQU8sSUFBSS9CLGNBQWM7Z0JBQ3JCRyxTQUFTLGNBQTZCLE9BQWZlLFVBQVVzQixJQUFJLEVBQUM7Z0JBQ3RDcEMsTUFBTTtnQkFDTkMsT0FBT1E7WUFDWDtRQUNKO0lBQ0osT0FDSyxJQUFJQSxNQUFNUCxJQUFJLEtBQUssZ0JBQWdCO1FBQ3BDLG1FQUFtRTtRQUNuRSxvRUFBb0U7UUFDcEUsT0FBTyxJQUFJTixjQUFjO1lBQ3JCRyxTQUFTO1lBQ1RDLE1BQU07WUFDTkMsT0FBT1E7UUFDWDtJQUNKO0lBQ0EsT0FBTyxJQUFJYixjQUFjO1FBQ3JCRyxTQUFTO1FBQ1RDLE1BQU07UUFDTkMsT0FBT1E7SUFDWDtBQUNKLEVBQ0EsMkNBQTJDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvd2ViYXV0aG4uZXJyb3JzLmpzP2I5NWMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG5pbXBvcnQgeyBpc1ZhbGlkRG9tYWluIH0gZnJvbSAnLi93ZWJhdXRobic7XG4vKipcbiAqIEEgY3VzdG9tIEVycm9yIHVzZWQgdG8gcmV0dXJuIGEgbW9yZSBudWFuY2VkIGVycm9yIGRldGFpbGluZyBfd2h5XyBvbmUgb2YgdGhlIGVpZ2h0IGRvY3VtZW50ZWRcbiAqIGVycm9ycyBpbiB0aGUgc3BlYyB3YXMgcmFpc2VkIGFmdGVyIGNhbGxpbmcgYG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKWAgb3JcbiAqIGBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClgOlxuICpcbiAqIC0gYEFib3J0RXJyb3JgXG4gKiAtIGBDb25zdHJhaW50RXJyb3JgXG4gKiAtIGBJbnZhbGlkU3RhdGVFcnJvcmBcbiAqIC0gYE5vdEFsbG93ZWRFcnJvcmBcbiAqIC0gYE5vdFN1cHBvcnRlZEVycm9yYFxuICogLSBgU2VjdXJpdHlFcnJvcmBcbiAqIC0gYFR5cGVFcnJvcmBcbiAqIC0gYFVua25vd25FcnJvcmBcbiAqXG4gKiBFcnJvciBtZXNzYWdlcyB3ZXJlIGRldGVybWluZWQgdGhyb3VnaCBpbnZlc3RpZ2F0aW9uIG9mIHRoZSBzcGVjIHRvIGRldGVybWluZSB1bmRlciB3aGljaFxuICogc2NlbmFyaW9zIGEgZ2l2ZW4gZXJyb3Igd291bGQgYmUgcmFpc2VkLlxuICovXG5leHBvcnQgY2xhc3MgV2ViQXV0aG5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UsIGNvZGUsIGNhdXNlLCBuYW1lLCB9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogaGVscCBSb2xsdXAgdW5kZXJzdGFuZCB0aGF0IGBjYXVzZWAgaXMgb2theSB0byBzZXRcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgeyBjYXVzZSB9KTtcbiAgICAgICAgdGhpcy5fX2lzV2ViQXV0aG5FcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMubmFtZSA9IChfYSA9IG5hbWUgIT09IG51bGwgJiYgbmFtZSAhPT0gdm9pZCAwID8gbmFtZSA6IChjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubmFtZSA6IHVuZGVmaW5lZCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdVbmtub3duIEVycm9yJztcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIGNsYXNzIGZvciB1bmtub3duIFdlYkF1dGhuIGVycm9ycy5cbiAqIFdyYXBzIHVuZXhwZWN0ZWQgZXJyb3JzIHRoYXQgZG9uJ3QgbWF0Y2gga25vd24gV2ViQXV0aG4gZXJyb3IgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkF1dGhuVW5rbm93bkVycm9yIGV4dGVuZHMgV2ViQXV0aG5FcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgb3JpZ2luYWxFcnJvcikge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBjb2RlOiAnRVJST1JfUEFTU1RIUk9VR0hfU0VFX0NBVVNFX1BST1BFUlRZJyxcbiAgICAgICAgICAgIGNhdXNlOiBvcmlnaW5hbEVycm9yLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdXZWJBdXRoblVua25vd25FcnJvcic7XG4gICAgICAgIHRoaXMub3JpZ2luYWxFcnJvciA9IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxufVxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIGVycm9yIGlzIGEgV2ViQXV0aG5FcnJvci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBlcnJvciBpcyBhIFdlYkF1dGhuRXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViQXV0aG5FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdfX2lzV2ViQXV0aG5FcnJvcicgaW4gZXJyb3I7XG59XG4vKipcbiAqIEF0dGVtcHQgdG8gaW50dWl0IF93aHlfIGFuIGVycm9yIHdhcyByYWlzZWQgYWZ0ZXIgY2FsbGluZyBgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpYC5cbiAqIE1hcHMgYnJvd3NlciBlcnJvcnMgdG8gc3BlY2lmaWMgV2ViQXV0aG4gZXJyb3IgY29kZXMgZm9yIGJldHRlciBkZWJ1Z2dpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gRXJyb3IgaWRlbnRpZmljYXRpb24gcGFyYW1ldGVyc1xuICogQHBhcmFtIHtFcnJvcn0gcGFyYW1zLmVycm9yIC0gVGhlIGVycm9yIHRocm93biBieSB0aGUgYnJvd3NlclxuICogQHBhcmFtIHtDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zfSBwYXJhbXMub3B0aW9ucyAtIFRoZSBvcHRpb25zIHBhc3NlZCB0byBjcmVkZW50aWFscy5jcmVhdGUoKVxuICogQHJldHVybnMge1dlYkF1dGhuRXJyb3J9IEEgV2ViQXV0aG5FcnJvciB3aXRoIGEgc3BlY2lmaWMgZXJyb3IgY29kZVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgVzNDIFdlYkF1dGhuIFNwZWMgLSBDcmVhdGUgQ3JlZGVudGlhbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aWZ5UmVnaXN0cmF0aW9uRXJyb3IoeyBlcnJvciwgb3B0aW9ucywgfSkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIGNvbnN0IHsgcHVibGljS2V5IH0gPSBvcHRpb25zO1xuICAgIGlmICghcHVibGljS2V5KSB7XG4gICAgICAgIHRocm93IEVycm9yKCdvcHRpb25zIHdhcyBtaXNzaW5nIHJlcXVpcmVkIHB1YmxpY0tleSBwcm9wZXJ0eScpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnNpZ25hbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDE2KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUmVnaXN0cmF0aW9uIGNlcmVtb255IHdhcyBzZW50IGFuIGFib3J0IHNpZ25hbCcsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0NFUkVNT05ZX0FCT1JURUQnLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdDb25zdHJhaW50RXJyb3InKSB7XG4gICAgICAgIGlmICgoKF9hID0gcHVibGljS2V5LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXF1aXJlUmVzaWRlbnRLZXkpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgNClcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Rpc2NvdmVyYWJsZSBjcmVkZW50aWFscyB3ZXJlIHJlcXVpcmVkIGJ1dCBubyBhdmFpbGFibGUgYXV0aGVudGljYXRvciBzdXBwb3J0ZWQgaXQnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX01JU1NJTkdfRElTQ09WRVJBQkxFX0NSRURFTlRJQUxfU1VQUE9SVCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGBtZWRpYXRpb25gIGRvZXNuJ3QgeWV0IGV4aXN0IG9uIENyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMgYnV0IGl0J3MgcG9zc2libGUgYXMgb2YgU2VwdCAyMDI0XG4gICAgICAgIG9wdGlvbnMubWVkaWF0aW9uID09PSAnY29uZGl0aW9uYWwnICYmXG4gICAgICAgICAgICAoKF9iID0gcHVibGljS2V5LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi51c2VyVmVyaWZpY2F0aW9uKSA9PT0gJ3JlcXVpcmVkJykge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgKFN0ZXAgMjIuNClcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZXIgdmVyaWZpY2F0aW9uIHdhcyByZXF1aXJlZCBkdXJpbmcgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBidXQgaXQgY291bGQgbm90IGJlIHBlcmZvcm1lZCcsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0FVVE9fUkVHSVNURVJfVVNFUl9WRVJJRklDQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKChfYyA9IHB1YmxpY0tleS5hdXRoZW50aWNhdG9yU2VsZWN0aW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudXNlclZlcmlmaWNhdGlvbikgPT09ICdyZXF1aXJlZCcpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLW9wLW1ha2UtY3JlZCAoU3RlcCA1KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVXNlciB2ZXJpZmljYXRpb24gd2FzIHJlcXVpcmVkIGJ1dCBubyBhdmFpbGFibGUgYXV0aGVudGljYXRvciBzdXBwb3J0ZWQgaXQnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX01JU1NJTkdfVVNFUl9WRVJJRklDQVRJT05fU1VQUE9SVCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ0ludmFsaWRTdGF0ZUVycm9yJykge1xuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDIwKVxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgMylcbiAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGUgYXV0aGVudGljYXRvciB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkJyxcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX1BSRVZJT1VTTFlfUkVHSVNURVJFRCcsXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnTm90QWxsb3dlZEVycm9yJykge1xuICAgICAgICAvKipcbiAgICAgICAgICogUGFzcyB0aGUgZXJyb3IgZGlyZWN0bHkgdGhyb3VnaC4gUGxhdGZvcm1zIGFyZSBvdmVybG9hZGluZyB0aGlzIGVycm9yIGJleW9uZCB3aGF0IHRoZSBzcGVjXG4gICAgICAgICAqIGRlZmluZXMgYW5kIHdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHBvdGVudGlhbGx5IHVzZWZ1bCBlcnJvciBtZXNzYWdlcy5cbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgY29kZTogJ0VSUk9SX1BBU1NUSFJPVUdIX1NFRV9DQVVTRV9QUk9QRVJUWScsXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnTm90U3VwcG9ydGVkRXJyb3InKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkUHViS2V5Q3JlZFBhcmFtcyA9IHB1YmxpY0tleS5wdWJLZXlDcmVkUGFyYW1zLmZpbHRlcigocGFyYW0pID0+IHBhcmFtLnR5cGUgPT09ICdwdWJsaWMta2V5Jyk7XG4gICAgICAgIGlmICh2YWxpZFB1YktleUNyZWRQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDEwKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTm8gZW50cnkgaW4gcHViS2V5Q3JlZFBhcmFtcyB3YXMgb2YgdHlwZSBcInB1YmxpYy1rZXlcIicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX01BTEZPUk1FRF9QVUJLRVlDUkVEUEFSQU1TJyxcbiAgICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgMilcbiAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdObyBhdmFpbGFibGUgYXV0aGVudGljYXRvciBzdXBwb3J0ZWQgYW55IG9mIHRoZSBzcGVjaWZpZWQgcHViS2V5Q3JlZFBhcmFtcyBhbGdvcml0aG1zJyxcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX05PX1NVUFBPUlRFRF9QVUJLRVlDUkVEUEFSQU1TX0FMRycsXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnU2VjdXJpdHlFcnJvcicpIHtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRG9tYWluID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO1xuICAgICAgICBpZiAoIWlzVmFsaWREb21haW4oZWZmZWN0aXZlRG9tYWluKSkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tY3JlYXRlQ3JlZGVudGlhbCAoU3RlcCA3KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJHt3aW5kb3cubG9jYXRpb24uaG9zdG5hbWV9IGlzIGFuIGludmFsaWQgZG9tYWluYCxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfSU5WQUxJRF9ET01BSU4nLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHB1YmxpY0tleS5ycC5pZCAhPT0gZWZmZWN0aXZlRG9tYWluKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDgpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgUlAgSUQgXCIke3B1YmxpY0tleS5ycC5pZH1cIiBpcyBpbnZhbGlkIGZvciB0aGlzIGRvbWFpbmAsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0lOVkFMSURfUlBfSUQnLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdUeXBlRXJyb3InKSB7XG4gICAgICAgIGlmIChwdWJsaWNLZXkudXNlci5pZC5ieXRlTGVuZ3RoIDwgMSB8fCBwdWJsaWNLZXkudXNlci5pZC5ieXRlTGVuZ3RoID4gNjQpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgKFN0ZXAgNSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZXIgSUQgd2FzIG5vdCBiZXR3ZWVuIDEgYW5kIDY0IGNoYXJhY3RlcnMnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9JTlZBTElEX1VTRVJfSURfTEVOR1RIJyxcbiAgICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnVW5rbm93bkVycm9yJykge1xuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgMSlcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tb3AtbWFrZS1jcmVkIChTdGVwIDgpXG4gICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICBtZXNzYWdlOiAnVGhlIGF1dGhlbnRpY2F0b3Igd2FzIHVuYWJsZSB0byBwcm9jZXNzIHRoZSBzcGVjaWZpZWQgb3B0aW9ucywgb3IgY291bGQgbm90IGNyZWF0ZSBhIG5ldyBjcmVkZW50aWFsJyxcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX0dFTkVSQUxfRVJST1InLFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgbWVzc2FnZTogJ2EgTm9uLVdlYmF1dGhuIHJlbGF0ZWQgZXJyb3IgaGFzIG9jY3VycmVkJyxcbiAgICAgICAgY29kZTogJ0VSUk9SX1BBU1NUSFJPVUdIX1NFRV9DQVVTRV9QUk9QRVJUWScsXG4gICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbn1cbi8qKlxuICogQXR0ZW1wdCB0byBpbnR1aXQgX3doeV8gYW4gZXJyb3Igd2FzIHJhaXNlZCBhZnRlciBjYWxsaW5nIGBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClgLlxuICogTWFwcyBicm93c2VyIGVycm9ycyB0byBzcGVjaWZpYyBXZWJBdXRobiBlcnJvciBjb2RlcyBmb3IgYmV0dGVyIGRlYnVnZ2luZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBFcnJvciBpZGVudGlmaWNhdGlvbiBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0Vycm9yfSBwYXJhbXMuZXJyb3IgLSBUaGUgZXJyb3IgdGhyb3duIGJ5IHRoZSBicm93c2VyXG4gKiBAcGFyYW0ge0NyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc30gcGFyYW1zLm9wdGlvbnMgLSBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gY3JlZGVudGlhbHMuZ2V0KClcbiAqIEByZXR1cm5zIHtXZWJBdXRobkVycm9yfSBBIFdlYkF1dGhuRXJyb3Igd2l0aCBhIHNwZWNpZmljIGVycm9yIGNvZGVcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1nZXRBc3NlcnRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBHZXQgQXNzZXJ0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZnlBdXRoZW50aWNhdGlvbkVycm9yKHsgZXJyb3IsIG9wdGlvbnMsIH0pIHtcbiAgICBjb25zdCB7IHB1YmxpY0tleSB9ID0gb3B0aW9ucztcbiAgICBpZiAoIXB1YmxpY0tleSkge1xuICAgICAgICB0aHJvdyBFcnJvcignb3B0aW9ucyB3YXMgbWlzc2luZyByZXF1aXJlZCBwdWJsaWNLZXkgcHJvcGVydHknKTtcbiAgICB9XG4gICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICBpZiAob3B0aW9ucy5zaWduYWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tY3JlYXRlQ3JlZGVudGlhbCAoU3RlcCAxNilcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0F1dGhlbnRpY2F0aW9uIGNlcmVtb255IHdhcyBzZW50IGFuIGFib3J0IHNpZ25hbCcsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0NFUkVNT05ZX0FCT1JURUQnLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdOb3RBbGxvd2VkRXJyb3InKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXNzIHRoZSBlcnJvciBkaXJlY3RseSB0aHJvdWdoLiBQbGF0Zm9ybXMgYXJlIG92ZXJsb2FkaW5nIHRoaXMgZXJyb3IgYmV5b25kIHdoYXQgdGhlIHNwZWNcbiAgICAgICAgICogZGVmaW5lcyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgcG90ZW50aWFsbHkgdXNlZnVsIGVycm9yIG1lc3NhZ2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICBjb2RlOiAnRVJST1JfUEFTU1RIUk9VR0hfU0VFX0NBVVNFX1BST1BFUlRZJyxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdTZWN1cml0eUVycm9yJykge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVEb21haW4gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XG4gICAgICAgIGlmICghaXNWYWxpZERvbWFpbihlZmZlY3RpdmVEb21haW4pKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1kaXNjb3Zlci1mcm9tLWV4dGVybmFsLXNvdXJjZSAoU3RlcCA1KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJHt3aW5kb3cubG9jYXRpb24uaG9zdG5hbWV9IGlzIGFuIGludmFsaWQgZG9tYWluYCxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfSU5WQUxJRF9ET01BSU4nLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHB1YmxpY0tleS5ycElkICE9PSBlZmZlY3RpdmVEb21haW4pIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLWRpc2NvdmVyLWZyb20tZXh0ZXJuYWwtc291cmNlIChTdGVwIDYpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgUlAgSUQgXCIke3B1YmxpY0tleS5ycElkfVwiIGlzIGludmFsaWQgZm9yIHRoaXMgZG9tYWluYCxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfSU5WQUxJRF9SUF9JRCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ1Vua25vd25FcnJvcicpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tb3AtZ2V0LWFzc2VydGlvbiAoU3RlcCAxKVxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1nZXQtYXNzZXJ0aW9uIChTdGVwIDEyKVxuICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgbWVzc2FnZTogJ1RoZSBhdXRoZW50aWNhdG9yIHdhcyB1bmFibGUgdG8gcHJvY2VzcyB0aGUgc3BlY2lmaWVkIG9wdGlvbnMsIG9yIGNvdWxkIG5vdCBjcmVhdGUgYSBuZXcgYXNzZXJ0aW9uIHNpZ25hdHVyZScsXG4gICAgICAgICAgICBjb2RlOiAnRVJST1JfQVVUSEVOVElDQVRPUl9HRU5FUkFMX0VSUk9SJyxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgIG1lc3NhZ2U6ICdhIE5vbi1XZWJhdXRobiByZWxhdGVkIGVycm9yIGhhcyBvY2N1cnJlZCcsXG4gICAgICAgIGNvZGU6ICdFUlJPUl9QQVNTVEhST1VHSF9TRUVfQ0FVU0VfUFJPUEVSVFknLFxuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJhdXRobi5lcnJvcnMuanMubWFwIl0sIm5hbWVzIjpbImlzVmFsaWREb21haW4iLCJXZWJBdXRobkVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm1lc3NhZ2UiLCJjb2RlIiwiY2F1c2UiLCJuYW1lIiwiX2EiLCJfX2lzV2ViQXV0aG5FcnJvciIsInVuZGVmaW5lZCIsIldlYkF1dGhuVW5rbm93bkVycm9yIiwib3JpZ2luYWxFcnJvciIsImlzV2ViQXV0aG5FcnJvciIsImVycm9yIiwiaWRlbnRpZnlSZWdpc3RyYXRpb25FcnJvciIsIm9wdGlvbnMiLCJfYiIsIl9jIiwicHVibGljS2V5Iiwic2lnbmFsIiwiQWJvcnRTaWduYWwiLCJhdXRoZW50aWNhdG9yU2VsZWN0aW9uIiwicmVxdWlyZVJlc2lkZW50S2V5IiwibWVkaWF0aW9uIiwidXNlclZlcmlmaWNhdGlvbiIsInZhbGlkUHViS2V5Q3JlZFBhcmFtcyIsInB1YktleUNyZWRQYXJhbXMiLCJmaWx0ZXIiLCJwYXJhbSIsInR5cGUiLCJsZW5ndGgiLCJlZmZlY3RpdmVEb21haW4iLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhvc3RuYW1lIiwicnAiLCJpZCIsInVzZXIiLCJieXRlTGVuZ3RoIiwiaWRlbnRpZnlBdXRoZW50aWNhdGlvbkVycm9yIiwicnBJZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js":
/*!********************************************************************!*\
!*** ./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js ***!
\********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DEFAULT_CREATION_OPTIONS: function() { return /* binding */ DEFAULT_CREATION_OPTIONS; },\n/* harmony export */ DEFAULT_REQUEST_OPTIONS: function() { return /* binding */ DEFAULT_REQUEST_OPTIONS; },\n/* harmony export */ WebAuthnAbortService: function() { return /* binding */ WebAuthnAbortService; },\n/* harmony export */ WebAuthnApi: function() { return /* binding */ WebAuthnApi; },\n/* harmony export */ WebAuthnError: function() { return /* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.WebAuthnError; },\n/* harmony export */ createCredential: function() { return /* binding */ createCredential; },\n/* harmony export */ deserializeCredentialCreationOptions: function() { return /* binding */ deserializeCredentialCreationOptions; },\n/* harmony export */ deserializeCredentialRequestOptions: function() { return /* binding */ deserializeCredentialRequestOptions; },\n/* harmony export */ getCredential: function() { return /* binding */ getCredential; },\n/* harmony export */ identifyAuthenticationError: function() { return /* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.identifyAuthenticationError; },\n/* harmony export */ identifyRegistrationError: function() { return /* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.identifyRegistrationError; },\n/* harmony export */ isValidDomain: function() { return /* binding */ isValidDomain; },\n/* harmony export */ isWebAuthnError: function() { return /* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.isWebAuthnError; },\n/* harmony export */ mergeCredentialCreationOptions: function() { return /* binding */ mergeCredentialCreationOptions; },\n/* harmony export */ mergeCredentialRequestOptions: function() { return /* binding */ mergeCredentialRequestOptions; },\n/* harmony export */ serializeCredentialCreationResponse: function() { return /* binding */ serializeCredentialCreationResponse; },\n/* harmony export */ serializeCredentialRequestResponse: function() { return /* binding */ serializeCredentialRequestResponse; },\n/* harmony export */ webAuthnAbortService: function() { return /* binding */ webAuthnAbortService; }\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tslib */ \"(app-pages-browser)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _base64url__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base64url */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./errors */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n/* harmony import */ var _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./webauthn.errors */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js\");\n\n\n\n\n\n\n/**\n * WebAuthn abort service to manage ceremony cancellation.\n * Ensures only one WebAuthn ceremony is active at a time to prevent \"operation already in progress\" errors.\n *\n * @experimental This class is experimental and may change in future releases\n * @see {@link https://w3c.github.io/webauthn/#sctn-automation-webdriver-capability W3C WebAuthn Spec - Aborting Ceremonies}\n */ class WebAuthnAbortService {\n /**\n * Create an abort signal for a new WebAuthn operation.\n * Automatically cancels any existing operation.\n *\n * @returns {AbortSignal} Signal to pass to navigator.credentials.create() or .get()\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal MDN - AbortSignal}\n */ createNewAbortSignal() {\n // Abort any existing calls to navigator.credentials.create() or navigator.credentials.get()\n if (this.controller) {\n const abortError = new Error(\"Cancelling existing WebAuthn API call for new one\");\n abortError.name = \"AbortError\";\n this.controller.abort(abortError);\n }\n const newController = new AbortController();\n this.controller = newController;\n return newController.signal;\n }\n /**\n * Manually cancel the current WebAuthn operation.\n * Useful for cleaning up when user cancels or navigates away.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort MDN - AbortController.abort}\n */ cancelCeremony() {\n if (this.controller) {\n const abortError = new Error(\"Manually cancelling existing WebAuthn API call\");\n abortError.name = \"AbortError\";\n this.controller.abort(abortError);\n this.controller = undefined;\n }\n }\n}\n/**\n * Singleton instance to ensure only one WebAuthn ceremony is active at a time.\n * This prevents \"operation already in progress\" errors when retrying WebAuthn operations.\n *\n * @experimental This instance is experimental and may change in future releases\n */ const webAuthnAbortService = new WebAuthnAbortService();\n/**\n * Convert base64url encoded strings in WebAuthn credential creation options to ArrayBuffers\n * as required by the WebAuthn browser API.\n * Supports both native WebAuthn Level 3 parseCreationOptionsFromJSON and manual fallback.\n *\n * @param {ServerCredentialCreationOptions} options - JSON options from server with base64url encoded fields\n * @returns {PublicKeyCredentialCreationOptionsFuture} Options ready for navigator.credentials.create()\n * @see {@link https://w3c.github.io/webauthn/#sctn-parseCreationOptionsFromJSON W3C WebAuthn Spec - parseCreationOptionsFromJSON}\n */ function deserializeCredentialCreationOptions(options) {\n if (!options) {\n throw new Error(\"Credential creation options are required\");\n }\n // Check if the native parseCreationOptionsFromJSON method is available\n if (typeof PublicKeyCredential !== \"undefined\" && \"parseCreationOptionsFromJSON\" in PublicKeyCredential && typeof PublicKeyCredential.parseCreationOptionsFromJSON === \"function\") {\n // Use the native WebAuthn Level 3 method\n return PublicKeyCredential.parseCreationOptionsFromJSON(/** we assert the options here as typescript still doesn't know about future webauthn types */ options);\n }\n // Fallback to manual parsing for browsers that don't support the native method\n // Destructure to separate fields that need transformation\n const { challenge: challengeStr, user: userOpts, excludeCredentials } = options, restOptions = (0,tslib__WEBPACK_IMPORTED_MODULE_4__.__rest)(options, [\n \"challenge\",\n \"user\",\n \"excludeCredentials\"\n ]);\n // Convert challenge from base64url to ArrayBuffer\n const challenge = (0,_base64url__WEBPACK_IMPORTED_MODULE_0__.base64UrlToUint8Array)(challengeStr).buffer;\n // Convert user.id from base64url to ArrayBuffer\n const user = Object.assign(Object.assign({}, userOpts), {\n id: (0,_base64url__WEBPACK_IMPORTED_MODULE_0__.base64UrlToUint8Array)(userOpts.id).buffer\n });\n // Build the result object\n const result = Object.assign(Object.assign({}, restOptions), {\n challenge,\n user\n });\n // Only add excludeCredentials if it exists\n if (excludeCredentials && excludeCredentials.length > 0) {\n result.excludeCredentials = new Array(excludeCredentials.length);\n for(let i = 0; i < excludeCredentials.length; i++){\n const cred = excludeCredentials[i];\n result.excludeCredentials[i] = Object.assign(Object.assign({}, cred), {\n id: (0,_base64url__WEBPACK_IMPORTED_MODULE_0__.base64UrlToUint8Array)(cred.id).buffer,\n type: cred.type || \"public-key\",\n // Cast transports to handle future transport types like \"cable\"\n transports: cred.transports\n });\n }\n }\n return result;\n}\n/**\n * Convert base64url encoded strings in WebAuthn credential request options to ArrayBuffers\n * as required by the WebAuthn browser API.\n * Supports both native WebAuthn Level 3 parseRequestOptionsFromJSON and manual fallback.\n *\n * @param {ServerCredentialRequestOptions} options - JSON options from server with base64url encoded fields\n * @returns {PublicKeyCredentialRequestOptionsFuture} Options ready for navigator.credentials.get()\n * @see {@link https://w3c.github.io/webauthn/#sctn-parseRequestOptionsFromJSON W3C WebAuthn Spec - parseRequestOptionsFromJSON}\n */ function deserializeCredentialRequestOptions(options) {\n if (!options) {\n throw new Error(\"Credential request options are required\");\n }\n // Check if the native parseRequestOptionsFromJSON method is available\n if (typeof PublicKeyCredential !== \"undefined\" && \"parseRequestOptionsFromJSON\" in PublicKeyCredential && typeof PublicKeyCredential.parseRequestOptionsFromJSON === \"function\") {\n // Use the native WebAuthn Level 3 method\n return PublicKeyCredential.parseRequestOptionsFromJSON(options);\n }\n // Fallback to manual parsing for browsers that don't support the native method\n // Destructure to separate fields that need transformation\n const { challenge: challengeStr, allowCredentials } = options, restOptions = (0,tslib__WEBPACK_IMPORTED_MODULE_4__.__rest)(options, [\n \"challenge\",\n \"allowCredentials\"\n ]);\n // Convert challenge from base64url to ArrayBuffer\n const challenge = (0,_base64url__WEBPACK_IMPORTED_MODULE_0__.base64UrlToUint8Array)(challengeStr).buffer;\n // Build the result object\n const result = Object.assign(Object.assign({}, restOptions), {\n challenge\n });\n // Only add allowCredentials if it exists\n if (allowCredentials && allowCredentials.length > 0) {\n result.allowCredentials = new Array(allowCredentials.length);\n for(let i = 0; i < allowCredentials.length; i++){\n const cred = allowCredentials[i];\n result.allowCredentials[i] = Object.assign(Object.assign({}, cred), {\n id: (0,_base64url__WEBPACK_IMPORTED_MODULE_0__.base64UrlToUint8Array)(cred.id).buffer,\n type: cred.type || \"public-key\",\n // Cast transports to handle future transport types like \"cable\"\n transports: cred.transports\n });\n }\n }\n return result;\n}\n/**\n * Convert a registration/enrollment credential response to server format.\n * Serializes binary fields to base64url for JSON transmission.\n * Supports both native WebAuthn Level 3 toJSON and manual fallback.\n *\n * @param {RegistrationCredential} credential - Credential from navigator.credentials.create()\n * @returns {RegistrationResponseJSON} JSON-serializable credential for server\n * @see {@link https://w3c.github.io/webauthn/#dom-publickeycredential-tojson W3C WebAuthn Spec - toJSON}\n */ function serializeCredentialCreationResponse(credential) {\n var _a;\n // Check if the credential instance has the toJSON method\n if (\"toJSON\" in credential && typeof credential.toJSON === \"function\") {\n // Use the native WebAuthn Level 3 method\n return credential.toJSON();\n }\n const credentialWithAttachment = credential;\n return {\n id: credential.id,\n rawId: credential.id,\n response: {\n attestationObject: (0,_base64url__WEBPACK_IMPORTED_MODULE_0__.bytesToBase64URL)(new Uint8Array(credential.response.attestationObject)),\n clientDataJSON: (0,_base64url__WEBPACK_IMPORTED_MODULE_0__.bytesToBase64URL)(new Uint8Array(credential.response.clientDataJSON))\n },\n type: \"public-key\",\n clientExtensionResults: credential.getClientExtensionResults(),\n // Convert null to undefined and cast to AuthenticatorAttachment type\n authenticatorAttachment: (_a = credentialWithAttachment.authenticatorAttachment) !== null && _a !== void 0 ? _a : undefined\n };\n}\n/**\n * Convert an authentication/verification credential response to server format.\n * Serializes binary fields to base64url for JSON transmission.\n * Supports both native WebAuthn Level 3 toJSON and manual fallback.\n *\n * @param {AuthenticationCredential} credential - Credential from navigator.credentials.get()\n * @returns {AuthenticationResponseJSON} JSON-serializable credential for server\n * @see {@link https://w3c.github.io/webauthn/#dom-publickeycredential-tojson W3C WebAuthn Spec - toJSON}\n */ function serializeCredentialRequestResponse(credential) {\n var _a;\n // Check if the credential instance has the toJSON method\n if (\"toJSON\" in credential && typeof credential.toJSON === \"function\") {\n // Use the native WebAuthn Level 3 method\n return credential.toJSON();\n }\n // Fallback to manual conversion for browsers that don't support toJSON\n // Access authenticatorAttachment via type assertion to handle TypeScript version differences\n // @simplewebauthn/types includes this property but base TypeScript 4.7.4 doesn't\n const credentialWithAttachment = credential;\n const clientExtensionResults = credential.getClientExtensionResults();\n const assertionResponse = credential.response;\n return {\n id: credential.id,\n rawId: credential.id,\n response: {\n authenticatorData: (0,_base64url__WEBPACK_IMPORTED_MODULE_0__.bytesToBase64URL)(new Uint8Array(assertionResponse.authenticatorData)),\n clientDataJSON: (0,_base64url__WEBPACK_IMPORTED_MODULE_0__.bytesToBase64URL)(new Uint8Array(assertionResponse.clientDataJSON)),\n signature: (0,_base64url__WEBPACK_IMPORTED_MODULE_0__.bytesToBase64URL)(new Uint8Array(assertionResponse.signature)),\n userHandle: assertionResponse.userHandle ? (0,_base64url__WEBPACK_IMPORTED_MODULE_0__.bytesToBase64URL)(new Uint8Array(assertionResponse.userHandle)) : undefined\n },\n type: \"public-key\",\n clientExtensionResults,\n // Convert null to undefined and cast to AuthenticatorAttachment type\n authenticatorAttachment: (_a = credentialWithAttachment.authenticatorAttachment) !== null && _a !== void 0 ? _a : undefined\n };\n}\n/**\n * A simple test to determine if a hostname is a properly-formatted domain name.\n * Considers localhost valid for development environments.\n *\n * A \"valid domain\" is defined here: https://url.spec.whatwg.org/#valid-domain\n *\n * Regex sourced from here:\n * https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch08s15.html\n *\n * @param {string} hostname - The hostname to validate\n * @returns {boolean} True if valid domain or localhost\n * @see {@link https://url.spec.whatwg.org/#valid-domain WHATWG URL Spec - Valid Domain}\n */ function isValidDomain(hostname) {\n return(// Consider localhost valid as well since it's okay wrt Secure Contexts\n hostname === \"localhost\" || /^([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}$/i.test(hostname));\n}\n/**\n * Determine if the browser is capable of WebAuthn.\n * Checks for necessary Web APIs: PublicKeyCredential and Credential Management.\n *\n * @returns {boolean} True if browser supports WebAuthn\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredential#browser_compatibility MDN - PublicKeyCredential Browser Compatibility}\n */ function browserSupportsWebAuthn() {\n var _a, _b;\n return !!((0,_helpers__WEBPACK_IMPORTED_MODULE_2__.isBrowser)() && \"PublicKeyCredential\" in window && window.PublicKeyCredential && \"credentials\" in navigator && typeof ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.credentials) === null || _a === void 0 ? void 0 : _a.create) === \"function\" && typeof ((_b = navigator === null || navigator === void 0 ? void 0 : navigator.credentials) === null || _b === void 0 ? void 0 : _b.get) === \"function\");\n}\n/**\n * Create a WebAuthn credential using the browser's credentials API.\n * Wraps navigator.credentials.create() with error handling.\n *\n * @param {CredentialCreationOptions} options - Options including publicKey parameters\n * @returns {Promise<RequestResult<RegistrationCredential, WebAuthnError>>} Created credential or error\n * @see {@link https://w3c.github.io/webauthn/#sctn-createCredential W3C WebAuthn Spec - Create Credential}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/CredentialsContainer/create MDN - credentials.create}\n */ async function createCredential(options) {\n try {\n const response = await navigator.credentials.create(/** we assert the type here until typescript types are updated */ options);\n if (!response) {\n return {\n data: null,\n error: new _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.WebAuthnUnknownError(\"Empty credential response\", response)\n };\n }\n if (!(response instanceof PublicKeyCredential)) {\n return {\n data: null,\n error: new _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.WebAuthnUnknownError(\"Browser returned unexpected credential type\", response)\n };\n }\n return {\n data: response,\n error: null\n };\n } catch (err) {\n return {\n data: null,\n error: (0,_webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.identifyRegistrationError)({\n error: err,\n options\n })\n };\n }\n}\n/**\n * Get a WebAuthn credential using the browser's credentials API.\n * Wraps navigator.credentials.get() with error handling.\n *\n * @param {CredentialRequestOptions} options - Options including publicKey parameters\n * @returns {Promise<RequestResult<AuthenticationCredential, WebAuthnError>>} Retrieved credential or error\n * @see {@link https://w3c.github.io/webauthn/#sctn-getAssertion W3C WebAuthn Spec - Get Assertion}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/CredentialsContainer/get MDN - credentials.get}\n */ async function getCredential(options) {\n try {\n const response = await navigator.credentials.get(/** we assert the type here until typescript types are updated */ options);\n if (!response) {\n return {\n data: null,\n error: new _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.WebAuthnUnknownError(\"Empty credential response\", response)\n };\n }\n if (!(response instanceof PublicKeyCredential)) {\n return {\n data: null,\n error: new _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.WebAuthnUnknownError(\"Browser returned unexpected credential type\", response)\n };\n }\n return {\n data: response,\n error: null\n };\n } catch (err) {\n return {\n data: null,\n error: (0,_webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.identifyAuthenticationError)({\n error: err,\n options\n })\n };\n }\n}\nconst DEFAULT_CREATION_OPTIONS = {\n hints: [\n \"security-key\"\n ],\n authenticatorSelection: {\n authenticatorAttachment: \"cross-platform\",\n requireResidentKey: false,\n /** set to preferred because older yubikeys don't have PIN/Biometric */ userVerification: \"preferred\",\n residentKey: \"discouraged\"\n },\n attestation: \"direct\"\n};\nconst DEFAULT_REQUEST_OPTIONS = {\n /** set to preferred because older yubikeys don't have PIN/Biometric */ userVerification: \"preferred\",\n hints: [\n \"security-key\"\n ],\n attestation: \"direct\"\n};\nfunction deepMerge() {\n for(var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++){\n sources[_key] = arguments[_key];\n }\n const isObject = (val)=>val !== null && typeof val === \"object\" && !Array.isArray(val);\n const isArrayBufferLike = (val)=>val instanceof ArrayBuffer || ArrayBuffer.isView(val);\n const result = {};\n for (const source of sources){\n if (!source) continue;\n for(const key in source){\n const value = source[key];\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n // preserve array reference, including unions like AuthenticatorTransport[]\n result[key] = value;\n } else if (isArrayBufferLike(value)) {\n result[key] = value;\n } else if (isObject(value)) {\n const existing = result[key];\n if (isObject(existing)) {\n result[key] = deepMerge(existing, value);\n } else {\n result[key] = deepMerge(value);\n }\n } else {\n result[key] = value;\n }\n }\n }\n return result;\n}\n/**\n * Merges WebAuthn credential creation options with overrides.\n * Sets sensible defaults for authenticator selection and extensions.\n *\n * @param {PublicKeyCredentialCreationOptionsFuture} baseOptions - The base options from the server\n * @param {PublicKeyCredentialCreationOptionsFuture} overrides - Optional overrides to apply\n * @param {string} friendlyName - Optional friendly name for the credential\n * @returns {PublicKeyCredentialCreationOptionsFuture} Merged credential creation options\n * @see {@link https://w3c.github.io/webauthn/#dictdef-authenticatorselectioncriteria W3C WebAuthn Spec - AuthenticatorSelectionCriteria}\n */ function mergeCredentialCreationOptions(baseOptions, overrides) {\n return deepMerge(DEFAULT_CREATION_OPTIONS, baseOptions, overrides || {});\n}\n/**\n * Merges WebAuthn credential request options with overrides.\n * Sets sensible defaults for user verification and hints.\n *\n * @param {PublicKeyCredentialRequestOptionsFuture} baseOptions - The base options from the server\n * @param {PublicKeyCredentialRequestOptionsFuture} overrides - Optional overrides to apply\n * @returns {PublicKeyCredentialRequestOptionsFuture} Merged credential request options\n * @see {@link https://w3c.github.io/webauthn/#dictdef-publickeycredentialrequestoptions W3C WebAuthn Spec - PublicKeyCredentialRequestOptions}\n */ function mergeCredentialRequestOptions(baseOptions, overrides) {\n return deepMerge(DEFAULT_REQUEST_OPTIONS, baseOptions, overrides || {});\n}\n/**\n * WebAuthn API wrapper for Supabase Auth.\n * Provides methods for enrolling, challenging, verifying, authenticating, and registering WebAuthn credentials.\n *\n * @experimental This API is experimental and may change in future releases\n * @see {@link https://w3c.github.io/webauthn/ W3C WebAuthn Specification}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API MDN - Web Authentication API}\n */ class WebAuthnApi {\n /**\n * Enroll a new WebAuthn factor.\n * Creates an unverified WebAuthn factor that must be verified with a credential.\n *\n * @experimental This method is experimental and may change in future releases\n * @param {Omit<MFAEnrollWebauthnParams, 'factorType'>} params - Enrollment parameters (friendlyName required)\n * @returns {Promise<AuthMFAEnrollWebauthnResponse>} Enrolled factor details or error\n * @see {@link https://w3c.github.io/webauthn/#sctn-registering-a-new-credential W3C WebAuthn Spec - Registering a New Credential}\n */ async _enroll(params) {\n return this.client.mfa.enroll(Object.assign(Object.assign({}, params), {\n factorType: \"webauthn\"\n }));\n }\n /**\n * Challenge for WebAuthn credential creation or authentication.\n * Combines server challenge with browser credential operations.\n * Handles both registration (create) and authentication (request) flows.\n *\n * @experimental This method is experimental and may change in future releases\n * @param {MFAChallengeWebauthnParams & { friendlyName?: string; signal?: AbortSignal }} params - Challenge parameters including factorId\n * @param {Object} overrides - Allows you to override the parameters passed to navigator.credentials\n * @param {PublicKeyCredentialCreationOptionsFuture} overrides.create - Override options for credential creation\n * @param {PublicKeyCredentialRequestOptionsFuture} overrides.request - Override options for credential request\n * @returns {Promise<RequestResult>} Challenge response with credential or error\n * @see {@link https://w3c.github.io/webauthn/#sctn-credential-creation W3C WebAuthn Spec - Credential Creation}\n * @see {@link https://w3c.github.io/webauthn/#sctn-verifying-assertion W3C WebAuthn Spec - Verifying Assertion}\n */ async _challenge(param, overrides) {\n let { factorId, webauthn, friendlyName, signal } = param;\n try {\n // Get challenge from server using the client's MFA methods\n const { data: challengeResponse, error: challengeError } = await this.client.mfa.challenge({\n factorId,\n webauthn\n });\n if (!challengeResponse) {\n return {\n data: null,\n error: challengeError\n };\n }\n const abortSignal = signal !== null && signal !== void 0 ? signal : webAuthnAbortService.createNewAbortSignal();\n /** webauthn will fail if either of the name/displayname are blank */ if (challengeResponse.webauthn.type === \"create\") {\n const { user } = challengeResponse.webauthn.credential_options.publicKey;\n if (!user.name) {\n user.name = \"\".concat(user.id, \":\").concat(friendlyName);\n }\n if (!user.displayName) {\n user.displayName = user.name;\n }\n }\n switch(challengeResponse.webauthn.type){\n case \"create\":\n {\n const options = mergeCredentialCreationOptions(challengeResponse.webauthn.credential_options.publicKey, overrides === null || overrides === void 0 ? void 0 : overrides.create);\n const { data, error } = await createCredential({\n publicKey: options,\n signal: abortSignal\n });\n if (data) {\n return {\n data: {\n factorId,\n challengeId: challengeResponse.id,\n webauthn: {\n type: challengeResponse.webauthn.type,\n credential_response: data\n }\n },\n error: null\n };\n }\n return {\n data: null,\n error\n };\n }\n case \"request\":\n {\n const options = mergeCredentialRequestOptions(challengeResponse.webauthn.credential_options.publicKey, overrides === null || overrides === void 0 ? void 0 : overrides.request);\n const { data, error } = await getCredential(Object.assign(Object.assign({}, challengeResponse.webauthn.credential_options), {\n publicKey: options,\n signal: abortSignal\n }));\n if (data) {\n return {\n data: {\n factorId,\n challengeId: challengeResponse.id,\n webauthn: {\n type: challengeResponse.webauthn.type,\n credential_response: data\n }\n },\n error: null\n };\n }\n return {\n data: null,\n error\n };\n }\n }\n } catch (error) {\n if ((0,_errors__WEBPACK_IMPORTED_MODULE_1__.isAuthError)(error)) {\n return {\n data: null,\n error\n };\n }\n return {\n data: null,\n error: new _errors__WEBPACK_IMPORTED_MODULE_1__.AuthUnknownError(\"Unexpected error in challenge\", error)\n };\n }\n }\n /**\n * Verify a WebAuthn credential with the server.\n * Completes the WebAuthn ceremony by sending the credential to the server for verification.\n *\n * @experimental This method is experimental and may change in future releases\n * @param {Object} params - Verification parameters\n * @param {string} params.challengeId - ID of the challenge being verified\n * @param {string} params.factorId - ID of the WebAuthn factor\n * @param {MFAVerifyWebauthnParams<T>['webauthn']} params.webauthn - WebAuthn credential response\n * @returns {Promise<AuthMFAVerifyResponse>} Verification result with session or error\n * @see {@link https://w3c.github.io/webauthn/#sctn-verifying-assertion W3C WebAuthn Spec - Verifying an Authentication Assertion}\n * */ async _verify(param) {\n let { challengeId, factorId, webauthn } = param;\n return this.client.mfa.verify({\n factorId,\n challengeId,\n webauthn: webauthn\n });\n }\n /**\n * Complete WebAuthn authentication flow.\n * Performs challenge and verification in a single operation for existing credentials.\n *\n * @experimental This method is experimental and may change in future releases\n * @param {Object} params - Authentication parameters\n * @param {string} params.factorId - ID of the WebAuthn factor to authenticate with\n * @param {Object} params.webauthn - WebAuthn configuration\n * @param {string} params.webauthn.rpId - Relying Party ID (defaults to current hostname)\n * @param {string[]} params.webauthn.rpOrigins - Allowed origins (defaults to current origin)\n * @param {AbortSignal} params.webauthn.signal - Optional abort signal\n * @param {PublicKeyCredentialRequestOptionsFuture} overrides - Override options for navigator.credentials.get\n * @returns {Promise<RequestResult<AuthMFAVerifyResponseData, WebAuthnError | AuthError>>} Authentication result\n * @see {@link https://w3c.github.io/webauthn/#sctn-authentication W3C WebAuthn Spec - Authentication Ceremony}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialRequestOptions MDN - PublicKeyCredentialRequestOptions}\n */ async _authenticate(param, overrides) {\n let { factorId, webauthn: { rpId = true ? window.location.hostname : 0, rpOrigins = true ? [\n window.location.origin\n ] : 0, signal } = {} } = param;\n if (!rpId) {\n return {\n data: null,\n error: new _errors__WEBPACK_IMPORTED_MODULE_1__.AuthError(\"rpId is required for WebAuthn authentication\")\n };\n }\n try {\n if (!browserSupportsWebAuthn()) {\n return {\n data: null,\n error: new _errors__WEBPACK_IMPORTED_MODULE_1__.AuthUnknownError(\"Browser does not support WebAuthn\", null)\n };\n }\n // Get challenge and credential\n const { data: challengeResponse, error: challengeError } = await this.challenge({\n factorId,\n webauthn: {\n rpId,\n rpOrigins\n },\n signal\n }, {\n request: overrides\n });\n if (!challengeResponse) {\n return {\n data: null,\n error: challengeError\n };\n }\n const { webauthn } = challengeResponse;\n // Verify credential\n return this._verify({\n factorId,\n challengeId: challengeResponse.challengeId,\n webauthn: {\n type: webauthn.type,\n rpId,\n rpOrigins,\n credential_response: webauthn.credential_response\n }\n });\n } catch (error) {\n if ((0,_errors__WEBPACK_IMPORTED_MODULE_1__.isAuthError)(error)) {\n return {\n data: null,\n error\n };\n }\n return {\n data: null,\n error: new _errors__WEBPACK_IMPORTED_MODULE_1__.AuthUnknownError(\"Unexpected error in authenticate\", error)\n };\n }\n }\n /**\n * Complete WebAuthn registration flow.\n * Performs enrollment, challenge, and verification in a single operation for new credentials.\n *\n * @experimental This method is experimental and may change in future releases\n * @param {Object} params - Registration parameters\n * @param {string} params.friendlyName - User-friendly name for the credential\n * @param {string} params.rpId - Relying Party ID (defaults to current hostname)\n * @param {string[]} params.rpOrigins - Allowed origins (defaults to current origin)\n * @param {AbortSignal} params.signal - Optional abort signal\n * @param {PublicKeyCredentialCreationOptionsFuture} overrides - Override options for navigator.credentials.create\n * @returns {Promise<RequestResult<AuthMFAVerifyResponseData, WebAuthnError | AuthError>>} Registration result\n * @see {@link https://w3c.github.io/webauthn/#sctn-registering-a-new-credential W3C WebAuthn Spec - Registration Ceremony}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialCreationOptions MDN - PublicKeyCredentialCreationOptions}\n */ async _register(param, overrides) {\n let { friendlyName, webauthn: { rpId = true ? window.location.hostname : 0, rpOrigins = true ? [\n window.location.origin\n ] : 0, signal } = {} } = param;\n if (!rpId) {\n return {\n data: null,\n error: new _errors__WEBPACK_IMPORTED_MODULE_1__.AuthError(\"rpId is required for WebAuthn registration\")\n };\n }\n try {\n if (!browserSupportsWebAuthn()) {\n return {\n data: null,\n error: new _errors__WEBPACK_IMPORTED_MODULE_1__.AuthUnknownError(\"Browser does not support WebAuthn\", null)\n };\n }\n // Enroll factor\n const { data: factor, error: enrollError } = await this._enroll({\n friendlyName\n });\n if (!factor) {\n await this.client.mfa.listFactors().then((factors)=>{\n var _a;\n return (_a = factors.data) === null || _a === void 0 ? void 0 : _a.all.find((v)=>v.factor_type === \"webauthn\" && v.friendly_name === friendlyName && v.status !== \"unverified\");\n }).then((factor)=>factor ? this.client.mfa.unenroll({\n factorId: factor === null || factor === void 0 ? void 0 : factor.id\n }) : void 0);\n return {\n data: null,\n error: enrollError\n };\n }\n // Get challenge and create credential\n const { data: challengeResponse, error: challengeError } = await this._challenge({\n factorId: factor.id,\n friendlyName: factor.friendly_name,\n webauthn: {\n rpId,\n rpOrigins\n },\n signal\n }, {\n create: overrides\n });\n if (!challengeResponse) {\n return {\n data: null,\n error: challengeError\n };\n }\n return this._verify({\n factorId: factor.id,\n challengeId: challengeResponse.challengeId,\n webauthn: {\n rpId,\n rpOrigins,\n type: challengeResponse.webauthn.type,\n credential_response: challengeResponse.webauthn.credential_response\n }\n });\n } catch (error) {\n if ((0,_errors__WEBPACK_IMPORTED_MODULE_1__.isAuthError)(error)) {\n return {\n data: null,\n error\n };\n }\n return {\n data: null,\n error: new _errors__WEBPACK_IMPORTED_MODULE_1__.AuthUnknownError(\"Unexpected error in register\", error)\n };\n }\n }\n constructor(client){\n this.client = client;\n // Bind all methods so they can be destructured\n this.enroll = this._enroll.bind(this);\n this.challenge = this._challenge.bind(this);\n this.verify = this._verify.bind(this);\n this.authenticate = this._authenticate.bind(this);\n this.register = this._register.bind(this);\n }\n} //# sourceMappingURL=webauthn.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvd2ViYXV0aG4uanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBK0I7QUFDdUM7QUFDRjtBQUM5QjtBQUM0RztBQUNoRDtBQUNsRzs7Ozs7O0NBTUMsR0FDTSxNQUFNWTtJQUNUOzs7Ozs7S0FNQyxHQUNEQyx1QkFBdUI7UUFDbkIsNEZBQTRGO1FBQzVGLElBQUksSUFBSSxDQUFDQyxVQUFVLEVBQUU7WUFDakIsTUFBTUMsYUFBYSxJQUFJQyxNQUFNO1lBQzdCRCxXQUFXRSxJQUFJLEdBQUc7WUFDbEIsSUFBSSxDQUFDSCxVQUFVLENBQUNJLEtBQUssQ0FBQ0g7UUFDMUI7UUFDQSxNQUFNSSxnQkFBZ0IsSUFBSUM7UUFDMUIsSUFBSSxDQUFDTixVQUFVLEdBQUdLO1FBQ2xCLE9BQU9BLGNBQWNFLE1BQU07SUFDL0I7SUFDQTs7Ozs7S0FLQyxHQUNEQyxpQkFBaUI7UUFDYixJQUFJLElBQUksQ0FBQ1IsVUFBVSxFQUFFO1lBQ2pCLE1BQU1DLGFBQWEsSUFBSUMsTUFBTTtZQUM3QkQsV0FBV0UsSUFBSSxHQUFHO1lBQ2xCLElBQUksQ0FBQ0gsVUFBVSxDQUFDSSxLQUFLLENBQUNIO1lBQ3RCLElBQUksQ0FBQ0QsVUFBVSxHQUFHUztRQUN0QjtJQUNKO0FBQ0o7QUFDQTs7Ozs7Q0FLQyxHQUNNLE1BQU1DLHVCQUF1QixJQUFJWix1QkFBdUI7QUFDL0Q7Ozs7Ozs7O0NBUUMsR0FDTSxTQUFTYSxxQ0FBcUNDLE9BQU87SUFDeEQsSUFBSSxDQUFDQSxTQUFTO1FBQ1YsTUFBTSxJQUFJVixNQUFNO0lBQ3BCO0lBQ0EsdUVBQXVFO0lBQ3ZFLElBQUksT0FBT1csd0JBQXdCLGVBQy9CLGtDQUFrQ0EsdUJBQ2xDLE9BQU9BLG9CQUNGQyw0QkFBNEIsS0FBSyxZQUFZO1FBQ2xELHlDQUF5QztRQUN6QyxPQUFPRCxvQkFBb0JD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QUkxRSxvREFBV0EsQ0FBQzBFLFFBQVE7Z0JBQ3BCLE9BQU87b0JBQUVELE1BQU07b0JBQU1DO2dCQUFNO1lBQy9CO1lBQ0EsT0FBTztnQkFDSEQsTUFBTTtnQkFDTkMsT0FBTyxJQUFJM0UscURBQWdCQSxDQUFDLGdDQUFnQzJFO1lBQ2hFO1FBQ0o7SUFDSjtJQTFRQW1FLFlBQVlyQyxNQUFNLENBQUU7UUFDaEIsSUFBSSxDQUFDQSxNQUFNLEdBQUdBO1FBQ2QsK0NBQStDO1FBQy9DLElBQUksQ0FBQ0UsTUFBTSxHQUFHLElBQUksQ0FBQ0osT0FBTyxDQUFDd0MsSUFBSSxDQUFDLElBQUk7UUFDcEMsSUFBSSxDQUFDdEgsU0FBUyxHQUFHLElBQUksQ0FBQ29GLFVBQVUsQ0FBQ2tDLElBQUksQ0FBQyxJQUFJO1FBQzFDLElBQUksQ0FBQ3BCLE1BQU0sR0FBRyxJQUFJLENBQUNELE9BQU8sQ0FBQ3FCLElBQUksQ0FBQyxJQUFJO1FBQ3BDLElBQUksQ0FBQ0MsWUFBWSxHQUFHLElBQUksQ0FBQ3BCLGFBQWEsQ0FBQ21CLElBQUksQ0FBQyxJQUFJO1FBQ2hELElBQUksQ0FBQ0UsUUFBUSxHQUFHLElBQUksQ0FBQ2hCLFNBQVMsQ0FBQ2MsSUFBSSxDQUFDLElBQUk7SUFDNUM7QUFtUUosRUFDQSxvQ0FBb0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi93ZWJhdXRobi5qcz84OGNjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYmFzZTY0VXJsVG9VaW50OEFycmF5LCBieXRlc1RvQmFzZTY0VVJMIH0gZnJvbSAnLi9iYXNlNjR1cmwnO1xuaW1wb3J0IHsgQXV0aEVycm9yLCBBdXRoVW5rbm93bkVycm9yLCBpc0F1dGhFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGlzQnJvd3NlciB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBpZGVudGlmeUF1dGhlbnRpY2F0aW9uRXJyb3IsIGlkZW50aWZ5UmVnaXN0cmF0aW9uRXJyb3IsIGlzV2ViQXV0aG5FcnJvciwgV2ViQXV0aG5FcnJvciwgV2ViQXV0aG5Vbmtub3duRXJyb3IsIH0gZnJvbSAnLi93ZWJhdXRobi5lcnJvcnMnO1xuZXhwb3J0IHsgV2ViQXV0aG5FcnJvciwgaXNXZWJBdXRobkVycm9yLCBpZGVudGlmeVJlZ2lzdHJhdGlvbkVycm9yLCBpZGVudGlmeUF1dGhlbnRpY2F0aW9uRXJyb3IgfTtcbi8qKlxuICogV2ViQXV0aG4gYWJvcnQgc2VydmljZSB0byBtYW5hZ2UgY2VyZW1vbnkgY2FuY2VsbGF0aW9uLlxuICogRW5zdXJlcyBvbmx5IG9uZSBXZWJBdXRobiBjZXJlbW9ueSBpcyBhY3RpdmUgYXQgYSB0aW1lIHRvIHByZXZlbnQgXCJvcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzc1wiIGVycm9ycy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgY2xhc3MgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWF1dG9tYXRpb24td2ViZHJpdmVyLWNhcGFiaWxpdHkgVzNDIFdlYkF1dGhuIFNwZWMgLSBBYm9ydGluZyBDZXJlbW9uaWVzfVxuICovXG5leHBvcnQgY2xhc3MgV2ViQXV0aG5BYm9ydFNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBhYm9ydCBzaWduYWwgZm9yIGEgbmV3IFdlYkF1dGhuIG9wZXJhdGlvbi5cbiAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbmNlbHMgYW55IGV4aXN0aW5nIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBYm9ydFNpZ25hbH0gU2lnbmFsIHRvIHBhc3MgdG8gbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpIG9yIC5nZXQoKVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydFNpZ25hbCBNRE4gLSBBYm9ydFNpZ25hbH1cbiAgICAgKi9cbiAgICBjcmVhdGVOZXdBYm9ydFNpZ25hbCgpIHtcbiAgICAgICAgLy8gQWJvcnQgYW55IGV4aXN0aW5nIGNhbGxzIHRvIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKSBvciBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlcikge1xuICAgICAgICAgICAgY29uc3QgYWJvcnRFcnJvciA9IG5ldyBFcnJvcignQ2FuY2VsbGluZyBleGlzdGluZyBXZWJBdXRobiBBUEkgY2FsbCBmb3IgbmV3IG9uZScpO1xuICAgICAgICAgICAgYWJvcnRFcnJvci5uYW1lID0gJ0Fib3J0RXJyb3InO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KGFib3J0RXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IG5ld0NvbnRyb2xsZXI7XG4gICAgICAgIHJldHVybiBuZXdDb250cm9sbGVyLnNpZ25hbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgY2FuY2VsIHRoZSBjdXJyZW50IFdlYkF1dGhuIG9wZXJhdGlvbi5cbiAgICAgKiBVc2VmdWwgZm9yIGNsZWFuaW5nIHVwIHdoZW4gdXNlciBjYW5jZWxzIG9yIG5hdmlnYXRlcyBhd2F5LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlci9hYm9ydCBNRE4gLSBBYm9ydENvbnRyb2xsZXIuYWJvcnR9XG4gICAgICovXG4gICAgY2FuY2VsQ2VyZW1vbnkoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGFib3J0RXJyb3IgPSBuZXcgRXJyb3IoJ01hbnVhbGx5IGNhbmNlbGxpbmcgZXhpc3RpbmcgV2ViQXV0aG4gQVBJIGNhbGwnKTtcbiAgICAgICAgICAgIGFib3J0RXJyb3IubmFtZSA9ICdBYm9ydEVycm9yJztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5hYm9ydChhYm9ydEVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogU2luZ2xldG9uIGluc3RhbmNlIHRvIGVuc3VyZSBvbmx5IG9uZSBXZWJBdXRobiBjZXJlbW9ueSBpcyBhY3RpdmUgYXQgYSB0aW1lLlxuICogVGhpcyBwcmV2ZW50cyBcIm9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzXCIgZXJyb3JzIHdoZW4gcmV0cnlpbmcgV2ViQXV0aG4gb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgaW5zdGFuY2UgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICovXG5leHBvcnQgY29uc3Qgd2ViQXV0aG5BYm9ydFNlcnZpY2UgPSBuZXcgV2ViQXV0aG5BYm9ydFNlcnZpY2UoKTtcbi8qKlxuICogQ29udmVydCBiYXNlNjR1cmwgZW5jb2RlZCBzdHJpbmdzIGluIFdlYkF1dGhuIGNyZWRlbnRpYWwgY3JlYXRpb24gb3B0aW9ucyB0byBBcnJheUJ1ZmZlcnNcbiAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBXZWJBdXRobiBicm93c2VyIEFQSS5cbiAqIFN1cHBvcnRzIGJvdGggbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgcGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTiBhbmQgbWFudWFsIGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7U2VydmVyQ3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc30gb3B0aW9ucyAtIEpTT04gb3B0aW9ucyBmcm9tIHNlcnZlciB3aXRoIGJhc2U2NHVybCBlbmNvZGVkIGZpZWxkc1xuICogQHJldHVybnMge1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNGdXR1cmV9IE9wdGlvbnMgcmVhZHkgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXBhcnNlQ3JlYXRpb25PcHRpb25zRnJvbUpTT04gVzNDIFdlYkF1dGhuIFNwZWMgLSBwYXJzZUNyZWF0aW9uT3B0aW9uc0Zyb21KU09OfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDcmVkZW50aWFsIGNyZWF0aW9uIG9wdGlvbnMgYXJlIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIHRoZSBuYXRpdmUgcGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTiBtZXRob2QgaXMgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBQdWJsaWNLZXlDcmVkZW50aWFsICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAncGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTicgaW4gUHVibGljS2V5Q3JlZGVudGlhbCAmJlxuICAgICAgICB0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbFxuICAgICAgICAgICAgLnBhcnNlQ3JlYXRpb25PcHRpb25zRnJvbUpTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgV2ViQXV0aG4gTGV2ZWwgMyBtZXRob2RcbiAgICAgICAgcmV0dXJuIFB1YmxpY0tleUNyZWRlbnRpYWwucGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTihcbiAgICAgICAgLyoqIHdlIGFzc2VydCB0aGUgb3B0aW9ucyBoZXJlIGFzIHR5cGVzY3JpcHQgc3RpbGwgZG9lc24ndCBrbm93IGFib3V0IGZ1dHVyZSB3ZWJhdXRobiB0eXBlcyAqL1xuICAgICAgICBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gbWFudWFsIHBhcnNpbmcgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgbmF0aXZlIG1ldGhvZFxuICAgIC8vIERlc3RydWN0dXJlIHRvIHNlcGFyYXRlIGZpZWxkcyB0aGF0IG5lZWQgdHJhbnNmb3JtYXRpb25cbiAgICBjb25zdCB7IGNoYWxsZW5nZTogY2hhbGxlbmdlU3RyLCB1c2VyOiB1c2VyT3B0cywgZXhjbHVkZUNyZWRlbnRpYWxzIH0gPSBvcHRpb25zLCByZXN0T3B0aW9ucyA9IF9fcmVzdChvcHRpb25zXG4gICAgLy8gQ29udmVydCBjaGFsbGVuZ2UgZnJvbSBiYXNlNjR1cmwgdG8gQXJyYXlCdWZmZXJcbiAgICAsIFtcImNoYWxsZW5nZVwiLCBcInVzZXJcIiwgXCJleGNsdWRlQ3JlZGVudGlhbHNcIl0pO1xuICAgIC8vIENvbnZlcnQgY2hhbGxlbmdlIGZyb20gYmFzZTY0dXJsIHRvIEFycmF5QnVmZmVyXG4gICAgY29uc3QgY2hhbGxlbmdlID0gYmFzZTY0VXJsVG9VaW50OEFycmF5KGNoYWxsZW5nZVN0cikuYnVmZmVyO1xuICAgIC8vIENvbnZlcnQgdXNlci5pZCBmcm9tIGJhc2U2NHVybCB0byBBcnJheUJ1ZmZlclxuICAgIGNvbnN0IHVzZXIgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHVzZXJPcHRzKSwgeyBpZDogYmFzZTY0VXJsVG9VaW50OEFycmF5KHVzZXJPcHRzLmlkKS5idWZmZXIgfSk7XG4gICAgLy8gQnVpbGQgdGhlIHJlc3VsdCBvYmplY3RcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3RPcHRpb25zKSwgeyBjaGFsbGVuZ2UsXG4gICAgICAgIHVzZXIgfSk7XG4gICAgLy8gT25seSBhZGQgZXhjbHVkZUNyZWRlbnRpYWxzIGlmIGl0IGV4aXN0c1xuICAgIGlmIChleGNsdWRlQ3JlZGVudGlhbHMgJiYgZXhjbHVkZUNyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LmV4Y2x1ZGVDcmVkZW50aWFscyA9IG5ldyBBcnJheShleGNsdWRlQ3JlZGVudGlhbHMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGNsdWRlQ3JlZGVudGlhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNyZWQgPSBleGNsdWRlQ3JlZGVudGlhbHNbaV07XG4gICAgICAgICAgICByZXN1bHQuZXhjbHVkZUNyZWRlbnRpYWxzW2ldID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjcmVkKSwgeyBpZDogYmFzZTY0VXJsVG9VaW50OEFycmF5KGNyZWQuaWQpLmJ1ZmZlciwgdHlwZTogY3JlZC50eXBlIHx8ICdwdWJsaWMta2V5JywgXG4gICAgICAgICAgICAgICAgLy8gQ2FzdCB0cmFuc3BvcnRzIHRvIGhhbmRsZSBmdXR1cmUgdHJhbnNwb3J0IHR5cGVzIGxpa2UgXCJjYWJsZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNwb3J0czogY3JlZC50cmFuc3BvcnRzIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvbnZlcnQgYmFzZTY0dXJsIGVuY29kZWQgc3RyaW5ncyBpbiBXZWJBdXRobiBjcmVkZW50aWFsIHJlcXVlc3Qgb3B0aW9ucyB0byBBcnJheUJ1ZmZlcnNcbiAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBXZWJBdXRobiBicm93c2VyIEFQSS5cbiAqIFN1cHBvcnRzIGJvdGggbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgcGFyc2VSZXF1ZXN0T3B0aW9uc0Zyb21KU09OIGFuZCBtYW51YWwgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIHtTZXJ2ZXJDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnN9IG9wdGlvbnMgLSBKU09OIG9wdGlvbnMgZnJvbSBzZXJ2ZXIgd2l0aCBiYXNlNjR1cmwgZW5jb2RlZCBmaWVsZHNcbiAqIEByZXR1cm5zIHtQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNGdXR1cmV9IE9wdGlvbnMgcmVhZHkgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoKVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTiBXM0MgV2ViQXV0aG4gU3BlYyAtIHBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDcmVkZW50aWFsIHJlcXVlc3Qgb3B0aW9ucyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgdGhlIG5hdGl2ZSBwYXJzZVJlcXVlc3RPcHRpb25zRnJvbUpTT04gbWV0aG9kIGlzIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgJ3BhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTicgaW4gUHVibGljS2V5Q3JlZGVudGlhbCAmJlxuICAgICAgICB0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbFxuICAgICAgICAgICAgLnBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBXZWJBdXRobiBMZXZlbCAzIG1ldGhvZFxuICAgICAgICByZXR1cm4gUHVibGljS2V5Q3JlZGVudGlhbC5wYXJzZVJlcXVlc3RPcHRpb25zRnJvbUpTT04ob3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG1hbnVhbCBwYXJzaW5nIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlIG5hdGl2ZSBtZXRob2RcbiAgICAvLyBEZXN0cnVjdHVyZSB0byBzZXBhcmF0ZSBmaWVsZHMgdGhhdCBuZWVkIHRyYW5zZm9ybWF0aW9uXG4gICAgY29uc3QgeyBjaGFsbGVuZ2U6IGNoYWxsZW5nZVN0ciwgYWxsb3dDcmVkZW50aWFscyB9ID0gb3B0aW9ucywgcmVzdE9wdGlvbnMgPSBfX3Jlc3Qob3B0aW9uc1xuICAgIC8vIENvbnZlcnQgY2hhbGxlbmdlIGZyb20gYmFzZTY0dXJsIHRvIEFycmF5QnVmZmVyXG4gICAgLCBbXCJjaGFsbGVuZ2VcIiwgXCJhbGxvd0NyZWRlbnRpYWxzXCJdKTtcbiAgICAvLyBDb252ZXJ0IGNoYWxsZW5nZSBmcm9tIGJhc2U2NHVybCB0byBBcnJheUJ1ZmZlclxuICAgIGNvbnN0IGNoYWxsZW5nZSA9IGJhc2U2NFVybFRvVWludDhBcnJheShjaGFsbGVuZ2VTdHIpLmJ1ZmZlcjtcbiAgICAvLyBCdWlsZCB0aGUgcmVzdWx0IG9iamVjdFxuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdE9wdGlvbnMpLCB7IGNoYWxsZW5nZSB9KTtcbiAgICAvLyBPbmx5IGFkZCBhbGxvd0NyZWRlbnRpYWxzIGlmIGl0IGV4aXN0c1xuICAgIGlmIChhbGxvd0NyZWRlbnRpYWxzICYmIGFsbG93Q3JlZGVudGlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuYWxsb3dDcmVkZW50aWFscyA9IG5ldyBBcnJheShhbGxvd0NyZWRlbnRpYWxzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsb3dDcmVkZW50aWFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY3JlZCA9IGFsbG93Q3JlZGVudGlhbHNbaV07XG4gICAgICAgICAgICByZXN1bHQuYWxsb3dDcmVkZW50aWFsc1tpXSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY3JlZCksIHsgaWQ6IGJhc2U2NFVybFRvVWludDhBcnJheShjcmVkLmlkKS5idWZmZXIsIHR5cGU6IGNyZWQudHlwZSB8fCAncHVibGljLWtleScsIFxuICAgICAgICAgICAgICAgIC8vIENhc3QgdHJhbnNwb3J0cyB0byBoYW5kbGUgZnV0dXJlIHRyYW5zcG9ydCB0eXBlcyBsaWtlIFwiY2FibGVcIlxuICAgICAgICAgICAgICAgIHRyYW5zcG9ydHM6IGNyZWQudHJhbnNwb3J0cyB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgcmVnaXN0cmF0aW9uL2Vucm9sbG1lbnQgY3JlZGVudGlhbCByZXNwb25zZSB0byBzZXJ2ZXIgZm9ybWF0LlxuICogU2VyaWFsaXplcyBiaW5hcnkgZmllbGRzIHRvIGJhc2U2NHVybCBmb3IgSlNPTiB0cmFuc21pc3Npb24uXG4gKiBTdXBwb3J0cyBib3RoIG5hdGl2ZSBXZWJBdXRobiBMZXZlbCAzIHRvSlNPTiBhbmQgbWFudWFsIGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7UmVnaXN0cmF0aW9uQ3JlZGVudGlhbH0gY3JlZGVudGlhbCAtIENyZWRlbnRpYWwgZnJvbSBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKClcbiAqIEByZXR1cm5zIHtSZWdpc3RyYXRpb25SZXNwb25zZUpTT059IEpTT04tc2VyaWFsaXphYmxlIGNyZWRlbnRpYWwgZm9yIHNlcnZlclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNkb20tcHVibGlja2V5Y3JlZGVudGlhbC10b2pzb24gVzNDIFdlYkF1dGhuIFNwZWMgLSB0b0pTT059XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25SZXNwb25zZShjcmVkZW50aWFsKSB7XG4gICAgdmFyIF9hO1xuICAgIC8vIENoZWNrIGlmIHRoZSBjcmVkZW50aWFsIGluc3RhbmNlIGhhcyB0aGUgdG9KU09OIG1ldGhvZFxuICAgIGlmICgndG9KU09OJyBpbiBjcmVkZW50aWFsICYmIHR5cGVvZiBjcmVkZW50aWFsLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBXZWJBdXRobiBMZXZlbCAzIG1ldGhvZFxuICAgICAgICByZXR1cm4gY3JlZGVudGlhbC50b0pTT04oKTtcbiAgICB9XG4gICAgY29uc3QgY3JlZGVudGlhbFdpdGhBdHRhY2htZW50ID0gY3JlZGVudGlhbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogY3JlZGVudGlhbC5pZCxcbiAgICAgICAgcmF3SWQ6IGNyZWRlbnRpYWwuaWQsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICBhdHRlc3RhdGlvbk9iamVjdDogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShjcmVkZW50aWFsLnJlc3BvbnNlLmF0dGVzdGF0aW9uT2JqZWN0KSksXG4gICAgICAgICAgICBjbGllbnREYXRhSlNPTjogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShjcmVkZW50aWFsLnJlc3BvbnNlLmNsaWVudERhdGFKU09OKSksXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdwdWJsaWMta2V5JyxcbiAgICAgICAgY2xpZW50RXh0ZW5zaW9uUmVzdWx0czogY3JlZGVudGlhbC5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCksXG4gICAgICAgIC8vIENvbnZlcnQgbnVsbCB0byB1bmRlZmluZWQgYW5kIGNhc3QgdG8gQXV0aGVudGljYXRvckF0dGFjaG1lbnQgdHlwZVxuICAgICAgICBhdXRoZW50aWNhdG9yQXR0YWNobWVudDogKChfYSA9IGNyZWRlbnRpYWxXaXRoQXR0YWNobWVudC5hdXRoZW50aWNhdG9yQXR0YWNobWVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdW5kZWZpbmVkKSxcbiAgICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0IGFuIGF1dGhlbnRpY2F0aW9uL3ZlcmlmaWNhdGlvbiBjcmVkZW50aWFsIHJlc3BvbnNlIHRvIHNlcnZlciBmb3JtYXQuXG4gKiBTZXJpYWxpemVzIGJpbmFyeSBmaWVsZHMgdG8gYmFzZTY0dXJsIGZvciBKU09OIHRyYW5zbWlzc2lvbi5cbiAqIFN1cHBvcnRzIGJvdGggbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgdG9KU09OIGFuZCBtYW51YWwgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIHtBdXRoZW50aWNhdGlvbkNyZWRlbnRpYWx9IGNyZWRlbnRpYWwgLSBDcmVkZW50aWFsIGZyb20gbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCgpXG4gKiBAcmV0dXJucyB7QXV0aGVudGljYXRpb25SZXNwb25zZUpTT059IEpTT04tc2VyaWFsaXphYmxlIGNyZWRlbnRpYWwgZm9yIHNlcnZlclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNkb20tcHVibGlja2V5Y3JlZGVudGlhbC10b2pzb24gVzNDIFdlYkF1dGhuIFNwZWMgLSB0b0pTT059XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdFJlc3BvbnNlKGNyZWRlbnRpYWwpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNyZWRlbnRpYWwgaW5zdGFuY2UgaGFzIHRoZSB0b0pTT04gbWV0aG9kXG4gICAgaWYgKCd0b0pTT04nIGluIGNyZWRlbnRpYWwgJiYgdHlwZW9mIGNyZWRlbnRpYWwudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgbWV0aG9kXG4gICAgICAgIHJldHVybiBjcmVkZW50aWFsLnRvSlNPTigpO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBtYW51YWwgY29udmVyc2lvbiBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRvSlNPTlxuICAgIC8vIEFjY2VzcyBhdXRoZW50aWNhdG9yQXR0YWNobWVudCB2aWEgdHlwZSBhc3NlcnRpb24gdG8gaGFuZGxlIFR5cGVTY3JpcHQgdmVyc2lvbiBkaWZmZXJlbmNlc1xuICAgIC8vIEBzaW1wbGV3ZWJhdXRobi90eXBlcyBpbmNsdWRlcyB0aGlzIHByb3BlcnR5IGJ1dCBiYXNlIFR5cGVTY3JpcHQgNC43LjQgZG9lc24ndFxuICAgIGNvbnN0IGNyZWRlbnRpYWxXaXRoQXR0YWNobWVudCA9IGNyZWRlbnRpYWw7XG4gICAgY29uc3QgY2xpZW50RXh0ZW5zaW9uUmVzdWx0cyA9IGNyZWRlbnRpYWwuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpO1xuICAgIGNvbnN0IGFzc2VydGlvblJlc3BvbnNlID0gY3JlZGVudGlhbC5yZXNwb25zZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogY3JlZGVudGlhbC5pZCxcbiAgICAgICAgcmF3SWQ6IGNyZWRlbnRpYWwuaWQsIC8vIFczQyBzcGVjIGV4cGVjdHMgcmF3SWQgdG8gbWF0Y2ggaWQgZm9yIEpTT04gZm9ybWF0XG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICBhdXRoZW50aWNhdG9yRGF0YTogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShhc3NlcnRpb25SZXNwb25zZS5hdXRoZW50aWNhdG9yRGF0YSkpLFxuICAgICAgICAgICAgY2xpZW50RGF0YUpTT046IGJ5dGVzVG9CYXNlNjRVUkwobmV3IFVpbnQ4QXJyYXkoYXNzZXJ0aW9uUmVzcG9uc2UuY2xpZW50RGF0YUpTT04pKSxcbiAgICAgICAgICAgIHNpZ25hdHVyZTogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShhc3NlcnRpb25SZXNwb25zZS5zaWduYXR1cmUpKSxcbiAgICAgICAgICAgIHVzZXJIYW5kbGU6IGFzc2VydGlvblJlc3BvbnNlLnVzZXJIYW5kbGVcbiAgICAgICAgICAgICAgICA/IGJ5dGVzVG9CYXNlNjRVUkwobmV3IFVpbnQ4QXJyYXkoYXNzZXJ0aW9uUmVzcG9uc2UudXNlckhhbmRsZSkpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdwdWJsaWMta2V5JyxcbiAgICAgICAgY2xpZW50RXh0ZW5zaW9uUmVzdWx0cyxcbiAgICAgICAgLy8gQ29udmVydCBudWxsIHRvIHVuZGVmaW5lZCBhbmQgY2FzdCB0byBBdXRoZW50aWNhdG9yQXR0YWNobWVudCB0eXBlXG4gICAgICAgIGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OiAoKF9hID0gY3JlZGVudGlhbFdpdGhBdHRhY2htZW50LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQpLFxuICAgIH07XG59XG4vKipcbiAqIEEgc2ltcGxlIHRlc3QgdG8gZGV0ZXJtaW5lIGlmIGEgaG9zdG5hbWUgaXMgYSBwcm9wZXJseS1mb3JtYXR0ZWQgZG9tYWluIG5hbWUuXG4gKiBDb25zaWRlcnMgbG9jYWxob3N0IHZhbGlkIGZvciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gKlxuICogQSBcInZhbGlkIGRvbWFpblwiIGlzIGRlZmluZWQgaGVyZTogaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN2YWxpZC1kb21haW5cbiAqXG4gKiBSZWdleCBzb3VyY2VkIGZyb20gaGVyZTpcbiAqIGh0dHBzOi8vd3d3Lm9yZWlsbHkuY29tL2xpYnJhcnkvdmlldy9yZWd1bGFyLWV4cHJlc3Npb25zLWNvb2tib29rLzk3ODE0NDkzMjc0NTMvY2gwOHMxNS5odG1sXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhvc3RuYW1lIC0gVGhlIGhvc3RuYW1lIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWxpZCBkb21haW4gb3IgbG9jYWxob3N0XG4gKiBAc2VlIHtAbGluayBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3ZhbGlkLWRvbWFpbiBXSEFUV0cgVVJMIFNwZWMgLSBWYWxpZCBEb21haW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRG9tYWluKGhvc3RuYW1lKSB7XG4gICAgcmV0dXJuIChcbiAgICAvLyBDb25zaWRlciBsb2NhbGhvc3QgdmFsaWQgYXMgd2VsbCBzaW5jZSBpdCdzIG9rYXkgd3J0IFNlY3VyZSBDb250ZXh0c1xuICAgIGhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fCAvXihbYS16MC05XSsoLVthLXowLTldKykqXFwuKStbYS16XXsyLH0kL2kudGVzdChob3N0bmFtZSkpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGJyb3dzZXIgaXMgY2FwYWJsZSBvZiBXZWJBdXRobi5cbiAqIENoZWNrcyBmb3IgbmVjZXNzYXJ5IFdlYiBBUElzOiBQdWJsaWNLZXlDcmVkZW50aWFsIGFuZCBDcmVkZW50aWFsIE1hbmFnZW1lbnQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYnJvd3NlciBzdXBwb3J0cyBXZWJBdXRoblxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1B1YmxpY0tleUNyZWRlbnRpYWwjYnJvd3Nlcl9jb21wYXRpYmlsaXR5IE1ETiAtIFB1YmxpY0tleUNyZWRlbnRpYWwgQnJvd3NlciBDb21wYXRpYmlsaXR5fVxuICovXG5mdW5jdGlvbiBicm93c2VyU3VwcG9ydHNXZWJBdXRobigpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiAhIShpc0Jyb3dzZXIoKSAmJlxuICAgICAgICAnUHVibGljS2V5Q3JlZGVudGlhbCcgaW4gd2luZG93ICYmXG4gICAgICAgIHdpbmRvdy5QdWJsaWNLZXlDcmVkZW50aWFsICYmXG4gICAgICAgICdjcmVkZW50aWFscycgaW4gbmF2aWdhdG9yICYmXG4gICAgICAgIHR5cGVvZiAoKF9hID0gbmF2aWdhdG9yID09PSBudWxsIHx8IG5hdmlnYXRvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yLmNyZWRlbnRpYWxzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY3JlYXRlKSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgKChfYiA9IG5hdmlnYXRvciA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvci5jcmVkZW50aWFscykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmdldCkgPT09ICdmdW5jdGlvbicpO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBXZWJBdXRobiBjcmVkZW50aWFsIHVzaW5nIHRoZSBicm93c2VyJ3MgY3JlZGVudGlhbHMgQVBJLlxuICogV3JhcHMgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpIHdpdGggZXJyb3IgaGFuZGxpbmcuXG4gKlxuICogQHBhcmFtIHtDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBpbmNsdWRpbmcgcHVibGljS2V5IHBhcmFtZXRlcnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlcXVlc3RSZXN1bHQ8UmVnaXN0cmF0aW9uQ3JlZGVudGlhbCwgV2ViQXV0aG5FcnJvcj4+fSBDcmVhdGVkIGNyZWRlbnRpYWwgb3IgZXJyb3JcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIFczQyBXZWJBdXRobiBTcGVjIC0gQ3JlYXRlIENyZWRlbnRpYWx9XG4gKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3JlZGVudGlhbHNDb250YWluZXIvY3JlYXRlIE1ETiAtIGNyZWRlbnRpYWxzLmNyZWF0ZX1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNyZWRlbnRpYWwob3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZShcbiAgICAgICAgLyoqIHdlIGFzc2VydCB0aGUgdHlwZSBoZXJlIHVudGlsIHR5cGVzY3JpcHQgdHlwZXMgYXJlIHVwZGF0ZWQgKi9cbiAgICAgICAgb3B0aW9ucyk7XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IFdlYkF1dGhuVW5rbm93bkVycm9yKCdFbXB0eSBjcmVkZW50aWFsIHJlc3BvbnNlJywgcmVzcG9uc2UpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShyZXNwb25zZSBpbnN0YW5jZW9mIFB1YmxpY0tleUNyZWRlbnRpYWwpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBXZWJBdXRoblVua25vd25FcnJvcignQnJvd3NlciByZXR1cm5lZCB1bmV4cGVjdGVkIGNyZWRlbnRpYWwgdHlwZScsIHJlc3BvbnNlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzcG9uc2UsIGVycm9yOiBudWxsIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICBlcnJvcjogaWRlbnRpZnlSZWdpc3RyYXRpb25FcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG4gKiBHZXQgYSBXZWJBdXRobiBjcmVkZW50aWFsIHVzaW5nIHRoZSBicm93c2VyJ3MgY3JlZGVudGlhbHMgQVBJLlxuICogV3JhcHMgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCgpIHdpdGggZXJyb3IgaGFuZGxpbmcuXG4gKlxuICogQHBhcmFtIHtDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGluY2x1ZGluZyBwdWJsaWNLZXkgcGFyYW1ldGVyc1xuICogQHJldHVybnMge1Byb21pc2U8UmVxdWVzdFJlc3VsdDxBdXRoZW50aWNhdGlvbkNyZWRlbnRpYWwsIFdlYkF1dGhuRXJyb3I+Pn0gUmV0cmlldmVkIGNyZWRlbnRpYWwgb3IgZXJyb3JcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1nZXRBc3NlcnRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBHZXQgQXNzZXJ0aW9ufVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NyZWRlbnRpYWxzQ29udGFpbmVyL2dldCBNRE4gLSBjcmVkZW50aWFscy5nZXR9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDcmVkZW50aWFsKG9wdGlvbnMpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoXG4gICAgICAgIC8qKiB3ZSBhc3NlcnQgdGhlIHR5cGUgaGVyZSB1bnRpbCB0eXBlc2NyaXB0IHR5cGVzIGFyZSB1cGRhdGVkICovXG4gICAgICAgIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBXZWJBdXRoblVua25vd25FcnJvcignRW1wdHkgY3JlZGVudGlhbCByZXNwb25zZScsIHJlc3BvbnNlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocmVzcG9uc2UgaW5zdGFuY2VvZiBQdWJsaWNLZXlDcmVkZW50aWFsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgV2ViQXV0aG5Vbmtub3duRXJyb3IoJ0Jyb3dzZXIgcmV0dXJuZWQgdW5leHBlY3RlZCBjcmVkZW50aWFsIHR5cGUnLCByZXNwb25zZSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3BvbnNlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgZXJyb3I6IGlkZW50aWZ5QXV0aGVudGljYXRpb25FcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ1JFQVRJT05fT1BUSU9OUyA9IHtcbiAgICBoaW50czogWydzZWN1cml0eS1rZXknXSxcbiAgICBhdXRoZW50aWNhdG9yU2VsZWN0aW9uOiB7XG4gICAgICAgIGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OiAnY3Jvc3MtcGxhdGZvcm0nLFxuICAgICAgICByZXF1aXJlUmVzaWRlbnRLZXk6IGZhbHNlLFxuICAgICAgICAvKiogc2V0IHRvIHByZWZlcnJlZCBiZWNhdXNlIG9sZGVyIHl1YmlrZXlzIGRvbid0IGhhdmUgUElOL0Jpb21ldHJpYyAqL1xuICAgICAgICB1c2VyVmVyaWZpY2F0aW9uOiAncHJlZmVycmVkJyxcbiAgICAgICAgcmVzaWRlbnRLZXk6ICdkaXNjb3VyYWdlZCcsXG4gICAgfSxcbiAgICBhdHRlc3RhdGlvbjogJ2RpcmVjdCcsXG59O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVRVUVTVF9PUFRJT05TID0ge1xuICAgIC8qKiBzZXQgdG8gcHJlZmVycmVkIGJlY2F1c2Ugb2xkZXIgeXViaWtleXMgZG9uJ3QgaGF2ZSBQSU4vQmlvbWV0cmljICovXG4gICAgdXNlclZlcmlmaWNhdGlvbjogJ3ByZWZlcnJlZCcsXG4gICAgaGludHM6IFsnc2VjdXJpdHkta2V5J10sXG4gICAgYXR0ZXN0YXRpb246ICdkaXJlY3QnLFxufTtcbmZ1bmN0aW9uIGRlZXBNZXJnZSguLi5zb3VyY2VzKSB7XG4gICAgY29uc3QgaXNPYmplY3QgPSAodmFsKSA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcbiAgICBjb25zdCBpc0FycmF5QnVmZmVyTGlrZSA9ICh2YWwpID0+IHZhbCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgaWYgKCFzb3VyY2UpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZSBhcnJheSByZWZlcmVuY2UsIGluY2x1ZGluZyB1bmlvbnMgbGlrZSBBdXRoZW50aWNhdG9yVHJhbnNwb3J0W11cbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUJ1ZmZlckxpa2UodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gcmVzdWx0W2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGV4aXN0aW5nKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGRlZXBNZXJnZShleGlzdGluZywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBkZWVwTWVyZ2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogTWVyZ2VzIFdlYkF1dGhuIGNyZWRlbnRpYWwgY3JlYXRpb24gb3B0aW9ucyB3aXRoIG92ZXJyaWRlcy5cbiAqIFNldHMgc2Vuc2libGUgZGVmYXVsdHMgZm9yIGF1dGhlbnRpY2F0b3Igc2VsZWN0aW9uIGFuZCBleHRlbnNpb25zLlxuICpcbiAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc0Z1dHVyZX0gYmFzZU9wdGlvbnMgLSBUaGUgYmFzZSBvcHRpb25zIGZyb20gdGhlIHNlcnZlclxuICogQHBhcmFtIHtQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zRnV0dXJlfSBvdmVycmlkZXMgLSBPcHRpb25hbCBvdmVycmlkZXMgdG8gYXBwbHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBmcmllbmRseU5hbWUgLSBPcHRpb25hbCBmcmllbmRseSBuYW1lIGZvciB0aGUgY3JlZGVudGlhbFxuICogQHJldHVybnMge1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNGdXR1cmV9IE1lcmdlZCBjcmVkZW50aWFsIGNyZWF0aW9uIG9wdGlvbnNcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jZGljdGRlZi1hdXRoZW50aWNhdG9yc2VsZWN0aW9uY3JpdGVyaWEgVzNDIFdlYkF1dGhuIFNwZWMgLSBBdXRoZW50aWNhdG9yU2VsZWN0aW9uQ3JpdGVyaWF9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMoYmFzZU9wdGlvbnMsIG92ZXJyaWRlcykge1xuICAgIHJldHVybiBkZWVwTWVyZ2UoREVGQVVMVF9DUkVBVElPTl9PUFRJT05TLCBiYXNlT3B0aW9ucywgb3ZlcnJpZGVzIHx8IHt9KTtcbn1cbi8qKlxuICogTWVyZ2VzIFdlYkF1dGhuIGNyZWRlbnRpYWwgcmVxdWVzdCBvcHRpb25zIHdpdGggb3ZlcnJpZGVzLlxuICogU2V0cyBzZW5zaWJsZSBkZWZhdWx0cyBmb3IgdXNlciB2ZXJpZmljYXRpb24gYW5kIGhpbnRzLlxuICpcbiAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBiYXNlT3B0aW9ucyAtIFRoZSBiYXNlIG9wdGlvbnMgZnJvbSB0aGUgc2VydmVyXG4gKiBAcGFyYW0ge1B1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc0Z1dHVyZX0gb3ZlcnJpZGVzIC0gT3B0aW9uYWwgb3ZlcnJpZGVzIHRvIGFwcGx5XG4gKiBAcmV0dXJucyB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBNZXJnZWQgY3JlZGVudGlhbCByZXF1ZXN0IG9wdGlvbnNcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jZGljdGRlZi1wdWJsaWNrZXljcmVkZW50aWFscmVxdWVzdG9wdGlvbnMgVzNDIFdlYkF1dGhuIFNwZWMgLSBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyhiYXNlT3B0aW9ucywgb3ZlcnJpZGVzKSB7XG4gICAgcmV0dXJuIGRlZXBNZXJnZShERUZBVUxUX1JFUVVFU1RfT1BUSU9OUywgYmFzZU9wdGlvbnMsIG92ZXJyaWRlcyB8fCB7fSk7XG59XG4vKipcbiAqIFdlYkF1dGhuIEFQSSB3cmFwcGVyIGZvciBTdXBhYmFzZSBBdXRoLlxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgZW5yb2xsaW5nLCBjaGFsbGVuZ2luZywgdmVyaWZ5aW5nLCBhdXRoZW50aWNhdGluZywgYW5kIHJlZ2lzdGVyaW5nIFdlYkF1dGhuIGNyZWRlbnRpYWxzLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBBUEkgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyBXM0MgV2ViQXV0aG4gU3BlY2lmaWNhdGlvbn1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfQXV0aGVudGljYXRpb25fQVBJIE1ETiAtIFdlYiBBdXRoZW50aWNhdGlvbiBBUEl9XG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJBdXRobkFwaSB7XG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgICAgICAvLyBCaW5kIGFsbCBtZXRob2RzIHNvIHRoZXkgY2FuIGJlIGRlc3RydWN0dXJlZFxuICAgICAgICB0aGlzLmVucm9sbCA9IHRoaXMuX2Vucm9sbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNoYWxsZW5nZSA9IHRoaXMuX2NoYWxsZW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnZlcmlmeSA9IHRoaXMuX3ZlcmlmeS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZSA9IHRoaXMuX2F1dGhlbnRpY2F0ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5fcmVnaXN0ZXIuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5yb2xsIGEgbmV3IFdlYkF1dGhuIGZhY3Rvci5cbiAgICAgKiBDcmVhdGVzIGFuIHVudmVyaWZpZWQgV2ViQXV0aG4gZmFjdG9yIHRoYXQgbXVzdCBiZSB2ZXJpZmllZCB3aXRoIGEgY3JlZGVudGlhbC5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWwgVGhpcyBtZXRob2QgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICAgICAqIEBwYXJhbSB7T21pdDxNRkFFbnJvbGxXZWJhdXRoblBhcmFtcywgJ2ZhY3RvclR5cGUnPn0gcGFyYW1zIC0gRW5yb2xsbWVudCBwYXJhbWV0ZXJzIChmcmllbmRseU5hbWUgcmVxdWlyZWQpXG4gICAgICogQHJldHVybnMge1Byb21pc2U8QXV0aE1GQUVucm9sbFdlYmF1dGhuUmVzcG9uc2U+fSBFbnJvbGxlZCBmYWN0b3IgZGV0YWlscyBvciBlcnJvclxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1yZWdpc3RlcmluZy1hLW5ldy1jcmVkZW50aWFsIFczQyBXZWJBdXRobiBTcGVjIC0gUmVnaXN0ZXJpbmcgYSBOZXcgQ3JlZGVudGlhbH1cbiAgICAgKi9cbiAgICBhc3luYyBfZW5yb2xsKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQubWZhLmVucm9sbChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyksIHsgZmFjdG9yVHlwZTogJ3dlYmF1dGhuJyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYWxsZW5nZSBmb3IgV2ViQXV0aG4gY3JlZGVudGlhbCBjcmVhdGlvbiBvciBhdXRoZW50aWNhdGlvbi5cbiAgICAgKiBDb21iaW5lcyBzZXJ2ZXIgY2hhbGxlbmdlIHdpdGggYnJvd3NlciBjcmVkZW50aWFsIG9wZXJhdGlvbnMuXG4gICAgICogSGFuZGxlcyBib3RoIHJlZ2lzdHJhdGlvbiAoY3JlYXRlKSBhbmQgYXV0aGVudGljYXRpb24gKHJlcXVlc3QpIGZsb3dzLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbCBUaGlzIG1ldGhvZCBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzXG4gICAgICogQHBhcmFtIHtNRkFDaGFsbGVuZ2VXZWJhdXRoblBhcmFtcyAmIHsgZnJpZW5kbHlOYW1lPzogc3RyaW5nOyBzaWduYWw/OiBBYm9ydFNpZ25hbCB9fSBwYXJhbXMgLSBDaGFsbGVuZ2UgcGFyYW1ldGVycyBpbmNsdWRpbmcgZmFjdG9ySWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3ZlcnJpZGVzIC0gQWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gbmF2aWdhdG9yLmNyZWRlbnRpYWxzXG4gICAgICogQHBhcmFtIHtQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zRnV0dXJlfSBvdmVycmlkZXMuY3JlYXRlIC0gT3ZlcnJpZGUgb3B0aW9ucyBmb3IgY3JlZGVudGlhbCBjcmVhdGlvblxuICAgICAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBvdmVycmlkZXMucmVxdWVzdCAtIE92ZXJyaWRlIG9wdGlvbnMgZm9yIGNyZWRlbnRpYWwgcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFJlcXVlc3RSZXN1bHQ+fSBDaGFsbGVuZ2UgcmVzcG9uc2Ugd2l0aCBjcmVkZW50aWFsIG9yIGVycm9yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWNyZWRlbnRpYWwtY3JlYXRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBDcmVkZW50aWFsIENyZWF0aW9ufVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi12ZXJpZnlpbmctYXNzZXJ0aW9uIFczQyBXZWJBdXRobiBTcGVjIC0gVmVyaWZ5aW5nIEFzc2VydGlvbn1cbiAgICAgKi9cbiAgICBhc3luYyBfY2hhbGxlbmdlKHsgZmFjdG9ySWQsIHdlYmF1dGhuLCBmcmllbmRseU5hbWUsIHNpZ25hbCwgfSwgb3ZlcnJpZGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBHZXQgY2hhbGxlbmdlIGZyb20gc2VydmVyIHVzaW5nIHRoZSBjbGllbnQncyBNRkEgbWV0aG9kc1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBjaGFsbGVuZ2VSZXNwb25zZSwgZXJyb3I6IGNoYWxsZW5nZUVycm9yIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tZmEuY2hhbGxlbmdlKHtcbiAgICAgICAgICAgICAgICBmYWN0b3JJZCxcbiAgICAgICAgICAgICAgICB3ZWJhdXRobixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFsbGVuZ2VSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiBjaGFsbGVuZ2VFcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWJvcnRTaWduYWwgPSBzaWduYWwgIT09IG51bGwgJiYgc2lnbmFsICE9PSB2b2lkIDAgPyBzaWduYWwgOiB3ZWJBdXRobkFib3J0U2VydmljZS5jcmVhdGVOZXdBYm9ydFNpZ25hbCgpO1xuICAgICAgICAgICAgLyoqIHdlYmF1dGhuIHdpbGwgZmFpbCBpZiBlaXRoZXIgb2YgdGhlIG5hbWUvZGlzcGxheW5hbWUgYXJlIGJsYW5rICovXG4gICAgICAgICAgICBpZiAoY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4udHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHVzZXIgfSA9IGNoYWxsZW5nZVJlc3BvbnNlLndlYmF1dGhuLmNyZWRlbnRpYWxfb3B0aW9ucy5wdWJsaWNLZXk7XG4gICAgICAgICAgICAgICAgaWYgKCF1c2VyLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lID0gYCR7dXNlci5pZH06JHtmcmllbmRseU5hbWV9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF1c2VyLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXIuZGlzcGxheU5hbWUgPSB1c2VyLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY3JlYXRlJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gbWVyZ2VDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zKGNoYWxsZW5nZVJlc3BvbnNlLndlYmF1dGhuLmNyZWRlbnRpYWxfb3B0aW9ucy5wdWJsaWNLZXksIG92ZXJyaWRlcyA9PT0gbnVsbCB8fCBvdmVycmlkZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG92ZXJyaWRlcy5jcmVhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBjcmVhdGVDcmVkZW50aWFsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleTogb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VJZDogY2hhbGxlbmdlUmVzcG9uc2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdyZXF1ZXN0Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gbWVyZ2VDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMoY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zLnB1YmxpY0tleSwgb3ZlcnJpZGVzID09PSBudWxsIHx8IG92ZXJyaWRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3ZlcnJpZGVzLnJlcXVlc3QpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBnZXRDcmVkZW50aWFsKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zKSwgeyBwdWJsaWNLZXk6IG9wdGlvbnMsIHNpZ25hbDogYWJvcnRTaWduYWwgfSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VJZDogY2hhbGxlbmdlUmVzcG9uc2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignVW5leHBlY3RlZCBlcnJvciBpbiBjaGFsbGVuZ2UnLCBlcnJvciksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFZlcmlmeSBhIFdlYkF1dGhuIGNyZWRlbnRpYWwgd2l0aCB0aGUgc2VydmVyLlxuICAgICAqIENvbXBsZXRlcyB0aGUgV2ViQXV0aG4gY2VyZW1vbnkgYnkgc2VuZGluZyB0aGUgY3JlZGVudGlhbCB0byB0aGUgc2VydmVyIGZvciB2ZXJpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsIFRoaXMgbWV0aG9kIGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmNoYWxsZW5nZUlkIC0gSUQgb2YgdGhlIGNoYWxsZW5nZSBiZWluZyB2ZXJpZmllZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuZmFjdG9ySWQgLSBJRCBvZiB0aGUgV2ViQXV0aG4gZmFjdG9yXG4gICAgICogQHBhcmFtIHtNRkFWZXJpZnlXZWJhdXRoblBhcmFtczxUPlsnd2ViYXV0aG4nXX0gcGFyYW1zLndlYmF1dGhuIC0gV2ViQXV0aG4gY3JlZGVudGlhbCByZXNwb25zZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEF1dGhNRkFWZXJpZnlSZXNwb25zZT59IFZlcmlmaWNhdGlvbiByZXN1bHQgd2l0aCBzZXNzaW9uIG9yIGVycm9yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXZlcmlmeWluZy1hc3NlcnRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBWZXJpZnlpbmcgYW4gQXV0aGVudGljYXRpb24gQXNzZXJ0aW9ufVxuICAgICAqICovXG4gICAgYXN5bmMgX3ZlcmlmeSh7IGNoYWxsZW5nZUlkLCBmYWN0b3JJZCwgd2ViYXV0aG4sIH0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50Lm1mYS52ZXJpZnkoe1xuICAgICAgICAgICAgZmFjdG9ySWQsXG4gICAgICAgICAgICBjaGFsbGVuZ2VJZCxcbiAgICAgICAgICAgIHdlYmF1dGhuOiB3ZWJhdXRobixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXBsZXRlIFdlYkF1dGhuIGF1dGhlbnRpY2F0aW9uIGZsb3cuXG4gICAgICogUGVyZm9ybXMgY2hhbGxlbmdlIGFuZCB2ZXJpZmljYXRpb24gaW4gYSBzaW5nbGUgb3BlcmF0aW9uIGZvciBleGlzdGluZyBjcmVkZW50aWFscy5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWwgVGhpcyBtZXRob2QgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBBdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5mYWN0b3JJZCAtIElEIG9mIHRoZSBXZWJBdXRobiBmYWN0b3IgdG8gYXV0aGVudGljYXRlIHdpdGhcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLndlYmF1dGhuIC0gV2ViQXV0aG4gY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMud2ViYXV0aG4ucnBJZCAtIFJlbHlpbmcgUGFydHkgSUQgKGRlZmF1bHRzIHRvIGN1cnJlbnQgaG9zdG5hbWUpXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGFyYW1zLndlYmF1dGhuLnJwT3JpZ2lucyAtIEFsbG93ZWQgb3JpZ2lucyAoZGVmYXVsdHMgdG8gY3VycmVudCBvcmlnaW4pXG4gICAgICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gcGFyYW1zLndlYmF1dGhuLnNpZ25hbCAtIE9wdGlvbmFsIGFib3J0IHNpZ25hbFxuICAgICAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBvdmVycmlkZXMgLSBPdmVycmlkZSBvcHRpb25zIGZvciBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0XG4gICAgICogQHJldHVybnMge1Byb21pc2U8UmVxdWVzdFJlc3VsdDxBdXRoTUZBVmVyaWZ5UmVzcG9uc2VEYXRhLCBXZWJBdXRobkVycm9yIHwgQXV0aEVycm9yPj59IEF1dGhlbnRpY2F0aW9uIHJlc3VsdFxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1hdXRoZW50aWNhdGlvbiBXM0MgV2ViQXV0aG4gU3BlYyAtIEF1dGhlbnRpY2F0aW9uIENlcmVtb255fVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMgTUROIC0gUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zfVxuICAgICAqL1xuICAgIGFzeW5jIF9hdXRoZW50aWNhdGUoeyBmYWN0b3JJZCwgd2ViYXV0aG46IHsgcnBJZCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lIDogdW5kZWZpbmVkLCBycE9yaWdpbnMgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IFt3aW5kb3cubG9jYXRpb24ub3JpZ2luXSA6IHVuZGVmaW5lZCwgc2lnbmFsLCB9ID0ge30sIH0sIG92ZXJyaWRlcykge1xuICAgICAgICBpZiAoIXJwSWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEF1dGhFcnJvcigncnBJZCBpcyByZXF1aXJlZCBmb3IgV2ViQXV0aG4gYXV0aGVudGljYXRpb24nKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghYnJvd3NlclN1cHBvcnRzV2ViQXV0aG4oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFdlYkF1dGhuJywgbnVsbCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdldCBjaGFsbGVuZ2UgYW5kIGNyZWRlbnRpYWxcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogY2hhbGxlbmdlUmVzcG9uc2UsIGVycm9yOiBjaGFsbGVuZ2VFcnJvciB9ID0gYXdhaXQgdGhpcy5jaGFsbGVuZ2Uoe1xuICAgICAgICAgICAgICAgIGZhY3RvcklkLFxuICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7IHJwSWQsIHJwT3JpZ2lucyB9LFxuICAgICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgIH0sIHsgcmVxdWVzdDogb3ZlcnJpZGVzIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFsbGVuZ2VSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiBjaGFsbGVuZ2VFcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyB3ZWJhdXRobiB9ID0gY2hhbGxlbmdlUmVzcG9uc2U7XG4gICAgICAgICAgICAvLyBWZXJpZnkgY3JlZGVudGlhbFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeSh7XG4gICAgICAgICAgICAgICAgZmFjdG9ySWQsXG4gICAgICAgICAgICAgICAgY2hhbGxlbmdlSWQ6IGNoYWxsZW5nZVJlc3BvbnNlLmNoYWxsZW5nZUlkLFxuICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHdlYmF1dGhuLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJwSWQsXG4gICAgICAgICAgICAgICAgICAgIHJwT3JpZ2lucyxcbiAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogd2ViYXV0aG4uY3JlZGVudGlhbF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEF1dGhVbmtub3duRXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IgaW4gYXV0aGVudGljYXRlJywgZXJyb3IpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wbGV0ZSBXZWJBdXRobiByZWdpc3RyYXRpb24gZmxvdy5cbiAgICAgKiBQZXJmb3JtcyBlbnJvbGxtZW50LCBjaGFsbGVuZ2UsIGFuZCB2ZXJpZmljYXRpb24gaW4gYSBzaW5nbGUgb3BlcmF0aW9uIGZvciBuZXcgY3JlZGVudGlhbHMuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsIFRoaXMgbWV0aG9kIGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gUmVnaXN0cmF0aW9uIHBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmZyaWVuZGx5TmFtZSAtIFVzZXItZnJpZW5kbHkgbmFtZSBmb3IgdGhlIGNyZWRlbnRpYWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJwSWQgLSBSZWx5aW5nIFBhcnR5IElEIChkZWZhdWx0cyB0byBjdXJyZW50IGhvc3RuYW1lKVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhcmFtcy5ycE9yaWdpbnMgLSBBbGxvd2VkIG9yaWdpbnMgKGRlZmF1bHRzIHRvIGN1cnJlbnQgb3JpZ2luKVxuICAgICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IHBhcmFtcy5zaWduYWwgLSBPcHRpb25hbCBhYm9ydCBzaWduYWxcbiAgICAgKiBAcGFyYW0ge1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNGdXR1cmV9IG92ZXJyaWRlcyAtIE92ZXJyaWRlIG9wdGlvbnMgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXF1ZXN0UmVzdWx0PEF1dGhNRkFWZXJpZnlSZXNwb25zZURhdGEsIFdlYkF1dGhuRXJyb3IgfCBBdXRoRXJyb3I+Pn0gUmVnaXN0cmF0aW9uIHJlc3VsdFxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1yZWdpc3RlcmluZy1hLW5ldy1jcmVkZW50aWFsIFczQyBXZWJBdXRobiBTcGVjIC0gUmVnaXN0cmF0aW9uIENlcmVtb255fVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zIE1ETiAtIFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnN9XG4gICAgICovXG4gICAgYXN5bmMgX3JlZ2lzdGVyKHsgZnJpZW5kbHlOYW1lLCB3ZWJhdXRobjogeyBycElkID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgOiB1bmRlZmluZWQsIHJwT3JpZ2lucyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gW3dpbmRvdy5sb2NhdGlvbi5vcmlnaW5dIDogdW5kZWZpbmVkLCBzaWduYWwsIH0gPSB7fSwgfSwgb3ZlcnJpZGVzKSB7XG4gICAgICAgIGlmICghcnBJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aEVycm9yKCdycElkIGlzIHJlcXVpcmVkIGZvciBXZWJBdXRobiByZWdpc3RyYXRpb24nKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghYnJvd3NlclN1cHBvcnRzV2ViQXV0aG4oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFdlYkF1dGhuJywgbnVsbCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVucm9sbCBmYWN0b3JcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogZmFjdG9yLCBlcnJvcjogZW5yb2xsRXJyb3IgfSA9IGF3YWl0IHRoaXMuX2Vucm9sbCh7XG4gICAgICAgICAgICAgICAgZnJpZW5kbHlOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWZhY3Rvcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpZW50Lm1mYVxuICAgICAgICAgICAgICAgICAgICAubGlzdEZhY3RvcnMoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoZmFjdG9ycykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2EgPSBmYWN0b3JzLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hbGwuZmluZCgodikgPT4gdi5mYWN0b3JfdHlwZSA9PT0gJ3dlYmF1dGhuJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdi5mcmllbmRseV9uYW1lID09PSBmcmllbmRseU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHYuc3RhdHVzICE9PSAndW52ZXJpZmllZCcpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChmYWN0b3IpID0+IChmYWN0b3IgPyB0aGlzLmNsaWVudC5tZmEudW5lbnJvbGwoeyBmYWN0b3JJZDogZmFjdG9yID09PSBudWxsIHx8IGZhY3RvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmFjdG9yLmlkIH0pIDogdm9pZCAwKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3I6IGVucm9sbEVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgY2hhbGxlbmdlIGFuZCBjcmVhdGUgY3JlZGVudGlhbFxuICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBjaGFsbGVuZ2VSZXNwb25zZSwgZXJyb3I6IGNoYWxsZW5nZUVycm9yIH0gPSBhd2FpdCB0aGlzLl9jaGFsbGVuZ2Uoe1xuICAgICAgICAgICAgICAgIGZhY3RvcklkOiBmYWN0b3IuaWQsXG4gICAgICAgICAgICAgICAgZnJpZW5kbHlOYW1lOiBmYWN0b3IuZnJpZW5kbHlfbmFtZSxcbiAgICAgICAgICAgICAgICB3ZWJhdXRobjogeyBycElkLCBycE9yaWdpbnMgfSxcbiAgICAgICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgY3JlYXRlOiBvdmVycmlkZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghY2hhbGxlbmdlUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvcjogY2hhbGxlbmdlRXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnkoe1xuICAgICAgICAgICAgICAgIGZhY3RvcklkOiBmYWN0b3IuaWQsXG4gICAgICAgICAgICAgICAgY2hhbGxlbmdlSWQ6IGNoYWxsZW5nZVJlc3BvbnNlLmNoYWxsZW5nZUlkLFxuICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgIHJwSWQsXG4gICAgICAgICAgICAgICAgICAgIHJwT3JpZ2lucyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4uY3JlZGVudGlhbF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEF1dGhVbmtub3duRXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IgaW4gcmVnaXN0ZXInLCBlcnJvciksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViYXV0aG4uanMubWFwIl0sIm5hbWVzIjpbIl9fcmVzdCIsImJhc2U2NFVybFRvVWludDhBcnJheSIsImJ5dGVzVG9CYXNlNjRVUkwiLCJBdXRoRXJyb3IiLCJBdXRoVW5rbm93bkVycm9yIiwiaXNBdXRoRXJyb3IiLCJpc0Jyb3dzZXIiLCJpZGVudGlmeUF1dGhlbnRpY2F0aW9uRXJyb3IiLCJpZGVudGlmeVJlZ2lzdHJhdGlvbkVycm9yIiwiaXNXZWJBdXRobkVycm9yIiwiV2ViQXV0aG5FcnJvciIsIldlYkF1dGhuVW5rbm93bkVycm9yIiwiV2ViQXV0aG5BYm9ydFNlcnZpY2UiLCJjcmVhdGVOZXdBYm9ydFNpZ25hbCIsImNvbnRyb2xsZXIiLCJhYm9ydEVycm9yIiwiRXJyb3IiLCJuYW1lIiwiYWJvcnQiLCJuZXdDb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwic2lnbmFsIiwiY2FuY2VsQ2VyZW1vbnkiLCJ1bmRlZmluZWQiLCJ3ZWJBdXRobkFib3J0U2VydmljZSIsImRlc2VyaWFsaXplQ3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyIsIm9wdGlvbnMiLCJQdWJsaWNLZXlDcmVkZW50aWFsIiwicGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTiIsImNoYWxsZW5nZSIsImNoYWxsZW5nZVN0ciIsInVzZXIiLCJ1c2VyT3B0cyIsImV4Y2x1ZGVDcmVkZW50aWFscyIsInJlc3RPcHRpb25zIiwiYnVmZmVyIiwiT2JqZWN0IiwiYXNzaWduIiwiaWQiLCJyZXN1bHQiLCJsZW5ndGgiLCJBcnJheSIsImkiLCJjcmVkIiwidHlwZSIsInRyYW5zcG9ydHMiLCJkZXNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyIsInBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTiIsImFsbG93Q3JlZGVudGlhbHMiLCJzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25SZXNwb25zZSIsImNyZWRlbnRpYWwiLCJfYSIsInRvSlNPTiIsImNyZWRlbnRpYWxXaXRoQXR0YWNobWVudCIsInJhd0lkIiwicmVzcG9uc2UiLCJhdHRlc3RhdGlvbk9iamVjdCIsIlVpbnQ4QXJyYXkiLCJjbGllbnREYXRhSlNPTiIsImNsaWVudEV4dGVuc2lvblJlc3VsdHMiLCJnZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzIiwiYXV0aGVudGljYXRvckF0dGFjaG1lbnQiLCJzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdFJlc3BvbnNlIiwiYXNzZXJ0aW9uUmVzcG9uc2UiLCJhdXRoZW50aWNhdG9yRGF0YSIsInNpZ25hdHVyZSIsInVzZXJIYW5kbGUiLCJpc1ZhbGlkRG9tYWluIiwiaG9zdG5hbWUiLCJ0ZXN0IiwiYnJvd3NlclN1cHBvcnRzV2ViQXV0aG4iLCJfYiIsIndpbmRvdyIsIm5hdmlnYXRvciIsImNyZWRlbnRpYWxzIiwiY3JlYXRlIiwiZ2V0IiwiY3JlYXRlQ3JlZGVudGlhbCIsImRhdGEiLCJlcnJvciIsImVyciIsImdldENyZWRlbnRpYWwiLCJERUZBVUxUX0NSRUFUSU9OX09QVElPTlMiLCJoaW50cyIsImF1dGhlbnRpY2F0b3JTZWxlY3Rpb24iLCJyZXF1aXJlUmVzaWRlbnRLZXkiLCJ1c2VyVmVyaWZpY2F0aW9uIiwicmVzaWRlbnRLZXkiLCJhdHRlc3RhdGlvbiIsIkRFRkFVTFRfUkVRVUVTVF9PUFRJT05TIiwiZGVlcE1lcmdlIiwic291cmNlcyIsImlzT2JqZWN0IiwidmFsIiwiaXNBcnJheSIsImlzQXJyYXlCdWZmZXJMaWtlIiwiQXJyYXlCdWZmZXIiLCJpc1ZpZXciLCJzb3VyY2UiLCJrZXkiLCJ2YWx1ZSIsImV4aXN0aW5nIiwibWVyZ2VDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zIiwiYmFzZU9wdGlvbnMiLCJvdmVycmlkZXMiLCJtZXJnZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyIsIldlYkF1dGhuQXBpIiwiX2Vucm9sbCIsInBhcmFtcyIsImNsaWVudCIsIm1mYSIsImVucm9sbCIsImZhY3RvclR5cGUiLCJfY2hhbGxlbmdlIiwiZmFjdG9ySWQiLCJ3ZWJhdXRobiIsImZyaWVuZGx5TmFtZSIsImNoYWxsZW5nZVJlc3BvbnNlIiwiY2hhbGxlbmdlRXJyb3IiLCJhYm9ydFNpZ25hbCIsImNyZWRlbnRpYWxfb3B0aW9ucyIsInB1YmxpY0tleSIsImRpc3BsYXlOYW1lIiwiY2hhbGxlbmdlSWQiLCJjcmVkZW50aWFsX3Jlc3BvbnNlIiwicmVxdWVzdCIsIl92ZXJpZnkiLCJ2ZXJpZnkiLCJfYXV0aGVudGljYXRlIiwicnBJZCIsImxvY2F0aW9uIiwicnBPcmlnaW5zIiwib3JpZ2luIiwiX3JlZ2lzdGVyIiwiZmFjdG9yIiwiZW5yb2xsRXJyb3IiLCJsaXN0RmFjdG9ycyIsInRoZW4iLCJmYWN0b3JzIiwiYWxsIiwiZmluZCIsInYiLCJmYWN0b3JfdHlwZSIsImZyaWVuZGx5X25hbWUiLCJzdGF0dXMiLCJ1bmVucm9sbCIsImNvbnN0cnVjdG9yIiwiYmluZCIsImF1dGhlbnRpY2F0ZSIsInJlZ2lzdGVyIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js":
/*!****************************************************************************!*\
!*** ./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js ***!
\****************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FunctionsClient: function() { return /* binding */ FunctionsClient; }\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ \"(app-pages-browser)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _helper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helper */ \"(app-pages-browser)/./node_modules/@supabase/functions-js/dist/module/helper.js\");\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./types */ \"(app-pages-browser)/./node_modules/@supabase/functions-js/dist/module/types.js\");\n\n\n\n/**\n * Client for invoking Supabase Edge Functions.\n */ class FunctionsClient {\n /**\n * Updates the authorization header\n * @param token - the new jwt token sent in the authorisation header\n * @example\n * ```ts\n * functions.setAuth(session.access_token)\n * ```\n */ setAuth(token) {\n this.headers.Authorization = \"Bearer \".concat(token);\n }\n /**\n * Invokes a function\n * @param functionName - The name of the Function to invoke.\n * @param options - Options for invoking the Function.\n * @example\n * ```ts\n * const { data, error } = await functions.invoke('hello-world', {\n * body: { name: 'Ada' },\n * })\n * ```\n */ invoke(functionName_1) {\n return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__awaiter)(this, arguments, void 0, function*(functionName) {\n let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n var _a;\n let timeoutId;\n let timeoutController;\n try {\n const { headers, method, body: functionArgs, signal, timeout } = options;\n let _headers = {};\n let { region } = options;\n if (!region) {\n region = this.region;\n }\n // Add region as query parameter using URL API\n const url = new URL(\"\".concat(this.url, \"/\").concat(functionName));\n if (region && region !== \"any\") {\n _headers[\"x-region\"] = region;\n url.searchParams.set(\"forceFunctionRegion\", region);\n }\n let body;\n if (functionArgs && (headers && !Object.prototype.hasOwnProperty.call(headers, \"Content-Type\") || !headers)) {\n if (typeof Blob !== \"undefined\" && functionArgs instanceof Blob || functionArgs instanceof ArrayBuffer) {\n // will work for File as File inherits Blob\n // also works for ArrayBuffer as it is the same underlying structure as a Blob\n _headers[\"Content-Type\"] = \"application/octet-stream\";\n body = functionArgs;\n } else if (typeof functionArgs === \"string\") {\n // plain string\n _headers[\"Content-Type\"] = \"text/plain\";\n body = functionArgs;\n } else if (typeof FormData !== \"undefined\" && functionArgs instanceof FormData) {\n // don't set content-type headers\n // Request will automatically add the right boundary value\n body = functionArgs;\n } else {\n // default, assume this is JSON\n _headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(functionArgs);\n }\n } else {\n // if the Content-Type was supplied, simply set the body\n body = functionArgs;\n }\n // Handle timeout by creating an AbortController\n let effectiveSignal = signal;\n if (timeout) {\n timeoutController = new AbortController();\n timeoutId = setTimeout(()=>timeoutController.abort(), timeout);\n // If user provided their own signal, we need to respect both\n if (signal) {\n effectiveSignal = timeoutController.signal;\n // If the user's signal is aborted, abort our timeout controller too\n signal.addEventListener(\"abort\", ()=>timeoutController.abort());\n } else {\n effectiveSignal = timeoutController.signal;\n }\n }\n const response = yield this.fetch(url.toString(), {\n method: method || \"POST\",\n // headers priority is (high to low):\n // 1. invoke-level headers\n // 2. client-level headers\n // 3. default Content-Type header\n headers: Object.assign(Object.assign(Object.assign({}, _headers), this.headers), headers),\n body,\n signal: effectiveSignal\n }).catch((fetchError)=>{\n throw new _types__WEBPACK_IMPORTED_MODULE_1__.FunctionsFetchError(fetchError);\n });\n const isRelayError = response.headers.get(\"x-relay-error\");\n if (isRelayError && isRelayError === \"true\") {\n throw new _types__WEBPACK_IMPORTED_MODULE_1__.FunctionsRelayError(response);\n }\n if (!response.ok) {\n throw new _types__WEBPACK_IMPORTED_MODULE_1__.FunctionsHttpError(response);\n }\n let responseType = ((_a = response.headers.get(\"Content-Type\")) !== null && _a !== void 0 ? _a : \"text/plain\").split(\";\")[0].trim();\n let data;\n if (responseType === \"application/json\") {\n data = yield response.json();\n } else if (responseType === \"application/octet-stream\" || responseType === \"application/pdf\") {\n data = yield response.blob();\n } else if (responseType === \"text/event-stream\") {\n data = response;\n } else if (responseType === \"multipart/form-data\") {\n data = yield response.formData();\n } else {\n // default to text\n data = yield response.text();\n }\n return {\n data,\n error: null,\n response\n };\n } catch (error) {\n return {\n data: null,\n error,\n response: error instanceof _types__WEBPACK_IMPORTED_MODULE_1__.FunctionsHttpError || error instanceof _types__WEBPACK_IMPORTED_MODULE_1__.FunctionsRelayError ? error.context : undefined\n };\n } finally{\n // Clear the timeout if it was set\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n });\n }\n /**\n * Creates a new Functions client bound to an Edge Functions URL.\n *\n * @example\n * ```ts\n * import { FunctionsClient, FunctionRegion } from '@supabase/functions-js'\n *\n * const functions = new FunctionsClient('https://xyzcompany.supabase.co/functions/v1', {\n * headers: { apikey: 'public-anon-key' },\n * region: FunctionRegion.UsEast1,\n * })\n * ```\n */ constructor(url, { headers = {}, customFetch, region = _types__WEBPACK_IMPORTED_MODULE_1__.FunctionRegion.Any } = {}){\n this.url = url;\n this.headers = headers;\n this.region = region;\n this.fetch = (0,_helper__WEBPACK_IMPORTED_MODULE_2__.resolveFetch)(customFetch);\n }\n} //# sourceMappingURL=FunctionsClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL0Z1bmN0aW9uc0NsaWVudC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQWtDO0FBQ007QUFDZ0U7QUFDeEc7O0NBRUMsR0FDTSxNQUFNTTtJQW9CVDs7Ozs7OztLQU9DLEdBQ0RDLFFBQVFDLEtBQUssRUFBRTtRQUNYLElBQUksQ0FBQ0MsT0FBTyxDQUFDQyxhQUFhLEdBQUcsVUFBZ0IsT0FBTkY7SUFDM0M7SUFDQTs7Ozs7Ozs7OztLQVVDLEdBQ0RHLE9BQU9DLGNBQWMsRUFBRTtRQUNuQixPQUFPWixnREFBU0EsQ0FBQyxJQUFJLEVBQUVhLFdBQVcsS0FBSyxHQUFHLFVBQVdDLFlBQVk7Z0JBQUVDLFVBQUFBLGlFQUFVLENBQUM7WUFDMUUsSUFBSUM7WUFDSixJQUFJQztZQUNKLElBQUlDO1lBQ0osSUFBSTtnQkFDQSxNQUFNLEVBQUVULE9BQU8sRUFBRVUsTUFBTSxFQUFFQyxNQUFNQyxZQUFZLEVBQUVDLE1BQU0sRUFBRUMsT0FBTyxFQUFFLEdBQUdSO2dCQUNqRSxJQUFJUyxXQUFXLENBQUM7Z0JBQ2hCLElBQUksRUFBRUMsTUFBTSxFQUFFLEdBQUdWO2dCQUNqQixJQUFJLENBQUNVLFFBQVE7b0JBQ1RBLFNBQVMsSUFBSSxDQUFDQSxNQUFNO2dCQUN4QjtnQkFDQSw4Q0FBOEM7Z0JBQzlDLE1BQU1DLE1BQU0sSUFBSUMsSUFBSSxHQUFlYixPQUFaLElBQUksQ0FBQ1ksR0FBRyxFQUFDLEtBQWdCLE9BQWJaO2dCQUNuQyxJQUFJVyxVQUFVQSxXQUFXLE9BQU87b0JBQzVCRCxRQUFRLENBQUMsV0FBVyxHQUFHQztvQkFDdkJDLElBQUlFLFlBQVksQ0FBQ0MsR0FBRyxDQUFDLHVCQUF1Qko7Z0JBQ2hEO2dCQUNBLElBQUlMO2dCQUNKLElBQUlDLGdCQUNDLFlBQVksQ0FBQ1MsT0FBT0MsU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUks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QkFBTUssT0FBTztvQkFBTWpCO2dCQUFTO1lBQ3pDLEVBQ0EsT0FBT2lCLE9BQU87Z0JBQ1YsT0FBTztvQkFDSEwsTUFBTTtvQkFDTks7b0JBQ0FqQixVQUFVaUIsaUJBQWlCekQsc0RBQWtCQSxJQUFJeUQsaUJBQWlCeEQsdURBQW1CQSxHQUMvRXdELE1BQU1DLE9BQU8sR0FDYkM7Z0JBQ1Y7WUFDSixTQUNRO2dCQUNKLGtDQUFrQztnQkFDbEMsSUFBSTlDLFdBQVc7b0JBQ1grQyxhQUFhL0M7Z0JBQ2pCO1lBQ0o7UUFDSjtJQUNKO0lBaEtBOzs7Ozs7Ozs7Ozs7S0FZQyxHQUNEZ0QsWUFBWXZDLEdBQUcsRUFBRSxFQUFFakIsVUFBVSxDQUFDLENBQUMsRUFBRXlELFdBQVcsRUFBRXpDLFNBQVN2QixrREFBY0EsQ0FBQ2lFLEdBQUcsRUFBRyxHQUFHLENBQUMsQ0FBQyxDQUFFO1FBQy9FLElBQUksQ0FBQ3pDLEdBQUcsR0FBR0E7UUFDWCxJQUFJLENBQUNqQixPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDZ0IsTUFBTSxHQUFHQTtRQUNkLElBQUksQ0FBQ29CLEtBQUssR0FBRzVDLHFEQUFZQSxDQUFDaUU7SUFDOUI7QUErSUosRUFDQSwyQ0FBMkMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9mdW5jdGlvbnMtanMvZGlzdC9tb2R1bGUvRnVuY3Rpb25zQ2xpZW50LmpzPzVjMzgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyByZXNvbHZlRmV0Y2ggfSBmcm9tICcuL2hlbHBlcic7XG5pbXBvcnQgeyBGdW5jdGlvblJlZ2lvbiwgRnVuY3Rpb25zRmV0Y2hFcnJvciwgRnVuY3Rpb25zSHR0cEVycm9yLCBGdW5jdGlvbnNSZWxheUVycm9yLCB9IGZyb20gJy4vdHlwZXMnO1xuLyoqXG4gKiBDbGllbnQgZm9yIGludm9raW5nIFN1cGFiYXNlIEVkZ2UgRnVuY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25zQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZ1bmN0aW9ucyBjbGllbnQgYm91bmQgdG8gYW4gRWRnZSBGdW5jdGlvbnMgVVJMLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IEZ1bmN0aW9uc0NsaWVudCwgRnVuY3Rpb25SZWdpb24gfSBmcm9tICdAc3VwYWJhc2UvZnVuY3Rpb25zLWpzJ1xuICAgICAqXG4gICAgICogY29uc3QgZnVuY3Rpb25zID0gbmV3IEZ1bmN0aW9uc0NsaWVudCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL2Z1bmN0aW9ucy92MScsIHtcbiAgICAgKiAgIGhlYWRlcnM6IHsgYXBpa2V5OiAncHVibGljLWFub24ta2V5JyB9LFxuICAgICAqICAgcmVnaW9uOiBGdW5jdGlvblJlZ2lvbi5Vc0Vhc3QxLFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJsLCB7IGhlYWRlcnMgPSB7fSwgY3VzdG9tRmV0Y2gsIHJlZ2lvbiA9IEZ1bmN0aW9uUmVnaW9uLkFueSwgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB0aGlzLnJlZ2lvbiA9IHJlZ2lvbjtcbiAgICAgICAgdGhpcy5mZXRjaCA9IHJlc29sdmVGZXRjaChjdXN0b21GZXRjaCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGF1dGhvcml6YXRpb24gaGVhZGVyXG4gICAgICogQHBhcmFtIHRva2VuIC0gdGhlIG5ldyBqd3QgdG9rZW4gc2VudCBpbiB0aGUgYXV0aG9yaXNhdGlvbiBoZWFkZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogZnVuY3Rpb25zLnNldEF1dGgoc2Vzc2lvbi5hY2Nlc3NfdG9rZW4pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0QXV0aCh0b2tlbikge1xuICAgICAgICB0aGlzLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIGEgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gZnVuY3Rpb25OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIEZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGludm9raW5nIHRoZSBGdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgZnVuY3Rpb25zLmludm9rZSgnaGVsbG8td29ybGQnLCB7XG4gICAgICogICBib2R5OiB7IG5hbWU6ICdBZGEnIH0sXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBpbnZva2UoZnVuY3Rpb25OYW1lXzEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qIChmdW5jdGlvbk5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgbGV0IHRpbWVvdXRJZDtcbiAgICAgICAgICAgIGxldCB0aW1lb3V0Q29udHJvbGxlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBoZWFkZXJzLCBtZXRob2QsIGJvZHk6IGZ1bmN0aW9uQXJncywgc2lnbmFsLCB0aW1lb3V0IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIGxldCBfaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgICAgIGxldCB7IHJlZ2lvbiB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZWdpb24gPSB0aGlzLnJlZ2lvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkIHJlZ2lvbiBhcyBxdWVyeSBwYXJhbWV0ZXIgdXNpbmcgVVJMIEFQSVxuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYCR7dGhpcy51cmx9LyR7ZnVuY3Rpb25OYW1lfWApO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpb24gJiYgcmVnaW9uICE9PSAnYW55Jykge1xuICAgICAgICAgICAgICAgICAgICBfaGVhZGVyc1sneC1yZWdpb24nXSA9IHJlZ2lvbjtcbiAgICAgICAgICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2ZvcmNlRnVuY3Rpb25SZWdpb24nLCByZWdpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgYm9keTtcbiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25BcmdzICYmXG4gICAgICAgICAgICAgICAgICAgICgoaGVhZGVycyAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKSkgfHwgIWhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIGZ1bmN0aW9uQXJncyBpbnN0YW5jZW9mIEJsb2IpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3MgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCB3b3JrIGZvciBGaWxlIGFzIEZpbGUgaW5oZXJpdHMgQmxvYlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyB3b3JrcyBmb3IgQXJyYXlCdWZmZXIgYXMgaXQgaXMgdGhlIHNhbWUgdW5kZXJseWluZyBzdHJ1Y3R1cmUgYXMgYSBCbG9iXG4gICAgICAgICAgICAgICAgICAgICAgICBfaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBmdW5jdGlvbkFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGZ1bmN0aW9uQXJncyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYWluIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgX2hlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IGZ1bmN0aW9uQXJncztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGZ1bmN0aW9uQXJncyBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZXQgY29udGVudC10eXBlIGhlYWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVlc3Qgd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgcmlnaHQgYm91bmRhcnkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBmdW5jdGlvbkFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0LCBhc3N1bWUgdGhpcyBpcyBKU09OXG4gICAgICAgICAgICAgICAgICAgICAgICBfaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZnVuY3Rpb25BcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIENvbnRlbnQtVHlwZSB3YXMgc3VwcGxpZWQsIHNpbXBseSBzZXQgdGhlIGJvZHlcbiAgICAgICAgICAgICAgICAgICAgYm9keSA9IGZ1bmN0aW9uQXJncztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRpbWVvdXQgYnkgY3JlYXRpbmcgYW4gQWJvcnRDb250cm9sbGVyXG4gICAgICAgICAgICAgICAgbGV0IGVmZmVjdGl2ZVNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB0aW1lb3V0Q29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdXNlciBwcm92aWRlZCB0aGVpciBvd24gc2lnbmFsLCB3ZSBuZWVkIHRvIHJlc3BlY3QgYm90aFxuICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVTaWduYWwgPSB0aW1lb3V0Q29udHJvbGxlci5zaWduYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlcidzIHNpZ25hbCBpcyBhYm9ydGVkLCBhYm9ydCBvdXIgdGltZW91dCBjb250cm9sbGVyIHRvb1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGltZW91dENvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVTaWduYWwgPSB0aW1lb3V0Q29udHJvbGxlci5zaWduYWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCB0aGlzLmZldGNoKHVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kIHx8ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVycyBwcmlvcml0eSBpcyAoaGlnaCB0byBsb3cpOlxuICAgICAgICAgICAgICAgICAgICAvLyAxLiBpbnZva2UtbGV2ZWwgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAvLyAyLiBjbGllbnQtbGV2ZWwgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAvLyAzLiBkZWZhdWx0IENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIF9oZWFkZXJzKSwgdGhpcy5oZWFkZXJzKSwgaGVhZGVycyksXG4gICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hbDogZWZmZWN0aXZlU2lnbmFsLFxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChmZXRjaEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGdW5jdGlvbnNGZXRjaEVycm9yKGZldGNoRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVsYXlFcnJvciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJlbGF5LWVycm9yJyk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVsYXlFcnJvciAmJiBpc1JlbGF5RXJyb3IgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRnVuY3Rpb25zUmVsYXlFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZ1bmN0aW9uc0h0dHBFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZVR5cGUgPSAoKF9hID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAndGV4dC9wbGFpbicpLnNwbGl0KCc7JylbMF0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZicpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHlpZWxkIHJlc3BvbnNlLmJsb2IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2VUeXBlID09PSAndGV4dC9ldmVudC1zdHJlYW0nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2VUeXBlID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHlpZWxkIHJlc3BvbnNlLmZvcm1EYXRhKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIHRleHRcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHlpZWxkIHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgZXJyb3I6IG51bGwsIHJlc3BvbnNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGVycm9yIGluc3RhbmNlb2YgRnVuY3Rpb25zSHR0cEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRnVuY3Rpb25zUmVsYXlFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnJvci5jb250ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHRpbWVvdXQgaWYgaXQgd2FzIHNldFxuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdW5jdGlvbnNDbGllbnQuanMubWFwIl0sIm5hbWVzIjpbIl9fYXdhaXRlciIsInJlc29sdmVGZXRjaCIsIkZ1bmN0aW9uUmVnaW9uIiwiRnVuY3Rpb25zRmV0Y2hFcnJvciIsIkZ1bmN0aW9uc0h0dHBFcnJvciIsIkZ1bmN0aW9uc1JlbGF5RXJyb3IiLCJGdW5jdGlvbnNDbGllbnQiLCJzZXRBdXRoIiwidG9rZW4iLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsImludm9rZSIsImZ1bmN0aW9uTmFtZV8xIiwiYXJndW1lbnRzIiwiZnVuY3Rpb25OYW1lIiwib3B0aW9ucyIsIl9hIiwidGltZW91dElkIiwidGltZW91dENvbnRyb2xsZXIiLCJtZXRob2QiLCJib2R5IiwiZnVuY3Rpb25BcmdzIiwic2lnbmFsIiwidGltZW91dCIsIl9oZWFkZXJzIiwicmVnaW9uIiwidXJsIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiQmxvYiIsIkFycmF5QnVmZmVyIiwiRm9ybURhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiZWZmZWN0aXZlU2lnbmFsIiwiQWJvcnRDb250cm9sbGVyIiwic2V0VGltZW91dCIsImFib3J0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlc3BvbnNlIiwiZmV0Y2giLCJ0b1N0cmluZyIsImFzc2lnbiIsImNhdGNoIiwiZmV0Y2hFcnJvciIsImlzUmVsYXlFcnJvciIsImdldCIsIm9rIiwicmVzcG9uc2VUeXBlIiwic3BsaXQiLCJ0cmltIiwiZGF0YSIsImpzb24iLCJibG9iIiwiZm9ybURhdGEiLCJ0ZXh0IiwiZXJyb3IiLCJjb250ZXh0IiwidW5kZWZpbmVkIiwiY2xlYXJUaW1lb3V0IiwiY29uc3RydWN0b3IiLCJjdXN0b21GZXRjaCIsIkFueSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/functions-js/dist/module/helper.js":
/*!*******************************************************************!*\
!*** ./node_modules/@supabase/functions-js/dist/module/helper.js ***!
\*******************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ resolveFetch: function() { return /* binding */ resolveFetch; }\n/* harmony export */ });\nconst resolveFetch = (customFetch)=>{\n if (customFetch) {\n return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return customFetch(...args);\n };\n }\n return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return fetch(...args);\n };\n}; //# sourceMappingURL=helper.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL2hlbHBlci5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQU8sTUFBTUEsZUFBZSxDQUFDQztJQUN6QixJQUFJQSxhQUFhO1FBQ2IsT0FBTzs2Q0FBSUM7Z0JBQUFBOzttQkFBU0QsZUFBZUM7O0lBQ3ZDO0lBQ0EsT0FBTzt5Q0FBSUE7WUFBQUE7O2VBQVNDLFNBQVNEOztBQUNqQyxFQUFFLENBQ0Ysa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL2hlbHBlci5qcz9iNjk1Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCByZXNvbHZlRmV0Y2ggPSAoY3VzdG9tRmV0Y2gpID0+IHtcbiAgICBpZiAoY3VzdG9tRmV0Y2gpIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiBjdXN0b21GZXRjaCguLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiBmZXRjaCguLi5hcmdzKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXIuanMubWFwIl0sIm5hbWVzIjpbInJlc29sdmVGZXRjaCIsImN1c3RvbUZldGNoIiwiYXJncyIsImZldGNoIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/functions-js/dist/module/helper.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/functions-js/dist/module/types.js":
/*!******************************************************************!*\
!*** ./node_modules/@supabase/functions-js/dist/module/types.js ***!
\******************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FunctionRegion: function() { return /* binding */ FunctionRegion; },\n/* harmony export */ FunctionsError: function() { return /* binding */ FunctionsError; },\n/* harmony export */ FunctionsFetchError: function() { return /* binding */ FunctionsFetchError; },\n/* harmony export */ FunctionsHttpError: function() { return /* binding */ FunctionsHttpError; },\n/* harmony export */ FunctionsRelayError: function() { return /* binding */ FunctionsRelayError; }\n/* harmony export */ });\n/**\n * Base error for Supabase Edge Function invocations.\n *\n * @example\n * ```ts\n * import { FunctionsError } from '@supabase/functions-js'\n *\n * throw new FunctionsError('Unexpected error invoking function', 'FunctionsError', {\n * requestId: 'abc123',\n * })\n * ```\n */ class FunctionsError extends Error {\n constructor(message, name = \"FunctionsError\", context){\n super(message);\n this.name = name;\n this.context = context;\n }\n}\n/**\n * Error thrown when the network request to an Edge Function fails.\n *\n * @example\n * ```ts\n * import { FunctionsFetchError } from '@supabase/functions-js'\n *\n * throw new FunctionsFetchError({ requestId: 'abc123' })\n * ```\n */ class FunctionsFetchError extends FunctionsError {\n constructor(context){\n super(\"Failed to send a request to the Edge Function\", \"FunctionsFetchError\", context);\n }\n}\n/**\n * Error thrown when the Supabase relay cannot reach the Edge Function.\n *\n * @example\n * ```ts\n * import { FunctionsRelayError } from '@supabase/functions-js'\n *\n * throw new FunctionsRelayError({ region: 'us-east-1' })\n * ```\n */ class FunctionsRelayError extends FunctionsError {\n constructor(context){\n super(\"Relay Error invoking the Edge Function\", \"FunctionsRelayError\", context);\n }\n}\n/**\n * Error thrown when the Edge Function returns a non-2xx status code.\n *\n * @example\n * ```ts\n * import { FunctionsHttpError } from '@supabase/functions-js'\n *\n * throw new FunctionsHttpError({ status: 500 })\n * ```\n */ class FunctionsHttpError extends FunctionsError {\n constructor(context){\n super(\"Edge Function returned a non-2xx status code\", \"FunctionsHttpError\", context);\n }\n}\n// Define the enum for the 'region' property\nvar FunctionRegion;\n(function(FunctionRegion) {\n FunctionRegion[\"Any\"] = \"any\";\n FunctionRegion[\"ApNortheast1\"] = \"ap-northeast-1\";\n FunctionRegion[\"ApNortheast2\"] = \"ap-northeast-2\";\n FunctionRegion[\"ApSouth1\"] = \"ap-south-1\";\n FunctionRegion[\"ApSoutheast1\"] = \"ap-southeast-1\";\n FunctionRegion[\"ApSoutheast2\"] = \"ap-southeast-2\";\n FunctionRegion[\"CaCentral1\"] = \"ca-central-1\";\n FunctionRegion[\"EuCentral1\"] = \"eu-central-1\";\n FunctionRegion[\"EuWest1\"] = \"eu-west-1\";\n FunctionRegion[\"EuWest2\"] = \"eu-west-2\";\n FunctionRegion[\"EuWest3\"] = \"eu-west-3\";\n FunctionRegion[\"SaEast1\"] = \"sa-east-1\";\n FunctionRegion[\"UsEast1\"] = \"us-east-1\";\n FunctionRegion[\"UsWest1\"] = \"us-west-1\";\n FunctionRegion[\"UsWest2\"] = \"us-west-2\";\n})(FunctionRegion || (FunctionRegion = {})); //# sourceMappingURL=types.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL3R5cGVzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7O0NBV0MsR0FDTSxNQUFNQSx1QkFBdUJDO0lBQ2hDQyxZQUFZQyxPQUFPLEVBQUVDLE9BQU8sZ0JBQWdCLEVBQUVDLE9BQU8sQ0FBRTtRQUNuRCxLQUFLLENBQUNGO1FBQ04sSUFBSSxDQUFDQyxJQUFJLEdBQUdBO1FBQ1osSUFBSSxDQUFDQyxPQUFPLEdBQUdBO0lBQ25CO0FBQ0o7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNQyw0QkFBNEJOO0lBQ3JDRSxZQUFZRyxPQUFPLENBQUU7UUFDakIsS0FBSyxDQUFDLGlEQUFpRCx1QkFBdUJBO0lBQ2xGO0FBQ0o7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNRSw0QkFBNEJQO0lBQ3JDRSxZQUFZRyxPQUFPLENBQUU7UUFDakIsS0FBSyxDQUFDLDBDQUEwQyx1QkFBdUJBO0lBQzNFO0FBQ0o7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNRywyQkFBMkJSO0lBQ3BDRSxZQUFZRyxPQUFPLENBQUU7UUFDakIsS0FBSyxDQUFDLGdEQUFnRCxzQkFBc0JBO0lBQ2hGO0FBQ0o7QUFDQSw0Q0FBNEM7QUFDckMsSUFBSUksZUFBZTtBQUN6QixVQUFVQSxjQUFjO0lBQ3JCQSxjQUFjLENBQUMsTUFBTSxHQUFHO0lBQ3hCQSxjQUFjLENBQUMsZUFBZSxHQUFHO0lBQ2pDQSxjQUFjLENBQUMsZUFBZSxHQUFHO0lBQ2pDQSxjQUFjLENBQUMsV0FBVyxHQUFHO0lBQzdCQSxjQUFjLENBQUMsZUFBZSxHQUFHO0lBQ2pDQSxjQUFjLENBQUMsZUFBZSxHQUFHO0lBQ2pDQSxjQUFjLENBQUMsYUFBYSxHQUFHO0lBQy9CQSxjQUFjLENBQUMsYUFBYSxHQUFHO0lBQy9CQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0FBQ2hDLEdBQUdBLGtCQUFtQkEsQ0FBQUEsaUJBQWlCLENBQUMsS0FDeEMsaUNBQWlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL3R5cGVzLmpzPzY4OGUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXNlIGVycm9yIGZvciBTdXBhYmFzZSBFZGdlIEZ1bmN0aW9uIGludm9jYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgRnVuY3Rpb25zRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvZnVuY3Rpb25zLWpzJ1xuICpcbiAqIHRocm93IG5ldyBGdW5jdGlvbnNFcnJvcignVW5leHBlY3RlZCBlcnJvciBpbnZva2luZyBmdW5jdGlvbicsICdGdW5jdGlvbnNFcnJvcicsIHtcbiAqICAgcmVxdWVzdElkOiAnYWJjMTIzJyxcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIG5hbWUgPSAnRnVuY3Rpb25zRXJyb3InLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIG5ldHdvcmsgcmVxdWVzdCB0byBhbiBFZGdlIEZ1bmN0aW9uIGZhaWxzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgRnVuY3Rpb25zRmV0Y2hFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9mdW5jdGlvbnMtanMnXG4gKlxuICogdGhyb3cgbmV3IEZ1bmN0aW9uc0ZldGNoRXJyb3IoeyByZXF1ZXN0SWQ6ICdhYmMxMjMnIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uc0ZldGNoRXJyb3IgZXh0ZW5kcyBGdW5jdGlvbnNFcnJvciB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dCkge1xuICAgICAgICBzdXBlcignRmFpbGVkIHRvIHNlbmQgYSByZXF1ZXN0IHRvIHRoZSBFZGdlIEZ1bmN0aW9uJywgJ0Z1bmN0aW9uc0ZldGNoRXJyb3InLCBjb250ZXh0KTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSBTdXBhYmFzZSByZWxheSBjYW5ub3QgcmVhY2ggdGhlIEVkZ2UgRnVuY3Rpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBGdW5jdGlvbnNSZWxheUVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcydcbiAqXG4gKiB0aHJvdyBuZXcgRnVuY3Rpb25zUmVsYXlFcnJvcih7IHJlZ2lvbjogJ3VzLWVhc3QtMScgfSlcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25zUmVsYXlFcnJvciBleHRlbmRzIEZ1bmN0aW9uc0Vycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKCdSZWxheSBFcnJvciBpbnZva2luZyB0aGUgRWRnZSBGdW5jdGlvbicsICdGdW5jdGlvbnNSZWxheUVycm9yJywgY29udGV4dCk7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGUgRWRnZSBGdW5jdGlvbiByZXR1cm5zIGEgbm9uLTJ4eCBzdGF0dXMgY29kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEZ1bmN0aW9uc0h0dHBFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9mdW5jdGlvbnMtanMnXG4gKlxuICogdGhyb3cgbmV3IEZ1bmN0aW9uc0h0dHBFcnJvcih7IHN0YXR1czogNTAwIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uc0h0dHBFcnJvciBleHRlbmRzIEZ1bmN0aW9uc0Vycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKCdFZGdlIEZ1bmN0aW9uIHJldHVybmVkIGEgbm9uLTJ4eCBzdGF0dXMgY29kZScsICdGdW5jdGlvbnNIdHRwRXJyb3InLCBjb250ZXh0KTtcbiAgICB9XG59XG4vLyBEZWZpbmUgdGhlIGVudW0gZm9yIHRoZSAncmVnaW9uJyBwcm9wZXJ0eVxuZXhwb3J0IHZhciBGdW5jdGlvblJlZ2lvbjtcbihmdW5jdGlvbiAoRnVuY3Rpb25SZWdpb24pIHtcbiAgICBGdW5jdGlvblJlZ2lvbltcIkFueVwiXSA9IFwiYW55XCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJBcE5vcnRoZWFzdDFcIl0gPSBcImFwLW5vcnRoZWFzdC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJBcE5vcnRoZWFzdDJcIl0gPSBcImFwLW5vcnRoZWFzdC0yXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJBcFNvdXRoMVwiXSA9IFwiYXAtc291dGgtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiQXBTb3V0aGVhc3QxXCJdID0gXCJhcC1zb3V0aGVhc3QtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiQXBTb3V0aGVhc3QyXCJdID0gXCJhcC1zb3V0aGVhc3QtMlwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiQ2FDZW50cmFsMVwiXSA9IFwiY2EtY2VudHJhbC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJFdUNlbnRyYWwxXCJdID0gXCJldS1jZW50cmFsLTFcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIkV1V2VzdDFcIl0gPSBcImV1LXdlc3QtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiRXVXZXN0MlwiXSA9IFwiZXUtd2VzdC0yXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJFdVdlc3QzXCJdID0gXCJldS13ZXN0LTNcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIlNhRWFzdDFcIl0gPSBcInNhLWVhc3QtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiVXNFYXN0MVwiXSA9IFwidXMtZWFzdC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJVc1dlc3QxXCJdID0gXCJ1cy13ZXN0LTFcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIlVzV2VzdDJcIl0gPSBcInVzLXdlc3QtMlwiO1xufSkoRnVuY3Rpb25SZWdpb24gfHwgKEZ1bmN0aW9uUmVnaW9uID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCJdLCJuYW1lcyI6WyJGdW5jdGlvbnNFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJtZXNzYWdlIiwibmFtZSIsImNvbnRleHQiLCJGdW5jdGlvbnNGZXRjaEVycm9yIiwiRnVuY3Rpb25zUmVsYXlFcnJvciIsIkZ1bmN0aW9uc0h0dHBFcnJvciIsIkZ1bmN0aW9uUmVnaW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/functions-js/dist/module/types.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js":
/*!***************************************************************************!*\
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js ***!
\***************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_CHANNEL_STATES: function() { return /* binding */ REALTIME_CHANNEL_STATES; },\n/* harmony export */ REALTIME_LISTEN_TYPES: function() { return /* binding */ REALTIME_LISTEN_TYPES; },\n/* harmony export */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT: function() { return /* binding */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT; },\n/* harmony export */ REALTIME_SUBSCRIBE_STATES: function() { return /* binding */ REALTIME_SUBSCRIBE_STATES; },\n/* harmony export */ \"default\": function() { return /* binding */ RealtimeChannel; }\n/* harmony export */ });\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/constants */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\");\n/* harmony import */ var _lib_push__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/push */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/push.js\");\n/* harmony import */ var _lib_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/timer */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js\");\n/* harmony import */ var _RealtimePresence__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./RealtimePresence */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js\");\n/* harmony import */ var _lib_transformers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/transformers */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js\");\n\n\n\n\n\n\nvar REALTIME_POSTGRES_CHANGES_LISTEN_EVENT;\n(function(REALTIME_POSTGRES_CHANGES_LISTEN_EVENT) {\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT[\"ALL\"] = \"*\";\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT[\"INSERT\"] = \"INSERT\";\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT[\"UPDATE\"] = \"UPDATE\";\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT[\"DELETE\"] = \"DELETE\";\n})(REALTIME_POSTGRES_CHANGES_LISTEN_EVENT || (REALTIME_POSTGRES_CHANGES_LISTEN_EVENT = {}));\nvar REALTIME_LISTEN_TYPES;\n(function(REALTIME_LISTEN_TYPES) {\n REALTIME_LISTEN_TYPES[\"BROADCAST\"] = \"broadcast\";\n REALTIME_LISTEN_TYPES[\"PRESENCE\"] = \"presence\";\n REALTIME_LISTEN_TYPES[\"POSTGRES_CHANGES\"] = \"postgres_changes\";\n REALTIME_LISTEN_TYPES[\"SYSTEM\"] = \"system\";\n})(REALTIME_LISTEN_TYPES || (REALTIME_LISTEN_TYPES = {}));\nvar REALTIME_SUBSCRIBE_STATES;\n(function(REALTIME_SUBSCRIBE_STATES) {\n REALTIME_SUBSCRIBE_STATES[\"SUBSCRIBED\"] = \"SUBSCRIBED\";\n REALTIME_SUBSCRIBE_STATES[\"TIMED_OUT\"] = \"TIMED_OUT\";\n REALTIME_SUBSCRIBE_STATES[\"CLOSED\"] = \"CLOSED\";\n REALTIME_SUBSCRIBE_STATES[\"CHANNEL_ERROR\"] = \"CHANNEL_ERROR\";\n})(REALTIME_SUBSCRIBE_STATES || (REALTIME_SUBSCRIBE_STATES = {}));\nconst REALTIME_CHANNEL_STATES = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES;\nclass RealtimeChannel {\n /** Subscribe registers your client with the server */ subscribe(callback) {\n let timeout = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.timeout;\n var _a, _b, _c;\n if (!this.socket.isConnected()) {\n this.socket.connect();\n }\n if (this.state == _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.closed) {\n const { config: { broadcast, presence, private: isPrivate } } = this.params;\n const postgres_changes = (_b = (_a = this.bindings.postgres_changes) === null || _a === void 0 ? void 0 : _a.map((r)=>r.filter)) !== null && _b !== void 0 ? _b : [];\n const presence_enabled = !!this.bindings[REALTIME_LISTEN_TYPES.PRESENCE] && this.bindings[REALTIME_LISTEN_TYPES.PRESENCE].length > 0 || ((_c = this.params.config.presence) === null || _c === void 0 ? void 0 : _c.enabled) === true;\n const accessTokenPayload = {};\n const config = {\n broadcast,\n presence: Object.assign(Object.assign({}, presence), {\n enabled: presence_enabled\n }),\n postgres_changes,\n private: isPrivate\n };\n if (this.socket.accessTokenValue) {\n accessTokenPayload.access_token = this.socket.accessTokenValue;\n }\n this._onError((e)=>callback === null || callback === void 0 ? void 0 : callback(REALTIME_SUBSCRIBE_STATES.CHANNEL_ERROR, e));\n this._onClose(()=>callback === null || callback === void 0 ? void 0 : callback(REALTIME_SUBSCRIBE_STATES.CLOSED));\n this.updateJoinPayload(Object.assign({\n config\n }, accessTokenPayload));\n this.joinedOnce = true;\n this._rejoin(timeout);\n this.joinPush.receive(\"ok\", async (param)=>{\n let { postgres_changes } = param;\n var _a;\n // Only refresh auth if using callback-based tokens\n if (!this.socket._isManualToken()) {\n this.socket.setAuth();\n }\n if (postgres_changes === undefined) {\n callback === null || callback === void 0 ? void 0 : callback(REALTIME_SUBSCRIBE_STATES.SUBSCRIBED);\n return;\n } else {\n const clientPostgresBindings = this.bindings.postgres_changes;\n const bindingsLen = (_a = clientPostgresBindings === null || clientPostgresBindings === void 0 ? void 0 : clientPostgresBindings.length) !== null && _a !== void 0 ? _a : 0;\n const newPostgresBindings = [];\n for(let i = 0; i < bindingsLen; i++){\n const clientPostgresBinding = clientPostgresBindings[i];\n const { filter: { event, schema, table, filter } } = clientPostgresBinding;\n const serverPostgresFilter = postgres_changes && postgres_changes[i];\n if (serverPostgresFilter && serverPostgresFilter.event === event && RealtimeChannel.isFilterValueEqual(serverPostgresFilter.schema, schema) && RealtimeChannel.isFilterValueEqual(serverPostgresFilter.table, table) && RealtimeChannel.isFilterValueEqual(serverPostgresFilter.filter, filter)) {\n newPostgresBindings.push(Object.assign(Object.assign({}, clientPostgresBinding), {\n id: serverPostgresFilter.id\n }));\n } else {\n this.unsubscribe();\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.errored;\n callback === null || callback === void 0 ? void 0 : callback(REALTIME_SUBSCRIBE_STATES.CHANNEL_ERROR, new Error(\"mismatch between server and client bindings for postgres changes\"));\n return;\n }\n }\n this.bindings.postgres_changes = newPostgresBindings;\n callback && callback(REALTIME_SUBSCRIBE_STATES.SUBSCRIBED);\n return;\n }\n }).receive(\"error\", (error)=>{\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.errored;\n callback === null || callback === void 0 ? void 0 : callback(REALTIME_SUBSCRIBE_STATES.CHANNEL_ERROR, new Error(JSON.stringify(Object.values(error).join(\", \") || \"error\")));\n return;\n }).receive(\"timeout\", ()=>{\n callback === null || callback === void 0 ? void 0 : callback(REALTIME_SUBSCRIBE_STATES.TIMED_OUT);\n return;\n });\n }\n return this;\n }\n /**\n * Returns the current presence state for this channel.\n *\n * The shape is a map keyed by presence key (for example a user id) where each entry contains the\n * tracked metadata for that user.\n */ presenceState() {\n return this.presence.state;\n }\n /**\n * Sends the supplied payload to the presence tracker so other subscribers can see that this\n * client is online. Use `untrack` to stop broadcasting presence for the same key.\n */ async track(payload) {\n let opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n return await this.send({\n type: \"presence\",\n event: \"track\",\n payload\n }, opts.timeout || this.timeout);\n }\n /**\n * Removes the current presence state for this client.\n */ async untrack() {\n let opts = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n return await this.send({\n type: \"presence\",\n event: \"untrack\"\n }, opts);\n }\n on(type, filter, callback) {\n if (this.state === _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.joined && type === REALTIME_LISTEN_TYPES.PRESENCE) {\n this.socket.log(\"channel\", \"resubscribe to \".concat(this.topic, \" due to change in presence callbacks on joined channel\"));\n this.unsubscribe().then(async ()=>await this.subscribe());\n }\n return this._on(type, filter, callback);\n }\n /**\n * Sends a broadcast message explicitly via REST API.\n *\n * This method always uses the REST API endpoint regardless of WebSocket connection state.\n * Useful when you want to guarantee REST delivery or when gradually migrating from implicit REST fallback.\n *\n * @param event The name of the broadcast event\n * @param payload Payload to be sent (required)\n * @param opts Options including timeout\n * @returns Promise resolving to object with success status, and error details if failed\n */ async httpSend(event, payload) {\n let opts = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};\n var _a;\n if (payload === undefined || payload === null) {\n return Promise.reject(\"Payload is required for httpSend()\");\n }\n const headers = {\n apikey: this.socket.apiKey ? this.socket.apiKey : \"\",\n \"Content-Type\": \"application/json\"\n };\n if (this.socket.accessTokenValue) {\n headers[\"Authorization\"] = \"Bearer \".concat(this.socket.accessTokenValue);\n }\n const options = {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n messages: [\n {\n topic: this.subTopic,\n event,\n payload: payload,\n private: this.private\n }\n ]\n })\n };\n const response = await this._fetchWithTimeout(this.broadcastEndpointURL, options, (_a = opts.timeout) !== null && _a !== void 0 ? _a : this.timeout);\n if (response.status === 202) {\n return {\n success: true\n };\n }\n let errorMessage = response.statusText;\n try {\n const errorBody = await response.json();\n errorMessage = errorBody.error || errorBody.message || errorMessage;\n } catch (_b) {}\n return Promise.reject(new Error(errorMessage));\n }\n /**\n * Sends a message into the channel.\n *\n * @param args Arguments to send to channel\n * @param args.type The type of event to send\n * @param args.event The name of the event being sent\n * @param args.payload Payload to be sent\n * @param opts Options to be used during the send process\n */ async send(args) {\n let opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n var _a, _b;\n if (!this._canPush() && args.type === \"broadcast\") {\n console.warn(\"Realtime send() is automatically falling back to REST API. \" + \"This behavior will be deprecated in the future. \" + \"Please use httpSend() explicitly for REST delivery.\");\n const { event, payload: endpoint_payload } = args;\n const headers = {\n apikey: this.socket.apiKey ? this.socket.apiKey : \"\",\n \"Content-Type\": \"application/json\"\n };\n if (this.socket.accessTokenValue) {\n headers[\"Authorization\"] = \"Bearer \".concat(this.socket.accessTokenValue);\n }\n const options = {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n messages: [\n {\n topic: this.subTopic,\n event,\n payload: endpoint_payload,\n private: this.private\n }\n ]\n })\n };\n try {\n const response = await this._fetchWithTimeout(this.broadcastEndpointURL, options, (_a = opts.timeout) !== null && _a !== void 0 ? _a : this.timeout);\n await ((_b = response.body) === null || _b === void 0 ? void 0 : _b.cancel());\n return response.ok ? \"ok\" : \"error\";\n } catch (error) {\n if (error.name === \"AbortError\") {\n return \"timed out\";\n } else {\n return \"error\";\n }\n }\n } else {\n return new Promise((resolve)=>{\n var _a, _b, _c;\n const push = this._push(args.type, args, opts.timeout || this.timeout);\n if (args.type === \"broadcast\" && !((_c = (_b = (_a = this.params) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.broadcast) === null || _c === void 0 ? void 0 : _c.ack)) {\n resolve(\"ok\");\n }\n push.receive(\"ok\", ()=>resolve(\"ok\"));\n push.receive(\"error\", ()=>resolve(\"error\"));\n push.receive(\"timeout\", ()=>resolve(\"timed out\"));\n });\n }\n }\n /**\n * Updates the payload that will be sent the next time the channel joins (reconnects).\n * Useful for rotating access tokens or updating config without re-creating the channel.\n */ updateJoinPayload(payload) {\n this.joinPush.updatePayload(payload);\n }\n /**\n * Leaves the channel.\n *\n * Unsubscribes from server events, and instructs channel to terminate on server.\n * Triggers onClose() hooks.\n *\n * To receive leave acknowledgements, use the a `receive` hook to bind to the server ack, ie:\n * channel.unsubscribe().receive(\"ok\", () => alert(\"left!\") )\n */ unsubscribe() {\n let timeout = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : this.timeout;\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.leaving;\n const onClose = ()=>{\n this.socket.log(\"channel\", \"leave \".concat(this.topic));\n this._trigger(_lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_EVENTS.close, \"leave\", this._joinRef());\n };\n this.joinPush.destroy();\n let leavePush = null;\n return new Promise((resolve)=>{\n leavePush = new _lib_push__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this, _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_EVENTS.leave, {}, timeout);\n leavePush.receive(\"ok\", ()=>{\n onClose();\n resolve(\"ok\");\n }).receive(\"timeout\", ()=>{\n onClose();\n resolve(\"timed out\");\n }).receive(\"error\", ()=>{\n resolve(\"error\");\n });\n leavePush.send();\n if (!this._canPush()) {\n leavePush.trigger(\"ok\", {});\n }\n }).finally(()=>{\n leavePush === null || leavePush === void 0 ? void 0 : leavePush.destroy();\n });\n }\n /**\n * Teardown the channel.\n *\n * Destroys and stops related timers.\n */ teardown() {\n this.pushBuffer.forEach((push)=>push.destroy());\n this.pushBuffer = [];\n this.rejoinTimer.reset();\n this.joinPush.destroy();\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.closed;\n this.bindings = {};\n }\n /** @internal */ async _fetchWithTimeout(url, options, timeout) {\n const controller = new AbortController();\n const id = setTimeout(()=>controller.abort(), timeout);\n const response = await this.socket.fetch(url, Object.assign(Object.assign({}, options), {\n signal: controller.signal\n }));\n clearTimeout(id);\n return response;\n }\n /** @internal */ _push(event, payload) {\n let timeout = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : this.timeout;\n if (!this.joinedOnce) {\n throw \"tried to push '\".concat(event, \"' to '\").concat(this.topic, \"' before joining. Use channel.subscribe() before pushing events\");\n }\n let pushEvent = new _lib_push__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this, event, payload, timeout);\n if (this._canPush()) {\n pushEvent.send();\n } else {\n this._addToPushBuffer(pushEvent);\n }\n return pushEvent;\n }\n /** @internal */ _addToPushBuffer(pushEvent) {\n pushEvent.startTimeout();\n this.pushBuffer.push(pushEvent);\n // Enforce buffer size limit\n if (this.pushBuffer.length > _lib_constants__WEBPACK_IMPORTED_MODULE_0__.MAX_PUSH_BUFFER_SIZE) {\n const removedPush = this.pushBuffer.shift();\n if (removedPush) {\n removedPush.destroy();\n this.socket.log(\"channel\", \"discarded push due to buffer overflow: \".concat(removedPush.event), removedPush.payload);\n }\n }\n }\n /**\n * Overridable message hook\n *\n * Receives all events for specialized message handling before dispatching to the channel callbacks.\n * Must return the payload, modified or unmodified.\n *\n * @internal\n */ _onMessage(_event, payload, _ref) {\n return payload;\n }\n /** @internal */ _isMember(topic) {\n return this.topic === topic;\n }\n /** @internal */ _joinRef() {\n return this.joinPush.ref;\n }\n /** @internal */ _trigger(type, payload, ref) {\n var _a, _b;\n const typeLower = type.toLocaleLowerCase();\n const { close, error, leave, join } = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_EVENTS;\n const events = [\n close,\n error,\n leave,\n join\n ];\n if (ref && events.indexOf(typeLower) >= 0 && ref !== this._joinRef()) {\n return;\n }\n let handledPayload = this._onMessage(typeLower, payload, ref);\n if (payload && !handledPayload) {\n throw \"channel onMessage callbacks must return the payload, modified or unmodified\";\n }\n if ([\n \"insert\",\n \"update\",\n \"delete\"\n ].includes(typeLower)) {\n (_a = this.bindings.postgres_changes) === null || _a === void 0 ? void 0 : _a.filter((bind)=>{\n var _a, _b, _c;\n return ((_a = bind.filter) === null || _a === void 0 ? void 0 : _a.event) === \"*\" || ((_c = (_b = bind.filter) === null || _b === void 0 ? void 0 : _b.event) === null || _c === void 0 ? void 0 : _c.toLocaleLowerCase()) === typeLower;\n }).map((bind)=>bind.callback(handledPayload, ref));\n } else {\n (_b = this.bindings[typeLower]) === null || _b === void 0 ? void 0 : _b.filter((bind)=>{\n var _a, _b, _c, _d, _e, _f;\n if ([\n \"broadcast\",\n \"presence\",\n \"postgres_changes\"\n ].includes(typeLower)) {\n if (\"id\" in bind) {\n const bindId = bind.id;\n const bindEvent = (_a = bind.filter) === null || _a === void 0 ? void 0 : _a.event;\n return bindId && ((_b = payload.ids) === null || _b === void 0 ? void 0 : _b.includes(bindId)) && (bindEvent === \"*\" || (bindEvent === null || bindEvent === void 0 ? void 0 : bindEvent.toLocaleLowerCase()) === ((_c = payload.data) === null || _c === void 0 ? void 0 : _c.type.toLocaleLowerCase()));\n } else {\n const bindEvent = (_e = (_d = bind === null || bind === void 0 ? void 0 : bind.filter) === null || _d === void 0 ? void 0 : _d.event) === null || _e === void 0 ? void 0 : _e.toLocaleLowerCase();\n return bindEvent === \"*\" || bindEvent === ((_f = payload === null || payload === void 0 ? void 0 : payload.event) === null || _f === void 0 ? void 0 : _f.toLocaleLowerCase());\n }\n } else {\n return bind.type.toLocaleLowerCase() === typeLower;\n }\n }).map((bind)=>{\n if (typeof handledPayload === \"object\" && \"ids\" in handledPayload) {\n const postgresChanges = handledPayload.data;\n const { schema, table, commit_timestamp, type, errors } = postgresChanges;\n const enrichedPayload = {\n schema: schema,\n table: table,\n commit_timestamp: commit_timestamp,\n eventType: type,\n new: {},\n old: {},\n errors: errors\n };\n handledPayload = Object.assign(Object.assign({}, enrichedPayload), this._getPayloadRecords(postgresChanges));\n }\n bind.callback(handledPayload, ref);\n });\n }\n }\n /** @internal */ _isClosed() {\n return this.state === _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.closed;\n }\n /** @internal */ _isJoined() {\n return this.state === _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.joined;\n }\n /** @internal */ _isJoining() {\n return this.state === _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.joining;\n }\n /** @internal */ _isLeaving() {\n return this.state === _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.leaving;\n }\n /** @internal */ _replyEventName(ref) {\n return \"chan_reply_\".concat(ref);\n }\n /** @internal */ _on(type, filter, callback) {\n const typeLower = type.toLocaleLowerCase();\n const binding = {\n type: typeLower,\n filter: filter,\n callback: callback\n };\n if (this.bindings[typeLower]) {\n this.bindings[typeLower].push(binding);\n } else {\n this.bindings[typeLower] = [\n binding\n ];\n }\n return this;\n }\n /** @internal */ _off(type, filter) {\n const typeLower = type.toLocaleLowerCase();\n if (this.bindings[typeLower]) {\n this.bindings[typeLower] = this.bindings[typeLower].filter((bind)=>{\n var _a;\n return !(((_a = bind.type) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) === typeLower && RealtimeChannel.isEqual(bind.filter, filter));\n });\n }\n return this;\n }\n /** @internal */ static isEqual(obj1, obj2) {\n if (Object.keys(obj1).length !== Object.keys(obj2).length) {\n return false;\n }\n for(const k in obj1){\n if (obj1[k] !== obj2[k]) {\n return false;\n }\n }\n return true;\n }\n /**\n * Compares two optional filter values for equality.\n * Treats undefined, null, and empty string as equivalent empty values.\n * @internal\n */ static isFilterValueEqual(serverValue, clientValue) {\n const normalizedServer = serverValue !== null && serverValue !== void 0 ? serverValue : undefined;\n const normalizedClient = clientValue !== null && clientValue !== void 0 ? clientValue : undefined;\n return normalizedServer === normalizedClient;\n }\n /** @internal */ _rejoinUntilConnected() {\n this.rejoinTimer.scheduleTimeout();\n if (this.socket.isConnected()) {\n this._rejoin();\n }\n }\n /**\n * Registers a callback that will be executed when the channel closes.\n *\n * @internal\n */ _onClose(callback) {\n this._on(_lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_EVENTS.close, {}, callback);\n }\n /**\n * Registers a callback that will be executed when the channel encounteres an error.\n *\n * @internal\n */ _onError(callback) {\n this._on(_lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_EVENTS.error, {}, (reason)=>callback(reason));\n }\n /**\n * Returns `true` if the socket is connected and the channel has been joined.\n *\n * @internal\n */ _canPush() {\n return this.socket.isConnected() && this._isJoined();\n }\n /** @internal */ _rejoin() {\n let timeout = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : this.timeout;\n if (this._isLeaving()) {\n return;\n }\n this.socket._leaveOpenTopic(this.topic);\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.joining;\n this.joinPush.resend(timeout);\n }\n /** @internal */ _getPayloadRecords(payload) {\n const records = {\n new: {},\n old: {}\n };\n if (payload.type === \"INSERT\" || payload.type === \"UPDATE\") {\n records.new = _lib_transformers__WEBPACK_IMPORTED_MODULE_4__.convertChangeData(payload.columns, payload.record);\n }\n if (payload.type === \"UPDATE\" || payload.type === \"DELETE\") {\n records.old = _lib_transformers__WEBPACK_IMPORTED_MODULE_4__.convertChangeData(payload.columns, payload.old_record);\n }\n return records;\n }\n /**\n * Creates a channel that can broadcast messages, sync presence, and listen to Postgres changes.\n *\n * The topic determines which realtime stream you are subscribing to. Config options let you\n * enable acknowledgement for broadcasts, presence tracking, or private channels.\n *\n * @example\n * ```ts\n * import RealtimeClient from '@supabase/realtime-js'\n *\n * const client = new RealtimeClient('https://xyzcompany.supabase.co/realtime/v1', {\n * params: { apikey: 'public-anon-key' },\n * })\n * const channel = new RealtimeChannel('realtime:public:messages', { config: {} }, client)\n * ```\n */ constructor(/** Topic name can be any string. */ topic, params = {\n config: {}\n }, socket){\n var _a, _b;\n this.topic = topic;\n this.params = params;\n this.socket = socket;\n this.bindings = {};\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.closed;\n this.joinedOnce = false;\n this.pushBuffer = [];\n this.subTopic = topic.replace(/^realtime:/i, \"\");\n this.params.config = Object.assign({\n broadcast: {\n ack: false,\n self: false\n },\n presence: {\n key: \"\",\n enabled: false\n },\n private: false\n }, params.config);\n this.timeout = this.socket.timeout;\n this.joinPush = new _lib_push__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this, _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_EVENTS.join, this.params, this.timeout);\n this.rejoinTimer = new _lib_timer__WEBPACK_IMPORTED_MODULE_2__[\"default\"](()=>this._rejoinUntilConnected(), this.socket.reconnectAfterMs);\n this.joinPush.receive(\"ok\", ()=>{\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.joined;\n this.rejoinTimer.reset();\n this.pushBuffer.forEach((pushEvent)=>pushEvent.send());\n this.pushBuffer = [];\n });\n this._onClose(()=>{\n this.rejoinTimer.reset();\n this.socket.log(\"channel\", \"close \".concat(this.topic, \" \").concat(this._joinRef()));\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.closed;\n this.socket._remove(this);\n });\n this._onError((reason)=>{\n if (this._isLeaving() || this._isClosed()) {\n return;\n }\n this.socket.log(\"channel\", \"error \".concat(this.topic), reason);\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.errored;\n this.rejoinTimer.scheduleTimeout();\n });\n this.joinPush.receive(\"timeout\", ()=>{\n if (!this._isJoining()) {\n return;\n }\n this.socket.log(\"channel\", \"timeout \".concat(this.topic), this.joinPush.timeout);\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.errored;\n this.rejoinTimer.scheduleTimeout();\n });\n this.joinPush.receive(\"error\", (reason)=>{\n if (this._isLeaving() || this._isClosed()) {\n return;\n }\n this.socket.log(\"channel\", \"error \".concat(this.topic), reason);\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.errored;\n this.rejoinTimer.scheduleTimeout();\n });\n this._on(_lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_EVENTS.reply, {}, (payload, ref)=>{\n this._trigger(this._replyEventName(ref), payload);\n });\n this.presence = new _RealtimePresence__WEBPACK_IMPORTED_MODULE_3__[\"default\"](this);\n this.broadcastEndpointURL = (0,_lib_transformers__WEBPACK_IMPORTED_MODULE_4__.httpEndpointURL)(this.socket.endPoint);\n this.private = this.params.config.private || false;\n if (!this.private && ((_b = (_a = this.params.config) === null || _a === void 0 ? void 0 : _a.broadcast) === null || _b === void 0 ? void 0 : _b.replay)) {\n throw \"tried to use replay on public channel '\".concat(this.topic, \"'. It must be a private channel.\");\n }\n }\n} //# sourceMappingURL=RealtimeChannel.js.map\n/** A channel is the basic building block of Realtime\n * and narrows the scope of data flow to subscribed clients.\n * You can think of a channel as a chatroom where participants are able to see who's online\n * and send and receive messages.\n */ \n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvUmVhbHRpbWVDaGFubmVsLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBdUY7QUFDekQ7QUFDRTtBQUNrQjtBQUNDO0FBQ0U7QUFDOUMsSUFBSVEsdUNBQXVDO0FBQ2pELFVBQVVBLHNDQUFzQztJQUM3Q0Esc0NBQXNDLENBQUMsTUFBTSxHQUFHO0lBQ2hEQSxzQ0FBc0MsQ0FBQyxTQUFTLEdBQUc7SUFDbkRBLHNDQUFzQyxDQUFDLFNBQVMsR0FBRztJQUNuREEsc0NBQXNDLENBQUMsU0FBUyxHQUFHO0FBQ3ZELEdBQUdBLDBDQUEyQ0EsQ0FBQUEseUNBQXlDLENBQUM7QUFDakYsSUFBSUMsc0JBQXNCO0FBQ2hDLFVBQVVBLHFCQUFxQjtJQUM1QkEscUJBQXFCLENBQUMsWUFBWSxHQUFHO0lBQ3JDQSxxQkFBcUIsQ0FBQyxXQUFXLEdBQUc7SUFDcENBLHFCQUFxQixDQUFDLG1CQUFtQixHQUFHO0lBQzVDQSxxQkFBcUIsQ0FBQyxTQUFTLEdBQUc7QUFDdEMsR0FBR0EseUJBQTBCQSxDQUFBQSx3QkFBd0IsQ0FBQztBQUMvQyxJQUFJQywwQkFBMEI7QUFDcEMsVUFBVUEseUJBQXlCO0lBQ2hDQSx5QkFBeUIsQ0FBQyxhQUFhLEdBQUc7SUFDMUNBLHlCQUF5QixDQUFDLFlBQVksR0FBRztJQUN6Q0EseUJBQXlCLENBQUMsU0FBUyxHQUFHO0lBQ3RDQSx5QkFBeUIsQ0FBQyxnQkFBZ0IsR0FBRztBQUNqRCxHQUFHQSw2QkFBOEJBLENBQUFBLDRCQUE0QixDQUFDO0FBQ3ZELE1BQU1DLDBCQUEwQlYsMERBQWNBLENBQUM7QUFNdkMsTUFBTVc7SUFtRmpCLG9EQUFvRCxHQUNwREMsVUFBVUMsUUFBUSxFQUEwQjtZQUF4QkMsVUFBQUEsaUVBQVUsSUFBSSxDQUFDQSxPQUFPO1FBQ3RDLElBQUlDLElBQUlDLElBQUlDO1FBQ1osSUFBSSxD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LElBQUk7UUFDekMsSUFBSSxDQUFDb0csb0JBQW9CLEdBQUdsRyxrRUFBZUEsQ0FBQyxJQUFJLENBQUNZLE1BQU0sQ0FBQ21NLFFBQVE7UUFDaEUsSUFBSSxDQUFDM0wsT0FBTyxHQUFHLElBQUksQ0FBQ0UsTUFBTSxDQUFDTCxNQUFNLENBQUNHLE9BQU8sSUFBSTtRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDQSxPQUFPLElBQUssRUFBQ1YsS0FBSyxDQUFDRCxLQUFLLElBQUksQ0FBQ2EsTUFBTSxDQUFDTCxNQUFNLE1BQU0sUUFBUVIsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHUyxTQUFTLE1BQU0sUUFBUVIsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHc00sTUFBTSxHQUFHO1lBQ3RKLE1BQU0sMENBQXFELE9BQVgsSUFBSSxDQUFDOUgsS0FBSyxFQUFDO1FBQy9EO0lBQ0o7QUEwZ0JKLEVBQ0EsMkNBQTJDO0FBbG1CM0M7Ozs7Q0FJQyxHQTZsQkEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9SZWFsdGltZUNoYW5uZWwuanM/ZWM0YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDSEFOTkVMX0VWRU5UUywgQ0hBTk5FTF9TVEFURVMsIE1BWF9QVVNIX0JVRkZFUl9TSVpFIH0gZnJvbSAnLi9saWIvY29uc3RhbnRzJztcbmltcG9ydCBQdXNoIGZyb20gJy4vbGliL3B1c2gnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4vbGliL3RpbWVyJztcbmltcG9ydCBSZWFsdGltZVByZXNlbmNlIGZyb20gJy4vUmVhbHRpbWVQcmVzZW5jZSc7XG5pbXBvcnQgKiBhcyBUcmFuc2Zvcm1lcnMgZnJvbSAnLi9saWIvdHJhbnNmb3JtZXJzJztcbmltcG9ydCB7IGh0dHBFbmRwb2ludFVSTCB9IGZyb20gJy4vbGliL3RyYW5zZm9ybWVycyc7XG5leHBvcnQgdmFyIFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UO1xuKGZ1bmN0aW9uIChSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCkge1xuICAgIFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UW1wiQUxMXCJdID0gXCIqXCI7XG4gICAgUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlRbXCJJTlNFUlRcIl0gPSBcIklOU0VSVFwiO1xuICAgIFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UW1wiVVBEQVRFXCJdID0gXCJVUERBVEVcIjtcbiAgICBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVFtcIkRFTEVURVwiXSA9IFwiREVMRVRFXCI7XG59KShSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCB8fCAoUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlQgPSB7fSkpO1xuZXhwb3J0IHZhciBSRUFMVElNRV9MSVNURU5fVFlQRVM7XG4oZnVuY3Rpb24gKFJFQUxUSU1FX0xJU1RFTl9UWVBFUykge1xuICAgIFJFQUxUSU1FX0xJU1RFTl9UWVBFU1tcIkJST0FEQ0FTVFwiXSA9IFwiYnJvYWRjYXN0XCI7XG4gICAgUkVBTFRJTUVfTElTVEVOX1RZUEVTW1wiUFJFU0VOQ0VcIl0gPSBcInByZXNlbmNlXCI7XG4gICAgUkVBTFRJTUVfTElTVEVOX1RZUEVTW1wiUE9TVEdSRVNfQ0hBTkdFU1wiXSA9IFwicG9zdGdyZXNfY2hhbmdlc1wiO1xuICAgIFJFQUxUSU1FX0xJU1RFTl9UWVBFU1tcIlNZU1RFTVwiXSA9IFwic3lzdGVtXCI7XG59KShSRUFMVElNRV9MSVNURU5fVFlQRVMgfHwgKFJFQUxUSU1FX0xJU1RFTl9UWVBFUyA9IHt9KSk7XG5leHBvcnQgdmFyIFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVM7XG4oZnVuY3Rpb24gKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMpIHtcbiAgICBSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTW1wiU1VCU0NSSUJFRFwiXSA9IFwiU1VCU0NSSUJFRFwiO1xuICAgIFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVNbXCJUSU1FRF9PVVRcIl0gPSBcIlRJTUVEX09VVFwiO1xuICAgIFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVNbXCJDTE9TRURcIl0gPSBcIkNMT1NFRFwiO1xuICAgIFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVNbXCJDSEFOTkVMX0VSUk9SXCJdID0gXCJDSEFOTkVMX0VSUk9SXCI7XG59KShSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTIHx8IChSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTID0ge30pKTtcbmV4cG9ydCBjb25zdCBSRUFMVElNRV9DSEFOTkVMX1NUQVRFUyA9IENIQU5ORUxfU1RBVEVTO1xuLyoqIEEgY2hhbm5lbCBpcyB0aGUgYmFzaWMgYnVpbGRpbmcgYmxvY2sgb2YgUmVhbHRpbWVcbiAqIGFuZCBuYXJyb3dzIHRoZSBzY29wZSBvZiBkYXRhIGZsb3cgdG8gc3Vic2NyaWJlZCBjbGllbnRzLlxuICogWW91IGNhbiB0aGluayBvZiBhIGNoYW5uZWwgYXMgYSBjaGF0cm9vbSB3aGVyZSBwYXJ0aWNpcGFudHMgYXJlIGFibGUgdG8gc2VlIHdobydzIG9ubGluZVxuICogYW5kIHNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlYWx0aW1lQ2hhbm5lbCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNoYW5uZWwgdGhhdCBjYW4gYnJvYWRjYXN0IG1lc3NhZ2VzLCBzeW5jIHByZXNlbmNlLCBhbmQgbGlzdGVuIHRvIFBvc3RncmVzIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBUaGUgdG9waWMgZGV0ZXJtaW5lcyB3aGljaCByZWFsdGltZSBzdHJlYW0geW91IGFyZSBzdWJzY3JpYmluZyB0by4gQ29uZmlnIG9wdGlvbnMgbGV0IHlvdVxuICAgICAqIGVuYWJsZSBhY2tub3dsZWRnZW1lbnQgZm9yIGJyb2FkY2FzdHMsIHByZXNlbmNlIHRyYWNraW5nLCBvciBwcml2YXRlIGNoYW5uZWxzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCBSZWFsdGltZUNsaWVudCBmcm9tICdAc3VwYWJhc2UvcmVhbHRpbWUtanMnXG4gICAgICpcbiAgICAgKiBjb25zdCBjbGllbnQgPSBuZXcgUmVhbHRpbWVDbGllbnQoJ2h0dHBzOi8veHl6Y29tcGFueS5zdXBhYmFzZS5jby9yZWFsdGltZS92MScsIHtcbiAgICAgKiAgIHBhcmFtczogeyBhcGlrZXk6ICdwdWJsaWMtYW5vbi1rZXknIH0sXG4gICAgICogfSlcbiAgICAgKiBjb25zdCBjaGFubmVsID0gbmV3IFJlYWx0aW1lQ2hhbm5lbCgncmVhbHRpbWU6cHVibGljOm1lc3NhZ2VzJywgeyBjb25maWc6IHt9IH0sIGNsaWVudClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVG9waWMgbmFtZSBjYW4gYmUgYW55IHN0cmluZy4gKi9cbiAgICB0b3BpYywgcGFyYW1zID0geyBjb25maWc6IHt9IH0sIHNvY2tldCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0aGlzLnRvcGljID0gdG9waWM7XG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IHt9O1xuICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkO1xuICAgICAgICB0aGlzLmpvaW5lZE9uY2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW107XG4gICAgICAgIHRoaXMuc3ViVG9waWMgPSB0b3BpYy5yZXBsYWNlKC9ecmVhbHRpbWU6L2ksICcnKTtcbiAgICAgICAgdGhpcy5wYXJhbXMuY29uZmlnID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBicm9hZGNhc3Q6IHsgYWNrOiBmYWxzZSwgc2VsZjogZmFsc2UgfSxcbiAgICAgICAgICAgIHByZXNlbmNlOiB7IGtleTogJycsIGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICBwcml2YXRlOiBmYWxzZSxcbiAgICAgICAgfSwgcGFyYW1zLmNvbmZpZyk7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRoaXMuc29ja2V0LnRpbWVvdXQ7XG4gICAgICAgIHRoaXMuam9pblB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5qb2luLCB0aGlzLnBhcmFtcywgdGhpcy50aW1lb3V0KTtcbiAgICAgICAgdGhpcy5yZWpvaW5UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLl9yZWpvaW5VbnRpbENvbm5lY3RlZCgpLCB0aGlzLnNvY2tldC5yZWNvbm5lY3RBZnRlck1zKTtcbiAgICAgICAgdGhpcy5qb2luUHVzaC5yZWNlaXZlKCdvaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5qb2luZWQ7XG4gICAgICAgICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLnB1c2hCdWZmZXIuZm9yRWFjaCgocHVzaEV2ZW50KSA9PiBwdXNoRXZlbnQuc2VuZCgpKTtcbiAgICAgICAgICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fb25DbG9zZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5sb2coJ2NoYW5uZWwnLCBgY2xvc2UgJHt0aGlzLnRvcGljfSAke3RoaXMuX2pvaW5SZWYoKX1gKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWQ7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5fcmVtb3ZlKHRoaXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fb25FcnJvcigocmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNMZWF2aW5nKCkgfHwgdGhpcy5faXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmxvZygnY2hhbm5lbCcsIGBlcnJvciAke3RoaXMudG9waWN9YCwgcmVhc29uKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkO1xuICAgICAgICAgICAgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZSgndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5faXNKb2luaW5nKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5sb2coJ2NoYW5uZWwnLCBgdGltZW91dCAke3RoaXMudG9waWN9YCwgdGhpcy5qb2luUHVzaC50aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkO1xuICAgICAgICAgICAgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZSgnZXJyb3InLCAocmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNMZWF2aW5nKCkgfHwgdGhpcy5faXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmxvZygnY2hhbm5lbCcsIGBlcnJvciAke3RoaXMudG9waWN9YCwgcmVhc29uKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkO1xuICAgICAgICAgICAgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX29uKENIQU5ORUxfRVZFTlRTLnJlcGx5LCB7fSwgKHBheWxvYWQsIHJlZikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcih0aGlzLl9yZXBseUV2ZW50TmFtZShyZWYpLCBwYXlsb2FkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJlc2VuY2UgPSBuZXcgUmVhbHRpbWVQcmVzZW5jZSh0aGlzKTtcbiAgICAgICAgdGhpcy5icm9hZGNhc3RFbmRwb2ludFVSTCA9IGh0dHBFbmRwb2ludFVSTCh0aGlzLnNvY2tldC5lbmRQb2ludCk7XG4gICAgICAgIHRoaXMucHJpdmF0ZSA9IHRoaXMucGFyYW1zLmNvbmZpZy5wcml2YXRlIHx8IGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMucHJpdmF0ZSAmJiAoKF9iID0gKF9hID0gdGhpcy5wYXJhbXMuY29uZmlnKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYnJvYWRjYXN0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucmVwbGF5KSkge1xuICAgICAgICAgICAgdGhyb3cgYHRyaWVkIHRvIHVzZSByZXBsYXkgb24gcHVibGljIGNoYW5uZWwgJyR7dGhpcy50b3BpY30nLiBJdCBtdXN0IGJlIGEgcHJpdmF0ZSBjaGFubmVsLmA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIFN1YnNjcmliZSByZWdpc3RlcnMgeW91ciBjbGllbnQgd2l0aCB0aGUgc2VydmVyICovXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrLCB0aW1lb3V0ID0gdGhpcy50aW1lb3V0KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBpZiAoIXRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmNvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PSBDSEFOTkVMX1NUQVRFUy5jbG9zZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29uZmlnOiB7IGJyb2FkY2FzdCwgcHJlc2VuY2UsIHByaXZhdGU6IGlzUHJpdmF0ZSB9LCB9ID0gdGhpcy5wYXJhbXM7XG4gICAgICAgICAgICBjb25zdCBwb3N0Z3Jlc19jaGFuZ2VzID0gKF9iID0gKF9hID0gdGhpcy5iaW5kaW5ncy5wb3N0Z3Jlc19jaGFuZ2VzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKChyKSA9PiByLmZpbHRlcikpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdO1xuICAgICAgICAgICAgY29uc3QgcHJlc2VuY2VfZW5hYmxlZCA9ICghIXRoaXMuYmluZGluZ3NbUkVBTFRJTUVfTElTVEVOX1RZUEVTLlBSRVNFTkNFXSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuYmluZGluZ3NbUkVBTFRJTUVfTElTVEVOX1RZUEVTLlBSRVNFTkNFXS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICgoX2MgPSB0aGlzLnBhcmFtcy5jb25maWcucHJlc2VuY2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5lbmFibGVkKSA9PT0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuUGF5bG9hZCA9IHt9O1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGJyb2FkY2FzdCxcbiAgICAgICAgICAgICAgICBwcmVzZW5jZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmVzZW5jZSksIHsgZW5hYmxlZDogcHJlc2VuY2VfZW5hYmxlZCB9KSxcbiAgICAgICAgICAgICAgICBwb3N0Z3Jlc19jaGFuZ2VzLFxuICAgICAgICAgICAgICAgIHByaXZhdGU6IGlzUHJpdmF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5zb2NrZXQuYWNjZXNzVG9rZW5WYWx1ZSkge1xuICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2VuUGF5bG9hZC5hY2Nlc3NfdG9rZW4gPSB0aGlzLnNvY2tldC5hY2Nlc3NUb2tlblZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb25FcnJvcigoZSkgPT4gY2FsbGJhY2sgPT09IG51bGwgfHwgY2FsbGJhY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhbGxiYWNrKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMuQ0hBTk5FTF9FUlJPUiwgZSkpO1xuICAgICAgICAgICAgdGhpcy5fb25DbG9zZSgoKSA9PiBjYWxsYmFjayA9PT0gbnVsbCB8fCBjYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FsbGJhY2soUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUy5DTE9TRUQpKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSm9pblBheWxvYWQoT2JqZWN0LmFzc2lnbih7IGNvbmZpZyB9LCBhY2Nlc3NUb2tlblBheWxvYWQpKTtcbiAgICAgICAgICAgIHRoaXMuam9pbmVkT25jZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9yZWpvaW4odGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLmpvaW5QdXNoXG4gICAgICAgICAgICAgICAgLnJlY2VpdmUoJ29rJywgYXN5bmMgKHsgcG9zdGdyZXNfY2hhbmdlcyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVmcmVzaCBhdXRoIGlmIHVzaW5nIGNhbGxiYWNrLWJhc2VkIHRva2Vuc1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zb2NrZXQuX2lzTWFudWFsVG9rZW4oKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZXRBdXRoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb3N0Z3Jlc19jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPT09IG51bGwgfHwgY2FsbGJhY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhbGxiYWNrKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMuU1VCU0NSSUJFRCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFBvc3RncmVzQmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLnBvc3RncmVzX2NoYW5nZXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbmRpbmdzTGVuID0gKF9hID0gY2xpZW50UG9zdGdyZXNCaW5kaW5ncyA9PT0gbnVsbCB8fCBjbGllbnRQb3N0Z3Jlc0JpbmRpbmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGllbnRQb3N0Z3Jlc0JpbmRpbmdzLmxlbmd0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UG9zdGdyZXNCaW5kaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmRpbmdzTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFBvc3RncmVzQmluZGluZyA9IGNsaWVudFBvc3RncmVzQmluZGluZ3NbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbHRlcjogeyBldmVudCwgc2NoZW1hLCB0YWJsZSwgZmlsdGVyIH0sIH0gPSBjbGllbnRQb3N0Z3Jlc0JpbmRpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2ZXJQb3N0Z3Jlc0ZpbHRlciA9IHBvc3RncmVzX2NoYW5nZXMgJiYgcG9zdGdyZXNfY2hhbmdlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJQb3N0Z3Jlc0ZpbHRlciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclBvc3RncmVzRmlsdGVyLmV2ZW50ID09PSBldmVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWx0aW1lQ2hhbm5lbC5pc0ZpbHRlclZhbHVlRXF1YWwoc2VydmVyUG9zdGdyZXNGaWx0ZXIuc2NoZW1hLCBzY2hlbWEpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbHRpbWVDaGFubmVsLmlzRmlsdGVyVmFsdWVFcXVhbChzZXJ2ZXJQb3N0Z3Jlc0ZpbHRlci50YWJsZSwgdGFibGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbHRpbWVDaGFubmVsLmlzRmlsdGVyVmFsdWVFcXVhbChzZXJ2ZXJQb3N0Z3Jlc0ZpbHRlci5maWx0ZXIsIGZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQb3N0Z3Jlc0JpbmRpbmdzLnB1c2goT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjbGllbnRQb3N0Z3Jlc0JpbmRpbmcpLCB7IGlkOiBzZXJ2ZXJQb3N0Z3Jlc0ZpbHRlci5pZCB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPT09IG51bGwgfHwgY2FsbGJhY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhbGxiYWNrKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMuQ0hBTk5FTF9FUlJPUiwgbmV3IEVycm9yKCdtaXNtYXRjaCBiZXR3ZWVuIHNlcnZlciBhbmQgY2xpZW50IGJpbmRpbmdzIGZvciBwb3N0Z3JlcyBjaGFuZ2VzJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRpbmdzLnBvc3RncmVzX2NoYW5nZXMgPSBuZXdQb3N0Z3Jlc0JpbmRpbmdzO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTLlNVQlNDUklCRUQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVjZWl2ZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZDtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9PT0gbnVsbCB8fCBjYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FsbGJhY2soUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUy5DSEFOTkVMX0VSUk9SLCBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoT2JqZWN0LnZhbHVlcyhlcnJvcikuam9pbignLCAnKSB8fCAnZXJyb3InKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlY2VpdmUoJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPT09IG51bGwgfHwgY2FsbGJhY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhbGxiYWNrKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMuVElNRURfT1VUKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwcmVzZW5jZSBzdGF0ZSBmb3IgdGhpcyBjaGFubmVsLlxuICAgICAqXG4gICAgICogVGhlIHNoYXBlIGlzIGEgbWFwIGtleWVkIGJ5IHByZXNlbmNlIGtleSAoZm9yIGV4YW1wbGUgYSB1c2VyIGlkKSB3aGVyZSBlYWNoIGVudHJ5IGNvbnRhaW5zIHRoZVxuICAgICAqIHRyYWNrZWQgbWV0YWRhdGEgZm9yIHRoYXQgdXNlci5cbiAgICAgKi9cbiAgICBwcmVzZW5jZVN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVzZW5jZS5zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgdGhlIHN1cHBsaWVkIHBheWxvYWQgdG8gdGhlIHByZXNlbmNlIHRyYWNrZXIgc28gb3RoZXIgc3Vic2NyaWJlcnMgY2FuIHNlZSB0aGF0IHRoaXNcbiAgICAgKiBjbGllbnQgaXMgb25saW5lLiBVc2UgYHVudHJhY2tgIHRvIHN0b3AgYnJvYWRjYXN0aW5nIHByZXNlbmNlIGZvciB0aGUgc2FtZSBrZXkuXG4gICAgICovXG4gICAgYXN5bmMgdHJhY2socGF5bG9hZCwgb3B0cyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgICAgICAgdHlwZTogJ3ByZXNlbmNlJyxcbiAgICAgICAgICAgIGV2ZW50OiAndHJhY2snLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgfSwgb3B0cy50aW1lb3V0IHx8IHRoaXMudGltZW91dCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGN1cnJlbnQgcHJlc2VuY2Ugc3RhdGUgZm9yIHRoaXMgY2xpZW50LlxuICAgICAqL1xuICAgIGFzeW5jIHVudHJhY2sob3B0cyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgICAgICAgdHlwZTogJ3ByZXNlbmNlJyxcbiAgICAgICAgICAgIGV2ZW50OiAndW50cmFjaycsXG4gICAgICAgIH0sIG9wdHMpO1xuICAgIH1cbiAgICBvbih0eXBlLCBmaWx0ZXIsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5qb2luZWQgJiYgdHlwZSA9PT0gUkVBTFRJTUVfTElTVEVOX1RZUEVTLlBSRVNFTkNFKSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5sb2coJ2NoYW5uZWwnLCBgcmVzdWJzY3JpYmUgdG8gJHt0aGlzLnRvcGljfSBkdWUgdG8gY2hhbmdlIGluIHByZXNlbmNlIGNhbGxiYWNrcyBvbiBqb2luZWQgY2hhbm5lbGApO1xuICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpLnRoZW4oYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5zdWJzY3JpYmUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX29uKHR5cGUsIGZpbHRlciwgY2FsbGJhY2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIGJyb2FkY2FzdCBtZXNzYWdlIGV4cGxpY2l0bHkgdmlhIFJFU1QgQVBJLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgYWx3YXlzIHVzZXMgdGhlIFJFU1QgQVBJIGVuZHBvaW50IHJlZ2FyZGxlc3Mgb2YgV2ViU29ja2V0IGNvbm5lY3Rpb24gc3RhdGUuXG4gICAgICogVXNlZnVsIHdoZW4geW91IHdhbnQgdG8gZ3VhcmFudGVlIFJFU1QgZGVsaXZlcnkgb3Igd2hlbiBncmFkdWFsbHkgbWlncmF0aW5nIGZyb20gaW1wbGljaXQgUkVTVCBmYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgbmFtZSBvZiB0aGUgYnJvYWRjYXN0IGV2ZW50XG4gICAgICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCB0byBiZSBzZW50IChyZXF1aXJlZClcbiAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIGluY2x1ZGluZyB0aW1lb3V0XG4gICAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gb2JqZWN0IHdpdGggc3VjY2VzcyBzdGF0dXMsIGFuZCBlcnJvciBkZXRhaWxzIGlmIGZhaWxlZFxuICAgICAqL1xuICAgIGFzeW5jIGh0dHBTZW5kKGV2ZW50LCBwYXlsb2FkLCBvcHRzID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkIHx8IHBheWxvYWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnUGF5bG9hZCBpcyByZXF1aXJlZCBmb3IgaHR0cFNlbmQoKScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgICBhcGlrZXk6IHRoaXMuc29ja2V0LmFwaUtleSA/IHRoaXMuc29ja2V0LmFwaUtleSA6ICcnLFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0LmFjY2Vzc1Rva2VuVmFsdWUpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0aGlzLnNvY2tldC5hY2Nlc3NUb2tlblZhbHVlfWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3BpYzogdGhpcy5zdWJUb3BpYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGU6IHRoaXMucHJpdmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fZmV0Y2hXaXRoVGltZW91dCh0aGlzLmJyb2FkY2FzdEVuZHBvaW50VVJMLCBvcHRpb25zLCAoX2EgPSBvcHRzLnRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMudGltZW91dCk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JCb2R5ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3JCb2R5LmVycm9yIHx8IGVycm9yQm9keS5tZXNzYWdlIHx8IGVycm9yTWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2IpIHsgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIG1lc3NhZ2UgaW50byB0aGUgY2hhbm5lbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBzZW5kIHRvIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gYXJncy50eXBlIFRoZSB0eXBlIG9mIGV2ZW50IHRvIHNlbmRcbiAgICAgKiBAcGFyYW0gYXJncy5ldmVudCBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgYmVpbmcgc2VudFxuICAgICAqIEBwYXJhbSBhcmdzLnBheWxvYWQgUGF5bG9hZCB0byBiZSBzZW50XG4gICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyB0byBiZSB1c2VkIGR1cmluZyB0aGUgc2VuZCBwcm9jZXNzXG4gICAgICovXG4gICAgYXN5bmMgc2VuZChhcmdzLCBvcHRzID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKCF0aGlzLl9jYW5QdXNoKCkgJiYgYXJncy50eXBlID09PSAnYnJvYWRjYXN0Jykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZWFsdGltZSBzZW5kKCkgaXMgYXV0b21hdGljYWxseSBmYWxsaW5nIGJhY2sgdG8gUkVTVCBBUEkuICcgK1xuICAgICAgICAgICAgICAgICdUaGlzIGJlaGF2aW9yIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLiAnICtcbiAgICAgICAgICAgICAgICAnUGxlYXNlIHVzZSBodHRwU2VuZCgpIGV4cGxpY2l0bHkgZm9yIFJFU1QgZGVsaXZlcnkuJyk7XG4gICAgICAgICAgICBjb25zdCB7IGV2ZW50LCBwYXlsb2FkOiBlbmRwb2ludF9wYXlsb2FkIH0gPSBhcmdzO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICBhcGlrZXk6IHRoaXMuc29ja2V0LmFwaUtleSA/IHRoaXMuc29ja2V0LmFwaUtleSA6ICcnLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0LmFjY2Vzc1Rva2VuVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dGhpcy5zb2NrZXQuYWNjZXNzVG9rZW5WYWx1ZX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BpYzogdGhpcy5zdWJUb3BpYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBlbmRwb2ludF9wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGU6IHRoaXMucHJpdmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX2ZldGNoV2l0aFRpbWVvdXQodGhpcy5icm9hZGNhc3RFbmRwb2ludFVSTCwgb3B0aW9ucywgKF9hID0gb3B0cy50aW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLnRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGF3YWl0ICgoX2IgPSByZXNwb25zZS5ib2R5KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FuY2VsKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5vayA/ICdvaycgOiAnZXJyb3InO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RpbWVkIG91dCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgICAgICBjb25zdCBwdXNoID0gdGhpcy5fcHVzaChhcmdzLnR5cGUsIGFyZ3MsIG9wdHMudGltZW91dCB8fCB0aGlzLnRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGlmIChhcmdzLnR5cGUgPT09ICdicm9hZGNhc3QnICYmICEoKF9jID0gKF9iID0gKF9hID0gdGhpcy5wYXJhbXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb25maWcpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5icm9hZGNhc3QpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5hY2spKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoJ29rJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHB1c2gucmVjZWl2ZSgnb2snLCAoKSA9PiByZXNvbHZlKCdvaycpKTtcbiAgICAgICAgICAgICAgICBwdXNoLnJlY2VpdmUoJ2Vycm9yJywgKCkgPT4gcmVzb2x2ZSgnZXJyb3InKSk7XG4gICAgICAgICAgICAgICAgcHVzaC5yZWNlaXZlKCd0aW1lb3V0JywgKCkgPT4gcmVzb2x2ZSgndGltZWQgb3V0JykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgcGF5bG9hZCB0aGF0IHdpbGwgYmUgc2VudCB0aGUgbmV4dCB0aW1lIHRoZSBjaGFubmVsIGpvaW5zIChyZWNvbm5lY3RzKS5cbiAgICAgKiBVc2VmdWwgZm9yIHJvdGF0aW5nIGFjY2VzcyB0b2tlbnMgb3IgdXBkYXRpbmcgY29uZmlnIHdpdGhvdXQgcmUtY3JlYXRpbmcgdGhlIGNoYW5uZWwuXG4gICAgICovXG4gICAgdXBkYXRlSm9pblBheWxvYWQocGF5bG9hZCkge1xuICAgICAgICB0aGlzLmpvaW5QdXNoLnVwZGF0ZVBheWxvYWQocGF5bG9hZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExlYXZlcyB0aGUgY2hhbm5lbC5cbiAgICAgKlxuICAgICAqIFVuc3Vic2NyaWJlcyBmcm9tIHNlcnZlciBldmVudHMsIGFuZCBpbnN0cnVjdHMgY2hhbm5lbCB0byB0ZXJtaW5hdGUgb24gc2VydmVyLlxuICAgICAqIFRyaWdnZXJzIG9uQ2xvc2UoKSBob29rcy5cbiAgICAgKlxuICAgICAqIFRvIHJlY2VpdmUgbGVhdmUgYWNrbm93bGVkZ2VtZW50cywgdXNlIHRoZSBhIGByZWNlaXZlYCBob29rIHRvIGJpbmQgdG8gdGhlIHNlcnZlciBhY2ssIGllOlxuICAgICAqIGNoYW5uZWwudW5zdWJzY3JpYmUoKS5yZWNlaXZlKFwib2tcIiwgKCkgPT4gYWxlcnQoXCJsZWZ0IVwiKSApXG4gICAgICovXG4gICAgdW5zdWJzY3JpYmUodGltZW91dCA9IHRoaXMudGltZW91dCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMubGVhdmluZztcbiAgICAgICAgY29uc3Qgb25DbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmxvZygnY2hhbm5lbCcsIGBsZWF2ZSAke3RoaXMudG9waWN9YCk7XG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmNsb3NlLCAnbGVhdmUnLCB0aGlzLl9qb2luUmVmKCkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmpvaW5QdXNoLmRlc3Ryb3koKTtcbiAgICAgICAgbGV0IGxlYXZlUHVzaCA9IG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgbGVhdmVQdXNoID0gbmV3IFB1c2godGhpcywgQ0hBTk5FTF9FVkVOVFMubGVhdmUsIHt9LCB0aW1lb3V0KTtcbiAgICAgICAgICAgIGxlYXZlUHVzaFxuICAgICAgICAgICAgICAgIC5yZWNlaXZlKCdvaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBvbkNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgnb2snKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlY2VpdmUoJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgb25DbG9zZSgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoJ3RpbWVkIG91dCcpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVjZWl2ZSgnZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgnZXJyb3InKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGVhdmVQdXNoLnNlbmQoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fY2FuUHVzaCgpKSB7XG4gICAgICAgICAgICAgICAgbGVhdmVQdXNoLnRyaWdnZXIoJ29rJywge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIGxlYXZlUHVzaCA9PT0gbnVsbCB8fCBsZWF2ZVB1c2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxlYXZlUHVzaC5kZXN0cm95KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZWFyZG93biB0aGUgY2hhbm5lbC5cbiAgICAgKlxuICAgICAqIERlc3Ryb3lzIGFuZCBzdG9wcyByZWxhdGVkIHRpbWVycy5cbiAgICAgKi9cbiAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgdGhpcy5wdXNoQnVmZmVyLmZvckVhY2goKHB1c2gpID0+IHB1c2guZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW107XG4gICAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKTtcbiAgICAgICAgdGhpcy5qb2luUHVzaC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWQ7XG4gICAgICAgIHRoaXMuYmluZGluZ3MgPSB7fTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGFzeW5jIF9mZXRjaFdpdGhUaW1lb3V0KHVybCwgb3B0aW9ucywgdGltZW91dCkge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBjb25zdCBpZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNvY2tldC5mZXRjaCh1cmwsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KSk7XG4gICAgICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9wdXNoKGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0ID0gdGhpcy50aW1lb3V0KSB7XG4gICAgICAgIGlmICghdGhpcy5qb2luZWRPbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBgdHJpZWQgdG8gcHVzaCAnJHtldmVudH0nIHRvICcke3RoaXMudG9waWN9JyBiZWZvcmUgam9pbmluZy4gVXNlIGNoYW5uZWwuc3Vic2NyaWJlKCkgYmVmb3JlIHB1c2hpbmcgZXZlbnRzYDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHVzaEV2ZW50ID0gbmV3IFB1c2godGhpcywgZXZlbnQsIHBheWxvYWQsIHRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5fY2FuUHVzaCgpKSB7XG4gICAgICAgICAgICBwdXNoRXZlbnQuc2VuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWRkVG9QdXNoQnVmZmVyKHB1c2hFdmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHB1c2hFdmVudDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9hZGRUb1B1c2hCdWZmZXIocHVzaEV2ZW50KSB7XG4gICAgICAgIHB1c2hFdmVudC5zdGFydFRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5wdXNoQnVmZmVyLnB1c2gocHVzaEV2ZW50KTtcbiAgICAgICAgLy8gRW5mb3JjZSBidWZmZXIgc2l6ZSBsaW1pdFxuICAgICAgICBpZiAodGhpcy5wdXNoQnVmZmVyLmxlbmd0aCA+IE1BWF9QVVNIX0JVRkZFUl9TSVpFKSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkUHVzaCA9IHRoaXMucHVzaEJ1ZmZlci5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWRQdXNoKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZFB1c2guZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmxvZygnY2hhbm5lbCcsIGBkaXNjYXJkZWQgcHVzaCBkdWUgdG8gYnVmZmVyIG92ZXJmbG93OiAke3JlbW92ZWRQdXNoLmV2ZW50fWAsIHJlbW92ZWRQdXNoLnBheWxvYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRhYmxlIG1lc3NhZ2UgaG9va1xuICAgICAqXG4gICAgICogUmVjZWl2ZXMgYWxsIGV2ZW50cyBmb3Igc3BlY2lhbGl6ZWQgbWVzc2FnZSBoYW5kbGluZyBiZWZvcmUgZGlzcGF0Y2hpbmcgdG8gdGhlIGNoYW5uZWwgY2FsbGJhY2tzLlxuICAgICAqIE11c3QgcmV0dXJuIHRoZSBwYXlsb2FkLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX29uTWVzc2FnZShfZXZlbnQsIHBheWxvYWQsIF9yZWYpIHtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaXNNZW1iZXIodG9waWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9waWMgPT09IHRvcGljO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2pvaW5SZWYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpvaW5QdXNoLnJlZjtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF90cmlnZ2VyKHR5cGUsIHBheWxvYWQsIHJlZikge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB0eXBlTG93ZXIgPSB0eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHsgY2xvc2UsIGVycm9yLCBsZWF2ZSwgam9pbiB9ID0gQ0hBTk5FTF9FVkVOVFM7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IFtjbG9zZSwgZXJyb3IsIGxlYXZlLCBqb2luXTtcbiAgICAgICAgaWYgKHJlZiAmJiBldmVudHMuaW5kZXhPZih0eXBlTG93ZXIpID49IDAgJiYgcmVmICE9PSB0aGlzLl9qb2luUmVmKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGFuZGxlZFBheWxvYWQgPSB0aGlzLl9vbk1lc3NhZ2UodHlwZUxvd2VyLCBwYXlsb2FkLCByZWYpO1xuICAgICAgICBpZiAocGF5bG9hZCAmJiAhaGFuZGxlZFBheWxvYWQpIHtcbiAgICAgICAgICAgIHRocm93ICdjaGFubmVsIG9uTWVzc2FnZSBjYWxsYmFja3MgbXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChbJ2luc2VydCcsICd1cGRhdGUnLCAnZGVsZXRlJ10uaW5jbHVkZXModHlwZUxvd2VyKSkge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5iaW5kaW5ncy5wb3N0Z3Jlc19jaGFuZ2VzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmlsdGVyKChiaW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgoX2EgPSBiaW5kLmZpbHRlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmV2ZW50KSA9PT0gJyonIHx8ICgoX2MgPSAoX2IgPSBiaW5kLmZpbHRlcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmV2ZW50KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudG9Mb2NhbGVMb3dlckNhc2UoKSkgPT09IHR5cGVMb3dlcjtcbiAgICAgICAgICAgIH0pLm1hcCgoYmluZCkgPT4gYmluZC5jYWxsYmFjayhoYW5kbGVkUGF5bG9hZCwgcmVmKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoX2IgPSB0aGlzLmJpbmRpbmdzW3R5cGVMb3dlcl0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maWx0ZXIoKGJpbmQpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgICAgICAgICAgICAgICBpZiAoWydicm9hZGNhc3QnLCAncHJlc2VuY2UnLCAncG9zdGdyZXNfY2hhbmdlcyddLmluY2x1ZGVzKHR5cGVMb3dlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCdpZCcgaW4gYmluZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmluZElkID0gYmluZC5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbmRFdmVudCA9IChfYSA9IGJpbmQuZmlsdGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGJpbmRJZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX2IgPSBwYXlsb2FkLmlkcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmluY2x1ZGVzKGJpbmRJZCkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpbmRFdmVudCA9PT0gJyonIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaW5kRXZlbnQgPT09IG51bGwgfHwgYmluZEV2ZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBiaW5kRXZlbnQudG9Mb2NhbGVMb3dlckNhc2UoKSkgPT09ICgoX2MgPSBwYXlsb2FkLmRhdGEpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaW5kRXZlbnQgPSAoX2UgPSAoX2QgPSBiaW5kID09PSBudWxsIHx8IGJpbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJpbmQuZmlsdGVyKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuZXZlbnQpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRFdmVudCA9PT0gJyonIHx8IGJpbmRFdmVudCA9PT0gKChfZiA9IHBheWxvYWQgPT09IG51bGwgfHwgcGF5bG9hZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGF5bG9hZC5ldmVudCkgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZC50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IHR5cGVMb3dlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5tYXAoKGJpbmQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZWRQYXlsb2FkID09PSAnb2JqZWN0JyAmJiAnaWRzJyBpbiBoYW5kbGVkUGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3N0Z3Jlc0NoYW5nZXMgPSBoYW5kbGVkUGF5bG9hZC5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHNjaGVtYSwgdGFibGUsIGNvbW1pdF90aW1lc3RhbXAsIHR5cGUsIGVycm9ycyB9ID0gcG9zdGdyZXNDaGFuZ2VzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnJpY2hlZFBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdF90aW1lc3RhbXA6IGNvbW1pdF90aW1lc3RhbXAsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXc6IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yczogZXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVkUGF5bG9hZCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZW5yaWNoZWRQYXlsb2FkKSwgdGhpcy5fZ2V0UGF5bG9hZFJlY29yZHMocG9zdGdyZXNDaGFuZ2VzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJpbmQuY2FsbGJhY2soaGFuZGxlZFBheWxvYWQsIHJlZik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2lzQ2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2lzSm9pbmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2lzSm9pbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmpvaW5pbmc7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaXNMZWF2aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMubGVhdmluZztcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9yZXBseUV2ZW50TmFtZShyZWYpIHtcbiAgICAgICAgcmV0dXJuIGBjaGFuX3JlcGx5XyR7cmVmfWA7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb24odHlwZSwgZmlsdGVyLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB0eXBlTG93ZXIgPSB0eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGJpbmRpbmcgPSB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlTG93ZXIsXG4gICAgICAgICAgICBmaWx0ZXI6IGZpbHRlcixcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuYmluZGluZ3NbdHlwZUxvd2VyXSkge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1t0eXBlTG93ZXJdLnB1c2goYmluZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzW3R5cGVMb3dlcl0gPSBbYmluZGluZ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb2ZmKHR5cGUsIGZpbHRlcikge1xuICAgICAgICBjb25zdCB0eXBlTG93ZXIgPSB0eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzLmJpbmRpbmdzW3R5cGVMb3dlcl0pIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NbdHlwZUxvd2VyXSA9IHRoaXMuYmluZGluZ3NbdHlwZUxvd2VyXS5maWx0ZXIoKGJpbmQpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEoKChfYSA9IGJpbmQudHlwZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvTG9jYWxlTG93ZXJDYXNlKCkpID09PSB0eXBlTG93ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgUmVhbHRpbWVDaGFubmVsLmlzRXF1YWwoYmluZC5maWx0ZXIsIGZpbHRlcikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgaXNFcXVhbChvYmoxLCBvYmoyKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvYmoxKS5sZW5ndGggIT09IE9iamVjdC5rZXlzKG9iajIpLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgayBpbiBvYmoxKSB7XG4gICAgICAgICAgICBpZiAob2JqMVtrXSAhPT0gb2JqMltrXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdHdvIG9wdGlvbmFsIGZpbHRlciB2YWx1ZXMgZm9yIGVxdWFsaXR5LlxuICAgICAqIFRyZWF0cyB1bmRlZmluZWQsIG51bGwsIGFuZCBlbXB0eSBzdHJpbmcgYXMgZXF1aXZhbGVudCBlbXB0eSB2YWx1ZXMuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIGlzRmlsdGVyVmFsdWVFcXVhbChzZXJ2ZXJWYWx1ZSwgY2xpZW50VmFsdWUpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNlcnZlciA9IHNlcnZlclZhbHVlICE9PSBudWxsICYmIHNlcnZlclZhbHVlICE9PSB2b2lkIDAgPyBzZXJ2ZXJWYWx1ZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZENsaWVudCA9IGNsaWVudFZhbHVlICE9PSBudWxsICYmIGNsaWVudFZhbHVlICE9PSB2b2lkIDAgPyBjbGllbnRWYWx1ZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRTZXJ2ZXIgPT09IG5vcm1hbGl6ZWRDbGllbnQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfcmVqb2luVW50aWxDb25uZWN0ZWQoKSB7XG4gICAgICAgIHRoaXMucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCk7XG4gICAgICAgIGlmICh0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWpvaW4oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2hhbm5lbCBjbG9zZXMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfb25DbG9zZShjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbihDSEFOTkVMX0VWRU5UUy5jbG9zZSwge30sIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNoYW5uZWwgZW5jb3VudGVyZXMgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfb25FcnJvcihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbihDSEFOTkVMX0VWRU5UUy5lcnJvciwge30sIChyZWFzb24pID0+IGNhbGxiYWNrKHJlYXNvbikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCBhbmQgdGhlIGNoYW5uZWwgaGFzIGJlZW4gam9pbmVkLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2NhblB1c2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuX2lzSm9pbmVkKCk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfcmVqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzTGVhdmluZygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zb2NrZXQuX2xlYXZlT3BlblRvcGljKHRoaXMudG9waWMpO1xuICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuam9pbmluZztcbiAgICAgICAgdGhpcy5qb2luUHVzaC5yZXNlbmQodGltZW91dCk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfZ2V0UGF5bG9hZFJlY29yZHMocGF5bG9hZCkge1xuICAgICAgICBjb25zdCByZWNvcmRzID0ge1xuICAgICAgICAgICAgbmV3OiB7fSxcbiAgICAgICAgICAgIG9sZDoge30sXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwYXlsb2FkLnR5cGUgPT09ICdJTlNFUlQnIHx8IHBheWxvYWQudHlwZSA9PT0gJ1VQREFURScpIHtcbiAgICAgICAgICAgIHJlY29yZHMubmV3ID0gVHJhbnNmb3JtZXJzLmNvbnZlcnRDaGFuZ2VEYXRhKHBheWxvYWQuY29sdW1ucywgcGF5bG9hZC5yZWNvcmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXlsb2FkLnR5cGUgPT09ICdVUERBVEUnIHx8IHBheWxvYWQudHlwZSA9PT0gJ0RFTEVURScpIHtcbiAgICAgICAgICAgIHJlY29yZHMub2xkID0gVHJhbnNmb3JtZXJzLmNvbnZlcnRDaGFuZ2VEYXRhKHBheWxvYWQuY29sdW1ucywgcGF5bG9hZC5vbGRfcmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3JkcztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWFsdGltZUNoYW5uZWwuanMubWFwIl0sIm5hbWVzIjpbIkNIQU5ORUxfRVZFTlRTIiwiQ0hBTk5FTF9TVEFURVMiLCJNQVhfUFVTSF9CVUZGRVJfU0laRSIsIlB1c2giLCJUaW1lciIsIlJlYWx0aW1lUHJlc2VuY2UiLCJUcmFuc2Zvcm1lcnMiLCJodHRwRW5kcG9pbnRVUkwiLCJSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCIsIlJFQUxUSU1FX0xJU1RFTl9UWVBFUyIsIlJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMiLCJSRUFMVElNRV9DSEFOTkVMX1NUQVRFUyIsIlJlYWx0aW1lQ2hhbm5lbCIsInN1YnNjcmliZSIsImNhbGxiYWNrIiwidGltZW91dCIsIl9hIiwiX2IiLCJfYyIsInNvY2tldCIsImlzQ29ubmVjdGVkIiwiY29ubmVjdCIsInN0YXRlIiwiY2xvc2VkIiwiY29uZmlnIiwiYnJvYWRjYXN0IiwicHJlc2VuY2UiLCJwcml2YXRlIiwiaXNQcml2YXRlIiwicGFyYW1zIiwicG9zdGdyZXNfY2hhbmdlcyIsImJpbmRpbmdzIiwibWFwIiwiciIsImZpbHRlciIsInByZXNlbmNlX2VuYWJsZWQiLCJQUkVTRU5DRSIsImxlbmd0aCIsImVuYWJsZWQiLCJhY2Nlc3NUb2tlblBheWxvYWQiLCJPYmplY3QiLCJhc3NpZ24iLCJhY2Nlc3NUb2tlblZhbHVlIiwiYWNjZXNzX3Rva2VuIiwiX29uRXJyb3IiLCJlIiwiQ0hBTk5FTF9FUlJPUiIsIl9vbkNsb3NlIiwiQ0xPU0VEIiwidXBkYXRlSm9pblBheWxvYWQiLCJqb2luZWRPbmNlIiwiX3Jlam9pbiIsImpvaW5QdXNoIiwicmVjZWl2ZSIsIl9pc01hbnVhbFRva2VuIiwic2V0QXV0aCIsInVuZGVmaW5lZCIsIlNVQlNDUklCRUQiLCJjbGllbnRQb3N0Z3Jlc0JpbmRpbmdzIiwiYmluZGluZ3NMZW4iLCJuZXdQb3N0Z3Jlc0JpbmRpbmdzIiwiaSIsImNsaWVudFBvc3RncmVzQmluZGluZyIsImV2ZW50Iiwic2NoZW1hIiwidGFibGUiLCJzZXJ2ZXJQb3N0Z3Jlc0ZpbHRlciIsImlzRmlsdGVyVmFsdWVFcXVhbCIsInB1c2giLCJpZCIsInVuc3Vic2NyaWJlIiwiZXJyb3JlZCIsIkVycm9yIiwiZXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsdWVzIiwiam9pbiIsIlRJTUVEX09VVCIsInByZXNlbmNlU3RhdGUiLCJ0cmFjayIsInBheWxvYWQiLCJvcHRzIiwic2VuZCIsInR5cGUiLCJ1bnRyYWNrIiwib24iLCJqb2luZWQiLCJsb2ciLCJ0b3BpYyIsInRoZW4iLCJfb24iLCJodHRwU2VuZCIsIlByb21pc2UiLCJyZWplY3QiLCJoZWFkZXJzIiwiYXBpa2V5IiwiYXBpS2V5Iiwib3B0aW9ucyIsIm1ldGhvZCIsImJvZHkiLCJtZXNzYWdlcyIsInN1YlRvcGljIiwicmVzcG9uc2UiLCJfZmV0Y2hXaXRoVGltZW91dCIsImJyb2FkY2FzdEVuZHBvaW50VVJMIiwic3RhdHVzIiwic3VjY2VzcyIsImVycm9yTWVzc2FnZSIsInN0YXR1c1RleHQiLCJlcnJvckJvZHkiLCJqc29uIiwibWVzc2FnZSIsImFyZ3MiLCJfY2FuUHVzaCIsImNvbnNvbGUiLCJ3YXJuIiwiZW5kcG9pbnRfcGF5bG9hZCIsImNhbmNlbCIsIm9rIiwibmFtZSIsInJlc29sdmUiLCJfcHVzaCIsImFjayIsInVwZGF0ZVBheWxvYWQiLCJsZWF2aW5nIiwib25DbG9zZSIsIl90cmlnZ2VyIiwiY2xvc2UiLCJfam9pblJlZiIsImRlc3Ryb3kiLCJsZWF2ZVB1c2giLCJsZWF2ZSIsInRyaWdnZXIiLCJmaW5hbGx5IiwidGVhcmRvd24iLCJwdXNoQnVmZmVyIiwiZm9yRWFjaCIsInJlam9pblRpbWVyIiwicmVzZXQiLCJ1cmwiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwic2V0VGltZW91dCIsImFib3J0IiwiZmV0Y2giLCJzaWduYWwiLCJjbGVhclRpbWVvdXQiLCJwdXNoRXZlbnQiLCJfYWRkVG9QdXNoQnVmZmVyIiwic3RhcnRUaW1lb3V0IiwicmVtb3ZlZFB1c2giLCJzaGlmdCIsIl9vbk1lc3NhZ2UiLCJfZXZlbnQiLCJfcmVmIiwiX2lzTWVtYmVyIiwicmVmIiwidHlwZUxvd2VyIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJldmVudHMiLCJpbmRleE9mIiwiaGFuZGxlZFBheWxvYWQiLCJpbmNsdWRlcyIsImJpbmQiLCJfZCIsIl9lIiwiX2YiLCJiaW5kSWQiLCJiaW5kRXZlbnQiLCJpZHMiLCJkYXRhIiwicG9zdGdyZXNDaGFuZ2VzIiwiY29tbWl0X3RpbWVzdGFtcCIsImVycm9ycyIsImVucmljaGVkUGF5bG9hZCIsImV2ZW50VHlwZSIsIm5ldyIsIm9sZCIsIl9nZXRQYXlsb2FkUmVjb3JkcyIsIl9pc0Nsb3NlZCIsIl9pc0pvaW5lZCIsIl9pc0pvaW5pbmciLCJqb2luaW5nIiwiX2lzTGVhdmluZyIsIl9yZXBseUV2ZW50TmFtZSIsImJpbmRpbmciLCJfb2ZmIiwiaXNFcXVhbCIsIm9iajEiLCJvYmoyIiwia2V5cyIsImsiLCJzZXJ2ZXJWYWx1ZSIsImNsaWVudFZhbHVlIiwibm9ybWFsaXplZFNlcnZlciIsIm5vcm1hbGl6ZWRDbGllbnQiLCJfcmVqb2luVW50aWxDb25uZWN0ZWQiLCJzY2hlZHVsZVRpbWVvdXQiLCJyZWFzb24iLCJfbGVhdmVPcGVuVG9waWMiLCJyZXNlbmQiLCJyZWNvcmRzIiwiY29udmVydENoYW5nZURhdGEiLCJjb2x1bW5zIiwicmVjb3JkIiwib2xkX3JlY29yZCIsImNvbnN0cnVjdG9yIiwicmVwbGFjZSIsInNlbGYiLCJrZXkiLCJyZWNvbm5lY3RBZnRlck1zIiwiX3JlbW92ZSIsInJlcGx5IiwiZW5kUG9pbnQiLCJyZXBsYXkiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js":
/*!**************************************************************************!*\
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js ***!
\**************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ RealtimeClient; }\n/* harmony export */ });\n/* harmony import */ var _lib_websocket_factory__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/websocket-factory */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js\");\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/constants */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\");\n/* harmony import */ var _lib_serializer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/serializer */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js\");\n/* harmony import */ var _lib_timer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/timer */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js\");\n/* harmony import */ var _lib_transformers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/transformers */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js\");\n/* harmony import */ var _RealtimeChannel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./RealtimeChannel */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js\");\n\n\n\n\n\n\nconst noop = ()=>{};\n// Connection-related constants\nconst CONNECTION_TIMEOUTS = {\n HEARTBEAT_INTERVAL: 25000,\n RECONNECT_DELAY: 10,\n HEARTBEAT_TIMEOUT_FALLBACK: 100\n};\nconst RECONNECT_INTERVALS = [\n 1000,\n 2000,\n 5000,\n 10000\n];\nconst DEFAULT_RECONNECT_FALLBACK = 10000;\nconst WORKER_SCRIPT = '\\n addEventListener(\"message\", (e) => {\\n if (e.data.event === \"start\") {\\n setInterval(() => postMessage({ event: \"keepAlive\" }), e.data.interval);\\n }\\n });';\nclass RealtimeClient {\n /**\n * Connects the socket, unless already connected.\n */ connect() {\n // Skip if already connecting, disconnecting, or connected\n if (this.isConnecting() || this.isDisconnecting() || this.conn !== null && this.isConnected()) {\n return;\n }\n this._setConnectionState(\"connecting\");\n // Trigger auth if needed and not already in progress\n // This ensures auth is called for standalone RealtimeClient usage\n // while avoiding race conditions with SupabaseClient's immediate setAuth call\n if (this.accessToken && !this._authPromise) {\n this._setAuthSafely(\"connect\");\n }\n // Establish WebSocket connection\n if (this.transport) {\n // Use custom transport if provided\n this.conn = new this.transport(this.endpointURL());\n } else {\n // Try to use native WebSocket\n try {\n this.conn = _lib_websocket_factory__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createWebSocket(this.endpointURL());\n } catch (error) {\n this._setConnectionState(\"disconnected\");\n const errorMessage = error.message;\n // Provide helpful error message based on environment\n if (errorMessage.includes(\"Node.js\")) {\n throw new Error(\"\".concat(errorMessage, \"\\n\\n\") + \"To use Realtime in Node.js, you need to provide a WebSocket implementation:\\n\\n\" + \"Option 1: Use Node.js 22+ which has native WebSocket support\\n\" + 'Option 2: Install and provide the \"ws\" package:\\n\\n' + \" npm install ws\\n\\n\" + ' import ws from \"ws\"\\n' + \" const client = new RealtimeClient(url, {\\n\" + \" ...options,\\n\" + \" transport: ws\\n\" + \" })\");\n }\n throw new Error(\"WebSocket not available: \".concat(errorMessage));\n }\n }\n this._setupConnectionHandlers();\n }\n /**\n * Returns the URL of the websocket.\n * @returns string The URL of the websocket.\n */ endpointURL() {\n return this._appendParams(this.endPoint, Object.assign({}, this.params, {\n vsn: this.vsn\n }));\n }\n /**\n * Disconnects the socket.\n *\n * @param code A numeric status code to send on disconnect.\n * @param reason A custom reason for the disconnect.\n */ disconnect(code, reason) {\n if (this.isDisconnecting()) {\n return;\n }\n this._setConnectionState(\"disconnecting\", true);\n if (this.conn) {\n // Setup fallback timer to prevent hanging in disconnecting state\n const fallbackTimer = setTimeout(()=>{\n this._setConnectionState(\"disconnected\");\n }, 100);\n this.conn.onclose = ()=>{\n clearTimeout(fallbackTimer);\n this._setConnectionState(\"disconnected\");\n };\n // Close the WebSocket connection if close method exists\n if (typeof this.conn.close === \"function\") {\n if (code) {\n this.conn.close(code, reason !== null && reason !== void 0 ? reason : \"\");\n } else {\n this.conn.close();\n }\n }\n this._teardownConnection();\n } else {\n this._setConnectionState(\"disconnected\");\n }\n }\n /**\n * Returns all created channels\n */ getChannels() {\n return this.channels;\n }\n /**\n * Unsubscribes and removes a single channel\n * @param channel A RealtimeChannel instance\n */ async removeChannel(channel) {\n const status = await channel.unsubscribe();\n if (this.channels.length === 0) {\n this.disconnect();\n }\n return status;\n }\n /**\n * Unsubscribes and removes all channels\n */ async removeAllChannels() {\n const values_1 = await Promise.all(this.channels.map((channel)=>channel.unsubscribe()));\n this.channels = [];\n this.disconnect();\n return values_1;\n }\n /**\n * Logs the message.\n *\n * For customized logging, `this.logger` can be overridden.\n */ log(kind, msg, data) {\n this.logger(kind, msg, data);\n }\n /**\n * Returns the current state of the socket.\n */ connectionState() {\n switch(this.conn && this.conn.readyState){\n case _lib_constants__WEBPACK_IMPORTED_MODULE_1__.SOCKET_STATES.connecting:\n return _lib_constants__WEBPACK_IMPORTED_MODULE_1__.CONNECTION_STATE.Connecting;\n case _lib_constants__WEBPACK_IMPORTED_MODULE_1__.SOCKET_STATES.open:\n return _lib_constants__WEBPACK_IMPORTED_MODULE_1__.CONNECTION_STATE.Open;\n case _lib_constants__WEBPACK_IMPORTED_MODULE_1__.SOCKET_STATES.closing:\n return _lib_constants__WEBPACK_IMPORTED_MODULE_1__.CONNECTION_STATE.Closing;\n default:\n return _lib_constants__WEBPACK_IMPORTED_MODULE_1__.CONNECTION_STATE.Closed;\n }\n }\n /**\n * Returns `true` is the connection is open.\n */ isConnected() {\n return this.connectionState() === _lib_constants__WEBPACK_IMPORTED_MODULE_1__.CONNECTION_STATE.Open;\n }\n /**\n * Returns `true` if the connection is currently connecting.\n */ isConnecting() {\n return this._connectionState === \"connecting\";\n }\n /**\n * Returns `true` if the connection is currently disconnecting.\n */ isDisconnecting() {\n return this._connectionState === \"disconnecting\";\n }\n /**\n * Creates (or reuses) a {@link RealtimeChannel} for the provided topic.\n *\n * Topics are automatically prefixed with `realtime:` to match the Realtime service.\n * If a channel with the same topic already exists it will be returned instead of creating\n * a duplicate connection.\n */ channel(topic) {\n let params = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {\n config: {}\n };\n const realtimeTopic = \"realtime:\".concat(topic);\n const exists = this.getChannels().find((c)=>c.topic === realtimeTopic);\n if (!exists) {\n const chan = new _RealtimeChannel__WEBPACK_IMPORTED_MODULE_5__[\"default\"](\"realtime:\".concat(topic), params, this);\n this.channels.push(chan);\n return chan;\n } else {\n return exists;\n }\n }\n /**\n * Push out a message if the socket is connected.\n *\n * If the socket is not connected, the message gets enqueued within a local buffer, and sent out when a connection is next established.\n */ push(data) {\n const { topic, event, payload, ref } = data;\n const callback = ()=>{\n this.encode(data, (result)=>{\n var _a;\n (_a = this.conn) === null || _a === void 0 ? void 0 : _a.send(result);\n });\n };\n this.log(\"push\", \"\".concat(topic, \" \").concat(event, \" (\").concat(ref, \")\"), payload);\n if (this.isConnected()) {\n callback();\n } else {\n this.sendBuffer.push(callback);\n }\n }\n /**\n * Sets the JWT access token used for channel subscription authorization and Realtime RLS.\n *\n * If param is null it will use the `accessToken` callback function or the token set on the client.\n *\n * On callback used, it will set the value of the token internal to the client.\n *\n * When a token is explicitly provided, it will be preserved across channel operations\n * (including removeChannel and resubscribe). The `accessToken` callback will not be\n * invoked until `setAuth()` is called without arguments.\n *\n * @param token A JWT string to override the token set on the client.\n *\n * @example\n * // Use a manual token (preserved across resubscribes, ignores accessToken callback)\n * client.realtime.setAuth('my-custom-jwt')\n *\n * // Switch back to using the accessToken callback\n * client.realtime.setAuth()\n */ async setAuth() {\n let token = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null;\n this._authPromise = this._performAuth(token);\n try {\n await this._authPromise;\n } finally{\n this._authPromise = null;\n }\n }\n /**\n * Returns true if the current access token was explicitly set via setAuth(token),\n * false if it was obtained via the accessToken callback.\n * @internal\n */ _isManualToken() {\n return this._manuallySetToken;\n }\n /**\n * Sends a heartbeat message if the socket is connected.\n */ async sendHeartbeat() {\n var _a;\n if (!this.isConnected()) {\n try {\n this.heartbeatCallback(\"disconnected\");\n } catch (e) {\n this.log(\"error\", \"error in heartbeat callback\", e);\n }\n return;\n }\n // Handle heartbeat timeout and force reconnection if needed\n if (this.pendingHeartbeatRef) {\n this.pendingHeartbeatRef = null;\n this.log(\"transport\", \"heartbeat timeout. Attempting to re-establish connection\");\n try {\n this.heartbeatCallback(\"timeout\");\n } catch (e) {\n this.log(\"error\", \"error in heartbeat callback\", e);\n }\n // Force reconnection after heartbeat timeout\n this._wasManualDisconnect = false;\n (_a = this.conn) === null || _a === void 0 ? void 0 : _a.close(_lib_constants__WEBPACK_IMPORTED_MODULE_1__.WS_CLOSE_NORMAL, \"heartbeat timeout\");\n setTimeout(()=>{\n var _a;\n if (!this.isConnected()) {\n (_a = this.reconnectTimer) === null || _a === void 0 ? void 0 : _a.scheduleTimeout();\n }\n }, CONNECTION_TIMEOUTS.HEARTBEAT_TIMEOUT_FALLBACK);\n return;\n }\n // Send heartbeat message to server\n this.pendingHeartbeatRef = this._makeRef();\n this.push({\n topic: \"phoenix\",\n event: \"heartbeat\",\n payload: {},\n ref: this.pendingHeartbeatRef\n });\n try {\n this.heartbeatCallback(\"sent\");\n } catch (e) {\n this.log(\"error\", \"error in heartbeat callback\", e);\n }\n this._setAuthSafely(\"heartbeat\");\n }\n /**\n * Sets a callback that receives lifecycle events for internal heartbeat messages.\n * Useful for instrumenting connection health (e.g. sent/ok/timeout/disconnected).\n */ onHeartbeat(callback) {\n this.heartbeatCallback = callback;\n }\n /**\n * Flushes send buffer\n */ flushSendBuffer() {\n if (this.isConnected() && this.sendBuffer.length > 0) {\n this.sendBuffer.forEach((callback)=>callback());\n this.sendBuffer = [];\n }\n }\n /**\n * Return the next message ref, accounting for overflows\n *\n * @internal\n */ _makeRef() {\n let newRef = this.ref + 1;\n if (newRef === this.ref) {\n this.ref = 0;\n } else {\n this.ref = newRef;\n }\n return this.ref.toString();\n }\n /**\n * Unsubscribe from channels with the specified topic.\n *\n * @internal\n */ _leaveOpenTopic(topic) {\n let dupChannel = this.channels.find((c)=>c.topic === topic && (c._isJoined() || c._isJoining()));\n if (dupChannel) {\n this.log(\"transport\", 'leaving duplicate topic \"'.concat(topic, '\"'));\n dupChannel.unsubscribe();\n }\n }\n /**\n * Removes a subscription from the socket.\n *\n * @param channel An open subscription.\n *\n * @internal\n */ _remove(channel) {\n this.channels = this.channels.filter((c)=>c.topic !== channel.topic);\n }\n /** @internal */ _onConnMessage(rawMessage) {\n this.decode(rawMessage.data, (msg)=>{\n // Handle heartbeat responses\n if (msg.topic === \"phoenix\" && msg.event === \"phx_reply\") {\n try {\n this.heartbeatCallback(msg.payload.status === \"ok\" ? \"ok\" : \"error\");\n } catch (e) {\n this.log(\"error\", \"error in heartbeat callback\", e);\n }\n }\n // Handle pending heartbeat reference cleanup\n if (msg.ref && msg.ref === this.pendingHeartbeatRef) {\n this.pendingHeartbeatRef = null;\n }\n // Log incoming message\n const { topic, event, payload, ref } = msg;\n const refString = ref ? \"(\".concat(ref, \")\") : \"\";\n const status = payload.status || \"\";\n this.log(\"receive\", \"\".concat(status, \" \").concat(topic, \" \").concat(event, \" \").concat(refString).trim(), payload);\n // Route message to appropriate channels\n this.channels.filter((channel)=>channel._isMember(topic)).forEach((channel)=>channel._trigger(event, payload, ref));\n this._triggerStateCallbacks(\"message\", msg);\n });\n }\n /**\n * Clear specific timer\n * @internal\n */ _clearTimer(timer) {\n var _a;\n if (timer === \"heartbeat\" && this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = undefined;\n } else if (timer === \"reconnect\") {\n (_a = this.reconnectTimer) === null || _a === void 0 ? void 0 : _a.reset();\n }\n }\n /**\n * Clear all timers\n * @internal\n */ _clearAllTimers() {\n this._clearTimer(\"heartbeat\");\n this._clearTimer(\"reconnect\");\n }\n /**\n * Setup connection handlers for WebSocket events\n * @internal\n */ _setupConnectionHandlers() {\n if (!this.conn) return;\n // Set binary type if supported (browsers and most WebSocket implementations)\n if (\"binaryType\" in this.conn) {\n ;\n this.conn.binaryType = \"arraybuffer\";\n }\n this.conn.onopen = ()=>this._onConnOpen();\n this.conn.onerror = (error)=>this._onConnError(error);\n this.conn.onmessage = (event)=>this._onConnMessage(event);\n this.conn.onclose = (event)=>this._onConnClose(event);\n if (this.conn.readyState === _lib_constants__WEBPACK_IMPORTED_MODULE_1__.SOCKET_STATES.open) {\n this._onConnOpen();\n }\n }\n /**\n * Teardown connection and cleanup resources\n * @internal\n */ _teardownConnection() {\n if (this.conn) {\n if (this.conn.readyState === _lib_constants__WEBPACK_IMPORTED_MODULE_1__.SOCKET_STATES.open || this.conn.readyState === _lib_constants__WEBPACK_IMPORTED_MODULE_1__.SOCKET_STATES.connecting) {\n try {\n this.conn.close();\n } catch (e) {\n this.log(\"error\", \"Error closing connection\", e);\n }\n }\n this.conn.onopen = null;\n this.conn.onerror = null;\n this.conn.onmessage = null;\n this.conn.onclose = null;\n this.conn = null;\n }\n this._clearAllTimers();\n this._terminateWorker();\n this.channels.forEach((channel)=>channel.teardown());\n }\n /** @internal */ _onConnOpen() {\n this._setConnectionState(\"connected\");\n this.log(\"transport\", \"connected to \".concat(this.endpointURL()));\n // Wait for any pending auth operations before flushing send buffer\n // This ensures channel join messages include the correct access token\n const authPromise = this._authPromise || (this.accessToken && !this.accessTokenValue ? this.setAuth() : Promise.resolve());\n authPromise.then(()=>{\n this.flushSendBuffer();\n }).catch((e)=>{\n this.log(\"error\", \"error waiting for auth on connect\", e);\n // Proceed anyway to avoid hanging connections\n this.flushSendBuffer();\n });\n this._clearTimer(\"reconnect\");\n if (!this.worker) {\n this._startHeartbeat();\n } else {\n if (!this.workerRef) {\n this._startWorkerHeartbeat();\n }\n }\n this._triggerStateCallbacks(\"open\");\n }\n /** @internal */ _startHeartbeat() {\n this.heartbeatTimer && clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = setInterval(()=>this.sendHeartbeat(), this.heartbeatIntervalMs);\n }\n /** @internal */ _startWorkerHeartbeat() {\n if (this.workerUrl) {\n this.log(\"worker\", \"starting worker for from \".concat(this.workerUrl));\n } else {\n this.log(\"worker\", \"starting default worker\");\n }\n const objectUrl = this._workerObjectUrl(this.workerUrl);\n this.workerRef = new Worker(objectUrl);\n this.workerRef.onerror = (error)=>{\n this.log(\"worker\", \"worker error\", error.message);\n this._terminateWorker();\n };\n this.workerRef.onmessage = (event)=>{\n if (event.data.event === \"keepAlive\") {\n this.sendHeartbeat();\n }\n };\n this.workerRef.postMessage({\n event: \"start\",\n interval: this.heartbeatIntervalMs\n });\n }\n /**\n * Terminate the Web Worker and clear the reference\n * @internal\n */ _terminateWorker() {\n if (this.workerRef) {\n this.log(\"worker\", \"terminating worker\");\n this.workerRef.terminate();\n this.workerRef = undefined;\n }\n }\n /** @internal */ _onConnClose(event) {\n var _a;\n this._setConnectionState(\"disconnected\");\n this.log(\"transport\", \"close\", event);\n this._triggerChanError();\n this._clearTimer(\"heartbeat\");\n // Only schedule reconnection if it wasn't a manual disconnect\n if (!this._wasManualDisconnect) {\n (_a = this.reconnectTimer) === null || _a === void 0 ? void 0 : _a.scheduleTimeout();\n }\n this._triggerStateCallbacks(\"close\", event);\n }\n /** @internal */ _onConnError(error) {\n this._setConnectionState(\"disconnected\");\n this.log(\"transport\", \"\".concat(error));\n this._triggerChanError();\n this._triggerStateCallbacks(\"error\", error);\n }\n /** @internal */ _triggerChanError() {\n this.channels.forEach((channel)=>channel._trigger(_lib_constants__WEBPACK_IMPORTED_MODULE_1__.CHANNEL_EVENTS.error));\n }\n /** @internal */ _appendParams(url, params) {\n if (Object.keys(params).length === 0) {\n return url;\n }\n const prefix = url.match(/\\?/) ? \"&\" : \"?\";\n const query = new URLSearchParams(params);\n return \"\".concat(url).concat(prefix).concat(query);\n }\n _workerObjectUrl(url) {\n let result_url;\n if (url) {\n result_url = url;\n } else {\n const blob = new Blob([\n WORKER_SCRIPT\n ], {\n type: \"application/javascript\"\n });\n result_url = URL.createObjectURL(blob);\n }\n return result_url;\n }\n /**\n * Set connection state with proper state management\n * @internal\n */ _setConnectionState(state) {\n let manual = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;\n this._connectionState = state;\n if (state === \"connecting\") {\n this._wasManualDisconnect = false;\n } else if (state === \"disconnecting\") {\n this._wasManualDisconnect = manual;\n }\n }\n /**\n * Perform the actual auth operation\n * @internal\n */ async _performAuth() {\n let token = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null;\n let tokenToSend;\n let isManualToken = false;\n if (token) {\n tokenToSend = token;\n // Track if this is a manually-provided token\n isManualToken = true;\n } else if (this.accessToken) {\n // Call the accessToken callback to get fresh token\n try {\n tokenToSend = await this.accessToken();\n } catch (e) {\n this.log(\"error\", \"Error fetching access token from callback\", e);\n // Fall back to cached value if callback fails\n tokenToSend = this.accessTokenValue;\n }\n } else {\n tokenToSend = this.accessTokenValue;\n }\n // Track whether this token was manually set or fetched via callback\n if (isManualToken) {\n this._manuallySetToken = true;\n } else if (this.accessToken) {\n // If we used the callback, clear the manual flag\n this._manuallySetToken = false;\n }\n if (this.accessTokenValue != tokenToSend) {\n this.accessTokenValue = tokenToSend;\n this.channels.forEach((channel)=>{\n const payload = {\n access_token: tokenToSend,\n version: _lib_constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_VERSION\n };\n tokenToSend && channel.updateJoinPayload(payload);\n if (channel.joinedOnce && channel._isJoined()) {\n channel._push(_lib_constants__WEBPACK_IMPORTED_MODULE_1__.CHANNEL_EVENTS.access_token, {\n access_token: tokenToSend\n });\n }\n });\n }\n }\n /**\n * Wait for any in-flight auth operations to complete\n * @internal\n */ async _waitForAuthIfNeeded() {\n if (this._authPromise) {\n await this._authPromise;\n }\n }\n /**\n * Safely call setAuth with standardized error handling\n * @internal\n */ _setAuthSafely() {\n let context = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : \"general\";\n // Only refresh auth if using callback-based tokens\n if (!this._isManualToken()) {\n this.setAuth().catch((e)=>{\n this.log(\"error\", \"Error setting auth in \".concat(context), e);\n });\n }\n }\n /**\n * Trigger state change callbacks with proper error handling\n * @internal\n */ _triggerStateCallbacks(event, data) {\n try {\n this.stateChangeCallbacks[event].forEach((callback)=>{\n try {\n callback(data);\n } catch (e) {\n this.log(\"error\", \"error in \".concat(event, \" callback\"), e);\n }\n });\n } catch (e) {\n this.log(\"error\", \"error triggering \".concat(event, \" callbacks\"), e);\n }\n }\n /**\n * Setup reconnection timer with proper configuration\n * @internal\n */ _setupReconnectionTimer() {\n this.reconnectTimer = new _lib_timer__WEBPACK_IMPORTED_MODULE_3__[\"default\"](async ()=>{\n setTimeout(async ()=>{\n await this._waitForAuthIfNeeded();\n if (!this.isConnected()) {\n this.connect();\n }\n }, CONNECTION_TIMEOUTS.RECONNECT_DELAY);\n }, this.reconnectAfterMs);\n }\n /**\n * Initialize client options with defaults\n * @internal\n */ _initializeOptions(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;\n // Set defaults\n this.transport = (_a = options === null || options === void 0 ? void 0 : options.transport) !== null && _a !== void 0 ? _a : null;\n this.timeout = (_b = options === null || options === void 0 ? void 0 : options.timeout) !== null && _b !== void 0 ? _b : _lib_constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_TIMEOUT;\n this.heartbeatIntervalMs = (_c = options === null || options === void 0 ? void 0 : options.heartbeatIntervalMs) !== null && _c !== void 0 ? _c : CONNECTION_TIMEOUTS.HEARTBEAT_INTERVAL;\n this.worker = (_d = options === null || options === void 0 ? void 0 : options.worker) !== null && _d !== void 0 ? _d : false;\n this.accessToken = (_e = options === null || options === void 0 ? void 0 : options.accessToken) !== null && _e !== void 0 ? _e : null;\n this.heartbeatCallback = (_f = options === null || options === void 0 ? void 0 : options.heartbeatCallback) !== null && _f !== void 0 ? _f : noop;\n this.vsn = (_g = options === null || options === void 0 ? void 0 : options.vsn) !== null && _g !== void 0 ? _g : _lib_constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_VSN;\n // Handle special cases\n if (options === null || options === void 0 ? void 0 : options.params) this.params = options.params;\n if (options === null || options === void 0 ? void 0 : options.logger) this.logger = options.logger;\n if ((options === null || options === void 0 ? void 0 : options.logLevel) || (options === null || options === void 0 ? void 0 : options.log_level)) {\n this.logLevel = options.logLevel || options.log_level;\n this.params = Object.assign(Object.assign({}, this.params), {\n log_level: this.logLevel\n });\n }\n // Set up functions with defaults\n this.reconnectAfterMs = (_h = options === null || options === void 0 ? void 0 : options.reconnectAfterMs) !== null && _h !== void 0 ? _h : (tries)=>{\n return RECONNECT_INTERVALS[tries - 1] || DEFAULT_RECONNECT_FALLBACK;\n };\n switch(this.vsn){\n case _lib_constants__WEBPACK_IMPORTED_MODULE_1__.VSN_1_0_0:\n this.encode = (_j = options === null || options === void 0 ? void 0 : options.encode) !== null && _j !== void 0 ? _j : (payload, callback)=>{\n return callback(JSON.stringify(payload));\n };\n this.decode = (_k = options === null || options === void 0 ? void 0 : options.decode) !== null && _k !== void 0 ? _k : (payload, callback)=>{\n return callback(JSON.parse(payload));\n };\n break;\n case _lib_constants__WEBPACK_IMPORTED_MODULE_1__.VSN_2_0_0:\n this.encode = (_l = options === null || options === void 0 ? void 0 : options.encode) !== null && _l !== void 0 ? _l : this.serializer.encode.bind(this.serializer);\n this.decode = (_m = options === null || options === void 0 ? void 0 : options.decode) !== null && _m !== void 0 ? _m : this.serializer.decode.bind(this.serializer);\n break;\n default:\n throw new Error(\"Unsupported serializer version: \".concat(this.vsn));\n }\n // Handle worker setup\n if (this.worker) {\n if ( true && !window.Worker) {\n throw new Error(\"Web Worker is not supported\");\n }\n this.workerUrl = options === null || options === void 0 ? void 0 : options.workerUrl;\n }\n }\n /**\n * Initializes the Socket.\n *\n * @param endPoint The string WebSocket endpoint, ie, \"ws://example.com/socket\", \"wss://example.com\", \"/socket\" (inherited host & protocol)\n * @param httpEndpoint The string HTTP endpoint, ie, \"https://example.com\", \"/\" (inherited host & protocol)\n * @param options.transport The Websocket Transport, for example WebSocket. This can be a custom implementation\n * @param options.timeout The default timeout in milliseconds to trigger push timeouts.\n * @param options.params The optional params to pass when connecting.\n * @param options.headers Deprecated: headers cannot be set on websocket connections and this option will be removed in the future.\n * @param options.heartbeatIntervalMs The millisec interval to send a heartbeat message.\n * @param options.heartbeatCallback The optional function to handle heartbeat status.\n * @param options.logger The optional function for specialized logging, ie: logger: (kind, msg, data) => { console.log(`${kind}: ${msg}`, data) }\n * @param options.logLevel Sets the log level for Realtime\n * @param options.encode The function to encode outgoing messages. Defaults to JSON: (payload, callback) => callback(JSON.stringify(payload))\n * @param options.decode The function to decode incoming messages. Defaults to Serializer's decode.\n * @param options.reconnectAfterMs he optional function that returns the millsec reconnect interval. Defaults to stepped backoff off.\n * @param options.worker Use Web Worker to set a side flow. Defaults to false.\n * @param options.workerUrl The URL of the worker script. Defaults to https://realtime.supabase.com/worker.js that includes a heartbeat event call to keep the connection alive.\n * @example\n * ```ts\n * import RealtimeClient from '@supabase/realtime-js'\n *\n * const client = new RealtimeClient('https://xyzcompany.supabase.co/realtime/v1', {\n * params: { apikey: 'public-anon-key' },\n * })\n * client.connect()\n * ```\n */ constructor(endPoint, options){\n var _a;\n this.accessTokenValue = null;\n this.apiKey = null;\n this._manuallySetToken = false;\n this.channels = new Array();\n this.endPoint = \"\";\n this.httpEndpoint = \"\";\n /** @deprecated headers cannot be set on websocket connections */ this.headers = {};\n this.params = {};\n this.timeout = _lib_constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_TIMEOUT;\n this.transport = null;\n this.heartbeatIntervalMs = CONNECTION_TIMEOUTS.HEARTBEAT_INTERVAL;\n this.heartbeatTimer = undefined;\n this.pendingHeartbeatRef = null;\n this.heartbeatCallback = noop;\n this.ref = 0;\n this.reconnectTimer = null;\n this.vsn = _lib_constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_VSN;\n this.logger = noop;\n this.conn = null;\n this.sendBuffer = [];\n this.serializer = new _lib_serializer__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n this.stateChangeCallbacks = {\n open: [],\n close: [],\n error: [],\n message: []\n };\n this.accessToken = null;\n this._connectionState = \"disconnected\";\n this._wasManualDisconnect = false;\n this._authPromise = null;\n /**\n * Use either custom fetch, if provided, or default fetch to make HTTP requests\n *\n * @internal\n */ this._resolveFetch = (customFetch)=>{\n if (customFetch) {\n return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return customFetch(...args);\n };\n }\n return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return fetch(...args);\n };\n };\n // Validate required parameters\n if (!((_a = options === null || options === void 0 ? void 0 : options.params) === null || _a === void 0 ? void 0 : _a.apikey)) {\n throw new Error(\"API key is required to connect to Realtime\");\n }\n this.apiKey = options.params.apikey;\n // Initialize endpoint URLs\n this.endPoint = \"\".concat(endPoint, \"/\").concat(_lib_constants__WEBPACK_IMPORTED_MODULE_1__.TRANSPORTS.websocket);\n this.httpEndpoint = (0,_lib_transformers__WEBPACK_IMPORTED_MODULE_4__.httpEndpointURL)(endPoint);\n this._initializeOptions(options);\n this._setupReconnectionTimer();\n this.fetch = this._resolveFetch(options === null || options === void 0 ? void 0 : options.fetch);\n }\n} //# sourceMappingURL=RealtimeClient.js.map\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvUmVhbHRpbWVDbGllbnQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUF1RDtBQUM4SDtBQUMzSTtBQUNWO0FBQ3FCO0FBQ0w7QUFDaEQsTUFBTWUsT0FBTyxLQUFRO0FBQ3JCLCtCQUErQjtBQUMvQixNQUFNQyxzQkFBc0I7SUFDeEJDLG9CQUFvQjtJQUNwQkMsaUJBQWlCO0lBQ2pCQyw0QkFBNEI7QUFDaEM7QUFDQSxNQUFNQyxzQkFBc0I7SUFBQztJQUFNO0lBQU07SUFBTTtDQUFNO0FBQ3JELE1BQU1DLDZCQUE2QjtBQUNuQyxNQUFNQyxnQkFBaUI7QUFNUixNQUFNQztJQXNGakI7O0tBRUMsR0FDREMsVUFBVTtRQUNOLDBEQUEwRDtRQUMxRCxJQUFJLElBQUksQ0FBQ0MsWUFBWSxNQUNqQixJQUFJLENBQUNDLGVBQWUsTUFDbkIsSUFBSSxDQUFDQyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUNDLFdBQVcsSUFBSztZQUM1QztRQUNKO1FBQ0EsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQztRQUN6QixxREFBcUQ7UUFDckQsa0VBQWtFO1FBQ2xFLDhFQUE4RTtRQUM5RSxJQUFJLElBQUksQ0FBQ0MsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDQyxZQUFZLEVBQUU7WUFDeEMsSUFBSSxDQUFDQyxjQUFjLENBQUM7UUFDeEI7UUFDQSxpQ0FBaUM7UUFDakMsSUFBSSxJQUFJLENBQUNDLFNBQVMsRUFBRTtZQUNoQixtQ0FBbUM7WUFDbkMsSUFBSSxDQUFDTixJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUNNLFNBQVMsQ0FBQyxJQUFJLENBQUNDLFdBQVc7UUFDbkQsT0FDSztZQUNELDhCQUE4QjtZQUM5QixJQUFJO2dCQUNBLElBQUksQ0FBQ1AsSUFBSSxHQUFHM0IsOERBQWdCQSxDQUFDbUMsZUFBZSxDQUFDLElBQUksQ0FBQ0QsV0FBVztZQUNq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QztZQUNBLE9BQU87aURBQUlBO29CQUFBQTs7dUJBQVNDLFNBQVNEOztRQUNqQztRQUNBLCtCQUErQjtRQUMvQixJQUFJLENBQUUsRUFBQzlILEtBQUtpRyxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUXJKLE1BQU0sTUFBTSxRQUFRb0QsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHZ0ksTUFBTSxHQUFHO1lBQzNILE1BQU0sSUFBSTFMLE1BQU07UUFDcEI7UUFDQSxJQUFJLENBQUNrTCxNQUFNLEdBQUd2QixRQUFRckosTUFBTSxDQUFDb0wsTUFBTTtRQUNuQywyQkFBMkI7UUFDM0IsSUFBSSxDQUFDdkwsUUFBUSxHQUFHLEdBQWVyQyxPQUFacUMsVUFBUyxLQUF3QixPQUFyQnJDLHNEQUFVQSxDQUFDNk4sU0FBUztRQUNuRCxJQUFJLENBQUNQLFlBQVksR0FBRy9NLGtFQUFlQSxDQUFDOEI7UUFDcEMsSUFBSSxDQUFDdUosa0JBQWtCLENBQUNDO1FBQ3hCLElBQUksQ0FBQ0gsdUJBQXVCO1FBQzVCLElBQUksQ0FBQ2lDLEtBQUssR0FBRyxJQUFJLENBQUNILGFBQWEsQ0FBQzNCLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFROEIsS0FBSztJQUNuRztBQThzQkosRUFDQSwwQ0FBMEM7QUFEekMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9SZWFsdGltZUNsaWVudC5qcz82YjZkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBXZWJTb2NrZXRGYWN0b3J5IGZyb20gJy4vbGliL3dlYnNvY2tldC1mYWN0b3J5JztcbmltcG9ydCB7IENIQU5ORUxfRVZFTlRTLCBDT05ORUNUSU9OX1NUQVRFLCBERUZBVUxUX1ZFUlNJT04sIERFRkFVTFRfVElNRU9VVCwgU09DS0VUX1NUQVRFUywgVFJBTlNQT1JUUywgREVGQVVMVF9WU04sIFZTTl8xXzBfMCwgVlNOXzJfMF8wLCBXU19DTE9TRV9OT1JNQUwsIH0gZnJvbSAnLi9saWIvY29uc3RhbnRzJztcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gJy4vbGliL3NlcmlhbGl6ZXInO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4vbGliL3RpbWVyJztcbmltcG9ydCB7IGh0dHBFbmRwb2ludFVSTCB9IGZyb20gJy4vbGliL3RyYW5zZm9ybWVycyc7XG5pbXBvcnQgUmVhbHRpbWVDaGFubmVsIGZyb20gJy4vUmVhbHRpbWVDaGFubmVsJztcbmNvbnN0IG5vb3AgPSAoKSA9PiB7IH07XG4vLyBDb25uZWN0aW9uLXJlbGF0ZWQgY29uc3RhbnRzXG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVRTID0ge1xuICAgIEhFQVJUQkVBVF9JTlRFUlZBTDogMjUwMDAsXG4gICAgUkVDT05ORUNUX0RFTEFZOiAxMCxcbiAgICBIRUFSVEJFQVRfVElNRU9VVF9GQUxMQkFDSzogMTAwLFxufTtcbmNvbnN0IFJFQ09OTkVDVF9JTlRFUlZBTFMgPSBbMTAwMCwgMjAwMCwgNTAwMCwgMTAwMDBdO1xuY29uc3QgREVGQVVMVF9SRUNPTk5FQ1RfRkFMTEJBQ0sgPSAxMDAwMDtcbmNvbnN0IFdPUktFUl9TQ1JJUFQgPSBgXG4gIGFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChlKSA9PiB7XG4gICAgaWYgKGUuZGF0YS5ldmVudCA9PT0gXCJzdGFydFwiKSB7XG4gICAgICBzZXRJbnRlcnZhbCgoKSA9PiBwb3N0TWVzc2FnZSh7IGV2ZW50OiBcImtlZXBBbGl2ZVwiIH0pLCBlLmRhdGEuaW50ZXJ2YWwpO1xuICAgIH1cbiAgfSk7YDtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlYWx0aW1lQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgU29ja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVuZFBvaW50IFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgXCJ3czovL2V4YW1wbGUuY29tL3NvY2tldFwiLCBcIndzczovL2V4YW1wbGUuY29tXCIsIFwiL3NvY2tldFwiIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICAgICAqIEBwYXJhbSBodHRwRW5kcG9pbnQgVGhlIHN0cmluZyBIVFRQIGVuZHBvaW50LCBpZSwgXCJodHRwczovL2V4YW1wbGUuY29tXCIsIFwiL1wiIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICAgICAqIEBwYXJhbSBvcHRpb25zLnRyYW5zcG9ydCBUaGUgV2Vic29ja2V0IFRyYW5zcG9ydCwgZm9yIGV4YW1wbGUgV2ViU29ja2V0LiBUaGlzIGNhbiBiZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zLnRpbWVvdXQgVGhlIGRlZmF1bHQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gdHJpZ2dlciBwdXNoIHRpbWVvdXRzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLnBhcmFtcyBUaGUgb3B0aW9uYWwgcGFyYW1zIHRvIHBhc3Mgd2hlbiBjb25uZWN0aW5nLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLmhlYWRlcnMgRGVwcmVjYXRlZDogaGVhZGVycyBjYW5ub3QgYmUgc2V0IG9uIHdlYnNvY2tldCBjb25uZWN0aW9ucyBhbmQgdGhpcyBvcHRpb24gd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMuaGVhcnRiZWF0SW50ZXJ2YWxNcyBUaGUgbWlsbGlzZWMgaW50ZXJ2YWwgdG8gc2VuZCBhIGhlYXJ0YmVhdCBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLmhlYXJ0YmVhdENhbGxiYWNrIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0byBoYW5kbGUgaGVhcnRiZWF0IHN0YXR1cy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5sb2dnZXIgVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBzcGVjaWFsaXplZCBsb2dnaW5nLCBpZTogbG9nZ2VyOiAoa2luZCwgbXNnLCBkYXRhKSA9PiB7IGNvbnNvbGUubG9nKGAke2tpbmR9OiAke21zZ31gLCBkYXRhKSB9XG4gICAgICogQHBhcmFtIG9wdGlvbnMubG9nTGV2ZWwgU2V0cyB0aGUgbG9nIGxldmVsIGZvciBSZWFsdGltZVxuICAgICAqIEBwYXJhbSBvcHRpb25zLmVuY29kZSBUaGUgZnVuY3Rpb24gdG8gZW5jb2RlIG91dGdvaW5nIG1lc3NhZ2VzLiBEZWZhdWx0cyB0byBKU09OOiAocGF5bG9hZCwgY2FsbGJhY2spID0+IGNhbGxiYWNrKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKVxuICAgICAqIEBwYXJhbSBvcHRpb25zLmRlY29kZSBUaGUgZnVuY3Rpb24gdG8gZGVjb2RlIGluY29taW5nIG1lc3NhZ2VzLiBEZWZhdWx0cyB0byBTZXJpYWxpemVyJ3MgZGVjb2RlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLnJlY29ubmVjdEFmdGVyTXMgaGUgb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtaWxsc2VjIHJlY29ubmVjdCBpbnRlcnZhbC4gRGVmYXVsdHMgdG8gc3RlcHBlZCBiYWNrb2ZmIG9mZi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy53b3JrZXIgVXNlIFdlYiBXb3JrZXIgdG8gc2V0IGEgc2lkZSBmbG93LiBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy53b3JrZXJVcmwgVGhlIFVSTCBvZiB0aGUgd29ya2VyIHNjcmlwdC4gRGVmYXVsdHMgdG8gaHR0cHM6Ly9yZWFsdGltZS5zdXBhYmFzZS5jb20vd29ya2VyLmpzIHRoYXQgaW5jbHVkZXMgYSBoZWFydGJlYXQgZXZlbnQgY2FsbCB0byBrZWVwIHRoZSBjb25uZWN0aW9uIGFsaXZlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgUmVhbHRpbWVDbGllbnQgZnJvbSAnQHN1cGFiYXNlL3JlYWx0aW1lLWpzJ1xuICAgICAqXG4gICAgICogY29uc3QgY2xpZW50ID0gbmV3IFJlYWx0aW1lQ2xpZW50KCdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vcmVhbHRpbWUvdjEnLCB7XG4gICAgICogICBwYXJhbXM6IHsgYXBpa2V5OiAncHVibGljLWFub24ta2V5JyB9LFxuICAgICAqIH0pXG4gICAgICogY2xpZW50LmNvbm5lY3QoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlblZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5hcGlLZXkgPSBudWxsO1xuICAgICAgICB0aGlzLl9tYW51YWxseVNldFRva2VuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhbm5lbHMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgdGhpcy5lbmRQb2ludCA9ICcnO1xuICAgICAgICB0aGlzLmh0dHBFbmRwb2ludCA9ICcnO1xuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgaGVhZGVycyBjYW5ub3QgYmUgc2V0IG9uIHdlYnNvY2tldCBjb25uZWN0aW9ucyAqL1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5wYXJhbXMgPSB7fTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUO1xuICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IG51bGw7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcyA9IENPTk5FQ1RJT05fVElNRU9VVFMuSEVBUlRCRUFUX0lOVEVSVkFMO1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgPSBudWxsO1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdENhbGxiYWNrID0gbm9vcDtcbiAgICAgICAgdGhpcy5yZWYgPSAwO1xuICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbDtcbiAgICAgICAgdGhpcy52c24gPSBERUZBVUxUX1ZTTjtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBub29wO1xuICAgICAgICB0aGlzLmNvbm4gPSBudWxsO1xuICAgICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXIoKTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcyA9IHtcbiAgICAgICAgICAgIG9wZW46IFtdLFxuICAgICAgICAgICAgY2xvc2U6IFtdLFxuICAgICAgICAgICAgZXJyb3I6IFtdLFxuICAgICAgICAgICAgbWVzc2FnZTogW10sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBudWxsO1xuICAgICAgICB0aGlzLl9jb25uZWN0aW9uU3RhdGUgPSAnZGlzY29ubmVjdGVkJztcbiAgICAgICAgdGhpcy5fd2FzTWFudWFsRGlzY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hdXRoUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgZWl0aGVyIGN1c3RvbSBmZXRjaCwgaWYgcHJvdmlkZWQsIG9yIGRlZmF1bHQgZmV0Y2ggdG8gbWFrZSBIVFRQIHJlcXVlc3RzXG4gICAgICAgICAqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcmVzb2x2ZUZldGNoID0gKGN1c3RvbUZldGNoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY3VzdG9tRmV0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IGN1c3RvbUZldGNoKC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiBmZXRjaCguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgcGFyYW1ldGVyc1xuICAgICAgICBpZiAoISgoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucGFyYW1zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXBpa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBUEkga2V5IGlzIHJlcXVpcmVkIHRvIGNvbm5lY3QgdG8gUmVhbHRpbWUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwaUtleSA9IG9wdGlvbnMucGFyYW1zLmFwaWtleTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBlbmRwb2ludCBVUkxzXG4gICAgICAgIHRoaXMuZW5kUG9pbnQgPSBgJHtlbmRQb2ludH0vJHtUUkFOU1BPUlRTLndlYnNvY2tldH1gO1xuICAgICAgICB0aGlzLmh0dHBFbmRwb2ludCA9IGh0dHBFbmRwb2ludFVSTChlbmRQb2ludCk7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9zZXR1cFJlY29ubmVjdGlvblRpbWVyKCk7XG4gICAgICAgIHRoaXMuZmV0Y2ggPSB0aGlzLl9yZXNvbHZlRmV0Y2gob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZldGNoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29ubmVjdHMgdGhlIHNvY2tldCwgdW5sZXNzIGFscmVhZHkgY29ubmVjdGVkLlxuICAgICAqL1xuICAgIGNvbm5lY3QoKSB7XG4gICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBjb25uZWN0aW5nLCBkaXNjb25uZWN0aW5nLCBvciBjb25uZWN0ZWRcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0aW5nKCkgfHxcbiAgICAgICAgICAgIHRoaXMuaXNEaXNjb25uZWN0aW5nKCkgfHxcbiAgICAgICAgICAgICh0aGlzLmNvbm4gIT09IG51bGwgJiYgdGhpcy5pc0Nvbm5lY3RlZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnY29ubmVjdGluZycpO1xuICAgICAgICAvLyBUcmlnZ2VyIGF1dGggaWYgbmVlZGVkIGFuZCBub3QgYWxyZWFkeSBpbiBwcm9ncmVzc1xuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgYXV0aCBpcyBjYWxsZWQgZm9yIHN0YW5kYWxvbmUgUmVhbHRpbWVDbGllbnQgdXNhZ2VcbiAgICAgICAgLy8gd2hpbGUgYXZvaWRpbmcgcmFjZSBjb25kaXRpb25zIHdpdGggU3VwYWJhc2VDbGllbnQncyBpbW1lZGlhdGUgc2V0QXV0aCBjYWxsXG4gICAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuICYmICF0aGlzLl9hdXRoUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0QXV0aFNhZmVseSgnY29ubmVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVzdGFibGlzaCBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICBpZiAodGhpcy50cmFuc3BvcnQpIHtcbiAgICAgICAgICAgIC8vIFVzZSBjdXN0b20gdHJhbnNwb3J0IGlmIHByb3ZpZGVkXG4gICAgICAgICAgICB0aGlzLmNvbm4gPSBuZXcgdGhpcy50cmFuc3BvcnQodGhpcy5lbmRwb2ludFVSTCgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byB1c2UgbmF0aXZlIFdlYlNvY2tldFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm4gPSBXZWJTb2NrZXRGYWN0b3J5LmNyZWF0ZVdlYlNvY2tldCh0aGlzLmVuZHBvaW50VVJMKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIC8vIFByb3ZpZGUgaGVscGZ1bCBlcnJvciBtZXNzYWdlIGJhc2VkIG9uIGVudmlyb25tZW50XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnTm9kZS5qcycpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJvck1lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnVG8gdXNlIFJlYWx0aW1lIGluIE5vZGUuanMsIHlvdSBuZWVkIHRvIHByb3ZpZGUgYSBXZWJTb2NrZXQgaW1wbGVtZW50YXRpb246XFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnT3B0aW9uIDE6IFVzZSBOb2RlLmpzIDIyKyB3aGljaCBoYXMgbmF0aXZlIFdlYlNvY2tldCBzdXBwb3J0XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnT3B0aW9uIDI6IEluc3RhbGwgYW5kIHByb3ZpZGUgdGhlIFwid3NcIiBwYWNrYWdlOlxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgbnBtIGluc3RhbGwgd3NcXG5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgIGltcG9ydCB3cyBmcm9tIFwid3NcIlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgY29uc3QgY2xpZW50ID0gbmV3IFJlYWx0aW1lQ2xpZW50KHVybCwge1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAuLi5vcHRpb25zLFxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB0cmFuc3BvcnQ6IHdzXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICB9KScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdlYlNvY2tldCBub3QgYXZhaWxhYmxlOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXR1cENvbm5lY3Rpb25IYW5kbGVycygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBVUkwgb2YgdGhlIHdlYnNvY2tldC5cbiAgICAgKiBAcmV0dXJucyBzdHJpbmcgVGhlIFVSTCBvZiB0aGUgd2Vic29ja2V0LlxuICAgICAqL1xuICAgIGVuZHBvaW50VVJMKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwZW5kUGFyYW1zKHRoaXMuZW5kUG9pbnQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMucGFyYW1zLCB7IHZzbjogdGhpcy52c24gfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyB0aGUgc29ja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvZGUgQSBudW1lcmljIHN0YXR1cyBjb2RlIHRvIHNlbmQgb24gZGlzY29ubmVjdC5cbiAgICAgKiBAcGFyYW0gcmVhc29uIEEgY3VzdG9tIHJlYXNvbiBmb3IgdGhlIGRpc2Nvbm5lY3QuXG4gICAgICovXG4gICAgZGlzY29ubmVjdChjb2RlLCByZWFzb24pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXNjb25uZWN0aW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RpbmcnLCB0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuY29ubikge1xuICAgICAgICAgICAgLy8gU2V0dXAgZmFsbGJhY2sgdGltZXIgdG8gcHJldmVudCBoYW5naW5nIGluIGRpc2Nvbm5lY3Rpbmcgc3RhdGVcbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgIHRoaXMuY29ubi5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChmYWxsYmFja1RpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIENsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpZiBjbG9zZSBtZXRob2QgZXhpc3RzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29ubi5jbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubi5jbG9zZShjb2RlLCByZWFzb24gIT09IG51bGwgJiYgcmVhc29uICE9PSB2b2lkIDAgPyByZWFzb24gOiAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm4uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl90ZWFyZG93bkNvbm5lY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgY3JlYXRlZCBjaGFubmVsc1xuICAgICAqL1xuICAgIGdldENoYW5uZWxzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFubmVscztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5zdWJzY3JpYmVzIGFuZCByZW1vdmVzIGEgc2luZ2xlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBBIFJlYWx0aW1lQ2hhbm5lbCBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFzeW5jIHJlbW92ZUNoYW5uZWwoY2hhbm5lbCkge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBjaGFubmVsLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGlmICh0aGlzLmNoYW5uZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5zdWJzY3JpYmVzIGFuZCByZW1vdmVzIGFsbCBjaGFubmVsc1xuICAgICAqL1xuICAgIGFzeW5jIHJlbW92ZUFsbENoYW5uZWxzKCkge1xuICAgICAgICBjb25zdCB2YWx1ZXNfMSA9IGF3YWl0IFByb21pc2UuYWxsKHRoaXMuY2hhbm5lbHMubWFwKChjaGFubmVsKSA9PiBjaGFubmVsLnVuc3Vic2NyaWJlKCkpKTtcbiAgICAgICAgdGhpcy5jaGFubmVscyA9IFtdO1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlc18xO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2dzIHRoZSBtZXNzYWdlLlxuICAgICAqXG4gICAgICogRm9yIGN1c3RvbWl6ZWQgbG9nZ2luZywgYHRoaXMubG9nZ2VyYCBjYW4gYmUgb3ZlcnJpZGRlbi5cbiAgICAgKi9cbiAgICBsb2coa2luZCwgbXNnLCBkYXRhKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyKGtpbmQsIG1zZywgZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNvY2tldC5cbiAgICAgKi9cbiAgICBjb25uZWN0aW9uU3RhdGUoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5jb25uICYmIHRoaXMuY29ubi5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZzpcbiAgICAgICAgICAgICAgICByZXR1cm4gQ09OTkVDVElPTl9TVEFURS5Db25uZWN0aW5nO1xuICAgICAgICAgICAgY2FzZSBTT0NLRVRfU1RBVEVTLm9wZW46XG4gICAgICAgICAgICAgICAgcmV0dXJuIENPTk5FQ1RJT05fU1RBVEUuT3BlbjtcbiAgICAgICAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jbG9zaW5nOlxuICAgICAgICAgICAgICAgIHJldHVybiBDT05ORUNUSU9OX1NUQVRFLkNsb3Npbmc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBDT05ORUNUSU9OX1NUQVRFLkNsb3NlZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpcyB0aGUgY29ubmVjdGlvbiBpcyBvcGVuLlxuICAgICAqL1xuICAgIGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uU3RhdGUoKSA9PT0gQ09OTkVDVElPTl9TVEFURS5PcGVuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkgY29ubmVjdGluZy5cbiAgICAgKi9cbiAgICBpc0Nvbm5lY3RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uU3RhdGUgPT09ICdjb25uZWN0aW5nJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY3VycmVudGx5IGRpc2Nvbm5lY3RpbmcuXG4gICAgICovXG4gICAgaXNEaXNjb25uZWN0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvblN0YXRlID09PSAnZGlzY29ubmVjdGluZyc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgKG9yIHJldXNlcykgYSB7QGxpbmsgUmVhbHRpbWVDaGFubmVsfSBmb3IgdGhlIHByb3ZpZGVkIHRvcGljLlxuICAgICAqXG4gICAgICogVG9waWNzIGFyZSBhdXRvbWF0aWNhbGx5IHByZWZpeGVkIHdpdGggYHJlYWx0aW1lOmAgdG8gbWF0Y2ggdGhlIFJlYWx0aW1lIHNlcnZpY2UuXG4gICAgICogSWYgYSBjaGFubmVsIHdpdGggdGhlIHNhbWUgdG9waWMgYWxyZWFkeSBleGlzdHMgaXQgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mIGNyZWF0aW5nXG4gICAgICogYSBkdXBsaWNhdGUgY29ubmVjdGlvbi5cbiAgICAgKi9cbiAgICBjaGFubmVsKHRvcGljLCBwYXJhbXMgPSB7IGNvbmZpZzoge30gfSkge1xuICAgICAgICBjb25zdCByZWFsdGltZVRvcGljID0gYHJlYWx0aW1lOiR7dG9waWN9YDtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gdGhpcy5nZXRDaGFubmVscygpLmZpbmQoKGMpID0+IGMudG9waWMgPT09IHJlYWx0aW1lVG9waWMpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgY29uc3QgY2hhbiA9IG5ldyBSZWFsdGltZUNoYW5uZWwoYHJlYWx0aW1lOiR7dG9waWN9YCwgcGFyYW1zLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHMucHVzaChjaGFuKTtcbiAgICAgICAgICAgIHJldHVybiBjaGFuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0cztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQdXNoIG91dCBhIG1lc3NhZ2UgaWYgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc29ja2V0IGlzIG5vdCBjb25uZWN0ZWQsIHRoZSBtZXNzYWdlIGdldHMgZW5xdWV1ZWQgd2l0aGluIGEgbG9jYWwgYnVmZmVyLCBhbmQgc2VudCBvdXQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgbmV4dCBlc3RhYmxpc2hlZC5cbiAgICAgKi9cbiAgICBwdXNoKGRhdGEpIHtcbiAgICAgICAgY29uc3QgeyB0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiB9ID0gZGF0YTtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuY29kZShkYXRhLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIChfYSA9IHRoaXMuY29ubikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNlbmQocmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmxvZygncHVzaCcsIGAke3RvcGljfSAke2V2ZW50fSAoJHtyZWZ9KWAsIHBheWxvYWQpO1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZW5kQnVmZmVyLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIEpXVCBhY2Nlc3MgdG9rZW4gdXNlZCBmb3IgY2hhbm5lbCBzdWJzY3JpcHRpb24gYXV0aG9yaXphdGlvbiBhbmQgUmVhbHRpbWUgUkxTLlxuICAgICAqXG4gICAgICogSWYgcGFyYW0gaXMgbnVsbCBpdCB3aWxsIHVzZSB0aGUgYGFjY2Vzc1Rva2VuYCBjYWxsYmFjayBmdW5jdGlvbiBvciB0aGUgdG9rZW4gc2V0IG9uIHRoZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBPbiBjYWxsYmFjayB1c2VkLCBpdCB3aWxsIHNldCB0aGUgdmFsdWUgb2YgdGhlIHRva2VuIGludGVybmFsIHRvIHRoZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBXaGVuIGEgdG9rZW4gaXMgZXhwbGljaXRseSBwcm92aWRlZCwgaXQgd2lsbCBiZSBwcmVzZXJ2ZWQgYWNyb3NzIGNoYW5uZWwgb3BlcmF0aW9uc1xuICAgICAqIChpbmNsdWRpbmcgcmVtb3ZlQ2hhbm5lbCBhbmQgcmVzdWJzY3JpYmUpLiBUaGUgYGFjY2Vzc1Rva2VuYCBjYWxsYmFjayB3aWxsIG5vdCBiZVxuICAgICAqIGludm9rZWQgdW50aWwgYHNldEF1dGgoKWAgaXMgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRva2VuIEEgSldUIHN0cmluZyB0byBvdmVycmlkZSB0aGUgdG9rZW4gc2V0IG9uIHRoZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFVzZSBhIG1hbnVhbCB0b2tlbiAocHJlc2VydmVkIGFjcm9zcyByZXN1YnNjcmliZXMsIGlnbm9yZXMgYWNjZXNzVG9rZW4gY2FsbGJhY2spXG4gICAgICogY2xpZW50LnJlYWx0aW1lLnNldEF1dGgoJ215LWN1c3RvbS1qd3QnKVxuICAgICAqXG4gICAgICogLy8gU3dpdGNoIGJhY2sgdG8gdXNpbmcgdGhlIGFjY2Vzc1Rva2VuIGNhbGxiYWNrXG4gICAgICogY2xpZW50LnJlYWx0aW1lLnNldEF1dGgoKVxuICAgICAqL1xuICAgIGFzeW5jIHNldEF1dGgodG9rZW4gPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2F1dGhQcm9taXNlID0gdGhpcy5fcGVyZm9ybUF1dGgodG9rZW4pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fYXV0aFByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9hdXRoUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGFjY2VzcyB0b2tlbiB3YXMgZXhwbGljaXRseSBzZXQgdmlhIHNldEF1dGgodG9rZW4pLFxuICAgICAqIGZhbHNlIGlmIGl0IHdhcyBvYnRhaW5lZCB2aWEgdGhlIGFjY2Vzc1Rva2VuIGNhbGxiYWNrLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9pc01hbnVhbFRva2VuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFudWFsbHlTZXRUb2tlbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBoZWFydGJlYXQgbWVzc2FnZSBpZiB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZC5cbiAgICAgKi9cbiAgICBhc3luYyBzZW5kSGVhcnRiZWF0KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2soJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnZXJyb3IgaW4gaGVhcnRiZWF0IGNhbGxiYWNrJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlIGhlYXJ0YmVhdCB0aW1lb3V0IGFuZCBmb3JjZSByZWNvbm5lY3Rpb24gaWYgbmVlZGVkXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmxvZygndHJhbnNwb3J0JywgJ2hlYXJ0YmVhdCB0aW1lb3V0LiBBdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uJyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2soJ3RpbWVvdXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgJ2Vycm9yIGluIGhlYXJ0YmVhdCBjYWxsYmFjaycsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9yY2UgcmVjb25uZWN0aW9uIGFmdGVyIGhlYXJ0YmVhdCB0aW1lb3V0XG4gICAgICAgICAgICB0aGlzLl93YXNNYW51YWxEaXNjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAoX2EgPSB0aGlzLmNvbm4pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jbG9zZShXU19DTE9TRV9OT1JNQUwsICdoZWFydGJlYXQgdGltZW91dCcpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIChfYSA9IHRoaXMucmVjb25uZWN0VGltZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zY2hlZHVsZVRpbWVvdXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBDT05ORUNUSU9OX1RJTUVPVVRTLkhFQVJUQkVBVF9USU1FT1VUX0ZBTExCQUNLKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZW5kIGhlYXJ0YmVhdCBtZXNzYWdlIHRvIHNlcnZlclxuICAgICAgICB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgPSB0aGlzLl9tYWtlUmVmKCk7XG4gICAgICAgIHRoaXMucHVzaCh7XG4gICAgICAgICAgICB0b3BpYzogJ3Bob2VuaXgnLFxuICAgICAgICAgICAgZXZlbnQ6ICdoZWFydGJlYXQnLFxuICAgICAgICAgICAgcGF5bG9hZDoge30sXG4gICAgICAgICAgICByZWY6IHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdENhbGxiYWNrKCdzZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsICdlcnJvciBpbiBoZWFydGJlYXQgY2FsbGJhY2snLCBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXRBdXRoU2FmZWx5KCdoZWFydGJlYXQnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgcmVjZWl2ZXMgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgaW50ZXJuYWwgaGVhcnRiZWF0IG1lc3NhZ2VzLlxuICAgICAqIFVzZWZ1bCBmb3IgaW5zdHJ1bWVudGluZyBjb25uZWN0aW9uIGhlYWx0aCAoZS5nLiBzZW50L29rL3RpbWVvdXQvZGlzY29ubmVjdGVkKS5cbiAgICAgKi9cbiAgICBvbkhlYXJ0YmVhdChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZsdXNoZXMgc2VuZCBidWZmZXJcbiAgICAgKi9cbiAgICBmbHVzaFNlbmRCdWZmZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkgJiYgdGhpcy5zZW5kQnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEJ1ZmZlci5mb3JFYWNoKChjYWxsYmFjaykgPT4gY2FsbGJhY2soKSk7XG4gICAgICAgICAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG5leHQgbWVzc2FnZSByZWYsIGFjY291bnRpbmcgZm9yIG92ZXJmbG93c1xuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX21ha2VSZWYoKSB7XG4gICAgICAgIGxldCBuZXdSZWYgPSB0aGlzLnJlZiArIDE7XG4gICAgICAgIGlmIChuZXdSZWYgPT09IHRoaXMucmVmKSB7XG4gICAgICAgICAgICB0aGlzLnJlZiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlZiA9IG5ld1JlZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZWYudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5zdWJzY3JpYmUgZnJvbSBjaGFubmVscyB3aXRoIHRoZSBzcGVjaWZpZWQgdG9waWMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfbGVhdmVPcGVuVG9waWModG9waWMpIHtcbiAgICAgICAgbGV0IGR1cENoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmZpbmQoKGMpID0+IGMudG9waWMgPT09IHRvcGljICYmIChjLl9pc0pvaW5lZCgpIHx8IGMuX2lzSm9pbmluZygpKSk7XG4gICAgICAgIGlmIChkdXBDaGFubmVsKSB7XG4gICAgICAgICAgICB0aGlzLmxvZygndHJhbnNwb3J0JywgYGxlYXZpbmcgZHVwbGljYXRlIHRvcGljIFwiJHt0b3BpY31cImApO1xuICAgICAgICAgICAgZHVwQ2hhbm5lbC51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBzdWJzY3JpcHRpb24gZnJvbSB0aGUgc29ja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5uZWwgQW4gb3BlbiBzdWJzY3JpcHRpb24uXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfcmVtb3ZlKGNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5jaGFubmVscyA9IHRoaXMuY2hhbm5lbHMuZmlsdGVyKChjKSA9PiBjLnRvcGljICE9PSBjaGFubmVsLnRvcGljKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbkNvbm5NZXNzYWdlKHJhd01lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5kZWNvZGUocmF3TWVzc2FnZS5kYXRhLCAobXNnKSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgaGVhcnRiZWF0IHJlc3BvbnNlc1xuICAgICAgICAgICAgaWYgKG1zZy50b3BpYyA9PT0gJ3Bob2VuaXgnICYmIG1zZy5ldmVudCA9PT0gJ3BoeF9yZXBseScpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdENhbGxiYWNrKG1zZy5wYXlsb2FkLnN0YXR1cyA9PT0gJ29rJyA/ICdvaycgOiAnZXJyb3InKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgJ2Vycm9yIGluIGhlYXJ0YmVhdCBjYWxsYmFjaycsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhhbmRsZSBwZW5kaW5nIGhlYXJ0YmVhdCByZWZlcmVuY2UgY2xlYW51cFxuICAgICAgICAgICAgaWYgKG1zZy5yZWYgJiYgbXNnLnJlZiA9PT0gdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExvZyBpbmNvbWluZyBtZXNzYWdlXG4gICAgICAgICAgICBjb25zdCB7IHRvcGljLCBldmVudCwgcGF5bG9hZCwgcmVmIH0gPSBtc2c7XG4gICAgICAgICAgICBjb25zdCByZWZTdHJpbmcgPSByZWYgPyBgKCR7cmVmfSlgIDogJyc7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBwYXlsb2FkLnN0YXR1cyB8fCAnJztcbiAgICAgICAgICAgIHRoaXMubG9nKCdyZWNlaXZlJywgYCR7c3RhdHVzfSAke3RvcGljfSAke2V2ZW50fSAke3JlZlN0cmluZ31gLnRyaW0oKSwgcGF5bG9hZCk7XG4gICAgICAgICAgICAvLyBSb3V0ZSBtZXNzYWdlIHRvIGFwcHJvcHJpYXRlIGNoYW5uZWxzXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxzXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY2hhbm5lbCkgPT4gY2hhbm5lbC5faXNNZW1iZXIodG9waWMpKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChjaGFubmVsKSA9PiBjaGFubmVsLl90cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYpKTtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJTdGF0ZUNhbGxiYWNrcygnbWVzc2FnZScsIG1zZyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhciBzcGVjaWZpYyB0aW1lclxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9jbGVhclRpbWVyKHRpbWVyKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRpbWVyID09PSAnaGVhcnRiZWF0JyAmJiB0aGlzLmhlYXJ0YmVhdFRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnRiZWF0VGltZXIpO1xuICAgICAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aW1lciA9PT0gJ3JlY29ubmVjdCcpIHtcbiAgICAgICAgICAgIChfYSA9IHRoaXMucmVjb25uZWN0VGltZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXNldCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCB0aW1lcnNcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfY2xlYXJBbGxUaW1lcnMoKSB7XG4gICAgICAgIHRoaXMuX2NsZWFyVGltZXIoJ2hlYXJ0YmVhdCcpO1xuICAgICAgICB0aGlzLl9jbGVhclRpbWVyKCdyZWNvbm5lY3QnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0dXAgY29ubmVjdGlvbiBoYW5kbGVycyBmb3IgV2ViU29ja2V0IGV2ZW50c1xuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9zZXR1cENvbm5lY3Rpb25IYW5kbGVycygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIFNldCBiaW5hcnkgdHlwZSBpZiBzdXBwb3J0ZWQgKGJyb3dzZXJzIGFuZCBtb3N0IFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbnMpXG4gICAgICAgIGlmICgnYmluYXJ5VHlwZScgaW4gdGhpcy5jb25uKSB7XG4gICAgICAgICAgICA7XG4gICAgICAgICAgICB0aGlzLmNvbm4uYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25uLm9ub3BlbiA9ICgpID0+IHRoaXMuX29uQ29ubk9wZW4oKTtcbiAgICAgICAgdGhpcy5jb25uLm9uZXJyb3IgPSAoZXJyb3IpID0+IHRoaXMuX29uQ29ubkVycm9yKGVycm9yKTtcbiAgICAgICAgdGhpcy5jb25uLm9ubWVzc2FnZSA9IChldmVudCkgPT4gdGhpcy5fb25Db25uTWVzc2FnZShldmVudCk7XG4gICAgICAgIHRoaXMuY29ubi5vbmNsb3NlID0gKGV2ZW50KSA9PiB0aGlzLl9vbkNvbm5DbG9zZShldmVudCk7XG4gICAgICAgIGlmICh0aGlzLmNvbm4ucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5vcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNvbm5PcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVhcmRvd24gY29ubmVjdGlvbiBhbmQgY2xlYW51cCByZXNvdXJjZXNcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfdGVhcmRvd25Db25uZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5jb25uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uLnJlYWR5U3RhdGUgPT09IFNPQ0tFVF9TVEFURVMub3BlbiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuY29ubi5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLmNvbm5lY3RpbmcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm4uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgJ0Vycm9yIGNsb3NpbmcgY29ubmVjdGlvbicsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29ubi5vbm9wZW4gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jb25uLm9uZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jb25uLm9ubWVzc2FnZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNvbm4ub25jbG9zZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNvbm4gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsZWFyQWxsVGltZXJzKCk7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmF0ZVdvcmtlcigpO1xuICAgICAgICB0aGlzLmNoYW5uZWxzLmZvckVhY2goKGNoYW5uZWwpID0+IGNoYW5uZWwudGVhcmRvd24oKSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb25Db25uT3BlbigpIHtcbiAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5sb2coJ3RyYW5zcG9ydCcsIGBjb25uZWN0ZWQgdG8gJHt0aGlzLmVuZHBvaW50VVJMKCl9YCk7XG4gICAgICAgIC8vIFdhaXQgZm9yIGFueSBwZW5kaW5nIGF1dGggb3BlcmF0aW9ucyBiZWZvcmUgZmx1c2hpbmcgc2VuZCBidWZmZXJcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNoYW5uZWwgam9pbiBtZXNzYWdlcyBpbmNsdWRlIHRoZSBjb3JyZWN0IGFjY2VzcyB0b2tlblxuICAgICAgICBjb25zdCBhdXRoUHJvbWlzZSA9IHRoaXMuX2F1dGhQcm9taXNlIHx8XG4gICAgICAgICAgICAodGhpcy5hY2Nlc3NUb2tlbiAmJiAhdGhpcy5hY2Nlc3NUb2tlblZhbHVlID8gdGhpcy5zZXRBdXRoKCkgOiBQcm9taXNlLnJlc29sdmUoKSk7XG4gICAgICAgIGF1dGhQcm9taXNlXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnZXJyb3Igd2FpdGluZyBmb3IgYXV0aCBvbiBjb25uZWN0JywgZSk7XG4gICAgICAgICAgICAvLyBQcm9jZWVkIGFueXdheSB0byBhdm9pZCBoYW5naW5nIGNvbm5lY3Rpb25zXG4gICAgICAgICAgICB0aGlzLmZsdXNoU2VuZEJ1ZmZlcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lcigncmVjb25uZWN0Jyk7XG4gICAgICAgIGlmICghdGhpcy53b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0SGVhcnRiZWF0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMud29ya2VyUmVmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRXb3JrZXJIZWFydGJlYXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90cmlnZ2VyU3RhdGVDYWxsYmFja3MoJ29wZW4nKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9zdGFydEhlYXJ0YmVhdCgpIHtcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciAmJiBjbGVhckludGVydmFsKHRoaXMuaGVhcnRiZWF0VGltZXIpO1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5zZW5kSGVhcnRiZWF0KCksIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcyk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfc3RhcnRXb3JrZXJIZWFydGJlYXQoKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtlclVybCkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ3dvcmtlcicsIGBzdGFydGluZyB3b3JrZXIgZm9yIGZyb20gJHt0aGlzLndvcmtlclVybH1gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nKCd3b3JrZXInLCBgc3RhcnRpbmcgZGVmYXVsdCB3b3JrZXJgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYmplY3RVcmwgPSB0aGlzLl93b3JrZXJPYmplY3RVcmwodGhpcy53b3JrZXJVcmwpO1xuICAgICAgICB0aGlzLndvcmtlclJlZiA9IG5ldyBXb3JrZXIob2JqZWN0VXJsKTtcbiAgICAgICAgdGhpcy53b3JrZXJSZWYub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2coJ3dvcmtlcicsICd3b3JrZXIgZXJyb3InLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZVdvcmtlcigpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLndvcmtlclJlZi5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmV2ZW50ID09PSAna2VlcEFsaXZlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZEhlYXJ0YmVhdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLndvcmtlclJlZi5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBldmVudDogJ3N0YXJ0JyxcbiAgICAgICAgICAgIGludGVydmFsOiB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZXJtaW5hdGUgdGhlIFdlYiBXb3JrZXIgYW5kIGNsZWFyIHRoZSByZWZlcmVuY2VcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfdGVybWluYXRlV29ya2VyKCkge1xuICAgICAgICBpZiAodGhpcy53b3JrZXJSZWYpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKCd3b3JrZXInLCAndGVybWluYXRpbmcgd29ya2VyJyk7XG4gICAgICAgICAgICB0aGlzLndvcmtlclJlZi50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIHRoaXMud29ya2VyUmVmID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb25Db25uQ2xvc2UoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLl9zZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICB0aGlzLmxvZygndHJhbnNwb3J0JywgJ2Nsb3NlJywgZXZlbnQpO1xuICAgICAgICB0aGlzLl90cmlnZ2VyQ2hhbkVycm9yKCk7XG4gICAgICAgIHRoaXMuX2NsZWFyVGltZXIoJ2hlYXJ0YmVhdCcpO1xuICAgICAgICAvLyBPbmx5IHNjaGVkdWxlIHJlY29ubmVjdGlvbiBpZiBpdCB3YXNuJ3QgYSBtYW51YWwgZGlzY29ubmVjdFxuICAgICAgICBpZiAoIXRoaXMuX3dhc01hbnVhbERpc2Nvbm5lY3QpIHtcbiAgICAgICAgICAgIChfYSA9IHRoaXMucmVjb25uZWN0VGltZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zY2hlZHVsZVRpbWVvdXQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90cmlnZ2VyU3RhdGVDYWxsYmFja3MoJ2Nsb3NlJywgZXZlbnQpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX29uQ29ubkVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgIHRoaXMubG9nKCd0cmFuc3BvcnQnLCBgJHtlcnJvcn1gKTtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckNoYW5FcnJvcigpO1xuICAgICAgICB0aGlzLl90cmlnZ2VyU3RhdGVDYWxsYmFja3MoJ2Vycm9yJywgZXJyb3IpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3RyaWdnZXJDaGFuRXJyb3IoKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbHMuZm9yRWFjaCgoY2hhbm5lbCkgPT4gY2hhbm5lbC5fdHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5lcnJvcikpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2FwcGVuZFBhcmFtcyh1cmwsIHBhcmFtcykge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJlZml4ID0gdXJsLm1hdGNoKC9cXD8vKSA/ICcmJyA6ICc/JztcbiAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcyk7XG4gICAgICAgIHJldHVybiBgJHt1cmx9JHtwcmVmaXh9JHtxdWVyeX1gO1xuICAgIH1cbiAgICBfd29ya2VyT2JqZWN0VXJsKHVybCkge1xuICAgICAgICBsZXQgcmVzdWx0X3VybDtcbiAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgcmVzdWx0X3VybCA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbV09SS0VSX1NDUklQVF0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pO1xuICAgICAgICAgICAgcmVzdWx0X3VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdF91cmw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBjb25uZWN0aW9uIHN0YXRlIHdpdGggcHJvcGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfc2V0Q29ubmVjdGlvblN0YXRlKHN0YXRlLCBtYW51YWwgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9jb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlID09PSAnY29ubmVjdGluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX3dhc01hbnVhbERpc2Nvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Rpc2Nvbm5lY3RpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl93YXNNYW51YWxEaXNjb25uZWN0ID0gbWFudWFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gdGhlIGFjdHVhbCBhdXRoIG9wZXJhdGlvblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIF9wZXJmb3JtQXV0aCh0b2tlbiA9IG51bGwpIHtcbiAgICAgICAgbGV0IHRva2VuVG9TZW5kO1xuICAgICAgICBsZXQgaXNNYW51YWxUb2tlbiA9IGZhbHNlO1xuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIHRva2VuVG9TZW5kID0gdG9rZW47XG4gICAgICAgICAgICAvLyBUcmFjayBpZiB0aGlzIGlzIGEgbWFudWFsbHktcHJvdmlkZWQgdG9rZW5cbiAgICAgICAgICAgIGlzTWFudWFsVG9rZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIENhbGwgdGhlIGFjY2Vzc1Rva2VuIGNhbGxiYWNrIHRvIGdldCBmcmVzaCB0b2tlblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0b2tlblRvU2VuZCA9IGF3YWl0IHRoaXMuYWNjZXNzVG9rZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgJ0Vycm9yIGZldGNoaW5nIGFjY2VzcyB0b2tlbiBmcm9tIGNhbGxiYWNrJywgZSk7XG4gICAgICAgICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGNhY2hlZCB2YWx1ZSBpZiBjYWxsYmFjayBmYWlsc1xuICAgICAgICAgICAgICAgIHRva2VuVG9TZW5kID0gdGhpcy5hY2Nlc3NUb2tlblZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdG9rZW5Ub1NlbmQgPSB0aGlzLmFjY2Vzc1Rva2VuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJhY2sgd2hldGhlciB0aGlzIHRva2VuIHdhcyBtYW51YWxseSBzZXQgb3IgZmV0Y2hlZCB2aWEgY2FsbGJhY2tcbiAgICAgICAgaWYgKGlzTWFudWFsVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX21hbnVhbGx5U2V0VG9rZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIC8vIElmIHdlIHVzZWQgdGhlIGNhbGxiYWNrLCBjbGVhciB0aGUgbWFudWFsIGZsYWdcbiAgICAgICAgICAgIHRoaXMuX21hbnVhbGx5U2V0VG9rZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2Nlc3NUb2tlblZhbHVlICE9IHRva2VuVG9TZW5kKSB7XG4gICAgICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuVmFsdWUgPSB0b2tlblRvU2VuZDtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHMuZm9yRWFjaCgoY2hhbm5lbCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbjogdG9rZW5Ub1NlbmQsXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb246IERFRkFVTFRfVkVSU0lPTixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRva2VuVG9TZW5kICYmIGNoYW5uZWwudXBkYXRlSm9pblBheWxvYWQocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwuam9pbmVkT25jZSAmJiBjaGFubmVsLl9pc0pvaW5lZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuX3B1c2goQ0hBTk5FTF9FVkVOVFMuYWNjZXNzX3Rva2VuLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46IHRva2VuVG9TZW5kLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXYWl0IGZvciBhbnkgaW4tZmxpZ2h0IGF1dGggb3BlcmF0aW9ucyB0byBjb21wbGV0ZVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIF93YWl0Rm9yQXV0aElmTmVlZGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fYXV0aFByb21pc2UpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2F1dGhQcm9taXNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNhZmVseSBjYWxsIHNldEF1dGggd2l0aCBzdGFuZGFyZGl6ZWQgZXJyb3IgaGFuZGxpbmdcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfc2V0QXV0aFNhZmVseShjb250ZXh0ID0gJ2dlbmVyYWwnKSB7XG4gICAgICAgIC8vIE9ubHkgcmVmcmVzaCBhdXRoIGlmIHVzaW5nIGNhbGxiYWNrLWJhc2VkIHRva2Vuc1xuICAgICAgICBpZiAoIXRoaXMuX2lzTWFudWFsVG9rZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRBdXRoKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCBgRXJyb3Igc2V0dGluZyBhdXRoIGluICR7Y29udGV4dH1gLCBlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgc3RhdGUgY2hhbmdlIGNhbGxiYWNrcyB3aXRoIHByb3BlciBlcnJvciBoYW5kbGluZ1xuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF90cmlnZ2VyU3RhdGVDYWxsYmFja3MoZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3NbZXZlbnRdLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsIGBlcnJvciBpbiAke2V2ZW50fSBjYWxsYmFja2AsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCBgZXJyb3IgdHJpZ2dlcmluZyAke2V2ZW50fSBjYWxsYmFja3NgLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXR1cCByZWNvbm5lY3Rpb24gdGltZXIgd2l0aCBwcm9wZXIgY29uZmlndXJhdGlvblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9zZXR1cFJlY29ubmVjdGlvblRpbWVyKCkge1xuICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbmV3IFRpbWVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dhaXRGb3JBdXRoSWZOZWVkZWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBDT05ORUNUSU9OX1RJTUVPVVRTLlJFQ09OTkVDVF9ERUxBWSk7XG4gICAgICAgIH0sIHRoaXMucmVjb25uZWN0QWZ0ZXJNcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgY2xpZW50IG9wdGlvbnMgd2l0aCBkZWZhdWx0c1xuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9pbml0aWFsaXplT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tO1xuICAgICAgICAvLyBTZXQgZGVmYXVsdHNcbiAgICAgICAgdGhpcy50cmFuc3BvcnQgPSAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHJhbnNwb3J0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBudWxsO1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudGltZW91dCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogREVGQVVMVF9USU1FT1VUO1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMgPVxuICAgICAgICAgICAgKF9jID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlYXJ0YmVhdEludGVydmFsTXMpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IENPTk5FQ1RJT05fVElNRU9VVFMuSEVBUlRCRUFUX0lOVEVSVkFMO1xuICAgICAgICB0aGlzLndvcmtlciA9IChfZCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy53b3JrZXIpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gKF9lID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmFjY2Vzc1Rva2VuKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBudWxsO1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdENhbGxiYWNrID0gKF9mID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlYXJ0YmVhdENhbGxiYWNrKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBub29wO1xuICAgICAgICB0aGlzLnZzbiA9IChfZyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy52c24pICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IERFRkFVTFRfVlNOO1xuICAgICAgICAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlc1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnBhcmFtcylcbiAgICAgICAgICAgIHRoaXMucGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7XG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubG9nZ2VyKVxuICAgICAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlcjtcbiAgICAgICAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubG9nTGV2ZWwpIHx8IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubG9nX2xldmVsKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dMZXZlbCA9IG9wdGlvbnMubG9nTGV2ZWwgfHwgb3B0aW9ucy5sb2dfbGV2ZWw7XG4gICAgICAgICAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXJhbXMpLCB7IGxvZ19sZXZlbDogdGhpcy5sb2dMZXZlbCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdXAgZnVuY3Rpb25zIHdpdGggZGVmYXVsdHNcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RBZnRlck1zID1cbiAgICAgICAgICAgIChfaCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZWNvbm5lY3RBZnRlck1zKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAoKHRyaWVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJFQ09OTkVDVF9JTlRFUlZBTFNbdHJpZXMgLSAxXSB8fCBERUZBVUxUX1JFQ09OTkVDVF9GQUxMQkFDSztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBzd2l0Y2ggKHRoaXMudnNuKSB7XG4gICAgICAgICAgICBjYXNlIFZTTl8xXzBfMDpcbiAgICAgICAgICAgICAgICB0aGlzLmVuY29kZSA9XG4gICAgICAgICAgICAgICAgICAgIChfaiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5lbmNvZGUpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6ICgocGF5bG9hZCwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb2RlID1cbiAgICAgICAgICAgICAgICAgICAgKF9rID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRlY29kZSkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogKChwYXlsb2FkLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEpTT04ucGFyc2UocGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVlNOXzJfMF8wOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5jb2RlID0gKF9sID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmVuY29kZSkgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogdGhpcy5zZXJpYWxpemVyLmVuY29kZS5iaW5kKHRoaXMuc2VyaWFsaXplcik7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvZGUgPSAoX20gPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVjb2RlKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiB0aGlzLnNlcmlhbGl6ZXIuZGVjb2RlLmJpbmQodGhpcy5zZXJpYWxpemVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemVyIHZlcnNpb246ICR7dGhpcy52c259YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlIHdvcmtlciBzZXR1cFxuICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAhd2luZG93Lldvcmtlcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViIFdvcmtlciBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLndvcmtlclVybCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy53b3JrZXJVcmw7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWFsdGltZUNsaWVudC5qcy5tYXAiXSwibmFtZXMiOlsiV2ViU29ja2V0RmFjdG9yeSIsIkNIQU5ORUxfRVZFTlRTIiwiQ09OTkVDVElPTl9TVEFURSIsIkRFRkFVTFRfVkVSU0lPTiIsIkRFRkFVTFRfVElNRU9VVCIsIlNPQ0tFVF9TVEFURVMiLCJUUkFOU1BPUlRTIiwiREVGQVVMVF9WU04iLCJWU05fMV8wXzAiLCJWU05fMl8wXzAiLCJXU19DTE9TRV9OT1JNQUwiLCJTZXJpYWxpemVyIiwiVGltZXIiLCJodHRwRW5kcG9pbnRVUkwiLCJSZWFsdGltZUNoYW5uZWwiLCJub29wIiwiQ09OTkVDVElPTl9USU1FT1VUUyIsIkhFQVJUQkVBVF9JTlRFUlZBTCIsIlJFQ09OTkVDVF9ERUxBWSIsIkhFQVJUQkVBVF9USU1FT1VUX0ZBTExCQUNLIiwiUkVDT05ORUNUX0lOVEVSVkFMUyIsIkRFRkFVTFRfUkVDT05ORUNUX0ZBTExCQUNLIiwiV09SS0VSX1NDUklQVCIsIlJlYWx0aW1lQ2xpZW50IiwiY29ubmVjdCIsImlzQ29ubmVjdGluZyIsImlzRGlzY29ubmVjdGluZyIsImNvbm4iLCJpc0Nvbm5lY3RlZCIsIl9zZXRDb25uZWN0aW9uU3RhdGUiLCJhY2Nlc3NUb2tlbiIsIl9hdXRoUHJvbWlzZSIsIl9zZXRBdXRoU2FmZWx5IiwidHJhbnNwb3J0IiwiZW5kcG9pbnRVUkwiLCJjcmVhdGVXZWJTb2NrZXQiLCJlcnJvciIsImVycm9yTWVzc2FnZSIsIm1lc3NhZ2UiLCJpbmNsdWRlcyIsIkVycm9yIiwiX3NldHVwQ29ubmVjdGlvbkhhbmRsZXJzIiwiX2FwcGVuZFBhcmFtcyIsImVuZFBvaW50IiwiT2JqZWN0IiwiYXNzaWduIiwicGFyYW1zIiwidnNuIiwiZGlzY29ubmVjdCIsImNvZGUiLCJyZWFzb24iLCJmYWxsYmFja1RpbWVyIiwic2V0VGltZW91dCIsIm9uY2xvc2UiLCJjbGVhclRpbWVvdXQiLCJjbG9zZSIsIl90ZWFyZG93bkNvbm5lY3Rpb24iLCJnZXRDaGFubmVscyIsImNoYW5uZWxzIiwicmVtb3ZlQ2hhbm5lbCIsImNoYW5uZWwiLCJzdGF0dXMiLCJ1bnN1YnNjcmliZSIsImxlbmd0aCIsInJlbW92ZUFsbENoYW5uZWxzIiwidmFsdWVzXzEiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwibG9nIiwia2luZCIsIm1zZyIsImRhdGEiLCJsb2dnZXIiLCJjb25uZWN0aW9uU3RhdGUiLCJyZWFkeVN0YXRlIiwiY29ubmVjdGluZyIsIkNvbm5lY3RpbmciLCJvcGVuIiwiT3BlbiIsImNsb3NpbmciLCJDbG9zaW5nIiwiQ2xvc2VkIiwiX2Nvbm5lY3Rpb25TdGF0ZSIsInRvcGljIiwiY29uZmlnIiwicmVhbHRpbWVUb3BpYyIsImV4aXN0cyIsImZpbmQiLCJjIiwiY2hhbiIsInB1c2giLCJldmVudCIsInBheWxvYWQiLCJyZWYiLCJjYWxsYmFjayIsImVuY29kZSIsInJlc3VsdCIsIl9hIiwic2VuZCIsInNlbmRCdWZmZXIiLCJzZXRBdXRoIiwidG9rZW4iLCJfcGVyZm9ybUF1dGgiLCJfaXNNYW51YWxUb2tlbiIsIl9tYW51YWxseVNldFRva2VuIiwic2VuZEhlYXJ0YmVhdCIsImhlYXJ0YmVhdENhbGxiYWNrIiwiZSIsInBlbmRpbmdIZWFydGJlYXRSZWYiLCJfd2FzTWFudWFsRGlzY29ubmVjdCIsInJlY29ubmVjdFRpbWVyIiwic2NoZWR1bGVUaW1lb3V0IiwiX21ha2VSZWYiLCJvbkhlYXJ0YmVhdCIsImZsdXNoU2VuZEJ1ZmZlciIsImZvckVhY2giLCJuZXdSZWYiLCJ0b1N0cmluZyIsIl9sZWF2ZU9wZW5Ub3BpYyIsImR1cENoYW5uZWwiLCJfaXNKb2luZWQiLCJfaXNKb2luaW5nIiwiX3JlbW92ZSIsImZpbHRlciIsIl9vbkNvbm5NZXNzYWdlIiwicmF3TWVzc2FnZSIsImRlY29kZSIsInJlZlN0cmluZyIsInRyaW0iLCJfaXNNZW1iZXIiLCJfdHJpZ2dlciIsIl90cmlnZ2VyU3RhdGVDYWxsYmFja3MiLCJfY2xlYXJUaW1lciIsInRpbWVyIiwiaGVhcnRiZWF0VGltZXIiLCJjbGVhckludGVydmFsIiwidW5kZWZpbmVkIiwicmVzZXQiLCJfY2xlYXJBbGxUaW1lcnMiLCJiaW5hcnlUeXBlIiwib25vcGVuIiwiX29uQ29ubk9wZW4iLCJvbmVycm9yIiwiX29uQ29ubkVycm9yIiwib25tZXNzYWdlIiwiX29uQ29ubkNsb3NlIiwiX3Rlcm1pbmF0ZVdvcmtlciIsInRlYXJkb3duIiwiYXV0aFByb21pc2UiLCJhY2Nlc3NUb2tlblZhbHVlIiwicmVzb2x2ZSIsInRoZW4iLCJjYXRjaCIsIndvcmtlciIsIl9zdGFydEhlYXJ0YmVhdCIsIndvcmtlclJlZiIsIl9zdGFydFdvcmtlckhlYXJ0YmVhdCIsInNldEludGVydmFsIiwiaGVhcnRiZWF0SW50ZXJ2YWxNcyIsIndvcmtlclVybCIsIm9iamVjdFVybCIsIl93b3JrZXJPYmplY3RVcmwiLCJXb3JrZXIiLCJwb3N0TWVzc2FnZSIsImludGVydmFsIiwidGVybWluYXRlIiwiX3RyaWdnZXJDaGFuRXJyb3IiLCJ1cmwiLCJrZXlzIiwicHJlZml4IiwibWF0Y2giLCJxdWVyeSIsIlVSTFNlYXJjaFBhcmFtcyIsInJlc3VsdF91cmwiLCJibG9iIiwiQmxvYiIsInR5cGUiLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJzdGF0ZSIsIm1hbnVhbCIsInRva2VuVG9TZW5kIiwiaXNNYW51YWxUb2tlbiIsImFjY2Vzc190b2tlbiIsInZlcnNpb24iLCJ1cGRhdGVKb2luUGF5bG9hZCIsImpvaW5lZE9uY2UiLCJfcHVzaCIsIl93YWl0Rm9yQXV0aElmTmVlZGVkIiwiY29udGV4dCIsInN0YXRlQ2hhbmdlQ2FsbGJhY2tzIiwiX3NldHVwUmVjb25uZWN0aW9uVGltZXIiLCJyZWNvbm5lY3RBZnRlck1zIiwiX2luaXRpYWxpemVPcHRpb25zIiwib3B0aW9ucyIsIl9iIiwiX2MiLCJfZCIsIl9lIiwiX2YiLCJfZyIsIl9oIiwiX2oiLCJfayIsIl9sIiwiX20iLCJ0aW1lb3V0IiwibG9nTGV2ZWwiLCJsb2dfbGV2ZWwiLCJ0cmllcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJwYXJzZSIsInNlcmlhbGl6ZXIiLCJiaW5kIiwid2luZG93IiwiY29uc3RydWN0b3IiLCJhcGlLZXkiLCJBcnJheSIsImh0dHBFbmRwb2ludCIsImhlYWRlcnMiLCJfcmVzb2x2ZUZldGNoIiwiY3VzdG9tRmV0Y2giLCJhcmdzIiwiZmV0Y2giLCJhcGlrZXkiLCJ3ZWJzb2NrZXQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js":
/*!****************************************************************************!*\
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js ***!
\****************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_PRESENCE_LISTEN_EVENTS: function() { return /* binding */ REALTIME_PRESENCE_LISTEN_EVENTS; },\n/* harmony export */ \"default\": function() { return /* binding */ RealtimePresence; }\n/* harmony export */ });\n/*\n This file draws heavily from https://github.com/phoenixframework/phoenix/blob/d344ec0a732ab4ee204215b31de69cf4be72e3bf/assets/js/phoenix/presence.js\n License: https://github.com/phoenixframework/phoenix/blob/d344ec0a732ab4ee204215b31de69cf4be72e3bf/LICENSE.md\n*/ var REALTIME_PRESENCE_LISTEN_EVENTS;\n(function(REALTIME_PRESENCE_LISTEN_EVENTS) {\n REALTIME_PRESENCE_LISTEN_EVENTS[\"SYNC\"] = \"sync\";\n REALTIME_PRESENCE_LISTEN_EVENTS[\"JOIN\"] = \"join\";\n REALTIME_PRESENCE_LISTEN_EVENTS[\"LEAVE\"] = \"leave\";\n})(REALTIME_PRESENCE_LISTEN_EVENTS || (REALTIME_PRESENCE_LISTEN_EVENTS = {}));\nclass RealtimePresence {\n /**\n * Used to sync the list of presences on the server with the\n * client's state.\n *\n * An optional `onJoin` and `onLeave` callback can be provided to\n * react to changes in the client's local presences across\n * disconnects and reconnects with the server.\n *\n * @internal\n */ static syncState(currentState, newState, onJoin, onLeave) {\n const state = this.cloneDeep(currentState);\n const transformedState = this.transformState(newState);\n const joins = {};\n const leaves = {};\n this.map(state, (key, presences)=>{\n if (!transformedState[key]) {\n leaves[key] = presences;\n }\n });\n this.map(transformedState, (key, newPresences)=>{\n const currentPresences = state[key];\n if (currentPresences) {\n const newPresenceRefs = newPresences.map((m)=>m.presence_ref);\n const curPresenceRefs = currentPresences.map((m)=>m.presence_ref);\n const joinedPresences = newPresences.filter((m)=>curPresenceRefs.indexOf(m.presence_ref) < 0);\n const leftPresences = currentPresences.filter((m)=>newPresenceRefs.indexOf(m.presence_ref) < 0);\n if (joinedPresences.length > 0) {\n joins[key] = joinedPresences;\n }\n if (leftPresences.length > 0) {\n leaves[key] = leftPresences;\n }\n } else {\n joins[key] = newPresences;\n }\n });\n return this.syncDiff(state, {\n joins,\n leaves\n }, onJoin, onLeave);\n }\n /**\n * Used to sync a diff of presence join and leave events from the\n * server, as they happen.\n *\n * Like `syncState`, `syncDiff` accepts optional `onJoin` and\n * `onLeave` callbacks to react to a user joining or leaving from a\n * device.\n *\n * @internal\n */ static syncDiff(state, diff, onJoin, onLeave) {\n const { joins, leaves } = {\n joins: this.transformState(diff.joins),\n leaves: this.transformState(diff.leaves)\n };\n if (!onJoin) {\n onJoin = ()=>{};\n }\n if (!onLeave) {\n onLeave = ()=>{};\n }\n this.map(joins, (key, newPresences)=>{\n var _a;\n const currentPresences = (_a = state[key]) !== null && _a !== void 0 ? _a : [];\n state[key] = this.cloneDeep(newPresences);\n if (currentPresences.length > 0) {\n const joinedPresenceRefs = state[key].map((m)=>m.presence_ref);\n const curPresences = currentPresences.filter((m)=>joinedPresenceRefs.indexOf(m.presence_ref) < 0);\n state[key].unshift(...curPresences);\n }\n onJoin(key, currentPresences, newPresences);\n });\n this.map(leaves, (key, leftPresences)=>{\n let currentPresences = state[key];\n if (!currentPresences) return;\n const presenceRefsToRemove = leftPresences.map((m)=>m.presence_ref);\n currentPresences = currentPresences.filter((m)=>presenceRefsToRemove.indexOf(m.presence_ref) < 0);\n state[key] = currentPresences;\n onLeave(key, currentPresences, leftPresences);\n if (currentPresences.length === 0) delete state[key];\n });\n return state;\n }\n /** @internal */ static map(obj, func) {\n return Object.getOwnPropertyNames(obj).map((key)=>func(key, obj[key]));\n }\n /**\n * Remove 'metas' key\n * Change 'phx_ref' to 'presence_ref'\n * Remove 'phx_ref' and 'phx_ref_prev'\n *\n * @example\n * // returns {\n * abc123: [\n * { presence_ref: '2', user_id: 1 },\n * { presence_ref: '3', user_id: 2 }\n * ]\n * }\n * RealtimePresence.transformState({\n * abc123: {\n * metas: [\n * { phx_ref: '2', phx_ref_prev: '1' user_id: 1 },\n * { phx_ref: '3', user_id: 2 }\n * ]\n * }\n * })\n *\n * @internal\n */ static transformState(state) {\n state = this.cloneDeep(state);\n return Object.getOwnPropertyNames(state).reduce((newState, key)=>{\n const presences = state[key];\n if (\"metas\" in presences) {\n newState[key] = presences.metas.map((presence)=>{\n presence[\"presence_ref\"] = presence[\"phx_ref\"];\n delete presence[\"phx_ref\"];\n delete presence[\"phx_ref_prev\"];\n return presence;\n });\n } else {\n newState[key] = presences;\n }\n return newState;\n }, {});\n }\n /** @internal */ static cloneDeep(obj) {\n return JSON.parse(JSON.stringify(obj));\n }\n /** @internal */ onJoin(callback) {\n this.caller.onJoin = callback;\n }\n /** @internal */ onLeave(callback) {\n this.caller.onLeave = callback;\n }\n /** @internal */ onSync(callback) {\n this.caller.onSync = callback;\n }\n /** @internal */ inPendingSyncState() {\n return !this.joinRef || this.joinRef !== this.channel._joinRef();\n }\n /**\n * Creates a Presence helper that keeps the local presence state in sync with the server.\n *\n * @param channel - The realtime channel to bind to.\n * @param opts - Optional custom event names, e.g. `{ events: { state: 'state', diff: 'diff' } }`.\n *\n * @example\n * ```ts\n * const presence = new RealtimePresence(channel)\n *\n * channel.on('presence', ({ event, key }) => {\n * console.log(`Presence ${event} on ${key}`)\n * })\n * ```\n */ constructor(channel, opts){\n this.channel = channel;\n this.state = {};\n this.pendingDiffs = [];\n this.joinRef = null;\n this.enabled = false;\n this.caller = {\n onJoin: ()=>{},\n onLeave: ()=>{},\n onSync: ()=>{}\n };\n const events = (opts === null || opts === void 0 ? void 0 : opts.events) || {\n state: \"presence_state\",\n diff: \"presence_diff\"\n };\n this.channel._on(events.state, {}, (newState)=>{\n const { onJoin, onLeave, onSync } = this.caller;\n this.joinRef = this.channel._joinRef();\n this.state = RealtimePresence.syncState(this.state, newState, onJoin, onLeave);\n this.pendingDiffs.forEach((diff)=>{\n this.state = RealtimePresence.syncDiff(this.state, diff, onJoin, onLeave);\n });\n this.pendingDiffs = [];\n onSync();\n });\n this.channel._on(events.diff, {}, (diff)=>{\n const { onJoin, onLeave, onSync } = this.caller;\n if (this.inPendingSyncState()) {\n this.pendingDiffs.push(diff);\n } else {\n this.state = RealtimePresence.syncDiff(this.state, diff, onJoin, onLeave);\n onSync();\n }\n });\n this.onJoin((key, currentPresences, newPresences)=>{\n this.channel._trigger(\"presence\", {\n event: \"join\",\n key,\n currentPresences,\n newPresences\n });\n });\n this.onLeave((key, currentPresences, leftPresences)=>{\n this.channel._trigger(\"presence\", {\n event: \"leave\",\n key,\n currentPresences,\n leftPresences\n });\n });\n this.onSync(()=>{\n this.channel._trigger(\"presence\", {\n event: \"sync\"\n });\n });\n }\n} //# sourceMappingURL=RealtimePresence.js.map\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvUmVhbHRpbWVQcmVzZW5jZS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7QUFHQSxHQUNPLElBQUlBLGdDQUFnQztBQUMxQyxVQUFVQSwrQkFBK0I7SUFDdENBLCtCQUErQixDQUFDLE9BQU8sR0FBRztJQUMxQ0EsK0JBQStCLENBQUMsT0FBTyxHQUFHO0lBQzFDQSwrQkFBK0IsQ0FBQyxRQUFRLEdBQUc7QUFDL0MsR0FBR0EsbUNBQW9DQSxDQUFBQSxrQ0FBa0MsQ0FBQztBQUMzRCxNQUFNQztJQXVFakI7Ozs7Ozs7OztLQVNDLEdBQ0QsT0FBT0MsVUFBVUMsWUFBWSxFQUFFQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsT0FBTyxFQUFFO1FBQ3RELE1BQU1DLFFBQVEsSUFBSSxDQUFDQyxTQUFTLENBQUNMO1FBQzdCLE1BQU1NLG1CQUFtQixJQUFJLENBQUNDLGNBQWMsQ0FBQ047UUFDN0MsTUFBTU8sUUFBUSxDQUFDO1FBQ2YsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCLElBQUksQ0FBQ0MsR0FBRyxDQUFDTixPQUFPLENBQUNPLEtBQUtDO1lBQ2xCLElBQUksQ0FBQ04sZ0JBQWdCLENBQUNLLElBQUksRUFBRTtnQkFDeEJGLE1BQU0sQ0FBQ0UsSUFBSSxHQUFHQztZQUNsQjtRQUNKO1FBQ0EsSUFBSSxDQUFDRixHQUFHLENBQUNKLGtCQUFrQixDQUFDSyxLQUFLRTtZQUM3QixNQUFNQyxtQkFBbUJWLEtBQUssQ0FBQ08sSUFBSTtZQUNuQyxJQUFJRyxrQkFBa0I7Z0JBQ2xCLE1BQU1DLGtCQUFrQkYsYUFBYUgsR0FBRyxDQUFDLENBQUNNLElBQU1BLEVBQUVDLFlBQVk7Z0JBQzlELE1BQU1DLGtCQUFrQkosaUJBQWlCSixHQUFHLENBQUMsQ0FBQ00sSUFBTUEsRUFBRUMsWUFBWTtnQkFDbEUsTUFBTUUsa0JBQWtCTixhQUFhTyxNQUFNLENB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QUksQ0FBQ0QsTUFBTTtZQUMvQyxJQUFJLElBQUksQ0FBQ0Usa0JBQWtCLElBQUk7Z0JBQzNCLElBQUksQ0FBQ00sWUFBWSxDQUFDSyxJQUFJLENBQUM5QjtZQUMzQixPQUNLO2dCQUNELElBQUksQ0FBQ3JCLEtBQUssR0FBR04saUJBQWlCMEIsUUFBUSxDQUFDLElBQUksQ0FBQ3BCLEtBQUssRUFBRXFCLE1BQU12QixRQUFRQztnQkFDakV3QztZQUNKO1FBQ0o7UUFDQSxJQUFJLENBQUN6QyxNQUFNLENBQUMsQ0FBQ1MsS0FBS0csa0JBQWtCRDtZQUNoQyxJQUFJLENBQUNpQyxPQUFPLENBQUNVLFFBQVEsQ0FBQyxZQUFZO2dCQUM5QkMsT0FBTztnQkFDUDlDO2dCQUNBRztnQkFDQUQ7WUFDSjtRQUNKO1FBQ0EsSUFBSSxDQUFDVixPQUFPLENBQUMsQ0FBQ1EsS0FBS0csa0JBQWtCUTtZQUNqQyxJQUFJLENBQUN3QixPQUFPLENBQUNVLFFBQVEsQ0FBQyxZQUFZO2dCQUM5QkMsT0FBTztnQkFDUDlDO2dCQUNBRztnQkFDQVE7WUFDSjtRQUNKO1FBQ0EsSUFBSSxDQUFDcUIsTUFBTSxDQUFDO1lBQ1IsSUFBSSxDQUFDRyxPQUFPLENBQUNVLFFBQVEsQ0FBQyxZQUFZO2dCQUFFQyxPQUFPO1lBQU87UUFDdEQ7SUFDSjtBQXVKSixFQUNBLDRDQUE0QztBQUQzQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lUHJlc2VuY2UuanM/Y2VjMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBUaGlzIGZpbGUgZHJhd3MgaGVhdmlseSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXgvYmxvYi9kMzQ0ZWMwYTczMmFiNGVlMjA0MjE1YjMxZGU2OWNmNGJlNzJlM2JmL2Fzc2V0cy9qcy9waG9lbml4L3ByZXNlbmNlLmpzXG4gIExpY2Vuc2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXgvYmxvYi9kMzQ0ZWMwYTczMmFiNGVlMjA0MjE1YjMxZGU2OWNmNGJlNzJlM2JmL0xJQ0VOU0UubWRcbiovXG5leHBvcnQgdmFyIFJFQUxUSU1FX1BSRVNFTkNFX0xJU1RFTl9FVkVOVFM7XG4oZnVuY3Rpb24gKFJFQUxUSU1FX1BSRVNFTkNFX0xJU1RFTl9FVkVOVFMpIHtcbiAgICBSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTW1wiU1lOQ1wiXSA9IFwic3luY1wiO1xuICAgIFJFQUxUSU1FX1BSRVNFTkNFX0xJU1RFTl9FVkVOVFNbXCJKT0lOXCJdID0gXCJqb2luXCI7XG4gICAgUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UU1tcIkxFQVZFXCJdID0gXCJsZWF2ZVwiO1xufSkoUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUyB8fCAoUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUyA9IHt9KSk7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWFsdGltZVByZXNlbmNlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUHJlc2VuY2UgaGVscGVyIHRoYXQga2VlcHMgdGhlIGxvY2FsIHByZXNlbmNlIHN0YXRlIGluIHN5bmMgd2l0aCB0aGUgc2VydmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5uZWwgLSBUaGUgcmVhbHRpbWUgY2hhbm5lbCB0byBiaW5kIHRvLlxuICAgICAqIEBwYXJhbSBvcHRzIC0gT3B0aW9uYWwgY3VzdG9tIGV2ZW50IG5hbWVzLCBlLmcuIGB7IGV2ZW50czogeyBzdGF0ZTogJ3N0YXRlJywgZGlmZjogJ2RpZmYnIH0gfWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcHJlc2VuY2UgPSBuZXcgUmVhbHRpbWVQcmVzZW5jZShjaGFubmVsKVxuICAgICAqXG4gICAgICogY2hhbm5lbC5vbigncHJlc2VuY2UnLCAoeyBldmVudCwga2V5IH0pID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQcmVzZW5jZSAke2V2ZW50fSBvbiAke2tleX1gKVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2hhbm5lbCwgb3B0cykge1xuICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuICAgICAgICB0aGlzLnN0YXRlID0ge307XG4gICAgICAgIHRoaXMucGVuZGluZ0RpZmZzID0gW107XG4gICAgICAgIHRoaXMuam9pblJlZiA9IG51bGw7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgICAgICAgIG9uSm9pbjogKCkgPT4geyB9LFxuICAgICAgICAgICAgb25MZWF2ZTogKCkgPT4geyB9LFxuICAgICAgICAgICAgb25TeW5jOiAoKSA9PiB7IH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMuZXZlbnRzKSB8fCB7XG4gICAgICAgICAgICBzdGF0ZTogJ3ByZXNlbmNlX3N0YXRlJyxcbiAgICAgICAgICAgIGRpZmY6ICdwcmVzZW5jZV9kaWZmJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jaGFubmVsLl9vbihldmVudHMuc3RhdGUsIHt9LCAobmV3U3RhdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgb25Kb2luLCBvbkxlYXZlLCBvblN5bmMgfSA9IHRoaXMuY2FsbGVyO1xuICAgICAgICAgICAgdGhpcy5qb2luUmVmID0gdGhpcy5jaGFubmVsLl9qb2luUmVmKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gUmVhbHRpbWVQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdEaWZmcy5mb3JFYWNoKChkaWZmKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFJlYWx0aW1lUHJlc2VuY2Uuc3luY0RpZmYodGhpcy5zdGF0ZSwgZGlmZiwgb25Kb2luLCBvbkxlYXZlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXTtcbiAgICAgICAgICAgIG9uU3luYygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGFubmVsLl9vbihldmVudHMuZGlmZiwge30sIChkaWZmKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG9uSm9pbiwgb25MZWF2ZSwgb25TeW5jIH0gPSB0aGlzLmNhbGxlcjtcbiAgICAgICAgICAgIGlmICh0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBSZWFsdGltZVByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSk7XG4gICAgICAgICAgICAgICAgb25TeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uSm9pbigoa2V5LCBjdXJyZW50UHJlc2VuY2VzLCBuZXdQcmVzZW5jZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5fdHJpZ2dlcigncHJlc2VuY2UnLCB7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdqb2luJyxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgY3VycmVudFByZXNlbmNlcyxcbiAgICAgICAgICAgICAgICBuZXdQcmVzZW5jZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25MZWF2ZSgoa2V5LCBjdXJyZW50UHJlc2VuY2VzLCBsZWZ0UHJlc2VuY2VzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWwuX3RyaWdnZXIoJ3ByZXNlbmNlJywge1xuICAgICAgICAgICAgICAgIGV2ZW50OiAnbGVhdmUnLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBjdXJyZW50UHJlc2VuY2VzLFxuICAgICAgICAgICAgICAgIGxlZnRQcmVzZW5jZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25TeW5jKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5fdHJpZ2dlcigncHJlc2VuY2UnLCB7IGV2ZW50OiAnc3luYycgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHN5bmMgdGhlIGxpc3Qgb2YgcHJlc2VuY2VzIG9uIHRoZSBzZXJ2ZXIgd2l0aCB0aGVcbiAgICAgKiBjbGllbnQncyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEFuIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2sgY2FuIGJlIHByb3ZpZGVkIHRvXG4gICAgICogcmVhY3QgdG8gY2hhbmdlcyBpbiB0aGUgY2xpZW50J3MgbG9jYWwgcHJlc2VuY2VzIGFjcm9zc1xuICAgICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBzeW5jU3RhdGUoY3VycmVudFN0YXRlLCBuZXdTdGF0ZSwgb25Kb2luLCBvbkxlYXZlKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jbG9uZURlZXAoY3VycmVudFN0YXRlKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRTdGF0ZSA9IHRoaXMudHJhbnNmb3JtU3RhdGUobmV3U3RhdGUpO1xuICAgICAgICBjb25zdCBqb2lucyA9IHt9O1xuICAgICAgICBjb25zdCBsZWF2ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5tYXAoc3RhdGUsIChrZXksIHByZXNlbmNlcykgPT4ge1xuICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1lZFN0YXRlW2tleV0pIHtcbiAgICAgICAgICAgICAgICBsZWF2ZXNba2V5XSA9IHByZXNlbmNlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFwKHRyYW5zZm9ybWVkU3RhdGUsIChrZXksIG5ld1ByZXNlbmNlcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFByZXNlbmNlcyA9IHN0YXRlW2tleV07XG4gICAgICAgICAgICBpZiAoY3VycmVudFByZXNlbmNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ByZXNlbmNlUmVmcyA9IG5ld1ByZXNlbmNlcy5tYXAoKG0pID0+IG0ucHJlc2VuY2VfcmVmKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJQcmVzZW5jZVJlZnMgPSBjdXJyZW50UHJlc2VuY2VzLm1hcCgobSkgPT4gbS5wcmVzZW5jZV9yZWYpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvaW5lZFByZXNlbmNlcyA9IG5ld1ByZXNlbmNlcy5maWx0ZXIoKG0pID0+IGN1clByZXNlbmNlUmVmcy5pbmRleE9mKG0ucHJlc2VuY2VfcmVmKSA8IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnRQcmVzZW5jZXMgPSBjdXJyZW50UHJlc2VuY2VzLmZpbHRlcigobSkgPT4gbmV3UHJlc2VuY2VSZWZzLmluZGV4T2YobS5wcmVzZW5jZV9yZWYpIDwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKGpvaW5lZFByZXNlbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGpvaW5zW2tleV0gPSBqb2luZWRQcmVzZW5jZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsZWZ0UHJlc2VuY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhdmVzW2tleV0gPSBsZWZ0UHJlc2VuY2VzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGpvaW5zW2tleV0gPSBuZXdQcmVzZW5jZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwgeyBqb2lucywgbGVhdmVzIH0sIG9uSm9pbiwgb25MZWF2ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gc3luYyBhIGRpZmYgb2YgcHJlc2VuY2Ugam9pbiBhbmQgbGVhdmUgZXZlbnRzIGZyb20gdGhlXG4gICAgICogc2VydmVyLCBhcyB0aGV5IGhhcHBlbi5cbiAgICAgKlxuICAgICAqIExpa2UgYHN5bmNTdGF0ZWAsIGBzeW5jRGlmZmAgYWNjZXB0cyBvcHRpb25hbCBgb25Kb2luYCBhbmRcbiAgICAgKiBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlciBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhXG4gICAgICogZGV2aWNlLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpIHtcbiAgICAgICAgY29uc3QgeyBqb2lucywgbGVhdmVzIH0gPSB7XG4gICAgICAgICAgICBqb2luczogdGhpcy50cmFuc2Zvcm1TdGF0ZShkaWZmLmpvaW5zKSxcbiAgICAgICAgICAgIGxlYXZlczogdGhpcy50cmFuc2Zvcm1TdGF0ZShkaWZmLmxlYXZlcyksXG4gICAgICAgIH07XG4gICAgICAgIGlmICghb25Kb2luKSB7XG4gICAgICAgICAgICBvbkpvaW4gPSAoKSA9PiB7IH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvbkxlYXZlKSB7XG4gICAgICAgICAgICBvbkxlYXZlID0gKCkgPT4geyB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFwKGpvaW5zLCAoa2V5LCBuZXdQcmVzZW5jZXMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcmVzZW5jZXMgPSAoX2EgPSBzdGF0ZVtrZXldKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgICAgIHN0YXRlW2tleV0gPSB0aGlzLmNsb25lRGVlcChuZXdQcmVzZW5jZXMpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQcmVzZW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvaW5lZFByZXNlbmNlUmVmcyA9IHN0YXRlW2tleV0ubWFwKChtKSA9PiBtLnByZXNlbmNlX3JlZik7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VyUHJlc2VuY2VzID0gY3VycmVudFByZXNlbmNlcy5maWx0ZXIoKG0pID0+IGpvaW5lZFByZXNlbmNlUmVmcy5pbmRleE9mKG0ucHJlc2VuY2VfcmVmKSA8IDApO1xuICAgICAgICAgICAgICAgIHN0YXRlW2tleV0udW5zaGlmdCguLi5jdXJQcmVzZW5jZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25Kb2luKGtleSwgY3VycmVudFByZXNlbmNlcywgbmV3UHJlc2VuY2VzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFwKGxlYXZlcywgKGtleSwgbGVmdFByZXNlbmNlcykgPT4ge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZXMgPSBzdGF0ZVtrZXldO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50UHJlc2VuY2VzKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbmNlUmVmc1RvUmVtb3ZlID0gbGVmdFByZXNlbmNlcy5tYXAoKG0pID0+IG0ucHJlc2VuY2VfcmVmKTtcbiAgICAgICAgICAgIGN1cnJlbnRQcmVzZW5jZXMgPSBjdXJyZW50UHJlc2VuY2VzLmZpbHRlcigobSkgPT4gcHJlc2VuY2VSZWZzVG9SZW1vdmUuaW5kZXhPZihtLnByZXNlbmNlX3JlZikgPCAwKTtcbiAgICAgICAgICAgIHN0YXRlW2tleV0gPSBjdXJyZW50UHJlc2VuY2VzO1xuICAgICAgICAgICAgb25MZWF2ZShrZXksIGN1cnJlbnRQcmVzZW5jZXMsIGxlZnRQcmVzZW5jZXMpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQcmVzZW5jZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBzdGF0ZVtrZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgc3RhdGljIG1hcChvYmosIGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKChrZXkpID0+IGZ1bmMoa2V5LCBvYmpba2V5XSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgJ21ldGFzJyBrZXlcbiAgICAgKiBDaGFuZ2UgJ3BoeF9yZWYnIHRvICdwcmVzZW5jZV9yZWYnXG4gICAgICogUmVtb3ZlICdwaHhfcmVmJyBhbmQgJ3BoeF9yZWZfcHJldidcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gcmV0dXJucyB7XG4gICAgICogIGFiYzEyMzogW1xuICAgICAqICAgIHsgcHJlc2VuY2VfcmVmOiAnMicsIHVzZXJfaWQ6IDEgfSxcbiAgICAgKiAgICB7IHByZXNlbmNlX3JlZjogJzMnLCB1c2VyX2lkOiAyIH1cbiAgICAgKiAgXVxuICAgICAqIH1cbiAgICAgKiBSZWFsdGltZVByZXNlbmNlLnRyYW5zZm9ybVN0YXRlKHtcbiAgICAgKiAgYWJjMTIzOiB7XG4gICAgICogICAgbWV0YXM6IFtcbiAgICAgKiAgICAgIHsgcGh4X3JlZjogJzInLCBwaHhfcmVmX3ByZXY6ICcxJyB1c2VyX2lkOiAxIH0sXG4gICAgICogICAgICB7IHBoeF9yZWY6ICczJywgdXNlcl9pZDogMiB9XG4gICAgICogICAgXVxuICAgICAqICB9XG4gICAgICogfSlcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyB0cmFuc2Zvcm1TdGF0ZShzdGF0ZSkge1xuICAgICAgICBzdGF0ZSA9IHRoaXMuY2xvbmVEZWVwKHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHN0YXRlKS5yZWR1Y2UoKG5ld1N0YXRlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbmNlcyA9IHN0YXRlW2tleV07XG4gICAgICAgICAgICBpZiAoJ21ldGFzJyBpbiBwcmVzZW5jZXMpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZVtrZXldID0gcHJlc2VuY2VzLm1ldGFzLm1hcCgocHJlc2VuY2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcHJlc2VuY2VbJ3ByZXNlbmNlX3JlZiddID0gcHJlc2VuY2VbJ3BoeF9yZWYnXTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHByZXNlbmNlWydwaHhfcmVmJ107XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwcmVzZW5jZVsncGh4X3JlZl9wcmV2J107XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmVzZW5jZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlW2tleV0gPSBwcmVzZW5jZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBjbG9uZURlZXAob2JqKSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgb25Kb2luKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLm9uSm9pbiA9IGNhbGxiYWNrO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgb25MZWF2ZShjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBvblN5bmMoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5jYWxsZXIub25TeW5jID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBpblBlbmRpbmdTeW5jU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5qb2luUmVmIHx8IHRoaXMuam9pblJlZiAhPT0gdGhpcy5jaGFubmVsLl9qb2luUmVmKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVhbHRpbWVQcmVzZW5jZS5qcy5tYXAiXSwibmFtZXMiOlsiUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUyIsIlJlYWx0aW1lUHJlc2VuY2UiLCJzeW5jU3RhdGUiLCJjdXJyZW50U3RhdGUiLCJuZXdTdGF0ZSIsIm9uSm9pbiIsIm9uTGVhdmUiLCJzdGF0ZSIsImNsb25lRGVlcCIsInRyYW5zZm9ybWVkU3RhdGUiLCJ0cmFuc2Zvcm1TdGF0ZSIsImpvaW5zIiwibGVhdmVzIiwibWFwIiwia2V5IiwicHJlc2VuY2VzIiwibmV3UHJlc2VuY2VzIiwiY3VycmVudFByZXNlbmNlcyIsIm5ld1ByZXNlbmNlUmVmcyIsIm0iLCJwcmVzZW5jZV9yZWYiLCJjdXJQcmVzZW5jZVJlZnMiLCJqb2luZWRQcmVzZW5jZXMiLCJmaWx0ZXIiLCJpbmRleE9mIiwibGVmdFByZXNlbmNlcyIsImxlbmd0aCIsInN5bmNEaWZmIiwiZGlmZiIsIl9hIiwiam9pbmVkUHJlc2VuY2VSZWZzIiwiY3VyUHJlc2VuY2VzIiwidW5zaGlmdCIsInByZXNlbmNlUmVmc1RvUmVtb3ZlIiwib2JqIiwiZnVuYyIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJyZWR1Y2UiLCJtZXRhcyIsInByZXNlbmNlIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiY2FsbGJhY2siLCJjYWxsZXIiLCJvblN5bmMiLCJpblBlbmRpbmdTeW5jU3RhdGUiLCJqb2luUmVmIiwiY2hhbm5lbCIsIl9qb2luUmVmIiwiY29uc3RydWN0b3IiLCJvcHRzIiwicGVuZGluZ0RpZmZzIiwiZW5hYmxlZCIsImV2ZW50cyIsIl9vbiIsImZvckVhY2giLCJwdXNoIiwiX3RyaWdnZXIiLCJldmVudCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/index.js":
/*!*****************************************************************!*\
!*** ./node_modules/@supabase/realtime-js/dist/module/index.js ***!
\*****************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_CHANNEL_STATES: function() { return /* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_CHANNEL_STATES; },\n/* harmony export */ REALTIME_LISTEN_TYPES: function() { return /* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_LISTEN_TYPES; },\n/* harmony export */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT: function() { return /* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_POSTGRES_CHANGES_LISTEN_EVENT; },\n/* harmony export */ REALTIME_PRESENCE_LISTEN_EVENTS: function() { return /* reexport safe */ _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__.REALTIME_PRESENCE_LISTEN_EVENTS; },\n/* harmony export */ REALTIME_SUBSCRIBE_STATES: function() { return /* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_SUBSCRIBE_STATES; },\n/* harmony export */ RealtimeChannel: function() { return /* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__[\"default\"]; },\n/* harmony export */ RealtimeClient: function() { return /* reexport safe */ _RealtimeClient__WEBPACK_IMPORTED_MODULE_0__[\"default\"]; },\n/* harmony export */ RealtimePresence: function() { return /* reexport safe */ _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__[\"default\"]; },\n/* harmony export */ WebSocketFactory: function() { return /* reexport safe */ _lib_websocket_factory__WEBPACK_IMPORTED_MODULE_3__[\"default\"]; }\n/* harmony export */ });\n/* harmony import */ var _RealtimeClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./RealtimeClient */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js\");\n/* harmony import */ var _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RealtimeChannel */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js\");\n/* harmony import */ var _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RealtimePresence */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js\");\n/* harmony import */ var _lib_websocket_factory__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/websocket-factory */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js\");\n\n\n\n\n //# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUE4QztBQUMwSDtBQUNoRjtBQUNqQztBQUM2SyxDQUNwTyxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9pbmRleC5qcz81NTVkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFsdGltZUNsaWVudCBmcm9tICcuL1JlYWx0aW1lQ2xpZW50JztcbmltcG9ydCBSZWFsdGltZUNoYW5uZWwsIHsgUkVBTFRJTUVfTElTVEVOX1RZUEVTLCBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCwgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUywgUkVBTFRJTUVfQ0hBTk5FTF9TVEFURVMsIH0gZnJvbSAnLi9SZWFsdGltZUNoYW5uZWwnO1xuaW1wb3J0IFJlYWx0aW1lUHJlc2VuY2UsIHsgUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUywgfSBmcm9tICcuL1JlYWx0aW1lUHJlc2VuY2UnO1xuaW1wb3J0IFdlYlNvY2tldEZhY3RvcnkgZnJvbSAnLi9saWIvd2Vic29ja2V0LWZhY3RvcnknO1xuZXhwb3J0IHsgUmVhbHRpbWVQcmVzZW5jZSwgUmVhbHRpbWVDaGFubmVsLCBSZWFsdGltZUNsaWVudCwgUkVBTFRJTUVfTElTVEVOX1RZUEVTLCBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCwgUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUywgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUywgUkVBTFRJTUVfQ0hBTk5FTF9TVEFURVMsIFdlYlNvY2tldEZhY3RvcnksIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOlsiUmVhbHRpbWVDbGllbnQiLCJSZWFsdGltZUNoYW5uZWwiLCJSRUFMVElNRV9MSVNURU5fVFlQRVMiLCJSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCIsIlJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMiLCJSRUFMVElNRV9DSEFOTkVMX1NUQVRFUyIsIlJlYWx0aW1lUHJlc2VuY2UiLCJSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTIiwiV2ViU29ja2V0RmFjdG9yeSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/index.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js":
/*!*************************************************************************!*\
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/constants.js ***!
\*************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CHANNEL_EVENTS: function() { return /* binding */ CHANNEL_EVENTS; },\n/* harmony export */ CHANNEL_STATES: function() { return /* binding */ CHANNEL_STATES; },\n/* harmony export */ CONNECTION_STATE: function() { return /* binding */ CONNECTION_STATE; },\n/* harmony export */ DEFAULT_TIMEOUT: function() { return /* binding */ DEFAULT_TIMEOUT; },\n/* harmony export */ DEFAULT_VERSION: function() { return /* binding */ DEFAULT_VERSION; },\n/* harmony export */ DEFAULT_VSN: function() { return /* binding */ DEFAULT_VSN; },\n/* harmony export */ MAX_PUSH_BUFFER_SIZE: function() { return /* binding */ MAX_PUSH_BUFFER_SIZE; },\n/* harmony export */ SOCKET_STATES: function() { return /* binding */ SOCKET_STATES; },\n/* harmony export */ TRANSPORTS: function() { return /* binding */ TRANSPORTS; },\n/* harmony export */ VERSION: function() { return /* binding */ VERSION; },\n/* harmony export */ VSN_1_0_0: function() { return /* binding */ VSN_1_0_0; },\n/* harmony export */ VSN_2_0_0: function() { return /* binding */ VSN_2_0_0; },\n/* harmony export */ WS_CLOSE_NORMAL: function() { return /* binding */ WS_CLOSE_NORMAL; }\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./version */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js\");\n\nconst DEFAULT_VERSION = \"realtime-js/\".concat(_version__WEBPACK_IMPORTED_MODULE_0__.version);\nconst VSN_1_0_0 = \"1.0.0\";\nconst VSN_2_0_0 = \"2.0.0\";\nconst DEFAULT_VSN = VSN_1_0_0;\nconst VERSION = _version__WEBPACK_IMPORTED_MODULE_0__.version;\nconst DEFAULT_TIMEOUT = 10000;\nconst WS_CLOSE_NORMAL = 1000;\nconst MAX_PUSH_BUFFER_SIZE = 100;\nvar SOCKET_STATES;\n(function(SOCKET_STATES) {\n SOCKET_STATES[SOCKET_STATES[\"connecting\"] = 0] = \"connecting\";\n SOCKET_STATES[SOCKET_STATES[\"open\"] = 1] = \"open\";\n SOCKET_STATES[SOCKET_STATES[\"closing\"] = 2] = \"closing\";\n SOCKET_STATES[SOCKET_STATES[\"closed\"] = 3] = \"closed\";\n})(SOCKET_STATES || (SOCKET_STATES = {}));\nvar CHANNEL_STATES;\n(function(CHANNEL_STATES) {\n CHANNEL_STATES[\"closed\"] = \"closed\";\n CHANNEL_STATES[\"errored\"] = \"errored\";\n CHANNEL_STATES[\"joined\"] = \"joined\";\n CHANNEL_STATES[\"joining\"] = \"joining\";\n CHANNEL_STATES[\"leaving\"] = \"leaving\";\n})(CHANNEL_STATES || (CHANNEL_STATES = {}));\nvar CHANNEL_EVENTS;\n(function(CHANNEL_EVENTS) {\n CHANNEL_EVENTS[\"close\"] = \"phx_close\";\n CHANNEL_EVENTS[\"error\"] = \"phx_error\";\n CHANNEL_EVENTS[\"join\"] = \"phx_join\";\n CHANNEL_EVENTS[\"reply\"] = \"phx_reply\";\n CHANNEL_EVENTS[\"leave\"] = \"phx_leave\";\n CHANNEL_EVENTS[\"access_token\"] = \"access_token\";\n})(CHANNEL_EVENTS || (CHANNEL_EVENTS = {}));\nvar TRANSPORTS;\n(function(TRANSPORTS) {\n TRANSPORTS[\"websocket\"] = \"websocket\";\n})(TRANSPORTS || (TRANSPORTS = {}));\nvar CONNECTION_STATE;\n(function(CONNECTION_STATE) {\n CONNECTION_STATE[\"Connecting\"] = \"connecting\";\n CONNECTION_STATE[\"Open\"] = \"open\";\n CONNECTION_STATE[\"Closing\"] = \"closing\";\n CONNECTION_STATE[\"Closed\"] = \"closed\";\n})(CONNECTION_STATE || (CONNECTION_STATE = {})); //# sourceMappingURL=constants.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL2NvbnN0YW50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFvQztBQUM3QixNQUFNQyxrQkFBa0IsZUFBdUIsT0FBUkQsNkNBQU9BLEVBQUc7QUFDakQsTUFBTUUsWUFBWSxRQUFRO0FBQzFCLE1BQU1DLFlBQVksUUFBUTtBQUMxQixNQUFNQyxjQUFjRixVQUFVO0FBQzlCLE1BQU1HLFVBQVVMLDZDQUFPQSxDQUFDO0FBQ3hCLE1BQU1NLGtCQUFrQixNQUFNO0FBQzlCLE1BQU1DLGtCQUFrQixLQUFLO0FBQzdCLE1BQU1DLHVCQUF1QixJQUFJO0FBQ2pDLElBQUlDLGNBQWM7QUFDeEIsVUFBVUEsYUFBYTtJQUNwQkEsYUFBYSxDQUFDQSxhQUFhLENBQUMsYUFBYSxHQUFHLEVBQUUsR0FBRztJQUNqREEsYUFBYSxDQUFDQSxhQUFhLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRztJQUMzQ0EsYUFBYSxDQUFDQSxhQUFhLENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRztJQUM5Q0EsYUFBYSxDQUFDQSxhQUFhLENBQUMsU0FBUyxHQUFHLEVBQUUsR0FBRztBQUNqRCxHQUFHQSxpQkFBa0JBLENBQUFBLGdCQUFnQixDQUFDO0FBQy9CLElBQUlDLGVBQWU7QUFDekIsVUFBVUEsY0FBYztJQUNyQkEsY0FBYyxDQUFDLFNBQVMsR0FBRztJQUMzQkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFNBQVMsR0FBRztJQUMzQkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztBQUNoQyxHQUFHQSxrQkFBbUJBLENBQUFBLGlCQUFpQixDQUFDO0FBQ2pDLElBQUlDLGVBQWU7QUFDekIsVUFBVUEsY0FBYztJQUNyQkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLE9BQU8sR0FBRztJQUN6QkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLGVBQWUsR0FBRztBQUNyQyxHQUFHQSxrQkFBbUJBLENBQUFBLGlCQUFpQixDQUFDO0FBQ2pDLElBQUlDLFdBQVc7QUFDckIsVUFBVUEsVUFBVTtJQUNqQkEsVUFBVSxDQUFDLFlBQVksR0FBRztBQUM5QixHQUFHQSxjQUFlQSxDQUFBQSxhQUFhLENBQUM7QUFDekIsSUFBSUMsaUJBQWlCO0FBQzNCLFVBQVVBLGdCQUFnQjtJQUN2QkEsZ0JBQWdCLENBQUMsYUFBYSxHQUFHO0lBQ2pDQSxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUc7SUFDM0JBLGdCQUFnQixDQUFDLFVBQVUsR0FBRztJQUM5QkEsZ0JBQWdCLENBQUMsU0FBUyxHQUFHO0FBQ2pDLEdBQUdBLG9CQUFxQkEsQ0FBQUEsbUJBQW1CLENBQUMsS0FDNUMscUNBQXFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL2NvbnN0YW50cy5qcz9hYzEzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24nO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVkVSU0lPTiA9IGByZWFsdGltZS1qcy8ke3ZlcnNpb259YDtcbmV4cG9ydCBjb25zdCBWU05fMV8wXzAgPSAnMS4wLjAnO1xuZXhwb3J0IGNvbnN0IFZTTl8yXzBfMCA9ICcyLjAuMCc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9WU04gPSBWU05fMV8wXzA7XG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IHZlcnNpb247XG5leHBvcnQgY29uc3QgREVGQVVMVF9USU1FT1VUID0gMTAwMDA7XG5leHBvcnQgY29uc3QgV1NfQ0xPU0VfTk9STUFMID0gMTAwMDtcbmV4cG9ydCBjb25zdCBNQVhfUFVTSF9CVUZGRVJfU0laRSA9IDEwMDtcbmV4cG9ydCB2YXIgU09DS0VUX1NUQVRFUztcbihmdW5jdGlvbiAoU09DS0VUX1NUQVRFUykge1xuICAgIFNPQ0tFVF9TVEFURVNbU09DS0VUX1NUQVRFU1tcImNvbm5lY3RpbmdcIl0gPSAwXSA9IFwiY29ubmVjdGluZ1wiO1xuICAgIFNPQ0tFVF9TVEFURVNbU09DS0VUX1NUQVRFU1tcIm9wZW5cIl0gPSAxXSA9IFwib3BlblwiO1xuICAgIFNPQ0tFVF9TVEFURVNbU09DS0VUX1NUQVRFU1tcImNsb3NpbmdcIl0gPSAyXSA9IFwiY2xvc2luZ1wiO1xuICAgIFNPQ0tFVF9TVEFURVNbU09DS0VUX1NUQVRFU1tcImNsb3NlZFwiXSA9IDNdID0gXCJjbG9zZWRcIjtcbn0pKFNPQ0tFVF9TVEFURVMgfHwgKFNPQ0tFVF9TVEFURVMgPSB7fSkpO1xuZXhwb3J0IHZhciBDSEFOTkVMX1NUQVRFUztcbihmdW5jdGlvbiAoQ0hBTk5FTF9TVEFURVMpIHtcbiAgICBDSEFOTkVMX1NUQVRFU1tcImNsb3NlZFwiXSA9IFwiY2xvc2VkXCI7XG4gICAgQ0hBTk5FTF9TVEFURVNbXCJlcnJvcmVkXCJdID0gXCJlcnJvcmVkXCI7XG4gICAgQ0hBTk5FTF9TVEFURVNbXCJqb2luZWRcIl0gPSBcImpvaW5lZFwiO1xuICAgIENIQU5ORUxfU1RBVEVTW1wiam9pbmluZ1wiXSA9IFwiam9pbmluZ1wiO1xuICAgIENIQU5ORUxfU1RBVEVTW1wibGVhdmluZ1wiXSA9IFwibGVhdmluZ1wiO1xufSkoQ0hBTk5FTF9TVEFURVMgfHwgKENIQU5ORUxfU1RBVEVTID0ge30pKTtcbmV4cG9ydCB2YXIgQ0hBTk5FTF9FVkVOVFM7XG4oZnVuY3Rpb24gKENIQU5ORUxfRVZFTlRTKSB7XG4gICAgQ0hBTk5FTF9FVkVOVFNbXCJjbG9zZVwiXSA9IFwicGh4X2Nsb3NlXCI7XG4gICAgQ0hBTk5FTF9FVkVOVFNbXCJlcnJvclwiXSA9IFwicGh4X2Vycm9yXCI7XG4gICAgQ0hBTk5FTF9FVkVOVFNbXCJqb2luXCJdID0gXCJwaHhfam9pblwiO1xuICAgIENIQU5ORUxfRVZFTlRTW1wicmVwbHlcIl0gPSBcInBoeF9yZXBseVwiO1xuICAgIENIQU5ORUxfRVZFTlRTW1wibGVhdmVcIl0gPSBcInBoeF9sZWF2ZVwiO1xuICAgIENIQU5ORUxfRVZFTlRTW1wiYWNjZXNzX3Rva2VuXCJdID0gXCJhY2Nlc3NfdG9rZW5cIjtcbn0pKENIQU5ORUxfRVZFTlRTIHx8IChDSEFOTkVMX0VWRU5UUyA9IHt9KSk7XG5leHBvcnQgdmFyIFRSQU5TUE9SVFM7XG4oZnVuY3Rpb24gKFRSQU5TUE9SVFMpIHtcbiAgICBUUkFOU1BPUlRTW1wid2Vic29ja2V0XCJdID0gXCJ3ZWJzb2NrZXRcIjtcbn0pKFRSQU5TUE9SVFMgfHwgKFRSQU5TUE9SVFMgPSB7fSkpO1xuZXhwb3J0IHZhciBDT05ORUNUSU9OX1NUQVRFO1xuKGZ1bmN0aW9uIChDT05ORUNUSU9OX1NUQVRFKSB7XG4gICAgQ09OTkVDVElPTl9TVEFURVtcIkNvbm5lY3RpbmdcIl0gPSBcImNvbm5lY3RpbmdcIjtcbiAgICBDT05ORUNUSU9OX1NUQVRFW1wiT3BlblwiXSA9IFwib3BlblwiO1xuICAgIENPTk5FQ1RJT05fU1RBVEVbXCJDbG9zaW5nXCJdID0gXCJjbG9zaW5nXCI7XG4gICAgQ09OTkVDVElPTl9TVEFURVtcIkNsb3NlZFwiXSA9IFwiY2xvc2VkXCI7XG59KShDT05ORUNUSU9OX1NUQVRFIHx8IChDT05ORUNUSU9OX1NUQVRFID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50cy5qcy5tYXAiXSwibmFtZXMiOlsidmVyc2lvbiIsIkRFRkFVTFRfVkVSU0lPTiIsIlZTTl8xXzBfMCIsIlZTTl8yXzBfMCIsIkRFRkFVTFRfVlNOIiwiVkVSU0lPTiIsIkRFRkFVTFRfVElNRU9VVCIsIldTX0NMT1NFX05PUk1BTCIsIk1BWF9QVVNIX0JVRkZFUl9TSVpFIiwiU09DS0VUX1NUQVRFUyIsIkNIQU5ORUxfU1RBVEVTIiwiQ0hBTk5FTF9FVkVOVFMiLCJUUkFOU1BPUlRTIiwiQ09OTkVDVElPTl9TVEFURSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/push.js":
/*!********************************************************************!*\
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/push.js ***!
\********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Push; }\n/* harmony export */ });\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/constants */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\");\n\nclass Push {\n resend(timeout) {\n this.timeout = timeout;\n this._cancelRefEvent();\n this.ref = \"\";\n this.refEvent = null;\n this.receivedResp = null;\n this.sent = false;\n this.send();\n }\n send() {\n if (this._hasReceived(\"timeout\")) {\n return;\n }\n this.startTimeout();\n this.sent = true;\n this.channel.socket.push({\n topic: this.channel.topic,\n event: this.event,\n payload: this.payload,\n ref: this.ref,\n join_ref: this.channel._joinRef()\n });\n }\n updatePayload(payload) {\n this.payload = Object.assign(Object.assign({}, this.payload), payload);\n }\n receive(status, callback) {\n var _a;\n if (this._hasReceived(status)) {\n callback((_a = this.receivedResp) === null || _a === void 0 ? void 0 : _a.response);\n }\n this.recHooks.push({\n status,\n callback\n });\n return this;\n }\n startTimeout() {\n if (this.timeoutTimer) {\n return;\n }\n this.ref = this.channel.socket._makeRef();\n this.refEvent = this.channel._replyEventName(this.ref);\n const callback = (payload)=>{\n this._cancelRefEvent();\n this._cancelTimeout();\n this.receivedResp = payload;\n this._matchReceive(payload);\n };\n this.channel._on(this.refEvent, {}, callback);\n this.timeoutTimer = setTimeout(()=>{\n this.trigger(\"timeout\", {});\n }, this.timeout);\n }\n trigger(status, response) {\n if (this.refEvent) this.channel._trigger(this.refEvent, {\n status,\n response\n });\n }\n destroy() {\n this._cancelRefEvent();\n this._cancelTimeout();\n }\n _cancelRefEvent() {\n if (!this.refEvent) {\n return;\n }\n this.channel._off(this.refEvent, {});\n }\n _cancelTimeout() {\n clearTimeout(this.timeoutTimer);\n this.timeoutTimer = undefined;\n }\n _matchReceive(param) {\n let { status, response } = param;\n this.recHooks.filter((h)=>h.status === status).forEach((h)=>h.callback(response));\n }\n _hasReceived(status) {\n return this.receivedResp && this.receivedResp.status === status;\n }\n /**\n * Initializes the Push\n *\n * @param channel The Channel\n * @param event The event, for example `\"phx_join\"`\n * @param payload The payload, for example `{user_id: 123}`\n * @param timeout The push timeout in milliseconds\n */ constructor(channel, event, payload = {}, timeout = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_TIMEOUT){\n this.channel = channel;\n this.event = event;\n this.payload = payload;\n this.timeout = timeout;\n this.sent = false;\n this.timeoutTimer = undefined;\n this.ref = \"\";\n this.receivedResp = null;\n this.recHooks = [];\n this.refEvent = null;\n }\n} //# sourceMappingURL=push.js.map\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3B1c2guanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBbUQ7QUFDcEMsTUFBTUM7SUFxQmpCQyxPQUFPQyxPQUFPLEVBQUU7UUFDWixJQUFJLENBQUNBLE9BQU8sR0FBR0E7UUFDZixJQUFJLENBQUNDLGVBQWU7UUFDcEIsSUFBSSxDQUFDQyxHQUFHLEdBQUc7UUFDWCxJQUFJLENBQUNDLFFBQVEsR0FBRztRQUNoQixJQUFJLENBQUNDLFlBQVksR0FBRztRQUNwQixJQUFJLENBQUNDLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ0MsSUFBSTtJQUNiO0lBQ0FBLE9BQU87UUFDSCxJQUFJLElBQUksQ0FBQ0MsWUFBWSxDQUFDLFlBQVk7WUFDOUI7UUFDSjtRQUNBLElBQUksQ0FBQ0MsWUFBWTtRQUNqQixJQUFJLENBQUNILElBQUksR0FBRztRQUNaLElBQUksQ0FBQ0ksT0FBTyxDQUFDQyxNQUFNLENBQUNDLElBQUksQ0FBQztZQUNyQkMsT0FBTyxJQUFJLENBQUNILE9BQU8sQ0FBQ0csS0FBSztZQUN6QkMsT0FBTyxJQUFJLENBQUNBLEtBQUs7WUFDakJDLFNBQVMsSUFBSSxDQUFDQSxPQUFPO1lBQ3JCWixLQUFLLElBQUksQ0FBQ0EsR0FBRztZQUNiYSxVQUFVLElBQUksQ0FBQ04sT0FBTyxDQUFDTyxRQUFRO1FBQ25DO0lBQ0o7SUFDQUMsY0FBY0gsT0FBTyxFQUFFO1FBQ25CLElBQUksQ0FBQ0EsT0FBTyxHQUFHSSxPQUFPQyxNQUFNLENBQUNELE9BQU9DLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDTCxPQUFPLEdBQUdBO0lBQ2xFO0lBQ0FNLFFBQVFDLE1BQU0sRUFBRUMsUUFBUSxFQUFFO1FBQ3RCLElBQUlDO1FBQ0osSUFBSSxJQUFJLENBQUNoQixZQUFZLENBQUNjLFNBQVM7WUFDM0JDLFNBQVMsQ0FBQ0MsS0FBSyxJQUFJ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bWUtanMvZGlzdC9tb2R1bGUvbGliL3B1c2guanM/NDQ4ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUZBVUxUX1RJTUVPVVQgfSBmcm9tICcuLi9saWIvY29uc3RhbnRzJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFB1c2gge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRoZSBQdXNoXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgQ2hhbm5lbFxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGZvciBleGFtcGxlIGBcInBoeF9qb2luXCJgXG4gICAgICogQHBhcmFtIHBheWxvYWQgVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAgICAgKiBAcGFyYW0gdGltZW91dCBUaGUgcHVzaCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkID0ge30sIHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQpIHtcbiAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcbiAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50O1xuICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICB0aGlzLnNlbnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50aW1lb3V0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmVmID0gJyc7XG4gICAgICAgIHRoaXMucmVjZWl2ZWRSZXNwID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWNIb29rcyA9IFtdO1xuICAgICAgICB0aGlzLnJlZkV2ZW50ID0gbnVsbDtcbiAgICB9XG4gICAgcmVzZW5kKHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgdGhpcy5fY2FuY2VsUmVmRXZlbnQoKTtcbiAgICAgICAgdGhpcy5yZWYgPSAnJztcbiAgICAgICAgdGhpcy5yZWZFdmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMucmVjZWl2ZWRSZXNwID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VuZCgpO1xuICAgIH1cbiAgICBzZW5kKCkge1xuICAgICAgICBpZiAodGhpcy5faGFzUmVjZWl2ZWQoJ3RpbWVvdXQnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuc2VudCA9IHRydWU7XG4gICAgICAgIHRoaXMuY2hhbm5lbC5zb2NrZXQucHVzaCh7XG4gICAgICAgICAgICB0b3BpYzogdGhpcy5jaGFubmVsLnRvcGljLFxuICAgICAgICAgICAgZXZlbnQ6IHRoaXMuZXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkOiB0aGlzLnBheWxvYWQsXG4gICAgICAgICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgICAgICAgam9pbl9yZWY6IHRoaXMuY2hhbm5lbC5fam9pblJlZigpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXBkYXRlUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgIHRoaXMucGF5bG9hZCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXlsb2FkKSwgcGF5bG9hZCk7XG4gICAgfVxuICAgIHJlY2VpdmUoc3RhdHVzLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLl9oYXNSZWNlaXZlZChzdGF0dXMpKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygoX2EgPSB0aGlzLnJlY2VpdmVkUmVzcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlY0hvb2tzLnB1c2goeyBzdGF0dXMsIGNhbGxiYWNrIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhcnRUaW1lb3V0KCkge1xuICAgICAgICBpZiAodGhpcy50aW1lb3V0VGltZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZiA9IHRoaXMuY2hhbm5lbC5zb2NrZXQuX21ha2VSZWYoKTtcbiAgICAgICAgdGhpcy5yZWZFdmVudCA9IHRoaXMuY2hhbm5lbC5fcmVwbHlFdmVudE5hbWUodGhpcy5yZWYpO1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxSZWZFdmVudCgpO1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGltZW91dCgpO1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkO1xuICAgICAgICAgICAgdGhpcy5fbWF0Y2hSZWNlaXZlKHBheWxvYWQpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNoYW5uZWwuX29uKHRoaXMucmVmRXZlbnQsIHt9LCBjYWxsYmFjayk7XG4gICAgICAgIHRoaXMudGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3RpbWVvdXQnLCB7fSk7XG4gICAgICAgIH0sIHRoaXMudGltZW91dCk7XG4gICAgfVxuICAgIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5yZWZFdmVudClcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5fdHJpZ2dlcih0aGlzLnJlZkV2ZW50LCB7IHN0YXR1cywgcmVzcG9uc2UgfSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX2NhbmNlbFJlZkV2ZW50KCk7XG4gICAgICAgIHRoaXMuX2NhbmNlbFRpbWVvdXQoKTtcbiAgICB9XG4gICAgX2NhbmNlbFJlZkV2ZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMucmVmRXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5uZWwuX29mZih0aGlzLnJlZkV2ZW50LCB7fSk7XG4gICAgfVxuICAgIF9jYW5jZWxUaW1lb3V0KCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpO1xuICAgICAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgX21hdGNoUmVjZWl2ZSh7IHN0YXR1cywgcmVzcG9uc2UgfSkge1xuICAgICAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcigoaCkgPT4gaC5zdGF0dXMgPT09IHN0YXR1cykuZm9yRWFjaCgoaCkgPT4gaC5jYWxsYmFjayhyZXNwb25zZSkpO1xuICAgIH1cbiAgICBfaGFzUmVjZWl2ZWQoc3RhdHVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlY2VpdmVkUmVzcCAmJiB0aGlzLnJlY2VpdmVkUmVzcC5zdGF0dXMgPT09IHN0YXR1cztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdXNoLmpzLm1hcCJdLCJuYW1lcyI6WyJERUZBVUxUX1RJTUVPVVQiLCJQdXNoIiwicmVzZW5kIiwidGltZW91dCIsIl9jYW5jZWxSZWZFdmVudCIsInJlZiIsInJlZkV2ZW50IiwicmVjZWl2ZWRSZXNwIiwic2VudCIsInNlbmQiLCJfaGFzUmVjZWl2ZWQiLCJzdGFydFRpbWVvdXQiLCJjaGFubmVsIiwic29ja2V0IiwicHVzaCIsInRvcGljIiwiZXZlbnQiLCJwYXlsb2FkIiwiam9pbl9yZWYiLCJfam9pblJlZiIsInVwZGF0ZVBheWxvYWQiLCJPYmplY3QiLCJhc3NpZ24iLCJyZWNlaXZlIiwic3RhdHVzIiwiY2FsbGJhY2siLCJfYSIsInJlc3BvbnNlIiwicmVjSG9va3MiLCJ0aW1lb3V0VGltZXIiLCJfbWFrZVJlZiIsIl9yZXBseUV2ZW50TmFtZSIsIl9jYW5jZWxUaW1lb3V0IiwiX21hdGNoUmVjZWl2ZSIsIl9vbiIsInNldFRpbWVvdXQiLCJ0cmlnZ2VyIiwiX3RyaWdnZXIiLCJkZXN0cm95IiwiX29mZiIsImNsZWFyVGltZW91dCIsInVuZGVmaW5lZCIsImZpbHRlciIsImgiLCJmb3JFYWNoIiwiY29uc3RydWN0b3IiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/push.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js":
/*!**************************************************************************!*\
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js ***!
\**************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Serializer; }\n/* harmony export */ });\nclass Serializer {\n encode(msg, callback) {\n if (msg.event === this.BROADCAST_EVENT && !(msg.payload instanceof ArrayBuffer) && typeof msg.payload.event === \"string\") {\n return callback(this._binaryEncodeUserBroadcastPush(msg));\n }\n let payload = [\n msg.join_ref,\n msg.ref,\n msg.topic,\n msg.event,\n msg.payload\n ];\n return callback(JSON.stringify(payload));\n }\n _binaryEncodeUserBroadcastPush(message) {\n var _a;\n if (this._isArrayBuffer((_a = message.payload) === null || _a === void 0 ? void 0 : _a.payload)) {\n return this._encodeBinaryUserBroadcastPush(message);\n } else {\n return this._encodeJsonUserBroadcastPush(message);\n }\n }\n _encodeBinaryUserBroadcastPush(message) {\n var _a, _b;\n const userPayload = (_b = (_a = message.payload) === null || _a === void 0 ? void 0 : _a.payload) !== null && _b !== void 0 ? _b : new ArrayBuffer(0);\n return this._encodeUserBroadcastPush(message, this.BINARY_ENCODING, userPayload);\n }\n _encodeJsonUserBroadcastPush(message) {\n var _a, _b;\n const userPayload = (_b = (_a = message.payload) === null || _a === void 0 ? void 0 : _a.payload) !== null && _b !== void 0 ? _b : {};\n const encoder = new TextEncoder();\n const encodedUserPayload = encoder.encode(JSON.stringify(userPayload)).buffer;\n return this._encodeUserBroadcastPush(message, this.JSON_ENCODING, encodedUserPayload);\n }\n _encodeUserBroadcastPush(message, encodingType, encodedPayload) {\n var _a, _b;\n const topic = message.topic;\n const ref = (_a = message.ref) !== null && _a !== void 0 ? _a : \"\";\n const joinRef = (_b = message.join_ref) !== null && _b !== void 0 ? _b : \"\";\n const userEvent = message.payload.event;\n // Filter metadata based on allowed keys\n const rest = this.allowedMetadataKeys ? this._pick(message.payload, this.allowedMetadataKeys) : {};\n const metadata = Object.keys(rest).length === 0 ? \"\" : JSON.stringify(rest);\n // Validate lengths don't exceed uint8 max value (255)\n if (joinRef.length > 255) {\n throw new Error(\"joinRef length \".concat(joinRef.length, \" exceeds maximum of 255\"));\n }\n if (ref.length > 255) {\n throw new Error(\"ref length \".concat(ref.length, \" exceeds maximum of 255\"));\n }\n if (topic.length > 255) {\n throw new Error(\"topic length \".concat(topic.length, \" exceeds maximum of 255\"));\n }\n if (userEvent.length > 255) {\n throw new Error(\"userEvent length \".concat(userEvent.length, \" exceeds maximum of 255\"));\n }\n if (metadata.length > 255) {\n throw new Error(\"metadata length \".concat(metadata.length, \" exceeds maximum of 255\"));\n }\n const metaLength = this.USER_BROADCAST_PUSH_META_LENGTH + joinRef.length + ref.length + topic.length + userEvent.length + metadata.length;\n const header = new ArrayBuffer(this.HEADER_LENGTH + metaLength);\n let view = new DataView(header);\n let offset = 0;\n view.setUint8(offset++, this.KINDS.userBroadcastPush); // kind\n view.setUint8(offset++, joinRef.length);\n view.setUint8(offset++, ref.length);\n view.setUint8(offset++, topic.length);\n view.setUint8(offset++, userEvent.length);\n view.setUint8(offset++, metadata.length);\n view.setUint8(offset++, encodingType);\n Array.from(joinRef, (char)=>view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(ref, (char)=>view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(topic, (char)=>view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(userEvent, (char)=>view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(metadata, (char)=>view.setUint8(offset++, char.charCodeAt(0)));\n var combined = new Uint8Array(header.byteLength + encodedPayload.byteLength);\n combined.set(new Uint8Array(header), 0);\n combined.set(new Uint8Array(encodedPayload), header.byteLength);\n return combined.buffer;\n }\n decode(rawPayload, callback) {\n if (this._isArrayBuffer(rawPayload)) {\n let result = this._binaryDecode(rawPayload);\n return callback(result);\n }\n if (typeof rawPayload === \"string\") {\n const jsonPayload = JSON.parse(rawPayload);\n const [join_ref, ref, topic, event, payload] = jsonPayload;\n return callback({\n join_ref,\n ref,\n topic,\n event,\n payload\n });\n }\n return callback({});\n }\n _binaryDecode(buffer) {\n const view = new DataView(buffer);\n const kind = view.getUint8(0);\n const decoder = new TextDecoder();\n switch(kind){\n case this.KINDS.userBroadcast:\n return this._decodeUserBroadcast(buffer, view, decoder);\n }\n }\n _decodeUserBroadcast(buffer, view, decoder) {\n const topicSize = view.getUint8(1);\n const userEventSize = view.getUint8(2);\n const metadataSize = view.getUint8(3);\n const payloadEncoding = view.getUint8(4);\n let offset = this.HEADER_LENGTH + 4;\n const topic = decoder.decode(buffer.slice(offset, offset + topicSize));\n offset = offset + topicSize;\n const userEvent = decoder.decode(buffer.slice(offset, offset + userEventSize));\n offset = offset + userEventSize;\n const metadata = decoder.decode(buffer.slice(offset, offset + metadataSize));\n offset = offset + metadataSize;\n const payload = buffer.slice(offset, buffer.byteLength);\n const parsedPayload = payloadEncoding === this.JSON_ENCODING ? JSON.parse(decoder.decode(payload)) : payload;\n const data = {\n type: this.BROADCAST_EVENT,\n event: userEvent,\n payload: parsedPayload\n };\n // Metadata is optional and always JSON encoded\n if (metadataSize > 0) {\n data[\"meta\"] = JSON.parse(metadata);\n }\n return {\n join_ref: null,\n ref: null,\n topic: topic,\n event: this.BROADCAST_EVENT,\n payload: data\n };\n }\n _isArrayBuffer(buffer) {\n var _a;\n return buffer instanceof ArrayBuffer || ((_a = buffer === null || buffer === void 0 ? void 0 : buffer.constructor) === null || _a === void 0 ? void 0 : _a.name) === \"ArrayBuffer\";\n }\n _pick(obj, keys) {\n if (!obj || typeof obj !== \"object\") {\n return {};\n }\n return Object.fromEntries(Object.entries(obj).filter((param)=>{\n let [key] = param;\n return keys.includes(key);\n }));\n }\n constructor(allowedMetadataKeys){\n this.HEADER_LENGTH = 1;\n this.USER_BROADCAST_PUSH_META_LENGTH = 6;\n this.KINDS = {\n userBroadcastPush: 3,\n userBroadcast: 4\n };\n this.BINARY_ENCODING = 0;\n this.JSON_ENCODING = 1;\n this.BROADCAST_EVENT = \"broadcast\";\n this.allowedMetadataKeys = [];\n this.allowedMetadataKeys = allowedMetadataKeys !== null && allowedMetadataKeys !== void 0 ? allowedMetadataKeys : [];\n }\n} //# sourceMappingURL=serializer.js.map\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3NlcmlhbGl6ZXIuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFlLE1BQU1BO0lBV2pCQyxPQUFPQyxHQUFHLEVBQUVDLFFBQVEsRUFBRTtRQUNsQixJQUFJRCxJQUFJRSxLQUFLLEtBQUssSUFBSSxDQUFDQyxlQUFlLElBQ2xDLENBQUVILENBQUFBLElBQUlJLE9BQU8sWUFBWUMsV0FBVSxLQUNuQyxPQUFPTCxJQUFJSSxPQUFPLENBQUNGLEtBQUssS0FBSyxVQUFVO1lBQ3ZDLE9BQU9ELFNBQVMsSUFBSSxDQUFDSyw4QkFBOEIsQ0FBQ047UUFDeEQ7UUFDQSxJQUFJSSxVQUFVO1lBQUNKLElBQUlPLFFBQVE7WUFBRVAsSUFBSVEsR0FBRztZQUFFUixJQUFJUyxLQUFLO1lBQUVULElBQUlFLEtBQUs7WUFBRUYsSUFBSUksT0FBTztTQUFDO1FBQ3hFLE9BQU9ILFNBQVNTLEtBQUtDLFNBQVMsQ0FBQ1A7SUFDbkM7SUFDQUUsK0JBQStCTSxPQUFPLEVBQUU7UUFDcEMsSUFBSUM7UUFDSixJQUFJLElBQUksQ0FBQ0MsY0FBYyxDQUFDLENBQUNELEtBQUtELFFBQVFSLE9BQU8sTUFBTSxRQUFRUyxPQUFPLEtBQUssSUFBSSxLQUFLLElBQUlBLEdBQUdULE9BQU8sR0FBRztZQUM3RixPQUFPLElBQUksQ0FBQ1csOEJBQThCLENBQUNIO1FBQy9DLE9BQ0s7WUFDRCxPQUFPLElBQUksQ0FBQ0ksNEJBQTRCLENBQUNKO1FBQzdDO0lBQ0o7SUFDQUcsK0JBQStCSCxPQUFPLEVBQUU7UUFDcEMsSUFBSUMsSUFBSUk7UUFDUixNQUFNQyxjQUFjLENBQUNELEtBQUssQ0FBQ0osS0FBS0QsUUFBUVIsT0FBTyxNQUFNLFFBQVFTLE9BQU8sS0FBSyxJQUFJLEtBQUssSUFBSUEsR0FBR1QsT0FBTyxNQUFNLFFBQVFhLE9BQU8sS0FBSyxJQUFJQSxLQUFLLElB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bUI7WUFBR21CLGVBQWU7UUFBRTtRQUN0RCxJQUFJLENBQUM5QyxlQUFlLEdBQUc7UUFDdkIsSUFBSSxDQUFDSyxhQUFhLEdBQUc7UUFDckIsSUFBSSxDQUFDdEIsZUFBZSxHQUFHO1FBQ3ZCLElBQUksQ0FBQzRCLG1CQUFtQixHQUFHLEVBQUU7UUFDN0IsSUFBSSxDQUFDQSxtQkFBbUIsR0FBR0Esd0JBQXdCLFFBQVFBLHdCQUF3QixLQUFLLElBQUlBLHNCQUFzQixFQUFFO0lBQ3hIO0FBNElKLEVBQ0Esc0NBQXNDO0FBRHJDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3NlcmlhbGl6ZXIuanM/ODFkYiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJpYWxpemVyIHtcbiAgICBjb25zdHJ1Y3RvcihhbGxvd2VkTWV0YWRhdGFLZXlzKSB7XG4gICAgICAgIHRoaXMuSEVBREVSX0xFTkdUSCA9IDE7XG4gICAgICAgIHRoaXMuVVNFUl9CUk9BRENBU1RfUFVTSF9NRVRBX0xFTkdUSCA9IDY7XG4gICAgICAgIHRoaXMuS0lORFMgPSB7IHVzZXJCcm9hZGNhc3RQdXNoOiAzLCB1c2VyQnJvYWRjYXN0OiA0IH07XG4gICAgICAgIHRoaXMuQklOQVJZX0VOQ09ESU5HID0gMDtcbiAgICAgICAgdGhpcy5KU09OX0VOQ09ESU5HID0gMTtcbiAgICAgICAgdGhpcy5CUk9BRENBU1RfRVZFTlQgPSAnYnJvYWRjYXN0JztcbiAgICAgICAgdGhpcy5hbGxvd2VkTWV0YWRhdGFLZXlzID0gW107XG4gICAgICAgIHRoaXMuYWxsb3dlZE1ldGFkYXRhS2V5cyA9IGFsbG93ZWRNZXRhZGF0YUtleXMgIT09IG51bGwgJiYgYWxsb3dlZE1ldGFkYXRhS2V5cyAhPT0gdm9pZCAwID8gYWxsb3dlZE1ldGFkYXRhS2V5cyA6IFtdO1xuICAgIH1cbiAgICBlbmNvZGUobXNnLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAobXNnLmV2ZW50ID09PSB0aGlzLkJST0FEQ0FTVF9FVkVOVCAmJlxuICAgICAgICAgICAgIShtc2cucGF5bG9hZCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSAmJlxuICAgICAgICAgICAgdHlwZW9mIG1zZy5wYXlsb2FkLmV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX2JpbmFyeUVuY29kZVVzZXJCcm9hZGNhc3RQdXNoKG1zZykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXlsb2FkID0gW21zZy5qb2luX3JlZiwgbXNnLnJlZiwgbXNnLnRvcGljLCBtc2cuZXZlbnQsIG1zZy5wYXlsb2FkXTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgICB9XG4gICAgX2JpbmFyeUVuY29kZVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5faXNBcnJheUJ1ZmZlcigoX2EgPSBtZXNzYWdlLnBheWxvYWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXlsb2FkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZUJpbmFyeVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZUpzb25Vc2VyQnJvYWRjYXN0UHVzaChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZW5jb2RlQmluYXJ5VXNlckJyb2FkY2FzdFB1c2gobWVzc2FnZSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB1c2VyUGF5bG9hZCA9IChfYiA9IChfYSA9IG1lc3NhZ2UucGF5bG9hZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBheWxvYWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UsIHRoaXMuQklOQVJZX0VOQ09ESU5HLCB1c2VyUGF5bG9hZCk7XG4gICAgfVxuICAgIF9lbmNvZGVKc29uVXNlckJyb2FkY2FzdFB1c2gobWVzc2FnZSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB1c2VyUGF5bG9hZCA9IChfYiA9IChfYSA9IG1lc3NhZ2UucGF5bG9hZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBheWxvYWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9O1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGVuY29kZWRVc2VyUGF5bG9hZCA9IGVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHVzZXJQYXlsb2FkKSkuYnVmZmVyO1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2RlVXNlckJyb2FkY2FzdFB1c2gobWVzc2FnZSwgdGhpcy5KU09OX0VOQ09ESU5HLCBlbmNvZGVkVXNlclBheWxvYWQpO1xuICAgIH1cbiAgICBfZW5jb2RlVXNlckJyb2FkY2FzdFB1c2gobWVzc2FnZSwgZW5jb2RpbmdUeXBlLCBlbmNvZGVkUGF5bG9hZCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB0b3BpYyA9IG1lc3NhZ2UudG9waWM7XG4gICAgICAgIGNvbnN0IHJlZiA9IChfYSA9IG1lc3NhZ2UucmVmKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICAgICAgY29uc3Qgam9pblJlZiA9IChfYiA9IG1lc3NhZ2Uuam9pbl9yZWYpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xuICAgICAgICBjb25zdCB1c2VyRXZlbnQgPSBtZXNzYWdlLnBheWxvYWQuZXZlbnQ7XG4gICAgICAgIC8vIEZpbHRlciBtZXRhZGF0YSBiYXNlZCBvbiBhbGxvd2VkIGtleXNcbiAgICAgICAgY29uc3QgcmVzdCA9IHRoaXMuYWxsb3dlZE1ldGFkYXRhS2V5c1xuICAgICAgICAgICAgPyB0aGlzLl9waWNrKG1lc3NhZ2UucGF5bG9hZCwgdGhpcy5hbGxvd2VkTWV0YWRhdGFLZXlzKVxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBPYmplY3Qua2V5cyhyZXN0KS5sZW5ndGggPT09IDAgPyAnJyA6IEpTT04uc3RyaW5naWZ5KHJlc3QpO1xuICAgICAgICAvLyBWYWxpZGF0ZSBsZW5ndGhzIGRvbid0IGV4Y2VlZCB1aW50OCBtYXggdmFsdWUgKDI1NSlcbiAgICAgICAgaWYgKGpvaW5SZWYubGVuZ3RoID4gMjU1KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGpvaW5SZWYgbGVuZ3RoICR7am9pblJlZi5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAyNTVgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmLmxlbmd0aCA+IDI1NSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGByZWYgbGVuZ3RoICR7cmVmLmxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtIG9mIDI1NWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b3BpYy5sZW5ndGggPiAyNTUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9waWMgbGVuZ3RoICR7dG9waWMubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgMjU1YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZXJFdmVudC5sZW5ndGggPiAyNTUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdXNlckV2ZW50IGxlbmd0aCAke3VzZXJFdmVudC5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAyNTVgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubGVuZ3RoID4gMjU1KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1ldGFkYXRhIGxlbmd0aCAke21ldGFkYXRhLmxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtIG9mIDI1NWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFMZW5ndGggPSB0aGlzLlVTRVJfQlJPQURDQVNUX1BVU0hfTUVUQV9MRU5HVEggK1xuICAgICAgICAgICAgam9pblJlZi5sZW5ndGggK1xuICAgICAgICAgICAgcmVmLmxlbmd0aCArXG4gICAgICAgICAgICB0b3BpYy5sZW5ndGggK1xuICAgICAgICAgICAgdXNlckV2ZW50Lmxlbmd0aCArXG4gICAgICAgICAgICBtZXRhZGF0YS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLkhFQURFUl9MRU5HVEggKyBtZXRhTGVuZ3RoKTtcbiAgICAgICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKTtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIHRoaXMuS0lORFMudXNlckJyb2FkY2FzdFB1c2gpOyAvLyBraW5kXG4gICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGpvaW5SZWYubGVuZ3RoKTtcbiAgICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aCk7XG4gICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIHRvcGljLmxlbmd0aCk7XG4gICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIHVzZXJFdmVudC5sZW5ndGgpO1xuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBtZXRhZGF0YS5sZW5ndGgpO1xuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBlbmNvZGluZ1R5cGUpO1xuICAgICAgICBBcnJheS5mcm9tKGpvaW5SZWYsIChjaGFyKSA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbiAgICAgICAgQXJyYXkuZnJvbShyZWYsIChjaGFyKSA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbiAgICAgICAgQXJyYXkuZnJvbSh0b3BpYywgKGNoYXIpID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpO1xuICAgICAgICBBcnJheS5mcm9tKHVzZXJFdmVudCwgKGNoYXIpID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpO1xuICAgICAgICBBcnJheS5mcm9tKG1ldGFkYXRhLCAoY2hhcikgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSk7XG4gICAgICAgIHZhciBjb21iaW5lZCA9IG5ldyBVaW50OEFycmF5KGhlYWRlci5ieXRlTGVuZ3RoICsgZW5jb2RlZFBheWxvYWQuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbWJpbmVkLnNldChuZXcgVWludDhBcnJheShoZWFkZXIpLCAwKTtcbiAgICAgICAgY29tYmluZWQuc2V0KG5ldyBVaW50OEFycmF5KGVuY29kZWRQYXlsb2FkKSwgaGVhZGVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gY29tYmluZWQuYnVmZmVyO1xuICAgIH1cbiAgICBkZWNvZGUocmF3UGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQXJyYXlCdWZmZXIocmF3UGF5bG9hZCkpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9iaW5hcnlEZWNvZGUocmF3UGF5bG9hZCk7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJhd1BheWxvYWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBqc29uUGF5bG9hZCA9IEpTT04ucGFyc2UocmF3UGF5bG9hZCk7XG4gICAgICAgICAgICBjb25zdCBbam9pbl9yZWYsIHJlZiwgdG9waWMsIGV2ZW50LCBwYXlsb2FkXSA9IGpzb25QYXlsb2FkO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHsgam9pbl9yZWYsIHJlZiwgdG9waWMsIGV2ZW50LCBwYXlsb2FkIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh7fSk7XG4gICAgfVxuICAgIF9iaW5hcnlEZWNvZGUoYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcbiAgICAgICAgY29uc3Qga2luZCA9IHZpZXcuZ2V0VWludDgoMCk7XG4gICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlIHRoaXMuS0lORFMudXNlckJyb2FkY2FzdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlVXNlckJyb2FkY2FzdChidWZmZXIsIHZpZXcsIGRlY29kZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9kZWNvZGVVc2VyQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcikge1xuICAgICAgICBjb25zdCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDEpO1xuICAgICAgICBjb25zdCB1c2VyRXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFTaXplID0gdmlldy5nZXRVaW50OCgzKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZEVuY29kaW5nID0gdmlldy5nZXRVaW50OCg0KTtcbiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuSEVBREVSX0xFTkdUSCArIDQ7XG4gICAgICAgIGNvbnN0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSk7XG4gICAgICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZTtcbiAgICAgICAgY29uc3QgdXNlckV2ZW50ID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdXNlckV2ZW50U2l6ZSkpO1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyB1c2VyRXZlbnRTaXplO1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIG1ldGFkYXRhU2l6ZSkpO1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyBtZXRhZGF0YVNpemU7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHBhcnNlZFBheWxvYWQgPSBwYXlsb2FkRW5jb2RpbmcgPT09IHRoaXMuSlNPTl9FTkNPRElORyA/IEpTT04ucGFyc2UoZGVjb2Rlci5kZWNvZGUocGF5bG9hZCkpIDogcGF5bG9hZDtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuQlJPQURDQVNUX0VWRU5ULFxuICAgICAgICAgICAgZXZlbnQ6IHVzZXJFdmVudCxcbiAgICAgICAgICAgIHBheWxvYWQ6IHBhcnNlZFBheWxvYWQsXG4gICAgICAgIH07XG4gICAgICAgIC8vIE1ldGFkYXRhIGlzIG9wdGlvbmFsIGFuZCBhbHdheXMgSlNPTiBlbmNvZGVkXG4gICAgICAgIGlmIChtZXRhZGF0YVNpemUgPiAwKSB7XG4gICAgICAgICAgICBkYXRhWydtZXRhJ10gPSBKU09OLnBhcnNlKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBqb2luX3JlZjogbnVsbCwgcmVmOiBudWxsLCB0b3BpYzogdG9waWMsIGV2ZW50OiB0aGlzLkJST0FEQ0FTVF9FVkVOVCwgcGF5bG9hZDogZGF0YSB9O1xuICAgIH1cbiAgICBfaXNBcnJheUJ1ZmZlcihidWZmZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgKChfYSA9IGJ1ZmZlciA9PT0gbnVsbCB8fCBidWZmZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ1ZmZlci5jb25zdHJ1Y3RvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5hbWUpID09PSAnQXJyYXlCdWZmZXInO1xuICAgIH1cbiAgICBfcGljayhvYmosIGtleXMpIHtcbiAgICAgICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChba2V5XSkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VyaWFsaXplci5qcy5tYXAiXSwibmFtZXMiOlsiU2VyaWFsaXplciIsImVuY29kZSIsIm1zZyIsImNhbGxiYWNrIiwiZXZlbnQiLCJCUk9BRENBU1RfRVZFTlQiLCJwYXlsb2FkIiwiQXJyYXlCdWZmZXIiLCJfYmluYXJ5RW5jb2RlVXNlckJyb2FkY2FzdFB1c2giLCJqb2luX3JlZiIsInJlZiIsInRvcGljIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1lc3NhZ2UiLCJfYSIsIl9pc0FycmF5QnVmZmVyIiwiX2VuY29kZUJpbmFyeVVzZXJCcm9hZGNhc3RQdXNoIiwiX2VuY29kZUpzb25Vc2VyQnJvYWRjYXN0UHVzaCIsIl9iIiwidXNlclBheWxvYWQiLCJfZW5jb2RlVXNlckJyb2FkY2FzdFB1c2giLCJCSU5BUllfRU5DT0RJTkciLCJlbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJlbmNvZGVkVXNlclBheWxvYWQiLCJidWZmZXIiLCJKU09OX0VOQ09ESU5HIiwiZW5jb2RpbmdUeXBlIiwiZW5jb2RlZFBheWxvYWQiLCJqb2luUmVmIiwidXNlckV2ZW50IiwicmVzdCIsImFsbG93ZWRNZXRhZGF0YUtleXMiLCJfcGljayIsIm1ldGFkYXRhIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsIkVycm9yIiwibWV0YUxlbmd0aCIsIlVTRVJfQlJPQURDQVNUX1BVU0hfTUVUQV9MRU5HVEgiLCJoZWFkZXIiLCJIRUFERVJfTEVOR1RIIiwidmlldyIsIkRhdGFWaWV3Iiwib2Zmc2V0Iiwic2V0VWludDgiLCJLSU5EUyIsInVzZXJCcm9hZGNhc3RQdXNoIiwiQXJyYXkiLCJmcm9tIiwiY2hhciIsImNoYXJDb2RlQXQiLCJjb21iaW5lZCIsIlVpbnQ4QXJyYXkiLCJieXRlTGVuZ3RoIiwic2V0IiwiZGVjb2RlIiwicmF3UGF5bG9hZCIsInJlc3VsdCIsIl9iaW5hcnlEZWNvZGUiLCJqc29uUGF5bG9hZCIsInBhcnNlIiwia2luZCIsImdldFVpbnQ4IiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwidXNlckJyb2FkY2FzdCIsIl9kZWNvZGVVc2VyQnJvYWRjYXN0IiwidG9waWNTaXplIiwidXNlckV2ZW50U2l6ZSIsIm1ldGFkYXRhU2l6ZSIsInBheWxvYWRFbmNvZGluZyIsInNsaWNlIiwicGFyc2VkUGF5bG9hZCIsImRhdGEiLCJ0eXBlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwib2JqIiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwiZmlsdGVyIiwia2V5IiwiaW5jbHVkZXMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js":
/*!*********************************************************************!*\
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/timer.js ***!
\*********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ Timer; }\n/* harmony export */ });\n/**\n * Creates a timer that accepts a `timerCalc` function to perform calculated timeout retries, such as exponential backoff.\n *\n * @example\n * let reconnectTimer = new Timer(() => this.connect(), function(tries){\n * return [1000, 5000, 10000][tries - 1] || 10000\n * })\n * reconnectTimer.scheduleTimeout() // fires after 1000\n * reconnectTimer.scheduleTimeout() // fires after 5000\n * reconnectTimer.reset()\n * reconnectTimer.scheduleTimeout() // fires after 1000\n */ class Timer {\n reset() {\n this.tries = 0;\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n // Cancels any previous scheduleTimeout and schedules callback\n scheduleTimeout() {\n clearTimeout(this.timer);\n this.timer = setTimeout(()=>{\n this.tries = this.tries + 1;\n this.callback();\n }, this.timerCalc(this.tries + 1));\n }\n constructor(callback, timerCalc){\n this.callback = callback;\n this.timerCalc = timerCalc;\n this.timer = undefined;\n this.tries = 0;\n this.callback = callback;\n this.timerCalc = timerCalc;\n }\n} //# sourceMappingURL=timer.js.map\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3RpbWVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Q0FXQyxHQUNjLE1BQU1BO0lBU2pCQyxRQUFRO1FBQ0osSUFBSSxDQUFDQyxLQUFLLEdBQUc7UUFDYkMsYUFBYSxJQUFJLENBQUNDLEtBQUs7UUFDdkIsSUFBSSxDQUFDQSxLQUFLLEdBQUdDO0lBQ2pCO0lBQ0EsOERBQThEO0lBQzlEQyxrQkFBa0I7UUFDZEgsYUFBYSxJQUFJLENBQUNDLEtBQUs7UUFDdkIsSUFBSSxDQUFDQSxLQUFLLEdBQUdHLFdBQVc7WUFDcEIsSUFBSSxDQUFDTCxLQUFLLEdBQUcsSUFBSSxDQUFDQSxLQUFLLEdBQUc7WUFDMUIsSUFBSSxDQUFDTSxRQUFRO1FBQ2pCLEdBQUcsSUFBSSxDQUFDQyxTQUFTLENBQUMsSUFBSSxDQUFDUCxLQUFLLEdBQUc7SUFDbkM7SUFwQkFRLFlBQVlGLFFBQVEsRUFBRUMsU0FBUyxDQUFFO1FBQzdCLElBQUksQ0FBQ0QsUUFBUSxHQUFHQTtRQUNoQixJQUFJLENBQUNDLFNBQVMsR0FBR0E7UUFDakIsSUFBSSxDQUFDTCxLQUFLLEdBQUdDO1FBQ2IsSUFBSSxDQUFDSCxLQUFLLEdBQUc7UUFDYixJQUFJLENBQUNNLFFBQVEsR0FBR0E7UUFDaEIsSUFBSSxDQUFDQyxTQUFTLEdBQUdBO0lBQ3JCO0FBY0osRUFDQSxpQ0FBaUM7QUFEaEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9saWIvdGltZXIuanM/MTE1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENyZWF0ZXMgYSB0aW1lciB0aGF0IGFjY2VwdHMgYSBgdGltZXJDYWxjYCBmdW5jdGlvbiB0byBwZXJmb3JtIGNhbGN1bGF0ZWQgdGltZW91dCByZXRyaWVzLCBzdWNoIGFzIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgIGxldCByZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZnVuY3Rpb24odHJpZXMpe1xuICogICAgICByZXR1cm4gWzEwMDAsIDUwMDAsIDEwMDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiAgICB9KVxuICogICAgcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICogICAgcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgNTAwMFxuICogICAgcmVjb25uZWN0VGltZXIucmVzZXQoKVxuICogICAgcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lciB7XG4gICAgY29uc3RydWN0b3IoY2FsbGJhY2ssIHRpbWVyQ2FsYykge1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMudGltZXJDYWxjID0gdGltZXJDYWxjO1xuICAgICAgICB0aGlzLnRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnRyaWVzID0gMDtcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsYztcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMudHJpZXMgPSAwO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgICAgIHRoaXMudGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIENhbmNlbHMgYW55IHByZXZpb3VzIHNjaGVkdWxlVGltZW91dCBhbmQgc2NoZWR1bGVzIGNhbGxiYWNrXG4gICAgc2NoZWR1bGVUaW1lb3V0KCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudHJpZXMgPSB0aGlzLnRyaWVzICsgMTtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2soKTtcbiAgICAgICAgfSwgdGhpcy50aW1lckNhbGModGhpcy50cmllcyArIDEpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lci5qcy5tYXAiXSwibmFtZXMiOlsiVGltZXIiLCJyZXNldCIsInRyaWVzIiwiY2xlYXJUaW1lb3V0IiwidGltZXIiLCJ1bmRlZmluZWQiLCJzY2hlZHVsZVRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiY2FsbGJhY2siLCJ0aW1lckNhbGMiLCJjb25zdHJ1Y3RvciJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js":
/*!****************************************************************************!*\
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js ***!
\****************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PostgresTypes: function() { return /* binding */ PostgresTypes; },\n/* harmony export */ convertCell: function() { return /* binding */ convertCell; },\n/* harmony export */ convertChangeData: function() { return /* binding */ convertChangeData; },\n/* harmony export */ convertColumn: function() { return /* binding */ convertColumn; },\n/* harmony export */ httpEndpointURL: function() { return /* binding */ httpEndpointURL; },\n/* harmony export */ toArray: function() { return /* binding */ toArray; },\n/* harmony export */ toBoolean: function() { return /* binding */ toBoolean; },\n/* harmony export */ toJson: function() { return /* binding */ toJson; },\n/* harmony export */ toNumber: function() { return /* binding */ toNumber; },\n/* harmony export */ toTimestampString: function() { return /* binding */ toTimestampString; }\n/* harmony export */ });\n/**\n * Helpers to convert the change Payload into native JS types.\n */ // Adapted from epgsql (src/epgsql_binary.erl), this module licensed under\n// 3-clause BSD found here: https://raw.githubusercontent.com/epgsql/epgsql/devel/LICENSE\nvar PostgresTypes;\n(function(PostgresTypes) {\n PostgresTypes[\"abstime\"] = \"abstime\";\n PostgresTypes[\"bool\"] = \"bool\";\n PostgresTypes[\"date\"] = \"date\";\n PostgresTypes[\"daterange\"] = \"daterange\";\n PostgresTypes[\"float4\"] = \"float4\";\n PostgresTypes[\"float8\"] = \"float8\";\n PostgresTypes[\"int2\"] = \"int2\";\n PostgresTypes[\"int4\"] = \"int4\";\n PostgresTypes[\"int4range\"] = \"int4range\";\n PostgresTypes[\"int8\"] = \"int8\";\n PostgresTypes[\"int8range\"] = \"int8range\";\n PostgresTypes[\"json\"] = \"json\";\n PostgresTypes[\"jsonb\"] = \"jsonb\";\n PostgresTypes[\"money\"] = \"money\";\n PostgresTypes[\"numeric\"] = \"numeric\";\n PostgresTypes[\"oid\"] = \"oid\";\n PostgresTypes[\"reltime\"] = \"reltime\";\n PostgresTypes[\"text\"] = \"text\";\n PostgresTypes[\"time\"] = \"time\";\n PostgresTypes[\"timestamp\"] = \"timestamp\";\n PostgresTypes[\"timestamptz\"] = \"timestamptz\";\n PostgresTypes[\"timetz\"] = \"timetz\";\n PostgresTypes[\"tsrange\"] = \"tsrange\";\n PostgresTypes[\"tstzrange\"] = \"tstzrange\";\n})(PostgresTypes || (PostgresTypes = {}));\n/**\n * Takes an array of columns and an object of string values then converts each string value\n * to its mapped type.\n *\n * @param {{name: String, type: String}[]} columns\n * @param {Object} record\n * @param {Object} options The map of various options that can be applied to the mapper\n * @param {Array} options.skipTypes The array of types that should not be converted\n *\n * @example convertChangeData([{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age:'33'}, {})\n * //=>{ first_name: 'Paul', age: 33 }\n */ const convertChangeData = function(columns, record) {\n let options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};\n var _a;\n const skipTypes = (_a = options.skipTypes) !== null && _a !== void 0 ? _a : [];\n if (!record) {\n return {};\n }\n return Object.keys(record).reduce((acc, rec_key)=>{\n acc[rec_key] = convertColumn(rec_key, columns, record, skipTypes);\n return acc;\n }, {});\n};\n/**\n * Converts the value of an individual column.\n *\n * @param {String} columnName The column that you want to convert\n * @param {{name: String, type: String}[]} columns All of the columns\n * @param {Object} record The map of string values\n * @param {Array} skipTypes An array of types that should not be converted\n * @return {object} Useless information\n *\n * @example convertColumn('age', [{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age: '33'}, [])\n * //=> 33\n * @example convertColumn('age', [{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age: '33'}, ['int4'])\n * //=> \"33\"\n */ const convertColumn = (columnName, columns, record, skipTypes)=>{\n const column = columns.find((x)=>x.name === columnName);\n const colType = column === null || column === void 0 ? void 0 : column.type;\n const value = record[columnName];\n if (colType && !skipTypes.includes(colType)) {\n return convertCell(colType, value);\n }\n return noop(value);\n};\n/**\n * If the value of the cell is `null`, returns null.\n * Otherwise converts the string value to the correct type.\n * @param {String} type A postgres column type\n * @param {String} value The cell value\n *\n * @example convertCell('bool', 't')\n * //=> true\n * @example convertCell('int8', '10')\n * //=> 10\n * @example convertCell('_int4', '{1,2,3,4}')\n * //=> [1,2,3,4]\n */ const convertCell = (type, value)=>{\n // if data type is an array\n if (type.charAt(0) === \"_\") {\n const dataType = type.slice(1, type.length);\n return toArray(value, dataType);\n }\n // If not null, convert to correct type.\n switch(type){\n case PostgresTypes.bool:\n return toBoolean(value);\n case PostgresTypes.float4:\n case PostgresTypes.float8:\n case PostgresTypes.int2:\n case PostgresTypes.int4:\n case PostgresTypes.int8:\n case PostgresTypes.numeric:\n case PostgresTypes.oid:\n return toNumber(value);\n case PostgresTypes.json:\n case PostgresTypes.jsonb:\n return toJson(value);\n case PostgresTypes.timestamp:\n return toTimestampString(value); // Format to be consistent with PostgREST\n case PostgresTypes.abstime:\n case PostgresTypes.date:\n case PostgresTypes.daterange:\n case PostgresTypes.int4range:\n case PostgresTypes.int8range:\n case PostgresTypes.money:\n case PostgresTypes.reltime:\n case PostgresTypes.text:\n case PostgresTypes.time:\n case PostgresTypes.timestamptz:\n case PostgresTypes.timetz:\n case PostgresTypes.tsrange:\n case PostgresTypes.tstzrange:\n return noop(value);\n default:\n // Return the value for remaining types\n return noop(value);\n }\n};\nconst noop = (value)=>{\n return value;\n};\nconst toBoolean = (value)=>{\n switch(value){\n case \"t\":\n return true;\n case \"f\":\n return false;\n default:\n return value;\n }\n};\nconst toNumber = (value)=>{\n if (typeof value === \"string\") {\n const parsedValue = parseFloat(value);\n if (!Number.isNaN(parsedValue)) {\n return parsedValue;\n }\n }\n return value;\n};\nconst toJson = (value)=>{\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch (_a) {\n return value;\n }\n }\n return value;\n};\n/**\n * Converts a Postgres Array into a native JS array\n *\n * @example toArray('{}', 'int4')\n * //=> []\n * @example toArray('{\"[2021-01-01,2021-12-31)\",\"(2021-01-01,2021-12-32]\"}', 'daterange')\n * //=> ['[2021-01-01,2021-12-31)', '(2021-01-01,2021-12-32]']\n * @example toArray([1,2,3,4], 'int4')\n * //=> [1,2,3,4]\n */ const toArray = (value, type)=>{\n if (typeof value !== \"string\") {\n return value;\n }\n const lastIdx = value.length - 1;\n const closeBrace = value[lastIdx];\n const openBrace = value[0];\n // Confirm value is a Postgres array by checking curly brackets\n if (openBrace === \"{\" && closeBrace === \"}\") {\n let arr;\n const valTrim = value.slice(1, lastIdx);\n // TODO: find a better solution to separate Postgres array data\n try {\n arr = JSON.parse(\"[\" + valTrim + \"]\");\n } catch (_) {\n // WARNING: splitting on comma does not cover all edge cases\n arr = valTrim ? valTrim.split(\",\") : [];\n }\n return arr.map((val)=>convertCell(type, val));\n }\n return value;\n};\n/**\n * Fixes timestamp to be ISO-8601. Swaps the space between the date and time for a 'T'\n * See https://github.com/supabase/supabase/issues/18\n *\n * @example toTimestampString('2019-09-10 00:00:00')\n * //=> '2019-09-10T00:00:00'\n */ const toTimestampString = (value)=>{\n if (typeof value === \"string\") {\n return value.replace(\" \", \"T\");\n }\n return value;\n};\nconst httpEndpointURL = (socketUrl)=>{\n const wsUrl = new URL(socketUrl);\n wsUrl.protocol = wsUrl.protocol.replace(/^ws/i, \"http\");\n wsUrl.pathname = wsUrl.pathname.replace(/\\/+$/, \"\") // remove all trailing slashes\n .replace(/\\/socket\\/websocket$/i, \"\") // remove the socket/websocket path\n .replace(/\\/socket$/i, \"\") // remove the socket path\n .replace(/\\/websocket$/i, \"\"); // remove the websocket path\n if (wsUrl.pathname === \"\" || wsUrl.pathname === \"/\") {\n wsUrl.pathname = \"/api/broadcast\";\n } else {\n wsUrl.pathname = wsUrl.pathname + \"/api/broadcast\";\n }\n return wsUrl.href;\n}; //# sourceMappingURL=transformers.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3RyYW5zZm9ybWVycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0NBRUMsR0FDRCwwRUFBMEU7QUFDMUUseUZBQXlGO0FBQ2xGLElBQUlBLGNBQWM7QUFDeEIsVUFBVUEsYUFBYTtJQUNwQkEsYUFBYSxDQUFDLFVBQVUsR0FBRztJQUMzQkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLFlBQVksR0FBRztJQUM3QkEsYUFBYSxDQUFDLFNBQVMsR0FBRztJQUMxQkEsYUFBYSxDQUFDLFNBQVMsR0FBRztJQUMxQkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLFlBQVksR0FBRztJQUM3QkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLFlBQVksR0FBRztJQUM3QkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLFFBQVEsR0FBRztJQUN6QkEsYUFBYSxDQUFDLFFBQVEsR0FBRztJQUN6QkEsYUFBYSxDQUFDLFVBQVUsR0FBRztJQUMzQkEsYUFBYSxDQUFDLE1BQU0sR0FBRztJQUN2QkEsYUFBYSxDQUFDLFVBQVUsR0FBRztJQUMzQkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLFlBQVksR0FBRztJQUM3QkEsYUFBYSxDQUFDLGNBQWMsR0FBRztJQUMvQkEsYUFBYSxDQUFDLFNBQVMsR0FBRztJQUMxQkEsYUFBYSxDQUFDLFVBQVUsR0FBRztJQUMzQkEsYUFBYSxDQUFDLFlBQVksR0FBRztBQUNqQyxHQUFHQSxpQkFBa0JBLENBQUFBLGdCQUFnQixDQUFDO0FBQ3RDOzs7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b0QsT0FBTyxDQUFDLEtBQUs7SUFDOUI7SUFDQSxPQUFPcEQ7QUFDWCxFQUFFO0FBQ0ssTUFBTXFELGtCQUFrQixDQUFDQztJQUM1QixNQUFNQyxRQUFRLElBQUlDLElBQUlGO0lBQ3RCQyxNQUFNRSxRQUFRLEdBQUdGLE1BQU1FLFFBQVEsQ0FBQ0wsT0FBTyxDQUFDLFFBQVE7SUFDaERHLE1BQU1HLFFBQVEsR0FBR0gsTUFBTUcsUUFBUSxDQUMxQk4sT0FBTyxDQUFDLFFBQVEsSUFBSSw4QkFBOEI7S0FDbERBLE9BQU8sQ0FBQyx5QkFBeUIsSUFBSSxtQ0FBbUM7S0FDeEVBLE9BQU8sQ0FBQyxjQUFjLElBQUkseUJBQXlCO0tBQ25EQSxPQUFPLENBQUMsaUJBQWlCLEtBQUssNEJBQTRCO0lBQy9ELElBQUlHLE1BQU1HLFFBQVEsS0FBSyxNQUFNSCxNQUFNRyxRQUFRLEtBQUssS0FBSztRQUNqREgsTUFBTUcsUUFBUSxHQUFHO0lBQ3JCLE9BQ0s7UUFDREgsTUFBTUcsUUFBUSxHQUFHSCxNQUFNRyxRQUFRLEdBQUc7SUFDdEM7SUFDQSxPQUFPSCxNQUFNSSxJQUFJO0FBQ3JCLEVBQUUsQ0FDRix3Q0FBd0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9saWIvdHJhbnNmb3JtZXJzLmpzPzNmYzAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIZWxwZXJzIHRvIGNvbnZlcnQgdGhlIGNoYW5nZSBQYXlsb2FkIGludG8gbmF0aXZlIEpTIHR5cGVzLlxuICovXG4vLyBBZGFwdGVkIGZyb20gZXBnc3FsIChzcmMvZXBnc3FsX2JpbmFyeS5lcmwpLCB0aGlzIG1vZHVsZSBsaWNlbnNlZCB1bmRlclxuLy8gMy1jbGF1c2UgQlNEIGZvdW5kIGhlcmU6IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lcGdzcWwvZXBnc3FsL2RldmVsL0xJQ0VOU0VcbmV4cG9ydCB2YXIgUG9zdGdyZXNUeXBlcztcbihmdW5jdGlvbiAoUG9zdGdyZXNUeXBlcykge1xuICAgIFBvc3RncmVzVHlwZXNbXCJhYnN0aW1lXCJdID0gXCJhYnN0aW1lXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImJvb2xcIl0gPSBcImJvb2xcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiZGF0ZVwiXSA9IFwiZGF0ZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJkYXRlcmFuZ2VcIl0gPSBcImRhdGVyYW5nZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJmbG9hdDRcIl0gPSBcImZsb2F0NFwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJmbG9hdDhcIl0gPSBcImZsb2F0OFwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJpbnQyXCJdID0gXCJpbnQyXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImludDRcIl0gPSBcImludDRcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiaW50NHJhbmdlXCJdID0gXCJpbnQ0cmFuZ2VcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiaW50OFwiXSA9IFwiaW50OFwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJpbnQ4cmFuZ2VcIl0gPSBcImludDhyYW5nZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJqc29uXCJdID0gXCJqc29uXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImpzb25iXCJdID0gXCJqc29uYlwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJtb25leVwiXSA9IFwibW9uZXlcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wibnVtZXJpY1wiXSA9IFwibnVtZXJpY1wiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJvaWRcIl0gPSBcIm9pZFwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJyZWx0aW1lXCJdID0gXCJyZWx0aW1lXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcInRleHRcIl0gPSBcInRleHRcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widGltZVwiXSA9IFwidGltZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJ0aW1lc3RhbXBcIl0gPSBcInRpbWVzdGFtcFwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJ0aW1lc3RhbXB0elwiXSA9IFwidGltZXN0YW1wdHpcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widGltZXR6XCJdID0gXCJ0aW1ldHpcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widHNyYW5nZVwiXSA9IFwidHNyYW5nZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJ0c3R6cmFuZ2VcIl0gPSBcInRzdHpyYW5nZVwiO1xufSkoUG9zdGdyZXNUeXBlcyB8fCAoUG9zdGdyZXNUeXBlcyA9IHt9KSk7XG4vKipcbiAqIFRha2VzIGFuIGFycmF5IG9mIGNvbHVtbnMgYW5kIGFuIG9iamVjdCBvZiBzdHJpbmcgdmFsdWVzIHRoZW4gY29udmVydHMgZWFjaCBzdHJpbmcgdmFsdWVcbiAqIHRvIGl0cyBtYXBwZWQgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge3tuYW1lOiBTdHJpbmcsIHR5cGU6IFN0cmluZ31bXX0gY29sdW1uc1xuICogQHBhcmFtIHtPYmplY3R9IHJlY29yZFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhlIG1hcCBvZiB2YXJpb3VzIG9wdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB0aGUgbWFwcGVyXG4gKiBAcGFyYW0ge0FycmF5fSBvcHRpb25zLnNraXBUeXBlcyBUaGUgYXJyYXkgb2YgdHlwZXMgdGhhdCBzaG91bGQgbm90IGJlIGNvbnZlcnRlZFxuICpcbiAqIEBleGFtcGxlIGNvbnZlcnRDaGFuZ2VEYXRhKFt7bmFtZTogJ2ZpcnN0X25hbWUnLCB0eXBlOiAndGV4dCd9LCB7bmFtZTogJ2FnZScsIHR5cGU6ICdpbnQ0J31dLCB7Zmlyc3RfbmFtZTogJ1BhdWwnLCBhZ2U6JzMzJ30sIHt9KVxuICogLy89PnsgZmlyc3RfbmFtZTogJ1BhdWwnLCBhZ2U6IDMzIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRDaGFuZ2VEYXRhID0gKGNvbHVtbnMsIHJlY29yZCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHNraXBUeXBlcyA9IChfYSA9IG9wdGlvbnMuc2tpcFR5cGVzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICBpZiAoIXJlY29yZCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZWNvcmQpLnJlZHVjZSgoYWNjLCByZWNfa2V5KSA9PiB7XG4gICAgICAgIGFjY1tyZWNfa2V5XSA9IGNvbnZlcnRDb2x1bW4ocmVjX2tleSwgY29sdW1ucywgcmVjb3JkLCBza2lwVHlwZXMpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn07XG4vKipcbiAqIENvbnZlcnRzIHRoZSB2YWx1ZSBvZiBhbiBpbmRpdmlkdWFsIGNvbHVtbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gY29sdW1uTmFtZSBUaGUgY29sdW1uIHRoYXQgeW91IHdhbnQgdG8gY29udmVydFxuICogQHBhcmFtIHt7bmFtZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9W119IGNvbHVtbnMgQWxsIG9mIHRoZSBjb2x1bW5zXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjb3JkIFRoZSBtYXAgb2Ygc3RyaW5nIHZhbHVlc1xuICogQHBhcmFtIHtBcnJheX0gc2tpcFR5cGVzIEFuIGFycmF5IG9mIHR5cGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBjb252ZXJ0ZWRcbiAqIEByZXR1cm4ge29iamVjdH0gVXNlbGVzcyBpbmZvcm1hdGlvblxuICpcbiAqIEBleGFtcGxlIGNvbnZlcnRDb2x1bW4oJ2FnZScsIFt7bmFtZTogJ2ZpcnN0X25hbWUnLCB0eXBlOiAndGV4dCd9LCB7bmFtZTogJ2FnZScsIHR5cGU6ICdpbnQ0J31dLCB7Zmlyc3RfbmFtZTogJ1BhdWwnLCBhZ2U6ICczMyd9LCBbXSlcbiAqIC8vPT4gMzNcbiAqIEBleGFtcGxlIGNvbnZlcnRDb2x1bW4oJ2FnZScsIFt7bmFtZTogJ2ZpcnN0X25hbWUnLCB0eXBlOiAndGV4dCd9LCB7bmFtZTogJ2FnZScsIHR5cGU6ICdpbnQ0J31dLCB7Zmlyc3RfbmFtZTogJ1BhdWwnLCBhZ2U6ICczMyd9LCBbJ2ludDQnXSlcbiAqIC8vPT4gXCIzM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0Q29sdW1uID0gKGNvbHVtbk5hbWUsIGNvbHVtbnMsIHJlY29yZCwgc2tpcFR5cGVzKSA9PiB7XG4gICAgY29uc3QgY29sdW1uID0gY29sdW1ucy5maW5kKCh4KSA9PiB4Lm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIGNvbnN0IGNvbFR5cGUgPSBjb2x1bW4gPT09IG51bGwgfHwgY29sdW1uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb2x1bW4udHlwZTtcbiAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFtjb2x1bW5OYW1lXTtcbiAgICBpZiAoY29sVHlwZSAmJiAhc2tpcFR5cGVzLmluY2x1ZGVzKGNvbFR5cGUpKSB7XG4gICAgICAgIHJldHVybiBjb252ZXJ0Q2VsbChjb2xUeXBlLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBub29wKHZhbHVlKTtcbn07XG4vKipcbiAqIElmIHRoZSB2YWx1ZSBvZiB0aGUgY2VsbCBpcyBgbnVsbGAsIHJldHVybnMgbnVsbC5cbiAqIE90aGVyd2lzZSBjb252ZXJ0cyB0aGUgc3RyaW5nIHZhbHVlIHRvIHRoZSBjb3JyZWN0IHR5cGUuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBBIHBvc3RncmVzIGNvbHVtbiB0eXBlXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgVGhlIGNlbGwgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZSBjb252ZXJ0Q2VsbCgnYm9vbCcsICd0JylcbiAqIC8vPT4gdHJ1ZVxuICogQGV4YW1wbGUgY29udmVydENlbGwoJ2ludDgnLCAnMTAnKVxuICogLy89PiAxMFxuICogQGV4YW1wbGUgY29udmVydENlbGwoJ19pbnQ0JywgJ3sxLDIsMyw0fScpXG4gKiAvLz0+IFsxLDIsMyw0XVxuICovXG5leHBvcnQgY29uc3QgY29udmVydENlbGwgPSAodHlwZSwgdmFsdWUpID0+IHtcbiAgICAvLyBpZiBkYXRhIHR5cGUgaXMgYW4gYXJyYXlcbiAgICBpZiAodHlwZS5jaGFyQXQoMCkgPT09ICdfJykge1xuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IHR5cGUuc2xpY2UoMSwgdHlwZS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gdG9BcnJheSh2YWx1ZSwgZGF0YVR5cGUpO1xuICAgIH1cbiAgICAvLyBJZiBub3QgbnVsbCwgY29udmVydCB0byBjb3JyZWN0IHR5cGUuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5ib29sOlxuICAgICAgICAgICAgcmV0dXJuIHRvQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5mbG9hdDQ6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5mbG9hdDg6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5pbnQyOlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuaW50NDpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmludDg6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5udW1lcmljOlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMub2lkOlxuICAgICAgICAgICAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmpzb246XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5qc29uYjpcbiAgICAgICAgICAgIHJldHVybiB0b0pzb24odmFsdWUpO1xuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMudGltZXN0YW1wOlxuICAgICAgICAgICAgcmV0dXJuIHRvVGltZXN0YW1wU3RyaW5nKHZhbHVlKTsgLy8gRm9ybWF0IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBQb3N0Z1JFU1RcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmFic3RpbWU6IC8vIFRvIGFsbG93IHVzZXJzIHRvIGNhc3QgaXQgYmFzZWQgb24gVGltZXpvbmVcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmRhdGU6IC8vIFRvIGFsbG93IHVzZXJzIHRvIGNhc3QgaXQgYmFzZWQgb24gVGltZXpvbmVcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmRhdGVyYW5nZTpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmludDRyYW5nZTpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmludDhyYW5nZTpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLm1vbmV5OlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMucmVsdGltZTogLy8gVG8gYWxsb3cgdXNlcnMgdG8gY2FzdCBpdCBiYXNlZCBvbiBUaW1lem9uZVxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMudGV4dDpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnRpbWU6IC8vIFRvIGFsbG93IHVzZXJzIHRvIGNhc3QgaXQgYmFzZWQgb24gVGltZXpvbmVcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnRpbWVzdGFtcHR6OiAvLyBUbyBhbGxvdyB1c2VycyB0byBjYXN0IGl0IGJhc2VkIG9uIFRpbWV6b25lXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy50aW1ldHo6IC8vIFRvIGFsbG93IHVzZXJzIHRvIGNhc3QgaXQgYmFzZWQgb24gVGltZXpvbmVcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnRzcmFuZ2U6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy50c3R6cmFuZ2U6XG4gICAgICAgICAgICByZXR1cm4gbm9vcCh2YWx1ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGZvciByZW1haW5pbmcgdHlwZXNcbiAgICAgICAgICAgIHJldHVybiBub29wKHZhbHVlKTtcbiAgICB9XG59O1xuY29uc3Qgbm9vcCA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZTtcbn07XG5leHBvcnQgY29uc3QgdG9Cb29sZWFuID0gKHZhbHVlKSA9PiB7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICBjYXNlICd0JzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdmJzpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHRvTnVtYmVyID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbmV4cG9ydCBjb25zdCB0b0pzb24gPSAodmFsdWUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG4vKipcbiAqIENvbnZlcnRzIGEgUG9zdGdyZXMgQXJyYXkgaW50byBhIG5hdGl2ZSBKUyBhcnJheVxuICpcbiAqIEBleGFtcGxlIHRvQXJyYXkoJ3t9JywgJ2ludDQnKVxuICogLy89PiBbXVxuICogQGV4YW1wbGUgdG9BcnJheSgne1wiWzIwMjEtMDEtMDEsMjAyMS0xMi0zMSlcIixcIigyMDIxLTAxLTAxLDIwMjEtMTItMzJdXCJ9JywgJ2RhdGVyYW5nZScpXG4gKiAvLz0+IFsnWzIwMjEtMDEtMDEsMjAyMS0xMi0zMSknLCAnKDIwMjEtMDEtMDEsMjAyMS0xMi0zMl0nXVxuICogQGV4YW1wbGUgdG9BcnJheShbMSwyLDMsNF0sICdpbnQ0JylcbiAqIC8vPT4gWzEsMiwzLDRdXG4gKi9cbmV4cG9ydCBjb25zdCB0b0FycmF5ID0gKHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBsYXN0SWR4ID0gdmFsdWUubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBjbG9zZUJyYWNlID0gdmFsdWVbbGFzdElkeF07XG4gICAgY29uc3Qgb3BlbkJyYWNlID0gdmFsdWVbMF07XG4gICAgLy8gQ29uZmlybSB2YWx1ZSBpcyBhIFBvc3RncmVzIGFycmF5IGJ5IGNoZWNraW5nIGN1cmx5IGJyYWNrZXRzXG4gICAgaWYgKG9wZW5CcmFjZSA9PT0gJ3snICYmIGNsb3NlQnJhY2UgPT09ICd9Jykge1xuICAgICAgICBsZXQgYXJyO1xuICAgICAgICBjb25zdCB2YWxUcmltID0gdmFsdWUuc2xpY2UoMSwgbGFzdElkeCk7XG4gICAgICAgIC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgc29sdXRpb24gdG8gc2VwYXJhdGUgUG9zdGdyZXMgYXJyYXkgZGF0YVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXJyID0gSlNPTi5wYXJzZSgnWycgKyB2YWxUcmltICsgJ10nKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgLy8gV0FSTklORzogc3BsaXR0aW5nIG9uIGNvbW1hIGRvZXMgbm90IGNvdmVyIGFsbCBlZGdlIGNhc2VzXG4gICAgICAgICAgICBhcnIgPSB2YWxUcmltID8gdmFsVHJpbS5zcGxpdCgnLCcpIDogW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyci5tYXAoKHZhbCkgPT4gY29udmVydENlbGwodHlwZSwgdmFsKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG4vKipcbiAqIEZpeGVzIHRpbWVzdGFtcCB0byBiZSBJU08tODYwMS4gU3dhcHMgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGRhdGUgYW5kIHRpbWUgZm9yIGEgJ1QnXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3N1cGFiYXNlL3N1cGFiYXNlL2lzc3Vlcy8xOFxuICpcbiAqIEBleGFtcGxlIHRvVGltZXN0YW1wU3RyaW5nKCcyMDE5LTA5LTEwIDAwOjAwOjAwJylcbiAqIC8vPT4gJzIwMTktMDktMTBUMDA6MDA6MDAnXG4gKi9cbmV4cG9ydCBjb25zdCB0b1RpbWVzdGFtcFN0cmluZyA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCcgJywgJ1QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbmV4cG9ydCBjb25zdCBodHRwRW5kcG9pbnRVUkwgPSAoc29ja2V0VXJsKSA9PiB7XG4gICAgY29uc3Qgd3NVcmwgPSBuZXcgVVJMKHNvY2tldFVybCk7XG4gICAgd3NVcmwucHJvdG9jb2wgPSB3c1VybC5wcm90b2NvbC5yZXBsYWNlKC9ed3MvaSwgJ2h0dHAnKTtcbiAgICB3c1VybC5wYXRobmFtZSA9IHdzVXJsLnBhdGhuYW1lXG4gICAgICAgIC5yZXBsYWNlKC9cXC8rJC8sICcnKSAvLyByZW1vdmUgYWxsIHRyYWlsaW5nIHNsYXNoZXNcbiAgICAgICAgLnJlcGxhY2UoL1xcL3NvY2tldFxcL3dlYnNvY2tldCQvaSwgJycpIC8vIHJlbW92ZSB0aGUgc29ja2V0L3dlYnNvY2tldCBwYXRoXG4gICAgICAgIC5yZXBsYWNlKC9cXC9zb2NrZXQkL2ksICcnKSAvLyByZW1vdmUgdGhlIHNvY2tldCBwYXRoXG4gICAgICAgIC5yZXBsYWNlKC9cXC93ZWJzb2NrZXQkL2ksICcnKTsgLy8gcmVtb3ZlIHRoZSB3ZWJzb2NrZXQgcGF0aFxuICAgIGlmICh3c1VybC5wYXRobmFtZSA9PT0gJycgfHwgd3NVcmwucGF0aG5hbWUgPT09ICcvJykge1xuICAgICAgICB3c1VybC5wYXRobmFtZSA9ICcvYXBpL2Jyb2FkY2FzdCc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB3c1VybC5wYXRobmFtZSA9IHdzVXJsLnBhdGhuYW1lICsgJy9hcGkvYnJvYWRjYXN0JztcbiAgICB9XG4gICAgcmV0dXJuIHdzVXJsLmhyZWY7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNmb3JtZXJzLmpzLm1hcCJdLCJuYW1lcyI6WyJQb3N0Z3Jlc1R5cGVzIiwiY29udmVydENoYW5nZURhdGEiLCJjb2x1bW5zIiwicmVjb3JkIiwib3B0aW9ucyIsIl9hIiwic2tpcFR5cGVzIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImFjYyIsInJlY19rZXkiLCJjb252ZXJ0Q29sdW1uIiwiY29sdW1uTmFtZSIsImNvbHVtbiIsImZpbmQiLCJ4IiwibmFtZSIsImNvbFR5cGUiLCJ0eXBlIiwidmFsdWUiLCJpbmNsdWRlcyIsImNvbnZlcnRDZWxsIiwibm9vcCIsImNoYXJBdCIsImRhdGFUeXBlIiwic2xpY2UiLCJsZW5ndGgiLCJ0b0FycmF5IiwiYm9vbCIsInRvQm9vbGVhbiIsImZsb2F0NCIsImZsb2F0OCIsImludDIiLCJpbnQ0IiwiaW50OCIsIm51bWVyaWMiLCJvaWQiLCJ0b051bWJlciIsImpzb24iLCJqc29uYiIsInRvSnNvbiIsInRpbWVzdGFtcCIsInRvVGltZXN0YW1wU3RyaW5nIiwiYWJzdGltZSIsImRhdGUiLCJkYXRlcmFuZ2UiLCJpbnQ0cmFuZ2UiLCJpbnQ4cmFuZ2UiLCJtb25leSIsInJlbHRpbWUiLCJ0ZXh0IiwidGltZSIsInRpbWVzdGFtcHR6IiwidGltZXR6IiwidHNyYW5nZSIsInRzdHpyYW5nZSIsInBhcnNlZFZhbHVlIiwicGFyc2VGbG9hdCIsIk51bWJlciIsImlzTmFOIiwiSlNPTiIsInBhcnNlIiwibGFzdElkeCIsImNsb3NlQnJhY2UiLCJvcGVuQnJhY2UiLCJhcnIiLCJ2YWxUcmltIiwiXyIsInNwbGl0IiwibWFwIiwidmFsIiwicmVwbGFjZSIsImh0dHBFbmRwb2ludFVSTCIsInNvY2tldFVybCIsIndzVXJsIiwiVVJMIiwicHJvdG9jb2wiLCJwYXRobmFtZSIsImhyZWYiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js":
/*!***********************************************************************!*\
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/version.js ***!
\***********************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ version: function() { return /* binding */ version; }\n/* harmony export */ });\n// Generated automatically during releases by scripts/update-version-files.ts\n// This file provides runtime access to the package version for:\n// - HTTP request headers (e.g., X-Client-Info header for API requests)\n// - Debugging and support (identifying which version is running)\n// - Telemetry and logging (version reporting in errors/analytics)\n// - Ensuring build artifacts match the published package version\nconst version = \"2.88.0\"; //# sourceMappingURL=version.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3ZlcnNpb24uanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZFQUE2RTtBQUM3RSxnRUFBZ0U7QUFDaEUsdUVBQXVFO0FBQ3ZFLGlFQUFpRTtBQUNqRSxrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQzFELE1BQU1BLFVBQVUsU0FBUyxDQUNoQyxtQ0FBbUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9saWIvdmVyc2lvbi5qcz8xZmQ1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGR1cmluZyByZWxlYXNlcyBieSBzY3JpcHRzL3VwZGF0ZS12ZXJzaW9uLWZpbGVzLnRzXG4vLyBUaGlzIGZpbGUgcHJvdmlkZXMgcnVudGltZSBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgdmVyc2lvbiBmb3I6XG4vLyAtIEhUVFAgcmVxdWVzdCBoZWFkZXJzIChlLmcuLCBYLUNsaWVudC1JbmZvIGhlYWRlciBmb3IgQVBJIHJlcXVlc3RzKVxuLy8gLSBEZWJ1Z2dpbmcgYW5kIHN1cHBvcnQgKGlkZW50aWZ5aW5nIHdoaWNoIHZlcnNpb24gaXMgcnVubmluZylcbi8vIC0gVGVsZW1ldHJ5IGFuZCBsb2dnaW5nICh2ZXJzaW9uIHJlcG9ydGluZyBpbiBlcnJvcnMvYW5hbHl0aWNzKVxuLy8gLSBFbnN1cmluZyBidWlsZCBhcnRpZmFjdHMgbWF0Y2ggdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIHZlcnNpb25cbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0gJzIuODguMCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZXJzaW9uLmpzLm1hcCJdLCJuYW1lcyI6WyJ2ZXJzaW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js":
/*!*********************************************************************************!*\
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js ***!
\*********************************************************************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebSocketFactory: function() { return /* binding */ WebSocketFactory; }\n/* harmony export */ });\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/**\n * Utilities for creating WebSocket instances across runtimes.\n */ class WebSocketFactory {\n static detectEnvironment() {\n var _a;\n if (typeof WebSocket !== \"undefined\") {\n return {\n type: \"native\",\n constructor: WebSocket\n };\n }\n if (typeof globalThis !== \"undefined\" && typeof globalThis.WebSocket !== \"undefined\") {\n return {\n type: \"native\",\n constructor: globalThis.WebSocket\n };\n }\n if (typeof __webpack_require__.g !== \"undefined\" && typeof __webpack_require__.g.WebSocket !== \"undefined\") {\n return {\n type: \"native\",\n constructor: __webpack_require__.g.WebSocket\n };\n }\n if (typeof globalThis !== \"undefined\" && typeof globalThis.WebSocketPair !== \"undefined\" && typeof globalThis.WebSocket === \"undefined\") {\n return {\n type: \"cloudflare\",\n error: \"Cloudflare Workers detected. WebSocket clients are not supported in Cloudflare Workers.\",\n workaround: \"Use Cloudflare Workers WebSocket API for server-side WebSocket handling, or deploy to a different runtime.\"\n };\n }\n if (typeof globalThis !== \"undefined\" && globalThis.EdgeRuntime || typeof navigator !== \"undefined\" && ((_a = navigator.userAgent) === null || _a === void 0 ? void 0 : _a.includes(\"Vercel-Edge\"))) {\n return {\n type: \"unsupported\",\n error: \"Edge runtime detected (Vercel Edge/Netlify Edge). WebSockets are not supported in edge functions.\",\n workaround: \"Use serverless functions or a different deployment target for WebSocket functionality.\"\n };\n }\n if (typeof process !== \"undefined\") {\n // Use dynamic property access to avoid Next.js Edge Runtime static analysis warnings\n const processVersions = process[\"versions\"];\n if (processVersions && processVersions[\"node\"]) {\n // Remove 'v' prefix if present and parse the major version\n const versionString = processVersions[\"node\"];\n const nodeVersion = parseInt(versionString.replace(/^v/, \"\").split(\".\")[0]);\n // Node.js 22+ should have native WebSocket\n if (nodeVersion >= 22) {\n // Check if native WebSocket is available (should be in Node.js 22+)\n if (typeof globalThis.WebSocket !== \"undefined\") {\n return {\n type: \"native\",\n constructor: globalThis.WebSocket\n };\n }\n // If not available, user needs to provide it\n return {\n type: \"unsupported\",\n error: \"Node.js \".concat(nodeVersion, \" detected but native WebSocket not found.\"),\n workaround: \"Provide a WebSocket implementation via the transport option.\"\n };\n }\n // Node.js < 22 doesn't have native WebSocket\n return {\n type: \"unsupported\",\n error: \"Node.js \".concat(nodeVersion, \" detected without native WebSocket support.\"),\n workaround: 'For Node.js < 22, install \"ws\" package and provide it via the transport option:\\n' + 'import ws from \"ws\"\\n' + \"new RealtimeClient(url, { transport: ws })\"\n };\n }\n }\n return {\n type: \"unsupported\",\n error: \"Unknown JavaScript runtime without WebSocket support.\",\n workaround: \"Ensure you're running in a supported environment (browser, Node.js, Deno) or provide a custom WebSocket implementation.\"\n };\n }\n /**\n * Returns the best available WebSocket constructor for the current runtime.\n *\n * @example\n * ```ts\n * const WS = WebSocketFactory.getWebSocketConstructor()\n * const socket = new WS('wss://realtime.supabase.co/socket')\n * ```\n */ static getWebSocketConstructor() {\n const env = this.detectEnvironment();\n if (env.constructor) {\n return env.constructor;\n }\n let errorMessage = env.error || \"WebSocket not supported in this environment.\";\n if (env.workaround) {\n errorMessage += \"\\n\\nSuggested solution: \".concat(env.workaround);\n }\n throw new Error(errorMessage);\n }\n /**\n * Creates a WebSocket using the detected constructor.\n *\n * @example\n * ```ts\n * const socket = WebSocketFactory.createWebSocket('wss://realtime.supabase.co/socket')\n * ```\n */ static createWebSocket(url, protocols) {\n const WS = this.getWebSocketConstructor();\n return new WS(url, protocols);\n }\n /**\n * Detects whether the runtime can establish WebSocket connections.\n *\n * @example\n * ```ts\n * if (!WebSocketFactory.isWebSocketSupported()) {\n * console.warn('Falling back to long polling')\n * }\n * ```\n */ static isWebSocketSupported() {\n try {\n const env = this.detectEnvironment();\n return env.type === \"native\" || env.type === \"ws\";\n } catch (_a) {\n return false;\n }\n }\n /**\n * Static-only utility prevent instantiation.\n */ constructor(){}\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (WebSocketFactory); //# sourceMappingURL=websocket-factory.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3dlYnNvY2tldC1mYWN0b3J5LmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7O0NBRUMsR0FDTSxNQUFNQTtJQUtULE9BQU9DLG9CQUFvQjtRQUN2QixJQUFJQztRQUNKLElBQUksT0FBT0MsY0FBYyxhQUFhO1lBQ2xDLE9BQU87Z0JBQUVDLE1BQU07Z0JBQVVDLGFBQWFGO1lBQVU7UUFDcEQ7UUFDQSxJQUFJLE9BQU9HLGVBQWUsZUFBZSxPQUFPQSxXQUFXSCxTQUFTLEtBQUssYUFBYTtZQUNsRixPQUFPO2dCQUFFQyxNQUFNO2dCQUFVQyxhQUFhQyxXQUFXSCxTQUFTO1lBQUM7UUFDL0Q7UUFDQSxJQUFJLE9BQU9JLHFCQUFNQSxLQUFLLGVBQWUsT0FBT0EscUJBQU1BLENBQUNKLFNBQVMsS0FBSyxhQUFhO1lBQzFFLE9BQU87Z0JBQUVDLE1BQU07Z0JBQVVDLGFBQWFFLHFCQUFNQSxDQUFDSixTQUFTO1lBQUM7UUFDM0Q7UUFDQSxJQUFJLE9BQU9HLGVBQWUsZUFDdEIsT0FBT0EsV0FBV0UsYUFBYSxLQUFLLGVBQ3BDLE9BQU9GLFdBQVdILFNBQVMsS0FBSyxhQUFhO1lBQzdDLE9BQU87Z0JBQ0hDLE1BQU07Z0JBQ05LLE9BQU87Z0JBQ1BDLFlBQVk7WUFDaEI7UUFDSjtRQUNBLElBQUksT0FBUUosZUFBZSxlQUFlQSxXQUFXSyxXQUFXLElBQzNELE9BQU9DLGNBQWMsZUFBZ0IsRUFBQ1YsS0FBS1UsVUFBVUMsU0FBUyxNQUFNLFFBQVFYLE9BQU8sS0FBSyxJQUFJLEtBQUssSUFBSUEsR0FBR1ksUUFBUSxDQUFDLGNBQWEsR0FBSztZQUNwSSxPQUFPO2dCQUNIVixNQUFNO2dCQUNOSyxPQUFPO2dCQUNQQyxZQUFZO1lBQ2hCO1FBQ0o7UUFDQSxJQUFJLE9BQU9LLE9BQU9BLEtBQUssYUFBYTtZQUNoQyxxRkFBcUY7WUFDckYsTUFBTUMsa0JBQWtCRCxPQUFPLENBQUMsV0FBVztZQUMzQyxJQUFJQyxtQkFBbUJBLGVBQWUsQ0FBQyxPQUFPLEVBQUU7Z0JBQzVDLDJEQUEyRDtnQkFDM0QsTUFBTUMsZ0JBQWdCRCxlQUFlLENBQUMsT0FBTztnQkFDN0MsTUFBTUUsY0FBY0MsU0FBU0YsY0FBY0csT0FBTyxDQUFDLE1BQU0sSUFBSUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMxRSwyQ0FBMkM7Z0JBQzNDLElBQUlILGVBQWUsSUFBSTtvQkFDbkIsb0VBQW9FO29CQUNwRSxJQUFJLE9BQU9aLFdBQVdILFNBQVMsS0FBSyxhQUFhO3dCQUM3QyxPQUFPOzRCQUFFQyxNQUFNOzRCQUFVQyxhQUFhQyxXQUFXSCxTQUFTO3dCQUFDO29CQUMvRDtvQkFDQSw2Q0FBNkM7b0JBQzdDLE9BQU87d0JBQ0hDLE1BQU07d0JBQ05LLE9BQU8sV0FBdUIsT0FBWlMsYUFBWTt3QkFDOUJSLFlBQVk7b0JBQ2hCO2dCQUNKO2dCQUNBLDZDQUE2QztnQkFDN0MsT0FBTztvQkFDSE4sTUFBTTtvQkFDTkssT0FBTyxXQUF1QixPQUFaUyxhQUFZO29CQUM5QlIsWUFBWSxzRkFDUiwwQkFDQTtnQkFDUjtZQUNKO1FBQ0o7UUFDQSxPQUFPO1lBQ0hOLE1BQU07WUFDTkssT0FBTztZQUNQQyxZQUFZO1FBQ2hCO0lBQ0o7SUFDQTs7Ozs7Ozs7S0FRQyxHQUNELE9BQU9ZLDBCQUEwQjtRQUM3QixNQUFNQyxNQUFNLElBQUksQ0FBQ3RCLGlCQUFpQjtRQUNsQyxJQUFJc0IsSUFBSWxCLFdBQVcsRUFBRTtZQUNqQixPQUFPa0IsSUFBSWxCLFdBQVc7UUFDMUI7UUFDQSxJQUFJbUIsZUFBZUQsSUFBSWQsS0FBSyxJQUFJO1FBQ2hDLElBQUljLElBQUliLFVBQVUsRUFBRTtZQUNoQmMsZ0JBQWdCLDJCQUEwQyxPQUFmRCxJQUFJYixVQUFVO1FBQzdEO1FBQ0EsTUFBTSxJQUFJZSxNQUFNRDtJQUNwQjtJQUNBOzs7Ozs7O0tBT0MsR0FDRCxPQUFPRSxnQkFBZ0JDLEdBQUcsRUFBRUMsU0FBUyxFQUFFO1FBQ25DLE1BQU1DLEtBQUssSUFBSSxDQUFDUCx1QkFBdUI7UUFDdkMsT0FBTyxJQUFJTyxHQUFHRixLQUFLQztJQUN2QjtJQUNBOzs7Ozs7Ozs7S0FTQyxHQUNELE9BQU9FLHVCQUF1QjtRQUMxQixJQUFJO1lBQ0EsTUFBTVAsTUFBTSxJQUFJLENBQUN0QixpQkFBaUI7WUFDbEMsT0FBT3NCLElBQUluQixJQUFJLEtBQUssWUFBWW1CLElBQUluQixJQUFJLEtBQUs7UUFDakQsRUFDQSxPQUFPRixJQUFJO1lBQ1AsT0FBTztRQUNYO0lBQ0o7SUF0SEE7O0tBRUMsR0FDREcsYUFBYyxDQUFFO0FBb0hwQjtBQUNBLCtEQUFlTCxnQkFBZ0JBLEVBQUMsQ0FDaEMsNkNBQTZDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3dlYnNvY2tldC1mYWN0b3J5LmpzP2E1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlsaXRpZXMgZm9yIGNyZWF0aW5nIFdlYlNvY2tldCBpbnN0YW5jZXMgYWNyb3NzIHJ1bnRpbWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0RmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICogU3RhdGljLW9ubHkgdXRpbGl0eSDigJMgcHJldmVudCBpbnN0YW50aWF0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgc3RhdGljIGRldGVjdEVudmlyb25tZW50KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0eXBlb2YgV2ViU29ja2V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ25hdGl2ZScsIGNvbnN0cnVjdG9yOiBXZWJTb2NrZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWxUaGlzLldlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICduYXRpdmUnLCBjb25zdHJ1Y3RvcjogZ2xvYmFsVGhpcy5XZWJTb2NrZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGdsb2JhbC5XZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnbmF0aXZlJywgY29uc3RydWN0b3I6IGdsb2JhbC5XZWJTb2NrZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgZ2xvYmFsVGhpcy5XZWJTb2NrZXRQYWlyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIGdsb2JhbFRoaXMuV2ViU29ja2V0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2xvdWRmbGFyZScsXG4gICAgICAgICAgICAgICAgZXJyb3I6ICdDbG91ZGZsYXJlIFdvcmtlcnMgZGV0ZWN0ZWQuIFdlYlNvY2tldCBjbGllbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIENsb3VkZmxhcmUgV29ya2Vycy4nLFxuICAgICAgICAgICAgICAgIHdvcmthcm91bmQ6ICdVc2UgQ2xvdWRmbGFyZSBXb3JrZXJzIFdlYlNvY2tldCBBUEkgZm9yIHNlcnZlci1zaWRlIFdlYlNvY2tldCBoYW5kbGluZywgb3IgZGVwbG95IHRvIGEgZGlmZmVyZW50IHJ1bnRpbWUuJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcy5FZGdlUnVudGltZSkgfHxcbiAgICAgICAgICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAoKF9hID0gbmF2aWdhdG9yLnVzZXJBZ2VudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmluY2x1ZGVzKCdWZXJjZWwtRWRnZScpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3Vuc3VwcG9ydGVkJyxcbiAgICAgICAgICAgICAgICBlcnJvcjogJ0VkZ2UgcnVudGltZSBkZXRlY3RlZCAoVmVyY2VsIEVkZ2UvTmV0bGlmeSBFZGdlKS4gV2ViU29ja2V0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiBlZGdlIGZ1bmN0aW9ucy4nLFxuICAgICAgICAgICAgICAgIHdvcmthcm91bmQ6ICdVc2Ugc2VydmVybGVzcyBmdW5jdGlvbnMgb3IgYSBkaWZmZXJlbnQgZGVwbG95bWVudCB0YXJnZXQgZm9yIFdlYlNvY2tldCBmdW5jdGlvbmFsaXR5LicsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFVzZSBkeW5hbWljIHByb3BlcnR5IGFjY2VzcyB0byBhdm9pZCBOZXh0LmpzIEVkZ2UgUnVudGltZSBzdGF0aWMgYW5hbHlzaXMgd2FybmluZ3NcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NWZXJzaW9ucyA9IHByb2Nlc3NbJ3ZlcnNpb25zJ107XG4gICAgICAgICAgICBpZiAocHJvY2Vzc1ZlcnNpb25zICYmIHByb2Nlc3NWZXJzaW9uc1snbm9kZSddKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlICd2JyBwcmVmaXggaWYgcHJlc2VudCBhbmQgcGFyc2UgdGhlIG1ham9yIHZlcnNpb25cbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uU3RyaW5nID0gcHJvY2Vzc1ZlcnNpb25zWydub2RlJ107XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZVZlcnNpb24gPSBwYXJzZUludCh2ZXJzaW9uU3RyaW5nLnJlcGxhY2UoL152LywgJycpLnNwbGl0KCcuJylbMF0pO1xuICAgICAgICAgICAgICAgIC8vIE5vZGUuanMgMjIrIHNob3VsZCBoYXZlIG5hdGl2ZSBXZWJTb2NrZXRcbiAgICAgICAgICAgICAgICBpZiAobm9kZVZlcnNpb24gPj0gMjIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbmF0aXZlIFdlYlNvY2tldCBpcyBhdmFpbGFibGUgKHNob3VsZCBiZSBpbiBOb2RlLmpzIDIyKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLldlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICduYXRpdmUnLCBjb25zdHJ1Y3RvcjogZ2xvYmFsVGhpcy5XZWJTb2NrZXQgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QgYXZhaWxhYmxlLCB1c2VyIG5lZWRzIHRvIHByb3ZpZGUgaXRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd1bnN1cHBvcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYE5vZGUuanMgJHtub2RlVmVyc2lvbn0gZGV0ZWN0ZWQgYnV0IG5hdGl2ZSBXZWJTb2NrZXQgbm90IGZvdW5kLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrYXJvdW5kOiAnUHJvdmlkZSBhIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbiB2aWEgdGhlIHRyYW5zcG9ydCBvcHRpb24uJyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTm9kZS5qcyA8IDIyIGRvZXNuJ3QgaGF2ZSBuYXRpdmUgV2ViU29ja2V0XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3Vuc3VwcG9ydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGBOb2RlLmpzICR7bm9kZVZlcnNpb259IGRldGVjdGVkIHdpdGhvdXQgbmF0aXZlIFdlYlNvY2tldCBzdXBwb3J0LmAsXG4gICAgICAgICAgICAgICAgICAgIHdvcmthcm91bmQ6ICdGb3IgTm9kZS5qcyA8IDIyLCBpbnN0YWxsIFwid3NcIiBwYWNrYWdlIGFuZCBwcm92aWRlIGl0IHZpYSB0aGUgdHJhbnNwb3J0IG9wdGlvbjpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgd3MgZnJvbSBcIndzXCJcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICduZXcgUmVhbHRpbWVDbGllbnQodXJsLCB7IHRyYW5zcG9ydDogd3MgfSknLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICd1bnN1cHBvcnRlZCcsXG4gICAgICAgICAgICBlcnJvcjogJ1Vua25vd24gSmF2YVNjcmlwdCBydW50aW1lIHdpdGhvdXQgV2ViU29ja2V0IHN1cHBvcnQuJyxcbiAgICAgICAgICAgIHdvcmthcm91bmQ6IFwiRW5zdXJlIHlvdSdyZSBydW5uaW5nIGluIGEgc3VwcG9ydGVkIGVudmlyb25tZW50IChicm93c2VyLCBOb2RlLmpzLCBEZW5vKSBvciBwcm92aWRlIGEgY3VzdG9tIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbi5cIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYmVzdCBhdmFpbGFibGUgV2ViU29ja2V0IGNvbnN0cnVjdG9yIGZvciB0aGUgY3VycmVudCBydW50aW1lLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IFdTID0gV2ViU29ja2V0RmFjdG9yeS5nZXRXZWJTb2NrZXRDb25zdHJ1Y3RvcigpXG4gICAgICogY29uc3Qgc29ja2V0ID0gbmV3IFdTKCd3c3M6Ly9yZWFsdGltZS5zdXBhYmFzZS5jby9zb2NrZXQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXZWJTb2NrZXRDb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgZW52ID0gdGhpcy5kZXRlY3RFbnZpcm9ubWVudCgpO1xuICAgICAgICBpZiAoZW52LmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZW52LmNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlbnYuZXJyb3IgfHwgJ1dlYlNvY2tldCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQuJztcbiAgICAgICAgaWYgKGVudi53b3JrYXJvdW5kKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcblxcblN1Z2dlc3RlZCBzb2x1dGlvbjogJHtlbnYud29ya2Fyb3VuZH1gO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgV2ViU29ja2V0IHVzaW5nIHRoZSBkZXRlY3RlZCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBXZWJTb2NrZXRGYWN0b3J5LmNyZWF0ZVdlYlNvY2tldCgnd3NzOi8vcmVhbHRpbWUuc3VwYWJhc2UuY28vc29ja2V0JylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlV2ViU29ja2V0KHVybCwgcHJvdG9jb2xzKSB7XG4gICAgICAgIGNvbnN0IFdTID0gdGhpcy5nZXRXZWJTb2NrZXRDb25zdHJ1Y3RvcigpO1xuICAgICAgICByZXR1cm4gbmV3IFdTKHVybCwgcHJvdG9jb2xzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZWN0cyB3aGV0aGVyIHRoZSBydW50aW1lIGNhbiBlc3RhYmxpc2ggV2ViU29ja2V0IGNvbm5lY3Rpb25zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGlmICghV2ViU29ja2V0RmFjdG9yeS5pc1dlYlNvY2tldFN1cHBvcnRlZCgpKSB7XG4gICAgICogICBjb25zb2xlLndhcm4oJ0ZhbGxpbmcgYmFjayB0byBsb25nIHBvbGxpbmcnKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNXZWJTb2NrZXRTdXBwb3J0ZWQoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbnYgPSB0aGlzLmRldGVjdEVudmlyb25tZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gZW52LnR5cGUgPT09ICduYXRpdmUnIHx8IGVudi50eXBlID09PSAnd3MnO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgV2ViU29ja2V0RmFjdG9yeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYnNvY2tldC1mYWN0b3J5LmpzLm1hcCJdLCJuYW1lcyI6WyJXZWJTb2NrZXRGYWN0b3J5IiwiZGV0ZWN0RW52aXJvbm1lbnQiLCJfYSIsIldlYlNvY2tldCIsInR5cGUiLCJjb25zdHJ1Y3RvciIsImdsb2JhbFRoaXMiLCJnbG9iYWwiLCJXZWJTb2NrZXRQYWlyIiwiZXJyb3IiLCJ3b3JrYXJvdW5kIiwiRWRnZVJ1bnRpbWUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJpbmNsdWRlcyIsInByb2Nlc3MiLCJwcm9jZXNzVmVyc2lvbnMiLCJ2ZXJzaW9uU3RyaW5nIiwibm9kZVZlcnNpb24iLCJwYXJzZUludCIsInJlcGxhY2UiLCJzcGxpdCIsImdldFdlYlNvY2tldENvbnN0cnVjdG9yIiwiZW52IiwiZXJyb3JNZXNzYWdlIiwiRXJyb3IiLCJjcmVhdGVXZWJTb2NrZXQiLCJ1cmwiLCJwcm90b2NvbHMiLCJXUyIsImlzV2ViU29ja2V0U3VwcG9ydGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js":
/*!***********************************************************!*\
!*** ./node_modules/next/dist/build/polyfills/process.js ***!
\***********************************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
eval(__webpack_require__.ts("\nvar _global_process, _global_process1;\nmodule.exports = ((_global_process = __webpack_require__.g.process) == null ? void 0 : _global_process.env) && typeof ((_global_process1 = __webpack_require__.g.process) == null ? void 0 : _global_process1.env) === \"object\" ? __webpack_require__.g.process : __webpack_require__(/*! next/dist/compiled/process */ \"(app-pages-browser)/./node_modules/next/dist/compiled/process/browser.js\"); //# sourceMappingURL=process.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvYnVpbGQvcG9seWZpbGxzL3Byb2Nlc3MuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYixJQUFJQSxpQkFBaUJDO0FBQ3JCQyxPQUFPQyxPQUFPLEdBQUcsQ0FBQyxDQUFDSCxrQkFBa0JJLHFCQUFNQSxDQUFDQyxPQUFPLEtBQUssT0FBTyxLQUFLLElBQUlMLGdCQUFnQk0sR0FBRyxLQUFLLE9BQVEsRUFBQ0wsbUJBQW1CRyxxQkFBTUEsQ0FBQ0MsT0FBTyxLQUFLLE9BQU8sS0FBSyxJQUFJSixpQkFBaUJLLEdBQUcsTUFBTSxXQUFXRixxQkFBTUEsQ0FBQ0MsT0FBTyxHQUFHRSxtQkFBT0EsQ0FBQyw0R0FBNEIsR0FFelAsbUNBQW1DIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvYnVpbGQvcG9seWZpbGxzL3Byb2Nlc3MuanM/Y2E2NSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfZ2xvYmFsX3Byb2Nlc3MsIF9nbG9iYWxfcHJvY2VzczE7XG5tb2R1bGUuZXhwb3J0cyA9ICgoX2dsb2JhbF9wcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3MpID09IG51bGwgPyB2b2lkIDAgOiBfZ2xvYmFsX3Byb2Nlc3MuZW52KSAmJiB0eXBlb2YgKChfZ2xvYmFsX3Byb2Nlc3MxID0gZ2xvYmFsLnByb2Nlc3MpID09IG51bGwgPyB2b2lkIDAgOiBfZ2xvYmFsX3Byb2Nlc3MxLmVudikgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwucHJvY2VzcyA6IHJlcXVpcmUoXCJuZXh0L2Rpc3QvY29tcGlsZWQvcHJvY2Vzc1wiKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvY2Vzcy5qcy5tYXAiXSwibmFtZXMiOlsiX2dsb2JhbF9wcm9jZXNzIiwiX2dsb2JhbF9wcm9jZXNzMSIsIm1vZHVsZSIsImV4cG9ydHMiLCJnbG9iYWwiLCJwcm9jZXNzIiwiZW52IiwicmVxdWlyZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/next/dist/compiled/buffer/index.js":
/*!*********************************************************!*\
!*** ./node_modules/next/dist/compiled/buffer/index.js ***!
\*********************************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
eval(__webpack_require__.ts("var __dirname = \"/\";\n\n(function() {\n var e = {\n 675: function(e, r) {\n \"use strict\";\n r.byteLength = byteLength;\n r.toByteArray = toByteArray;\n r.fromByteArray = fromByteArray;\n var t = [];\n var f = [];\n var n = typeof Uint8Array !== \"undefined\" ? Uint8Array : Array;\n var i = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n for(var o = 0, u = i.length; o < u; ++o){\n t[o] = i[o];\n f[i.charCodeAt(o)] = o;\n }\n f[\"-\".charCodeAt(0)] = 62;\n f[\"_\".charCodeAt(0)] = 63;\n function getLens(e) {\n var r = e.length;\n if (r % 4 > 0) {\n throw new Error(\"Invalid string. Length must be a multiple of 4\");\n }\n var t = e.indexOf(\"=\");\n if (t === -1) t = r;\n var f = t === r ? 0 : 4 - t % 4;\n return [\n t,\n f\n ];\n }\n function byteLength(e) {\n var r = getLens(e);\n var t = r[0];\n var f = r[1];\n return (t + f) * 3 / 4 - f;\n }\n function _byteLength(e, r, t) {\n return (r + t) * 3 / 4 - t;\n }\n function toByteArray(e) {\n var r;\n var t = getLens(e);\n var i = t[0];\n var o = t[1];\n var u = new n(_byteLength(e, i, o));\n var a = 0;\n var s = o > 0 ? i - 4 : i;\n var h;\n for(h = 0; h < s; h += 4){\n r = f[e.charCodeAt(h)] << 18 | f[e.charCodeAt(h + 1)] << 12 | f[e.charCodeAt(h + 2)] << 6 | f[e.charCodeAt(h + 3)];\n u[a++] = r >> 16 & 255;\n u[a++] = r >> 8 & 255;\n u[a++] = r & 255;\n }\n if (o === 2) {\n r = f[e.charCodeAt(h)] << 2 | f[e.charCodeAt(h + 1)] >> 4;\n u[a++] = r & 255;\n }\n if (o === 1) {\n r = f[e.charCodeAt(h)] << 10 | f[e.charCodeAt(h + 1)] << 4 | f[e.charCodeAt(h + 2)] >> 2;\n u[a++] = r >> 8 & 255;\n u[a++] = r & 255;\n }\n return u;\n }\n function tripletToBase64(e) {\n return t[e >> 18 & 63] + t[e >> 12 & 63] + t[e >> 6 & 63] + t[e & 63];\n }\n function encodeChunk(e, r, t) {\n var f;\n var n = [];\n for(var i = r; i < t; i += 3){\n f = (e[i] << 16 & 16711680) + (e[i + 1] << 8 & 65280) + (e[i + 2] & 255);\n n.push(tripletToBase64(f));\n }\n return n.join(\"\");\n }\n function fromByteArray(e) {\n var r;\n var f = e.length;\n var n = f % 3;\n var i = [];\n var o = 16383;\n for(var u = 0, a = f - n; u < a; u += o){\n i.push(encodeChunk(e, u, u + o > a ? a : u + o));\n }\n if (n === 1) {\n r = e[f - 1];\n i.push(t[r >> 2] + t[r << 4 & 63] + \"==\");\n } else if (n === 2) {\n r = (e[f - 2] << 8) + e[f - 1];\n i.push(t[r >> 10] + t[r >> 4 & 63] + t[r << 2 & 63] + \"=\");\n }\n return i.join(\"\");\n }\n },\n 72: function(e, r, t) {\n \"use strict\";\n /*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */ var f = t(675);\n var n = t(783);\n var i = typeof Symbol === \"function\" && typeof Symbol.for === \"function\" ? Symbol.for(\"nodejs.util.inspect.custom\") : null;\n r.Buffer = Buffer;\n r.SlowBuffer = SlowBuffer;\n r.INSPECT_MAX_BYTES = 50;\n var o = 2147483647;\n r.kMaxLength = o;\n Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport();\n if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== \"undefined\" && typeof console.error === \"function\") {\n console.error(\"This browser lacks typed array (Uint8Array) support which is required by \" + \"`buffer` v5.x. Use `buffer` v4.x if you require old browser support.\");\n }\n function typedArraySupport() {\n try {\n var e = new Uint8Array(1);\n var r = {\n foo: function() {\n return 42;\n }\n };\n Object.setPrototypeOf(r, Uint8Array.prototype);\n Object.setPrototypeOf(e, r);\n return e.foo() === 42;\n } catch (e) {\n return false;\n }\n }\n Object.defineProperty(Buffer.prototype, \"parent\", {\n enumerable: true,\n get: function() {\n if (!Buffer.isBuffer(this)) return undefined;\n return this.buffer;\n }\n });\n Object.defineProperty(Buffer.prototype, \"offset\", {\n enumerable: true,\n get: function() {\n if (!Buffer.isBuffer(this)) return undefined;\n return this.byteOffset;\n }\n });\n function createBuffer(e) {\n if (e > o) {\n throw new RangeError('The value \"' + e + '\" is invalid for option \"size\"');\n }\n var r = new Uint8Array(e);\n Object.setPrototypeOf(r, Buffer.prototype);\n return r;\n }\n function Buffer(e, r, t) {\n if (typeof e === \"number\") {\n if (typeof r === \"string\") {\n throw new TypeError('The \"string\" argument must be of type string. Received type number');\n }\n return allocUnsafe(e);\n }\n return from(e, r, t);\n }\n Buffer.poolSize = 8192;\n function from(e, r, t) {\n if (typeof e === \"string\") {\n return fromString(e, r);\n }\n if (ArrayBuffer.isView(e)) {\n return fromArrayLike(e);\n }\n if (e == null) {\n throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, \" + \"or Array-like Object. Received type \" + typeof e);\n }\n if (isInstance(e, ArrayBuffer) || e && isInstance(e.buffer, ArrayBuffer)) {\n return fromArrayBuffer(e, r, t);\n }\n if (typeof SharedArrayBuffer !== \"undefined\" && (isInstance(e, SharedArrayBuffer) || e && isInstance(e.buffer, SharedArrayBuffer))) {\n return fromArrayBuffer(e, r, t);\n }\n if (typeof e === \"number\") {\n throw new TypeError('The \"value\" argument must not be of type number. Received type number');\n }\n var f = e.valueOf && e.valueOf();\n if (f != null && f !== e) {\n return Buffer.from(f, r, t);\n }\n var n = fromObject(e);\n if (n) return n;\n if (typeof Symbol !== \"undefined\" && Symbol.toPrimitive != null && typeof e[Symbol.toPrimitive] === \"function\") {\n return Buffer.from(e[Symbol.toPrimitive](\"string\"), r, t);\n }\n throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, \" + \"or Array-like Object. Received type \" + typeof e);\n }\n Buffer.from = function(e, r, t) {\n return from(e, r, t);\n };\n Object.setPrototypeOf(Buffer.prototype, Uint8Array.prototype);\n Object.setPrototypeOf(Buffer, Uint8Array);\n function assertSize(e) {\n if (typeof e !== \"number\") {\n throw new TypeError('\"size\" argument must be of type number');\n } else if (e < 0) {\n throw new RangeError('The value \"' + e + '\" is invalid for option \"size\"');\n }\n }\n function alloc(e, r, t) {\n assertSize(e);\n if (e <= 0) {\n return createBuffer(e);\n }\n if (r !== undefined) {\n return typeof t === \"string\" ? createBuffer(e).fill(r, t) : createBuffer(e).fill(r);\n }\n return createBuffer(e);\n }\n Buffer.alloc = function(e, r, t) {\n return alloc(e, r, t);\n };\n function allocUnsafe(e) {\n assertSize(e);\n return createBuffer(e < 0 ? 0 : checked(e) | 0);\n }\n Buffer.allocUnsafe = function(e) {\n return allocUnsafe(e);\n };\n Buffer.allocUnsafeSlow = function(e) {\n return allocUnsafe(e);\n };\n function fromString(e, r) {\n if (typeof r !== \"string\" || r === \"\") {\n r = \"utf8\";\n }\n if (!Buffer.isEncoding(r)) {\n throw new TypeError(\"Unknown encoding: \" + r);\n }\n var t = byteLength(e, r) | 0;\n var f = createBuffer(t);\n var n = f.write(e, r);\n if (n !== t) {\n f = f.slice(0, n);\n }\n return f;\n }\n function fromArrayLike(e) {\n var r = e.length < 0 ? 0 : checked(e.length) | 0;\n var t = createBuffer(r);\n for(var f = 0; f < r; f += 1){\n t[f] = e[f] & 255;\n }\n return t;\n }\n function fromArrayBuffer(e, r, t) {\n if (r < 0 || e.byteLength < r) {\n throw new RangeError('\"offset\" is outside of buffer bounds');\n }\n if (e.byteLength < r + (t || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds');\n }\n var f;\n if (r === undefined && t === undefined) {\n f = new Uint8Array(e);\n } else if (t === undefined) {\n f = new Uint8Array(e, r);\n } else {\n f = new Uint8Array(e, r, t);\n }\n Object.setPrototypeOf(f, Buffer.prototype);\n return f;\n }\n function fromObject(e) {\n if (Buffer.isBuffer(e)) {\n var r = checked(e.length) | 0;\n var t = createBuffer(r);\n if (t.length === 0) {\n return t;\n }\n e.copy(t, 0, 0, r);\n return t;\n }\n if (e.length !== undefined) {\n if (typeof e.length !== \"number\" || numberIsNaN(e.length)) {\n return createBuffer(0);\n }\n return fromArrayLike(e);\n }\n if (e.type === \"Buffer\" && Array.isArray(e.data)) {\n return fromArrayLike(e.data);\n }\n }\n function checked(e) {\n if (e >= o) {\n throw new RangeError(\"Attempt to allocate Buffer larger than maximum \" + \"size: 0x\" + o.toString(16) + \" bytes\");\n }\n return e | 0;\n }\n function SlowBuffer(e) {\n if (+e != e) {\n e = 0;\n }\n return Buffer.alloc(+e);\n }\n Buffer.isBuffer = function isBuffer(e) {\n return e != null && e._isBuffer === true && e !== Buffer.prototype;\n };\n Buffer.compare = function compare(e, r) {\n if (isInstance(e, Uint8Array)) e = Buffer.from(e, e.offset, e.byteLength);\n if (isInstance(r, Uint8Array)) r = Buffer.from(r, r.offset, r.byteLength);\n if (!Buffer.isBuffer(e) || !Buffer.isBuffer(r)) {\n throw new TypeError('The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array');\n }\n if (e === r) return 0;\n var t = e.length;\n var f = r.length;\n for(var n = 0, i = Math.min(t, f); n < i; ++n){\n if (e[n] !== r[n]) {\n t = e[n];\n f = r[n];\n break;\n }\n }\n if (t < f) return -1;\n if (f < t) return 1;\n return 0;\n };\n Buffer.isEncoding = function isEncoding(e) {\n switch(String(e).toLowerCase()){\n case \"hex\":\n case \"utf8\":\n case \"utf-8\":\n case \"ascii\":\n case \"latin1\":\n case \"binary\":\n case \"base64\":\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return true;\n default:\n return false;\n }\n };\n Buffer.concat = function concat(e, r) {\n if (!Array.isArray(e)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers');\n }\n if (e.length === 0) {\n return Buffer.alloc(0);\n }\n var t;\n if (r === undefined) {\n r = 0;\n for(t = 0; t < e.length; ++t){\n r += e[t].length;\n }\n }\n var f = Buffer.allocUnsafe(r);\n var n = 0;\n for(t = 0; t < e.length; ++t){\n var i = e[t];\n if (isInstance(i, Uint8Array)) {\n i = Buffer.from(i);\n }\n if (!Buffer.isBuffer(i)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers');\n }\n i.copy(f, n);\n n += i.length;\n }\n return f;\n };\n function byteLength(e, r) {\n if (Buffer.isBuffer(e)) {\n return e.length;\n }\n if (ArrayBuffer.isView(e) || isInstance(e, ArrayBuffer)) {\n return e.byteLength;\n }\n if (typeof e !== \"string\") {\n throw new TypeError('The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' + \"Received type \" + typeof e);\n }\n var t = e.length;\n var f = arguments.length > 2 && arguments[2] === true;\n if (!f && t === 0) return 0;\n var n = false;\n for(;;){\n switch(r){\n case \"ascii\":\n case \"latin1\":\n case \"binary\":\n return t;\n case \"utf8\":\n case \"utf-8\":\n return utf8ToBytes(e).length;\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return t * 2;\n case \"hex\":\n return t >>> 1;\n case \"base64\":\n return base64ToBytes(e).length;\n default:\n if (n) {\n return f ? -1 : utf8ToBytes(e).length;\n }\n r = (\"\" + r).toLowerCase();\n n = true;\n }\n }\n }\n Buffer.byteLength = byteLength;\n function slowToString(e, r, t) {\n var f = false;\n if (r === undefined || r < 0) {\n r = 0;\n }\n if (r > this.length) {\n return \"\";\n }\n if (t === undefined || t > this.length) {\n t = this.length;\n }\n if (t <= 0) {\n return \"\";\n }\n t >>>= 0;\n r >>>= 0;\n if (t <= r) {\n return \"\";\n }\n if (!e) e = \"utf8\";\n while(true){\n switch(e){\n case \"hex\":\n return hexSlice(this, r, t);\n case \"utf8\":\n case \"utf-8\":\n return utf8Slice(this, r, t);\n case \"ascii\":\n return asciiSlice(this, r, t);\n case \"latin1\":\n case \"binary\":\n return latin1Slice(this, r, t);\n case \"base64\":\n return base64Slice(this, r, t);\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return utf16leSlice(this, r, t);\n default:\n if (f) throw new TypeError(\"Unknown encoding: \" + e);\n e = (e + \"\").toLowerCase();\n f = true;\n }\n }\n }\n Buffer.prototype._isBuffer = true;\n function swap(e, r, t) {\n var f = e[r];\n e[r] = e[t];\n e[t] = f;\n }\n Buffer.prototype.swap16 = function swap16() {\n var e = this.length;\n if (e % 2 !== 0) {\n throw new RangeError(\"Buffer size must be a multiple of 16-bits\");\n }\n for(var r = 0; r < e; r += 2){\n swap(this, r, r + 1);\n }\n return this;\n };\n Buffer.prototype.swap32 = function swap32() {\n var e = this.length;\n if (e % 4 !== 0) {\n throw new RangeError(\"Buffer size must be a multiple of 32-bits\");\n }\n for(var r = 0; r < e; r += 4){\n swap(this, r, r + 3);\n swap(this, r + 1, r + 2);\n }\n return this;\n };\n Buffer.prototype.swap64 = function swap64() {\n var e = this.length;\n if (e % 8 !== 0) {\n throw new RangeError(\"Buffer size must be a multiple of 64-bits\");\n }\n for(var r = 0; r < e; r += 8){\n swap(this, r, r + 7);\n swap(this, r + 1, r + 6);\n swap(this, r + 2, r + 5);\n swap(this, r + 3, r + 4);\n }\n return this;\n };\n Buffer.prototype.toString = function toString() {\n var e = this.length;\n if (e === 0) return \"\";\n if (arguments.length === 0) return utf8Slice(this, 0, e);\n return slowToString.apply(this, arguments);\n };\n Buffer.prototype.toLocaleString = Buffer.prototype.toString;\n Buffer.prototype.equals = function equals(e) {\n if (!Buffer.isBuffer(e)) throw new TypeError(\"Argument must be a Buffer\");\n if (this === e) return true;\n return Buffer.compare(this, e) === 0;\n };\n Buffer.prototype.inspect = function inspect() {\n var e = \"\";\n var t = r.INSPECT_MAX_BYTES;\n e = this.toString(\"hex\", 0, t).replace(/(.{2})/g, \"$1 \").trim();\n if (this.length > t) e += \" ... \";\n return \"<Buffer \" + e + \">\";\n };\n if (i) {\n Buffer.prototype[i] = Buffer.prototype.inspect;\n }\n Buffer.prototype.compare = function compare(e, r, t, f, n) {\n if (isInstance(e, Uint8Array)) {\n e = Buffer.from(e, e.offset, e.byteLength);\n }\n if (!Buffer.isBuffer(e)) {\n throw new TypeError('The \"target\" argument must be one of type Buffer or Uint8Array. ' + \"Received type \" + typeof e);\n }\n if (r === undefined) {\n r = 0;\n }\n if (t === undefined) {\n t = e ? e.length : 0;\n }\n if (f === undefined) {\n f = 0;\n }\n if (n === undefined) {\n n = this.length;\n }\n if (r < 0 || t > e.length || f < 0 || n > this.length) {\n throw new RangeError(\"out of range index\");\n }\n if (f >= n && r >= t) {\n return 0;\n }\n if (f >= n) {\n return -1;\n }\n if (r >= t) {\n return 1;\n }\n r >>>= 0;\n t >>>= 0;\n f >>>= 0;\n n >>>= 0;\n if (this === e) return 0;\n var i = n - f;\n var o = t - r;\n var u = Math.min(i, o);\n var a = this.slice(f, n);\n var s = e.slice(r, t);\n for(var h = 0; h < u; ++h){\n if (a[h] !== s[h]) {\n i = a[h];\n o = s[h];\n break;\n }\n }\n if (i < o) return -1;\n if (o < i) return 1;\n return 0;\n };\n function bidirectionalIndexOf(e, r, t, f, n) {\n if (e.length === 0) return -1;\n if (typeof t === \"string\") {\n f = t;\n t = 0;\n } else if (t > 2147483647) {\n t = 2147483647;\n } else if (t < -2147483648) {\n t = -2147483648;\n }\n t = +t;\n if (numberIsNaN(t)) {\n t = n ? 0 : e.length - 1;\n }\n if (t < 0) t = e.length + t;\n if (t >= e.length) {\n if (n) return -1;\n else t = e.length - 1;\n } else if (t < 0) {\n if (n) t = 0;\n else return -1;\n }\n if (typeof r === \"string\") {\n r = Buffer.from(r, f);\n }\n if (Buffer.isBuffer(r)) {\n if (r.length === 0) {\n return -1;\n }\n return arrayIndexOf(e, r, t, f, n);\n } else if (typeof r === \"number\") {\n r = r & 255;\n if (typeof Uint8Array.prototype.indexOf === \"function\") {\n if (n) {\n return Uint8Array.prototype.indexOf.call(e, r, t);\n } else {\n return Uint8Array.prototype.lastIndexOf.call(e, r, t);\n }\n }\n return arrayIndexOf(e, [\n r\n ], t, f, n);\n }\n throw new TypeError(\"val must be string, number or Buffer\");\n }\n function arrayIndexOf(e, r, t, f, n) {\n var i = 1;\n var o = e.length;\n var u = r.length;\n if (f !== undefined) {\n f = String(f).toLowerCase();\n if (f === \"ucs2\" || f === \"ucs-2\" || f === \"utf16le\" || f === \"utf-16le\") {\n if (e.length < 2 || r.length < 2) {\n return -1;\n }\n i = 2;\n o /= 2;\n u /= 2;\n t /= 2;\n }\n }\n function read(e, r) {\n if (i === 1) {\n return e[r];\n } else {\n return e.readUInt16BE(r * i);\n }\n }\n var a;\n if (n) {\n var s = -1;\n for(a = t; a < o; a++){\n if (read(e, a) === read(r, s === -1 ? 0 : a - s)) {\n if (s === -1) s = a;\n if (a - s + 1 === u) return s * i;\n } else {\n if (s !== -1) a -= a - s;\n s = -1;\n }\n }\n } else {\n if (t + u > o) t = o - u;\n for(a = t; a >= 0; a--){\n var h = true;\n for(var c = 0; c < u; c++){\n if (read(e, a + c) !== read(r, c)) {\n h = false;\n break;\n }\n }\n if (h) return a;\n }\n }\n return -1;\n }\n Buffer.prototype.includes = function includes(e, r, t) {\n return this.indexOf(e, r, t) !== -1;\n };\n Buffer.prototype.indexOf = function indexOf(e, r, t) {\n return bidirectionalIndexOf(this, e, r, t, true);\n };\n Buffer.prototype.lastIndexOf = function lastIndexOf(e, r, t) {\n return bidirectionalIndexOf(this, e, r, t, false);\n };\n function hexWrite(e, r, t, f) {\n t = Number(t) || 0;\n var n = e.length - t;\n if (!f) {\n f = n;\n } else {\n f = Number(f);\n if (f > n) {\n f = n;\n }\n }\n var i = r.length;\n if (f > i / 2) {\n f = i / 2;\n }\n for(var o = 0; o < f; ++o){\n var u = parseInt(r.substr(o * 2, 2), 16);\n if (numberIsNaN(u)) return o;\n e[t + o] = u;\n }\n return o;\n }\n function utf8Write(e, r, t, f) {\n return blitBuffer(utf8ToBytes(r, e.length - t), e, t, f);\n }\n function asciiWrite(e, r, t, f) {\n return blitBuffer(asciiToBytes(r), e, t, f);\n }\n function latin1Write(e, r, t, f) {\n return asciiWrite(e, r, t, f);\n }\n function base64Write(e, r, t, f) {\n return blitBuffer(base64ToBytes(r), e, t, f);\n }\n function ucs2Write(e, r, t, f) {\n return blitBuffer(utf16leToBytes(r, e.length - t), e, t, f);\n }\n Buffer.prototype.write = function write(e, r, t, f) {\n if (r === undefined) {\n f = \"utf8\";\n t = this.length;\n r = 0;\n } else if (t === undefined && typeof r === \"string\") {\n f = r;\n t = this.length;\n r = 0;\n } else if (isFinite(r)) {\n r = r >>> 0;\n if (isFinite(t)) {\n t = t >>> 0;\n if (f === undefined) f = \"utf8\";\n } else {\n f = t;\n t = undefined;\n }\n } else {\n throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");\n }\n var n = this.length - r;\n if (t === undefined || t > n) t = n;\n if (e.length > 0 && (t < 0 || r < 0) || r > this.length) {\n throw new RangeError(\"Attempt to write outside buffer bounds\");\n }\n if (!f) f = \"utf8\";\n var i = false;\n for(;;){\n switch(f){\n case \"hex\":\n return hexWrite(this, e, r, t);\n case \"utf8\":\n case \"utf-8\":\n return utf8Write(this, e, r, t);\n case \"ascii\":\n return asciiWrite(this, e, r, t);\n case \"latin1\":\n case \"binary\":\n return latin1Write(this, e, r, t);\n case \"base64\":\n return base64Write(this, e, r, t);\n case \"ucs2\":\n case \"ucs-2\":\n case \"utf16le\":\n case \"utf-16le\":\n return ucs2Write(this, e, r, t);\n default:\n if (i) throw new TypeError(\"Unknown encoding: \" + f);\n f = (\"\" + f).toLowerCase();\n i = true;\n }\n }\n };\n Buffer.prototype.toJSON = function toJSON() {\n return {\n type: \"Buffer\",\n data: Array.prototype.slice.call(this._arr || this, 0)\n };\n };\n function base64Slice(e, r, t) {\n if (r === 0 && t === e.length) {\n return f.fromByteArray(e);\n } else {\n return f.fromByteArray(e.slice(r, t));\n }\n }\n function utf8Slice(e, r, t) {\n t = Math.min(e.length, t);\n var f = [];\n var n = r;\n while(n < t){\n var i = e[n];\n var o = null;\n var u = i > 239 ? 4 : i > 223 ? 3 : i > 191 ? 2 : 1;\n if (n + u <= t) {\n var a, s, h, c;\n switch(u){\n case 1:\n if (i < 128) {\n o = i;\n }\n break;\n case 2:\n a = e[n + 1];\n if ((a & 192) === 128) {\n c = (i & 31) << 6 | a & 63;\n if (c > 127) {\n o = c;\n }\n }\n break;\n case 3:\n a = e[n + 1];\n s = e[n + 2];\n if ((a & 192) === 128 && (s & 192) === 128) {\n c = (i & 15) << 12 | (a & 63) << 6 | s & 63;\n if (c > 2047 && (c < 55296 || c > 57343)) {\n o = c;\n }\n }\n break;\n case 4:\n a = e[n + 1];\n s = e[n + 2];\n h = e[n + 3];\n if ((a & 192) === 128 && (s & 192) === 128 && (h & 192) === 128) {\n c = (i & 15) << 18 | (a & 63) << 12 | (s & 63) << 6 | h & 63;\n if (c > 65535 && c < 1114112) {\n o = c;\n }\n }\n }\n }\n if (o === null) {\n o = 65533;\n u = 1;\n } else if (o > 65535) {\n o -= 65536;\n f.push(o >>> 10 & 1023 | 55296);\n o = 56320 | o & 1023;\n }\n f.push(o);\n n += u;\n }\n return decodeCodePointsArray(f);\n }\n var u = 4096;\n function decodeCodePointsArray(e) {\n var r = e.length;\n if (r <= u) {\n return String.fromCharCode.apply(String, e);\n }\n var t = \"\";\n var f = 0;\n while(f < r){\n t += String.fromCharCode.apply(String, e.slice(f, f += u));\n }\n return t;\n }\n function asciiSlice(e, r, t) {\n var f = \"\";\n t = Math.min(e.length, t);\n for(var n = r; n < t; ++n){\n f += String.fromCharCode(e[n] & 127);\n }\n return f;\n }\n function latin1Slice(e, r, t) {\n var f = \"\";\n t = Math.min(e.length, t);\n for(var n = r; n < t; ++n){\n f += String.fromCharCode(e[n]);\n }\n return f;\n }\n function hexSlice(e, r, t) {\n var f = e.length;\n if (!r || r < 0) r = 0;\n if (!t || t < 0 || t > f) t = f;\n var n = \"\";\n for(var i = r; i < t; ++i){\n n += s[e[i]];\n }\n return n;\n }\n function utf16leSlice(e, r, t) {\n var f = e.slice(r, t);\n var n = \"\";\n for(var i = 0; i < f.length; i += 2){\n n += String.fromCharCode(f[i] + f[i + 1] * 256);\n }\n return n;\n }\n Buffer.prototype.slice = function slice(e, r) {\n var t = this.length;\n e = ~~e;\n r = r === undefined ? t : ~~r;\n if (e < 0) {\n e += t;\n if (e < 0) e = 0;\n } else if (e > t) {\n e = t;\n }\n if (r < 0) {\n r += t;\n if (r < 0) r = 0;\n } else if (r > t) {\n r = t;\n }\n if (r < e) r = e;\n var f = this.subarray(e, r);\n Object.setPrototypeOf(f, Buffer.prototype);\n return f;\n };\n function checkOffset(e, r, t) {\n if (e % 1 !== 0 || e < 0) throw new RangeError(\"offset is not uint\");\n if (e + r > t) throw new RangeError(\"Trying to access beyond buffer length\");\n }\n Buffer.prototype.readUIntLE = function readUIntLE(e, r, t) {\n e = e >>> 0;\n r = r >>> 0;\n if (!t) checkOffset(e, r, this.length);\n var f = this[e];\n var n = 1;\n var i = 0;\n while(++i < r && (n *= 256)){\n f += this[e + i] * n;\n }\n return f;\n };\n Buffer.prototype.readUIntBE = function readUIntBE(e, r, t) {\n e = e >>> 0;\n r = r >>> 0;\n if (!t) {\n checkOffset(e, r, this.length);\n }\n var f = this[e + --r];\n var n = 1;\n while(r > 0 && (n *= 256)){\n f += this[e + --r] * n;\n }\n return f;\n };\n Buffer.prototype.readUInt8 = function readUInt8(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 1, this.length);\n return this[e];\n };\n Buffer.prototype.readUInt16LE = function readUInt16LE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 2, this.length);\n return this[e] | this[e + 1] << 8;\n };\n Buffer.prototype.readUInt16BE = function readUInt16BE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 2, this.length);\n return this[e] << 8 | this[e + 1];\n };\n Buffer.prototype.readUInt32LE = function readUInt32LE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 4, this.length);\n return (this[e] | this[e + 1] << 8 | this[e + 2] << 16) + this[e + 3] * 16777216;\n };\n Buffer.prototype.readUInt32BE = function readUInt32BE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 4, this.length);\n return this[e] * 16777216 + (this[e + 1] << 16 | this[e + 2] << 8 | this[e + 3]);\n };\n Buffer.prototype.readIntLE = function readIntLE(e, r, t) {\n e = e >>> 0;\n r = r >>> 0;\n if (!t) checkOffset(e, r, this.length);\n var f = this[e];\n var n = 1;\n var i = 0;\n while(++i < r && (n *= 256)){\n f += this[e + i] * n;\n }\n n *= 128;\n if (f >= n) f -= Math.pow(2, 8 * r);\n return f;\n };\n Buffer.prototype.readIntBE = function readIntBE(e, r, t) {\n e = e >>> 0;\n r = r >>> 0;\n if (!t) checkOffset(e, r, this.length);\n var f = r;\n var n = 1;\n var i = this[e + --f];\n while(f > 0 && (n *= 256)){\n i += this[e + --f] * n;\n }\n n *= 128;\n if (i >= n) i -= Math.pow(2, 8 * r);\n return i;\n };\n Buffer.prototype.readInt8 = function readInt8(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 1, this.length);\n if (!(this[e] & 128)) return this[e];\n return (255 - this[e] + 1) * -1;\n };\n Buffer.prototype.readInt16LE = function readInt16LE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 2, this.length);\n var t = this[e] | this[e + 1] << 8;\n return t & 32768 ? t | 4294901760 : t;\n };\n Buffer.prototype.readInt16BE = function readInt16BE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 2, this.length);\n var t = this[e + 1] | this[e] << 8;\n return t & 32768 ? t | 4294901760 : t;\n };\n Buffer.prototype.readInt32LE = function readInt32LE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 4, this.length);\n return this[e] | this[e + 1] << 8 | this[e + 2] << 16 | this[e + 3] << 24;\n };\n Buffer.prototype.readInt32BE = function readInt32BE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 4, this.length);\n return this[e] << 24 | this[e + 1] << 16 | this[e + 2] << 8 | this[e + 3];\n };\n Buffer.prototype.readFloatLE = function readFloatLE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 4, this.length);\n return n.read(this, e, true, 23, 4);\n };\n Buffer.prototype.readFloatBE = function readFloatBE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 4, this.length);\n return n.read(this, e, false, 23, 4);\n };\n Buffer.prototype.readDoubleLE = function readDoubleLE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 8, this.length);\n return n.read(this, e, true, 52, 8);\n };\n Buffer.prototype.readDoubleBE = function readDoubleBE(e, r) {\n e = e >>> 0;\n if (!r) checkOffset(e, 8, this.length);\n return n.read(this, e, false, 52, 8);\n };\n function checkInt(e, r, t, f, n, i) {\n if (!Buffer.isBuffer(e)) throw new TypeError('\"buffer\" argument must be a Buffer instance');\n if (r > n || r < i) throw new RangeError('\"value\" argument is out of bounds');\n if (t + f > e.length) throw new RangeError(\"Index out of range\");\n }\n Buffer.prototype.writeUIntLE = function writeUIntLE(e, r, t, f) {\n e = +e;\n r = r >>> 0;\n t = t >>> 0;\n if (!f) {\n var n = Math.pow(2, 8 * t) - 1;\n checkInt(this, e, r, t, n, 0);\n }\n var i = 1;\n var o = 0;\n this[r] = e & 255;\n while(++o < t && (i *= 256)){\n this[r + o] = e / i & 255;\n }\n return r + t;\n };\n Buffer.prototype.writeUIntBE = function writeUIntBE(e, r, t, f) {\n e = +e;\n r = r >>> 0;\n t = t >>> 0;\n if (!f) {\n var n = Math.pow(2, 8 * t) - 1;\n checkInt(this, e, r, t, n, 0);\n }\n var i = t - 1;\n var o = 1;\n this[r + i] = e & 255;\n while(--i >= 0 && (o *= 256)){\n this[r + i] = e / o & 255;\n }\n return r + t;\n };\n Buffer.prototype.writeUInt8 = function writeUInt8(e, r, t) {\n e = +e;\n r = r >>> 0;\n if (!t) checkInt(this, e, r, 1, 255, 0);\n this[r] = e & 255;\n return r + 1;\n };\n Buffer.prototype.writeUInt16LE = function writeUInt16LE(e, r, t) {\n e = +e;\n r = r >>> 0;\n if (!t) checkInt(this, e, r, 2, 65535, 0);\n this[r] = e & 255;\n this[r + 1] = e >>> 8;\n return r + 2;\n };\n Buffer.prototype.writeUInt16BE = function writeUInt16BE(e, r, t) {\n e = +e;\n r = r >>> 0;\n if (!t) checkInt(this, e, r, 2, 65535, 0);\n this[r] = e >>> 8;\n this[r + 1] = e & 255;\n return r + 2;\n };\n Buffer.prototype.writeUInt32LE = function writeUInt32LE(e, r, t) {\n e = +e;\n r = r >>> 0;\n if (!t) checkInt(this, e, r, 4, 4294967295, 0);\n this[r + 3] = e >>> 24;\n this[r + 2] = e >>> 16;\n this[r + 1] = e >>> 8;\n this[r] = e & 255;\n return r + 4;\n };\n Buffer.prototype.writeUInt32BE = function writeUInt32BE(e, r, t) {\n e = +e;\n r = r >>> 0;\n if (!t) checkInt(this, e, r, 4, 4294967295, 0);\n this[r] = e >>> 24;\n this[r + 1] = e >>> 16;\n this[r + 2] = e >>> 8;\n this[r + 3] = e & 255;\n return r + 4;\n };\n Buffer.prototype.writeIntLE = function writeIntLE(e, r, t, f) {\n e = +e;\n r = r >>> 0;\n if (!f) {\n var n = Math.pow(2, 8 * t - 1);\n checkInt(this, e, r, t, n - 1, -n);\n }\n var i = 0;\n var o = 1;\n var u = 0;\n this[r] = e & 255;\n while(++i < t && (o *= 256)){\n if (e < 0 && u === 0 && this[r + i - 1] !== 0) {\n u = 1;\n }\n this[r + i] = (e / o >> 0) - u & 255;\n }\n return r + t;\n };\n Buffer.prototype.writeIntBE = function writeIntBE(e, r, t, f) {\n e = +e;\n r = r >>> 0;\n if (!f) {\n var n = Math.pow(2, 8 * t - 1);\n checkInt(this, e, r, t, n - 1, -n);\n }\n var i = t - 1;\n var o = 1;\n var u = 0;\n this[r + i] = e & 255;\n while(--i >= 0 && (o *= 256)){\n if (e < 0 && u === 0 && this[r + i + 1] !== 0) {\n u = 1;\n }\n this[r + i] = (e / o >> 0) - u & 255;\n }\n return r + t;\n };\n Buffer.prototype.writeInt8 = function writeInt8(e, r, t) {\n e = +e;\n r = r >>> 0;\n if (!t) checkInt(this, e, r, 1, 127, -128);\n if (e < 0) e = 255 + e + 1;\n this[r] = e & 255;\n return r + 1;\n };\n Buffer.prototype.writeInt16LE = function writeInt16LE(e, r, t) {\n e = +e;\n r = r >>> 0;\n if (!t) checkInt(this, e, r, 2, 32767, -32768);\n this[r] = e & 255;\n this[r + 1] = e >>> 8;\n return r + 2;\n };\n Buffer.prototype.writeInt16BE = function writeInt16BE(e, r, t) {\n e = +e;\n r = r >>> 0;\n if (!t) checkInt(this, e, r, 2, 32767, -32768);\n this[r] = e >>> 8;\n this[r + 1] = e & 255;\n return r + 2;\n };\n Buffer.prototype.writeInt32LE = function writeInt32LE(e, r, t) {\n e = +e;\n r = r >>> 0;\n if (!t) checkInt(this, e, r, 4, 2147483647, -2147483648);\n this[r] = e & 255;\n this[r + 1] = e >>> 8;\n this[r + 2] = e >>> 16;\n this[r + 3] = e >>> 24;\n return r + 4;\n };\n Buffer.prototype.writeInt32BE = function writeInt32BE(e, r, t) {\n e = +e;\n r = r >>> 0;\n if (!t) checkInt(this, e, r, 4, 2147483647, -2147483648);\n if (e < 0) e = 4294967295 + e + 1;\n this[r] = e >>> 24;\n this[r + 1] = e >>> 16;\n this[r + 2] = e >>> 8;\n this[r + 3] = e & 255;\n return r + 4;\n };\n function checkIEEE754(e, r, t, f, n, i) {\n if (t + f > e.length) throw new RangeError(\"Index out of range\");\n if (t < 0) throw new RangeError(\"Index out of range\");\n }\n function writeFloat(e, r, t, f, i) {\n r = +r;\n t = t >>> 0;\n if (!i) {\n checkIEEE754(e, r, t, 4, 34028234663852886e22, -34028234663852886e22);\n }\n n.write(e, r, t, f, 23, 4);\n return t + 4;\n }\n Buffer.prototype.writeFloatLE = function writeFloatLE(e, r, t) {\n return writeFloat(this, e, r, true, t);\n };\n Buffer.prototype.writeFloatBE = function writeFloatBE(e, r, t) {\n return writeFloat(this, e, r, false, t);\n };\n function writeDouble(e, r, t, f, i) {\n r = +r;\n t = t >>> 0;\n if (!i) {\n checkIEEE754(e, r, t, 8, 17976931348623157e292, -17976931348623157e292);\n }\n n.write(e, r, t, f, 52, 8);\n return t + 8;\n }\n Buffer.prototype.writeDoubleLE = function writeDoubleLE(e, r, t) {\n return writeDouble(this, e, r, true, t);\n };\n Buffer.prototype.writeDoubleBE = function writeDoubleBE(e, r, t) {\n return writeDouble(this, e, r, false, t);\n };\n Buffer.prototype.copy = function copy(e, r, t, f) {\n if (!Buffer.isBuffer(e)) throw new TypeError(\"argument should be a Buffer\");\n if (!t) t = 0;\n if (!f && f !== 0) f = this.length;\n if (r >= e.length) r = e.length;\n if (!r) r = 0;\n if (f > 0 && f < t) f = t;\n if (f === t) return 0;\n if (e.length === 0 || this.length === 0) return 0;\n if (r < 0) {\n throw new RangeError(\"targetStart out of bounds\");\n }\n if (t < 0 || t >= this.length) throw new RangeError(\"Index out of range\");\n if (f < 0) throw new RangeError(\"sourceEnd out of bounds\");\n if (f > this.length) f = this.length;\n if (e.length - r < f - t) {\n f = e.length - r + t;\n }\n var n = f - t;\n if (this === e && typeof Uint8Array.prototype.copyWithin === \"function\") {\n this.copyWithin(r, t, f);\n } else if (this === e && t < r && r < f) {\n for(var i = n - 1; i >= 0; --i){\n e[i + r] = this[i + t];\n }\n } else {\n Uint8Array.prototype.set.call(e, this.subarray(t, f), r);\n }\n return n;\n };\n Buffer.prototype.fill = function fill(e, r, t, f) {\n if (typeof e === \"string\") {\n if (typeof r === \"string\") {\n f = r;\n r = 0;\n t = this.length;\n } else if (typeof t === \"string\") {\n f = t;\n t = this.length;\n }\n if (f !== undefined && typeof f !== \"string\") {\n throw new TypeError(\"encoding must be a string\");\n }\n if (typeof f === \"string\" && !Buffer.isEncoding(f)) {\n throw new TypeError(\"Unknown encoding: \" + f);\n }\n if (e.length === 1) {\n var n = e.charCodeAt(0);\n if (f === \"utf8\" && n < 128 || f === \"latin1\") {\n e = n;\n }\n }\n } else if (typeof e === \"number\") {\n e = e & 255;\n } else if (typeof e === \"boolean\") {\n e = Number(e);\n }\n if (r < 0 || this.length < r || this.length < t) {\n throw new RangeError(\"Out of range index\");\n }\n if (t <= r) {\n return this;\n }\n r = r >>> 0;\n t = t === undefined ? this.length : t >>> 0;\n if (!e) e = 0;\n var i;\n if (typeof e === \"number\") {\n for(i = r; i < t; ++i){\n this[i] = e;\n }\n } else {\n var o = Buffer.isBuffer(e) ? e : Buffer.from(e, f);\n var u = o.length;\n if (u === 0) {\n throw new TypeError('The value \"' + e + '\" is invalid for argument \"value\"');\n }\n for(i = 0; i < t - r; ++i){\n this[i + r] = o[i % u];\n }\n }\n return this;\n };\n var a = /[^+/0-9A-Za-z-_]/g;\n function base64clean(e) {\n e = e.split(\"=\")[0];\n e = e.trim().replace(a, \"\");\n if (e.length < 2) return \"\";\n while(e.length % 4 !== 0){\n e = e + \"=\";\n }\n return e;\n }\n function utf8ToBytes(e, r) {\n r = r || Infinity;\n var t;\n var f = e.length;\n var n = null;\n var i = [];\n for(var o = 0; o < f; ++o){\n t = e.charCodeAt(o);\n if (t > 55295 && t < 57344) {\n if (!n) {\n if (t > 56319) {\n if ((r -= 3) > -1) i.push(239, 191, 189);\n continue;\n } else if (o + 1 === f) {\n if ((r -= 3) > -1) i.push(239, 191, 189);\n continue;\n }\n n = t;\n continue;\n }\n if (t < 56320) {\n if ((r -= 3) > -1) i.push(239, 191, 189);\n n = t;\n continue;\n }\n t = (n - 55296 << 10 | t - 56320) + 65536;\n } else if (n) {\n if ((r -= 3) > -1) i.push(239, 191, 189);\n }\n n = null;\n if (t < 128) {\n if ((r -= 1) < 0) break;\n i.push(t);\n } else if (t < 2048) {\n if ((r -= 2) < 0) break;\n i.push(t >> 6 | 192, t & 63 | 128);\n } else if (t < 65536) {\n if ((r -= 3) < 0) break;\n i.push(t >> 12 | 224, t >> 6 & 63 | 128, t & 63 | 128);\n } else if (t < 1114112) {\n if ((r -= 4) < 0) break;\n i.push(t >> 18 | 240, t >> 12 & 63 | 128, t >> 6 & 63 | 128, t & 63 | 128);\n } else {\n throw new Error(\"Invalid code point\");\n }\n }\n return i;\n }\n function asciiToBytes(e) {\n var r = [];\n for(var t = 0; t < e.length; ++t){\n r.push(e.charCodeAt(t) & 255);\n }\n return r;\n }\n function utf16leToBytes(e, r) {\n var t, f, n;\n var i = [];\n for(var o = 0; o < e.length; ++o){\n if ((r -= 2) < 0) break;\n t = e.charCodeAt(o);\n f = t >> 8;\n n = t % 256;\n i.push(n);\n i.push(f);\n }\n return i;\n }\n function base64ToBytes(e) {\n return f.toByteArray(base64clean(e));\n }\n function blitBuffer(e, r, t, f) {\n for(var n = 0; n < f; ++n){\n if (n + t >= r.length || n >= e.length) break;\n r[n + t] = e[n];\n }\n return n;\n }\n function isInstance(e, r) {\n return e instanceof r || e != null && e.constructor != null && e.constructor.name != null && e.constructor.name === r.name;\n }\n function numberIsNaN(e) {\n return e !== e;\n }\n var s = function() {\n var e = \"0123456789abcdef\";\n var r = new Array(256);\n for(var t = 0; t < 16; ++t){\n var f = t * 16;\n for(var n = 0; n < 16; ++n){\n r[f + n] = e[t] + e[n];\n }\n }\n return r;\n }();\n },\n 783: function(e, r) {\n /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */ r.read = function(e, r, t, f, n) {\n var i, o;\n var u = n * 8 - f - 1;\n var a = (1 << u) - 1;\n var s = a >> 1;\n var h = -7;\n var c = t ? n - 1 : 0;\n var l = t ? -1 : 1;\n var p = e[r + c];\n c += l;\n i = p & (1 << -h) - 1;\n p >>= -h;\n h += u;\n for(; h > 0; i = i * 256 + e[r + c], c += l, h -= 8){}\n o = i & (1 << -h) - 1;\n i >>= -h;\n h += f;\n for(; h > 0; o = o * 256 + e[r + c], c += l, h -= 8){}\n if (i === 0) {\n i = 1 - s;\n } else if (i === a) {\n return o ? NaN : (p ? -1 : 1) * Infinity;\n } else {\n o = o + Math.pow(2, f);\n i = i - s;\n }\n return (p ? -1 : 1) * o * Math.pow(2, i - f);\n };\n r.write = function(e, r, t, f, n, i) {\n var o, u, a;\n var s = i * 8 - n - 1;\n var h = (1 << s) - 1;\n var c = h >> 1;\n var l = n === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;\n var p = f ? 0 : i - 1;\n var y = f ? 1 : -1;\n var g = r < 0 || r === 0 && 1 / r < 0 ? 1 : 0;\n r = Math.abs(r);\n if (isNaN(r) || r === Infinity) {\n u = isNaN(r) ? 1 : 0;\n o = h;\n } else {\n o = Math.floor(Math.log(r) / Math.LN2);\n if (r * (a = Math.pow(2, -o)) < 1) {\n o--;\n a *= 2;\n }\n if (o + c >= 1) {\n r += l / a;\n } else {\n r += l * Math.pow(2, 1 - c);\n }\n if (r * a >= 2) {\n o++;\n a /= 2;\n }\n if (o + c >= h) {\n u = 0;\n o = h;\n } else if (o + c >= 1) {\n u = (r * a - 1) * Math.pow(2, n);\n o = o + c;\n } else {\n u = r * Math.pow(2, c - 1) * Math.pow(2, n);\n o = 0;\n }\n }\n for(; n >= 8; e[t + p] = u & 255, p += y, u /= 256, n -= 8){}\n o = o << n | u;\n s += n;\n for(; s > 0; e[t + p] = o & 255, p += y, o /= 256, s -= 8){}\n e[t + p - y] |= g * 128;\n };\n }\n };\n var r = {};\n function __nccwpck_require__(t) {\n var f = r[t];\n if (f !== undefined) {\n return f.exports;\n }\n var n = r[t] = {\n exports: {}\n };\n var i = true;\n try {\n e[t](n, n.exports, __nccwpck_require__);\n i = false;\n } finally{\n if (i) delete r[t];\n }\n return n.exports;\n }\n if (typeof __nccwpck_require__ !== \"undefined\") __nccwpck_require__.ab = __dirname + \"/\";\n var t = __nccwpck_require__(72);\n module.exports = t;\n})();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY29tcGlsZWQvYnVmZmVyL2luZGV4LmpzIiwibWFwcGluZ3MiOiI7O0FBQUM7SUFBVyxJQUFJQSxJQUFFO1FBQUMsS0FBSSxTQUFTQSxDQUFDLEVBQUNDLENBQUM7WUFBRTtZQUFhQSxFQUFFQyxVQUFVLEdBQUNBO1lBQVdELEVBQUVFLFdBQVcsR0FBQ0E7WUFBWUYsRUFBRUcsYUFBYSxHQUFDQTtZQUFjLElBQUlDLElBQUUsRUFBRTtZQUFDLElBQUlDLElBQUUsRUFBRTtZQUFDLElBQUlDLElBQUUsT0FBT0MsZUFBYSxjQUFZQSxhQUFXQztZQUFNLElBQUlDLElBQUU7WUFBbUUsSUFBSSxJQUFJQyxJQUFFLEdBQUVDLElBQUVGLEVBQUVHLE1BQU0sRUFBQ0YsSUFBRUMsR0FBRSxFQUFFRCxFQUFFO2dCQUFDTixDQUFDLENBQUNNLEVBQUUsR0FBQ0QsQ0FBQyxDQUFDQyxFQUFFO2dCQUFDTCxDQUFDLENBQUNJLEVBQUVJLFVBQVUsQ0FBQ0gsR0FBRyxHQUFDQTtZQUFDO1lBQUNMLENBQUMsQ0FBQyxJQUFJUSxVQUFVLENBQUMsR0FBRyxHQUFDO1lBQUdSLENBQUMsQ0FBQyxJQUFJUSxVQUFVLENBQUMsR0FBRyxHQUFDO1lBQUcsU0FBU0MsUUFBUWYsQ0FBQztnQkFBRSxJQUFJQyxJQUFFRCxFQUFFYSxNQUFNO2dCQUFDLElBQUdaLElBQUUsSUFBRSxHQUFFO29CQUFDLE1BQU0sSUFBSWUsTUFBTTtnQkFBaUQ7Z0JBQUMsSUFBSVgsSUFBRUwsRUFBRWlCLE9BQU8sQ0FBQztnQkFBSyxJQUFHWixNQUFJLENBQUMsR0FBRUEsSUFBRUo7Z0JBQUUsSUFBSUssSUFBRUQsTUFBSUosSUFBRSxJQUFFLElBQUVJLElBQUU7Z0JBQUUsT0FBTTtvQkFBQ0E7b0JBQUVDO2lCQUFFO1lBQUE7WUFBQyxTQUFTSixXQUFXRixDQUFDO2dCQUFFLElBQUlDLElBQUVjLFFBQVFmO2dCQUFHLElBQUlLLElB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O0lBQUM7SUFBRSxJQUFJdEwsSUFBRSxDQUFDO0lBQUUsU0FBUzRMLG9CQUFvQnhMLENBQUM7UUFBRSxJQUFJQyxJQUFFTCxDQUFDLENBQUNJLEVBQUU7UUFBQyxJQUFHQyxNQUFJc0MsV0FBVTtZQUFDLE9BQU90QyxFQUFFd0wsT0FBTztRQUFBO1FBQUMsSUFBSXZMLElBQUVOLENBQUMsQ0FBQ0ksRUFBRSxHQUFDO1lBQUN5TCxTQUFRLENBQUM7UUFBQztRQUFFLElBQUlwTCxJQUFFO1FBQUssSUFBRztZQUFDVixDQUFDLENBQUNLLEVBQUUsQ0FBQ0UsR0FBRUEsRUFBRXVMLE9BQU8sRUFBQ0Q7WUFBcUJuTCxJQUFFO1FBQUssU0FBUTtZQUFDLElBQUdBLEdBQUUsT0FBT1QsQ0FBQyxDQUFDSSxFQUFFO1FBQUE7UUFBQyxPQUFPRSxFQUFFdUwsT0FBTztJQUFBO0lBQUMsSUFBRyxPQUFPRCx3QkFBc0IsYUFBWUEsb0JBQW9CRSxFQUFFLEdBQUNDLFNBQVNBLEdBQUM7SUFBSSxJQUFJM0wsSUFBRXdMLG9CQUFvQjtJQUFJSSxPQUFPSCxPQUFPLEdBQUN6TDtBQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY29tcGlsZWQvYnVmZmVyL2luZGV4LmpzPzM3NzYiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7dmFyIGU9ezY3NTpmdW5jdGlvbihlLHIpe1widXNlIHN0cmljdFwiO3IuYnl0ZUxlbmd0aD1ieXRlTGVuZ3RoO3IudG9CeXRlQXJyYXk9dG9CeXRlQXJyYXk7ci5mcm9tQnl0ZUFycmF5PWZyb21CeXRlQXJyYXk7dmFyIHQ9W107dmFyIGY9W107dmFyIG49dHlwZW9mIFVpbnQ4QXJyYXkhPT1cInVuZGVmaW5lZFwiP1VpbnQ4QXJyYXk6QXJyYXk7dmFyIGk9XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7Zm9yKHZhciBvPTAsdT1pLmxlbmd0aDtvPHU7KytvKXt0W29dPWlbb107ZltpLmNoYXJDb2RlQXQobyldPW99ZltcIi1cIi5jaGFyQ29kZUF0KDApXT02MjtmW1wiX1wiLmNoYXJDb2RlQXQoMCldPTYzO2Z1bmN0aW9uIGdldExlbnMoZSl7dmFyIHI9ZS5sZW5ndGg7aWYociU0PjApe3Rocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDRcIil9dmFyIHQ9ZS5pbmRleE9mKFwiPVwiKTtpZih0PT09LTEpdD1yO3ZhciBmPXQ9PT1yPzA6NC10JTQ7cmV0dXJuW3QsZl19ZnVuY3Rpb24gYnl0ZUxlbmd0aChlKXt2YXIgcj1nZXRMZW5zKGUpO3ZhciB0PXJbMF07dmFyIGY9clsxXTtyZXR1cm4odCtmKSozLzQtZn1mdW5jdGlvbiBfYnl0ZUxlbmd0aChlLHIsdCl7cmV0dXJuKHIrdCkqMy80LXR9ZnVuY3Rpb24gdG9CeXRlQXJyYXkoZSl7dmFyIHI7dmFyIHQ9Z2V0TGVucyhlKTt2YXIgaT10WzBdO3ZhciBvPXRbMV07dmFyIHU9bmV3IG4oX2J5dGVMZW5ndGgoZSxpLG8pKTt2YXIgYT0wO3ZhciBzPW8+MD9pLTQ6aTt2YXIgaDtmb3IoaD0wO2g8cztoKz00KXtyPWZbZS5jaGFyQ29kZUF0KGgpXTw8MTh8ZltlLmNoYXJDb2RlQXQoaCsxKV08PDEyfGZbZS5jaGFyQ29kZUF0KGgrMildPDw2fGZbZS5jaGFyQ29kZUF0KGgrMyldO3VbYSsrXT1yPj4xNiYyNTU7dVthKytdPXI+PjgmMjU1O3VbYSsrXT1yJjI1NX1pZihvPT09Mil7cj1mW2UuY2hhckNvZGVBdChoKV08PDJ8ZltlLmNoYXJDb2RlQXQoaCsxKV0+PjQ7dVthKytdPXImMjU1fWlmKG89PT0xKXtyPWZbZS5jaGFyQ29kZUF0KGgpXTw8MTB8ZltlLmNoYXJDb2RlQXQoaCsxKV08PDR8ZltlLmNoYXJDb2RlQXQoaCsyKV0+PjI7dVthKytdPXI+PjgmMjU1O3VbYSsrXT1yJjI1NX1yZXR1cm4gdX1mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQoZSl7cmV0dXJuIHRbZT4+MTgmNjNdK3RbZT4+MTImNjNdK3RbZT4+NiY2M10rdFtlJjYzXX1mdW5jdGlvbiBlbmNvZGVDaHVuayhlLHIsdCl7dmFyIGY7dmFyIG49W107Zm9yKHZhciBpPXI7aTx0O2krPTMpe2Y9KGVbaV08PDE2JjE2NzExNjgwKSsoZVtpKzFdPDw4JjY1MjgwKSsoZVtpKzJdJjI1NSk7bi5wdXNoKHRyaXBsZXRUb0Jhc2U2NChmKSl9cmV0dXJuIG4uam9pbihcIlwiKX1mdW5jdGlvbiBmcm9tQnl0ZUFycmF5KGUpe3ZhciByO3ZhciBmPWUubGVuZ3RoO3ZhciBuPWYlMzt2YXIgaT1bXTt2YXIgbz0xNjM4Mztmb3IodmFyIHU9MCxhPWYtbjt1PGE7dSs9byl7aS5wdXNoKGVuY29kZUNodW5rKGUsdSx1K28+YT9hOnUrbykpfWlmKG49PT0xKXtyPWVbZi0xXTtpLnB1c2godFtyPj4yXSt0W3I8PDQmNjNdK1wiPT1cIil9ZWxzZSBpZihuPT09Mil7cj0oZVtmLTJdPDw4KStlW2YtMV07aS5wdXNoKHRbcj4+MTBdK3Rbcj4+NCY2M10rdFtyPDwyJjYzXStcIj1cIil9cmV0dXJuIGkuam9pbihcIlwiKX19LDcyOmZ1bmN0aW9uKGUscix0KXtcInVzZSBzdHJpY3RcIjtcbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL3ZhciBmPXQoNjc1KTt2YXIgbj10KDc4Myk7dmFyIGk9dHlwZW9mIFN5bWJvbD09PVwiZnVuY3Rpb25cIiYmdHlwZW9mIFN5bWJvbC5mb3I9PT1cImZ1bmN0aW9uXCI/U3ltYm9sLmZvcihcIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tXCIpOm51bGw7ci5CdWZmZXI9QnVmZmVyO3IuU2xvd0J1ZmZlcj1TbG93QnVmZmVyO3IuSU5TUEVDVF9NQVhfQllURVM9NTA7dmFyIG89MjE0NzQ4MzY0NztyLmtNYXhMZW5ndGg9bztCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVD10eXBlZEFycmF5U3VwcG9ydCgpO2lmKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCYmdHlwZW9mIGNvbnNvbGUhPT1cInVuZGVmaW5lZFwiJiZ0eXBlb2YgY29uc29sZS5lcnJvcj09PVwiZnVuY3Rpb25cIil7Y29uc29sZS5lcnJvcihcIlRoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSBcIitcImBidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuXCIpfWZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0KCl7dHJ5e3ZhciBlPW5ldyBVaW50OEFycmF5KDEpO3ZhciByPXtmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fTtPYmplY3Quc2V0UHJvdG90eXBlT2YocixVaW50OEFycmF5LnByb3RvdHlwZSk7T2JqZWN0LnNldFByb3RvdHlwZU9mKGUscik7cmV0dXJuIGUuZm9vKCk9PT00Mn1jYXRjaChlKXtyZXR1cm4gZmFsc2V9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLFwicGFyZW50XCIse2VudW1lcmFibGU6dHJ1ZSxnZXQ6ZnVuY3Rpb24oKXtpZighQnVmZmVyLmlzQnVmZmVyKHRoaXMpKXJldHVybiB1bmRlZmluZWQ7cmV0dXJuIHRoaXMuYnVmZmVyfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLFwib2Zmc2V0XCIse2VudW1lcmFibGU6dHJ1ZSxnZXQ6ZnVuY3Rpb24oKXtpZighQnVmZmVyLmlzQnVmZmVyKHRoaXMpKXJldHVybiB1bmRlZmluZWQ7cmV0dXJuIHRoaXMuYnl0ZU9mZnNldH19KTtmdW5jdGlvbiBjcmVhdGVCdWZmZXIoZSl7aWYoZT5vKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJytlKydcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKX12YXIgcj1uZXcgVWludDhBcnJheShlKTtPYmplY3Quc2V0UHJvdG90eXBlT2YocixCdWZmZXIucHJvdG90eXBlKTtyZXR1cm4gcn1mdW5jdGlvbiBCdWZmZXIoZSxyLHQpe2lmKHR5cGVvZiBlPT09XCJudW1iZXJcIil7aWYodHlwZW9mIHI9PT1cInN0cmluZ1wiKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcicpfXJldHVybiBhbGxvY1Vuc2FmZShlKX1yZXR1cm4gZnJvbShlLHIsdCl9QnVmZmVyLnBvb2xTaXplPTgxOTI7ZnVuY3Rpb24gZnJvbShlLHIsdCl7aWYodHlwZW9mIGU9PT1cInN0cmluZ1wiKXtyZXR1cm4gZnJvbVN0cmluZyhlLHIpfWlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl7cmV0dXJuIGZyb21BcnJheUxpa2UoZSl9aWYoZT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIFwiK1wib3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgXCIrdHlwZW9mIGUpfWlmKGlzSW5zdGFuY2UoZSxBcnJheUJ1ZmZlcil8fGUmJmlzSW5zdGFuY2UoZS5idWZmZXIsQXJyYXlCdWZmZXIpKXtyZXR1cm4gZnJvbUFycmF5QnVmZmVyKGUscix0KX1pZih0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIhPT1cInVuZGVmaW5lZFwiJiYoaXNJbnN0YW5jZShlLFNoYXJlZEFycmF5QnVmZmVyKXx8ZSYmaXNJbnN0YW5jZShlLmJ1ZmZlcixTaGFyZWRBcnJheUJ1ZmZlcikpKXtyZXR1cm4gZnJvbUFycmF5QnVmZmVyKGUscix0KX1pZih0eXBlb2YgZT09PVwibnVtYmVyXCIpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJyl9dmFyIGY9ZS52YWx1ZU9mJiZlLnZhbHVlT2YoKTtpZihmIT1udWxsJiZmIT09ZSl7cmV0dXJuIEJ1ZmZlci5mcm9tKGYscix0KX12YXIgbj1mcm9tT2JqZWN0KGUpO2lmKG4pcmV0dXJuIG47aWYodHlwZW9mIFN5bWJvbCE9PVwidW5kZWZpbmVkXCImJlN5bWJvbC50b1ByaW1pdGl2ZSE9bnVsbCYmdHlwZW9mIGVbU3ltYm9sLnRvUHJpbWl0aXZlXT09PVwiZnVuY3Rpb25cIil7cmV0dXJuIEJ1ZmZlci5mcm9tKGVbU3ltYm9sLnRvUHJpbWl0aXZlXShcInN0cmluZ1wiKSxyLHQpfXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBcIitcIm9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlIFwiK3R5cGVvZiBlKX1CdWZmZXIuZnJvbT1mdW5jdGlvbihlLHIsdCl7cmV0dXJuIGZyb20oZSxyLHQpfTtPYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLnByb3RvdHlwZSxVaW50OEFycmF5LnByb3RvdHlwZSk7T2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlcixVaW50OEFycmF5KTtmdW5jdGlvbiBhc3NlcnRTaXplKGUpe2lmKHR5cGVvZiBlIT09XCJudW1iZXJcIil7dGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpfWVsc2UgaWYoZTwwKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJytlKydcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKX19ZnVuY3Rpb24gYWxsb2MoZSxyLHQpe2Fzc2VydFNpemUoZSk7aWYoZTw9MCl7cmV0dXJuIGNyZWF0ZUJ1ZmZlcihlKX1pZihyIT09dW5kZWZpbmVkKXtyZXR1cm4gdHlwZW9mIHQ9PT1cInN0cmluZ1wiP2NyZWF0ZUJ1ZmZlcihlKS5maWxsKHIsdCk6Y3JlYXRlQnVmZmVyKGUpLmZpbGwocil9cmV0dXJuIGNyZWF0ZUJ1ZmZlcihlKX1CdWZmZXIuYWxsb2M9ZnVuY3Rpb24oZSxyLHQpe3JldHVybiBhbGxvYyhlLHIsdCl9O2Z1bmN0aW9uIGFsbG9jVW5zYWZlKGUpe2Fzc2VydFNpemUoZSk7cmV0dXJuIGNyZWF0ZUJ1ZmZlcihlPDA/MDpjaGVja2VkKGUpfDApfUJ1ZmZlci5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtyZXR1cm4gYWxsb2NVbnNhZmUoZSl9O0J1ZmZlci5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIGFsbG9jVW5zYWZlKGUpfTtmdW5jdGlvbiBmcm9tU3RyaW5nKGUscil7aWYodHlwZW9mIHIhPT1cInN0cmluZ1wifHxyPT09XCJcIil7cj1cInV0ZjhcIn1pZighQnVmZmVyLmlzRW5jb2Rpbmcocikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIityKX12YXIgdD1ieXRlTGVuZ3RoKGUscil8MDt2YXIgZj1jcmVhdGVCdWZmZXIodCk7dmFyIG49Zi53cml0ZShlLHIpO2lmKG4hPT10KXtmPWYuc2xpY2UoMCxuKX1yZXR1cm4gZn1mdW5jdGlvbiBmcm9tQXJyYXlMaWtlKGUpe3ZhciByPWUubGVuZ3RoPDA/MDpjaGVja2VkKGUubGVuZ3RoKXwwO3ZhciB0PWNyZWF0ZUJ1ZmZlcihyKTtmb3IodmFyIGY9MDtmPHI7Zis9MSl7dFtmXT1lW2ZdJjI1NX1yZXR1cm4gdH1mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIoZSxyLHQpe2lmKHI8MHx8ZS5ieXRlTGVuZ3RoPHIpe3Rocm93IG5ldyBSYW5nZUVycm9yKCdcIm9mZnNldFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpfWlmKGUuYnl0ZUxlbmd0aDxyKyh0fHwwKSl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wibGVuZ3RoXCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJyl9dmFyIGY7aWYocj09PXVuZGVmaW5lZCYmdD09PXVuZGVmaW5lZCl7Zj1uZXcgVWludDhBcnJheShlKX1lbHNlIGlmKHQ9PT11bmRlZmluZWQpe2Y9bmV3IFVpbnQ4QXJyYXkoZSxyKX1lbHNle2Y9bmV3IFVpbnQ4QXJyYXkoZSxyLHQpfU9iamVjdC5zZXRQcm90b3R5cGVPZihmLEJ1ZmZlci5wcm90b3R5cGUpO3JldHVybiBmfWZ1bmN0aW9uIGZyb21PYmplY3QoZSl7aWYoQnVmZmVyLmlzQnVmZmVyKGUpKXt2YXIgcj1jaGVja2VkKGUubGVuZ3RoKXwwO3ZhciB0PWNyZWF0ZUJ1ZmZlcihyKTtpZih0Lmxlbmd0aD09PTApe3JldHVybiB0fWUuY29weSh0LDAsMCxyKTtyZXR1cm4gdH1pZihlLmxlbmd0aCE9PXVuZGVmaW5lZCl7aWYodHlwZW9mIGUubGVuZ3RoIT09XCJudW1iZXJcInx8bnVtYmVySXNOYU4oZS5sZW5ndGgpKXtyZXR1cm4gY3JlYXRlQnVmZmVyKDApfXJldHVybiBmcm9tQXJyYXlMaWtlKGUpfWlmKGUudHlwZT09PVwiQnVmZmVyXCImJkFycmF5LmlzQXJyYXkoZS5kYXRhKSl7cmV0dXJuIGZyb21BcnJheUxpa2UoZS5kYXRhKX19ZnVuY3Rpb24gY2hlY2tlZChlKXtpZihlPj1vKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gXCIrXCJzaXplOiAweFwiK28udG9TdHJpbmcoMTYpK1wiIGJ5dGVzXCIpfXJldHVybiBlfDB9ZnVuY3Rpb24gU2xvd0J1ZmZlcihlKXtpZigrZSE9ZSl7ZT0wfXJldHVybiBCdWZmZXIuYWxsb2MoK2UpfUJ1ZmZlci5pc0J1ZmZlcj1mdW5jdGlvbiBpc0J1ZmZlcihlKXtyZXR1cm4gZSE9bnVsbCYmZS5faXNCdWZmZXI9PT10cnVlJiZlIT09QnVmZmVyLnByb3RvdHlwZX07QnVmZmVyLmNvbXBhcmU9ZnVuY3Rpb24gY29tcGFyZShlLHIpe2lmKGlzSW5zdGFuY2UoZSxVaW50OEFycmF5KSllPUJ1ZmZlci5mcm9tKGUsZS5vZmZzZXQsZS5ieXRlTGVuZ3RoKTtpZihpc0luc3RhbmNlKHIsVWludDhBcnJheSkpcj1CdWZmZXIuZnJvbShyLHIub2Zmc2V0LHIuYnl0ZUxlbmd0aCk7aWYoIUJ1ZmZlci5pc0J1ZmZlcihlKXx8IUJ1ZmZlci5pc0J1ZmZlcihyKSl7dGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheScpfWlmKGU9PT1yKXJldHVybiAwO3ZhciB0PWUubGVuZ3RoO3ZhciBmPXIubGVuZ3RoO2Zvcih2YXIgbj0wLGk9TWF0aC5taW4odCxmKTtuPGk7KytuKXtpZihlW25dIT09cltuXSl7dD1lW25dO2Y9cltuXTticmVha319aWYodDxmKXJldHVybi0xO2lmKGY8dClyZXR1cm4gMTtyZXR1cm4gMH07QnVmZmVyLmlzRW5jb2Rpbmc9ZnVuY3Rpb24gaXNFbmNvZGluZyhlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2VcImhleFwiOmNhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6Y2FzZVwiYmFzZTY0XCI6Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuIHRydWU7ZGVmYXVsdDpyZXR1cm4gZmFsc2V9fTtCdWZmZXIuY29uY2F0PWZ1bmN0aW9uIGNvbmNhdChlLHIpe2lmKCFBcnJheS5pc0FycmF5KGUpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKX1pZihlLmxlbmd0aD09PTApe3JldHVybiBCdWZmZXIuYWxsb2MoMCl9dmFyIHQ7aWYocj09PXVuZGVmaW5lZCl7cj0wO2Zvcih0PTA7dDxlLmxlbmd0aDsrK3Qpe3IrPWVbdF0ubGVuZ3RofX12YXIgZj1CdWZmZXIuYWxsb2NVbnNhZmUocik7dmFyIG49MDtmb3IodD0wO3Q8ZS5sZW5ndGg7Kyt0KXt2YXIgaT1lW3RdO2lmKGlzSW5zdGFuY2UoaSxVaW50OEFycmF5KSl7aT1CdWZmZXIuZnJvbShpKX1pZighQnVmZmVyLmlzQnVmZmVyKGkpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKX1pLmNvcHkoZixuKTtuKz1pLmxlbmd0aH1yZXR1cm4gZn07ZnVuY3Rpb24gYnl0ZUxlbmd0aChlLHIpe2lmKEJ1ZmZlci5pc0J1ZmZlcihlKSl7cmV0dXJuIGUubGVuZ3RofWlmKEFycmF5QnVmZmVyLmlzVmlldyhlKXx8aXNJbnN0YW5jZShlLEFycmF5QnVmZmVyKSl7cmV0dXJuIGUuYnl0ZUxlbmd0aH1pZih0eXBlb2YgZSE9PVwic3RyaW5nXCIpe3Rocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiAnK1wiUmVjZWl2ZWQgdHlwZSBcIit0eXBlb2YgZSl9dmFyIHQ9ZS5sZW5ndGg7dmFyIGY9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl09PT10cnVlO2lmKCFmJiZ0PT09MClyZXR1cm4gMDt2YXIgbj1mYWxzZTtmb3IoOzspe3N3aXRjaChyKXtjYXNlXCJhc2NpaVwiOmNhc2VcImxhdGluMVwiOmNhc2VcImJpbmFyeVwiOnJldHVybiB0O2Nhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOnJldHVybiB1dGY4VG9CeXRlcyhlKS5sZW5ndGg7Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuIHQqMjtjYXNlXCJoZXhcIjpyZXR1cm4gdD4+PjE7Y2FzZVwiYmFzZTY0XCI6cmV0dXJuIGJhc2U2NFRvQnl0ZXMoZSkubGVuZ3RoO2RlZmF1bHQ6aWYobil7cmV0dXJuIGY/LTE6dXRmOFRvQnl0ZXMoZSkubGVuZ3RofXI9KFwiXCIrcikudG9Mb3dlckNhc2UoKTtuPXRydWV9fX1CdWZmZXIuYnl0ZUxlbmd0aD1ieXRlTGVuZ3RoO2Z1bmN0aW9uIHNsb3dUb1N0cmluZyhlLHIsdCl7dmFyIGY9ZmFsc2U7aWYocj09PXVuZGVmaW5lZHx8cjwwKXtyPTB9aWYocj50aGlzLmxlbmd0aCl7cmV0dXJuXCJcIn1pZih0PT09dW5kZWZpbmVkfHx0PnRoaXMubGVuZ3RoKXt0PXRoaXMubGVuZ3RofWlmKHQ8PTApe3JldHVyblwiXCJ9dD4+Pj0wO3I+Pj49MDtpZih0PD1yKXtyZXR1cm5cIlwifWlmKCFlKWU9XCJ1dGY4XCI7d2hpbGUodHJ1ZSl7c3dpdGNoKGUpe2Nhc2VcImhleFwiOnJldHVybiBoZXhTbGljZSh0aGlzLHIsdCk7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuIHV0ZjhTbGljZSh0aGlzLHIsdCk7Y2FzZVwiYXNjaWlcIjpyZXR1cm4gYXNjaWlTbGljZSh0aGlzLHIsdCk7Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIGxhdGluMVNsaWNlKHRoaXMscix0KTtjYXNlXCJiYXNlNjRcIjpyZXR1cm4gYmFzZTY0U2xpY2UodGhpcyxyLHQpO2Nhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOnJldHVybiB1dGYxNmxlU2xpY2UodGhpcyxyLHQpO2RlZmF1bHQ6aWYoZil0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrZSk7ZT0oZStcIlwiKS50b0xvd2VyQ2FzZSgpO2Y9dHJ1ZX19fUJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyPXRydWU7ZnVuY3Rpb24gc3dhcChlLHIsdCl7dmFyIGY9ZVtyXTtlW3JdPWVbdF07ZVt0XT1mfUJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uIHN3YXAxNigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9PTApe3Rocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHNcIil9Zm9yKHZhciByPTA7cjxlO3IrPTIpe3N3YXAodGhpcyxyLHIrMSl9cmV0dXJuIHRoaXN9O0J1ZmZlci5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uIHN3YXAzMigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9PTApe3Rocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHNcIil9Zm9yKHZhciByPTA7cjxlO3IrPTQpe3N3YXAodGhpcyxyLHIrMyk7c3dhcCh0aGlzLHIrMSxyKzIpfXJldHVybiB0aGlzfTtCdWZmZXIucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbiBzd2FwNjQoKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTghPT0wKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzXCIpfWZvcih2YXIgcj0wO3I8ZTtyKz04KXtzd2FwKHRoaXMscixyKzcpO3N3YXAodGhpcyxyKzEscis2KTtzd2FwKHRoaXMscisyLHIrNSk7c3dhcCh0aGlzLHIrMyxyKzQpfXJldHVybiB0aGlzfTtCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uIHRvU3RyaW5nKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZT09PTApcmV0dXJuXCJcIjtpZihhcmd1bWVudHMubGVuZ3RoPT09MClyZXR1cm4gdXRmOFNsaWNlKHRoaXMsMCxlKTtyZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07QnVmZmVyLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZz1CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nO0J1ZmZlci5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uIGVxdWFscyhlKXtpZighQnVmZmVyLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyXCIpO2lmKHRoaXM9PT1lKXJldHVybiB0cnVlO3JldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLGUpPT09MH07QnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uIGluc3BlY3QoKXt2YXIgZT1cIlwiO3ZhciB0PXIuSU5TUEVDVF9NQVhfQllURVM7ZT10aGlzLnRvU3RyaW5nKFwiaGV4XCIsMCx0KS5yZXBsYWNlKC8oLnsyfSkvZyxcIiQxIFwiKS50cmltKCk7aWYodGhpcy5sZW5ndGg+dCllKz1cIiAuLi4gXCI7cmV0dXJuXCI8QnVmZmVyIFwiK2UrXCI+XCJ9O2lmKGkpe0J1ZmZlci5wcm90b3R5cGVbaV09QnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0fUJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbiBjb21wYXJlKGUscix0LGYsbil7aWYoaXNJbnN0YW5jZShlLFVpbnQ4QXJyYXkpKXtlPUJ1ZmZlci5mcm9tKGUsZS5vZmZzZXQsZS5ieXRlTGVuZ3RoKX1pZighQnVmZmVyLmlzQnVmZmVyKGUpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiAnK1wiUmVjZWl2ZWQgdHlwZSBcIit0eXBlb2YgZSl9aWYocj09PXVuZGVmaW5lZCl7cj0wfWlmKHQ9PT11bmRlZmluZWQpe3Q9ZT9lLmxlbmd0aDowfWlmKGY9PT11bmRlZmluZWQpe2Y9MH1pZihuPT09dW5kZWZpbmVkKXtuPXRoaXMubGVuZ3RofWlmKHI8MHx8dD5lLmxlbmd0aHx8ZjwwfHxuPnRoaXMubGVuZ3RoKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiByYW5nZSBpbmRleFwiKX1pZihmPj1uJiZyPj10KXtyZXR1cm4gMH1pZihmPj1uKXtyZXR1cm4tMX1pZihyPj10KXtyZXR1cm4gMX1yPj4+PTA7dD4+Pj0wO2Y+Pj49MDtuPj4+PTA7aWYodGhpcz09PWUpcmV0dXJuIDA7dmFyIGk9bi1mO3ZhciBvPXQtcjt2YXIgdT1NYXRoLm1pbihpLG8pO3ZhciBhPXRoaXMuc2xpY2UoZixuKTt2YXIgcz1lLnNsaWNlKHIsdCk7Zm9yKHZhciBoPTA7aDx1OysraCl7aWYoYVtoXSE9PXNbaF0pe2k9YVtoXTtvPXNbaF07YnJlYWt9fWlmKGk8bylyZXR1cm4tMTtpZihvPGkpcmV0dXJuIDE7cmV0dXJuIDB9O2Z1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mKGUscix0LGYsbil7aWYoZS5sZW5ndGg9PT0wKXJldHVybi0xO2lmKHR5cGVvZiB0PT09XCJzdHJpbmdcIil7Zj10O3Q9MH1lbHNlIGlmKHQ+MjE0NzQ4MzY0Nyl7dD0yMTQ3NDgzNjQ3fWVsc2UgaWYodDwtMjE0NzQ4MzY0OCl7dD0tMjE0NzQ4MzY0OH10PSt0O2lmKG51bWJlcklzTmFOKHQpKXt0PW4/MDplLmxlbmd0aC0xfWlmKHQ8MCl0PWUubGVuZ3RoK3Q7aWYodD49ZS5sZW5ndGgpe2lmKG4pcmV0dXJuLTE7ZWxzZSB0PWUubGVuZ3RoLTF9ZWxzZSBpZih0PDApe2lmKG4pdD0wO2Vsc2UgcmV0dXJuLTF9aWYodHlwZW9mIHI9PT1cInN0cmluZ1wiKXtyPUJ1ZmZlci5mcm9tKHIsZil9aWYoQnVmZmVyLmlzQnVmZmVyKHIpKXtpZihyLmxlbmd0aD09PTApe3JldHVybi0xfXJldHVybiBhcnJheUluZGV4T2YoZSxyLHQsZixuKX1lbHNlIGlmKHR5cGVvZiByPT09XCJudW1iZXJcIil7cj1yJjI1NTtpZih0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj09PVwiZnVuY3Rpb25cIil7aWYobil7cmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlLHIsdCl9ZWxzZXtyZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChlLHIsdCl9fXJldHVybiBhcnJheUluZGV4T2YoZSxbcl0sdCxmLG4pfXRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXJcIil9ZnVuY3Rpb24gYXJyYXlJbmRleE9mKGUscix0LGYsbil7dmFyIGk9MTt2YXIgbz1lLmxlbmd0aDt2YXIgdT1yLmxlbmd0aDtpZihmIT09dW5kZWZpbmVkKXtmPVN0cmluZyhmKS50b0xvd2VyQ2FzZSgpO2lmKGY9PT1cInVjczJcInx8Zj09PVwidWNzLTJcInx8Zj09PVwidXRmMTZsZVwifHxmPT09XCJ1dGYtMTZsZVwiKXtpZihlLmxlbmd0aDwyfHxyLmxlbmd0aDwyKXtyZXR1cm4tMX1pPTI7by89Mjt1Lz0yO3QvPTJ9fWZ1bmN0aW9uIHJlYWQoZSxyKXtpZihpPT09MSl7cmV0dXJuIGVbcl19ZWxzZXtyZXR1cm4gZS5yZWFkVUludDE2QkUocippKX19dmFyIGE7aWYobil7dmFyIHM9LTE7Zm9yKGE9dDthPG87YSsrKXtpZihyZWFkKGUsYSk9PT1yZWFkKHIscz09PS0xPzA6YS1zKSl7aWYocz09PS0xKXM9YTtpZihhLXMrMT09PXUpcmV0dXJuIHMqaX1lbHNle2lmKHMhPT0tMSlhLT1hLXM7cz0tMX19fWVsc2V7aWYodCt1Pm8pdD1vLXU7Zm9yKGE9dDthPj0wO2EtLSl7dmFyIGg9dHJ1ZTtmb3IodmFyIGM9MDtjPHU7YysrKXtpZihyZWFkKGUsYStjKSE9PXJlYWQocixjKSl7aD1mYWxzZTticmVha319aWYoaClyZXR1cm4gYX19cmV0dXJuLTF9QnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbiBpbmNsdWRlcyhlLHIsdCl7cmV0dXJuIHRoaXMuaW5kZXhPZihlLHIsdCkhPT0tMX07QnVmZmVyLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uIGluZGV4T2YoZSxyLHQpe3JldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLGUscix0LHRydWUpfTtCdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uIGxhc3RJbmRleE9mKGUscix0KXtyZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcyxlLHIsdCxmYWxzZSl9O2Z1bmN0aW9uIGhleFdyaXRlKGUscix0LGYpe3Q9TnVtYmVyKHQpfHwwO3ZhciBuPWUubGVuZ3RoLXQ7aWYoIWYpe2Y9bn1lbHNle2Y9TnVtYmVyKGYpO2lmKGY+bil7Zj1ufX12YXIgaT1yLmxlbmd0aDtpZihmPmkvMil7Zj1pLzJ9Zm9yKHZhciBvPTA7bzxmOysrbyl7dmFyIHU9cGFyc2VJbnQoci5zdWJzdHIobyoyLDIpLDE2KTtpZihudW1iZXJJc05hTih1KSlyZXR1cm4gbztlW3Qrb109dX1yZXR1cm4gb31mdW5jdGlvbiB1dGY4V3JpdGUoZSxyLHQsZil7cmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMocixlLmxlbmd0aC10KSxlLHQsZil9ZnVuY3Rpb24gYXNjaWlXcml0ZShlLHIsdCxmKXtyZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMociksZSx0LGYpfWZ1bmN0aW9uIGxhdGluMVdyaXRlKGUscix0LGYpe3JldHVybiBhc2NpaVdyaXRlKGUscix0LGYpfWZ1bmN0aW9uIGJhc2U2NFdyaXRlKGUscix0LGYpe3JldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMociksZSx0LGYpfWZ1bmN0aW9uIHVjczJXcml0ZShlLHIsdCxmKXtyZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhyLGUubGVuZ3RoLXQpLGUsdCxmKX1CdWZmZXIucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uIHdyaXRlKGUscix0LGYpe2lmKHI9PT11bmRlZmluZWQpe2Y9XCJ1dGY4XCI7dD10aGlzLmxlbmd0aDtyPTB9ZWxzZSBpZih0PT09dW5kZWZpbmVkJiZ0eXBlb2Ygcj09PVwic3RyaW5nXCIpe2Y9cjt0PXRoaXMubGVuZ3RoO3I9MH1lbHNlIGlmKGlzRmluaXRlKHIpKXtyPXI+Pj4wO2lmKGlzRmluaXRlKHQpKXt0PXQ+Pj4wO2lmKGY9PT11bmRlZmluZWQpZj1cInV0ZjhcIn1lbHNle2Y9dDt0PXVuZGVmaW5lZH19ZWxzZXt0aHJvdyBuZXcgRXJyb3IoXCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFwiKX12YXIgbj10aGlzLmxlbmd0aC1yO2lmKHQ9PT11bmRlZmluZWR8fHQ+bil0PW47aWYoZS5sZW5ndGg+MCYmKHQ8MHx8cjwwKXx8cj50aGlzLmxlbmd0aCl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kc1wiKX1pZighZilmPVwidXRmOFwiO3ZhciBpPWZhbHNlO2Zvcig7Oyl7c3dpdGNoKGYpe2Nhc2VcImhleFwiOnJldHVybiBoZXhXcml0ZSh0aGlzLGUscix0KTtjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpyZXR1cm4gdXRmOFdyaXRlKHRoaXMsZSxyLHQpO2Nhc2VcImFzY2lpXCI6cmV0dXJuIGFzY2lpV3JpdGUodGhpcyxlLHIsdCk7Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsZSxyLHQpO2Nhc2VcImJhc2U2NFwiOnJldHVybiBiYXNlNjRXcml0ZSh0aGlzLGUscix0KTtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm4gdWNzMldyaXRlKHRoaXMsZSxyLHQpO2RlZmF1bHQ6aWYoaSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrZik7Zj0oXCJcIitmKS50b0xvd2VyQ2FzZSgpO2k9dHJ1ZX19fTtCdWZmZXIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbiB0b0pTT04oKXtyZXR1cm57dHlwZTpcIkJ1ZmZlclwiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07ZnVuY3Rpb24gYmFzZTY0U2xpY2UoZSxyLHQpe2lmKHI9PT0wJiZ0PT09ZS5sZW5ndGgpe3JldHVybiBmLmZyb21CeXRlQXJyYXkoZSl9ZWxzZXtyZXR1cm4gZi5mcm9tQnl0ZUFycmF5KGUuc2xpY2Uocix0KSl9fWZ1bmN0aW9uIHV0ZjhTbGljZShlLHIsdCl7dD1NYXRoLm1pbihlLmxlbmd0aCx0KTt2YXIgZj1bXTt2YXIgbj1yO3doaWxlKG48dCl7dmFyIGk9ZVtuXTt2YXIgbz1udWxsO3ZhciB1PWk+MjM5PzQ6aT4yMjM/MzppPjE5MT8yOjE7aWYobit1PD10KXt2YXIgYSxzLGgsYztzd2l0Y2godSl7Y2FzZSAxOmlmKGk8MTI4KXtvPWl9YnJlYWs7Y2FzZSAyOmE9ZVtuKzFdO2lmKChhJjE5Mik9PT0xMjgpe2M9KGkmMzEpPDw2fGEmNjM7aWYoYz4xMjcpe289Y319YnJlYWs7Y2FzZSAzOmE9ZVtuKzFdO3M9ZVtuKzJdO2lmKChhJjE5Mik9PT0xMjgmJihzJjE5Mik9PT0xMjgpe2M9KGkmMTUpPDwxMnwoYSY2Myk8PDZ8cyY2MztpZihjPjIwNDcmJihjPDU1Mjk2fHxjPjU3MzQzKSl7bz1jfX1icmVhaztjYXNlIDQ6YT1lW24rMV07cz1lW24rMl07aD1lW24rM107aWYoKGEmMTkyKT09PTEyOCYmKHMmMTkyKT09PTEyOCYmKGgmMTkyKT09PTEyOCl7Yz0oaSYxNSk8PDE4fChhJjYzKTw8MTJ8KHMmNjMpPDw2fGgmNjM7aWYoYz42NTUzNSYmYzwxMTE0MTEyKXtvPWN9fX19aWYobz09PW51bGwpe289NjU1MzM7dT0xfWVsc2UgaWYobz42NTUzNSl7by09NjU1MzY7Zi5wdXNoKG8+Pj4xMCYxMDIzfDU1Mjk2KTtvPTU2MzIwfG8mMTAyM31mLnB1c2gobyk7bis9dX1yZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KGYpfXZhciB1PTQwOTY7ZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5KGUpe3ZhciByPWUubGVuZ3RoO2lmKHI8PXUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKX12YXIgdD1cIlwiO3ZhciBmPTA7d2hpbGUoZjxyKXt0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlLnNsaWNlKGYsZis9dSkpfXJldHVybiB0fWZ1bmN0aW9uIGFzY2lpU2xpY2UoZSxyLHQpe3ZhciBmPVwiXCI7dD1NYXRoLm1pbihlLmxlbmd0aCx0KTtmb3IodmFyIG49cjtuPHQ7KytuKXtmKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbbl0mMTI3KX1yZXR1cm4gZn1mdW5jdGlvbiBsYXRpbjFTbGljZShlLHIsdCl7dmFyIGY9XCJcIjt0PU1hdGgubWluKGUubGVuZ3RoLHQpO2Zvcih2YXIgbj1yO248dDsrK24pe2YrPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtuXSl9cmV0dXJuIGZ9ZnVuY3Rpb24gaGV4U2xpY2UoZSxyLHQpe3ZhciBmPWUubGVuZ3RoO2lmKCFyfHxyPDApcj0wO2lmKCF0fHx0PDB8fHQ+Zil0PWY7dmFyIG49XCJcIjtmb3IodmFyIGk9cjtpPHQ7KytpKXtuKz1zW2VbaV1dfXJldHVybiBufWZ1bmN0aW9uIHV0ZjE2bGVTbGljZShlLHIsdCl7dmFyIGY9ZS5zbGljZShyLHQpO3ZhciBuPVwiXCI7Zm9yKHZhciBpPTA7aTxmLmxlbmd0aDtpKz0yKXtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGZbaV0rZltpKzFdKjI1Nil9cmV0dXJuIG59QnVmZmVyLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbiBzbGljZShlLHIpe3ZhciB0PXRoaXMubGVuZ3RoO2U9fn5lO3I9cj09PXVuZGVmaW5lZD90On5+cjtpZihlPDApe2UrPXQ7aWYoZTwwKWU9MH1lbHNlIGlmKGU+dCl7ZT10fWlmKHI8MCl7cis9dDtpZihyPDApcj0wfWVsc2UgaWYocj50KXtyPXR9aWYocjxlKXI9ZTt2YXIgZj10aGlzLnN1YmFycmF5KGUscik7T2JqZWN0LnNldFByb3RvdHlwZU9mKGYsQnVmZmVyLnByb3RvdHlwZSk7cmV0dXJuIGZ9O2Z1bmN0aW9uIGNoZWNrT2Zmc2V0KGUscix0KXtpZihlJTEhPT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvZmZzZXQgaXMgbm90IHVpbnRcIik7aWYoZStyPnQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoXCIpfUJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbiByZWFkVUludExFKGUscix0KXtlPWU+Pj4wO3I9cj4+PjA7aWYoIXQpY2hlY2tPZmZzZXQoZSxyLHRoaXMubGVuZ3RoKTt2YXIgZj10aGlzW2VdO3ZhciBuPTE7dmFyIGk9MDt3aGlsZSgrK2k8ciYmKG4qPTI1Nikpe2YrPXRoaXNbZStpXSpufXJldHVybiBmfTtCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24gcmVhZFVJbnRCRShlLHIsdCl7ZT1lPj4+MDtyPXI+Pj4wO2lmKCF0KXtjaGVja09mZnNldChlLHIsdGhpcy5sZW5ndGgpfXZhciBmPXRoaXNbZSstLXJdO3ZhciBuPTE7d2hpbGUocj4wJiYobio9MjU2KSl7Zis9dGhpc1tlKy0tcl0qbn1yZXR1cm4gZn07QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24gcmVhZFVJbnQ4KGUscil7ZT1lPj4+MDtpZighciljaGVja09mZnNldChlLDEsdGhpcy5sZW5ndGgpO3JldHVybiB0aGlzW2VdfTtCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbiByZWFkVUludDE2TEUoZSxyKXtlPWU+Pj4wO2lmKCFyKWNoZWNrT2Zmc2V0KGUsMix0aGlzLmxlbmd0aCk7cmV0dXJuIHRoaXNbZV18dGhpc1tlKzFdPDw4fTtCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbiByZWFkVUludDE2QkUoZSxyKXtlPWU+Pj4wO2lmKCFyKWNoZWNrT2Zmc2V0KGUsMix0aGlzLmxlbmd0aCk7cmV0dXJuIHRoaXNbZV08PDh8dGhpc1tlKzFdfTtCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbiByZWFkVUludDMyTEUoZSxyKXtlPWU+Pj4wO2lmKCFyKWNoZWNrT2Zmc2V0KGUsNCx0aGlzLmxlbmd0aCk7cmV0dXJuKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpK3RoaXNbZSszXSoxNjc3NzIxNn07QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24gcmVhZFVJbnQzMkJFKGUscil7ZT1lPj4+MDtpZighciljaGVja09mZnNldChlLDQsdGhpcy5sZW5ndGgpO3JldHVybiB0aGlzW2VdKjE2Nzc3MjE2Kyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfTtCdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbiByZWFkSW50TEUoZSxyLHQpe2U9ZT4+PjA7cj1yPj4+MDtpZighdCljaGVja09mZnNldChlLHIsdGhpcy5sZW5ndGgpO3ZhciBmPXRoaXNbZV07dmFyIG49MTt2YXIgaT0wO3doaWxlKCsraTxyJiYobio9MjU2KSl7Zis9dGhpc1tlK2ldKm59bio9MTI4O2lmKGY+PW4pZi09TWF0aC5wb3coMiw4KnIpO3JldHVybiBmfTtCdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbiByZWFkSW50QkUoZSxyLHQpe2U9ZT4+PjA7cj1yPj4+MDtpZighdCljaGVja09mZnNldChlLHIsdGhpcy5sZW5ndGgpO3ZhciBmPXI7dmFyIG49MTt2YXIgaT10aGlzW2UrLS1mXTt3aGlsZShmPjAmJihuKj0yNTYpKXtpKz10aGlzW2UrLS1mXSpufW4qPTEyODtpZihpPj1uKWktPU1hdGgucG93KDIsOCpyKTtyZXR1cm4gaX07QnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbiByZWFkSW50OChlLHIpe2U9ZT4+PjA7aWYoIXIpY2hlY2tPZmZzZXQoZSwxLHRoaXMubGVuZ3RoKTtpZighKHRoaXNbZV0mMTI4KSlyZXR1cm4gdGhpc1tlXTtyZXR1cm4oMjU1LXRoaXNbZV0rMSkqLTF9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24gcmVhZEludDE2TEUoZSxyKXtlPWU+Pj4wO2lmKCFyKWNoZWNrT2Zmc2V0KGUsMix0aGlzLmxlbmd0aCk7dmFyIHQ9dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIHQmMzI3Njg/dHw0Mjk0OTAxNzYwOnR9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24gcmVhZEludDE2QkUoZSxyKXtlPWU+Pj4wO2lmKCFyKWNoZWNrT2Zmc2V0KGUsMix0aGlzLmxlbmd0aCk7dmFyIHQ9dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIHQmMzI3Njg/dHw0Mjk0OTAxNzYwOnR9O0J1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24gcmVhZEludDMyTEUoZSxyKXtlPWU+Pj4wO2lmKCFyKWNoZWNrT2Zmc2V0KGUsNCx0aGlzLmxlbmd0aCk7cmV0dXJuIHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH07QnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbiByZWFkSW50MzJCRShlLHIpe2U9ZT4+PjA7aWYoIXIpY2hlY2tPZmZzZXQoZSw0LHRoaXMubGVuZ3RoKTtyZXR1cm4gdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfTtCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uIHJlYWRGbG9hdExFKGUscil7ZT1lPj4+MDtpZighciljaGVja09mZnNldChlLDQsdGhpcy5sZW5ndGgpO3JldHVybiBuLnJlYWQodGhpcyxlLHRydWUsMjMsNCl9O0J1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24gcmVhZEZsb2F0QkUoZSxyKXtlPWU+Pj4wO2lmKCFyKWNoZWNrT2Zmc2V0KGUsNCx0aGlzLmxlbmd0aCk7cmV0dXJuIG4ucmVhZCh0aGlzLGUsZmFsc2UsMjMsNCl9O0J1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uIHJlYWREb3VibGVMRShlLHIpe2U9ZT4+PjA7aWYoIXIpY2hlY2tPZmZzZXQoZSw4LHRoaXMubGVuZ3RoKTtyZXR1cm4gbi5yZWFkKHRoaXMsZSx0cnVlLDUyLDgpfTtCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbiByZWFkRG91YmxlQkUoZSxyKXtlPWU+Pj4wO2lmKCFyKWNoZWNrT2Zmc2V0KGUsOCx0aGlzLmxlbmd0aCk7cmV0dXJuIG4ucmVhZCh0aGlzLGUsZmFsc2UsNTIsOCl9O2Z1bmN0aW9uIGNoZWNrSW50KGUscix0LGYsbixpKXtpZighQnVmZmVyLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHI+bnx8cjxpKXRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKHQrZj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKX1CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uIHdyaXRlVUludExFKGUscix0LGYpe2U9K2U7cj1yPj4+MDt0PXQ+Pj4wO2lmKCFmKXt2YXIgbj1NYXRoLnBvdygyLDgqdCktMTtjaGVja0ludCh0aGlzLGUscix0LG4sMCl9dmFyIGk9MTt2YXIgbz0wO3RoaXNbcl09ZSYyNTU7d2hpbGUoKytvPHQmJihpKj0yNTYpKXt0aGlzW3Irb109ZS9pJjI1NX1yZXR1cm4gcit0fTtCdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uIHdyaXRlVUludEJFKGUscix0LGYpe2U9K2U7cj1yPj4+MDt0PXQ+Pj4wO2lmKCFmKXt2YXIgbj1NYXRoLnBvdygyLDgqdCktMTtjaGVja0ludCh0aGlzLGUscix0LG4sMCl9dmFyIGk9dC0xO3ZhciBvPTE7dGhpc1tyK2ldPWUmMjU1O3doaWxlKC0taT49MCYmKG8qPTI1Nikpe3RoaXNbcitpXT1lL28mMjU1fXJldHVybiByK3R9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbiB3cml0ZVVJbnQ4KGUscix0KXtlPStlO3I9cj4+PjA7aWYoIXQpY2hlY2tJbnQodGhpcyxlLHIsMSwyNTUsMCk7dGhpc1tyXT1lJjI1NTtyZXR1cm4gcisxfTtCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24gd3JpdGVVSW50MTZMRShlLHIsdCl7ZT0rZTtyPXI+Pj4wO2lmKCF0KWNoZWNrSW50KHRoaXMsZSxyLDIsNjU1MzUsMCk7dGhpc1tyXT1lJjI1NTt0aGlzW3IrMV09ZT4+Pjg7cmV0dXJuIHIrMn07QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uIHdyaXRlVUludDE2QkUoZSxyLHQpe2U9K2U7cj1yPj4+MDtpZighdCljaGVja0ludCh0aGlzLGUsciwyLDY1NTM1LDApO3RoaXNbcl09ZT4+Pjg7dGhpc1tyKzFdPWUmMjU1O3JldHVybiByKzJ9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbiB3cml0ZVVJbnQzMkxFKGUscix0KXtlPStlO3I9cj4+PjA7aWYoIXQpY2hlY2tJbnQodGhpcyxlLHIsNCw0Mjk0OTY3Mjk1LDApO3RoaXNbciszXT1lPj4+MjQ7dGhpc1tyKzJdPWU+Pj4xNjt0aGlzW3IrMV09ZT4+Pjg7dGhpc1tyXT1lJjI1NTtyZXR1cm4gcis0fTtCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24gd3JpdGVVSW50MzJCRShlLHIsdCl7ZT0rZTtyPXI+Pj4wO2lmKCF0KWNoZWNrSW50KHRoaXMsZSxyLDQsNDI5NDk2NzI5NSwwKTt0aGlzW3JdPWU+Pj4yNDt0aGlzW3IrMV09ZT4+PjE2O3RoaXNbcisyXT1lPj4+ODt0aGlzW3IrM109ZSYyNTU7cmV0dXJuIHIrNH07QnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uIHdyaXRlSW50TEUoZSxyLHQsZil7ZT0rZTtyPXI+Pj4wO2lmKCFmKXt2YXIgbj1NYXRoLnBvdygyLDgqdC0xKTtjaGVja0ludCh0aGlzLGUscix0LG4tMSwtbil9dmFyIGk9MDt2YXIgbz0xO3ZhciB1PTA7dGhpc1tyXT1lJjI1NTt3aGlsZSgrK2k8dCYmKG8qPTI1Nikpe2lmKGU8MCYmdT09PTAmJnRoaXNbcitpLTFdIT09MCl7dT0xfXRoaXNbcitpXT0oZS9vPj4wKS11JjI1NX1yZXR1cm4gcit0fTtCdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24gd3JpdGVJbnRCRShlLHIsdCxmKXtlPStlO3I9cj4+PjA7aWYoIWYpe3ZhciBuPU1hdGgucG93KDIsOCp0LTEpO2NoZWNrSW50KHRoaXMsZSxyLHQsbi0xLC1uKX12YXIgaT10LTE7dmFyIG89MTt2YXIgdT0wO3RoaXNbcitpXT1lJjI1NTt3aGlsZSgtLWk+PTAmJihvKj0yNTYpKXtpZihlPDAmJnU9PT0wJiZ0aGlzW3IraSsxXSE9PTApe3U9MX10aGlzW3IraV09KGUvbz4+MCktdSYyNTV9cmV0dXJuIHIrdH07QnVmZmVyLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24gd3JpdGVJbnQ4KGUscix0KXtlPStlO3I9cj4+PjA7aWYoIXQpY2hlY2tJbnQodGhpcyxlLHIsMSwxMjcsLTEyOCk7aWYoZTwwKWU9MjU1K2UrMTt0aGlzW3JdPWUmMjU1O3JldHVybiByKzF9O0J1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uIHdyaXRlSW50MTZMRShlLHIsdCl7ZT0rZTtyPXI+Pj4wO2lmKCF0KWNoZWNrSW50KHRoaXMsZSxyLDIsMzI3NjcsLTMyNzY4KTt0aGlzW3JdPWUmMjU1O3RoaXNbcisxXT1lPj4+ODtyZXR1cm4gcisyfTtCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbiB3cml0ZUludDE2QkUoZSxyLHQpe2U9K2U7cj1yPj4+MDtpZighdCljaGVja0ludCh0aGlzLGUsciwyLDMyNzY3LC0zMjc2OCk7dGhpc1tyXT1lPj4+ODt0aGlzW3IrMV09ZSYyNTU7cmV0dXJuIHIrMn07QnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24gd3JpdGVJbnQzMkxFKGUscix0KXtlPStlO3I9cj4+PjA7aWYoIXQpY2hlY2tJbnQodGhpcyxlLHIsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KTt0aGlzW3JdPWUmMjU1O3RoaXNbcisxXT1lPj4+ODt0aGlzW3IrMl09ZT4+PjE2O3RoaXNbciszXT1lPj4+MjQ7cmV0dXJuIHIrNH07QnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24gd3JpdGVJbnQzMkJFKGUscix0KXtlPStlO3I9cj4+PjA7aWYoIXQpY2hlY2tJbnQodGhpcyxlLHIsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KTtpZihlPDApZT00Mjk0OTY3Mjk1K2UrMTt0aGlzW3JdPWU+Pj4yNDt0aGlzW3IrMV09ZT4+PjE2O3RoaXNbcisyXT1lPj4+ODt0aGlzW3IrM109ZSYyNTU7cmV0dXJuIHIrNH07ZnVuY3Rpb24gY2hlY2tJRUVFNzU0KGUscix0LGYsbixpKXtpZih0K2Y+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIik7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpfWZ1bmN0aW9uIHdyaXRlRmxvYXQoZSxyLHQsZixpKXtyPStyO3Q9dD4+PjA7aWYoIWkpe2NoZWNrSUVFRTc1NChlLHIsdCw0LDM0MDI4MjM0NjYzODUyODg2ZTIyLC0zNDAyODIzNDY2Mzg1Mjg4NmUyMil9bi53cml0ZShlLHIsdCxmLDIzLDQpO3JldHVybiB0KzR9QnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24gd3JpdGVGbG9hdExFKGUscix0KXtyZXR1cm4gd3JpdGVGbG9hdCh0aGlzLGUscix0cnVlLHQpfTtCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbiB3cml0ZUZsb2F0QkUoZSxyLHQpe3JldHVybiB3cml0ZUZsb2F0KHRoaXMsZSxyLGZhbHNlLHQpfTtmdW5jdGlvbiB3cml0ZURvdWJsZShlLHIsdCxmLGkpe3I9K3I7dD10Pj4+MDtpZighaSl7Y2hlY2tJRUVFNzU0KGUscix0LDgsMTc5NzY5MzEzNDg2MjMxNTdlMjkyLC0xNzk3NjkzMTM0ODYyMzE1N2UyOTIpfW4ud3JpdGUoZSxyLHQsZiw1Miw4KTtyZXR1cm4gdCs4fUJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbiB3cml0ZURvdWJsZUxFKGUscix0KXtyZXR1cm4gd3JpdGVEb3VibGUodGhpcyxlLHIsdHJ1ZSx0KX07QnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uIHdyaXRlRG91YmxlQkUoZSxyLHQpe3JldHVybiB3cml0ZURvdWJsZSh0aGlzLGUscixmYWxzZSx0KX07QnVmZmVyLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uIGNvcHkoZSxyLHQsZil7aWYoIUJ1ZmZlci5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgc2hvdWxkIGJlIGEgQnVmZmVyXCIpO2lmKCF0KXQ9MDtpZighZiYmZiE9PTApZj10aGlzLmxlbmd0aDtpZihyPj1lLmxlbmd0aClyPWUubGVuZ3RoO2lmKCFyKXI9MDtpZihmPjAmJmY8dClmPXQ7aWYoZj09PXQpcmV0dXJuIDA7aWYoZS5sZW5ndGg9PT0wfHx0aGlzLmxlbmd0aD09PTApcmV0dXJuIDA7aWYocjwwKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHNcIil9aWYodDwwfHx0Pj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtpZihmPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kc1wiKTtpZihmPnRoaXMubGVuZ3RoKWY9dGhpcy5sZW5ndGg7aWYoZS5sZW5ndGgtcjxmLXQpe2Y9ZS5sZW5ndGgtcit0fXZhciBuPWYtdDtpZih0aGlzPT09ZSYmdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW49PT1cImZ1bmN0aW9uXCIpe3RoaXMuY29weVdpdGhpbihyLHQsZil9ZWxzZSBpZih0aGlzPT09ZSYmdDxyJiZyPGYpe2Zvcih2YXIgaT1uLTE7aT49MDstLWkpe2VbaStyXT10aGlzW2krdF19fWVsc2V7VWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoZSx0aGlzLnN1YmFycmF5KHQsZikscil9cmV0dXJuIG59O0J1ZmZlci5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbiBmaWxsKGUscix0LGYpe2lmKHR5cGVvZiBlPT09XCJzdHJpbmdcIil7aWYodHlwZW9mIHI9PT1cInN0cmluZ1wiKXtmPXI7cj0wO3Q9dGhpcy5sZW5ndGh9ZWxzZSBpZih0eXBlb2YgdD09PVwic3RyaW5nXCIpe2Y9dDt0PXRoaXMubGVuZ3RofWlmKGYhPT11bmRlZmluZWQmJnR5cGVvZiBmIT09XCJzdHJpbmdcIil7dGhyb3cgbmV3IFR5cGVFcnJvcihcImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmdcIil9aWYodHlwZW9mIGY9PT1cInN0cmluZ1wiJiYhQnVmZmVyLmlzRW5jb2RpbmcoZikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitmKX1pZihlLmxlbmd0aD09PTEpe3ZhciBuPWUuY2hhckNvZGVBdCgwKTtpZihmPT09XCJ1dGY4XCImJm48MTI4fHxmPT09XCJsYXRpbjFcIil7ZT1ufX19ZWxzZSBpZih0eXBlb2YgZT09PVwibnVtYmVyXCIpe2U9ZSYyNTV9ZWxzZSBpZih0eXBlb2YgZT09PVwiYm9vbGVhblwiKXtlPU51bWJlcihlKX1pZihyPDB8fHRoaXMubGVuZ3RoPHJ8fHRoaXMubGVuZ3RoPHQpe3Rocm93IG5ldyBSYW5nZUVycm9yKFwiT3V0IG9mIHJhbmdlIGluZGV4XCIpfWlmKHQ8PXIpe3JldHVybiB0aGlzfXI9cj4+PjA7dD10PT09dW5kZWZpbmVkP3RoaXMubGVuZ3RoOnQ+Pj4wO2lmKCFlKWU9MDt2YXIgaTtpZih0eXBlb2YgZT09PVwibnVtYmVyXCIpe2ZvcihpPXI7aTx0OysraSl7dGhpc1tpXT1lfX1lbHNle3ZhciBvPUJ1ZmZlci5pc0J1ZmZlcihlKT9lOkJ1ZmZlci5mcm9tKGUsZik7dmFyIHU9by5sZW5ndGg7aWYodT09PTApe3Rocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBcIicrZSsnXCIgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgXCJ2YWx1ZVwiJyl9Zm9yKGk9MDtpPHQtcjsrK2kpe3RoaXNbaStyXT1vW2kldV19fXJldHVybiB0aGlzfTt2YXIgYT0vW14rLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIGJhc2U2NGNsZWFuKGUpe2U9ZS5zcGxpdChcIj1cIilbMF07ZT1lLnRyaW0oKS5yZXBsYWNlKGEsXCJcIik7aWYoZS5sZW5ndGg8MilyZXR1cm5cIlwiO3doaWxlKGUubGVuZ3RoJTQhPT0wKXtlPWUrXCI9XCJ9cmV0dXJuIGV9ZnVuY3Rpb24gdXRmOFRvQnl0ZXMoZSxyKXtyPXJ8fEluZmluaXR5O3ZhciB0O3ZhciBmPWUubGVuZ3RoO3ZhciBuPW51bGw7dmFyIGk9W107Zm9yKHZhciBvPTA7bzxmOysrbyl7dD1lLmNoYXJDb2RlQXQobyk7aWYodD41NTI5NSYmdDw1NzM0NCl7aWYoIW4pe2lmKHQ+NTYzMTkpe2lmKChyLT0zKT4tMSlpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWVsc2UgaWYobysxPT09Zil7aWYoKHItPTMpPi0xKWkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9bj10O2NvbnRpbnVlfWlmKHQ8NTYzMjApe2lmKChyLT0zKT4tMSlpLnB1c2goMjM5LDE5MSwxODkpO249dDtjb250aW51ZX10PShuLTU1Mjk2PDwxMHx0LTU2MzIwKSs2NTUzNn1lbHNlIGlmKG4pe2lmKChyLT0zKT4tMSlpLnB1c2goMjM5LDE5MSwxODkpfW49bnVsbDtpZih0PDEyOCl7aWYoKHItPTEpPDApYnJlYWs7aS5wdXNoKHQpfWVsc2UgaWYodDwyMDQ4KXtpZigoci09Mik8MClicmVhaztpLnB1c2godD4+NnwxOTIsdCY2M3wxMjgpfWVsc2UgaWYodDw2NTUzNil7aWYoKHItPTMpPDApYnJlYWs7aS5wdXNoKHQ+PjEyfDIyNCx0Pj42JjYzfDEyOCx0JjYzfDEyOCl9ZWxzZSBpZih0PDExMTQxMTIpe2lmKChyLT00KTwwKWJyZWFrO2kucHVzaCh0Pj4xOHwyNDAsdD4+MTImNjN8MTI4LHQ+PjYmNjN8MTI4LHQmNjN8MTI4KX1lbHNle3Rocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29kZSBwb2ludFwiKX19cmV0dXJuIGl9ZnVuY3Rpb24gYXNjaWlUb0J5dGVzKGUpe3ZhciByPVtdO2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7Kyt0KXtyLnB1c2goZS5jaGFyQ29kZUF0KHQpJjI1NSl9cmV0dXJuIHJ9ZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMoZSxyKXt2YXIgdCxmLG47dmFyIGk9W107Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDsrK28pe2lmKChyLT0yKTwwKWJyZWFrO3Q9ZS5jaGFyQ29kZUF0KG8pO2Y9dD4+ODtuPXQlMjU2O2kucHVzaChuKTtpLnB1c2goZil9cmV0dXJuIGl9ZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyhlKXtyZXR1cm4gZi50b0J5dGVBcnJheShiYXNlNjRjbGVhbihlKSl9ZnVuY3Rpb24gYmxpdEJ1ZmZlcihlLHIsdCxmKXtmb3IodmFyIG49MDtuPGY7KytuKXtpZihuK3Q+PXIubGVuZ3RofHxuPj1lLmxlbmd0aClicmVhaztyW24rdF09ZVtuXX1yZXR1cm4gbn1mdW5jdGlvbiBpc0luc3RhbmNlKGUscil7cmV0dXJuIGUgaW5zdGFuY2VvZiByfHxlIT1udWxsJiZlLmNvbnN0cnVjdG9yIT1udWxsJiZlLmNvbnN0cnVjdG9yLm5hbWUhPW51bGwmJmUuY29uc3RydWN0b3IubmFtZT09PXIubmFtZX1mdW5jdGlvbiBudW1iZXJJc05hTihlKXtyZXR1cm4gZSE9PWV9dmFyIHM9ZnVuY3Rpb24oKXt2YXIgZT1cIjAxMjM0NTY3ODlhYmNkZWZcIjt2YXIgcj1uZXcgQXJyYXkoMjU2KTtmb3IodmFyIHQ9MDt0PDE2OysrdCl7dmFyIGY9dCoxNjtmb3IodmFyIG49MDtuPDE2Oysrbil7cltmK25dPWVbdF0rZVtuXX19cmV0dXJuIHJ9KCl9LDc4MzpmdW5jdGlvbihlLHIpe1xuLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbnIucmVhZD1mdW5jdGlvbihlLHIsdCxmLG4pe3ZhciBpLG87dmFyIHU9bio4LWYtMTt2YXIgYT0oMTw8dSktMTt2YXIgcz1hPj4xO3ZhciBoPS03O3ZhciBjPXQ/bi0xOjA7dmFyIGw9dD8tMToxO3ZhciBwPWVbcitjXTtjKz1sO2k9cCYoMTw8LWgpLTE7cD4+PS1oO2grPXU7Zm9yKDtoPjA7aT1pKjI1NitlW3IrY10sYys9bCxoLT04KXt9bz1pJigxPDwtaCktMTtpPj49LWg7aCs9Zjtmb3IoO2g+MDtvPW8qMjU2K2VbcitjXSxjKz1sLGgtPTgpe31pZihpPT09MCl7aT0xLXN9ZWxzZSBpZihpPT09YSl7cmV0dXJuIG8/TmFOOihwPy0xOjEpKkluZmluaXR5fWVsc2V7bz1vK01hdGgucG93KDIsZik7aT1pLXN9cmV0dXJuKHA/LTE6MSkqbypNYXRoLnBvdygyLGktZil9O3Iud3JpdGU9ZnVuY3Rpb24oZSxyLHQsZixuLGkpe3ZhciBvLHUsYTt2YXIgcz1pKjgtbi0xO3ZhciBoPSgxPDxzKS0xO3ZhciBjPWg+PjE7dmFyIGw9bj09PTIzP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MDt2YXIgcD1mPzA6aS0xO3ZhciB5PWY/MTotMTt2YXIgZz1yPDB8fHI9PT0wJiYxL3I8MD8xOjA7cj1NYXRoLmFicyhyKTtpZihpc05hTihyKXx8cj09PUluZmluaXR5KXt1PWlzTmFOKHIpPzE6MDtvPWh9ZWxzZXtvPU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjIpO2lmKHIqKGE9TWF0aC5wb3coMiwtbykpPDEpe28tLTthKj0yfWlmKG8rYz49MSl7cis9bC9hfWVsc2V7cis9bCpNYXRoLnBvdygyLDEtYyl9aWYociphPj0yKXtvKys7YS89Mn1pZihvK2M+PWgpe3U9MDtvPWh9ZWxzZSBpZihvK2M+PTEpe3U9KHIqYS0xKSpNYXRoLnBvdygyLG4pO289bytjfWVsc2V7dT1yKk1hdGgucG93KDIsYy0xKSpNYXRoLnBvdygyLG4pO289MH19Zm9yKDtuPj04O2VbdCtwXT11JjI1NSxwKz15LHUvPTI1NixuLT04KXt9bz1vPDxufHU7cys9bjtmb3IoO3M+MDtlW3QrcF09byYyNTUscCs9eSxvLz0yNTYscy09OCl7fWVbdCtwLXldfD1nKjEyOH19fTt2YXIgcj17fTtmdW5jdGlvbiBfX25jY3dwY2tfcmVxdWlyZV9fKHQpe3ZhciBmPXJbdF07aWYoZiE9PXVuZGVmaW5lZCl7cmV0dXJuIGYuZXhwb3J0c312YXIgbj1yW3RdPXtleHBvcnRzOnt9fTt2YXIgaT10cnVlO3RyeXtlW3RdKG4sbi5leHBvcnRzLF9fbmNjd3Bja19yZXF1aXJlX18pO2k9ZmFsc2V9ZmluYWxseXtpZihpKWRlbGV0ZSByW3RdfXJldHVybiBuLmV4cG9ydHN9aWYodHlwZW9mIF9fbmNjd3Bja19yZXF1aXJlX18hPT1cInVuZGVmaW5lZFwiKV9fbmNjd3Bja19yZXF1aXJlX18uYWI9X19kaXJuYW1lK1wiL1wiO3ZhciB0PV9fbmNjd3Bja19yZXF1aXJlX18oNzIpO21vZHVsZS5leHBvcnRzPXR9KSgpOyJdLCJuYW1lcyI6WyJlIiwiciIsImJ5dGVMZW5ndGgiLCJ0b0J5dGVBcnJheSIsImZyb21CeXRlQXJyYXkiLCJ0IiwiZiIsIm4iLCJVaW50OEFycmF5IiwiQXJyYXkiLCJpIiwibyIsInUiLCJsZW5ndGgiLCJjaGFyQ29kZUF0IiwiZ2V0TGVucyIsIkVycm9yIiwiaW5kZXhPZiIsIl9ieXRlTGVuZ3RoIiwiYSIsInMiLCJoIiwidHJpcGxldFRvQmFzZTY0IiwiZW5jb2RlQ2h1bmsiLCJwdXNoIiwiam9pbiIsIlN5bWJvbCIsImZvciIsIkJ1ZmZlciIsIlNsb3dCdWZmZXIiLCJJTlNQRUNUX01BWF9CWVRFUyIsImtNYXhMZW5ndGgiLCJUWVBFRF9BUlJBWV9TVVBQT1JUIiwidHlwZWRBcnJheVN1cHBvcnQiLCJjb25zb2xlIiwiZXJyb3IiLCJmb28iLCJPYmplY3QiLCJzZXRQcm90b3R5cGVPZiIsInByb3RvdHlwZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsImlzQnVmZmVyIiwidW5kZWZpbmVkIiwiYnVmZmVyIiwiYnl0ZU9mZnNldCIsImNyZWF0ZUJ1ZmZlciIsIlJhbmdlRXJyb3IiLCJUeXBlRXJyb3IiLCJhbGxvY1Vuc2FmZSIsImZyb20iLCJwb29sU2l6ZSIsImZyb21TdHJpbmciLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsImZyb21BcnJheUxpa2UiLCJpc0luc3RhbmNlIiwiZnJvbUFycmF5QnVmZmVyIiwiU2hhcmVkQXJyYXlCdWZmZXIiLCJ2YWx1ZU9mIiwiZnJvbU9iamVjdCIsInRvUHJpbWl0aXZlIiwiYXNzZXJ0U2l6ZSIsImFsbG9jIiwiZmlsbCIsImNoZWNrZWQiLCJhbGxvY1Vuc2FmZVNsb3ciLCJpc0VuY29kaW5nIiwid3JpdGUiLCJzbGljZSIsImNvcHkiLCJudW1iZXJJc05hTiIsInR5cGUiLCJpc0FycmF5IiwiZGF0YSIsInRvU3RyaW5nIiwiX2lzQnVmZmVyIiwiY29tcGFyZSIsIm9mZnNldCIsIk1hdGgiLCJtaW4iLCJTdHJpbmciLCJ0b0xvd2VyQ2FzZSIsImNvbmNhdCIsImFyZ3VtZW50cyIsInV0ZjhUb0J5dGVzIiwiYmFzZTY0VG9CeXRlcyIsInNsb3dUb1N0cmluZyIsImhleFNsaWNlIiwidXRmOFNsaWNlIiwiYXNjaWlTbGljZSIsImxhdGluMVNsaWNlIiwiYmFzZTY0U2xpY2UiLCJ1dGYxNmxlU2xpY2UiLCJzd2FwIiwic3dhcDE2Iiwic3dhcDMyIiwic3dhcDY0IiwiYXBwbHkiLCJ0b0xvY2FsZVN0cmluZyIsImVxdWFscyIsImluc3BlY3QiLCJyZXBsYWNlIiwidHJpbSIsImJpZGlyZWN0aW9uYWxJbmRleE9mIiwiYXJyYXlJbmRleE9mIiwiY2FsbCIsImxhc3RJbmRleE9mIiwicmVhZCIsInJlYWRVSW50MTZCRSIsImMiLCJpbmNsdWRlcyIsImhleFdyaXRlIiwiTnVtYmVyIiwicGFyc2VJbnQiLCJzdWJzdHIiLCJ1dGY4V3JpdGUiLCJibGl0QnVmZmVyIiwiYXNjaWlXcml0ZSIsImFzY2lpVG9CeXRlcyIsImxhdGluMVdyaXRlIiwiYmFzZTY0V3JpdGUiLCJ1Y3MyV3JpdGUiLCJ1dGYxNmxlVG9CeXRlcyIsImlzRmluaXRlIiwidG9KU09OIiwiX2FyciIsImRlY29kZUNvZGVQb2ludHNBcnJheSIsImZyb21DaGFyQ29kZSIsInN1YmFycmF5IiwiY2hlY2tPZmZzZXQiLCJyZWFkVUludExFIiwicmVhZFVJbnRCRSIsInJlYWRVSW50OCIsInJlYWRVSW50MTZMRSIsInJlYWRVSW50MzJMRSIsInJlYWRVSW50MzJCRSIsInJlYWRJbnRMRSIsInBvdyIsInJlYWRJbnRCRSIsInJlYWRJbnQ4IiwicmVhZEludDE2TEUiLCJyZWFkSW50MTZCRSIsInJlYWRJbnQzMkxFIiwicmVhZEludDMyQkUiLCJyZWFkRmxvYXRMRSIsInJlYWRGbG9hdEJFIiwicmVhZERvdWJsZUxFIiwicmVhZERvdWJsZUJFIiwiY2hlY2tJbnQiLCJ3cml0ZVVJbnRMRSIsIndyaXRlVUludEJFIiwid3JpdGVVSW50OCIsIndyaXRlVUludDE2TEUiLCJ3cml0ZVVJbnQxNkJFIiwid3JpdGVVSW50MzJMRSIsIndyaXRlVUludDMyQkUiLCJ3cml0ZUludExFIiwid3JpdGVJbnRCRSIsIndyaXRlSW50OCIsIndyaXRlSW50MTZMRSIsIndyaXRlSW50MTZCRSIsIndyaXRlSW50MzJMRSIsIndyaXRlSW50MzJCRSIsImNoZWNrSUVFRTc1NCIsIndyaXRlRmxvYXQiLCJ3cml0ZUZsb2F0TEUiLCJ3cml0ZUZsb2F0QkUiLCJ3cml0ZURvdWJsZSIsIndyaXRlRG91YmxlTEUiLCJ3cml0ZURvdWJsZUJFIiwiY29weVdpdGhpbiIsInNldCIsImJhc2U2NGNsZWFuIiwic3BsaXQiLCJJbmZpbml0eSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImwiLCJwIiwiTmFOIiwieSIsImciLCJhYnMiLCJpc05hTiIsImZsb29yIiwibG9nIiwiTE4yIiwiX19uY2N3cGNrX3JlcXVpcmVfXyIsImV4cG9ydHMiLCJhYiIsIl9fZGlybmFtZSIsIm1vZHVsZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/compiled/buffer/index.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/next/dist/compiled/process/browser.js":
/*!************************************************************!*\
!*** ./node_modules/next/dist/compiled/process/browser.js ***!
\************************************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
eval(__webpack_require__.ts("var __dirname = \"/\";\n\n(function() {\n var e = {\n 229: function(e) {\n var t = e.exports = {};\n var r;\n var n;\n function defaultSetTimout() {\n throw new Error(\"setTimeout has not been defined\");\n }\n function defaultClearTimeout() {\n throw new Error(\"clearTimeout has not been defined\");\n }\n (function() {\n try {\n if (typeof setTimeout === \"function\") {\n r = setTimeout;\n } else {\n r = defaultSetTimout;\n }\n } catch (e) {\n r = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === \"function\") {\n n = clearTimeout;\n } else {\n n = defaultClearTimeout;\n }\n } catch (e) {\n n = defaultClearTimeout;\n }\n })();\n function runTimeout(e) {\n if (r === setTimeout) {\n return setTimeout(e, 0);\n }\n if ((r === defaultSetTimout || !r) && setTimeout) {\n r = setTimeout;\n return setTimeout(e, 0);\n }\n try {\n return r(e, 0);\n } catch (t) {\n try {\n return r.call(null, e, 0);\n } catch (t) {\n return r.call(this, e, 0);\n }\n }\n }\n function runClearTimeout(e) {\n if (n === clearTimeout) {\n return clearTimeout(e);\n }\n if ((n === defaultClearTimeout || !n) && clearTimeout) {\n n = clearTimeout;\n return clearTimeout(e);\n }\n try {\n return n(e);\n } catch (t) {\n try {\n return n.call(null, e);\n } catch (t) {\n return n.call(this, e);\n }\n }\n }\n var i = [];\n var o = false;\n var u;\n var a = -1;\n function cleanUpNextTick() {\n if (!o || !u) {\n return;\n }\n o = false;\n if (u.length) {\n i = u.concat(i);\n } else {\n a = -1;\n }\n if (i.length) {\n drainQueue();\n }\n }\n function drainQueue() {\n if (o) {\n return;\n }\n var e = runTimeout(cleanUpNextTick);\n o = true;\n var t = i.length;\n while(t){\n u = i;\n i = [];\n while(++a < t){\n if (u) {\n u[a].run();\n }\n }\n a = -1;\n t = i.length;\n }\n u = null;\n o = false;\n runClearTimeout(e);\n }\n t.nextTick = function(e) {\n var t = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for(var r = 1; r < arguments.length; r++){\n t[r - 1] = arguments[r];\n }\n }\n i.push(new Item(e, t));\n if (i.length === 1 && !o) {\n runTimeout(drainQueue);\n }\n };\n function Item(e, t) {\n this.fun = e;\n this.array = t;\n }\n Item.prototype.run = function() {\n this.fun.apply(null, this.array);\n };\n t.title = \"browser\";\n t.browser = true;\n t.env = {};\n t.argv = [];\n t.version = \"\";\n t.versions = {};\n function noop() {}\n t.on = noop;\n t.addListener = noop;\n t.once = noop;\n t.off = noop;\n t.removeListener = noop;\n t.removeAllListeners = noop;\n t.emit = noop;\n t.prependListener = noop;\n t.prependOnceListener = noop;\n t.listeners = function(e) {\n return [];\n };\n t.binding = function(e) {\n throw new Error(\"process.binding is not supported\");\n };\n t.cwd = function() {\n return \"/\";\n };\n t.chdir = function(e) {\n throw new Error(\"process.chdir is not supported\");\n };\n t.umask = function() {\n return 0;\n };\n }\n };\n var t = {};\n function __nccwpck_require__(r) {\n var n = t[r];\n if (n !== undefined) {\n return n.exports;\n }\n var i = t[r] = {\n exports: {}\n };\n var o = true;\n try {\n e[r](i, i.exports, __nccwpck_require__);\n o = false;\n } finally{\n if (o) delete t[r];\n }\n return i.exports;\n }\n if (typeof __nccwpck_require__ !== \"undefined\") __nccwpck_require__.ab = __dirname + \"/\";\n var r = __nccwpck_require__(229);\n module.exports = r;\n})();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY29tcGlsZWQvcHJvY2Vzcy9icm93c2VyLmpzIiwibWFwcGluZ3MiOiI7O0FBQUM7SUFBVyxJQUFJQSxJQUFFO1FBQUMsS0FBSSxTQUFTQSxDQUFDO1lBQUUsSUFBSUMsSUFBRUQsRUFBRUUsT0FBTyxHQUFDLENBQUM7WUFBRSxJQUFJQztZQUFFLElBQUlDO1lBQUUsU0FBU0M7Z0JBQW1CLE1BQU0sSUFBSUMsTUFBTTtZQUFrQztZQUFDLFNBQVNDO2dCQUFzQixNQUFNLElBQUlELE1BQU07WUFBb0M7WUFBRTtnQkFBVyxJQUFHO29CQUFDLElBQUcsT0FBT0UsZUFBYSxZQUFXO3dCQUFDTCxJQUFFSztvQkFBVSxPQUFLO3dCQUFDTCxJQUFFRTtvQkFBZ0I7Z0JBQUMsRUFBQyxPQUFNTCxHQUFFO29CQUFDRyxJQUFFRTtnQkFBZ0I7Z0JBQUMsSUFBRztvQkFBQyxJQUFHLE9BQU9JLGlCQUFlLFlBQVc7d0JBQUNMLElBQUVLO29CQUFZLE9BQUs7d0JBQUNMLElBQUVHO29CQUFtQjtnQkFBQyxFQUFDLE9BQU1QLEdBQUU7b0JBQUNJLElBQUVHO2dCQUFtQjtZQUFDO1lBQUssU0FBU0csV0FBV1YsQ0FBQztnQkFBRSxJQUFHRyxNQUFJSyxZQUFXO29CQUFDLE9BQU9BLFdBQVdSLEdBQUU7Z0JBQUU7Z0JBQUMsSUFBRyxDQUFDRyxNQUFJRSxvQkFBa0IsQ0FBQ0YsQ0FBQUEsS0FBSUssWUFBVztvQkFBQ0wsSUFBRUs7b0JBQVcsT0FBT0EsV0FBV1IsR0FBRTtnQkFBRTtnQkFBQyxJQUFHO29CQUFDLE9BQU9HLEVBQUVILEdBQUU7Z0JBQUUsRUFBQyxPQUFNQyxHQUFFO29CQUFDLElBQUc7d0JBQUMsT0FBT0UsRUFBRVEsSUFBSSxDQUFDLE1BQUtYLEdBQUU7b0JBQUUsRUFBQyxPQUFNQyxHQUFFO3dCQUFDLE9BQU9FLEVBQUVRLElBQUksQ0FBQyxJQUFJLEVBQUNYLEdBQUU7b0JBQUU7Z0JB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c3QvY29tcGlsZWQvcHJvY2Vzcy9icm93c2VyLmpzPzFiMWQiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7dmFyIGU9ezIyOTpmdW5jdGlvbihlKXt2YXIgdD1lLmV4cG9ydHM9e307dmFyIHI7dmFyIG47ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpe3Rocm93IG5ldyBFcnJvcihcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIil9ZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCgpe3Rocm93IG5ldyBFcnJvcihcImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFwiKX0oZnVuY3Rpb24oKXt0cnl7aWYodHlwZW9mIHNldFRpbWVvdXQ9PT1cImZ1bmN0aW9uXCIpe3I9c2V0VGltZW91dH1lbHNle3I9ZGVmYXVsdFNldFRpbW91dH19Y2F0Y2goZSl7cj1kZWZhdWx0U2V0VGltb3V0fXRyeXtpZih0eXBlb2YgY2xlYXJUaW1lb3V0PT09XCJmdW5jdGlvblwiKXtuPWNsZWFyVGltZW91dH1lbHNle249ZGVmYXVsdENsZWFyVGltZW91dH19Y2F0Y2goZSl7bj1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7ZnVuY3Rpb24gcnVuVGltZW91dChlKXtpZihyPT09c2V0VGltZW91dCl7cmV0dXJuIHNldFRpbWVvdXQoZSwwKX1pZigocj09PWRlZmF1bHRTZXRUaW1vdXR8fCFyKSYmc2V0VGltZW91dCl7cj1zZXRUaW1lb3V0O3JldHVybiBzZXRUaW1lb3V0KGUsMCl9dHJ5e3JldHVybiByKGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiByLmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiByLmNhbGwodGhpcyxlLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KGUpe2lmKG49PT1jbGVhclRpbWVvdXQpe3JldHVybiBjbGVhclRpbWVvdXQoZSl9aWYoKG49PT1kZWZhdWx0Q2xlYXJUaW1lb3V0fHwhbikmJmNsZWFyVGltZW91dCl7bj1jbGVhclRpbWVvdXQ7cmV0dXJuIGNsZWFyVGltZW91dChlKX10cnl7cmV0dXJuIG4oZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBuLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gbi5jYWxsKHRoaXMsZSl9fX12YXIgaT1bXTt2YXIgbz1mYWxzZTt2YXIgdTt2YXIgYT0tMTtmdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKXtpZighb3x8IXUpe3JldHVybn1vPWZhbHNlO2lmKHUubGVuZ3RoKXtpPXUuY29uY2F0KGkpfWVsc2V7YT0tMX1pZihpLmxlbmd0aCl7ZHJhaW5RdWV1ZSgpfX1mdW5jdGlvbiBkcmFpblF1ZXVlKCl7aWYobyl7cmV0dXJufXZhciBlPXJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtvPXRydWU7dmFyIHQ9aS5sZW5ndGg7d2hpbGUodCl7dT1pO2k9W107d2hpbGUoKythPHQpe2lmKHUpe3VbYV0ucnVuKCl9fWE9LTE7dD1pLmxlbmd0aH11PW51bGw7bz1mYWxzZTtydW5DbGVhclRpbWVvdXQoZSl9dC5uZXh0VGljaz1mdW5jdGlvbihlKXt2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2Zvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspe3Rbci0xXT1hcmd1bWVudHNbcl19fWkucHVzaChuZXcgSXRlbShlLHQpKTtpZihpLmxlbmd0aD09PTEmJiFvKXtydW5UaW1lb3V0KGRyYWluUXVldWUpfX07ZnVuY3Rpb24gSXRlbShlLHQpe3RoaXMuZnVuPWU7dGhpcy5hcnJheT10fUl0ZW0ucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O3QudGl0bGU9XCJicm93c2VyXCI7dC5icm93c2VyPXRydWU7dC5lbnY9e307dC5hcmd2PVtdO3QudmVyc2lvbj1cIlwiO3QudmVyc2lvbnM9e307ZnVuY3Rpb24gbm9vcCgpe310Lm9uPW5vb3A7dC5hZGRMaXN0ZW5lcj1ub29wO3Qub25jZT1ub29wO3Qub2ZmPW5vb3A7dC5yZW1vdmVMaXN0ZW5lcj1ub29wO3QucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3A7dC5lbWl0PW5vb3A7dC5wcmVwZW5kTGlzdGVuZXI9bm9vcDt0LnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcDt0Lmxpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm5bXX07dC5iaW5kaW5nPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXCIpfTt0LmN3ZD1mdW5jdGlvbigpe3JldHVyblwiL1wifTt0LmNoZGlyPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFwiKX07dC51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX19O3ZhciB0PXt9O2Z1bmN0aW9uIF9fbmNjd3Bja19yZXF1aXJlX18ocil7dmFyIG49dFtyXTtpZihuIT09dW5kZWZpbmVkKXtyZXR1cm4gbi5leHBvcnRzfXZhciBpPXRbcl09e2V4cG9ydHM6e319O3ZhciBvPXRydWU7dHJ5e2Vbcl0oaSxpLmV4cG9ydHMsX19uY2N3cGNrX3JlcXVpcmVfXyk7bz1mYWxzZX1maW5hbGx5e2lmKG8pZGVsZXRlIHRbcl19cmV0dXJuIGkuZXhwb3J0c31pZih0eXBlb2YgX19uY2N3cGNrX3JlcXVpcmVfXyE9PVwidW5kZWZpbmVkXCIpX19uY2N3cGNrX3JlcXVpcmVfXy5hYj1fX2Rpcm5hbWUrXCIvXCI7dmFyIHI9X19uY2N3cGNrX3JlcXVpcmVfXygyMjkpO21vZHVsZS5leHBvcnRzPXJ9KSgpOyJdLCJuYW1lcyI6WyJlIiwidCIsImV4cG9ydHMiLCJyIiwibiIsImRlZmF1bHRTZXRUaW1vdXQiLCJFcnJvciIsImRlZmF1bHRDbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImNhbGwiLCJydW5DbGVhclRpbWVvdXQiLCJpIiwibyIsInUiLCJhIiwiY2xlYW5VcE5leHRUaWNrIiwibGVuZ3RoIiwiY29uY2F0IiwiZHJhaW5RdWV1ZSIsInJ1biIsIm5leHRUaWNrIiwiQXJyYXkiLCJhcmd1bWVudHMiLCJwdXNoIiwiSXRlbSIsImZ1biIsImFycmF5IiwicHJvdG90eXBlIiwiYXBwbHkiLCJ0aXRsZSIsImJyb3dzZXIiLCJlbnYiLCJhcmd2IiwidmVyc2lvbiIsInZlcnNpb25zIiwibm9vcCIsIm9uIiwiYWRkTGlzdGVuZXIiLCJvbmNlIiwib2ZmIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJlbWl0IiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImxpc3RlbmVycyIsImJpbmRpbmciLCJjd2QiLCJjaGRpciIsInVtYXNrIiwiX19uY2N3cGNrX3JlcXVpcmVfXyIsInVuZGVmaW5lZCIsImFiIiwiX19kaXJuYW1lIiwibW9kdWxlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/compiled/process/browser.js\n"));
/***/ }),
/***/ "(app-pages-browser)/./src/components/CameraCapture.tsx":
/*!******************************************!*\
!*** ./src/components/CameraCapture.tsx ***!
\******************************************/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CameraCapture; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _barrel_optimize_names_AlertCircle_Camera_CheckCircle2_Sparkles_Upload_lucide_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! __barrel_optimize__?names=AlertCircle,Camera,CheckCircle2,Sparkles,Upload!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/camera.js\");\n/* harmony import */ var _barrel_optimize_names_AlertCircle_Camera_CheckCircle2_Sparkles_Upload_lucide_react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! __barrel_optimize__?names=AlertCircle,Camera,CheckCircle2,Sparkles,Upload!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/upload.js\");\n/* harmony import */ var _barrel_optimize_names_AlertCircle_Camera_CheckCircle2_Sparkles_Upload_lucide_react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! __barrel_optimize__?names=AlertCircle,Camera,CheckCircle2,Sparkles,Upload!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/alert-circle.js\");\n/* harmony import */ var _barrel_optimize_names_AlertCircle_Camera_CheckCircle2_Sparkles_Upload_lucide_react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! __barrel_optimize__?names=AlertCircle,Camera,CheckCircle2,Sparkles,Upload!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/check-circle-2.js\");\n/* harmony import */ var _barrel_optimize_names_AlertCircle_Camera_CheckCircle2_Sparkles_Upload_lucide_react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! __barrel_optimize__?names=AlertCircle,Camera,CheckCircle2,Sparkles,Upload!=!lucide-react */ \"(app-pages-browser)/./node_modules/lucide-react/dist/esm/icons/sparkles.js\");\n/* harmony import */ var _services_analyze_bottle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/services/analyze-bottle */ \"(app-pages-browser)/./src/services/analyze-bottle.ts\");\n/* harmony import */ var _services_save_bottle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/services/save-bottle */ \"(app-pages-browser)/./src/services/save-bottle.ts\");\n/* harmony import */ var _lib_supabase__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/supabase */ \"(app-pages-browser)/./src/lib/supabase.ts\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nfunction CameraCapture(param) {\n let { onImageCaptured, onAnalysisComplete, onSaveComplete } = param;\n _s();\n const fileInputRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const [isProcessing, setIsProcessing] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [isSaving, setIsSaving] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [previewUrl, setPreviewUrl] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [analysisResult, setAnalysisResult] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const handleCapture = async (event)=>{\n var _event_target_files;\n const file = (_event_target_files = event.target.files) === null || _event_target_files === void 0 ? void 0 : _event_target_files[0];\n if (!file) return;\n setIsProcessing(true);\n setError(null);\n setAnalysisResult(null);\n try {\n const compressedBase64 = await compressImage(file);\n setPreviewUrl(compressedBase64);\n if (onImageCaptured) {\n onImageCaptured(compressedBase64);\n }\n const response = await (0,_services_analyze_bottle__WEBPACK_IMPORTED_MODULE_2__.analyzeBottle)(compressedBase64);\n if (response.success && response.data) {\n setAnalysisResult(response.data);\n if (onAnalysisComplete) {\n onAnalysisComplete(response.data);\n }\n } else {\n setError(response.error || \"Analyse fehlgeschlagen.\");\n }\n } catch (err) {\n console.error(\"Processing failed:\", err);\n setError(\"Verarbeitung fehlgeschlagen. Bitte erneut versuchen.\");\n } finally{\n setIsProcessing(false);\n }\n };\n const handleSave = async ()=>{\n if (!analysisResult || !previewUrl) return;\n setIsSaving(true);\n setError(null);\n try {\n // Get current user (simple check for now, can be improved with Auth)\n const { data: { user } } = await _lib_supabase__WEBPACK_IMPORTED_MODULE_4__.supabase.auth.getUser();\n if (!user) {\n throw new Error(\"Bitte melde dich an, um Flaschen zu speichern.\");\n }\n const response = await (0,_services_save_bottle__WEBPACK_IMPORTED_MODULE_3__.saveBottle)(analysisResult, previewUrl, user.id);\n if (response.success) {\n setPreviewUrl(null);\n setAnalysisResult(null);\n if (onSaveComplete) onSaveComplete();\n // Optionale Erfolgsmeldung oder Redirect\n } else {\n setError(response.error || \"Speichern fehlgeschlagen.\");\n }\n } catch (err) {\n console.error(\"Save failed:\", err);\n setError(err instanceof Error ? err.message : \"Speichern fehlgeschlagen.\");\n } finally{\n setIsSaving(false);\n }\n };\n const compressImage = (file)=>{\n return new Promise((resolve, reject)=>{\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = (event)=>{\n var _event_target;\n const img = new Image();\n img.src = (_event_target = event.target) === null || _event_target === void 0 ? void 0 : _event_target.result;\n img.onload = ()=>{\n const canvas = document.createElement(\"canvas\");\n const MAX_WIDTH = 1024;\n let width = img.width;\n let height = img.height;\n if (width > MAX_WIDTH) {\n height = height * MAX_WIDTH / width;\n width = MAX_WIDTH;\n }\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n reject(new Error(\"Canvas context not available\"));\n return;\n }\n ctx.drawImage(img, 0, 0, width, height);\n const base64 = canvas.toDataURL(\"image/jpeg\", 0.8);\n resolve(base64);\n };\n img.onerror = reject;\n };\n reader.onerror = reject;\n });\n };\n const triggerUpload = ()=>{\n var _fileInputRef_current;\n (_fileInputRef_current = fileInputRef.current) === null || _fileInputRef_current === void 0 ? void 0 : _fileInputRef_current.click();\n };\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col items-center gap-6 w-full max-w-md mx-auto p-6 bg-white dark:bg-zinc-900 rounded-3xl shadow-2xl border border-zinc-200 dark:border-zinc-800 transition-all hover:shadow-whisky-amber/20\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-2xl font-bold text-zinc-800 dark:text-zinc-100 italic\",\n children: \"Magic Shot\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 132,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative group cursor-pointer w-full aspect-square rounded-2xl border-2 border-dashed border-zinc-300 dark:border-zinc-700 overflow-hidden flex items-center justify-center bg-zinc-50 dark:bg-zinc-800/50 hover:border-amber-500 transition-colors\",\n onClick: triggerUpload,\n children: [\n previewUrl ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"img\", {\n src: previewUrl,\n alt: \"Preview\",\n className: \"w-full h-full object-cover\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 139,\n columnNumber: 21\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col items-center gap-2 text-zinc-400 group-hover:text-amber-500 transition-colors\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertCircle_Camera_CheckCircle2_Sparkles_Upload_lucide_react__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n size: 48,\n strokeWidth: 1.5\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 142,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm font-medium\",\n children: \"Flasche scannen\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 143,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 141,\n columnNumber: 21\n }, this),\n isProcessing && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute inset-0 bg-black/50 backdrop-blur-sm flex items-center justify-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"animate-spin rounded-full h-12 w-12 border-b-2 border-white\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 149,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 148,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 134,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"file\",\n accept: \"image/*\",\n capture: \"environment\",\n ref: fileInputRef,\n onChange: handleCapture,\n className: \"hidden\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 154,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: triggerUpload,\n disabled: isProcessing,\n className: \"w-full py-4 px-6 bg-amber-600 hover:bg-amber-700 text-white rounded-xl font-semibold flex items-center justify-center gap-2 transition-all active:scale-[0.98] shadow-lg shadow-amber-600/20 disabled:opacity-50\",\n children: previewUrl ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertCircle_Camera_CheckCircle2_Sparkles_Upload_lucide_react__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n size: 20\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 170,\n columnNumber: 25\n }, this),\n \"Neu aufnehmen\"\n ]\n }, void 0, true) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertCircle_Camera_CheckCircle2_Sparkles_Upload_lucide_react__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n size: 20\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 175,\n columnNumber: 25\n }, this),\n \"Kamera \\xf6ffnen\"\n ]\n }, void 0, true)\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 163,\n columnNumber: 13\n }, this),\n error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2 text-red-500 text-sm bg-red-50 dark:bg-red-900/10 p-3 rounded-lg w-full\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertCircle_Camera_CheckCircle2_Sparkles_Upload_lucide_react__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n size: 16\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 183,\n columnNumber: 21\n }, this),\n error\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 182,\n columnNumber: 17\n }, this),\n previewUrl && !isProcessing && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-3 w-full animate-in fade-in slide-in-from-top-4 duration-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2 text-green-500 text-sm bg-green-50 dark:bg-green-900/10 p-3 rounded-lg w-full\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertCircle_Camera_CheckCircle2_Sparkles_Upload_lucide_react__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n size: 16\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 191,\n columnNumber: 25\n }, this),\n \"Bild erfolgreich analysiert\"\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 190,\n columnNumber: 21\n }, this),\n analysisResult && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"p-4 bg-zinc-50 dark:bg-zinc-800/50 rounded-2xl border border-zinc-200 dark:border-zinc-700\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2 mb-3 text-amber-600 dark:text-amber-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_barrel_optimize_names_AlertCircle_Camera_CheckCircle2_Sparkles_Upload_lucide_react__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n size: 18\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 198,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-bold text-sm uppercase tracking-wider\",\n children: \"Ergebnisse\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 199,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 197,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-500\",\n children: \"Name:\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 203,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-semibold\",\n children: analysisResult.name || \"-\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 204,\n columnNumber: 37\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 202,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-500\",\n children: \"Distille:\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 207,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-semibold\",\n children: analysisResult.distillery || \"-\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 208,\n columnNumber: 37\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 206,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-500\",\n children: \"Kategorie:\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 211,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-semibold\",\n children: analysisResult.category || \"-\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 212,\n columnNumber: 37\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 210,\n columnNumber: 33\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-500\",\n children: \"ABV:\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 215,\n columnNumber: 37\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-semibold\",\n children: analysisResult.abv ? \"\".concat(analysisResult.abv, \"%\") : \"-\"\n }, void 0, false, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 216,\n columnNumber: 37\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 214,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 201,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 196,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 189,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/home/robin/AI/Coding/Whisky/src/components/CameraCapture.tsx\",\n lineNumber: 131,\n columnNumber: 9\n }, this);\n}\n_s(CameraCapture, \"wZak9A+cb4xl6YWwbmrwKL83yMo=\");\n_c = CameraCapture;\nvar _c;\n$RefreshReg$(_c, \"CameraCapture\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL0NhbWVyYUNhcHR1cmUudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWdEO0FBQ21DO0FBQ3pCO0FBQ047QUFFVjtBQVEzQixTQUFTVyxjQUFjLEtBQTJFO1FBQTNFLEVBQUVDLGVBQWUsRUFBRUMsa0JBQWtCLEVBQUVDLGNBQWMsRUFBc0IsR0FBM0U7O0lBQ2xDLE1BQU1DLGVBQWVkLDZDQUFNQSxDQUFtQjtJQUM5QyxNQUFNLENBQUNlLGNBQWNDLGdCQUFnQixHQUFHZiwrQ0FBUUEsQ0FBQztJQUNqRCxNQUFNLENBQUNnQixVQUFVQyxZQUFZLEdBQUdqQiwrQ0FBUUEsQ0FBQztJQUN6QyxNQUFNLENBQUNrQixZQUFZQyxjQUFjLEdBQUduQiwrQ0FBUUEsQ0FBZ0I7SUFDNUQsTUFBTSxDQUFDb0IsT0FBT0MsU0FBUyxHQUFHckIsK0NBQVFBLENBQWdCO0lBQ2xELE1BQU0sQ0FBQ3NCLGdCQUFnQkMsa0JBQWtCLEdBQUd2QiwrQ0FBUUEsQ0FBd0I7SUFFNUUsTUFBTXdCLGdCQUFnQixPQUFPQztZQUNaQTtRQUFiLE1BQU1DLFFBQU9ELHNCQUFBQSxNQUFNRSxNQUFNLENBQUNDLEtBQUssY0FBbEJILDBDQUFBQSxtQkFBb0IsQ0FBQyxFQUFFO1FBQ3BDLElBQUksQ0FBQ0MsTUFBTTtRQUVYWCxnQkFBZ0I7UUFDaEJNLFNBQVM7UUFDVEUsa0JBQWtCO1FBRWxCLElBQUk7WUFDQSxNQUFNTSxtQkFBbUIsTUFBTUMsY0FBY0o7WUFDN0NQLGNBQWNVO1lBRWQsSUFBSW5CLGlCQUFpQjtnQkFDakJBLGdCQUFnQm1CO1lBQ3BCO1lBRUEsTUFBTUUsV0FBVyxNQUFNekIsdUVBQWFBLENBQUN1QjtZQUVyQyxJQUFJRSxTQUFTQyxPQUFPLElBQUlELFNBQVNFLElBQUksRUFBRTtnQkFDbkNWLGtCQUFrQlEsU0FBU0UsSUFBSTtnQkFDL0IsSUFBSXRCLG9CQUFvQjtvQkFDcEJBLG1CQUFtQm9C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QUFlK0QsSUFBSSxJQUFJOzs7Ozs7Ozs7Ozs7a0RBRTVELDhEQUFDaEI7d0NBQUlDLFdBQVU7OzBEQUNYLDhEQUFDTTtnREFBS04sV0FBVTswREFBZ0I7Ozs7OzswREFDaEMsOERBQUNNO2dEQUFLTixXQUFVOzBEQUFpQmhELGVBQWVnRSxVQUFVLElBQUk7Ozs7Ozs7Ozs7OztrREFFbEUsOERBQUNqQjt3Q0FBSUMsV0FBVTs7MERBQ1gsOERBQUNNO2dEQUFLTixXQUFVOzBEQUFnQjs7Ozs7OzBEQUNoQyw4REFBQ007Z0RBQUtOLFdBQVU7MERBQWlCaEQsZUFBZWlFLFFBQVEsSUFBSTs7Ozs7Ozs7Ozs7O2tEQUVoRSw4REFBQ2xCO3dDQUFJQyxXQUFVOzswREFDWCw4REFBQ007Z0RBQUtOLFdBQVU7MERBQWdCOzs7Ozs7MERBQ2hDLDhEQUFDTTtnREFBS04sV0FBVTswREFBaUJoRCxlQUFla0UsR0FBRyxHQUFHLEdBQXNCLE9BQW5CbEUsZUFBZWtFLEdBQUcsRUFBQyxPQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTckg7R0FqTndCL0U7S0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vc3JjL2NvbXBvbmVudHMvQ2FtZXJhQ2FwdHVyZS50c3g/MWMzNCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ2FtZXJhLCBVcGxvYWQsIENoZWNrQ2lyY2xlMiwgQWxlcnRDaXJjbGUsIFNwYXJrbGVzIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IGFuYWx5emVCb3R0bGUgfSBmcm9tICdAL3NlcnZpY2VzL2FuYWx5emUtYm90dGxlJztcbmltcG9ydCB7IHNhdmVCb3R0bGUgfSBmcm9tICdAL3NlcnZpY2VzL3NhdmUtYm90dGxlJztcbmltcG9ydCB7IEJvdHRsZU1ldGFkYXRhIH0gZnJvbSAnQC90eXBlcy93aGlza3knO1xuaW1wb3J0IHsgc3VwYWJhc2UgfSBmcm9tICdAL2xpYi9zdXBhYmFzZSc7XG5cbmludGVyZmFjZSBDYW1lcmFDYXB0dXJlUHJvcHMge1xuICAgIG9uSW1hZ2VDYXB0dXJlZD86IChiYXNlNjRJbWFnZTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIG9uQW5hbHlzaXNDb21wbGV0ZT86IChkYXRhOiBCb3R0bGVNZXRhZGF0YSkgPT4gdm9pZDtcbiAgICBvblNhdmVDb21wbGV0ZT86ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENhbWVyYUNhcHR1cmUoeyBvbkltYWdlQ2FwdHVyZWQsIG9uQW5hbHlzaXNDb21wbGV0ZSwgb25TYXZlQ29tcGxldGUgfTogQ2FtZXJhQ2FwdHVyZVByb3BzKSB7XG4gICAgY29uc3QgZmlsZUlucHV0UmVmID0gdXNlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KG51bGwpO1xuICAgIGNvbnN0IFtpc1Byb2Nlc3NpbmcsIHNldElzUHJvY2Vzc2luZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW2lzU2F2aW5nLCBzZXRJc1NhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW3ByZXZpZXdVcmwsIHNldFByZXZpZXdVcmxdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gICAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgICBjb25zdCBbYW5hbHlzaXNSZXN1bHQsIHNldEFuYWx5c2lzUmVzdWx0XSA9IHVzZVN0YXRlPEJvdHRsZU1ldGFkYXRhIHwgbnVsbD4obnVsbCk7XG5cbiAgICBjb25zdCBoYW5kbGVDYXB0dXJlID0gYXN5bmMgKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzPy5bMF07XG4gICAgICAgIGlmICghZmlsZSkgcmV0dXJuO1xuXG4gICAgICAgIHNldElzUHJvY2Vzc2luZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG4gICAgICAgIHNldEFuYWx5c2lzUmVzdWx0KG51bGwpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb21wcmVzc2VkQmFzZTY0ID0gYXdhaXQgY29tcHJlc3NJbWFnZShmaWxlKTtcbiAgICAgICAgICAgIHNldFByZXZpZXdVcmwoY29tcHJlc3NlZEJhc2U2NCk7XG5cbiAgICAgICAgICAgIGlmIChvbkltYWdlQ2FwdHVyZWQpIHtcbiAgICAgICAgICAgICAgICBvbkltYWdlQ2FwdHVyZWQoY29tcHJlc3NlZEJhc2U2NCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYW5hbHl6ZUJvdHRsZShjb21wcmVzc2VkQmFzZTY0KTtcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgICAgICAgIHNldEFuYWx5c2lzUmVzdWx0KHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChvbkFuYWx5c2lzQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgb25BbmFseXNpc0NvbXBsZXRlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3IocmVzcG9uc2UuZXJyb3IgfHwgJ0FuYWx5c2UgZmVobGdlc2NobGFnZW4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUHJvY2Vzc2luZyBmYWlsZWQ6JywgZXJyKTtcbiAgICAgICAgICAgIHNldEVycm9yKCdWZXJhcmJlaXR1bmcgZmVobGdlc2NobGFnZW4uIEJpdHRlIGVybmV1dCB2ZXJzdWNoZW4uJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzZXRJc1Byb2Nlc3NpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVNhdmUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghYW5hbHlzaXNSZXN1bHQgfHwgIXByZXZpZXdVcmwpIHJldHVybjtcblxuICAgICAgICBzZXRJc1NhdmluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEdldCBjdXJyZW50IHVzZXIgKHNpbXBsZSBjaGVjayBmb3Igbm93LCBjYW4gYmUgaW1wcm92ZWQgd2l0aCBBdXRoKVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHVzZXIgfSB9ID0gYXdhaXQgc3VwYWJhc2UuYXV0aC5nZXRVc2VyKCk7XG4gICAgICAgICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpdHRlIG1lbGRlIGRpY2ggYW4sIHVtIEZsYXNjaGVuIHp1IHNwZWljaGVybi4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzYXZlQm90dGxlKGFuYWx5c2lzUmVzdWx0LCBwcmV2aWV3VXJsLCB1c2VyLmlkKTtcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBzZXRQcmV2aWV3VXJsKG51bGwpO1xuICAgICAgICAgICAgICAgIHNldEFuYWx5c2lzUmVzdWx0KG51bGwpO1xuICAgICAgICAgICAgICAgIGlmIChvblNhdmVDb21wbGV0ZSkgb25TYXZlQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAvLyBPcHRpb25hbGUgRXJmb2xnc21lbGR1bmcgb2RlciBSZWRpcmVjdFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRFcnJvcihyZXNwb25zZS5lcnJvciB8fCAnU3BlaWNoZXJuIGZlaGxnZXNjaGxhZ2VuLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NhdmUgZmFpbGVkOicsIGVycik7XG4gICAgICAgICAgICBzZXRFcnJvcihlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ1NwZWljaGVybiBmZWhsZ2VzY2hsYWdlbi4nKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNldElzU2F2aW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjb21wcmVzc0ltYWdlID0gKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgICAgIGltZy5zcmMgPSBldmVudC50YXJnZXQ/LnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IE1BWF9XSURUSCA9IDEwMjQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IGltZy53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IGltZy5oZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gTUFYX1dJRFRIKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAoaGVpZ2h0ICogTUFYX1dJRFRIKSAvIHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBNQVhfV0lEVEg7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NhbnZhcyBjb250ZXh0IG5vdCBhdmFpbGFibGUnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAwLjgpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGJhc2U2NCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpbWcub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHRyaWdnZXJVcGxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGZpbGVJbnB1dFJlZi5jdXJyZW50Py5jbGljaygpO1xuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC02IHctZnVsbCBtYXgtdy1tZCBteC1hdXRvIHAtNiBiZy13aGl0ZSBkYXJrOmJnLXppbmMtOTAwIHJvdW5kZWQtM3hsIHNoYWRvdy0yeGwgYm9yZGVyIGJvcmRlci16aW5jLTIwMCBkYXJrOmJvcmRlci16aW5jLTgwMCB0cmFuc2l0aW9uLWFsbCBob3ZlcjpzaGFkb3ctd2hpc2t5LWFtYmVyLzIwXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1ib2xkIHRleHQtemluYy04MDAgZGFyazp0ZXh0LXppbmMtMTAwIGl0YWxpY1wiPk1hZ2ljIFNob3Q8L2gyPlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgZ3JvdXAgY3Vyc29yLXBvaW50ZXIgdy1mdWxsIGFzcGVjdC1zcXVhcmUgcm91bmRlZC0yeGwgYm9yZGVyLTIgYm9yZGVyLWRhc2hlZCBib3JkZXItemluYy0zMDAgZGFyazpib3JkZXItemluYy03MDAgb3ZlcmZsb3ctaGlkZGVuIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJnLXppbmMtNTAgZGFyazpiZy16aW5jLTgwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNTAwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0cmlnZ2VyVXBsb2FkfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtwcmV2aWV3VXJsID8gKFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz17cHJldmlld1VybH0gYWx0PVwiUHJldmlld1wiIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgb2JqZWN0LWNvdmVyXCIgLz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtemluYy00MDAgZ3JvdXAtaG92ZXI6dGV4dC1hbWJlci01MDAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDYW1lcmEgc2l6ZT17NDh9IHN0cm9rZVdpZHRoPXsxLjV9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtXCI+Rmxhc2NoZSBzY2FubmVuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAge2lzUHJvY2Vzc2luZyAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCBiZy1ibGFjay81MCBiYWNrZHJvcC1ibHVyLXNtIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFuaW1hdGUtc3BpbiByb3VuZGVkLWZ1bGwgaC0xMiB3LTEyIGJvcmRlci1iLTIgYm9yZGVyLXdoaXRlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgIGFjY2VwdD1cImltYWdlLypcIlxuICAgICAgICAgICAgICAgIGNhcHR1cmU9XCJlbnZpcm9ubWVudFwiXG4gICAgICAgICAgICAgICAgcmVmPXtmaWxlSW5wdXRSZWZ9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNhcHR1cmV9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaGlkZGVuXCJcbiAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0cmlnZ2VyVXBsb2FkfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1Byb2Nlc3Npbmd9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHB5LTQgcHgtNiBiZy1hbWJlci02MDAgaG92ZXI6YmctYW1iZXItNzAwIHRleHQtd2hpdGUgcm91bmRlZC14bCBmb250LXNlbWlib2xkIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yIHRyYW5zaXRpb24tYWxsIGFjdGl2ZTpzY2FsZS1bMC45OF0gc2hhZG93LWxnIHNoYWRvdy1hbWJlci02MDAvMjAgZGlzYWJsZWQ6b3BhY2l0eS01MFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3ByZXZpZXdVcmwgPyAoXG4gICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VXBsb2FkIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgTmV1IGF1Zm5laG1lblxuICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgPENhbWVyYSBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIEthbWVyYSDDtmZmbmVuXG4gICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAge2Vycm9yICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtcmVkLTUwMCB0ZXh0LXNtIGJnLXJlZC01MCBkYXJrOmJnLXJlZC05MDAvMTAgcC0zIHJvdW5kZWQtbGcgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxBbGVydENpcmNsZSBzaXplPXsxNn0gLz5cbiAgICAgICAgICAgICAgICAgICAge2Vycm9yfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAge3ByZXZpZXdVcmwgJiYgIWlzUHJvY2Vzc2luZyAmJiAhZXJyb3IgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMyB3LWZ1bGwgYW5pbWF0ZS1pbiBmYWRlLWluIHNsaWRlLWluLWZyb20tdG9wLTQgZHVyYXRpb24tNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1ncmVlbi01MDAgdGV4dC1zbSBiZy1ncmVlbi01MCBkYXJrOmJnLWdyZWVuLTkwMC8xMCBwLTMgcm91bmRlZC1sZyB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDaGVja0NpcmNsZTIgc2l6ZT17MTZ9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICBCaWxkIGVyZm9sZ3JlaWNoIGFuYWx5c2llcnRcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAge2FuYWx5c2lzUmVzdWx0ICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC00IGJnLXppbmMtNTAgZGFyazpiZy16aW5jLTgwMC81MCByb3VuZGVkLTJ4bCBib3JkZXIgYm9yZGVyLXppbmMtMjAwIGRhcms6Ym9yZGVyLXppbmMtNzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zIHRleHQtYW1iZXItNjAwIGRhcms6dGV4dC1hbWJlci01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNwYXJrbGVzIHNpemU9ezE4fSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LWJvbGQgdGV4dC1zbSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXJcIj5FcmdlYm5pc3NlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTUwMFwiPk5hbWU6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZFwiPnthbmFseXNpc1Jlc3VsdC5uYW1lIHx8ICctJ308L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy01MDBcIj5EaXN0aWxsZTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkXCI+e2FuYWx5c2lzUmVzdWx0LmRpc3RpbGxlcnkgfHwgJy0nfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTUwMFwiPkthdGVnb3JpZTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkXCI+e2FuYWx5c2lzUmVzdWx0LmNhdGVnb3J5IHx8ICctJ308L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy01MDBcIj5BQlY6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZFwiPnthbmFseXNpc1Jlc3VsdC5hYnYgPyBgJHthbmFseXNpc1Jlc3VsdC5hYnZ9JWAgOiAnLSd9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn1cbiJdLCJuYW1lcyI6WyJSZWFjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiQ2FtZXJhIiwiVXBsb2FkIiwiQ2hlY2tDaXJjbGUyIiwiQWxlcnRDaXJjbGUiLCJTcGFya2xlcyIsImFuYWx5emVCb3R0bGUiLCJzYXZlQm90dGxlIiwic3VwYWJhc2UiLCJDYW1lcmFDYXB0dXJlIiwib25JbWFnZUNhcHR1cmVkIiwib25BbmFseXNpc0NvbXBsZXRlIiwib25TYXZlQ29tcGxldGUiLCJmaWxlSW5wdXRSZWYiLCJpc1Byb2Nlc3NpbmciLCJzZXRJc1Byb2Nlc3NpbmciLCJpc1NhdmluZyIsInNldElzU2F2aW5nIiwicHJldmlld1VybCIsInNldFByZXZpZXdVcmwiLCJlcnJvciIsInNldEVycm9yIiwiYW5hbHlzaXNSZXN1bHQiLCJzZXRBbmFseXNpc1Jlc3VsdCIsImhhbmRsZUNhcHR1cmUiLCJldmVudCIsImZpbGUiLCJ0YXJnZXQiLCJmaWxlcyIsImNvbXByZXNzZWRCYXNlNjQiLCJjb21wcmVzc0ltYWdlIiwicmVzcG9uc2UiLCJzdWNjZXNzIiwiZGF0YSIsImVyciIsImNvbnNvbGUiLCJoYW5kbGVTYXZlIiwidXNlciIsImF1dGgiLCJnZXRVc2VyIiwiRXJyb3IiLCJpZCIsIm1lc3NhZ2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwib25sb2FkIiwiaW1nIiwiSW1hZ2UiLCJzcmMiLCJyZXN1bHQiLCJjYW52YXMiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJNQVhfV0lEVEgiLCJ3aWR0aCIsImhlaWdodCIsImN0eCIsImdldENvbnRleHQiLCJkcmF3SW1hZ2UiLCJiYXNlNjQiLCJ0b0RhdGFVUkwiLCJvbmVycm9yIiwidHJpZ2dlclVwbG9hZCIsImN1cnJlbnQiLCJjbGljayIsImRpdiIsImNsYXNzTmFtZSIsImgyIiwib25DbGljayIsImFsdCIsInNpemUiLCJzdHJva2VXaWR0aCIsInNwYW4iLCJpbnB1dCIsInR5cGUiLCJhY2NlcHQiLCJjYXB0dXJlIiwicmVmIiwib25DaGFuZ2UiLCJidXR0b24iLCJkaXNhYmxlZCIsIm5hbWUiLCJkaXN0aWxsZXJ5IiwiY2F0ZWdvcnkiLCJhYnYiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/CameraCapture.tsx\n"));
/***/ }),
/***/ "(app-pages-browser)/./src/lib/supabase.ts":
/*!*****************************!*\
!*** ./src/lib/supabase.ts ***!
\*****************************/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ supabase: function() { return /* binding */ supabase; }\n/* harmony export */ });\n/* harmony import */ var _supabase_supabase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @supabase/supabase-js */ \"(app-pages-browser)/./node_modules/@supabase/supabase-js/dist/index.mjs\");\n\nconst supabaseUrl = \"http://192.168.0.66:8001\";\nconst supabaseAnonKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\";\nconst supabase = (0,_supabase_supabase_js__WEBPACK_IMPORTED_MODULE_0__.createClient)(supabaseUrl, supabaseAnonKey);\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9saWIvc3VwYWJhc2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBcUQ7QUFFckQsTUFBTUMsY0FBY0MsMEJBQW9DO0FBQ3hELE1BQU1HLGtCQUFrQkgsMktBQXlDO0FBRTFELE1BQU1LLFdBQVdQLG1FQUFZQSxDQUFDQyxhQUFhSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vc3JjL2xpYi9zdXBhYmFzZS50cz8wNmUxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUNsaWVudCB9IGZyb20gJ0BzdXBhYmFzZS9zdXBhYmFzZS1qcyc7XG5cbmNvbnN0IHN1cGFiYXNlVXJsID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMITtcbmNvbnN0IHN1cGFiYXNlQW5vbktleSA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZITtcblxuZXhwb3J0IGNvbnN0IHN1cGFiYXNlID0gY3JlYXRlQ2xpZW50KHN1cGFiYXNlVXJsLCBzdXBhYmFzZUFub25LZXkpO1xuIl0sIm5hbWVzIjpbImNyZWF0ZUNsaWVudCIsInN1cGFiYXNlVXJsIiwicHJvY2VzcyIsImVudiIsIk5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCIsInN1cGFiYXNlQW5vbktleSIsIk5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZIiwic3VwYWJhc2UiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/lib/supabase.ts\n"));
/***/ }),
/***/ "(app-pages-browser)/./src/services/save-bottle.ts":
/*!*************************************!*\
!*** ./src/services/save-bottle.ts ***!
\*************************************/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ saveBottle: function() { return /* binding */ saveBottle; }
/* harmony export */ });
/* harmony import */ var next_dist_client_app_call_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/dist/client/app-call-server */ "(app-pages-browser)/./node_modules/next/dist/client/app-call-server.js");
/* harmony import */ var next_dist_client_app_call_server__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_client_app_call_server__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var private_next_rsc_action_client_wrapper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! private-next-rsc-action-client-wrapper */ "(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-loader/action-client-wrapper.js");
function __build_action__(action, args) {
return (0,next_dist_client_app_call_server__WEBPACK_IMPORTED_MODULE_0__.callServer)(action.$$id, args)
}
/* __next_internal_action_entry_do_not_use__ {"9cc2ffbf85f4e72220537b4253faa867d3a48bad":"saveBottle"} */ var saveBottle = (0,private_next_rsc_action_client_wrapper__WEBPACK_IMPORTED_MODULE_1__.createServerReference)("9cc2ffbf85f4e72220537b4253faa867d3a48bad");
;
// Wrapped in an IIFE to avoid polluting the global scope
;
(function () {
var _a, _b;
// Legacy CSS implementations will `eval` browser code in a Node.js context
// to extract CSS. For backwards compatibility, we need to check we're in a
// browser context before continuing.
if (typeof self !== 'undefined' &&
// AMP / No-JS mode does not inject these helpers:
'$RefreshHelpers$' in self) {
// @ts-ignore __webpack_module__ is global
var currentExports = module.exports;
// @ts-ignore __webpack_module__ is global
var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;
// This cannot happen in MainTemplate because the exports mismatch between
// templating and execution.
self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);
// A module can be accepted automatically based on its exports, e.g. when
// it is a Refresh Boundary.
if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {
// Save the previous exports signature on update so we can compare the boundary
// signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)
module.hot.dispose(function (data) {
data.prevSignature =
self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);
});
// Unconditionally accept an update to this module, we'll check if it's
// still a Refresh Boundary later.
// @ts-ignore importMeta is replaced in the loader
module.hot.accept();
// This field is set when the previous version of this module was a
// Refresh Boundary, letting us know we need to check for invalidation or
// enqueue an update.
if (prevSignature !== null) {
// A boundary can become ineligible if its exports are incompatible
// with the previous exports.
//
// For example, if you add/remove/change exports, we'll want to
// re-execute the importing modules, and force those components to
// re-render. Similarly, if you convert a class component to a
// function, we want to invalidate the boundary.
if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {
module.hot.invalidate();
}
else {
self.$RefreshHelpers$.scheduleUpdate();
}
}
}
else {
// Since we just executed the code for the module, it's possible that the
// new exports made it ineligible for being a boundary.
// We only care about the case when we were _previously_ a boundary,
// because we already accepted this update (accidental side effect).
var isNoLongerABoundary = prevSignature !== null;
if (isNoLongerABoundary) {
module.hot.invalidate();
}
}
}
})();
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/postgrest-js/dist/index.mjs":
/*!************************************************************!*\
!*** ./node_modules/@supabase/postgrest-js/dist/index.mjs ***!
\************************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PostgrestBuilder: function() { return /* binding */ PostgrestBuilder; },\n/* harmony export */ PostgrestClient: function() { return /* binding */ PostgrestClient; },\n/* harmony export */ PostgrestError: function() { return /* binding */ PostgrestError; },\n/* harmony export */ PostgrestFilterBuilder: function() { return /* binding */ PostgrestFilterBuilder; },\n/* harmony export */ PostgrestQueryBuilder: function() { return /* binding */ PostgrestQueryBuilder; },\n/* harmony export */ PostgrestTransformBuilder: function() { return /* binding */ PostgrestTransformBuilder; },\n/* harmony export */ \"default\": function() { return /* binding */ src_default; }\n/* harmony export */ });\n//#region src/PostgrestError.ts\n/**\n* Error format\n*\n* {@link https://postgrest.org/en/stable/api.html?highlight=options#errors-and-http-status-codes}\n*/ var PostgrestError = class extends Error {\n /**\n\t* @example\n\t* ```ts\n\t* import PostgrestError from '@supabase/postgrest-js'\n\t*\n\t* throw new PostgrestError({\n\t* message: 'Row level security prevented the request',\n\t* details: 'RLS denied the insert',\n\t* hint: 'Check your policies',\n\t* code: 'PGRST301',\n\t* })\n\t* ```\n\t*/ constructor(context){\n super(context.message);\n this.name = \"PostgrestError\";\n this.details = context.details;\n this.hint = context.hint;\n this.code = context.code;\n }\n};\n//#endregion\n//#region src/PostgrestBuilder.ts\nvar PostgrestBuilder = class {\n /**\n\t* If there's an error with the query, throwOnError will reject the promise by\n\t* throwing the error instead of returning it as part of a successful response.\n\t*\n\t* {@link https://github.com/supabase/supabase-js/issues/92}\n\t*/ throwOnError() {\n this.shouldThrowOnError = true;\n return this;\n }\n /**\n\t* Set an HTTP header for the request.\n\t*/ setHeader(name, value) {\n this.headers = new Headers(this.headers);\n this.headers.set(name, value);\n return this;\n }\n then(onfulfilled, onrejected) {\n var _this = this;\n if (this.schema === void 0) {} else if ([\n \"GET\",\n \"HEAD\"\n ].includes(this.method)) this.headers.set(\"Accept-Profile\", this.schema);\n else this.headers.set(\"Content-Profile\", this.schema);\n if (this.method !== \"GET\" && this.method !== \"HEAD\") this.headers.set(\"Content-Type\", \"application/json\");\n const _fetch = this.fetch;\n let res = _fetch(this.url.toString(), {\n method: this.method,\n headers: this.headers,\n body: JSON.stringify(this.body),\n signal: this.signal\n }).then(async (res$1)=>{\n let error = null;\n let data = null;\n let count = null;\n let status = res$1.status;\n let statusText = res$1.statusText;\n if (res$1.ok) {\n var _this$headers$get2, _res$headers$get;\n if (_this.method !== \"HEAD\") {\n var _this$headers$get;\n const body = await res$1.text();\n if (body === \"\") {} else if (_this.headers.get(\"Accept\") === \"text/csv\") data = body;\n else if (_this.headers.get(\"Accept\") && ((_this$headers$get = _this.headers.get(\"Accept\")) === null || _this$headers$get === void 0 ? void 0 : _this$headers$get.includes(\"application/vnd.pgrst.plan+text\"))) data = body;\n else data = JSON.parse(body);\n }\n const countHeader = (_this$headers$get2 = _this.headers.get(\"Prefer\")) === null || _this$headers$get2 === void 0 ? void 0 : _this$headers$get2.match(/count=(exact|planned|estimated)/);\n const contentRange = (_res$headers$get = res$1.headers.get(\"content-range\")) === null || _res$headers$get === void 0 ? void 0 : _res$headers$get.split(\"/\");\n if (countHeader && contentRange && contentRange.length > 1) count = parseInt(contentRange[1]);\n if (_this.isMaybeSingle && _this.method === \"GET\" && Array.isArray(data)) if (data.length > 1) {\n error = {\n code: \"PGRST116\",\n details: \"Results contain \".concat(data.length, \" rows, application/vnd.pgrst.object+json requires 1 row\"),\n hint: null,\n message: \"JSON object requested, multiple (or no) rows returned\"\n };\n data = null;\n count = null;\n status = 406;\n statusText = \"Not Acceptable\";\n } else if (data.length === 1) data = data[0];\n else data = null;\n } else {\n var _error$details;\n const body = await res$1.text();\n try {\n error = JSON.parse(body);\n if (Array.isArray(error) && res$1.status === 404) {\n data = [];\n error = null;\n status = 200;\n statusText = \"OK\";\n }\n } catch (_unused) {\n if (res$1.status === 404 && body === \"\") {\n status = 204;\n statusText = \"No Content\";\n } else error = {\n message: body\n };\n }\n if (error && _this.isMaybeSingle && (error === null || error === void 0 || (_error$details = error.details) === null || _error$details === void 0 ? void 0 : _error$details.includes(\"0 rows\"))) {\n error = null;\n status = 200;\n statusText = \"OK\";\n }\n if (error && _this.shouldThrowOnError) throw new PostgrestError(error);\n }\n return {\n error,\n data,\n count,\n status,\n statusText\n };\n });\n if (!this.shouldThrowOnError) res = res.catch((fetchError)=>{\n var _fetchError$name2;\n let errorDetails = \"\";\n const cause = fetchError === null || fetchError === void 0 ? void 0 : fetchError.cause;\n if (cause) {\n var _cause$message, _cause$code, _fetchError$name, _cause$name;\n const causeMessage = (_cause$message = cause === null || cause === void 0 ? void 0 : cause.message) !== null && _cause$message !== void 0 ? _cause$message : \"\";\n const causeCode = (_cause$code = cause === null || cause === void 0 ? void 0 : cause.code) !== null && _cause$code !== void 0 ? _cause$code : \"\";\n errorDetails = \"\".concat((_fetchError$name = fetchError === null || fetchError === void 0 ? void 0 : fetchError.name) !== null && _fetchError$name !== void 0 ? _fetchError$name : \"FetchError\", \": \").concat(fetchError === null || fetchError === void 0 ? void 0 : fetchError.message);\n errorDetails += \"\\n\\nCaused by: \".concat((_cause$name = cause === null || cause === void 0 ? void 0 : cause.name) !== null && _cause$name !== void 0 ? _cause$name : \"Error\", \": \").concat(causeMessage);\n if (causeCode) errorDetails += \" (\".concat(causeCode, \")\");\n if (cause === null || cause === void 0 ? void 0 : cause.stack) errorDetails += \"\\n\".concat(cause.stack);\n } else {\n var _fetchError$stack;\n errorDetails = (_fetchError$stack = fetchError === null || fetchError === void 0 ? void 0 : fetchError.stack) !== null && _fetchError$stack !== void 0 ? _fetchError$stack : \"\";\n }\n return {\n error: {\n message: \"\".concat((_fetchError$name2 = fetchError === null || fetchError === void 0 ? void 0 : fetchError.name) !== null && _fetchError$name2 !== void 0 ? _fetchError$name2 : \"FetchError\", \": \").concat(fetchError === null || fetchError === void 0 ? void 0 : fetchError.message),\n details: errorDetails,\n hint: \"\",\n code: \"\"\n },\n data: null,\n count: null,\n status: 0,\n statusText: \"\"\n };\n });\n return res.then(onfulfilled, onrejected);\n }\n /**\n\t* Override the type of the returned `data`.\n\t*\n\t* @typeParam NewResult - The new result type to override with\n\t* @deprecated Use overrideTypes<yourType, { merge: false }>() method at the end of your call chain instead\n\t*/ returns() {\n /* istanbul ignore next */ return this;\n }\n /**\n\t* Override the type of the returned `data` field in the response.\n\t*\n\t* @typeParam NewResult - The new type to cast the response data to\n\t* @typeParam Options - Optional type configuration (defaults to { merge: true })\n\t* @typeParam Options.merge - When true, merges the new type with existing return type. When false, replaces the existing types entirely (defaults to true)\n\t* @example\n\t* ```typescript\n\t* // Merge with existing types (default behavior)\n\t* const query = supabase\n\t* .from('users')\n\t* .select()\n\t* .overrideTypes<{ custom_field: string }>()\n\t*\n\t* // Replace existing types completely\n\t* const replaceQuery = supabase\n\t* .from('users')\n\t* .select()\n\t* .overrideTypes<{ id: number; name: string }, { merge: false }>()\n\t* ```\n\t* @returns A PostgrestBuilder instance with the new type\n\t*/ overrideTypes() {\n return this;\n }\n /**\n\t* Creates a builder configured for a specific PostgREST request.\n\t*\n\t* @example\n\t* ```ts\n\t* import PostgrestQueryBuilder from '@supabase/postgrest-js'\n\t*\n\t* const builder = new PostgrestQueryBuilder(\n\t* new URL('https://xyzcompany.supabase.co/rest/v1/users'),\n\t* { headers: new Headers({ apikey: 'public-anon-key' }) }\n\t* )\n\t* ```\n\t*/ constructor(builder){\n var _builder$shouldThrowO, _builder$isMaybeSingl;\n this.shouldThrowOnError = false;\n this.method = builder.method;\n this.url = builder.url;\n this.headers = new Headers(builder.headers);\n this.schema = builder.schema;\n this.body = builder.body;\n this.shouldThrowOnError = (_builder$shouldThrowO = builder.shouldThrowOnError) !== null && _builder$shouldThrowO !== void 0 ? _builder$shouldThrowO : false;\n this.signal = builder.signal;\n this.isMaybeSingle = (_builder$isMaybeSingl = builder.isMaybeSingle) !== null && _builder$isMaybeSingl !== void 0 ? _builder$isMaybeSingl : false;\n if (builder.fetch) this.fetch = builder.fetch;\n else this.fetch = fetch;\n }\n};\n//#endregion\n//#region src/PostgrestTransformBuilder.ts\nvar PostgrestTransformBuilder = class extends PostgrestBuilder {\n /**\n\t* Perform a SELECT on the query result.\n\t*\n\t* By default, `.insert()`, `.update()`, `.upsert()`, and `.delete()` do not\n\t* return modified rows. By calling this method, modified rows are returned in\n\t* `data`.\n\t*\n\t* @param columns - The columns to retrieve, separated by commas\n\t*/ select(columns) {\n let quoted = false;\n const cleanedColumns = (columns !== null && columns !== void 0 ? columns : \"*\").split(\"\").map((c)=>{\n if (/\\s/.test(c) && !quoted) return \"\";\n if (c === '\"') quoted = !quoted;\n return c;\n }).join(\"\");\n this.url.searchParams.set(\"select\", cleanedColumns);\n this.headers.append(\"Prefer\", \"return=representation\");\n return this;\n }\n /**\n\t* Order the query result by `column`.\n\t*\n\t* You can call this method multiple times to order by multiple columns.\n\t*\n\t* You can order referenced tables, but it only affects the ordering of the\n\t* parent table if you use `!inner` in the query.\n\t*\n\t* @param column - The column to order by\n\t* @param options - Named parameters\n\t* @param options.ascending - If `true`, the result will be in ascending order\n\t* @param options.nullsFirst - If `true`, `null`s appear first. If `false`,\n\t* `null`s appear last.\n\t* @param options.referencedTable - Set this to order a referenced table by\n\t* its columns\n\t* @param options.foreignTable - Deprecated, use `options.referencedTable`\n\t* instead\n\t*/ order(column) {\n let { ascending = true, nullsFirst, foreignTable, referencedTable = foreignTable } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n const key = referencedTable ? \"\".concat(referencedTable, \".order\") : \"order\";\n const existingOrder = this.url.searchParams.get(key);\n this.url.searchParams.set(key, \"\".concat(existingOrder ? \"\".concat(existingOrder, \",\") : \"\").concat(column, \".\").concat(ascending ? \"asc\" : \"desc\").concat(nullsFirst === void 0 ? \"\" : nullsFirst ? \".nullsfirst\" : \".nullslast\"));\n return this;\n }\n /**\n\t* Limit the query result by `count`.\n\t*\n\t* @param count - The maximum number of rows to return\n\t* @param options - Named parameters\n\t* @param options.referencedTable - Set this to limit rows of referenced\n\t* tables instead of the parent table\n\t* @param options.foreignTable - Deprecated, use `options.referencedTable`\n\t* instead\n\t*/ limit(count) {\n let { foreignTable, referencedTable = foreignTable } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n const key = typeof referencedTable === \"undefined\" ? \"limit\" : \"\".concat(referencedTable, \".limit\");\n this.url.searchParams.set(key, \"\".concat(count));\n return this;\n }\n /**\n\t* Limit the query result by starting at an offset `from` and ending at the offset `to`.\n\t* Only records within this range are returned.\n\t* This respects the query order and if there is no order clause the range could behave unexpectedly.\n\t* The `from` and `to` values are 0-based and inclusive: `range(1, 3)` will include the second, third\n\t* and fourth rows of the query.\n\t*\n\t* @param from - The starting index from which to limit the result\n\t* @param to - The last index to which to limit the result\n\t* @param options - Named parameters\n\t* @param options.referencedTable - Set this to limit rows of referenced\n\t* tables instead of the parent table\n\t* @param options.foreignTable - Deprecated, use `options.referencedTable`\n\t* instead\n\t*/ range(from, to) {\n let { foreignTable, referencedTable = foreignTable } = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};\n const keyOffset = typeof referencedTable === \"undefined\" ? \"offset\" : \"\".concat(referencedTable, \".offset\");\n const keyLimit = typeof referencedTable === \"undefined\" ? \"limit\" : \"\".concat(referencedTable, \".limit\");\n this.url.searchParams.set(keyOffset, \"\".concat(from));\n this.url.searchParams.set(keyLimit, \"\".concat(to - from + 1));\n return this;\n }\n /**\n\t* Set the AbortSignal for the fetch request.\n\t*\n\t* @param signal - The AbortSignal to use for the fetch request\n\t*/ abortSignal(signal) {\n this.signal = signal;\n return this;\n }\n /**\n\t* Return `data` as a single object instead of an array of objects.\n\t*\n\t* Query result must be one row (e.g. using `.limit(1)`), otherwise this\n\t* returns an error.\n\t*/ single() {\n this.headers.set(\"Accept\", \"application/vnd.pgrst.object+json\");\n return this;\n }\n /**\n\t* Return `data` as a single object instead of an array of objects.\n\t*\n\t* Query result must be zero or one row (e.g. using `.limit(1)`), otherwise\n\t* this returns an error.\n\t*/ maybeSingle() {\n if (this.method === \"GET\") this.headers.set(\"Accept\", \"application/json\");\n else this.headers.set(\"Accept\", \"application/vnd.pgrst.object+json\");\n this.isMaybeSingle = true;\n return this;\n }\n /**\n\t* Return `data` as a string in CSV format.\n\t*/ csv() {\n this.headers.set(\"Accept\", \"text/csv\");\n return this;\n }\n /**\n\t* Return `data` as an object in [GeoJSON](https://geojson.org) format.\n\t*/ geojson() {\n this.headers.set(\"Accept\", \"application/geo+json\");\n return this;\n }\n /**\n\t* Return `data` as the EXPLAIN plan for the query.\n\t*\n\t* You need to enable the\n\t* [db_plan_enabled](https://supabase.com/docs/guides/database/debugging-performance#enabling-explain)\n\t* setting before using this method.\n\t*\n\t* @param options - Named parameters\n\t*\n\t* @param options.analyze - If `true`, the query will be executed and the\n\t* actual run time will be returned\n\t*\n\t* @param options.verbose - If `true`, the query identifier will be returned\n\t* and `data` will include the output columns of the query\n\t*\n\t* @param options.settings - If `true`, include information on configuration\n\t* parameters that affect query planning\n\t*\n\t* @param options.buffers - If `true`, include information on buffer usage\n\t*\n\t* @param options.wal - If `true`, include information on WAL record generation\n\t*\n\t* @param options.format - The format of the output, can be `\"text\"` (default)\n\t* or `\"json\"`\n\t*/ explain() {\n let { analyze = false, verbose = false, settings = false, buffers = false, wal = false, format = \"text\" } = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n var _this$headers$get;\n const options = [\n analyze ? \"analyze\" : null,\n verbose ? \"verbose\" : null,\n settings ? \"settings\" : null,\n buffers ? \"buffers\" : null,\n wal ? \"wal\" : null\n ].filter(Boolean).join(\"|\");\n const forMediatype = (_this$headers$get = this.headers.get(\"Accept\")) !== null && _this$headers$get !== void 0 ? _this$headers$get : \"application/json\";\n this.headers.set(\"Accept\", \"application/vnd.pgrst.plan+\".concat(format, '; for=\"').concat(forMediatype, '\"; options=').concat(options, \";\"));\n if (format === \"json\") return this;\n else return this;\n }\n /**\n\t* Rollback the query.\n\t*\n\t* `data` will still be returned, but the query is not committed.\n\t*/ rollback() {\n this.headers.append(\"Prefer\", \"tx=rollback\");\n return this;\n }\n /**\n\t* Override the type of the returned `data`.\n\t*\n\t* @typeParam NewResult - The new result type to override with\n\t* @deprecated Use overrideTypes<yourType, { merge: false }>() method at the end of your call chain instead\n\t*/ returns() {\n return this;\n }\n /**\n\t* Set the maximum number of rows that can be affected by the query.\n\t* Only available in PostgREST v13+ and only works with PATCH and DELETE methods.\n\t*\n\t* @param value - The maximum number of rows that can be affected\n\t*/ maxAffected(value) {\n this.headers.append(\"Prefer\", \"handling=strict\");\n this.headers.append(\"Prefer\", \"max-affected=\".concat(value));\n return this;\n }\n};\n//#endregion\n//#region src/PostgrestFilterBuilder.ts\nconst PostgrestReservedCharsRegexp = /* @__PURE__ */ new RegExp(\"[,()]\");\nvar PostgrestFilterBuilder = class extends PostgrestTransformBuilder {\n /**\n\t* Match only rows where `column` is equal to `value`.\n\t*\n\t* To check if the value of `column` is NULL, you should use `.is()` instead.\n\t*\n\t* @param column - The column to filter on\n\t* @param value - The value to filter with\n\t*/ eq(column, value) {\n this.url.searchParams.append(column, \"eq.\".concat(value));\n return this;\n }\n /**\n\t* Match only rows where `column` is not equal to `value`.\n\t*\n\t* @param column - The column to filter on\n\t* @param value - The value to filter with\n\t*/ neq(column, value) {\n this.url.searchParams.append(column, \"neq.\".concat(value));\n return this;\n }\n /**\n\t* Match only rows where `column` is greater than `value`.\n\t*\n\t* @param column - The column to filter on\n\t* @param value - The value to filter with\n\t*/ gt(column, value) {\n this.url.searchParams.append(column, \"gt.\".concat(value));\n return this;\n }\n /**\n\t* Match only rows where `column` is greater than or equal to `value`.\n\t*\n\t* @param column - The column to filter on\n\t* @param value - The value to filter with\n\t*/ gte(column, value) {\n this.url.searchParams.append(column, \"gte.\".concat(value));\n return this;\n }\n /**\n\t* Match only rows where `column` is less than `value`.\n\t*\n\t* @param column - The column to filter on\n\t* @param value - The value to filter with\n\t*/ lt(column, value) {\n this.url.searchParams.append(column, \"lt.\".concat(value));\n return this;\n }\n /**\n\t* Match only rows where `column` is less than or equal to `value`.\n\t*\n\t* @param column - The column to filter on\n\t* @param value - The value to filter with\n\t*/ lte(column, value) {\n this.url.searchParams.append(column, \"lte.\".concat(value));\n return this;\n }\n /**\n\t* Match only rows where `column` matches `pattern` case-sensitively.\n\t*\n\t* @param column - The column to filter on\n\t* @param pattern - The pattern to match with\n\t*/ like(column, pattern) {\n this.url.searchParams.append(column, \"like.\".concat(pattern));\n return this;\n }\n /**\n\t* Match only rows where `column` matches all of `patterns` case-sensitively.\n\t*\n\t* @param column - The column to filter on\n\t* @param patterns - The patterns to match with\n\t*/ likeAllOf(column, patterns) {\n this.url.searchParams.append(column, \"like(all).{\".concat(patterns.join(\",\"), \"}\"));\n return this;\n }\n /**\n\t* Match only rows where `column` matches any of `patterns` case-sensitively.\n\t*\n\t* @param column - The column to filter on\n\t* @param patterns - The patterns to match with\n\t*/ likeAnyOf(column, patterns) {\n this.url.searchParams.append(column, \"like(any).{\".concat(patterns.join(\",\"), \"}\"));\n return this;\n }\n /**\n\t* Match only rows where `column` matches `pattern` case-insensitively.\n\t*\n\t* @param column - The column to filter on\n\t* @param pattern - The pattern to match with\n\t*/ ilike(column, pattern) {\n this.url.searchParams.append(column, \"ilike.\".concat(pattern));\n return this;\n }\n /**\n\t* Match only rows where `column` matches all of `patterns` case-insensitively.\n\t*\n\t* @param column - The column to filter on\n\t* @param patterns - The patterns to match with\n\t*/ ilikeAllOf(column, patterns) {\n this.url.searchParams.append(column, \"ilike(all).{\".concat(patterns.join(\",\"), \"}\"));\n return this;\n }\n /**\n\t* Match only rows where `column` matches any of `patterns` case-insensitively.\n\t*\n\t* @param column - The column to filter on\n\t* @param patterns - The patterns to match with\n\t*/ ilikeAnyOf(column, patterns) {\n this.url.searchParams.append(column, \"ilike(any).{\".concat(patterns.join(\",\"), \"}\"));\n return this;\n }\n /**\n\t* Match only rows where `column` matches the PostgreSQL regex `pattern`\n\t* case-sensitively (using the `~` operator).\n\t*\n\t* @param column - The column to filter on\n\t* @param pattern - The PostgreSQL regular expression pattern to match with\n\t*/ regexMatch(column, pattern) {\n this.url.searchParams.append(column, \"match.\".concat(pattern));\n return this;\n }\n /**\n\t* Match only rows where `column` matches the PostgreSQL regex `pattern`\n\t* case-insensitively (using the `~*` operator).\n\t*\n\t* @param column - The column to filter on\n\t* @param pattern - The PostgreSQL regular expression pattern to match with\n\t*/ regexIMatch(column, pattern) {\n this.url.searchParams.append(column, \"imatch.\".concat(pattern));\n return this;\n }\n /**\n\t* Match only rows where `column` IS `value`.\n\t*\n\t* For non-boolean columns, this is only relevant for checking if the value of\n\t* `column` is NULL by setting `value` to `null`.\n\t*\n\t* For boolean columns, you can also set `value` to `true` or `false` and it\n\t* will behave the same way as `.eq()`.\n\t*\n\t* @param column - The column to filter on\n\t* @param value - The value to filter with\n\t*/ is(column, value) {\n this.url.searchParams.append(column, \"is.\".concat(value));\n return this;\n }\n /**\n\t* Match only rows where `column` IS DISTINCT FROM `value`.\n\t*\n\t* Unlike `.neq()`, this treats `NULL` as a comparable value. Two `NULL` values\n\t* are considered equal (not distinct), and comparing `NULL` with any non-NULL\n\t* value returns true (distinct).\n\t*\n\t* @param column - The column to filter on\n\t* @param value - The value to filter with\n\t*/ isDistinct(column, value) {\n this.url.searchParams.append(column, \"isdistinct.\".concat(value));\n return this;\n }\n /**\n\t* Match only rows where `column` is included in the `values` array.\n\t*\n\t* @param column - The column to filter on\n\t* @param values - The values array to filter with\n\t*/ in(column, values) {\n const cleanedValues = Array.from(new Set(values)).map((s)=>{\n if (typeof s === \"string\" && PostgrestReservedCharsRegexp.test(s)) return '\"'.concat(s, '\"');\n else return \"\".concat(s);\n }).join(\",\");\n this.url.searchParams.append(column, \"in.(\".concat(cleanedValues, \")\"));\n return this;\n }\n /**\n\t* Match only rows where `column` is NOT included in the `values` array.\n\t*\n\t* @param column - The column to filter on\n\t* @param values - The values array to filter with\n\t*/ notIn(column, values) {\n const cleanedValues = Array.from(new Set(values)).map((s)=>{\n if (typeof s === \"string\" && PostgrestReservedCharsRegexp.test(s)) return '\"'.concat(s, '\"');\n else return \"\".concat(s);\n }).join(\",\");\n this.url.searchParams.append(column, \"not.in.(\".concat(cleanedValues, \")\"));\n return this;\n }\n /**\n\t* Only relevant for jsonb, array, and range columns. Match only rows where\n\t* `column` contains every element appearing in `value`.\n\t*\n\t* @param column - The jsonb, array, or range column to filter on\n\t* @param value - The jsonb, array, or range value to filter with\n\t*/ contains(column, value) {\n if (typeof value === \"string\") this.url.searchParams.append(column, \"cs.\".concat(value));\n else if (Array.isArray(value)) this.url.searchParams.append(column, \"cs.{\".concat(value.join(\",\"), \"}\"));\n else this.url.searchParams.append(column, \"cs.\".concat(JSON.stringify(value)));\n return this;\n }\n /**\n\t* Only relevant for jsonb, array, and range columns. Match only rows where\n\t* every element appearing in `column` is contained by `value`.\n\t*\n\t* @param column - The jsonb, array, or range column to filter on\n\t* @param value - The jsonb, array, or range value to filter with\n\t*/ containedBy(column, value) {\n if (typeof value === \"string\") this.url.searchParams.append(column, \"cd.\".concat(value));\n else if (Array.isArray(value)) this.url.searchParams.append(column, \"cd.{\".concat(value.join(\",\"), \"}\"));\n else this.url.searchParams.append(column, \"cd.\".concat(JSON.stringify(value)));\n return this;\n }\n /**\n\t* Only relevant for range columns. Match only rows where every element in\n\t* `column` is greater than any element in `range`.\n\t*\n\t* @param column - The range column to filter on\n\t* @param range - The range to filter with\n\t*/ rangeGt(column, range) {\n this.url.searchParams.append(column, \"sr.\".concat(range));\n return this;\n }\n /**\n\t* Only relevant for range columns. Match only rows where every element in\n\t* `column` is either contained in `range` or greater than any element in\n\t* `range`.\n\t*\n\t* @param column - The range column to filter on\n\t* @param range - The range to filter with\n\t*/ rangeGte(column, range) {\n this.url.searchParams.append(column, \"nxl.\".concat(range));\n return this;\n }\n /**\n\t* Only relevant for range columns. Match only rows where every element in\n\t* `column` is less than any element in `range`.\n\t*\n\t* @param column - The range column to filter on\n\t* @param range - The range to filter with\n\t*/ rangeLt(column, range) {\n this.url.searchParams.append(column, \"sl.\".concat(range));\n return this;\n }\n /**\n\t* Only relevant for range columns. Match only rows where every element in\n\t* `column` is either contained in `range` or less than any element in\n\t* `range`.\n\t*\n\t* @param column - The range column to filter on\n\t* @param range - The range to filter with\n\t*/ rangeLte(column, range) {\n this.url.searchParams.append(column, \"nxr.\".concat(range));\n return this;\n }\n /**\n\t* Only relevant for range columns. Match only rows where `column` is\n\t* mutually exclusive to `range` and there can be no element between the two\n\t* ranges.\n\t*\n\t* @param column - The range column to filter on\n\t* @param range - The range to filter with\n\t*/ rangeAdjacent(column, range) {\n this.url.searchParams.append(column, \"adj.\".concat(range));\n return this;\n }\n /**\n\t* Only relevant for array and range columns. Match only rows where\n\t* `column` and `value` have an element in common.\n\t*\n\t* @param column - The array or range column to filter on\n\t* @param value - The array or range value to filter with\n\t*/ overlaps(column, value) {\n if (typeof value === \"string\") this.url.searchParams.append(column, \"ov.\".concat(value));\n else this.url.searchParams.append(column, \"ov.{\".concat(value.join(\",\"), \"}\"));\n return this;\n }\n /**\n\t* Only relevant for text and tsvector columns. Match only rows where\n\t* `column` matches the query string in `query`.\n\t*\n\t* @param column - The text or tsvector column to filter on\n\t* @param query - The query text to match with\n\t* @param options - Named parameters\n\t* @param options.config - The text search configuration to use\n\t* @param options.type - Change how the `query` text is interpreted\n\t*/ textSearch(column, query) {\n let { config, type } = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};\n let typePart = \"\";\n if (type === \"plain\") typePart = \"pl\";\n else if (type === \"phrase\") typePart = \"ph\";\n else if (type === \"websearch\") typePart = \"w\";\n const configPart = config === void 0 ? \"\" : \"(\".concat(config, \")\");\n this.url.searchParams.append(column, \"\".concat(typePart, \"fts\").concat(configPart, \".\").concat(query));\n return this;\n }\n /**\n\t* Match only rows where each column in `query` keys is equal to its\n\t* associated value. Shorthand for multiple `.eq()`s.\n\t*\n\t* @param query - The object to filter with, with column names as keys mapped\n\t* to their filter values\n\t*/ match(query) {\n Object.entries(query).forEach((param)=>{\n let [column, value] = param;\n this.url.searchParams.append(column, \"eq.\".concat(value));\n });\n return this;\n }\n /**\n\t* Match only rows which doesn't satisfy the filter.\n\t*\n\t* Unlike most filters, `opearator` and `value` are used as-is and need to\n\t* follow [PostgREST\n\t* syntax](https://postgrest.org/en/stable/api.html#operators). You also need\n\t* to make sure they are properly sanitized.\n\t*\n\t* @param column - The column to filter on\n\t* @param operator - The operator to be negated to filter with, following\n\t* PostgREST syntax\n\t* @param value - The value to filter with, following PostgREST syntax\n\t*/ not(column, operator, value) {\n this.url.searchParams.append(column, \"not.\".concat(operator, \".\").concat(value));\n return this;\n }\n /**\n\t* Match only rows which satisfy at least one of the filters.\n\t*\n\t* Unlike most filters, `filters` is used as-is and needs to follow [PostgREST\n\t* syntax](https://postgrest.org/en/stable/api.html#operators). You also need\n\t* to make sure it's properly sanitized.\n\t*\n\t* It's currently not possible to do an `.or()` filter across multiple tables.\n\t*\n\t* @param filters - The filters to use, following PostgREST syntax\n\t* @param options - Named parameters\n\t* @param options.referencedTable - Set this to filter on referenced tables\n\t* instead of the parent table\n\t* @param options.foreignTable - Deprecated, use `referencedTable` instead\n\t*/ or(filters) {\n let { foreignTable, referencedTable = foreignTable } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n const key = referencedTable ? \"\".concat(referencedTable, \".or\") : \"or\";\n this.url.searchParams.append(key, \"(\".concat(filters, \")\"));\n return this;\n }\n /**\n\t* Match only rows which satisfy the filter. This is an escape hatch - you\n\t* should use the specific filter methods wherever possible.\n\t*\n\t* Unlike most filters, `opearator` and `value` are used as-is and need to\n\t* follow [PostgREST\n\t* syntax](https://postgrest.org/en/stable/api.html#operators). You also need\n\t* to make sure they are properly sanitized.\n\t*\n\t* @param column - The column to filter on\n\t* @param operator - The operator to filter with, following PostgREST syntax\n\t* @param value - The value to filter with, following PostgREST syntax\n\t*/ filter(column, operator, value) {\n this.url.searchParams.append(column, \"\".concat(operator, \".\").concat(value));\n return this;\n }\n};\n//#endregion\n//#region src/PostgrestQueryBuilder.ts\nvar PostgrestQueryBuilder = class {\n /**\n\t* Perform a SELECT query on the table or view.\n\t*\n\t* @param columns - The columns to retrieve, separated by commas. Columns can be renamed when returned with `customName:columnName`\n\t*\n\t* @param options - Named parameters\n\t*\n\t* @param options.head - When set to `true`, `data` will not be returned.\n\t* Useful if you only need the count.\n\t*\n\t* @param options.count - Count algorithm to use to count rows in the table or view.\n\t*\n\t* `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n\t* hood.\n\t*\n\t* `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n\t* statistics under the hood.\n\t*\n\t* `\"estimated\"`: Uses exact count for low numbers and planned count for high\n\t* numbers.\n\t*/ select(columns, options) {\n const { head = false, count } = options !== null && options !== void 0 ? options : {};\n const method = head ? \"HEAD\" : \"GET\";\n let quoted = false;\n const cleanedColumns = (columns !== null && columns !== void 0 ? columns : \"*\").split(\"\").map((c)=>{\n if (/\\s/.test(c) && !quoted) return \"\";\n if (c === '\"') quoted = !quoted;\n return c;\n }).join(\"\");\n this.url.searchParams.set(\"select\", cleanedColumns);\n if (count) this.headers.append(\"Prefer\", \"count=\".concat(count));\n return new PostgrestFilterBuilder({\n method,\n url: this.url,\n headers: this.headers,\n schema: this.schema,\n fetch: this.fetch\n });\n }\n /**\n\t* Perform an INSERT into the table or view.\n\t*\n\t* By default, inserted rows are not returned. To return it, chain the call\n\t* with `.select()`.\n\t*\n\t* @param values - The values to insert. Pass an object to insert a single row\n\t* or an array to insert multiple rows.\n\t*\n\t* @param options - Named parameters\n\t*\n\t* @param options.count - Count algorithm to use to count inserted rows.\n\t*\n\t* `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n\t* hood.\n\t*\n\t* `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n\t* statistics under the hood.\n\t*\n\t* `\"estimated\"`: Uses exact count for low numbers and planned count for high\n\t* numbers.\n\t*\n\t* @param options.defaultToNull - Make missing fields default to `null`.\n\t* Otherwise, use the default value for the column. Only applies for bulk\n\t* inserts.\n\t*/ insert(values) {\n let { count, defaultToNull = true } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n var _this$fetch;\n const method = \"POST\";\n if (count) this.headers.append(\"Prefer\", \"count=\".concat(count));\n if (!defaultToNull) this.headers.append(\"Prefer\", \"missing=default\");\n if (Array.isArray(values)) {\n const columns = values.reduce((acc, x)=>acc.concat(Object.keys(x)), []);\n if (columns.length > 0) {\n const uniqueColumns = [\n ...new Set(columns)\n ].map((column)=>'\"'.concat(column, '\"'));\n this.url.searchParams.set(\"columns\", uniqueColumns.join(\",\"));\n }\n }\n return new PostgrestFilterBuilder({\n method,\n url: this.url,\n headers: this.headers,\n schema: this.schema,\n body: values,\n fetch: (_this$fetch = this.fetch) !== null && _this$fetch !== void 0 ? _this$fetch : fetch\n });\n }\n /**\n\t* Perform an UPSERT on the table or view. Depending on the column(s) passed\n\t* to `onConflict`, `.upsert()` allows you to perform the equivalent of\n\t* `.insert()` if a row with the corresponding `onConflict` columns doesn't\n\t* exist, or if it does exist, perform an alternative action depending on\n\t* `ignoreDuplicates`.\n\t*\n\t* By default, upserted rows are not returned. To return it, chain the call\n\t* with `.select()`.\n\t*\n\t* @param values - The values to upsert with. Pass an object to upsert a\n\t* single row or an array to upsert multiple rows.\n\t*\n\t* @param options - Named parameters\n\t*\n\t* @param options.onConflict - Comma-separated UNIQUE column(s) to specify how\n\t* duplicate rows are determined. Two rows are duplicates if all the\n\t* `onConflict` columns are equal.\n\t*\n\t* @param options.ignoreDuplicates - If `true`, duplicate rows are ignored. If\n\t* `false`, duplicate rows are merged with existing rows.\n\t*\n\t* @param options.count - Count algorithm to use to count upserted rows.\n\t*\n\t* `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n\t* hood.\n\t*\n\t* `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n\t* statistics under the hood.\n\t*\n\t* `\"estimated\"`: Uses exact count for low numbers and planned count for high\n\t* numbers.\n\t*\n\t* @param options.defaultToNull - Make missing fields default to `null`.\n\t* Otherwise, use the default value for the column. This only applies when\n\t* inserting new rows, not when merging with existing rows under\n\t* `ignoreDuplicates: false`. This also only applies when doing bulk upserts.\n\t*\n\t* @example Upsert a single row using a unique key\n\t* ```ts\n\t* // Upserting a single row, overwriting based on the 'username' unique column\n\t* const { data, error } = await supabase\n\t* .from('users')\n\t* .upsert({ username: 'supabot' }, { onConflict: 'username' })\n\t*\n\t* // Example response:\n\t* // {\n\t* // data: [\n\t* // { id: 4, message: 'bar', username: 'supabot' }\n\t* // ],\n\t* // error: null\n\t* // }\n\t* ```\n\t*\n\t* @example Upsert with conflict resolution and exact row counting\n\t* ```ts\n\t* // Upserting and returning exact count\n\t* const { data, error, count } = await supabase\n\t* .from('users')\n\t* .upsert(\n\t* {\n\t* id: 3,\n\t* message: 'foo',\n\t* username: 'supabot'\n\t* },\n\t* {\n\t* onConflict: 'username',\n\t* count: 'exact'\n\t* }\n\t* )\n\t*\n\t* // Example response:\n\t* // {\n\t* // data: [\n\t* // {\n\t* // id: 42,\n\t* // handle: \"saoirse\",\n\t* // display_name: \"Saoirse\"\n\t* // }\n\t* // ],\n\t* // count: 1,\n\t* // error: null\n\t* // }\n\t* ```\n\t*/ upsert(values) {\n let { onConflict, ignoreDuplicates = false, count, defaultToNull = true } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n var _this$fetch2;\n const method = \"POST\";\n this.headers.append(\"Prefer\", \"resolution=\".concat(ignoreDuplicates ? \"ignore\" : \"merge\", \"-duplicates\"));\n if (onConflict !== void 0) this.url.searchParams.set(\"on_conflict\", onConflict);\n if (count) this.headers.append(\"Prefer\", \"count=\".concat(count));\n if (!defaultToNull) this.headers.append(\"Prefer\", \"missing=default\");\n if (Array.isArray(values)) {\n const columns = values.reduce((acc, x)=>acc.concat(Object.keys(x)), []);\n if (columns.length > 0) {\n const uniqueColumns = [\n ...new Set(columns)\n ].map((column)=>'\"'.concat(column, '\"'));\n this.url.searchParams.set(\"columns\", uniqueColumns.join(\",\"));\n }\n }\n return new PostgrestFilterBuilder({\n method,\n url: this.url,\n headers: this.headers,\n schema: this.schema,\n body: values,\n fetch: (_this$fetch2 = this.fetch) !== null && _this$fetch2 !== void 0 ? _this$fetch2 : fetch\n });\n }\n /**\n\t* Perform an UPDATE on the table or view.\n\t*\n\t* By default, updated rows are not returned. To return it, chain the call\n\t* with `.select()` after filters.\n\t*\n\t* @param values - The values to update with\n\t*\n\t* @param options - Named parameters\n\t*\n\t* @param options.count - Count algorithm to use to count updated rows.\n\t*\n\t* `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n\t* hood.\n\t*\n\t* `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n\t* statistics under the hood.\n\t*\n\t* `\"estimated\"`: Uses exact count for low numbers and planned count for high\n\t* numbers.\n\t*/ update(values) {\n let { count } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n var _this$fetch3;\n const method = \"PATCH\";\n if (count) this.headers.append(\"Prefer\", \"count=\".concat(count));\n return new PostgrestFilterBuilder({\n method,\n url: this.url,\n headers: this.headers,\n schema: this.schema,\n body: values,\n fetch: (_this$fetch3 = this.fetch) !== null && _this$fetch3 !== void 0 ? _this$fetch3 : fetch\n });\n }\n /**\n\t* Perform a DELETE on the table or view.\n\t*\n\t* By default, deleted rows are not returned. To return it, chain the call\n\t* with `.select()` after filters.\n\t*\n\t* @param options - Named parameters\n\t*\n\t* @param options.count - Count algorithm to use to count deleted rows.\n\t*\n\t* `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n\t* hood.\n\t*\n\t* `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n\t* statistics under the hood.\n\t*\n\t* `\"estimated\"`: Uses exact count for low numbers and planned count for high\n\t* numbers.\n\t*/ delete() {\n let { count } = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n var _this$fetch4;\n const method = \"DELETE\";\n if (count) this.headers.append(\"Prefer\", \"count=\".concat(count));\n return new PostgrestFilterBuilder({\n method,\n url: this.url,\n headers: this.headers,\n schema: this.schema,\n fetch: (_this$fetch4 = this.fetch) !== null && _this$fetch4 !== void 0 ? _this$fetch4 : fetch\n });\n }\n /**\n\t* Creates a query builder scoped to a Postgres table or view.\n\t*\n\t* @example\n\t* ```ts\n\t* import PostgrestQueryBuilder from '@supabase/postgrest-js'\n\t*\n\t* const query = new PostgrestQueryBuilder(\n\t* new URL('https://xyzcompany.supabase.co/rest/v1/users'),\n\t* { headers: { apikey: 'public-anon-key' } }\n\t* )\n\t* ```\n\t*/ constructor(url, { headers = {}, schema, fetch: fetch$1 }){\n this.url = url;\n this.headers = new Headers(headers);\n this.schema = schema;\n this.fetch = fetch$1;\n }\n};\n//#endregion\n//#region src/PostgrestClient.ts\n/**\n* PostgREST client.\n*\n* @typeParam Database - Types for the schema from the [type\n* generator](https://supabase.com/docs/reference/javascript/next/typescript-support)\n*\n* @typeParam SchemaName - Postgres schema to switch to. Must be a string\n* literal, the same one passed to the constructor. If the schema is not\n* `\"public\"`, this must be supplied manually.\n*/ var PostgrestClient = class PostgrestClient {\n /**\n\t* Perform a query on a table or a view.\n\t*\n\t* @param relation - The table or view name to query\n\t*/ from(relation) {\n if (!relation || typeof relation !== \"string\" || relation.trim() === \"\") throw new Error(\"Invalid relation name: relation must be a non-empty string.\");\n return new PostgrestQueryBuilder(new URL(\"\".concat(this.url, \"/\").concat(relation)), {\n headers: new Headers(this.headers),\n schema: this.schemaName,\n fetch: this.fetch\n });\n }\n /**\n\t* Select a schema to query or perform an function (rpc) call.\n\t*\n\t* The schema needs to be on the list of exposed schemas inside Supabase.\n\t*\n\t* @param schema - The schema to query\n\t*/ schema(schema) {\n return new PostgrestClient(this.url, {\n headers: this.headers,\n schema,\n fetch: this.fetch\n });\n }\n /**\n\t* Perform a function call.\n\t*\n\t* @param fn - The function name to call\n\t* @param args - The arguments to pass to the function call\n\t* @param options - Named parameters\n\t* @param options.head - When set to `true`, `data` will not be returned.\n\t* Useful if you only need the count.\n\t* @param options.get - When set to `true`, the function will be called with\n\t* read-only access mode.\n\t* @param options.count - Count algorithm to use to count rows returned by the\n\t* function. Only applicable for [set-returning\n\t* functions](https://www.postgresql.org/docs/current/functions-srf.html).\n\t*\n\t* `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n\t* hood.\n\t*\n\t* `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n\t* statistics under the hood.\n\t*\n\t* `\"estimated\"`: Uses exact count for low numbers and planned count for high\n\t* numbers.\n\t*\n\t* @example\n\t* ```ts\n\t* // For cross-schema functions where type inference fails, use overrideTypes:\n\t* const { data } = await supabase\n\t* .schema('schema_b')\n\t* .rpc('function_a', {})\n\t* .overrideTypes<{ id: string; user_id: string }[]>()\n\t* ```\n\t*/ rpc(fn) {\n let args = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, { head = false, get = false, count } = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};\n var _this$fetch;\n let method;\n const url = new URL(\"\".concat(this.url, \"/rpc/\").concat(fn));\n let body;\n if (head || get) {\n method = head ? \"HEAD\" : \"GET\";\n Object.entries(args).filter((param)=>{\n let [_, value] = param;\n return value !== void 0;\n }).map((param)=>{\n let [name, value] = param;\n return [\n name,\n Array.isArray(value) ? \"{\".concat(value.join(\",\"), \"}\") : \"\".concat(value)\n ];\n }).forEach((param)=>{\n let [name, value] = param;\n url.searchParams.append(name, value);\n });\n } else {\n method = \"POST\";\n body = args;\n }\n const headers = new Headers(this.headers);\n if (count) headers.set(\"Prefer\", \"count=\".concat(count));\n return new PostgrestFilterBuilder({\n method,\n url,\n headers,\n schema: this.schemaName,\n body,\n fetch: (_this$fetch = this.fetch) !== null && _this$fetch !== void 0 ? _this$fetch : fetch\n });\n }\n /**\n\t* Creates a PostgREST client.\n\t*\n\t* @param url - URL of the PostgREST endpoint\n\t* @param options - Named parameters\n\t* @param options.headers - Custom headers\n\t* @param options.schema - Postgres schema to switch to\n\t* @param options.fetch - Custom fetch\n\t* @example\n\t* ```ts\n\t* import PostgrestClient from '@supabase/postgrest-js'\n\t*\n\t* const postgrest = new PostgrestClient('https://xyzcompany.supabase.co/rest/v1', {\n\t* headers: { apikey: 'public-anon-key' },\n\t* schema: 'public',\n\t* })\n\t* ```\n\t*/ constructor(url, { headers = {}, schema, fetch: fetch$1 } = {}){\n this.url = url;\n this.headers = new Headers(headers);\n this.schemaName = schema;\n this.fetch = fetch$1;\n }\n};\n//#endregion\n//#region src/index.ts\nvar src_default = {\n PostgrestClient,\n PostgrestQueryBuilder,\n PostgrestFilterBuilder,\n PostgrestTransformBuilder,\n PostgrestBuilder,\n PostgrestError\n};\n//#endregion\n //# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcG9zdGdyZXN0LWpzL2Rpc3QvaW5kZXgubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0I7Ozs7QUFJQSxHQUNBLElBQUlBLGlCQUFpQixjQUFjQztJQUNsQzs7Ozs7Ozs7Ozs7O0NBWUEsR0FDQUMsWUFBWUMsT0FBTyxDQUFFO1FBQ3BCLEtBQUssQ0FBQ0EsUUFBUUMsT0FBTztRQUNyQixJQUFJLENBQUNDLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ0MsT0FBTyxHQUFHSCxRQUFRRyxPQUFPO1FBQzlCLElBQUksQ0FBQ0MsSUFBSSxHQUFHSixRQUFRSSxJQUFJO1FBQ3hCLElBQUksQ0FBQ0MsSUFBSSxHQUFHTCxRQUFRSyxJQUFJO0lBQ3pCO0FBQ0Q7QUFFQSxZQUFZO0FBQ1osaUNBQWlDO0FBQ2pDLElBQUlDLG1CQUFtQjtJQTRCdEI7Ozs7O0NBS0EsR0FDQUMsZUFBZTtRQUNkLElBQUksQ0FBQ0Msa0JBQWtCLEdBQUc7UUFDMUIsT0FBTyxJQUFJO0lBQ1o7SUFDQTs7Q0FFQSxHQUNBQyxVQUFVUCxJQUFJLEVBQUVRLEtBQUssRUFBRTtRQUN0QixJQUFJLENBQUNDLE9BQU8sR0FBRyxJQUFJQyxRQUFRLElBQUksQ0FBQ0QsT0FBTztRQUN2QyxJQUFJLENBQUNBLE9BQU8sQ0FBQ0UsR0FBRyxDQUFDWCxNQUFNUTtRQUN2QixPQUFPLElBQUk7SUFDWjtJQUNBSSxLQUFLQyxXQUFXLEVBQUVDLFVBQVUsRUFBRTtRQUM3QixJQUFJQyxRQUFRLElBQUk7UUFDaEIsSUFBSSxJQUFJLENBQUNDLE1BQU0sS0FBSyxLQUFLLEdBQUcsQ0FBQyxPQUFPLElBQUk7WUFBQztZQUFPO1NBQU8sQ0FBQ0MsUUFBUSxDQUFDLElBQUksQ0FBQ0MsTUFBTSxHQUFHLElBQUksQ0FBQ1QsT0FBTyxDQUFDRSxHQUFHLENBQUMsa0JBQWtCLElBQUksQ0FBQ0ssTUFBTTthQUN4SCxJ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SztJQUNkO0FBcUZEO0FBRUEsWUFBWTtBQUNaLHNCQUFzQjtBQUN0QixJQUFJVSxjQUFjO0lBQ2pCVDtJQUNBcEI7SUFDQTlDO0lBQ0E3QztJQUNBbEU7SUFDQVQ7QUFDRDtBQUVBLFlBQVk7QUFDbUosQ0FDL0osa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcG9zdGdyZXN0LWpzL2Rpc3QvaW5kZXgubWpzPzdhYzMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8jcmVnaW9uIHNyYy9Qb3N0Z3Jlc3RFcnJvci50c1xuLyoqXG4qIEVycm9yIGZvcm1hdFxuKlxuKiB7QGxpbmsgaHR0cHM6Ly9wb3N0Z3Jlc3Qub3JnL2VuL3N0YWJsZS9hcGkuaHRtbD9oaWdobGlnaHQ9b3B0aW9ucyNlcnJvcnMtYW5kLWh0dHAtc3RhdHVzLWNvZGVzfVxuKi9cbnZhciBQb3N0Z3Jlc3RFcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xuXHQvKipcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHRzXG5cdCogaW1wb3J0IFBvc3RncmVzdEVycm9yIGZyb20gJ0BzdXBhYmFzZS9wb3N0Z3Jlc3QtanMnXG5cdCpcblx0KiB0aHJvdyBuZXcgUG9zdGdyZXN0RXJyb3Ioe1xuXHQqICAgbWVzc2FnZTogJ1JvdyBsZXZlbCBzZWN1cml0eSBwcmV2ZW50ZWQgdGhlIHJlcXVlc3QnLFxuXHQqICAgZGV0YWlsczogJ1JMUyBkZW5pZWQgdGhlIGluc2VydCcsXG5cdCogICBoaW50OiAnQ2hlY2sgeW91ciBwb2xpY2llcycsXG5cdCogICBjb2RlOiAnUEdSU1QzMDEnLFxuXHQqIH0pXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcblx0XHRzdXBlcihjb250ZXh0Lm1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IFwiUG9zdGdyZXN0RXJyb3JcIjtcblx0XHR0aGlzLmRldGFpbHMgPSBjb250ZXh0LmRldGFpbHM7XG5cdFx0dGhpcy5oaW50ID0gY29udGV4dC5oaW50O1xuXHRcdHRoaXMuY29kZSA9IGNvbnRleHQuY29kZTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1Bvc3RncmVzdEJ1aWxkZXIudHNcbnZhciBQb3N0Z3Jlc3RCdWlsZGVyID0gY2xhc3Mge1xuXHQvKipcblx0KiBDcmVhdGVzIGEgYnVpbGRlciBjb25maWd1cmVkIGZvciBhIHNwZWNpZmljIFBvc3RnUkVTVCByZXF1ZXN0LlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0c1xuXHQqIGltcG9ydCBQb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIgZnJvbSAnQHN1cGFiYXNlL3Bvc3RncmVzdC1qcydcblx0KlxuXHQqIGNvbnN0IGJ1aWxkZXIgPSBuZXcgUG9zdGdyZXN0UXVlcnlCdWlsZGVyKFxuXHQqICAgbmV3IFVSTCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL3Jlc3QvdjEvdXNlcnMnKSxcblx0KiAgIHsgaGVhZGVyczogbmV3IEhlYWRlcnMoeyBhcGlrZXk6ICdwdWJsaWMtYW5vbi1rZXknIH0pIH1cblx0KiApXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKGJ1aWxkZXIpIHtcblx0XHR2YXIgX2J1aWxkZXIkc2hvdWxkVGhyb3dPLCBfYnVpbGRlciRpc01heWJlU2luZ2w7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSBmYWxzZTtcblx0XHR0aGlzLm1ldGhvZCA9IGJ1aWxkZXIubWV0aG9kO1xuXHRcdHRoaXMudXJsID0gYnVpbGRlci51cmw7XG5cdFx0dGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoYnVpbGRlci5oZWFkZXJzKTtcblx0XHR0aGlzLnNjaGVtYSA9IGJ1aWxkZXIuc2NoZW1hO1xuXHRcdHRoaXMuYm9keSA9IGJ1aWxkZXIuYm9keTtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IChfYnVpbGRlciRzaG91bGRUaHJvd08gPSBidWlsZGVyLnNob3VsZFRocm93T25FcnJvcikgIT09IG51bGwgJiYgX2J1aWxkZXIkc2hvdWxkVGhyb3dPICE9PSB2b2lkIDAgPyBfYnVpbGRlciRzaG91bGRUaHJvd08gOiBmYWxzZTtcblx0XHR0aGlzLnNpZ25hbCA9IGJ1aWxkZXIuc2lnbmFsO1xuXHRcdHRoaXMuaXNNYXliZVNpbmdsZSA9IChfYnVpbGRlciRpc01heWJlU2luZ2wgPSBidWlsZGVyLmlzTWF5YmVTaW5nbGUpICE9PSBudWxsICYmIF9idWlsZGVyJGlzTWF5YmVTaW5nbCAhPT0gdm9pZCAwID8gX2J1aWxkZXIkaXNNYXliZVNpbmdsIDogZmFsc2U7XG5cdFx0aWYgKGJ1aWxkZXIuZmV0Y2gpIHRoaXMuZmV0Y2ggPSBidWlsZGVyLmZldGNoO1xuXHRcdGVsc2UgdGhpcy5mZXRjaCA9IGZldGNoO1xuXHR9XG5cdC8qKlxuXHQqIElmIHRoZXJlJ3MgYW4gZXJyb3Igd2l0aCB0aGUgcXVlcnksIHRocm93T25FcnJvciB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZSBieVxuXHQqIHRocm93aW5nIHRoZSBlcnJvciBpbnN0ZWFkIG9mIHJldHVybmluZyBpdCBhcyBwYXJ0IG9mIGEgc3VjY2Vzc2Z1bCByZXNwb25zZS5cblx0KlxuXHQqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc3VwYWJhc2Uvc3VwYWJhc2UtanMvaXNzdWVzLzkyfVxuXHQqL1xuXHR0aHJvd09uRXJyb3IoKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSB0cnVlO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIFNldCBhbiBIVFRQIGhlYWRlciBmb3IgdGhlIHJlcXVlc3QuXG5cdCovXG5cdHNldEhlYWRlcihuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyk7XG5cdFx0dGhpcy5oZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0dGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuXHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cdFx0aWYgKHRoaXMuc2NoZW1hID09PSB2b2lkIDApIHt9IGVsc2UgaWYgKFtcIkdFVFwiLCBcIkhFQURcIl0uaW5jbHVkZXModGhpcy5tZXRob2QpKSB0aGlzLmhlYWRlcnMuc2V0KFwiQWNjZXB0LVByb2ZpbGVcIiwgdGhpcy5zY2hlbWEpO1xuXHRcdGVsc2UgdGhpcy5oZWFkZXJzLnNldChcIkNvbnRlbnQtUHJvZmlsZVwiLCB0aGlzLnNjaGVtYSk7XG5cdFx0aWYgKHRoaXMubWV0aG9kICE9PSBcIkdFVFwiICYmIHRoaXMubWV0aG9kICE9PSBcIkhFQURcIikgdGhpcy5oZWFkZXJzLnNldChcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cdFx0Y29uc3QgX2ZldGNoID0gdGhpcy5mZXRjaDtcblx0XHRsZXQgcmVzID0gX2ZldGNoKHRoaXMudXJsLnRvU3RyaW5nKCksIHtcblx0XHRcdG1ldGhvZDogdGhpcy5tZXRob2QsXG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh0aGlzLmJvZHkpLFxuXHRcdFx0c2lnbmFsOiB0aGlzLnNpZ25hbFxuXHRcdH0pLnRoZW4oYXN5bmMgKHJlcyQxKSA9PiB7XG5cdFx0XHRsZXQgZXJyb3IgPSBudWxsO1xuXHRcdFx0bGV0IGRhdGEgPSBudWxsO1xuXHRcdFx0bGV0IGNvdW50ID0gbnVsbDtcblx0XHRcdGxldCBzdGF0dXMgPSByZXMkMS5zdGF0dXM7XG5cdFx0XHRsZXQgc3RhdHVzVGV4dCA9IHJlcyQxLnN0YXR1c1RleHQ7XG5cdFx0XHRpZiAocmVzJDEub2spIHtcblx0XHRcdFx0dmFyIF90aGlzJGhlYWRlcnMkZ2V0MiwgX3JlcyRoZWFkZXJzJGdldDtcblx0XHRcdFx0aWYgKF90aGlzLm1ldGhvZCAhPT0gXCJIRUFEXCIpIHtcblx0XHRcdFx0XHR2YXIgX3RoaXMkaGVhZGVycyRnZXQ7XG5cdFx0XHRcdFx0Y29uc3QgYm9keSA9IGF3YWl0IHJlcyQxLnRleHQoKTtcblx0XHRcdFx0XHRpZiAoYm9keSA9PT0gXCJcIikge30gZWxzZSBpZiAoX3RoaXMuaGVhZGVycy5nZXQoXCJBY2NlcHRcIikgPT09IFwidGV4dC9jc3ZcIikgZGF0YSA9IGJvZHk7XG5cdFx0XHRcdFx0ZWxzZSBpZiAoX3RoaXMuaGVhZGVycy5nZXQoXCJBY2NlcHRcIikgJiYgKChfdGhpcyRoZWFkZXJzJGdldCA9IF90aGlzLmhlYWRlcnMuZ2V0KFwiQWNjZXB0XCIpKSA9PT0gbnVsbCB8fCBfdGhpcyRoZWFkZXJzJGdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkaGVhZGVycyRnZXQuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi92bmQucGdyc3QucGxhbit0ZXh0XCIpKSkgZGF0YSA9IGJvZHk7XG5cdFx0XHRcdFx0ZWxzZSBkYXRhID0gSlNPTi5wYXJzZShib2R5KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBjb3VudEhlYWRlciA9IChfdGhpcyRoZWFkZXJzJGdldDIgPSBfdGhpcy5oZWFkZXJzLmdldChcIlByZWZlclwiKSkgPT09IG51bGwgfHwgX3RoaXMkaGVhZGVycyRnZXQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRoZWFkZXJzJGdldDIubWF0Y2goL2NvdW50PShleGFjdHxwbGFubmVkfGVzdGltYXRlZCkvKTtcblx0XHRcdFx0Y29uc3QgY29udGVudFJhbmdlID0gKF9yZXMkaGVhZGVycyRnZXQgPSByZXMkMS5oZWFkZXJzLmdldChcImNvbnRlbnQtcmFuZ2VcIikpID09PSBudWxsIHx8IF9yZXMkaGVhZGVycyRnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yZXMkaGVhZGVycyRnZXQuc3BsaXQoXCIvXCIpO1xuXHRcdFx0XHRpZiAoY291bnRIZWFkZXIgJiYgY29udGVudFJhbmdlICYmIGNvbnRlbnRSYW5nZS5sZW5ndGggPiAxKSBjb3VudCA9IHBhcnNlSW50KGNvbnRlbnRSYW5nZVsxXSk7XG5cdFx0XHRcdGlmIChfdGhpcy5pc01heWJlU2luZ2xlICYmIF90aGlzLm1ldGhvZCA9PT0gXCJHRVRcIiAmJiBBcnJheS5pc0FycmF5KGRhdGEpKSBpZiAoZGF0YS5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0ZXJyb3IgPSB7XG5cdFx0XHRcdFx0XHRjb2RlOiBcIlBHUlNUMTE2XCIsXG5cdFx0XHRcdFx0XHRkZXRhaWxzOiBgUmVzdWx0cyBjb250YWluICR7ZGF0YS5sZW5ndGh9IHJvd3MsIGFwcGxpY2F0aW9uL3ZuZC5wZ3JzdC5vYmplY3QranNvbiByZXF1aXJlcyAxIHJvd2AsXG5cdFx0XHRcdFx0XHRoaW50OiBudWxsLFxuXHRcdFx0XHRcdFx0bWVzc2FnZTogXCJKU09OIG9iamVjdCByZXF1ZXN0ZWQsIG11bHRpcGxlIChvciBubykgcm93cyByZXR1cm5lZFwiXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRkYXRhID0gbnVsbDtcblx0XHRcdFx0XHRjb3VudCA9IG51bGw7XG5cdFx0XHRcdFx0c3RhdHVzID0gNDA2O1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIk5vdCBBY2NlcHRhYmxlXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoZGF0YS5sZW5ndGggPT09IDEpIGRhdGEgPSBkYXRhWzBdO1xuXHRcdFx0XHRlbHNlIGRhdGEgPSBudWxsO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIF9lcnJvciRkZXRhaWxzO1xuXHRcdFx0XHRjb25zdCBib2R5ID0gYXdhaXQgcmVzJDEudGV4dCgpO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGVycm9yID0gSlNPTi5wYXJzZShib2R5KTtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShlcnJvcikgJiYgcmVzJDEuc3RhdHVzID09PSA0MDQpIHtcblx0XHRcdFx0XHRcdGRhdGEgPSBbXTtcblx0XHRcdFx0XHRcdGVycm9yID0gbnVsbDtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDIwMDtcblx0XHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIk9LXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChfdW51c2VkKSB7XG5cdFx0XHRcdFx0aWYgKHJlcyQxLnN0YXR1cyA9PT0gNDA0ICYmIGJvZHkgPT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDIwNDtcblx0XHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIk5vIENvbnRlbnRcIjtcblx0XHRcdFx0XHR9IGVsc2UgZXJyb3IgPSB7IG1lc3NhZ2U6IGJvZHkgfTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXJyb3IgJiYgX3RoaXMuaXNNYXliZVNpbmdsZSAmJiAoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCB8fCAoX2Vycm9yJGRldGFpbHMgPSBlcnJvci5kZXRhaWxzKSA9PT0gbnVsbCB8fCBfZXJyb3IkZGV0YWlscyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Vycm9yJGRldGFpbHMuaW5jbHVkZXMoXCIwIHJvd3NcIikpKSB7XG5cdFx0XHRcdFx0ZXJyb3IgPSBudWxsO1xuXHRcdFx0XHRcdHN0YXR1cyA9IDIwMDtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJPS1wiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChlcnJvciAmJiBfdGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IG5ldyBQb3N0Z3Jlc3RFcnJvcihlcnJvcik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRlcnJvcixcblx0XHRcdFx0ZGF0YSxcblx0XHRcdFx0Y291bnQsXG5cdFx0XHRcdHN0YXR1cyxcblx0XHRcdFx0c3RhdHVzVGV4dFxuXHRcdFx0fTtcblx0XHR9KTtcblx0XHRpZiAoIXRoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSByZXMgPSByZXMuY2F0Y2goKGZldGNoRXJyb3IpID0+IHtcblx0XHRcdHZhciBfZmV0Y2hFcnJvciRuYW1lMjtcblx0XHRcdGxldCBlcnJvckRldGFpbHMgPSBcIlwiO1xuXHRcdFx0Y29uc3QgY2F1c2UgPSBmZXRjaEVycm9yID09PSBudWxsIHx8IGZldGNoRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZldGNoRXJyb3IuY2F1c2U7XG5cdFx0XHRpZiAoY2F1c2UpIHtcblx0XHRcdFx0dmFyIF9jYXVzZSRtZXNzYWdlLCBfY2F1c2UkY29kZSwgX2ZldGNoRXJyb3IkbmFtZSwgX2NhdXNlJG5hbWU7XG5cdFx0XHRcdGNvbnN0IGNhdXNlTWVzc2FnZSA9IChfY2F1c2UkbWVzc2FnZSA9IGNhdXNlID09PSBudWxsIHx8IGNhdXNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYXVzZS5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfY2F1c2UkbWVzc2FnZSAhPT0gdm9pZCAwID8gX2NhdXNlJG1lc3NhZ2UgOiBcIlwiO1xuXHRcdFx0XHRjb25zdCBjYXVzZUNvZGUgPSAoX2NhdXNlJGNvZGUgPSBjYXVzZSA9PT0gbnVsbCB8fCBjYXVzZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2F1c2UuY29kZSkgIT09IG51bGwgJiYgX2NhdXNlJGNvZGUgIT09IHZvaWQgMCA/IF9jYXVzZSRjb2RlIDogXCJcIjtcblx0XHRcdFx0ZXJyb3JEZXRhaWxzID0gYCR7KF9mZXRjaEVycm9yJG5hbWUgPSBmZXRjaEVycm9yID09PSBudWxsIHx8IGZldGNoRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZldGNoRXJyb3IubmFtZSkgIT09IG51bGwgJiYgX2ZldGNoRXJyb3IkbmFtZSAhPT0gdm9pZCAwID8gX2ZldGNoRXJyb3IkbmFtZSA6IFwiRmV0Y2hFcnJvclwifTogJHtmZXRjaEVycm9yID09PSBudWxsIHx8IGZldGNoRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZldGNoRXJyb3IubWVzc2FnZX1gO1xuXHRcdFx0XHRlcnJvckRldGFpbHMgKz0gYFxcblxcbkNhdXNlZCBieTogJHsoX2NhdXNlJG5hbWUgPSBjYXVzZSA9PT0gbnVsbCB8fCBjYXVzZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2F1c2UubmFtZSkgIT09IG51bGwgJiYgX2NhdXNlJG5hbWUgIT09IHZvaWQgMCA/IF9jYXVzZSRuYW1lIDogXCJFcnJvclwifTogJHtjYXVzZU1lc3NhZ2V9YDtcblx0XHRcdFx0aWYgKGNhdXNlQ29kZSkgZXJyb3JEZXRhaWxzICs9IGAgKCR7Y2F1c2VDb2RlfSlgO1xuXHRcdFx0XHRpZiAoY2F1c2UgPT09IG51bGwgfHwgY2F1c2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhdXNlLnN0YWNrKSBlcnJvckRldGFpbHMgKz0gYFxcbiR7Y2F1c2Uuc3RhY2t9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBfZmV0Y2hFcnJvciRzdGFjaztcblx0XHRcdFx0ZXJyb3JEZXRhaWxzID0gKF9mZXRjaEVycm9yJHN0YWNrID0gZmV0Y2hFcnJvciA9PT0gbnVsbCB8fCBmZXRjaEVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmZXRjaEVycm9yLnN0YWNrKSAhPT0gbnVsbCAmJiBfZmV0Y2hFcnJvciRzdGFjayAhPT0gdm9pZCAwID8gX2ZldGNoRXJyb3Ikc3RhY2sgOiBcIlwiO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZXJyb3I6IHtcblx0XHRcdFx0XHRtZXNzYWdlOiBgJHsoX2ZldGNoRXJyb3IkbmFtZTIgPSBmZXRjaEVycm9yID09PSBudWxsIHx8IGZldGNoRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZldGNoRXJyb3IubmFtZSkgIT09IG51bGwgJiYgX2ZldGNoRXJyb3IkbmFtZTIgIT09IHZvaWQgMCA/IF9mZXRjaEVycm9yJG5hbWUyIDogXCJGZXRjaEVycm9yXCJ9OiAke2ZldGNoRXJyb3IgPT09IG51bGwgfHwgZmV0Y2hFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmV0Y2hFcnJvci5tZXNzYWdlfWAsXG5cdFx0XHRcdFx0ZGV0YWlsczogZXJyb3JEZXRhaWxzLFxuXHRcdFx0XHRcdGhpbnQ6IFwiXCIsXG5cdFx0XHRcdFx0Y29kZTogXCJcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRjb3VudDogbnVsbCxcblx0XHRcdFx0c3RhdHVzOiAwLFxuXHRcdFx0XHRzdGF0dXNUZXh0OiBcIlwiXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHRcdHJldHVybiByZXMudGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCk7XG5cdH1cblx0LyoqXG5cdCogT3ZlcnJpZGUgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIGBkYXRhYC5cblx0KlxuXHQqIEB0eXBlUGFyYW0gTmV3UmVzdWx0IC0gVGhlIG5ldyByZXN1bHQgdHlwZSB0byBvdmVycmlkZSB3aXRoXG5cdCogQGRlcHJlY2F0ZWQgVXNlIG92ZXJyaWRlVHlwZXM8eW91clR5cGUsIHsgbWVyZ2U6IGZhbHNlIH0+KCkgbWV0aG9kIGF0IHRoZSBlbmQgb2YgeW91ciBjYWxsIGNoYWluIGluc3RlYWRcblx0Ki9cblx0cmV0dXJucygpIHtcblx0XHQvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE92ZXJyaWRlIHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBgZGF0YWAgZmllbGQgaW4gdGhlIHJlc3BvbnNlLlxuXHQqXG5cdCogQHR5cGVQYXJhbSBOZXdSZXN1bHQgLSBUaGUgbmV3IHR5cGUgdG8gY2FzdCB0aGUgcmVzcG9uc2UgZGF0YSB0b1xuXHQqIEB0eXBlUGFyYW0gT3B0aW9ucyAtIE9wdGlvbmFsIHR5cGUgY29uZmlndXJhdGlvbiAoZGVmYXVsdHMgdG8geyBtZXJnZTogdHJ1ZSB9KVxuXHQqIEB0eXBlUGFyYW0gT3B0aW9ucy5tZXJnZSAtIFdoZW4gdHJ1ZSwgbWVyZ2VzIHRoZSBuZXcgdHlwZSB3aXRoIGV4aXN0aW5nIHJldHVybiB0eXBlLiBXaGVuIGZhbHNlLCByZXBsYWNlcyB0aGUgZXhpc3RpbmcgdHlwZXMgZW50aXJlbHkgKGRlZmF1bHRzIHRvIHRydWUpXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0eXBlc2NyaXB0XG5cdCogLy8gTWVyZ2Ugd2l0aCBleGlzdGluZyB0eXBlcyAoZGVmYXVsdCBiZWhhdmlvcilcblx0KiBjb25zdCBxdWVyeSA9IHN1cGFiYXNlXG5cdCogICAuZnJvbSgndXNlcnMnKVxuXHQqICAgLnNlbGVjdCgpXG5cdCogICAub3ZlcnJpZGVUeXBlczx7IGN1c3RvbV9maWVsZDogc3RyaW5nIH0+KClcblx0KlxuXHQqIC8vIFJlcGxhY2UgZXhpc3RpbmcgdHlwZXMgY29tcGxldGVseVxuXHQqIGNvbnN0IHJlcGxhY2VRdWVyeSA9IHN1cGFiYXNlXG5cdCogICAuZnJvbSgndXNlcnMnKVxuXHQqICAgLnNlbGVjdCgpXG5cdCogICAub3ZlcnJpZGVUeXBlczx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9LCB7IG1lcmdlOiBmYWxzZSB9PigpXG5cdCogYGBgXG5cdCogQHJldHVybnMgQSBQb3N0Z3Jlc3RCdWlsZGVyIGluc3RhbmNlIHdpdGggdGhlIG5ldyB0eXBlXG5cdCovXG5cdG92ZXJyaWRlVHlwZXMoKSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9Qb3N0Z3Jlc3RUcmFuc2Zvcm1CdWlsZGVyLnRzXG52YXIgUG9zdGdyZXN0VHJhbnNmb3JtQnVpbGRlciA9IGNsYXNzIGV4dGVuZHMgUG9zdGdyZXN0QnVpbGRlciB7XG5cdC8qKlxuXHQqIFBlcmZvcm0gYSBTRUxFQ1Qgb24gdGhlIHF1ZXJ5IHJlc3VsdC5cblx0KlxuXHQqIEJ5IGRlZmF1bHQsIGAuaW5zZXJ0KClgLCBgLnVwZGF0ZSgpYCwgYC51cHNlcnQoKWAsIGFuZCBgLmRlbGV0ZSgpYCBkbyBub3Rcblx0KiByZXR1cm4gbW9kaWZpZWQgcm93cy4gQnkgY2FsbGluZyB0aGlzIG1ldGhvZCwgbW9kaWZpZWQgcm93cyBhcmUgcmV0dXJuZWQgaW5cblx0KiBgZGF0YWAuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1ucyAtIFRoZSBjb2x1bW5zIHRvIHJldHJpZXZlLCBzZXBhcmF0ZWQgYnkgY29tbWFzXG5cdCovXG5cdHNlbGVjdChjb2x1bW5zKSB7XG5cdFx0bGV0IHF1b3RlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IGNsZWFuZWRDb2x1bW5zID0gKGNvbHVtbnMgIT09IG51bGwgJiYgY29sdW1ucyAhPT0gdm9pZCAwID8gY29sdW1ucyA6IFwiKlwiKS5zcGxpdChcIlwiKS5tYXAoKGMpID0+IHtcblx0XHRcdGlmICgvXFxzLy50ZXN0KGMpICYmICFxdW90ZWQpIHJldHVybiBcIlwiO1xuXHRcdFx0aWYgKGMgPT09IFwiXFxcIlwiKSBxdW90ZWQgPSAhcXVvdGVkO1xuXHRcdFx0cmV0dXJuIGM7XG5cdFx0fSkuam9pbihcIlwiKTtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuc2V0KFwic2VsZWN0XCIsIGNsZWFuZWRDb2x1bW5zKTtcblx0XHR0aGlzLmhlYWRlcnMuYXBwZW5kKFwiUHJlZmVyXCIsIFwicmV0dXJuPXJlcHJlc2VudGF0aW9uXCIpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE9yZGVyIHRoZSBxdWVyeSByZXN1bHQgYnkgYGNvbHVtbmAuXG5cdCpcblx0KiBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgdG8gb3JkZXIgYnkgbXVsdGlwbGUgY29sdW1ucy5cblx0KlxuXHQqIFlvdSBjYW4gb3JkZXIgcmVmZXJlbmNlZCB0YWJsZXMsIGJ1dCBpdCBvbmx5IGFmZmVjdHMgdGhlIG9yZGVyaW5nIG9mIHRoZVxuXHQqIHBhcmVudCB0YWJsZSBpZiB5b3UgdXNlIGAhaW5uZXJgIGluIHRoZSBxdWVyeS5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIG9yZGVyIGJ5XG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCogQHBhcmFtIG9wdGlvbnMuYXNjZW5kaW5nIC0gSWYgYHRydWVgLCB0aGUgcmVzdWx0IHdpbGwgYmUgaW4gYXNjZW5kaW5nIG9yZGVyXG5cdCogQHBhcmFtIG9wdGlvbnMubnVsbHNGaXJzdCAtIElmIGB0cnVlYCwgYG51bGxgcyBhcHBlYXIgZmlyc3QuIElmIGBmYWxzZWAsXG5cdCogYG51bGxgcyBhcHBlYXIgbGFzdC5cblx0KiBAcGFyYW0gb3B0aW9ucy5yZWZlcmVuY2VkVGFibGUgLSBTZXQgdGhpcyB0byBvcmRlciBhIHJlZmVyZW5jZWQgdGFibGUgYnlcblx0KiBpdHMgY29sdW1uc1xuXHQqIEBwYXJhbSBvcHRpb25zLmZvcmVpZ25UYWJsZSAtIERlcHJlY2F0ZWQsIHVzZSBgb3B0aW9ucy5yZWZlcmVuY2VkVGFibGVgXG5cdCogaW5zdGVhZFxuXHQqL1xuXHRvcmRlcihjb2x1bW4sIHsgYXNjZW5kaW5nID0gdHJ1ZSwgbnVsbHNGaXJzdCwgZm9yZWlnblRhYmxlLCByZWZlcmVuY2VkVGFibGUgPSBmb3JlaWduVGFibGUgfSA9IHt9KSB7XG5cdFx0Y29uc3Qga2V5ID0gcmVmZXJlbmNlZFRhYmxlID8gYCR7cmVmZXJlbmNlZFRhYmxlfS5vcmRlcmAgOiBcIm9yZGVyXCI7XG5cdFx0Y29uc3QgZXhpc3RpbmdPcmRlciA9IHRoaXMudXJsLnNlYXJjaFBhcmFtcy5nZXQoa2V5KTtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuc2V0KGtleSwgYCR7ZXhpc3RpbmdPcmRlciA/IGAke2V4aXN0aW5nT3JkZXJ9LGAgOiBcIlwifSR7Y29sdW1ufS4ke2FzY2VuZGluZyA/IFwiYXNjXCIgOiBcImRlc2NcIn0ke251bGxzRmlyc3QgPT09IHZvaWQgMCA/IFwiXCIgOiBudWxsc0ZpcnN0ID8gXCIubnVsbHNmaXJzdFwiIDogXCIubnVsbHNsYXN0XCJ9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTGltaXQgdGhlIHF1ZXJ5IHJlc3VsdCBieSBgY291bnRgLlxuXHQqXG5cdCogQHBhcmFtIGNvdW50IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcmV0dXJuXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCogQHBhcmFtIG9wdGlvbnMucmVmZXJlbmNlZFRhYmxlIC0gU2V0IHRoaXMgdG8gbGltaXQgcm93cyBvZiByZWZlcmVuY2VkXG5cdCogdGFibGVzIGluc3RlYWQgb2YgdGhlIHBhcmVudCB0YWJsZVxuXHQqIEBwYXJhbSBvcHRpb25zLmZvcmVpZ25UYWJsZSAtIERlcHJlY2F0ZWQsIHVzZSBgb3B0aW9ucy5yZWZlcmVuY2VkVGFibGVgXG5cdCogaW5zdGVhZFxuXHQqL1xuXHRsaW1pdChjb3VudCwgeyBmb3JlaWduVGFibGUsIHJlZmVyZW5jZWRUYWJsZSA9IGZvcmVpZ25UYWJsZSB9ID0ge30pIHtcblx0XHRjb25zdCBrZXkgPSB0eXBlb2YgcmVmZXJlbmNlZFRhYmxlID09PSBcInVuZGVmaW5lZFwiID8gXCJsaW1pdFwiIDogYCR7cmVmZXJlbmNlZFRhYmxlfS5saW1pdGA7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLnNldChrZXksIGAke2NvdW50fWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIExpbWl0IHRoZSBxdWVyeSByZXN1bHQgYnkgc3RhcnRpbmcgYXQgYW4gb2Zmc2V0IGBmcm9tYCBhbmQgZW5kaW5nIGF0IHRoZSBvZmZzZXQgYHRvYC5cblx0KiBPbmx5IHJlY29yZHMgd2l0aGluIHRoaXMgcmFuZ2UgYXJlIHJldHVybmVkLlxuXHQqIFRoaXMgcmVzcGVjdHMgdGhlIHF1ZXJ5IG9yZGVyIGFuZCBpZiB0aGVyZSBpcyBubyBvcmRlciBjbGF1c2UgdGhlIHJhbmdlIGNvdWxkIGJlaGF2ZSB1bmV4cGVjdGVkbHkuXG5cdCogVGhlIGBmcm9tYCBhbmQgYHRvYCB2YWx1ZXMgYXJlIDAtYmFzZWQgYW5kIGluY2x1c2l2ZTogYHJhbmdlKDEsIDMpYCB3aWxsIGluY2x1ZGUgdGhlIHNlY29uZCwgdGhpcmRcblx0KiBhbmQgZm91cnRoIHJvd3Mgb2YgdGhlIHF1ZXJ5LlxuXHQqXG5cdCogQHBhcmFtIGZyb20gLSBUaGUgc3RhcnRpbmcgaW5kZXggZnJvbSB3aGljaCB0byBsaW1pdCB0aGUgcmVzdWx0XG5cdCogQHBhcmFtIHRvIC0gVGhlIGxhc3QgaW5kZXggdG8gd2hpY2ggdG8gbGltaXQgdGhlIHJlc3VsdFxuXHQqIEBwYXJhbSBvcHRpb25zIC0gTmFtZWQgcGFyYW1ldGVyc1xuXHQqIEBwYXJhbSBvcHRpb25zLnJlZmVyZW5jZWRUYWJsZSAtIFNldCB0aGlzIHRvIGxpbWl0IHJvd3Mgb2YgcmVmZXJlbmNlZFxuXHQqIHRhYmxlcyBpbnN0ZWFkIG9mIHRoZSBwYXJlbnQgdGFibGVcblx0KiBAcGFyYW0gb3B0aW9ucy5mb3JlaWduVGFibGUgLSBEZXByZWNhdGVkLCB1c2UgYG9wdGlvbnMucmVmZXJlbmNlZFRhYmxlYFxuXHQqIGluc3RlYWRcblx0Ki9cblx0cmFuZ2UoZnJvbSwgdG8sIHsgZm9yZWlnblRhYmxlLCByZWZlcmVuY2VkVGFibGUgPSBmb3JlaWduVGFibGUgfSA9IHt9KSB7XG5cdFx0Y29uc3Qga2V5T2Zmc2V0ID0gdHlwZW9mIHJlZmVyZW5jZWRUYWJsZSA9PT0gXCJ1bmRlZmluZWRcIiA/IFwib2Zmc2V0XCIgOiBgJHtyZWZlcmVuY2VkVGFibGV9Lm9mZnNldGA7XG5cdFx0Y29uc3Qga2V5TGltaXQgPSB0eXBlb2YgcmVmZXJlbmNlZFRhYmxlID09PSBcInVuZGVmaW5lZFwiID8gXCJsaW1pdFwiIDogYCR7cmVmZXJlbmNlZFRhYmxlfS5saW1pdGA7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLnNldChrZXlPZmZzZXQsIGAke2Zyb219YCk7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLnNldChrZXlMaW1pdCwgYCR7dG8gLSBmcm9tICsgMX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBTZXQgdGhlIEFib3J0U2lnbmFsIGZvciB0aGUgZmV0Y2ggcmVxdWVzdC5cblx0KlxuXHQqIEBwYXJhbSBzaWduYWwgLSBUaGUgQWJvcnRTaWduYWwgdG8gdXNlIGZvciB0aGUgZmV0Y2ggcmVxdWVzdFxuXHQqL1xuXHRhYm9ydFNpZ25hbChzaWduYWwpIHtcblx0XHR0aGlzLnNpZ25hbCA9IHNpZ25hbDtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBSZXR1cm4gYGRhdGFgIGFzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIG9iamVjdHMuXG5cdCpcblx0KiBRdWVyeSByZXN1bHQgbXVzdCBiZSBvbmUgcm93IChlLmcuIHVzaW5nIGAubGltaXQoMSlgKSwgb3RoZXJ3aXNlIHRoaXNcblx0KiByZXR1cm5zIGFuIGVycm9yLlxuXHQqL1xuXHRzaW5nbGUoKSB7XG5cdFx0dGhpcy5oZWFkZXJzLnNldChcIkFjY2VwdFwiLCBcImFwcGxpY2F0aW9uL3ZuZC5wZ3JzdC5vYmplY3QranNvblwiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBSZXR1cm4gYGRhdGFgIGFzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIG9iamVjdHMuXG5cdCpcblx0KiBRdWVyeSByZXN1bHQgbXVzdCBiZSB6ZXJvIG9yIG9uZSByb3cgKGUuZy4gdXNpbmcgYC5saW1pdCgxKWApLCBvdGhlcndpc2Vcblx0KiB0aGlzIHJldHVybnMgYW4gZXJyb3IuXG5cdCovXG5cdG1heWJlU2luZ2xlKCkge1xuXHRcdGlmICh0aGlzLm1ldGhvZCA9PT0gXCJHRVRcIikgdGhpcy5oZWFkZXJzLnNldChcIkFjY2VwdFwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cdFx0ZWxzZSB0aGlzLmhlYWRlcnMuc2V0KFwiQWNjZXB0XCIsIFwiYXBwbGljYXRpb24vdm5kLnBncnN0Lm9iamVjdCtqc29uXCIpO1xuXHRcdHRoaXMuaXNNYXliZVNpbmdsZSA9IHRydWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogUmV0dXJuIGBkYXRhYCBhcyBhIHN0cmluZyBpbiBDU1YgZm9ybWF0LlxuXHQqL1xuXHRjc3YoKSB7XG5cdFx0dGhpcy5oZWFkZXJzLnNldChcIkFjY2VwdFwiLCBcInRleHQvY3N2XCIpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybiBgZGF0YWAgYXMgYW4gb2JqZWN0IGluIFtHZW9KU09OXShodHRwczovL2dlb2pzb24ub3JnKSBmb3JtYXQuXG5cdCovXG5cdGdlb2pzb24oKSB7XG5cdFx0dGhpcy5oZWFkZXJzLnNldChcIkFjY2VwdFwiLCBcImFwcGxpY2F0aW9uL2dlbytqc29uXCIpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybiBgZGF0YWAgYXMgdGhlIEVYUExBSU4gcGxhbiBmb3IgdGhlIHF1ZXJ5LlxuXHQqXG5cdCogWW91IG5lZWQgdG8gZW5hYmxlIHRoZVxuXHQqIFtkYl9wbGFuX2VuYWJsZWRdKGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL2RlYnVnZ2luZy1wZXJmb3JtYW5jZSNlbmFibGluZy1leHBsYWluKVxuXHQqIHNldHRpbmcgYmVmb3JlIHVzaW5nIHRoaXMgbWV0aG9kLlxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucy5hbmFseXplIC0gSWYgYHRydWVgLCB0aGUgcXVlcnkgd2lsbCBiZSBleGVjdXRlZCBhbmQgdGhlXG5cdCogYWN0dWFsIHJ1biB0aW1lIHdpbGwgYmUgcmV0dXJuZWRcblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zLnZlcmJvc2UgLSBJZiBgdHJ1ZWAsIHRoZSBxdWVyeSBpZGVudGlmaWVyIHdpbGwgYmUgcmV0dXJuZWRcblx0KiBhbmQgYGRhdGFgIHdpbGwgaW5jbHVkZSB0aGUgb3V0cHV0IGNvbHVtbnMgb2YgdGhlIHF1ZXJ5XG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucy5zZXR0aW5ncyAtIElmIGB0cnVlYCwgaW5jbHVkZSBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmF0aW9uXG5cdCogcGFyYW1ldGVycyB0aGF0IGFmZmVjdCBxdWVyeSBwbGFubmluZ1xuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMuYnVmZmVycyAtIElmIGB0cnVlYCwgaW5jbHVkZSBpbmZvcm1hdGlvbiBvbiBidWZmZXIgdXNhZ2Vcblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zLndhbCAtIElmIGB0cnVlYCwgaW5jbHVkZSBpbmZvcm1hdGlvbiBvbiBXQUwgcmVjb3JkIGdlbmVyYXRpb25cblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zLmZvcm1hdCAtIFRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCwgY2FuIGJlIGBcInRleHRcImAgKGRlZmF1bHQpXG5cdCogb3IgYFwianNvblwiYFxuXHQqL1xuXHRleHBsYWluKHsgYW5hbHl6ZSA9IGZhbHNlLCB2ZXJib3NlID0gZmFsc2UsIHNldHRpbmdzID0gZmFsc2UsIGJ1ZmZlcnMgPSBmYWxzZSwgd2FsID0gZmFsc2UsIGZvcm1hdCA9IFwidGV4dFwiIH0gPSB7fSkge1xuXHRcdHZhciBfdGhpcyRoZWFkZXJzJGdldDtcblx0XHRjb25zdCBvcHRpb25zID0gW1xuXHRcdFx0YW5hbHl6ZSA/IFwiYW5hbHl6ZVwiIDogbnVsbCxcblx0XHRcdHZlcmJvc2UgPyBcInZlcmJvc2VcIiA6IG51bGwsXG5cdFx0XHRzZXR0aW5ncyA/IFwic2V0dGluZ3NcIiA6IG51bGwsXG5cdFx0XHRidWZmZXJzID8gXCJidWZmZXJzXCIgOiBudWxsLFxuXHRcdFx0d2FsID8gXCJ3YWxcIiA6IG51bGxcblx0XHRdLmZpbHRlcihCb29sZWFuKS5qb2luKFwifFwiKTtcblx0XHRjb25zdCBmb3JNZWRpYXR5cGUgPSAoX3RoaXMkaGVhZGVycyRnZXQgPSB0aGlzLmhlYWRlcnMuZ2V0KFwiQWNjZXB0XCIpKSAhPT0gbnVsbCAmJiBfdGhpcyRoZWFkZXJzJGdldCAhPT0gdm9pZCAwID8gX3RoaXMkaGVhZGVycyRnZXQgOiBcImFwcGxpY2F0aW9uL2pzb25cIjtcblx0XHR0aGlzLmhlYWRlcnMuc2V0KFwiQWNjZXB0XCIsIGBhcHBsaWNhdGlvbi92bmQucGdyc3QucGxhbiske2Zvcm1hdH07IGZvcj1cIiR7Zm9yTWVkaWF0eXBlfVwiOyBvcHRpb25zPSR7b3B0aW9uc307YCk7XG5cdFx0aWYgKGZvcm1hdCA9PT0gXCJqc29uXCIpIHJldHVybiB0aGlzO1xuXHRcdGVsc2UgcmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogUm9sbGJhY2sgdGhlIHF1ZXJ5LlxuXHQqXG5cdCogYGRhdGFgIHdpbGwgc3RpbGwgYmUgcmV0dXJuZWQsIGJ1dCB0aGUgcXVlcnkgaXMgbm90IGNvbW1pdHRlZC5cblx0Ki9cblx0cm9sbGJhY2soKSB7XG5cdFx0dGhpcy5oZWFkZXJzLmFwcGVuZChcIlByZWZlclwiLCBcInR4PXJvbGxiYWNrXCIpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE92ZXJyaWRlIHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBgZGF0YWAuXG5cdCpcblx0KiBAdHlwZVBhcmFtIE5ld1Jlc3VsdCAtIFRoZSBuZXcgcmVzdWx0IHR5cGUgdG8gb3ZlcnJpZGUgd2l0aFxuXHQqIEBkZXByZWNhdGVkIFVzZSBvdmVycmlkZVR5cGVzPHlvdXJUeXBlLCB7IG1lcmdlOiBmYWxzZSB9PigpIG1ldGhvZCBhdCB0aGUgZW5kIG9mIHlvdXIgY2FsbCBjaGFpbiBpbnN0ZWFkXG5cdCovXG5cdHJldHVybnMoKSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRoYXQgY2FuIGJlIGFmZmVjdGVkIGJ5IHRoZSBxdWVyeS5cblx0KiBPbmx5IGF2YWlsYWJsZSBpbiBQb3N0Z1JFU1QgdjEzKyBhbmQgb25seSB3b3JrcyB3aXRoIFBBVENIIGFuZCBERUxFVEUgbWV0aG9kcy5cblx0KlxuXHQqIEBwYXJhbSB2YWx1ZSAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRoYXQgY2FuIGJlIGFmZmVjdGVkXG5cdCovXG5cdG1heEFmZmVjdGVkKHZhbHVlKSB7XG5cdFx0dGhpcy5oZWFkZXJzLmFwcGVuZChcIlByZWZlclwiLCBcImhhbmRsaW5nPXN0cmljdFwiKTtcblx0XHR0aGlzLmhlYWRlcnMuYXBwZW5kKFwiUHJlZmVyXCIsIGBtYXgtYWZmZWN0ZWQ9JHt2YWx1ZX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1Bvc3RncmVzdEZpbHRlckJ1aWxkZXIudHNcbmNvbnN0IFBvc3RncmVzdFJlc2VydmVkQ2hhcnNSZWdleHAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFJlZ0V4cChcIlssKCldXCIpO1xudmFyIFBvc3RncmVzdEZpbHRlckJ1aWxkZXIgPSBjbGFzcyBleHRlbmRzIFBvc3RncmVzdFRyYW5zZm9ybUJ1aWxkZXIge1xuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgaXMgZXF1YWwgdG8gYHZhbHVlYC5cblx0KlxuXHQqIFRvIGNoZWNrIGlmIHRoZSB2YWx1ZSBvZiBgY29sdW1uYCBpcyBOVUxMLCB5b3Ugc2hvdWxkIHVzZSBgLmlzKClgIGluc3RlYWQuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0ZXEoY29sdW1uLCB2YWx1ZSkge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgZXEuJHt2YWx1ZX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgaXMgbm90IGVxdWFsIHRvIGB2YWx1ZWAuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0bmVxKGNvbHVtbiwgdmFsdWUpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYG5lcS4ke3ZhbHVlfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBpcyBncmVhdGVyIHRoYW4gYHZhbHVlYC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBmaWx0ZXIgd2l0aFxuXHQqL1xuXHRndChjb2x1bW4sIHZhbHVlKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBndC4ke3ZhbHVlfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYHZhbHVlYC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBmaWx0ZXIgd2l0aFxuXHQqL1xuXHRndGUoY29sdW1uLCB2YWx1ZSkge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgZ3RlLiR7dmFsdWV9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIGlzIGxlc3MgdGhhbiBgdmFsdWVgLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdGx0KGNvbHVtbiwgdmFsdWUpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGx0LiR7dmFsdWV9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgdmFsdWVgLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdGx0ZShjb2x1bW4sIHZhbHVlKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBsdGUuJHt2YWx1ZX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgbWF0Y2hlcyBgcGF0dGVybmAgY2FzZS1zZW5zaXRpdmVseS5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSBwYXR0ZXJuIC0gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggd2l0aFxuXHQqL1xuXHRsaWtlKGNvbHVtbiwgcGF0dGVybikge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgbGlrZS4ke3BhdHRlcm59YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIG1hdGNoZXMgYWxsIG9mIGBwYXR0ZXJuc2AgY2FzZS1zZW5zaXRpdmVseS5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSBwYXR0ZXJucyAtIFRoZSBwYXR0ZXJucyB0byBtYXRjaCB3aXRoXG5cdCovXG5cdGxpa2VBbGxPZihjb2x1bW4sIHBhdHRlcm5zKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBsaWtlKGFsbCkueyR7cGF0dGVybnMuam9pbihcIixcIil9fWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBtYXRjaGVzIGFueSBvZiBgcGF0dGVybnNgIGNhc2Utc2Vuc2l0aXZlbHkuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gcGF0dGVybnMgLSBUaGUgcGF0dGVybnMgdG8gbWF0Y2ggd2l0aFxuXHQqL1xuXHRsaWtlQW55T2YoY29sdW1uLCBwYXR0ZXJucykge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgbGlrZShhbnkpLnske3BhdHRlcm5zLmpvaW4oXCIsXCIpfX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgbWF0Y2hlcyBgcGF0dGVybmAgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHBhdHRlcm4gLSBUaGUgcGF0dGVybiB0byBtYXRjaCB3aXRoXG5cdCovXG5cdGlsaWtlKGNvbHVtbiwgcGF0dGVybikge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgaWxpa2UuJHtwYXR0ZXJufWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBtYXRjaGVzIGFsbCBvZiBgcGF0dGVybnNgIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSBwYXR0ZXJucyAtIFRoZSBwYXR0ZXJucyB0byBtYXRjaCB3aXRoXG5cdCovXG5cdGlsaWtlQWxsT2YoY29sdW1uLCBwYXR0ZXJucykge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgaWxpa2UoYWxsKS57JHtwYXR0ZXJucy5qb2luKFwiLFwiKX19YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIG1hdGNoZXMgYW55IG9mIGBwYXR0ZXJuc2AgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHBhdHRlcm5zIC0gVGhlIHBhdHRlcm5zIHRvIG1hdGNoIHdpdGhcblx0Ki9cblx0aWxpa2VBbnlPZihjb2x1bW4sIHBhdHRlcm5zKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBpbGlrZShhbnkpLnske3BhdHRlcm5zLmpvaW4oXCIsXCIpfX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgbWF0Y2hlcyB0aGUgUG9zdGdyZVNRTCByZWdleCBgcGF0dGVybmBcblx0KiBjYXNlLXNlbnNpdGl2ZWx5ICh1c2luZyB0aGUgYH5gIG9wZXJhdG9yKS5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSBwYXR0ZXJuIC0gVGhlIFBvc3RncmVTUUwgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2ggd2l0aFxuXHQqL1xuXHRyZWdleE1hdGNoKGNvbHVtbiwgcGF0dGVybikge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgbWF0Y2guJHtwYXR0ZXJufWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBtYXRjaGVzIHRoZSBQb3N0Z3JlU1FMIHJlZ2V4IGBwYXR0ZXJuYFxuXHQqIGNhc2UtaW5zZW5zaXRpdmVseSAodXNpbmcgdGhlIGB+KmAgb3BlcmF0b3IpLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHBhdHRlcm4gLSBUaGUgUG9zdGdyZVNRTCByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCB3aXRoXG5cdCovXG5cdHJlZ2V4SU1hdGNoKGNvbHVtbiwgcGF0dGVybikge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgaW1hdGNoLiR7cGF0dGVybn1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgSVMgYHZhbHVlYC5cblx0KlxuXHQqIEZvciBub24tYm9vbGVhbiBjb2x1bW5zLCB0aGlzIGlzIG9ubHkgcmVsZXZhbnQgZm9yIGNoZWNraW5nIGlmIHRoZSB2YWx1ZSBvZlxuXHQqIGBjb2x1bW5gIGlzIE5VTEwgYnkgc2V0dGluZyBgdmFsdWVgIHRvIGBudWxsYC5cblx0KlxuXHQqIEZvciBib29sZWFuIGNvbHVtbnMsIHlvdSBjYW4gYWxzbyBzZXQgYHZhbHVlYCB0byBgdHJ1ZWAgb3IgYGZhbHNlYCBhbmQgaXRcblx0KiB3aWxsIGJlaGF2ZSB0aGUgc2FtZSB3YXkgYXMgYC5lcSgpYC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBmaWx0ZXIgd2l0aFxuXHQqL1xuXHRpcyhjb2x1bW4sIHZhbHVlKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBpcy4ke3ZhbHVlfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBJUyBESVNUSU5DVCBGUk9NIGB2YWx1ZWAuXG5cdCpcblx0KiBVbmxpa2UgYC5uZXEoKWAsIHRoaXMgdHJlYXRzIGBOVUxMYCBhcyBhIGNvbXBhcmFibGUgdmFsdWUuIFR3byBgTlVMTGAgdmFsdWVzXG5cdCogYXJlIGNvbnNpZGVyZWQgZXF1YWwgKG5vdCBkaXN0aW5jdCksIGFuZCBjb21wYXJpbmcgYE5VTExgIHdpdGggYW55IG5vbi1OVUxMXG5cdCogdmFsdWUgcmV0dXJucyB0cnVlIChkaXN0aW5jdCkuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0aXNEaXN0aW5jdChjb2x1bW4sIHZhbHVlKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBpc2Rpc3RpbmN0LiR7dmFsdWV9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIGlzIGluY2x1ZGVkIGluIHRoZSBgdmFsdWVzYCBhcnJheS5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgdmFsdWVzIGFycmF5IHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdGluKGNvbHVtbiwgdmFsdWVzKSB7XG5cdFx0Y29uc3QgY2xlYW5lZFZhbHVlcyA9IEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKS5tYXAoKHMpID0+IHtcblx0XHRcdGlmICh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIiAmJiBQb3N0Z3Jlc3RSZXNlcnZlZENoYXJzUmVnZXhwLnRlc3QocykpIHJldHVybiBgXCIke3N9XCJgO1xuXHRcdFx0ZWxzZSByZXR1cm4gYCR7c31gO1xuXHRcdH0pLmpvaW4oXCIsXCIpO1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgaW4uKCR7Y2xlYW5lZFZhbHVlc30pYCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIGlzIE5PVCBpbmNsdWRlZCBpbiB0aGUgYHZhbHVlc2AgYXJyYXkuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gdmFsdWVzIC0gVGhlIHZhbHVlcyBhcnJheSB0byBmaWx0ZXIgd2l0aFxuXHQqL1xuXHRub3RJbihjb2x1bW4sIHZhbHVlcykge1xuXHRcdGNvbnN0IGNsZWFuZWRWYWx1ZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKSkubWFwKChzKSA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIHMgPT09IFwic3RyaW5nXCIgJiYgUG9zdGdyZXN0UmVzZXJ2ZWRDaGFyc1JlZ2V4cC50ZXN0KHMpKSByZXR1cm4gYFwiJHtzfVwiYDtcblx0XHRcdGVsc2UgcmV0dXJuIGAke3N9YDtcblx0XHR9KS5qb2luKFwiLFwiKTtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYG5vdC5pbi4oJHtjbGVhbmVkVmFsdWVzfSlgKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBPbmx5IHJlbGV2YW50IGZvciBqc29uYiwgYXJyYXksIGFuZCByYW5nZSBjb2x1bW5zLiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmVcblx0KiBgY29sdW1uYCBjb250YWlucyBldmVyeSBlbGVtZW50IGFwcGVhcmluZyBpbiBgdmFsdWVgLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBqc29uYiwgYXJyYXksIG9yIHJhbmdlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gdmFsdWUgLSBUaGUganNvbmIsIGFycmF5LCBvciByYW5nZSB2YWx1ZSB0byBmaWx0ZXIgd2l0aFxuXHQqL1xuXHRjb250YWlucyhjb2x1bW4sIHZhbHVlKSB7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgdGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBjcy4ke3ZhbHVlfWApO1xuXHRcdGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGNzLnske3ZhbHVlLmpvaW4oXCIsXCIpfX1gKTtcblx0XHRlbHNlIHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgY3MuJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogT25seSByZWxldmFudCBmb3IganNvbmIsIGFycmF5LCBhbmQgcmFuZ2UgY29sdW1ucy4gTWF0Y2ggb25seSByb3dzIHdoZXJlXG5cdCogZXZlcnkgZWxlbWVudCBhcHBlYXJpbmcgaW4gYGNvbHVtbmAgaXMgY29udGFpbmVkIGJ5IGB2YWx1ZWAuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGpzb25iLCBhcnJheSwgb3IgcmFuZ2UgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSB2YWx1ZSAtIFRoZSBqc29uYiwgYXJyYXksIG9yIHJhbmdlIHZhbHVlIHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdGNvbnRhaW5lZEJ5KGNvbHVtbiwgdmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGNkLiR7dmFsdWV9YCk7XG5cdFx0ZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgY2QueyR7dmFsdWUuam9pbihcIixcIil9fWApO1xuXHRcdGVsc2UgdGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBjZC4ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBPbmx5IHJlbGV2YW50IGZvciByYW5nZSBjb2x1bW5zLiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgZXZlcnkgZWxlbWVudCBpblxuXHQqIGBjb2x1bW5gIGlzIGdyZWF0ZXIgdGhhbiBhbnkgZWxlbWVudCBpbiBgcmFuZ2VgLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSByYW5nZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHJhbmdlIC0gVGhlIHJhbmdlIHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdHJhbmdlR3QoY29sdW1uLCByYW5nZSkge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgc3IuJHtyYW5nZX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBPbmx5IHJlbGV2YW50IGZvciByYW5nZSBjb2x1bW5zLiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgZXZlcnkgZWxlbWVudCBpblxuXHQqIGBjb2x1bW5gIGlzIGVpdGhlciBjb250YWluZWQgaW4gYHJhbmdlYCBvciBncmVhdGVyIHRoYW4gYW55IGVsZW1lbnQgaW5cblx0KiBgcmFuZ2VgLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSByYW5nZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHJhbmdlIC0gVGhlIHJhbmdlIHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdHJhbmdlR3RlKGNvbHVtbiwgcmFuZ2UpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYG54bC4ke3JhbmdlfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE9ubHkgcmVsZXZhbnQgZm9yIHJhbmdlIGNvbHVtbnMuIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBldmVyeSBlbGVtZW50IGluXG5cdCogYGNvbHVtbmAgaXMgbGVzcyB0aGFuIGFueSBlbGVtZW50IGluIGByYW5nZWAuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIHJhbmdlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gcmFuZ2UgLSBUaGUgcmFuZ2UgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0cmFuZ2VMdChjb2x1bW4sIHJhbmdlKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBzbC4ke3JhbmdlfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE9ubHkgcmVsZXZhbnQgZm9yIHJhbmdlIGNvbHVtbnMuIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBldmVyeSBlbGVtZW50IGluXG5cdCogYGNvbHVtbmAgaXMgZWl0aGVyIGNvbnRhaW5lZCBpbiBgcmFuZ2VgIG9yIGxlc3MgdGhhbiBhbnkgZWxlbWVudCBpblxuXHQqIGByYW5nZWAuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIHJhbmdlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gcmFuZ2UgLSBUaGUgcmFuZ2UgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0cmFuZ2VMdGUoY29sdW1uLCByYW5nZSkge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgbnhyLiR7cmFuZ2V9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogT25seSByZWxldmFudCBmb3IgcmFuZ2UgY29sdW1ucy4gTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIGlzXG5cdCogbXV0dWFsbHkgZXhjbHVzaXZlIHRvIGByYW5nZWAgYW5kIHRoZXJlIGNhbiBiZSBubyBlbGVtZW50IGJldHdlZW4gdGhlIHR3b1xuXHQqIHJhbmdlcy5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgcmFuZ2UgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSByYW5nZSAtIFRoZSByYW5nZSB0byBmaWx0ZXIgd2l0aFxuXHQqL1xuXHRyYW5nZUFkamFjZW50KGNvbHVtbiwgcmFuZ2UpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGFkai4ke3JhbmdlfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE9ubHkgcmVsZXZhbnQgZm9yIGFycmF5IGFuZCByYW5nZSBjb2x1bW5zLiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmVcblx0KiBgY29sdW1uYCBhbmQgYHZhbHVlYCBoYXZlIGFuIGVsZW1lbnQgaW4gY29tbW9uLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBhcnJheSBvciByYW5nZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHZhbHVlIC0gVGhlIGFycmF5IG9yIHJhbmdlIHZhbHVlIHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdG92ZXJsYXBzKGNvbHVtbiwgdmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYG92LiR7dmFsdWV9YCk7XG5cdFx0ZWxzZSB0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYG92Lnske3ZhbHVlLmpvaW4oXCIsXCIpfX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBPbmx5IHJlbGV2YW50IGZvciB0ZXh0IGFuZCB0c3ZlY3RvciBjb2x1bW5zLiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmVcblx0KiBgY29sdW1uYCBtYXRjaGVzIHRoZSBxdWVyeSBzdHJpbmcgaW4gYHF1ZXJ5YC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgdGV4dCBvciB0c3ZlY3RvciBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHF1ZXJ5IC0gVGhlIHF1ZXJ5IHRleHQgdG8gbWF0Y2ggd2l0aFxuXHQqIEBwYXJhbSBvcHRpb25zIC0gTmFtZWQgcGFyYW1ldGVyc1xuXHQqIEBwYXJhbSBvcHRpb25zLmNvbmZpZyAtIFRoZSB0ZXh0IHNlYXJjaCBjb25maWd1cmF0aW9uIHRvIHVzZVxuXHQqIEBwYXJhbSBvcHRpb25zLnR5cGUgLSBDaGFuZ2UgaG93IHRoZSBgcXVlcnlgIHRleHQgaXMgaW50ZXJwcmV0ZWRcblx0Ki9cblx0dGV4dFNlYXJjaChjb2x1bW4sIHF1ZXJ5LCB7IGNvbmZpZywgdHlwZSB9ID0ge30pIHtcblx0XHRsZXQgdHlwZVBhcnQgPSBcIlwiO1xuXHRcdGlmICh0eXBlID09PSBcInBsYWluXCIpIHR5cGVQYXJ0ID0gXCJwbFwiO1xuXHRcdGVsc2UgaWYgKHR5cGUgPT09IFwicGhyYXNlXCIpIHR5cGVQYXJ0ID0gXCJwaFwiO1xuXHRcdGVsc2UgaWYgKHR5cGUgPT09IFwid2Vic2VhcmNoXCIpIHR5cGVQYXJ0ID0gXCJ3XCI7XG5cdFx0Y29uc3QgY29uZmlnUGFydCA9IGNvbmZpZyA9PT0gdm9pZCAwID8gXCJcIiA6IGAoJHtjb25maWd9KWA7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGAke3R5cGVQYXJ0fWZ0cyR7Y29uZmlnUGFydH0uJHtxdWVyeX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgZWFjaCBjb2x1bW4gaW4gYHF1ZXJ5YCBrZXlzIGlzIGVxdWFsIHRvIGl0c1xuXHQqIGFzc29jaWF0ZWQgdmFsdWUuIFNob3J0aGFuZCBmb3IgbXVsdGlwbGUgYC5lcSgpYHMuXG5cdCpcblx0KiBAcGFyYW0gcXVlcnkgLSBUaGUgb2JqZWN0IHRvIGZpbHRlciB3aXRoLCB3aXRoIGNvbHVtbiBuYW1lcyBhcyBrZXlzIG1hcHBlZFxuXHQqIHRvIHRoZWlyIGZpbHRlciB2YWx1ZXNcblx0Ki9cblx0bWF0Y2gocXVlcnkpIHtcblx0XHRPYmplY3QuZW50cmllcyhxdWVyeSkuZm9yRWFjaCgoW2NvbHVtbiwgdmFsdWVdKSA9PiB7XG5cdFx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGVxLiR7dmFsdWV9YCk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoaWNoIGRvZXNuJ3Qgc2F0aXNmeSB0aGUgZmlsdGVyLlxuXHQqXG5cdCogVW5saWtlIG1vc3QgZmlsdGVycywgYG9wZWFyYXRvcmAgYW5kIGB2YWx1ZWAgYXJlIHVzZWQgYXMtaXMgYW5kIG5lZWQgdG9cblx0KiBmb2xsb3cgW1Bvc3RnUkVTVFxuXHQqIHN5bnRheF0oaHR0cHM6Ly9wb3N0Z3Jlc3Qub3JnL2VuL3N0YWJsZS9hcGkuaHRtbCNvcGVyYXRvcnMpLiBZb3UgYWxzbyBuZWVkXG5cdCogdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHByb3Blcmx5IHNhbml0aXplZC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSBvcGVyYXRvciAtIFRoZSBvcGVyYXRvciB0byBiZSBuZWdhdGVkIHRvIGZpbHRlciB3aXRoLCBmb2xsb3dpbmdcblx0KiBQb3N0Z1JFU1Qgc3ludGF4XG5cdCogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbHRlciB3aXRoLCBmb2xsb3dpbmcgUG9zdGdSRVNUIHN5bnRheFxuXHQqL1xuXHRub3QoY29sdW1uLCBvcGVyYXRvciwgdmFsdWUpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYG5vdC4ke29wZXJhdG9yfS4ke3ZhbHVlfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGljaCBzYXRpc2Z5IGF0IGxlYXN0IG9uZSBvZiB0aGUgZmlsdGVycy5cblx0KlxuXHQqIFVubGlrZSBtb3N0IGZpbHRlcnMsIGBmaWx0ZXJzYCBpcyB1c2VkIGFzLWlzIGFuZCBuZWVkcyB0byBmb2xsb3cgW1Bvc3RnUkVTVFxuXHQqIHN5bnRheF0oaHR0cHM6Ly9wb3N0Z3Jlc3Qub3JnL2VuL3N0YWJsZS9hcGkuaHRtbCNvcGVyYXRvcnMpLiBZb3UgYWxzbyBuZWVkXG5cdCogdG8gbWFrZSBzdXJlIGl0J3MgcHJvcGVybHkgc2FuaXRpemVkLlxuXHQqXG5cdCogSXQncyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIHRvIGRvIGFuIGAub3IoKWAgZmlsdGVyIGFjcm9zcyBtdWx0aXBsZSB0YWJsZXMuXG5cdCpcblx0KiBAcGFyYW0gZmlsdGVycyAtIFRoZSBmaWx0ZXJzIHRvIHVzZSwgZm9sbG93aW5nIFBvc3RnUkVTVCBzeW50YXhcblx0KiBAcGFyYW0gb3B0aW9ucyAtIE5hbWVkIHBhcmFtZXRlcnNcblx0KiBAcGFyYW0gb3B0aW9ucy5yZWZlcmVuY2VkVGFibGUgLSBTZXQgdGhpcyB0byBmaWx0ZXIgb24gcmVmZXJlbmNlZCB0YWJsZXNcblx0KiBpbnN0ZWFkIG9mIHRoZSBwYXJlbnQgdGFibGVcblx0KiBAcGFyYW0gb3B0aW9ucy5mb3JlaWduVGFibGUgLSBEZXByZWNhdGVkLCB1c2UgYHJlZmVyZW5jZWRUYWJsZWAgaW5zdGVhZFxuXHQqL1xuXHRvcihmaWx0ZXJzLCB7IGZvcmVpZ25UYWJsZSwgcmVmZXJlbmNlZFRhYmxlID0gZm9yZWlnblRhYmxlIH0gPSB7fSkge1xuXHRcdGNvbnN0IGtleSA9IHJlZmVyZW5jZWRUYWJsZSA/IGAke3JlZmVyZW5jZWRUYWJsZX0ub3JgIDogXCJvclwiO1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBgKCR7ZmlsdGVyc30pYCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoaWNoIHNhdGlzZnkgdGhlIGZpbHRlci4gVGhpcyBpcyBhbiBlc2NhcGUgaGF0Y2ggLSB5b3Vcblx0KiBzaG91bGQgdXNlIHRoZSBzcGVjaWZpYyBmaWx0ZXIgbWV0aG9kcyB3aGVyZXZlciBwb3NzaWJsZS5cblx0KlxuXHQqIFVubGlrZSBtb3N0IGZpbHRlcnMsIGBvcGVhcmF0b3JgIGFuZCBgdmFsdWVgIGFyZSB1c2VkIGFzLWlzIGFuZCBuZWVkIHRvXG5cdCogZm9sbG93IFtQb3N0Z1JFU1Rcblx0KiBzeW50YXhdKGh0dHBzOi8vcG9zdGdyZXN0Lm9yZy9lbi9zdGFibGUvYXBpLmh0bWwjb3BlcmF0b3JzKS4gWW91IGFsc28gbmVlZFxuXHQqIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBwcm9wZXJseSBzYW5pdGl6ZWQuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gb3BlcmF0b3IgLSBUaGUgb3BlcmF0b3IgdG8gZmlsdGVyIHdpdGgsIGZvbGxvd2luZyBQb3N0Z1JFU1Qgc3ludGF4XG5cdCogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbHRlciB3aXRoLCBmb2xsb3dpbmcgUG9zdGdSRVNUIHN5bnRheFxuXHQqL1xuXHRmaWx0ZXIoY29sdW1uLCBvcGVyYXRvciwgdmFsdWUpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYCR7b3BlcmF0b3J9LiR7dmFsdWV9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9Qb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIudHNcbnZhciBQb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIgPSBjbGFzcyB7XG5cdC8qKlxuXHQqIENyZWF0ZXMgYSBxdWVyeSBidWlsZGVyIHNjb3BlZCB0byBhIFBvc3RncmVzIHRhYmxlIG9yIHZpZXcuXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHRzXG5cdCogaW1wb3J0IFBvc3RncmVzdFF1ZXJ5QnVpbGRlciBmcm9tICdAc3VwYWJhc2UvcG9zdGdyZXN0LWpzJ1xuXHQqXG5cdCogY29uc3QgcXVlcnkgPSBuZXcgUG9zdGdyZXN0UXVlcnlCdWlsZGVyKFxuXHQqICAgbmV3IFVSTCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL3Jlc3QvdjEvdXNlcnMnKSxcblx0KiAgIHsgaGVhZGVyczogeyBhcGlrZXk6ICdwdWJsaWMtYW5vbi1rZXknIH0gfVxuXHQqIClcblx0KiBgYGBcblx0Ki9cblx0Y29uc3RydWN0b3IodXJsLCB7IGhlYWRlcnMgPSB7fSwgc2NoZW1hLCBmZXRjaDogZmV0Y2gkMSB9KSB7XG5cdFx0dGhpcy51cmwgPSB1cmw7XG5cdFx0dGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaGVhZGVycyk7XG5cdFx0dGhpcy5zY2hlbWEgPSBzY2hlbWE7XG5cdFx0dGhpcy5mZXRjaCA9IGZldGNoJDE7XG5cdH1cblx0LyoqXG5cdCogUGVyZm9ybSBhIFNFTEVDVCBxdWVyeSBvbiB0aGUgdGFibGUgb3Igdmlldy5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW5zIC0gVGhlIGNvbHVtbnMgdG8gcmV0cmlldmUsIHNlcGFyYXRlZCBieSBjb21tYXMuIENvbHVtbnMgY2FuIGJlIHJlbmFtZWQgd2hlbiByZXR1cm5lZCB3aXRoIGBjdXN0b21OYW1lOmNvbHVtbk5hbWVgXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucyAtIE5hbWVkIHBhcmFtZXRlcnNcblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zLmhlYWQgLSBXaGVuIHNldCB0byBgdHJ1ZWAsIGBkYXRhYCB3aWxsIG5vdCBiZSByZXR1cm5lZC5cblx0KiBVc2VmdWwgaWYgeW91IG9ubHkgbmVlZCB0aGUgY291bnQuXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucy5jb3VudCAtIENvdW50IGFsZ29yaXRobSB0byB1c2UgdG8gY291bnQgcm93cyBpbiB0aGUgdGFibGUgb3Igdmlldy5cblx0KlxuXHQqIGBcImV4YWN0XCJgOiBFeGFjdCBidXQgc2xvdyBjb3VudCBhbGdvcml0aG0uIFBlcmZvcm1zIGEgYENPVU5UKCopYCB1bmRlciB0aGVcblx0KiBob29kLlxuXHQqXG5cdCogYFwicGxhbm5lZFwiYDogQXBwcm94aW1hdGVkIGJ1dCBmYXN0IGNvdW50IGFsZ29yaXRobS4gVXNlcyB0aGUgUG9zdGdyZXNcblx0KiBzdGF0aXN0aWNzIHVuZGVyIHRoZSBob29kLlxuXHQqXG5cdCogYFwiZXN0aW1hdGVkXCJgOiBVc2VzIGV4YWN0IGNvdW50IGZvciBsb3cgbnVtYmVycyBhbmQgcGxhbm5lZCBjb3VudCBmb3IgaGlnaFxuXHQqIG51bWJlcnMuXG5cdCovXG5cdHNlbGVjdChjb2x1bW5zLCBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBoZWFkID0gZmFsc2UsIGNvdW50IH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcblx0XHRjb25zdCBtZXRob2QgPSBoZWFkID8gXCJIRUFEXCIgOiBcIkdFVFwiO1xuXHRcdGxldCBxdW90ZWQgPSBmYWxzZTtcblx0XHRjb25zdCBjbGVhbmVkQ29sdW1ucyA9IChjb2x1bW5zICE9PSBudWxsICYmIGNvbHVtbnMgIT09IHZvaWQgMCA/IGNvbHVtbnMgOiBcIipcIikuc3BsaXQoXCJcIikubWFwKChjKSA9PiB7XG5cdFx0XHRpZiAoL1xccy8udGVzdChjKSAmJiAhcXVvdGVkKSByZXR1cm4gXCJcIjtcblx0XHRcdGlmIChjID09PSBcIlxcXCJcIikgcXVvdGVkID0gIXF1b3RlZDtcblx0XHRcdHJldHVybiBjO1xuXHRcdH0pLmpvaW4oXCJcIik7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLnNldChcInNlbGVjdFwiLCBjbGVhbmVkQ29sdW1ucyk7XG5cdFx0aWYgKGNvdW50KSB0aGlzLmhlYWRlcnMuYXBwZW5kKFwiUHJlZmVyXCIsIGBjb3VudD0ke2NvdW50fWApO1xuXHRcdHJldHVybiBuZXcgUG9zdGdyZXN0RmlsdGVyQnVpbGRlcih7XG5cdFx0XHRtZXRob2QsXG5cdFx0XHR1cmw6IHRoaXMudXJsLFxuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0c2NoZW1hOiB0aGlzLnNjaGVtYSxcblx0XHRcdGZldGNoOiB0aGlzLmZldGNoXG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCogUGVyZm9ybSBhbiBJTlNFUlQgaW50byB0aGUgdGFibGUgb3Igdmlldy5cblx0KlxuXHQqIEJ5IGRlZmF1bHQsIGluc2VydGVkIHJvd3MgYXJlIG5vdCByZXR1cm5lZC4gVG8gcmV0dXJuIGl0LCBjaGFpbiB0aGUgY2FsbFxuXHQqIHdpdGggYC5zZWxlY3QoKWAuXG5cdCpcblx0KiBAcGFyYW0gdmFsdWVzIC0gVGhlIHZhbHVlcyB0byBpbnNlcnQuIFBhc3MgYW4gb2JqZWN0IHRvIGluc2VydCBhIHNpbmdsZSByb3dcblx0KiBvciBhbiBhcnJheSB0byBpbnNlcnQgbXVsdGlwbGUgcm93cy5cblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zIC0gTmFtZWQgcGFyYW1ldGVyc1xuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMuY291bnQgLSBDb3VudCBhbGdvcml0aG0gdG8gdXNlIHRvIGNvdW50IGluc2VydGVkIHJvd3MuXG5cdCpcblx0KiBgXCJleGFjdFwiYDogRXhhY3QgYnV0IHNsb3cgY291bnQgYWxnb3JpdGhtLiBQZXJmb3JtcyBhIGBDT1VOVCgqKWAgdW5kZXIgdGhlXG5cdCogaG9vZC5cblx0KlxuXHQqIGBcInBsYW5uZWRcImA6IEFwcHJveGltYXRlZCBidXQgZmFzdCBjb3VudCBhbGdvcml0aG0uIFVzZXMgdGhlIFBvc3RncmVzXG5cdCogc3RhdGlzdGljcyB1bmRlciB0aGUgaG9vZC5cblx0KlxuXHQqIGBcImVzdGltYXRlZFwiYDogVXNlcyBleGFjdCBjb3VudCBmb3IgbG93IG51bWJlcnMgYW5kIHBsYW5uZWQgY291bnQgZm9yIGhpZ2hcblx0KiBudW1iZXJzLlxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMuZGVmYXVsdFRvTnVsbCAtIE1ha2UgbWlzc2luZyBmaWVsZHMgZGVmYXVsdCB0byBgbnVsbGAuXG5cdCogT3RoZXJ3aXNlLCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb2x1bW4uIE9ubHkgYXBwbGllcyBmb3IgYnVsa1xuXHQqIGluc2VydHMuXG5cdCovXG5cdGluc2VydCh2YWx1ZXMsIHsgY291bnQsIGRlZmF1bHRUb051bGwgPSB0cnVlIH0gPSB7fSkge1xuXHRcdHZhciBfdGhpcyRmZXRjaDtcblx0XHRjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcblx0XHRpZiAoY291bnQpIHRoaXMuaGVhZGVycy5hcHBlbmQoXCJQcmVmZXJcIiwgYGNvdW50PSR7Y291bnR9YCk7XG5cdFx0aWYgKCFkZWZhdWx0VG9OdWxsKSB0aGlzLmhlYWRlcnMuYXBwZW5kKFwiUHJlZmVyXCIsIGBtaXNzaW5nPWRlZmF1bHRgKTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5zID0gdmFsdWVzLnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MuY29uY2F0KE9iamVjdC5rZXlzKHgpKSwgW10pO1xuXHRcdFx0aWYgKGNvbHVtbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb25zdCB1bmlxdWVDb2x1bW5zID0gWy4uLm5ldyBTZXQoY29sdW1ucyldLm1hcCgoY29sdW1uKSA9PiBgXCIke2NvbHVtbn1cImApO1xuXHRcdFx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY29sdW1uc1wiLCB1bmlxdWVDb2x1bW5zLmpvaW4oXCIsXCIpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG5ldyBQb3N0Z3Jlc3RGaWx0ZXJCdWlsZGVyKHtcblx0XHRcdG1ldGhvZCxcblx0XHRcdHVybDogdGhpcy51cmwsXG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRzY2hlbWE6IHRoaXMuc2NoZW1hLFxuXHRcdFx0Ym9keTogdmFsdWVzLFxuXHRcdFx0ZmV0Y2g6IChfdGhpcyRmZXRjaCA9IHRoaXMuZmV0Y2gpICE9PSBudWxsICYmIF90aGlzJGZldGNoICE9PSB2b2lkIDAgPyBfdGhpcyRmZXRjaCA6IGZldGNoXG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCogUGVyZm9ybSBhbiBVUFNFUlQgb24gdGhlIHRhYmxlIG9yIHZpZXcuIERlcGVuZGluZyBvbiB0aGUgY29sdW1uKHMpIHBhc3NlZFxuXHQqIHRvIGBvbkNvbmZsaWN0YCwgYC51cHNlcnQoKWAgYWxsb3dzIHlvdSB0byBwZXJmb3JtIHRoZSBlcXVpdmFsZW50IG9mXG5cdCogYC5pbnNlcnQoKWAgaWYgYSByb3cgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBgb25Db25mbGljdGAgY29sdW1ucyBkb2Vzbid0XG5cdCogZXhpc3QsIG9yIGlmIGl0IGRvZXMgZXhpc3QsIHBlcmZvcm0gYW4gYWx0ZXJuYXRpdmUgYWN0aW9uIGRlcGVuZGluZyBvblxuXHQqIGBpZ25vcmVEdXBsaWNhdGVzYC5cblx0KlxuXHQqIEJ5IGRlZmF1bHQsIHVwc2VydGVkIHJvd3MgYXJlIG5vdCByZXR1cm5lZC4gVG8gcmV0dXJuIGl0LCBjaGFpbiB0aGUgY2FsbFxuXHQqIHdpdGggYC5zZWxlY3QoKWAuXG5cdCpcblx0KiBAcGFyYW0gdmFsdWVzIC0gVGhlIHZhbHVlcyB0byB1cHNlcnQgd2l0aC4gUGFzcyBhbiBvYmplY3QgdG8gdXBzZXJ0IGFcblx0KiBzaW5nbGUgcm93IG9yIGFuIGFycmF5IHRvIHVwc2VydCBtdWx0aXBsZSByb3dzLlxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucy5vbkNvbmZsaWN0IC0gQ29tbWEtc2VwYXJhdGVkIFVOSVFVRSBjb2x1bW4ocykgdG8gc3BlY2lmeSBob3dcblx0KiBkdXBsaWNhdGUgcm93cyBhcmUgZGV0ZXJtaW5lZC4gVHdvIHJvd3MgYXJlIGR1cGxpY2F0ZXMgaWYgYWxsIHRoZVxuXHQqIGBvbkNvbmZsaWN0YCBjb2x1bW5zIGFyZSBlcXVhbC5cblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zLmlnbm9yZUR1cGxpY2F0ZXMgLSBJZiBgdHJ1ZWAsIGR1cGxpY2F0ZSByb3dzIGFyZSBpZ25vcmVkLiBJZlxuXHQqIGBmYWxzZWAsIGR1cGxpY2F0ZSByb3dzIGFyZSBtZXJnZWQgd2l0aCBleGlzdGluZyByb3dzLlxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMuY291bnQgLSBDb3VudCBhbGdvcml0aG0gdG8gdXNlIHRvIGNvdW50IHVwc2VydGVkIHJvd3MuXG5cdCpcblx0KiBgXCJleGFjdFwiYDogRXhhY3QgYnV0IHNsb3cgY291bnQgYWxnb3JpdGhtLiBQZXJmb3JtcyBhIGBDT1VOVCgqKWAgdW5kZXIgdGhlXG5cdCogaG9vZC5cblx0KlxuXHQqIGBcInBsYW5uZWRcImA6IEFwcHJveGltYXRlZCBidXQgZmFzdCBjb3VudCBhbGdvcml0aG0uIFVzZXMgdGhlIFBvc3RncmVzXG5cdCogc3RhdGlzdGljcyB1bmRlciB0aGUgaG9vZC5cblx0KlxuXHQqIGBcImVzdGltYXRlZFwiYDogVXNlcyBleGFjdCBjb3VudCBmb3IgbG93IG51bWJlcnMgYW5kIHBsYW5uZWQgY291bnQgZm9yIGhpZ2hcblx0KiBudW1iZXJzLlxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMuZGVmYXVsdFRvTnVsbCAtIE1ha2UgbWlzc2luZyBmaWVsZHMgZGVmYXVsdCB0byBgbnVsbGAuXG5cdCogT3RoZXJ3aXNlLCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb2x1bW4uIFRoaXMgb25seSBhcHBsaWVzIHdoZW5cblx0KiBpbnNlcnRpbmcgbmV3IHJvd3MsIG5vdCB3aGVuIG1lcmdpbmcgd2l0aCBleGlzdGluZyByb3dzIHVuZGVyXG5cdCogYGlnbm9yZUR1cGxpY2F0ZXM6IGZhbHNlYC4gVGhpcyBhbHNvIG9ubHkgYXBwbGllcyB3aGVuIGRvaW5nIGJ1bGsgdXBzZXJ0cy5cblx0KlxuXHQqIEBleGFtcGxlIFVwc2VydCBhIHNpbmdsZSByb3cgdXNpbmcgYSB1bmlxdWUga2V5XG5cdCogYGBgdHNcblx0KiAvLyBVcHNlcnRpbmcgYSBzaW5nbGUgcm93LCBvdmVyd3JpdGluZyBiYXNlZCBvbiB0aGUgJ3VzZXJuYW1lJyB1bmlxdWUgY29sdW1uXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5mcm9tKCd1c2VycycpXG5cdCogICAudXBzZXJ0KHsgdXNlcm5hbWU6ICdzdXBhYm90JyB9LCB7IG9uQ29uZmxpY3Q6ICd1c2VybmFtZScgfSlcblx0KlxuXHQqIC8vIEV4YW1wbGUgcmVzcG9uc2U6XG5cdCogLy8ge1xuXHQqIC8vICAgZGF0YTogW1xuXHQqIC8vICAgICB7IGlkOiA0LCBtZXNzYWdlOiAnYmFyJywgdXNlcm5hbWU6ICdzdXBhYm90JyB9XG5cdCogLy8gICBdLFxuXHQqIC8vICAgZXJyb3I6IG51bGxcblx0KiAvLyB9XG5cdCogYGBgXG5cdCpcblx0KiBAZXhhbXBsZSBVcHNlcnQgd2l0aCBjb25mbGljdCByZXNvbHV0aW9uIGFuZCBleGFjdCByb3cgY291bnRpbmdcblx0KiBgYGB0c1xuXHQqIC8vIFVwc2VydGluZyBhbmQgcmV0dXJuaW5nIGV4YWN0IGNvdW50XG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciwgY291bnQgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuZnJvbSgndXNlcnMnKVxuXHQqICAgLnVwc2VydChcblx0KiAgICAge1xuXHQqICAgICAgIGlkOiAzLFxuXHQqICAgICAgIG1lc3NhZ2U6ICdmb28nLFxuXHQqICAgICAgIHVzZXJuYW1lOiAnc3VwYWJvdCdcblx0KiAgICAgfSxcblx0KiAgICAge1xuXHQqICAgICAgIG9uQ29uZmxpY3Q6ICd1c2VybmFtZScsXG5cdCogICAgICAgY291bnQ6ICdleGFjdCdcblx0KiAgICAgfVxuXHQqICAgKVxuXHQqXG5cdCogLy8gRXhhbXBsZSByZXNwb25zZTpcblx0KiAvLyB7XG5cdCogLy8gICBkYXRhOiBbXG5cdCogLy8gICAgIHtcblx0KiAvLyAgICAgICBpZDogNDIsXG5cdCogLy8gICAgICAgaGFuZGxlOiBcInNhb2lyc2VcIixcblx0KiAvLyAgICAgICBkaXNwbGF5X25hbWU6IFwiU2FvaXJzZVwiXG5cdCogLy8gICAgIH1cblx0KiAvLyAgIF0sXG5cdCogLy8gICBjb3VudDogMSxcblx0KiAvLyAgIGVycm9yOiBudWxsXG5cdCogLy8gfVxuXHQqIGBgYFxuXHQqL1xuXHR1cHNlcnQodmFsdWVzLCB7IG9uQ29uZmxpY3QsIGlnbm9yZUR1cGxpY2F0ZXMgPSBmYWxzZSwgY291bnQsIGRlZmF1bHRUb051bGwgPSB0cnVlIH0gPSB7fSkge1xuXHRcdHZhciBfdGhpcyRmZXRjaDI7XG5cdFx0Y29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG5cdFx0dGhpcy5oZWFkZXJzLmFwcGVuZChcIlByZWZlclwiLCBgcmVzb2x1dGlvbj0ke2lnbm9yZUR1cGxpY2F0ZXMgPyBcImlnbm9yZVwiIDogXCJtZXJnZVwifS1kdXBsaWNhdGVzYCk7XG5cdFx0aWYgKG9uQ29uZmxpY3QgIT09IHZvaWQgMCkgdGhpcy51cmwuc2VhcmNoUGFyYW1zLnNldChcIm9uX2NvbmZsaWN0XCIsIG9uQ29uZmxpY3QpO1xuXHRcdGlmIChjb3VudCkgdGhpcy5oZWFkZXJzLmFwcGVuZChcIlByZWZlclwiLCBgY291bnQ9JHtjb3VudH1gKTtcblx0XHRpZiAoIWRlZmF1bHRUb051bGwpIHRoaXMuaGVhZGVycy5hcHBlbmQoXCJQcmVmZXJcIiwgXCJtaXNzaW5nPWRlZmF1bHRcIik7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuXHRcdFx0Y29uc3QgY29sdW1ucyA9IHZhbHVlcy5yZWR1Y2UoKGFjYywgeCkgPT4gYWNjLmNvbmNhdChPYmplY3Qua2V5cyh4KSksIFtdKTtcblx0XHRcdGlmIChjb2x1bW5zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y29uc3QgdW5pcXVlQ29sdW1ucyA9IFsuLi5uZXcgU2V0KGNvbHVtbnMpXS5tYXAoKGNvbHVtbikgPT4gYFwiJHtjb2x1bW59XCJgKTtcblx0XHRcdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLnNldChcImNvbHVtbnNcIiwgdW5pcXVlQ29sdW1ucy5qb2luKFwiLFwiKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgUG9zdGdyZXN0RmlsdGVyQnVpbGRlcih7XG5cdFx0XHRtZXRob2QsXG5cdFx0XHR1cmw6IHRoaXMudXJsLFxuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0c2NoZW1hOiB0aGlzLnNjaGVtYSxcblx0XHRcdGJvZHk6IHZhbHVlcyxcblx0XHRcdGZldGNoOiAoX3RoaXMkZmV0Y2gyID0gdGhpcy5mZXRjaCkgIT09IG51bGwgJiYgX3RoaXMkZmV0Y2gyICE9PSB2b2lkIDAgPyBfdGhpcyRmZXRjaDIgOiBmZXRjaFxuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQqIFBlcmZvcm0gYW4gVVBEQVRFIG9uIHRoZSB0YWJsZSBvciB2aWV3LlxuXHQqXG5cdCogQnkgZGVmYXVsdCwgdXBkYXRlZCByb3dzIGFyZSBub3QgcmV0dXJuZWQuIFRvIHJldHVybiBpdCwgY2hhaW4gdGhlIGNhbGxcblx0KiB3aXRoIGAuc2VsZWN0KClgIGFmdGVyIGZpbHRlcnMuXG5cdCpcblx0KiBAcGFyYW0gdmFsdWVzIC0gVGhlIHZhbHVlcyB0byB1cGRhdGUgd2l0aFxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucy5jb3VudCAtIENvdW50IGFsZ29yaXRobSB0byB1c2UgdG8gY291bnQgdXBkYXRlZCByb3dzLlxuXHQqXG5cdCogYFwiZXhhY3RcImA6IEV4YWN0IGJ1dCBzbG93IGNvdW50IGFsZ29yaXRobS4gUGVyZm9ybXMgYSBgQ09VTlQoKilgIHVuZGVyIHRoZVxuXHQqIGhvb2QuXG5cdCpcblx0KiBgXCJwbGFubmVkXCJgOiBBcHByb3hpbWF0ZWQgYnV0IGZhc3QgY291bnQgYWxnb3JpdGhtLiBVc2VzIHRoZSBQb3N0Z3Jlc1xuXHQqIHN0YXRpc3RpY3MgdW5kZXIgdGhlIGhvb2QuXG5cdCpcblx0KiBgXCJlc3RpbWF0ZWRcImA6IFVzZXMgZXhhY3QgY291bnQgZm9yIGxvdyBudW1iZXJzIGFuZCBwbGFubmVkIGNvdW50IGZvciBoaWdoXG5cdCogbnVtYmVycy5cblx0Ki9cblx0dXBkYXRlKHZhbHVlcywgeyBjb3VudCB9ID0ge30pIHtcblx0XHR2YXIgX3RoaXMkZmV0Y2gzO1xuXHRcdGNvbnN0IG1ldGhvZCA9IFwiUEFUQ0hcIjtcblx0XHRpZiAoY291bnQpIHRoaXMuaGVhZGVycy5hcHBlbmQoXCJQcmVmZXJcIiwgYGNvdW50PSR7Y291bnR9YCk7XG5cdFx0cmV0dXJuIG5ldyBQb3N0Z3Jlc3RGaWx0ZXJCdWlsZGVyKHtcblx0XHRcdG1ldGhvZCxcblx0XHRcdHVybDogdGhpcy51cmwsXG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRzY2hlbWE6IHRoaXMuc2NoZW1hLFxuXHRcdFx0Ym9keTogdmFsdWVzLFxuXHRcdFx0ZmV0Y2g6IChfdGhpcyRmZXRjaDMgPSB0aGlzLmZldGNoKSAhPT0gbnVsbCAmJiBfdGhpcyRmZXRjaDMgIT09IHZvaWQgMCA/IF90aGlzJGZldGNoMyA6IGZldGNoXG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCogUGVyZm9ybSBhIERFTEVURSBvbiB0aGUgdGFibGUgb3Igdmlldy5cblx0KlxuXHQqIEJ5IGRlZmF1bHQsIGRlbGV0ZWQgcm93cyBhcmUgbm90IHJldHVybmVkLiBUbyByZXR1cm4gaXQsIGNoYWluIHRoZSBjYWxsXG5cdCogd2l0aCBgLnNlbGVjdCgpYCBhZnRlciBmaWx0ZXJzLlxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucy5jb3VudCAtIENvdW50IGFsZ29yaXRobSB0byB1c2UgdG8gY291bnQgZGVsZXRlZCByb3dzLlxuXHQqXG5cdCogYFwiZXhhY3RcImA6IEV4YWN0IGJ1dCBzbG93IGNvdW50IGFsZ29yaXRobS4gUGVyZm9ybXMgYSBgQ09VTlQoKilgIHVuZGVyIHRoZVxuXHQqIGhvb2QuXG5cdCpcblx0KiBgXCJwbGFubmVkXCJgOiBBcHByb3hpbWF0ZWQgYnV0IGZhc3QgY291bnQgYWxnb3JpdGhtLiBVc2VzIHRoZSBQb3N0Z3Jlc1xuXHQqIHN0YXRpc3RpY3MgdW5kZXIgdGhlIGhvb2QuXG5cdCpcblx0KiBgXCJlc3RpbWF0ZWRcImA6IFVzZXMgZXhhY3QgY291bnQgZm9yIGxvdyBudW1iZXJzIGFuZCBwbGFubmVkIGNvdW50IGZvciBoaWdoXG5cdCogbnVtYmVycy5cblx0Ki9cblx0ZGVsZXRlKHsgY291bnQgfSA9IHt9KSB7XG5cdFx0dmFyIF90aGlzJGZldGNoNDtcblx0XHRjb25zdCBtZXRob2QgPSBcIkRFTEVURVwiO1xuXHRcdGlmIChjb3VudCkgdGhpcy5oZWFkZXJzLmFwcGVuZChcIlByZWZlclwiLCBgY291bnQ9JHtjb3VudH1gKTtcblx0XHRyZXR1cm4gbmV3IFBvc3RncmVzdEZpbHRlckJ1aWxkZXIoe1xuXHRcdFx0bWV0aG9kLFxuXHRcdFx0dXJsOiB0aGlzLnVybCxcblx0XHRcdGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcblx0XHRcdHNjaGVtYTogdGhpcy5zY2hlbWEsXG5cdFx0XHRmZXRjaDogKF90aGlzJGZldGNoNCA9IHRoaXMuZmV0Y2gpICE9PSBudWxsICYmIF90aGlzJGZldGNoNCAhPT0gdm9pZCAwID8gX3RoaXMkZmV0Y2g0IDogZmV0Y2hcblx0XHR9KTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1Bvc3RncmVzdENsaWVudC50c1xuLyoqXG4qIFBvc3RnUkVTVCBjbGllbnQuXG4qXG4qIEB0eXBlUGFyYW0gRGF0YWJhc2UgLSBUeXBlcyBmb3IgdGhlIHNjaGVtYSBmcm9tIHRoZSBbdHlwZVxuKiBnZW5lcmF0b3JdKGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvbmV4dC90eXBlc2NyaXB0LXN1cHBvcnQpXG4qXG4qIEB0eXBlUGFyYW0gU2NoZW1hTmFtZSAtIFBvc3RncmVzIHNjaGVtYSB0byBzd2l0Y2ggdG8uIE11c3QgYmUgYSBzdHJpbmdcbiogbGl0ZXJhbCwgdGhlIHNhbWUgb25lIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuIElmIHRoZSBzY2hlbWEgaXMgbm90XG4qIGBcInB1YmxpY1wiYCwgdGhpcyBtdXN0IGJlIHN1cHBsaWVkIG1hbnVhbGx5LlxuKi9cbnZhciBQb3N0Z3Jlc3RDbGllbnQgPSBjbGFzcyBQb3N0Z3Jlc3RDbGllbnQge1xuXHQvKipcblx0KiBDcmVhdGVzIGEgUG9zdGdSRVNUIGNsaWVudC5cblx0KlxuXHQqIEBwYXJhbSB1cmwgLSBVUkwgb2YgdGhlIFBvc3RnUkVTVCBlbmRwb2ludFxuXHQqIEBwYXJhbSBvcHRpb25zIC0gTmFtZWQgcGFyYW1ldGVyc1xuXHQqIEBwYXJhbSBvcHRpb25zLmhlYWRlcnMgLSBDdXN0b20gaGVhZGVyc1xuXHQqIEBwYXJhbSBvcHRpb25zLnNjaGVtYSAtIFBvc3RncmVzIHNjaGVtYSB0byBzd2l0Y2ggdG9cblx0KiBAcGFyYW0gb3B0aW9ucy5mZXRjaCAtIEN1c3RvbSBmZXRjaFxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHNcblx0KiBpbXBvcnQgUG9zdGdyZXN0Q2xpZW50IGZyb20gJ0BzdXBhYmFzZS9wb3N0Z3Jlc3QtanMnXG5cdCpcblx0KiBjb25zdCBwb3N0Z3Jlc3QgPSBuZXcgUG9zdGdyZXN0Q2xpZW50KCdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vcmVzdC92MScsIHtcblx0KiAgIGhlYWRlcnM6IHsgYXBpa2V5OiAncHVibGljLWFub24ta2V5JyB9LFxuXHQqICAgc2NoZW1hOiAncHVibGljJyxcblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRjb25zdHJ1Y3Rvcih1cmwsIHsgaGVhZGVycyA9IHt9LCBzY2hlbWEsIGZldGNoOiBmZXRjaCQxIH0gPSB7fSkge1xuXHRcdHRoaXMudXJsID0gdXJsO1xuXHRcdHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGhlYWRlcnMpO1xuXHRcdHRoaXMuc2NoZW1hTmFtZSA9IHNjaGVtYTtcblx0XHR0aGlzLmZldGNoID0gZmV0Y2gkMTtcblx0fVxuXHQvKipcblx0KiBQZXJmb3JtIGEgcXVlcnkgb24gYSB0YWJsZSBvciBhIHZpZXcuXG5cdCpcblx0KiBAcGFyYW0gcmVsYXRpb24gLSBUaGUgdGFibGUgb3IgdmlldyBuYW1lIHRvIHF1ZXJ5XG5cdCovXG5cdGZyb20ocmVsYXRpb24pIHtcblx0XHRpZiAoIXJlbGF0aW9uIHx8IHR5cGVvZiByZWxhdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCByZWxhdGlvbi50cmltKCkgPT09IFwiXCIpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcmVsYXRpb24gbmFtZTogcmVsYXRpb24gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuXCIpO1xuXHRcdHJldHVybiBuZXcgUG9zdGdyZXN0UXVlcnlCdWlsZGVyKG5ldyBVUkwoYCR7dGhpcy51cmx9LyR7cmVsYXRpb259YCksIHtcblx0XHRcdGhlYWRlcnM6IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG5cdFx0XHRzY2hlbWE6IHRoaXMuc2NoZW1hTmFtZSxcblx0XHRcdGZldGNoOiB0aGlzLmZldGNoXG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCogU2VsZWN0IGEgc2NoZW1hIHRvIHF1ZXJ5IG9yIHBlcmZvcm0gYW4gZnVuY3Rpb24gKHJwYykgY2FsbC5cblx0KlxuXHQqIFRoZSBzY2hlbWEgbmVlZHMgdG8gYmUgb24gdGhlIGxpc3Qgb2YgZXhwb3NlZCBzY2hlbWFzIGluc2lkZSBTdXBhYmFzZS5cblx0KlxuXHQqIEBwYXJhbSBzY2hlbWEgLSBUaGUgc2NoZW1hIHRvIHF1ZXJ5XG5cdCovXG5cdHNjaGVtYShzY2hlbWEpIHtcblx0XHRyZXR1cm4gbmV3IFBvc3RncmVzdENsaWVudCh0aGlzLnVybCwge1xuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0c2NoZW1hLFxuXHRcdFx0ZmV0Y2g6IHRoaXMuZmV0Y2hcblx0XHR9KTtcblx0fVxuXHQvKipcblx0KiBQZXJmb3JtIGEgZnVuY3Rpb24gY2FsbC5cblx0KlxuXHQqIEBwYXJhbSBmbiAtIFRoZSBmdW5jdGlvbiBuYW1lIHRvIGNhbGxcblx0KiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gY2FsbFxuXHQqIEBwYXJhbSBvcHRpb25zIC0gTmFtZWQgcGFyYW1ldGVyc1xuXHQqIEBwYXJhbSBvcHRpb25zLmhlYWQgLSBXaGVuIHNldCB0byBgdHJ1ZWAsIGBkYXRhYCB3aWxsIG5vdCBiZSByZXR1cm5lZC5cblx0KiBVc2VmdWwgaWYgeW91IG9ubHkgbmVlZCB0aGUgY291bnQuXG5cdCogQHBhcmFtIG9wdGlvbnMuZ2V0IC0gV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aFxuXHQqIHJlYWQtb25seSBhY2Nlc3MgbW9kZS5cblx0KiBAcGFyYW0gb3B0aW9ucy5jb3VudCAtIENvdW50IGFsZ29yaXRobSB0byB1c2UgdG8gY291bnQgcm93cyByZXR1cm5lZCBieSB0aGVcblx0KiBmdW5jdGlvbi4gT25seSBhcHBsaWNhYmxlIGZvciBbc2V0LXJldHVybmluZ1xuXHQqIGZ1bmN0aW9uc10oaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L2Z1bmN0aW9ucy1zcmYuaHRtbCkuXG5cdCpcblx0KiBgXCJleGFjdFwiYDogRXhhY3QgYnV0IHNsb3cgY291bnQgYWxnb3JpdGhtLiBQZXJmb3JtcyBhIGBDT1VOVCgqKWAgdW5kZXIgdGhlXG5cdCogaG9vZC5cblx0KlxuXHQqIGBcInBsYW5uZWRcImA6IEFwcHJveGltYXRlZCBidXQgZmFzdCBjb3VudCBhbGdvcml0aG0uIFVzZXMgdGhlIFBvc3RncmVzXG5cdCogc3RhdGlzdGljcyB1bmRlciB0aGUgaG9vZC5cblx0KlxuXHQqIGBcImVzdGltYXRlZFwiYDogVXNlcyBleGFjdCBjb3VudCBmb3IgbG93IG51bWJlcnMgYW5kIHBsYW5uZWQgY291bnQgZm9yIGhpZ2hcblx0KiBudW1iZXJzLlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0c1xuXHQqIC8vIEZvciBjcm9zcy1zY2hlbWEgZnVuY3Rpb25zIHdoZXJlIHR5cGUgaW5mZXJlbmNlIGZhaWxzLCB1c2Ugb3ZlcnJpZGVUeXBlczpcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc2NoZW1hKCdzY2hlbWFfYicpXG5cdCogICAucnBjKCdmdW5jdGlvbl9hJywge30pXG5cdCogICAub3ZlcnJpZGVUeXBlczx7IGlkOiBzdHJpbmc7IHVzZXJfaWQ6IHN0cmluZyB9W10+KClcblx0KiBgYGBcblx0Ki9cblx0cnBjKGZuLCBhcmdzID0ge30sIHsgaGVhZCA9IGZhbHNlLCBnZXQgPSBmYWxzZSwgY291bnQgfSA9IHt9KSB7XG5cdFx0dmFyIF90aGlzJGZldGNoO1xuXHRcdGxldCBtZXRob2Q7XG5cdFx0Y29uc3QgdXJsID0gbmV3IFVSTChgJHt0aGlzLnVybH0vcnBjLyR7Zm59YCk7XG5cdFx0bGV0IGJvZHk7XG5cdFx0aWYgKGhlYWQgfHwgZ2V0KSB7XG5cdFx0XHRtZXRob2QgPSBoZWFkID8gXCJIRUFEXCIgOiBcIkdFVFwiO1xuXHRcdFx0T2JqZWN0LmVudHJpZXMoYXJncykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdm9pZCAwKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IFtuYW1lLCBBcnJheS5pc0FycmF5KHZhbHVlKSA/IGB7JHt2YWx1ZS5qb2luKFwiLFwiKX19YCA6IGAke3ZhbHVlfWBdKS5mb3JFYWNoKChbbmFtZSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKG5hbWUsIHZhbHVlKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZXRob2QgPSBcIlBPU1RcIjtcblx0XHRcdGJvZHkgPSBhcmdzO1xuXHRcdH1cblx0XHRjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKTtcblx0XHRpZiAoY291bnQpIGhlYWRlcnMuc2V0KFwiUHJlZmVyXCIsIGBjb3VudD0ke2NvdW50fWApO1xuXHRcdHJldHVybiBuZXcgUG9zdGdyZXN0RmlsdGVyQnVpbGRlcih7XG5cdFx0XHRtZXRob2QsXG5cdFx0XHR1cmwsXG5cdFx0XHRoZWFkZXJzLFxuXHRcdFx0c2NoZW1hOiB0aGlzLnNjaGVtYU5hbWUsXG5cdFx0XHRib2R5LFxuXHRcdFx0ZmV0Y2g6IChfdGhpcyRmZXRjaCA9IHRoaXMuZmV0Y2gpICE9PSBudWxsICYmIF90aGlzJGZldGNoICE9PSB2b2lkIDAgPyBfdGhpcyRmZXRjaCA6IGZldGNoXG5cdFx0fSk7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9pbmRleC50c1xudmFyIHNyY19kZWZhdWx0ID0ge1xuXHRQb3N0Z3Jlc3RDbGllbnQsXG5cdFBvc3RncmVzdFF1ZXJ5QnVpbGRlcixcblx0UG9zdGdyZXN0RmlsdGVyQnVpbGRlcixcblx0UG9zdGdyZXN0VHJhbnNmb3JtQnVpbGRlcixcblx0UG9zdGdyZXN0QnVpbGRlcixcblx0UG9zdGdyZXN0RXJyb3Jcbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgUG9zdGdyZXN0QnVpbGRlciwgUG9zdGdyZXN0Q2xpZW50LCBQb3N0Z3Jlc3RFcnJvciwgUG9zdGdyZXN0RmlsdGVyQnVpbGRlciwgUG9zdGdyZXN0UXVlcnlCdWlsZGVyLCBQb3N0Z3Jlc3RUcmFuc2Zvcm1CdWlsZGVyLCBzcmNfZGVmYXVsdCBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIl0sIm5hbWVzIjpbIlBvc3RncmVzdEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsImNvbnRleHQiLCJtZXNzYWdlIiwibmFtZSIsImRldGFpbHMiLCJoaW50IiwiY29kZSIsIlBvc3RncmVzdEJ1aWxkZXIiLCJ0aHJvd09uRXJyb3IiLCJzaG91bGRUaHJvd09uRXJyb3IiLCJzZXRIZWFkZXIiLCJ2YWx1ZSIsImhlYWRlcnMiLCJIZWFkZXJzIiwic2V0IiwidGhlbiIsIm9uZnVsZmlsbGVkIiwib25yZWplY3RlZCIsIl90aGlzIiwic2NoZW1hIiwiaW5jbHVkZXMiLCJtZXRob2QiLCJfZmV0Y2giLCJmZXRjaCIsInJlcyIsInVybCIsInRvU3RyaW5nIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzaWduYWwiLCJyZXMkMSIsImVycm9yIiwiZGF0YSIsImNvdW50Iiwic3RhdHVzIiwic3RhdHVzVGV4dCIsIm9rIiwiX3RoaXMkaGVhZGVycyRnZXQyIiwiX3JlcyRoZWFkZXJzJGdldCIsIl90aGlzJGhlYWRlcnMkZ2V0IiwidGV4dCIsImdldCIsInBhcnNlIiwiY291bnRIZWFkZXIiLCJtYXRjaCIsImNvbnRlbnRSYW5nZSIsInNwbGl0IiwibGVuZ3RoIiwicGFyc2VJbnQiLCJpc01heWJlU2luZ2xlIiwiQXJyYXkiLCJpc0FycmF5IiwiX2Vycm9yJGRldGFpbHMiLCJfdW51c2VkIiwiY2F0Y2giLCJmZXRjaEVycm9yIiwiX2ZldGNoRXJyb3IkbmFtZTIiLCJlcnJvckRldGFpbHMiLCJjYXVzZSIsIl9jYXVzZSRtZXNzYWdlIiwiX2NhdXNlJGNvZGUiLCJfZmV0Y2hFcnJvciRuYW1lIiwiX2NhdXNlJG5hbWUiLCJjYXVzZU1lc3NhZ2UiLCJjYXVzZUNvZGUiLCJzdGFjayIsIl9mZXRjaEVycm9yJHN0YWNrIiwicmV0dXJucyIsIm92ZXJyaWRlVHlwZXMiLCJidWlsZGVyIiwiX2J1aWxkZXIkc2hvdWxkVGhyb3dPIiwiX2J1aWxkZXIkaXNNYXliZVNpbmdsIiwiUG9zdGdyZXN0VHJhbnNmb3JtQnVpbGRlciIsInNlbGVjdCIsImNvbHVtbnMiLCJxdW90ZWQiLCJjbGVhbmVkQ29sdW1ucyIsIm1hcCIsImMiLCJ0ZXN0Iiwiam9pbiIsInNlYXJjaFBhcmFtcyIsImFwcGVuZCIsIm9yZGVyIiwiY29sdW1uIiwiYXNjZW5kaW5nIiwibnVsbHNGaXJzdCIsImZvcmVpZ25UYWJsZSIsInJlZmVyZW5jZWRUYWJsZSIsImtleSIsImV4aXN0aW5nT3JkZXIiLCJsaW1pdCIsInJhbmdlIiwiZnJvbSIsInRvIiwia2V5T2Zmc2V0Iiwia2V5TGltaXQiLCJhYm9ydFNpZ25hbCIsInNpbmdsZSIsIm1heWJlU2luZ2xlIiwiY3N2IiwiZ2VvanNvbiIsImV4cGxhaW4iLCJhbmFseXplIiwidmVyYm9zZSIsInNldHRpbmdzIiwiYnVmZmVycyIsIndhbCIsImZvcm1hdCIsIm9wdGlvbnMiLCJmaWx0ZXIiLCJCb29sZWFuIiwiZm9yTWVkaWF0eXBlIiwicm9sbGJhY2siLCJtYXhBZmZlY3RlZCIsIlBvc3RncmVzdFJlc2VydmVkQ2hhcnNSZWdleHAiLCJSZWdFeHAiLCJQb3N0Z3Jlc3RGaWx0ZXJCdWlsZGVyIiwiZXEiLCJuZXEiLCJndCIsImd0ZSIsImx0IiwibHRlIiwibGlrZSIsInBhdHRlcm4iLCJsaWtlQWxsT2YiLCJwYXR0ZXJucyIsImxpa2VBbnlPZiIsImlsaWtlIiwiaWxpa2VBbGxPZiIsImlsaWtlQW55T2YiLCJyZWdleE1hdGNoIiwicmVnZXhJTWF0Y2giLCJpcyIsImlzRGlzdGluY3QiLCJpbiIsInZhbHVlcyIsImNsZWFuZWRWYWx1ZXMiLCJTZXQiLCJzIiwibm90SW4iLCJjb250YWlucyIsImNvbnRhaW5lZEJ5IiwicmFuZ2VHdCIsInJhbmdlR3RlIiwicmFuZ2VMdCIsInJhbmdlTHRlIiwicmFuZ2VBZGphY2VudCIsIm92ZXJsYXBzIiwidGV4dFNlYXJjaCIsInF1ZXJ5IiwiY29uZmlnIiwidHlwZSIsInR5cGVQYXJ0IiwiY29uZmlnUGFydCIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwibm90Iiwib3BlcmF0b3IiLCJvciIsImZpbHRlcnMiLCJQb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIiLCJoZWFkIiwiaW5zZXJ0IiwiZGVmYXVsdFRvTnVsbCIsIl90aGlzJGZldGNoIiwicmVkdWNlIiwiYWNjIiwieCIsImNvbmNhdCIsImtleXMiLCJ1bmlxdWVDb2x1bW5zIiwidXBzZXJ0Iiwib25Db25mbGljdCIsImlnbm9yZUR1cGxpY2F0ZXMiLCJfdGhpcyRmZXRjaDIiLCJ1cGRhdGUiLCJfdGhpcyRmZXRjaDMiLCJkZWxldGUiLCJfdGhpcyRmZXRjaDQiLCJmZXRjaCQxIiwiUG9zdGdyZXN0Q2xpZW50IiwicmVsYXRpb24iLCJ0cmltIiwiVVJMIiwic2NoZW1hTmFtZSIsInJwYyIsImZuIiwiYXJncyIsIl8iLCJzcmNfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/postgrest-js/dist/index.mjs\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/storage-js/dist/index.mjs":
/*!**********************************************************!*\
!*** ./node_modules/@supabase/storage-js/dist/index.mjs ***!
\**********************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StorageAnalyticsClient: function() { return /* binding */ StorageAnalyticsClient; },\n/* harmony export */ StorageApiError: function() { return /* binding */ StorageApiError; },\n/* harmony export */ StorageClient: function() { return /* binding */ StorageClient; },\n/* harmony export */ StorageError: function() { return /* binding */ StorageError; },\n/* harmony export */ StorageUnknownError: function() { return /* binding */ StorageUnknownError; },\n/* harmony export */ StorageVectorsApiError: function() { return /* binding */ StorageVectorsApiError; },\n/* harmony export */ StorageVectorsClient: function() { return /* binding */ StorageVectorsClient; },\n/* harmony export */ StorageVectorsError: function() { return /* binding */ StorageVectorsError; },\n/* harmony export */ StorageVectorsErrorCode: function() { return /* binding */ StorageVectorsErrorCode; },\n/* harmony export */ StorageVectorsUnknownError: function() { return /* binding */ StorageVectorsUnknownError; },\n/* harmony export */ VectorBucketApi: function() { return /* binding */ VectorBucketApi; },\n/* harmony export */ VectorBucketScope: function() { return /* binding */ VectorBucketScope; },\n/* harmony export */ VectorDataApi: function() { return /* binding */ VectorDataApi; },\n/* harmony export */ VectorIndexApi: function() { return /* binding */ VectorIndexApi; },\n/* harmony export */ VectorIndexScope: function() { return /* binding */ VectorIndexScope; },\n/* harmony export */ isPlainObject: function() { return /* binding */ isPlainObject; },\n/* harmony export */ isStorageError: function() { return /* binding */ isStorageError; },\n/* harmony export */ isStorageVectorsError: function() { return /* binding */ isStorageVectorsError; },\n/* harmony export */ normalizeToFloat32: function() { return /* binding */ normalizeToFloat32; },\n/* harmony export */ resolveFetch: function() { return /* binding */ resolveFetch; },\n/* harmony export */ resolveResponse: function() { return /* binding */ resolveResponse; },\n/* harmony export */ validateVectorDimension: function() { return /* binding */ validateVectorDimension; }\n/* harmony export */ });\n/* harmony import */ var iceberg_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! iceberg-js */ \"(app-pages-browser)/./node_modules/iceberg-js/dist/index.mjs\");\n/* provided dependency */ var Buffer = __webpack_require__(/*! buffer */ \"(app-pages-browser)/./node_modules/next/dist/compiled/buffer/index.js\")[\"Buffer\"];\n\n//#region src/lib/errors.ts\nvar StorageError = class extends Error {\n constructor(message){\n super(message);\n this.__isStorageError = true;\n this.name = \"StorageError\";\n }\n};\nfunction isStorageError(error) {\n return typeof error === \"object\" && error !== null && \"__isStorageError\" in error;\n}\nvar StorageApiError = class extends StorageError {\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n statusCode: this.statusCode\n };\n }\n constructor(message, status, statusCode){\n super(message);\n this.name = \"StorageApiError\";\n this.status = status;\n this.statusCode = statusCode;\n }\n};\nvar StorageUnknownError = class extends StorageError {\n constructor(message, originalError){\n super(message);\n this.name = \"StorageUnknownError\";\n this.originalError = originalError;\n }\n};\n//#endregion\n//#region src/lib/helpers.ts\nconst resolveFetch$1 = (customFetch)=>{\n if (customFetch) return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return customFetch(...args);\n };\n return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return fetch(...args);\n };\n};\nconst resolveResponse$1 = ()=>{\n return Response;\n};\nconst recursiveToCamel = (item)=>{\n if (Array.isArray(item)) return item.map((el)=>recursiveToCamel(el));\n else if (typeof item === \"function\" || item !== Object(item)) return item;\n const result = {};\n Object.entries(item).forEach((param)=>{\n let [key, value] = param;\n const newKey = key.replace(/([-_][a-z])/gi, (c)=>c.toUpperCase().replace(/[-_]/g, \"\"));\n result[newKey] = recursiveToCamel(value);\n });\n return result;\n};\n/**\n* Determine if input is a plain object\n* An object is plain if it's created by either {}, new Object(), or Object.create(null)\n* source: https://github.com/sindresorhus/is-plain-obj\n*/ const isPlainObject$1 = (value)=>{\n if (typeof value !== \"object\" || value === null) return false;\n const prototype = Object.getPrototypeOf(value);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value);\n};\n/**\n* Validates if a given bucket name is valid according to Supabase Storage API rules\n* Mirrors backend validation from: storage/src/storage/limits.ts:isValidBucketName()\n*\n* Rules:\n* - Length: 1-100 characters\n* - Allowed characters: alphanumeric (a-z, A-Z, 0-9), underscore (_), and safe special characters\n* - Safe special characters: ! - . * ' ( ) space & $ @ = ; : + , ?\n* - Forbidden: path separators (/, \\), path traversal (..), leading/trailing whitespace\n*\n* AWS S3 Reference: https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\n*\n* @param bucketName - The bucket name to validate\n* @returns true if valid, false otherwise\n*/ const isValidBucketName = (bucketName)=>{\n if (!bucketName || typeof bucketName !== \"string\") return false;\n if (bucketName.length === 0 || bucketName.length > 100) return false;\n if (bucketName.trim() !== bucketName) return false;\n if (bucketName.includes(\"/\") || bucketName.includes(\"\\\\\")) return false;\n return /^[\\w!.\\*'() &$@=;:+,?-]+$/.test(bucketName);\n};\n//#endregion\n//#region \\0@oxc-project+runtime@0.101.0/helpers/typeof.js\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(o$1) {\n return typeof o$1;\n } : function(o$1) {\n return o$1 && \"function\" == typeof Symbol && o$1.constructor === Symbol && o$1 !== Symbol.prototype ? \"symbol\" : typeof o$1;\n }, _typeof(o);\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.101.0/helpers/toPrimitive.js\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.101.0/helpers/toPropertyKey.js\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.101.0/helpers/defineProperty.js\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.101.0/helpers/objectSpread2.js\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function(r$1) {\n return Object.getOwnPropertyDescriptor(e, r$1).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for(var r = 1; r < arguments.length; r++){\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function(r$1) {\n _defineProperty(e, r$1, t[r$1]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r$1) {\n Object.defineProperty(e, r$1, Object.getOwnPropertyDescriptor(t, r$1));\n });\n }\n return e;\n}\n//#endregion\n//#region src/lib/fetch.ts\nconst _getErrorMessage$1 = (err)=>{\n var _err$error;\n return err.msg || err.message || err.error_description || (typeof err.error === \"string\" ? err.error : (_err$error = err.error) === null || _err$error === void 0 ? void 0 : _err$error.message) || JSON.stringify(err);\n};\nconst handleError$1 = async (error, reject, options)=>{\n if (error instanceof await resolveResponse$1() && !(options === null || options === void 0 ? void 0 : options.noResolveJson)) error.json().then((err)=>{\n const status = error.status || 500;\n const statusCode = (err === null || err === void 0 ? void 0 : err.statusCode) || status + \"\";\n reject(new StorageApiError(_getErrorMessage$1(err), status, statusCode));\n }).catch((err)=>{\n reject(new StorageUnknownError(_getErrorMessage$1(err), err));\n });\n else reject(new StorageUnknownError(_getErrorMessage$1(error), error));\n};\nconst _getRequestParams$1 = (method, options, parameters, body)=>{\n const params = {\n method,\n headers: (options === null || options === void 0 ? void 0 : options.headers) || {}\n };\n if (method === \"GET\" || !body) return params;\n if (isPlainObject$1(body)) {\n params.headers = _objectSpread2({\n \"Content-Type\": \"application/json\"\n }, options === null || options === void 0 ? void 0 : options.headers);\n params.body = JSON.stringify(body);\n } else params.body = body;\n if (options === null || options === void 0 ? void 0 : options.duplex) params.duplex = options.duplex;\n return _objectSpread2(_objectSpread2({}, params), parameters);\n};\nasync function _handleRequest$1(fetcher, method, url, options, parameters, body) {\n return new Promise((resolve, reject)=>{\n fetcher(url, _getRequestParams$1(method, options, parameters, body)).then((result)=>{\n if (!result.ok) throw result;\n if (options === null || options === void 0 ? void 0 : options.noResolveJson) return result;\n return result.json();\n }).then((data)=>resolve(data)).catch((error)=>handleError$1(error, reject, options));\n });\n}\nasync function get(fetcher, url, options, parameters) {\n return _handleRequest$1(fetcher, \"GET\", url, options, parameters);\n}\nasync function post$1(fetcher, url, body, options, parameters) {\n return _handleRequest$1(fetcher, \"POST\", url, options, parameters, body);\n}\nasync function put(fetcher, url, body, options, parameters) {\n return _handleRequest$1(fetcher, \"PUT\", url, options, parameters, body);\n}\nasync function head(fetcher, url, options, parameters) {\n return _handleRequest$1(fetcher, \"HEAD\", url, _objectSpread2(_objectSpread2({}, options), {}, {\n noResolveJson: true\n }), parameters);\n}\nasync function remove(fetcher, url, body, options, parameters) {\n return _handleRequest$1(fetcher, \"DELETE\", url, options, parameters, body);\n}\n//#endregion\n//#region src/packages/StreamDownloadBuilder.ts\nvar StreamDownloadBuilder = class {\n then(onfulfilled, onrejected) {\n return this.execute().then(onfulfilled, onrejected);\n }\n async execute() {\n var _this = this;\n try {\n return {\n data: (await _this.downloadFn()).body,\n error: null\n };\n } catch (error) {\n if (_this.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n constructor(downloadFn, shouldThrowOnError){\n this.downloadFn = downloadFn;\n this.shouldThrowOnError = shouldThrowOnError;\n }\n};\n//#endregion\n//#region src/packages/BlobDownloadBuilder.ts\nlet _Symbol$toStringTag;\n_Symbol$toStringTag = Symbol.toStringTag;\nvar BlobDownloadBuilder = class {\n asStream() {\n return new StreamDownloadBuilder(this.downloadFn, this.shouldThrowOnError);\n }\n then(onfulfilled, onrejected) {\n return this.getPromise().then(onfulfilled, onrejected);\n }\n catch(onrejected) {\n return this.getPromise().catch(onrejected);\n }\n finally(onfinally) {\n return this.getPromise().finally(onfinally);\n }\n getPromise() {\n if (!this.promise) this.promise = this.execute();\n return this.promise;\n }\n async execute() {\n var _this = this;\n try {\n return {\n data: await (await _this.downloadFn()).blob(),\n error: null\n };\n } catch (error) {\n if (_this.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n constructor(downloadFn, shouldThrowOnError){\n this.downloadFn = downloadFn;\n this.shouldThrowOnError = shouldThrowOnError;\n this[_Symbol$toStringTag] = \"BlobDownloadBuilder\";\n this.promise = null;\n }\n};\n//#endregion\n//#region src/packages/StorageFileApi.ts\nconst DEFAULT_SEARCH_OPTIONS = {\n limit: 100,\n offset: 0,\n sortBy: {\n column: \"name\",\n order: \"asc\"\n }\n};\nconst DEFAULT_FILE_OPTIONS = {\n cacheControl: \"3600\",\n contentType: \"text/plain;charset=UTF-8\",\n upsert: false\n};\nvar StorageFileApi = class {\n /**\n\t* Enable throwing errors instead of returning them.\n\t*\n\t* @category File Buckets\n\t*/ throwOnError() {\n this.shouldThrowOnError = true;\n return this;\n }\n /**\n\t* Uploads a file to an existing bucket or replaces an existing file at the specified path with a new one.\n\t*\n\t* @param method HTTP method.\n\t* @param path The relative file path. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to upload.\n\t* @param fileBody The body of the file to be stored in the bucket.\n\t*/ async uploadOrUpdate(method, path, fileBody, fileOptions) {\n var _this = this;\n try {\n let body;\n const options = _objectSpread2(_objectSpread2({}, DEFAULT_FILE_OPTIONS), fileOptions);\n let headers = _objectSpread2(_objectSpread2({}, _this.headers), method === \"POST\" && {\n \"x-upsert\": String(options.upsert)\n });\n const metadata = options.metadata;\n if (typeof Blob !== \"undefined\" && fileBody instanceof Blob) {\n body = new FormData();\n body.append(\"cacheControl\", options.cacheControl);\n if (metadata) body.append(\"metadata\", _this.encodeMetadata(metadata));\n body.append(\"\", fileBody);\n } else if (typeof FormData !== \"undefined\" && fileBody instanceof FormData) {\n body = fileBody;\n if (!body.has(\"cacheControl\")) body.append(\"cacheControl\", options.cacheControl);\n if (metadata && !body.has(\"metadata\")) body.append(\"metadata\", _this.encodeMetadata(metadata));\n } else {\n body = fileBody;\n headers[\"cache-control\"] = \"max-age=\".concat(options.cacheControl);\n headers[\"content-type\"] = options.contentType;\n if (metadata) headers[\"x-metadata\"] = _this.toBase64(_this.encodeMetadata(metadata));\n if ((typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream || body && typeof body === \"object\" && \"pipe\" in body && typeof body.pipe === \"function\") && !options.duplex) options.duplex = \"half\";\n }\n if (fileOptions === null || fileOptions === void 0 ? void 0 : fileOptions.headers) headers = _objectSpread2(_objectSpread2({}, headers), fileOptions.headers);\n const cleanPath = _this._removeEmptyFolders(path);\n const _path = _this._getFinalPath(cleanPath);\n const data = await (method == \"PUT\" ? put : post$1)(_this.fetch, \"\".concat(_this.url, \"/object/\").concat(_path), body, _objectSpread2({\n headers\n }, (options === null || options === void 0 ? void 0 : options.duplex) ? {\n duplex: options.duplex\n } : {}));\n return {\n data: {\n path: cleanPath,\n id: data.Id,\n fullPath: data.Key\n },\n error: null\n };\n } catch (error) {\n if (_this.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Uploads a file to an existing bucket.\n\t*\n\t* @category File Buckets\n\t* @param path The file path, including the file name. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to upload.\n\t* @param fileBody The body of the file to be stored in the bucket.\n\t* @param fileOptions Optional file upload options including cacheControl, contentType, upsert, and metadata.\n\t* @returns Promise with response containing file path, id, and fullPath or error\n\t*\n\t* @example Upload file\n\t* ```js\n\t* const avatarFile = event.target.files[0]\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .upload('public/avatar1.png', avatarFile, {\n\t* cacheControl: '3600',\n\t* upsert: false\n\t* })\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"path\": \"public/avatar1.png\",\n\t* \"fullPath\": \"avatars/public/avatar1.png\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*\n\t* @example Upload file using `ArrayBuffer` from base64 file data\n\t* ```js\n\t* import { decode } from 'base64-arraybuffer'\n\t*\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .upload('public/avatar1.png', decode('base64FileData'), {\n\t* contentType: 'image/png'\n\t* })\n\t* ```\n\t*/ async upload(path, fileBody, fileOptions) {\n return this.uploadOrUpdate(\"POST\", path, fileBody, fileOptions);\n }\n /**\n\t* Upload a file with a token generated from `createSignedUploadUrl`.\n\t*\n\t* @category File Buckets\n\t* @param path The file path, including the file name. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to upload.\n\t* @param token The token generated from `createSignedUploadUrl`\n\t* @param fileBody The body of the file to be stored in the bucket.\n\t* @param fileOptions HTTP headers (cacheControl, contentType, etc.).\n\t* **Note:** The `upsert` option has no effect here. To enable upsert behavior,\n\t* pass `{ upsert: true }` when calling `createSignedUploadUrl()` instead.\n\t* @returns Promise with response containing file path and fullPath or error\n\t*\n\t* @example Upload to a signed URL\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .uploadToSignedUrl('folder/cat.jpg', 'token-from-createSignedUploadUrl', file)\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"path\": \"folder/cat.jpg\",\n\t* \"fullPath\": \"avatars/folder/cat.jpg\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async uploadToSignedUrl(path, token, fileBody, fileOptions) {\n var _this3 = this;\n const cleanPath = _this3._removeEmptyFolders(path);\n const _path = _this3._getFinalPath(cleanPath);\n const url = new URL(_this3.url + \"/object/upload/sign/\".concat(_path));\n url.searchParams.set(\"token\", token);\n try {\n let body;\n const options = _objectSpread2({\n upsert: DEFAULT_FILE_OPTIONS.upsert\n }, fileOptions);\n const headers = _objectSpread2(_objectSpread2({}, _this3.headers), {\n \"x-upsert\": String(options.upsert)\n });\n if (typeof Blob !== \"undefined\" && fileBody instanceof Blob) {\n body = new FormData();\n body.append(\"cacheControl\", options.cacheControl);\n body.append(\"\", fileBody);\n } else if (typeof FormData !== \"undefined\" && fileBody instanceof FormData) {\n body = fileBody;\n body.append(\"cacheControl\", options.cacheControl);\n } else {\n body = fileBody;\n headers[\"cache-control\"] = \"max-age=\".concat(options.cacheControl);\n headers[\"content-type\"] = options.contentType;\n }\n return {\n data: {\n path: cleanPath,\n fullPath: (await put(_this3.fetch, url.toString(), body, {\n headers\n })).Key\n },\n error: null\n };\n } catch (error) {\n if (_this3.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Creates a signed upload URL.\n\t* Signed upload URLs can be used to upload files to the bucket without further authentication.\n\t* They are valid for 2 hours.\n\t*\n\t* @category File Buckets\n\t* @param path The file path, including the current file name. For example `folder/image.png`.\n\t* @param options.upsert If set to true, allows the file to be overwritten if it already exists.\n\t* @returns Promise with response containing signed upload URL, token, and path or error\n\t*\n\t* @example Create Signed Upload URL\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .createSignedUploadUrl('folder/cat.jpg')\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"signedUrl\": \"https://example.supabase.co/storage/v1/object/upload/sign/avatars/folder/cat.jpg?token=<TOKEN>\",\n\t* \"path\": \"folder/cat.jpg\",\n\t* \"token\": \"<TOKEN>\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async createSignedUploadUrl(path, options) {\n var _this4 = this;\n try {\n let _path = _this4._getFinalPath(path);\n const headers = _objectSpread2({}, _this4.headers);\n if (options === null || options === void 0 ? void 0 : options.upsert) headers[\"x-upsert\"] = \"true\";\n const data = await post$1(_this4.fetch, \"\".concat(_this4.url, \"/object/upload/sign/\").concat(_path), {}, {\n headers\n });\n const url = new URL(_this4.url + data.url);\n const token = url.searchParams.get(\"token\");\n if (!token) throw new StorageError(\"No token returned by API\");\n return {\n data: {\n signedUrl: url.toString(),\n path,\n token\n },\n error: null\n };\n } catch (error) {\n if (_this4.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Replaces an existing file at the specified path with a new one.\n\t*\n\t* @category File Buckets\n\t* @param path The relative file path. Should be of the format `folder/subfolder/filename.png`. The bucket must already exist before attempting to update.\n\t* @param fileBody The body of the file to be stored in the bucket.\n\t* @param fileOptions Optional file upload options including cacheControl, contentType, upsert, and metadata.\n\t* @returns Promise with response containing file path, id, and fullPath or error\n\t*\n\t* @example Update file\n\t* ```js\n\t* const avatarFile = event.target.files[0]\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .update('public/avatar1.png', avatarFile, {\n\t* cacheControl: '3600',\n\t* upsert: true\n\t* })\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"path\": \"public/avatar1.png\",\n\t* \"fullPath\": \"avatars/public/avatar1.png\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*\n\t* @example Update file using `ArrayBuffer` from base64 file data\n\t* ```js\n\t* import {decode} from 'base64-arraybuffer'\n\t*\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .update('public/avatar1.png', decode('base64FileData'), {\n\t* contentType: 'image/png'\n\t* })\n\t* ```\n\t*/ async update(path, fileBody, fileOptions) {\n return this.uploadOrUpdate(\"PUT\", path, fileBody, fileOptions);\n }\n /**\n\t* Moves an existing file to a new path in the same bucket.\n\t*\n\t* @category File Buckets\n\t* @param fromPath The original file path, including the current file name. For example `folder/image.png`.\n\t* @param toPath The new file path, including the new file name. For example `folder/image-new.png`.\n\t* @param options The destination options.\n\t* @returns Promise with response containing success message or error\n\t*\n\t* @example Move file\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .move('public/avatar1.png', 'private/avatar2.png')\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"message\": \"Successfully moved\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async move(fromPath, toPath, options) {\n var _this6 = this;\n try {\n return {\n data: await post$1(_this6.fetch, \"\".concat(_this6.url, \"/object/move\"), {\n bucketId: _this6.bucketId,\n sourceKey: fromPath,\n destinationKey: toPath,\n destinationBucket: options === null || options === void 0 ? void 0 : options.destinationBucket\n }, {\n headers: _this6.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this6.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Copies an existing file to a new path in the same bucket.\n\t*\n\t* @category File Buckets\n\t* @param fromPath The original file path, including the current file name. For example `folder/image.png`.\n\t* @param toPath The new file path, including the new file name. For example `folder/image-copy.png`.\n\t* @param options The destination options.\n\t* @returns Promise with response containing copied file path or error\n\t*\n\t* @example Copy file\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .copy('public/avatar1.png', 'private/avatar2.png')\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"path\": \"avatars/private/avatar2.png\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async copy(fromPath, toPath, options) {\n var _this7 = this;\n try {\n return {\n data: {\n path: (await post$1(_this7.fetch, \"\".concat(_this7.url, \"/object/copy\"), {\n bucketId: _this7.bucketId,\n sourceKey: fromPath,\n destinationKey: toPath,\n destinationBucket: options === null || options === void 0 ? void 0 : options.destinationBucket\n }, {\n headers: _this7.headers\n })).Key\n },\n error: null\n };\n } catch (error) {\n if (_this7.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Creates a signed URL. Use a signed URL to share a file for a fixed amount of time.\n\t*\n\t* @category File Buckets\n\t* @param path The file path, including the current file name. For example `folder/image.png`.\n\t* @param expiresIn The number of seconds until the signed URL expires. For example, `60` for a URL which is valid for one minute.\n\t* @param options.download triggers the file as a download if set to true. Set this parameter as the name of the file if you want to trigger the download with a different filename.\n\t* @param options.transform Transform the asset before serving it to the client.\n\t* @returns Promise with response containing signed URL or error\n\t*\n\t* @example Create Signed URL\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .createSignedUrl('folder/avatar1.png', 60)\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"signedUrl\": \"https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar1.png?token=<TOKEN>\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*\n\t* @example Create a signed URL for an asset with transformations\n\t* ```js\n\t* const { data } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .createSignedUrl('folder/avatar1.png', 60, {\n\t* transform: {\n\t* width: 100,\n\t* height: 100,\n\t* }\n\t* })\n\t* ```\n\t*\n\t* @example Create a signed URL which triggers the download of the asset\n\t* ```js\n\t* const { data } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .createSignedUrl('folder/avatar1.png', 60, {\n\t* download: true,\n\t* })\n\t* ```\n\t*/ async createSignedUrl(path, expiresIn, options) {\n var _this8 = this;\n try {\n let _path = _this8._getFinalPath(path);\n let data = await post$1(_this8.fetch, \"\".concat(_this8.url, \"/object/sign/\").concat(_path), _objectSpread2({\n expiresIn\n }, (options === null || options === void 0 ? void 0 : options.transform) ? {\n transform: options.transform\n } : {}), {\n headers: _this8.headers\n });\n const downloadQueryParam = (options === null || options === void 0 ? void 0 : options.download) ? \"&download=\".concat(options.download === true ? \"\" : options.download) : \"\";\n data = {\n signedUrl: encodeURI(\"\".concat(_this8.url).concat(data.signedURL).concat(downloadQueryParam))\n };\n return {\n data,\n error: null\n };\n } catch (error) {\n if (_this8.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Creates multiple signed URLs. Use a signed URL to share a file for a fixed amount of time.\n\t*\n\t* @category File Buckets\n\t* @param paths The file paths to be downloaded, including the current file names. For example `['folder/image.png', 'folder2/image2.png']`.\n\t* @param expiresIn The number of seconds until the signed URLs expire. For example, `60` for URLs which are valid for one minute.\n\t* @param options.download triggers the file as a download if set to true. Set this parameter as the name of the file if you want to trigger the download with a different filename.\n\t* @returns Promise with response containing array of objects with signedUrl, path, and error or error\n\t*\n\t* @example Create Signed URLs\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .createSignedUrls(['folder/avatar1.png', 'folder/avatar2.png'], 60)\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": [\n\t* {\n\t* \"error\": null,\n\t* \"path\": \"folder/avatar1.png\",\n\t* \"signedURL\": \"/object/sign/avatars/folder/avatar1.png?token=<TOKEN>\",\n\t* \"signedUrl\": \"https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar1.png?token=<TOKEN>\"\n\t* },\n\t* {\n\t* \"error\": null,\n\t* \"path\": \"folder/avatar2.png\",\n\t* \"signedURL\": \"/object/sign/avatars/folder/avatar2.png?token=<TOKEN>\",\n\t* \"signedUrl\": \"https://example.supabase.co/storage/v1/object/sign/avatars/folder/avatar2.png?token=<TOKEN>\"\n\t* }\n\t* ],\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async createSignedUrls(paths, expiresIn, options) {\n var _this9 = this;\n try {\n const data = await post$1(_this9.fetch, \"\".concat(_this9.url, \"/object/sign/\").concat(_this9.bucketId), {\n expiresIn,\n paths\n }, {\n headers: _this9.headers\n });\n const downloadQueryParam = (options === null || options === void 0 ? void 0 : options.download) ? \"&download=\".concat(options.download === true ? \"\" : options.download) : \"\";\n return {\n data: data.map((datum)=>_objectSpread2(_objectSpread2({}, datum), {}, {\n signedUrl: datum.signedURL ? encodeURI(\"\".concat(_this9.url).concat(datum.signedURL).concat(downloadQueryParam)) : null\n })),\n error: null\n };\n } catch (error) {\n if (_this9.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Downloads a file from a private bucket. For public buckets, make a request to the URL returned from `getPublicUrl` instead.\n\t*\n\t* @category File Buckets\n\t* @param path The full path and file name of the file to be downloaded. For example `folder/image.png`.\n\t* @param options.transform Transform the asset before serving it to the client.\n\t* @returns BlobDownloadBuilder instance for downloading the file\n\t*\n\t* @example Download file\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .download('folder/avatar1.png')\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": <BLOB>,\n\t* \"error\": null\n\t* }\n\t* ```\n\t*\n\t* @example Download file with transformations\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .download('folder/avatar1.png', {\n\t* transform: {\n\t* width: 100,\n\t* height: 100,\n\t* quality: 80\n\t* }\n\t* })\n\t* ```\n\t*/ download(path, options) {\n const renderPath = typeof (options === null || options === void 0 ? void 0 : options.transform) !== \"undefined\" ? \"render/image/authenticated\" : \"object\";\n const transformationQuery = this.transformOptsToQueryString((options === null || options === void 0 ? void 0 : options.transform) || {});\n const queryString = transformationQuery ? \"?\".concat(transformationQuery) : \"\";\n const _path = this._getFinalPath(path);\n const downloadFn = ()=>get(this.fetch, \"\".concat(this.url, \"/\").concat(renderPath, \"/\").concat(_path).concat(queryString), {\n headers: this.headers,\n noResolveJson: true\n });\n return new BlobDownloadBuilder(downloadFn, this.shouldThrowOnError);\n }\n /**\n\t* Retrieves the details of an existing file.\n\t*\n\t* @category File Buckets\n\t* @param path The file path, including the file name. For example `folder/image.png`.\n\t* @returns Promise with response containing file metadata or error\n\t*\n\t* @example Get file info\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .info('folder/avatar1.png')\n\t* ```\n\t*/ async info(path) {\n var _this10 = this;\n const _path = _this10._getFinalPath(path);\n try {\n return {\n data: recursiveToCamel(await get(_this10.fetch, \"\".concat(_this10.url, \"/object/info/\").concat(_path), {\n headers: _this10.headers\n })),\n error: null\n };\n } catch (error) {\n if (_this10.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Checks the existence of a file.\n\t*\n\t* @category File Buckets\n\t* @param path The file path, including the file name. For example `folder/image.png`.\n\t* @returns Promise with response containing boolean indicating file existence or error\n\t*\n\t* @example Check file existence\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .exists('folder/avatar1.png')\n\t* ```\n\t*/ async exists(path) {\n var _this11 = this;\n const _path = _this11._getFinalPath(path);\n try {\n await head(_this11.fetch, \"\".concat(_this11.url, \"/object/\").concat(_path), {\n headers: _this11.headers\n });\n return {\n data: true,\n error: null\n };\n } catch (error) {\n if (_this11.shouldThrowOnError) throw error;\n if (isStorageError(error) && error instanceof StorageUnknownError) {\n const originalError = error.originalError;\n if ([\n 400,\n 404\n ].includes(originalError === null || originalError === void 0 ? void 0 : originalError.status)) return {\n data: false,\n error\n };\n }\n throw error;\n }\n }\n /**\n\t* A simple convenience function to get the URL for an asset in a public bucket. If you do not want to use this function, you can construct the public URL by concatenating the bucket URL with the path to the asset.\n\t* This function does not verify if the bucket is public. If a public URL is created for a bucket which is not public, you will not be able to download the asset.\n\t*\n\t* @category File Buckets\n\t* @param path The path and name of the file to generate the public URL for. For example `folder/image.png`.\n\t* @param options.download Triggers the file as a download if set to true. Set this parameter as the name of the file if you want to trigger the download with a different filename.\n\t* @param options.transform Transform the asset before serving it to the client.\n\t* @returns Object with public URL\n\t*\n\t* @example Returns the URL for an asset in a public bucket\n\t* ```js\n\t* const { data } = supabase\n\t* .storage\n\t* .from('public-bucket')\n\t* .getPublicUrl('folder/avatar1.png')\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"publicUrl\": \"https://example.supabase.co/storage/v1/object/public/public-bucket/folder/avatar1.png\"\n\t* }\n\t* }\n\t* ```\n\t*\n\t* @example Returns the URL for an asset in a public bucket with transformations\n\t* ```js\n\t* const { data } = supabase\n\t* .storage\n\t* .from('public-bucket')\n\t* .getPublicUrl('folder/avatar1.png', {\n\t* transform: {\n\t* width: 100,\n\t* height: 100,\n\t* }\n\t* })\n\t* ```\n\t*\n\t* @example Returns the URL which triggers the download of an asset in a public bucket\n\t* ```js\n\t* const { data } = supabase\n\t* .storage\n\t* .from('public-bucket')\n\t* .getPublicUrl('folder/avatar1.png', {\n\t* download: true,\n\t* })\n\t* ```\n\t*/ getPublicUrl(path, options) {\n const _path = this._getFinalPath(path);\n const _queryString = [];\n const downloadQueryParam = (options === null || options === void 0 ? void 0 : options.download) ? \"download=\".concat(options.download === true ? \"\" : options.download) : \"\";\n if (downloadQueryParam !== \"\") _queryString.push(downloadQueryParam);\n const renderPath = typeof (options === null || options === void 0 ? void 0 : options.transform) !== \"undefined\" ? \"render/image\" : \"object\";\n const transformationQuery = this.transformOptsToQueryString((options === null || options === void 0 ? void 0 : options.transform) || {});\n if (transformationQuery !== \"\") _queryString.push(transformationQuery);\n let queryString = _queryString.join(\"&\");\n if (queryString !== \"\") queryString = \"?\".concat(queryString);\n return {\n data: {\n publicUrl: encodeURI(\"\".concat(this.url, \"/\").concat(renderPath, \"/public/\").concat(_path).concat(queryString))\n }\n };\n }\n /**\n\t* Deletes files within the same bucket\n\t*\n\t* @category File Buckets\n\t* @param paths An array of files to delete, including the path and file name. For example [`'folder/image.png'`].\n\t* @returns Promise with response containing array of deleted file objects or error\n\t*\n\t* @example Delete file\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .remove(['folder/avatar1.png'])\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": [],\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async remove(paths) {\n var _this12 = this;\n try {\n return {\n data: await remove(_this12.fetch, \"\".concat(_this12.url, \"/object/\").concat(_this12.bucketId), {\n prefixes: paths\n }, {\n headers: _this12.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this12.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Get file metadata\n\t* @param id the file id to retrieve metadata\n\t*/ /**\n\t* Update file metadata\n\t* @param id the file id to update metadata\n\t* @param meta the new file metadata\n\t*/ /**\n\t* Lists all the files and folders within a path of the bucket.\n\t*\n\t* @category File Buckets\n\t* @param path The folder path.\n\t* @param options Search options including limit (defaults to 100), offset, sortBy, and search\n\t* @param parameters Optional fetch parameters including signal for cancellation\n\t* @returns Promise with response containing array of files or error\n\t*\n\t* @example List files in a bucket\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .list('folder', {\n\t* limit: 100,\n\t* offset: 0,\n\t* sortBy: { column: 'name', order: 'asc' },\n\t* })\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": [\n\t* {\n\t* \"name\": \"avatar1.png\",\n\t* \"id\": \"e668cf7f-821b-4a2f-9dce-7dfa5dd1cfd2\",\n\t* \"updated_at\": \"2024-05-22T23:06:05.580Z\",\n\t* \"created_at\": \"2024-05-22T23:04:34.443Z\",\n\t* \"last_accessed_at\": \"2024-05-22T23:04:34.443Z\",\n\t* \"metadata\": {\n\t* \"eTag\": \"\\\"c5e8c553235d9af30ef4f6e280790b92\\\"\",\n\t* \"size\": 32175,\n\t* \"mimetype\": \"image/png\",\n\t* \"cacheControl\": \"max-age=3600\",\n\t* \"lastModified\": \"2024-05-22T23:06:05.574Z\",\n\t* \"contentLength\": 32175,\n\t* \"httpStatusCode\": 200\n\t* }\n\t* }\n\t* ],\n\t* \"error\": null\n\t* }\n\t* ```\n\t*\n\t* @example Search files in a bucket\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .from('avatars')\n\t* .list('folder', {\n\t* limit: 100,\n\t* offset: 0,\n\t* sortBy: { column: 'name', order: 'asc' },\n\t* search: 'jon'\n\t* })\n\t* ```\n\t*/ async list(path, options, parameters) {\n var _this13 = this;\n try {\n const body = _objectSpread2(_objectSpread2(_objectSpread2({}, DEFAULT_SEARCH_OPTIONS), options), {}, {\n prefix: path || \"\"\n });\n return {\n data: await post$1(_this13.fetch, \"\".concat(_this13.url, \"/object/list/\").concat(_this13.bucketId), body, {\n headers: _this13.headers\n }, parameters),\n error: null\n };\n } catch (error) {\n if (_this13.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* @experimental this method signature might change in the future\n\t*\n\t* @category File Buckets\n\t* @param options search options\n\t* @param parameters\n\t*/ async listV2(options, parameters) {\n var _this14 = this;\n try {\n const body = _objectSpread2({}, options);\n return {\n data: await post$1(_this14.fetch, \"\".concat(_this14.url, \"/object/list-v2/\").concat(_this14.bucketId), body, {\n headers: _this14.headers\n }, parameters),\n error: null\n };\n } catch (error) {\n if (_this14.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n encodeMetadata(metadata) {\n return JSON.stringify(metadata);\n }\n toBase64(data) {\n if (typeof Buffer !== \"undefined\") return Buffer.from(data).toString(\"base64\");\n return btoa(data);\n }\n _getFinalPath(path) {\n return \"\".concat(this.bucketId, \"/\").concat(path.replace(/^\\/+/, \"\"));\n }\n _removeEmptyFolders(path) {\n return path.replace(/^\\/|\\/$/g, \"\").replace(/\\/+/g, \"/\");\n }\n transformOptsToQueryString(transform) {\n const params = [];\n if (transform.width) params.push(\"width=\".concat(transform.width));\n if (transform.height) params.push(\"height=\".concat(transform.height));\n if (transform.resize) params.push(\"resize=\".concat(transform.resize));\n if (transform.format) params.push(\"format=\".concat(transform.format));\n if (transform.quality) params.push(\"quality=\".concat(transform.quality));\n return params.join(\"&\");\n }\n constructor(url, headers = {}, bucketId, fetch$1){\n this.shouldThrowOnError = false;\n this.url = url;\n this.headers = headers;\n this.bucketId = bucketId;\n this.fetch = resolveFetch$1(fetch$1);\n }\n};\n//#endregion\n//#region src/lib/version.ts\nconst version = \"2.88.0\";\n//#endregion\n//#region src/lib/constants.ts\nconst DEFAULT_HEADERS$1 = {\n \"X-Client-Info\": \"storage-js/\".concat(version)\n};\n//#endregion\n//#region src/packages/StorageBucketApi.ts\nvar StorageBucketApi = class {\n /**\n\t* Enable throwing errors instead of returning them.\n\t*\n\t* @category File Buckets\n\t*/ throwOnError() {\n this.shouldThrowOnError = true;\n return this;\n }\n /**\n\t* Retrieves the details of all Storage buckets within an existing project.\n\t*\n\t* @category File Buckets\n\t* @param options Query parameters for listing buckets\n\t* @param options.limit Maximum number of buckets to return\n\t* @param options.offset Number of buckets to skip\n\t* @param options.sortColumn Column to sort by ('id', 'name', 'created_at', 'updated_at')\n\t* @param options.sortOrder Sort order ('asc' or 'desc')\n\t* @param options.search Search term to filter bucket names\n\t* @returns Promise with response containing array of buckets or error\n\t*\n\t* @example List buckets\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .listBuckets()\n\t* ```\n\t*\n\t* @example List buckets with options\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .listBuckets({\n\t* limit: 10,\n\t* offset: 0,\n\t* sortColumn: 'created_at',\n\t* sortOrder: 'desc',\n\t* search: 'prod'\n\t* })\n\t* ```\n\t*/ async listBuckets(options) {\n var _this = this;\n try {\n const queryString = _this.listBucketOptionsToQueryString(options);\n return {\n data: await get(_this.fetch, \"\".concat(_this.url, \"/bucket\").concat(queryString), {\n headers: _this.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Retrieves the details of an existing Storage bucket.\n\t*\n\t* @category File Buckets\n\t* @param id The unique identifier of the bucket you would like to retrieve.\n\t* @returns Promise with response containing bucket details or error\n\t*\n\t* @example Get bucket\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .getBucket('avatars')\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"id\": \"avatars\",\n\t* \"name\": \"avatars\",\n\t* \"owner\": \"\",\n\t* \"public\": false,\n\t* \"file_size_limit\": 1024,\n\t* \"allowed_mime_types\": [\n\t* \"image/png\"\n\t* ],\n\t* \"created_at\": \"2024-05-22T22:26:05.100Z\",\n\t* \"updated_at\": \"2024-05-22T22:26:05.100Z\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async getBucket(id) {\n var _this2 = this;\n try {\n return {\n data: await get(_this2.fetch, \"\".concat(_this2.url, \"/bucket/\").concat(id), {\n headers: _this2.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this2.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Creates a new Storage bucket\n\t*\n\t* @category File Buckets\n\t* @param id A unique identifier for the bucket you are creating.\n\t* @param options.public The visibility of the bucket. Public buckets don't require an authorization token to download objects, but still require a valid token for all other operations. By default, buckets are private.\n\t* @param options.fileSizeLimit specifies the max file size in bytes that can be uploaded to this bucket.\n\t* The global file size limit takes precedence over this value.\n\t* The default value is null, which doesn't set a per bucket file size limit.\n\t* @param options.allowedMimeTypes specifies the allowed mime types that this bucket can accept during upload.\n\t* The default value is null, which allows files with all mime types to be uploaded.\n\t* Each mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png.\n\t* @param options.type (private-beta) specifies the bucket type. see `BucketType` for more details.\n\t* - default bucket type is `STANDARD`\n\t* @returns Promise with response containing newly created bucket name or error\n\t*\n\t* @example Create bucket\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .createBucket('avatars', {\n\t* public: false,\n\t* allowedMimeTypes: ['image/png'],\n\t* fileSizeLimit: 1024\n\t* })\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"name\": \"avatars\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async createBucket(id) {\n let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {\n public: false\n };\n var _this3 = this;\n try {\n return {\n data: await post$1(_this3.fetch, \"\".concat(_this3.url, \"/bucket\"), {\n id,\n name: id,\n type: options.type,\n public: options.public,\n file_size_limit: options.fileSizeLimit,\n allowed_mime_types: options.allowedMimeTypes\n }, {\n headers: _this3.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this3.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Updates a Storage bucket\n\t*\n\t* @category File Buckets\n\t* @param id A unique identifier for the bucket you are updating.\n\t* @param options.public The visibility of the bucket. Public buckets don't require an authorization token to download objects, but still require a valid token for all other operations.\n\t* @param options.fileSizeLimit specifies the max file size in bytes that can be uploaded to this bucket.\n\t* The global file size limit takes precedence over this value.\n\t* The default value is null, which doesn't set a per bucket file size limit.\n\t* @param options.allowedMimeTypes specifies the allowed mime types that this bucket can accept during upload.\n\t* The default value is null, which allows files with all mime types to be uploaded.\n\t* Each mime type specified can be a wildcard, e.g. image/*, or a specific mime type, e.g. image/png.\n\t* @returns Promise with response containing success message or error\n\t*\n\t* @example Update bucket\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .updateBucket('avatars', {\n\t* public: false,\n\t* allowedMimeTypes: ['image/png'],\n\t* fileSizeLimit: 1024\n\t* })\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"message\": \"Successfully updated\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async updateBucket(id, options) {\n var _this4 = this;\n try {\n return {\n data: await put(_this4.fetch, \"\".concat(_this4.url, \"/bucket/\").concat(id), {\n id,\n name: id,\n public: options.public,\n file_size_limit: options.fileSizeLimit,\n allowed_mime_types: options.allowedMimeTypes\n }, {\n headers: _this4.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this4.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Removes all objects inside a single bucket.\n\t*\n\t* @category File Buckets\n\t* @param id The unique identifier of the bucket you would like to empty.\n\t* @returns Promise with success message or error\n\t*\n\t* @example Empty bucket\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .emptyBucket('avatars')\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"message\": \"Successfully emptied\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async emptyBucket(id) {\n var _this5 = this;\n try {\n return {\n data: await post$1(_this5.fetch, \"\".concat(_this5.url, \"/bucket/\").concat(id, \"/empty\"), {}, {\n headers: _this5.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this5.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* Deletes an existing bucket. A bucket can't be deleted with existing objects inside it.\n\t* You must first `empty()` the bucket.\n\t*\n\t* @category File Buckets\n\t* @param id The unique identifier of the bucket you would like to delete.\n\t* @returns Promise with success message or error\n\t*\n\t* @example Delete bucket\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .deleteBucket('avatars')\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"message\": \"Successfully deleted\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async deleteBucket(id) {\n var _this6 = this;\n try {\n return {\n data: await remove(_this6.fetch, \"\".concat(_this6.url, \"/bucket/\").concat(id), {}, {\n headers: _this6.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this6.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n listBucketOptionsToQueryString(options) {\n const params = {};\n if (options) {\n if (\"limit\" in options) params.limit = String(options.limit);\n if (\"offset\" in options) params.offset = String(options.offset);\n if (options.search) params.search = options.search;\n if (options.sortColumn) params.sortColumn = options.sortColumn;\n if (options.sortOrder) params.sortOrder = options.sortOrder;\n }\n return Object.keys(params).length > 0 ? \"?\" + new URLSearchParams(params).toString() : \"\";\n }\n constructor(url, headers = {}, fetch$1, opts){\n this.shouldThrowOnError = false;\n const baseUrl = new URL(url);\n if (opts === null || opts === void 0 ? void 0 : opts.useNewHostname) {\n if (/supabase\\.(co|in|red)$/.test(baseUrl.hostname) && !baseUrl.hostname.includes(\"storage.supabase.\")) baseUrl.hostname = baseUrl.hostname.replace(\"supabase.\", \"storage.supabase.\");\n }\n this.url = baseUrl.href.replace(/\\/$/, \"\");\n this.headers = _objectSpread2(_objectSpread2({}, DEFAULT_HEADERS$1), headers);\n this.fetch = resolveFetch$1(fetch$1);\n }\n};\n//#endregion\n//#region src/packages/StorageAnalyticsClient.ts\n/**\n* Client class for managing Analytics Buckets using Iceberg tables\n* Provides methods for creating, listing, and deleting analytics buckets\n*/ var StorageAnalyticsClient = class {\n /**\n\t* @alpha\n\t*\n\t* Enable throwing errors instead of returning them in the response\n\t* When enabled, failed operations will throw instead of returning { data: null, error }\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Analytics Buckets\n\t* @returns This instance for method chaining\n\t*/ throwOnError() {\n this.shouldThrowOnError = true;\n return this;\n }\n /**\n\t* @alpha\n\t*\n\t* Creates a new analytics bucket using Iceberg tables\n\t* Analytics buckets are optimized for analytical queries and data processing\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Analytics Buckets\n\t* @param name A unique name for the bucket you are creating\n\t* @returns Promise with response containing newly created analytics bucket or error\n\t*\n\t* @example Create analytics bucket\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .analytics\n\t* .createBucket('analytics-data')\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"name\": \"analytics-data\",\n\t* \"type\": \"ANALYTICS\",\n\t* \"format\": \"iceberg\",\n\t* \"created_at\": \"2024-05-22T22:26:05.100Z\",\n\t* \"updated_at\": \"2024-05-22T22:26:05.100Z\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async createBucket(name) {\n var _this = this;\n try {\n return {\n data: await post$1(_this.fetch, \"\".concat(_this.url, \"/bucket\"), {\n name\n }, {\n headers: _this.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* @alpha\n\t*\n\t* Retrieves the details of all Analytics Storage buckets within an existing project\n\t* Only returns buckets of type 'ANALYTICS'\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Analytics Buckets\n\t* @param options Query parameters for listing buckets\n\t* @param options.limit Maximum number of buckets to return\n\t* @param options.offset Number of buckets to skip\n\t* @param options.sortColumn Column to sort by ('name', 'created_at', 'updated_at')\n\t* @param options.sortOrder Sort order ('asc' or 'desc')\n\t* @param options.search Search term to filter bucket names\n\t* @returns Promise with response containing array of analytics buckets or error\n\t*\n\t* @example List analytics buckets\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .analytics\n\t* .listBuckets({\n\t* limit: 10,\n\t* offset: 0,\n\t* sortColumn: 'created_at',\n\t* sortOrder: 'desc'\n\t* })\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": [\n\t* {\n\t* \"name\": \"analytics-data\",\n\t* \"type\": \"ANALYTICS\",\n\t* \"format\": \"iceberg\",\n\t* \"created_at\": \"2024-05-22T22:26:05.100Z\",\n\t* \"updated_at\": \"2024-05-22T22:26:05.100Z\"\n\t* }\n\t* ],\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async listBuckets(options) {\n var _this2 = this;\n try {\n const queryParams = new URLSearchParams();\n if ((options === null || options === void 0 ? void 0 : options.limit) !== void 0) queryParams.set(\"limit\", options.limit.toString());\n if ((options === null || options === void 0 ? void 0 : options.offset) !== void 0) queryParams.set(\"offset\", options.offset.toString());\n if (options === null || options === void 0 ? void 0 : options.sortColumn) queryParams.set(\"sortColumn\", options.sortColumn);\n if (options === null || options === void 0 ? void 0 : options.sortOrder) queryParams.set(\"sortOrder\", options.sortOrder);\n if (options === null || options === void 0 ? void 0 : options.search) queryParams.set(\"search\", options.search);\n const queryString = queryParams.toString();\n const url = queryString ? \"\".concat(_this2.url, \"/bucket?\").concat(queryString) : \"\".concat(_this2.url, \"/bucket\");\n return {\n data: await get(_this2.fetch, url, {\n headers: _this2.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this2.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* @alpha\n\t*\n\t* Deletes an existing analytics bucket\n\t* A bucket can't be deleted with existing objects inside it\n\t* You must first empty the bucket before deletion\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Analytics Buckets\n\t* @param bucketName The unique identifier of the bucket you would like to delete\n\t* @returns Promise with response containing success message or error\n\t*\n\t* @example Delete analytics bucket\n\t* ```js\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .analytics\n\t* .deleteBucket('analytics-data')\n\t* ```\n\t*\n\t* Response:\n\t* ```json\n\t* {\n\t* \"data\": {\n\t* \"message\": \"Successfully deleted\"\n\t* },\n\t* \"error\": null\n\t* }\n\t* ```\n\t*/ async deleteBucket(bucketName) {\n var _this3 = this;\n try {\n return {\n data: await remove(_this3.fetch, \"\".concat(_this3.url, \"/bucket/\").concat(bucketName), {}, {\n headers: _this3.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this3.shouldThrowOnError) throw error;\n if (isStorageError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /**\n\t* @alpha\n\t*\n\t* Get an Iceberg REST Catalog client configured for a specific analytics bucket\n\t* Use this to perform advanced table and namespace operations within the bucket\n\t* The returned client provides full access to the Apache Iceberg REST Catalog API\n\t* with the Supabase `{ data, error }` pattern for consistent error handling on all operations.\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Analytics Buckets\n\t* @param bucketName - The name of the analytics bucket (warehouse) to connect to\n\t* @returns The wrapped Iceberg catalog client\n\t* @throws {StorageError} If the bucket name is invalid\n\t*\n\t* @example Get catalog and create table\n\t* ```js\n\t* // First, create an analytics bucket\n\t* const { data: bucket, error: bucketError } = await supabase\n\t* .storage\n\t* .analytics\n\t* .createBucket('analytics-data')\n\t*\n\t* // Get the Iceberg catalog for that bucket\n\t* const catalog = supabase.storage.analytics.from('analytics-data')\n\t*\n\t* // Create a namespace\n\t* const { error: nsError } = await catalog.createNamespace({ namespace: ['default'] })\n\t*\n\t* // Create a table with schema\n\t* const { data: tableMetadata, error: tableError } = await catalog.createTable(\n\t* { namespace: ['default'] },\n\t* {\n\t* name: 'events',\n\t* schema: {\n\t* type: 'struct',\n\t* fields: [\n\t* { id: 1, name: 'id', type: 'long', required: true },\n\t* { id: 2, name: 'timestamp', type: 'timestamp', required: true },\n\t* { id: 3, name: 'user_id', type: 'string', required: false }\n\t* ],\n\t* 'schema-id': 0,\n\t* 'identifier-field-ids': [1]\n\t* },\n\t* 'partition-spec': {\n\t* 'spec-id': 0,\n\t* fields: []\n\t* },\n\t* 'write-order': {\n\t* 'order-id': 0,\n\t* fields: []\n\t* },\n\t* properties: {\n\t* 'write.format.default': 'parquet'\n\t* }\n\t* }\n\t* )\n\t* ```\n\t*\n\t* @example List tables in namespace\n\t* ```js\n\t* const catalog = supabase.storage.analytics.from('analytics-data')\n\t*\n\t* // List all tables in the default namespace\n\t* const { data: tables, error: listError } = await catalog.listTables({ namespace: ['default'] })\n\t* if (listError) {\n\t* if (listError.isNotFound()) {\n\t* console.log('Namespace not found')\n\t* }\n\t* return\n\t* }\n\t* console.log(tables) // [{ namespace: ['default'], name: 'events' }]\n\t* ```\n\t*\n\t* @example Working with namespaces\n\t* ```js\n\t* const catalog = supabase.storage.analytics.from('analytics-data')\n\t*\n\t* // List all namespaces\n\t* const { data: namespaces } = await catalog.listNamespaces()\n\t*\n\t* // Create namespace with properties\n\t* await catalog.createNamespace(\n\t* { namespace: ['production'] },\n\t* { properties: { owner: 'data-team', env: 'prod' } }\n\t* )\n\t* ```\n\t*\n\t* @example Cleanup operations\n\t* ```js\n\t* const catalog = supabase.storage.analytics.from('analytics-data')\n\t*\n\t* // Drop table with purge option (removes all data)\n\t* const { error: dropError } = await catalog.dropTable(\n\t* { namespace: ['default'], name: 'events' },\n\t* { purge: true }\n\t* )\n\t*\n\t* if (dropError?.isNotFound()) {\n\t* console.log('Table does not exist')\n\t* }\n\t*\n\t* // Drop namespace (must be empty)\n\t* await catalog.dropNamespace({ namespace: ['default'] })\n\t* ```\n\t*\n\t* @remarks\n\t* This method provides a bridge between Supabase's bucket management and the standard\n\t* Apache Iceberg REST Catalog API. The bucket name maps to the Iceberg warehouse parameter.\n\t* All authentication and configuration is handled automatically using your Supabase credentials.\n\t*\n\t* **Error Handling**: Invalid bucket names throw immediately. All catalog\n\t* operations return `{ data, error }` where errors are `IcebergError` instances from iceberg-js.\n\t* Use helper methods like `error.isNotFound()` or check `error.status` for specific error handling.\n\t* Use `.throwOnError()` on the analytics client if you prefer exceptions for catalog operations.\n\t*\n\t* **Cleanup Operations**: When using `dropTable`, the `purge: true` option permanently\n\t* deletes all table data. Without it, the table is marked as deleted but data remains.\n\t*\n\t* **Library Dependency**: The returned catalog wraps `IcebergRestCatalog` from iceberg-js.\n\t* For complete API documentation and advanced usage, refer to the\n\t* [iceberg-js documentation](https://supabase.github.io/iceberg-js/).\n\t*/ from(bucketName) {\n var _this4 = this;\n if (!isValidBucketName(bucketName)) throw new StorageError(\"Invalid bucket name: File, folder, and bucket names must follow AWS object key naming guidelines and should avoid the use of any other characters.\");\n const catalog = new iceberg_js__WEBPACK_IMPORTED_MODULE_0__.IcebergRestCatalog({\n baseUrl: this.url,\n catalogName: bucketName,\n auth: {\n type: \"custom\",\n getHeaders: async ()=>_this4.headers\n },\n fetch: this.fetch\n });\n const shouldThrowOnError = this.shouldThrowOnError;\n return new Proxy(catalog, {\n get (target, prop) {\n const value = target[prop];\n if (typeof value !== \"function\") return value;\n return async function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n try {\n return {\n data: await value.apply(target, args),\n error: null\n };\n } catch (error) {\n if (shouldThrowOnError) throw error;\n return {\n data: null,\n error\n };\n }\n };\n }\n });\n }\n /**\n\t* @alpha\n\t*\n\t* Creates a new StorageAnalyticsClient instance\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Analytics Buckets\n\t* @param url - The base URL for the storage API\n\t* @param headers - HTTP headers to include in requests\n\t* @param fetch - Optional custom fetch implementation\n\t*\n\t* @example\n\t* ```typescript\n\t* const client = new StorageAnalyticsClient(url, headers)\n\t* ```\n\t*/ constructor(url, headers = {}, fetch$1){\n this.shouldThrowOnError = false;\n this.url = url.replace(/\\/$/, \"\");\n this.headers = _objectSpread2(_objectSpread2({}, DEFAULT_HEADERS$1), headers);\n this.fetch = resolveFetch$1(fetch$1);\n }\n};\n//#endregion\n//#region src/lib/vectors/constants.ts\nconst DEFAULT_HEADERS = {\n \"X-Client-Info\": \"storage-js/\".concat(version),\n \"Content-Type\": \"application/json\"\n};\n//#endregion\n//#region src/lib/vectors/errors.ts\n/**\n* Base error class for all Storage Vectors errors\n*/ var StorageVectorsError = class extends Error {\n constructor(message){\n super(message);\n this.__isStorageVectorsError = true;\n this.name = \"StorageVectorsError\";\n }\n};\n/**\n* Type guard to check if an error is a StorageVectorsError\n* @param error - The error to check\n* @returns True if the error is a StorageVectorsError\n*/ function isStorageVectorsError(error) {\n return typeof error === \"object\" && error !== null && \"__isStorageVectorsError\" in error;\n}\n/**\n* API error returned from S3 Vectors service\n* Includes HTTP status code and service-specific error code\n*/ var StorageVectorsApiError = class extends StorageVectorsError {\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n statusCode: this.statusCode\n };\n }\n constructor(message, status, statusCode){\n super(message);\n this.name = \"StorageVectorsApiError\";\n this.status = status;\n this.statusCode = statusCode;\n }\n};\n/**\n* Unknown error that doesn't match expected error patterns\n* Wraps the original error for debugging\n*/ var StorageVectorsUnknownError = class extends StorageVectorsError {\n constructor(message, originalError){\n super(message);\n this.name = \"StorageVectorsUnknownError\";\n this.originalError = originalError;\n }\n};\n/**\n* Error codes specific to S3 Vectors API\n* Maps AWS service errors to application-friendly error codes\n*/ let StorageVectorsErrorCode = /* @__PURE__ */ function(StorageVectorsErrorCode$1) {\n /** Internal server fault (HTTP 500) */ StorageVectorsErrorCode$1[\"InternalError\"] = \"InternalError\";\n /** Resource already exists / conflict (HTTP 409) */ StorageVectorsErrorCode$1[\"S3VectorConflictException\"] = \"S3VectorConflictException\";\n /** Resource not found (HTTP 404) */ StorageVectorsErrorCode$1[\"S3VectorNotFoundException\"] = \"S3VectorNotFoundException\";\n /** Delete bucket while not empty (HTTP 400) */ StorageVectorsErrorCode$1[\"S3VectorBucketNotEmpty\"] = \"S3VectorBucketNotEmpty\";\n /** Exceeds bucket quota/limit (HTTP 400) */ StorageVectorsErrorCode$1[\"S3VectorMaxBucketsExceeded\"] = \"S3VectorMaxBucketsExceeded\";\n /** Exceeds index quota/limit (HTTP 400) */ StorageVectorsErrorCode$1[\"S3VectorMaxIndexesExceeded\"] = \"S3VectorMaxIndexesExceeded\";\n return StorageVectorsErrorCode$1;\n}({});\n//#endregion\n//#region src/lib/vectors/helpers.ts\n/**\n* Resolves the fetch implementation to use\n* Uses custom fetch if provided, otherwise uses native fetch\n*\n* @param customFetch - Optional custom fetch implementation\n* @returns Resolved fetch function\n*/ const resolveFetch = (customFetch)=>{\n if (customFetch) return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return customFetch(...args);\n };\n return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return fetch(...args);\n };\n};\n/**\n* Resolves the Response constructor to use\n* Returns native Response constructor\n*\n* @returns Response constructor\n*/ const resolveResponse = ()=>{\n return Response;\n};\n/**\n* Determine if input is a plain object\n* An object is plain if it's created by either {}, new Object(), or Object.create(null)\n*\n* @param value - Value to check\n* @returns True if value is a plain object\n* @source https://github.com/sindresorhus/is-plain-obj\n*/ const isPlainObject = (value)=>{\n if (typeof value !== \"object\" || value === null) return false;\n const prototype = Object.getPrototypeOf(value);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value);\n};\n/**\n* Normalizes a number array to float32 format\n* Ensures all vector values are valid 32-bit floats\n*\n* @param values - Array of numbers to normalize\n* @returns Normalized float32 array\n*/ const normalizeToFloat32 = (values)=>{\n return Array.from(new Float32Array(values));\n};\n/**\n* Validates vector dimensions match expected dimension\n* Throws error if dimensions don't match\n*\n* @param vector - Vector data to validate\n* @param expectedDimension - Expected vector dimension\n* @throws Error if dimensions don't match\n*/ const validateVectorDimension = (vector, expectedDimension)=>{\n if (expectedDimension !== void 0 && vector.float32.length !== expectedDimension) throw new Error(\"Vector dimension mismatch: expected \".concat(expectedDimension, \", got \").concat(vector.float32.length));\n};\n//#endregion\n//#region src/lib/vectors/fetch.ts\n/**\n* Extracts error message from various error response formats\n* @param err - Error object from API\n* @returns Human-readable error message\n*/ const _getErrorMessage = (err)=>err.msg || err.message || err.error_description || err.error || JSON.stringify(err);\n/**\n* Handles fetch errors and converts them to StorageVectors error types\n* @param error - The error caught from fetch\n* @param reject - Promise rejection function\n* @param options - Fetch options that may affect error handling\n*/ const handleError = async (error, reject, options)=>{\n if (error && typeof error === \"object\" && \"status\" in error && \"ok\" in error && typeof error.status === \"number\" && !(options === null || options === void 0 ? void 0 : options.noResolveJson)) {\n const status = error.status || 500;\n const responseError = error;\n if (typeof responseError.json === \"function\") responseError.json().then((err)=>{\n const statusCode = (err === null || err === void 0 ? void 0 : err.statusCode) || (err === null || err === void 0 ? void 0 : err.code) || status + \"\";\n reject(new StorageVectorsApiError(_getErrorMessage(err), status, statusCode));\n }).catch(()=>{\n const statusCode = status + \"\";\n reject(new StorageVectorsApiError(responseError.statusText || \"HTTP \".concat(status, \" error\"), status, statusCode));\n });\n else {\n const statusCode = status + \"\";\n reject(new StorageVectorsApiError(responseError.statusText || \"HTTP \".concat(status, \" error\"), status, statusCode));\n }\n } else reject(new StorageVectorsUnknownError(_getErrorMessage(error), error));\n};\n/**\n* Builds request parameters for fetch calls\n* @param method - HTTP method\n* @param options - Custom fetch options\n* @param parameters - Additional fetch parameters like AbortSignal\n* @param body - Request body (will be JSON stringified if plain object)\n* @returns Complete fetch request parameters\n*/ const _getRequestParams = (method, options, parameters, body)=>{\n const params = {\n method,\n headers: (options === null || options === void 0 ? void 0 : options.headers) || {}\n };\n if (method === \"GET\" || !body) return params;\n if (isPlainObject(body)) {\n params.headers = _objectSpread2({\n \"Content-Type\": \"application/json\"\n }, options === null || options === void 0 ? void 0 : options.headers);\n params.body = JSON.stringify(body);\n } else params.body = body;\n return _objectSpread2(_objectSpread2({}, params), parameters);\n};\n/**\n* Internal request handler that wraps fetch with error handling\n* @param fetcher - Fetch function to use\n* @param method - HTTP method\n* @param url - Request URL\n* @param options - Custom fetch options\n* @param parameters - Additional fetch parameters\n* @param body - Request body\n* @returns Promise with parsed response or error\n*/ async function _handleRequest(fetcher, method, url, options, parameters, body) {\n return new Promise((resolve, reject)=>{\n fetcher(url, _getRequestParams(method, options, parameters, body)).then((result)=>{\n if (!result.ok) throw result;\n if (options === null || options === void 0 ? void 0 : options.noResolveJson) return result;\n const contentType = result.headers.get(\"content-type\");\n if (!contentType || !contentType.includes(\"application/json\")) return {};\n return result.json();\n }).then((data)=>resolve(data)).catch((error)=>handleError(error, reject, options));\n });\n}\n/**\n* Performs a POST request\n* @param fetcher - Fetch function to use\n* @param url - Request URL\n* @param body - Request body to be JSON stringified\n* @param options - Custom fetch options\n* @param parameters - Additional fetch parameters\n* @returns Promise with parsed response\n*/ async function post(fetcher, url, body, options, parameters) {\n return _handleRequest(fetcher, \"POST\", url, options, parameters, body);\n}\n//#endregion\n//#region src/lib/vectors/VectorIndexApi.ts\n/**\n* @hidden\n* Base implementation for vector index operations.\n* Use {@link VectorBucketScope} via `supabase.storage.vectors.from('bucket')` instead.\n*/ var VectorIndexApi = class {\n /** Enable throwing errors instead of returning them in the response */ throwOnError() {\n this.shouldThrowOnError = true;\n return this;\n }\n /** Creates a new vector index within a bucket */ async createIndex(options) {\n var _this = this;\n try {\n return {\n data: await post(_this.fetch, \"\".concat(_this.url, \"/CreateIndex\"), options, {\n headers: _this.headers\n }) || {},\n error: null\n };\n } catch (error) {\n if (_this.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Retrieves metadata for a specific vector index */ async getIndex(vectorBucketName, indexName) {\n var _this2 = this;\n try {\n return {\n data: await post(_this2.fetch, \"\".concat(_this2.url, \"/GetIndex\"), {\n vectorBucketName,\n indexName\n }, {\n headers: _this2.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this2.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Lists vector indexes within a bucket with optional filtering and pagination */ async listIndexes(options) {\n var _this3 = this;\n try {\n return {\n data: await post(_this3.fetch, \"\".concat(_this3.url, \"/ListIndexes\"), options, {\n headers: _this3.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this3.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Deletes a vector index and all its data */ async deleteIndex(vectorBucketName, indexName) {\n var _this4 = this;\n try {\n return {\n data: await post(_this4.fetch, \"\".concat(_this4.url, \"/DeleteIndex\"), {\n vectorBucketName,\n indexName\n }, {\n headers: _this4.headers\n }) || {},\n error: null\n };\n } catch (error) {\n if (_this4.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Creates a new VectorIndexApi instance */ constructor(url, headers = {}, fetch$1){\n this.shouldThrowOnError = false;\n this.url = url.replace(/\\/$/, \"\");\n this.headers = _objectSpread2(_objectSpread2({}, DEFAULT_HEADERS), headers);\n this.fetch = resolveFetch(fetch$1);\n }\n};\n//#endregion\n//#region src/lib/vectors/VectorDataApi.ts\n/**\n* @hidden\n* Base implementation for vector data operations.\n* Use {@link VectorIndexScope} via `supabase.storage.vectors.from('bucket').index('idx')` instead.\n*/ var VectorDataApi = class {\n /** Enable throwing errors instead of returning them in the response */ throwOnError() {\n this.shouldThrowOnError = true;\n return this;\n }\n /** Inserts or updates vectors in batch (1-500 per request) */ async putVectors(options) {\n var _this = this;\n try {\n if (options.vectors.length < 1 || options.vectors.length > 500) throw new Error(\"Vector batch size must be between 1 and 500 items\");\n return {\n data: await post(_this.fetch, \"\".concat(_this.url, \"/PutVectors\"), options, {\n headers: _this.headers\n }) || {},\n error: null\n };\n } catch (error) {\n if (_this.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Retrieves vectors by their keys in batch */ async getVectors(options) {\n var _this2 = this;\n try {\n return {\n data: await post(_this2.fetch, \"\".concat(_this2.url, \"/GetVectors\"), options, {\n headers: _this2.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this2.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Lists vectors in an index with pagination */ async listVectors(options) {\n var _this3 = this;\n try {\n if (options.segmentCount !== void 0) {\n if (options.segmentCount < 1 || options.segmentCount > 16) throw new Error(\"segmentCount must be between 1 and 16\");\n if (options.segmentIndex !== void 0) {\n if (options.segmentIndex < 0 || options.segmentIndex >= options.segmentCount) throw new Error(\"segmentIndex must be between 0 and \".concat(options.segmentCount - 1));\n }\n }\n return {\n data: await post(_this3.fetch, \"\".concat(_this3.url, \"/ListVectors\"), options, {\n headers: _this3.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this3.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Queries for similar vectors using approximate nearest neighbor search */ async queryVectors(options) {\n var _this4 = this;\n try {\n return {\n data: await post(_this4.fetch, \"\".concat(_this4.url, \"/QueryVectors\"), options, {\n headers: _this4.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this4.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Deletes vectors by their keys in batch (1-500 per request) */ async deleteVectors(options) {\n var _this5 = this;\n try {\n if (options.keys.length < 1 || options.keys.length > 500) throw new Error(\"Keys batch size must be between 1 and 500 items\");\n return {\n data: await post(_this5.fetch, \"\".concat(_this5.url, \"/DeleteVectors\"), options, {\n headers: _this5.headers\n }) || {},\n error: null\n };\n } catch (error) {\n if (_this5.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Creates a new VectorDataApi instance */ constructor(url, headers = {}, fetch$1){\n this.shouldThrowOnError = false;\n this.url = url.replace(/\\/$/, \"\");\n this.headers = _objectSpread2(_objectSpread2({}, DEFAULT_HEADERS), headers);\n this.fetch = resolveFetch(fetch$1);\n }\n};\n//#endregion\n//#region src/lib/vectors/VectorBucketApi.ts\n/**\n* @hidden\n* Base implementation for vector bucket operations.\n* Use {@link StorageVectorsClient} via `supabase.storage.vectors` instead.\n*/ var VectorBucketApi = class {\n /** Enable throwing errors instead of returning them in the response */ throwOnError() {\n this.shouldThrowOnError = true;\n return this;\n }\n /** Creates a new vector bucket */ async createBucket(vectorBucketName) {\n var _this = this;\n try {\n return {\n data: await post(_this.fetch, \"\".concat(_this.url, \"/CreateVectorBucket\"), {\n vectorBucketName\n }, {\n headers: _this.headers\n }) || {},\n error: null\n };\n } catch (error) {\n if (_this.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Retrieves metadata for a specific vector bucket */ async getBucket(vectorBucketName) {\n var _this2 = this;\n try {\n return {\n data: await post(_this2.fetch, \"\".concat(_this2.url, \"/GetVectorBucket\"), {\n vectorBucketName\n }, {\n headers: _this2.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this2.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Lists vector buckets with optional filtering and pagination */ async listBuckets() {\n let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n var _this3 = this;\n try {\n return {\n data: await post(_this3.fetch, \"\".concat(_this3.url, \"/ListVectorBuckets\"), options, {\n headers: _this3.headers\n }),\n error: null\n };\n } catch (error) {\n if (_this3.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Deletes a vector bucket (must be empty first) */ async deleteBucket(vectorBucketName) {\n var _this4 = this;\n try {\n return {\n data: await post(_this4.fetch, \"\".concat(_this4.url, \"/DeleteVectorBucket\"), {\n vectorBucketName\n }, {\n headers: _this4.headers\n }) || {},\n error: null\n };\n } catch (error) {\n if (_this4.shouldThrowOnError) throw error;\n if (isStorageVectorsError(error)) return {\n data: null,\n error\n };\n throw error;\n }\n }\n /** Creates a new VectorBucketApi instance */ constructor(url, headers = {}, fetch$1){\n this.shouldThrowOnError = false;\n this.url = url.replace(/\\/$/, \"\");\n this.headers = _objectSpread2(_objectSpread2({}, DEFAULT_HEADERS), headers);\n this.fetch = resolveFetch(fetch$1);\n }\n};\n//#endregion\n//#region src/lib/vectors/StorageVectorsClient.ts\n/**\n*\n* @alpha\n*\n* Main client for interacting with S3 Vectors API\n* Provides access to bucket, index, and vector data operations\n*\n* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n*\n* **Usage Patterns:**\n*\n* ```typescript\n* const { data, error } = await supabase\n* .storage\n* .vectors\n* .createBucket('embeddings-prod')\n*\n* // Access index operations via buckets\n* const bucket = supabase.storage.vectors.from('embeddings-prod')\n* await bucket.createIndex({\n* indexName: 'documents',\n* dataType: 'float32',\n* dimension: 1536,\n* distanceMetric: 'cosine'\n* })\n*\n* // Access vector operations via index\n* const index = bucket.index('documents')\n* await index.putVectors({\n* vectors: [\n* { key: 'doc-1', data: { float32: [...] }, metadata: { title: 'Intro' } }\n* ]\n* })\n*\n* // Query similar vectors\n* const { data } = await index.queryVectors({\n* queryVector: { float32: [...] },\n* topK: 5,\n* returnDistance: true\n* })\n* ```\n*/ var StorageVectorsClient = class extends VectorBucketApi {\n /**\n\t*\n\t* @alpha\n\t*\n\t* Access operations for a specific vector bucket\n\t* Returns a scoped client for index and vector operations within the bucket\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param vectorBucketName - Name of the vector bucket\n\t* @returns Bucket-scoped client with index and vector operations\n\t*\n\t* @example\n\t* ```typescript\n\t* const bucket = supabase.storage.vectors.from('embeddings-prod')\n\t* ```\n\t*/ from(vectorBucketName) {\n return new VectorBucketScope(this.url, this.headers, vectorBucketName, this.fetch);\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Creates a new vector bucket\n\t* Vector buckets are containers for vector indexes and their data\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param vectorBucketName - Unique name for the vector bucket\n\t* @returns Promise with empty response on success or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .vectors\n\t* .createBucket('embeddings-prod')\n\t* ```\n\t*/ async createBucket(vectorBucketName) {\n var _superprop_getCreateBucket = ()=>super.createBucket, _this = this;\n return _superprop_getCreateBucket().call(_this, vectorBucketName);\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Retrieves metadata for a specific vector bucket\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param vectorBucketName - Name of the vector bucket\n\t* @returns Promise with bucket metadata or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .vectors\n\t* .getBucket('embeddings-prod')\n\t*\n\t* console.log('Bucket created:', data?.vectorBucket.creationTime)\n\t* ```\n\t*/ async getBucket(vectorBucketName) {\n var _superprop_getGetBucket = ()=>super.getBucket, _this2 = this;\n return _superprop_getGetBucket().call(_this2, vectorBucketName);\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Lists all vector buckets with optional filtering and pagination\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param options - Optional filters (prefix, maxResults, nextToken)\n\t* @returns Promise with list of buckets or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .vectors\n\t* .listBuckets({ prefix: 'embeddings-' })\n\t*\n\t* data?.vectorBuckets.forEach(bucket => {\n\t* console.log(bucket.vectorBucketName)\n\t* })\n\t* ```\n\t*/ async listBuckets() {\n let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n var _superprop_getListBuckets = ()=>super.listBuckets, _this3 = this;\n return _superprop_getListBuckets().call(_this3, options);\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Deletes a vector bucket (bucket must be empty)\n\t* All indexes must be deleted before deleting the bucket\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param vectorBucketName - Name of the vector bucket to delete\n\t* @returns Promise with empty response on success or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const { data, error } = await supabase\n\t* .storage\n\t* .vectors\n\t* .deleteBucket('embeddings-old')\n\t* ```\n\t*/ async deleteBucket(vectorBucketName) {\n var _superprop_getDeleteBucket = ()=>super.deleteBucket, _this4 = this;\n return _superprop_getDeleteBucket().call(_this4, vectorBucketName);\n }\n /**\n\t* @alpha\n\t*\n\t* Creates a StorageVectorsClient that can manage buckets, indexes, and vectors.\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param url - Base URL of the Storage Vectors REST API.\n\t* @param options.headers - Optional headers (for example `Authorization`) applied to every request.\n\t* @param options.fetch - Optional custom `fetch` implementation for non-browser runtimes.\n\t*\n\t* @example\n\t* ```typescript\n\t* const client = new StorageVectorsClient(url, options)\n\t* ```\n\t*/ constructor(url, options = {}){\n super(url, options.headers || {}, options.fetch);\n }\n};\n/**\n*\n* @alpha\n*\n* Scoped client for operations within a specific vector bucket\n* Provides index management and access to vector operations\n*\n* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n*/ var VectorBucketScope = class extends VectorIndexApi {\n /**\n\t*\n\t* @alpha\n\t*\n\t* Creates a new vector index in this bucket\n\t* Convenience method that automatically includes the bucket name\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param options - Index configuration (vectorBucketName is automatically set)\n\t* @returns Promise with empty response on success or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const bucket = supabase.storage.vectors.from('embeddings-prod')\n\t* await bucket.createIndex({\n\t* indexName: 'documents-openai',\n\t* dataType: 'float32',\n\t* dimension: 1536,\n\t* distanceMetric: 'cosine',\n\t* metadataConfiguration: {\n\t* nonFilterableMetadataKeys: ['raw_text']\n\t* }\n\t* })\n\t* ```\n\t*/ async createIndex(options) {\n var _superprop_getCreateIndex = ()=>super.createIndex, _this5 = this;\n return _superprop_getCreateIndex().call(_this5, _objectSpread2(_objectSpread2({}, options), {}, {\n vectorBucketName: _this5.vectorBucketName\n }));\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Lists indexes in this bucket\n\t* Convenience method that automatically includes the bucket name\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param options - Listing options (vectorBucketName is automatically set)\n\t* @returns Promise with response containing indexes array and pagination token or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const bucket = supabase.storage.vectors.from('embeddings-prod')\n\t* const { data } = await bucket.listIndexes({ prefix: 'documents-' })\n\t* ```\n\t*/ async listIndexes() {\n let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n var _superprop_getListIndexes = ()=>super.listIndexes, _this6 = this;\n return _superprop_getListIndexes().call(_this6, _objectSpread2(_objectSpread2({}, options), {}, {\n vectorBucketName: _this6.vectorBucketName\n }));\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Retrieves metadata for a specific index in this bucket\n\t* Convenience method that automatically includes the bucket name\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param indexName - Name of the index to retrieve\n\t* @returns Promise with index metadata or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const bucket = supabase.storage.vectors.from('embeddings-prod')\n\t* const { data } = await bucket.getIndex('documents-openai')\n\t* console.log('Dimension:', data?.index.dimension)\n\t* ```\n\t*/ async getIndex(indexName) {\n var _superprop_getGetIndex = ()=>super.getIndex, _this7 = this;\n return _superprop_getGetIndex().call(_this7, _this7.vectorBucketName, indexName);\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Deletes an index from this bucket\n\t* Convenience method that automatically includes the bucket name\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param indexName - Name of the index to delete\n\t* @returns Promise with empty response on success or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const bucket = supabase.storage.vectors.from('embeddings-prod')\n\t* await bucket.deleteIndex('old-index')\n\t* ```\n\t*/ async deleteIndex(indexName) {\n var _superprop_getDeleteIndex = ()=>super.deleteIndex, _this8 = this;\n return _superprop_getDeleteIndex().call(_this8, _this8.vectorBucketName, indexName);\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Access operations for a specific index within this bucket\n\t* Returns a scoped client for vector data operations\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param indexName - Name of the index\n\t* @returns Index-scoped client with vector data operations\n\t*\n\t* @example\n\t* ```typescript\n\t* const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n\t*\n\t* // Insert vectors\n\t* await index.putVectors({\n\t* vectors: [\n\t* { key: 'doc-1', data: { float32: [...] }, metadata: { title: 'Intro' } }\n\t* ]\n\t* })\n\t*\n\t* // Query similar vectors\n\t* const { data } = await index.queryVectors({\n\t* queryVector: { float32: [...] },\n\t* topK: 5\n\t* })\n\t* ```\n\t*/ index(indexName) {\n return new VectorIndexScope(this.url, this.headers, this.vectorBucketName, indexName, this.fetch);\n }\n /**\n\t* @alpha\n\t*\n\t* Creates a helper that automatically scopes all index operations to the provided bucket.\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @example\n\t* ```typescript\n\t* const bucket = supabase.storage.vectors.from('embeddings-prod')\n\t* ```\n\t*/ constructor(url, headers, vectorBucketName, fetch$1){\n super(url, headers, fetch$1);\n this.vectorBucketName = vectorBucketName;\n }\n};\n/**\n*\n* @alpha\n*\n* Scoped client for operations within a specific vector index\n* Provides vector data operations (put, get, list, query, delete)\n*\n* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n*/ var VectorIndexScope = class extends VectorDataApi {\n /**\n\t*\n\t* @alpha\n\t*\n\t* Inserts or updates vectors in this index\n\t* Convenience method that automatically includes bucket and index names\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param options - Vector insertion options (bucket and index names automatically set)\n\t* @returns Promise with empty response on success or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n\t* await index.putVectors({\n\t* vectors: [\n\t* {\n\t* key: 'doc-1',\n\t* data: { float32: [0.1, 0.2, ...] },\n\t* metadata: { title: 'Introduction', page: 1 }\n\t* }\n\t* ]\n\t* })\n\t* ```\n\t*/ async putVectors(options) {\n var _superprop_getPutVectors = ()=>super.putVectors, _this9 = this;\n return _superprop_getPutVectors().call(_this9, _objectSpread2(_objectSpread2({}, options), {}, {\n vectorBucketName: _this9.vectorBucketName,\n indexName: _this9.indexName\n }));\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Retrieves vectors by keys from this index\n\t* Convenience method that automatically includes bucket and index names\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param options - Vector retrieval options (bucket and index names automatically set)\n\t* @returns Promise with response containing vectors array or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n\t* const { data } = await index.getVectors({\n\t* keys: ['doc-1', 'doc-2'],\n\t* returnMetadata: true\n\t* })\n\t* ```\n\t*/ async getVectors(options) {\n var _superprop_getGetVectors = ()=>super.getVectors, _this10 = this;\n return _superprop_getGetVectors().call(_this10, _objectSpread2(_objectSpread2({}, options), {}, {\n vectorBucketName: _this10.vectorBucketName,\n indexName: _this10.indexName\n }));\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Lists vectors in this index with pagination\n\t* Convenience method that automatically includes bucket and index names\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param options - Listing options (bucket and index names automatically set)\n\t* @returns Promise with response containing vectors array and pagination token or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n\t* const { data } = await index.listVectors({\n\t* maxResults: 500,\n\t* returnMetadata: true\n\t* })\n\t* ```\n\t*/ async listVectors() {\n let options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n var _superprop_getListVectors = ()=>super.listVectors, _this11 = this;\n return _superprop_getListVectors().call(_this11, _objectSpread2(_objectSpread2({}, options), {}, {\n vectorBucketName: _this11.vectorBucketName,\n indexName: _this11.indexName\n }));\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Queries for similar vectors in this index\n\t* Convenience method that automatically includes bucket and index names\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param options - Query options (bucket and index names automatically set)\n\t* @returns Promise with response containing matches array of similar vectors ordered by distance or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n\t* const { data } = await index.queryVectors({\n\t* queryVector: { float32: [0.1, 0.2, ...] },\n\t* topK: 5,\n\t* filter: { category: 'technical' },\n\t* returnDistance: true,\n\t* returnMetadata: true\n\t* })\n\t* ```\n\t*/ async queryVectors(options) {\n var _superprop_getQueryVectors = ()=>super.queryVectors, _this12 = this;\n return _superprop_getQueryVectors().call(_this12, _objectSpread2(_objectSpread2({}, options), {}, {\n vectorBucketName: _this12.vectorBucketName,\n indexName: _this12.indexName\n }));\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Deletes vectors by keys from this index\n\t* Convenience method that automatically includes bucket and index names\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @param options - Deletion options (bucket and index names automatically set)\n\t* @returns Promise with empty response on success or error\n\t*\n\t* @example\n\t* ```typescript\n\t* const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n\t* await index.deleteVectors({\n\t* keys: ['doc-1', 'doc-2', 'doc-3']\n\t* })\n\t* ```\n\t*/ async deleteVectors(options) {\n var _superprop_getDeleteVectors = ()=>super.deleteVectors, _this13 = this;\n return _superprop_getDeleteVectors().call(_this13, _objectSpread2(_objectSpread2({}, options), {}, {\n vectorBucketName: _this13.vectorBucketName,\n indexName: _this13.indexName\n }));\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Creates a helper that automatically scopes all vector operations to the provided bucket/index names.\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @example\n\t* ```typescript\n\t* const index = supabase.storage.vectors.from('embeddings-prod').index('documents-openai')\n\t* ```\n\t*/ constructor(url, headers, vectorBucketName, indexName, fetch$1){\n super(url, headers, fetch$1);\n this.vectorBucketName = vectorBucketName;\n this.indexName = indexName;\n }\n};\n//#endregion\n//#region src/StorageClient.ts\nvar StorageClient = class extends StorageBucketApi {\n /**\n\t* Perform file operation in a bucket.\n\t*\n\t* @category File Buckets\n\t* @param id The bucket id to operate on.\n\t*\n\t* @example\n\t* ```typescript\n\t* const avatars = supabase.storage.from('avatars')\n\t* ```\n\t*/ from(id) {\n return new StorageFileApi(this.url, this.headers, id, this.fetch);\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Access vector storage operations.\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Vector Buckets\n\t* @returns A StorageVectorsClient instance configured with the current storage settings.\n\t*/ get vectors() {\n return new StorageVectorsClient(this.url + \"/vector\", {\n headers: this.headers,\n fetch: this.fetch\n });\n }\n /**\n\t*\n\t* @alpha\n\t*\n\t* Access analytics storage operations using Iceberg tables.\n\t*\n\t* **Public alpha:** This API is part of a public alpha release and may not be available to your account type.\n\t*\n\t* @category Analytics Buckets\n\t* @returns A StorageAnalyticsClient instance configured with the current storage settings.\n\t*/ get analytics() {\n return new StorageAnalyticsClient(this.url + \"/iceberg\", this.headers, this.fetch);\n }\n /**\n\t* Creates a client for Storage buckets, files, analytics, and vectors.\n\t*\n\t* @category File Buckets\n\t* @example\n\t* ```ts\n\t* import { StorageClient } from '@supabase/storage-js'\n\t*\n\t* const storage = new StorageClient('https://xyzcompany.supabase.co/storage/v1', {\n\t* apikey: 'public-anon-key',\n\t* })\n\t* const avatars = storage.from('avatars')\n\t* ```\n\t*/ constructor(url, headers = {}, fetch$1, opts){\n super(url, headers, fetch$1, opts);\n }\n};\n//#endregion\n //# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2Uvc3RvcmFnZS1qcy9kaXN0L2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBZ0Q7QUFFaEQsMkJBQTJCO0FBQzNCLElBQUlDLGVBQWUsY0FBY0M7SUFDaENDLFlBQVlDLE9BQU8sQ0FBRTtRQUNwQixLQUFLLENBQUNBO1FBQ04sSUFBSSxDQUFDQyxnQkFBZ0IsR0FBRztRQUN4QixJQUFJLENBQUNDLElBQUksR0FBRztJQUNiO0FBQ0Q7QUFDQSxTQUFTQyxlQUFlQyxLQUFLO0lBQzVCLE9BQU8sT0FBT0EsVUFBVSxZQUFZQSxVQUFVLFFBQVEsc0JBQXNCQTtBQUM3RTtBQUNBLElBQUlDLGtCQUFrQixjQUFjUjtJQU9uQ1MsU0FBUztRQUNSLE9BQU87WUFDTkosTUFBTSxJQUFJLENBQUNBLElBQUk7WUFDZkYsU0FBUyxJQUFJLENBQUNBLE9BQU87WUFDckJPLFFBQVEsSUFBSSxDQUFDQSxNQUFNO1lBQ25CQyxZQUFZLElBQUksQ0FBQ0EsVUFBVTtRQUM1QjtJQUNEO0lBYkFULFlBQVlDLE9BQU8sRUFBRU8sTUFBTSxFQUFFQyxVQUFVLENBQUU7UUFDeEMsS0FBSyxDQUFDUjtRQUNOLElBQUksQ0FBQ0UsSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDSyxNQUFNLEdBQUdBO1FBQ2QsSUFBSSxDQUFDQyxVQUFVLEdBQUdBO0lBQ25CO0FBU0Q7QUFDQSxJQUFJQyxzQkFBc0IsY0FBY1o7SUFDdkNFLFlBQVlDLE9BQU8sRUFBRVUsYUFBYSxDQUFFO1FBQ25DLEtBQUssQ0FBQ1Y7UUFDTixJQUFJLENBQUNFLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ1EsYUFBYSxHQUFHQTtJQUN0QjtBQUNEO0FBRUEsWUFBWTtBQUNaLDRCQUE0QjtBQUM1QixNQUFNQyxpQkFBaUIsQ0FBQ0M7SUFDdkIsSUFBSUEsYUFBYSxPQUFPO3lDQUFJQztZQUFBQTs7ZUFBU0QsZUFBZUM7O0lBQ3BELE9BQU87eUNBQUlBO1lBQUFBOztlQUFTQyxTQUFTRDs7QUFDOUI7QUFDQSxNQUFNRSxvQkFBb0I7SUFDekIsT0FBT0M7QUFDUjtBQUNBLE1BQU1DLG1CQUFtQixDQUFDQztJQUN6QixJQUFJQyxNQUFNQyxPQUFPLENBQUNGLE9BQU8sT0FBT0EsS0FBS0csR0FBRyxDQUFDLENBQUNDLEtBQU9MLGlCQUFpQks7U0FDN0QsSUFBSSxPQUFPSixTQUFTLGNBQWNBLFNBQVNLLE9BQU9MLE9BQU8sT0FBT0E7SUFDckUsTUFBTU0sU0FBUyxDQUFDO0lBQ2hCRCxPQUFPRSxPQUFPLENBQUNQLE1BQU1RLE9BQU8sQ0FBQztZQUFDLENBQUNDLEtBQUtDLE1BQU07UUFDekMsTUFBTUMsU0FBU0YsSUFBSUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDQyxJQUFNQSxFQUFFQyxXQUFXLEdBQUdGLE9BQU8sQ0FBQyxTQUFTO1FBQ3BGTixNQUFNLENBQUNLLE9BQU8sR0FBR1osaUJBQWlCVztJQUNuQztJQUNBLE9BQU9KO0FBQ1I7QUFDQTs7OztBQUlBLEdBQ0EsTUFBTVMsa0JBQWtCLENBQUNMO0lBQ3hCLElBQUksT0FBT0EsVUFBVSxZQUFZQSxVQUFVLE1BQU0sT0FBTztJQUN4RCxNQUFNTSxZQUFZWCxPQUFPWSxjQUFjLENBQUNQO0lBQ3hDLE9BQU8sQ0FBQ00sY0FBYyxRQUFRQSxjQUFjWCxPQUFPVyxTQUFTLElBQUlYLE9BQU9ZLGNBQWMsQ0FBQ0QsZUFBZSxJQUFHLEtBQU0sQ0FBRUUsQ0FBQUEsT0FBT0MsV0FBVyxJQUFJVCxLQUFJLEtBQU0sQ0FBRVEsQ0FBQUEsT0FBT0UsUUFBUSxJQUFJVixLQUFJO0FBQzFLO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0EsR0FDQSxNQUFNVyxvQkFBb0IsQ0FBQ0M7SUFDMUIsSUFBSSxDQUFDQSxjQUFjLE9BQU9BLGVBQWUsVUFBVSxPQUFPO0lBQzFELElBQUlBLFdBQVdDLE1BQU0sS0FBSyxLQUFLRCxXQUFXQyxNQUFNLEdBQUcsS0FBSyxPQUFPO0lBQy9ELElBQUlELFdBQVdFLElBQUksT0FBT0YsWUFBWSxPQUFPO0lBQzdDLElBQUlBLFdBQVdHLFFBQVEsQ0FBQyxRQUFRSCxXQUFXRyxRQUFRLENBQUMsT0FBTyxPQUFPO0lBQ2xFLE9BQU8sNEJBQTRCQyxJQUFJLENBQUNKO0FBQ3pDO0FBRUEsWUFBWTtBQUNaLDBEQUEwRDtBQUMxRCxTQUFTSyxRQUFRQyxDQUFDO0lBQ2pCO0lBQ0EsT0FBT0QsVUFBVSxjQUFjLE9BQU9ULFVBQVUsWUFBWSxPQUFPQSxPQUFPRSxRQUFRLEdBQUcsU0FBU1MsR0FBRztRQUNoRyxPQUFPLE9BQU9BO0lBQ2YsSUFBSSxTQUFTQSxHQUFHO1FBQ2YsT0FBT0EsT0FBTyxjQUFjLE9BQU9YLFVBQVVXLElBQUloRCxXQUFXLEtBQUtxQyxVQUFVVyxRQUFRWCxPQUFPRixTQUFTLEdBQUcsV0FBVyxPQUFPYTtJQUN6SCxHQUFHRixRQUFRQztBQUNaO0FBRUEsWUFBWTtBQUNaLCtEQUErRDtBQUMvRCxTQUFTRSxZQUFZQyxDQUFDLEVBQUVDLENBQUM7SUFDeEIsSUFBSSxZQUFZTCxRQUFRSSxNQUFNLENBQUNBLEdBQUcsT0FBT0E7SUFDekMsSUFBSUUsSUFBSUYsQ0FBQyxDQUFDYixPQUFPWSxXQUFXLENBQUM7SUFDN0IsSUFBSSxLQUFLLE1BQU1HLEdBQUc7UUFDakIsSUFBSUMsSUFBSUQsRUFBRUUsSUFBSSxDQUFDSixHQUFHQyxLQUFLO1FBQ3ZCLElBQUksWUFBWUwsUUFBUU8sSUFBSSxPQUFPQTtRQUNuQyxNQUFNLElBQUlFLFVBQVU7SUFDckI7SUFDQSxPQUFPLENBQUMsYUFBYUosSUFBSUssU0FBU0MsTUFBSyxFQUFHUDtBQUMzQztBQUVBLFlBQVk7QUFDWixpRUFBaUU7QUFDakUsU0FBU1EsY0FBY1IsQ0FBQztJQUN2QixJQUFJRyxJQUFJSixZQUFZQyxHQUFHO0lBQ3ZCLE9BQU8sWUFBWUosUUFBUU8sS0FBS0EsSUFBSUEsSUFBSTtBQUN6QztBQUVBLFlBQVk7QUFDWixrRUFBa0U7QUFDbEUsU0FBU00sZ0JBQWdCUCxDQUFDLEVBQUVELENBQUMsRUFBRUQsQ0FBQztJQUMvQixPQUFPLENBQUNDLElBQUlPLGNBQWNQLEVBQUMsS0FBTUMsSUFBSTVCLE9BQU9vQyxjQUFjLENBQUNSLEdBQUdELEdBQUc7UUFDaEV0QixPQUFPcUI7UUFDUFcsWUFBWSxDQUFDO1FBQ2JDLGNBQWMsQ0FBQztRQUNmQyxVQUFVLENBQUM7SUFDWixLQUFLWCxDQUFDLENBQUNELEVBQUUsR0FBR0QsR0FBR0U7QUFDaEI7QUFFQSxZQUFZO0FBQ1osaUVBQWlFO0FBQ2pFLFNBQVNZLFFBQVFaLENBQUMsRUFBRUQsQ0FBQztJQUNwQixJQUFJRCxJQUFJMUIsT0FBT3lDLElBQUksQ0FBQ2I7SUFDcEIsSUFBSTVCLE9BQU8wQyxxQkFBcUIsRUFBRTtRQUNqQyxJQUFJbkIsSUFBSXZCLE9BQU8wQyxxQkFBcUIsQ0FBQ2Q7UUFDckNELEtBQU1KLENBQUFBLElBQUlBLEVBQUVvQixNQUFNLENBQUMsU0FBU0MsR0FBRztZQUM5QixPQUFPNUMsT0FBTzZDLHdCQUF3QixDQUFDakIsR0FBR2dCLEtBQUtQLFVBQVU7UUFDMUQsRUFBQyxHQUFJWCxFQUFFb0IsSUFBSSxDQUFDQyxLQUFLLENBQUNyQixHQUFHSDtJQUN0QjtJQUNBLE9BQU9HO0FBQ1I7QUFDQSxTQUFTc0IsZUFBZXBCLENBQUM7SUFDeEIsSUFBSyxJQUFJRCxJQUFJLEdBQUdBLElBQUlzQixVQUFVL0IsTUFBTSxFQUFFUyxJQUFLO1FBQzFDLElBQUlELElBQUksUUFBUXVCLFNBQVMsQ0FBQ3RCLEVBQUUsR0FBR3NCLFNBQVMsQ0FBQ3RCLEVBQUUsR0FBRyxDQUFDO1FBQy9DQSxJQUFJLElBQUlhLFFBQVF4QyxPQUFPMEIsSUFBSSxDQUFDLEdBQUd2QixPQUFPLENBQUMsU0FBU3lDLEdBQUc7WUFDbERULGdCQUFnQlAsR0FBR2dCLEtBQUtsQixDQUFDLENBQUNrQixJQUFJO1FBQy9CLEtBQUs1QyxPQUFPa0QseUJBQXlCLEdBQUdsRCxPQUFPbUQsZ0JBQWdCLENBQUN2QixHQUFHNUIsT0FBT2tELHlCQUF5QixDQUFDeEIsTUFBTWMsUUFBUXhDLE9BQU8wQixJQUFJdkIsT0FBTyxDQUFDLFNBQVN5QyxHQUFHO1lBQ2hKNUMsT0FBT29DLGNBQWMsQ0FBQ1IsR0FBR2dCLEtBQUs1QyxPQUFPNkMsd0JBQXdCLENBQUNuQixHQUFHa0I7UUFDbEU7SUFDRDtJQUNBLE9BQU9oQjtBQUNSO0FBRUEsWUFBWTtBQUNaLDBCQUEwQjtBQUMxQixNQUFNd0IscUJBQXFCLENBQUNDO0lBQzNCLElBQUlDO0lBQ0osT0FBT0QsSUFBSUUsR0FBRyxJQUFJRixJQUFJNUUsT0FBTyxJQUFJNEUsSUFBSUcsaUJBQWlCLElBQUssUUFBT0gsSUFBSXhFLEtBQUssS0FBSyxXQUFXd0UsSUFBSXhFLEtBQUssR0FBRyxDQUFDeUUsYUFBYUQsSUFBSXhFLEtBQUssTUFBTSxRQUFReUUsZUFBZSxLQUFLLElBQUksS0FBSyxJQUFJQSxXQUFXN0UsT0FBTyxLQUFLZ0YsS0FBS0MsU0FBUyxDQUFDTDtBQUNwTjtBQUNBLE1BQU1NLGdCQUFnQixPQUFPOUUsT0FBTytFLFFBQVFDO0lBQzNDLElBQUloRixpQkFBaUIsTUFBTVcsdUJBQXVCLENBQUVxRSxDQUFBQSxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUUMsYUFBYSxHQUFHakYsTUFBTWtGLElBQUksR0FBR0MsSUFBSSxDQUFDLENBQUNYO1FBQ2hKLE1BQU1yRSxTQUFTSCxNQUFNRyxNQUFNLElBQUk7UUFDL0IsTUFBTUMsYUFBYSxDQUFDb0UsUUFBUSxRQUFRQSxRQUFRLEtBQUssSUFBSSxLQUFLLElBQUlBLElBQUlwRSxVQUFVLEtBQUtELFNBQVM7UUFDMUY0RSxPQUFPLElBQUk5RSxnQkFBZ0JzRSxtQkFBbUJDLE1BQU1yRSxRQUFRQztJQUM3RCxHQUFHZ0YsS0FBSyxDQUFDLENBQUNaO1FBQ1RPLE9BQU8sSUFBSTFFLG9CQUFvQmtFLG1CQUFtQkMsTUFBTUE7SUFDekQ7U0FDS08sT0FBTyxJQUFJMUUsb0JBQW9Ca0UsbUJBQW1CdkUsUUFBUUE7QUFDaEU7QUFDQSxNQUFNcUYsc0JBQXNCLENBQUNDLFFBQVFOLFNBQVNPLFlBQVlDO0lBQ3pELE1BQU1DLFNBQVM7UUFDZEg7UUFDQUksU0FBUyxDQUFDVixZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUVUsT0FBTyxLQUFLLENBQUM7SUFDbEY7SUFDQSxJQUFJSixXQUFXLFNBQVMsQ0FBQ0UsTUFBTSxPQUFPQztJQUN0QyxJQUFJNUQsZ0JBQWdCMkQsT0FBTztRQUMxQkMsT0FBT0MsT0FBTyxHQUFHdkIsZUFBZTtZQUFFLGdCQUFnQjtRQUFtQixHQUFHYSxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUVUsT0FBTztRQUN6SUQsT0FBT0QsSUFBSSxHQUFHWixLQUFLQyxTQUFTLENBQUNXO0lBQzlCLE9BQU9DLE9BQU9ELElBQUksR0FBR0E7SUFDckIsSUFBSVIsWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFXLE1BQU0sRUFBRUYsT0FBT0UsTUFBTSxHQUFHWCxRQUFRVyxNQUFNO0lBQ3BHLE9BQU94QixlQUFlQSxlQUFlLENBQUMsR0FBR3NCLFNBQVNGO0FBQ25EO0FBQ0EsZUFBZUssaUJBQWlCQyxPQUFPLEVBQUVQLE1BQU0sRUFBRVEsR0FBRyxFQUFFZCxPQUFPLEVBQUVPLFVBQVUsRUFBRUMsSUFBSTtJQUM5RSxPQUFPLElBQUlPLFFBQVEsQ0FBQ0MsU0FBU2pCO1FBQzVCYyxRQUFRQyxLQUFLVCxvQkFBb0JDLFFBQVFOLFNBQVNPLFlBQVlDLE9BQU9MLElBQUksQ0FBQyxDQUFDL0Q7WUFDMUUsSUFBSSxDQUFDQSxPQUFPNkUsRUFBRSxFQUFFLE1BQU03RTtZQUN0QixJQUFJNEQsWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFDLGFBQWEsRUFBRSxPQUFPN0Q7WUFDcEYsT0FBT0EsT0FBTzhELElBQUk7UUFDbkIsR0FBR0MsSUFBSSxDQUFDLENBQUNlLE9BQVNGLFFBQVFFLE9BQU9kLEtBQUssQ0FBQyxDQUFDcEYsUUFBVThFLGNBQWM5RSxPQUFPK0UsUUFBUUM7SUFDaEY7QUFDRDtBQUNBLGVBQWVtQixJQUFJTixPQUFPLEVBQUVDLEdBQUcsRUFBRWQsT0FBTyxFQUFFTyxVQUFVO0lBQ25ELE9BQU9LLGlCQUFpQkMsU0FBUyxPQUFPQyxLQUFLZCxTQUFTTztBQUN2RDtBQUNBLGVBQWVhLE9BQU9QLE9BQU8sRUFBRUMsR0FBRyxFQUFFTixJQUFJLEVBQUVSLE9BQU8sRUFBRU8sVUFBVTtJQUM1RCxPQUFPSyxpQkFBaUJDLFNBQVMsUUFBUUMsS0FBS2QsU0FBU08sWUFBWUM7QUFDcEU7QUFDQSxlQUFlYSxJQUFJUixPQUFPLEVBQUVDLEdBQUcsRUFBRU4sSUFBSSxFQUFFUixPQUFPLEVBQUVPLFVBQVU7SUFDekQsT0FBT0ssaUJBQWlCQyxTQUFTLE9BQU9DLEtBQUtkLFNBQVNPLFlBQVlDO0FBQ25FO0FBQ0EsZUFBZWMsS0FBS1QsT0FBTyxFQUFFQyxHQUFHLEVBQUVkLE9BQU8sRUFBRU8sVUFBVTtJQUNwRCxPQUFPSyxpQkFBaUJDLFNBQVMsUUFBUUMsS0FBSzNCLGVBQWVBLGVBQWUsQ0FBQyxHQUFHYSxVQUFVLENBQUMsR0FBRztRQUFFQyxlQUFlO0lBQUssSUFBSU07QUFDekg7QUFDQSxlQUFlZ0IsT0FBT1YsT0FBTyxFQUFFQyxHQUFHLEVBQUVOLElBQUksRUFBRVIsT0FBTyxFQUFFTyxVQUFVO0lBQzVELE9BQU9LLGlCQUFpQkMsU0FBUyxVQUFVQyxLQUFLZCxTQUFTTyxZQUFZQztBQUN0RTtBQUVBLFlBQVk7QUFDWiwrQ0FBK0M7QUFDL0MsSUFBSWdCLHdCQUF3QjtJQUszQnJCLEtBQUtzQixXQUFXLEVBQUVDLFVBQVUsRUFBRTtRQUM3QixPQUFPLElBQUksQ0FBQ0MsT0FBTyxHQUFHeEIsSUFBSSxDQUFDc0IsYUFBYUM7SUFDekM7SUFDQSxNQUFNQyxVQUFVO1FBQ2YsSUFBSUMsUUFBUSxJQUFJO1FBQ2hCLElBQUk7WUFDSCxPQUFPO2dCQUNOVixNQUFNLENBQUMsTUFBTVUsTUFBTUMsVUFBVSxFQUFDLEVBQUdyQixJQUFJO2dCQUNyQ3hGLE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUk0RyxNQUFNRSxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDcEMsSUFBSUQsZUFBZUMsUUFBUSxPQUFPO2dCQUNqQ2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBdEJBTCxZQUFZa0gsVUFBVSxFQUFFQyxrQkFBa0IsQ0FBRTtRQUMzQyxJQUFJLENBQUNELFVBQVUsR0FBR0E7UUFDbEIsSUFBSSxDQUFDQyxrQkFBa0IsR0FBR0E7SUFDM0I7QUFvQkQ7QUFFQSxZQUFZO0FBQ1osNkNBQTZDO0FBQzdDLElBQUlDO0FBQ0pBLHNCQUFzQi9FLE9BQU9DLFdBQVc7QUFDeEMsSUFBSStFLHNCQUFzQjtJQU96QkMsV0FBVztRQUNWLE9BQU8sSUFBSVQsc0JBQXNCLElBQUksQ0FBQ0ssVUFBVSxFQUFFLElBQUksQ0FBQ0Msa0JBQWtCO0lBQzFFO0lBQ0EzQixLQUFLc0IsV0FBVyxFQUFFQyxVQUFVLEVBQUU7UUFDN0IsT0FBTyxJQUFJLENBQUNRLFVBQVUsR0FBRy9CLElBQUksQ0FBQ3NCLGFBQWFDO0lBQzVDO0lBQ0F0QixNQUFNc0IsVUFBVSxFQUFFO1FBQ2pCLE9BQU8sSUFBSSxDQUFDUSxVQUFVLEdBQUc5QixLQUFLLENBQUNzQjtJQUNoQztJQUNBUyxRQUFRQyxTQUFTLEVBQUU7UUFDbEIsT0FBTyxJQUFJLENBQUNGLFVBQVUsR0FBR0MsT0FBTyxDQUFDQztJQUNsQztJQUNBRixhQUFhO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQ0csT0FBTyxFQUFFLElBQUksQ0FBQ0EsT0FBTyxHQUFHLElBQUksQ0FBQ1YsT0FBTztRQUM5QyxPQUFPLElBQUksQ0FBQ1UsT0FBTztJQUNwQjtJQUNBLE1BQU1WLFVBQVU7UUFDZixJQUFJQyxRQUFRLElBQUk7UUFDaEIsSUFBSTtZQUNILE9BQU87Z0JBQ05WLE1BQU0sTUFBTSxDQUFDLE1BQU1VLE1BQU1DLFVBQVUsRUFBQyxFQUFHUyxJQUFJO2dCQUMzQ3RILE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUk0RyxNQUFNRSxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDcEMsSUFBSUQsZUFBZUMsUUFBUSxPQUFPO2dCQUNqQ2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBckNBTCxZQUFZa0gsVUFBVSxFQUFFQyxrQkFBa0IsQ0FBRTtRQUMzQyxJQUFJLENBQUNELFVBQVUsR0FBR0E7UUFDbEIsSUFBSSxDQUFDQyxrQkFBa0IsR0FBR0E7UUFDMUIsSUFBSSxDQUFDQyxvQkFBb0IsR0FBRztRQUM1QixJQUFJLENBQUNNLE9BQU8sR0FBRztJQUNoQjtBQWlDRDtBQUVBLFlBQVk7QUFDWix3Q0FBd0M7QUFDeEMsTUFBTUUseUJBQXlCO0lBQzlCQyxPQUFPO0lBQ1BDLFFBQVE7SUFDUkMsUUFBUTtRQUNQQyxRQUFRO1FBQ1JDLE9BQU87SUFDUjtBQUNEO0FBQ0EsTUFBTUMsdUJBQXVCO0lBQzVCQyxjQUFjO0lBQ2RDLGFBQWE7SUFDYkMsUUFBUTtBQUNUO0FBQ0EsSUFBSUMsaUJBQWlCO0lBUXBCOzs7O0NBSUEsR0FDQUMsZUFBZTtRQUNkLElBQUksQ0FBQ3BCLGtCQUFrQixHQUFHO1FBQzFCLE9BQU8sSUFBSTtJQUNaO0lBQ0E7Ozs7OztDQU1BLEdBQ0EsTUFBTXFCLGVBQWU3QyxNQUFNLEVBQUU4QyxJQUFJLEVBQUVDLFFBQVEsRUFBRUMsV0FBVyxFQUFFO1FBQ3pELElBQUkxQixRQUFRLElBQUk7UUFDaEIsSUFBSTtZQUNILElBQUlwQjtZQUNKLE1BQU1SLFVBQVViLGVBQWVBLGVBQWUsQ0FBQyxHQUFHMEQsdUJBQXVCUztZQUN6RSxJQUFJNUMsVUFBVXZCLGVBQWVBLGVBQWUsQ0FBQyxHQUFHeUMsTUFBTWxCLE9BQU8sR0FBR0osV0FBVyxVQUFVO2dCQUFFLFlBQVluQyxPQUFPNkIsUUFBUWdELE1BQU07WUFBRTtZQUMxSCxNQUFNTyxXQUFXdkQsUUFBUXVELFFBQVE7WUFDakMsSUFBSSxPQUFPQyxTQUFTLGVBQWVILG9CQUFvQkcsTUFBTTtnQkFDNURoRCxPQUFPLElBQUlpRDtnQkFDWGpELEtBQUtrRCxNQUFNLENBQUMsZ0JBQWdCMUQsUUFBUThDLFlBQVk7Z0JBQ2hELElBQUlTLFVBQVUvQyxLQUFLa0QsTUFBTSxDQUFDLFlBQVk5QixNQUFNK0IsY0FBYyxDQUFDSjtnQkFDM0QvQyxLQUFLa0QsTUFBTSxDQUFDLElBQUlMO1lBQ2pCLE9BQU8sSUFBSSxPQUFPSSxhQUFhLGVBQWVKLG9CQUFvQkksVUFBVTtnQkFDM0VqRCxPQUFPNkM7Z0JBQ1AsSUFBSSxDQUFDN0MsS0FBS29ELEdBQUcsQ0FBQyxpQkFBaUJwRCxLQUFLa0QsTUFBTSxDQUFDLGdCQUFnQjFELFFBQVE4QyxZQUFZO2dCQUMvRSxJQUFJUyxZQUFZLENBQUMvQyxLQUFLb0QsR0FBRyxDQUFDLGFBQWFwRCxLQUFLa0QsTUFBTSxDQUFDLFlBQVk5QixNQUFNK0IsY0FBYyxDQUFDSjtZQUNyRixPQUFPO2dCQUNOL0MsT0FBTzZDO2dCQUNQM0MsT0FBTyxDQUFDLGdCQUFnQixHQUFHLFdBQWdDLE9BQXJCVixRQUFROEMsWUFBWTtnQkFDMURwQyxPQUFPLENBQUMsZUFBZSxHQUFHVixRQUFRK0MsV0FBVztnQkFDN0MsSUFBSVEsVUFBVTdDLE9BQU8sQ0FBQyxhQUFhLEdBQUdrQixNQUFNaUMsUUFBUSxDQUFDakMsTUFBTStCLGNBQWMsQ0FBQ0o7Z0JBQzFFLElBQUksQ0FBQyxPQUFPTyxtQkFBbUIsZUFBZXRELGdCQUFnQnNELGtCQUFrQnRELFFBQVEsT0FBT0EsU0FBUyxZQUFZLFVBQVVBLFFBQVEsT0FBT0EsS0FBS3VELElBQUksS0FBSyxVQUFTLEtBQU0sQ0FBQy9ELFFBQVFXLE1BQU0sRUFBRVgsUUFBUVcsTUFBTSxHQUFHO1lBQzdNO1lBQ0EsSUFBSTJDLGdCQUFnQixRQUFRQSxnQkFBZ0IsS0FBSyxJQUFJLEtBQUssSUFBSUEsWUFBWTVDLE9BQU8sRUFBRUEsVUFBVXZCLGVBQWVBLGVBQWUsQ0FBQyxHQUFHdUIsVUFBVTRDLFlBQVk1QyxPQUFPO1lBQzVKLE1BQU1zRCxZQUFZcEMsTUFBTXFDLG1CQUFtQixDQUFDYjtZQUM1QyxNQUFNYyxRQUFRdEMsTUFBTXVDLGFBQWEsQ0FBQ0g7WUFDbEMsTUFBTTlDLE9BQU8sTUFBTSxDQUFDWixVQUFVLFFBQVFlLE1BQU1ELE1BQUssRUFBR1EsTUFBTWxHLEtBQUssRUFBRSxHQUF1QndJLE9BQXBCdEMsTUFBTWQsR0FBRyxFQUFDLFlBQWdCLE9BQU5vRCxRQUFTMUQsTUFBTXJCLGVBQWU7Z0JBQUV1QjtZQUFRLEdBQUcsQ0FBQ1YsWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFXLE1BQU0sSUFBSTtnQkFBRUEsUUFBUVgsUUFBUVcsTUFBTTtZQUFDLElBQUksQ0FBQztZQUN0TyxPQUFPO2dCQUNOTyxNQUFNO29CQUNMa0MsTUFBTVk7b0JBQ05JLElBQUlsRCxLQUFLbUQsRUFBRTtvQkFDWEMsVUFBVXBELEtBQUtxRCxHQUFHO2dCQUNuQjtnQkFDQXZKLE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUk0RyxNQUFNRSxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDcEMsSUFBSUQsZUFBZUMsUUFBUSxPQUFPO2dCQUNqQ2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EyQ0EsR0FDQSxNQUFNd0osT0FBT3BCLElBQUksRUFBRUMsUUFBUSxFQUFFQyxXQUFXLEVBQUU7UUFDekMsT0FBTyxJQUFJLENBQUNILGNBQWMsQ0FBQyxRQUFRQyxNQUFNQyxVQUFVQztJQUNwRDtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4QkEsR0FDQSxNQUFNbUIsa0JBQWtCckIsSUFBSSxFQUFFc0IsS0FBSyxFQUFFckIsUUFBUSxFQUFFQyxXQUFXLEVBQUU7UUFDM0QsSUFBSXFCLFNBQVMsSUFBSTtRQUNqQixNQUFNWCxZQUFZVyxPQUFPVixtQkFBbUIsQ0FBQ2I7UUFDN0MsTUFBTWMsUUFBUVMsT0FBT1IsYUFBYSxDQUFDSDtRQUNuQyxNQUFNbEQsTUFBTSxJQUFJOEQsSUFBSUQsT0FBTzdELEdBQUcsR0FBRyx1QkFBNkIsT0FBTm9EO1FBQ3hEcEQsSUFBSStELFlBQVksQ0FBQ0MsR0FBRyxDQUFDLFNBQVNKO1FBQzlCLElBQUk7WUFDSCxJQUFJbEU7WUFDSixNQUFNUixVQUFVYixlQUFlO2dCQUFFNkQsUUFBUUgscUJBQXFCRyxNQUFNO1lBQUMsR0FBR007WUFDeEUsTUFBTTVDLFVBQVV2QixlQUFlQSxlQUFlLENBQUMsR0FBR3dGLE9BQU9qRSxPQUFPLEdBQUc7Z0JBQUUsWUFBWXZDLE9BQU82QixRQUFRZ0QsTUFBTTtZQUFFO1lBQ3hHLElBQUksT0FBT1EsU0FBUyxlQUFlSCxvQkFBb0JHLE1BQU07Z0JBQzVEaEQsT0FBTyxJQUFJaUQ7Z0JBQ1hqRCxLQUFLa0QsTUFBTSxDQUFDLGdCQUFnQjFELFFBQVE4QyxZQUFZO2dCQUNoRHRDLEtBQUtrRCxNQUFNLENBQUMsSUFBSUw7WUFDakIsT0FBTyxJQUFJLE9BQU9JLGFBQWEsZUFBZUosb0JBQW9CSSxVQUFVO2dCQUMzRWpELE9BQU82QztnQkFDUDdDLEtBQUtrRCxNQUFNLENBQUMsZ0JBQWdCMUQsUUFBUThDLFlBQVk7WUFDakQsT0FBTztnQkFDTnRDLE9BQU82QztnQkFDUDNDLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxXQUFnQyxPQUFyQlYsUUFBUThDLFlBQVk7Z0JBQzFEcEMsT0FBTyxDQUFDLGVBQWUsR0FBR1YsUUFBUStDLFdBQVc7WUFDOUM7WUFDQSxPQUFPO2dCQUNON0IsTUFBTTtvQkFDTGtDLE1BQU1ZO29CQUNOTSxVQUFVLENBQUMsTUFBTWpELElBQUlzRCxPQUFPakosS0FBSyxFQUFFb0YsSUFBSWlFLFFBQVEsSUFBSXZFLE1BQU07d0JBQUVFO29CQUFRLEVBQUMsRUFBRzZELEdBQUc7Z0JBQzNFO2dCQUNBdkosT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSTJKLE9BQU83QyxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDckMsSUFBSUQsZUFBZUMsUUFBUSxPQUFPO2dCQUNqQ2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBNkJBLEdBQ0EsTUFBTWdLLHNCQUFzQjVCLElBQUksRUFBRXBELE9BQU8sRUFBRTtRQUMxQyxJQUFJaUYsU0FBUyxJQUFJO1FBQ2pCLElBQUk7WUFDSCxJQUFJZixRQUFRZSxPQUFPZCxhQUFhLENBQUNmO1lBQ2pDLE1BQU0xQyxVQUFVdkIsZUFBZSxDQUFDLEdBQUc4RixPQUFPdkUsT0FBTztZQUNqRCxJQUFJVixZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUWdELE1BQU0sRUFBRXRDLE9BQU8sQ0FBQyxXQUFXLEdBQUc7WUFDNUYsTUFBTVEsT0FBTyxNQUFNRSxPQUFPNkQsT0FBT3ZKLEtBQUssRUFBRSxHQUFvQ3dJLE9BQWpDZSxPQUFPbkUsR0FBRyxFQUFDLHdCQUE0QixPQUFOb0QsUUFBUyxDQUFDLEdBQUc7Z0JBQUV4RDtZQUFRO1lBQ25HLE1BQU1JLE1BQU0sSUFBSThELElBQUlLLE9BQU9uRSxHQUFHLEdBQUdJLEtBQUtKLEdBQUc7WUFDekMsTUFBTTRELFFBQVE1RCxJQUFJK0QsWUFBWSxDQUFDMUQsR0FBRyxDQUFDO1lBQ25DLElBQUksQ0FBQ3VELE9BQU8sTUFBTSxJQUFJakssYUFBYTtZQUNuQyxPQUFPO2dCQUNOeUcsTUFBTTtvQkFDTGdFLFdBQVdwRSxJQUFJaUUsUUFBUTtvQkFDdkIzQjtvQkFDQXNCO2dCQUNEO2dCQUNBMUosT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSWlLLE9BQU9uRCxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDckMsSUFBSUQsZUFBZUMsUUFBUSxPQUFPO2dCQUNqQ2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EyQ0EsR0FDQSxNQUFNbUssT0FBTy9CLElBQUksRUFBRUMsUUFBUSxFQUFFQyxXQUFXLEVBQUU7UUFDekMsT0FBTyxJQUFJLENBQUNILGNBQWMsQ0FBQyxPQUFPQyxNQUFNQyxVQUFVQztJQUNuRDtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTBCQSxHQUNBLE1BQU04QixLQUFLQyxRQUFRLEVBQUVDLE1BQU0sRUFBRXRGLE9BQU8sRUFBRTtRQUNyQyxJQUFJdUYsU0FBUyxJQUFJO1FBQ2pCLElBQUk7WUFDSCxPQUFPO2dCQUNOckUsTUFBTSxNQUFNRSxPQUFPbUUsT0FBTzdKLEtBQUssRUFBRSxHQUFjLE9BQVg2SixPQUFPekUsR0FBRyxFQUFDLGlCQUFlO29CQUM3RDBFLFVBQVVELE9BQU9DLFFBQVE7b0JBQ3pCQyxXQUFXSjtvQkFDWEssZ0JBQWdCSjtvQkFDaEJLLG1CQUFtQjNGLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRMkYsaUJBQWlCO2dCQUMvRixHQUFHO29CQUFFakYsU0FBUzZFLE9BQU83RSxPQUFPO2dCQUFDO2dCQUM3QjFGLE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUl1SyxPQUFPekQsa0JBQWtCLEVBQUUsTUFBTTlHO1lBQ3JDLElBQUlELGVBQWVDLFFBQVEsT0FBTztnQkFDakNrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTBCQSxHQUNBLE1BQU00SyxLQUFLUCxRQUFRLEVBQUVDLE1BQU0sRUFBRXRGLE9BQU8sRUFBRTtRQUNyQyxJQUFJNkYsU0FBUyxJQUFJO1FBQ2pCLElBQUk7WUFDSCxPQUFPO2dCQUNOM0UsTUFBTTtvQkFBRWtDLE1BQU0sQ0FBQyxNQUFNaEMsT0FBT3lFLE9BQU9uSyxLQUFLLEVBQUUsR0FBYyxPQUFYbUssT0FBTy9FLEdBQUcsRUFBQyxpQkFBZTt3QkFDdEUwRSxVQUFVSyxPQUFPTCxRQUFRO3dCQUN6QkMsV0FBV0o7d0JBQ1hLLGdCQUFnQko7d0JBQ2hCSyxtQkFBbUIzRixZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUTJGLGlCQUFpQjtvQkFDL0YsR0FBRzt3QkFBRWpGLFNBQVNtRixPQUFPbkYsT0FBTztvQkFBQyxFQUFDLEVBQUc2RCxHQUFHO2dCQUFDO2dCQUNyQ3ZKLE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUk2SyxPQUFPL0Qsa0JBQWtCLEVBQUUsTUFBTTlHO1lBQ3JDLElBQUlELGVBQWVDLFFBQVEsT0FBTztnQkFDakNrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWtEQSxHQUNBLE1BQU04SyxnQkFBZ0IxQyxJQUFJLEVBQUUyQyxTQUFTLEVBQUUvRixPQUFPLEVBQUU7UUFDL0MsSUFBSWdHLFNBQVMsSUFBSTtRQUNqQixJQUFJO1lBQ0gsSUFBSTlCLFFBQVE4QixPQUFPN0IsYUFBYSxDQUFDZjtZQUNqQyxJQUFJbEMsT0FBTyxNQUFNRSxPQUFPNEUsT0FBT3RLLEtBQUssRUFBRSxHQUE2QndJLE9BQTFCOEIsT0FBT2xGLEdBQUcsRUFBQyxpQkFBcUIsT0FBTm9ELFFBQVMvRSxlQUFlO2dCQUFFNEc7WUFBVSxHQUFHLENBQUMvRixZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUWlHLFNBQVMsSUFBSTtnQkFBRUEsV0FBV2pHLFFBQVFpRyxTQUFTO1lBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQUV2RixTQUFTc0YsT0FBT3RGLE9BQU87WUFBQztZQUNwUCxNQUFNd0YscUJBQXFCLENBQUNsRyxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUW1HLFFBQVEsSUFBSSxhQUErRCxPQUFsRG5HLFFBQVFtRyxRQUFRLEtBQUssT0FBTyxLQUFLbkcsUUFBUW1HLFFBQVEsSUFBSztZQUNyS2pGLE9BQU87Z0JBQUVnRSxXQUFXa0IsVUFBVSxHQUFnQmxGLE9BQWI4RSxPQUFPbEYsR0FBRyxFQUFvQm9GLE9BQWpCaEYsS0FBS21GLFNBQVMsRUFBc0IsT0FBbkJIO1lBQXNCO1lBQ3JGLE9BQU87Z0JBQ05oRjtnQkFDQWxHLE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUlnTCxPQUFPbEUsa0JBQWtCLEVBQUUsTUFBTTlHO1lBQ3JDLElBQUlELGVBQWVDLFFBQVEsT0FBTztnQkFDakNrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBcUNBLEdBQ0EsTUFBTXNMLGlCQUFpQkMsS0FBSyxFQUFFUixTQUFTLEVBQUUvRixPQUFPLEVBQUU7UUFDakQsSUFBSXdHLFNBQVMsSUFBSTtRQUNqQixJQUFJO1lBQ0gsTUFBTXRGLE9BQU8sTUFBTUUsT0FBT29GLE9BQU85SyxLQUFLLEVBQUUsR0FBNkI4SyxPQUExQkEsT0FBTzFGLEdBQUcsRUFBQyxpQkFBK0IsT0FBaEIwRixPQUFPaEIsUUFBUSxHQUFJO2dCQUN2Rk87Z0JBQ0FRO1lBQ0QsR0FBRztnQkFBRTdGLFNBQVM4RixPQUFPOUYsT0FBTztZQUFDO1lBQzdCLE1BQU13RixxQkFBcUIsQ0FBQ2xHLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRbUcsUUFBUSxJQUFJLGFBQStELE9BQWxEbkcsUUFBUW1HLFFBQVEsS0FBSyxPQUFPLEtBQUtuRyxRQUFRbUcsUUFBUSxJQUFLO1lBQ3JLLE9BQU87Z0JBQ05qRixNQUFNQSxLQUFLakYsR0FBRyxDQUFDLENBQUN3SyxRQUFVdEgsZUFBZUEsZUFBZSxDQUFDLEdBQUdzSCxRQUFRLENBQUMsR0FBRzt3QkFBRXZCLFdBQVd1QixNQUFNSixTQUFTLEdBQUdELFVBQVUsR0FBZ0JLLE9BQWJELE9BQU8xRixHQUFHLEVBQXFCb0YsT0FBbEJPLE1BQU1KLFNBQVMsRUFBc0IsT0FBbkJILHVCQUF3QjtvQkFBSztnQkFDaExsTCxPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJd0wsT0FBTzFFLGtCQUFrQixFQUFFLE1BQU05RztZQUNyQyxJQUFJRCxlQUFlQyxRQUFRLE9BQU87Z0JBQ2pDa0csTUFBTTtnQkFDTmxHO1lBQ0Q7WUFDQSxNQUFNQTtRQUNQO0lBQ0Q7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXFDQSxHQUNBbUwsU0FBUy9DLElBQUksRUFBRXBELE9BQU8sRUFBRTtRQUN2QixNQUFNMEcsYUFBYSxPQUFRMUcsQ0FBQUEsWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFpRyxTQUFTLE1BQU0sY0FBYywrQkFBK0I7UUFDakosTUFBTVUsc0JBQXNCLElBQUksQ0FBQ0MsMEJBQTBCLENBQUMsQ0FBQzVHLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRaUcsU0FBUyxLQUFLLENBQUM7UUFDdEksTUFBTVksY0FBY0Ysc0JBQXNCLElBQXdCLE9BQXBCQSx1QkFBd0I7UUFDdEUsTUFBTXpDLFFBQVEsSUFBSSxDQUFDQyxhQUFhLENBQUNmO1FBQ2pDLE1BQU12QixhQUFhLElBQU1WLElBQUksSUFBSSxDQUFDekYsS0FBSyxFQUFFLEdBQWVnTCxPQUFaLElBQUksQ0FBQzVGLEdBQUcsRUFBQyxLQUFpQm9ELE9BQWR3QyxZQUFXLEtBQVdHLE9BQVIzQyxPQUFvQixPQUFaMkMsY0FBZTtnQkFDNUZuRyxTQUFTLElBQUksQ0FBQ0EsT0FBTztnQkFDckJULGVBQWU7WUFDaEI7UUFDQSxPQUFPLElBQUkrQixvQkFBb0JILFlBQVksSUFBSSxDQUFDQyxrQkFBa0I7SUFDbkU7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Q0FjQSxHQUNBLE1BQU1nRixLQUFLMUQsSUFBSSxFQUFFO1FBQ2hCLElBQUkyRCxVQUFVLElBQUk7UUFDbEIsTUFBTTdDLFFBQVE2QyxRQUFRNUMsYUFBYSxDQUFDZjtRQUNwQyxJQUFJO1lBQ0gsT0FBTztnQkFDTmxDLE1BQU1yRixpQkFBaUIsTUFBTXNGLElBQUk0RixRQUFRckwsS0FBSyxFQUFFLEdBQThCd0ksT0FBM0I2QyxRQUFRakcsR0FBRyxFQUFDLGlCQUFxQixPQUFOb0QsUUFBUztvQkFBRXhELFNBQVNxRyxRQUFRckcsT0FBTztnQkFBQztnQkFDbEgxRixPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJK0wsUUFBUWpGLGtCQUFrQixFQUFFLE1BQU05RztZQUN0QyxJQUFJRCxlQUFlQyxRQUFRLE9BQU87Z0JBQ2pDa0csTUFBTTtnQkFDTmxHO1lBQ0Q7WUFDQSxNQUFNQTtRQUNQO0lBQ0Q7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Q0FjQSxHQUNBLE1BQU1nTSxPQUFPNUQsSUFBSSxFQUFFO1FBQ2xCLElBQUk2RCxVQUFVLElBQUk7UUFDbEIsTUFBTS9DLFFBQVErQyxRQUFROUMsYUFBYSxDQUFDZjtRQUNwQyxJQUFJO1lBQ0gsTUFBTTlCLEtBQUsyRixRQUFRdkwsS0FBSyxFQUFFLEdBQXlCd0ksT0FBdEIrQyxRQUFRbkcsR0FBRyxFQUFDLFlBQWdCLE9BQU5vRCxRQUFTO2dCQUFFeEQsU0FBU3VHLFFBQVF2RyxPQUFPO1lBQUM7WUFDdkYsT0FBTztnQkFDTlEsTUFBTTtnQkFDTmxHLE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUlpTSxRQUFRbkYsa0JBQWtCLEVBQUUsTUFBTTlHO1lBQ3RDLElBQUlELGVBQWVDLFVBQVVBLGlCQUFpQksscUJBQXFCO2dCQUNsRSxNQUFNQyxnQkFBZ0JOLE1BQU1NLGFBQWE7Z0JBQ3pDLElBQUk7b0JBQUM7b0JBQUs7aUJBQUksQ0FBQ2lDLFFBQVEsQ0FBQ2pDLGtCQUFrQixRQUFRQSxrQkFBa0IsS0FBSyxJQUFJLEtBQUssSUFBSUEsY0FBY0gsTUFBTSxHQUFHLE9BQU87b0JBQ25IK0YsTUFBTTtvQkFDTmxHO2dCQUNEO1lBQ0Q7WUFDQSxNQUFNQTtRQUNQO0lBQ0Q7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWlEQSxHQUNBa00sYUFBYTlELElBQUksRUFBRXBELE9BQU8sRUFBRTtRQUMzQixNQUFNa0UsUUFBUSxJQUFJLENBQUNDLGFBQWEsQ0FBQ2Y7UUFDakMsTUFBTStELGVBQWUsRUFBRTtRQUN2QixNQUFNakIscUJBQXFCLENBQUNsRyxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUW1HLFFBQVEsSUFBSSxZQUE4RCxPQUFsRG5HLFFBQVFtRyxRQUFRLEtBQUssT0FBTyxLQUFLbkcsUUFBUW1HLFFBQVEsSUFBSztRQUNwSyxJQUFJRCx1QkFBdUIsSUFBSWlCLGFBQWFsSSxJQUFJLENBQUNpSDtRQUNqRCxNQUFNUSxhQUFhLE9BQVExRyxDQUFBQSxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUWlHLFNBQVMsTUFBTSxjQUFjLGlCQUFpQjtRQUNuSSxNQUFNVSxzQkFBc0IsSUFBSSxDQUFDQywwQkFBMEIsQ0FBQyxDQUFDNUcsWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFpRyxTQUFTLEtBQUssQ0FBQztRQUN0SSxJQUFJVSx3QkFBd0IsSUFBSVEsYUFBYWxJLElBQUksQ0FBQzBIO1FBQ2xELElBQUlFLGNBQWNNLGFBQWFDLElBQUksQ0FBQztRQUNwQyxJQUFJUCxnQkFBZ0IsSUFBSUEsY0FBYyxJQUFnQixPQUFaQTtRQUMxQyxPQUFPO1lBQUUzRixNQUFNO2dCQUFFbUcsV0FBV2pCLFVBQVUsR0FBZU0sT0FBWixJQUFJLENBQUM1RixHQUFHLEVBQUMsS0FBd0JvRCxPQUFyQndDLFlBQVcsWUFBa0JHLE9BQVIzQyxPQUFvQixPQUFaMkM7WUFBZTtRQUFFO0lBQ3BHO0lBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FzQkEsR0FDQSxNQUFNdEYsT0FBT2dGLEtBQUssRUFBRTtRQUNuQixJQUFJZSxVQUFVLElBQUk7UUFDbEIsSUFBSTtZQUNILE9BQU87Z0JBQ05wRyxNQUFNLE1BQU1LLE9BQU8rRixRQUFRNUwsS0FBSyxFQUFFLEdBQXlCNEwsT0FBdEJBLFFBQVF4RyxHQUFHLEVBQUMsWUFBMkIsT0FBakJ3RyxRQUFROUIsUUFBUSxHQUFJO29CQUFFK0IsVUFBVWhCO2dCQUFNLEdBQUc7b0JBQUU3RixTQUFTNEcsUUFBUTVHLE9BQU87Z0JBQUM7Z0JBQy9IMUYsT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSXNNLFFBQVF4RixrQkFBa0IsRUFBRSxNQUFNOUc7WUFDdEMsSUFBSUQsZUFBZUMsUUFBUSxPQUFPO2dCQUNqQ2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBQ0E7OztDQUdBLEdBQ0E7Ozs7Q0FJQSxHQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMERBLEdBQ0EsTUFBTXdNLEtBQUtwRSxJQUFJLEVBQUVwRCxPQUFPLEVBQUVPLFVBQVUsRUFBRTtRQUNyQyxJQUFJa0gsVUFBVSxJQUFJO1FBQ2xCLElBQUk7WUFDSCxNQUFNakgsT0FBT3JCLGVBQWVBLGVBQWVBLGVBQWUsQ0FBQyxHQUFHb0QseUJBQXlCdkMsVUFBVSxDQUFDLEdBQUc7Z0JBQUUwSCxRQUFRdEUsUUFBUTtZQUFHO1lBQzFILE9BQU87Z0JBQ05sQyxNQUFNLE1BQU1FLE9BQU9xRyxRQUFRL0wsS0FBSyxFQUFFLEdBQThCK0wsT0FBM0JBLFFBQVEzRyxHQUFHLEVBQUMsaUJBQWdDLE9BQWpCMkcsUUFBUWpDLFFBQVEsR0FBSWhGLE1BQU07b0JBQUVFLFNBQVMrRyxRQUFRL0csT0FBTztnQkFBQyxHQUFHSDtnQkFDeEh2RixPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJeU0sUUFBUTNGLGtCQUFrQixFQUFFLE1BQU05RztZQUN0QyxJQUFJRCxlQUFlQyxRQUFRLE9BQU87Z0JBQ2pDa0csTUFBTTtnQkFDTmxHO1lBQ0Q7WUFDQSxNQUFNQTtRQUNQO0lBQ0Q7SUFDQTs7Ozs7O0NBTUEsR0FDQSxNQUFNMk0sT0FBTzNILE9BQU8sRUFBRU8sVUFBVSxFQUFFO1FBQ2pDLElBQUlxSCxVQUFVLElBQUk7UUFDbEIsSUFBSTtZQUNILE1BQU1wSCxPQUFPckIsZUFBZSxDQUFDLEdBQUdhO1lBQ2hDLE9BQU87Z0JBQ05rQixNQUFNLE1BQU1FLE9BQU93RyxRQUFRbE0sS0FBSyxFQUFFLEdBQWlDa00sT0FBOUJBLFFBQVE5RyxHQUFHLEVBQUMsb0JBQW1DLE9BQWpCOEcsUUFBUXBDLFFBQVEsR0FBSWhGLE1BQU07b0JBQUVFLFNBQVNrSCxRQUFRbEgsT0FBTztnQkFBQyxHQUFHSDtnQkFDM0h2RixPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJNE0sUUFBUTlGLGtCQUFrQixFQUFFLE1BQU05RztZQUN0QyxJQUFJRCxlQUFlQyxRQUFRLE9BQU87Z0JBQ2pDa0csTUFBTTtnQkFDTmxHO1lBQ0Q7WUFDQSxNQUFNQTtRQUNQO0lBQ0Q7SUFDQTJJLGVBQWVKLFFBQVEsRUFBRTtRQUN4QixPQUFPM0QsS0FBS0MsU0FBUyxDQUFDMEQ7SUFDdkI7SUFDQU0sU0FBUzNDLElBQUksRUFBRTtRQUNkLElBQUksT0FBTzJHLE1BQU1BLEtBQUssYUFBYSxPQUFPQSxNQUFNQSxDQUFDQyxJQUFJLENBQUM1RyxNQUFNNkQsUUFBUSxDQUFDO1FBQ3JFLE9BQU9nRCxLQUFLN0c7SUFDYjtJQUNBaUQsY0FBY2YsSUFBSSxFQUFFO1FBQ25CLE9BQU8sR0FBb0JBLE9BQWpCLElBQUksQ0FBQ29DLFFBQVEsRUFBQyxLQUE0QixPQUF6QnBDLEtBQUsxRyxPQUFPLENBQUMsUUFBUTtJQUNqRDtJQUNBdUgsb0JBQW9CYixJQUFJLEVBQUU7UUFDekIsT0FBT0EsS0FBSzFHLE9BQU8sQ0FBQyxZQUFZLElBQUlBLE9BQU8sQ0FBQyxRQUFRO0lBQ3JEO0lBQ0FrSywyQkFBMkJYLFNBQVMsRUFBRTtRQUNyQyxNQUFNeEYsU0FBUyxFQUFFO1FBQ2pCLElBQUl3RixVQUFVK0IsS0FBSyxFQUFFdkgsT0FBT3hCLElBQUksQ0FBQyxTQUF5QixPQUFoQmdILFVBQVUrQixLQUFLO1FBQ3pELElBQUkvQixVQUFVZ0MsTUFBTSxFQUFFeEgsT0FBT3hCLElBQUksQ0FBQyxVQUEyQixPQUFqQmdILFVBQVVnQyxNQUFNO1FBQzVELElBQUloQyxVQUFVaUMsTUFBTSxFQUFFekgsT0FBT3hCLElBQUksQ0FBQyxVQUEyQixPQUFqQmdILFVBQVVpQyxNQUFNO1FBQzVELElBQUlqQyxVQUFVa0MsTUFBTSxFQUFFMUgsT0FBT3hCLElBQUksQ0FBQyxVQUEyQixPQUFqQmdILFVBQVVrQyxNQUFNO1FBQzVELElBQUlsQyxVQUFVbUMsT0FBTyxFQUFFM0gsT0FBT3hCLElBQUksQ0FBQyxXQUE2QixPQUFsQmdILFVBQVVtQyxPQUFPO1FBQy9ELE9BQU8zSCxPQUFPMkcsSUFBSSxDQUFDO0lBQ3BCO0lBNzFCQXpNLFlBQVltRyxHQUFHLEVBQUVKLFVBQVUsQ0FBQyxDQUFDLEVBQUU4RSxRQUFRLEVBQUU2QyxPQUFPLENBQUU7UUFDakQsSUFBSSxDQUFDdkcsa0JBQWtCLEdBQUc7UUFDMUIsSUFBSSxDQUFDaEIsR0FBRyxHQUFHQTtRQUNYLElBQUksQ0FBQ0osT0FBTyxHQUFHQTtRQUNmLElBQUksQ0FBQzhFLFFBQVEsR0FBR0E7UUFDaEIsSUFBSSxDQUFDOUosS0FBSyxHQUFHSCxlQUFlOE07SUFDN0I7QUF3MUJEO0FBRUEsWUFBWTtBQUNaLDRCQUE0QjtBQUM1QixNQUFNQyxVQUFVO0FBRWhCLFlBQVk7QUFDWiw4QkFBOEI7QUFDOUIsTUFBTUMsb0JBQW9CO0lBQUUsaUJBQWlCLGNBQXNCLE9BQVJEO0FBQVU7QUFFckUsWUFBWTtBQUNaLDBDQUEwQztBQUMxQyxJQUFJRSxtQkFBbUI7SUFXdEI7Ozs7Q0FJQSxHQUNBdEYsZUFBZTtRQUNkLElBQUksQ0FBQ3BCLGtCQUFrQixHQUFHO1FBQzFCLE9BQU8sSUFBSTtJQUNaO0lBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0ErQkEsR0FDQSxNQUFNMkcsWUFBWXpJLE9BQU8sRUFBRTtRQUMxQixJQUFJNEIsUUFBUSxJQUFJO1FBQ2hCLElBQUk7WUFDSCxNQUFNaUYsY0FBY2pGLE1BQU04Ryw4QkFBOEIsQ0FBQzFJO1lBQ3pELE9BQU87Z0JBQ05rQixNQUFNLE1BQU1DLElBQUlTLE1BQU1sRyxLQUFLLEVBQUUsR0FBc0JtTCxPQUFuQmpGLE1BQU1kLEdBQUcsRUFBQyxXQUFxQixPQUFaK0YsY0FBZTtvQkFBRW5HLFNBQVNrQixNQUFNbEIsT0FBTztnQkFBQztnQkFDM0YxRixPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJNEcsTUFBTUUsa0JBQWtCLEVBQUUsTUFBTTlHO1lBQ3BDLElBQUlELGVBQWVDLFFBQVEsT0FBTztnQkFDakNrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWdDQSxHQUNBLE1BQU0yTixVQUFVdkUsRUFBRSxFQUFFO1FBQ25CLElBQUl3RSxTQUFTLElBQUk7UUFDakIsSUFBSTtZQUNILE9BQU87Z0JBQ04xSCxNQUFNLE1BQU1DLElBQUl5SCxPQUFPbE4sS0FBSyxFQUFFLEdBQXdCMEksT0FBckJ3RSxPQUFPOUgsR0FBRyxFQUFDLFlBQWEsT0FBSHNELEtBQU07b0JBQUUxRCxTQUFTa0ksT0FBT2xJLE9BQU87Z0JBQUM7Z0JBQ3RGMUYsT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSTROLE9BQU85RyxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDckMsSUFBSUQsZUFBZUMsUUFBUSxPQUFPO2dCQUNqQ2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW9DQSxHQUNBLE1BQU02TixhQUFhekUsRUFBRSxFQUErQjtZQUE3QnBFLFVBQUFBLGlFQUFVO1lBQUU4SSxRQUFRO1FBQU07UUFDaEQsSUFBSW5FLFNBQVMsSUFBSTtRQUNqQixJQUFJO1lBQ0gsT0FBTztnQkFDTnpELE1BQU0sTUFBTUUsT0FBT3VELE9BQU9qSixLQUFLLEVBQUUsR0FBYyxPQUFYaUosT0FBTzdELEdBQUcsRUFBQyxZQUFVO29CQUN4RHNEO29CQUNBdEosTUFBTXNKO29CQUNOMkUsTUFBTS9JLFFBQVErSSxJQUFJO29CQUNsQkQsUUFBUTlJLFFBQVE4SSxNQUFNO29CQUN0QkUsaUJBQWlCaEosUUFBUWlKLGFBQWE7b0JBQ3RDQyxvQkFBb0JsSixRQUFRbUosZ0JBQWdCO2dCQUM3QyxHQUFHO29CQUFFekksU0FBU2lFLE9BQU9qRSxPQUFPO2dCQUFDO2dCQUM3QjFGLE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUkySixPQUFPN0Msa0JBQWtCLEVBQUUsTUFBTTlHO1lBQ3JDLElBQUlELGVBQWVDLFFBQVEsT0FBTztnQkFDakNrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0NBLEdBQ0EsTUFBTW9PLGFBQWFoRixFQUFFLEVBQUVwRSxPQUFPLEVBQUU7UUFDL0IsSUFBSWlGLFNBQVMsSUFBSTtRQUNqQixJQUFJO1lBQ0gsT0FBTztnQkFDTi9ELE1BQU0sTUFBTUcsSUFBSTRELE9BQU92SixLQUFLLEVBQUUsR0FBd0IwSSxPQUFyQmEsT0FBT25FLEdBQUcsRUFBQyxZQUFhLE9BQUhzRCxLQUFNO29CQUMzREE7b0JBQ0F0SixNQUFNc0o7b0JBQ04wRSxRQUFROUksUUFBUThJLE1BQU07b0JBQ3RCRSxpQkFBaUJoSixRQUFRaUosYUFBYTtvQkFDdENDLG9CQUFvQmxKLFFBQVFtSixnQkFBZ0I7Z0JBQzdDLEdBQUc7b0JBQUV6SSxTQUFTdUUsT0FBT3ZFLE9BQU87Z0JBQUM7Z0JBQzdCMUYsT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSWlLLE9BQU9uRCxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDckMsSUFBSUQsZUFBZUMsUUFBUSxPQUFPO2dCQUNqQ2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBdUJBLEdBQ0EsTUFBTXFPLFlBQVlqRixFQUFFLEVBQUU7UUFDckIsSUFBSWtGLFNBQVMsSUFBSTtRQUNqQixJQUFJO1lBQ0gsT0FBTztnQkFDTnBJLE1BQU0sTUFBTUUsT0FBT2tJLE9BQU81TixLQUFLLEVBQUUsR0FBd0IwSSxPQUFyQmtGLE9BQU94SSxHQUFHLEVBQUMsWUFBYSxPQUFIc0QsSUFBRyxXQUFTLENBQUMsR0FBRztvQkFBRTFELFNBQVM0SSxPQUFPNUksT0FBTztnQkFBQztnQkFDbkcxRixPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJc08sT0FBT3hILGtCQUFrQixFQUFFLE1BQU05RztZQUNyQyxJQUFJRCxlQUFlQyxRQUFRLE9BQU87Z0JBQ2pDa0csTUFBTTtnQkFDTmxHO1lBQ0Q7WUFDQSxNQUFNQTtRQUNQO0lBQ0Q7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBd0JBLEdBQ0EsTUFBTXVPLGFBQWFuRixFQUFFLEVBQUU7UUFDdEIsSUFBSW1CLFNBQVMsSUFBSTtRQUNqQixJQUFJO1lBQ0gsT0FBTztnQkFDTnJFLE1BQU0sTUFBTUssT0FBT2dFLE9BQU83SixLQUFLLEVBQUUsR0FBd0IwSSxPQUFyQm1CLE9BQU96RSxHQUFHLEVBQUMsWUFBYSxPQUFIc0QsS0FBTSxDQUFDLEdBQUc7b0JBQUUxRCxTQUFTNkUsT0FBTzdFLE9BQU87Z0JBQUM7Z0JBQzdGMUYsT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSXVLLE9BQU96RCxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDckMsSUFBSUQsZUFBZUMsUUFBUSxPQUFPO2dCQUNqQ2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBQ0EwTiwrQkFBK0IxSSxPQUFPLEVBQUU7UUFDdkMsTUFBTVMsU0FBUyxDQUFDO1FBQ2hCLElBQUlULFNBQVM7WUFDWixJQUFJLFdBQVdBLFNBQVNTLE9BQU8rQixLQUFLLEdBQUdyRSxPQUFPNkIsUUFBUXdDLEtBQUs7WUFDM0QsSUFBSSxZQUFZeEMsU0FBU1MsT0FBT2dDLE1BQU0sR0FBR3RFLE9BQU82QixRQUFReUMsTUFBTTtZQUM5RCxJQUFJekMsUUFBUXdKLE1BQU0sRUFBRS9JLE9BQU8rSSxNQUFNLEdBQUd4SixRQUFRd0osTUFBTTtZQUNsRCxJQUFJeEosUUFBUXlKLFVBQVUsRUFBRWhKLE9BQU9nSixVQUFVLEdBQUd6SixRQUFReUosVUFBVTtZQUM5RCxJQUFJekosUUFBUTBKLFNBQVMsRUFBRWpKLE9BQU9pSixTQUFTLEdBQUcxSixRQUFRMEosU0FBUztRQUM1RDtRQUNBLE9BQU92TixPQUFPeUMsSUFBSSxDQUFDNkIsUUFBUXBELE1BQU0sR0FBRyxJQUFJLE1BQU0sSUFBSXNNLGdCQUFnQmxKLFFBQVFzRSxRQUFRLEtBQUs7SUFDeEY7SUFyVUFwSyxZQUFZbUcsR0FBRyxFQUFFSixVQUFVLENBQUMsQ0FBQyxFQUFFMkgsT0FBTyxFQUFFdUIsSUFBSSxDQUFFO1FBQzdDLElBQUksQ0FBQzlILGtCQUFrQixHQUFHO1FBQzFCLE1BQU0rSCxVQUFVLElBQUlqRixJQUFJOUQ7UUFDeEIsSUFBSThJLFNBQVMsUUFBUUEsU0FBUyxLQUFLLElBQUksS0FBSyxJQUFJQSxLQUFLRSxjQUFjLEVBQUU7WUFDcEUsSUFBSSx5QkFBeUJ0TSxJQUFJLENBQUNxTSxRQUFRRSxRQUFRLEtBQUssQ0FBQ0YsUUFBUUUsUUFBUSxDQUFDeE0sUUFBUSxDQUFDLHNCQUFzQnNNLFFBQVFFLFFBQVEsR0FBR0YsUUFBUUUsUUFBUSxDQUFDck4sT0FBTyxDQUFDLGFBQWE7UUFDbEs7UUFDQSxJQUFJLENBQUNvRSxHQUFHLEdBQUcrSSxRQUFRRyxJQUFJLENBQUN0TixPQUFPLENBQUMsT0FBTztRQUN2QyxJQUFJLENBQUNnRSxPQUFPLEdBQUd2QixlQUFlQSxlQUFlLENBQUMsR0FBR29KLG9CQUFvQjdIO1FBQ3JFLElBQUksQ0FBQ2hGLEtBQUssR0FBR0gsZUFBZThNO0lBQzdCO0FBNlREO0FBRUEsWUFBWTtBQUNaLGdEQUFnRDtBQUNoRDs7O0FBR0EsR0FDQSxJQUFJNEIseUJBQXlCO0lBd0I1Qjs7Ozs7Ozs7OztDQVVBLEdBQ0EvRyxlQUFlO1FBQ2QsSUFBSSxDQUFDcEIsa0JBQWtCLEdBQUc7UUFDMUIsT0FBTyxJQUFJO0lBQ1o7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUNBLEdBQ0EsTUFBTStHLGFBQWEvTixJQUFJLEVBQUU7UUFDeEIsSUFBSThHLFFBQVEsSUFBSTtRQUNoQixJQUFJO1lBQ0gsT0FBTztnQkFDTlYsTUFBTSxNQUFNRSxPQUFPUSxNQUFNbEcsS0FBSyxFQUFFLEdBQWEsT0FBVmtHLE1BQU1kLEdBQUcsRUFBQyxZQUFVO29CQUFFaEc7Z0JBQUssR0FBRztvQkFBRTRGLFNBQVNrQixNQUFNbEIsT0FBTztnQkFBQztnQkFDMUYxRixPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJNEcsTUFBTUUsa0JBQWtCLEVBQUUsTUFBTTlHO1lBQ3BDLElBQUlELGVBQWVDLFFBQVEsT0FBTztnQkFDakNrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E2Q0EsR0FDQSxNQUFNeU4sWUFBWXpJLE9BQU8sRUFBRTtRQUMxQixJQUFJNEksU0FBUyxJQUFJO1FBQ2pCLElBQUk7WUFDSCxNQUFNc0IsY0FBYyxJQUFJUDtZQUN4QixJQUFJLENBQUMzSixZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUXdDLEtBQUssTUFBTSxLQUFLLEdBQUcwSCxZQUFZcEYsR0FBRyxDQUFDLFNBQVM5RSxRQUFRd0MsS0FBSyxDQUFDdUMsUUFBUTtZQUNqSSxJQUFJLENBQUMvRSxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUXlDLE1BQU0sTUFBTSxLQUFLLEdBQUd5SCxZQUFZcEYsR0FBRyxDQUFDLFVBQVU5RSxRQUFReUMsTUFBTSxDQUFDc0MsUUFBUTtZQUNwSSxJQUFJL0UsWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVF5SixVQUFVLEVBQUVTLFlBQVlwRixHQUFHLENBQUMsY0FBYzlFLFFBQVF5SixVQUFVO1lBQzFILElBQUl6SixZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUTBKLFNBQVMsRUFBRVEsWUFBWXBGLEdBQUcsQ0FBQyxhQUFhOUUsUUFBUTBKLFNBQVM7WUFDdkgsSUFBSTFKLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRd0osTUFBTSxFQUFFVSxZQUFZcEYsR0FBRyxDQUFDLFVBQVU5RSxRQUFRd0osTUFBTTtZQUM5RyxNQUFNM0MsY0FBY3FELFlBQVluRixRQUFRO1lBQ3hDLE1BQU1qRSxNQUFNK0YsY0FBYyxHQUF3QkEsT0FBckIrQixPQUFPOUgsR0FBRyxFQUFDLFlBQXNCLE9BQVorRixlQUFnQixHQUFjLE9BQVgrQixPQUFPOUgsR0FBRyxFQUFDO1lBQ2hGLE9BQU87Z0JBQ05JLE1BQU0sTUFBTUMsSUFBSXlILE9BQU9sTixLQUFLLEVBQUVvRixLQUFLO29CQUFFSixTQUFTa0ksT0FBT2xJLE9BQU87Z0JBQUM7Z0JBQzdEMUYsT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSTROLE9BQU85RyxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDckMsSUFBSUQsZUFBZUMsUUFBUSxPQUFPO2dCQUNqQ2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThCQSxHQUNBLE1BQU11TyxhQUFhbk0sVUFBVSxFQUFFO1FBQzlCLElBQUl1SCxTQUFTLElBQUk7UUFDakIsSUFBSTtZQUNILE9BQU87Z0JBQ056RCxNQUFNLE1BQU1LLE9BQU9vRCxPQUFPakosS0FBSyxFQUFFLEdBQXdCMEIsT0FBckJ1SCxPQUFPN0QsR0FBRyxFQUFDLFlBQXFCLE9BQVgxRCxhQUFjLENBQUMsR0FBRztvQkFBRXNELFNBQVNpRSxPQUFPakUsT0FBTztnQkFBQztnQkFDckcxRixPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJMkosT0FBTzdDLGtCQUFrQixFQUFFLE1BQU05RztZQUNyQyxJQUFJRCxlQUFlQyxRQUFRLE9BQU87Z0JBQ2pDa0csTUFBTTtnQkFDTmxHO1lBQ0Q7WUFDQSxNQUFNQTtRQUNQO0lBQ0Q7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EwSEEsR0FDQThNLEtBQUsxSyxVQUFVLEVBQUU7UUFDaEIsSUFBSTZILFNBQVMsSUFBSTtRQUNqQixJQUFJLENBQUM5SCxrQkFBa0JDLGFBQWEsTUFBTSxJQUFJM0MsYUFBYTtRQUMzRCxNQUFNMFAsVUFBVSxJQUFJM1AsMERBQWtCQSxDQUFDO1lBQ3RDcVAsU0FBUyxJQUFJLENBQUMvSSxHQUFHO1lBQ2pCc0osYUFBYWhOO1lBQ2JpTixNQUFNO2dCQUNMdEIsTUFBTTtnQkFDTnVCLFlBQVksVUFBWXJGLE9BQU92RSxPQUFPO1lBQ3ZDO1lBQ0FoRixPQUFPLElBQUksQ0FBQ0EsS0FBSztRQUNsQjtRQUNBLE1BQU1vRyxxQkFBcUIsSUFBSSxDQUFDQSxrQkFBa0I7UUFDbEQsT0FBTyxJQUFJeUksTUFBTUosU0FBUztZQUFFaEosS0FBSXFKLE1BQU0sRUFBRUMsSUFBSTtnQkFDM0MsTUFBTWpPLFFBQVFnTyxNQUFNLENBQUNDLEtBQUs7Z0JBQzFCLElBQUksT0FBT2pPLFVBQVUsWUFBWSxPQUFPQTtnQkFDeEMsT0FBTztxREFBVWY7d0JBQUFBOztvQkFDaEIsSUFBSTt3QkFDSCxPQUFPOzRCQUNOeUYsTUFBTSxNQUFNMUUsTUFBTTBDLEtBQUssQ0FBQ3NMLFFBQVEvTzs0QkFDaENULE9BQU87d0JBQ1I7b0JBQ0QsRUFBRSxPQUFPQSxPQUFPO3dCQUNmLElBQUk4RyxvQkFBb0IsTUFBTTlHO3dCQUM5QixPQUFPOzRCQUNOa0csTUFBTTs0QkFDTmxHO3dCQUNEO29CQUNEO2dCQUNEO1lBQ0Q7UUFBRTtJQUNIO0lBdldBOzs7Ozs7Ozs7Ozs7Ozs7O0NBZ0JBLEdBQ0FMLFlBQVltRyxHQUFHLEVBQUVKLFVBQVUsQ0FBQyxDQUFDLEVBQUUySCxPQUFPLENBQUU7UUFDdkMsSUFBSSxDQUFDdkcsa0JBQWtCLEdBQUc7UUFDMUIsSUFBSSxDQUFDaEIsR0FBRyxHQUFHQSxJQUFJcEUsT0FBTyxDQUFDLE9BQU87UUFDOUIsSUFBSSxDQUFDZ0UsT0FBTyxHQUFHdkIsZUFBZUEsZUFBZSxDQUFDLEdBQUdvSixvQkFBb0I3SDtRQUNyRSxJQUFJLENBQUNoRixLQUFLLEdBQUdILGVBQWU4TTtJQUM3QjtBQWtWRDtBQUVBLFlBQVk7QUFDWixzQ0FBc0M7QUFDdEMsTUFBTXFDLGtCQUFrQjtJQUN2QixpQkFBaUIsY0FBc0IsT0FBUnBDO0lBQy9CLGdCQUFnQjtBQUNqQjtBQUVBLFlBQVk7QUFDWixtQ0FBbUM7QUFDbkM7O0FBRUEsR0FDQSxJQUFJcUMsc0JBQXNCLGNBQWNqUTtJQUN2Q0MsWUFBWUMsT0FBTyxDQUFFO1FBQ3BCLEtBQUssQ0FBQ0E7UUFDTixJQUFJLENBQUNnUSx1QkFBdUIsR0FBRztRQUMvQixJQUFJLENBQUM5UCxJQUFJLEdBQUc7SUFDYjtBQUNEO0FBQ0E7Ozs7QUFJQSxHQUNBLFNBQVMrUCxzQkFBc0I3UCxLQUFLO0lBQ25DLE9BQU8sT0FBT0EsVUFBVSxZQUFZQSxVQUFVLFFBQVEsNkJBQTZCQTtBQUNwRjtBQUNBOzs7QUFHQSxHQUNBLElBQUk4UCx5QkFBeUIsY0FBY0g7SUFPMUN6UCxTQUFTO1FBQ1IsT0FBTztZQUNOSixNQUFNLElBQUksQ0FBQ0EsSUFBSTtZQUNmRixTQUFTLElBQUksQ0FBQ0EsT0FBTztZQUNyQk8sUUFBUSxJQUFJLENBQUNBLE1BQU07WUFDbkJDLFlBQVksSUFBSSxDQUFDQSxVQUFVO1FBQzVCO0lBQ0Q7SUFiQVQsWUFBWUMsT0FBTyxFQUFFTyxNQUFNLEVBQUVDLFVBQVUsQ0FBRTtRQUN4QyxLQUFLLENBQUNSO1FBQ04sSUFBSSxDQUFDRSxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNLLE1BQU0sR0FBR0E7UUFDZCxJQUFJLENBQUNDLFVBQVUsR0FBR0E7SUFDbkI7QUFTRDtBQUNBOzs7QUFHQSxHQUNBLElBQUkyUCw2QkFBNkIsY0FBY0o7SUFDOUNoUSxZQUFZQyxPQUFPLEVBQUVVLGFBQWEsQ0FBRTtRQUNuQyxLQUFLLENBQUNWO1FBQ04sSUFBSSxDQUFDRSxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNRLGFBQWEsR0FBR0E7SUFDdEI7QUFDRDtBQUNBOzs7QUFHQSxHQUNBLElBQUkwUCwwQkFBMEIsYUFBYSxHQUFHLFNBQVNDLHlCQUF5QjtJQUMvRSxxQ0FBcUMsR0FDckNBLHlCQUF5QixDQUFDLGdCQUFnQixHQUFHO0lBQzdDLGtEQUFrRCxHQUNsREEseUJBQXlCLENBQUMsNEJBQTRCLEdBQUc7SUFDekQsa0NBQWtDLEdBQ2xDQSx5QkFBeUIsQ0FBQyw0QkFBNEIsR0FBRztJQUN6RCw2Q0FBNkMsR0FDN0NBLHlCQUF5QixDQUFDLHlCQUF5QixHQUFHO0lBQ3RELDBDQUEwQyxHQUMxQ0EseUJBQXlCLENBQUMsNkJBQTZCLEdBQUc7SUFDMUQseUNBQXlDLEdBQ3pDQSx5QkFBeUIsQ0FBQyw2QkFBNkIsR0FBRztJQUMxRCxPQUFPQTtBQUNSLEVBQUUsQ0FBQztBQUVILFlBQVk7QUFDWixvQ0FBb0M7QUFDcEM7Ozs7OztBQU1BLEdBQ0EsTUFBTUMsZUFBZSxDQUFDMVA7SUFDckIsSUFBSUEsYUFBYSxPQUFPO3lDQUFJQztZQUFBQTs7ZUFBU0QsZUFBZUM7O0lBQ3BELE9BQU87eUNBQUlBO1lBQUFBOztlQUFTQyxTQUFTRDs7QUFDOUI7QUFDQTs7Ozs7QUFLQSxHQUNBLE1BQU0wUCxrQkFBa0I7SUFDdkIsT0FBT3ZQO0FBQ1I7QUFDQTs7Ozs7OztBQU9BLEdBQ0EsTUFBTXdQLGdCQUFnQixDQUFDNU87SUFDdEIsSUFBSSxPQUFPQSxVQUFVLFlBQVlBLFVBQVUsTUFBTSxPQUFPO0lBQ3hELE1BQU1NLFlBQVlYLE9BQU9ZLGNBQWMsQ0FBQ1A7SUFDeEMsT0FBTyxDQUFDTSxjQUFjLFFBQVFBLGNBQWNYLE9BQU9XLFNBQVMsSUFBSVgsT0FBT1ksY0FBYyxDQUFDRCxlQUFlLElBQUcsS0FBTSxDQUFFRSxDQUFBQSxPQUFPQyxXQUFXLElBQUlULEtBQUksS0FBTSxDQUFFUSxDQUFBQSxPQUFPRSxRQUFRLElBQUlWLEtBQUk7QUFDMUs7QUFDQTs7Ozs7O0FBTUEsR0FDQSxNQUFNNk8scUJBQXFCLENBQUNDO0lBQzNCLE9BQU92UCxNQUFNK0wsSUFBSSxDQUFDLElBQUl5RCxhQUFhRDtBQUNwQztBQUNBOzs7Ozs7O0FBT0EsR0FDQSxNQUFNRSwwQkFBMEIsQ0FBQ0MsUUFBUUM7SUFDeEMsSUFBSUEsc0JBQXNCLEtBQUssS0FBS0QsT0FBT0UsT0FBTyxDQUFDdE8sTUFBTSxLQUFLcU8sbUJBQW1CLE1BQU0sSUFBSWhSLE1BQU0sdUNBQWlFK1EsT0FBMUJDLG1CQUFrQixVQUE4QixPQUF0QkQsT0FBT0UsT0FBTyxDQUFDdE8sTUFBTTtBQUN4TDtBQUVBLFlBQVk7QUFDWixrQ0FBa0M7QUFDbEM7Ozs7QUFJQSxHQUNBLE1BQU11TyxtQkFBbUIsQ0FBQ3BNLE1BQVFBLElBQUlFLEdBQUcsSUFBSUYsSUFBSTVFLE9BQU8sSUFBSTRFLElBQUlHLGlCQUFpQixJQUFJSCxJQUFJeEUsS0FBSyxJQUFJNEUsS0FBS0MsU0FBUyxDQUFDTDtBQUNqSDs7Ozs7QUFLQSxHQUNBLE1BQU1xTSxjQUFjLE9BQU83USxPQUFPK0UsUUFBUUM7SUFDekMsSUFBSWhGLFNBQVMsT0FBT0EsVUFBVSxZQUFZLFlBQVlBLFNBQVMsUUFBUUEsU0FBUyxPQUFPQSxNQUFNRyxNQUFNLEtBQUssWUFBWSxDQUFFNkUsQ0FBQUEsWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFDLGFBQWEsR0FBRztRQUMvTCxNQUFNOUUsU0FBU0gsTUFBTUcsTUFBTSxJQUFJO1FBQy9CLE1BQU0yUSxnQkFBZ0I5UTtRQUN0QixJQUFJLE9BQU84USxjQUFjNUwsSUFBSSxLQUFLLFlBQVk0TCxjQUFjNUwsSUFBSSxHQUFHQyxJQUFJLENBQUMsQ0FBQ1g7WUFDeEUsTUFBTXBFLGFBQWEsQ0FBQ29FLFFBQVEsUUFBUUEsUUFBUSxLQUFLLElBQUksS0FBSyxJQUFJQSxJQUFJcEUsVUFBVSxLQUFNb0UsQ0FBQUEsUUFBUSxRQUFRQSxRQUFRLEtBQUssSUFBSSxLQUFLLElBQUlBLElBQUl1TSxJQUFJLEtBQUs1USxTQUFTO1lBQ2xKNEUsT0FBTyxJQUFJK0ssdUJBQXVCYyxpQkFBaUJwTSxNQUFNckUsUUFBUUM7UUFDbEUsR0FBR2dGLEtBQUssQ0FBQztZQUNSLE1BQU1oRixhQUFhRCxTQUFTO1lBQzVCNEUsT0FBTyxJQUFJK0ssdUJBQXVCZ0IsY0FBY0UsVUFBVSxJQUFJLFFBQWUsT0FBUDdRLFFBQU8sV0FBU0EsUUFBUUM7UUFDL0Y7YUFDSztZQUNKLE1BQU1BLGFBQWFELFNBQVM7WUFDNUI0RSxPQUFPLElBQUkrSyx1QkFBdUJnQixjQUFjRSxVQUFVLElBQUksUUFBZSxPQUFQN1EsUUFBTyxXQUFTQSxRQUFRQztRQUMvRjtJQUNELE9BQU8yRSxPQUFPLElBQUlnTCwyQkFBMkJhLGlCQUFpQjVRLFFBQVFBO0FBQ3ZFO0FBQ0E7Ozs7Ozs7QUFPQSxHQUNBLE1BQU1pUixvQkFBb0IsQ0FBQzNMLFFBQVFOLFNBQVNPLFlBQVlDO0lBQ3ZELE1BQU1DLFNBQVM7UUFDZEg7UUFDQUksU0FBUyxDQUFDVixZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUVUsT0FBTyxLQUFLLENBQUM7SUFDbEY7SUFDQSxJQUFJSixXQUFXLFNBQVMsQ0FBQ0UsTUFBTSxPQUFPQztJQUN0QyxJQUFJMkssY0FBYzVLLE9BQU87UUFDeEJDLE9BQU9DLE9BQU8sR0FBR3ZCLGVBQWU7WUFBRSxnQkFBZ0I7UUFBbUIsR0FBR2EsWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFVLE9BQU87UUFDeklELE9BQU9ELElBQUksR0FBR1osS0FBS0MsU0FBUyxDQUFDVztJQUM5QixPQUFPQyxPQUFPRCxJQUFJLEdBQUdBO0lBQ3JCLE9BQU9yQixlQUFlQSxlQUFlLENBQUMsR0FBR3NCLFNBQVNGO0FBQ25EO0FBQ0E7Ozs7Ozs7OztBQVNBLEdBQ0EsZUFBZTJMLGVBQWVyTCxPQUFPLEVBQUVQLE1BQU0sRUFBRVEsR0FBRyxFQUFFZCxPQUFPLEVBQUVPLFVBQVUsRUFBRUMsSUFBSTtJQUM1RSxPQUFPLElBQUlPLFFBQVEsQ0FBQ0MsU0FBU2pCO1FBQzVCYyxRQUFRQyxLQUFLbUwsa0JBQWtCM0wsUUFBUU4sU0FBU08sWUFBWUMsT0FBT0wsSUFBSSxDQUFDLENBQUMvRDtZQUN4RSxJQUFJLENBQUNBLE9BQU82RSxFQUFFLEVBQUUsTUFBTTdFO1lBQ3RCLElBQUk0RCxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUUMsYUFBYSxFQUFFLE9BQU83RDtZQUNwRixNQUFNMkcsY0FBYzNHLE9BQU9zRSxPQUFPLENBQUNTLEdBQUcsQ0FBQztZQUN2QyxJQUFJLENBQUM0QixlQUFlLENBQUNBLFlBQVl4RixRQUFRLENBQUMscUJBQXFCLE9BQU8sQ0FBQztZQUN2RSxPQUFPbkIsT0FBTzhELElBQUk7UUFDbkIsR0FBR0MsSUFBSSxDQUFDLENBQUNlLE9BQVNGLFFBQVFFLE9BQU9kLEtBQUssQ0FBQyxDQUFDcEYsUUFBVTZRLFlBQVk3USxPQUFPK0UsUUFBUUM7SUFDOUU7QUFDRDtBQUNBOzs7Ozs7OztBQVFBLEdBQ0EsZUFBZW1NLEtBQUt0TCxPQUFPLEVBQUVDLEdBQUcsRUFBRU4sSUFBSSxFQUFFUixPQUFPLEVBQUVPLFVBQVU7SUFDMUQsT0FBTzJMLGVBQWVyTCxTQUFTLFFBQVFDLEtBQUtkLFNBQVNPLFlBQVlDO0FBQ2xFO0FBRUEsWUFBWTtBQUNaLDJDQUEyQztBQUMzQzs7OztBQUlBLEdBQ0EsSUFBSTRMLGlCQUFpQjtJQVFwQixxRUFBcUUsR0FDckVsSixlQUFlO1FBQ2QsSUFBSSxDQUFDcEIsa0JBQWtCLEdBQUc7UUFDMUIsT0FBTyxJQUFJO0lBQ1o7SUFDQSwrQ0FBK0MsR0FDL0MsTUFBTXVLLFlBQVlyTSxPQUFPLEVBQUU7UUFDMUIsSUFBSTRCLFFBQVEsSUFBSTtRQUNoQixJQUFJO1lBQ0gsT0FBTztnQkFDTlYsTUFBTSxNQUFNaUwsS0FBS3ZLLE1BQU1sRyxLQUFLLEVBQUUsR0FBYSxPQUFWa0csTUFBTWQsR0FBRyxFQUFDLGlCQUFlZCxTQUFTO29CQUFFVSxTQUFTa0IsTUFBTWxCLE9BQU87Z0JBQUMsTUFBTSxDQUFDO2dCQUNuRzFGLE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUk0RyxNQUFNRSxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDcEMsSUFBSTZQLHNCQUFzQjdQLFFBQVEsT0FBTztnQkFDeENrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQUNBLG1EQUFtRCxHQUNuRCxNQUFNc1IsU0FBU0MsZ0JBQWdCLEVBQUVDLFNBQVMsRUFBRTtRQUMzQyxJQUFJNUQsU0FBUyxJQUFJO1FBQ2pCLElBQUk7WUFDSCxPQUFPO2dCQUNOMUgsTUFBTSxNQUFNaUwsS0FBS3ZELE9BQU9sTixLQUFLLEVBQUUsR0FBYyxPQUFYa04sT0FBTzlILEdBQUcsRUFBQyxjQUFZO29CQUN4RHlMO29CQUNBQztnQkFDRCxHQUFHO29CQUFFOUwsU0FBU2tJLE9BQU9sSSxPQUFPO2dCQUFDO2dCQUM3QjFGLE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUk0TixPQUFPOUcsa0JBQWtCLEVBQUUsTUFBTTlHO1lBQ3JDLElBQUk2UCxzQkFBc0I3UCxRQUFRLE9BQU87Z0JBQ3hDa0csTUFBTTtnQkFDTmxHO1lBQ0Q7WUFDQSxNQUFNQTtRQUNQO0lBQ0Q7SUFDQSxnRkFBZ0YsR0FDaEYsTUFBTXlSLFlBQVl6TSxPQUFPLEVBQUU7UUFDMUIsSUFBSTJFLFNBQVMsSUFBSTtRQUNqQixJQUFJO1lBQ0gsT0FBTztnQkFDTnpELE1BQU0sTUFBTWlMLEtBQUt4SCxPQUFPakosS0FBSyxFQUFFLEdBQWMsT0FBWGlKLE9BQU83RCxHQUFHLEVBQUMsaUJBQWVkLFNBQVM7b0JBQUVVLFNBQVNpRSxPQUFPakUsT0FBTztnQkFBQztnQkFDL0YxRixPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJMkosT0FBTzdDLGtCQUFrQixFQUFFLE1BQU05RztZQUNyQyxJQUFJNlAsc0JBQXNCN1AsUUFBUSxPQUFPO2dCQUN4Q2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBQ0EsNENBQTRDLEdBQzVDLE1BQU0wUixZQUFZSCxnQkFBZ0IsRUFBRUMsU0FBUyxFQUFFO1FBQzlDLElBQUl2SCxTQUFTLElBQUk7UUFDakIsSUFBSTtZQUNILE9BQU87Z0JBQ04vRCxNQUFNLE1BQU1pTCxLQUFLbEgsT0FBT3ZKLEtBQUssRUFBRSxHQUFjLE9BQVh1SixPQUFPbkUsR0FBRyxFQUFDLGlCQUFlO29CQUMzRHlMO29CQUNBQztnQkFDRCxHQUFHO29CQUFFOUwsU0FBU3VFLE9BQU92RSxPQUFPO2dCQUFDLE1BQU0sQ0FBQztnQkFDcEMxRixPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJaUssT0FBT25ELGtCQUFrQixFQUFFLE1BQU05RztZQUNyQyxJQUFJNlAsc0JBQXNCN1AsUUFBUSxPQUFPO2dCQUN4Q2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBckZBLDBDQUEwQyxHQUMxQ0wsWUFBWW1HLEdBQUcsRUFBRUosVUFBVSxDQUFDLENBQUMsRUFBRTJILE9BQU8sQ0FBRTtRQUN2QyxJQUFJLENBQUN2RyxrQkFBa0IsR0FBRztRQUMxQixJQUFJLENBQUNoQixHQUFHLEdBQUdBLElBQUlwRSxPQUFPLENBQUMsT0FBTztRQUM5QixJQUFJLENBQUNnRSxPQUFPLEdBQUd2QixlQUFlQSxlQUFlLENBQUMsR0FBR3VMLGtCQUFrQmhLO1FBQ25FLElBQUksQ0FBQ2hGLEtBQUssR0FBR3dQLGFBQWE3QztJQUMzQjtBQWdGRDtBQUVBLFlBQVk7QUFDWiwwQ0FBMEM7QUFDMUM7Ozs7QUFJQSxHQUNBLElBQUlzRSxnQkFBZ0I7SUFRbkIscUVBQXFFLEdBQ3JFekosZUFBZTtRQUNkLElBQUksQ0FBQ3BCLGtCQUFrQixHQUFHO1FBQzFCLE9BQU8sSUFBSTtJQUNaO0lBQ0EsNERBQTRELEdBQzVELE1BQU04SyxXQUFXNU0sT0FBTyxFQUFFO1FBQ3pCLElBQUk0QixRQUFRLElBQUk7UUFDaEIsSUFBSTtZQUNILElBQUk1QixRQUFRNk0sT0FBTyxDQUFDeFAsTUFBTSxHQUFHLEtBQUsyQyxRQUFRNk0sT0FBTyxDQUFDeFAsTUFBTSxHQUFHLEtBQUssTUFBTSxJQUFJM0MsTUFBTTtZQUNoRixPQUFPO2dCQUNOd0csTUFBTSxNQUFNaUwsS0FBS3ZLLE1BQU1sRyxLQUFLLEVBQUUsR0FBYSxPQUFWa0csTUFBTWQsR0FBRyxFQUFDLGdCQUFjZCxTQUFTO29CQUFFVSxTQUFTa0IsTUFBTWxCLE9BQU87Z0JBQUMsTUFBTSxDQUFDO2dCQUNsRzFGLE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUk0RyxNQUFNRSxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDcEMsSUFBSTZQLHNCQUFzQjdQLFFBQVEsT0FBTztnQkFDeENrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQUNBLDZDQUE2QyxHQUM3QyxNQUFNOFIsV0FBVzlNLE9BQU8sRUFBRTtRQUN6QixJQUFJNEksU0FBUyxJQUFJO1FBQ2pCLElBQUk7WUFDSCxPQUFPO2dCQUNOMUgsTUFBTSxNQUFNaUwsS0FBS3ZELE9BQU9sTixLQUFLLEVBQUUsR0FBYyxPQUFYa04sT0FBTzlILEdBQUcsRUFBQyxnQkFBY2QsU0FBUztvQkFBRVUsU0FBU2tJLE9BQU9sSSxPQUFPO2dCQUFDO2dCQUM5RjFGLE9BQU87WUFDUjtRQUNELEVBQUUsT0FBT0EsT0FBTztZQUNmLElBQUk0TixPQUFPOUcsa0JBQWtCLEVBQUUsTUFBTTlHO1lBQ3JDLElBQUk2UCxzQkFBc0I3UCxRQUFRLE9BQU87Z0JBQ3hDa0csTUFBTTtnQkFDTmxHO1lBQ0Q7WUFDQSxNQUFNQTtRQUNQO0lBQ0Q7SUFDQSw4Q0FBOEMsR0FDOUMsTUFBTStSLFlBQVkvTSxPQUFPLEVBQUU7UUFDMUIsSUFBSTJFLFNBQVMsSUFBSTtRQUNqQixJQUFJO1lBQ0gsSUFBSTNFLFFBQVFnTixZQUFZLEtBQUssS0FBSyxHQUFHO2dCQUNwQyxJQUFJaE4sUUFBUWdOLFlBQVksR0FBRyxLQUFLaE4sUUFBUWdOLFlBQVksR0FBRyxJQUFJLE1BQU0sSUFBSXRTLE1BQU07Z0JBQzNFLElBQUlzRixRQUFRaU4sWUFBWSxLQUFLLEtBQUssR0FBRztvQkFDcEMsSUFBSWpOLFFBQVFpTixZQUFZLEdBQUcsS0FBS2pOLFFBQVFpTixZQUFZLElBQUlqTixRQUFRZ04sWUFBWSxFQUFFLE1BQU0sSUFBSXRTLE1BQU0sc0NBQStELE9BQXpCc0YsUUFBUWdOLFlBQVksR0FBRztnQkFDNUo7WUFDRDtZQUNBLE9BQU87Z0JBQ045TCxNQUFNLE1BQU1pTCxLQUFLeEgsT0FBT2pKLEtBQUssRUFBRSxHQUFjLE9BQVhpSixPQUFPN0QsR0FBRyxFQUFDLGlCQUFlZCxTQUFTO29CQUFFVSxTQUFTaUUsT0FBT2pFLE9BQU87Z0JBQUM7Z0JBQy9GMUYsT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSTJKLE9BQU83QyxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDckMsSUFBSTZQLHNCQUFzQjdQLFFBQVEsT0FBTztnQkFDeENrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQUNBLDBFQUEwRSxHQUMxRSxNQUFNa1MsYUFBYWxOLE9BQU8sRUFBRTtRQUMzQixJQUFJaUYsU0FBUyxJQUFJO1FBQ2pCLElBQUk7WUFDSCxPQUFPO2dCQUNOL0QsTUFBTSxNQUFNaUwsS0FBS2xILE9BQU92SixLQUFLLEVBQUUsR0FBYyxPQUFYdUosT0FBT25FLEdBQUcsRUFBQyxrQkFBZ0JkLFNBQVM7b0JBQUVVLFNBQVN1RSxPQUFPdkUsT0FBTztnQkFBQztnQkFDaEcxRixPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJaUssT0FBT25ELGtCQUFrQixFQUFFLE1BQU05RztZQUNyQyxJQUFJNlAsc0JBQXNCN1AsUUFBUSxPQUFPO2dCQUN4Q2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBQ0EsK0RBQStELEdBQy9ELE1BQU1tUyxjQUFjbk4sT0FBTyxFQUFFO1FBQzVCLElBQUlzSixTQUFTLElBQUk7UUFDakIsSUFBSTtZQUNILElBQUl0SixRQUFRcEIsSUFBSSxDQUFDdkIsTUFBTSxHQUFHLEtBQUsyQyxRQUFRcEIsSUFBSSxDQUFDdkIsTUFBTSxHQUFHLEtBQUssTUFBTSxJQUFJM0MsTUFBTTtZQUMxRSxPQUFPO2dCQUNOd0csTUFBTSxNQUFNaUwsS0FBSzdDLE9BQU81TixLQUFLLEVBQUUsR0FBYyxPQUFYNE4sT0FBT3hJLEdBQUcsRUFBQyxtQkFBaUJkLFNBQVM7b0JBQUVVLFNBQVM0SSxPQUFPNUksT0FBTztnQkFBQyxNQUFNLENBQUM7Z0JBQ3hHMUYsT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSXNPLE9BQU94SCxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDckMsSUFBSTZQLHNCQUFzQjdQLFFBQVEsT0FBTztnQkFDeENrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQXhHQSx5Q0FBeUMsR0FDekNMLFlBQVltRyxHQUFHLEVBQUVKLFVBQVUsQ0FBQyxDQUFDLEVBQUUySCxPQUFPLENBQUU7UUFDdkMsSUFBSSxDQUFDdkcsa0JBQWtCLEdBQUc7UUFDMUIsSUFBSSxDQUFDaEIsR0FBRyxHQUFHQSxJQUFJcEUsT0FBTyxDQUFDLE9BQU87UUFDOUIsSUFBSSxDQUFDZ0UsT0FBTyxHQUFHdkIsZUFBZUEsZUFBZSxDQUFDLEdBQUd1TCxrQkFBa0JoSztRQUNuRSxJQUFJLENBQUNoRixLQUFLLEdBQUd3UCxhQUFhN0M7SUFDM0I7QUFtR0Q7QUFFQSxZQUFZO0FBQ1osNENBQTRDO0FBQzVDOzs7O0FBSUEsR0FDQSxJQUFJK0Usa0JBQWtCO0lBUXJCLHFFQUFxRSxHQUNyRWxLLGVBQWU7UUFDZCxJQUFJLENBQUNwQixrQkFBa0IsR0FBRztRQUMxQixPQUFPLElBQUk7SUFDWjtJQUNBLGdDQUFnQyxHQUNoQyxNQUFNK0csYUFBYTBELGdCQUFnQixFQUFFO1FBQ3BDLElBQUkzSyxRQUFRLElBQUk7UUFDaEIsSUFBSTtZQUNILE9BQU87Z0JBQ05WLE1BQU0sTUFBTWlMLEtBQUt2SyxNQUFNbEcsS0FBSyxFQUFFLEdBQWEsT0FBVmtHLE1BQU1kLEdBQUcsRUFBQyx3QkFBc0I7b0JBQUV5TDtnQkFBaUIsR0FBRztvQkFBRTdMLFNBQVNrQixNQUFNbEIsT0FBTztnQkFBQyxNQUFNLENBQUM7Z0JBQ3ZIMUYsT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSTRHLE1BQU1FLGtCQUFrQixFQUFFLE1BQU05RztZQUNwQyxJQUFJNlAsc0JBQXNCN1AsUUFBUSxPQUFPO2dCQUN4Q2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBQ0Esb0RBQW9ELEdBQ3BELE1BQU0yTixVQUFVNEQsZ0JBQWdCLEVBQUU7UUFDakMsSUFBSTNELFNBQVMsSUFBSTtRQUNqQixJQUFJO1lBQ0gsT0FBTztnQkFDTjFILE1BQU0sTUFBTWlMLEtBQUt2RCxPQUFPbE4sS0FBSyxFQUFFLEdBQWMsT0FBWGtOLE9BQU85SCxHQUFHLEVBQUMscUJBQW1CO29CQUFFeUw7Z0JBQWlCLEdBQUc7b0JBQUU3TCxTQUFTa0ksT0FBT2xJLE9BQU87Z0JBQUM7Z0JBQ2hIMUYsT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSTROLE9BQU85RyxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDckMsSUFBSTZQLHNCQUFzQjdQLFFBQVEsT0FBTztnQkFDeENrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQUNBLGdFQUFnRSxHQUNoRSxNQUFNeU4sY0FBMEI7WUFBZHpJLFVBQUFBLGlFQUFVLENBQUM7UUFDNUIsSUFBSTJFLFNBQVMsSUFBSTtRQUNqQixJQUFJO1lBQ0gsT0FBTztnQkFDTnpELE1BQU0sTUFBTWlMLEtBQUt4SCxPQUFPakosS0FBSyxFQUFFLEdBQWMsT0FBWGlKLE9BQU83RCxHQUFHLEVBQUMsdUJBQXFCZCxTQUFTO29CQUFFVSxTQUFTaUUsT0FBT2pFLE9BQU87Z0JBQUM7Z0JBQ3JHMUYsT0FBTztZQUNSO1FBQ0QsRUFBRSxPQUFPQSxPQUFPO1lBQ2YsSUFBSTJKLE9BQU83QyxrQkFBa0IsRUFBRSxNQUFNOUc7WUFDckMsSUFBSTZQLHNCQUFzQjdQLFFBQVEsT0FBTztnQkFDeENrRyxNQUFNO2dCQUNObEc7WUFDRDtZQUNBLE1BQU1BO1FBQ1A7SUFDRDtJQUNBLGtEQUFrRCxHQUNsRCxNQUFNdU8sYUFBYWdELGdCQUFnQixFQUFFO1FBQ3BDLElBQUl0SCxTQUFTLElBQUk7UUFDakIsSUFBSTtZQUNILE9BQU87Z0JBQ04vRCxNQUFNLE1BQU1pTCxLQUFLbEgsT0FBT3ZKLEtBQUssRUFBRSxHQUFjLE9BQVh1SixPQUFPbkUsR0FBRyxFQUFDLHdCQUFzQjtvQkFBRXlMO2dCQUFpQixHQUFHO29CQUFFN0wsU0FBU3VFLE9BQU92RSxPQUFPO2dCQUFDLE1BQU0sQ0FBQztnQkFDMUgxRixPQUFPO1lBQ1I7UUFDRCxFQUFFLE9BQU9BLE9BQU87WUFDZixJQUFJaUssT0FBT25ELGtCQUFrQixFQUFFLE1BQU05RztZQUNyQyxJQUFJNlAsc0JBQXNCN1AsUUFBUSxPQUFPO2dCQUN4Q2tHLE1BQU07Z0JBQ05sRztZQUNEO1lBQ0EsTUFBTUE7UUFDUDtJQUNEO0lBL0VBLDJDQUEyQyxHQUMzQ0wsWUFBWW1HLEdBQUcsRUFBRUosVUFBVSxDQUFDLENBQUMsRUFBRTJILE9BQU8sQ0FBRTtRQUN2QyxJQUFJLENBQUN2RyxrQkFBa0IsR0FBRztRQUMxQixJQUFJLENBQUNoQixHQUFHLEdBQUdBLElBQUlwRSxPQUFPLENBQUMsT0FBTztRQUM5QixJQUFJLENBQUNnRSxPQUFPLEdBQUd2QixlQUFlQSxlQUFlLENBQUMsR0FBR3VMLGtCQUFrQmhLO1FBQ25FLElBQUksQ0FBQ2hGLEtBQUssR0FBR3dQLGFBQWE3QztJQUMzQjtBQTBFRDtBQUVBLFlBQVk7QUFDWixpREFBaUQ7QUFDakQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUNBLEdBQ0EsSUFBSWdGLHVCQUF1QixjQUFjRDtJQXFCeEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUJBLEdBQ0F0RixLQUFLeUUsZ0JBQWdCLEVBQUU7UUFDdEIsT0FBTyxJQUFJZSxrQkFBa0IsSUFBSSxDQUFDeE0sR0FBRyxFQUFFLElBQUksQ0FBQ0osT0FBTyxFQUFFNkwsa0JBQWtCLElBQUksQ0FBQzdRLEtBQUs7SUFDbEY7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FvQkEsR0FDQSxNQUFNbU4sYUFBYTBELGdCQUFnQixFQUFFO1FBQ3BDLElBQUlnQiw2QkFBNkIsSUFBTSxLQUFLLENBQUMxRSxjQUFjakgsUUFBUSxJQUFJO1FBQ3ZFLE9BQU8yTCw2QkFBNkJ0UCxJQUFJLENBQUMyRCxPQUFPMks7SUFDakQ7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBcUJBLEdBQ0EsTUFBTTVELFVBQVU0RCxnQkFBZ0IsRUFBRTtRQUNqQyxJQUFJaUIsMEJBQTBCLElBQU0sS0FBSyxDQUFDN0UsV0FBV0MsU0FBUyxJQUFJO1FBQ2xFLE9BQU80RSwwQkFBMEJ2UCxJQUFJLENBQUMySyxRQUFRMkQ7SUFDL0M7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F1QkEsR0FDQSxNQUFNOUQsY0FBMEI7WUFBZHpJLFVBQUFBLGlFQUFVLENBQUM7UUFDNUIsSUFBSXlOLDRCQUE0QixJQUFNLEtBQUssQ0FBQ2hGLGFBQWE5RCxTQUFTLElBQUk7UUFDdEUsT0FBTzhJLDRCQUE0QnhQLElBQUksQ0FBQzBHLFFBQVEzRTtJQUNqRDtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW9CQSxHQUNBLE1BQU11SixhQUFhZ0QsZ0JBQWdCLEVBQUU7UUFDcEMsSUFBSW1CLDZCQUE2QixJQUFNLEtBQUssQ0FBQ25FLGNBQWN0RSxTQUFTLElBQUk7UUFDeEUsT0FBT3lJLDZCQUE2QnpQLElBQUksQ0FBQ2dILFFBQVFzSDtJQUNsRDtJQWhKQTs7Ozs7Ozs7Ozs7Ozs7OztDQWdCQSxHQUNBNVIsWUFBWW1HLEdBQUcsRUFBRWQsVUFBVSxDQUFDLENBQUMsQ0FBRTtRQUM5QixLQUFLLENBQUNjLEtBQUtkLFFBQVFVLE9BQU8sSUFBSSxDQUFDLEdBQUdWLFFBQVF0RSxLQUFLO0lBQ2hEO0FBOEhEO0FBQ0E7Ozs7Ozs7O0FBUUEsR0FDQSxJQUFJNFIsb0JBQW9CLGNBQWNsQjtJQWtCckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMEJBLEdBQ0EsTUFBTUMsWUFBWXJNLE9BQU8sRUFBRTtRQUMxQixJQUFJMk4sNEJBQTRCLElBQU0sS0FBSyxDQUFDdEIsYUFBYS9DLFNBQVMsSUFBSTtRQUN0RSxPQUFPcUUsNEJBQTRCMVAsSUFBSSxDQUFDcUwsUUFBUW5LLGVBQWVBLGVBQWUsQ0FBQyxHQUFHYSxVQUFVLENBQUMsR0FBRztZQUFFdU0sa0JBQWtCakQsT0FBT2lELGdCQUFnQjtRQUFDO0lBQzdJO0lBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWtCQSxHQUNBLE1BQU1FLGNBQTBCO1lBQWR6TSxVQUFBQSxpRUFBVSxDQUFDO1FBQzVCLElBQUk0Tiw0QkFBNEIsSUFBTSxLQUFLLENBQUNuQixhQUFhbEgsU0FBUyxJQUFJO1FBQ3RFLE9BQU9xSSw0QkFBNEIzUCxJQUFJLENBQUNzSCxRQUFRcEcsZUFBZUEsZUFBZSxDQUFDLEdBQUdhLFVBQVUsQ0FBQyxHQUFHO1lBQUV1TSxrQkFBa0JoSCxPQUFPZ0gsZ0JBQWdCO1FBQUM7SUFDN0k7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW1CQSxHQUNBLE1BQU1ELFNBQVNFLFNBQVMsRUFBRTtRQUN6QixJQUFJcUIseUJBQXlCLElBQU0sS0FBSyxDQUFDdkIsVUFBVXpHLFNBQVMsSUFBSTtRQUNoRSxPQUFPZ0kseUJBQXlCNVAsSUFBSSxDQUFDNEgsUUFBUUEsT0FBTzBHLGdCQUFnQixFQUFFQztJQUN2RTtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FrQkEsR0FDQSxNQUFNRSxZQUFZRixTQUFTLEVBQUU7UUFDNUIsSUFBSXNCLDRCQUE0QixJQUFNLEtBQUssQ0FBQ3BCLGFBQWExRyxTQUFTLElBQUk7UUFDdEUsT0FBTzhILDRCQUE0QjdQLElBQUksQ0FBQytILFFBQVFBLE9BQU91RyxnQkFBZ0IsRUFBRUM7SUFDMUU7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBOEJBLEdBQ0F1QixNQUFNdkIsU0FBUyxFQUFFO1FBQ2hCLE9BQU8sSUFBSXdCLGlCQUFpQixJQUFJLENBQUNsTixHQUFHLEVBQUUsSUFBSSxDQUFDSixPQUFPLEVBQUUsSUFBSSxDQUFDNkwsZ0JBQWdCLEVBQUVDLFdBQVcsSUFBSSxDQUFDOVEsS0FBSztJQUNqRztJQXZKQTs7Ozs7Ozs7Ozs7O0NBWUEsR0FDQWYsWUFBWW1HLEdBQUcsRUFBRUosT0FBTyxFQUFFNkwsZ0JBQWdCLEVBQUVsRSxPQUFPLENBQUU7UUFDcEQsS0FBSyxDQUFDdkgsS0FBS0osU0FBUzJIO1FBQ3BCLElBQUksQ0FBQ2tFLGdCQUFnQixHQUFHQTtJQUN6QjtBQXdJRDtBQUNBOzs7Ozs7OztBQVFBLEdBQ0EsSUFBSXlCLG1CQUFtQixjQUFjckI7SUFvQnBDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTBCQSxHQUNBLE1BQU1DLFdBQVc1TSxPQUFPLEVBQUU7UUFDekIsSUFBSWlPLDJCQUEyQixJQUFNLEtBQUssQ0FBQ3JCLFlBQVlwRyxTQUFTLElBQUk7UUFDcEUsT0FBT3lILDJCQUEyQmhRLElBQUksQ0FBQ3VJLFFBQVFySCxlQUFlQSxlQUFlLENBQUMsR0FBR2EsVUFBVSxDQUFDLEdBQUc7WUFDOUZ1TSxrQkFBa0IvRixPQUFPK0YsZ0JBQWdCO1lBQ3pDQyxXQUFXaEcsT0FBT2dHLFNBQVM7UUFDNUI7SUFDRDtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FxQkEsR0FDQSxNQUFNTSxXQUFXOU0sT0FBTyxFQUFFO1FBQ3pCLElBQUlrTywyQkFBMkIsSUFBTSxLQUFLLENBQUNwQixZQUFZL0YsVUFBVSxJQUFJO1FBQ3JFLE9BQU9tSCwyQkFBMkJqUSxJQUFJLENBQUM4SSxTQUFTNUgsZUFBZUEsZUFBZSxDQUFDLEdBQUdhLFVBQVUsQ0FBQyxHQUFHO1lBQy9GdU0sa0JBQWtCeEYsUUFBUXdGLGdCQUFnQjtZQUMxQ0MsV0FBV3pGLFFBQVF5RixTQUFTO1FBQzdCO0lBQ0Q7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBcUJBLEdBQ0EsTUFBTU8sY0FBMEI7WUFBZC9NLFVBQUFBLGlFQUFVLENBQUM7UUFDNUIsSUFBSW1PLDRCQUE0QixJQUFNLEtBQUssQ0FBQ3BCLGFBQWE5RixVQUFVLElBQUk7UUFDdkUsT0FBT2tILDRCQUE0QmxRLElBQUksQ0FBQ2dKLFNBQVM5SCxlQUFlQSxlQUFlLENBQUMsR0FBR2EsVUFBVSxDQUFDLEdBQUc7WUFDaEd1TSxrQkFBa0J0RixRQUFRc0YsZ0JBQWdCO1lBQzFDQyxXQUFXdkYsUUFBUXVGLFNBQVM7UUFDN0I7SUFDRDtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F3QkEsR0FDQSxNQUFNVSxhQUFhbE4sT0FBTyxFQUFFO1FBQzNCLElBQUlvTyw2QkFBNkIsSUFBTSxLQUFLLENBQUNsQixjQUFjNUYsVUFBVSxJQUFJO1FBQ3pFLE9BQU84Ryw2QkFBNkJuUSxJQUFJLENBQUNxSixTQUFTbkksZUFBZUEsZUFBZSxDQUFDLEdBQUdhLFVBQVUsQ0FBQyxHQUFHO1lBQ2pHdU0sa0JBQWtCakYsUUFBUWlGLGdCQUFnQjtZQUMxQ0MsV0FBV2xGLFFBQVFrRixTQUFTO1FBQzdCO0lBQ0Q7SUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FvQkEsR0FDQSxNQUFNVyxjQUFjbk4sT0FBTyxFQUFFO1FBQzVCLElBQUlxTyw4QkFBOEIsSUFBTSxLQUFLLENBQUNsQixlQUFlMUYsVUFBVSxJQUFJO1FBQzNFLE9BQU80Ryw4QkFBOEJwUSxJQUFJLENBQUN3SixTQUFTdEksZUFBZUEsZUFBZSxDQUFDLEdBQUdhLFVBQVUsQ0FBQyxHQUFHO1lBQ2xHdU0sa0JBQWtCOUUsUUFBUThFLGdCQUFnQjtZQUMxQ0MsV0FBVy9FLFFBQVErRSxTQUFTO1FBQzdCO0lBQ0Q7SUExS0E7Ozs7Ozs7Ozs7Ozs7Q0FhQSxHQUNBN1IsWUFBWW1HLEdBQUcsRUFBRUosT0FBTyxFQUFFNkwsZ0JBQWdCLEVBQUVDLFNBQVMsRUFBRW5FLE9BQU8sQ0FBRTtRQUMvRCxLQUFLLENBQUN2SCxLQUFLSixTQUFTMkg7UUFDcEIsSUFBSSxDQUFDa0UsZ0JBQWdCLEdBQUdBO1FBQ3hCLElBQUksQ0FBQ0MsU0FBUyxHQUFHQTtJQUNsQjtBQXlKRDtBQUVBLFlBQVk7QUFDWiw4QkFBOEI7QUFDOUIsSUFBSThCLGdCQUFnQixjQUFjOUY7SUFrQmpDOzs7Ozs7Ozs7O0NBVUEsR0FDQVYsS0FBSzFELEVBQUUsRUFBRTtRQUNSLE9BQU8sSUFBSW5CLGVBQWUsSUFBSSxDQUFDbkMsR0FBRyxFQUFFLElBQUksQ0FBQ0osT0FBTyxFQUFFMEQsSUFBSSxJQUFJLENBQUMxSSxLQUFLO0lBQ2pFO0lBQ0E7Ozs7Ozs7Ozs7Q0FVQSxHQUNBLElBQUltUixVQUFVO1FBQ2IsT0FBTyxJQUFJUSxxQkFBcUIsSUFBSSxDQUFDdk0sR0FBRyxHQUFHLFdBQVc7WUFDckRKLFNBQVMsSUFBSSxDQUFDQSxPQUFPO1lBQ3JCaEYsT0FBTyxJQUFJLENBQUNBLEtBQUs7UUFDbEI7SUFDRDtJQUNBOzs7Ozs7Ozs7O0NBVUEsR0FDQSxJQUFJNlMsWUFBWTtRQUNmLE9BQU8sSUFBSXRFLHVCQUF1QixJQUFJLENBQUNuSixHQUFHLEdBQUcsWUFBWSxJQUFJLENBQUNKLE9BQU8sRUFBRSxJQUFJLENBQUNoRixLQUFLO0lBQ2xGO0lBN0RBOzs7Ozs7Ozs7Ozs7O0NBYUEsR0FDQWYsWUFBWW1HLEdBQUcsRUFBRUosVUFBVSxDQUFDLENBQUMsRUFBRTJILE9BQU8sRUFBRXVCLElBQUksQ0FBRTtRQUM3QyxLQUFLLENBQUM5SSxLQUFLSixTQUFTMkgsU0FBU3VCO0lBQzlCO0FBOENEO0FBRUEsWUFBWTtBQUN3YSxDQUNwYixrQ0FBa0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9zdG9yYWdlLWpzL2Rpc3QvaW5kZXgubWpzP2ViMzQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSWNlYmVyZ1Jlc3RDYXRhbG9nIH0gZnJvbSBcImljZWJlcmctanNcIjtcblxuLy8jcmVnaW9uIHNyYy9saWIvZXJyb3JzLnRzXG52YXIgU3RvcmFnZUVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzLl9faXNTdG9yYWdlRXJyb3IgPSB0cnVlO1xuXHRcdHRoaXMubmFtZSA9IFwiU3RvcmFnZUVycm9yXCI7XG5cdH1cbn07XG5mdW5jdGlvbiBpc1N0b3JhZ2VFcnJvcihlcnJvcikge1xuXHRyZXR1cm4gdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiICYmIGVycm9yICE9PSBudWxsICYmIFwiX19pc1N0b3JhZ2VFcnJvclwiIGluIGVycm9yO1xufVxudmFyIFN0b3JhZ2VBcGlFcnJvciA9IGNsYXNzIGV4dGVuZHMgU3RvcmFnZUVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCBzdGF0dXNDb2RlKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gXCJTdG9yYWdlQXBpRXJyb3JcIjtcblx0XHR0aGlzLnN0YXR1cyA9IHN0YXR1cztcblx0XHR0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuXHR9XG5cdHRvSlNPTigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bmFtZTogdGhpcy5uYW1lLFxuXHRcdFx0bWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuXHRcdFx0c3RhdHVzOiB0aGlzLnN0YXR1cyxcblx0XHRcdHN0YXR1c0NvZGU6IHRoaXMuc3RhdHVzQ29kZVxuXHRcdH07XG5cdH1cbn07XG52YXIgU3RvcmFnZVVua25vd25FcnJvciA9IGNsYXNzIGV4dGVuZHMgU3RvcmFnZUVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSwgb3JpZ2luYWxFcnJvcikge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IFwiU3RvcmFnZVVua25vd25FcnJvclwiO1xuXHRcdHRoaXMub3JpZ2luYWxFcnJvciA9IG9yaWdpbmFsRXJyb3I7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvaGVscGVycy50c1xuY29uc3QgcmVzb2x2ZUZldGNoJDEgPSAoY3VzdG9tRmV0Y2gpID0+IHtcblx0aWYgKGN1c3RvbUZldGNoKSByZXR1cm4gKC4uLmFyZ3MpID0+IGN1c3RvbUZldGNoKC4uLmFyZ3MpO1xuXHRyZXR1cm4gKC4uLmFyZ3MpID0+IGZldGNoKC4uLmFyZ3MpO1xufTtcbmNvbnN0IHJlc29sdmVSZXNwb25zZSQxID0gKCkgPT4ge1xuXHRyZXR1cm4gUmVzcG9uc2U7XG59O1xuY29uc3QgcmVjdXJzaXZlVG9DYW1lbCA9IChpdGVtKSA9PiB7XG5cdGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSByZXR1cm4gaXRlbS5tYXAoKGVsKSA9PiByZWN1cnNpdmVUb0NhbWVsKGVsKSk7XG5cdGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSBcImZ1bmN0aW9uXCIgfHwgaXRlbSAhPT0gT2JqZWN0KGl0ZW0pKSByZXR1cm4gaXRlbTtcblx0Y29uc3QgcmVzdWx0ID0ge307XG5cdE9iamVjdC5lbnRyaWVzKGl0ZW0pLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuXHRcdGNvbnN0IG5ld0tleSA9IGtleS5yZXBsYWNlKC8oWy1fXVthLXpdKS9naSwgKGMpID0+IGMudG9VcHBlckNhc2UoKS5yZXBsYWNlKC9bLV9dL2csIFwiXCIpKTtcblx0XHRyZXN1bHRbbmV3S2V5XSA9IHJlY3Vyc2l2ZVRvQ2FtZWwodmFsdWUpO1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG4vKipcbiogRGV0ZXJtaW5lIGlmIGlucHV0IGlzIGEgcGxhaW4gb2JqZWN0XG4qIEFuIG9iamVjdCBpcyBwbGFpbiBpZiBpdCdzIGNyZWF0ZWQgYnkgZWl0aGVyIHt9LCBuZXcgT2JqZWN0KCksIG9yIE9iamVjdC5jcmVhdGUobnVsbClcbiogc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2lzLXBsYWluLW9ialxuKi9cbmNvbnN0IGlzUGxhaW5PYmplY3QkMSA9ICh2YWx1ZSkgPT4ge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG5cdHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlKTtcbn07XG4vKipcbiogVmFsaWRhdGVzIGlmIGEgZ2l2ZW4gYnVja2V0IG5hbWUgaXMgdmFsaWQgYWNjb3JkaW5nIHRvIFN1cGFiYXNlIFN0b3JhZ2UgQVBJIHJ1bGVzXG4qIE1pcnJvcnMgYmFja2VuZCB2YWxpZGF0aW9uIGZyb206IHN0b3JhZ2Uvc3JjL3N0b3JhZ2UvbGltaXRzLnRzOmlzVmFsaWRCdWNrZXROYW1lKClcbipcbiogUnVsZXM6XG4qIC0gTGVuZ3RoOiAxLTEwMCBjaGFyYWN0ZXJzXG4qIC0gQWxsb3dlZCBjaGFyYWN0ZXJzOiBhbHBoYW51bWVyaWMgKGEteiwgQS1aLCAwLTkpLCB1bmRlcnNjb3JlIChfKSwgYW5kIHNhZmUgc3BlY2lhbCBjaGFyYWN0ZXJzXG4qIC0gU2FmZSBzcGVjaWFsIGNoYXJhY3RlcnM6ICEgLSAuICogJyAoICkgc3BhY2UgJiAkIEAgPSA7IDogKyAsID9cbiogLSBGb3JiaWRkZW46IHBhdGggc2VwYXJhdG9ycyAoLywgXFwpLCBwYXRoIHRyYXZlcnNhbCAoLi4pLCBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbipcbiogQVdTIFMzIFJlZmVyZW5jZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvb2JqZWN0LWtleXMuaHRtbFxuKlxuKiBAcGFyYW0gYnVja2V0TmFtZSAtIFRoZSBidWNrZXQgbmFtZSB0byB2YWxpZGF0ZVxuKiBAcmV0dXJucyB0cnVlIGlmIHZhbGlkLCBmYWxzZSBvdGhlcndpc2VcbiovXG5jb25zdCBpc1ZhbGlkQnVja2V0TmFtZSA9IChidWNrZXROYW1lKSA9PiB7XG5cdGlmICghYnVja2V0TmFtZSB8fCB0eXBlb2YgYnVja2V0TmFtZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuXHRpZiAoYnVja2V0TmFtZS5sZW5ndGggPT09IDAgfHwgYnVja2V0TmFtZS5sZW5ndGggPiAxMDApIHJldHVybiBmYWxzZTtcblx0aWYgKGJ1Y2tldE5hbWUudHJpbSgpICE9PSBidWNrZXROYW1lKSByZXR1cm4gZmFsc2U7XG5cdGlmIChidWNrZXROYW1lLmluY2x1ZGVzKFwiL1wiKSB8fCBidWNrZXROYW1lLmluY2x1ZGVzKFwiXFxcXFwiKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gL15bXFx3IS5cXConKCkgJiRAPTs6Kyw/LV0rJC8udGVzdChidWNrZXROYW1lKTtcbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIFxcMEBveGMtcHJvamVjdCtydW50aW1lQDAuMTAxLjAvaGVscGVycy90eXBlb2YuanNcbmZ1bmN0aW9uIF90eXBlb2Yobykge1xuXHRcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cdHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24obyQxKSB7XG5cdFx0cmV0dXJuIHR5cGVvZiBvJDE7XG5cdH0gOiBmdW5jdGlvbihvJDEpIHtcblx0XHRyZXR1cm4gbyQxICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8kMS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8kMSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbyQxO1xuXHR9LCBfdHlwZW9mKG8pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBcXDBAb3hjLXByb2plY3QrcnVudGltZUAwLjEwMS4wL2hlbHBlcnMvdG9QcmltaXRpdmUuanNcbmZ1bmN0aW9uIHRvUHJpbWl0aXZlKHQsIHIpIHtcblx0aWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7XG5cdHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuXHRpZiAodm9pZCAwICE9PSBlKSB7XG5cdFx0dmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG5cdFx0aWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuXHR9XG5cdHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIFxcMEBveGMtcHJvamVjdCtydW50aW1lQDAuMTAxLjAvaGVscGVycy90b1Byb3BlcnR5S2V5LmpzXG5mdW5jdGlvbiB0b1Byb3BlcnR5S2V5KHQpIHtcblx0dmFyIGkgPSB0b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTtcblx0cmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gXFwwQG94Yy1wcm9qZWN0K3J1bnRpbWVAMC4xMDEuMC9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkge1xuXHRyZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHtcblx0XHR2YWx1ZTogdCxcblx0XHRlbnVtZXJhYmxlOiAhMCxcblx0XHRjb25maWd1cmFibGU6ICEwLFxuXHRcdHdyaXRhYmxlOiAhMFxuXHR9KSA6IGVbcl0gPSB0LCBlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBcXDBAb3hjLXByb2plY3QrcnVudGltZUAwLjEwMS4wL2hlbHBlcnMvb2JqZWN0U3ByZWFkMi5qc1xuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7XG5cdHZhciB0ID0gT2JqZWN0LmtleXMoZSk7XG5cdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0dmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuXHRcdHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbihyJDEpIHtcblx0XHRcdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIkMSkuZW51bWVyYWJsZTtcblx0XHR9KSksIHQucHVzaC5hcHBseSh0LCBvKTtcblx0fVxuXHRyZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKGUpIHtcblx0Zm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHtcblx0XHR2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307XG5cdFx0ciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24ociQxKSB7XG5cdFx0XHRfZGVmaW5lUHJvcGVydHkoZSwgciQxLCB0W3IkMV0pO1xuXHRcdH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbihyJDEpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByJDEsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgciQxKSk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvZmV0Y2gudHNcbmNvbnN0IF9nZXRFcnJvck1lc3NhZ2UkMSA9IChlcnIpID0+IHtcblx0dmFyIF9lcnIkZXJyb3I7XG5cdHJldHVybiBlcnIubXNnIHx8IGVyci5tZXNzYWdlIHx8IGVyci5lcnJvcl9kZXNjcmlwdGlvbiB8fCAodHlwZW9mIGVyci5lcnJvciA9PT0gXCJzdHJpbmdcIiA/IGVyci5lcnJvciA6IChfZXJyJGVycm9yID0gZXJyLmVycm9yKSA9PT0gbnVsbCB8fCBfZXJyJGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXJyJGVycm9yLm1lc3NhZ2UpIHx8IEpTT04uc3RyaW5naWZ5KGVycik7XG59O1xuY29uc3QgaGFuZGxlRXJyb3IkMSA9IGFzeW5jIChlcnJvciwgcmVqZWN0LCBvcHRpb25zKSA9PiB7XG5cdGlmIChlcnJvciBpbnN0YW5jZW9mIGF3YWl0IHJlc29sdmVSZXNwb25zZSQxKCkgJiYgIShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubm9SZXNvbHZlSnNvbikpIGVycm9yLmpzb24oKS50aGVuKChlcnIpID0+IHtcblx0XHRjb25zdCBzdGF0dXMgPSBlcnJvci5zdGF0dXMgfHwgNTAwO1xuXHRcdGNvbnN0IHN0YXR1c0NvZGUgPSAoZXJyID09PSBudWxsIHx8IGVyciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyLnN0YXR1c0NvZGUpIHx8IHN0YXR1cyArIFwiXCI7XG5cdFx0cmVqZWN0KG5ldyBTdG9yYWdlQXBpRXJyb3IoX2dldEVycm9yTWVzc2FnZSQxKGVyciksIHN0YXR1cywgc3RhdHVzQ29kZSkpO1xuXHR9KS5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0cmVqZWN0KG5ldyBTdG9yYWdlVW5rbm93bkVycm9yKF9nZXRFcnJvck1lc3NhZ2UkMShlcnIpLCBlcnIpKTtcblx0fSk7XG5cdGVsc2UgcmVqZWN0KG5ldyBTdG9yYWdlVW5rbm93bkVycm9yKF9nZXRFcnJvck1lc3NhZ2UkMShlcnJvciksIGVycm9yKSk7XG59O1xuY29uc3QgX2dldFJlcXVlc3RQYXJhbXMkMSA9IChtZXRob2QsIG9wdGlvbnMsIHBhcmFtZXRlcnMsIGJvZHkpID0+IHtcblx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdG1ldGhvZCxcblx0XHRoZWFkZXJzOiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlYWRlcnMpIHx8IHt9XG5cdH07XG5cdGlmIChtZXRob2QgPT09IFwiR0VUXCIgfHwgIWJvZHkpIHJldHVybiBwYXJhbXM7XG5cdGlmIChpc1BsYWluT2JqZWN0JDEoYm9keSkpIHtcblx0XHRwYXJhbXMuaGVhZGVycyA9IF9vYmplY3RTcHJlYWQyKHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlYWRlcnMpO1xuXHRcdHBhcmFtcy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cdH0gZWxzZSBwYXJhbXMuYm9keSA9IGJvZHk7XG5cdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZHVwbGV4KSBwYXJhbXMuZHVwbGV4ID0gb3B0aW9ucy5kdXBsZXg7XG5cdHJldHVybiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgcGFyYW1zKSwgcGFyYW1ldGVycyk7XG59O1xuYXN5bmMgZnVuY3Rpb24gX2hhbmRsZVJlcXVlc3QkMShmZXRjaGVyLCBtZXRob2QsIHVybCwgb3B0aW9ucywgcGFyYW1ldGVycywgYm9keSkge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGZldGNoZXIodXJsLCBfZ2V0UmVxdWVzdFBhcmFtcyQxKG1ldGhvZCwgb3B0aW9ucywgcGFyYW1ldGVycywgYm9keSkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuXHRcdFx0aWYgKCFyZXN1bHQub2spIHRocm93IHJlc3VsdDtcblx0XHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubm9SZXNvbHZlSnNvbikgcmV0dXJuIHJlc3VsdDtcblx0XHRcdHJldHVybiByZXN1bHQuanNvbigpO1xuXHRcdH0pLnRoZW4oKGRhdGEpID0+IHJlc29sdmUoZGF0YSkpLmNhdGNoKChlcnJvcikgPT4gaGFuZGxlRXJyb3IkMShlcnJvciwgcmVqZWN0LCBvcHRpb25zKSk7XG5cdH0pO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0KGZldGNoZXIsIHVybCwgb3B0aW9ucywgcGFyYW1ldGVycykge1xuXHRyZXR1cm4gX2hhbmRsZVJlcXVlc3QkMShmZXRjaGVyLCBcIkdFVFwiLCB1cmwsIG9wdGlvbnMsIHBhcmFtZXRlcnMpO1xufVxuYXN5bmMgZnVuY3Rpb24gcG9zdCQxKGZldGNoZXIsIHVybCwgYm9keSwgb3B0aW9ucywgcGFyYW1ldGVycykge1xuXHRyZXR1cm4gX2hhbmRsZVJlcXVlc3QkMShmZXRjaGVyLCBcIlBPU1RcIiwgdXJsLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHB1dChmZXRjaGVyLCB1cmwsIGJvZHksIG9wdGlvbnMsIHBhcmFtZXRlcnMpIHtcblx0cmV0dXJuIF9oYW5kbGVSZXF1ZXN0JDEoZmV0Y2hlciwgXCJQVVRcIiwgdXJsLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGhlYWQoZmV0Y2hlciwgdXJsLCBvcHRpb25zLCBwYXJhbWV0ZXJzKSB7XG5cdHJldHVybiBfaGFuZGxlUmVxdWVzdCQxKGZldGNoZXIsIFwiSEVBRFwiLCB1cmwsIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHsgbm9SZXNvbHZlSnNvbjogdHJ1ZSB9KSwgcGFyYW1ldGVycyk7XG59XG5hc3luYyBmdW5jdGlvbiByZW1vdmUoZmV0Y2hlciwgdXJsLCBib2R5LCBvcHRpb25zLCBwYXJhbWV0ZXJzKSB7XG5cdHJldHVybiBfaGFuZGxlUmVxdWVzdCQxKGZldGNoZXIsIFwiREVMRVRFXCIsIHVybCwgb3B0aW9ucywgcGFyYW1ldGVycywgYm9keSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9wYWNrYWdlcy9TdHJlYW1Eb3dubG9hZEJ1aWxkZXIudHNcbnZhciBTdHJlYW1Eb3dubG9hZEJ1aWxkZXIgPSBjbGFzcyB7XG5cdGNvbnN0cnVjdG9yKGRvd25sb2FkRm4sIHNob3VsZFRocm93T25FcnJvcikge1xuXHRcdHRoaXMuZG93bmxvYWRGbiA9IGRvd25sb2FkRm47XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSBzaG91bGRUaHJvd09uRXJyb3I7XG5cdH1cblx0dGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGUoKS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcblx0fVxuXHRhc3luYyBleGVjdXRlKCkge1xuXHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IChhd2FpdCBfdGhpcy5kb3dubG9hZEZuKCkpLmJvZHksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvcGFja2FnZXMvQmxvYkRvd25sb2FkQnVpbGRlci50c1xubGV0IF9TeW1ib2wkdG9TdHJpbmdUYWc7XG5fU3ltYm9sJHRvU3RyaW5nVGFnID0gU3ltYm9sLnRvU3RyaW5nVGFnO1xudmFyIEJsb2JEb3dubG9hZEJ1aWxkZXIgPSBjbGFzcyB7XG5cdGNvbnN0cnVjdG9yKGRvd25sb2FkRm4sIHNob3VsZFRocm93T25FcnJvcikge1xuXHRcdHRoaXMuZG93bmxvYWRGbiA9IGRvd25sb2FkRm47XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSBzaG91bGRUaHJvd09uRXJyb3I7XG5cdFx0dGhpc1tfU3ltYm9sJHRvU3RyaW5nVGFnXSA9IFwiQmxvYkRvd25sb2FkQnVpbGRlclwiO1xuXHRcdHRoaXMucHJvbWlzZSA9IG51bGw7XG5cdH1cblx0YXNTdHJlYW0oKSB7XG5cdFx0cmV0dXJuIG5ldyBTdHJlYW1Eb3dubG9hZEJ1aWxkZXIodGhpcy5kb3dubG9hZEZuLCB0aGlzLnNob3VsZFRocm93T25FcnJvcik7XG5cdH1cblx0dGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuXHRcdHJldHVybiB0aGlzLmdldFByb21pc2UoKS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcblx0fVxuXHRjYXRjaChvbnJlamVjdGVkKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpLmNhdGNoKG9ucmVqZWN0ZWQpO1xuXHR9XG5cdGZpbmFsbHkob25maW5hbGx5KSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpLmZpbmFsbHkob25maW5hbGx5KTtcblx0fVxuXHRnZXRQcm9taXNlKCkge1xuXHRcdGlmICghdGhpcy5wcm9taXNlKSB0aGlzLnByb21pc2UgPSB0aGlzLmV4ZWN1dGUoKTtcblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlO1xuXHR9XG5cdGFzeW5jIGV4ZWN1dGUoKSB7XG5cdFx0dmFyIF90aGlzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgKGF3YWl0IF90aGlzLmRvd25sb2FkRm4oKSkuYmxvYigpLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3BhY2thZ2VzL1N0b3JhZ2VGaWxlQXBpLnRzXG5jb25zdCBERUZBVUxUX1NFQVJDSF9PUFRJT05TID0ge1xuXHRsaW1pdDogMTAwLFxuXHRvZmZzZXQ6IDAsXG5cdHNvcnRCeToge1xuXHRcdGNvbHVtbjogXCJuYW1lXCIsXG5cdFx0b3JkZXI6IFwiYXNjXCJcblx0fVxufTtcbmNvbnN0IERFRkFVTFRfRklMRV9PUFRJT05TID0ge1xuXHRjYWNoZUNvbnRyb2w6IFwiMzYwMFwiLFxuXHRjb250ZW50VHlwZTogXCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLThcIixcblx0dXBzZXJ0OiBmYWxzZVxufTtcbnZhciBTdG9yYWdlRmlsZUFwaSA9IGNsYXNzIHtcblx0Y29uc3RydWN0b3IodXJsLCBoZWFkZXJzID0ge30sIGJ1Y2tldElkLCBmZXRjaCQxKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSBmYWxzZTtcblx0XHR0aGlzLnVybCA9IHVybDtcblx0XHR0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuXHRcdHRoaXMuYnVja2V0SWQgPSBidWNrZXRJZDtcblx0XHR0aGlzLmZldGNoID0gcmVzb2x2ZUZldGNoJDEoZmV0Y2gkMSk7XG5cdH1cblx0LyoqXG5cdCogRW5hYmxlIHRocm93aW5nIGVycm9ycyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGVtLlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqL1xuXHR0aHJvd09uRXJyb3IoKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSB0cnVlO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIFVwbG9hZHMgYSBmaWxlIHRvIGFuIGV4aXN0aW5nIGJ1Y2tldCBvciByZXBsYWNlcyBhbiBleGlzdGluZyBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCB3aXRoIGEgbmV3IG9uZS5cblx0KlxuXHQqIEBwYXJhbSBtZXRob2QgSFRUUCBtZXRob2QuXG5cdCogQHBhcmFtIHBhdGggVGhlIHJlbGF0aXZlIGZpbGUgcGF0aC4gU2hvdWxkIGJlIG9mIHRoZSBmb3JtYXQgYGZvbGRlci9zdWJmb2xkZXIvZmlsZW5hbWUucG5nYC4gVGhlIGJ1Y2tldCBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXBsb2FkLlxuXHQqIEBwYXJhbSBmaWxlQm9keSBUaGUgYm9keSBvZiB0aGUgZmlsZSB0byBiZSBzdG9yZWQgaW4gdGhlIGJ1Y2tldC5cblx0Ki9cblx0YXN5bmMgdXBsb2FkT3JVcGRhdGUobWV0aG9kLCBwYXRoLCBmaWxlQm9keSwgZmlsZU9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRsZXQgYm9keTtcblx0XHRcdGNvbnN0IG9wdGlvbnMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9GSUxFX09QVElPTlMpLCBmaWxlT3B0aW9ucyk7XG5cdFx0XHRsZXQgaGVhZGVycyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBfdGhpcy5oZWFkZXJzKSwgbWV0aG9kID09PSBcIlBPU1RcIiAmJiB7IFwieC11cHNlcnRcIjogU3RyaW5nKG9wdGlvbnMudXBzZXJ0KSB9KTtcblx0XHRcdGNvbnN0IG1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcblx0XHRcdGlmICh0eXBlb2YgQmxvYiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBmaWxlQm9keSBpbnN0YW5jZW9mIEJsb2IpIHtcblx0XHRcdFx0Ym9keSA9IG5ldyBGb3JtRGF0YSgpO1xuXHRcdFx0XHRib2R5LmFwcGVuZChcImNhY2hlQ29udHJvbFwiLCBvcHRpb25zLmNhY2hlQ29udHJvbCk7XG5cdFx0XHRcdGlmIChtZXRhZGF0YSkgYm9keS5hcHBlbmQoXCJtZXRhZGF0YVwiLCBfdGhpcy5lbmNvZGVNZXRhZGF0YShtZXRhZGF0YSkpO1xuXHRcdFx0XHRib2R5LmFwcGVuZChcIlwiLCBmaWxlQm9keSk7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBGb3JtRGF0YSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBmaWxlQm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG5cdFx0XHRcdGJvZHkgPSBmaWxlQm9keTtcblx0XHRcdFx0aWYgKCFib2R5LmhhcyhcImNhY2hlQ29udHJvbFwiKSkgYm9keS5hcHBlbmQoXCJjYWNoZUNvbnRyb2xcIiwgb3B0aW9ucy5jYWNoZUNvbnRyb2wpO1xuXHRcdFx0XHRpZiAobWV0YWRhdGEgJiYgIWJvZHkuaGFzKFwibWV0YWRhdGFcIikpIGJvZHkuYXBwZW5kKFwibWV0YWRhdGFcIiwgX3RoaXMuZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJvZHkgPSBmaWxlQm9keTtcblx0XHRcdFx0aGVhZGVyc1tcImNhY2hlLWNvbnRyb2xcIl0gPSBgbWF4LWFnZT0ke29wdGlvbnMuY2FjaGVDb250cm9sfWA7XG5cdFx0XHRcdGhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gPSBvcHRpb25zLmNvbnRlbnRUeXBlO1xuXHRcdFx0XHRpZiAobWV0YWRhdGEpIGhlYWRlcnNbXCJ4LW1ldGFkYXRhXCJdID0gX3RoaXMudG9CYXNlNjQoX3RoaXMuZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEpKTtcblx0XHRcdFx0aWYgKCh0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT09IFwidW5kZWZpbmVkXCIgJiYgYm9keSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtIHx8IGJvZHkgJiYgdHlwZW9mIGJvZHkgPT09IFwib2JqZWN0XCIgJiYgXCJwaXBlXCIgaW4gYm9keSAmJiB0eXBlb2YgYm9keS5waXBlID09PSBcImZ1bmN0aW9uXCIpICYmICFvcHRpb25zLmR1cGxleCkgb3B0aW9ucy5kdXBsZXggPSBcImhhbGZcIjtcblx0XHRcdH1cblx0XHRcdGlmIChmaWxlT3B0aW9ucyA9PT0gbnVsbCB8fCBmaWxlT3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmlsZU9wdGlvbnMuaGVhZGVycykgaGVhZGVycyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBoZWFkZXJzKSwgZmlsZU9wdGlvbnMuaGVhZGVycyk7XG5cdFx0XHRjb25zdCBjbGVhblBhdGggPSBfdGhpcy5fcmVtb3ZlRW1wdHlGb2xkZXJzKHBhdGgpO1xuXHRcdFx0Y29uc3QgX3BhdGggPSBfdGhpcy5fZ2V0RmluYWxQYXRoKGNsZWFuUGF0aCk7XG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgKG1ldGhvZCA9PSBcIlBVVFwiID8gcHV0IDogcG9zdCQxKShfdGhpcy5mZXRjaCwgYCR7X3RoaXMudXJsfS9vYmplY3QvJHtfcGF0aH1gLCBib2R5LCBfb2JqZWN0U3ByZWFkMih7IGhlYWRlcnMgfSwgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kdXBsZXgpID8geyBkdXBsZXg6IG9wdGlvbnMuZHVwbGV4IH0gOiB7fSkpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdHBhdGg6IGNsZWFuUGF0aCxcblx0XHRcdFx0XHRpZDogZGF0YS5JZCxcblx0XHRcdFx0XHRmdWxsUGF0aDogZGF0YS5LZXlcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogVXBsb2FkcyBhIGZpbGUgdG8gYW4gZXhpc3RpbmcgYnVja2V0LlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBwYXRoIFRoZSBmaWxlIHBhdGgsIGluY2x1ZGluZyB0aGUgZmlsZSBuYW1lLiBTaG91bGQgYmUgb2YgdGhlIGZvcm1hdCBgZm9sZGVyL3N1YmZvbGRlci9maWxlbmFtZS5wbmdgLiBUaGUgYnVja2V0IG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUgYXR0ZW1wdGluZyB0byB1cGxvYWQuXG5cdCogQHBhcmFtIGZpbGVCb2R5IFRoZSBib2R5IG9mIHRoZSBmaWxlIHRvIGJlIHN0b3JlZCBpbiB0aGUgYnVja2V0LlxuXHQqIEBwYXJhbSBmaWxlT3B0aW9ucyBPcHRpb25hbCBmaWxlIHVwbG9hZCBvcHRpb25zIGluY2x1ZGluZyBjYWNoZUNvbnRyb2wsIGNvbnRlbnRUeXBlLCB1cHNlcnQsIGFuZCBtZXRhZGF0YS5cblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBmaWxlIHBhdGgsIGlkLCBhbmQgZnVsbFBhdGggb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIFVwbG9hZCBmaWxlXG5cdCogYGBganNcblx0KiBjb25zdCBhdmF0YXJGaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAudXBsb2FkKCdwdWJsaWMvYXZhdGFyMS5wbmcnLCBhdmF0YXJGaWxlLCB7XG5cdCogICAgIGNhY2hlQ29udHJvbDogJzM2MDAnLFxuXHQqICAgICB1cHNlcnQ6IGZhbHNlXG5cdCogICB9KVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiB7XG5cdCogICAgIFwicGF0aFwiOiBcInB1YmxpYy9hdmF0YXIxLnBuZ1wiLFxuXHQqICAgICBcImZ1bGxQYXRoXCI6IFwiYXZhdGFycy9wdWJsaWMvYXZhdGFyMS5wbmdcIlxuXHQqICAgfSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0KlxuXHQqIEBleGFtcGxlIFVwbG9hZCBmaWxlIHVzaW5nIGBBcnJheUJ1ZmZlcmAgZnJvbSBiYXNlNjQgZmlsZSBkYXRhXG5cdCogYGBganNcblx0KiBpbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdiYXNlNjQtYXJyYXlidWZmZXInXG5cdCpcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdhdmF0YXJzJylcblx0KiAgIC51cGxvYWQoJ3B1YmxpYy9hdmF0YXIxLnBuZycsIGRlY29kZSgnYmFzZTY0RmlsZURhdGEnKSwge1xuXHQqICAgICBjb250ZW50VHlwZTogJ2ltYWdlL3BuZydcblx0KiAgIH0pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIHVwbG9hZChwYXRoLCBmaWxlQm9keSwgZmlsZU9wdGlvbnMpIHtcblx0XHRyZXR1cm4gdGhpcy51cGxvYWRPclVwZGF0ZShcIlBPU1RcIiwgcGF0aCwgZmlsZUJvZHksIGZpbGVPcHRpb25zKTtcblx0fVxuXHQvKipcblx0KiBVcGxvYWQgYSBmaWxlIHdpdGggYSB0b2tlbiBnZW5lcmF0ZWQgZnJvbSBgY3JlYXRlU2lnbmVkVXBsb2FkVXJsYC5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gcGF0aCBUaGUgZmlsZSBwYXRoLCBpbmNsdWRpbmcgdGhlIGZpbGUgbmFtZS4gU2hvdWxkIGJlIG9mIHRoZSBmb3JtYXQgYGZvbGRlci9zdWJmb2xkZXIvZmlsZW5hbWUucG5nYC4gVGhlIGJ1Y2tldCBtdXN0IGFscmVhZHkgZXhpc3QgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXBsb2FkLlxuXHQqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gZ2VuZXJhdGVkIGZyb20gYGNyZWF0ZVNpZ25lZFVwbG9hZFVybGBcblx0KiBAcGFyYW0gZmlsZUJvZHkgVGhlIGJvZHkgb2YgdGhlIGZpbGUgdG8gYmUgc3RvcmVkIGluIHRoZSBidWNrZXQuXG5cdCogQHBhcmFtIGZpbGVPcHRpb25zIEhUVFAgaGVhZGVycyAoY2FjaGVDb250cm9sLCBjb250ZW50VHlwZSwgZXRjLikuXG5cdCogKipOb3RlOioqIFRoZSBgdXBzZXJ0YCBvcHRpb24gaGFzIG5vIGVmZmVjdCBoZXJlLiBUbyBlbmFibGUgdXBzZXJ0IGJlaGF2aW9yLFxuXHQqIHBhc3MgYHsgdXBzZXJ0OiB0cnVlIH1gIHdoZW4gY2FsbGluZyBgY3JlYXRlU2lnbmVkVXBsb2FkVXJsKClgIGluc3RlYWQuXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgZmlsZSBwYXRoIGFuZCBmdWxsUGF0aCBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgVXBsb2FkIHRvIGEgc2lnbmVkIFVSTFxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAudXBsb2FkVG9TaWduZWRVcmwoJ2ZvbGRlci9jYXQuanBnJywgJ3Rva2VuLWZyb20tY3JlYXRlU2lnbmVkVXBsb2FkVXJsJywgZmlsZSlcblx0KiBgYGBcblx0KlxuXHQqIFJlc3BvbnNlOlxuXHQqIGBgYGpzb25cblx0KiB7XG5cdCogICBcImRhdGFcIjoge1xuXHQqICAgICBcInBhdGhcIjogXCJmb2xkZXIvY2F0LmpwZ1wiLFxuXHQqICAgICBcImZ1bGxQYXRoXCI6IFwiYXZhdGFycy9mb2xkZXIvY2F0LmpwZ1wiXG5cdCogICB9LFxuXHQqICAgXCJlcnJvclwiOiBudWxsXG5cdCogfVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyB1cGxvYWRUb1NpZ25lZFVybChwYXRoLCB0b2tlbiwgZmlsZUJvZHksIGZpbGVPcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzMyA9IHRoaXM7XG5cdFx0Y29uc3QgY2xlYW5QYXRoID0gX3RoaXMzLl9yZW1vdmVFbXB0eUZvbGRlcnMocGF0aCk7XG5cdFx0Y29uc3QgX3BhdGggPSBfdGhpczMuX2dldEZpbmFsUGF0aChjbGVhblBhdGgpO1xuXHRcdGNvbnN0IHVybCA9IG5ldyBVUkwoX3RoaXMzLnVybCArIGAvb2JqZWN0L3VwbG9hZC9zaWduLyR7X3BhdGh9YCk7XG5cdFx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJ0b2tlblwiLCB0b2tlbik7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCBib2R5O1xuXHRcdFx0Y29uc3Qgb3B0aW9ucyA9IF9vYmplY3RTcHJlYWQyKHsgdXBzZXJ0OiBERUZBVUxUX0ZJTEVfT1BUSU9OUy51cHNlcnQgfSwgZmlsZU9wdGlvbnMpO1xuXHRcdFx0Y29uc3QgaGVhZGVycyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBfdGhpczMuaGVhZGVycyksIHsgXCJ4LXVwc2VydFwiOiBTdHJpbmcob3B0aW9ucy51cHNlcnQpIH0pO1xuXHRcdFx0aWYgKHR5cGVvZiBCbG9iICE9PSBcInVuZGVmaW5lZFwiICYmIGZpbGVCb2R5IGluc3RhbmNlb2YgQmxvYikge1xuXHRcdFx0XHRib2R5ID0gbmV3IEZvcm1EYXRhKCk7XG5cdFx0XHRcdGJvZHkuYXBwZW5kKFwiY2FjaGVDb250cm9sXCIsIG9wdGlvbnMuY2FjaGVDb250cm9sKTtcblx0XHRcdFx0Ym9keS5hcHBlbmQoXCJcIiwgZmlsZUJvZHkpO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgRm9ybURhdGEgIT09IFwidW5kZWZpbmVkXCIgJiYgZmlsZUJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuXHRcdFx0XHRib2R5ID0gZmlsZUJvZHk7XG5cdFx0XHRcdGJvZHkuYXBwZW5kKFwiY2FjaGVDb250cm9sXCIsIG9wdGlvbnMuY2FjaGVDb250cm9sKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJvZHkgPSBmaWxlQm9keTtcblx0XHRcdFx0aGVhZGVyc1tcImNhY2hlLWNvbnRyb2xcIl0gPSBgbWF4LWFnZT0ke29wdGlvbnMuY2FjaGVDb250cm9sfWA7XG5cdFx0XHRcdGhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gPSBvcHRpb25zLmNvbnRlbnRUeXBlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdHBhdGg6IGNsZWFuUGF0aCxcblx0XHRcdFx0XHRmdWxsUGF0aDogKGF3YWl0IHB1dChfdGhpczMuZmV0Y2gsIHVybC50b1N0cmluZygpLCBib2R5LCB7IGhlYWRlcnMgfSkpLktleVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzMy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogQ3JlYXRlcyBhIHNpZ25lZCB1cGxvYWQgVVJMLlxuXHQqIFNpZ25lZCB1cGxvYWQgVVJMcyBjYW4gYmUgdXNlZCB0byB1cGxvYWQgZmlsZXMgdG8gdGhlIGJ1Y2tldCB3aXRob3V0IGZ1cnRoZXIgYXV0aGVudGljYXRpb24uXG5cdCogVGhleSBhcmUgdmFsaWQgZm9yIDIgaG91cnMuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIHBhdGggVGhlIGZpbGUgcGF0aCwgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGZpbGUgbmFtZS4gRm9yIGV4YW1wbGUgYGZvbGRlci9pbWFnZS5wbmdgLlxuXHQqIEBwYXJhbSBvcHRpb25zLnVwc2VydCBJZiBzZXQgdG8gdHJ1ZSwgYWxsb3dzIHRoZSBmaWxlIHRvIGJlIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIHNpZ25lZCB1cGxvYWQgVVJMLCB0b2tlbiwgYW5kIHBhdGggb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIENyZWF0ZSBTaWduZWQgVXBsb2FkIFVSTFxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAuY3JlYXRlU2lnbmVkVXBsb2FkVXJsKCdmb2xkZXIvY2F0LmpwZycpXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IHtcblx0KiAgICAgXCJzaWduZWRVcmxcIjogXCJodHRwczovL2V4YW1wbGUuc3VwYWJhc2UuY28vc3RvcmFnZS92MS9vYmplY3QvdXBsb2FkL3NpZ24vYXZhdGFycy9mb2xkZXIvY2F0LmpwZz90b2tlbj08VE9LRU4+XCIsXG5cdCogICAgIFwicGF0aFwiOiBcImZvbGRlci9jYXQuanBnXCIsXG5cdCogICAgIFwidG9rZW5cIjogXCI8VE9LRU4+XCJcblx0KiAgIH0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGNyZWF0ZVNpZ25lZFVwbG9hZFVybChwYXRoLCBvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzNCA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCBfcGF0aCA9IF90aGlzNC5fZ2V0RmluYWxQYXRoKHBhdGgpO1xuXHRcdFx0Y29uc3QgaGVhZGVycyA9IF9vYmplY3RTcHJlYWQyKHt9LCBfdGhpczQuaGVhZGVycyk7XG5cdFx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnVwc2VydCkgaGVhZGVyc1tcIngtdXBzZXJ0XCJdID0gXCJ0cnVlXCI7XG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgcG9zdCQxKF90aGlzNC5mZXRjaCwgYCR7X3RoaXM0LnVybH0vb2JqZWN0L3VwbG9hZC9zaWduLyR7X3BhdGh9YCwge30sIHsgaGVhZGVycyB9KTtcblx0XHRcdGNvbnN0IHVybCA9IG5ldyBVUkwoX3RoaXM0LnVybCArIGRhdGEudXJsKTtcblx0XHRcdGNvbnN0IHRva2VuID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoXCJ0b2tlblwiKTtcblx0XHRcdGlmICghdG9rZW4pIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoXCJObyB0b2tlbiByZXR1cm5lZCBieSBBUElcIik7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0c2lnbmVkVXJsOiB1cmwudG9TdHJpbmcoKSxcblx0XHRcdFx0XHRwYXRoLFxuXHRcdFx0XHRcdHRva2VuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXM0LnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBSZXBsYWNlcyBhbiBleGlzdGluZyBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCB3aXRoIGEgbmV3IG9uZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgZmlsZSBwYXRoLiBTaG91bGQgYmUgb2YgdGhlIGZvcm1hdCBgZm9sZGVyL3N1YmZvbGRlci9maWxlbmFtZS5wbmdgLiBUaGUgYnVja2V0IG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUgYXR0ZW1wdGluZyB0byB1cGRhdGUuXG5cdCogQHBhcmFtIGZpbGVCb2R5IFRoZSBib2R5IG9mIHRoZSBmaWxlIHRvIGJlIHN0b3JlZCBpbiB0aGUgYnVja2V0LlxuXHQqIEBwYXJhbSBmaWxlT3B0aW9ucyBPcHRpb25hbCBmaWxlIHVwbG9hZCBvcHRpb25zIGluY2x1ZGluZyBjYWNoZUNvbnRyb2wsIGNvbnRlbnRUeXBlLCB1cHNlcnQsIGFuZCBtZXRhZGF0YS5cblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBmaWxlIHBhdGgsIGlkLCBhbmQgZnVsbFBhdGggb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIFVwZGF0ZSBmaWxlXG5cdCogYGBganNcblx0KiBjb25zdCBhdmF0YXJGaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAudXBkYXRlKCdwdWJsaWMvYXZhdGFyMS5wbmcnLCBhdmF0YXJGaWxlLCB7XG5cdCogICAgIGNhY2hlQ29udHJvbDogJzM2MDAnLFxuXHQqICAgICB1cHNlcnQ6IHRydWVcblx0KiAgIH0pXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IHtcblx0KiAgICAgXCJwYXRoXCI6IFwicHVibGljL2F2YXRhcjEucG5nXCIsXG5cdCogICAgIFwiZnVsbFBhdGhcIjogXCJhdmF0YXJzL3B1YmxpYy9hdmF0YXIxLnBuZ1wiXG5cdCogICB9LFxuXHQqICAgXCJlcnJvclwiOiBudWxsXG5cdCogfVxuXHQqIGBgYFxuXHQqXG5cdCogQGV4YW1wbGUgVXBkYXRlIGZpbGUgdXNpbmcgYEFycmF5QnVmZmVyYCBmcm9tIGJhc2U2NCBmaWxlIGRhdGFcblx0KiBgYGBqc1xuXHQqIGltcG9ydCB7ZGVjb2RlfSBmcm9tICdiYXNlNjQtYXJyYXlidWZmZXInXG5cdCpcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdhdmF0YXJzJylcblx0KiAgIC51cGRhdGUoJ3B1YmxpYy9hdmF0YXIxLnBuZycsIGRlY29kZSgnYmFzZTY0RmlsZURhdGEnKSwge1xuXHQqICAgICBjb250ZW50VHlwZTogJ2ltYWdlL3BuZydcblx0KiAgIH0pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIHVwZGF0ZShwYXRoLCBmaWxlQm9keSwgZmlsZU9wdGlvbnMpIHtcblx0XHRyZXR1cm4gdGhpcy51cGxvYWRPclVwZGF0ZShcIlBVVFwiLCBwYXRoLCBmaWxlQm9keSwgZmlsZU9wdGlvbnMpO1xuXHR9XG5cdC8qKlxuXHQqIE1vdmVzIGFuIGV4aXN0aW5nIGZpbGUgdG8gYSBuZXcgcGF0aCBpbiB0aGUgc2FtZSBidWNrZXQuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIGZyb21QYXRoIFRoZSBvcmlnaW5hbCBmaWxlIHBhdGgsIGluY2x1ZGluZyB0aGUgY3VycmVudCBmaWxlIG5hbWUuIEZvciBleGFtcGxlIGBmb2xkZXIvaW1hZ2UucG5nYC5cblx0KiBAcGFyYW0gdG9QYXRoIFRoZSBuZXcgZmlsZSBwYXRoLCBpbmNsdWRpbmcgdGhlIG5ldyBmaWxlIG5hbWUuIEZvciBleGFtcGxlIGBmb2xkZXIvaW1hZ2UtbmV3LnBuZ2AuXG5cdCogQHBhcmFtIG9wdGlvbnMgVGhlIGRlc3RpbmF0aW9uIG9wdGlvbnMuXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgc3VjY2VzcyBtZXNzYWdlIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBNb3ZlIGZpbGVcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLm1vdmUoJ3B1YmxpYy9hdmF0YXIxLnBuZycsICdwcml2YXRlL2F2YXRhcjIucG5nJylcblx0KiBgYGBcblx0KlxuXHQqIFJlc3BvbnNlOlxuXHQqIGBgYGpzb25cblx0KiB7XG5cdCogICBcImRhdGFcIjoge1xuXHQqICAgICBcIm1lc3NhZ2VcIjogXCJTdWNjZXNzZnVsbHkgbW92ZWRcIlxuXHQqICAgfSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgbW92ZShmcm9tUGF0aCwgdG9QYXRoLCBvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzNiA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QkMShfdGhpczYuZmV0Y2gsIGAke190aGlzNi51cmx9L29iamVjdC9tb3ZlYCwge1xuXHRcdFx0XHRcdGJ1Y2tldElkOiBfdGhpczYuYnVja2V0SWQsXG5cdFx0XHRcdFx0c291cmNlS2V5OiBmcm9tUGF0aCxcblx0XHRcdFx0XHRkZXN0aW5hdGlvbktleTogdG9QYXRoLFxuXHRcdFx0XHRcdGRlc3RpbmF0aW9uQnVja2V0OiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVzdGluYXRpb25CdWNrZXRcblx0XHRcdFx0fSwgeyBoZWFkZXJzOiBfdGhpczYuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczYuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIENvcGllcyBhbiBleGlzdGluZyBmaWxlIHRvIGEgbmV3IHBhdGggaW4gdGhlIHNhbWUgYnVja2V0LlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBmcm9tUGF0aCBUaGUgb3JpZ2luYWwgZmlsZSBwYXRoLCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgZmlsZSBuYW1lLiBGb3IgZXhhbXBsZSBgZm9sZGVyL2ltYWdlLnBuZ2AuXG5cdCogQHBhcmFtIHRvUGF0aCBUaGUgbmV3IGZpbGUgcGF0aCwgaW5jbHVkaW5nIHRoZSBuZXcgZmlsZSBuYW1lLiBGb3IgZXhhbXBsZSBgZm9sZGVyL2ltYWdlLWNvcHkucG5nYC5cblx0KiBAcGFyYW0gb3B0aW9ucyBUaGUgZGVzdGluYXRpb24gb3B0aW9ucy5cblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBjb3BpZWQgZmlsZSBwYXRoIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBDb3B5IGZpbGVcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLmNvcHkoJ3B1YmxpYy9hdmF0YXIxLnBuZycsICdwcml2YXRlL2F2YXRhcjIucG5nJylcblx0KiBgYGBcblx0KlxuXHQqIFJlc3BvbnNlOlxuXHQqIGBgYGpzb25cblx0KiB7XG5cdCogICBcImRhdGFcIjoge1xuXHQqICAgICBcInBhdGhcIjogXCJhdmF0YXJzL3ByaXZhdGUvYXZhdGFyMi5wbmdcIlxuXHQqICAgfSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgY29weShmcm9tUGF0aCwgdG9QYXRoLCBvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzNyA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IHsgcGF0aDogKGF3YWl0IHBvc3QkMShfdGhpczcuZmV0Y2gsIGAke190aGlzNy51cmx9L29iamVjdC9jb3B5YCwge1xuXHRcdFx0XHRcdGJ1Y2tldElkOiBfdGhpczcuYnVja2V0SWQsXG5cdFx0XHRcdFx0c291cmNlS2V5OiBmcm9tUGF0aCxcblx0XHRcdFx0XHRkZXN0aW5hdGlvbktleTogdG9QYXRoLFxuXHRcdFx0XHRcdGRlc3RpbmF0aW9uQnVja2V0OiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVzdGluYXRpb25CdWNrZXRcblx0XHRcdFx0fSwgeyBoZWFkZXJzOiBfdGhpczcuaGVhZGVycyB9KSkuS2V5IH0sXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXM3LnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBDcmVhdGVzIGEgc2lnbmVkIFVSTC4gVXNlIGEgc2lnbmVkIFVSTCB0byBzaGFyZSBhIGZpbGUgZm9yIGEgZml4ZWQgYW1vdW50IG9mIHRpbWUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIHBhdGggVGhlIGZpbGUgcGF0aCwgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGZpbGUgbmFtZS4gRm9yIGV4YW1wbGUgYGZvbGRlci9pbWFnZS5wbmdgLlxuXHQqIEBwYXJhbSBleHBpcmVzSW4gVGhlIG51bWJlciBvZiBzZWNvbmRzIHVudGlsIHRoZSBzaWduZWQgVVJMIGV4cGlyZXMuIEZvciBleGFtcGxlLCBgNjBgIGZvciBhIFVSTCB3aGljaCBpcyB2YWxpZCBmb3Igb25lIG1pbnV0ZS5cblx0KiBAcGFyYW0gb3B0aW9ucy5kb3dubG9hZCB0cmlnZ2VycyB0aGUgZmlsZSBhcyBhIGRvd25sb2FkIGlmIHNldCB0byB0cnVlLiBTZXQgdGhpcyBwYXJhbWV0ZXIgYXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaWYgeW91IHdhbnQgdG8gdHJpZ2dlciB0aGUgZG93bmxvYWQgd2l0aCBhIGRpZmZlcmVudCBmaWxlbmFtZS5cblx0KiBAcGFyYW0gb3B0aW9ucy50cmFuc2Zvcm0gVHJhbnNmb3JtIHRoZSBhc3NldCBiZWZvcmUgc2VydmluZyBpdCB0byB0aGUgY2xpZW50LlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIHNpZ25lZCBVUkwgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIENyZWF0ZSBTaWduZWQgVVJMXG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdhdmF0YXJzJylcblx0KiAgIC5jcmVhdGVTaWduZWRVcmwoJ2ZvbGRlci9hdmF0YXIxLnBuZycsIDYwKVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiB7XG5cdCogICAgIFwic2lnbmVkVXJsXCI6IFwiaHR0cHM6Ly9leGFtcGxlLnN1cGFiYXNlLmNvL3N0b3JhZ2UvdjEvb2JqZWN0L3NpZ24vYXZhdGFycy9mb2xkZXIvYXZhdGFyMS5wbmc/dG9rZW49PFRPS0VOPlwiXG5cdCogICB9LFxuXHQqICAgXCJlcnJvclwiOiBudWxsXG5cdCogfVxuXHQqIGBgYFxuXHQqXG5cdCogQGV4YW1wbGUgQ3JlYXRlIGEgc2lnbmVkIFVSTCBmb3IgYW4gYXNzZXQgd2l0aCB0cmFuc2Zvcm1hdGlvbnNcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAuY3JlYXRlU2lnbmVkVXJsKCdmb2xkZXIvYXZhdGFyMS5wbmcnLCA2MCwge1xuXHQqICAgICB0cmFuc2Zvcm06IHtcblx0KiAgICAgICB3aWR0aDogMTAwLFxuXHQqICAgICAgIGhlaWdodDogMTAwLFxuXHQqICAgICB9XG5cdCogICB9KVxuXHQqIGBgYFxuXHQqXG5cdCogQGV4YW1wbGUgQ3JlYXRlIGEgc2lnbmVkIFVSTCB3aGljaCB0cmlnZ2VycyB0aGUgZG93bmxvYWQgb2YgdGhlIGFzc2V0XG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLmNyZWF0ZVNpZ25lZFVybCgnZm9sZGVyL2F2YXRhcjEucG5nJywgNjAsIHtcblx0KiAgICAgZG93bmxvYWQ6IHRydWUsXG5cdCogICB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBjcmVhdGVTaWduZWRVcmwocGF0aCwgZXhwaXJlc0luLCBvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzOCA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCBfcGF0aCA9IF90aGlzOC5fZ2V0RmluYWxQYXRoKHBhdGgpO1xuXHRcdFx0bGV0IGRhdGEgPSBhd2FpdCBwb3N0JDEoX3RoaXM4LmZldGNoLCBgJHtfdGhpczgudXJsfS9vYmplY3Qvc2lnbi8ke19wYXRofWAsIF9vYmplY3RTcHJlYWQyKHsgZXhwaXJlc0luIH0sIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHJhbnNmb3JtKSA/IHsgdHJhbnNmb3JtOiBvcHRpb25zLnRyYW5zZm9ybSB9IDoge30pLCB7IGhlYWRlcnM6IF90aGlzOC5oZWFkZXJzIH0pO1xuXHRcdFx0Y29uc3QgZG93bmxvYWRRdWVyeVBhcmFtID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kb3dubG9hZCkgPyBgJmRvd25sb2FkPSR7b3B0aW9ucy5kb3dubG9hZCA9PT0gdHJ1ZSA/IFwiXCIgOiBvcHRpb25zLmRvd25sb2FkfWAgOiBcIlwiO1xuXHRcdFx0ZGF0YSA9IHsgc2lnbmVkVXJsOiBlbmNvZGVVUkkoYCR7X3RoaXM4LnVybH0ke2RhdGEuc2lnbmVkVVJMfSR7ZG93bmxvYWRRdWVyeVBhcmFtfWApIH07XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzOC5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogQ3JlYXRlcyBtdWx0aXBsZSBzaWduZWQgVVJMcy4gVXNlIGEgc2lnbmVkIFVSTCB0byBzaGFyZSBhIGZpbGUgZm9yIGEgZml4ZWQgYW1vdW50IG9mIHRpbWUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIHBhdGhzIFRoZSBmaWxlIHBhdGhzIHRvIGJlIGRvd25sb2FkZWQsIGluY2x1ZGluZyB0aGUgY3VycmVudCBmaWxlIG5hbWVzLiBGb3IgZXhhbXBsZSBgWydmb2xkZXIvaW1hZ2UucG5nJywgJ2ZvbGRlcjIvaW1hZ2UyLnBuZyddYC5cblx0KiBAcGFyYW0gZXhwaXJlc0luIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB1bnRpbCB0aGUgc2lnbmVkIFVSTHMgZXhwaXJlLiBGb3IgZXhhbXBsZSwgYDYwYCBmb3IgVVJMcyB3aGljaCBhcmUgdmFsaWQgZm9yIG9uZSBtaW51dGUuXG5cdCogQHBhcmFtIG9wdGlvbnMuZG93bmxvYWQgdHJpZ2dlcnMgdGhlIGZpbGUgYXMgYSBkb3dubG9hZCBpZiBzZXQgdG8gdHJ1ZS4gU2V0IHRoaXMgcGFyYW1ldGVyIGFzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGlmIHlvdSB3YW50IHRvIHRyaWdnZXIgdGhlIGRvd25sb2FkIHdpdGggYSBkaWZmZXJlbnQgZmlsZW5hbWUuXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHNpZ25lZFVybCwgcGF0aCwgYW5kIGVycm9yIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBDcmVhdGUgU2lnbmVkIFVSTHNcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLmNyZWF0ZVNpZ25lZFVybHMoWydmb2xkZXIvYXZhdGFyMS5wbmcnLCAnZm9sZGVyL2F2YXRhcjIucG5nJ10sIDYwKVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiBbXG5cdCogICAgIHtcblx0KiAgICAgICBcImVycm9yXCI6IG51bGwsXG5cdCogICAgICAgXCJwYXRoXCI6IFwiZm9sZGVyL2F2YXRhcjEucG5nXCIsXG5cdCogICAgICAgXCJzaWduZWRVUkxcIjogXCIvb2JqZWN0L3NpZ24vYXZhdGFycy9mb2xkZXIvYXZhdGFyMS5wbmc/dG9rZW49PFRPS0VOPlwiLFxuXHQqICAgICAgIFwic2lnbmVkVXJsXCI6IFwiaHR0cHM6Ly9leGFtcGxlLnN1cGFiYXNlLmNvL3N0b3JhZ2UvdjEvb2JqZWN0L3NpZ24vYXZhdGFycy9mb2xkZXIvYXZhdGFyMS5wbmc/dG9rZW49PFRPS0VOPlwiXG5cdCogICAgIH0sXG5cdCogICAgIHtcblx0KiAgICAgICBcImVycm9yXCI6IG51bGwsXG5cdCogICAgICAgXCJwYXRoXCI6IFwiZm9sZGVyL2F2YXRhcjIucG5nXCIsXG5cdCogICAgICAgXCJzaWduZWRVUkxcIjogXCIvb2JqZWN0L3NpZ24vYXZhdGFycy9mb2xkZXIvYXZhdGFyMi5wbmc/dG9rZW49PFRPS0VOPlwiLFxuXHQqICAgICAgIFwic2lnbmVkVXJsXCI6IFwiaHR0cHM6Ly9leGFtcGxlLnN1cGFiYXNlLmNvL3N0b3JhZ2UvdjEvb2JqZWN0L3NpZ24vYXZhdGFycy9mb2xkZXIvYXZhdGFyMi5wbmc/dG9rZW49PFRPS0VOPlwiXG5cdCogICAgIH1cblx0KiAgIF0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGNyZWF0ZVNpZ25lZFVybHMocGF0aHMsIGV4cGlyZXNJbiwgb3B0aW9ucykge1xuXHRcdHZhciBfdGhpczkgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgcG9zdCQxKF90aGlzOS5mZXRjaCwgYCR7X3RoaXM5LnVybH0vb2JqZWN0L3NpZ24vJHtfdGhpczkuYnVja2V0SWR9YCwge1xuXHRcdFx0XHRleHBpcmVzSW4sXG5cdFx0XHRcdHBhdGhzXG5cdFx0XHR9LCB7IGhlYWRlcnM6IF90aGlzOS5oZWFkZXJzIH0pO1xuXHRcdFx0Y29uc3QgZG93bmxvYWRRdWVyeVBhcmFtID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kb3dubG9hZCkgPyBgJmRvd25sb2FkPSR7b3B0aW9ucy5kb3dubG9hZCA9PT0gdHJ1ZSA/IFwiXCIgOiBvcHRpb25zLmRvd25sb2FkfWAgOiBcIlwiO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogZGF0YS5tYXAoKGRhdHVtKSA9PiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgZGF0dW0pLCB7fSwgeyBzaWduZWRVcmw6IGRhdHVtLnNpZ25lZFVSTCA/IGVuY29kZVVSSShgJHtfdGhpczkudXJsfSR7ZGF0dW0uc2lnbmVkVVJMfSR7ZG93bmxvYWRRdWVyeVBhcmFtfWApIDogbnVsbCB9KSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXM5LnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBEb3dubG9hZHMgYSBmaWxlIGZyb20gYSBwcml2YXRlIGJ1Y2tldC4gRm9yIHB1YmxpYyBidWNrZXRzLCBtYWtlIGEgcmVxdWVzdCB0byB0aGUgVVJMIHJldHVybmVkIGZyb20gYGdldFB1YmxpY1VybGAgaW5zdGVhZC5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gcGF0aCBUaGUgZnVsbCBwYXRoIGFuZCBmaWxlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZC4gRm9yIGV4YW1wbGUgYGZvbGRlci9pbWFnZS5wbmdgLlxuXHQqIEBwYXJhbSBvcHRpb25zLnRyYW5zZm9ybSBUcmFuc2Zvcm0gdGhlIGFzc2V0IGJlZm9yZSBzZXJ2aW5nIGl0IHRvIHRoZSBjbGllbnQuXG5cdCogQHJldHVybnMgQmxvYkRvd25sb2FkQnVpbGRlciBpbnN0YW5jZSBmb3IgZG93bmxvYWRpbmcgdGhlIGZpbGVcblx0KlxuXHQqIEBleGFtcGxlIERvd25sb2FkIGZpbGVcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLmRvd25sb2FkKCdmb2xkZXIvYXZhdGFyMS5wbmcnKVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiA8QkxPQj4sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCpcblx0KiBAZXhhbXBsZSBEb3dubG9hZCBmaWxlIHdpdGggdHJhbnNmb3JtYXRpb25zXG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdhdmF0YXJzJylcblx0KiAgIC5kb3dubG9hZCgnZm9sZGVyL2F2YXRhcjEucG5nJywge1xuXHQqICAgICB0cmFuc2Zvcm06IHtcblx0KiAgICAgICB3aWR0aDogMTAwLFxuXHQqICAgICAgIGhlaWdodDogMTAwLFxuXHQqICAgICAgIHF1YWxpdHk6IDgwXG5cdCogICAgIH1cblx0KiAgIH0pXG5cdCogYGBgXG5cdCovXG5cdGRvd25sb2FkKHBhdGgsIG9wdGlvbnMpIHtcblx0XHRjb25zdCByZW5kZXJQYXRoID0gdHlwZW9mIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHJhbnNmb3JtKSAhPT0gXCJ1bmRlZmluZWRcIiA/IFwicmVuZGVyL2ltYWdlL2F1dGhlbnRpY2F0ZWRcIiA6IFwib2JqZWN0XCI7XG5cdFx0Y29uc3QgdHJhbnNmb3JtYXRpb25RdWVyeSA9IHRoaXMudHJhbnNmb3JtT3B0c1RvUXVlcnlTdHJpbmcoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50cmFuc2Zvcm0pIHx8IHt9KTtcblx0XHRjb25zdCBxdWVyeVN0cmluZyA9IHRyYW5zZm9ybWF0aW9uUXVlcnkgPyBgPyR7dHJhbnNmb3JtYXRpb25RdWVyeX1gIDogXCJcIjtcblx0XHRjb25zdCBfcGF0aCA9IHRoaXMuX2dldEZpbmFsUGF0aChwYXRoKTtcblx0XHRjb25zdCBkb3dubG9hZEZuID0gKCkgPT4gZ2V0KHRoaXMuZmV0Y2gsIGAke3RoaXMudXJsfS8ke3JlbmRlclBhdGh9LyR7X3BhdGh9JHtxdWVyeVN0cmluZ31gLCB7XG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRub1Jlc29sdmVKc29uOiB0cnVlXG5cdFx0fSk7XG5cdFx0cmV0dXJuIG5ldyBCbG9iRG93bmxvYWRCdWlsZGVyKGRvd25sb2FkRm4sIHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yKTtcblx0fVxuXHQvKipcblx0KiBSZXRyaWV2ZXMgdGhlIGRldGFpbHMgb2YgYW4gZXhpc3RpbmcgZmlsZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gcGF0aCBUaGUgZmlsZSBwYXRoLCBpbmNsdWRpbmcgdGhlIGZpbGUgbmFtZS4gRm9yIGV4YW1wbGUgYGZvbGRlci9pbWFnZS5wbmdgLlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIGZpbGUgbWV0YWRhdGEgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIEdldCBmaWxlIGluZm9cblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLmluZm8oJ2ZvbGRlci9hdmF0YXIxLnBuZycpXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGluZm8ocGF0aCkge1xuXHRcdHZhciBfdGhpczEwID0gdGhpcztcblx0XHRjb25zdCBfcGF0aCA9IF90aGlzMTAuX2dldEZpbmFsUGF0aChwYXRoKTtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogcmVjdXJzaXZlVG9DYW1lbChhd2FpdCBnZXQoX3RoaXMxMC5mZXRjaCwgYCR7X3RoaXMxMC51cmx9L29iamVjdC9pbmZvLyR7X3BhdGh9YCwgeyBoZWFkZXJzOiBfdGhpczEwLmhlYWRlcnMgfSkpLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzMTAuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIENoZWNrcyB0aGUgZXhpc3RlbmNlIG9mIGEgZmlsZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gcGF0aCBUaGUgZmlsZSBwYXRoLCBpbmNsdWRpbmcgdGhlIGZpbGUgbmFtZS4gRm9yIGV4YW1wbGUgYGZvbGRlci9pbWFnZS5wbmdgLlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIGJvb2xlYW4gaW5kaWNhdGluZyBmaWxlIGV4aXN0ZW5jZSBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgQ2hlY2sgZmlsZSBleGlzdGVuY2Vcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLmV4aXN0cygnZm9sZGVyL2F2YXRhcjEucG5nJylcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgZXhpc3RzKHBhdGgpIHtcblx0XHR2YXIgX3RoaXMxMSA9IHRoaXM7XG5cdFx0Y29uc3QgX3BhdGggPSBfdGhpczExLl9nZXRGaW5hbFBhdGgocGF0aCk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IGhlYWQoX3RoaXMxMS5mZXRjaCwgYCR7X3RoaXMxMS51cmx9L29iamVjdC8ke19wYXRofWAsIHsgaGVhZGVyczogX3RoaXMxMS5oZWFkZXJzIH0pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogdHJ1ZSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczExLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpICYmIGVycm9yIGluc3RhbmNlb2YgU3RvcmFnZVVua25vd25FcnJvcikge1xuXHRcdFx0XHRjb25zdCBvcmlnaW5hbEVycm9yID0gZXJyb3Iub3JpZ2luYWxFcnJvcjtcblx0XHRcdFx0aWYgKFs0MDAsIDQwNF0uaW5jbHVkZXMob3JpZ2luYWxFcnJvciA9PT0gbnVsbCB8fCBvcmlnaW5hbEVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcmlnaW5hbEVycm9yLnN0YXR1cykpIHJldHVybiB7XG5cdFx0XHRcdFx0ZGF0YTogZmFsc2UsXG5cdFx0XHRcdFx0ZXJyb3Jcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBBIHNpbXBsZSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0byBnZXQgdGhlIFVSTCBmb3IgYW4gYXNzZXQgaW4gYSBwdWJsaWMgYnVja2V0LiBJZiB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoaXMgZnVuY3Rpb24sIHlvdSBjYW4gY29uc3RydWN0IHRoZSBwdWJsaWMgVVJMIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGJ1Y2tldCBVUkwgd2l0aCB0aGUgcGF0aCB0byB0aGUgYXNzZXQuXG5cdCogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB2ZXJpZnkgaWYgdGhlIGJ1Y2tldCBpcyBwdWJsaWMuIElmIGEgcHVibGljIFVSTCBpcyBjcmVhdGVkIGZvciBhIGJ1Y2tldCB3aGljaCBpcyBub3QgcHVibGljLCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBkb3dubG9hZCB0aGUgYXNzZXQuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIHBhdGggVGhlIHBhdGggYW5kIG5hbWUgb2YgdGhlIGZpbGUgdG8gZ2VuZXJhdGUgdGhlIHB1YmxpYyBVUkwgZm9yLiBGb3IgZXhhbXBsZSBgZm9sZGVyL2ltYWdlLnBuZ2AuXG5cdCogQHBhcmFtIG9wdGlvbnMuZG93bmxvYWQgVHJpZ2dlcnMgdGhlIGZpbGUgYXMgYSBkb3dubG9hZCBpZiBzZXQgdG8gdHJ1ZS4gU2V0IHRoaXMgcGFyYW1ldGVyIGFzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGlmIHlvdSB3YW50IHRvIHRyaWdnZXIgdGhlIGRvd25sb2FkIHdpdGggYSBkaWZmZXJlbnQgZmlsZW5hbWUuXG5cdCogQHBhcmFtIG9wdGlvbnMudHJhbnNmb3JtIFRyYW5zZm9ybSB0aGUgYXNzZXQgYmVmb3JlIHNlcnZpbmcgaXQgdG8gdGhlIGNsaWVudC5cblx0KiBAcmV0dXJucyBPYmplY3Qgd2l0aCBwdWJsaWMgVVJMXG5cdCpcblx0KiBAZXhhbXBsZSBSZXR1cm5zIHRoZSBVUkwgZm9yIGFuIGFzc2V0IGluIGEgcHVibGljIGJ1Y2tldFxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhIH0gPSBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdwdWJsaWMtYnVja2V0Jylcblx0KiAgIC5nZXRQdWJsaWNVcmwoJ2ZvbGRlci9hdmF0YXIxLnBuZycpXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IHtcblx0KiAgICAgXCJwdWJsaWNVcmxcIjogXCJodHRwczovL2V4YW1wbGUuc3VwYWJhc2UuY28vc3RvcmFnZS92MS9vYmplY3QvcHVibGljL3B1YmxpYy1idWNrZXQvZm9sZGVyL2F2YXRhcjEucG5nXCJcblx0KiAgIH1cblx0KiB9XG5cdCogYGBgXG5cdCpcblx0KiBAZXhhbXBsZSBSZXR1cm5zIHRoZSBVUkwgZm9yIGFuIGFzc2V0IGluIGEgcHVibGljIGJ1Y2tldCB3aXRoIHRyYW5zZm9ybWF0aW9uc1xuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhIH0gPSBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdwdWJsaWMtYnVja2V0Jylcblx0KiAgIC5nZXRQdWJsaWNVcmwoJ2ZvbGRlci9hdmF0YXIxLnBuZycsIHtcblx0KiAgICAgdHJhbnNmb3JtOiB7XG5cdCogICAgICAgd2lkdGg6IDEwMCxcblx0KiAgICAgICBoZWlnaHQ6IDEwMCxcblx0KiAgICAgfVxuXHQqICAgfSlcblx0KiBgYGBcblx0KlxuXHQqIEBleGFtcGxlIFJldHVybnMgdGhlIFVSTCB3aGljaCB0cmlnZ2VycyB0aGUgZG93bmxvYWQgb2YgYW4gYXNzZXQgaW4gYSBwdWJsaWMgYnVja2V0XG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEgfSA9IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ3B1YmxpYy1idWNrZXQnKVxuXHQqICAgLmdldFB1YmxpY1VybCgnZm9sZGVyL2F2YXRhcjEucG5nJywge1xuXHQqICAgICBkb3dubG9hZDogdHJ1ZSxcblx0KiAgIH0pXG5cdCogYGBgXG5cdCovXG5cdGdldFB1YmxpY1VybChwYXRoLCBvcHRpb25zKSB7XG5cdFx0Y29uc3QgX3BhdGggPSB0aGlzLl9nZXRGaW5hbFBhdGgocGF0aCk7XG5cdFx0Y29uc3QgX3F1ZXJ5U3RyaW5nID0gW107XG5cdFx0Y29uc3QgZG93bmxvYWRRdWVyeVBhcmFtID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kb3dubG9hZCkgPyBgZG93bmxvYWQ9JHtvcHRpb25zLmRvd25sb2FkID09PSB0cnVlID8gXCJcIiA6IG9wdGlvbnMuZG93bmxvYWR9YCA6IFwiXCI7XG5cdFx0aWYgKGRvd25sb2FkUXVlcnlQYXJhbSAhPT0gXCJcIikgX3F1ZXJ5U3RyaW5nLnB1c2goZG93bmxvYWRRdWVyeVBhcmFtKTtcblx0XHRjb25zdCByZW5kZXJQYXRoID0gdHlwZW9mIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHJhbnNmb3JtKSAhPT0gXCJ1bmRlZmluZWRcIiA/IFwicmVuZGVyL2ltYWdlXCIgOiBcIm9iamVjdFwiO1xuXHRcdGNvbnN0IHRyYW5zZm9ybWF0aW9uUXVlcnkgPSB0aGlzLnRyYW5zZm9ybU9wdHNUb1F1ZXJ5U3RyaW5nKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudHJhbnNmb3JtKSB8fCB7fSk7XG5cdFx0aWYgKHRyYW5zZm9ybWF0aW9uUXVlcnkgIT09IFwiXCIpIF9xdWVyeVN0cmluZy5wdXNoKHRyYW5zZm9ybWF0aW9uUXVlcnkpO1xuXHRcdGxldCBxdWVyeVN0cmluZyA9IF9xdWVyeVN0cmluZy5qb2luKFwiJlwiKTtcblx0XHRpZiAocXVlcnlTdHJpbmcgIT09IFwiXCIpIHF1ZXJ5U3RyaW5nID0gYD8ke3F1ZXJ5U3RyaW5nfWA7XG5cdFx0cmV0dXJuIHsgZGF0YTogeyBwdWJsaWNVcmw6IGVuY29kZVVSSShgJHt0aGlzLnVybH0vJHtyZW5kZXJQYXRofS9wdWJsaWMvJHtfcGF0aH0ke3F1ZXJ5U3RyaW5nfWApIH0gfTtcblx0fVxuXHQvKipcblx0KiBEZWxldGVzIGZpbGVzIHdpdGhpbiB0aGUgc2FtZSBidWNrZXRcblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gcGF0aHMgQW4gYXJyYXkgb2YgZmlsZXMgdG8gZGVsZXRlLCBpbmNsdWRpbmcgdGhlIHBhdGggYW5kIGZpbGUgbmFtZS4gRm9yIGV4YW1wbGUgW2AnZm9sZGVyL2ltYWdlLnBuZydgXS5cblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBhcnJheSBvZiBkZWxldGVkIGZpbGUgb2JqZWN0cyBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgRGVsZXRlIGZpbGVcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLnJlbW92ZShbJ2ZvbGRlci9hdmF0YXIxLnBuZyddKVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiBbXSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgcmVtb3ZlKHBhdGhzKSB7XG5cdFx0dmFyIF90aGlzMTIgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCByZW1vdmUoX3RoaXMxMi5mZXRjaCwgYCR7X3RoaXMxMi51cmx9L29iamVjdC8ke190aGlzMTIuYnVja2V0SWR9YCwgeyBwcmVmaXhlczogcGF0aHMgfSwgeyBoZWFkZXJzOiBfdGhpczEyLmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMxMi5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogR2V0IGZpbGUgbWV0YWRhdGFcblx0KiBAcGFyYW0gaWQgdGhlIGZpbGUgaWQgdG8gcmV0cmlldmUgbWV0YWRhdGFcblx0Ki9cblx0LyoqXG5cdCogVXBkYXRlIGZpbGUgbWV0YWRhdGFcblx0KiBAcGFyYW0gaWQgdGhlIGZpbGUgaWQgdG8gdXBkYXRlIG1ldGFkYXRhXG5cdCogQHBhcmFtIG1ldGEgdGhlIG5ldyBmaWxlIG1ldGFkYXRhXG5cdCovXG5cdC8qKlxuXHQqIExpc3RzIGFsbCB0aGUgZmlsZXMgYW5kIGZvbGRlcnMgd2l0aGluIGEgcGF0aCBvZiB0aGUgYnVja2V0LlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBwYXRoIFRoZSBmb2xkZXIgcGF0aC5cblx0KiBAcGFyYW0gb3B0aW9ucyBTZWFyY2ggb3B0aW9ucyBpbmNsdWRpbmcgbGltaXQgKGRlZmF1bHRzIHRvIDEwMCksIG9mZnNldCwgc29ydEJ5LCBhbmQgc2VhcmNoXG5cdCogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgZmV0Y2ggcGFyYW1ldGVycyBpbmNsdWRpbmcgc2lnbmFsIGZvciBjYW5jZWxsYXRpb25cblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBhcnJheSBvZiBmaWxlcyBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgTGlzdCBmaWxlcyBpbiBhIGJ1Y2tldFxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAubGlzdCgnZm9sZGVyJywge1xuXHQqICAgICBsaW1pdDogMTAwLFxuXHQqICAgICBvZmZzZXQ6IDAsXG5cdCogICAgIHNvcnRCeTogeyBjb2x1bW46ICduYW1lJywgb3JkZXI6ICdhc2MnIH0sXG5cdCogICB9KVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiBbXG5cdCogICAgIHtcblx0KiAgICAgICBcIm5hbWVcIjogXCJhdmF0YXIxLnBuZ1wiLFxuXHQqICAgICAgIFwiaWRcIjogXCJlNjY4Y2Y3Zi04MjFiLTRhMmYtOWRjZS03ZGZhNWRkMWNmZDJcIixcblx0KiAgICAgICBcInVwZGF0ZWRfYXRcIjogXCIyMDI0LTA1LTIyVDIzOjA2OjA1LjU4MFpcIixcblx0KiAgICAgICBcImNyZWF0ZWRfYXRcIjogXCIyMDI0LTA1LTIyVDIzOjA0OjM0LjQ0M1pcIixcblx0KiAgICAgICBcImxhc3RfYWNjZXNzZWRfYXRcIjogXCIyMDI0LTA1LTIyVDIzOjA0OjM0LjQ0M1pcIixcblx0KiAgICAgICBcIm1ldGFkYXRhXCI6IHtcblx0KiAgICAgICAgIFwiZVRhZ1wiOiBcIlxcXCJjNWU4YzU1MzIzNWQ5YWYzMGVmNGY2ZTI4MDc5MGI5MlxcXCJcIixcblx0KiAgICAgICAgIFwic2l6ZVwiOiAzMjE3NSxcblx0KiAgICAgICAgIFwibWltZXR5cGVcIjogXCJpbWFnZS9wbmdcIixcblx0KiAgICAgICAgIFwiY2FjaGVDb250cm9sXCI6IFwibWF4LWFnZT0zNjAwXCIsXG5cdCogICAgICAgICBcImxhc3RNb2RpZmllZFwiOiBcIjIwMjQtMDUtMjJUMjM6MDY6MDUuNTc0WlwiLFxuXHQqICAgICAgICAgXCJjb250ZW50TGVuZ3RoXCI6IDMyMTc1LFxuXHQqICAgICAgICAgXCJodHRwU3RhdHVzQ29kZVwiOiAyMDBcblx0KiAgICAgICB9XG5cdCogICAgIH1cblx0KiAgIF0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCpcblx0KiBAZXhhbXBsZSBTZWFyY2ggZmlsZXMgaW4gYSBidWNrZXRcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLmxpc3QoJ2ZvbGRlcicsIHtcblx0KiAgICAgbGltaXQ6IDEwMCxcblx0KiAgICAgb2Zmc2V0OiAwLFxuXHQqICAgICBzb3J0Qnk6IHsgY29sdW1uOiAnbmFtZScsIG9yZGVyOiAnYXNjJyB9LFxuXHQqICAgICBzZWFyY2g6ICdqb24nXG5cdCogICB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBsaXN0KHBhdGgsIG9wdGlvbnMsIHBhcmFtZXRlcnMpIHtcblx0XHR2YXIgX3RoaXMxMyA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGJvZHkgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9TRUFSQ0hfT1BUSU9OUyksIG9wdGlvbnMpLCB7fSwgeyBwcmVmaXg6IHBhdGggfHwgXCJcIiB9KTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QkMShfdGhpczEzLmZldGNoLCBgJHtfdGhpczEzLnVybH0vb2JqZWN0L2xpc3QvJHtfdGhpczEzLmJ1Y2tldElkfWAsIGJvZHksIHsgaGVhZGVyczogX3RoaXMxMy5oZWFkZXJzIH0sIHBhcmFtZXRlcnMpLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzMTMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIEBleHBlcmltZW50YWwgdGhpcyBtZXRob2Qgc2lnbmF0dXJlIG1pZ2h0IGNoYW5nZSBpbiB0aGUgZnV0dXJlXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgc2VhcmNoIG9wdGlvbnNcblx0KiBAcGFyYW0gcGFyYW1ldGVyc1xuXHQqL1xuXHRhc3luYyBsaXN0VjIob3B0aW9ucywgcGFyYW1ldGVycykge1xuXHRcdHZhciBfdGhpczE0ID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgYm9keSA9IF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QkMShfdGhpczE0LmZldGNoLCBgJHtfdGhpczE0LnVybH0vb2JqZWN0L2xpc3QtdjIvJHtfdGhpczE0LmJ1Y2tldElkfWAsIGJvZHksIHsgaGVhZGVyczogX3RoaXMxNC5oZWFkZXJzIH0sIHBhcmFtZXRlcnMpLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzMTQuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdGVuY29kZU1ldGFkYXRhKG1ldGFkYXRhKSB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKTtcblx0fVxuXHR0b0Jhc2U2NChkYXRhKSB7XG5cdFx0aWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBCdWZmZXIuZnJvbShkYXRhKS50b1N0cmluZyhcImJhc2U2NFwiKTtcblx0XHRyZXR1cm4gYnRvYShkYXRhKTtcblx0fVxuXHRfZ2V0RmluYWxQYXRoKHBhdGgpIHtcblx0XHRyZXR1cm4gYCR7dGhpcy5idWNrZXRJZH0vJHtwYXRoLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YDtcblx0fVxuXHRfcmVtb3ZlRW1wdHlGb2xkZXJzKHBhdGgpIHtcblx0XHRyZXR1cm4gcGF0aC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIikucmVwbGFjZSgvXFwvKy9nLCBcIi9cIik7XG5cdH1cblx0dHJhbnNmb3JtT3B0c1RvUXVlcnlTdHJpbmcodHJhbnNmb3JtKSB7XG5cdFx0Y29uc3QgcGFyYW1zID0gW107XG5cdFx0aWYgKHRyYW5zZm9ybS53aWR0aCkgcGFyYW1zLnB1c2goYHdpZHRoPSR7dHJhbnNmb3JtLndpZHRofWApO1xuXHRcdGlmICh0cmFuc2Zvcm0uaGVpZ2h0KSBwYXJhbXMucHVzaChgaGVpZ2h0PSR7dHJhbnNmb3JtLmhlaWdodH1gKTtcblx0XHRpZiAodHJhbnNmb3JtLnJlc2l6ZSkgcGFyYW1zLnB1c2goYHJlc2l6ZT0ke3RyYW5zZm9ybS5yZXNpemV9YCk7XG5cdFx0aWYgKHRyYW5zZm9ybS5mb3JtYXQpIHBhcmFtcy5wdXNoKGBmb3JtYXQ9JHt0cmFuc2Zvcm0uZm9ybWF0fWApO1xuXHRcdGlmICh0cmFuc2Zvcm0ucXVhbGl0eSkgcGFyYW1zLnB1c2goYHF1YWxpdHk9JHt0cmFuc2Zvcm0ucXVhbGl0eX1gKTtcblx0XHRyZXR1cm4gcGFyYW1zLmpvaW4oXCImXCIpO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL3ZlcnNpb24udHNcbmNvbnN0IHZlcnNpb24gPSBcIjIuODguMFwiO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL2NvbnN0YW50cy50c1xuY29uc3QgREVGQVVMVF9IRUFERVJTJDEgPSB7IFwiWC1DbGllbnQtSW5mb1wiOiBgc3RvcmFnZS1qcy8ke3ZlcnNpb259YCB9O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvcGFja2FnZXMvU3RvcmFnZUJ1Y2tldEFwaS50c1xudmFyIFN0b3JhZ2VCdWNrZXRBcGkgPSBjbGFzcyB7XG5cdGNvbnN0cnVjdG9yKHVybCwgaGVhZGVycyA9IHt9LCBmZXRjaCQxLCBvcHRzKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSBmYWxzZTtcblx0XHRjb25zdCBiYXNlVXJsID0gbmV3IFVSTCh1cmwpO1xuXHRcdGlmIChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMudXNlTmV3SG9zdG5hbWUpIHtcblx0XHRcdGlmICgvc3VwYWJhc2VcXC4oY298aW58cmVkKSQvLnRlc3QoYmFzZVVybC5ob3N0bmFtZSkgJiYgIWJhc2VVcmwuaG9zdG5hbWUuaW5jbHVkZXMoXCJzdG9yYWdlLnN1cGFiYXNlLlwiKSkgYmFzZVVybC5ob3N0bmFtZSA9IGJhc2VVcmwuaG9zdG5hbWUucmVwbGFjZShcInN1cGFiYXNlLlwiLCBcInN0b3JhZ2Uuc3VwYWJhc2UuXCIpO1xuXHRcdH1cblx0XHR0aGlzLnVybCA9IGJhc2VVcmwuaHJlZi5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG5cdFx0dGhpcy5oZWFkZXJzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERFRkFVTFRfSEVBREVSUyQxKSwgaGVhZGVycyk7XG5cdFx0dGhpcy5mZXRjaCA9IHJlc29sdmVGZXRjaCQxKGZldGNoJDEpO1xuXHR9XG5cdC8qKlxuXHQqIEVuYWJsZSB0aHJvd2luZyBlcnJvcnMgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlbS5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0Ki9cblx0dGhyb3dPbkVycm9yKCkge1xuXHRcdHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yID0gdHJ1ZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBSZXRyaWV2ZXMgdGhlIGRldGFpbHMgb2YgYWxsIFN0b3JhZ2UgYnVja2V0cyB3aXRoaW4gYW4gZXhpc3RpbmcgcHJvamVjdC5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gb3B0aW9ucyBRdWVyeSBwYXJhbWV0ZXJzIGZvciBsaXN0aW5nIGJ1Y2tldHNcblx0KiBAcGFyYW0gb3B0aW9ucy5saW1pdCBNYXhpbXVtIG51bWJlciBvZiBidWNrZXRzIHRvIHJldHVyblxuXHQqIEBwYXJhbSBvcHRpb25zLm9mZnNldCBOdW1iZXIgb2YgYnVja2V0cyB0byBza2lwXG5cdCogQHBhcmFtIG9wdGlvbnMuc29ydENvbHVtbiBDb2x1bW4gdG8gc29ydCBieSAoJ2lkJywgJ25hbWUnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0Jylcblx0KiBAcGFyYW0gb3B0aW9ucy5zb3J0T3JkZXIgU29ydCBvcmRlciAoJ2FzYycgb3IgJ2Rlc2MnKVxuXHQqIEBwYXJhbSBvcHRpb25zLnNlYXJjaCBTZWFyY2ggdGVybSB0byBmaWx0ZXIgYnVja2V0IG5hbWVzXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgYXJyYXkgb2YgYnVja2V0cyBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgTGlzdCBidWNrZXRzXG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5saXN0QnVja2V0cygpXG5cdCogYGBgXG5cdCpcblx0KiBAZXhhbXBsZSBMaXN0IGJ1Y2tldHMgd2l0aCBvcHRpb25zXG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5saXN0QnVja2V0cyh7XG5cdCogICAgIGxpbWl0OiAxMCxcblx0KiAgICAgb2Zmc2V0OiAwLFxuXHQqICAgICBzb3J0Q29sdW1uOiAnY3JlYXRlZF9hdCcsXG5cdCogICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuXHQqICAgICBzZWFyY2g6ICdwcm9kJ1xuXHQqICAgfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgbGlzdEJ1Y2tldHMob3B0aW9ucykge1xuXHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHF1ZXJ5U3RyaW5nID0gX3RoaXMubGlzdEJ1Y2tldE9wdGlvbnNUb1F1ZXJ5U3RyaW5nKG9wdGlvbnMpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgZ2V0KF90aGlzLmZldGNoLCBgJHtfdGhpcy51cmx9L2J1Y2tldCR7cXVlcnlTdHJpbmd9YCwgeyBoZWFkZXJzOiBfdGhpcy5oZWFkZXJzIH0pLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBSZXRyaWV2ZXMgdGhlIGRldGFpbHMgb2YgYW4gZXhpc3RpbmcgU3RvcmFnZSBidWNrZXQuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYnVja2V0IHlvdSB3b3VsZCBsaWtlIHRvIHJldHJpZXZlLlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIGJ1Y2tldCBkZXRhaWxzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBHZXQgYnVja2V0XG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5nZXRCdWNrZXQoJ2F2YXRhcnMnKVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiB7XG5cdCogICAgIFwiaWRcIjogXCJhdmF0YXJzXCIsXG5cdCogICAgIFwibmFtZVwiOiBcImF2YXRhcnNcIixcblx0KiAgICAgXCJvd25lclwiOiBcIlwiLFxuXHQqICAgICBcInB1YmxpY1wiOiBmYWxzZSxcblx0KiAgICAgXCJmaWxlX3NpemVfbGltaXRcIjogMTAyNCxcblx0KiAgICAgXCJhbGxvd2VkX21pbWVfdHlwZXNcIjogW1xuXHQqICAgICAgIFwiaW1hZ2UvcG5nXCJcblx0KiAgICAgXSxcblx0KiAgICAgXCJjcmVhdGVkX2F0XCI6IFwiMjAyNC0wNS0yMlQyMjoyNjowNS4xMDBaXCIsXG5cdCogICAgIFwidXBkYXRlZF9hdFwiOiBcIjIwMjQtMDUtMjJUMjI6MjY6MDUuMTAwWlwiXG5cdCogICB9LFxuXHQqICAgXCJlcnJvclwiOiBudWxsXG5cdCogfVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBnZXRCdWNrZXQoaWQpIHtcblx0XHR2YXIgX3RoaXMyID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgZ2V0KF90aGlzMi5mZXRjaCwgYCR7X3RoaXMyLnVybH0vYnVja2V0LyR7aWR9YCwgeyBoZWFkZXJzOiBfdGhpczIuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczIuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIENyZWF0ZXMgYSBuZXcgU3RvcmFnZSBidWNrZXRcblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gaWQgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGJ1Y2tldCB5b3UgYXJlIGNyZWF0aW5nLlxuXHQqIEBwYXJhbSBvcHRpb25zLnB1YmxpYyBUaGUgdmlzaWJpbGl0eSBvZiB0aGUgYnVja2V0LiBQdWJsaWMgYnVja2V0cyBkb24ndCByZXF1aXJlIGFuIGF1dGhvcml6YXRpb24gdG9rZW4gdG8gZG93bmxvYWQgb2JqZWN0cywgYnV0IHN0aWxsIHJlcXVpcmUgYSB2YWxpZCB0b2tlbiBmb3IgYWxsIG90aGVyIG9wZXJhdGlvbnMuIEJ5IGRlZmF1bHQsIGJ1Y2tldHMgYXJlIHByaXZhdGUuXG5cdCogQHBhcmFtIG9wdGlvbnMuZmlsZVNpemVMaW1pdCBzcGVjaWZpZXMgdGhlIG1heCBmaWxlIHNpemUgaW4gYnl0ZXMgdGhhdCBjYW4gYmUgdXBsb2FkZWQgdG8gdGhpcyBidWNrZXQuXG5cdCogVGhlIGdsb2JhbCBmaWxlIHNpemUgbGltaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuXG5cdCogVGhlIGRlZmF1bHQgdmFsdWUgaXMgbnVsbCwgd2hpY2ggZG9lc24ndCBzZXQgYSBwZXIgYnVja2V0IGZpbGUgc2l6ZSBsaW1pdC5cblx0KiBAcGFyYW0gb3B0aW9ucy5hbGxvd2VkTWltZVR5cGVzIHNwZWNpZmllcyB0aGUgYWxsb3dlZCBtaW1lIHR5cGVzIHRoYXQgdGhpcyBidWNrZXQgY2FuIGFjY2VwdCBkdXJpbmcgdXBsb2FkLlxuXHQqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwsIHdoaWNoIGFsbG93cyBmaWxlcyB3aXRoIGFsbCBtaW1lIHR5cGVzIHRvIGJlIHVwbG9hZGVkLlxuXHQqIEVhY2ggbWltZSB0eXBlIHNwZWNpZmllZCBjYW4gYmUgYSB3aWxkY2FyZCwgZS5nLiBpbWFnZS8qLCBvciBhIHNwZWNpZmljIG1pbWUgdHlwZSwgZS5nLiBpbWFnZS9wbmcuXG5cdCogQHBhcmFtIG9wdGlvbnMudHlwZSAocHJpdmF0ZS1iZXRhKSBzcGVjaWZpZXMgdGhlIGJ1Y2tldCB0eXBlLiBzZWUgYEJ1Y2tldFR5cGVgIGZvciBtb3JlIGRldGFpbHMuXG5cdCogICAtIGRlZmF1bHQgYnVja2V0IHR5cGUgaXMgYFNUQU5EQVJEYFxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIG5ld2x5IGNyZWF0ZWQgYnVja2V0IG5hbWUgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIENyZWF0ZSBidWNrZXRcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmNyZWF0ZUJ1Y2tldCgnYXZhdGFycycsIHtcblx0KiAgICAgcHVibGljOiBmYWxzZSxcblx0KiAgICAgYWxsb3dlZE1pbWVUeXBlczogWydpbWFnZS9wbmcnXSxcblx0KiAgICAgZmlsZVNpemVMaW1pdDogMTAyNFxuXHQqICAgfSlcblx0KiBgYGBcblx0KlxuXHQqIFJlc3BvbnNlOlxuXHQqIGBgYGpzb25cblx0KiB7XG5cdCogICBcImRhdGFcIjoge1xuXHQqICAgICBcIm5hbWVcIjogXCJhdmF0YXJzXCJcblx0KiAgIH0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGNyZWF0ZUJ1Y2tldChpZCwgb3B0aW9ucyA9IHsgcHVibGljOiBmYWxzZSB9KSB7XG5cdFx0dmFyIF90aGlzMyA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QkMShfdGhpczMuZmV0Y2gsIGAke190aGlzMy51cmx9L2J1Y2tldGAsIHtcblx0XHRcdFx0XHRpZCxcblx0XHRcdFx0XHRuYW1lOiBpZCxcblx0XHRcdFx0XHR0eXBlOiBvcHRpb25zLnR5cGUsXG5cdFx0XHRcdFx0cHVibGljOiBvcHRpb25zLnB1YmxpYyxcblx0XHRcdFx0XHRmaWxlX3NpemVfbGltaXQ6IG9wdGlvbnMuZmlsZVNpemVMaW1pdCxcblx0XHRcdFx0XHRhbGxvd2VkX21pbWVfdHlwZXM6IG9wdGlvbnMuYWxsb3dlZE1pbWVUeXBlc1xuXHRcdFx0XHR9LCB7IGhlYWRlcnM6IF90aGlzMy5oZWFkZXJzIH0pLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzMy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogVXBkYXRlcyBhIFN0b3JhZ2UgYnVja2V0XG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIGlkIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBidWNrZXQgeW91IGFyZSB1cGRhdGluZy5cblx0KiBAcGFyYW0gb3B0aW9ucy5wdWJsaWMgVGhlIHZpc2liaWxpdHkgb2YgdGhlIGJ1Y2tldC4gUHVibGljIGJ1Y2tldHMgZG9uJ3QgcmVxdWlyZSBhbiBhdXRob3JpemF0aW9uIHRva2VuIHRvIGRvd25sb2FkIG9iamVjdHMsIGJ1dCBzdGlsbCByZXF1aXJlIGEgdmFsaWQgdG9rZW4gZm9yIGFsbCBvdGhlciBvcGVyYXRpb25zLlxuXHQqIEBwYXJhbSBvcHRpb25zLmZpbGVTaXplTGltaXQgc3BlY2lmaWVzIHRoZSBtYXggZmlsZSBzaXplIGluIGJ5dGVzIHRoYXQgY2FuIGJlIHVwbG9hZGVkIHRvIHRoaXMgYnVja2V0LlxuXHQqIFRoZSBnbG9iYWwgZmlsZSBzaXplIGxpbWl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGlzIHZhbHVlLlxuXHQqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwsIHdoaWNoIGRvZXNuJ3Qgc2V0IGEgcGVyIGJ1Y2tldCBmaWxlIHNpemUgbGltaXQuXG5cdCogQHBhcmFtIG9wdGlvbnMuYWxsb3dlZE1pbWVUeXBlcyBzcGVjaWZpZXMgdGhlIGFsbG93ZWQgbWltZSB0eXBlcyB0aGF0IHRoaXMgYnVja2V0IGNhbiBhY2NlcHQgZHVyaW5nIHVwbG9hZC5cblx0KiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBudWxsLCB3aGljaCBhbGxvd3MgZmlsZXMgd2l0aCBhbGwgbWltZSB0eXBlcyB0byBiZSB1cGxvYWRlZC5cblx0KiBFYWNoIG1pbWUgdHlwZSBzcGVjaWZpZWQgY2FuIGJlIGEgd2lsZGNhcmQsIGUuZy4gaW1hZ2UvKiwgb3IgYSBzcGVjaWZpYyBtaW1lIHR5cGUsIGUuZy4gaW1hZ2UvcG5nLlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIHN1Y2Nlc3MgbWVzc2FnZSBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgVXBkYXRlIGJ1Y2tldFxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAudXBkYXRlQnVja2V0KCdhdmF0YXJzJywge1xuXHQqICAgICBwdWJsaWM6IGZhbHNlLFxuXHQqICAgICBhbGxvd2VkTWltZVR5cGVzOiBbJ2ltYWdlL3BuZyddLFxuXHQqICAgICBmaWxlU2l6ZUxpbWl0OiAxMDI0XG5cdCogICB9KVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiB7XG5cdCogICAgIFwibWVzc2FnZVwiOiBcIlN1Y2Nlc3NmdWxseSB1cGRhdGVkXCJcblx0KiAgIH0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIHVwZGF0ZUJ1Y2tldChpZCwgb3B0aW9ucykge1xuXHRcdHZhciBfdGhpczQgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwdXQoX3RoaXM0LmZldGNoLCBgJHtfdGhpczQudXJsfS9idWNrZXQvJHtpZH1gLCB7XG5cdFx0XHRcdFx0aWQsXG5cdFx0XHRcdFx0bmFtZTogaWQsXG5cdFx0XHRcdFx0cHVibGljOiBvcHRpb25zLnB1YmxpYyxcblx0XHRcdFx0XHRmaWxlX3NpemVfbGltaXQ6IG9wdGlvbnMuZmlsZVNpemVMaW1pdCxcblx0XHRcdFx0XHRhbGxvd2VkX21pbWVfdHlwZXM6IG9wdGlvbnMuYWxsb3dlZE1pbWVUeXBlc1xuXHRcdFx0XHR9LCB7IGhlYWRlcnM6IF90aGlzNC5oZWFkZXJzIH0pLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzNC5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogUmVtb3ZlcyBhbGwgb2JqZWN0cyBpbnNpZGUgYSBzaW5nbGUgYnVja2V0LlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBpZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGJ1Y2tldCB5b3Ugd291bGQgbGlrZSB0byBlbXB0eS5cblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBFbXB0eSBidWNrZXRcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmVtcHR5QnVja2V0KCdhdmF0YXJzJylcblx0KiBgYGBcblx0KlxuXHQqIFJlc3BvbnNlOlxuXHQqIGBgYGpzb25cblx0KiB7XG5cdCogICBcImRhdGFcIjoge1xuXHQqICAgICBcIm1lc3NhZ2VcIjogXCJTdWNjZXNzZnVsbHkgZW1wdGllZFwiXG5cdCogICB9LFxuXHQqICAgXCJlcnJvclwiOiBudWxsXG5cdCogfVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBlbXB0eUJ1Y2tldChpZCkge1xuXHRcdHZhciBfdGhpczUgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwb3N0JDEoX3RoaXM1LmZldGNoLCBgJHtfdGhpczUudXJsfS9idWNrZXQvJHtpZH0vZW1wdHlgLCB7fSwgeyBoZWFkZXJzOiBfdGhpczUuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczUuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIERlbGV0ZXMgYW4gZXhpc3RpbmcgYnVja2V0LiBBIGJ1Y2tldCBjYW4ndCBiZSBkZWxldGVkIHdpdGggZXhpc3Rpbmcgb2JqZWN0cyBpbnNpZGUgaXQuXG5cdCogWW91IG11c3QgZmlyc3QgYGVtcHR5KClgIHRoZSBidWNrZXQuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYnVja2V0IHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZS5cblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBEZWxldGUgYnVja2V0XG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5kZWxldGVCdWNrZXQoJ2F2YXRhcnMnKVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiB7XG5cdCogICAgIFwibWVzc2FnZVwiOiBcIlN1Y2Nlc3NmdWxseSBkZWxldGVkXCJcblx0KiAgIH0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGRlbGV0ZUJ1Y2tldChpZCkge1xuXHRcdHZhciBfdGhpczYgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCByZW1vdmUoX3RoaXM2LmZldGNoLCBgJHtfdGhpczYudXJsfS9idWNrZXQvJHtpZH1gLCB7fSwgeyBoZWFkZXJzOiBfdGhpczYuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczYuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdGxpc3RCdWNrZXRPcHRpb25zVG9RdWVyeVN0cmluZyhvcHRpb25zKSB7XG5cdFx0Y29uc3QgcGFyYW1zID0ge307XG5cdFx0aWYgKG9wdGlvbnMpIHtcblx0XHRcdGlmIChcImxpbWl0XCIgaW4gb3B0aW9ucykgcGFyYW1zLmxpbWl0ID0gU3RyaW5nKG9wdGlvbnMubGltaXQpO1xuXHRcdFx0aWYgKFwib2Zmc2V0XCIgaW4gb3B0aW9ucykgcGFyYW1zLm9mZnNldCA9IFN0cmluZyhvcHRpb25zLm9mZnNldCk7XG5cdFx0XHRpZiAob3B0aW9ucy5zZWFyY2gpIHBhcmFtcy5zZWFyY2ggPSBvcHRpb25zLnNlYXJjaDtcblx0XHRcdGlmIChvcHRpb25zLnNvcnRDb2x1bW4pIHBhcmFtcy5zb3J0Q29sdW1uID0gb3B0aW9ucy5zb3J0Q29sdW1uO1xuXHRcdFx0aWYgKG9wdGlvbnMuc29ydE9yZGVyKSBwYXJhbXMuc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXI7XG5cdFx0fVxuXHRcdHJldHVybiBPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA+IDAgPyBcIj9cIiArIG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKS50b1N0cmluZygpIDogXCJcIjtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3BhY2thZ2VzL1N0b3JhZ2VBbmFseXRpY3NDbGllbnQudHNcbi8qKlxuKiBDbGllbnQgY2xhc3MgZm9yIG1hbmFnaW5nIEFuYWx5dGljcyBCdWNrZXRzIHVzaW5nIEljZWJlcmcgdGFibGVzXG4qIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBsaXN0aW5nLCBhbmQgZGVsZXRpbmcgYW5hbHl0aWNzIGJ1Y2tldHNcbiovXG52YXIgU3RvcmFnZUFuYWx5dGljc0NsaWVudCA9IGNsYXNzIHtcblx0LyoqXG5cdCogQGFscGhhXG5cdCpcblx0KiBDcmVhdGVzIGEgbmV3IFN0b3JhZ2VBbmFseXRpY3NDbGllbnQgaW5zdGFuY2Vcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgQW5hbHl0aWNzIEJ1Y2tldHNcblx0KiBAcGFyYW0gdXJsIC0gVGhlIGJhc2UgVVJMIGZvciB0aGUgc3RvcmFnZSBBUElcblx0KiBAcGFyYW0gaGVhZGVycyAtIEhUVFAgaGVhZGVycyB0byBpbmNsdWRlIGluIHJlcXVlc3RzXG5cdCogQHBhcmFtIGZldGNoIC0gT3B0aW9uYWwgY3VzdG9tIGZldGNoIGltcGxlbWVudGF0aW9uXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBjbGllbnQgPSBuZXcgU3RvcmFnZUFuYWx5dGljc0NsaWVudCh1cmwsIGhlYWRlcnMpXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKHVybCwgaGVhZGVycyA9IHt9LCBmZXRjaCQxKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSBmYWxzZTtcblx0XHR0aGlzLnVybCA9IHVybC5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG5cdFx0dGhpcy5oZWFkZXJzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERFRkFVTFRfSEVBREVSUyQxKSwgaGVhZGVycyk7XG5cdFx0dGhpcy5mZXRjaCA9IHJlc29sdmVGZXRjaCQxKGZldGNoJDEpO1xuXHR9XG5cdC8qKlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogRW5hYmxlIHRocm93aW5nIGVycm9ycyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGVtIGluIHRoZSByZXNwb25zZVxuXHQqIFdoZW4gZW5hYmxlZCwgZmFpbGVkIG9wZXJhdGlvbnMgd2lsbCB0aHJvdyBpbnN0ZWFkIG9mIHJldHVybmluZyB7IGRhdGE6IG51bGwsIGVycm9yIH1cblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgQW5hbHl0aWNzIEJ1Y2tldHNcblx0KiBAcmV0dXJucyBUaGlzIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmdcblx0Ki9cblx0dGhyb3dPbkVycm9yKCkge1xuXHRcdHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yID0gdHJ1ZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBAYWxwaGFcblx0KlxuXHQqIENyZWF0ZXMgYSBuZXcgYW5hbHl0aWNzIGJ1Y2tldCB1c2luZyBJY2ViZXJnIHRhYmxlc1xuXHQqIEFuYWx5dGljcyBidWNrZXRzIGFyZSBvcHRpbWl6ZWQgZm9yIGFuYWx5dGljYWwgcXVlcmllcyBhbmQgZGF0YSBwcm9jZXNzaW5nXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IEFuYWx5dGljcyBCdWNrZXRzXG5cdCogQHBhcmFtIG5hbWUgQSB1bmlxdWUgbmFtZSBmb3IgdGhlIGJ1Y2tldCB5b3UgYXJlIGNyZWF0aW5nXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgbmV3bHkgY3JlYXRlZCBhbmFseXRpY3MgYnVja2V0IG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBDcmVhdGUgYW5hbHl0aWNzIGJ1Y2tldFxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuYW5hbHl0aWNzXG5cdCogICAuY3JlYXRlQnVja2V0KCdhbmFseXRpY3MtZGF0YScpXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IHtcblx0KiAgICAgXCJuYW1lXCI6IFwiYW5hbHl0aWNzLWRhdGFcIixcblx0KiAgICAgXCJ0eXBlXCI6IFwiQU5BTFlUSUNTXCIsXG5cdCogICAgIFwiZm9ybWF0XCI6IFwiaWNlYmVyZ1wiLFxuXHQqICAgICBcImNyZWF0ZWRfYXRcIjogXCIyMDI0LTA1LTIyVDIyOjI2OjA1LjEwMFpcIixcblx0KiAgICAgXCJ1cGRhdGVkX2F0XCI6IFwiMjAyNC0wNS0yMlQyMjoyNjowNS4xMDBaXCJcblx0KiAgIH0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGNyZWF0ZUJ1Y2tldChuYW1lKSB7XG5cdFx0dmFyIF90aGlzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdCQxKF90aGlzLmZldGNoLCBgJHtfdGhpcy51cmx9L2J1Y2tldGAsIHsgbmFtZSB9LCB7IGhlYWRlcnM6IF90aGlzLmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogUmV0cmlldmVzIHRoZSBkZXRhaWxzIG9mIGFsbCBBbmFseXRpY3MgU3RvcmFnZSBidWNrZXRzIHdpdGhpbiBhbiBleGlzdGluZyBwcm9qZWN0XG5cdCogT25seSByZXR1cm5zIGJ1Y2tldHMgb2YgdHlwZSAnQU5BTFlUSUNTJ1xuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBBbmFseXRpY3MgQnVja2V0c1xuXHQqIEBwYXJhbSBvcHRpb25zIFF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGxpc3RpbmcgYnVja2V0c1xuXHQqIEBwYXJhbSBvcHRpb25zLmxpbWl0IE1heGltdW0gbnVtYmVyIG9mIGJ1Y2tldHMgdG8gcmV0dXJuXG5cdCogQHBhcmFtIG9wdGlvbnMub2Zmc2V0IE51bWJlciBvZiBidWNrZXRzIHRvIHNraXBcblx0KiBAcGFyYW0gb3B0aW9ucy5zb3J0Q29sdW1uIENvbHVtbiB0byBzb3J0IGJ5ICgnbmFtZScsICdjcmVhdGVkX2F0JywgJ3VwZGF0ZWRfYXQnKVxuXHQqIEBwYXJhbSBvcHRpb25zLnNvcnRPcmRlciBTb3J0IG9yZGVyICgnYXNjJyBvciAnZGVzYycpXG5cdCogQHBhcmFtIG9wdGlvbnMuc2VhcmNoIFNlYXJjaCB0ZXJtIHRvIGZpbHRlciBidWNrZXQgbmFtZXNcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBhcnJheSBvZiBhbmFseXRpY3MgYnVja2V0cyBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgTGlzdCBhbmFseXRpY3MgYnVja2V0c1xuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuYW5hbHl0aWNzXG5cdCogICAubGlzdEJ1Y2tldHMoe1xuXHQqICAgICBsaW1pdDogMTAsXG5cdCogICAgIG9mZnNldDogMCxcblx0KiAgICAgc29ydENvbHVtbjogJ2NyZWF0ZWRfYXQnLFxuXHQqICAgICBzb3J0T3JkZXI6ICdkZXNjJ1xuXHQqICAgfSlcblx0KiBgYGBcblx0KlxuXHQqIFJlc3BvbnNlOlxuXHQqIGBgYGpzb25cblx0KiB7XG5cdCogICBcImRhdGFcIjogW1xuXHQqICAgICB7XG5cdCogICAgICAgXCJuYW1lXCI6IFwiYW5hbHl0aWNzLWRhdGFcIixcblx0KiAgICAgICBcInR5cGVcIjogXCJBTkFMWVRJQ1NcIixcblx0KiAgICAgICBcImZvcm1hdFwiOiBcImljZWJlcmdcIixcblx0KiAgICAgICBcImNyZWF0ZWRfYXRcIjogXCIyMDI0LTA1LTIyVDIyOjI2OjA1LjEwMFpcIixcblx0KiAgICAgICBcInVwZGF0ZWRfYXRcIjogXCIyMDI0LTA1LTIyVDIyOjI2OjA1LjEwMFpcIlxuXHQqICAgICB9XG5cdCogICBdLFxuXHQqICAgXCJlcnJvclwiOiBudWxsXG5cdCogfVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBsaXN0QnVja2V0cyhvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzMiA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuXHRcdFx0aWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubGltaXQpICE9PSB2b2lkIDApIHF1ZXJ5UGFyYW1zLnNldChcImxpbWl0XCIsIG9wdGlvbnMubGltaXQudG9TdHJpbmcoKSk7XG5cdFx0XHRpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vZmZzZXQpICE9PSB2b2lkIDApIHF1ZXJ5UGFyYW1zLnNldChcIm9mZnNldFwiLCBvcHRpb25zLm9mZnNldC50b1N0cmluZygpKTtcblx0XHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc29ydENvbHVtbikgcXVlcnlQYXJhbXMuc2V0KFwic29ydENvbHVtblwiLCBvcHRpb25zLnNvcnRDb2x1bW4pO1xuXHRcdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zb3J0T3JkZXIpIHF1ZXJ5UGFyYW1zLnNldChcInNvcnRPcmRlclwiLCBvcHRpb25zLnNvcnRPcmRlcik7XG5cdFx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNlYXJjaCkgcXVlcnlQYXJhbXMuc2V0KFwic2VhcmNoXCIsIG9wdGlvbnMuc2VhcmNoKTtcblx0XHRcdGNvbnN0IHF1ZXJ5U3RyaW5nID0gcXVlcnlQYXJhbXMudG9TdHJpbmcoKTtcblx0XHRcdGNvbnN0IHVybCA9IHF1ZXJ5U3RyaW5nID8gYCR7X3RoaXMyLnVybH0vYnVja2V0PyR7cXVlcnlTdHJpbmd9YCA6IGAke190aGlzMi51cmx9L2J1Y2tldGA7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBnZXQoX3RoaXMyLmZldGNoLCB1cmwsIHsgaGVhZGVyczogX3RoaXMyLmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMyLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBAYWxwaGFcblx0KlxuXHQqIERlbGV0ZXMgYW4gZXhpc3RpbmcgYW5hbHl0aWNzIGJ1Y2tldFxuXHQqIEEgYnVja2V0IGNhbid0IGJlIGRlbGV0ZWQgd2l0aCBleGlzdGluZyBvYmplY3RzIGluc2lkZSBpdFxuXHQqIFlvdSBtdXN0IGZpcnN0IGVtcHR5IHRoZSBidWNrZXQgYmVmb3JlIGRlbGV0aW9uXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IEFuYWx5dGljcyBCdWNrZXRzXG5cdCogQHBhcmFtIGJ1Y2tldE5hbWUgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBidWNrZXQgeW91IHdvdWxkIGxpa2UgdG8gZGVsZXRlXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgc3VjY2VzcyBtZXNzYWdlIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBEZWxldGUgYW5hbHl0aWNzIGJ1Y2tldFxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuYW5hbHl0aWNzXG5cdCogICAuZGVsZXRlQnVja2V0KCdhbmFseXRpY3MtZGF0YScpXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IHtcblx0KiAgICAgXCJtZXNzYWdlXCI6IFwiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcIlxuXHQqICAgfSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgZGVsZXRlQnVja2V0KGJ1Y2tldE5hbWUpIHtcblx0XHR2YXIgX3RoaXMzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcmVtb3ZlKF90aGlzMy5mZXRjaCwgYCR7X3RoaXMzLnVybH0vYnVja2V0LyR7YnVja2V0TmFtZX1gLCB7fSwgeyBoZWFkZXJzOiBfdGhpczMuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogR2V0IGFuIEljZWJlcmcgUkVTVCBDYXRhbG9nIGNsaWVudCBjb25maWd1cmVkIGZvciBhIHNwZWNpZmljIGFuYWx5dGljcyBidWNrZXRcblx0KiBVc2UgdGhpcyB0byBwZXJmb3JtIGFkdmFuY2VkIHRhYmxlIGFuZCBuYW1lc3BhY2Ugb3BlcmF0aW9ucyB3aXRoaW4gdGhlIGJ1Y2tldFxuXHQqIFRoZSByZXR1cm5lZCBjbGllbnQgcHJvdmlkZXMgZnVsbCBhY2Nlc3MgdG8gdGhlIEFwYWNoZSBJY2ViZXJnIFJFU1QgQ2F0YWxvZyBBUElcblx0KiB3aXRoIHRoZSBTdXBhYmFzZSBgeyBkYXRhLCBlcnJvciB9YCBwYXR0ZXJuIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nIG9uIGFsbCBvcGVyYXRpb25zLlxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBBbmFseXRpY3MgQnVja2V0c1xuXHQqIEBwYXJhbSBidWNrZXROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGFuYWx5dGljcyBidWNrZXQgKHdhcmVob3VzZSkgdG8gY29ubmVjdCB0b1xuXHQqIEByZXR1cm5zIFRoZSB3cmFwcGVkIEljZWJlcmcgY2F0YWxvZyBjbGllbnRcblx0KiBAdGhyb3dzIHtTdG9yYWdlRXJyb3J9IElmIHRoZSBidWNrZXQgbmFtZSBpcyBpbnZhbGlkXG5cdCpcblx0KiBAZXhhbXBsZSBHZXQgY2F0YWxvZyBhbmQgY3JlYXRlIHRhYmxlXG5cdCogYGBganNcblx0KiAvLyBGaXJzdCwgY3JlYXRlIGFuIGFuYWx5dGljcyBidWNrZXRcblx0KiBjb25zdCB7IGRhdGE6IGJ1Y2tldCwgZXJyb3I6IGJ1Y2tldEVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5hbmFseXRpY3Ncblx0KiAgIC5jcmVhdGVCdWNrZXQoJ2FuYWx5dGljcy1kYXRhJylcblx0KlxuXHQqIC8vIEdldCB0aGUgSWNlYmVyZyBjYXRhbG9nIGZvciB0aGF0IGJ1Y2tldFxuXHQqIGNvbnN0IGNhdGFsb2cgPSBzdXBhYmFzZS5zdG9yYWdlLmFuYWx5dGljcy5mcm9tKCdhbmFseXRpY3MtZGF0YScpXG5cdCpcblx0KiAvLyBDcmVhdGUgYSBuYW1lc3BhY2Vcblx0KiBjb25zdCB7IGVycm9yOiBuc0Vycm9yIH0gPSBhd2FpdCBjYXRhbG9nLmNyZWF0ZU5hbWVzcGFjZSh7IG5hbWVzcGFjZTogWydkZWZhdWx0J10gfSlcblx0KlxuXHQqIC8vIENyZWF0ZSBhIHRhYmxlIHdpdGggc2NoZW1hXG5cdCogY29uc3QgeyBkYXRhOiB0YWJsZU1ldGFkYXRhLCBlcnJvcjogdGFibGVFcnJvciB9ID0gYXdhaXQgY2F0YWxvZy5jcmVhdGVUYWJsZShcblx0KiAgIHsgbmFtZXNwYWNlOiBbJ2RlZmF1bHQnXSB9LFxuXHQqICAge1xuXHQqICAgICBuYW1lOiAnZXZlbnRzJyxcblx0KiAgICAgc2NoZW1hOiB7XG5cdCogICAgICAgdHlwZTogJ3N0cnVjdCcsXG5cdCogICAgICAgZmllbGRzOiBbXG5cdCogICAgICAgICB7IGlkOiAxLCBuYW1lOiAnaWQnLCB0eXBlOiAnbG9uZycsIHJlcXVpcmVkOiB0cnVlIH0sXG5cdCogICAgICAgICB7IGlkOiAyLCBuYW1lOiAndGltZXN0YW1wJywgdHlwZTogJ3RpbWVzdGFtcCcsIHJlcXVpcmVkOiB0cnVlIH0sXG5cdCogICAgICAgICB7IGlkOiAzLCBuYW1lOiAndXNlcl9pZCcsIHR5cGU6ICdzdHJpbmcnLCByZXF1aXJlZDogZmFsc2UgfVxuXHQqICAgICAgIF0sXG5cdCogICAgICAgJ3NjaGVtYS1pZCc6IDAsXG5cdCogICAgICAgJ2lkZW50aWZpZXItZmllbGQtaWRzJzogWzFdXG5cdCogICAgIH0sXG5cdCogICAgICdwYXJ0aXRpb24tc3BlYyc6IHtcblx0KiAgICAgICAnc3BlYy1pZCc6IDAsXG5cdCogICAgICAgZmllbGRzOiBbXVxuXHQqICAgICB9LFxuXHQqICAgICAnd3JpdGUtb3JkZXInOiB7XG5cdCogICAgICAgJ29yZGVyLWlkJzogMCxcblx0KiAgICAgICBmaWVsZHM6IFtdXG5cdCogICAgIH0sXG5cdCogICAgIHByb3BlcnRpZXM6IHtcblx0KiAgICAgICAnd3JpdGUuZm9ybWF0LmRlZmF1bHQnOiAncGFycXVldCdcblx0KiAgICAgfVxuXHQqICAgfVxuXHQqIClcblx0KiBgYGBcblx0KlxuXHQqIEBleGFtcGxlIExpc3QgdGFibGVzIGluIG5hbWVzcGFjZVxuXHQqIGBgYGpzXG5cdCogY29uc3QgY2F0YWxvZyA9IHN1cGFiYXNlLnN0b3JhZ2UuYW5hbHl0aWNzLmZyb20oJ2FuYWx5dGljcy1kYXRhJylcblx0KlxuXHQqIC8vIExpc3QgYWxsIHRhYmxlcyBpbiB0aGUgZGVmYXVsdCBuYW1lc3BhY2Vcblx0KiBjb25zdCB7IGRhdGE6IHRhYmxlcywgZXJyb3I6IGxpc3RFcnJvciB9ID0gYXdhaXQgY2F0YWxvZy5saXN0VGFibGVzKHsgbmFtZXNwYWNlOiBbJ2RlZmF1bHQnXSB9KVxuXHQqIGlmIChsaXN0RXJyb3IpIHtcblx0KiAgIGlmIChsaXN0RXJyb3IuaXNOb3RGb3VuZCgpKSB7XG5cdCogICAgIGNvbnNvbGUubG9nKCdOYW1lc3BhY2Ugbm90IGZvdW5kJylcblx0KiAgIH1cblx0KiAgIHJldHVyblxuXHQqIH1cblx0KiBjb25zb2xlLmxvZyh0YWJsZXMpIC8vIFt7IG5hbWVzcGFjZTogWydkZWZhdWx0J10sIG5hbWU6ICdldmVudHMnIH1dXG5cdCogYGBgXG5cdCpcblx0KiBAZXhhbXBsZSBXb3JraW5nIHdpdGggbmFtZXNwYWNlc1xuXHQqIGBgYGpzXG5cdCogY29uc3QgY2F0YWxvZyA9IHN1cGFiYXNlLnN0b3JhZ2UuYW5hbHl0aWNzLmZyb20oJ2FuYWx5dGljcy1kYXRhJylcblx0KlxuXHQqIC8vIExpc3QgYWxsIG5hbWVzcGFjZXNcblx0KiBjb25zdCB7IGRhdGE6IG5hbWVzcGFjZXMgfSA9IGF3YWl0IGNhdGFsb2cubGlzdE5hbWVzcGFjZXMoKVxuXHQqXG5cdCogLy8gQ3JlYXRlIG5hbWVzcGFjZSB3aXRoIHByb3BlcnRpZXNcblx0KiBhd2FpdCBjYXRhbG9nLmNyZWF0ZU5hbWVzcGFjZShcblx0KiAgIHsgbmFtZXNwYWNlOiBbJ3Byb2R1Y3Rpb24nXSB9LFxuXHQqICAgeyBwcm9wZXJ0aWVzOiB7IG93bmVyOiAnZGF0YS10ZWFtJywgZW52OiAncHJvZCcgfSB9XG5cdCogKVxuXHQqIGBgYFxuXHQqXG5cdCogQGV4YW1wbGUgQ2xlYW51cCBvcGVyYXRpb25zXG5cdCogYGBganNcblx0KiBjb25zdCBjYXRhbG9nID0gc3VwYWJhc2Uuc3RvcmFnZS5hbmFseXRpY3MuZnJvbSgnYW5hbHl0aWNzLWRhdGEnKVxuXHQqXG5cdCogLy8gRHJvcCB0YWJsZSB3aXRoIHB1cmdlIG9wdGlvbiAocmVtb3ZlcyBhbGwgZGF0YSlcblx0KiBjb25zdCB7IGVycm9yOiBkcm9wRXJyb3IgfSA9IGF3YWl0IGNhdGFsb2cuZHJvcFRhYmxlKFxuXHQqICAgeyBuYW1lc3BhY2U6IFsnZGVmYXVsdCddLCBuYW1lOiAnZXZlbnRzJyB9LFxuXHQqICAgeyBwdXJnZTogdHJ1ZSB9XG5cdCogKVxuXHQqXG5cdCogaWYgKGRyb3BFcnJvcj8uaXNOb3RGb3VuZCgpKSB7XG5cdCogICBjb25zb2xlLmxvZygnVGFibGUgZG9lcyBub3QgZXhpc3QnKVxuXHQqIH1cblx0KlxuXHQqIC8vIERyb3AgbmFtZXNwYWNlIChtdXN0IGJlIGVtcHR5KVxuXHQqIGF3YWl0IGNhdGFsb2cuZHJvcE5hbWVzcGFjZSh7IG5hbWVzcGFjZTogWydkZWZhdWx0J10gfSlcblx0KiBgYGBcblx0KlxuXHQqIEByZW1hcmtzXG5cdCogVGhpcyBtZXRob2QgcHJvdmlkZXMgYSBicmlkZ2UgYmV0d2VlbiBTdXBhYmFzZSdzIGJ1Y2tldCBtYW5hZ2VtZW50IGFuZCB0aGUgc3RhbmRhcmRcblx0KiBBcGFjaGUgSWNlYmVyZyBSRVNUIENhdGFsb2cgQVBJLiBUaGUgYnVja2V0IG5hbWUgbWFwcyB0byB0aGUgSWNlYmVyZyB3YXJlaG91c2UgcGFyYW1ldGVyLlxuXHQqIEFsbCBhdXRoZW50aWNhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgeW91ciBTdXBhYmFzZSBjcmVkZW50aWFscy5cblx0KlxuXHQqICoqRXJyb3IgSGFuZGxpbmcqKjogSW52YWxpZCBidWNrZXQgbmFtZXMgdGhyb3cgaW1tZWRpYXRlbHkuIEFsbCBjYXRhbG9nXG5cdCogb3BlcmF0aW9ucyByZXR1cm4gYHsgZGF0YSwgZXJyb3IgfWAgd2hlcmUgZXJyb3JzIGFyZSBgSWNlYmVyZ0Vycm9yYCBpbnN0YW5jZXMgZnJvbSBpY2ViZXJnLWpzLlxuXHQqIFVzZSBoZWxwZXIgbWV0aG9kcyBsaWtlIGBlcnJvci5pc05vdEZvdW5kKClgIG9yIGNoZWNrIGBlcnJvci5zdGF0dXNgIGZvciBzcGVjaWZpYyBlcnJvciBoYW5kbGluZy5cblx0KiBVc2UgYC50aHJvd09uRXJyb3IoKWAgb24gdGhlIGFuYWx5dGljcyBjbGllbnQgaWYgeW91IHByZWZlciBleGNlcHRpb25zIGZvciBjYXRhbG9nIG9wZXJhdGlvbnMuXG5cdCpcblx0KiAqKkNsZWFudXAgT3BlcmF0aW9ucyoqOiBXaGVuIHVzaW5nIGBkcm9wVGFibGVgLCB0aGUgYHB1cmdlOiB0cnVlYCBvcHRpb24gcGVybWFuZW50bHlcblx0KiBkZWxldGVzIGFsbCB0YWJsZSBkYXRhLiBXaXRob3V0IGl0LCB0aGUgdGFibGUgaXMgbWFya2VkIGFzIGRlbGV0ZWQgYnV0IGRhdGEgcmVtYWlucy5cblx0KlxuXHQqICoqTGlicmFyeSBEZXBlbmRlbmN5Kio6IFRoZSByZXR1cm5lZCBjYXRhbG9nIHdyYXBzIGBJY2ViZXJnUmVzdENhdGFsb2dgIGZyb20gaWNlYmVyZy1qcy5cblx0KiBGb3IgY29tcGxldGUgQVBJIGRvY3VtZW50YXRpb24gYW5kIGFkdmFuY2VkIHVzYWdlLCByZWZlciB0byB0aGVcblx0KiBbaWNlYmVyZy1qcyBkb2N1bWVudGF0aW9uXShodHRwczovL3N1cGFiYXNlLmdpdGh1Yi5pby9pY2ViZXJnLWpzLykuXG5cdCovXG5cdGZyb20oYnVja2V0TmFtZSkge1xuXHRcdHZhciBfdGhpczQgPSB0aGlzO1xuXHRcdGlmICghaXNWYWxpZEJ1Y2tldE5hbWUoYnVja2V0TmFtZSkpIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoXCJJbnZhbGlkIGJ1Y2tldCBuYW1lOiBGaWxlLCBmb2xkZXIsIGFuZCBidWNrZXQgbmFtZXMgbXVzdCBmb2xsb3cgQVdTIG9iamVjdCBrZXkgbmFtaW5nIGd1aWRlbGluZXMgYW5kIHNob3VsZCBhdm9pZCB0aGUgdXNlIG9mIGFueSBvdGhlciBjaGFyYWN0ZXJzLlwiKTtcblx0XHRjb25zdCBjYXRhbG9nID0gbmV3IEljZWJlcmdSZXN0Q2F0YWxvZyh7XG5cdFx0XHRiYXNlVXJsOiB0aGlzLnVybCxcblx0XHRcdGNhdGFsb2dOYW1lOiBidWNrZXROYW1lLFxuXHRcdFx0YXV0aDoge1xuXHRcdFx0XHR0eXBlOiBcImN1c3RvbVwiLFxuXHRcdFx0XHRnZXRIZWFkZXJzOiBhc3luYyAoKSA9PiBfdGhpczQuaGVhZGVyc1xuXHRcdFx0fSxcblx0XHRcdGZldGNoOiB0aGlzLmZldGNoXG5cdFx0fSk7XG5cdFx0Y29uc3Qgc2hvdWxkVGhyb3dPbkVycm9yID0gdGhpcy5zaG91bGRUaHJvd09uRXJyb3I7XG5cdFx0cmV0dXJuIG5ldyBQcm94eShjYXRhbG9nLCB7IGdldCh0YXJnZXQsIHByb3ApIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gdGFyZ2V0W3Byb3BdO1xuXHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsdWU7XG5cdFx0XHRyZXR1cm4gYXN5bmMgKC4uLmFyZ3MpID0+IHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZGF0YTogYXdhaXQgdmFsdWUuYXBwbHkodGFyZ2V0LCBhcmdzKSxcblx0XHRcdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRpZiAoc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0XHRcdGVycm9yXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9IH0pO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL3ZlY3RvcnMvY29uc3RhbnRzLnRzXG5jb25zdCBERUZBVUxUX0hFQURFUlMgPSB7XG5cdFwiWC1DbGllbnQtSW5mb1wiOiBgc3RvcmFnZS1qcy8ke3ZlcnNpb259YCxcblx0XCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvdmVjdG9ycy9lcnJvcnMudHNcbi8qKlxuKiBCYXNlIGVycm9yIGNsYXNzIGZvciBhbGwgU3RvcmFnZSBWZWN0b3JzIGVycm9yc1xuKi9cbnZhciBTdG9yYWdlVmVjdG9yc0Vycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzLl9faXNTdG9yYWdlVmVjdG9yc0Vycm9yID0gdHJ1ZTtcblx0XHR0aGlzLm5hbWUgPSBcIlN0b3JhZ2VWZWN0b3JzRXJyb3JcIjtcblx0fVxufTtcbi8qKlxuKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIGVycm9yIGlzIGEgU3RvcmFnZVZlY3RvcnNFcnJvclxuKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gY2hlY2tcbiogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZXJyb3IgaXMgYSBTdG9yYWdlVmVjdG9yc0Vycm9yXG4qL1xuZnVuY3Rpb24gaXNTdG9yYWdlVmVjdG9yc0Vycm9yKGVycm9yKSB7XG5cdHJldHVybiB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiYgZXJyb3IgIT09IG51bGwgJiYgXCJfX2lzU3RvcmFnZVZlY3RvcnNFcnJvclwiIGluIGVycm9yO1xufVxuLyoqXG4qIEFQSSBlcnJvciByZXR1cm5lZCBmcm9tIFMzIFZlY3RvcnMgc2VydmljZVxuKiBJbmNsdWRlcyBIVFRQIHN0YXR1cyBjb2RlIGFuZCBzZXJ2aWNlLXNwZWNpZmljIGVycm9yIGNvZGVcbiovXG52YXIgU3RvcmFnZVZlY3RvcnNBcGlFcnJvciA9IGNsYXNzIGV4dGVuZHMgU3RvcmFnZVZlY3RvcnNFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cywgc3RhdHVzQ29kZSkge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IFwiU3RvcmFnZVZlY3RvcnNBcGlFcnJvclwiO1xuXHRcdHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuXHRcdHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG5cdH1cblx0dG9KU09OKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsXG5cdFx0XHRtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG5cdFx0XHRzdGF0dXM6IHRoaXMuc3RhdHVzLFxuXHRcdFx0c3RhdHVzQ29kZTogdGhpcy5zdGF0dXNDb2RlXG5cdFx0fTtcblx0fVxufTtcbi8qKlxuKiBVbmtub3duIGVycm9yIHRoYXQgZG9lc24ndCBtYXRjaCBleHBlY3RlZCBlcnJvciBwYXR0ZXJuc1xuKiBXcmFwcyB0aGUgb3JpZ2luYWwgZXJyb3IgZm9yIGRlYnVnZ2luZ1xuKi9cbnZhciBTdG9yYWdlVmVjdG9yc1Vua25vd25FcnJvciA9IGNsYXNzIGV4dGVuZHMgU3RvcmFnZVZlY3RvcnNFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UsIG9yaWdpbmFsRXJyb3IpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzLm5hbWUgPSBcIlN0b3JhZ2VWZWN0b3JzVW5rbm93bkVycm9yXCI7XG5cdFx0dGhpcy5vcmlnaW5hbEVycm9yID0gb3JpZ2luYWxFcnJvcjtcblx0fVxufTtcbi8qKlxuKiBFcnJvciBjb2RlcyBzcGVjaWZpYyB0byBTMyBWZWN0b3JzIEFQSVxuKiBNYXBzIEFXUyBzZXJ2aWNlIGVycm9ycyB0byBhcHBsaWNhdGlvbi1mcmllbmRseSBlcnJvciBjb2Rlc1xuKi9cbmxldCBTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSA9IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbihTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSQxKSB7XG5cdC8qKiBJbnRlcm5hbCBzZXJ2ZXIgZmF1bHQgKEhUVFAgNTAwKSAqL1xuXHRTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSQxW1wiSW50ZXJuYWxFcnJvclwiXSA9IFwiSW50ZXJuYWxFcnJvclwiO1xuXHQvKiogUmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgLyBjb25mbGljdCAoSFRUUCA0MDkpICovXG5cdFN0b3JhZ2VWZWN0b3JzRXJyb3JDb2RlJDFbXCJTM1ZlY3RvckNvbmZsaWN0RXhjZXB0aW9uXCJdID0gXCJTM1ZlY3RvckNvbmZsaWN0RXhjZXB0aW9uXCI7XG5cdC8qKiBSZXNvdXJjZSBub3QgZm91bmQgKEhUVFAgNDA0KSAqL1xuXHRTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSQxW1wiUzNWZWN0b3JOb3RGb3VuZEV4Y2VwdGlvblwiXSA9IFwiUzNWZWN0b3JOb3RGb3VuZEV4Y2VwdGlvblwiO1xuXHQvKiogRGVsZXRlIGJ1Y2tldCB3aGlsZSBub3QgZW1wdHkgKEhUVFAgNDAwKSAqL1xuXHRTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSQxW1wiUzNWZWN0b3JCdWNrZXROb3RFbXB0eVwiXSA9IFwiUzNWZWN0b3JCdWNrZXROb3RFbXB0eVwiO1xuXHQvKiogRXhjZWVkcyBidWNrZXQgcXVvdGEvbGltaXQgKEhUVFAgNDAwKSAqL1xuXHRTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSQxW1wiUzNWZWN0b3JNYXhCdWNrZXRzRXhjZWVkZWRcIl0gPSBcIlMzVmVjdG9yTWF4QnVja2V0c0V4Y2VlZGVkXCI7XG5cdC8qKiBFeGNlZWRzIGluZGV4IHF1b3RhL2xpbWl0IChIVFRQIDQwMCkgKi9cblx0U3RvcmFnZVZlY3RvcnNFcnJvckNvZGUkMVtcIlMzVmVjdG9yTWF4SW5kZXhlc0V4Y2VlZGVkXCJdID0gXCJTM1ZlY3Rvck1heEluZGV4ZXNFeGNlZWRlZFwiO1xuXHRyZXR1cm4gU3RvcmFnZVZlY3RvcnNFcnJvckNvZGUkMTtcbn0oe30pO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL3ZlY3RvcnMvaGVscGVycy50c1xuLyoqXG4qIFJlc29sdmVzIHRoZSBmZXRjaCBpbXBsZW1lbnRhdGlvbiB0byB1c2VcbiogVXNlcyBjdXN0b20gZmV0Y2ggaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2VzIG5hdGl2ZSBmZXRjaFxuKlxuKiBAcGFyYW0gY3VzdG9tRmV0Y2ggLSBPcHRpb25hbCBjdXN0b20gZmV0Y2ggaW1wbGVtZW50YXRpb25cbiogQHJldHVybnMgUmVzb2x2ZWQgZmV0Y2ggZnVuY3Rpb25cbiovXG5jb25zdCByZXNvbHZlRmV0Y2ggPSAoY3VzdG9tRmV0Y2gpID0+IHtcblx0aWYgKGN1c3RvbUZldGNoKSByZXR1cm4gKC4uLmFyZ3MpID0+IGN1c3RvbUZldGNoKC4uLmFyZ3MpO1xuXHRyZXR1cm4gKC4uLmFyZ3MpID0+IGZldGNoKC4uLmFyZ3MpO1xufTtcbi8qKlxuKiBSZXNvbHZlcyB0aGUgUmVzcG9uc2UgY29uc3RydWN0b3IgdG8gdXNlXG4qIFJldHVybnMgbmF0aXZlIFJlc3BvbnNlIGNvbnN0cnVjdG9yXG4qXG4qIEByZXR1cm5zIFJlc3BvbnNlIGNvbnN0cnVjdG9yXG4qL1xuY29uc3QgcmVzb2x2ZVJlc3BvbnNlID0gKCkgPT4ge1xuXHRyZXR1cm4gUmVzcG9uc2U7XG59O1xuLyoqXG4qIERldGVybWluZSBpZiBpbnB1dCBpcyBhIHBsYWluIG9iamVjdFxuKiBBbiBvYmplY3QgaXMgcGxhaW4gaWYgaXQncyBjcmVhdGVkIGJ5IGVpdGhlciB7fSwgbmV3IE9iamVjdCgpLCBvciBPYmplY3QuY3JlYXRlKG51bGwpXG4qXG4qIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGNoZWNrXG4qIEByZXR1cm5zIFRydWUgaWYgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3RcbiogQHNvdXJjZSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2lzLXBsYWluLW9ialxuKi9cbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsdWUpID0+IHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59O1xuLyoqXG4qIE5vcm1hbGl6ZXMgYSBudW1iZXIgYXJyYXkgdG8gZmxvYXQzMiBmb3JtYXRcbiogRW5zdXJlcyBhbGwgdmVjdG9yIHZhbHVlcyBhcmUgdmFsaWQgMzItYml0IGZsb2F0c1xuKlxuKiBAcGFyYW0gdmFsdWVzIC0gQXJyYXkgb2YgbnVtYmVycyB0byBub3JtYWxpemVcbiogQHJldHVybnMgTm9ybWFsaXplZCBmbG9hdDMyIGFycmF5XG4qL1xuY29uc3Qgbm9ybWFsaXplVG9GbG9hdDMyID0gKHZhbHVlcykgPT4ge1xuXHRyZXR1cm4gQXJyYXkuZnJvbShuZXcgRmxvYXQzMkFycmF5KHZhbHVlcykpO1xufTtcbi8qKlxuKiBWYWxpZGF0ZXMgdmVjdG9yIGRpbWVuc2lvbnMgbWF0Y2ggZXhwZWN0ZWQgZGltZW5zaW9uXG4qIFRocm93cyBlcnJvciBpZiBkaW1lbnNpb25zIGRvbid0IG1hdGNoXG4qXG4qIEBwYXJhbSB2ZWN0b3IgLSBWZWN0b3IgZGF0YSB0byB2YWxpZGF0ZVxuKiBAcGFyYW0gZXhwZWN0ZWREaW1lbnNpb24gLSBFeHBlY3RlZCB2ZWN0b3IgZGltZW5zaW9uXG4qIEB0aHJvd3MgRXJyb3IgaWYgZGltZW5zaW9ucyBkb24ndCBtYXRjaFxuKi9cbmNvbnN0IHZhbGlkYXRlVmVjdG9yRGltZW5zaW9uID0gKHZlY3RvciwgZXhwZWN0ZWREaW1lbnNpb24pID0+IHtcblx0aWYgKGV4cGVjdGVkRGltZW5zaW9uICE9PSB2b2lkIDAgJiYgdmVjdG9yLmZsb2F0MzIubGVuZ3RoICE9PSBleHBlY3RlZERpbWVuc2lvbikgdGhyb3cgbmV3IEVycm9yKGBWZWN0b3IgZGltZW5zaW9uIG1pc21hdGNoOiBleHBlY3RlZCAke2V4cGVjdGVkRGltZW5zaW9ufSwgZ290ICR7dmVjdG9yLmZsb2F0MzIubGVuZ3RofWApO1xufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi92ZWN0b3JzL2ZldGNoLnRzXG4vKipcbiogRXh0cmFjdHMgZXJyb3IgbWVzc2FnZSBmcm9tIHZhcmlvdXMgZXJyb3IgcmVzcG9uc2UgZm9ybWF0c1xuKiBAcGFyYW0gZXJyIC0gRXJyb3Igb2JqZWN0IGZyb20gQVBJXG4qIEByZXR1cm5zIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2VcbiovXG5jb25zdCBfZ2V0RXJyb3JNZXNzYWdlID0gKGVycikgPT4gZXJyLm1zZyB8fCBlcnIubWVzc2FnZSB8fCBlcnIuZXJyb3JfZGVzY3JpcHRpb24gfHwgZXJyLmVycm9yIHx8IEpTT04uc3RyaW5naWZ5KGVycik7XG4vKipcbiogSGFuZGxlcyBmZXRjaCBlcnJvcnMgYW5kIGNvbnZlcnRzIHRoZW0gdG8gU3RvcmFnZVZlY3RvcnMgZXJyb3IgdHlwZXNcbiogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIGNhdWdodCBmcm9tIGZldGNoXG4qIEBwYXJhbSByZWplY3QgLSBQcm9taXNlIHJlamVjdGlvbiBmdW5jdGlvblxuKiBAcGFyYW0gb3B0aW9ucyAtIEZldGNoIG9wdGlvbnMgdGhhdCBtYXkgYWZmZWN0IGVycm9yIGhhbmRsaW5nXG4qL1xuY29uc3QgaGFuZGxlRXJyb3IgPSBhc3luYyAoZXJyb3IsIHJlamVjdCwgb3B0aW9ucykgPT4ge1xuXHRpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiICYmIFwic3RhdHVzXCIgaW4gZXJyb3IgJiYgXCJva1wiIGluIGVycm9yICYmIHR5cGVvZiBlcnJvci5zdGF0dXMgPT09IFwibnVtYmVyXCIgJiYgIShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubm9SZXNvbHZlSnNvbikpIHtcblx0XHRjb25zdCBzdGF0dXMgPSBlcnJvci5zdGF0dXMgfHwgNTAwO1xuXHRcdGNvbnN0IHJlc3BvbnNlRXJyb3IgPSBlcnJvcjtcblx0XHRpZiAodHlwZW9mIHJlc3BvbnNlRXJyb3IuanNvbiA9PT0gXCJmdW5jdGlvblwiKSByZXNwb25zZUVycm9yLmpzb24oKS50aGVuKChlcnIpID0+IHtcblx0XHRcdGNvbnN0IHN0YXR1c0NvZGUgPSAoZXJyID09PSBudWxsIHx8IGVyciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyLnN0YXR1c0NvZGUpIHx8IChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIuY29kZSkgfHwgc3RhdHVzICsgXCJcIjtcblx0XHRcdHJlamVjdChuZXcgU3RvcmFnZVZlY3RvcnNBcGlFcnJvcihfZ2V0RXJyb3JNZXNzYWdlKGVyciksIHN0YXR1cywgc3RhdHVzQ29kZSkpO1xuXHRcdH0pLmNhdGNoKCgpID0+IHtcblx0XHRcdGNvbnN0IHN0YXR1c0NvZGUgPSBzdGF0dXMgKyBcIlwiO1xuXHRcdFx0cmVqZWN0KG5ldyBTdG9yYWdlVmVjdG9yc0FwaUVycm9yKHJlc3BvbnNlRXJyb3Iuc3RhdHVzVGV4dCB8fCBgSFRUUCAke3N0YXR1c30gZXJyb3JgLCBzdGF0dXMsIHN0YXR1c0NvZGUpKTtcblx0XHR9KTtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHN0YXR1c0NvZGUgPSBzdGF0dXMgKyBcIlwiO1xuXHRcdFx0cmVqZWN0KG5ldyBTdG9yYWdlVmVjdG9yc0FwaUVycm9yKHJlc3BvbnNlRXJyb3Iuc3RhdHVzVGV4dCB8fCBgSFRUUCAke3N0YXR1c30gZXJyb3JgLCBzdGF0dXMsIHN0YXR1c0NvZGUpKTtcblx0XHR9XG5cdH0gZWxzZSByZWplY3QobmV3IFN0b3JhZ2VWZWN0b3JzVW5rbm93bkVycm9yKF9nZXRFcnJvck1lc3NhZ2UoZXJyb3IpLCBlcnJvcikpO1xufTtcbi8qKlxuKiBCdWlsZHMgcmVxdWVzdCBwYXJhbWV0ZXJzIGZvciBmZXRjaCBjYWxsc1xuKiBAcGFyYW0gbWV0aG9kIC0gSFRUUCBtZXRob2RcbiogQHBhcmFtIG9wdGlvbnMgLSBDdXN0b20gZmV0Y2ggb3B0aW9uc1xuKiBAcGFyYW0gcGFyYW1ldGVycyAtIEFkZGl0aW9uYWwgZmV0Y2ggcGFyYW1ldGVycyBsaWtlIEFib3J0U2lnbmFsXG4qIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5ICh3aWxsIGJlIEpTT04gc3RyaW5naWZpZWQgaWYgcGxhaW4gb2JqZWN0KVxuKiBAcmV0dXJucyBDb21wbGV0ZSBmZXRjaCByZXF1ZXN0IHBhcmFtZXRlcnNcbiovXG5jb25zdCBfZ2V0UmVxdWVzdFBhcmFtcyA9IChtZXRob2QsIG9wdGlvbnMsIHBhcmFtZXRlcnMsIGJvZHkpID0+IHtcblx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdG1ldGhvZCxcblx0XHRoZWFkZXJzOiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlYWRlcnMpIHx8IHt9XG5cdH07XG5cdGlmIChtZXRob2QgPT09IFwiR0VUXCIgfHwgIWJvZHkpIHJldHVybiBwYXJhbXM7XG5cdGlmIChpc1BsYWluT2JqZWN0KGJvZHkpKSB7XG5cdFx0cGFyYW1zLmhlYWRlcnMgPSBfb2JqZWN0U3ByZWFkMih7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oZWFkZXJzKTtcblx0XHRwYXJhbXMuYm9keSA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXHR9IGVsc2UgcGFyYW1zLmJvZHkgPSBib2R5O1xuXHRyZXR1cm4gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIHBhcmFtcyksIHBhcmFtZXRlcnMpO1xufTtcbi8qKlxuKiBJbnRlcm5hbCByZXF1ZXN0IGhhbmRsZXIgdGhhdCB3cmFwcyBmZXRjaCB3aXRoIGVycm9yIGhhbmRsaW5nXG4qIEBwYXJhbSBmZXRjaGVyIC0gRmV0Y2ggZnVuY3Rpb24gdG8gdXNlXG4qIEBwYXJhbSBtZXRob2QgLSBIVFRQIG1ldGhvZFxuKiBAcGFyYW0gdXJsIC0gUmVxdWVzdCBVUkxcbiogQHBhcmFtIG9wdGlvbnMgLSBDdXN0b20gZmV0Y2ggb3B0aW9uc1xuKiBAcGFyYW0gcGFyYW1ldGVycyAtIEFkZGl0aW9uYWwgZmV0Y2ggcGFyYW1ldGVyc1xuKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keVxuKiBAcmV0dXJucyBQcm9taXNlIHdpdGggcGFyc2VkIHJlc3BvbnNlIG9yIGVycm9yXG4qL1xuYXN5bmMgZnVuY3Rpb24gX2hhbmRsZVJlcXVlc3QoZmV0Y2hlciwgbWV0aG9kLCB1cmwsIG9wdGlvbnMsIHBhcmFtZXRlcnMsIGJvZHkpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRmZXRjaGVyKHVybCwgX2dldFJlcXVlc3RQYXJhbXMobWV0aG9kLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KSkudGhlbigocmVzdWx0KSA9PiB7XG5cdFx0XHRpZiAoIXJlc3VsdC5vaykgdGhyb3cgcmVzdWx0O1xuXHRcdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ub1Jlc29sdmVKc29uKSByZXR1cm4gcmVzdWx0O1xuXHRcdFx0Y29uc3QgY29udGVudFR5cGUgPSByZXN1bHQuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik7XG5cdFx0XHRpZiAoIWNvbnRlbnRUeXBlIHx8ICFjb250ZW50VHlwZS5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHJldHVybiB7fTtcblx0XHRcdHJldHVybiByZXN1bHQuanNvbigpO1xuXHRcdH0pLnRoZW4oKGRhdGEpID0+IHJlc29sdmUoZGF0YSkpLmNhdGNoKChlcnJvcikgPT4gaGFuZGxlRXJyb3IoZXJyb3IsIHJlamVjdCwgb3B0aW9ucykpO1xuXHR9KTtcbn1cbi8qKlxuKiBQZXJmb3JtcyBhIFBPU1QgcmVxdWVzdFxuKiBAcGFyYW0gZmV0Y2hlciAtIEZldGNoIGZ1bmN0aW9uIHRvIHVzZVxuKiBAcGFyYW0gdXJsIC0gUmVxdWVzdCBVUkxcbiogQHBhcmFtIGJvZHkgLSBSZXF1ZXN0IGJvZHkgdG8gYmUgSlNPTiBzdHJpbmdpZmllZFxuKiBAcGFyYW0gb3B0aW9ucyAtIEN1c3RvbSBmZXRjaCBvcHRpb25zXG4qIEBwYXJhbSBwYXJhbWV0ZXJzIC0gQWRkaXRpb25hbCBmZXRjaCBwYXJhbWV0ZXJzXG4qIEByZXR1cm5zIFByb21pc2Ugd2l0aCBwYXJzZWQgcmVzcG9uc2VcbiovXG5hc3luYyBmdW5jdGlvbiBwb3N0KGZldGNoZXIsIHVybCwgYm9keSwgb3B0aW9ucywgcGFyYW1ldGVycykge1xuXHRyZXR1cm4gX2hhbmRsZVJlcXVlc3QoZmV0Y2hlciwgXCJQT1NUXCIsIHVybCwgb3B0aW9ucywgcGFyYW1ldGVycywgYm9keSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvdmVjdG9ycy9WZWN0b3JJbmRleEFwaS50c1xuLyoqXG4qIEBoaWRkZW5cbiogQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgdmVjdG9yIGluZGV4IG9wZXJhdGlvbnMuXG4qIFVzZSB7QGxpbmsgVmVjdG9yQnVja2V0U2NvcGV9IHZpYSBgc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2J1Y2tldCcpYCBpbnN0ZWFkLlxuKi9cbnZhciBWZWN0b3JJbmRleEFwaSA9IGNsYXNzIHtcblx0LyoqIENyZWF0ZXMgYSBuZXcgVmVjdG9ySW5kZXhBcGkgaW5zdGFuY2UgKi9cblx0Y29uc3RydWN0b3IodXJsLCBoZWFkZXJzID0ge30sIGZldGNoJDEpIHtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IGZhbHNlO1xuXHRcdHRoaXMudXJsID0gdXJsLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcblx0XHR0aGlzLmhlYWRlcnMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9IRUFERVJTKSwgaGVhZGVycyk7XG5cdFx0dGhpcy5mZXRjaCA9IHJlc29sdmVGZXRjaChmZXRjaCQxKTtcblx0fVxuXHQvKiogRW5hYmxlIHRocm93aW5nIGVycm9ycyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGVtIGluIHRoZSByZXNwb25zZSAqL1xuXHR0aHJvd09uRXJyb3IoKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSB0cnVlO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKiBDcmVhdGVzIGEgbmV3IHZlY3RvciBpbmRleCB3aXRoaW4gYSBidWNrZXQgKi9cblx0YXN5bmMgY3JlYXRlSW5kZXgob3B0aW9ucykge1xuXHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QoX3RoaXMuZmV0Y2gsIGAke190aGlzLnVybH0vQ3JlYXRlSW5kZXhgLCBvcHRpb25zLCB7IGhlYWRlcnM6IF90aGlzLmhlYWRlcnMgfSkgfHwge30sXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VWZWN0b3JzRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKiogUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIHNwZWNpZmljIHZlY3RvciBpbmRleCAqL1xuXHRhc3luYyBnZXRJbmRleCh2ZWN0b3JCdWNrZXROYW1lLCBpbmRleE5hbWUpIHtcblx0XHR2YXIgX3RoaXMyID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdChfdGhpczIuZmV0Y2gsIGAke190aGlzMi51cmx9L0dldEluZGV4YCwge1xuXHRcdFx0XHRcdHZlY3RvckJ1Y2tldE5hbWUsXG5cdFx0XHRcdFx0aW5kZXhOYW1lXG5cdFx0XHRcdH0sIHsgaGVhZGVyczogX3RoaXMyLmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMyLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlVmVjdG9yc0Vycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqIExpc3RzIHZlY3RvciBpbmRleGVzIHdpdGhpbiBhIGJ1Y2tldCB3aXRoIG9wdGlvbmFsIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvbiAqL1xuXHRhc3luYyBsaXN0SW5kZXhlcyhvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzMyA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QoX3RoaXMzLmZldGNoLCBgJHtfdGhpczMudXJsfS9MaXN0SW5kZXhlc2AsIG9wdGlvbnMsIHsgaGVhZGVyczogX3RoaXMzLmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlVmVjdG9yc0Vycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqIERlbGV0ZXMgYSB2ZWN0b3IgaW5kZXggYW5kIGFsbCBpdHMgZGF0YSAqL1xuXHRhc3luYyBkZWxldGVJbmRleCh2ZWN0b3JCdWNrZXROYW1lLCBpbmRleE5hbWUpIHtcblx0XHR2YXIgX3RoaXM0ID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdChfdGhpczQuZmV0Y2gsIGAke190aGlzNC51cmx9L0RlbGV0ZUluZGV4YCwge1xuXHRcdFx0XHRcdHZlY3RvckJ1Y2tldE5hbWUsXG5cdFx0XHRcdFx0aW5kZXhOYW1lXG5cdFx0XHRcdH0sIHsgaGVhZGVyczogX3RoaXM0LmhlYWRlcnMgfSkgfHwge30sXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXM0LnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlVmVjdG9yc0Vycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvdmVjdG9ycy9WZWN0b3JEYXRhQXBpLnRzXG4vKipcbiogQGhpZGRlblxuKiBCYXNlIGltcGxlbWVudGF0aW9uIGZvciB2ZWN0b3IgZGF0YSBvcGVyYXRpb25zLlxuKiBVc2Uge0BsaW5rIFZlY3RvckluZGV4U2NvcGV9IHZpYSBgc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2J1Y2tldCcpLmluZGV4KCdpZHgnKWAgaW5zdGVhZC5cbiovXG52YXIgVmVjdG9yRGF0YUFwaSA9IGNsYXNzIHtcblx0LyoqIENyZWF0ZXMgYSBuZXcgVmVjdG9yRGF0YUFwaSBpbnN0YW5jZSAqL1xuXHRjb25zdHJ1Y3Rvcih1cmwsIGhlYWRlcnMgPSB7fSwgZmV0Y2gkMSkge1xuXHRcdHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yID0gZmFsc2U7XG5cdFx0dGhpcy51cmwgPSB1cmwucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuXHRcdHRoaXMuaGVhZGVycyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX0hFQURFUlMpLCBoZWFkZXJzKTtcblx0XHR0aGlzLmZldGNoID0gcmVzb2x2ZUZldGNoKGZldGNoJDEpO1xuXHR9XG5cdC8qKiBFbmFibGUgdGhyb3dpbmcgZXJyb3JzIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZW0gaW4gdGhlIHJlc3BvbnNlICovXG5cdHRocm93T25FcnJvcigpIHtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IHRydWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqIEluc2VydHMgb3IgdXBkYXRlcyB2ZWN0b3JzIGluIGJhdGNoICgxLTUwMCBwZXIgcmVxdWVzdCkgKi9cblx0YXN5bmMgcHV0VmVjdG9ycyhvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9wdGlvbnMudmVjdG9ycy5sZW5ndGggPCAxIHx8IG9wdGlvbnMudmVjdG9ycy5sZW5ndGggPiA1MDApIHRocm93IG5ldyBFcnJvcihcIlZlY3RvciBiYXRjaCBzaXplIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA1MDAgaXRlbXNcIik7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwb3N0KF90aGlzLmZldGNoLCBgJHtfdGhpcy51cmx9L1B1dFZlY3RvcnNgLCBvcHRpb25zLCB7IGhlYWRlcnM6IF90aGlzLmhlYWRlcnMgfSkgfHwge30sXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VWZWN0b3JzRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKiogUmV0cmlldmVzIHZlY3RvcnMgYnkgdGhlaXIga2V5cyBpbiBiYXRjaCAqL1xuXHRhc3luYyBnZXRWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXMyID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdChfdGhpczIuZmV0Y2gsIGAke190aGlzMi51cmx9L0dldFZlY3RvcnNgLCBvcHRpb25zLCB7IGhlYWRlcnM6IF90aGlzMi5oZWFkZXJzIH0pLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzMi5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZVZlY3RvcnNFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKiBMaXN0cyB2ZWN0b3JzIGluIGFuIGluZGV4IHdpdGggcGFnaW5hdGlvbiAqL1xuXHRhc3luYyBsaXN0VmVjdG9ycyhvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzMyA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvcHRpb25zLnNlZ21lbnRDb3VudCAhPT0gdm9pZCAwKSB7XG5cdFx0XHRcdGlmIChvcHRpb25zLnNlZ21lbnRDb3VudCA8IDEgfHwgb3B0aW9ucy5zZWdtZW50Q291bnQgPiAxNikgdGhyb3cgbmV3IEVycm9yKFwic2VnbWVudENvdW50IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxNlwiKTtcblx0XHRcdFx0aWYgKG9wdGlvbnMuc2VnbWVudEluZGV4ICE9PSB2b2lkIDApIHtcblx0XHRcdFx0XHRpZiAob3B0aW9ucy5zZWdtZW50SW5kZXggPCAwIHx8IG9wdGlvbnMuc2VnbWVudEluZGV4ID49IG9wdGlvbnMuc2VnbWVudENvdW50KSB0aHJvdyBuZXcgRXJyb3IoYHNlZ21lbnRJbmRleCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJHtvcHRpb25zLnNlZ21lbnRDb3VudCAtIDF9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QoX3RoaXMzLmZldGNoLCBgJHtfdGhpczMudXJsfS9MaXN0VmVjdG9yc2AsIG9wdGlvbnMsIHsgaGVhZGVyczogX3RoaXMzLmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlVmVjdG9yc0Vycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqIFF1ZXJpZXMgZm9yIHNpbWlsYXIgdmVjdG9ycyB1c2luZyBhcHByb3hpbWF0ZSBuZWFyZXN0IG5laWdoYm9yIHNlYXJjaCAqL1xuXHRhc3luYyBxdWVyeVZlY3RvcnMob3B0aW9ucykge1xuXHRcdHZhciBfdGhpczQgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwb3N0KF90aGlzNC5mZXRjaCwgYCR7X3RoaXM0LnVybH0vUXVlcnlWZWN0b3JzYCwgb3B0aW9ucywgeyBoZWFkZXJzOiBfdGhpczQuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczQuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VWZWN0b3JzRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKiogRGVsZXRlcyB2ZWN0b3JzIGJ5IHRoZWlyIGtleXMgaW4gYmF0Y2ggKDEtNTAwIHBlciByZXF1ZXN0KSAqL1xuXHRhc3luYyBkZWxldGVWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXM1ID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9wdGlvbnMua2V5cy5sZW5ndGggPCAxIHx8IG9wdGlvbnMua2V5cy5sZW5ndGggPiA1MDApIHRocm93IG5ldyBFcnJvcihcIktleXMgYmF0Y2ggc2l6ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNTAwIGl0ZW1zXCIpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdChfdGhpczUuZmV0Y2gsIGAke190aGlzNS51cmx9L0RlbGV0ZVZlY3RvcnNgLCBvcHRpb25zLCB7IGhlYWRlcnM6IF90aGlzNS5oZWFkZXJzIH0pIHx8IHt9LFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzNS5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZVZlY3RvcnNFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL3ZlY3RvcnMvVmVjdG9yQnVja2V0QXBpLnRzXG4vKipcbiogQGhpZGRlblxuKiBCYXNlIGltcGxlbWVudGF0aW9uIGZvciB2ZWN0b3IgYnVja2V0IG9wZXJhdGlvbnMuXG4qIFVzZSB7QGxpbmsgU3RvcmFnZVZlY3RvcnNDbGllbnR9IHZpYSBgc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzYCBpbnN0ZWFkLlxuKi9cbnZhciBWZWN0b3JCdWNrZXRBcGkgPSBjbGFzcyB7XG5cdC8qKiBDcmVhdGVzIGEgbmV3IFZlY3RvckJ1Y2tldEFwaSBpbnN0YW5jZSAqL1xuXHRjb25zdHJ1Y3Rvcih1cmwsIGhlYWRlcnMgPSB7fSwgZmV0Y2gkMSkge1xuXHRcdHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yID0gZmFsc2U7XG5cdFx0dGhpcy51cmwgPSB1cmwucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuXHRcdHRoaXMuaGVhZGVycyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX0hFQURFUlMpLCBoZWFkZXJzKTtcblx0XHR0aGlzLmZldGNoID0gcmVzb2x2ZUZldGNoKGZldGNoJDEpO1xuXHR9XG5cdC8qKiBFbmFibGUgdGhyb3dpbmcgZXJyb3JzIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZW0gaW4gdGhlIHJlc3BvbnNlICovXG5cdHRocm93T25FcnJvcigpIHtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IHRydWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqIENyZWF0ZXMgYSBuZXcgdmVjdG9yIGJ1Y2tldCAqL1xuXHRhc3luYyBjcmVhdGVCdWNrZXQodmVjdG9yQnVja2V0TmFtZSkge1xuXHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QoX3RoaXMuZmV0Y2gsIGAke190aGlzLnVybH0vQ3JlYXRlVmVjdG9yQnVja2V0YCwgeyB2ZWN0b3JCdWNrZXROYW1lIH0sIHsgaGVhZGVyczogX3RoaXMuaGVhZGVycyB9KSB8fCB7fSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZVZlY3RvcnNFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKiBSZXRyaWV2ZXMgbWV0YWRhdGEgZm9yIGEgc3BlY2lmaWMgdmVjdG9yIGJ1Y2tldCAqL1xuXHRhc3luYyBnZXRCdWNrZXQodmVjdG9yQnVja2V0TmFtZSkge1xuXHRcdHZhciBfdGhpczIgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwb3N0KF90aGlzMi5mZXRjaCwgYCR7X3RoaXMyLnVybH0vR2V0VmVjdG9yQnVja2V0YCwgeyB2ZWN0b3JCdWNrZXROYW1lIH0sIHsgaGVhZGVyczogX3RoaXMyLmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMyLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlVmVjdG9yc0Vycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqIExpc3RzIHZlY3RvciBidWNrZXRzIHdpdGggb3B0aW9uYWwgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uICovXG5cdGFzeW5jIGxpc3RCdWNrZXRzKG9wdGlvbnMgPSB7fSkge1xuXHRcdHZhciBfdGhpczMgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwb3N0KF90aGlzMy5mZXRjaCwgYCR7X3RoaXMzLnVybH0vTGlzdFZlY3RvckJ1Y2tldHNgLCBvcHRpb25zLCB7IGhlYWRlcnM6IF90aGlzMy5oZWFkZXJzIH0pLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzMy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZVZlY3RvcnNFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKiBEZWxldGVzIGEgdmVjdG9yIGJ1Y2tldCAobXVzdCBiZSBlbXB0eSBmaXJzdCkgKi9cblx0YXN5bmMgZGVsZXRlQnVja2V0KHZlY3RvckJ1Y2tldE5hbWUpIHtcblx0XHR2YXIgX3RoaXM0ID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdChfdGhpczQuZmV0Y2gsIGAke190aGlzNC51cmx9L0RlbGV0ZVZlY3RvckJ1Y2tldGAsIHsgdmVjdG9yQnVja2V0TmFtZSB9LCB7IGhlYWRlcnM6IF90aGlzNC5oZWFkZXJzIH0pIHx8IHt9LFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzNC5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZVZlY3RvcnNFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL3ZlY3RvcnMvU3RvcmFnZVZlY3RvcnNDbGllbnQudHNcbi8qKlxuKlxuKiBAYWxwaGFcbipcbiogTWFpbiBjbGllbnQgZm9yIGludGVyYWN0aW5nIHdpdGggUzMgVmVjdG9ycyBBUElcbiogUHJvdmlkZXMgYWNjZXNzIHRvIGJ1Y2tldCwgaW5kZXgsIGFuZCB2ZWN0b3IgZGF0YSBvcGVyYXRpb25zXG4qXG4qICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG4qXG4qICoqVXNhZ2UgUGF0dGVybnM6KipcbipcbiogYGBgdHlwZXNjcmlwdFxuKiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuKiAgLnN0b3JhZ2VcbiogIC52ZWN0b3JzXG4qICAuY3JlYXRlQnVja2V0KCdlbWJlZGRpbmdzLXByb2QnKVxuKlxuKiAvLyBBY2Nlc3MgaW5kZXggb3BlcmF0aW9ucyB2aWEgYnVja2V0c1xuKiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcbiogYXdhaXQgYnVja2V0LmNyZWF0ZUluZGV4KHtcbiogICBpbmRleE5hbWU6ICdkb2N1bWVudHMnLFxuKiAgIGRhdGFUeXBlOiAnZmxvYXQzMicsXG4qICAgZGltZW5zaW9uOiAxNTM2LFxuKiAgIGRpc3RhbmNlTWV0cmljOiAnY29zaW5lJ1xuKiB9KVxuKlxuKiAvLyBBY2Nlc3MgdmVjdG9yIG9wZXJhdGlvbnMgdmlhIGluZGV4XG4qIGNvbnN0IGluZGV4ID0gYnVja2V0LmluZGV4KCdkb2N1bWVudHMnKVxuKiBhd2FpdCBpbmRleC5wdXRWZWN0b3JzKHtcbiogICB2ZWN0b3JzOiBbXG4qICAgICB7IGtleTogJ2RvYy0xJywgZGF0YTogeyBmbG9hdDMyOiBbLi4uXSB9LCBtZXRhZGF0YTogeyB0aXRsZTogJ0ludHJvJyB9IH1cbiogICBdXG4qIH0pXG4qXG4qIC8vIFF1ZXJ5IHNpbWlsYXIgdmVjdG9yc1xuKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4LnF1ZXJ5VmVjdG9ycyh7XG4qICAgcXVlcnlWZWN0b3I6IHsgZmxvYXQzMjogWy4uLl0gfSxcbiogICB0b3BLOiA1LFxuKiAgIHJldHVybkRpc3RhbmNlOiB0cnVlXG4qIH0pXG4qIGBgYFxuKi9cbnZhciBTdG9yYWdlVmVjdG9yc0NsaWVudCA9IGNsYXNzIGV4dGVuZHMgVmVjdG9yQnVja2V0QXBpIHtcblx0LyoqXG5cdCogQGFscGhhXG5cdCpcblx0KiBDcmVhdGVzIGEgU3RvcmFnZVZlY3RvcnNDbGllbnQgdGhhdCBjYW4gbWFuYWdlIGJ1Y2tldHMsIGluZGV4ZXMsIGFuZCB2ZWN0b3JzLlxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBwYXJhbSB1cmwgLSBCYXNlIFVSTCBvZiB0aGUgU3RvcmFnZSBWZWN0b3JzIFJFU1QgQVBJLlxuXHQqIEBwYXJhbSBvcHRpb25zLmhlYWRlcnMgLSBPcHRpb25hbCBoZWFkZXJzIChmb3IgZXhhbXBsZSBgQXV0aG9yaXphdGlvbmApIGFwcGxpZWQgdG8gZXZlcnkgcmVxdWVzdC5cblx0KiBAcGFyYW0gb3B0aW9ucy5mZXRjaCAtIE9wdGlvbmFsIGN1c3RvbSBgZmV0Y2hgIGltcGxlbWVudGF0aW9uIGZvciBub24tYnJvd3NlciBydW50aW1lcy5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGNsaWVudCA9IG5ldyBTdG9yYWdlVmVjdG9yc0NsaWVudCh1cmwsIG9wdGlvbnMpXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKHVybCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0c3VwZXIodXJsLCBvcHRpb25zLmhlYWRlcnMgfHwge30sIG9wdGlvbnMuZmV0Y2gpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBBY2Nlc3Mgb3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyB2ZWN0b3IgYnVja2V0XG5cdCogUmV0dXJucyBhIHNjb3BlZCBjbGllbnQgZm9yIGluZGV4IGFuZCB2ZWN0b3Igb3BlcmF0aW9ucyB3aXRoaW4gdGhlIGJ1Y2tldFxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBwYXJhbSB2ZWN0b3JCdWNrZXROYW1lIC0gTmFtZSBvZiB0aGUgdmVjdG9yIGJ1Y2tldFxuXHQqIEByZXR1cm5zIEJ1Y2tldC1zY29wZWQgY2xpZW50IHdpdGggaW5kZXggYW5kIHZlY3RvciBvcGVyYXRpb25zXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBgYGBcblx0Ki9cblx0ZnJvbSh2ZWN0b3JCdWNrZXROYW1lKSB7XG5cdFx0cmV0dXJuIG5ldyBWZWN0b3JCdWNrZXRTY29wZSh0aGlzLnVybCwgdGhpcy5oZWFkZXJzLCB2ZWN0b3JCdWNrZXROYW1lLCB0aGlzLmZldGNoKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogQ3JlYXRlcyBhIG5ldyB2ZWN0b3IgYnVja2V0XG5cdCogVmVjdG9yIGJ1Y2tldHMgYXJlIGNvbnRhaW5lcnMgZm9yIHZlY3RvciBpbmRleGVzIGFuZCB0aGVpciBkYXRhXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIHZlY3RvckJ1Y2tldE5hbWUgLSBVbmlxdWUgbmFtZSBmb3IgdGhlIHZlY3RvciBidWNrZXRcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggZW1wdHkgcmVzcG9uc2Ugb24gc3VjY2VzcyBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0eXBlc2NyaXB0XG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAudmVjdG9yc1xuXHQqICAgLmNyZWF0ZUJ1Y2tldCgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgY3JlYXRlQnVja2V0KHZlY3RvckJ1Y2tldE5hbWUpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRDcmVhdGVCdWNrZXQgPSAoKSA9PiBzdXBlci5jcmVhdGVCdWNrZXQsIF90aGlzID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXRDcmVhdGVCdWNrZXQoKS5jYWxsKF90aGlzLCB2ZWN0b3JCdWNrZXROYW1lKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIHNwZWNpZmljIHZlY3RvciBidWNrZXRcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gdmVjdG9yQnVja2V0TmFtZSAtIE5hbWUgb2YgdGhlIHZlY3RvciBidWNrZXRcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggYnVja2V0IG1ldGFkYXRhIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC52ZWN0b3JzXG5cdCogICAuZ2V0QnVja2V0KCdlbWJlZGRpbmdzLXByb2QnKVxuXHQqXG5cdCogY29uc29sZS5sb2coJ0J1Y2tldCBjcmVhdGVkOicsIGRhdGE/LnZlY3RvckJ1Y2tldC5jcmVhdGlvblRpbWUpXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGdldEJ1Y2tldCh2ZWN0b3JCdWNrZXROYW1lKSB7XG5cdFx0dmFyIF9zdXBlcnByb3BfZ2V0R2V0QnVja2V0ID0gKCkgPT4gc3VwZXIuZ2V0QnVja2V0LCBfdGhpczIgPSB0aGlzO1xuXHRcdHJldHVybiBfc3VwZXJwcm9wX2dldEdldEJ1Y2tldCgpLmNhbGwoX3RoaXMyLCB2ZWN0b3JCdWNrZXROYW1lKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogTGlzdHMgYWxsIHZlY3RvciBidWNrZXRzIHdpdGggb3B0aW9uYWwgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBmaWx0ZXJzIChwcmVmaXgsIG1heFJlc3VsdHMsIG5leHRUb2tlbilcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggbGlzdCBvZiBidWNrZXRzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC52ZWN0b3JzXG5cdCogICAubGlzdEJ1Y2tldHMoeyBwcmVmaXg6ICdlbWJlZGRpbmdzLScgfSlcblx0KlxuXHQqIGRhdGE/LnZlY3RvckJ1Y2tldHMuZm9yRWFjaChidWNrZXQgPT4ge1xuXHQqICAgY29uc29sZS5sb2coYnVja2V0LnZlY3RvckJ1Y2tldE5hbWUpXG5cdCogfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgbGlzdEJ1Y2tldHMob3B0aW9ucyA9IHt9KSB7XG5cdFx0dmFyIF9zdXBlcnByb3BfZ2V0TGlzdEJ1Y2tldHMgPSAoKSA9PiBzdXBlci5saXN0QnVja2V0cywgX3RoaXMzID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXRMaXN0QnVja2V0cygpLmNhbGwoX3RoaXMzLCBvcHRpb25zKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogRGVsZXRlcyBhIHZlY3RvciBidWNrZXQgKGJ1Y2tldCBtdXN0IGJlIGVtcHR5KVxuXHQqIEFsbCBpbmRleGVzIG11c3QgYmUgZGVsZXRlZCBiZWZvcmUgZGVsZXRpbmcgdGhlIGJ1Y2tldFxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBwYXJhbSB2ZWN0b3JCdWNrZXROYW1lIC0gTmFtZSBvZiB0aGUgdmVjdG9yIGJ1Y2tldCB0byBkZWxldGVcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggZW1wdHkgcmVzcG9uc2Ugb24gc3VjY2VzcyBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0eXBlc2NyaXB0XG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAudmVjdG9yc1xuXHQqICAgLmRlbGV0ZUJ1Y2tldCgnZW1iZWRkaW5ncy1vbGQnKVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBkZWxldGVCdWNrZXQodmVjdG9yQnVja2V0TmFtZSkge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldERlbGV0ZUJ1Y2tldCA9ICgpID0+IHN1cGVyLmRlbGV0ZUJ1Y2tldCwgX3RoaXM0ID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXREZWxldGVCdWNrZXQoKS5jYWxsKF90aGlzNCwgdmVjdG9yQnVja2V0TmFtZSk7XG5cdH1cbn07XG4vKipcbipcbiogQGFscGhhXG4qXG4qIFNjb3BlZCBjbGllbnQgZm9yIG9wZXJhdGlvbnMgd2l0aGluIGEgc3BlY2lmaWMgdmVjdG9yIGJ1Y2tldFxuKiBQcm92aWRlcyBpbmRleCBtYW5hZ2VtZW50IGFuZCBhY2Nlc3MgdG8gdmVjdG9yIG9wZXJhdGlvbnNcbipcbiogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cbiovXG52YXIgVmVjdG9yQnVja2V0U2NvcGUgPSBjbGFzcyBleHRlbmRzIFZlY3RvckluZGV4QXBpIHtcblx0LyoqXG5cdCogQGFscGhhXG5cdCpcblx0KiBDcmVhdGVzIGEgaGVscGVyIHRoYXQgYXV0b21hdGljYWxseSBzY29wZXMgYWxsIGluZGV4IG9wZXJhdGlvbnMgdG8gdGhlIHByb3ZpZGVkIGJ1Y2tldC5cblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBgYGBcblx0Ki9cblx0Y29uc3RydWN0b3IodXJsLCBoZWFkZXJzLCB2ZWN0b3JCdWNrZXROYW1lLCBmZXRjaCQxKSB7XG5cdFx0c3VwZXIodXJsLCBoZWFkZXJzLCBmZXRjaCQxKTtcblx0XHR0aGlzLnZlY3RvckJ1Y2tldE5hbWUgPSB2ZWN0b3JCdWNrZXROYW1lO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBDcmVhdGVzIGEgbmV3IHZlY3RvciBpbmRleCBpbiB0aGlzIGJ1Y2tldFxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGJ1Y2tldCBuYW1lXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBJbmRleCBjb25maWd1cmF0aW9uICh2ZWN0b3JCdWNrZXROYW1lIGlzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBlbXB0eSByZXNwb25zZSBvbiBzdWNjZXNzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBhd2FpdCBidWNrZXQuY3JlYXRlSW5kZXgoe1xuXHQqICAgaW5kZXhOYW1lOiAnZG9jdW1lbnRzLW9wZW5haScsXG5cdCogICBkYXRhVHlwZTogJ2Zsb2F0MzInLFxuXHQqICAgZGltZW5zaW9uOiAxNTM2LFxuXHQqICAgZGlzdGFuY2VNZXRyaWM6ICdjb3NpbmUnLFxuXHQqICAgbWV0YWRhdGFDb25maWd1cmF0aW9uOiB7XG5cdCogICAgIG5vbkZpbHRlcmFibGVNZXRhZGF0YUtleXM6IFsncmF3X3RleHQnXVxuXHQqICAgfVxuXHQqIH0pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGNyZWF0ZUluZGV4KG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRDcmVhdGVJbmRleCA9ICgpID0+IHN1cGVyLmNyZWF0ZUluZGV4LCBfdGhpczUgPSB0aGlzO1xuXHRcdHJldHVybiBfc3VwZXJwcm9wX2dldENyZWF0ZUluZGV4KCkuY2FsbChfdGhpczUsIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHsgdmVjdG9yQnVja2V0TmFtZTogX3RoaXM1LnZlY3RvckJ1Y2tldE5hbWUgfSkpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBMaXN0cyBpbmRleGVzIGluIHRoaXMgYnVja2V0XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgYnVja2V0IG5hbWVcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gb3B0aW9ucyAtIExpc3Rpbmcgb3B0aW9ucyAodmVjdG9yQnVja2V0TmFtZSBpcyBhdXRvbWF0aWNhbGx5IHNldClcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBpbmRleGVzIGFycmF5IGFuZCBwYWdpbmF0aW9uIHRva2VuIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGJ1Y2tldC5saXN0SW5kZXhlcyh7IHByZWZpeDogJ2RvY3VtZW50cy0nIH0pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGxpc3RJbmRleGVzKG9wdGlvbnMgPSB7fSkge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldExpc3RJbmRleGVzID0gKCkgPT4gc3VwZXIubGlzdEluZGV4ZXMsIF90aGlzNiA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0TGlzdEluZGV4ZXMoKS5jYWxsKF90aGlzNiwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwgeyB2ZWN0b3JCdWNrZXROYW1lOiBfdGhpczYudmVjdG9yQnVja2V0TmFtZSB9KSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIFJldHJpZXZlcyBtZXRhZGF0YSBmb3IgYSBzcGVjaWZpYyBpbmRleCBpbiB0aGlzIGJ1Y2tldFxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGJ1Y2tldCBuYW1lXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIGluZGV4TmFtZSAtIE5hbWUgb2YgdGhlIGluZGV4IHRvIHJldHJpZXZlXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIGluZGV4IG1ldGFkYXRhIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGJ1Y2tldC5nZXRJbmRleCgnZG9jdW1lbnRzLW9wZW5haScpXG5cdCogY29uc29sZS5sb2coJ0RpbWVuc2lvbjonLCBkYXRhPy5pbmRleC5kaW1lbnNpb24pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGdldEluZGV4KGluZGV4TmFtZSkge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldEdldEluZGV4ID0gKCkgPT4gc3VwZXIuZ2V0SW5kZXgsIF90aGlzNyA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0R2V0SW5kZXgoKS5jYWxsKF90aGlzNywgX3RoaXM3LnZlY3RvckJ1Y2tldE5hbWUsIGluZGV4TmFtZSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIERlbGV0ZXMgYW4gaW5kZXggZnJvbSB0aGlzIGJ1Y2tldFxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGJ1Y2tldCBuYW1lXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIGluZGV4TmFtZSAtIE5hbWUgb2YgdGhlIGluZGV4IHRvIGRlbGV0ZVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBlbXB0eSByZXNwb25zZSBvbiBzdWNjZXNzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBhd2FpdCBidWNrZXQuZGVsZXRlSW5kZXgoJ29sZC1pbmRleCcpXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGRlbGV0ZUluZGV4KGluZGV4TmFtZSkge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldERlbGV0ZUluZGV4ID0gKCkgPT4gc3VwZXIuZGVsZXRlSW5kZXgsIF90aGlzOCA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0RGVsZXRlSW5kZXgoKS5jYWxsKF90aGlzOCwgX3RoaXM4LnZlY3RvckJ1Y2tldE5hbWUsIGluZGV4TmFtZSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIEFjY2VzcyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIGluZGV4IHdpdGhpbiB0aGlzIGJ1Y2tldFxuXHQqIFJldHVybnMgYSBzY29wZWQgY2xpZW50IGZvciB2ZWN0b3IgZGF0YSBvcGVyYXRpb25zXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIGluZGV4TmFtZSAtIE5hbWUgb2YgdGhlIGluZGV4XG5cdCogQHJldHVybnMgSW5kZXgtc2NvcGVkIGNsaWVudCB3aXRoIHZlY3RvciBkYXRhIG9wZXJhdGlvbnNcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KlxuXHQqIC8vIEluc2VydCB2ZWN0b3JzXG5cdCogYXdhaXQgaW5kZXgucHV0VmVjdG9ycyh7XG5cdCogICB2ZWN0b3JzOiBbXG5cdCogICAgIHsga2V5OiAnZG9jLTEnLCBkYXRhOiB7IGZsb2F0MzI6IFsuLi5dIH0sIG1ldGFkYXRhOiB7IHRpdGxlOiAnSW50cm8nIH0gfVxuXHQqICAgXVxuXHQqIH0pXG5cdCpcblx0KiAvLyBRdWVyeSBzaW1pbGFyIHZlY3RvcnNcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4LnF1ZXJ5VmVjdG9ycyh7XG5cdCogICBxdWVyeVZlY3RvcjogeyBmbG9hdDMyOiBbLi4uXSB9LFxuXHQqICAgdG9wSzogNVxuXHQqIH0pXG5cdCogYGBgXG5cdCovXG5cdGluZGV4KGluZGV4TmFtZSkge1xuXHRcdHJldHVybiBuZXcgVmVjdG9ySW5kZXhTY29wZSh0aGlzLnVybCwgdGhpcy5oZWFkZXJzLCB0aGlzLnZlY3RvckJ1Y2tldE5hbWUsIGluZGV4TmFtZSwgdGhpcy5mZXRjaCk7XG5cdH1cbn07XG4vKipcbipcbiogQGFscGhhXG4qXG4qIFNjb3BlZCBjbGllbnQgZm9yIG9wZXJhdGlvbnMgd2l0aGluIGEgc3BlY2lmaWMgdmVjdG9yIGluZGV4XG4qIFByb3ZpZGVzIHZlY3RvciBkYXRhIG9wZXJhdGlvbnMgKHB1dCwgZ2V0LCBsaXN0LCBxdWVyeSwgZGVsZXRlKVxuKlxuKiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuKi9cbnZhciBWZWN0b3JJbmRleFNjb3BlID0gY2xhc3MgZXh0ZW5kcyBWZWN0b3JEYXRhQXBpIHtcblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIENyZWF0ZXMgYSBoZWxwZXIgdGhhdCBhdXRvbWF0aWNhbGx5IHNjb3BlcyBhbGwgdmVjdG9yIG9wZXJhdGlvbnMgdG8gdGhlIHByb3ZpZGVkIGJ1Y2tldC9pbmRleCBuYW1lcy5cblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBpbmRleCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKS5pbmRleCgnZG9jdW1lbnRzLW9wZW5haScpXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKHVybCwgaGVhZGVycywgdmVjdG9yQnVja2V0TmFtZSwgaW5kZXhOYW1lLCBmZXRjaCQxKSB7XG5cdFx0c3VwZXIodXJsLCBoZWFkZXJzLCBmZXRjaCQxKTtcblx0XHR0aGlzLnZlY3RvckJ1Y2tldE5hbWUgPSB2ZWN0b3JCdWNrZXROYW1lO1xuXHRcdHRoaXMuaW5kZXhOYW1lID0gaW5kZXhOYW1lO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBJbnNlcnRzIG9yIHVwZGF0ZXMgdmVjdG9ycyBpbiB0aGlzIGluZGV4XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyBidWNrZXQgYW5kIGluZGV4IG5hbWVzXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBWZWN0b3IgaW5zZXJ0aW9uIG9wdGlvbnMgKGJ1Y2tldCBhbmQgaW5kZXggbmFtZXMgYXV0b21hdGljYWxseSBzZXQpXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIGVtcHR5IHJlc3BvbnNlIG9uIHN1Y2Nlc3Mgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBhd2FpdCBpbmRleC5wdXRWZWN0b3JzKHtcblx0KiAgIHZlY3RvcnM6IFtcblx0KiAgICAge1xuXHQqICAgICAgIGtleTogJ2RvYy0xJyxcblx0KiAgICAgICBkYXRhOiB7IGZsb2F0MzI6IFswLjEsIDAuMiwgLi4uXSB9LFxuXHQqICAgICAgIG1ldGFkYXRhOiB7IHRpdGxlOiAnSW50cm9kdWN0aW9uJywgcGFnZTogMSB9XG5cdCogICAgIH1cblx0KiAgIF1cblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBwdXRWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRQdXRWZWN0b3JzID0gKCkgPT4gc3VwZXIucHV0VmVjdG9ycywgX3RoaXM5ID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXRQdXRWZWN0b3JzKCkuY2FsbChfdGhpczksIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHtcblx0XHRcdHZlY3RvckJ1Y2tldE5hbWU6IF90aGlzOS52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczkuaW5kZXhOYW1lXG5cdFx0fSkpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBSZXRyaWV2ZXMgdmVjdG9ycyBieSBrZXlzIGZyb20gdGhpcyBpbmRleFxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgYnVja2V0IGFuZCBpbmRleCBuYW1lc1xuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBwYXJhbSBvcHRpb25zIC0gVmVjdG9yIHJldHJpZXZhbCBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIHZlY3RvcnMgYXJyYXkgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4LmdldFZlY3RvcnMoe1xuXHQqICAga2V5czogWydkb2MtMScsICdkb2MtMiddLFxuXHQqICAgcmV0dXJuTWV0YWRhdGE6IHRydWVcblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBnZXRWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRHZXRWZWN0b3JzID0gKCkgPT4gc3VwZXIuZ2V0VmVjdG9ycywgX3RoaXMxMCA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0R2V0VmVjdG9ycygpLmNhbGwoX3RoaXMxMCwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwge1xuXHRcdFx0dmVjdG9yQnVja2V0TmFtZTogX3RoaXMxMC52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczEwLmluZGV4TmFtZVxuXHRcdH0pKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogTGlzdHMgdmVjdG9ycyBpbiB0aGlzIGluZGV4IHdpdGggcGFnaW5hdGlvblxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgYnVja2V0IGFuZCBpbmRleCBuYW1lc1xuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBwYXJhbSBvcHRpb25zIC0gTGlzdGluZyBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIHZlY3RvcnMgYXJyYXkgYW5kIHBhZ2luYXRpb24gdG9rZW4gb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4Lmxpc3RWZWN0b3JzKHtcblx0KiAgIG1heFJlc3VsdHM6IDUwMCxcblx0KiAgIHJldHVybk1ldGFkYXRhOiB0cnVlXG5cdCogfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgbGlzdFZlY3RvcnMob3B0aW9ucyA9IHt9KSB7XG5cdFx0dmFyIF9zdXBlcnByb3BfZ2V0TGlzdFZlY3RvcnMgPSAoKSA9PiBzdXBlci5saXN0VmVjdG9ycywgX3RoaXMxMSA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0TGlzdFZlY3RvcnMoKS5jYWxsKF90aGlzMTEsIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHtcblx0XHRcdHZlY3RvckJ1Y2tldE5hbWU6IF90aGlzMTEudmVjdG9yQnVja2V0TmFtZSxcblx0XHRcdGluZGV4TmFtZTogX3RoaXMxMS5pbmRleE5hbWVcblx0XHR9KSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIFF1ZXJpZXMgZm9yIHNpbWlsYXIgdmVjdG9ycyBpbiB0aGlzIGluZGV4XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyBidWNrZXQgYW5kIGluZGV4IG5hbWVzXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBRdWVyeSBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIG1hdGNoZXMgYXJyYXkgb2Ygc2ltaWxhciB2ZWN0b3JzIG9yZGVyZWQgYnkgZGlzdGFuY2Ugb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4LnF1ZXJ5VmVjdG9ycyh7XG5cdCogICBxdWVyeVZlY3RvcjogeyBmbG9hdDMyOiBbMC4xLCAwLjIsIC4uLl0gfSxcblx0KiAgIHRvcEs6IDUsXG5cdCogICBmaWx0ZXI6IHsgY2F0ZWdvcnk6ICd0ZWNobmljYWwnIH0sXG5cdCogICByZXR1cm5EaXN0YW5jZTogdHJ1ZSxcblx0KiAgIHJldHVybk1ldGFkYXRhOiB0cnVlXG5cdCogfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgcXVlcnlWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRRdWVyeVZlY3RvcnMgPSAoKSA9PiBzdXBlci5xdWVyeVZlY3RvcnMsIF90aGlzMTIgPSB0aGlzO1xuXHRcdHJldHVybiBfc3VwZXJwcm9wX2dldFF1ZXJ5VmVjdG9ycygpLmNhbGwoX3RoaXMxMiwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwge1xuXHRcdFx0dmVjdG9yQnVja2V0TmFtZTogX3RoaXMxMi52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczEyLmluZGV4TmFtZVxuXHRcdH0pKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogRGVsZXRlcyB2ZWN0b3JzIGJ5IGtleXMgZnJvbSB0aGlzIGluZGV4XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyBidWNrZXQgYW5kIGluZGV4IG5hbWVzXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBEZWxldGlvbiBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBlbXB0eSByZXNwb25zZSBvbiBzdWNjZXNzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBpbmRleCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKS5pbmRleCgnZG9jdW1lbnRzLW9wZW5haScpXG5cdCogYXdhaXQgaW5kZXguZGVsZXRlVmVjdG9ycyh7XG5cdCogICBrZXlzOiBbJ2RvYy0xJywgJ2RvYy0yJywgJ2RvYy0zJ11cblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBkZWxldGVWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXREZWxldGVWZWN0b3JzID0gKCkgPT4gc3VwZXIuZGVsZXRlVmVjdG9ycywgX3RoaXMxMyA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0RGVsZXRlVmVjdG9ycygpLmNhbGwoX3RoaXMxMywgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwge1xuXHRcdFx0dmVjdG9yQnVja2V0TmFtZTogX3RoaXMxMy52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczEzLmluZGV4TmFtZVxuXHRcdH0pKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1N0b3JhZ2VDbGllbnQudHNcbnZhciBTdG9yYWdlQ2xpZW50ID0gY2xhc3MgZXh0ZW5kcyBTdG9yYWdlQnVja2V0QXBpIHtcblx0LyoqXG5cdCogQ3JlYXRlcyBhIGNsaWVudCBmb3IgU3RvcmFnZSBidWNrZXRzLCBmaWxlcywgYW5hbHl0aWNzLCBhbmQgdmVjdG9ycy5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHRzXG5cdCogaW1wb3J0IHsgU3RvcmFnZUNsaWVudCB9IGZyb20gJ0BzdXBhYmFzZS9zdG9yYWdlLWpzJ1xuXHQqXG5cdCogY29uc3Qgc3RvcmFnZSA9IG5ldyBTdG9yYWdlQ2xpZW50KCdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vc3RvcmFnZS92MScsIHtcblx0KiAgIGFwaWtleTogJ3B1YmxpYy1hbm9uLWtleScsXG5cdCogfSlcblx0KiBjb25zdCBhdmF0YXJzID0gc3RvcmFnZS5mcm9tKCdhdmF0YXJzJylcblx0KiBgYGBcblx0Ki9cblx0Y29uc3RydWN0b3IodXJsLCBoZWFkZXJzID0ge30sIGZldGNoJDEsIG9wdHMpIHtcblx0XHRzdXBlcih1cmwsIGhlYWRlcnMsIGZldGNoJDEsIG9wdHMpO1xuXHR9XG5cdC8qKlxuXHQqIFBlcmZvcm0gZmlsZSBvcGVyYXRpb24gaW4gYSBidWNrZXQuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIGlkIFRoZSBidWNrZXQgaWQgdG8gb3BlcmF0ZSBvbi5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGF2YXRhcnMgPSBzdXBhYmFzZS5zdG9yYWdlLmZyb20oJ2F2YXRhcnMnKVxuXHQqIGBgYFxuXHQqL1xuXHRmcm9tKGlkKSB7XG5cdFx0cmV0dXJuIG5ldyBTdG9yYWdlRmlsZUFwaSh0aGlzLnVybCwgdGhpcy5oZWFkZXJzLCBpZCwgdGhpcy5mZXRjaCk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIEFjY2VzcyB2ZWN0b3Igc3RvcmFnZSBvcGVyYXRpb25zLlxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEByZXR1cm5zIEEgU3RvcmFnZVZlY3RvcnNDbGllbnQgaW5zdGFuY2UgY29uZmlndXJlZCB3aXRoIHRoZSBjdXJyZW50IHN0b3JhZ2Ugc2V0dGluZ3MuXG5cdCovXG5cdGdldCB2ZWN0b3JzKCkge1xuXHRcdHJldHVybiBuZXcgU3RvcmFnZVZlY3RvcnNDbGllbnQodGhpcy51cmwgKyBcIi92ZWN0b3JcIiwge1xuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0ZmV0Y2g6IHRoaXMuZmV0Y2hcblx0XHR9KTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogQWNjZXNzIGFuYWx5dGljcyBzdG9yYWdlIG9wZXJhdGlvbnMgdXNpbmcgSWNlYmVyZyB0YWJsZXMuXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IEFuYWx5dGljcyBCdWNrZXRzXG5cdCogQHJldHVybnMgQSBTdG9yYWdlQW5hbHl0aWNzQ2xpZW50IGluc3RhbmNlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgY3VycmVudCBzdG9yYWdlIHNldHRpbmdzLlxuXHQqL1xuXHRnZXQgYW5hbHl0aWNzKCkge1xuXHRcdHJldHVybiBuZXcgU3RvcmFnZUFuYWx5dGljc0NsaWVudCh0aGlzLnVybCArIFwiL2ljZWJlcmdcIiwgdGhpcy5oZWFkZXJzLCB0aGlzLmZldGNoKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBTdG9yYWdlQW5hbHl0aWNzQ2xpZW50LCBTdG9yYWdlQXBpRXJyb3IsIFN0b3JhZ2VDbGllbnQsIFN0b3JhZ2VFcnJvciwgU3RvcmFnZVVua25vd25FcnJvciwgU3RvcmFnZVZlY3RvcnNBcGlFcnJvciwgU3RvcmFnZVZlY3RvcnNDbGllbnQsIFN0b3JhZ2VWZWN0b3JzRXJyb3IsIFN0b3JhZ2VWZWN0b3JzRXJyb3JDb2RlLCBTdG9yYWdlVmVjdG9yc1Vua25vd25FcnJvciwgVmVjdG9yQnVja2V0QXBpLCBWZWN0b3JCdWNrZXRTY29wZSwgVmVjdG9yRGF0YUFwaSwgVmVjdG9ySW5kZXhBcGksIFZlY3RvckluZGV4U2NvcGUsIGlzUGxhaW5PYmplY3QsIGlzU3RvcmFnZUVycm9yLCBpc1N0b3JhZ2VWZWN0b3JzRXJyb3IsIG5vcm1hbGl6ZVRvRmxvYXQzMiwgcmVzb2x2ZUZldGNoLCByZXNvbHZlUmVzcG9uc2UsIHZhbGlkYXRlVmVjdG9yRGltZW5zaW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIl0sIm5hbWVzIjpbIkljZWJlcmdSZXN0Q2F0YWxvZyIsIlN0b3JhZ2VFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJtZXNzYWdlIiwiX19pc1N0b3JhZ2VFcnJvciIsIm5hbWUiLCJpc1N0b3JhZ2VFcnJvciIsImVycm9yIiwiU3RvcmFnZUFwaUVycm9yIiwidG9KU09OIiwic3RhdHVzIiwic3RhdHVzQ29kZSIsIlN0b3JhZ2VVbmtub3duRXJyb3IiLCJvcmlnaW5hbEVycm9yIiwicmVzb2x2ZUZldGNoJDEiLCJjdXN0b21GZXRjaCIsImFyZ3MiLCJmZXRjaCIsInJlc29sdmVSZXNwb25zZSQxIiwiUmVzcG9uc2UiLCJyZWN1cnNpdmVUb0NhbWVsIiwiaXRlbSIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsImVsIiwiT2JqZWN0IiwicmVzdWx0IiwiZW50cmllcyIsImZvckVhY2giLCJrZXkiLCJ2YWx1ZSIsIm5ld0tleSIsInJlcGxhY2UiLCJjIiwidG9VcHBlckNhc2UiLCJpc1BsYWluT2JqZWN0JDEiLCJwcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwiaXRlcmF0b3IiLCJpc1ZhbGlkQnVja2V0TmFtZSIsImJ1Y2tldE5hbWUiLCJsZW5ndGgiLCJ0cmltIiwiaW5jbHVkZXMiLCJ0ZXN0IiwiX3R5cGVvZiIsIm8iLCJvJDEiLCJ0b1ByaW1pdGl2ZSIsInQiLCJyIiwiZSIsImkiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwidG9Qcm9wZXJ0eUtleSIsIl9kZWZpbmVQcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJyJDEiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkMiIsImFyZ3VtZW50cyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX2dldEVycm9yTWVzc2FnZSQxIiwiZXJyIiwiX2VyciRlcnJvciIsIm1zZyIsImVycm9yX2Rlc2NyaXB0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsImhhbmRsZUVycm9yJDEiLCJyZWplY3QiLCJvcHRpb25zIiwibm9SZXNvbHZlSnNvbiIsImpzb24iLCJ0aGVuIiwiY2F0Y2giLCJfZ2V0UmVxdWVzdFBhcmFtcyQxIiwibWV0aG9kIiwicGFyYW1ldGVycyIsImJvZHkiLCJwYXJhbXMiLCJoZWFkZXJzIiwiZHVwbGV4IiwiX2hhbmRsZVJlcXVlc3QkMSIsImZldGNoZXIiLCJ1cmwiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9rIiwiZGF0YSIsImdldCIsInBvc3QkMSIsInB1dCIsImhlYWQiLCJyZW1vdmUiLCJTdHJlYW1Eb3dubG9hZEJ1aWxkZXIiLCJvbmZ1bGZpbGxlZCIsIm9ucmVqZWN0ZWQiLCJleGVjdXRlIiwiX3RoaXMiLCJkb3dubG9hZEZuIiwic2hvdWxkVGhyb3dPbkVycm9yIiwiX1N5bWJvbCR0b1N0cmluZ1RhZyIsIkJsb2JEb3dubG9hZEJ1aWxkZXIiLCJhc1N0cmVhbSIsImdldFByb21pc2UiLCJmaW5hbGx5Iiwib25maW5hbGx5IiwicHJvbWlzZSIsImJsb2IiLCJERUZBVUxUX1NFQVJDSF9PUFRJT05TIiwibGltaXQiLCJvZmZzZXQiLCJzb3J0QnkiLCJjb2x1bW4iLCJvcmRlciIsIkRFRkFVTFRfRklMRV9PUFRJT05TIiwiY2FjaGVDb250cm9sIiwiY29udGVudFR5cGUiLCJ1cHNlcnQiLCJTdG9yYWdlRmlsZUFwaSIsInRocm93T25FcnJvciIsInVwbG9hZE9yVXBkYXRlIiwicGF0aCIsImZpbGVCb2R5IiwiZmlsZU9wdGlvbnMiLCJtZXRhZGF0YSIsIkJsb2IiLCJGb3JtRGF0YSIsImFwcGVuZCIsImVuY29kZU1ldGFkYXRhIiwiaGFzIiwidG9CYXNlNjQiLCJSZWFkYWJsZVN0cmVhbSIsInBpcGUiLCJjbGVhblBhdGgiLCJfcmVtb3ZlRW1wdHlGb2xkZXJzIiwiX3BhdGgiLCJfZ2V0RmluYWxQYXRoIiwiaWQiLCJJZCIsImZ1bGxQYXRoIiwiS2V5IiwidXBsb2FkIiwidXBsb2FkVG9TaWduZWRVcmwiLCJ0b2tlbiIsIl90aGlzMyIsIlVSTCIsInNlYXJjaFBhcmFtcyIsInNldCIsInRvU3RyaW5nIiwiY3JlYXRlU2lnbmVkVXBsb2FkVXJsIiwiX3RoaXM0Iiwic2lnbmVkVXJsIiwidXBkYXRlIiwibW92ZSIsImZyb21QYXRoIiwidG9QYXRoIiwiX3RoaXM2IiwiYnVja2V0SWQiLCJzb3VyY2VLZXkiLCJkZXN0aW5hdGlvbktleSIsImRlc3RpbmF0aW9uQnVja2V0IiwiY29weSIsIl90aGlzNyIsImNyZWF0ZVNpZ25lZFVybCIsImV4cGlyZXNJbiIsIl90aGlzOCIsInRyYW5zZm9ybSIsImRvd25sb2FkUXVlcnlQYXJhbSIsImRvd25sb2FkIiwiZW5jb2RlVVJJIiwic2lnbmVkVVJMIiwiY3JlYXRlU2lnbmVkVXJscyIsInBhdGhzIiwiX3RoaXM5IiwiZGF0dW0iLCJyZW5kZXJQYXRoIiwidHJhbnNmb3JtYXRpb25RdWVyeSIsInRyYW5zZm9ybU9wdHNUb1F1ZXJ5U3RyaW5nIiwicXVlcnlTdHJpbmciLCJpbmZvIiwiX3RoaXMxMCIsImV4aXN0cyIsIl90aGlzMTEiLCJnZXRQdWJsaWNVcmwiLCJfcXVlcnlTdHJpbmciLCJqb2luIiwicHVibGljVXJsIiwiX3RoaXMxMiIsInByZWZpeGVzIiwibGlzdCIsIl90aGlzMTMiLCJwcmVmaXgiLCJsaXN0VjIiLCJfdGhpczE0IiwiQnVmZmVyIiwiZnJvbSIsImJ0b2EiLCJ3aWR0aCIsImhlaWdodCIsInJlc2l6ZSIsImZvcm1hdCIsInF1YWxpdHkiLCJmZXRjaCQxIiwidmVyc2lvbiIsIkRFRkFVTFRfSEVBREVSUyQxIiwiU3RvcmFnZUJ1Y2tldEFwaSIsImxpc3RCdWNrZXRzIiwibGlzdEJ1Y2tldE9wdGlvbnNUb1F1ZXJ5U3RyaW5nIiwiZ2V0QnVja2V0IiwiX3RoaXMyIiwiY3JlYXRlQnVja2V0IiwicHVibGljIiwidHlwZSIsImZpbGVfc2l6ZV9saW1pdCIsImZpbGVTaXplTGltaXQiLCJhbGxvd2VkX21pbWVfdHlwZXMiLCJhbGxvd2VkTWltZVR5cGVzIiwidXBkYXRlQnVja2V0IiwiZW1wdHlCdWNrZXQiLCJfdGhpczUiLCJkZWxldGVCdWNrZXQiLCJzZWFyY2giLCJzb3J0Q29sdW1uIiwic29ydE9yZGVyIiwiVVJMU2VhcmNoUGFyYW1zIiwib3B0cyIsImJhc2VVcmwiLCJ1c2VOZXdIb3N0bmFtZSIsImhvc3RuYW1lIiwiaHJlZiIsIlN0b3JhZ2VBbmFseXRpY3NDbGllbnQiLCJxdWVyeVBhcmFtcyIsImNhdGFsb2ciLCJjYXRhbG9nTmFtZSIsImF1dGgiLCJnZXRIZWFkZXJzIiwiUHJveHkiLCJ0YXJnZXQiLCJwcm9wIiwiREVGQVVMVF9IRUFERVJTIiwiU3RvcmFnZVZlY3RvcnNFcnJvciIsIl9faXNTdG9yYWdlVmVjdG9yc0Vycm9yIiwiaXNTdG9yYWdlVmVjdG9yc0Vycm9yIiwiU3RvcmFnZVZlY3RvcnNBcGlFcnJvciIsIlN0b3JhZ2VWZWN0b3JzVW5rbm93bkVycm9yIiwiU3RvcmFnZVZlY3RvcnNFcnJvckNvZGUiLCJTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSQxIiwicmVzb2x2ZUZldGNoIiwicmVzb2x2ZVJlc3BvbnNlIiwiaXNQbGFpbk9iamVjdCIsIm5vcm1hbGl6ZVRvRmxvYXQzMiIsInZhbHVlcyIsIkZsb2F0MzJBcnJheSIsInZhbGlkYXRlVmVjdG9yRGltZW5zaW9uIiwidmVjdG9yIiwiZXhwZWN0ZWREaW1lbnNpb24iLCJmbG9hdDMyIiwiX2dldEVycm9yTWVzc2FnZSIsImhhbmRsZUVycm9yIiwicmVzcG9uc2VFcnJvciIsImNvZGUiLCJzdGF0dXNUZXh0IiwiX2dldFJlcXVlc3RQYXJhbXMiLCJfaGFuZGxlUmVxdWVzdCIsInBvc3QiLCJWZWN0b3JJbmRleEFwaSIsImNyZWF0ZUluZGV4IiwiZ2V0SW5kZXgiLCJ2ZWN0b3JCdWNrZXROYW1lIiwiaW5kZXhOYW1lIiwibGlzdEluZGV4ZXMiLCJkZWxldGVJbmRleCIsIlZlY3RvckRhdGFBcGkiLCJwdXRWZWN0b3JzIiwidmVjdG9ycyIsImdldFZlY3RvcnMiLCJsaXN0VmVjdG9ycyIsInNlZ21lbnRDb3VudCIsInNlZ21lbnRJbmRleCIsInF1ZXJ5VmVjdG9ycyIsImRlbGV0ZVZlY3RvcnMiLCJWZWN0b3JCdWNrZXRBcGkiLCJTdG9yYWdlVmVjdG9yc0NsaWVudCIsIlZlY3RvckJ1Y2tldFNjb3BlIiwiX3N1cGVycHJvcF9nZXRDcmVhdGVCdWNrZXQiLCJfc3VwZXJwcm9wX2dldEdldEJ1Y2tldCIsIl9zdXBlcnByb3BfZ2V0TGlzdEJ1Y2tldHMiLCJfc3VwZXJwcm9wX2dldERlbGV0ZUJ1Y2tldCIsIl9zdXBlcnByb3BfZ2V0Q3JlYXRlSW5kZXgiLCJfc3VwZXJwcm9wX2dldExpc3RJbmRleGVzIiwiX3N1cGVycHJvcF9nZXRHZXRJbmRleCIsIl9zdXBlcnByb3BfZ2V0RGVsZXRlSW5kZXgiLCJpbmRleCIsIlZlY3RvckluZGV4U2NvcGUiLCJfc3VwZXJwcm9wX2dldFB1dFZlY3RvcnMiLCJfc3VwZXJwcm9wX2dldEdldFZlY3RvcnMiLCJfc3VwZXJwcm9wX2dldExpc3RWZWN0b3JzIiwiX3N1cGVycHJvcF9nZXRRdWVyeVZlY3RvcnMiLCJfc3VwZXJwcm9wX2dldERlbGV0ZVZlY3RvcnMiLCJTdG9yYWdlQ2xpZW50IiwiYW5hbHl0aWNzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/storage-js/dist/index.mjs\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/@supabase/supabase-js/dist/index.mjs":
/*!***********************************************************!*\
!*** ./node_modules/@supabase/supabase-js/dist/index.mjs ***!
\***********************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthAdminApi: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthAdminApi; },\n/* harmony export */ AuthApiError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthApiError; },\n/* harmony export */ AuthClient: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthClient; },\n/* harmony export */ AuthError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthError; },\n/* harmony export */ AuthImplicitGrantRedirectError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthImplicitGrantRedirectError; },\n/* harmony export */ AuthInvalidCredentialsError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidCredentialsError; },\n/* harmony export */ AuthInvalidJwtError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidJwtError; },\n/* harmony export */ AuthInvalidTokenResponseError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidTokenResponseError; },\n/* harmony export */ AuthPKCECodeVerifierMissingError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthPKCECodeVerifierMissingError; },\n/* harmony export */ AuthPKCEGrantCodeExchangeError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthPKCEGrantCodeExchangeError; },\n/* harmony export */ AuthRetryableFetchError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthRetryableFetchError; },\n/* harmony export */ AuthSessionMissingError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError; },\n/* harmony export */ AuthUnknownError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthUnknownError; },\n/* harmony export */ AuthWeakPasswordError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthWeakPasswordError; },\n/* harmony export */ CustomAuthError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.CustomAuthError; },\n/* harmony export */ FunctionRegion: function() { return /* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionRegion; },\n/* harmony export */ FunctionsError: function() { return /* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsError; },\n/* harmony export */ FunctionsFetchError: function() { return /* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsFetchError; },\n/* harmony export */ FunctionsHttpError: function() { return /* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsHttpError; },\n/* harmony export */ FunctionsRelayError: function() { return /* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsRelayError; },\n/* harmony export */ GoTrueAdminApi: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.GoTrueAdminApi; },\n/* harmony export */ GoTrueClient: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.GoTrueClient; },\n/* harmony export */ NavigatorLockAcquireTimeoutError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.NavigatorLockAcquireTimeoutError; },\n/* harmony export */ PostgrestError: function() { return /* reexport safe */ _supabase_postgrest_js__WEBPACK_IMPORTED_MODULE_0__.PostgrestError; },\n/* harmony export */ REALTIME_CHANNEL_STATES: function() { return /* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_CHANNEL_STATES; },\n/* harmony export */ REALTIME_LISTEN_TYPES: function() { return /* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_LISTEN_TYPES; },\n/* harmony export */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT: function() { return /* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_POSTGRES_CHANGES_LISTEN_EVENT; },\n/* harmony export */ REALTIME_PRESENCE_LISTEN_EVENTS: function() { return /* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_PRESENCE_LISTEN_EVENTS; },\n/* harmony export */ REALTIME_SUBSCRIBE_STATES: function() { return /* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_SUBSCRIBE_STATES; },\n/* harmony export */ RealtimeChannel: function() { return /* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.RealtimeChannel; },\n/* harmony export */ RealtimeClient: function() { return /* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.RealtimeClient; },\n/* harmony export */ RealtimePresence: function() { return /* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.RealtimePresence; },\n/* harmony export */ SIGN_OUT_SCOPES: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.SIGN_OUT_SCOPES; },\n/* harmony export */ SupabaseClient: function() { return /* binding */ SupabaseClient; },\n/* harmony export */ WebSocketFactory: function() { return /* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.WebSocketFactory; },\n/* harmony export */ createClient: function() { return /* binding */ createClient; },\n/* harmony export */ isAuthApiError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthApiError; },\n/* harmony export */ isAuthError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthError; },\n/* harmony export */ isAuthImplicitGrantRedirectError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthImplicitGrantRedirectError; },\n/* harmony export */ isAuthPKCECodeVerifierMissingError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthPKCECodeVerifierMissingError; },\n/* harmony export */ isAuthRetryableFetchError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthRetryableFetchError; },\n/* harmony export */ isAuthSessionMissingError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthSessionMissingError; },\n/* harmony export */ isAuthWeakPasswordError: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthWeakPasswordError; },\n/* harmony export */ lockInternals: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.lockInternals; },\n/* harmony export */ navigatorLock: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.navigatorLock; },\n/* harmony export */ processLock: function() { return /* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.processLock; }\n/* harmony export */ });\n/* harmony import */ var _supabase_functions_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @supabase/functions-js */ \"(app-pages-browser)/./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js\");\n/* harmony import */ var _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @supabase/functions-js */ \"(app-pages-browser)/./node_modules/@supabase/functions-js/dist/module/types.js\");\n/* harmony import */ var _supabase_postgrest_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @supabase/postgrest-js */ \"(app-pages-browser)/./node_modules/@supabase/postgrest-js/dist/index.mjs\");\n/* harmony import */ var _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @supabase/realtime-js */ \"(app-pages-browser)/./node_modules/@supabase/realtime-js/dist/module/index.js\");\n/* harmony import */ var _supabase_storage_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @supabase/storage-js */ \"(app-pages-browser)/./node_modules/@supabase/storage-js/dist/index.mjs\");\n/* harmony import */ var _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @supabase/auth-js */ \"(app-pages-browser)/./node_modules/@supabase/auth-js/dist/module/index.js\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n\n\n\n\n\n\n\n//#region src/lib/version.ts\nconst version = \"2.88.0\";\n//#endregion\n//#region src/lib/constants.ts\nlet JS_ENV = \"\";\nif (typeof Deno !== \"undefined\") JS_ENV = \"deno\";\nelse if (typeof document !== \"undefined\") JS_ENV = \"web\";\nelse if (typeof navigator !== \"undefined\" && navigator.product === \"ReactNative\") JS_ENV = \"react-native\";\nelse JS_ENV = \"node\";\nconst DEFAULT_HEADERS = {\n \"X-Client-Info\": \"supabase-js-\".concat(JS_ENV, \"/\").concat(version)\n};\nconst DEFAULT_GLOBAL_OPTIONS = {\n headers: DEFAULT_HEADERS\n};\nconst DEFAULT_DB_OPTIONS = {\n schema: \"public\"\n};\nconst DEFAULT_AUTH_OPTIONS = {\n autoRefreshToken: true,\n persistSession: true,\n detectSessionInUrl: true,\n flowType: \"implicit\"\n};\nconst DEFAULT_REALTIME_OPTIONS = {};\n//#endregion\n//#region \\0@oxc-project+runtime@0.101.0/helpers/typeof.js\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(o$1) {\n return typeof o$1;\n } : function(o$1) {\n return o$1 && \"function\" == typeof Symbol && o$1.constructor === Symbol && o$1 !== Symbol.prototype ? \"symbol\" : typeof o$1;\n }, _typeof(o);\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.101.0/helpers/toPrimitive.js\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.101.0/helpers/toPropertyKey.js\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.101.0/helpers/defineProperty.js\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\n//#endregion\n//#region \\0@oxc-project+runtime@0.101.0/helpers/objectSpread2.js\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function(r$1) {\n return Object.getOwnPropertyDescriptor(e, r$1).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for(var r = 1; r < arguments.length; r++){\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function(r$1) {\n _defineProperty(e, r$1, t[r$1]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r$1) {\n Object.defineProperty(e, r$1, Object.getOwnPropertyDescriptor(t, r$1));\n });\n }\n return e;\n}\n//#endregion\n//#region src/lib/fetch.ts\nconst resolveFetch = (customFetch)=>{\n if (customFetch) return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return customFetch(...args);\n };\n return function() {\n for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n args[_key] = arguments[_key];\n }\n return fetch(...args);\n };\n};\nconst resolveHeadersConstructor = ()=>{\n return Headers;\n};\nconst fetchWithAuth = (supabaseKey, getAccessToken, customFetch)=>{\n const fetch$1 = resolveFetch(customFetch);\n const HeadersConstructor = resolveHeadersConstructor();\n return async (input, init)=>{\n var _await$getAccessToken;\n const accessToken = (_await$getAccessToken = await getAccessToken()) !== null && _await$getAccessToken !== void 0 ? _await$getAccessToken : supabaseKey;\n let headers = new HeadersConstructor(init === null || init === void 0 ? void 0 : init.headers);\n if (!headers.has(\"apikey\")) headers.set(\"apikey\", supabaseKey);\n if (!headers.has(\"Authorization\")) headers.set(\"Authorization\", \"Bearer \".concat(accessToken));\n return fetch$1(input, _objectSpread2(_objectSpread2({}, init), {}, {\n headers\n }));\n };\n};\n//#endregion\n//#region src/lib/helpers.ts\nfunction ensureTrailingSlash(url) {\n return url.endsWith(\"/\") ? url : url + \"/\";\n}\nfunction applySettingDefaults(options, defaults) {\n var _DEFAULT_GLOBAL_OPTIO, _globalOptions$header;\n const { db: dbOptions, auth: authOptions, realtime: realtimeOptions, global: globalOptions } = options;\n const { db: DEFAULT_DB_OPTIONS$1, auth: DEFAULT_AUTH_OPTIONS$1, realtime: DEFAULT_REALTIME_OPTIONS$1, global: DEFAULT_GLOBAL_OPTIONS$1 } = defaults;\n const result = {\n db: _objectSpread2(_objectSpread2({}, DEFAULT_DB_OPTIONS$1), dbOptions),\n auth: _objectSpread2(_objectSpread2({}, DEFAULT_AUTH_OPTIONS$1), authOptions),\n realtime: _objectSpread2(_objectSpread2({}, DEFAULT_REALTIME_OPTIONS$1), realtimeOptions),\n storage: {},\n global: _objectSpread2(_objectSpread2(_objectSpread2({}, DEFAULT_GLOBAL_OPTIONS$1), globalOptions), {}, {\n headers: _objectSpread2(_objectSpread2({}, (_DEFAULT_GLOBAL_OPTIO = DEFAULT_GLOBAL_OPTIONS$1 === null || DEFAULT_GLOBAL_OPTIONS$1 === void 0 ? void 0 : DEFAULT_GLOBAL_OPTIONS$1.headers) !== null && _DEFAULT_GLOBAL_OPTIO !== void 0 ? _DEFAULT_GLOBAL_OPTIO : {}), (_globalOptions$header = globalOptions === null || globalOptions === void 0 ? void 0 : globalOptions.headers) !== null && _globalOptions$header !== void 0 ? _globalOptions$header : {})\n }),\n accessToken: async ()=>\"\"\n };\n if (options.accessToken) result.accessToken = options.accessToken;\n else delete result.accessToken;\n return result;\n}\n/**\n* Validates a Supabase client URL\n*\n* @param {string} supabaseUrl - The Supabase client URL string.\n* @returns {URL} - The validated base URL.\n* @throws {Error}\n*/ function validateSupabaseUrl(supabaseUrl) {\n const trimmedUrl = supabaseUrl === null || supabaseUrl === void 0 ? void 0 : supabaseUrl.trim();\n if (!trimmedUrl) throw new Error(\"supabaseUrl is required.\");\n if (!trimmedUrl.match(/^https?:\\/\\//i)) throw new Error(\"Invalid supabaseUrl: Must be a valid HTTP or HTTPS URL.\");\n try {\n return new URL(ensureTrailingSlash(trimmedUrl));\n } catch (_unused) {\n throw Error(\"Invalid supabaseUrl: Provided URL is malformed.\");\n }\n}\n//#endregion\n//#region src/lib/SupabaseAuthClient.ts\nvar SupabaseAuthClient = class extends _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthClient {\n constructor(options){\n super(options);\n }\n};\n//#endregion\n//#region src/SupabaseClient.ts\n/**\n* Supabase Client.\n*\n* An isomorphic Javascript client for interacting with Postgres.\n*/ var SupabaseClient = class {\n /**\n\t* Supabase Functions allows you to deploy and invoke edge functions.\n\t*/ get functions() {\n return new _supabase_functions_js__WEBPACK_IMPORTED_MODULE_3__.FunctionsClient(this.functionsUrl.href, {\n headers: this.headers,\n customFetch: this.fetch\n });\n }\n /**\n\t* Perform a query on a table or a view.\n\t*\n\t* @param relation - The table or view name to query\n\t*/ from(relation) {\n return this.rest.from(relation);\n }\n /**\n\t* Select a schema to query or perform an function (rpc) call.\n\t*\n\t* The schema needs to be on the list of exposed schemas inside Supabase.\n\t*\n\t* @param schema - The schema to query\n\t*/ schema(schema) {\n return this.rest.schema(schema);\n }\n /**\n\t* Perform a function call.\n\t*\n\t* @param fn - The function name to call\n\t* @param args - The arguments to pass to the function call\n\t* @param options - Named parameters\n\t* @param options.head - When set to `true`, `data` will not be returned.\n\t* Useful if you only need the count.\n\t* @param options.get - When set to `true`, the function will be called with\n\t* read-only access mode.\n\t* @param options.count - Count algorithm to use to count rows returned by the\n\t* function. Only applicable for [set-returning\n\t* functions](https://www.postgresql.org/docs/current/functions-srf.html).\n\t*\n\t* `\"exact\"`: Exact but slow count algorithm. Performs a `COUNT(*)` under the\n\t* hood.\n\t*\n\t* `\"planned\"`: Approximated but fast count algorithm. Uses the Postgres\n\t* statistics under the hood.\n\t*\n\t* `\"estimated\"`: Uses exact count for low numbers and planned count for high\n\t* numbers.\n\t*/ rpc(fn) {\n let args = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {\n head: false,\n get: false,\n count: void 0\n };\n return this.rest.rpc(fn, args, options);\n }\n /**\n\t* Creates a Realtime channel with Broadcast, Presence, and Postgres Changes.\n\t*\n\t* @param {string} name - The name of the Realtime channel.\n\t* @param {Object} opts - The options to pass to the Realtime channel.\n\t*\n\t*/ channel(name) {\n let opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {\n config: {}\n };\n return this.realtime.channel(name, opts);\n }\n /**\n\t* Returns all Realtime channels.\n\t*/ getChannels() {\n return this.realtime.getChannels();\n }\n /**\n\t* Unsubscribes and removes Realtime channel from Realtime client.\n\t*\n\t* @param {RealtimeChannel} channel - The name of the Realtime channel.\n\t*\n\t*/ removeChannel(channel) {\n return this.realtime.removeChannel(channel);\n }\n /**\n\t* Unsubscribes and removes all Realtime channels from Realtime client.\n\t*/ removeAllChannels() {\n return this.realtime.removeAllChannels();\n }\n async _getAccessToken() {\n var _this = this;\n var _data$session$access_, _data$session;\n if (_this.accessToken) return await _this.accessToken();\n const { data } = await _this.auth.getSession();\n return (_data$session$access_ = (_data$session = data.session) === null || _data$session === void 0 ? void 0 : _data$session.access_token) !== null && _data$session$access_ !== void 0 ? _data$session$access_ : _this.supabaseKey;\n }\n _initSupabaseAuthClient(param, headers, fetch$1) {\n let { autoRefreshToken, persistSession, detectSessionInUrl, storage, userStorage, storageKey, flowType, lock, debug, throwOnError } = param;\n const authHeaders = {\n Authorization: \"Bearer \".concat(this.supabaseKey),\n apikey: \"\".concat(this.supabaseKey)\n };\n return new SupabaseAuthClient({\n url: this.authUrl.href,\n headers: _objectSpread2(_objectSpread2({}, authHeaders), headers),\n storageKey,\n autoRefreshToken,\n persistSession,\n detectSessionInUrl,\n storage,\n userStorage,\n flowType,\n lock,\n debug,\n throwOnError,\n fetch: fetch$1,\n hasCustomAuthorizationHeader: Object.keys(this.headers).some((key)=>key.toLowerCase() === \"authorization\")\n });\n }\n _initRealtimeClient(options) {\n return new _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.RealtimeClient(this.realtimeUrl.href, _objectSpread2(_objectSpread2({}, options), {}, {\n params: _objectSpread2(_objectSpread2({}, {\n apikey: this.supabaseKey\n }), options === null || options === void 0 ? void 0 : options.params)\n }));\n }\n _listenForAuthEvents() {\n return this.auth.onAuthStateChange((event, session)=>{\n this._handleTokenChanged(event, \"CLIENT\", session === null || session === void 0 ? void 0 : session.access_token);\n });\n }\n _handleTokenChanged(event, source, token) {\n if ((event === \"TOKEN_REFRESHED\" || event === \"SIGNED_IN\") && this.changedAccessToken !== token) {\n this.changedAccessToken = token;\n this.realtime.setAuth(token);\n } else if (event === \"SIGNED_OUT\") {\n this.realtime.setAuth();\n if (source == \"STORAGE\") this.auth.signOut();\n this.changedAccessToken = void 0;\n }\n }\n /**\n\t* Create a new client for use in the browser.\n\t* @param supabaseUrl The unique Supabase URL which is supplied when you create a new project in your project dashboard.\n\t* @param supabaseKey The unique Supabase Key which is supplied when you create a new project in your project dashboard.\n\t* @param options.db.schema You can switch in between schemas. The schema needs to be on the list of exposed schemas inside Supabase.\n\t* @param options.auth.autoRefreshToken Set to \"true\" if you want to automatically refresh the token before expiring.\n\t* @param options.auth.persistSession Set to \"true\" if you want to automatically save the user session into local storage.\n\t* @param options.auth.detectSessionInUrl Set to \"true\" if you want to automatically detects OAuth grants in the URL and signs in the user.\n\t* @param options.realtime Options passed along to realtime-js constructor.\n\t* @param options.storage Options passed along to the storage-js constructor.\n\t* @param options.global.fetch A custom fetch implementation.\n\t* @param options.global.headers Any additional headers to send with each network request.\n\t* @example\n\t* ```ts\n\t* import { createClient } from '@supabase/supabase-js'\n\t*\n\t* const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key')\n\t* const { data } = await supabase.from('profiles').select('*')\n\t* ```\n\t*/ constructor(supabaseUrl, supabaseKey, options){\n var _settings$auth$storag, _settings$global$head;\n this.supabaseUrl = supabaseUrl;\n this.supabaseKey = supabaseKey;\n const baseUrl = validateSupabaseUrl(supabaseUrl);\n if (!supabaseKey) throw new Error(\"supabaseKey is required.\");\n this.realtimeUrl = new URL(\"realtime/v1\", baseUrl);\n this.realtimeUrl.protocol = this.realtimeUrl.protocol.replace(\"http\", \"ws\");\n this.authUrl = new URL(\"auth/v1\", baseUrl);\n this.storageUrl = new URL(\"storage/v1\", baseUrl);\n this.functionsUrl = new URL(\"functions/v1\", baseUrl);\n const defaultStorageKey = \"sb-\".concat(baseUrl.hostname.split(\".\")[0], \"-auth-token\");\n const DEFAULTS = {\n db: DEFAULT_DB_OPTIONS,\n realtime: DEFAULT_REALTIME_OPTIONS,\n auth: _objectSpread2(_objectSpread2({}, DEFAULT_AUTH_OPTIONS), {}, {\n storageKey: defaultStorageKey\n }),\n global: DEFAULT_GLOBAL_OPTIONS\n };\n const settings = applySettingDefaults(options !== null && options !== void 0 ? options : {}, DEFAULTS);\n this.storageKey = (_settings$auth$storag = settings.auth.storageKey) !== null && _settings$auth$storag !== void 0 ? _settings$auth$storag : \"\";\n this.headers = (_settings$global$head = settings.global.headers) !== null && _settings$global$head !== void 0 ? _settings$global$head : {};\n if (!settings.accessToken) {\n var _settings$auth;\n this.auth = this._initSupabaseAuthClient((_settings$auth = settings.auth) !== null && _settings$auth !== void 0 ? _settings$auth : {}, this.headers, settings.global.fetch);\n } else {\n this.accessToken = settings.accessToken;\n this.auth = new Proxy({}, {\n get: (_, prop)=>{\n throw new Error(\"@supabase/supabase-js: Supabase Client is configured with the accessToken option, accessing supabase.auth.\".concat(String(prop), \" is not possible\"));\n }\n });\n }\n this.fetch = fetchWithAuth(supabaseKey, this._getAccessToken.bind(this), settings.global.fetch);\n this.realtime = this._initRealtimeClient(_objectSpread2({\n headers: this.headers,\n accessToken: this._getAccessToken.bind(this)\n }, settings.realtime));\n if (this.accessToken) this.accessToken().then((token)=>this.realtime.setAuth(token)).catch((e)=>console.warn(\"Failed to set initial Realtime auth token:\", e));\n this.rest = new _supabase_postgrest_js__WEBPACK_IMPORTED_MODULE_0__.PostgrestClient(new URL(\"rest/v1\", baseUrl).href, {\n headers: this.headers,\n schema: settings.db.schema,\n fetch: this.fetch\n });\n this.storage = new _supabase_storage_js__WEBPACK_IMPORTED_MODULE_4__.StorageClient(this.storageUrl.href, this.headers, this.fetch, options === null || options === void 0 ? void 0 : options.storage);\n if (!settings.accessToken) this._listenForAuthEvents();\n }\n};\n//#endregion\n//#region src/index.ts\n/**\n* Creates a new Supabase Client.\n*\n* @example\n* ```ts\n* import { createClient } from '@supabase/supabase-js'\n*\n* const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key')\n* const { data, error } = await supabase.from('profiles').select('*')\n* ```\n*/ const createClient = (supabaseUrl, supabaseKey, options)=>{\n return new SupabaseClient(supabaseUrl, supabaseKey, options);\n};\nfunction shouldShowDeprecationWarning() {\n if (true) return false;\n if (typeof process === \"undefined\") return false;\n const processVersion = process[\"version\"];\n if (processVersion === void 0 || processVersion === null) return false;\n const versionMatch = processVersion.match(/^v(\\d+)\\./);\n if (!versionMatch) return false;\n return parseInt(versionMatch[1], 10) <= 18;\n}\nif (shouldShowDeprecationWarning()) console.warn(\"⚠️ Node.js 18 and below are deprecated and will no longer be supported in future versions of @supabase/supabase-js. Please upgrade to Node.js 20 or later. For more information, visit: https://github.com/orgs/supabase/discussions/37217\");\n//#endregion\n //# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2Uvc3VwYWJhc2UtanMvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBdUo7QUFDOUU7QUFDbEI7QUFDRjtBQUNOO0FBRVY7QUFFSjtBQUVqQyw0QkFBNEI7QUFDNUIsTUFBTVcsVUFBVTtBQUVoQixZQUFZO0FBQ1osOEJBQThCO0FBQzlCLElBQUlDLFNBQVM7QUFDYixJQUFJLE9BQU9DLFNBQVMsYUFBYUQsU0FBUztLQUNyQyxJQUFJLE9BQU9FLGFBQWEsYUFBYUYsU0FBUztLQUM5QyxJQUFJLE9BQU9HLGNBQWMsZUFBZUEsVUFBVUMsT0FBTyxLQUFLLGVBQWVKLFNBQVM7S0FDdEZBLFNBQVM7QUFDZCxNQUFNSyxrQkFBa0I7SUFBRSxpQkFBaUIsZUFBeUJOLE9BQVZDLFFBQU8sS0FBVyxPQUFSRDtBQUFVO0FBQzlFLE1BQU1PLHlCQUF5QjtJQUFFQyxTQUFTRjtBQUFnQjtBQUMxRCxNQUFNRyxxQkFBcUI7SUFBRUMsUUFBUTtBQUFTO0FBQzlDLE1BQU1DLHVCQUF1QjtJQUM1QkMsa0JBQWtCO0lBQ2xCQyxnQkFBZ0I7SUFDaEJDLG9CQUFvQjtJQUNwQkMsVUFBVTtBQUNYO0FBQ0EsTUFBTUMsMkJBQTJCLENBQUM7QUFFbEMsWUFBWTtBQUNaLDBEQUEwRDtBQUMxRCxTQUFTQyxRQUFRQyxDQUFDO0lBQ2pCO0lBQ0EsT0FBT0QsVUFBVSxjQUFjLE9BQU9FLFVBQVUsWUFBWSxPQUFPQSxPQUFPQyxRQUFRLEdBQUcsU0FBU0MsR0FBRztRQUNoRyxPQUFPLE9BQU9BO0lBQ2YsSUFBSSxTQUFTQSxHQUFHO1FBQ2YsT0FBT0EsT0FBTyxjQUFjLE9BQU9GLFVBQVVFLElBQUlDLFdBQVcsS0FBS0gsVUFBVUUsUUFBUUYsT0FBT0ksU0FBUyxHQUFHLFdBQVcsT0FBT0Y7SUFDekgsR0FBR0os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dXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3N1cGFiYXNlLWpzL2Rpc3QvaW5kZXgubWpzPzQ5M2EiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRnVuY3Rpb25SZWdpb24sIEZ1bmN0aW9uc0NsaWVudCwgRnVuY3Rpb25zRXJyb3IsIEZ1bmN0aW9uc0ZldGNoRXJyb3IsIEZ1bmN0aW9uc0h0dHBFcnJvciwgRnVuY3Rpb25zUmVsYXlFcnJvciB9IGZyb20gXCJAc3VwYWJhc2UvZnVuY3Rpb25zLWpzXCI7XG5pbXBvcnQgeyBQb3N0Z3Jlc3RDbGllbnQsIFBvc3RncmVzdEVycm9yIH0gZnJvbSBcIkBzdXBhYmFzZS9wb3N0Z3Jlc3QtanNcIjtcbmltcG9ydCB7IFJlYWx0aW1lQ2xpZW50IH0gZnJvbSBcIkBzdXBhYmFzZS9yZWFsdGltZS1qc1wiO1xuaW1wb3J0IHsgU3RvcmFnZUNsaWVudCB9IGZyb20gXCJAc3VwYWJhc2Uvc3RvcmFnZS1qc1wiO1xuaW1wb3J0IHsgQXV0aENsaWVudCB9IGZyb20gXCJAc3VwYWJhc2UvYXV0aC1qc1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiQHN1cGFiYXNlL3JlYWx0aW1lLWpzXCJcblxuZXhwb3J0ICogZnJvbSBcIkBzdXBhYmFzZS9hdXRoLWpzXCJcblxuLy8jcmVnaW9uIHNyYy9saWIvdmVyc2lvbi50c1xuY29uc3QgdmVyc2lvbiA9IFwiMi44OC4wXCI7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvY29uc3RhbnRzLnRzXG5sZXQgSlNfRU5WID0gXCJcIjtcbmlmICh0eXBlb2YgRGVubyAhPT0gXCJ1bmRlZmluZWRcIikgSlNfRU5WID0gXCJkZW5vXCI7XG5lbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIEpTX0VOViA9IFwid2ViXCI7XG5lbHNlIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci5wcm9kdWN0ID09PSBcIlJlYWN0TmF0aXZlXCIpIEpTX0VOViA9IFwicmVhY3QtbmF0aXZlXCI7XG5lbHNlIEpTX0VOViA9IFwibm9kZVwiO1xuY29uc3QgREVGQVVMVF9IRUFERVJTID0geyBcIlgtQ2xpZW50LUluZm9cIjogYHN1cGFiYXNlLWpzLSR7SlNfRU5WfS8ke3ZlcnNpb259YCB9O1xuY29uc3QgREVGQVVMVF9HTE9CQUxfT1BUSU9OUyA9IHsgaGVhZGVyczogREVGQVVMVF9IRUFERVJTIH07XG5jb25zdCBERUZBVUxUX0RCX09QVElPTlMgPSB7IHNjaGVtYTogXCJwdWJsaWNcIiB9O1xuY29uc3QgREVGQVVMVF9BVVRIX09QVElPTlMgPSB7XG5cdGF1dG9SZWZyZXNoVG9rZW46IHRydWUsXG5cdHBlcnNpc3RTZXNzaW9uOiB0cnVlLFxuXHRkZXRlY3RTZXNzaW9uSW5Vcmw6IHRydWUsXG5cdGZsb3dUeXBlOiBcImltcGxpY2l0XCJcbn07XG5jb25zdCBERUZBVUxUX1JFQUxUSU1FX09QVElPTlMgPSB7fTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gXFwwQG94Yy1wcm9qZWN0K3J1bnRpbWVAMC4xMDEuMC9oZWxwZXJzL3R5cGVvZi5qc1xuZnVuY3Rpb24gX3R5cGVvZihvKSB7XG5cdFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblx0cmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbihvJDEpIHtcblx0XHRyZXR1cm4gdHlwZW9mIG8kMTtcblx0fSA6IGZ1bmN0aW9uKG8kMSkge1xuXHRcdHJldHVybiBvJDEgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgbyQxLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyQxICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvJDE7XG5cdH0sIF90eXBlb2Yobyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIFxcMEBveGMtcHJvamVjdCtydW50aW1lQDAuMTAxLjAvaGVscGVycy90b1ByaW1pdGl2ZS5qc1xuZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikge1xuXHRpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDtcblx0dmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG5cdGlmICh2b2lkIDAgIT09IGUpIHtcblx0XHR2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcblx0XHRpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG5cdH1cblx0cmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gXFwwQG94Yy1wcm9qZWN0K3J1bnRpbWVAMC4xMDEuMC9oZWxwZXJzL3RvUHJvcGVydHlLZXkuanNcbmZ1bmN0aW9uIHRvUHJvcGVydHlLZXkodCkge1xuXHR2YXIgaSA9IHRvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuXHRyZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBcXDBAb3hjLXByb2plY3QrcnVudGltZUAwLjEwMS4wL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanNcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7XG5cdHJldHVybiAociA9IHRvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwge1xuXHRcdHZhbHVlOiB0LFxuXHRcdGVudW1lcmFibGU6ICEwLFxuXHRcdGNvbmZpZ3VyYWJsZTogITAsXG5cdFx0d3JpdGFibGU6ICEwXG5cdH0pIDogZVtyXSA9IHQsIGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIFxcMEBveGMtcHJvamVjdCtydW50aW1lQDAuMTAxLjAvaGVscGVycy9vYmplY3RTcHJlYWQyLmpzXG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHtcblx0dmFyIHQgPSBPYmplY3Qua2V5cyhlKTtcblx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHR2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7XG5cdFx0ciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uKHIkMSkge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgciQxKS5lbnVtZXJhYmxlO1xuXHRcdH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pO1xuXHR9XG5cdHJldHVybiB0O1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIoZSkge1xuXHRmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykge1xuXHRcdHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTtcblx0XHRyICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbihyJDEpIHtcblx0XHRcdF9kZWZpbmVQcm9wZXJ0eShlLCByJDEsIHRbciQxXSk7XG5cdFx0fSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uKHIkMSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIkMSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByJDEpKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi9mZXRjaC50c1xuY29uc3QgcmVzb2x2ZUZldGNoID0gKGN1c3RvbUZldGNoKSA9PiB7XG5cdGlmIChjdXN0b21GZXRjaCkgcmV0dXJuICguLi5hcmdzKSA9PiBjdXN0b21GZXRjaCguLi5hcmdzKTtcblx0cmV0dXJuICguLi5hcmdzKSA9PiBmZXRjaCguLi5hcmdzKTtcbn07XG5jb25zdCByZXNvbHZlSGVhZGVyc0NvbnN0cnVjdG9yID0gKCkgPT4ge1xuXHRyZXR1cm4gSGVhZGVycztcbn07XG5jb25zdCBmZXRjaFdpdGhBdXRoID0gKHN1cGFiYXNlS2V5LCBnZXRBY2Nlc3NUb2tlbiwgY3VzdG9tRmV0Y2gpID0+IHtcblx0Y29uc3QgZmV0Y2gkMSA9IHJlc29sdmVGZXRjaChjdXN0b21GZXRjaCk7XG5cdGNvbnN0IEhlYWRlcnNDb25zdHJ1Y3RvciA9IHJlc29sdmVIZWFkZXJzQ29uc3RydWN0b3IoKTtcblx0cmV0dXJuIGFzeW5jIChpbnB1dCwgaW5pdCkgPT4ge1xuXHRcdHZhciBfYXdhaXQkZ2V0QWNjZXNzVG9rZW47XG5cdFx0Y29uc3QgYWNjZXNzVG9rZW4gPSAoX2F3YWl0JGdldEFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKSkgIT09IG51bGwgJiYgX2F3YWl0JGdldEFjY2Vzc1Rva2VuICE9PSB2b2lkIDAgPyBfYXdhaXQkZ2V0QWNjZXNzVG9rZW4gOiBzdXBhYmFzZUtleTtcblx0XHRsZXQgaGVhZGVycyA9IG5ldyBIZWFkZXJzQ29uc3RydWN0b3IoaW5pdCA9PT0gbnVsbCB8fCBpbml0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbml0LmhlYWRlcnMpO1xuXHRcdGlmICghaGVhZGVycy5oYXMoXCJhcGlrZXlcIikpIGhlYWRlcnMuc2V0KFwiYXBpa2V5XCIsIHN1cGFiYXNlS2V5KTtcblx0XHRpZiAoIWhlYWRlcnMuaGFzKFwiQXV0aG9yaXphdGlvblwiKSkgaGVhZGVycy5zZXQoXCJBdXRob3JpemF0aW9uXCIsIGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gKTtcblx0XHRyZXR1cm4gZmV0Y2gkMShpbnB1dCwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGluaXQpLCB7fSwgeyBoZWFkZXJzIH0pKTtcblx0fTtcbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvaGVscGVycy50c1xuZnVuY3Rpb24gZW5zdXJlVHJhaWxpbmdTbGFzaCh1cmwpIHtcblx0cmV0dXJuIHVybC5lbmRzV2l0aChcIi9cIikgPyB1cmwgOiB1cmwgKyBcIi9cIjtcbn1cbmZ1bmN0aW9uIGFwcGx5U2V0dGluZ0RlZmF1bHRzKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG5cdHZhciBfREVGQVVMVF9HTE9CQUxfT1BUSU8sIF9nbG9iYWxPcHRpb25zJGhlYWRlcjtcblx0Y29uc3QgeyBkYjogZGJPcHRpb25zLCBhdXRoOiBhdXRoT3B0aW9ucywgcmVhbHRpbWU6IHJlYWx0aW1lT3B0aW9ucywgZ2xvYmFsOiBnbG9iYWxPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRjb25zdCB7IGRiOiBERUZBVUxUX0RCX09QVElPTlMkMSwgYXV0aDogREVGQVVMVF9BVVRIX09QVElPTlMkMSwgcmVhbHRpbWU6IERFRkFVTFRfUkVBTFRJTUVfT1BUSU9OUyQxLCBnbG9iYWw6IERFRkFVTFRfR0xPQkFMX09QVElPTlMkMSB9ID0gZGVmYXVsdHM7XG5cdGNvbnN0IHJlc3VsdCA9IHtcblx0XHRkYjogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERFRkFVTFRfREJfT1BUSU9OUyQxKSwgZGJPcHRpb25zKSxcblx0XHRhdXRoOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9BVVRIX09QVElPTlMkMSksIGF1dGhPcHRpb25zKSxcblx0XHRyZWFsdGltZTogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERFRkFVTFRfUkVBTFRJTUVfT1BUSU9OUyQxKSwgcmVhbHRpbWVPcHRpb25zKSxcblx0XHRzdG9yYWdlOiB7fSxcblx0XHRnbG9iYWw6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX0dMT0JBTF9PUFRJT05TJDEpLCBnbG9iYWxPcHRpb25zKSwge30sIHsgaGVhZGVyczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIChfREVGQVVMVF9HTE9CQUxfT1BUSU8gPSBERUZBVUxUX0dMT0JBTF9PUFRJT05TJDEgPT09IG51bGwgfHwgREVGQVVMVF9HTE9CQUxfT1BUSU9OUyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBERUZBVUxUX0dMT0JBTF9PUFRJT05TJDEuaGVhZGVycykgIT09IG51bGwgJiYgX0RFRkFVTFRfR0xPQkFMX09QVElPICE9PSB2b2lkIDAgPyBfREVGQVVMVF9HTE9CQUxfT1BUSU8gOiB7fSksIChfZ2xvYmFsT3B0aW9ucyRoZWFkZXIgPSBnbG9iYWxPcHRpb25zID09PSBudWxsIHx8IGdsb2JhbE9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdsb2JhbE9wdGlvbnMuaGVhZGVycykgIT09IG51bGwgJiYgX2dsb2JhbE9wdGlvbnMkaGVhZGVyICE9PSB2b2lkIDAgPyBfZ2xvYmFsT3B0aW9ucyRoZWFkZXIgOiB7fSkgfSksXG5cdFx0YWNjZXNzVG9rZW46IGFzeW5jICgpID0+IFwiXCJcblx0fTtcblx0aWYgKG9wdGlvbnMuYWNjZXNzVG9rZW4pIHJlc3VsdC5hY2Nlc3NUb2tlbiA9IG9wdGlvbnMuYWNjZXNzVG9rZW47XG5cdGVsc2UgZGVsZXRlIHJlc3VsdC5hY2Nlc3NUb2tlbjtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuKiBWYWxpZGF0ZXMgYSBTdXBhYmFzZSBjbGllbnQgVVJMXG4qXG4qIEBwYXJhbSB7c3RyaW5nfSBzdXBhYmFzZVVybCAtIFRoZSBTdXBhYmFzZSBjbGllbnQgVVJMIHN0cmluZy5cbiogQHJldHVybnMge1VSTH0gLSBUaGUgdmFsaWRhdGVkIGJhc2UgVVJMLlxuKiBAdGhyb3dzIHtFcnJvcn1cbiovXG5mdW5jdGlvbiB2YWxpZGF0ZVN1cGFiYXNlVXJsKHN1cGFiYXNlVXJsKSB7XG5cdGNvbnN0IHRyaW1tZWRVcmwgPSBzdXBhYmFzZVVybCA9PT0gbnVsbCB8fCBzdXBhYmFzZVVybCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3VwYWJhc2VVcmwudHJpbSgpO1xuXHRpZiAoIXRyaW1tZWRVcmwpIHRocm93IG5ldyBFcnJvcihcInN1cGFiYXNlVXJsIGlzIHJlcXVpcmVkLlwiKTtcblx0aWYgKCF0cmltbWVkVXJsLm1hdGNoKC9eaHR0cHM/OlxcL1xcLy9pKSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdXBhYmFzZVVybDogTXVzdCBiZSBhIHZhbGlkIEhUVFAgb3IgSFRUUFMgVVJMLlwiKTtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IFVSTChlbnN1cmVUcmFpbGluZ1NsYXNoKHRyaW1tZWRVcmwpKTtcblx0fSBjYXRjaCAoX3VudXNlZCkge1xuXHRcdHRocm93IEVycm9yKFwiSW52YWxpZCBzdXBhYmFzZVVybDogUHJvdmlkZWQgVVJMIGlzIG1hbGZvcm1lZC5cIik7XG5cdH1cbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi9TdXBhYmFzZUF1dGhDbGllbnQudHNcbnZhciBTdXBhYmFzZUF1dGhDbGllbnQgPSBjbGFzcyBleHRlbmRzIEF1dGhDbGllbnQge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0c3VwZXIob3B0aW9ucyk7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9TdXBhYmFzZUNsaWVudC50c1xuLyoqXG4qIFN1cGFiYXNlIENsaWVudC5cbipcbiogQW4gaXNvbW9ycGhpYyBKYXZhc2NyaXB0IGNsaWVudCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBQb3N0Z3Jlcy5cbiovXG52YXIgU3VwYWJhc2VDbGllbnQgPSBjbGFzcyB7XG5cdC8qKlxuXHQqIENyZWF0ZSBhIG5ldyBjbGllbnQgZm9yIHVzZSBpbiB0aGUgYnJvd3Nlci5cblx0KiBAcGFyYW0gc3VwYWJhc2VVcmwgVGhlIHVuaXF1ZSBTdXBhYmFzZSBVUkwgd2hpY2ggaXMgc3VwcGxpZWQgd2hlbiB5b3UgY3JlYXRlIGEgbmV3IHByb2plY3QgaW4geW91ciBwcm9qZWN0IGRhc2hib2FyZC5cblx0KiBAcGFyYW0gc3VwYWJhc2VLZXkgVGhlIHVuaXF1ZSBTdXBhYmFzZSBLZXkgd2hpY2ggaXMgc3VwcGxpZWQgd2hlbiB5b3UgY3JlYXRlIGEgbmV3IHByb2plY3QgaW4geW91ciBwcm9qZWN0IGRhc2hib2FyZC5cblx0KiBAcGFyYW0gb3B0aW9ucy5kYi5zY2hlbWEgWW91IGNhbiBzd2l0Y2ggaW4gYmV0d2VlbiBzY2hlbWFzLiBUaGUgc2NoZW1hIG5lZWRzIHRvIGJlIG9uIHRoZSBsaXN0IG9mIGV4cG9zZWQgc2NoZW1hcyBpbnNpZGUgU3VwYWJhc2UuXG5cdCogQHBhcmFtIG9wdGlvbnMuYXV0aC5hdXRvUmVmcmVzaFRva2VuIFNldCB0byBcInRydWVcIiBpZiB5b3Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggdGhlIHRva2VuIGJlZm9yZSBleHBpcmluZy5cblx0KiBAcGFyYW0gb3B0aW9ucy5hdXRoLnBlcnNpc3RTZXNzaW9uIFNldCB0byBcInRydWVcIiBpZiB5b3Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IHNhdmUgdGhlIHVzZXIgc2Vzc2lvbiBpbnRvIGxvY2FsIHN0b3JhZ2UuXG5cdCogQHBhcmFtIG9wdGlvbnMuYXV0aC5kZXRlY3RTZXNzaW9uSW5VcmwgU2V0IHRvIFwidHJ1ZVwiIGlmIHlvdSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBPQXV0aCBncmFudHMgaW4gdGhlIFVSTCBhbmQgc2lnbnMgaW4gdGhlIHVzZXIuXG5cdCogQHBhcmFtIG9wdGlvbnMucmVhbHRpbWUgT3B0aW9ucyBwYXNzZWQgYWxvbmcgdG8gcmVhbHRpbWUtanMgY29uc3RydWN0b3IuXG5cdCogQHBhcmFtIG9wdGlvbnMuc3RvcmFnZSBPcHRpb25zIHBhc3NlZCBhbG9uZyB0byB0aGUgc3RvcmFnZS1qcyBjb25zdHJ1Y3Rvci5cblx0KiBAcGFyYW0gb3B0aW9ucy5nbG9iYWwuZmV0Y2ggQSBjdXN0b20gZmV0Y2ggaW1wbGVtZW50YXRpb24uXG5cdCogQHBhcmFtIG9wdGlvbnMuZ2xvYmFsLmhlYWRlcnMgQW55IGFkZGl0aW9uYWwgaGVhZGVycyB0byBzZW5kIHdpdGggZWFjaCBuZXR3b3JrIHJlcXVlc3QuXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0c1xuXHQqIGltcG9ydCB7IGNyZWF0ZUNsaWVudCB9IGZyb20gJ0BzdXBhYmFzZS9zdXBhYmFzZS1qcydcblx0KlxuXHQqIGNvbnN0IHN1cGFiYXNlID0gY3JlYXRlQ2xpZW50KCdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28nLCAncHVibGljLWFub24ta2V5Jylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHN1cGFiYXNlLmZyb20oJ3Byb2ZpbGVzJykuc2VsZWN0KCcqJylcblx0KiBgYGBcblx0Ki9cblx0Y29uc3RydWN0b3Ioc3VwYWJhc2VVcmwsIHN1cGFiYXNlS2V5LCBvcHRpb25zKSB7XG5cdFx0dmFyIF9zZXR0aW5ncyRhdXRoJHN0b3JhZywgX3NldHRpbmdzJGdsb2JhbCRoZWFkO1xuXHRcdHRoaXMuc3VwYWJhc2VVcmwgPSBzdXBhYmFzZVVybDtcblx0XHR0aGlzLnN1cGFiYXNlS2V5ID0gc3VwYWJhc2VLZXk7XG5cdFx0Y29uc3QgYmFzZVVybCA9IHZhbGlkYXRlU3VwYWJhc2VVcmwoc3VwYWJhc2VVcmwpO1xuXHRcdGlmICghc3VwYWJhc2VLZXkpIHRocm93IG5ldyBFcnJvcihcInN1cGFiYXNlS2V5IGlzIHJlcXVpcmVkLlwiKTtcblx0XHR0aGlzLnJlYWx0aW1lVXJsID0gbmV3IFVSTChcInJlYWx0aW1lL3YxXCIsIGJhc2VVcmwpO1xuXHRcdHRoaXMucmVhbHRpbWVVcmwucHJvdG9jb2wgPSB0aGlzLnJlYWx0aW1lVXJsLnByb3RvY29sLnJlcGxhY2UoXCJodHRwXCIsIFwid3NcIik7XG5cdFx0dGhpcy5hdXRoVXJsID0gbmV3IFVSTChcImF1dGgvdjFcIiwgYmFzZVVybCk7XG5cdFx0dGhpcy5zdG9yYWdlVXJsID0gbmV3IFVSTChcInN0b3JhZ2UvdjFcIiwgYmFzZVVybCk7XG5cdFx0dGhpcy5mdW5jdGlvbnNVcmwgPSBuZXcgVVJMKFwiZnVuY3Rpb25zL3YxXCIsIGJhc2VVcmwpO1xuXHRcdGNvbnN0IGRlZmF1bHRTdG9yYWdlS2V5ID0gYHNiLSR7YmFzZVVybC5ob3N0bmFtZS5zcGxpdChcIi5cIilbMF19LWF1dGgtdG9rZW5gO1xuXHRcdGNvbnN0IERFRkFVTFRTID0ge1xuXHRcdFx0ZGI6IERFRkFVTFRfREJfT1BUSU9OUyxcblx0XHRcdHJlYWx0aW1lOiBERUZBVUxUX1JFQUxUSU1FX09QVElPTlMsXG5cdFx0XHRhdXRoOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9BVVRIX09QVElPTlMpLCB7fSwgeyBzdG9yYWdlS2V5OiBkZWZhdWx0U3RvcmFnZUtleSB9KSxcblx0XHRcdGdsb2JhbDogREVGQVVMVF9HTE9CQUxfT1BUSU9OU1xuXHRcdH07XG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSBhcHBseVNldHRpbmdEZWZhdWx0cyhvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fSwgREVGQVVMVFMpO1xuXHRcdHRoaXMuc3RvcmFnZUtleSA9IChfc2V0dGluZ3MkYXV0aCRzdG9yYWcgPSBzZXR0aW5ncy5hdXRoLnN0b3JhZ2VLZXkpICE9PSBudWxsICYmIF9zZXR0aW5ncyRhdXRoJHN0b3JhZyAhPT0gdm9pZCAwID8gX3NldHRpbmdzJGF1dGgkc3RvcmFnIDogXCJcIjtcblx0XHR0aGlzLmhlYWRlcnMgPSAoX3NldHRpbmdzJGdsb2JhbCRoZWFkID0gc2V0dGluZ3MuZ2xvYmFsLmhlYWRlcnMpICE9PSBudWxsICYmIF9zZXR0aW5ncyRnbG9iYWwkaGVhZCAhPT0gdm9pZCAwID8gX3NldHRpbmdzJGdsb2JhbCRoZWFkIDoge307XG5cdFx0aWYgKCFzZXR0aW5ncy5hY2Nlc3NUb2tlbikge1xuXHRcdFx0dmFyIF9zZXR0aW5ncyRhdXRoO1xuXHRcdFx0dGhpcy5hdXRoID0gdGhpcy5faW5pdFN1cGFiYXNlQXV0aENsaWVudCgoX3NldHRpbmdzJGF1dGggPSBzZXR0aW5ncy5hdXRoKSAhPT0gbnVsbCAmJiBfc2V0dGluZ3MkYXV0aCAhPT0gdm9pZCAwID8gX3NldHRpbmdzJGF1dGggOiB7fSwgdGhpcy5oZWFkZXJzLCBzZXR0aW5ncy5nbG9iYWwuZmV0Y2gpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmFjY2Vzc1Rva2VuID0gc2V0dGluZ3MuYWNjZXNzVG9rZW47XG5cdFx0XHR0aGlzLmF1dGggPSBuZXcgUHJveHkoe30sIHsgZ2V0OiAoXywgcHJvcCkgPT4ge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9zdXBhYmFzZS1qczogU3VwYWJhc2UgQ2xpZW50IGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgYWNjZXNzVG9rZW4gb3B0aW9uLCBhY2Nlc3Npbmcgc3VwYWJhc2UuYXV0aC4ke1N0cmluZyhwcm9wKX0gaXMgbm90IHBvc3NpYmxlYCk7XG5cdFx0XHR9IH0pO1xuXHRcdH1cblx0XHR0aGlzLmZldGNoID0gZmV0Y2hXaXRoQXV0aChzdXBhYmFzZUtleSwgdGhpcy5fZ2V0QWNjZXNzVG9rZW4uYmluZCh0aGlzKSwgc2V0dGluZ3MuZ2xvYmFsLmZldGNoKTtcblx0XHR0aGlzLnJlYWx0aW1lID0gdGhpcy5faW5pdFJlYWx0aW1lQ2xpZW50KF9vYmplY3RTcHJlYWQyKHtcblx0XHRcdGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcblx0XHRcdGFjY2Vzc1Rva2VuOiB0aGlzLl9nZXRBY2Nlc3NUb2tlbi5iaW5kKHRoaXMpXG5cdFx0fSwgc2V0dGluZ3MucmVhbHRpbWUpKTtcblx0XHRpZiAodGhpcy5hY2Nlc3NUb2tlbikgdGhpcy5hY2Nlc3NUb2tlbigpLnRoZW4oKHRva2VuKSA9PiB0aGlzLnJlYWx0aW1lLnNldEF1dGgodG9rZW4pKS5jYXRjaCgoZSkgPT4gY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHNldCBpbml0aWFsIFJlYWx0aW1lIGF1dGggdG9rZW46XCIsIGUpKTtcblx0XHR0aGlzLnJlc3QgPSBuZXcgUG9zdGdyZXN0Q2xpZW50KG5ldyBVUkwoXCJyZXN0L3YxXCIsIGJhc2VVcmwpLmhyZWYsIHtcblx0XHRcdGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcblx0XHRcdHNjaGVtYTogc2V0dGluZ3MuZGIuc2NoZW1hLFxuXHRcdFx0ZmV0Y2g6IHRoaXMuZmV0Y2hcblx0XHR9KTtcblx0XHR0aGlzLnN0b3JhZ2UgPSBuZXcgU3RvcmFnZUNsaWVudCh0aGlzLnN0b3JhZ2VVcmwuaHJlZiwgdGhpcy5oZWFkZXJzLCB0aGlzLmZldGNoLCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc3RvcmFnZSk7XG5cdFx0aWYgKCFzZXR0aW5ncy5hY2Nlc3NUb2tlbikgdGhpcy5fbGlzdGVuRm9yQXV0aEV2ZW50cygpO1xuXHR9XG5cdC8qKlxuXHQqIFN1cGFiYXNlIEZ1bmN0aW9ucyBhbGxvd3MgeW91IHRvIGRlcGxveSBhbmQgaW52b2tlIGVkZ2UgZnVuY3Rpb25zLlxuXHQqL1xuXHRnZXQgZnVuY3Rpb25zKCkge1xuXHRcdHJldHVybiBuZXcgRnVuY3Rpb25zQ2xpZW50KHRoaXMuZnVuY3Rpb25zVXJsLmhyZWYsIHtcblx0XHRcdGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcblx0XHRcdGN1c3RvbUZldGNoOiB0aGlzLmZldGNoXG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCogUGVyZm9ybSBhIHF1ZXJ5IG9uIGEgdGFibGUgb3IgYSB2aWV3LlxuXHQqXG5cdCogQHBhcmFtIHJlbGF0aW9uIC0gVGhlIHRhYmxlIG9yIHZpZXcgbmFtZSB0byBxdWVyeVxuXHQqL1xuXHRmcm9tKHJlbGF0aW9uKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVzdC5mcm9tKHJlbGF0aW9uKTtcblx0fVxuXHQvKipcblx0KiBTZWxlY3QgYSBzY2hlbWEgdG8gcXVlcnkgb3IgcGVyZm9ybSBhbiBmdW5jdGlvbiAocnBjKSBjYWxsLlxuXHQqXG5cdCogVGhlIHNjaGVtYSBuZWVkcyB0byBiZSBvbiB0aGUgbGlzdCBvZiBleHBvc2VkIHNjaGVtYXMgaW5zaWRlIFN1cGFiYXNlLlxuXHQqXG5cdCogQHBhcmFtIHNjaGVtYSAtIFRoZSBzY2hlbWEgdG8gcXVlcnlcblx0Ki9cblx0c2NoZW1hKHNjaGVtYSkge1xuXHRcdHJldHVybiB0aGlzLnJlc3Quc2NoZW1hKHNjaGVtYSk7XG5cdH1cblx0LyoqXG5cdCogUGVyZm9ybSBhIGZ1bmN0aW9uIGNhbGwuXG5cdCpcblx0KiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gbmFtZSB0byBjYWxsXG5cdCogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uIGNhbGxcblx0KiBAcGFyYW0gb3B0aW9ucyAtIE5hbWVkIHBhcmFtZXRlcnNcblx0KiBAcGFyYW0gb3B0aW9ucy5oZWFkIC0gV2hlbiBzZXQgdG8gYHRydWVgLCBgZGF0YWAgd2lsbCBub3QgYmUgcmV0dXJuZWQuXG5cdCogVXNlZnVsIGlmIHlvdSBvbmx5IG5lZWQgdGhlIGNvdW50LlxuXHQqIEBwYXJhbSBvcHRpb25zLmdldCAtIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGhcblx0KiByZWFkLW9ubHkgYWNjZXNzIG1vZGUuXG5cdCogQHBhcmFtIG9wdGlvbnMuY291bnQgLSBDb3VudCBhbGdvcml0aG0gdG8gdXNlIHRvIGNvdW50IHJvd3MgcmV0dXJuZWQgYnkgdGhlXG5cdCogZnVuY3Rpb24uIE9ubHkgYXBwbGljYWJsZSBmb3IgW3NldC1yZXR1cm5pbmdcblx0KiBmdW5jdGlvbnNdKGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9mdW5jdGlvbnMtc3JmLmh0bWwpLlxuXHQqXG5cdCogYFwiZXhhY3RcImA6IEV4YWN0IGJ1dCBzbG93IGNvdW50IGFsZ29yaXRobS4gUGVyZm9ybXMgYSBgQ09VTlQoKilgIHVuZGVyIHRoZVxuXHQqIGhvb2QuXG5cdCpcblx0KiBgXCJwbGFubmVkXCJgOiBBcHByb3hpbWF0ZWQgYnV0IGZhc3QgY291bnQgYWxnb3JpdGhtLiBVc2VzIHRoZSBQb3N0Z3Jlc1xuXHQqIHN0YXRpc3RpY3MgdW5kZXIgdGhlIGhvb2QuXG5cdCpcblx0KiBgXCJlc3RpbWF0ZWRcImA6IFVzZXMgZXhhY3QgY291bnQgZm9yIGxvdyBudW1iZXJzIGFuZCBwbGFubmVkIGNvdW50IGZvciBoaWdoXG5cdCogbnVtYmVycy5cblx0Ki9cblx0cnBjKGZuLCBhcmdzID0ge30sIG9wdGlvbnMgPSB7XG5cdFx0aGVhZDogZmFsc2UsXG5cdFx0Z2V0OiBmYWxzZSxcblx0XHRjb3VudDogdm9pZCAwXG5cdH0pIHtcblx0XHRyZXR1cm4gdGhpcy5yZXN0LnJwYyhmbiwgYXJncywgb3B0aW9ucyk7XG5cdH1cblx0LyoqXG5cdCogQ3JlYXRlcyBhIFJlYWx0aW1lIGNoYW5uZWwgd2l0aCBCcm9hZGNhc3QsIFByZXNlbmNlLCBhbmQgUG9zdGdyZXMgQ2hhbmdlcy5cblx0KlxuXHQqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIFJlYWx0aW1lIGNoYW5uZWwuXG5cdCogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBSZWFsdGltZSBjaGFubmVsLlxuXHQqXG5cdCovXG5cdGNoYW5uZWwobmFtZSwgb3B0cyA9IHsgY29uZmlnOiB7fSB9KSB7XG5cdFx0cmV0dXJuIHRoaXMucmVhbHRpbWUuY2hhbm5lbChuYW1lLCBvcHRzKTtcblx0fVxuXHQvKipcblx0KiBSZXR1cm5zIGFsbCBSZWFsdGltZSBjaGFubmVscy5cblx0Ki9cblx0Z2V0Q2hhbm5lbHMoKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVhbHRpbWUuZ2V0Q2hhbm5lbHMoKTtcblx0fVxuXHQvKipcblx0KiBVbnN1YnNjcmliZXMgYW5kIHJlbW92ZXMgUmVhbHRpbWUgY2hhbm5lbCBmcm9tIFJlYWx0aW1lIGNsaWVudC5cblx0KlxuXHQqIEBwYXJhbSB7UmVhbHRpbWVDaGFubmVsfSBjaGFubmVsIC0gVGhlIG5hbWUgb2YgdGhlIFJlYWx0aW1lIGNoYW5uZWwuXG5cdCpcblx0Ki9cblx0cmVtb3ZlQ2hhbm5lbChjaGFubmVsKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVhbHRpbWUucmVtb3ZlQ2hhbm5lbChjaGFubmVsKTtcblx0fVxuXHQvKipcblx0KiBVbnN1YnNjcmliZXMgYW5kIHJlbW92ZXMgYWxsIFJlYWx0aW1lIGNoYW5uZWxzIGZyb20gUmVhbHRpbWUgY2xpZW50LlxuXHQqL1xuXHRyZW1vdmVBbGxDaGFubmVscygpIHtcblx0XHRyZXR1cm4gdGhpcy5yZWFsdGltZS5yZW1vdmVBbGxDaGFubmVscygpO1xuXHR9XG5cdGFzeW5jIF9nZXRBY2Nlc3NUb2tlbigpIHtcblx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXHRcdHZhciBfZGF0YSRzZXNzaW9uJGFjY2Vzc18sIF9kYXRhJHNlc3Npb247XG5cdFx0aWYgKF90aGlzLmFjY2Vzc1Rva2VuKSByZXR1cm4gYXdhaXQgX3RoaXMuYWNjZXNzVG9rZW4oKTtcblx0XHRjb25zdCB7IGRhdGEgfSA9IGF3YWl0IF90aGlzLmF1dGguZ2V0U2Vzc2lvbigpO1xuXHRcdHJldHVybiAoX2RhdGEkc2Vzc2lvbiRhY2Nlc3NfID0gKF9kYXRhJHNlc3Npb24gPSBkYXRhLnNlc3Npb24pID09PSBudWxsIHx8IF9kYXRhJHNlc3Npb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kYXRhJHNlc3Npb24uYWNjZXNzX3Rva2VuKSAhPT0gbnVsbCAmJiBfZGF0YSRzZXNzaW9uJGFjY2Vzc18gIT09IHZvaWQgMCA/IF9kYXRhJHNlc3Npb24kYWNjZXNzXyA6IF90aGlzLnN1cGFiYXNlS2V5O1xuXHR9XG5cdF9pbml0U3VwYWJhc2VBdXRoQ2xpZW50KHsgYXV0b1JlZnJlc2hUb2tlbiwgcGVyc2lzdFNlc3Npb24sIGRldGVjdFNlc3Npb25JblVybCwgc3RvcmFnZSwgdXNlclN0b3JhZ2UsIHN0b3JhZ2VLZXksIGZsb3dUeXBlLCBsb2NrLCBkZWJ1ZywgdGhyb3dPbkVycm9yIH0sIGhlYWRlcnMsIGZldGNoJDEpIHtcblx0XHRjb25zdCBhdXRoSGVhZGVycyA9IHtcblx0XHRcdEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLnN1cGFiYXNlS2V5fWAsXG5cdFx0XHRhcGlrZXk6IGAke3RoaXMuc3VwYWJhc2VLZXl9YFxuXHRcdH07XG5cdFx0cmV0dXJuIG5ldyBTdXBhYmFzZUF1dGhDbGllbnQoe1xuXHRcdFx0dXJsOiB0aGlzLmF1dGhVcmwuaHJlZixcblx0XHRcdGhlYWRlcnM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBhdXRoSGVhZGVycyksIGhlYWRlcnMpLFxuXHRcdFx0c3RvcmFnZUtleSxcblx0XHRcdGF1dG9SZWZyZXNoVG9rZW4sXG5cdFx0XHRwZXJzaXN0U2Vzc2lvbixcblx0XHRcdGRldGVjdFNlc3Npb25JblVybCxcblx0XHRcdHN0b3JhZ2UsXG5cdFx0XHR1c2VyU3RvcmFnZSxcblx0XHRcdGZsb3dUeXBlLFxuXHRcdFx0bG9jayxcblx0XHRcdGRlYnVnLFxuXHRcdFx0dGhyb3dPbkVycm9yLFxuXHRcdFx0ZmV0Y2g6IGZldGNoJDEsXG5cdFx0XHRoYXNDdXN0b21BdXRob3JpemF0aW9uSGVhZGVyOiBPYmplY3Qua2V5cyh0aGlzLmhlYWRlcnMpLnNvbWUoKGtleSkgPT4ga2V5LnRvTG93ZXJDYXNlKCkgPT09IFwiYXV0aG9yaXphdGlvblwiKVxuXHRcdH0pO1xuXHR9XG5cdF9pbml0UmVhbHRpbWVDbGllbnQob3B0aW9ucykge1xuXHRcdHJldHVybiBuZXcgUmVhbHRpbWVDbGllbnQodGhpcy5yZWFsdGltZVVybC5ocmVmLCBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgb3B0aW9ucyksIHt9LCB7IHBhcmFtczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIHsgYXBpa2V5OiB0aGlzLnN1cGFiYXNlS2V5IH0pLCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucGFyYW1zKSB9KSk7XG5cdH1cblx0X2xpc3RlbkZvckF1dGhFdmVudHMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYXV0aC5vbkF1dGhTdGF0ZUNoYW5nZSgoZXZlbnQsIHNlc3Npb24pID0+IHtcblx0XHRcdHRoaXMuX2hhbmRsZVRva2VuQ2hhbmdlZChldmVudCwgXCJDTElFTlRcIiwgc2Vzc2lvbiA9PT0gbnVsbCB8fCBzZXNzaW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXNzaW9uLmFjY2Vzc190b2tlbik7XG5cdFx0fSk7XG5cdH1cblx0X2hhbmRsZVRva2VuQ2hhbmdlZChldmVudCwgc291cmNlLCB0b2tlbikge1xuXHRcdGlmICgoZXZlbnQgPT09IFwiVE9LRU5fUkVGUkVTSEVEXCIgfHwgZXZlbnQgPT09IFwiU0lHTkVEX0lOXCIpICYmIHRoaXMuY2hhbmdlZEFjY2Vzc1Rva2VuICE9PSB0b2tlbikge1xuXHRcdFx0dGhpcy5jaGFuZ2VkQWNjZXNzVG9rZW4gPSB0b2tlbjtcblx0XHRcdHRoaXMucmVhbHRpbWUuc2V0QXV0aCh0b2tlbik7XG5cdFx0fSBlbHNlIGlmIChldmVudCA9PT0gXCJTSUdORURfT1VUXCIpIHtcblx0XHRcdHRoaXMucmVhbHRpbWUuc2V0QXV0aCgpO1xuXHRcdFx0aWYgKHNvdXJjZSA9PSBcIlNUT1JBR0VcIikgdGhpcy5hdXRoLnNpZ25PdXQoKTtcblx0XHRcdHRoaXMuY2hhbmdlZEFjY2Vzc1Rva2VuID0gdm9pZCAwO1xuXHRcdH1cblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2luZGV4LnRzXG4vKipcbiogQ3JlYXRlcyBhIG5ldyBTdXBhYmFzZSBDbGllbnQuXG4qXG4qIEBleGFtcGxlXG4qIGBgYHRzXG4qIGltcG9ydCB7IGNyZWF0ZUNsaWVudCB9IGZyb20gJ0BzdXBhYmFzZS9zdXBhYmFzZS1qcydcbipcbiogY29uc3Qgc3VwYWJhc2UgPSBjcmVhdGVDbGllbnQoJ2h0dHBzOi8veHl6Y29tcGFueS5zdXBhYmFzZS5jbycsICdwdWJsaWMtYW5vbi1rZXknKVxuKiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZS5mcm9tKCdwcm9maWxlcycpLnNlbGVjdCgnKicpXG4qIGBgYFxuKi9cbmNvbnN0IGNyZWF0ZUNsaWVudCA9IChzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXksIG9wdGlvbnMpID0+IHtcblx0cmV0dXJuIG5ldyBTdXBhYmFzZUNsaWVudChzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXksIG9wdGlvbnMpO1xufTtcbmZ1bmN0aW9uIHNob3VsZFNob3dEZXByZWNhdGlvbldhcm5pbmcoKSB7XG5cdGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG5cdGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuXHRjb25zdCBwcm9jZXNzVmVyc2lvbiA9IHByb2Nlc3NbXCJ2ZXJzaW9uXCJdO1xuXHRpZiAocHJvY2Vzc1ZlcnNpb24gPT09IHZvaWQgMCB8fCBwcm9jZXNzVmVyc2lvbiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXHRjb25zdCB2ZXJzaW9uTWF0Y2ggPSBwcm9jZXNzVmVyc2lvbi5tYXRjaCgvXnYoXFxkKylcXC4vKTtcblx0aWYgKCF2ZXJzaW9uTWF0Y2gpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHBhcnNlSW50KHZlcnNpb25NYXRjaFsxXSwgMTApIDw9IDE4O1xufVxuaWYgKHNob3VsZFNob3dEZXByZWNhdGlvbldhcm5pbmcoKSkgY29uc29sZS53YXJuKFwi4pqg77iPICBOb2RlLmpzIDE4IGFuZCBiZWxvdyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBAc3VwYWJhc2Uvc3VwYWJhc2UtanMuIFBsZWFzZSB1cGdyYWRlIHRvIE5vZGUuanMgMjAgb3IgbGF0ZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLCB2aXNpdDogaHR0cHM6Ly9naXRodWIuY29tL29yZ3Mvc3VwYWJhc2UvZGlzY3Vzc2lvbnMvMzcyMTdcIik7XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgRnVuY3Rpb25SZWdpb24sIEZ1bmN0aW9uc0Vycm9yLCBGdW5jdGlvbnNGZXRjaEVycm9yLCBGdW5jdGlvbnNIdHRwRXJyb3IsIEZ1bmN0aW9uc1JlbGF5RXJyb3IsIFBvc3RncmVzdEVycm9yLCBTdXBhYmFzZUNsaWVudCwgY3JlYXRlQ2xpZW50IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIl0sIm5hbWVzIjpbIkZ1bmN0aW9uUmVnaW9uIiwiRnVuY3Rpb25zQ2xpZW50IiwiRnVuY3Rpb25zRXJyb3IiLCJGdW5jdGlvbnNGZXRjaEVycm9yIiwiRnVuY3Rpb25zSHR0cEVycm9yIiwiRnVuY3Rpb25zUmVsYXlFcnJvciIsIlBvc3RncmVzdENsaWVudCIsIlBvc3RncmVzdEVycm9yIiwiUmVhbHRpbWVDbGllbnQiLCJTdG9yYWdlQ2xpZW50IiwiQXV0aENsaWVudCIsInZlcnNpb24iLCJKU19FTlYiLCJEZW5vIiwiZG9jdW1lbnQiLCJuYXZpZ2F0b3IiLCJwcm9kdWN0IiwiREVGQVVMVF9IRUFERVJTIiwiREVGQVVMVF9HTE9CQUxfT1BUSU9OUyIsImhlYWRlcnMiLCJERUZBVUxUX0RCX09QVElPTlMiLCJzY2hlbWEiLCJERUZBVUxUX0FVVEhfT1BUSU9OUyIsImF1dG9SZWZyZXNoVG9rZW4iLCJwZXJzaXN0U2Vzc2lvbiIsImRldGVjdFNlc3Npb25JblVybCIsImZsb3dUeXBlIiwiREVGQVVMVF9SRUFMVElNRV9PUFRJT05TIiwiX3R5cGVvZiIsIm8iLCJTeW1ib2wiLCJpdGVyYXRvciIsIm8kMSIsImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwidG9QcmltaXRpdmUiLCJ0IiwiciIsImUiLCJpIiwiY2FsbCIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsInRvUHJvcGVydHlLZXkiLCJfZGVmaW5lUHJvcGVydHkiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJyJDEiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkMiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsInJlc29sdmVGZXRjaCIsImN1c3RvbUZldGNoIiwiYXJncyIsImZldGNoIiwicmVzb2x2ZUhlYWRlcnNDb25zdHJ1Y3RvciIsIkhlYWRlcnMiLCJmZXRjaFdpdGhBdXRoIiwic3VwYWJhc2VLZXkiLCJnZXRBY2Nlc3NUb2tlbiIsImZldGNoJDEiLCJIZWFkZXJzQ29uc3RydWN0b3IiLCJpbnB1dCIsImluaXQiLCJfYXdhaXQkZ2V0QWNjZXNzVG9rZW4iLCJhY2Nlc3NUb2tlbiIsImhhcyIsInNldCIsImVuc3VyZVRyYWlsaW5nU2xhc2giLCJ1cmwiLCJlbmRzV2l0aCIsImFwcGx5U2V0dGluZ0RlZmF1bHRzIiwib3B0aW9ucyIsImRlZmF1bHRzIiwiX0RFRkFVTFRfR0xPQkFMX09QVElPIiwiX2dsb2JhbE9wdGlvbnMkaGVhZGVyIiwiZGIiLCJkYk9wdGlvbnMiLCJhdXRoIiwiYXV0aE9wdGlvbnMiLCJyZWFsdGltZSIsInJlYWx0aW1lT3B0aW9ucyIsImdsb2JhbCIsImdsb2JhbE9wdGlvbnMiLCJERUZBVUxUX0RCX09QVElPTlMkMSIsIkRFRkFVTFRfQVVUSF9PUFRJT05TJDEiLCJERUZBVUxUX1JFQUxUSU1FX09QVElPTlMkMSIsIkRFRkFVTFRfR0xPQkFMX09QVElPTlMkMSIsInJlc3VsdCIsInN0b3JhZ2UiLCJ2YWxpZGF0ZVN1cGFiYXNlVXJsIiwic3VwYWJhc2VVcmwiLCJ0cmltbWVkVXJsIiwidHJpbSIsIkVycm9yIiwibWF0Y2giLCJVUkwiLCJfdW51c2VkIiwiU3VwYWJhc2VBdXRoQ2xpZW50IiwiU3VwYWJhc2VDbGllbnQiLCJmdW5jdGlvbnMiLCJmdW5jdGlvbnNVcmwiLCJocmVmIiwiZnJvbSIsInJlbGF0aW9uIiwicmVzdCIsInJwYyIsImZuIiwiaGVhZCIsImdldCIsImNvdW50IiwiY2hhbm5lbCIsIm5hbWUiLCJvcHRzIiwiY29uZmlnIiwiZ2V0Q2hhbm5lbHMiLCJyZW1vdmVDaGFubmVsIiwicmVtb3ZlQWxsQ2hhbm5lbHMiLCJfZ2V0QWNjZXNzVG9rZW4iLCJfdGhpcyIsIl9kYXRhJHNlc3Npb24kYWNjZXNzXyIsIl9kYXRhJHNlc3Npb24iLCJkYXRhIiwiZ2V0U2Vzc2lvbiIsInNlc3Npb24iLCJhY2Nlc3NfdG9rZW4iLCJfaW5pdFN1cGFiYXNlQXV0aENsaWVudCIsInVzZXJTdG9yYWdlIiwic3RvcmFnZUtleSIsImxvY2siLCJkZWJ1ZyIsInRocm93T25FcnJvciIsImF1dGhIZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsImFwaWtleSIsImF1dGhVcmwiLCJoYXNDdXN0b21BdXRob3JpemF0aW9uSGVhZGVyIiwic29tZSIsImtleSIsInRvTG93ZXJDYXNlIiwiX2luaXRSZWFsdGltZUNsaWVudCIsInJlYWx0aW1lVXJsIiwicGFyYW1zIiwiX2xpc3RlbkZvckF1dGhFdmVudHMiLCJvbkF1dGhTdGF0ZUNoYW5nZSIsImV2ZW50IiwiX2hhbmRsZVRva2VuQ2hhbmdlZCIsInNvdXJjZSIsInRva2VuIiwiY2hhbmdlZEFjY2Vzc1Rva2VuIiwic2V0QXV0aCIsInNpZ25PdXQiLCJfc2V0dGluZ3MkYXV0aCRzdG9yYWciLCJfc2V0dGluZ3MkZ2xvYmFsJGhlYWQiLCJiYXNlVXJsIiwicHJvdG9jb2wiLCJyZXBsYWNlIiwic3RvcmFnZVVybCIsImRlZmF1bHRTdG9yYWdlS2V5IiwiaG9zdG5hbWUiLCJzcGxpdCIsIkRFRkFVTFRTIiwic2V0dGluZ3MiLCJfc2V0dGluZ3MkYXV0aCIsIlByb3h5IiwiXyIsInByb3AiLCJiaW5kIiwidGhlbiIsImNhdGNoIiwiY29uc29sZSIsIndhcm4iLCJjcmVhdGVDbGllbnQiLCJzaG91bGRTaG93RGVwcmVjYXRpb25XYXJuaW5nIiwicHJvY2VzcyIsInByb2Nlc3NWZXJzaW9uIiwidmVyc2lvbk1hdGNoIiwicGFyc2VJbnQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@supabase/supabase-js/dist/index.mjs\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/iceberg-js/dist/index.mjs":
/*!************************************************!*\
!*** ./node_modules/iceberg-js/dist/index.mjs ***!
\************************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ IcebergError: function() { return /* binding */ IcebergError; },\n/* harmony export */ IcebergRestCatalog: function() { return /* binding */ IcebergRestCatalog; },\n/* harmony export */ getCurrentSchema: function() { return /* binding */ getCurrentSchema; },\n/* harmony export */ isDecimalType: function() { return /* binding */ isDecimalType; },\n/* harmony export */ isFixedType: function() { return /* binding */ isFixedType; },\n/* harmony export */ parseDecimalType: function() { return /* binding */ parseDecimalType; },\n/* harmony export */ parseFixedType: function() { return /* binding */ parseFixedType; },\n/* harmony export */ typesEqual: function() { return /* binding */ typesEqual; }\n/* harmony export */ });\n// src/errors/IcebergError.ts\nvar IcebergError = class extends Error {\n /**\n * Returns true if the error is a 404 Not Found error.\n */ isNotFound() {\n return this.status === 404;\n }\n /**\n * Returns true if the error is a 409 Conflict error.\n */ isConflict() {\n return this.status === 409;\n }\n /**\n * Returns true if the error is a 419 Authentication Timeout error.\n */ isAuthenticationTimeout() {\n return this.status === 419;\n }\n constructor(message, opts){\n var _opts_icebergType;\n super(message);\n this.name = \"IcebergError\";\n this.status = opts.status;\n this.icebergType = opts.icebergType;\n this.icebergCode = opts.icebergCode;\n this.details = opts.details;\n this.isCommitStateUnknown = opts.icebergType === \"CommitStateUnknownException\" || [\n 500,\n 502,\n 504\n ].includes(opts.status) && ((_opts_icebergType = opts.icebergType) === null || _opts_icebergType === void 0 ? void 0 : _opts_icebergType.includes(\"CommitState\")) === true;\n }\n};\n// src/utils/url.ts\nfunction buildUrl(baseUrl, path, query) {\n const url = new URL(path, baseUrl);\n if (query) {\n for (const [key, value] of Object.entries(query)){\n if (value !== void 0) {\n url.searchParams.set(key, value);\n }\n }\n }\n return url.toString();\n}\n// src/http/createFetchClient.ts\nasync function buildAuthHeaders(auth) {\n if (!auth || auth.type === \"none\") {\n return {};\n }\n if (auth.type === \"bearer\") {\n return {\n Authorization: \"Bearer \".concat(auth.token)\n };\n }\n if (auth.type === \"header\") {\n return {\n [auth.name]: auth.value\n };\n }\n if (auth.type === \"custom\") {\n return await auth.getHeaders();\n }\n return {};\n}\nfunction createFetchClient(options) {\n var _options_fetchImpl;\n const fetchFn = (_options_fetchImpl = options.fetchImpl) !== null && _options_fetchImpl !== void 0 ? _options_fetchImpl : globalThis.fetch;\n return {\n async request (param) {\n let { method, path, query, body, headers } = param;\n const url = buildUrl(options.baseUrl, path, query);\n const authHeaders = await buildAuthHeaders(options.auth);\n const res = await fetchFn(url, {\n method,\n headers: {\n ...body ? {\n \"Content-Type\": \"application/json\"\n } : {},\n ...authHeaders,\n ...headers\n },\n body: body ? JSON.stringify(body) : void 0\n });\n const text = await res.text();\n const isJson = (res.headers.get(\"content-type\") || \"\").includes(\"application/json\");\n const data = isJson && text ? JSON.parse(text) : text;\n if (!res.ok) {\n const errBody = isJson ? data : void 0;\n const errorDetail = errBody === null || errBody === void 0 ? void 0 : errBody.error;\n var _errorDetail_message;\n throw new IcebergError((_errorDetail_message = errorDetail === null || errorDetail === void 0 ? void 0 : errorDetail.message) !== null && _errorDetail_message !== void 0 ? _errorDetail_message : \"Request failed with status \".concat(res.status), {\n status: res.status,\n icebergType: errorDetail === null || errorDetail === void 0 ? void 0 : errorDetail.type,\n icebergCode: errorDetail === null || errorDetail === void 0 ? void 0 : errorDetail.code,\n details: errBody\n });\n }\n return {\n status: res.status,\n headers: res.headers,\n data\n };\n }\n };\n}\n// src/catalog/namespaces.ts\nfunction namespaceToPath(namespace) {\n return namespace.join(\"\\x1f\");\n}\nvar NamespaceOperations = class {\n async listNamespaces(parent) {\n const query = parent ? {\n parent: namespaceToPath(parent.namespace)\n } : void 0;\n const response = await this.client.request({\n method: \"GET\",\n path: \"\".concat(this.prefix, \"/namespaces\"),\n query\n });\n return response.data.namespaces.map((ns)=>({\n namespace: ns\n }));\n }\n async createNamespace(id, metadata) {\n const request = {\n namespace: id.namespace,\n properties: metadata === null || metadata === void 0 ? void 0 : metadata.properties\n };\n const response = await this.client.request({\n method: \"POST\",\n path: \"\".concat(this.prefix, \"/namespaces\"),\n body: request\n });\n return response.data;\n }\n async dropNamespace(id) {\n await this.client.request({\n method: \"DELETE\",\n path: \"\".concat(this.prefix, \"/namespaces/\").concat(namespaceToPath(id.namespace))\n });\n }\n async loadNamespaceMetadata(id) {\n const response = await this.client.request({\n method: \"GET\",\n path: \"\".concat(this.prefix, \"/namespaces/\").concat(namespaceToPath(id.namespace))\n });\n return {\n properties: response.data.properties\n };\n }\n async namespaceExists(id) {\n try {\n await this.client.request({\n method: \"HEAD\",\n path: \"\".concat(this.prefix, \"/namespaces/\").concat(namespaceToPath(id.namespace))\n });\n return true;\n } catch (error) {\n if (error instanceof IcebergError && error.status === 404) {\n return false;\n }\n throw error;\n }\n }\n async createNamespaceIfNotExists(id, metadata) {\n try {\n return await this.createNamespace(id, metadata);\n } catch (error) {\n if (error instanceof IcebergError && error.status === 409) {\n return;\n }\n throw error;\n }\n }\n constructor(client, prefix = \"\"){\n this.client = client;\n this.prefix = prefix;\n }\n};\n// src/catalog/tables.ts\nfunction namespaceToPath2(namespace) {\n return namespace.join(\"\\x1f\");\n}\nvar TableOperations = class {\n async listTables(namespace) {\n const response = await this.client.request({\n method: \"GET\",\n path: \"\".concat(this.prefix, \"/namespaces/\").concat(namespaceToPath2(namespace.namespace), \"/tables\")\n });\n return response.data.identifiers;\n }\n async createTable(namespace, request) {\n const headers = {};\n if (this.accessDelegation) {\n headers[\"X-Iceberg-Access-Delegation\"] = this.accessDelegation;\n }\n const response = await this.client.request({\n method: \"POST\",\n path: \"\".concat(this.prefix, \"/namespaces/\").concat(namespaceToPath2(namespace.namespace), \"/tables\"),\n body: request,\n headers\n });\n return response.data.metadata;\n }\n async updateTable(id, request) {\n const response = await this.client.request({\n method: \"POST\",\n path: \"\".concat(this.prefix, \"/namespaces/\").concat(namespaceToPath2(id.namespace), \"/tables/\").concat(id.name),\n body: request\n });\n return {\n \"metadata-location\": response.data[\"metadata-location\"],\n metadata: response.data.metadata\n };\n }\n async dropTable(id, options) {\n var _options_purge;\n await this.client.request({\n method: \"DELETE\",\n path: \"\".concat(this.prefix, \"/namespaces/\").concat(namespaceToPath2(id.namespace), \"/tables/\").concat(id.name),\n query: {\n purgeRequested: String((_options_purge = options === null || options === void 0 ? void 0 : options.purge) !== null && _options_purge !== void 0 ? _options_purge : false)\n }\n });\n }\n async loadTable(id) {\n const headers = {};\n if (this.accessDelegation) {\n headers[\"X-Iceberg-Access-Delegation\"] = this.accessDelegation;\n }\n const response = await this.client.request({\n method: \"GET\",\n path: \"\".concat(this.prefix, \"/namespaces/\").concat(namespaceToPath2(id.namespace), \"/tables/\").concat(id.name),\n headers\n });\n return response.data.metadata;\n }\n async tableExists(id) {\n const headers = {};\n if (this.accessDelegation) {\n headers[\"X-Iceberg-Access-Delegation\"] = this.accessDelegation;\n }\n try {\n await this.client.request({\n method: \"HEAD\",\n path: \"\".concat(this.prefix, \"/namespaces/\").concat(namespaceToPath2(id.namespace), \"/tables/\").concat(id.name),\n headers\n });\n return true;\n } catch (error) {\n if (error instanceof IcebergError && error.status === 404) {\n return false;\n }\n throw error;\n }\n }\n async createTableIfNotExists(namespace, request) {\n try {\n return await this.createTable(namespace, request);\n } catch (error) {\n if (error instanceof IcebergError && error.status === 409) {\n return await this.loadTable({\n namespace: namespace.namespace,\n name: request.name\n });\n }\n throw error;\n }\n }\n constructor(client, prefix = \"\", accessDelegation){\n this.client = client;\n this.prefix = prefix;\n this.accessDelegation = accessDelegation;\n }\n};\n// src/catalog/IcebergRestCatalog.ts\nvar IcebergRestCatalog = class {\n /**\n * Lists all namespaces in the catalog.\n *\n * @param parent - Optional parent namespace to list children under\n * @returns Array of namespace identifiers\n *\n * @example\n * ```typescript\n * // List all top-level namespaces\n * const namespaces = await catalog.listNamespaces();\n *\n * // List namespaces under a parent\n * const children = await catalog.listNamespaces({ namespace: ['analytics'] });\n * ```\n */ async listNamespaces(parent) {\n return this.namespaceOps.listNamespaces(parent);\n }\n /**\n * Creates a new namespace in the catalog.\n *\n * @param id - Namespace identifier to create\n * @param metadata - Optional metadata properties for the namespace\n * @returns Response containing the created namespace and its properties\n *\n * @example\n * ```typescript\n * const response = await catalog.createNamespace(\n * { namespace: ['analytics'] },\n * { properties: { owner: 'data-team' } }\n * );\n * console.log(response.namespace); // ['analytics']\n * console.log(response.properties); // { owner: 'data-team', ... }\n * ```\n */ async createNamespace(id, metadata) {\n return this.namespaceOps.createNamespace(id, metadata);\n }\n /**\n * Drops a namespace from the catalog.\n *\n * The namespace must be empty (contain no tables) before it can be dropped.\n *\n * @param id - Namespace identifier to drop\n *\n * @example\n * ```typescript\n * await catalog.dropNamespace({ namespace: ['analytics'] });\n * ```\n */ async dropNamespace(id) {\n await this.namespaceOps.dropNamespace(id);\n }\n /**\n * Loads metadata for a namespace.\n *\n * @param id - Namespace identifier to load\n * @returns Namespace metadata including properties\n *\n * @example\n * ```typescript\n * const metadata = await catalog.loadNamespaceMetadata({ namespace: ['analytics'] });\n * console.log(metadata.properties);\n * ```\n */ async loadNamespaceMetadata(id) {\n return this.namespaceOps.loadNamespaceMetadata(id);\n }\n /**\n * Lists all tables in a namespace.\n *\n * @param namespace - Namespace identifier to list tables from\n * @returns Array of table identifiers\n *\n * @example\n * ```typescript\n * const tables = await catalog.listTables({ namespace: ['analytics'] });\n * console.log(tables); // [{ namespace: ['analytics'], name: 'events' }, ...]\n * ```\n */ async listTables(namespace) {\n return this.tableOps.listTables(namespace);\n }\n /**\n * Creates a new table in the catalog.\n *\n * @param namespace - Namespace to create the table in\n * @param request - Table creation request including name, schema, partition spec, etc.\n * @returns Table metadata for the created table\n *\n * @example\n * ```typescript\n * const metadata = await catalog.createTable(\n * { namespace: ['analytics'] },\n * {\n * name: 'events',\n * schema: {\n * type: 'struct',\n * fields: [\n * { id: 1, name: 'id', type: 'long', required: true },\n * { id: 2, name: 'timestamp', type: 'timestamp', required: true }\n * ],\n * 'schema-id': 0\n * },\n * 'partition-spec': {\n * 'spec-id': 0,\n * fields: [\n * { source_id: 2, field_id: 1000, name: 'ts_day', transform: 'day' }\n * ]\n * }\n * }\n * );\n * ```\n */ async createTable(namespace, request) {\n return this.tableOps.createTable(namespace, request);\n }\n /**\n * Updates an existing table's metadata.\n *\n * Can update the schema, partition spec, or properties of a table.\n *\n * @param id - Table identifier to update\n * @param request - Update request with fields to modify\n * @returns Response containing the metadata location and updated table metadata\n *\n * @example\n * ```typescript\n * const response = await catalog.updateTable(\n * { namespace: ['analytics'], name: 'events' },\n * {\n * properties: { 'read.split.target-size': '134217728' }\n * }\n * );\n * console.log(response['metadata-location']); // s3://...\n * console.log(response.metadata); // TableMetadata object\n * ```\n */ async updateTable(id, request) {\n return this.tableOps.updateTable(id, request);\n }\n /**\n * Drops a table from the catalog.\n *\n * @param id - Table identifier to drop\n *\n * @example\n * ```typescript\n * await catalog.dropTable({ namespace: ['analytics'], name: 'events' });\n * ```\n */ async dropTable(id, options) {\n await this.tableOps.dropTable(id, options);\n }\n /**\n * Loads metadata for a table.\n *\n * @param id - Table identifier to load\n * @returns Table metadata including schema, partition spec, location, etc.\n *\n * @example\n * ```typescript\n * const metadata = await catalog.loadTable({ namespace: ['analytics'], name: 'events' });\n * console.log(metadata.schema);\n * console.log(metadata.location);\n * ```\n */ async loadTable(id) {\n return this.tableOps.loadTable(id);\n }\n /**\n * Checks if a namespace exists in the catalog.\n *\n * @param id - Namespace identifier to check\n * @returns True if the namespace exists, false otherwise\n *\n * @example\n * ```typescript\n * const exists = await catalog.namespaceExists({ namespace: ['analytics'] });\n * console.log(exists); // true or false\n * ```\n */ async namespaceExists(id) {\n return this.namespaceOps.namespaceExists(id);\n }\n /**\n * Checks if a table exists in the catalog.\n *\n * @param id - Table identifier to check\n * @returns True if the table exists, false otherwise\n *\n * @example\n * ```typescript\n * const exists = await catalog.tableExists({ namespace: ['analytics'], name: 'events' });\n * console.log(exists); // true or false\n * ```\n */ async tableExists(id) {\n return this.tableOps.tableExists(id);\n }\n /**\n * Creates a namespace if it does not exist.\n *\n * If the namespace already exists, returns void. If created, returns the response.\n *\n * @param id - Namespace identifier to create\n * @param metadata - Optional metadata properties for the namespace\n * @returns Response containing the created namespace and its properties, or void if it already exists\n *\n * @example\n * ```typescript\n * const response = await catalog.createNamespaceIfNotExists(\n * { namespace: ['analytics'] },\n * { properties: { owner: 'data-team' } }\n * );\n * if (response) {\n * console.log('Created:', response.namespace);\n * } else {\n * console.log('Already exists');\n * }\n * ```\n */ async createNamespaceIfNotExists(id, metadata) {\n return this.namespaceOps.createNamespaceIfNotExists(id, metadata);\n }\n /**\n * Creates a table if it does not exist.\n *\n * If the table already exists, returns its metadata instead.\n *\n * @param namespace - Namespace to create the table in\n * @param request - Table creation request including name, schema, partition spec, etc.\n * @returns Table metadata for the created or existing table\n *\n * @example\n * ```typescript\n * const metadata = await catalog.createTableIfNotExists(\n * { namespace: ['analytics'] },\n * {\n * name: 'events',\n * schema: {\n * type: 'struct',\n * fields: [\n * { id: 1, name: 'id', type: 'long', required: true },\n * { id: 2, name: 'timestamp', type: 'timestamp', required: true }\n * ],\n * 'schema-id': 0\n * }\n * }\n * );\n * ```\n */ async createTableIfNotExists(namespace, request) {\n return this.tableOps.createTableIfNotExists(namespace, request);\n }\n /**\n * Creates a new Iceberg REST Catalog client.\n *\n * @param options - Configuration options for the catalog client\n */ constructor(options){\n var _options_accessDelegation;\n let prefix = \"v1\";\n if (options.catalogName) {\n prefix += \"/\".concat(options.catalogName);\n }\n const baseUrl = options.baseUrl.endsWith(\"/\") ? options.baseUrl : \"\".concat(options.baseUrl, \"/\");\n this.client = createFetchClient({\n baseUrl,\n auth: options.auth,\n fetchImpl: options.fetch\n });\n this.accessDelegation = (_options_accessDelegation = options.accessDelegation) === null || _options_accessDelegation === void 0 ? void 0 : _options_accessDelegation.join(\",\");\n this.namespaceOps = new NamespaceOperations(this.client, prefix);\n this.tableOps = new TableOperations(this.client, prefix, this.accessDelegation);\n }\n};\n// src/catalog/types.ts\nvar DECIMAL_REGEX = /^decimal\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/;\nvar FIXED_REGEX = /^fixed\\s*\\[\\s*(\\d+)\\s*\\]$/;\nfunction parseDecimalType(type) {\n const match = type.match(DECIMAL_REGEX);\n if (!match) return null;\n return {\n precision: parseInt(match[1], 10),\n scale: parseInt(match[2], 10)\n };\n}\nfunction parseFixedType(type) {\n const match = type.match(FIXED_REGEX);\n if (!match) return null;\n return {\n length: parseInt(match[1], 10)\n };\n}\nfunction isDecimalType(type) {\n return DECIMAL_REGEX.test(type);\n}\nfunction isFixedType(type) {\n return FIXED_REGEX.test(type);\n}\nfunction typesEqual(a, b) {\n const decimalA = parseDecimalType(a);\n const decimalB = parseDecimalType(b);\n if (decimalA && decimalB) {\n return decimalA.precision === decimalB.precision && decimalA.scale === decimalB.scale;\n }\n const fixedA = parseFixedType(a);\n const fixedB = parseFixedType(b);\n if (fixedA && fixedB) {\n return fixedA.length === fixedB.length;\n }\n return a === b;\n}\nfunction getCurrentSchema(metadata) {\n return metadata.schemas.find((s)=>s[\"schema-id\"] === metadata[\"current-schema-id\"]);\n}\n //# sourceMappingURL=index.mjs.map\n //# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pY2ViZXJnLWpzL2Rpc3QvaW5kZXgubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsNkJBQTZCO0FBQzdCLElBQUlBLGVBQWUsY0FBY0M7SUFVL0I7O0dBRUMsR0FDREMsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDQyxNQUFNLEtBQUs7SUFDekI7SUFDQTs7R0FFQyxHQUNEQyxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUNELE1BQU0sS0FBSztJQUN6QjtJQUNBOztHQUVDLEdBQ0RFLDBCQUEwQjtRQUN4QixPQUFPLElBQUksQ0FBQ0YsTUFBTSxLQUFLO0lBQ3pCO0lBMUJBRyxZQUFZQyxPQUFPLEVBQUVDLElBQUksQ0FBRTtZQU9rR0E7UUFOM0gsS0FBSyxDQUFDRDtRQUNOLElBQUksQ0FBQ0UsSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDTixNQUFNLEdBQUdLLEtBQUtMLE1BQU07UUFDekIsSUFBSSxDQUFDTyxXQUFXLEdBQUdGLEtBQUtFLFdBQVc7UUFDbkMsSUFBSSxDQUFDQyxXQUFXLEdBQUdILEtBQUtHLFdBQVc7UUFDbkMsSUFBSSxDQUFDQyxPQUFPLEdBQUdKLEtBQUtJLE9BQU87UUFDM0IsSUFBSSxDQUFDQyxvQkFBb0IsR0FBR0wsS0FBS0UsV0FBVyxLQUFLLGlDQUFpQztZQUFDO1lBQUs7WUFBSztTQUFJLENBQUNJLFFBQVEsQ0FBQ04sS0FBS0wsTUFBTSxLQUFLSyxFQUFBQSxvQkFBQUEsS0FBS0UsV0FBVyxjQUFoQkYsd0NBQUFBLGtCQUFrQk0sUUFBUSxDQUFDLG9CQUFtQjtJQUMzSztBQW1CRjtBQUVBLG1CQUFtQjtBQUNuQixTQUFTQyxTQUFTQyxPQUFPLEVBQUVDLElBQUksRUFBRUMsS0FBSztJQUNwQyxNQUFNQyxNQUFNLElBQUlDLElBQUlILE1BQU1EO0lBQzFCLElBQUlFLE9BQU87UUFDVCxLQUFLLE1BQU0sQ0FBQ0csS0FBS0MsTUFBTSxJQUFJQyxPQUFPQyxPQUFP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QSxDQUFDLENBQUMsWUFBWSxLQUFLL0MsUUFBUSxDQUFDLG9CQUFvQjtBQUN0RjtBQUV3SSxDQUN4SSxrQ0FBa0M7Q0FDbEMsa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9pY2ViZXJnLWpzL2Rpc3QvaW5kZXgubWpzP2ZjYWUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL2Vycm9ycy9JY2ViZXJnRXJyb3IudHNcbnZhciBJY2ViZXJnRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSwgb3B0cykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiSWNlYmVyZ0Vycm9yXCI7XG4gICAgdGhpcy5zdGF0dXMgPSBvcHRzLnN0YXR1cztcbiAgICB0aGlzLmljZWJlcmdUeXBlID0gb3B0cy5pY2ViZXJnVHlwZTtcbiAgICB0aGlzLmljZWJlcmdDb2RlID0gb3B0cy5pY2ViZXJnQ29kZTtcbiAgICB0aGlzLmRldGFpbHMgPSBvcHRzLmRldGFpbHM7XG4gICAgdGhpcy5pc0NvbW1pdFN0YXRlVW5rbm93biA9IG9wdHMuaWNlYmVyZ1R5cGUgPT09IFwiQ29tbWl0U3RhdGVVbmtub3duRXhjZXB0aW9uXCIgfHwgWzUwMCwgNTAyLCA1MDRdLmluY2x1ZGVzKG9wdHMuc3RhdHVzKSAmJiBvcHRzLmljZWJlcmdUeXBlPy5pbmNsdWRlcyhcIkNvbW1pdFN0YXRlXCIpID09PSB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVycm9yIGlzIGEgNDA0IE5vdCBGb3VuZCBlcnJvci5cbiAgICovXG4gIGlzTm90Rm91bmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSA0MDQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXJyb3IgaXMgYSA0MDkgQ29uZmxpY3QgZXJyb3IuXG4gICAqL1xuICBpc0NvbmZsaWN0KCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gNDA5O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVycm9yIGlzIGEgNDE5IEF1dGhlbnRpY2F0aW9uIFRpbWVvdXQgZXJyb3IuXG4gICAqL1xuICBpc0F1dGhlbnRpY2F0aW9uVGltZW91dCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IDQxOTtcbiAgfVxufTtcblxuLy8gc3JjL3V0aWxzL3VybC50c1xuZnVuY3Rpb24gYnVpbGRVcmwoYmFzZVVybCwgcGF0aCwgcXVlcnkpIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBiYXNlVXJsKTtcbiAgaWYgKHF1ZXJ5KSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocXVlcnkpKSB7XG4gICAgICBpZiAodmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVybC50b1N0cmluZygpO1xufVxuXG4vLyBzcmMvaHR0cC9jcmVhdGVGZXRjaENsaWVudC50c1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRBdXRoSGVhZGVycyhhdXRoKSB7XG4gIGlmICghYXV0aCB8fCBhdXRoLnR5cGUgPT09IFwibm9uZVwiKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGlmIChhdXRoLnR5cGUgPT09IFwiYmVhcmVyXCIpIHtcbiAgICByZXR1cm4geyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXV0aC50b2tlbn1gIH07XG4gIH1cbiAgaWYgKGF1dGgudHlwZSA9PT0gXCJoZWFkZXJcIikge1xuICAgIHJldHVybiB7IFthdXRoLm5hbWVdOiBhdXRoLnZhbHVlIH07XG4gIH1cbiAgaWYgKGF1dGgudHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgIHJldHVybiBhd2FpdCBhdXRoLmdldEhlYWRlcnMoKTtcbiAgfVxuICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBjcmVhdGVGZXRjaENsaWVudChvcHRpb25zKSB7XG4gIGNvbnN0IGZldGNoRm4gPSBvcHRpb25zLmZldGNoSW1wbCA/PyBnbG9iYWxUaGlzLmZldGNoO1xuICByZXR1cm4ge1xuICAgIGFzeW5jIHJlcXVlc3Qoe1xuICAgICAgbWV0aG9kLFxuICAgICAgcGF0aCxcbiAgICAgIHF1ZXJ5LFxuICAgICAgYm9keSxcbiAgICAgIGhlYWRlcnNcbiAgICB9KSB7XG4gICAgICBjb25zdCB1cmwgPSBidWlsZFVybChvcHRpb25zLmJhc2VVcmwsIHBhdGgsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IGF1dGhIZWFkZXJzID0gYXdhaXQgYnVpbGRBdXRoSGVhZGVycyhvcHRpb25zLmF1dGgpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hGbih1cmwsIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uYm9keSA/IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSA6IHt9LFxuICAgICAgICAgIC4uLmF1dGhIZWFkZXJzLFxuICAgICAgICAgIC4uLmhlYWRlcnNcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogYm9keSA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogdm9pZCAwXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgY29uc3QgaXNKc29uID0gKHJlcy5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSB8fCBcIlwiKS5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICBjb25zdCBkYXRhID0gaXNKc29uICYmIHRleHQgPyBKU09OLnBhcnNlKHRleHQpIDogdGV4dDtcbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGNvbnN0IGVyckJvZHkgPSBpc0pzb24gPyBkYXRhIDogdm9pZCAwO1xuICAgICAgICBjb25zdCBlcnJvckRldGFpbCA9IGVyckJvZHk/LmVycm9yO1xuICAgICAgICB0aHJvdyBuZXcgSWNlYmVyZ0Vycm9yKFxuICAgICAgICAgIGVycm9yRGV0YWlsPy5tZXNzYWdlID8/IGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlcy5zdGF0dXN9YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgICAgICBpY2ViZXJnVHlwZTogZXJyb3JEZXRhaWw/LnR5cGUsXG4gICAgICAgICAgICBpY2ViZXJnQ29kZTogZXJyb3JEZXRhaWw/LmNvZGUsXG4gICAgICAgICAgICBkZXRhaWxzOiBlcnJCb2R5XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3RhdHVzOiByZXMuc3RhdHVzLCBoZWFkZXJzOiByZXMuaGVhZGVycywgZGF0YSB9O1xuICAgIH1cbiAgfTtcbn1cblxuLy8gc3JjL2NhdGFsb2cvbmFtZXNwYWNlcy50c1xuZnVuY3Rpb24gbmFtZXNwYWNlVG9QYXRoKG5hbWVzcGFjZSkge1xuICByZXR1cm4gbmFtZXNwYWNlLmpvaW4oXCJcdTAwMWZcIik7XG59XG52YXIgTmFtZXNwYWNlT3BlcmF0aW9ucyA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY2xpZW50LCBwcmVmaXggPSBcIlwiKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7XG4gIH1cbiAgYXN5bmMgbGlzdE5hbWVzcGFjZXMocGFyZW50KSB7XG4gICAgY29uc3QgcXVlcnkgPSBwYXJlbnQgPyB7IHBhcmVudDogbmFtZXNwYWNlVG9QYXRoKHBhcmVudC5uYW1lc3BhY2UpIH0gOiB2b2lkIDA7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHBhdGg6IGAke3RoaXMucHJlZml4fS9uYW1lc3BhY2VzYCxcbiAgICAgIHF1ZXJ5XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEubmFtZXNwYWNlcy5tYXAoKG5zKSA9PiAoeyBuYW1lc3BhY2U6IG5zIH0pKTtcbiAgfVxuICBhc3luYyBjcmVhdGVOYW1lc3BhY2UoaWQsIG1ldGFkYXRhKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIG5hbWVzcGFjZTogaWQubmFtZXNwYWNlLFxuICAgICAgcHJvcGVydGllczogbWV0YWRhdGE/LnByb3BlcnRpZXNcbiAgICB9O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucmVxdWVzdCh7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgcGF0aDogYCR7dGhpcy5wcmVmaXh9L25hbWVzcGFjZXNgLFxuICAgICAgYm9keTogcmVxdWVzdFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9XG4gIGFzeW5jIGRyb3BOYW1lc3BhY2UoaWQpIHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgIHBhdGg6IGAke3RoaXMucHJlZml4fS9uYW1lc3BhY2VzLyR7bmFtZXNwYWNlVG9QYXRoKGlkLm5hbWVzcGFjZSl9YFxuICAgIH0pO1xuICB9XG4gIGFzeW5jIGxvYWROYW1lc3BhY2VNZXRhZGF0YShpZCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucmVxdWVzdCh7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBwYXRoOiBgJHt0aGlzLnByZWZpeH0vbmFtZXNwYWNlcy8ke25hbWVzcGFjZVRvUGF0aChpZC5uYW1lc3BhY2UpfWBcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvcGVydGllczogcmVzcG9uc2UuZGF0YS5wcm9wZXJ0aWVzXG4gICAgfTtcbiAgfVxuICBhc3luYyBuYW1lc3BhY2VFeGlzdHMoaWQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jbGllbnQucmVxdWVzdCh7XG4gICAgICAgIG1ldGhvZDogXCJIRUFEXCIsXG4gICAgICAgIHBhdGg6IGAke3RoaXMucHJlZml4fS9uYW1lc3BhY2VzLyR7bmFtZXNwYWNlVG9QYXRoKGlkLm5hbWVzcGFjZSl9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSWNlYmVyZ0Vycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBhc3luYyBjcmVhdGVOYW1lc3BhY2VJZk5vdEV4aXN0cyhpZCwgbWV0YWRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlTmFtZXNwYWNlKGlkLCBtZXRhZGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEljZWJlcmdFcnJvciAmJiBlcnJvci5zdGF0dXMgPT09IDQwOSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn07XG5cbi8vIHNyYy9jYXRhbG9nL3RhYmxlcy50c1xuZnVuY3Rpb24gbmFtZXNwYWNlVG9QYXRoMihuYW1lc3BhY2UpIHtcbiAgcmV0dXJuIG5hbWVzcGFjZS5qb2luKFwiXHUwMDFmXCIpO1xufVxudmFyIFRhYmxlT3BlcmF0aW9ucyA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY2xpZW50LCBwcmVmaXggPSBcIlwiLCBhY2Nlc3NEZWxlZ2F0aW9uKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7XG4gICAgdGhpcy5hY2Nlc3NEZWxlZ2F0aW9uID0gYWNjZXNzRGVsZWdhdGlvbjtcbiAgfVxuICBhc3luYyBsaXN0VGFibGVzKG5hbWVzcGFjZSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucmVxdWVzdCh7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBwYXRoOiBgJHt0aGlzLnByZWZpeH0vbmFtZXNwYWNlcy8ke25hbWVzcGFjZVRvUGF0aDIobmFtZXNwYWNlLm5hbWVzcGFjZSl9L3RhYmxlc2BcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5pZGVudGlmaWVycztcbiAgfVxuICBhc3luYyBjcmVhdGVUYWJsZShuYW1lc3BhY2UsIHJlcXVlc3QpIHtcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgaWYgKHRoaXMuYWNjZXNzRGVsZWdhdGlvbikge1xuICAgICAgaGVhZGVyc1tcIlgtSWNlYmVyZy1BY2Nlc3MtRGVsZWdhdGlvblwiXSA9IHRoaXMuYWNjZXNzRGVsZWdhdGlvbjtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBwYXRoOiBgJHt0aGlzLnByZWZpeH0vbmFtZXNwYWNlcy8ke25hbWVzcGFjZVRvUGF0aDIobmFtZXNwYWNlLm5hbWVzcGFjZSl9L3RhYmxlc2AsXG4gICAgICBib2R5OiByZXF1ZXN0LFxuICAgICAgaGVhZGVyc1xuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhLm1ldGFkYXRhO1xuICB9XG4gIGFzeW5jIHVwZGF0ZVRhYmxlKGlkLCByZXF1ZXN0KSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBwYXRoOiBgJHt0aGlzLnByZWZpeH0vbmFtZXNwYWNlcy8ke25hbWVzcGFjZVRvUGF0aDIoaWQubmFtZXNwYWNlKX0vdGFibGVzLyR7aWQubmFtZX1gLFxuICAgICAgYm9keTogcmVxdWVzdFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBcIm1ldGFkYXRhLWxvY2F0aW9uXCI6IHJlc3BvbnNlLmRhdGFbXCJtZXRhZGF0YS1sb2NhdGlvblwiXSxcbiAgICAgIG1ldGFkYXRhOiByZXNwb25zZS5kYXRhLm1ldGFkYXRhXG4gICAgfTtcbiAgfVxuICBhc3luYyBkcm9wVGFibGUoaWQsIG9wdGlvbnMpIHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5yZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgIHBhdGg6IGAke3RoaXMucHJlZml4fS9uYW1lc3BhY2VzLyR7bmFtZXNwYWNlVG9QYXRoMihpZC5uYW1lc3BhY2UpfS90YWJsZXMvJHtpZC5uYW1lfWAsXG4gICAgICBxdWVyeTogeyBwdXJnZVJlcXVlc3RlZDogU3RyaW5nKG9wdGlvbnM/LnB1cmdlID8/IGZhbHNlKSB9XG4gICAgfSk7XG4gIH1cbiAgYXN5bmMgbG9hZFRhYmxlKGlkKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGlmICh0aGlzLmFjY2Vzc0RlbGVnYXRpb24pIHtcbiAgICAgIGhlYWRlcnNbXCJYLUljZWJlcmctQWNjZXNzLURlbGVnYXRpb25cIl0gPSB0aGlzLmFjY2Vzc0RlbGVnYXRpb247XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucmVxdWVzdCh7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBwYXRoOiBgJHt0aGlzLnByZWZpeH0vbmFtZXNwYWNlcy8ke25hbWVzcGFjZVRvUGF0aDIoaWQubmFtZXNwYWNlKX0vdGFibGVzLyR7aWQubmFtZX1gLFxuICAgICAgaGVhZGVyc1xuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhLm1ldGFkYXRhO1xuICB9XG4gIGFzeW5jIHRhYmxlRXhpc3RzKGlkKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgIGlmICh0aGlzLmFjY2Vzc0RlbGVnYXRpb24pIHtcbiAgICAgIGhlYWRlcnNbXCJYLUljZWJlcmctQWNjZXNzLURlbGVnYXRpb25cIl0gPSB0aGlzLmFjY2Vzc0RlbGVnYXRpb247XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5yZXF1ZXN0KHtcbiAgICAgICAgbWV0aG9kOiBcIkhFQURcIixcbiAgICAgICAgcGF0aDogYCR7dGhpcy5wcmVmaXh9L25hbWVzcGFjZXMvJHtuYW1lc3BhY2VUb1BhdGgyKGlkLm5hbWVzcGFjZSl9L3RhYmxlcy8ke2lkLm5hbWV9YCxcbiAgICAgICAgaGVhZGVyc1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSWNlYmVyZ0Vycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBhc3luYyBjcmVhdGVUYWJsZUlmTm90RXhpc3RzKG5hbWVzcGFjZSwgcmVxdWVzdCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVUYWJsZShuYW1lc3BhY2UsIHJlcXVlc3QpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBJY2ViZXJnRXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZFRhYmxlKHsgbmFtZXNwYWNlOiBuYW1lc3BhY2UubmFtZXNwYWNlLCBuYW1lOiByZXF1ZXN0Lm5hbWUgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn07XG5cbi8vIHNyYy9jYXRhbG9nL0ljZWJlcmdSZXN0Q2F0YWxvZy50c1xudmFyIEljZWJlcmdSZXN0Q2F0YWxvZyA9IGNsYXNzIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgSWNlYmVyZyBSRVNUIENhdGFsb2cgY2xpZW50LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGNhdGFsb2cgY2xpZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgbGV0IHByZWZpeCA9IFwidjFcIjtcbiAgICBpZiAob3B0aW9ucy5jYXRhbG9nTmFtZSkge1xuICAgICAgcHJlZml4ICs9IGAvJHtvcHRpb25zLmNhdGFsb2dOYW1lfWA7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VVcmwgPSBvcHRpb25zLmJhc2VVcmwuZW5kc1dpdGgoXCIvXCIpID8gb3B0aW9ucy5iYXNlVXJsIDogYCR7b3B0aW9ucy5iYXNlVXJsfS9gO1xuICAgIHRoaXMuY2xpZW50ID0gY3JlYXRlRmV0Y2hDbGllbnQoe1xuICAgICAgYmFzZVVybCxcbiAgICAgIGF1dGg6IG9wdGlvbnMuYXV0aCxcbiAgICAgIGZldGNoSW1wbDogb3B0aW9ucy5mZXRjaFxuICAgIH0pO1xuICAgIHRoaXMuYWNjZXNzRGVsZWdhdGlvbiA9IG9wdGlvbnMuYWNjZXNzRGVsZWdhdGlvbj8uam9pbihcIixcIik7XG4gICAgdGhpcy5uYW1lc3BhY2VPcHMgPSBuZXcgTmFtZXNwYWNlT3BlcmF0aW9ucyh0aGlzLmNsaWVudCwgcHJlZml4KTtcbiAgICB0aGlzLnRhYmxlT3BzID0gbmV3IFRhYmxlT3BlcmF0aW9ucyh0aGlzLmNsaWVudCwgcHJlZml4LCB0aGlzLmFjY2Vzc0RlbGVnYXRpb24pO1xuICB9XG4gIC8qKlxuICAgKiBMaXN0cyBhbGwgbmFtZXNwYWNlcyBpbiB0aGUgY2F0YWxvZy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmVudCAtIE9wdGlvbmFsIHBhcmVudCBuYW1lc3BhY2UgdG8gbGlzdCBjaGlsZHJlbiB1bmRlclxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBuYW1lc3BhY2UgaWRlbnRpZmllcnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBMaXN0IGFsbCB0b3AtbGV2ZWwgbmFtZXNwYWNlc1xuICAgKiBjb25zdCBuYW1lc3BhY2VzID0gYXdhaXQgY2F0YWxvZy5saXN0TmFtZXNwYWNlcygpO1xuICAgKlxuICAgKiAvLyBMaXN0IG5hbWVzcGFjZXMgdW5kZXIgYSBwYXJlbnRcbiAgICogY29uc3QgY2hpbGRyZW4gPSBhd2FpdCBjYXRhbG9nLmxpc3ROYW1lc3BhY2VzKHsgbmFtZXNwYWNlOiBbJ2FuYWx5dGljcyddIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxpc3ROYW1lc3BhY2VzKHBhcmVudCkge1xuICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZU9wcy5saXN0TmFtZXNwYWNlcyhwYXJlbnQpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IG5hbWVzcGFjZSBpbiB0aGUgY2F0YWxvZy5cbiAgICpcbiAgICogQHBhcmFtIGlkIC0gTmFtZXNwYWNlIGlkZW50aWZpZXIgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIE9wdGlvbmFsIG1ldGFkYXRhIHByb3BlcnRpZXMgZm9yIHRoZSBuYW1lc3BhY2VcbiAgICogQHJldHVybnMgUmVzcG9uc2UgY29udGFpbmluZyB0aGUgY3JlYXRlZCBuYW1lc3BhY2UgYW5kIGl0cyBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjYXRhbG9nLmNyZWF0ZU5hbWVzcGFjZShcbiAgICogICB7IG5hbWVzcGFjZTogWydhbmFseXRpY3MnXSB9LFxuICAgKiAgIHsgcHJvcGVydGllczogeyBvd25lcjogJ2RhdGEtdGVhbScgfSB9XG4gICAqICk7XG4gICAqIGNvbnNvbGUubG9nKHJlc3BvbnNlLm5hbWVzcGFjZSk7IC8vIFsnYW5hbHl0aWNzJ11cbiAgICogY29uc29sZS5sb2cocmVzcG9uc2UucHJvcGVydGllcyk7IC8vIHsgb3duZXI6ICdkYXRhLXRlYW0nLCAuLi4gfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNyZWF0ZU5hbWVzcGFjZShpZCwgbWV0YWRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2VPcHMuY3JlYXRlTmFtZXNwYWNlKGlkLCBtZXRhZGF0YSk7XG4gIH1cbiAgLyoqXG4gICAqIERyb3BzIGEgbmFtZXNwYWNlIGZyb20gdGhlIGNhdGFsb2cuXG4gICAqXG4gICAqIFRoZSBuYW1lc3BhY2UgbXVzdCBiZSBlbXB0eSAoY29udGFpbiBubyB0YWJsZXMpIGJlZm9yZSBpdCBjYW4gYmUgZHJvcHBlZC5cbiAgICpcbiAgICogQHBhcmFtIGlkIC0gTmFtZXNwYWNlIGlkZW50aWZpZXIgdG8gZHJvcFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IGNhdGFsb2cuZHJvcE5hbWVzcGFjZSh7IG5hbWVzcGFjZTogWydhbmFseXRpY3MnXSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBkcm9wTmFtZXNwYWNlKGlkKSB7XG4gICAgYXdhaXQgdGhpcy5uYW1lc3BhY2VPcHMuZHJvcE5hbWVzcGFjZShpZCk7XG4gIH1cbiAgLyoqXG4gICAqIExvYWRzIG1ldGFkYXRhIGZvciBhIG5hbWVzcGFjZS5cbiAgICpcbiAgICogQHBhcmFtIGlkIC0gTmFtZXNwYWNlIGlkZW50aWZpZXIgdG8gbG9hZFxuICAgKiBAcmV0dXJucyBOYW1lc3BhY2UgbWV0YWRhdGEgaW5jbHVkaW5nIHByb3BlcnRpZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGNhdGFsb2cubG9hZE5hbWVzcGFjZU1ldGFkYXRhKHsgbmFtZXNwYWNlOiBbJ2FuYWx5dGljcyddIH0pO1xuICAgKiBjb25zb2xlLmxvZyhtZXRhZGF0YS5wcm9wZXJ0aWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2FkTmFtZXNwYWNlTWV0YWRhdGEoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2VPcHMubG9hZE5hbWVzcGFjZU1ldGFkYXRhKGlkKTtcbiAgfVxuICAvKipcbiAgICogTGlzdHMgYWxsIHRhYmxlcyBpbiBhIG5hbWVzcGFjZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWVzcGFjZSAtIE5hbWVzcGFjZSBpZGVudGlmaWVyIHRvIGxpc3QgdGFibGVzIGZyb21cbiAgICogQHJldHVybnMgQXJyYXkgb2YgdGFibGUgaWRlbnRpZmllcnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0YWJsZXMgPSBhd2FpdCBjYXRhbG9nLmxpc3RUYWJsZXMoeyBuYW1lc3BhY2U6IFsnYW5hbHl0aWNzJ10gfSk7XG4gICAqIGNvbnNvbGUubG9nKHRhYmxlcyk7IC8vIFt7IG5hbWVzcGFjZTogWydhbmFseXRpY3MnXSwgbmFtZTogJ2V2ZW50cycgfSwgLi4uXVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxpc3RUYWJsZXMobmFtZXNwYWNlKSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVPcHMubGlzdFRhYmxlcyhuYW1lc3BhY2UpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHRhYmxlIGluIHRoZSBjYXRhbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gTmFtZXNwYWNlIHRvIGNyZWF0ZSB0aGUgdGFibGUgaW5cbiAgICogQHBhcmFtIHJlcXVlc3QgLSBUYWJsZSBjcmVhdGlvbiByZXF1ZXN0IGluY2x1ZGluZyBuYW1lLCBzY2hlbWEsIHBhcnRpdGlvbiBzcGVjLCBldGMuXG4gICAqIEByZXR1cm5zIFRhYmxlIG1ldGFkYXRhIGZvciB0aGUgY3JlYXRlZCB0YWJsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgY2F0YWxvZy5jcmVhdGVUYWJsZShcbiAgICogICB7IG5hbWVzcGFjZTogWydhbmFseXRpY3MnXSB9LFxuICAgKiAgIHtcbiAgICogICAgIG5hbWU6ICdldmVudHMnLFxuICAgKiAgICAgc2NoZW1hOiB7XG4gICAqICAgICAgIHR5cGU6ICdzdHJ1Y3QnLFxuICAgKiAgICAgICBmaWVsZHM6IFtcbiAgICogICAgICAgICB7IGlkOiAxLCBuYW1lOiAnaWQnLCB0eXBlOiAnbG9uZycsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAqICAgICAgICAgeyBpZDogMiwgbmFtZTogJ3RpbWVzdGFtcCcsIHR5cGU6ICd0aW1lc3RhbXAnLCByZXF1aXJlZDogdHJ1ZSB9XG4gICAqICAgICAgIF0sXG4gICAqICAgICAgICdzY2hlbWEtaWQnOiAwXG4gICAqICAgICB9LFxuICAgKiAgICAgJ3BhcnRpdGlvbi1zcGVjJzoge1xuICAgKiAgICAgICAnc3BlYy1pZCc6IDAsXG4gICAqICAgICAgIGZpZWxkczogW1xuICAgKiAgICAgICAgIHsgc291cmNlX2lkOiAyLCBmaWVsZF9pZDogMTAwMCwgbmFtZTogJ3RzX2RheScsIHRyYW5zZm9ybTogJ2RheScgfVxuICAgKiAgICAgICBdXG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVRhYmxlKG5hbWVzcGFjZSwgcmVxdWVzdCkge1xuICAgIHJldHVybiB0aGlzLnRhYmxlT3BzLmNyZWF0ZVRhYmxlKG5hbWVzcGFjZSwgcmVxdWVzdCk7XG4gIH1cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgdGFibGUncyBtZXRhZGF0YS5cbiAgICpcbiAgICogQ2FuIHVwZGF0ZSB0aGUgc2NoZW1hLCBwYXJ0aXRpb24gc3BlYywgb3IgcHJvcGVydGllcyBvZiBhIHRhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBUYWJsZSBpZGVudGlmaWVyIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gcmVxdWVzdCAtIFVwZGF0ZSByZXF1ZXN0IHdpdGggZmllbGRzIHRvIG1vZGlmeVxuICAgKiBAcmV0dXJucyBSZXNwb25zZSBjb250YWluaW5nIHRoZSBtZXRhZGF0YSBsb2NhdGlvbiBhbmQgdXBkYXRlZCB0YWJsZSBtZXRhZGF0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2F0YWxvZy51cGRhdGVUYWJsZShcbiAgICogICB7IG5hbWVzcGFjZTogWydhbmFseXRpY3MnXSwgbmFtZTogJ2V2ZW50cycgfSxcbiAgICogICB7XG4gICAqICAgICBwcm9wZXJ0aWVzOiB7ICdyZWFkLnNwbGl0LnRhcmdldC1zaXplJzogJzEzNDIxNzcyOCcgfVxuICAgKiAgIH1cbiAgICogKTtcbiAgICogY29uc29sZS5sb2cocmVzcG9uc2VbJ21ldGFkYXRhLWxvY2F0aW9uJ10pOyAvLyBzMzovLy4uLlxuICAgKiBjb25zb2xlLmxvZyhyZXNwb25zZS5tZXRhZGF0YSk7IC8vIFRhYmxlTWV0YWRhdGEgb2JqZWN0XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlVGFibGUoaWQsIHJlcXVlc3QpIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZU9wcy51cGRhdGVUYWJsZShpZCwgcmVxdWVzdCk7XG4gIH1cbiAgLyoqXG4gICAqIERyb3BzIGEgdGFibGUgZnJvbSB0aGUgY2F0YWxvZy5cbiAgICpcbiAgICogQHBhcmFtIGlkIC0gVGFibGUgaWRlbnRpZmllciB0byBkcm9wXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgY2F0YWxvZy5kcm9wVGFibGUoeyBuYW1lc3BhY2U6IFsnYW5hbHl0aWNzJ10sIG5hbWU6ICdldmVudHMnIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRyb3BUYWJsZShpZCwgb3B0aW9ucykge1xuICAgIGF3YWl0IHRoaXMudGFibGVPcHMuZHJvcFRhYmxlKGlkLCBvcHRpb25zKTtcbiAgfVxuICAvKipcbiAgICogTG9hZHMgbWV0YWRhdGEgZm9yIGEgdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFRhYmxlIGlkZW50aWZpZXIgdG8gbG9hZFxuICAgKiBAcmV0dXJucyBUYWJsZSBtZXRhZGF0YSBpbmNsdWRpbmcgc2NoZW1hLCBwYXJ0aXRpb24gc3BlYywgbG9jYXRpb24sIGV0Yy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGNhdGFsb2cubG9hZFRhYmxlKHsgbmFtZXNwYWNlOiBbJ2FuYWx5dGljcyddLCBuYW1lOiAnZXZlbnRzJyB9KTtcbiAgICogY29uc29sZS5sb2cobWV0YWRhdGEuc2NoZW1hKTtcbiAgICogY29uc29sZS5sb2cobWV0YWRhdGEubG9jYXRpb24pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvYWRUYWJsZShpZCkge1xuICAgIHJldHVybiB0aGlzLnRhYmxlT3BzLmxvYWRUYWJsZShpZCk7XG4gIH1cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIG5hbWVzcGFjZSBleGlzdHMgaW4gdGhlIGNhdGFsb2cuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIE5hbWVzcGFjZSBpZGVudGlmaWVyIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG5hbWVzcGFjZSBleGlzdHMsIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGV4aXN0cyA9IGF3YWl0IGNhdGFsb2cubmFtZXNwYWNlRXhpc3RzKHsgbmFtZXNwYWNlOiBbJ2FuYWx5dGljcyddIH0pO1xuICAgKiBjb25zb2xlLmxvZyhleGlzdHMpOyAvLyB0cnVlIG9yIGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbmFtZXNwYWNlRXhpc3RzKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlT3BzLm5hbWVzcGFjZUV4aXN0cyhpZCk7XG4gIH1cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHRhYmxlIGV4aXN0cyBpbiB0aGUgY2F0YWxvZy5cbiAgICpcbiAgICogQHBhcmFtIGlkIC0gVGFibGUgaWRlbnRpZmllciB0byBjaGVja1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB0YWJsZSBleGlzdHMsIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGV4aXN0cyA9IGF3YWl0IGNhdGFsb2cudGFibGVFeGlzdHMoeyBuYW1lc3BhY2U6IFsnYW5hbHl0aWNzJ10sIG5hbWU6ICdldmVudHMnIH0pO1xuICAgKiBjb25zb2xlLmxvZyhleGlzdHMpOyAvLyB0cnVlIG9yIGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdGFibGVFeGlzdHMoaWQpIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZU9wcy50YWJsZUV4aXN0cyhpZCk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuYW1lc3BhY2UgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIElmIHRoZSBuYW1lc3BhY2UgYWxyZWFkeSBleGlzdHMsIHJldHVybnMgdm9pZC4gSWYgY3JlYXRlZCwgcmV0dXJucyB0aGUgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIE5hbWVzcGFjZSBpZGVudGlmaWVyIHRvIGNyZWF0ZVxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBPcHRpb25hbCBtZXRhZGF0YSBwcm9wZXJ0aWVzIGZvciB0aGUgbmFtZXNwYWNlXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGNvbnRhaW5pbmcgdGhlIGNyZWF0ZWQgbmFtZXNwYWNlIGFuZCBpdHMgcHJvcGVydGllcywgb3Igdm9pZCBpZiBpdCBhbHJlYWR5IGV4aXN0c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2F0YWxvZy5jcmVhdGVOYW1lc3BhY2VJZk5vdEV4aXN0cyhcbiAgICogICB7IG5hbWVzcGFjZTogWydhbmFseXRpY3MnXSB9LFxuICAgKiAgIHsgcHJvcGVydGllczogeyBvd25lcjogJ2RhdGEtdGVhbScgfSB9XG4gICAqICk7XG4gICAqIGlmIChyZXNwb25zZSkge1xuICAgKiAgIGNvbnNvbGUubG9nKCdDcmVhdGVkOicsIHJlc3BvbnNlLm5hbWVzcGFjZSk7XG4gICAqIH0gZWxzZSB7XG4gICAqICAgY29uc29sZS5sb2coJ0FscmVhZHkgZXhpc3RzJyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjcmVhdGVOYW1lc3BhY2VJZk5vdEV4aXN0cyhpZCwgbWV0YWRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2VPcHMuY3JlYXRlTmFtZXNwYWNlSWZOb3RFeGlzdHMoaWQsIG1ldGFkYXRhKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBJZiB0aGUgdGFibGUgYWxyZWFkeSBleGlzdHMsIHJldHVybnMgaXRzIG1ldGFkYXRhIGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSBOYW1lc3BhY2UgdG8gY3JlYXRlIHRoZSB0YWJsZSBpblxuICAgKiBAcGFyYW0gcmVxdWVzdCAtIFRhYmxlIGNyZWF0aW9uIHJlcXVlc3QgaW5jbHVkaW5nIG5hbWUsIHNjaGVtYSwgcGFydGl0aW9uIHNwZWMsIGV0Yy5cbiAgICogQHJldHVybnMgVGFibGUgbWV0YWRhdGEgZm9yIHRoZSBjcmVhdGVkIG9yIGV4aXN0aW5nIHRhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBjYXRhbG9nLmNyZWF0ZVRhYmxlSWZOb3RFeGlzdHMoXG4gICAqICAgeyBuYW1lc3BhY2U6IFsnYW5hbHl0aWNzJ10gfSxcbiAgICogICB7XG4gICAqICAgICBuYW1lOiAnZXZlbnRzJyxcbiAgICogICAgIHNjaGVtYToge1xuICAgKiAgICAgICB0eXBlOiAnc3RydWN0JyxcbiAgICogICAgICAgZmllbGRzOiBbXG4gICAqICAgICAgICAgeyBpZDogMSwgbmFtZTogJ2lkJywgdHlwZTogJ2xvbmcnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgKiAgICAgICAgIHsgaWQ6IDIsIG5hbWU6ICd0aW1lc3RhbXAnLCB0eXBlOiAndGltZXN0YW1wJywgcmVxdWlyZWQ6IHRydWUgfVxuICAgKiAgICAgICBdLFxuICAgKiAgICAgICAnc2NoZW1hLWlkJzogMFxuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjcmVhdGVUYWJsZUlmTm90RXhpc3RzKG5hbWVzcGFjZSwgcmVxdWVzdCkge1xuICAgIHJldHVybiB0aGlzLnRhYmxlT3BzLmNyZWF0ZVRhYmxlSWZOb3RFeGlzdHMobmFtZXNwYWNlLCByZXF1ZXN0KTtcbiAgfVxufTtcblxuLy8gc3JjL2NhdGFsb2cvdHlwZXMudHNcbnZhciBERUNJTUFMX1JFR0VYID0gL15kZWNpbWFsXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqXFwpJC87XG52YXIgRklYRURfUkVHRVggPSAvXmZpeGVkXFxzKlxcW1xccyooXFxkKylcXHMqXFxdJC87XG5mdW5jdGlvbiBwYXJzZURlY2ltYWxUeXBlKHR5cGUpIHtcbiAgY29uc3QgbWF0Y2ggPSB0eXBlLm1hdGNoKERFQ0lNQUxfUkVHRVgpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBwcmVjaXNpb246IHBhcnNlSW50KG1hdGNoWzFdLCAxMCksXG4gICAgc2NhbGU6IHBhcnNlSW50KG1hdGNoWzJdLCAxMClcbiAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlRml4ZWRUeXBlKHR5cGUpIHtcbiAgY29uc3QgbWF0Y2ggPSB0eXBlLm1hdGNoKEZJWEVEX1JFR0VYKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB7XG4gICAgbGVuZ3RoOiBwYXJzZUludChtYXRjaFsxXSwgMTApXG4gIH07XG59XG5mdW5jdGlvbiBpc0RlY2ltYWxUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIERFQ0lNQUxfUkVHRVgudGVzdCh0eXBlKTtcbn1cbmZ1bmN0aW9uIGlzRml4ZWRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIEZJWEVEX1JFR0VYLnRlc3QodHlwZSk7XG59XG5mdW5jdGlvbiB0eXBlc0VxdWFsKGEsIGIpIHtcbiAgY29uc3QgZGVjaW1hbEEgPSBwYXJzZURlY2ltYWxUeXBlKGEpO1xuICBjb25zdCBkZWNpbWFsQiA9IHBhcnNlRGVjaW1hbFR5cGUoYik7XG4gIGlmIChkZWNpbWFsQSAmJiBkZWNpbWFsQikge1xuICAgIHJldHVybiBkZWNpbWFsQS5wcmVjaXNpb24gPT09IGRlY2ltYWxCLnByZWNpc2lvbiAmJiBkZWNpbWFsQS5zY2FsZSA9PT0gZGVjaW1hbEIuc2NhbGU7XG4gIH1cbiAgY29uc3QgZml4ZWRBID0gcGFyc2VGaXhlZFR5cGUoYSk7XG4gIGNvbnN0IGZpeGVkQiA9IHBhcnNlRml4ZWRUeXBlKGIpO1xuICBpZiAoZml4ZWRBICYmIGZpeGVkQikge1xuICAgIHJldHVybiBmaXhlZEEubGVuZ3RoID09PSBmaXhlZEIubGVuZ3RoO1xuICB9XG4gIHJldHVybiBhID09PSBiO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudFNjaGVtYShtZXRhZGF0YSkge1xuICByZXR1cm4gbWV0YWRhdGEuc2NoZW1hcy5maW5kKChzKSA9PiBzW1wic2NoZW1hLWlkXCJdID09PSBtZXRhZGF0YVtcImN1cnJlbnQtc2NoZW1hLWlkXCJdKTtcbn1cblxuZXhwb3J0IHsgSWNlYmVyZ0Vycm9yLCBJY2ViZXJnUmVzdENhdGFsb2csIGdldEN1cnJlbnRTY2hlbWEsIGlzRGVjaW1hbFR5cGUsIGlzRml4ZWRUeXBlLCBwYXJzZURlY2ltYWxUeXBlLCBwYXJzZUZpeGVkVHlwZSwgdHlwZXNFcXVhbCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcCJdLCJuYW1lcyI6WyJJY2ViZXJnRXJyb3IiLCJFcnJvciIsImlzTm90Rm91bmQiLCJzdGF0dXMiLCJpc0NvbmZsaWN0IiwiaXNBdXRoZW50aWNhdGlvblRpbWVvdXQiLCJjb25zdHJ1Y3RvciIsIm1lc3NhZ2UiLCJvcHRzIiwibmFtZSIsImljZWJlcmdUeXBlIiwiaWNlYmVyZ0NvZGUiLCJkZXRhaWxzIiwiaXNDb21taXRTdGF0ZVVua25vd24iLCJpbmNsdWRlcyIsImJ1aWxkVXJsIiwiYmFzZVVybCIsInBhdGgiLCJxdWVyeSIsInVybCIsIlVSTCIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsInNlYXJjaFBhcmFtcyIsInNldCIsInRvU3RyaW5nIiwiYnVpbGRBdXRoSGVhZGVycyIsImF1dGgiLCJ0eXBlIiwiQXV0aG9yaXphdGlvbiIsInRva2VuIiwiZ2V0SGVhZGVycyIsImNyZWF0ZUZldGNoQ2xpZW50Iiwib3B0aW9ucyIsImZldGNoRm4iLCJmZXRjaEltcGwiLCJnbG9iYWxUaGlzIiwiZmV0Y2giLCJyZXF1ZXN0IiwibWV0aG9kIiwiYm9keSIsImhlYWRlcnMiLCJhdXRoSGVhZGVycyIsInJlcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0ZXh0IiwiaXNKc29uIiwiZ2V0IiwiZGF0YSIsInBhcnNlIiwib2siLCJlcnJCb2R5IiwiZXJyb3JEZXRhaWwiLCJlcnJvciIsImNvZGUiLCJuYW1lc3BhY2VUb1BhdGgiLCJuYW1lc3BhY2UiLCJqb2luIiwiTmFtZXNwYWNlT3BlcmF0aW9ucyIsImxpc3ROYW1lc3BhY2VzIiwicGFyZW50IiwicmVzcG9uc2UiLCJjbGllbnQiLCJwcmVmaXgiLCJuYW1lc3BhY2VzIiwibWFwIiwibnMiLCJjcmVhdGVOYW1lc3BhY2UiLCJpZCIsIm1ldGFkYXRhIiwicHJvcGVydGllcyIsImRyb3BOYW1lc3BhY2UiLCJsb2FkTmFtZXNwYWNlTWV0YWRhdGEiLCJuYW1lc3BhY2VFeGlzdHMiLCJjcmVhdGVOYW1lc3BhY2VJZk5vdEV4aXN0cyIsIm5hbWVzcGFjZVRvUGF0aDIiLCJUYWJsZU9wZXJhdGlvbnMiLCJsaXN0VGFibGVzIiwiaWRlbnRpZmllcnMiLCJjcmVhdGVUYWJsZSIsImFjY2Vzc0RlbGVnYXRpb24iLCJ1cGRhdGVUYWJsZSIsImRyb3BUYWJsZSIsInB1cmdlUmVxdWVzdGVkIiwiU3RyaW5nIiwicHVyZ2UiLCJsb2FkVGFibGUiLCJ0YWJsZUV4aXN0cyIsImNyZWF0ZVRhYmxlSWZOb3RFeGlzdHMiLCJJY2ViZXJnUmVzdENhdGFsb2ciLCJuYW1lc3BhY2VPcHMiLCJ0YWJsZU9wcyIsImNhdGFsb2dOYW1lIiwiZW5kc1dpdGgiLCJERUNJTUFMX1JFR0VYIiwiRklYRURfUkVHRVgiLCJwYXJzZURlY2ltYWxUeXBlIiwibWF0Y2giLCJwcmVjaXNpb24iLCJwYXJzZUludCIsInNjYWxlIiwicGFyc2VGaXhlZFR5cGUiLCJsZW5ndGgiLCJpc0RlY2ltYWxUeXBlIiwidGVzdCIsImlzRml4ZWRUeXBlIiwidHlwZXNFcXVhbCIsImEiLCJiIiwiZGVjaW1hbEEiLCJkZWNpbWFsQiIsImZpeGVkQSIsImZpeGVkQiIsImdldEN1cnJlbnRTY2hlbWEiLCJzY2hlbWFzIiwiZmluZCIsInMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/iceberg-js/dist/index.mjs\n"));
/***/ }),
/***/ "(app-pages-browser)/./node_modules/tslib/tslib.es6.mjs":
/*!******************************************!*\
!*** ./node_modules/tslib/tslib.es6.mjs ***!
\******************************************/
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ __addDisposableResource: function() { return /* binding */ __addDisposableResource; },\n/* harmony export */ __assign: function() { return /* binding */ __assign; },\n/* harmony export */ __asyncDelegator: function() { return /* binding */ __asyncDelegator; },\n/* harmony export */ __asyncGenerator: function() { return /* binding */ __asyncGenerator; },\n/* harmony export */ __asyncValues: function() { return /* binding */ __asyncValues; },\n/* harmony export */ __await: function() { return /* binding */ __await; },\n/* harmony export */ __awaiter: function() { return /* binding */ __awaiter; },\n/* harmony export */ __classPrivateFieldGet: function() { return /* binding */ __classPrivateFieldGet; },\n/* harmony export */ __classPrivateFieldIn: function() { return /* binding */ __classPrivateFieldIn; },\n/* harmony export */ __classPrivateFieldSet: function() { return /* binding */ __classPrivateFieldSet; },\n/* harmony export */ __createBinding: function() { return /* binding */ __createBinding; },\n/* harmony export */ __decorate: function() { return /* binding */ __decorate; },\n/* harmony export */ __disposeResources: function() { return /* binding */ __disposeResources; },\n/* harmony export */ __esDecorate: function() { return /* binding */ __esDecorate; },\n/* harmony export */ __exportStar: function() { return /* binding */ __exportStar; },\n/* harmony export */ __extends: function() { return /* binding */ __extends; },\n/* harmony export */ __generator: function() { return /* binding */ __generator; },\n/* harmony export */ __importDefault: function() { return /* binding */ __importDefault; },\n/* harmony export */ __importStar: function() { return /* binding */ __importStar; },\n/* harmony export */ __makeTemplateObject: function() { return /* binding */ __makeTemplateObject; },\n/* harmony export */ __metadata: function() { return /* binding */ __metadata; },\n/* harmony export */ __param: function() { return /* binding */ __param; },\n/* harmony export */ __propKey: function() { return /* binding */ __propKey; },\n/* harmony export */ __read: function() { return /* binding */ __read; },\n/* harmony export */ __rest: function() { return /* binding */ __rest; },\n/* harmony export */ __rewriteRelativeImportExtension: function() { return /* binding */ __rewriteRelativeImportExtension; },\n/* harmony export */ __runInitializers: function() { return /* binding */ __runInitializers; },\n/* harmony export */ __setFunctionName: function() { return /* binding */ __setFunctionName; },\n/* harmony export */ __spread: function() { return /* binding */ __spread; },\n/* harmony export */ __spreadArray: function() { return /* binding */ __spreadArray; },\n/* harmony export */ __spreadArrays: function() { return /* binding */ __spreadArrays; },\n/* harmony export */ __values: function() { return /* binding */ __values; }\n/* harmony export */ });\n/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ var extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf || ({\n __proto__: []\n }) instanceof Array && function(d, b) {\n d.__proto__ = b;\n } || function(d, b) {\n for(var p in b)if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n };\n return extendStatics(d, b);\n};\nfunction __extends(d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() {\n this.constructor = d;\n }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\nvar __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for(var s, i = 1, n = arguments.length; i < n; i++){\n s = arguments[i];\n for(var p in s)if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nfunction __rest(s, e) {\n var t = {};\n for(var p in s)if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for(var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++){\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n}\nfunction __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction __param(paramIndex, decorator) {\n return function(target, key) {\n decorator(target, key, paramIndex);\n };\n}\nfunction __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) {\n if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\");\n return f;\n }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for(var i = decorators.length - 1; i >= 0; i--){\n var context = {};\n for(var p in contextIn)context[p] = p === \"access\" ? {} : contextIn[p];\n for(var p in contextIn.access)context.access[p] = contextIn.access[p];\n context.addInitializer = function(f) {\n if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\");\n extraInitializers.push(accept(f || null));\n };\n var result = (0, decorators[i])(kind === \"accessor\" ? {\n get: descriptor.get,\n set: descriptor.set\n } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n } else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n}\n;\nfunction __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for(var i = 0; i < initializers.length; i++){\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n}\n;\nfunction __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n}\n;\nfunction __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", {\n configurable: true,\n value: prefix ? \"\".concat(prefix, \" \", name) : name\n });\n}\n;\nfunction __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function(resolve) {\n resolve(value);\n });\n }\n return new (P || (P = Promise))(function(resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\nfunction __generator(thisArg, body) {\n var _ = {\n label: 0,\n sent: function() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n return this;\n }), g;\n function verb(n) {\n return function(v) {\n return step([\n n,\n v\n ]);\n };\n }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while(g && (g = 0, op[0] && (_ = 0)), _)try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [\n op[0] & 2,\n t.value\n ];\n switch(op[0]){\n case 0:\n case 1:\n t = op;\n break;\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n case 5:\n _.label++;\n y = op[1];\n op = [\n 0\n ];\n continue;\n case 7:\n op = _.ops.pop();\n _.trys.pop();\n continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n if (t && _.label < t[2]) {\n _.label = t[2];\n _.ops.push(op);\n break;\n }\n if (t[2]) _.ops.pop();\n _.trys.pop();\n continue;\n }\n op = body.call(thisArg, _);\n } catch (e) {\n op = [\n 6,\n e\n ];\n y = 0;\n } finally{\n f = t = 0;\n }\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\nvar __createBinding = Object.create ? function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = {\n enumerable: true,\n get: function() {\n return m[k];\n }\n };\n }\n Object.defineProperty(o, k2, desc);\n} : function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n};\nfunction __exportStar(m, o) {\n for(var p in m)if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\nfunction __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function() {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while((n === void 0 || n-- > 0) && !(r = i.next()).done)ar.push(r.value);\n } catch (error) {\n e = {\n error: error\n };\n } finally{\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n } finally{\n if (e) throw e.error;\n }\n }\n return ar;\n}\n/** @deprecated */ function __spread() {\n for(var ar = [], i = 0; i < arguments.length; i++)ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n/** @deprecated */ function __spreadArrays() {\n for(var s = 0, i = 0, il = arguments.length; i < il; i++)s += arguments[i].length;\n for(var r = Array(s), k = 0, i = 0; i < il; i++)for(var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)r[k] = a[j];\n return r;\n}\nfunction __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for(var i = 0, l = from.length, ar; i < l; i++){\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\nfunction __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function() {\n return this;\n }, i;\n function awaitReturn(f) {\n return function(v) {\n return Promise.resolve(v).then(f, reject);\n };\n }\n function verb(n, f) {\n if (g[n]) {\n i[n] = function(v) {\n return new Promise(function(a, b) {\n q.push([\n n,\n v,\n a,\n b\n ]) > 1 || resume(n, v);\n });\n };\n if (f) i[n] = f(i[n]);\n }\n }\n function resume(n, v) {\n try {\n step(g[n](v));\n } catch (e) {\n settle(q[0][3], e);\n }\n }\n function step(r) {\n r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n }\n function fulfill(value) {\n resume(\"next\", value);\n }\n function reject(value) {\n resume(\"throw\", value);\n }\n function settle(f, v) {\n if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n }\n}\nfunction __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function(e) {\n throw e;\n }), verb(\"return\"), i[Symbol.iterator] = function() {\n return this;\n }, i;\n function verb(n, f) {\n i[n] = o[n] ? function(v) {\n return (p = !p) ? {\n value: __await(o[n](v)),\n done: false\n } : f ? f(v) : v;\n } : f;\n }\n}\nfunction __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function() {\n return this;\n }, i);\n function verb(n) {\n i[n] = o[n] && function(v) {\n return new Promise(function(resolve, reject) {\n v = o[n](v), settle(resolve, reject, v.done, v.value);\n });\n };\n }\n function settle(resolve, reject, d, v) {\n Promise.resolve(v).then(function(v) {\n resolve({\n value: v,\n done: d\n });\n }, reject);\n }\n}\nfunction __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) {\n Object.defineProperty(cooked, \"raw\", {\n value: raw\n });\n } else {\n cooked.raw = raw;\n }\n return cooked;\n}\n;\nvar __setModuleDefault = Object.create ? function(o, v) {\n Object.defineProperty(o, \"default\", {\n enumerable: true,\n value: v\n });\n} : function(o, v) {\n o[\"default\"] = v;\n};\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function(o) {\n var ar = [];\n for(var k in o)if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\nfunction __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) {\n for(var k = ownKeys(mod), i = 0; i < k.length; i++)if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n }\n __setModuleDefault(result, mod);\n return result;\n}\nfunction __importDefault(mod) {\n return mod && mod.__esModule ? mod : {\n default: mod\n };\n}\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;\n}\nfunction __classPrivateFieldIn(state, receiver) {\n if (receiver === null || typeof receiver !== \"object\" && typeof receiver !== \"function\") throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\nfunction __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() {\n try {\n inner.call(this);\n } catch (e) {\n return Promise.reject(e);\n }\n };\n env.stack.push({\n value: value,\n dispose: dispose,\n async: async\n });\n } else if (async) {\n env.stack.push({\n async: true\n });\n }\n return value;\n}\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function(error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\nfunction __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while(r = env.stack.pop()){\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {\n fail(e);\n return next();\n });\n } else s |= 1;\n } catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\nfunction __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function(m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : d + ext + \".\" + cm.toLowerCase() + \"js\";\n });\n }\n return path;\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7OEVBYThFLEdBQzlFLDhEQUE4RCxHQUU5RCxJQUFJQSxnQkFBZ0IsU0FBU0MsQ0FBQyxFQUFFQyxDQUFDO0lBQy9CRixnQkFBZ0JHLE9BQU9DLGNBQWMsSUFDaEM7UUFBRUMsV0FBVyxFQUFFO0lBQUMsY0FBYUMsU0FBUyxTQUFVTCxDQUFDLEVBQUVDLENBQUM7UUFBSUQsRUFBRUksU0FBUyxHQUFHSDtJQUFHLEtBQzFFLFNBQVVELENBQUMsRUFBRUMsQ0FBQztRQUFJLElBQUssSUFBSUssS0FBS0wsRUFBRyxJQUFJQyxPQUFPSyxTQUFTLENBQUNDLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDUixHQUFHSyxJQUFJTixDQUFDLENBQUNNLEVBQUUsR0FBR0wsQ0FBQyxDQUFDSyxFQUFFO0lBQUU7SUFDcEcsT0FBT1AsY0FBY0MsR0FBR0M7QUFDMUI7QUFFTyxTQUFTUyxVQUFVVixDQUFDLEVBQUVDLENBQUM7SUFDNUIsSUFBSSxPQUFPQSxNQUFNLGNBQWNBLE1BQU0sTUFDakMsTUFBTSxJQUFJVSxVQUFVLHlCQUF5QkMsT0FBT1gsS0FBSztJQUM3REYsY0FBY0MsR0FBR0M7SUFDakIsU0FBU1k7UUFBTyxJQUFJLENBQUNDLFdBQVcsR0FBR2Q7SUFBRztJQUN0Q0EsRUFBRU8sU0FBUyxHQUFHTixNQUFNLE9BQU9DLE9BQU9hLE1BQU0sQ0FBQ2QsS0FBTVksQ0FBQUEsR0FBR04sU0FBUyxHQUFHTixFQUFFTSxTQUFTLEVBQUUsSUFBSU0sSUFBRztBQUNwRjtBQUVPLElBQUlHLFdBQVc7SUFDcEJBLFdBQVdkLE9BQU9lLE1BQU0sSUFBSSxTQUFTRCxTQUFTRSxDQUFDO1FBQzNDLElBQUssSUFBSUMsR0FBR0MsSUFBSSxHQUFHQyxJQUFJQyxVQUFVQyxNQUFNLEVB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T0YsTUFBTUgsY0FBYyxTQUFTLFFBQVFwTCxLQUFNLEVBQUN3TCxPQUFPLENBQUNDLEVBQUMsSUFBSzFFLElBQUsvRyxJQUFJd0wsTUFBTSxNQUFNQyxHQUFHQyxXQUFXLEtBQUs7UUFDN0c7SUFDSjtJQUNBLE9BQU9QO0FBQ1Q7QUFFQSwrREFBZTtJQUNieks7SUFDQU07SUFDQVM7SUFDQUs7SUFDQVc7SUFDQUc7SUFDQXNCO0lBQ0FJO0lBQ0FHO0lBQ0FJO0lBQ0FJO0lBQ0FhO0lBQ0FlO0lBQ0FTO0lBQ0FDO0lBQ0FDO0lBQ0FHO0lBQ0FDO0lBQ0FLO0lBQ0FNO0lBQ0FDO0lBQ0FTO0lBQ0FDO0lBQ0FDO0lBQ0FNO0lBQ0FFO0lBQ0FFO0lBQ0FJO0lBQ0FDO0lBQ0FDO0lBQ0FZO0lBQ0FHO0FBQ0YsQ0FBQyxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzPzY3ZmUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQ7XG4gIH1cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgIH1cbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICB9XG4gIH1cbiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICBkb25lID0gdHJ1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICB9XG4gIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xuICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICB2YXIgYXIgPSBbXTtcbiAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xuICAgIHJldHVybiBhcjtcbiAgfTtcbiAgcmV0dXJuIG93bktleXMobyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xuICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcbiAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xuICAgICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgX19leHRlbmRzLFxuICBfX2Fzc2lnbixcbiAgX19yZXN0LFxuICBfX2RlY29yYXRlLFxuICBfX3BhcmFtLFxuICBfX2VzRGVjb3JhdGUsXG4gIF9fcnVuSW5pdGlhbGl6ZXJzLFxuICBfX3Byb3BLZXksXG4gIF9fc2V0RnVuY3Rpb25OYW1lLFxuICBfX21ldGFkYXRhLFxuICBfX2F3YWl0ZXIsXG4gIF9fZ2VuZXJhdG9yLFxuICBfX2NyZWF0ZUJpbmRpbmcsXG4gIF9fZXhwb3J0U3RhcixcbiAgX192YWx1ZXMsXG4gIF9fcmVhZCxcbiAgX19zcHJlYWQsXG4gIF9fc3ByZWFkQXJyYXlzLFxuICBfX3NwcmVhZEFycmF5LFxuICBfX2F3YWl0LFxuICBfX2FzeW5jR2VuZXJhdG9yLFxuICBfX2FzeW5jRGVsZWdhdG9yLFxuICBfX2FzeW5jVmFsdWVzLFxuICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcbiAgX19pbXBvcnRTdGFyLFxuICBfX2ltcG9ydERlZmF1bHQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRJbixcbiAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXG4gIF9fZGlzcG9zZVJlc291cmNlcyxcbiAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXG59O1xuIl0sIm5hbWVzIjpbImV4dGVuZFN0YXRpY3MiLCJkIiwiYiIsIk9iamVjdCIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiQXJyYXkiLCJwIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiX19leHRlbmRzIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiX18iLCJjb25zdHJ1Y3RvciIsImNyZWF0ZSIsIl9fYXNzaWduIiwiYXNzaWduIiwidCIsInMiLCJpIiwibiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFwcGx5IiwiX19yZXN0IiwiZSIsImluZGV4T2YiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIl9fZGVjb3JhdGUiLCJkZWNvcmF0b3JzIiwidGFyZ2V0Iiwia2V5IiwiZGVzYyIsImMiLCJyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiUmVmbGVjdCIsImRlY29yYXRlIiwiZGVmaW5lUHJvcGVydHkiLCJfX3BhcmFtIiwicGFyYW1JbmRleCIsImRlY29yYXRvciIsIl9fZXNEZWNvcmF0ZSIsImN0b3IiLCJkZXNjcmlwdG9ySW4iLCJjb250ZXh0SW4iLCJpbml0aWFsaXplcnMiLCJleHRyYUluaXRpYWxpemVycyIsImFjY2VwdCIsImYiLCJraW5kIiwiZGVzY3JpcHRvciIsIm5hbWUiLCJfIiwiZG9uZSIsImNvbnRleHQiLCJhY2Nlc3MiLCJhZGRJbml0aWFsaXplciIsInB1c2giLCJyZXN1bHQiLCJnZXQiLCJzZXQiLCJpbml0IiwidW5zaGlmdCIsIl9fcnVuSW5pdGlhbGl6ZXJzIiwidGhpc0FyZyIsInZhbHVlIiwidXNlVmFsdWUiLCJfX3Byb3BLZXkiLCJ4IiwiY29uY2F0IiwiX19zZXRGdW5jdGlvbk5hbWUiLCJwcmVmaXgiLCJkZXNjcmlwdGlvbiIsImNvbmZpZ3VyYWJsZSIsIl9fbWV0YWRhdGEiLCJtZXRhZGF0YUtleSIsIm1ldGFkYXRhVmFsdWUiLCJtZXRhZGF0YSIsIl9fYXdhaXRlciIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiYWRvcHQiLCJyZXNvbHZlIiwiUHJvbWlzZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInN0ZXAiLCJuZXh0IiwicmVqZWN0ZWQiLCJ0aGVuIiwiX19nZW5lcmF0b3IiLCJib2R5IiwibGFiZWwiLCJzZW50IiwidHJ5cyIsIm9wcyIsInkiLCJnIiwiSXRlcmF0b3IiLCJ2ZXJiIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJ2Iiwib3AiLCJwb3AiLCJfX2NyZWF0ZUJpbmRpbmciLCJvIiwibSIsImsiLCJrMiIsInVuZGVmaW5lZCIsIl9fZXNNb2R1bGUiLCJ3cml0YWJsZSIsImVudW1lcmFibGUiLCJfX2V4cG9ydFN0YXIiLCJfX3ZhbHVlcyIsIl9fcmVhZCIsImFyIiwiZXJyb3IiLCJfX3NwcmVhZCIsIl9fc3ByZWFkQXJyYXlzIiwiaWwiLCJhIiwiaiIsImpsIiwiX19zcHJlYWRBcnJheSIsInRvIiwiZnJvbSIsInBhY2siLCJsIiwic2xpY2UiLCJfX2F3YWl0IiwiX19hc3luY0dlbmVyYXRvciIsImFzeW5jSXRlcmF0b3IiLCJxIiwiQXN5bmNJdGVyYXRvciIsImF3YWl0UmV0dXJuIiwicmVzdW1lIiwic2V0dGxlIiwiZnVsZmlsbCIsInNoaWZ0IiwiX19hc3luY0RlbGVnYXRvciIsIl9fYXN5bmNWYWx1ZXMiLCJfX21ha2VUZW1wbGF0ZU9iamVjdCIsImNvb2tlZCIsInJhdyIsIl9fc2V0TW9kdWxlRGVmYXVsdCIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiX19pbXBvcnRTdGFyIiwibW9kIiwiX19pbXBvcnREZWZhdWx0IiwiZGVmYXVsdCIsIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiLCJyZWNlaXZlciIsInN0YXRlIiwiaGFzIiwiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsIl9fY2xhc3NQcml2YXRlRmllbGRJbiIsIl9fYWRkRGlzcG9zYWJsZVJlc291cmNlIiwiZW52IiwiYXN5bmMiLCJkaXNwb3NlIiwiaW5uZXIiLCJhc3luY0Rpc3Bvc2UiLCJzdGFjayIsIl9TdXBwcmVzc2VkRXJyb3IiLCJTdXBwcmVzc2VkRXJyb3IiLCJzdXBwcmVzc2VkIiwibWVzc2FnZSIsIkVycm9yIiwiX19kaXNwb3NlUmVzb3VyY2VzIiwiZmFpbCIsImhhc0Vycm9yIiwiX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24iLCJwYXRoIiwicHJlc2VydmVKc3giLCJ0ZXN0IiwicmVwbGFjZSIsInRzeCIsImV4dCIsImNtIiwidG9Mb3dlckNhc2UiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/tslib/tslib.es6.mjs\n"));
/***/ })
});