1135 lines
5.2 MiB
1135 lines
5.2 MiB
"use strict";
|
||
/*
|
||
* ATTENTION: An "eval-source-map" devtool has been used.
|
||
* This devtool is neither made for production nor for readable output files.
|
||
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
||
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
||
* or disable the default devtool with "devtool: false".
|
||
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
||
*/
|
||
exports.id = "vendor-chunks/@supabase";
|
||
exports.ids = ["vendor-chunks/@supabase"];
|
||
exports.modules = {
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-helpers-nextjs/dist/index.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-helpers-nextjs/dist/index.js ***!
|
||
\******************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all)=>{\n for(var name in all)__defProp(target, name, {\n get: all[name],\n enumerable: true\n });\n};\nvar __copyProps = (to, from, except, desc)=>{\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n get: ()=>from[key],\n enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n });\n }\n return to;\n};\nvar __toCommonJS = (mod)=>__copyProps(__defProp({}, \"__esModule\", {\n value: true\n }), mod);\n// src/index.ts\nvar src_exports = {};\n__export(src_exports, {\n createBrowserSupabaseClient: ()=>createBrowserSupabaseClient,\n createClientComponentClient: ()=>createClientComponentClient,\n createMiddlewareClient: ()=>createMiddlewareClient,\n createMiddlewareSupabaseClient: ()=>createMiddlewareSupabaseClient,\n createPagesBrowserClient: ()=>createPagesBrowserClient,\n createPagesServerClient: ()=>createPagesServerClient,\n createRouteHandlerClient: ()=>createRouteHandlerClient,\n createServerActionClient: ()=>createServerActionClient,\n createServerComponentClient: ()=>createServerComponentClient,\n createServerSupabaseClient: ()=>createServerSupabaseClient\n});\nmodule.exports = __toCommonJS(src_exports);\n// src/clientComponentClient.ts\nvar import_auth_helpers_shared = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(ssr)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar supabase;\nfunction createClientComponentClient({ supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions, isSingleton = true } = {}) {\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n const createNewClient = ()=>{\n var _a;\n return (0, import_auth_helpers_shared.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new import_auth_helpers_shared.BrowserCookieAuthStorageAdapter(cookieOptions)\n }\n });\n };\n if (isSingleton) {\n const _supabase = supabase ?? createNewClient();\n if (true) return _supabase;\n if (!supabase) supabase = _supabase;\n return supabase;\n }\n return createNewClient();\n}\n// src/pagesBrowserClient.ts\nvar createPagesBrowserClient = createClientComponentClient;\n// src/pagesServerClient.ts\nvar import_auth_helpers_shared2 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(ssr)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar import_set_cookie_parser = __webpack_require__(/*! set-cookie-parser */ \"(ssr)/./node_modules/set-cookie-parser/lib/set-cookie.js\");\nvar NextServerAuthStorageAdapter = class extends import_auth_helpers_shared2.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n }\n getCookie(name) {\n var _a, _b, _c;\n const setCookie = (0, import_set_cookie_parser.splitCookiesString)(((_b = (_a = this.context.res) == null ? void 0 : _a.getHeader(\"set-cookie\")) == null ? void 0 : _b.toString()) ?? \"\").map((c)=>(0, import_auth_helpers_shared2.parseCookies)(c)[name]).find((c)=>!!c);\n const value = setCookie ?? ((_c = this.context.req) == null ? void 0 : _c.cookies[name]);\n return value;\n }\n setCookie(name, value) {\n this._setCookie(name, value);\n }\n deleteCookie(name) {\n this._setCookie(name, \"\", {\n maxAge: 0\n });\n }\n _setCookie(name, value, options) {\n var _a;\n const setCookies = (0, import_set_cookie_parser.splitCookiesString)(((_a = this.context.res.getHeader(\"set-cookie\")) == null ? void 0 : _a.toString()) ?? \"\").filter((c)=>!(name in (0, import_auth_helpers_shared2.parseCookies)(c)));\n const cookieStr = (0, import_auth_helpers_shared2.serializeCookie)(name, value, {\n ...this.cookieOptions,\n ...options,\n // Allow supabase-js on the client to read the cookie as well\n httpOnly: false\n });\n this.context.res.setHeader(\"set-cookie\", [\n ...setCookies,\n cookieStr\n ]);\n }\n};\nfunction createPagesServerClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared2.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextServerAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/middlewareClient.ts\nvar import_auth_helpers_shared3 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(ssr)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar import_set_cookie_parser2 = __webpack_require__(/*! set-cookie-parser */ \"(ssr)/./node_modules/set-cookie-parser/lib/set-cookie.js\");\nvar NextMiddlewareAuthStorageAdapter = class extends import_auth_helpers_shared3.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n }\n getCookie(name) {\n var _a;\n const setCookie = (0, import_set_cookie_parser2.splitCookiesString)(((_a = this.context.res.headers.get(\"set-cookie\")) == null ? void 0 : _a.toString()) ?? \"\").map((c)=>(0, import_auth_helpers_shared3.parseCookies)(c)[name]).find((c)=>!!c);\n if (setCookie) {\n return setCookie;\n }\n const cookies = (0, import_auth_helpers_shared3.parseCookies)(this.context.req.headers.get(\"cookie\") ?? \"\");\n return cookies[name];\n }\n setCookie(name, value) {\n this._setCookie(name, value);\n }\n deleteCookie(name) {\n this._setCookie(name, \"\", {\n maxAge: 0\n });\n }\n _setCookie(name, value, options) {\n const newSessionStr = (0, import_auth_helpers_shared3.serializeCookie)(name, value, {\n ...this.cookieOptions,\n ...options,\n // Allow supabase-js on the client to read the cookie as well\n httpOnly: false\n });\n if (this.context.res.headers) {\n this.context.res.headers.append(\"set-cookie\", newSessionStr);\n }\n }\n};\nfunction createMiddlewareClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared3.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextMiddlewareAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/serverComponentClient.ts\nvar import_auth_helpers_shared4 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(ssr)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar NextServerComponentAuthStorageAdapter = class extends import_auth_helpers_shared4.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n this.isServer = true;\n }\n getCookie(name) {\n var _a;\n const nextCookies = this.context.cookies();\n return (_a = nextCookies.get(name)) == null ? void 0 : _a.value;\n }\n setCookie(name, value) {}\n deleteCookie(name) {}\n};\nfunction createServerComponentClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared4.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextServerComponentAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/routeHandlerClient.ts\nvar import_auth_helpers_shared5 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(ssr)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar NextRouteHandlerAuthStorageAdapter = class extends import_auth_helpers_shared5.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n }\n getCookie(name) {\n var _a;\n const nextCookies = this.context.cookies();\n return (_a = nextCookies.get(name)) == null ? void 0 : _a.value;\n }\n setCookie(name, value) {\n const nextCookies = this.context.cookies();\n nextCookies.set(name, value, this.cookieOptions);\n }\n deleteCookie(name) {\n const nextCookies = this.context.cookies();\n nextCookies.set(name, \"\", {\n ...this.cookieOptions,\n maxAge: 0\n });\n }\n};\nfunction createRouteHandlerClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared5.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextRouteHandlerAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/serverActionClient.ts\nvar createServerActionClient = createRouteHandlerClient;\n// src/deprecated.ts\nfunction createBrowserSupabaseClient({ supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n console.warn(\"Please utilize the `createPagesBrowserClient` function instead of the deprecated `createBrowserSupabaseClient` function. Learn more: https://supabase.com/docs/guides/auth/auth-helpers/nextjs-pages\");\n return createPagesBrowserClient({\n supabaseUrl,\n supabaseKey,\n options,\n cookieOptions\n });\n}\nfunction createServerSupabaseClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n console.warn(\"Please utilize the `createPagesServerClient` function instead of the deprecated `createServerSupabaseClient` function. Learn more: https://supabase.com/docs/guides/auth/auth-helpers/nextjs-pages\");\n return createPagesServerClient(context, {\n supabaseUrl,\n supabaseKey,\n options,\n cookieOptions\n });\n}\nfunction createMiddlewareSupabaseClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n console.warn(\"Please utilize the `createMiddlewareClient` function instead of the deprecated `createMiddlewareSupabaseClient` function. Learn more: https://supabase.com/docs/guides/auth/auth-helpers/nextjs#middleware\");\n return createMiddlewareClient(context, {\n supabaseUrl,\n supabaseKey,\n options,\n cookieOptions\n });\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (0); //# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtaGVscGVycy1uZXh0anMvZGlzdC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLElBQUlBLFlBQVlDLE9BQU9DLGNBQWM7QUFDckMsSUFBSUMsbUJBQW1CRixPQUFPRyx3QkFBd0I7QUFDdEQsSUFBSUMsb0JBQW9CSixPQUFPSyxtQkFBbUI7QUFDbEQsSUFBSUMsZUFBZU4sT0FBT08sU0FBUyxDQUFDQyxjQUFjO0FBQ2xELElBQUlDLFdBQVcsQ0FBQ0MsUUFBUUM7SUFDdEIsSUFBSyxJQUFJQyxRQUFRRCxJQUNmWixVQUFVVyxRQUFRRSxNQUFNO1FBQUVDLEtBQUtGLEdBQUcsQ0FBQ0MsS0FBSztRQUFFRSxZQUFZO0lBQUs7QUFDL0Q7QUFDQSxJQUFJQyxjQUFjLENBQUNDLElBQUlDLE1BQU1DLFFBQVFDO0lBQ25DLElBQUlGLFFBQVEsT0FBT0EsU0FBUyxZQUFZLE9BQU9BLFNBQVMsWUFBWTtRQUNsRSxLQUFLLElBQUlHLE9BQU9oQixrQkFBa0JhLE1BQ2hDLElBQUksQ0FBQ1gsYUFBYWUsSUFBSSxDQUFDTCxJQUFJSSxRQUFRQSxRQUFRRixRQUN6Q25CLFVBQVVpQixJQUFJSSxLQUFLO1lBQUVQLEtBQUssSUFBTUksSUFBSSxDQUFDRyxJQUFJO1lBQUVOLFlBQVksQ0FBRUssQ0FBQUEsT0FBT2pCLGlCQUFpQmUsTUFBTUcsSUFBRyxLQUFNRCxLQUFLTCxVQUFVO1FBQUM7SUFDdEg7SUFDQSxPQUFPRTtBQUNUO0FBQ0EsSUFBSU0sZUFBZSxDQUFDQyxNQUFRUixZQUFZaEIsVUFBVSxDQUFDLEdBQUcsY0FBYztRQUFFeUIsT0FBTztJQUFLLElBQUlEO0FBRXRGLGVBQWU7QUFDZixJQUFJRSxjQUFjLENBQUM7QUFDbkJoQixTQUFTZ0IsYUFBYTtJQUNwQkMsNkJBQTZCLElBQU1BO0lBQ25DQyw2QkFBNkIsSUFBTUE7SUFDbkNDLHdCQUF3QixJQUFNQTtJQUM5QkMsZ0NBQWdDLElBQU1BO0lB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QStCb0MsT0FBTyxFQUFFLEVBQy9DeEIsY0FBY0MsMEJBQW9DLEVBQ2xERyxjQUFjSCwyS0FBeUMsRUFDdkRLLE9BQU8sRUFDUEMsYUFBYSxFQUNkLEdBQUcsQ0FBQyxDQUFDO0lBQ0pxRCxRQUFRQyxJQUFJLENBQ1Y7SUFFRixPQUFPMUUsdUJBQXVCcUMsU0FBUztRQUNyQ3hCO1FBQ0FJO1FBQ0FFO1FBQ0FDO0lBQ0Y7QUFDRjtBQUNBLDZEQUE2RDtBQUM3RCxLQUFNWixDQUFBQSxDQVdOLEdBQ0EsaUNBQWlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWhlbHBlcnMtbmV4dGpzL2Rpc3QvaW5kZXguanM/Y2Y5MyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG4gIGZvciAodmFyIG5hbWUgaW4gYWxsKVxuICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsgZ2V0OiBhbGxbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9Db21tb25KUyA9IChtb2QpID0+IF9fY29weVByb3BzKF9fZGVmUHJvcCh7fSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7XG5cbi8vIHNyYy9pbmRleC50c1xudmFyIHNyY19leHBvcnRzID0ge307XG5fX2V4cG9ydChzcmNfZXhwb3J0cywge1xuICBjcmVhdGVCcm93c2VyU3VwYWJhc2VDbGllbnQ6ICgpID0+IGNyZWF0ZUJyb3dzZXJTdXBhYmFzZUNsaWVudCxcbiAgY3JlYXRlQ2xpZW50Q29tcG9uZW50Q2xpZW50OiAoKSA9PiBjcmVhdGVDbGllbnRDb21wb25lbnRDbGllbnQsXG4gIGNyZWF0ZU1pZGRsZXdhcmVDbGllbnQ6ICgpID0+IGNyZWF0ZU1pZGRsZXdhcmVDbGllbnQsXG4gIGNyZWF0ZU1pZGRsZXdhcmVTdXBhYmFzZUNsaWVudDogKCkgPT4gY3JlYXRlTWlkZGxld2FyZVN1cGFiYXNlQ2xpZW50LFxuICBjcmVhdGVQYWdlc0Jyb3dzZXJDbGllbnQ6ICgpID0+IGNyZWF0ZVBhZ2VzQnJvd3NlckNsaWVudCxcbiAgY3JlYXRlUGFnZXNTZXJ2ZXJDbGllbnQ6ICgpID0+IGNyZWF0ZVBhZ2VzU2VydmVyQ2xpZW50LFxuICBjcmVhdGVSb3V0ZUhhbmRsZXJDbGllbnQ6ICgpID0+IGNyZWF0ZVJvdXRlSGFuZGxlckNsaWVudCxcbiAgY3JlYXRlU2VydmVyQWN0aW9uQ2xpZW50OiAoKSA9PiBjcmVhdGVTZXJ2ZXJBY3Rpb25DbGllbnQsXG4gIGNyZWF0ZVNlcnZlckNvbXBvbmVudENsaWVudDogKCkgPT4gY3JlYXRlU2VydmVyQ29tcG9uZW50Q2xpZW50LFxuICBjcmVhdGVTZXJ2ZXJTdXBhYmFzZUNsaWVudDogKCkgPT4gY3JlYXRlU2VydmVyU3VwYWJhc2VDbGllbnRcbn0pO1xubW9kdWxlLmV4cG9ydHMgPSBfX3RvQ29tbW9uSlMoc3JjX2V4cG9ydHMpO1xuXG4vLyBzcmMvY2xpZW50Q29tcG9uZW50Q2xpZW50LnRzXG52YXIgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQgPSByZXF1aXJlKFwiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1zaGFyZWRcIik7XG52YXIgc3VwYWJhc2U7XG5mdW5jdGlvbiBjcmVhdGVDbGllbnRDb21wb25lbnRDbGllbnQoe1xuICBzdXBhYmFzZVVybCA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCxcbiAgc3VwYWJhc2VLZXkgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSxcbiAgb3B0aW9ucyxcbiAgY29va2llT3B0aW9ucyxcbiAgaXNTaW5nbGV0b24gPSB0cnVlXG59ID0ge30pIHtcbiAgaWYgKCFzdXBhYmFzZVVybCB8fCAhc3VwYWJhc2VLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImVpdGhlciBORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwgYW5kIE5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZIGVudiB2YXJpYWJsZXMgb3Igc3VwYWJhc2VVcmwgYW5kIHN1cGFiYXNlS2V5IGFyZSByZXF1aXJlZCFcIlxuICAgICk7XG4gIH1cbiAgY29uc3QgY3JlYXRlTmV3Q2xpZW50ID0gKCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkLmNyZWF0ZVN1cGFiYXNlQ2xpZW50KShzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXksIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBnbG9iYWw6IHtcbiAgICAgICAgLi4ub3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5nbG9iYWwsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4oX2EgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdsb2JhbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmhlYWRlcnMsXG4gICAgICAgICAgXCJYLUNsaWVudC1JbmZvXCI6IGAke1wiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1uZXh0anNcIn1AJHtcIjAuMTAuMFwifWBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGF1dGg6IHtcbiAgICAgICAgc3RvcmFnZTogbmV3IGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkLkJyb3dzZXJDb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIoY29va2llT3B0aW9ucylcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgaWYgKGlzU2luZ2xldG9uKSB7XG4gICAgY29uc3QgX3N1cGFiYXNlID0gc3VwYWJhc2UgPz8gY3JlYXRlTmV3Q2xpZW50KCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gX3N1cGFiYXNlO1xuICAgIGlmICghc3VwYWJhc2UpXG4gICAgICBzdXBhYmFzZSA9IF9zdXBhYmFzZTtcbiAgICByZXR1cm4gc3VwYWJhc2U7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZU5ld0NsaWVudCgpO1xufVxuXG4vLyBzcmMvcGFnZXNCcm93c2VyQ2xpZW50LnRzXG52YXIgY3JlYXRlUGFnZXNCcm93c2VyQ2xpZW50ID0gY3JlYXRlQ2xpZW50Q29tcG9uZW50Q2xpZW50O1xuXG4vLyBzcmMvcGFnZXNTZXJ2ZXJDbGllbnQudHNcbnZhciBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDIgPSByZXF1aXJlKFwiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1zaGFyZWRcIik7XG52YXIgaW1wb3J0X3NldF9jb29raWVfcGFyc2VyID0gcmVxdWlyZShcInNldC1jb29raWUtcGFyc2VyXCIpO1xudmFyIE5leHRTZXJ2ZXJBdXRoU3RvcmFnZUFkYXB0ZXIgPSBjbGFzcyBleHRlbmRzIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMi5Db29raWVBdXRoU3RvcmFnZUFkYXB0ZXIge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBjb29raWVPcHRpb25zKSB7XG4gICAgc3VwZXIoY29va2llT3B0aW9ucyk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuICBnZXRDb29raWUobmFtZSkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIGNvbnN0IHNldENvb2tpZSA9ICgwLCBpbXBvcnRfc2V0X2Nvb2tpZV9wYXJzZXIuc3BsaXRDb29raWVzU3RyaW5nKShcbiAgICAgICgoX2IgPSAoX2EgPSB0aGlzLmNvbnRleHQucmVzKSA9PSBudWxsID8gdm9pZCAwIDogX2EuZ2V0SGVhZGVyKFwic2V0LWNvb2tpZVwiKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLnRvU3RyaW5nKCkpID8/IFwiXCJcbiAgICApLm1hcCgoYykgPT4gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMi5wYXJzZUNvb2tpZXMpKGMpW25hbWVdKS5maW5kKChjKSA9PiAhIWMpO1xuICAgIGNvbnN0IHZhbHVlID0gc2V0Q29va2llID8/ICgoX2MgPSB0aGlzLmNvbnRleHQucmVxKSA9PSBudWxsID8gdm9pZCAwIDogX2MuY29va2llc1tuYW1lXSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHNldENvb2tpZShuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuX3NldENvb2tpZShuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgZGVsZXRlQ29va2llKG5hbWUpIHtcbiAgICB0aGlzLl9zZXRDb29raWUobmFtZSwgXCJcIiwge1xuICAgICAgbWF4QWdlOiAwXG4gICAgfSk7XG4gIH1cbiAgX3NldENvb2tpZShuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBzZXRDb29raWVzID0gKDAsIGltcG9ydF9zZXRfY29va2llX3BhcnNlci5zcGxpdENvb2tpZXNTdHJpbmcpKFxuICAgICAgKChfYSA9IHRoaXMuY29udGV4dC5yZXMuZ2V0SGVhZGVyKFwic2V0LWNvb2tpZVwiKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkpID8/IFwiXCJcbiAgICApLmZpbHRlcigoYykgPT4gIShuYW1lIGluICgwLCBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDIucGFyc2VDb29raWVzKShjKSkpO1xuICAgIGNvbnN0IGNvb2tpZVN0ciA9ICgwLCBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDIuc2VyaWFsaXplQ29va2llKShuYW1lLCB2YWx1ZSwge1xuICAgICAgLi4udGhpcy5jb29raWVPcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC8vIEFsbG93IHN1cGFiYXNlLWpzIG9uIHRoZSBjbGllbnQgdG8gcmVhZCB0aGUgY29va2llIGFzIHdlbGxcbiAgICAgIGh0dHBPbmx5OiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuY29udGV4dC5yZXMuc2V0SGVhZGVyKFwic2V0LWNvb2tpZVwiLCBbLi4uc2V0Q29va2llcywgY29va2llU3RyXSk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVQYWdlc1NlcnZlckNsaWVudChjb250ZXh0LCB7XG4gIHN1cGFiYXNlVXJsID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMLFxuICBzdXBhYmFzZUtleSA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZLFxuICBvcHRpb25zLFxuICBjb29raWVPcHRpb25zXG59ID0ge30pIHtcbiAgdmFyIF9hO1xuICBpZiAoIXN1cGFiYXNlVXJsIHx8ICFzdXBhYmFzZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiZWl0aGVyIE5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCBhbmQgTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVkgZW52IHZhcmlhYmxlcyBvciBzdXBhYmFzZVVybCBhbmQgc3VwYWJhc2VLZXkgYXJlIHJlcXVpcmVkIVwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMi5jcmVhdGVTdXBhYmFzZUNsaWVudCkoc3VwYWJhc2VVcmwsIHN1cGFiYXNlS2V5LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBnbG9iYWw6IHtcbiAgICAgIC4uLm9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2xvYmFsLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAuLi4oX2EgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdsb2JhbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmhlYWRlcnMsXG4gICAgICAgIFwiWC1DbGllbnQtSW5mb1wiOiBgJHtcIkBzdXBhYmFzZS9hdXRoLWhlbHBlcnMtbmV4dGpzXCJ9QCR7XCIwLjEwLjBcIn1gXG4gICAgICB9XG4gICAgfSxcbiAgICBhdXRoOiB7XG4gICAgICBzdG9yYWdlOiBuZXcgTmV4dFNlcnZlckF1dGhTdG9yYWdlQWRhcHRlcihjb250ZXh0LCBjb29raWVPcHRpb25zKVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIHNyYy9taWRkbGV3YXJlQ2xpZW50LnRzXG52YXIgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQzID0gcmVxdWlyZShcIkBzdXBhYmFzZS9hdXRoLWhlbHBlcnMtc2hhcmVkXCIpO1xudmFyIGltcG9ydF9zZXRfY29va2llX3BhcnNlcjIgPSByZXF1aXJlKFwic2V0LWNvb2tpZS1wYXJzZXJcIik7XG52YXIgTmV4dE1pZGRsZXdhcmVBdXRoU3RvcmFnZUFkYXB0ZXIgPSBjbGFzcyBleHRlbmRzIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMy5Db29raWVBdXRoU3RvcmFnZUFkYXB0ZXIge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBjb29raWVPcHRpb25zKSB7XG4gICAgc3VwZXIoY29va2llT3B0aW9ucyk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuICBnZXRDb29raWUobmFtZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBzZXRDb29raWUgPSAoMCwgaW1wb3J0X3NldF9jb29raWVfcGFyc2VyMi5zcGxpdENvb2tpZXNTdHJpbmcpKFxuICAgICAgKChfYSA9IHRoaXMuY29udGV4dC5yZXMuaGVhZGVycy5nZXQoXCJzZXQtY29va2llXCIpKSA9PSBudWxsID8gdm9pZCAwIDogX2EudG9TdHJpbmcoKSkgPz8gXCJcIlxuICAgICkubWFwKChjKSA9PiAoMCwgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQzLnBhcnNlQ29va2llcykoYylbbmFtZV0pLmZpbmQoKGMpID0+ICEhYyk7XG4gICAgaWYgKHNldENvb2tpZSkge1xuICAgICAgcmV0dXJuIHNldENvb2tpZTtcbiAgICB9XG4gICAgY29uc3QgY29va2llcyA9ICgwLCBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDMucGFyc2VDb29raWVzKSh0aGlzLmNvbnRleHQucmVxLmhlYWRlcnMuZ2V0KFwiY29va2llXCIpID8/IFwiXCIpO1xuICAgIHJldHVybiBjb29raWVzW25hbWVdO1xuICB9XG4gIHNldENvb2tpZShuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuX3NldENvb2tpZShuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgZGVsZXRlQ29va2llKG5hbWUpIHtcbiAgICB0aGlzLl9zZXRDb29raWUobmFtZSwgXCJcIiwge1xuICAgICAgbWF4QWdlOiAwXG4gICAgfSk7XG4gIH1cbiAgX3NldENvb2tpZShuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IG5ld1Nlc3Npb25TdHIgPSAoMCwgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQzLnNlcmlhbGl6ZUNvb2tpZSkobmFtZSwgdmFsdWUsIHtcbiAgICAgIC4uLnRoaXMuY29va2llT3B0aW9ucyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAvLyBBbGxvdyBzdXBhYmFzZS1qcyBvbiB0aGUgY2xpZW50IHRvIHJlYWQgdGhlIGNvb2tpZSBhcyB3ZWxsXG4gICAgICBodHRwT25seTogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAodGhpcy5jb250ZXh0LnJlcy5oZWFkZXJzKSB7XG4gICAgICB0aGlzLmNvbnRleHQucmVzLmhlYWRlcnMuYXBwZW5kKFwic2V0LWNvb2tpZVwiLCBuZXdTZXNzaW9uU3RyKTtcbiAgICB9XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVNaWRkbGV3YXJlQ2xpZW50KGNvbnRleHQsIHtcbiAgc3VwYWJhc2VVcmwgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwsXG4gIHN1cGFiYXNlS2V5ID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVksXG4gIG9wdGlvbnMsXG4gIGNvb2tpZU9wdGlvbnNcbn0gPSB7fSkge1xuICB2YXIgX2E7XG4gIGlmICghc3VwYWJhc2VVcmwgfHwgIXN1cGFiYXNlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJlaXRoZXIgTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMIGFuZCBORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSBlbnYgdmFyaWFibGVzIG9yIHN1cGFiYXNlVXJsIGFuZCBzdXBhYmFzZUtleSBhcmUgcmVxdWlyZWQhXCJcbiAgICApO1xuICB9XG4gIHJldHVybiAoMCwgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQzLmNyZWF0ZVN1cGFiYXNlQ2xpZW50KShzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXksIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGdsb2JhbDoge1xuICAgICAgLi4ub3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5nbG9iYWwsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLihfYSA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2xvYmFsKSA9PSBudWxsID8gdm9pZCAwIDogX2EuaGVhZGVycyxcbiAgICAgICAgXCJYLUNsaWVudC1JbmZvXCI6IGAke1wiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1uZXh0anNcIn1AJHtcIjAuMTAuMFwifWBcbiAgICAgIH1cbiAgICB9LFxuICAgIGF1dGg6IHtcbiAgICAgIHN0b3JhZ2U6IG5ldyBOZXh0TWlkZGxld2FyZUF1dGhTdG9yYWdlQWRhcHRlcihjb250ZXh0LCBjb29raWVPcHRpb25zKVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIHNyYy9zZXJ2ZXJDb21wb25lbnRDbGllbnQudHNcbnZhciBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDQgPSByZXF1aXJlKFwiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1zaGFyZWRcIik7XG52YXIgTmV4dFNlcnZlckNvbXBvbmVudEF1dGhTdG9yYWdlQWRhcHRlciA9IGNsYXNzIGV4dGVuZHMgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQ0LkNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIGNvb2tpZU9wdGlvbnMpIHtcbiAgICBzdXBlcihjb29raWVPcHRpb25zKTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuaXNTZXJ2ZXIgPSB0cnVlO1xuICB9XG4gIGdldENvb2tpZShuYW1lKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG5leHRDb29raWVzID0gdGhpcy5jb250ZXh0LmNvb2tpZXMoKTtcbiAgICByZXR1cm4gKF9hID0gbmV4dENvb2tpZXMuZ2V0KG5hbWUpKSA9PSBudWxsID8gdm9pZCAwIDogX2EudmFsdWU7XG4gIH1cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlKSB7XG4gIH1cbiAgZGVsZXRlQ29va2llKG5hbWUpIHtcbiAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZVNlcnZlckNvbXBvbmVudENsaWVudChjb250ZXh0LCB7XG4gIHN1cGFiYXNlVXJsID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMLFxuICBzdXBhYmFzZUtleSA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZLFxuICBvcHRpb25zLFxuICBjb29raWVPcHRpb25zXG59ID0ge30pIHtcbiAgdmFyIF9hO1xuICBpZiAoIXN1cGFiYXNlVXJsIHx8ICFzdXBhYmFzZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiZWl0aGVyIE5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCBhbmQgTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVkgZW52IHZhcmlhYmxlcyBvciBzdXBhYmFzZVVybCBhbmQgc3VwYWJhc2VLZXkgYXJlIHJlcXVpcmVkIVwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkNC5jcmVhdGVTdXBhYmFzZUNsaWVudCkoc3VwYWJhc2VVcmwsIHN1cGFiYXNlS2V5LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBnbG9iYWw6IHtcbiAgICAgIC4uLm9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2xvYmFsLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAuLi4oX2EgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdsb2JhbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmhlYWRlcnMsXG4gICAgICAgIFwiWC1DbGllbnQtSW5mb1wiOiBgJHtcIkBzdXBhYmFzZS9hdXRoLWhlbHBlcnMtbmV4dGpzXCJ9QCR7XCIwLjEwLjBcIn1gXG4gICAgICB9XG4gICAgfSxcbiAgICBhdXRoOiB7XG4gICAgICBzdG9yYWdlOiBuZXcgTmV4dFNlcnZlckNvbXBvbmVudEF1dGhTdG9yYWdlQWRhcHRlcihjb250ZXh0LCBjb29raWVPcHRpb25zKVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIHNyYy9yb3V0ZUhhbmRsZXJDbGllbnQudHNcbnZhciBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDUgPSByZXF1aXJlKFwiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1zaGFyZWRcIik7XG52YXIgTmV4dFJvdXRlSGFuZGxlckF1dGhTdG9yYWdlQWRhcHRlciA9IGNsYXNzIGV4dGVuZHMgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQ1LkNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIGNvb2tpZU9wdGlvbnMpIHtcbiAgICBzdXBlcihjb29raWVPcHRpb25zKTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB9XG4gIGdldENvb2tpZShuYW1lKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG5leHRDb29raWVzID0gdGhpcy5jb250ZXh0LmNvb2tpZXMoKTtcbiAgICByZXR1cm4gKF9hID0gbmV4dENvb2tpZXMuZ2V0KG5hbWUpKSA9PSBudWxsID8gdm9pZCAwIDogX2EudmFsdWU7XG4gIH1cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3QgbmV4dENvb2tpZXMgPSB0aGlzLmNvbnRleHQuY29va2llcygpO1xuICAgIG5leHRDb29raWVzLnNldChuYW1lLCB2YWx1ZSwgdGhpcy5jb29raWVPcHRpb25zKTtcbiAgfVxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIGNvbnN0IG5leHRDb29raWVzID0gdGhpcy5jb250ZXh0LmNvb2tpZXMoKTtcbiAgICBuZXh0Q29va2llcy5zZXQobmFtZSwgXCJcIiwge1xuICAgICAgLi4udGhpcy5jb29raWVPcHRpb25zLFxuICAgICAgbWF4QWdlOiAwXG4gICAgfSk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVSb3V0ZUhhbmRsZXJDbGllbnQoY29udGV4dCwge1xuICBzdXBhYmFzZVVybCA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCxcbiAgc3VwYWJhc2VLZXkgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSxcbiAgb3B0aW9ucyxcbiAgY29va2llT3B0aW9uc1xufSA9IHt9KSB7XG4gIHZhciBfYTtcbiAgaWYgKCFzdXBhYmFzZVVybCB8fCAhc3VwYWJhc2VLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImVpdGhlciBORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwgYW5kIE5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZIGVudiB2YXJpYWJsZXMgb3Igc3VwYWJhc2VVcmwgYW5kIHN1cGFiYXNlS2V5IGFyZSByZXF1aXJlZCFcIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuICgwLCBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDUuY3JlYXRlU3VwYWJhc2VDbGllbnQpKHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZ2xvYmFsOiB7XG4gICAgICAuLi5vcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdsb2JhbCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uKF9hID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5nbG9iYWwpID09IG51bGwgPyB2b2lkIDAgOiBfYS5oZWFkZXJzLFxuICAgICAgICBcIlgtQ2xpZW50LUluZm9cIjogYCR7XCJAc3VwYWJhc2UvYXV0aC1oZWxwZXJzLW5leHRqc1wifUAke1wiMC4xMC4wXCJ9YFxuICAgICAgfVxuICAgIH0sXG4gICAgYXV0aDoge1xuICAgICAgc3RvcmFnZTogbmV3IE5leHRSb3V0ZUhhbmRsZXJBdXRoU3RvcmFnZUFkYXB0ZXIoY29udGV4dCwgY29va2llT3B0aW9ucylcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBzcmMvc2VydmVyQWN0aW9uQ2xpZW50LnRzXG52YXIgY3JlYXRlU2VydmVyQWN0aW9uQ2xpZW50ID0gY3JlYXRlUm91dGVIYW5kbGVyQ2xpZW50O1xuXG4vLyBzcmMvZGVwcmVjYXRlZC50c1xuZnVuY3Rpb24gY3JlYXRlQnJvd3NlclN1cGFiYXNlQ2xpZW50KHtcbiAgc3VwYWJhc2VVcmwgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwsXG4gIHN1cGFiYXNlS2V5ID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVksXG4gIG9wdGlvbnMsXG4gIGNvb2tpZU9wdGlvbnNcbn0gPSB7fSkge1xuICBjb25zb2xlLndhcm4oXG4gICAgXCJQbGVhc2UgdXRpbGl6ZSB0aGUgYGNyZWF0ZVBhZ2VzQnJvd3NlckNsaWVudGAgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgZGVwcmVjYXRlZCBgY3JlYXRlQnJvd3NlclN1cGFiYXNlQ2xpZW50YCBmdW5jdGlvbi4gTGVhcm4gbW9yZTogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9ndWlkZXMvYXV0aC9hdXRoLWhlbHBlcnMvbmV4dGpzLXBhZ2VzXCJcbiAgKTtcbiAgcmV0dXJuIGNyZWF0ZVBhZ2VzQnJvd3NlckNsaWVudCh7XG4gICAgc3VwYWJhc2VVcmwsXG4gICAgc3VwYWJhc2VLZXksXG4gICAgb3B0aW9ucyxcbiAgICBjb29raWVPcHRpb25zXG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlU2VydmVyU3VwYWJhc2VDbGllbnQoY29udGV4dCwge1xuICBzdXBhYmFzZVVybCA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCxcbiAgc3VwYWJhc2VLZXkgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSxcbiAgb3B0aW9ucyxcbiAgY29va2llT3B0aW9uc1xufSA9IHt9KSB7XG4gIGNvbnNvbGUud2FybihcbiAgICBcIlBsZWFzZSB1dGlsaXplIHRoZSBgY3JlYXRlUGFnZXNTZXJ2ZXJDbGllbnRgIGZ1bmN0aW9uIGluc3RlYWQgb2YgdGhlIGRlcHJlY2F0ZWQgYGNyZWF0ZVNlcnZlclN1cGFiYXNlQ2xpZW50YCBmdW5jdGlvbi4gTGVhcm4gbW9yZTogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9ndWlkZXMvYXV0aC9hdXRoLWhlbHBlcnMvbmV4dGpzLXBhZ2VzXCJcbiAgKTtcbiAgcmV0dXJuIGNyZWF0ZVBhZ2VzU2VydmVyQ2xpZW50KGNvbnRleHQsIHtcbiAgICBzdXBhYmFzZVVybCxcbiAgICBzdXBhYmFzZUtleSxcbiAgICBvcHRpb25zLFxuICAgIGNvb2tpZU9wdGlvbnNcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVNaWRkbGV3YXJlU3VwYWJhc2VDbGllbnQoY29udGV4dCwge1xuICBzdXBhYmFzZVVybCA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCxcbiAgc3VwYWJhc2VLZXkgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSxcbiAgb3B0aW9ucyxcbiAgY29va2llT3B0aW9uc1xufSA9IHt9KSB7XG4gIGNvbnNvbGUud2FybihcbiAgICBcIlBsZWFzZSB1dGlsaXplIHRoZSBgY3JlYXRlTWlkZGxld2FyZUNsaWVudGAgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgZGVwcmVjYXRlZCBgY3JlYXRlTWlkZGxld2FyZVN1cGFiYXNlQ2xpZW50YCBmdW5jdGlvbi4gTGVhcm4gbW9yZTogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9ndWlkZXMvYXV0aC9hdXRoLWhlbHBlcnMvbmV4dGpzI21pZGRsZXdhcmVcIlxuICApO1xuICByZXR1cm4gY3JlYXRlTWlkZGxld2FyZUNsaWVudChjb250ZXh0LCB7XG4gICAgc3VwYWJhc2VVcmwsXG4gICAgc3VwYWJhc2VLZXksXG4gICAgb3B0aW9ucyxcbiAgICBjb29raWVPcHRpb25zXG4gIH0pO1xufVxuLy8gQW5ub3RhdGUgdGhlIENvbW1vbkpTIGV4cG9ydCBuYW1lcyBmb3IgRVNNIGltcG9ydCBpbiBub2RlOlxuMCAmJiAobW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZUJyb3dzZXJTdXBhYmFzZUNsaWVudCxcbiAgY3JlYXRlQ2xpZW50Q29tcG9uZW50Q2xpZW50LFxuICBjcmVhdGVNaWRkbGV3YXJlQ2xpZW50LFxuICBjcmVhdGVNaWRkbGV3YXJlU3VwYWJhc2VDbGllbnQsXG4gIGNyZWF0ZVBhZ2VzQnJvd3NlckNsaWVudCxcbiAgY3JlYXRlUGFnZXNTZXJ2ZXJDbGllbnQsXG4gIGNyZWF0ZVJvdXRlSGFuZGxlckNsaWVudCxcbiAgY3JlYXRlU2VydmVyQWN0aW9uQ2xpZW50LFxuICBjcmVhdGVTZXJ2ZXJDb21wb25lbnRDbGllbnQsXG4gIGNyZWF0ZVNlcnZlclN1cGFiYXNlQ2xpZW50XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJuYW1lcyI6WyJfX2RlZlByb3AiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIl9fZ2V0T3duUHJvcERlc2MiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfX2dldE93blByb3BOYW1lcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJfX2hhc093blByb3AiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsIl9fZXhwb3J0IiwidGFyZ2V0IiwiYWxsIiwibmFtZSIsImdldCIsImVudW1lcmFibGUiLCJfX2NvcHlQcm9wcyIsInRvIiwiZnJvbSIsImV4Y2VwdCIsImRlc2MiLCJrZXkiLCJjYWxsIiwiX190b0NvbW1vbkpTIiwibW9kIiwidmFsdWUiLCJzcmNfZXhwb3J0cyIsImNyZWF0ZUJyb3dzZXJTdXBhYmFzZUNsaWVudCIsImNyZWF0ZUNsaWVudENvbXBvbmVudENsaWVudCIsImNyZWF0ZU1pZGRsZXdhcmVDbGllbnQiLCJjcmVhdGVNaWRkbGV3YXJlU3VwYWJhc2VDbGllbnQiLCJjcmVhdGVQYWdlc0Jyb3dzZXJDbGllbnQiLCJjcmVhdGVQYWdlc1NlcnZlckNsaWVudCIsImNyZWF0ZVJvdXRlSGFuZGxlckNsaWVudCIsImNyZWF0ZVNlcnZlckFjdGlvbkNsaWVudCIsImNyZWF0ZVNlcnZlckNvbXBvbmVudENsaWVudCIsImNyZWF0ZVNlcnZlclN1cGFiYXNlQ2xpZW50IiwibW9kdWxlIiwiZXhwb3J0cyIsImltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkIiwicmVxdWlyZSIsInN1cGFiYXNlIiwic3VwYWJhc2VVcmwiLCJwcm9jZXNzIiwiZW52IiwiTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMIiwic3VwYWJhc2VLZXkiLCJORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSIsIm9wdGlvbnMiLCJjb29raWVPcHRpb25zIiwiaXNTaW5nbGV0b24iLCJFcnJvciIsImNyZWF0ZU5ld0NsaWVudCIsIl9hIiwiY3JlYXRlU3VwYWJhc2VDbGllbnQiLCJnbG9iYWwiLCJoZWFkZXJzIiwiYXV0aCIsInN0b3JhZ2UiLCJCcm93c2VyQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIiwiX3N1cGFiYXNlIiwiaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQyIiwiaW1wb3J0X3NldF9jb29raWVfcGFyc2VyIiwiTmV4dFNlcnZlckF1dGhTdG9yYWdlQWRhcHRlciIsIkNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlciIsImNvbnN0cnVjdG9yIiwiY29udGV4dCIsImdldENvb2tpZSIsIl9iIiwiX2MiLCJzZXRDb29raWUiLCJzcGxpdENvb2tpZXNTdHJpbmciLCJyZXMiLCJnZXRIZWFkZXIiLCJ0b1N0cmluZyIsIm1hcCIsImMiLCJwYXJzZUNvb2tpZXMiLCJmaW5kIiwicmVxIiwiY29va2llcyIsIl9zZXRDb29raWUiLCJkZWxldGVDb29raWUiLCJtYXhBZ2UiLCJzZXRDb29raWVzIiwiZmlsdGVyIiwiY29va2llU3RyIiwic2VyaWFsaXplQ29va2llIiwiaHR0cE9ubHkiLCJzZXRIZWFkZXIiLCJpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDMiLCJpbXBvcnRfc2V0X2Nvb2tpZV9wYXJzZXIyIiwiTmV4dE1pZGRsZXdhcmVBdXRoU3RvcmFnZUFkYXB0ZXIiLCJuZXdTZXNzaW9uU3RyIiwiYXBwZW5kIiwiaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQ0IiwiTmV4dFNlcnZlckNvbXBvbmVudEF1dGhTdG9yYWdlQWRhcHRlciIsImlzU2VydmVyIiwibmV4dENvb2tpZXMiLCJpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDUiLCJOZXh0Um91dGVIYW5kbGVyQXV0aFN0b3JhZ2VBZGFwdGVyIiwic2V0IiwiY29uc29sZSIsIndhcm4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-helpers-nextjs/dist/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n\nconst AuthAdminApi = _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AuthAdminApi); //# sourceMappingURL=AuthAdminApi.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvQXV0aEFkbWluQXBpLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQThDO0FBQzlDLE1BQU1DLGVBQWVELHVEQUFjQTtBQUNuQyxpRUFBZUMsWUFBWUEsRUFBQyxDQUM1Qix3Q0FBd0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvQXV0aEFkbWluQXBpLmpzPzIwNjEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEdvVHJ1ZUFkbWluQXBpIGZyb20gJy4vR29UcnVlQWRtaW5BcGknO1xuY29uc3QgQXV0aEFkbWluQXBpID0gR29UcnVlQWRtaW5BcGk7XG5leHBvcnQgZGVmYXVsdCBBdXRoQWRtaW5BcGk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdXRoQWRtaW5BcGkuanMubWFwIl0sIm5hbWVzIjpbIkdvVHJ1ZUFkbWluQXBpIiwiQXV0aEFkbWluQXBpIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/AuthClient.js ***!
|
||
\******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _GoTrueClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueClient */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\");\n\nconst AuthClient = _GoTrueClient__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AuthClient); //# sourceMappingURL=AuthClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvQXV0aENsaWVudC5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUEwQztBQUMxQyxNQUFNQyxhQUFhRCxxREFBWUE7QUFDL0IsaUVBQWVDLFVBQVVBLEVBQUMsQ0FDMUIsc0NBQXNDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL0F1dGhDbGllbnQuanM/NGY4ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR29UcnVlQ2xpZW50IGZyb20gJy4vR29UcnVlQ2xpZW50JztcbmNvbnN0IEF1dGhDbGllbnQgPSBHb1RydWVDbGllbnQ7XG5leHBvcnQgZGVmYXVsdCBBdXRoQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXV0aENsaWVudC5qcy5tYXAiXSwibmFtZXMiOlsiR29UcnVlQ2xpZW50IiwiQXV0aENsaWVudCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js":
|
||
/*!**********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js ***!
|
||
\**********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ GoTrueAdminApi)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tslib */ \"(ssr)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _lib_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/fetch */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js\");\n/* harmony import */ var _lib_helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/helpers */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n/* harmony import */ var _lib_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/types */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/types.js\");\n/* harmony import */ var _lib_errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/errors */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n\n\n\n\n\nclass GoTrueAdminApi {\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 /**\n * Removes a logged-in session.\n * @param jwt A valid, logged-in JWT.\n * @param scope The logout sope.\n */ async signOut(jwt, scope = _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 ${_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\", `${this.url}/logout?scope=${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, options = {}) {\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"POST\", `${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\", `${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\", `${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\", `${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[`${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\", `${this.url}/admin/users/${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\", `${this.url}/admin/users/${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, shouldSoftDelete = 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\", `${this.url}/admin/users/${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\", `${this.url}/admin/users/${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\", `${this.url}/admin/users/${params.userId}/factors/${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\", `${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[`${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\", `${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\", `${this.url}/admin/oauth/clients/${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\", `${this.url}/admin/oauth/clients/${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\", `${this.url}/admin/oauth/clients/${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\", `${this.url}/admin/oauth/clients/${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} //# sourceMappingURL=GoTrueAdminApi.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvR29UcnVlQWRtaW5BcGkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQStCO0FBQ3VFO0FBQzNDO0FBQ1o7QUFDSjtBQUM1QixNQUFNUztJQUNqQjs7Ozs7Ozs7Ozs7O0tBWUMsR0FDREMsWUFBWSxFQUFFQyxNQUFNLEVBQUUsRUFBRUMsVUFBVSxDQUFDLENBQUMsRUFBRUMsS0FBSyxFQUFHLENBQUU7UUFDNUMsSUFBSSxDQUFDRixHQUFHLEdBQUdBO1FBQ1gsSUFBSSxDQUFDQyxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDQyxLQUFLLEdBQUdSLDBEQUFZQSxDQUFDUTtRQUMxQixJQUFJLENBQUNDLEdBQUcsR0FBRztZQUNQQyxhQUFhLElBQUksQ0FBQ0MsWUFBWSxDQUFDQyxJQUFJLENBQUMsSUFBSTtZQUN4Q0MsY0FBYyxJQUFJLENBQUNDLGFBQWEsQ0FBQ0YsSUFBSSxDQUFDLElBQUk7UUFDOUM7UUFDQSxJQUFJLENBQUNHLEtBQUssR0FBRztZQUNUQyxhQUFhLElBQUksQ0FBQ0MsaUJBQWlCLENBQUNMLElBQUksQ0FBQyxJQUFJO1lBQzdDTSxjQUFjLElBQUksQ0FBQ0Msa0JBQWtCLENBQUNQLElBQUksQ0FBQyxJQUFJO1lBQy9DUSxXQUFXLElBQUksQ0FBQ0MsZUFBZSxDQUFDVCxJQUFJLENBQUMsSUFBSTtZQUN6Q1UsY0FBYyxJQUFJLENBQUNDLGtCQUFrQixDQUFDWCxJQUFJLENBQUMsSUFBSTtZQUMvQ1ksY0FBYyxJQUFJLENBQUNDLGtCQUFrQixDQUFDYixJQUFJLENBQUMsSUFBSTtZQUMvQ2Msd0JBQXdCLElBQUksQ0FBQ0MsNEJBQTRCLENBQUNmLElBQUksQ0FBQyxJQUFJO1FBQ3ZFO0lBQ0o7SUFDQTs7OztLQUlDLEdBQ0QsTUFBTWdCLFFBQVFDLEdBQUcsRUFBRUMsUUFBUTVCLHVEQUFlLENBQUMsRUFBRSxFQUFFO1FBQzNDLElBQUlBLHVEQUFlQSxD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T0FBTztvQkFBRUQsTUFBTTtvQkFBTUM7Z0JBQU07WUFDL0I7WUFDQSxNQUFNQTtRQUNWO0lBQ0o7SUFDQTs7Ozs7S0FLQyxHQUNELE1BQU1ULDZCQUE2QnFFLFFBQVEsRUFBRTtRQUN6QyxJQUFJO1lBQ0EsT0FBTyxNQUFNbEcsb0RBQVFBLENBQUMsSUFBSSxDQUFDVSxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDRixHQUFHLENBQUMscUJBQXFCLEVBQUUwRixTQUFTLGtCQUFrQixDQUFDLEVBQUU7Z0JBQ3ZHekYsU0FBUyxJQUFJLENBQUNBLE9BQU87Z0JBQ3JCbUMsT0FBTyxDQUFDcUQ7b0JBQ0osT0FBTzt3QkFBRTVELE1BQU00RDt3QkFBUTNELE9BQU87b0JBQUs7Z0JBQ3ZDO1lBQ0o7UUFDSixFQUNBLE9BQU9BLE9BQU87WUFDVixJQUFJakMsd0RBQVdBLENBQUNpQyxRQUFRO2dCQUNwQixPQUFPO29CQUFFRCxNQUFNO29CQUFNQztnQkFBTTtZQUMvQjtZQUNBLE1BQU1BO1FBQ1Y7SUFDSjtBQUNKLEVBQ0EsMENBQTBDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL0dvVHJ1ZUFkbWluQXBpLmpzPzRhMDgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBfZ2VuZXJhdGVMaW5rUmVzcG9uc2UsIF9ub1Jlc29sdmVKc29uUmVzcG9uc2UsIF9yZXF1ZXN0LCBfdXNlclJlc3BvbnNlLCB9IGZyb20gJy4vbGliL2ZldGNoJztcbmltcG9ydCB7IHJlc29sdmVGZXRjaCwgdmFsaWRhdGVVVUlEIH0gZnJvbSAnLi9saWIvaGVscGVycyc7XG5pbXBvcnQgeyBTSUdOX09VVF9TQ09QRVMsIH0gZnJvbSAnLi9saWIvdHlwZXMnO1xuaW1wb3J0IHsgaXNBdXRoRXJyb3IgfSBmcm9tICcuL2xpYi9lcnJvcnMnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR29UcnVlQWRtaW5BcGkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYWRtaW4gQVBJIGNsaWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIG1hbmFnZSB1c2VycyBhbmQgT0F1dGggY2xpZW50cy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBHb1RydWVBZG1pbkFwaSB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICAgICAqXG4gICAgICogY29uc3QgYWRtaW4gPSBuZXcgR29UcnVlQWRtaW5BcGkoe1xuICAgICAqICAgdXJsOiAnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL2F1dGgvdjEnLFxuICAgICAqICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7cHJvY2Vzcy5lbnYuU1VQQUJBU0VfU0VSVklDRV9ST0xFX0tFWX1gIH0sXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih7IHVybCA9ICcnLCBoZWFkZXJzID0ge30sIGZldGNoLCB9KSB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB0aGlzLmZldGNoID0gcmVzb2x2ZUZldGNoKGZldGNoKTtcbiAgICAgICAgdGhpcy5tZmEgPSB7XG4gICAgICAgICAgICBsaXN0RmFjdG9yczogdGhpcy5fbGlzdEZhY3RvcnMuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGRlbGV0ZUZhY3RvcjogdGhpcy5fZGVsZXRlRmFjdG9yLmJpbmQodGhpcyksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub2F1dGggPSB7XG4gICAgICAgICAgICBsaXN0Q2xpZW50czogdGhpcy5fbGlzdE9BdXRoQ2xpZW50cy5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgY3JlYXRlQ2xpZW50OiB0aGlzLl9jcmVhdGVPQXV0aENsaWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZ2V0Q2xpZW50OiB0aGlzLl9nZXRPQXV0aENsaWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdXBkYXRlQ2xpZW50OiB0aGlzLl91cGRhdGVPQXV0aENsaWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZGVsZXRlQ2xpZW50OiB0aGlzLl9kZWxldGVPQXV0aENsaWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcmVnZW5lcmF0ZUNsaWVudFNlY3JldDogdGhpcy5fcmVnZW5lcmF0ZU9BdXRoQ2xpZW50U2VjcmV0LmJpbmQodGhpcyksXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBsb2dnZWQtaW4gc2Vzc2lvbi5cbiAgICAgKiBAcGFyYW0gand0IEEgdmFsaWQsIGxvZ2dlZC1pbiBKV1QuXG4gICAgICogQHBhcmFtIHNjb3BlIFRoZSBsb2dvdXQgc29wZS5cbiAgICAgKi9cbiAgICBhc3luYyBzaWduT3V0KGp3dCwgc2NvcGUgPSBTSUdOX09VVF9TQ09QRVNbMF0pIHtcbiAgICAgICAgaWYgKFNJR05fT1VUX1NDT1BFUy5pbmRleE9mKHNjb3BlKSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IFBhcmFtZXRlciBzY29wZSBtdXN0IGJlIG9uZSBvZiAke1NJR05fT1VUX1NDT1BFUy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9sb2dvdXQ/c2NvcGU9JHtzY29wZX1gLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIGp3dCxcbiAgICAgICAgICAgICAgICBub1Jlc29sdmVKc29uOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhbiBpbnZpdGUgbGluayB0byBhbiBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEBwYXJhbSBlbWFpbCBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnMgdG8gYmUgaW5jbHVkZWQgd2hlbiBpbnZpdGluZy5cbiAgICAgKi9cbiAgICBhc3luYyBpbnZpdGVVc2VyQnlFbWFpbChlbWFpbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vaW52aXRlYCwge1xuICAgICAgICAgICAgICAgIGJvZHk6IHsgZW1haWwsIGRhdGE6IG9wdGlvbnMuZGF0YSB9LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiBvcHRpb25zLnJlZGlyZWN0VG8sXG4gICAgICAgICAgICAgICAgeGZvcm06IF91c2VyUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IG51bGwgfSwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBlbWFpbCBsaW5rcyBhbmQgT1RQcyB0byBiZSBzZW50IHZpYSBhIGN1c3RvbSBlbWFpbCBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0gZW1haWwgVGhlIHVzZXIncyBlbWFpbC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5wYXNzd29yZCBVc2VyIHBhc3N3b3JkLiBGb3Igc2lnbnVwIG9ubHkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMuZGF0YSBPcHRpb25hbCB1c2VyIG1ldGFkYXRhLiBGb3Igc2lnbnVwIG9ubHkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMucmVkaXJlY3RUbyBUaGUgcmVkaXJlY3QgdXJsIHdoaWNoIHNob3VsZCBiZSBhcHBlbmRlZCB0byB0aGUgZ2VuZXJhdGVkIGxpbmtcbiAgICAgKi9cbiAgICBhc3luYyBnZW5lcmF0ZUxpbmsocGFyYW1zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcmFtcywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcIm9wdGlvbnNcIl0pO1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKCduZXdFbWFpbCcgaW4gcmVzdCkge1xuICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgbmV3RW1haWwgd2l0aCBuZXdfZW1haWwgaW4gcmVxdWVzdCBib2R5XG4gICAgICAgICAgICAgICAgYm9keS5uZXdfZW1haWwgPSByZXN0ID09PSBudWxsIHx8IHJlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3QubmV3RW1haWw7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGJvZHlbJ25ld0VtYWlsJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vYWRtaW4vZ2VuZXJhdGVfbGlua2AsIHtcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX2dlbmVyYXRlTGlua1Jlc3BvbnNlLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZWRpcmVjdFRvLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBVc2VyIEFkbWluIEFQSVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdXNlci5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVVzZXIoYXR0cmlidXRlcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L2FkbWluL3VzZXJzYCwge1xuICAgICAgICAgICAgICAgIGJvZHk6IGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfdXNlclJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBudWxsIH0sIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsaXN0IG9mIHVzZXJzLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKiBAcGFyYW0gcGFyYW1zIEFuIG9iamVjdCB3aGljaCBzdXBwb3J0cyBgcGFnZWAgYW5kIGBwZXJQYWdlYCBhcyBudW1iZXJzLCB0byBhbHRlciB0aGUgcGFnaW5hdGVkIHJlc3VsdHMuXG4gICAgICovXG4gICAgYXN5bmMgbGlzdFVzZXJzKHBhcmFtcykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYWdpbmF0aW9uID0geyBuZXh0UGFnZTogbnVsbCwgbGFzdFBhZ2U6IDAsIHRvdGFsOiAwIH07XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vYWRtaW4vdXNlcnNgLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIG5vUmVzb2x2ZUpzb246IHRydWUsXG4gICAgICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZTogKF9iID0gKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgcGVyX3BhZ2U6IChfZCA9IChfYyA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wZXJQYWdlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudG9TdHJpbmcoKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX25vUmVzb2x2ZUpzb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKVxuICAgICAgICAgICAgICAgIHRocm93IHJlc3BvbnNlLmVycm9yO1xuICAgICAgICAgICAgY29uc3QgdXNlcnMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbCA9IChfZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXRvdGFsLWNvdW50JykpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgICAgICBjb25zdCBsaW5rcyA9IChfZyA9IChfZiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdsaW5rJykpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5zcGxpdCgnLCcpKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBbXTtcbiAgICAgICAgICAgIGlmIChsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gcGFyc2VJbnQobGluay5zcGxpdCgnOycpWzBdLnNwbGl0KCc9JylbMV0uc3Vic3RyaW5nKDAsIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsID0gSlNPTi5wYXJzZShsaW5rLnNwbGl0KCc7JylbMV0uc3BsaXQoJz0nKVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2luYXRpb25bYCR7cmVsfVBhZ2VgXSA9IHBhZ2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGFnaW5hdGlvbi50b3RhbCA9IHBhcnNlSW50KHRvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdXNlcnMpLCBwYWdpbmF0aW9uKSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXJzOiBbXSB9LCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHVzZXIgYnkgaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdWlkIFRoZSB1c2VyJ3MgdW5pcXVlIGlkZW50aWZpZXJcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0VXNlckJ5SWQodWlkKSB7XG4gICAgICAgIHZhbGlkYXRlVVVJRCh1aWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vYWRtaW4vdXNlcnMvJHt1aWR9YCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3VzZXJSZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgdXNlciBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGRhdGEgeW91IHdhbnQgdG8gdXBkYXRlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVVc2VyQnlJZCh1aWQsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdmFsaWRhdGVVVUlEKHVpZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BVVCcsIGAke3RoaXMudXJsfS9hZG1pbi91c2Vycy8ke3VpZH1gLCB7XG4gICAgICAgICAgICAgICAgYm9keTogYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IF91c2VyUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IG51bGwgfSwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIHVzZXIuIFJlcXVpcmVzIGEgYHNlcnZpY2Vfcm9sZWAga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIFRoZSB1c2VyIGlkIHlvdSB3YW50IHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0gc2hvdWxkU29mdERlbGV0ZSBJZiB0cnVlLCB0aGVuIHRoZSB1c2VyIHdpbGwgYmUgc29mdC1kZWxldGVkIGZyb20gdGhlIGF1dGggc2NoZW1hLiBTb2Z0IGRlbGV0aW9uIGFsbG93cyB1c2VyIGlkZW50aWZpY2F0aW9uIGZyb20gdGhlIGhhc2hlZCB1c2VyIElEIGJ1dCBpcyBub3QgcmV2ZXJzaWJsZS5cbiAgICAgKiBEZWZhdWx0cyB0byBmYWxzZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlVXNlcihpZCwgc2hvdWxkU29mdERlbGV0ZSA9IGZhbHNlKSB7XG4gICAgICAgIHZhbGlkYXRlVVVJRChpZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0RFTEVURScsIGAke3RoaXMudXJsfS9hZG1pbi91c2Vycy8ke2lkfWAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgICAgICBzaG91bGRfc29mdF9kZWxldGU6IHNob3VsZFNvZnREZWxldGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3VzZXJSZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX2xpc3RGYWN0b3JzKHBhcmFtcykge1xuICAgICAgICB2YWxpZGF0ZVVVSUQocGFyYW1zLnVzZXJJZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L2FkbWluL3VzZXJzLyR7cGFyYW1zLnVzZXJJZH0vZmFjdG9yc2AsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IChmYWN0b3JzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgZmFjdG9ycyB9LCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9kZWxldGVGYWN0b3IocGFyYW1zKSB7XG4gICAgICAgIHZhbGlkYXRlVVVJRChwYXJhbXMudXNlcklkKTtcbiAgICAgICAgdmFsaWRhdGVVVUlEKHBhcmFtcy5pZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0RFTEVURScsIGAke3RoaXMudXJsfS9hZG1pbi91c2Vycy8ke3BhcmFtcy51c2VySWR9L2ZhY3RvcnMvJHtwYXJhbXMuaWR9YCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdHMgYWxsIE9BdXRoIGNsaWVudHMgd2l0aCBvcHRpb25hbCBwYWdpbmF0aW9uLlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIF9saXN0T0F1dGhDbGllbnRzKHBhcmFtcykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYWdpbmF0aW9uID0geyBuZXh0UGFnZTogbnVsbCwgbGFzdFBhZ2U6IDAsIHRvdGFsOiAwIH07XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vYWRtaW4vb2F1dGgvY2xpZW50c2AsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgbm9SZXNvbHZlSnNvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgICAgICAgICBwYWdlOiAoX2IgPSAoX2EgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMucGFnZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBwZXJfcGFnZTogKF9kID0gKF9jID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBlclBhZ2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50b1N0cmluZygpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfbm9SZXNvbHZlSnNvblJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2UuZXJyb3I7XG4gICAgICAgICAgICBjb25zdCBjbGllbnRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgY29uc3QgdG90YWwgPSAoX2UgPSByZXNwb25zZS5oZWFkZXJzLmdldCgneC10b3RhbC1jb3VudCcpKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICAgICAgY29uc3QgbGlua3MgPSAoX2cgPSAoX2YgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnbGluaycpKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Yuc3BsaXQoJywnKSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogW107XG4gICAgICAgICAgICBpZiAobGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxpbmtzLmZvckVhY2goKGxpbmspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IHBhcnNlSW50KGxpbmsuc3BsaXQoJzsnKVswXS5zcGxpdCgnPScpWzFdLnN1YnN0cmluZygwLCAxKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbCA9IEpTT04ucGFyc2UobGluay5zcGxpdCgnOycpWzFdLnNwbGl0KCc9JylbMV0pO1xuICAgICAgICAgICAgICAgICAgICBwYWdpbmF0aW9uW2Ake3JlbH1QYWdlYF0gPSBwYWdlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhZ2luYXRpb24udG90YWwgPSBwYXJzZUludCh0b3RhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNsaWVudHMpLCBwYWdpbmF0aW9uKSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IGNsaWVudHM6IFtdIH0sIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE9BdXRoIGNsaWVudC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBfY3JlYXRlT0F1dGhDbGllbnQocGFyYW1zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vYWRtaW4vb2F1dGgvY2xpZW50c2AsIHtcbiAgICAgICAgICAgICAgICBib2R5OiBwYXJhbXMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiAoY2xpZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGNsaWVudCwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgZGV0YWlscyBvZiBhIHNwZWNpZmljIE9BdXRoIGNsaWVudC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBfZ2V0T0F1dGhDbGllbnQoY2xpZW50SWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L2FkbWluL29hdXRoL2NsaWVudHMvJHtjbGllbnRJZH1gLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiAoY2xpZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGNsaWVudCwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgT0F1dGggY2xpZW50LlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIF91cGRhdGVPQXV0aENsaWVudChjbGllbnRJZCwgcGFyYW1zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BVVCcsIGAke3RoaXMudXJsfS9hZG1pbi9vYXV0aC9jbGllbnRzLyR7Y2xpZW50SWR9YCwge1xuICAgICAgICAgICAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IChjbGllbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogY2xpZW50LCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhbiBPQXV0aCBjbGllbnQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHRoZSBPQXV0aCAyLjEgc2VydmVyIGlzIGVuYWJsZWQgaW4gU3VwYWJhc2UgQXV0aC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgX2RlbGV0ZU9BdXRoQ2xpZW50KGNsaWVudElkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnREVMRVRFJywgYCR7dGhpcy51cmx9L2FkbWluL29hdXRoL2NsaWVudHMvJHtjbGllbnRJZH1gLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIG5vUmVzb2x2ZUpzb246IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2VuZXJhdGVzIHRoZSBzZWNyZXQgZm9yIGFuIE9BdXRoIGNsaWVudC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBfcmVnZW5lcmF0ZU9BdXRoQ2xpZW50U2VjcmV0KGNsaWVudElkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vYWRtaW4vb2F1dGgvY2xpZW50cy8ke2NsaWVudElkfS9yZWdlbmVyYXRlX3NlY3JldGAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IChjbGllbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogY2xpZW50LCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Hb1RydWVBZG1pbkFwaS5qcy5tYXAiXSwibmFtZXMiOlsiX19yZXN0IiwiX2dlbmVyYXRlTGlua1Jlc3BvbnNlIiwiX25vUmVzb2x2ZUpzb25SZXNwb25zZSIsIl9yZXF1ZXN0IiwiX3VzZXJSZXNwb25zZSIsInJlc29sdmVGZXRjaCIsInZhbGlkYXRlVVVJRCIsIlNJR05fT1VUX1NDT1BFUyIsImlzQXV0aEVycm9yIiwiR29UcnVlQWRtaW5BcGkiLCJjb25zdHJ1Y3RvciIsInVybCIsImhlYWRlcnMiLCJmZXRjaCIsIm1mYSIsImxpc3RGYWN0b3JzIiwiX2xpc3RGYWN0b3JzIiwiYmluZCIsImRlbGV0ZUZhY3RvciIsIl9kZWxldGVGYWN0b3IiLCJvYXV0aCIsImxpc3RDbGllbnRzIiwiX2xpc3RPQXV0aENsaWVudHMiLCJjcmVhdGVDbGllbnQiLCJfY3JlYXRlT0F1dGhDbGllbnQiLCJnZXRDbGllbnQiLCJfZ2V0T0F1dGhDbGllbnQiLCJ1cGRhdGVDbGllbnQiLCJfdXBkYXRlT0F1dGhDbGllbnQiLCJkZWxldGVDbGllbnQiLCJfZGVsZXRlT0F1dGhDbGllbnQiLCJyZWdlbmVyYXRlQ2xpZW50U2VjcmV0IiwiX3JlZ2VuZXJhdGVPQXV0aENsaWVudFNlY3JldCIsInNpZ25PdXQiLCJqd3QiLCJzY29wZSIsImluZGV4T2YiLCJFcnJvciIsImpvaW4iLCJub1Jlc29sdmVKc29uIiwiZGF0YSIsImVycm9yIiwiaW52aXRlVXNlckJ5RW1haWwiLCJlbWFpbCIsIm9wdGlvbnMiLCJib2R5IiwicmVkaXJlY3RUbyIsInhmb3JtIiwidXNlciIsImdlbmVyYXRlTGluayIsInBhcmFtcyIsInJlc3QiLCJPYmplY3QiLCJhc3NpZ24iLCJuZXdfZW1haWwiLCJuZXdFbWFpbCIsInByb3BlcnRpZXMiLCJjcmVhdGVVc2VyIiwiYXR0cmlidXRlcyIsImxpc3RVc2VycyIsIl9hIiwiX2IiLCJfYyIsIl9kIiwiX2UiLCJfZiIsIl9nIiwicGFnaW5hdGlvbiIsIm5leHRQYWdlIiwibGFzdFBhZ2UiLCJ0b3RhbCIsInJlc3BvbnNlIiwicXVlcnkiLCJwYWdlIiwidG9TdHJpbmciLCJwZXJfcGFnZSIsInBlclBhZ2UiLCJ1c2VycyIsImpzb24iLCJnZXQiLCJsaW5rcyIsInNwbGl0IiwibGVuZ3RoIiwiZm9yRWFjaCIsImxpbmsiLCJwYXJzZUludCIsInN1YnN0cmluZyIsInJlbCIsIkpTT04iLCJwYXJzZSIsImdldFVzZXJCeUlkIiwidWlkIiwidXBkYXRlVXNlckJ5SWQiLCJkZWxldGVVc2VyIiwiaWQiLCJzaG91bGRTb2Z0RGVsZXRlIiwic2hvdWxkX3NvZnRfZGVsZXRlIiwidXNlcklkIiwiZmFjdG9ycyIsImNsaWVudHMiLCJjbGllbnQiLCJjbGllbnRJZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/constants */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\");\n/* harmony import */ var _lib_errors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/errors */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _lib_fetch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/fetch */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js\");\n/* harmony import */ var _lib_helpers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/helpers */ \"(ssr)/./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 */ \"(ssr)/./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 */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js\");\n/* harmony import */ var _lib_polyfills__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lib/polyfills */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js\");\n/* harmony import */ var _lib_version__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./lib/version */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/version.js\");\n/* harmony import */ var _lib_base64url__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./lib/base64url */ \"(ssr)/./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 */ \"(ssr)/./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 */ \"(ssr)/./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 * 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 = `${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 /**\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@\" + `${this.storageKey}:${this.instanceID} (${_lib_version__WEBPACK_IMPORTED_MODULE_8__.version}) ${new Date().toISOString()}`;\n }\n _debug(...args) {\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\", `${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\", `${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\", `${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, `${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, `${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\", `${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\", `${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 \"${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\", `${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 `${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: ${url.href}`,\n `Issued At: ${(_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: ${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: ${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: ${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: ${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: ${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)=>`- ${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\", `${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, `${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\", `${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, `${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, `${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\", `${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\", `${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\", `${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, `${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\", `${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\", `${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, `${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\", `${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 = `${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:${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${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\", `${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\", `${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, `${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, options = {}) {\n await this.initializePromise;\n return await this._acquireLock(-1, async ()=>{\n return await this._updateUser(attributes, options);\n });\n }\n async _updateUser(attributes, options = {}) {\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\", `${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, `${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 ${actuallyExpiresIn}s, should have been closer to ${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, `${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(options = {\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({ scope } = {\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, `${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, options = {}) {\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\", `${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, `${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(`${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\", `${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, `${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\", `${this.url}/user/identities/${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(${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\", `${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(`${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${expiresWithMargin ? \"\" : \" not\"} expired with margin of ${_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(${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, broadcast = true) {\n const debugName = `#_notifyAllSubscribers(${event})`;\n this._debug(debugName, \"begin\", session, `broadcast = ${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, `${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 ${expiresInTicks} ticks, a tick lasts ${_lib_constants__WEBPACK_IMPORTED_MODULE_1__.AUTO_REFRESH_TICK_DURATION_MS}ms, refresh threshold is ${_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(${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=${encodeURIComponent(provider)}`\n ];\n if (options === null || options === void 0 ? void 0 : options.redirectTo) {\n urlParams.push(`redirect_to=${encodeURIComponent(options.redirectTo)}`);\n }\n if (options === null || options === void 0 ? void 0 : options.scopes) {\n urlParams.push(`scopes=${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: `${encodeURIComponent(codeChallenge)}`,\n code_challenge_method: `${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=${options.skipBrowserRedirect}`);\n }\n return `${url}?${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\", `${this.url}/factors/${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\", `${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,${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\", `${this.url}/factors/${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\", `${this.url}/factors/${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\", `${this.url}/oauth/authorizations/${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\", `${this.url}/oauth/authorizations/${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\", `${this.url}/oauth/authorizations/${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\", `${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\", `${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, jwks = {\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\", `${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, options = {}) {\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)(`${rawHeader}.${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}\nGoTrueClient.nextInstanceID = {};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (GoTrueClient); //# sourceMappingURL=GoTrueClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvR29UcnVlQ2xpZW50LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBOEM7QUFDc0g7QUFDOE07QUFDalE7QUFDZ047QUFDalE7QUFDSztBQUNoQjtBQUNiO0FBQytCO0FBQ2M7QUFDNkc7QUFDbE0rQyxrRUFBa0JBLElBQUksOEJBQThCO0FBQ3BELE1BQU1hLGtCQUFrQjtJQUNwQkMsS0FBS3hELHNEQUFVQTtJQUNmeUQsWUFBWXZELHVEQUFXQTtJQUN2QndELGtCQUFrQjtJQUNsQkMsZ0JBQWdCO0lBQ2hCQyxvQkFBb0I7SUFDcEJDLFNBQVMvRCwyREFBZUE7SUFDeEJnRSxVQUFVO0lBQ1ZDLE9BQU87SUFDUEMsOEJBQThCO0lBQzlCQyxjQUFjO0FBQ2xCO0FBQ0EsZUFBZUMsU0FBU0MsSUFBSSxFQUFFQyxjQUFjLEVBQUVDLEVBQUU7SUFDNUMsT0FBTyxNQUFNQTtBQUNqQjtBQUNBOzs7Ozs7O0NBT0MsR0FDRCxNQUFNQyxjQUFjLENBQUM7QUFDckIsTUFBTUM7SUFDRjs7S0FFQyxHQUNELElBQUlDLE9BQU87UUFDUCxJQUFJQyxJQUFJQztRQUNSLE9BQU8sQ0FBQ0EsS0FBSyxDQUFDRCxLQUFLSCxXQUFXLENBQUMsSUFBSSxDQUFDYixVQUFVLENBQUMsTUFBTSxRQUFRZ0IsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHRCxJQUFJLE1BQU0sUUFBUUUsT0FBTyxLQUFLLElBQUlBLEtBQUs7WUFBRUMsTUFBTSxFQUFFO1FBQUM7SUFDL0k7SUFDQSxJQUFJSCxLQUFLSSxLQUFLLEVBQUU7UUFDWk4sV0FBVyxDQUFDLElBQUksQ0FBQ2IsVUFBVSxDQUFDLEdBQUdvQixPQUFPQyxNQUFNLENBQUNELE9BQU9DLE1BQU0sQ0FBQyxDQUFDLEdBQUdSLFdBQVcsQ0FBQyxJQUFJLENBQUNiLFVBQVUsQ0FBQyxHQUFHO1lBQUVlLE1BQU1JO1FBQU07SUFDaEg7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Q0FBQ2tMLE9BQU8sQ0FBQzlDO2dCQUNyQyxJQUFJcEksT0FBTztvQkFDUCxNQUFNQTtnQkFDVjtnQkFDQSwyREFBMkQ7Z0JBQzNELE9BQU87b0JBQ0hLLE1BQU07d0JBQ0Y4VSxRQUFRdEo7d0JBQ1I2STt3QkFDQTNQO29CQUNKO29CQUNBL0UsT0FBTztnQkFDWDtZQUNKO1lBQ0EsTUFBTW9WLFlBQVk5YywwREFBWUEsQ0FBQ29jLE9BQU9NLEdBQUc7WUFDekMsMkJBQTJCO1lBQzNCLE1BQU0xTixZQUFZLE1BQU00TixPQUFPRyxNQUFNLENBQUNDLFNBQVMsQ0FBQyxPQUFPUCxZQUFZSyxXQUFXLE1BQU07Z0JBQ2hGO2FBQ0g7WUFDRCx1QkFBdUI7WUFDdkIsTUFBTUcsVUFBVSxNQUFNTCxPQUFPRyxNQUFNLENBQUNwWCxNQUFNLENBQUNtWCxXQUFXOU4sV0FBV3ZDLFdBQVdyTCxrRUFBa0JBLENBQUMsQ0FBQyxFQUFFa2IsVUFBVSxDQUFDLEVBQUVDLFdBQVcsQ0FBQztZQUMzSCxJQUFJLENBQUNVLFNBQVM7Z0JBQ1YsTUFBTSxJQUFJcmUsNERBQW1CQSxDQUFDO1lBQ2xDO1lBQ0EscURBQXFEO1lBQ3JELE9BQU87Z0JBQ0htSixNQUFNO29CQUNGOFUsUUFBUXRKO29CQUNSNkk7b0JBQ0EzUDtnQkFDSjtnQkFDQS9FLE9BQU87WUFDWDtRQUNKLEVBQ0EsT0FBT0EsT0FBTztZQUNWLElBQUl2SSx3REFBV0EsQ0FBQ3VJLFFBQVE7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDUyxhQUFhLENBQUM7b0JBQUVKLE1BQU07b0JBQU1MO2dCQUFNO1lBQ2xEO1lBQ0EsTUFBTUE7UUFDVjtJQUNKO0FBQ0o7QUFDQTVFLGFBQWFnQyxjQUFjLEdBQUcsQ0FBQztBQUMvQixpRUFBZWhDLFlBQVlBLEVBQUMsQ0FDNUIsd0NBQXdDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL0dvVHJ1ZUNsaWVudC5qcz9mNjcwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHb1RydWVBZG1pbkFwaSBmcm9tICcuL0dvVHJ1ZUFkbWluQXBpJztcbmltcG9ydCB7IEFVVE9fUkVGUkVTSF9USUNLX0RVUkFUSU9OX01TLCBBVVRPX1JFRlJFU0hfVElDS19USFJFU0hPTEQsIERFRkFVTFRfSEVBREVSUywgRVhQSVJZX01BUkdJTl9NUywgR09UUlVFX1VSTCwgSldLU19UVEwsIFNUT1JBR0VfS0VZLCB9IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IsIEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvciwgQXV0aEludmFsaWRKd3RFcnJvciwgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IsIEF1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yLCBBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3IsIEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yLCBBdXRoVW5rbm93bkVycm9yLCBpc0F1dGhBcGlFcnJvciwgaXNBdXRoRXJyb3IsIGlzQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yLCBpc0F1dGhSZXRyeWFibGVGZXRjaEVycm9yLCBpc0F1dGhTZXNzaW9uTWlzc2luZ0Vycm9yLCB9IGZyb20gJy4vbGliL2Vycm9ycyc7XG5pbXBvcnQgeyBfcmVxdWVzdCwgX3Nlc3Npb25SZXNwb25zZSwgX3Nlc3Npb25SZXNwb25zZVBhc3N3b3JkLCBfc3NvUmVzcG9uc2UsIF91c2VyUmVzcG9uc2UsIH0gZnJvbSAnLi9saWIvZmV0Y2gnO1xuaW1wb3J0IHsgZGVjb2RlSldULCBkZWVwQ2xvbmUsIERlZmVycmVkLCBnZW5lcmF0ZUNhbGxiYWNrSWQsIGdldEFsZ29yaXRobSwgZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZCwgZ2V0SXRlbUFzeW5jLCBpbnNlY3VyZVVzZXJXYXJuaW5nUHJveHksIGlzQnJvd3NlciwgcGFyc2VQYXJhbWV0ZXJzRnJvbVVSTCwgcmVtb3ZlSXRlbUFzeW5jLCByZXNvbHZlRmV0Y2gsIHJldHJ5YWJsZSwgc2V0SXRlbUFzeW5jLCBzbGVlcCwgc3VwcG9ydHNMb2NhbFN0b3JhZ2UsIHVzZXJOb3RBdmFpbGFibGVQcm94eSwgdmFsaWRhdGVFeHAsIH0gZnJvbSAnLi9saWIvaGVscGVycyc7XG5pbXBvcnQgeyBtZW1vcnlMb2NhbFN0b3JhZ2VBZGFwdGVyIH0gZnJvbSAnLi9saWIvbG9jYWwtc3RvcmFnZSc7XG5pbXBvcnQgeyBMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciwgbmF2aWdhdG9yTG9jayB9IGZyb20gJy4vbGliL2xvY2tzJztcbmltcG9ydCB7IHBvbHlmaWxsR2xvYmFsVGhpcyB9IGZyb20gJy4vbGliL3BvbHlmaWxscyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi9saWIvdmVyc2lvbic7XG5pbXBvcnQgeyBieXRlc1RvQmFzZTY0VVJMLCBzdHJpbmdUb1VpbnQ4QXJyYXkgfSBmcm9tICcuL2xpYi9iYXNlNjR1cmwnO1xuaW1wb3J0IHsgY3JlYXRlU2l3ZU1lc3NhZ2UsIGZyb21IZXgsIGdldEFkZHJlc3MsIHRvSGV4LCB9IGZyb20gJy4vbGliL3dlYjMvZXRoZXJldW0nO1xuaW1wb3J0IHsgZGVzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zLCBkZXNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucywgc2VyaWFsaXplQ3JlZGVudGlhbENyZWF0aW9uUmVzcG9uc2UsIHNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0UmVzcG9uc2UsIFdlYkF1dGhuQXBpLCB9IGZyb20gJy4vbGliL3dlYmF1dGhuJztcbnBvbHlmaWxsR2xvYmFsVGhpcygpOyAvLyBNYWtlIFwiZ2xvYmFsVGhpc1wiIGF2YWlsYWJsZVxuY29uc3QgREVGQVVMVF9PUFRJT05TID0ge1xuICAgIHVybDogR09UUlVFX1VSTCxcbiAgICBzdG9yYWdlS2V5OiBTVE9SQUdFX0tFWSxcbiAgICBhdXRvUmVmcmVzaFRva2VuOiB0cnVlLFxuICAgIHBlcnNpc3RTZXNzaW9uOiB0cnVlLFxuICAgIGRldGVjdFNlc3Npb25JblVybDogdHJ1ZSxcbiAgICBoZWFkZXJzOiBERUZBVUxUX0hFQURFUlMsXG4gICAgZmxvd1R5cGU6ICdpbXBsaWNpdCcsXG4gICAgZGVidWc6IGZhbHNlLFxuICAgIGhhc0N1c3RvbUF1dGhvcml6YXRpb25IZWFkZXI6IGZhbHNlLFxuICAgIHRocm93T25FcnJvcjogZmFsc2UsXG59O1xuYXN5bmMgZnVuY3Rpb24gbG9ja05vT3AobmFtZSwgYWNxdWlyZVRpbWVvdXQsIGZuKSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG59XG4vKipcbiAqIENhY2hlcyBKV0tTIHZhbHVlcyBmb3IgYWxsIGNsaWVudHMgY3JlYXRlZCBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudC4gVGhpcyBpc1xuICogZXNwZWNpYWxseSB1c2VmdWwgZm9yIHNoYXJlZC1tZW1vcnkgZXhlY3V0aW9uIGVudmlyb25tZW50cyBzdWNoIGFzIFZlcmNlbCdzXG4gKiBGbHVpZCBDb21wdXRlLCBBV1MgTGFtYmRhIG9yIFN1cGFiYXNlJ3MgRWRnZSBGdW5jdGlvbnMuIFJlZ2FyZGxlc3Mgb2YgaG93XG4gKiBtYW55IGNsaWVudHMgYXJlIGNyZWF0ZWQsIGlmIHRoZXkgc2hhcmUgdGhlIHNhbWUgc3RvcmFnZSBrZXkgdGhleSB3aWxsIHVzZVxuICogdGhlIHNhbWUgSldLUyBjYWNoZSwgc2lnbmlmaWNhbnRseSBzcGVlZGluZyB1cCBnZXRDbGFpbXMoKSB3aXRoIGFzeW1tZXRyaWNcbiAqIEpXVHMuXG4gKi9cbmNvbnN0IEdMT0JBTF9KV0tTID0ge307XG5jbGFzcyBHb1RydWVDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBKV0tTIHVzZWQgZm9yIHZlcmlmeWluZyBhc3ltbWV0cmljIEpXVHNcbiAgICAgKi9cbiAgICBnZXQgandrcygpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IEdMT0JBTF9KV0tTW3RoaXMuc3RvcmFnZUtleV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5qd2tzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB7IGtleXM6IFtdIH07XG4gICAgfVxuICAgIHNldCBqd2tzKHZhbHVlKSB7XG4gICAgICAgIEdMT0JBTF9KV0tTW3RoaXMuc3RvcmFnZUtleV0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIEdMT0JBTF9KV0tTW3RoaXMuc3RvcmFnZUtleV0pLCB7IGp3a3M6IHZhbHVlIH0pO1xuICAgIH1cbiAgICBnZXQgandrc19jYWNoZWRfYXQoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSBHTE9CQUxfSldLU1t0aGlzLnN0b3JhZ2VLZXldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FjaGVkQXQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICAgIH1cbiAgICBzZXQgandrc19jYWNoZWRfYXQodmFsdWUpIHtcbiAgICAgICAgR0xPQkFMX0pXS1NbdGhpcy5zdG9yYWdlS2V5XSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgR0xPQkFMX0pXS1NbdGhpcy5zdG9yYWdlS2V5XSksIHsgY2FjaGVkQXQ6IHZhbHVlIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgY2xpZW50IGZvciB1c2UgaW4gdGhlIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgR29UcnVlQ2xpZW50IH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gICAgICpcbiAgICAgKiBjb25zdCBhdXRoID0gbmV3IEdvVHJ1ZUNsaWVudCh7XG4gICAgICogICB1cmw6ICdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vYXV0aC92MScsXG4gICAgICogICBoZWFkZXJzOiB7IGFwaWtleTogJ3B1YmxpYy1hbm9uLWtleScgfSxcbiAgICAgKiAgIHN0b3JhZ2VLZXk6ICdzdXBhYmFzZS1hdXRoJyxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVzZXJTdG9yYWdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZUVtaXR0ZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmF1dG9SZWZyZXNoVGlja2VyID0gbnVsbDtcbiAgICAgICAgdGhpcy52aXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWZyZXNoaW5nRGVmZXJyZWQgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogS2VlcHMgdHJhY2sgb2YgdGhlIGFzeW5jIGNsaWVudCBpbml0aWFsaXphdGlvbi5cbiAgICAgICAgICogV2hlbiBudWxsIG9yIG5vdCB5ZXQgcmVzb2x2ZWQgdGhlIGF1dGggc3RhdGUgaXMgYHVua25vd25gXG4gICAgICAgICAqIE9uY2UgcmVzb2x2ZWQgdGhlIGF1dGggc3RhdGUgaXMga25vd24gYW5kIGl0J3Mgc2FmZSB0byBjYWxsIGFueSBmdXJ0aGVyIGNsaWVudCBtZXRob2RzLlxuICAgICAgICAgKiBLZWVwIGV4dHJhIGNhcmUgdG8gbmV2ZXIgcmVqZWN0IG9yIHRocm93IHVuY2F1Z2h0IGVycm9yc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbml0aWFsaXplUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZGV0ZWN0U2Vzc2lvbkluVXJsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oYXNDdXN0b21BdXRob3JpemF0aW9uSGVhZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NHZXRTZXNzaW9uV2FybmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvY2tBY3F1aXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBlbmRpbmdJbkxvY2sgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gYnJvYWRjYXN0IHN0YXRlIGNoYW5nZSBldmVudHMgdG8gb3RoZXIgdGFicyBsaXN0ZW5pbmcuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwgPSBudWxsO1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGNvbnNvbGUubG9nO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TKSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc3RvcmFnZUtleSA9IHNldHRpbmdzLnN0b3JhZ2VLZXk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VJRCA9IChfYSA9IEdvVHJ1ZUNsaWVudC5uZXh0SW5zdGFuY2VJRFt0aGlzLnN0b3JhZ2VLZXldKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBHb1RydWVDbGllbnQubmV4dEluc3RhbmNlSURbdGhpcy5zdG9yYWdlS2V5XSA9IHRoaXMuaW5zdGFuY2VJRCArIDE7XG4gICAgICAgIHRoaXMubG9nRGVidWdNZXNzYWdlcyA9ICEhc2V0dGluZ3MuZGVidWc7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuZGVidWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyID0gc2V0dGluZ3MuZGVidWc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VJRCA+IDAgJiYgaXNCcm93c2VyKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHt0aGlzLl9sb2dQcmVmaXgoKX0gTXVsdGlwbGUgR29UcnVlQ2xpZW50IGluc3RhbmNlcyBkZXRlY3RlZCBpbiB0aGUgc2FtZSBicm93c2VyIGNvbnRleHQuIEl0IGlzIG5vdCBhbiBlcnJvciwgYnV0IHRoaXMgc2hvdWxkIGJlIGF2b2lkZWQgYXMgaXQgbWF5IHByb2R1Y2UgdW5kZWZpbmVkIGJlaGF2aW9yIHdoZW4gdXNlZCBjb25jdXJyZW50bHkgdW5kZXIgdGhlIHNhbWUgc3RvcmFnZSBrZXkuYDtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvZ0RlYnVnTWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRyYWNlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVyc2lzdFNlc3Npb24gPSBzZXR0aW5ncy5wZXJzaXN0U2Vzc2lvbjtcbiAgICAgICAgdGhpcy5hdXRvUmVmcmVzaFRva2VuID0gc2V0dGluZ3MuYXV0b1JlZnJlc2hUb2tlbjtcbiAgICAgICAgdGhpcy5hZG1pbiA9IG5ldyBHb1RydWVBZG1pbkFwaSh7XG4gICAgICAgICAgICB1cmw6IHNldHRpbmdzLnVybCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHNldHRpbmdzLmhlYWRlcnMsXG4gICAgICAgICAgICBmZXRjaDogc2V0dGluZ3MuZmV0Y2gsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVybCA9IHNldHRpbmdzLnVybDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gc2V0dGluZ3MuaGVhZGVycztcbiAgICAgICAgdGhpcy5mZXRjaCA9IHJlc29sdmVGZXRjaChzZXR0aW5ncy5mZXRjaCk7XG4gICAgICAgIHRoaXMubG9jayA9IHNldHRpbmdzLmxvY2sgfHwgbG9ja05vT3A7XG4gICAgICAgIHRoaXMuZGV0ZWN0U2Vzc2lvbkluVXJsID0gc2V0dGluZ3MuZGV0ZWN0U2Vzc2lvbkluVXJsO1xuICAgICAgICB0aGlzLmZsb3dUeXBlID0gc2V0dGluZ3MuZmxvd1R5cGU7XG4gICAgICAgIHRoaXMuaGFzQ3VzdG9tQXV0aG9yaXphdGlvbkhlYWRlciA9IHNldHRpbmdzLmhhc0N1c3RvbUF1dGhvcml6YXRpb25IZWFkZXI7XG4gICAgICAgIHRoaXMudGhyb3dPbkVycm9yID0gc2V0dGluZ3MudGhyb3dPbkVycm9yO1xuICAgICAgICBpZiAoc2V0dGluZ3MubG9jaykge1xuICAgICAgICAgICAgdGhpcy5sb2NrID0gc2V0dGluZ3MubG9jaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnBlcnNpc3RTZXNzaW9uICYmIGlzQnJvd3NlcigpICYmICgoX2IgPSBnbG9iYWxUaGlzID09PSBudWxsIHx8IGdsb2JhbFRoaXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdsb2JhbFRoaXMubmF2aWdhdG9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubG9ja3MpKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2sgPSBuYXZpZ2F0b3JMb2NrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2NrID0gbG9ja05vT3A7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmp3a3MpIHtcbiAgICAgICAgICAgIHRoaXMuandrcyA9IHsga2V5czogW10gfTtcbiAgICAgICAgICAgIHRoaXMuandrc19jYWNoZWRfYXQgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1mYSA9IHtcbiAgICAgICAgICAgIHZlcmlmeTogdGhpcy5fdmVyaWZ5LmJpbmQodGhpcyksXG4gICAgICAgICAgICBlbnJvbGw6IHRoaXMuX2Vucm9sbC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdW5lbnJvbGw6IHRoaXMuX3VuZW5yb2xsLmJpbmQodGhpcyksXG4gICAgICAgICAgICBjaGFsbGVuZ2U6IHRoaXMuX2NoYWxsZW5nZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgbGlzdEZhY3RvcnM6IHRoaXMuX2xpc3RGYWN0b3JzLmJpbmQodGhpcyksXG4gICAgICAgICAgICBjaGFsbGVuZ2VBbmRWZXJpZnk6IHRoaXMuX2NoYWxsZW5nZUFuZFZlcmlmeS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZ2V0QXV0aGVudGljYXRvckFzc3VyYW5jZUxldmVsOiB0aGlzLl9nZXRBdXRoZW50aWNhdG9yQXNzdXJhbmNlTGV2ZWwuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHdlYmF1dGhuOiBuZXcgV2ViQXV0aG5BcGkodGhpcyksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub2F1dGggPSB7XG4gICAgICAgICAgICBnZXRBdXRob3JpemF0aW9uRGV0YWlsczogdGhpcy5fZ2V0QXV0aG9yaXphdGlvbkRldGFpbHMuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGFwcHJvdmVBdXRob3JpemF0aW9uOiB0aGlzLl9hcHByb3ZlQXV0aG9yaXphdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZGVueUF1dGhvcml6YXRpb246IHRoaXMuX2RlbnlBdXRob3JpemF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgICAgICBsaXN0R3JhbnRzOiB0aGlzLl9saXN0T0F1dGhHcmFudHMuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJldm9rZUdyYW50OiB0aGlzLl9yZXZva2VPQXV0aEdyYW50LmJpbmQodGhpcyksXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnBlcnNpc3RTZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc3RvcmFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZSA9IHNldHRpbmdzLnN0b3JhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UgPSBnbG9iYWxUaGlzLmxvY2FsU3RvcmFnZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UgPSBtZW1vcnlMb2NhbFN0b3JhZ2VBZGFwdGVyKHRoaXMubWVtb3J5U3RvcmFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLnVzZXJTdG9yYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyU3RvcmFnZSA9IHNldHRpbmdzLnVzZXJTdG9yYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlID0ge307XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2UgPSBtZW1vcnlMb2NhbFN0b3JhZ2VBZGFwdGVyKHRoaXMubWVtb3J5U3RvcmFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQnJvd3NlcigpICYmIGdsb2JhbFRoaXMuQnJvYWRjYXN0Q2hhbm5lbCAmJiB0aGlzLnBlcnNpc3RTZXNzaW9uICYmIHRoaXMuc3RvcmFnZUtleSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwgPSBuZXcgZ2xvYmFsVGhpcy5Ccm9hZGNhc3RDaGFubmVsKHRoaXMuc3RvcmFnZUtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYSBuZXcgQnJvYWRjYXN0Q2hhbm5lbCwgbXVsdGktdGFiIHN0YXRlIGNoYW5nZXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoX2MgPSB0aGlzLmJyb2FkY2FzdENoYW5uZWwpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJ3JlY2VpdmVkIGJyb2FkY2FzdCBub3RpZmljYXRpb24gZnJvbSBvdGhlciB0YWIgb3IgY2xpZW50JywgZXZlbnQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKGV2ZW50LmRhdGEuZXZlbnQsIGV2ZW50LmRhdGEuc2Vzc2lvbiwgZmFsc2UpOyAvLyBicm9hZGNhc3QgPSBmYWxzZSBzbyB3ZSBkb24ndCBnZXQgYW4gZW5kbGVzcyBsb29wIG9mIG1lc3NhZ2VzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIGVycm9yIHRocm93aW5nIG1vZGUgaXMgZW5hYmxlZCBmb3IgdGhpcyBjbGllbnQuXG4gICAgICovXG4gICAgaXNUaHJvd09uRXJyb3JFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHJvd09uRXJyb3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENlbnRyYWxpemVzIHJldHVybiBoYW5kbGluZyB3aXRoIG9wdGlvbmFsIGVycm9yIHRocm93aW5nLiBXaGVuIGB0aHJvd09uRXJyb3JgIGlzIGVuYWJsZWRcbiAgICAgKiBhbmQgdGhlIHByb3ZpZGVkIHJlc3VsdCBjb250YWlucyBhIG5vbi1udWxsaXNoIGVycm9yLCB0aGUgZXJyb3IgaXMgdGhyb3duIGluc3RlYWQgb2ZcbiAgICAgKiBiZWluZyByZXR1cm5lZC4gVGhpcyBlbnN1cmVzIGNvbnNpc3RlbnQgYmVoYXZpb3IgYWNyb3NzIGFsbCBwdWJsaWMgQVBJIG1ldGhvZHMuXG4gICAgICovXG4gICAgX3JldHVyblJlc3VsdChyZXN1bHQpIHtcbiAgICAgICAgaWYgKHRoaXMudGhyb3dPbkVycm9yICYmIHJlc3VsdCAmJiByZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBfbG9nUHJlZml4KCkge1xuICAgICAgICByZXR1cm4gKCdHb1RydWVDbGllbnRAJyArXG4gICAgICAgICAgICBgJHt0aGlzLnN0b3JhZ2VLZXl9OiR7dGhpcy5pbnN0YW5jZUlEfSAoJHt2ZXJzaW9ufSkgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgfVxuICAgIF9kZWJ1ZyguLi5hcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ0RlYnVnTWVzc2FnZXMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyKHRoaXMuX2xvZ1ByZWZpeCgpLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgdGhlIGNsaWVudCBzZXNzaW9uIGVpdGhlciBmcm9tIHRoZSB1cmwgb3IgZnJvbSBzdG9yYWdlLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgY2xpZW50LCBidXQgc2hvdWxkIGFsc28gYmUgY2FsbGVkXG4gICAgICogbWFudWFsbHkgd2hlbiBjaGVja2luZyBmb3IgYW4gZXJyb3IgZnJvbSBhbiBhdXRoIHJlZGlyZWN0IChvYXV0aCwgbWFnaWNsaW5rLCBwYXNzd29yZCByZWNvdmVyeSwgZXRjKS5cbiAgICAgKi9cbiAgICBhc3luYyBpbml0aWFsaXplKCkge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0aWFsaXplUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faW5pdGlhbGl6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJTVBPUlRBTlQ6XG4gICAgICogMS4gTmV2ZXIgdGhyb3cgaW4gdGhpcyBtZXRob2QsIGFzIGl0IGlzIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvclxuICAgICAqIDIuIE5ldmVyIHJldHVybiBhIHNlc3Npb24gZnJvbSB0aGlzIG1ldGhvZCBhcyBpdCB3b3VsZCBiZSBjYWNoZWQgb3ZlclxuICAgICAqICAgIHRoZSB3aG9sZSBsaWZldGltZSBvZiB0aGUgY2xpZW50XG4gICAgICovXG4gICAgYXN5bmMgX2luaXRpYWxpemUoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIGxldCBjYWxsYmFja1VybFR5cGUgPSAnbm9uZSc7XG4gICAgICAgICAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJzZVBhcmFtZXRlcnNGcm9tVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNJbXBsaWNpdEdyYW50Q2FsbGJhY2socGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1VybFR5cGUgPSAnaW1wbGljaXQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhd2FpdCB0aGlzLl9pc1BLQ0VDYWxsYmFjayhwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrVXJsVHlwZSA9ICdwa2NlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEF0dGVtcHQgdG8gZ2V0IHRoZSBzZXNzaW9uIGZyb20gdGhlIFVSTCBvbmx5IGlmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZFxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIE5vdGU6IElmIHRoZSBVUkwgaXNuJ3Qgb25lIG9mIHRoZSBjYWxsYmFjayB1cmwgdHlwZXMgKGltcGxpY2l0IG9yIHBrY2UpLFxuICAgICAgICAgICAgICogdGhlbiB0aGVyZSBjb3VsZCBiZSBhbiBleGlzdGluZyBzZXNzaW9uIHNvIHdlIGRvbid0IHdhbnQgdG8gcHJlbWF0dXJlbHkgcmVtb3ZlIGl0XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChpc0Jyb3dzZXIoKSAmJiB0aGlzLmRldGVjdFNlc3Npb25JblVybCAmJiBjYWxsYmFja1VybFR5cGUgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX2dldFNlc3Npb25Gcm9tVVJMKHBhcmFtcywgY2FsbGJhY2tVcmxUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfaW5pdGlhbGl6ZSgpJywgJ2Vycm9yIGRldGVjdGluZyBzZXNzaW9uIGZyb20gVVJMJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSAoX2EgPSBlcnJvci5kZXRhaWxzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdpZGVudGl0eV9hbHJlYWR5X2V4aXN0cycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPT09ICdpZGVudGl0eV9ub3RfZm91bmQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID09PSAnc2luZ2xlX2lkZW50aXR5X25vdF9kZWxldGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3IgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgbG9naW4gYXR0ZW1wdCB2aWEgdXJsLFxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgb2xkIHNlc3Npb24gYXMgaW4gdmVyaWZ5T3RwLCBzaWduVXAgYW5kIHNpZ25JbldpdGgqXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlbW92ZVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3IgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzZXNzaW9uLCByZWRpcmVjdFR5cGUgfSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfaW5pdGlhbGl6ZSgpJywgJ2RldGVjdGVkIHNlc3Npb24gaW4gVVJMJywgc2Vzc2lvbiwgJ3JlZGlyZWN0IHR5cGUnLCByZWRpcmVjdFR5cGUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RUeXBlID09PSAncmVjb3ZlcnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnUEFTU1dPUkRfUkVDT1ZFUlknLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBubyBsb2dpbiBhdHRlbXB0IHZpYSBjYWxsYmFjayB1cmwgdHJ5IHRvIHJlY292ZXIgc2Vzc2lvbiBmcm9tIHN0b3JhZ2VcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlY292ZXJBbmRSZWZyZXNoKCk7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoe1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24nLCBlcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2luaXRpYWxpemUoKScsICdlbmQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGFub255bW91cyB1c2VyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBzZXNzaW9uIHdoZXJlIHRoZSBpc19hbm9ueW1vdXMgY2xhaW0gaW4gdGhlIGFjY2VzcyB0b2tlbiBKV1Qgc2V0IHRvIHRydWVcbiAgICAgKi9cbiAgICBhc3luYyBzaWduSW5Bbm9ueW1vdXNseShjcmVkZW50aWFscykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L3NpZ251cGAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiAoX2IgPSAoX2EgPSBjcmVkZW50aWFscyA9PT0gbnVsbCB8fCBjcmVkZW50aWFscyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRhdGEpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9LFxuICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiAoX2MgPSBjcmVkZW50aWFscyA9PT0gbnVsbCB8fCBjcmVkZW50aWFscyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeGZvcm06IF9zZXNzaW9uUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IHJlcztcbiAgICAgICAgICAgIGlmIChlcnJvciB8fCAhZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3I6IGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGRhdGEuc2Vzc2lvbjtcbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBkYXRhLnVzZXI7XG4gICAgICAgICAgICBpZiAoZGF0YS5zZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnU0lHTkVEX0lOJywgc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHVzZXIuXG4gICAgICpcbiAgICAgKiBCZSBhd2FyZSB0aGF0IGlmIGEgdXNlciBhY2NvdW50IGV4aXN0cyBpbiB0aGUgc3lzdGVtIHlvdSBtYXkgZ2V0IGJhY2sgYW5cbiAgICAgKiBlcnJvciBtZXNzYWdlIHRoYXQgYXR0ZW1wdHMgdG8gaGlkZSB0aGlzIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuXG4gICAgICogVGhpcyBtZXRob2QgaGFzIHN1cHBvcnQgZm9yIFBLQ0UgdmlhIGVtYWlsIHNpZ251cHMuIFRoZSBQS0NFIGZsb3cgY2Fubm90IGJlIHVzZWQgd2hlbiBhdXRvY29uZmlybSBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBsb2dnZWQtaW4gc2Vzc2lvbiBpZiB0aGUgc2VydmVyIGhhcyBcImF1dG9jb25maXJtXCIgT05cbiAgICAgKiBAcmV0dXJucyBBIHVzZXIgaWYgdGhlIHNlcnZlciBoYXMgXCJhdXRvY29uZmlybVwiIE9GRlxuICAgICAqL1xuICAgIGFzeW5jIHNpZ25VcChjcmVkZW50aWFscykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXM7XG4gICAgICAgICAgICBpZiAoJ2VtYWlsJyBpbiBjcmVkZW50aWFscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZW1haWwsIHBhc3N3b3JkLCBvcHRpb25zIH0gPSBjcmVkZW50aWFscztcbiAgICAgICAgICAgICAgICBsZXQgY29kZUNoYWxsZW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2VNZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgICAgICBbY29kZUNoYWxsZW5nZSwgY29kZUNoYWxsZW5nZU1ldGhvZF0gPSBhd2FpdCBnZXRDb2RlQ2hhbGxlbmdlQW5kTWV0aG9kKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vc2lnbnVwYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5lbWFpbFJlZGlyZWN0VG8sXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGF0YSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY2FwdGNoYVRva2VuIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2NoYWxsZW5nZTogY29kZUNoYWxsZW5nZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfY2hhbGxlbmdlX21ldGhvZDogY29kZUNoYWxsZW5nZU1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeGZvcm06IF9zZXNzaW9uUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgncGhvbmUnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwaG9uZSwgcGFzc3dvcmQsIG9wdGlvbnMgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L3NpZ251cGAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRhdGEpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogKF9jID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNoYW5uZWwpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6ICdzbXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlciBhbmQgYSBwYXNzd29yZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzO1xuICAgICAgICAgICAgaWYgKGVycm9yIHx8ICFkYXRhKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvcjogZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gZGF0YS5zZXNzaW9uO1xuICAgICAgICAgICAgY29uc3QgdXNlciA9IGRhdGEudXNlcjtcbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGluIGFuIGV4aXN0aW5nIHVzZXIgd2l0aCBhbiBlbWFpbCBhbmQgcGFzc3dvcmQgb3IgcGhvbmUgYW5kIHBhc3N3b3JkLlxuICAgICAqXG4gICAgICogQmUgYXdhcmUgdGhhdCB5b3UgbWF5IGdldCBiYWNrIGFuIGVycm9yIG1lc3NhZ2UgdGhhdCB3aWxsIG5vdCBkaXN0aW5ndWlzaFxuICAgICAqIGJldHdlZW4gdGhlIGNhc2VzIHdoZXJlIHRoZSBhY2NvdW50IGRvZXMgbm90IGV4aXN0IG9yIHRoYXQgdGhlXG4gICAgICogZW1haWwvcGhvbmUgYW5kIHBhc3N3b3JkIGNvbWJpbmF0aW9uIGlzIHdyb25nIG9yIHRoYXQgdGhlIGFjY291bnQgY2FuIG9ubHlcbiAgICAgKiBiZSBhY2Nlc3NlZCB2aWEgc29jaWFsIGxvZ2luLlxuICAgICAqL1xuICAgIGFzeW5jIHNpZ25JbldpdGhQYXNzd29yZChjcmVkZW50aWFscykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlcztcbiAgICAgICAgICAgIGlmICgnZW1haWwnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlbWFpbCwgcGFzc3dvcmQsIG9wdGlvbnMgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L3Rva2VuP2dyYW50X3R5cGU9cGFzc3dvcmRgLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeGZvcm06IF9zZXNzaW9uUmVzcG9uc2VQYXNzd29yZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCdwaG9uZScgaW4gY3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHBob25lLCBwYXNzd29yZCwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT1wYXNzd29yZGAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZVBhc3N3b3JkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvcignWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyIGFuZCBhIHBhc3N3b3JkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSByZXM7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWRhdGEgfHwgIWRhdGEuc2Vzc2lvbiB8fCAhZGF0YS51c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52YWxpZFRva2VuRXJyb3IgPSBuZXcgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBpbnZhbGlkVG9rZW5FcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7IHVzZXI6IGRhdGEudXNlciwgc2Vzc2lvbjogZGF0YS5zZXNzaW9uIH0sIChkYXRhLndlYWtfcGFzc3dvcmQgPyB7IHdlYWtQYXNzd29yZDogZGF0YS53ZWFrX3Bhc3N3b3JkIH0gOiBudWxsKSksXG4gICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGluIGFuIGV4aXN0aW5nIHVzZXIgdmlhIGEgdGhpcmQtcGFydHkgcHJvdmlkZXIuXG4gICAgICogVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIFBLQ0UgZmxvdy5cbiAgICAgKi9cbiAgICBhc3luYyBzaWduSW5XaXRoT0F1dGgoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faGFuZGxlUHJvdmlkZXJTaWduSW4oY3JlZGVudGlhbHMucHJvdmlkZXIsIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VG86IChfYSA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWRpcmVjdFRvLFxuICAgICAgICAgICAgc2NvcGVzOiAoX2IgPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc2NvcGVzLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IChfYyA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIHNraXBCcm93c2VyUmVkaXJlY3Q6IChfZCA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5za2lwQnJvd3NlclJlZGlyZWN0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGluIGFuIGV4aXN0aW5nIHVzZXIgYnkgZXhjaGFuZ2luZyBhbiBBdXRoIENvZGUgaXNzdWVkIGR1cmluZyB0aGUgUEtDRSBmbG93LlxuICAgICAqL1xuICAgIGFzeW5jIGV4Y2hhbmdlQ29kZUZvclNlc3Npb24oYXV0aENvZGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhjaGFuZ2VDb2RlRm9yU2Vzc2lvbihhdXRoQ29kZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaWducyBpbiBhIHVzZXIgYnkgdmVyaWZ5aW5nIGEgbWVzc2FnZSBzaWduZWQgYnkgdGhlIHVzZXIncyBwcml2YXRlIGtleS5cbiAgICAgKiBTdXBwb3J0cyBFdGhlcmV1bSAodmlhIFNpZ24tSW4tV2l0aC1FdGhlcmV1bSkgJiBTb2xhbmEgKFNpZ24tSW4tV2l0aC1Tb2xhbmEpIHN0YW5kYXJkcyxcbiAgICAgKiBib3RoIG9mIHdoaWNoIGRlcml2ZSBmcm9tIHRoZSBFSVAtNDM2MSBzdGFuZGFyZFxuICAgICAqIFdpdGggc2xpZ2h0IHZhcmlhdGlvbiBvbiBTb2xhbmEncyBzaWRlLlxuICAgICAqIEByZWZlcmVuY2UgaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBTL2VpcC00MzYxXG4gICAgICovXG4gICAgYXN5bmMgc2lnbkluV2l0aFdlYjMoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3QgeyBjaGFpbiB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgIHN3aXRjaCAoY2hhaW4pIHtcbiAgICAgICAgICAgIGNhc2UgJ2V0aGVyZXVtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduSW5XaXRoRXRoZXJldW0oY3JlZGVudGlhbHMpO1xuICAgICAgICAgICAgY2FzZSAnc29sYW5hJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduSW5XaXRoU29sYW5hKGNyZWRlbnRpYWxzKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogVW5zdXBwb3J0ZWQgY2hhaW4gXCIke2NoYWlufVwiYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2lnbkluV2l0aEV0aGVyZXVtKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2w7XG4gICAgICAgIC8vIFRPRE86IGZsYXR0ZW4gdHlwZVxuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgbGV0IHNpZ25hdHVyZTtcbiAgICAgICAgaWYgKCdtZXNzYWdlJyBpbiBjcmVkZW50aWFscykge1xuICAgICAgICAgICAgbWVzc2FnZSA9IGNyZWRlbnRpYWxzLm1lc3NhZ2U7XG4gICAgICAgICAgICBzaWduYXR1cmUgPSBjcmVkZW50aWFscy5zaWduYXR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGNoYWluLCB3YWxsZXQsIHN0YXRlbWVudCwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICBsZXQgcmVzb2x2ZWRXYWxsZXQ7XG4gICAgICAgICAgICBpZiAoIWlzQnJvd3NlcigpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3YWxsZXQgIT09ICdvYmplY3QnIHx8ICEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc3VwYWJhc2UvYXV0aC1qczogQm90aCB3YWxsZXQgYW5kIHVybCBtdXN0IGJlIHNwZWNpZmllZCBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmVkV2FsbGV0ID0gd2FsbGV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHdhbGxldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlZFdhbGxldCA9IHdhbGxldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvd0FueSA9IHdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoJ2V0aGVyZXVtJyBpbiB3aW5kb3dBbnkgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHdpbmRvd0FueS5ldGhlcmV1bSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgJ3JlcXVlc3QnIGluIHdpbmRvd0FueS5ldGhlcmV1bSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygd2luZG93QW55LmV0aGVyZXVtLnJlcXVlc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRXYWxsZXQgPSB3aW5kb3dBbnkuZXRoZXJldW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBObyBjb21wYXRpYmxlIEV0aGVyZXVtIHdhbGxldCBpbnRlcmZhY2Ugb24gdGhlIHdpbmRvdyBvYmplY3QgKHdpbmRvdy5ldGhlcmV1bSkgZGV0ZWN0ZWQuIE1ha2Ugc3VyZSB0aGUgdXNlciBhbHJlYWR5IGhhcyBhIHdhbGxldCBpbnN0YWxsZWQgYW5kIGNvbm5lY3RlZCBmb3IgdGhpcyBhcHAuIFByZWZlciBwYXNzaW5nIHRoZSB3YWxsZXQgaW50ZXJmYWNlIG9iamVjdCBkaXJlY3RseSB0byBzaWduSW5XaXRoV2ViMyh7IGNoYWluOiAnZXRoZXJldW0nLCB3YWxsZXQ6IHJlc29sdmVkVXNlcldhbGxldCB9KSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnVybCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCByZXNvbHZlZFdhbGxldFxuICAgICAgICAgICAgICAgIC5yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdldGhfcmVxdWVzdEFjY291bnRzJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKGFjY3MpID0+IGFjY3MpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBXYWxsZXQgbWV0aG9kIGV0aF9yZXF1ZXN0QWNjb3VudHMgaXMgbWlzc2luZyBvciBpbnZhbGlkYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghYWNjb3VudHMgfHwgYWNjb3VudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogTm8gYWNjb3VudHMgYXZhaWxhYmxlLiBQbGVhc2UgZW5zdXJlIHRoZSB3YWxsZXQgaXMgY29ubmVjdGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9IGdldEFkZHJlc3MoYWNjb3VudHNbMF0pO1xuICAgICAgICAgICAgbGV0IGNoYWluSWQgPSAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aEV0aGVyZXVtKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2hhaW5JZDtcbiAgICAgICAgICAgIGlmICghY2hhaW5JZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYWluSWRIZXggPSBhd2FpdCByZXNvbHZlZFdhbGxldC5yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnZXRoX2NoYWluSWQnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNoYWluSWQgPSBmcm9tSGV4KGNoYWluSWRIZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2l3ZU1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAgZG9tYWluOiB1cmwuaG9zdCxcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDogc3RhdGVtZW50LFxuICAgICAgICAgICAgICAgIHVyaTogdXJsLmhyZWYsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogJzEnLFxuICAgICAgICAgICAgICAgIGNoYWluSWQ6IGNoYWluSWQsXG4gICAgICAgICAgICAgICAgbm9uY2U6IChfYyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoRXRoZXJldW0pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5ub25jZSxcbiAgICAgICAgICAgICAgICBpc3N1ZWRBdDogKF9lID0gKF9kID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhFdGhlcmV1bSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmlzc3VlZEF0KSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGV4cGlyYXRpb25UaW1lOiAoX2YgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aEV0aGVyZXVtKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YuZXhwaXJhdGlvblRpbWUsXG4gICAgICAgICAgICAgICAgbm90QmVmb3JlOiAoX2cgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aEV0aGVyZXVtKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cubm90QmVmb3JlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogKF9oID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhFdGhlcmV1bSkgPT09IG51bGwgfHwgX2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9oLnJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IChfaiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoRXRoZXJldW0pID09PSBudWxsIHx8IF9qID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfai5yZXNvdXJjZXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWVzc2FnZSA9IGNyZWF0ZVNpd2VNZXNzYWdlKHNpd2VNZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIFNpZ24gbWVzc2FnZVxuICAgICAgICAgICAgc2lnbmF0dXJlID0gKGF3YWl0IHJlc29sdmVkV2FsbGV0LnJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ3BlcnNvbmFsX3NpZ24nLFxuICAgICAgICAgICAgICAgIHBhcmFtczogW3RvSGV4KG1lc3NhZ2UpLCBhZGRyZXNzXSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT13ZWIzYCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiBPYmplY3QuYXNzaWduKHsgY2hhaW46ICdldGhlcmV1bScsIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSB9LCAoKChfayA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9rID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfay5jYXB0Y2hhVG9rZW4pXG4gICAgICAgICAgICAgICAgICAgID8geyBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiAoX2wgPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2wuY2FwdGNoYVRva2VuIH0gfVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwpKSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEuc2Vzc2lvbiB8fCAhZGF0YS51c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52YWxpZFRva2VuRXJyb3IgPSBuZXcgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBpbnZhbGlkVG9rZW5FcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpLCBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2lnbkluV2l0aFNvbGFuYShjcmVkZW50aWFscykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbTtcbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIGxldCBzaWduYXR1cmU7XG4gICAgICAgIGlmICgnbWVzc2FnZScgaW4gY3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBjcmVkZW50aWFscy5tZXNzYWdlO1xuICAgICAgICAgICAgc2lnbmF0dXJlID0gY3JlZGVudGlhbHMuc2lnbmF0dXJlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBjaGFpbiwgd2FsbGV0LCBzdGF0ZW1lbnQsIG9wdGlvbnMgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgbGV0IHJlc29sdmVkV2FsbGV0O1xuICAgICAgICAgICAgaWYgKCFpc0Jyb3dzZXIoKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2FsbGV0ICE9PSAnb2JqZWN0JyB8fCAhKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy51cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQHN1cGFiYXNlL2F1dGgtanM6IEJvdGggd2FsbGV0IGFuZCB1cmwgbXVzdCBiZSBzcGVjaWZpZWQgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlZFdhbGxldCA9IHdhbGxldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB3YWxsZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRXYWxsZXQgPSB3YWxsZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3dBbnkgPSB3aW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCdzb2xhbmEnIGluIHdpbmRvd0FueSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygd2luZG93QW55LnNvbGFuYSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgKCgnc2lnbkluJyBpbiB3aW5kb3dBbnkuc29sYW5hICYmIHR5cGVvZiB3aW5kb3dBbnkuc29sYW5hLnNpZ25JbiA9PT0gJ2Z1bmN0aW9uJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICgnc2lnbk1lc3NhZ2UnIGluIHdpbmRvd0FueS5zb2xhbmEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygd2luZG93QW55LnNvbGFuYS5zaWduTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkV2FsbGV0ID0gd2luZG93QW55LnNvbGFuYTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IE5vIGNvbXBhdGlibGUgU29sYW5hIHdhbGxldCBpbnRlcmZhY2Ugb24gdGhlIHdpbmRvdyBvYmplY3QgKHdpbmRvdy5zb2xhbmEpIGRldGVjdGVkLiBNYWtlIHN1cmUgdGhlIHVzZXIgYWxyZWFkeSBoYXMgYSB3YWxsZXQgaW5zdGFsbGVkIGFuZCBjb25uZWN0ZWQgZm9yIHRoaXMgYXBwLiBQcmVmZXIgcGFzc2luZyB0aGUgd2FsbGV0IGludGVyZmFjZSBvYmplY3QgZGlyZWN0bHkgdG8gc2lnbkluV2l0aFdlYjMoeyBjaGFpbjogJ3NvbGFuYScsIHdhbGxldDogcmVzb2x2ZWRVc2VyV2FsbGV0IH0pIGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCgoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudXJsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgICBpZiAoJ3NpZ25JbicgaW4gcmVzb2x2ZWRXYWxsZXQgJiYgcmVzb2x2ZWRXYWxsZXQuc2lnbkluKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcmVzb2x2ZWRXYWxsZXQuc2lnbkluKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgaXNzdWVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9LCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aFNvbGFuYSksIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1vdmVycmlkYWJsZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICcxJywgZG9tYWluOiB1cmwuaG9zdCwgdXJpOiB1cmwuaHJlZiB9KSwgKHN0YXRlbWVudCA/IHsgc3RhdGVtZW50IH0gOiBudWxsKSkpO1xuICAgICAgICAgICAgICAgIGxldCBvdXRwdXRUb1Byb2Nlc3M7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3V0cHV0KSAmJiBvdXRwdXRbMF0gJiYgdHlwZW9mIG91dHB1dFswXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0VG9Qcm9jZXNzID0gb3V0cHV0WzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvdXRwdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG91dHB1dCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25lZE1lc3NhZ2UnIGluIG91dHB1dCAmJlxuICAgICAgICAgICAgICAgICAgICAnc2lnbmF0dXJlJyBpbiBvdXRwdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0VG9Qcm9jZXNzID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc3VwYWJhc2UvYXV0aC1qczogV2FsbGV0IG1ldGhvZCBzaWduSW4oKSByZXR1cm5lZCB1bnJlY29nbml6ZWQgdmFsdWUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCdzaWduZWRNZXNzYWdlJyBpbiBvdXRwdXRUb1Byb2Nlc3MgJiZcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25hdHVyZScgaW4gb3V0cHV0VG9Qcm9jZXNzICYmXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2Ygb3V0cHV0VG9Qcm9jZXNzLnNpZ25lZE1lc3NhZ2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUb1Byb2Nlc3Muc2lnbmVkTWVzc2FnZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpICYmXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFRvUHJvY2Vzcy5zaWduYXR1cmUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG91dHB1dFRvUHJvY2Vzcy5zaWduZWRNZXNzYWdlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3V0cHV0VG9Qcm9jZXNzLnNpZ25lZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShvdXRwdXRUb1Byb2Nlc3Muc2lnbmVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IG91dHB1dFRvUHJvY2Vzcy5zaWduYXR1cmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BzdXBhYmFzZS9hdXRoLWpzOiBXYWxsZXQgbWV0aG9kIHNpZ25JbigpIEFQSSByZXR1cm5lZCBvYmplY3Qgd2l0aG91dCBzaWduZWRNZXNzYWdlIGFuZCBzaWduYXR1cmUgZmllbGRzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoJ3NpZ25NZXNzYWdlJyBpbiByZXNvbHZlZFdhbGxldCkgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc29sdmVkV2FsbGV0LnNpZ25NZXNzYWdlICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICAgICAgICAgICEoJ3B1YmxpY0tleScgaW4gcmVzb2x2ZWRXYWxsZXQpIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXNvbHZlZFdhbGxldCAhPT0gJ29iamVjdCcgfHxcbiAgICAgICAgICAgICAgICAgICAgIXJlc29sdmVkV2FsbGV0LnB1YmxpY0tleSB8fFxuICAgICAgICAgICAgICAgICAgICAhKCd0b0Jhc2U1OCcgaW4gcmVzb2x2ZWRXYWxsZXQucHVibGljS2V5KSB8fFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzb2x2ZWRXYWxsZXQucHVibGljS2V5LnRvQmFzZTU4ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQHN1cGFiYXNlL2F1dGgtanM6IFdhbGxldCBkb2VzIG5vdCBoYXZlIGEgY29tcGF0aWJsZSBzaWduTWVzc2FnZSgpIGFuZCBwdWJsaWNLZXkudG9CYXNlNTgoKSBBUEknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFtcbiAgICAgICAgICAgICAgICAgICAgYCR7dXJsLmhvc3R9IHdhbnRzIHlvdSB0byBzaWduIGluIHdpdGggeW91ciBTb2xhbmEgYWNjb3VudDpgLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFdhbGxldC5wdWJsaWNLZXkudG9CYXNlNTgoKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKHN0YXRlbWVudCA/IFsnJywgc3RhdGVtZW50LCAnJ10gOiBbJyddKSxcbiAgICAgICAgICAgICAgICAgICAgJ1ZlcnNpb246IDEnLFxuICAgICAgICAgICAgICAgICAgICBgVVJJOiAke3VybC5ocmVmfWAsXG4gICAgICAgICAgICAgICAgICAgIGBJc3N1ZWQgQXQ6ICR7KF9jID0gKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pc3N1ZWRBdCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpfWAsXG4gICAgICAgICAgICAgICAgICAgIC4uLigoKF9kID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5ub3RCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtgTm90IEJlZm9yZTogJHtvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEubm90QmVmb3JlfWBdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKCgoX2UgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aFNvbGFuYSkgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLmV4cGlyYXRpb25UaW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbYEV4cGlyYXRpb24gVGltZTogJHtvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEuZXhwaXJhdGlvblRpbWV9YF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oKChfZiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoU29sYW5hKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YuY2hhaW5JZClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW2BDaGFpbiBJRDogJHtvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEuY2hhaW5JZH1gXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgICAgIC4uLigoKF9nID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEpID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5ub25jZSkgPyBbYE5vbmNlOiAke29wdGlvbnMuc2lnbkluV2l0aFNvbGFuYS5ub25jZX1gXSA6IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKCgoX2ggPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aFNvbGFuYSkgPT09IG51bGwgfHwgX2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9oLnJlcXVlc3RJZClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW2BSZXF1ZXN0IElEOiAke29wdGlvbnMuc2lnbkluV2l0aFNvbGFuYS5yZXF1ZXN0SWR9YF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oKChfayA9IChfaiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoU29sYW5hKSA9PT0gbnVsbCB8fCBfaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2oucmVzb3VyY2VzKSA9PT0gbnVsbCB8fCBfayA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2subGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Jlc291cmNlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5zaWduSW5XaXRoU29sYW5hLnJlc291cmNlcy5tYXAoKHJlc291cmNlKSA9PiBgLSAke3Jlc291cmNlfWApLFxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXliZVNpZ25hdHVyZSA9IGF3YWl0IHJlc29sdmVkV2FsbGV0LnNpZ25NZXNzYWdlKG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShtZXNzYWdlKSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1heWJlU2lnbmF0dXJlIHx8ICEobWF5YmVTaWduYXR1cmUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BzdXBhYmFzZS9hdXRoLWpzOiBXYWxsZXQgc2lnbk1lc3NhZ2UoKSBBUEkgcmV0dXJuZWQgYW4gcmVjb2duaXplZCB2YWx1ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzaWduYXR1cmUgPSBtYXliZVNpZ25hdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT13ZWIzYCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiBPYmplY3QuYXNzaWduKHsgY2hhaW46ICdzb2xhbmEnLCBtZXNzYWdlLCBzaWduYXR1cmU6IGJ5dGVzVG9CYXNlNjRVUkwoc2lnbmF0dXJlKSB9LCAoKChfbCA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9sID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbC5jYXB0Y2hhVG9rZW4pXG4gICAgICAgICAgICAgICAgICAgID8geyBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiAoX20gPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX20uY2FwdGNoYVRva2VuIH0gfVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwpKSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEuc2Vzc2lvbiB8fCAhZGF0YS51c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52YWxpZFRva2VuRXJyb3IgPSBuZXcgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBpbnZhbGlkVG9rZW5FcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpLCBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX2V4Y2hhbmdlQ29kZUZvclNlc3Npb24oYXV0aENvZGUpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBhd2FpdCBnZXRJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgY29uc3QgW2NvZGVWZXJpZmllciwgcmVkaXJlY3RUeXBlXSA9IChzdG9yYWdlSXRlbSAhPT0gbnVsbCAmJiBzdG9yYWdlSXRlbSAhPT0gdm9pZCAwID8gc3RvcmFnZUl0ZW0gOiAnJykuc3BsaXQoJy8nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghY29kZVZlcmlmaWVyICYmIHRoaXMuZmxvd1R5cGUgPT09ICdwa2NlJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT1wa2NlYCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgIGF1dGhfY29kZTogYXV0aENvZGUsXG4gICAgICAgICAgICAgICAgICAgIGNvZGVfdmVyaWZpZXI6IGNvZGVWZXJpZmllcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfc2Vzc2lvblJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLnNlc3Npb24gfHwgIWRhdGEudXNlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludmFsaWRUb2tlbkVycm9yID0gbmV3IEF1dGhJbnZhbGlkVG9rZW5SZXNwb25zZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCwgcmVkaXJlY3RUeXBlOiBudWxsIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBpbnZhbGlkVG9rZW5FcnJvcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0YSksIHsgcmVkaXJlY3RUeXBlOiByZWRpcmVjdFR5cGUgIT09IG51bGwgJiYgcmVkaXJlY3RUeXBlICE9PSB2b2lkIDAgPyByZWRpcmVjdFR5cGUgOiBudWxsIH0pLCBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwsIHJlZGlyZWN0VHlwZTogbnVsbCB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93cyBzaWduaW5nIGluIHdpdGggYW4gT0lEQyBJRCB0b2tlbi4gVGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIHVzZWRcbiAgICAgKiBzaG91bGQgYmUgZW5hYmxlZCBhbmQgY29uZmlndXJlZC5cbiAgICAgKi9cbiAgICBhc3luYyBzaWduSW5XaXRoSWRUb2tlbihjcmVkZW50aWFscykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBvcHRpb25zLCBwcm92aWRlciwgdG9rZW4sIGFjY2Vzc190b2tlbiwgbm9uY2UgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT1pZF90b2tlbmAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlcixcbiAgICAgICAgICAgICAgICAgICAgaWRfdG9rZW46IHRva2VuLFxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIG5vbmNlLFxuICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY2FwdGNoYVRva2VuIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFkYXRhIHx8ICFkYXRhLnNlc3Npb24gfHwgIWRhdGEudXNlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludmFsaWRUb2tlbkVycm9yID0gbmV3IEF1dGhJbnZhbGlkVG9rZW5SZXNwb25zZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvcjogaW52YWxpZFRva2VuRXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS5zZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnU0lHTkVEX0lOJywgZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhLCBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGluIGEgdXNlciB1c2luZyBtYWdpY2xpbmsgb3IgYSBvbmUtdGltZSBwYXNzd29yZCAoT1RQKS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBge3sgLkNvbmZpcm1hdGlvblVSTCB9fWAgdmFyaWFibGUgaXMgc3BlY2lmaWVkIGluIHRoZSBlbWFpbCB0ZW1wbGF0ZSwgYSBtYWdpY2xpbmsgd2lsbCBiZSBzZW50LlxuICAgICAqIElmIHRoZSBge3sgLlRva2VuIH19YCB2YXJpYWJsZSBpcyBzcGVjaWZpZWQgaW4gdGhlIGVtYWlsIHRlbXBsYXRlLCBhbiBPVFAgd2lsbCBiZSBzZW50LlxuICAgICAqIElmIHlvdSdyZSB1c2luZyBwaG9uZSBzaWduLWlucywgb25seSBhbiBPVFAgd2lsbCBiZSBzZW50LiBZb3Ugd29uJ3QgYmUgYWJsZSB0byBzZW5kIGEgbWFnaWNsaW5rIGZvciBwaG9uZSBzaWduLWlucy5cbiAgICAgKlxuICAgICAqIEJlIGF3YXJlIHRoYXQgeW91IG1heSBnZXQgYmFjayBhbiBlcnJvciBtZXNzYWdlIHRoYXQgd2lsbCBub3QgZGlzdGluZ3Vpc2hcbiAgICAgKiBiZXR3ZWVuIHRoZSBjYXNlcyB3aGVyZSB0aGUgYWNjb3VudCBkb2VzIG5vdCBleGlzdCBvciwgdGhhdCB0aGUgYWNjb3VudFxuICAgICAqIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIHZpYSBzb2NpYWwgbG9naW4uXG4gICAgICpcbiAgICAgKiBEbyBub3RlIHRoYXQgeW91IHdpbGwgbmVlZCB0byBjb25maWd1cmUgYSBXaGF0c2FwcCBzZW5kZXIgb24gVHdpbGlvXG4gICAgICogaWYgeW91IGFyZSB1c2luZyBwaG9uZSBzaWduIGluIHdpdGggdGhlICd3aGF0c2FwcCcgY2hhbm5lbC4gVGhlIHdoYXRzYXBwXG4gICAgICogY2hhbm5lbCBpcyBub3Qgc3VwcG9ydGVkIG9uIG90aGVyIHByb3ZpZGVyc1xuICAgICAqIGF0IHRoaXMgdGltZS5cbiAgICAgKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyBQS0NFIHdoZW4gYW4gZW1haWwgaXMgcGFzc2VkLlxuICAgICAqL1xuICAgIGFzeW5jIHNpZ25JbldpdGhPdHAoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICgnZW1haWwnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlbWFpbCwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBjb2RlQ2hhbGxlbmdlTWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mbG93VHlwZSA9PT0gJ3BrY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAgICAgW2NvZGVDaGFsbGVuZ2UsIGNvZGVDaGFsbGVuZ2VNZXRob2RdID0gYXdhaXQgZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZCh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L290cGAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kYXRhKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV91c2VyOiAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2hvdWxkQ3JlYXRlVXNlcikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfY2hhbGxlbmdlOiBjb2RlQ2hhbGxlbmdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9jaGFsbGVuZ2VfbWV0aG9kOiBjb2RlQ2hhbGxlbmdlTWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZW1haWxSZWRpcmVjdFRvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoJ3Bob25lJyBpbiBjcmVkZW50aWFscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgcGhvbmUsIG9wdGlvbnMgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L290cGAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IChfYyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kYXRhKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV91c2VyOiAoX2QgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2hvdWxkQ3JlYXRlVXNlcikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IChfZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jaGFubmVsKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAnc21zJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsLCBtZXNzYWdlSWQ6IGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS5tZXNzYWdlX2lkIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvcignWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyLicpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZyBpbiBhIHVzZXIgZ2l2ZW4gYSBVc2VyIHN1cHBsaWVkIE9UUCBvciBUb2tlbkhhc2ggcmVjZWl2ZWQgdGhyb3VnaCBtb2JpbGUgb3IgZW1haWwuXG4gICAgICovXG4gICAgYXN5bmMgdmVyaWZ5T3RwKHBhcmFtcykge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlZGlyZWN0VG8gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgY2FwdGNoYVRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCdvcHRpb25zJyBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFRvID0gKF9hID0gcGFyYW1zLm9wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWRpcmVjdFRvO1xuICAgICAgICAgICAgICAgIGNhcHRjaGFUb2tlbiA9IChfYiA9IHBhcmFtcy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FwdGNoYVRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdmVyaWZ5YCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyksIHsgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogY2FwdGNoYVRva2VuIH0gfSksXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RUbyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlblZlcmlmaWNhdGlvbkVycm9yID0gbmV3IEVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCBvbiB0b2tlbiB2ZXJpZmljYXRpb24uJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgdG9rZW5WZXJpZmljYXRpb25FcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSBkYXRhLnNlc3Npb247XG4gICAgICAgICAgICBjb25zdCB1c2VyID0gZGF0YS51c2VyO1xuICAgICAgICAgICAgaWYgKHNlc3Npb24gPT09IG51bGwgfHwgc2Vzc2lvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycyhwYXJhbXMudHlwZSA9PSAncmVjb3ZlcnknID8gJ1BBU1NXT1JEX1JFQ09WRVJZJyA6ICdTSUdORURfSU4nLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIGEgc2luZ2xlLXNpZ24gb24gdXNpbmcgYW4gZW50ZXJwcmlzZSBJZGVudGl0eSBQcm92aWRlci4gQVxuICAgICAqIHN1Y2Nlc3NmdWwgU1NPIGF0dGVtcHQgd2lsbCByZWRpcmVjdCB0aGUgY3VycmVudCBwYWdlIHRvIHRoZSBpZGVudGl0eVxuICAgICAqIHByb3ZpZGVyIGF1dGhvcml6YXRpb24gcGFnZS4gVGhlIHJlZGlyZWN0IFVSTCBpcyBpbXBsZW1lbnRhdGlvbiBhbmQgU1NPXG4gICAgICogcHJvdG9jb2wgc3BlY2lmaWMuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHVzZSBpdCBieSBwcm92aWRpbmcgYSBTU08gZG9tYWluLiBUeXBpY2FsbHkgeW91IGNhbiBleHRyYWN0IHRoaXNcbiAgICAgKiBkb21haW4gYnkgYXNraW5nIHVzZXJzIGZvciB0aGVpciBlbWFpbCBhZGRyZXNzLiBJZiB0aGlzIGRvbWFpbiBpc1xuICAgICAqIHJlZ2lzdGVyZWQgb24gdGhlIEF1dGggaW5zdGFuY2UgdGhlIHJlZGlyZWN0IHdpbGwgdXNlIHRoYXQgb3JnYW5pemF0aW9uJ3NcbiAgICAgKiBjdXJyZW50bHkgYWN0aXZlIFNTTyBJZGVudGl0eSBQcm92aWRlciBmb3IgdGhlIGxvZ2luLlxuICAgICAqXG4gICAgICogSWYgeW91IGhhdmUgYnVpbHQgYW4gb3JnYW5pemF0aW9uLXNwZWNpZmljIGxvZ2luIHBhZ2UsIHlvdSBjYW4gdXNlIHRoZVxuICAgICAqIG9yZ2FuaXphdGlvbidzIFNTTyBJZGVudGl0eSBQcm92aWRlciBVVUlEIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgICovXG4gICAgYXN5bmMgc2lnbkluV2l0aFNTTyhwYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjb2RlQ2hhbGxlbmdlID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjb2RlQ2hhbGxlbmdlTWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgW2NvZGVDaGFsbGVuZ2UsIGNvZGVDaGFsbGVuZ2VNZXRob2RdID0gYXdhaXQgZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZCh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9zc29gLCB7XG4gICAgICAgICAgICAgICAgYm9keTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoJ3Byb3ZpZGVySWQnIGluIHBhcmFtcyA/IHsgcHJvdmlkZXJfaWQ6IHBhcmFtcy5wcm92aWRlcklkIH0gOiBudWxsKSksICgnZG9tYWluJyBpbiBwYXJhbXMgPyB7IGRvbWFpbjogcGFyYW1zLmRvbWFpbiB9IDogbnVsbCkpLCB7IHJlZGlyZWN0X3RvOiAoX2IgPSAoX2EgPSBwYXJhbXMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlZGlyZWN0VG8pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHVuZGVmaW5lZCB9KSwgKCgoX2MgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMub3B0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNhcHRjaGFUb2tlbilcbiAgICAgICAgICAgICAgICAgICAgPyB7IGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IHBhcmFtcy5vcHRpb25zLmNhcHRjaGFUb2tlbiB9IH1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsKSksIHsgc2tpcF9odHRwX3JlZGlyZWN0OiB0cnVlLCBjb2RlX2NoYWxsZW5nZTogY29kZUNoYWxsZW5nZSwgY29kZV9jaGFsbGVuZ2VfbWV0aG9kOiBjb2RlQ2hhbGxlbmdlTWV0aG9kIH0pLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3Nzb1Jlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IHJlZGlyZWN0IGluIGJyb3dzZXIgdW5sZXNzIHNraXBCcm93c2VyUmVkaXJlY3QgaXMgdHJ1ZVxuICAgICAgICAgICAgaWYgKCgoX2QgPSByZXN1bHQuZGF0YSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLnVybCkgJiYgaXNCcm93c2VyKCkgJiYgISgoX2UgPSBwYXJhbXMub3B0aW9ucykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnNraXBCcm93c2VyUmVkaXJlY3QpKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihyZXN1bHQuZGF0YS51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSByZWF1dGhlbnRpY2F0aW9uIE9UUCB0byB0aGUgdXNlcidzIGVtYWlsIG9yIHBob25lIG51bWJlci5cbiAgICAgKiBSZXF1aXJlcyB0aGUgdXNlciB0byBiZSBzaWduZWQtaW4uXG4gICAgICovXG4gICAgYXN5bmMgcmVhdXRoZW50aWNhdGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hY3F1aXJlTG9jaygtMSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JlYXV0aGVudGljYXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBfcmVhdXRoZW50aWNhdGUoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSwgZXJyb3I6IHNlc3Npb25FcnJvciwgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVycm9yKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzZXNzaW9uRXJyb3I7XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVycm9yIH0gPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L3JlYXV0aGVudGljYXRlYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNlbmRzIGFuIGV4aXN0aW5nIHNpZ251cCBjb25maXJtYXRpb24gZW1haWwsIGVtYWlsIGNoYW5nZSBlbWFpbCwgU01TIE9UUCBvciBwaG9uZSBjaGFuZ2UgT1RQLlxuICAgICAqL1xuICAgIGFzeW5jIHJlc2VuZChjcmVkZW50aWFscykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLnVybH0vcmVzZW5kYDtcbiAgICAgICAgICAgIGlmICgnZW1haWwnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlbWFpbCwgdHlwZSwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBlbmRwb2ludCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RUbzogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmVtYWlsUmVkaXJlY3RUbyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoJ3Bob25lJyBpbiBjcmVkZW50aWFscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgcGhvbmUsIHR5cGUsIG9wdGlvbnMgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgZW5kcG9pbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY2FwdGNoYVRva2VuIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCwgbWVzc2FnZUlkOiBkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEubWVzc2FnZV9pZCB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlciBhbmQgYSB0eXBlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNlc3Npb24sIHJlZnJlc2hpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICAgICAqXG4gICAgICogVGhlIHNlc3Npb24gcmV0dXJuZWQgY2FuIGJlIG51bGwgaWYgdGhlIHNlc3Npb24gaXMgbm90IGRldGVjdGVkIHdoaWNoIGNhbiBoYXBwZW4gaW4gdGhlIGV2ZW50IGEgdXNlciBpcyBub3Qgc2lnbmVkLWluIG9yIGhhcyBsb2dnZWQgb3V0LlxuICAgICAqXG4gICAgICogKipJTVBPUlRBTlQ6KiogVGhpcyBtZXRob2QgbG9hZHMgdmFsdWVzIGRpcmVjdGx5IGZyb20gdGhlIHN0b3JhZ2UgYXR0YWNoZWRcbiAgICAgKiB0byB0aGUgY2xpZW50LiBJZiB0aGF0IHN0b3JhZ2UgaXMgYmFzZWQgb24gcmVxdWVzdCBjb29raWVzIGZvciBleGFtcGxlLFxuICAgICAqIHRoZSB2YWx1ZXMgaW4gaXQgbWF5IG5vdCBiZSBhdXRoZW50aWMgYW5kIHRoZXJlZm9yZSBpdCdzIHN0cm9uZ2x5IGFkdmlzZWRcbiAgICAgKiBhZ2FpbnN0IHVzaW5nIHRoaXMgbWV0aG9kIGFuZCBpdHMgcmVzdWx0cyBpbiBzdWNoIGNpcmN1bXN0YW5jZXMuIEEgd2FybmluZ1xuICAgICAqIHdpbGwgYmUgZW1pdHRlZCBpZiB0aGlzIGlzIGRldGVjdGVkLiBVc2Uge0BsaW5rICNnZXRVc2VyKCl9IGluc3RlYWQuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0U2Vzc2lvbigpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY3F1aXJlcyBhIGdsb2JhbCBsb2NrIGJhc2VkIG9uIHRoZSBzdG9yYWdlIGtleS5cbiAgICAgKi9cbiAgICBhc3luYyBfYWNxdWlyZUxvY2soYWNxdWlyZVRpbWVvdXQsIGZuKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX2FjcXVpcmVMb2NrJywgJ2JlZ2luJywgYWNxdWlyZVRpbWVvdXQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMubG9ja0FjcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMucGVuZGluZ0luTG9jay5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnBlbmRpbmdJbkxvY2tbdGhpcy5wZW5kaW5nSW5Mb2NrLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGFzdDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdJbkxvY2sucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGNhcmUgaWYgaXQgZmluaXNoZWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2NrKGBsb2NrOiR7dGhpcy5zdG9yYWdlS2V5fWAsIGFjcXVpcmVUaW1lb3V0LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfYWNxdWlyZUxvY2snLCAnbG9jayBhY3F1aXJlZCBmb3Igc3RvcmFnZSBrZXknLCB0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9ja0FjcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nSW5Mb2NrLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGNhcmUgaWYgaXQgZmluaXNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkoKSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBkcmFpbmluZyB0aGUgcXVldWUgdW50aWwgdGhlcmUncyBub3RoaW5nIHRvIHdhaXQgb25cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMucGVuZGluZ0luTG9jay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRPbiA9IFsuLi50aGlzLnBlbmRpbmdJbkxvY2tdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdE9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0luTG9jay5zcGxpY2UoMCwgd2FpdE9uLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2FjcXVpcmVMb2NrJywgJ2xvY2sgcmVsZWFzZWQgZm9yIHN0b3JhZ2Uga2V5JywgdGhpcy5zdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NrQWNxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2FjcXVpcmVMb2NrJywgJ2VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZSBpbnN0ZWFkIG9mIHtAbGluayAjZ2V0U2Vzc2lvbn0gaW5zaWRlIHRoZSBsaWJyYXJ5LiBJdCBpc1xuICAgICAqIHNlbWFudGljYWxseSB1c3VhbGx5IHdoYXQgeW91IHdhbnQsIGFzIGdldHRpbmcgYSBzZXNzaW9uIGludm9sdmVzIHNvbWVcbiAgICAgKiBwcm9jZXNzaW5nIGFmdGVyd2FyZHMgdGhhdCByZXF1aXJlcyBvbmx5IG9uZSBjbGllbnQgb3BlcmF0aW5nIG9uIHRoZVxuICAgICAqIHNlc3Npb24gYXQgb25jZSBhY3Jvc3MgbXVsdGlwbGUgdGFicyBvciBwcm9jZXNzZXMuXG4gICAgICovXG4gICAgYXN5bmMgX3VzZVNlc3Npb24oZm4pIHtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfdXNlU2Vzc2lvbicsICdiZWdpbicpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gdGhlIHVzZSBvZiBfX2xvYWRTZXNzaW9uIGhlcmUgaXMgdGhlIG9ubHkgY29ycmVjdCB1c2Ugb2YgdGhlIGZ1bmN0aW9uIVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fX2xvYWRTZXNzaW9uKCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4ocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX3VzZVNlc3Npb24nLCAnZW5kJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTkVWRVIgVVNFIERJUkVDVExZIVxuICAgICAqXG4gICAgICogQWx3YXlzIHVzZSB7QGxpbmsgI191c2VTZXNzaW9ufS5cbiAgICAgKi9cbiAgICBhc3luYyBfX2xvYWRTZXNzaW9uKCkge1xuICAgICAgICB0aGlzLl9kZWJ1ZygnI19fbG9hZFNlc3Npb24oKScsICdiZWdpbicpO1xuICAgICAgICBpZiAoIXRoaXMubG9ja0FjcXVpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19fbG9hZFNlc3Npb24oKScsICd1c2VkIG91dHNpZGUgb2YgYW4gYWNxdWlyZWQgbG9jayEnLCBuZXcgRXJyb3IoKS5zdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50U2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBtYXliZVNlc3Npb24gPSBhd2FpdCBnZXRJdGVtQXN5bmModGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNnZXRTZXNzaW9uKCknLCAnc2Vzc2lvbiBmcm9tIHN0b3JhZ2UnLCBtYXliZVNlc3Npb24pO1xuICAgICAgICAgICAgaWYgKG1heWJlU2Vzc2lvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc1ZhbGlkU2Vzc2lvbihtYXliZVNlc3Npb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXNzaW9uID0gbWF5YmVTZXNzaW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNnZXRTZXNzaW9uKCknLCAnc2Vzc2lvbiBmcm9tIHN0b3JhZ2UgaXMgbm90IHZhbGlkJyk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlbW92ZVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRTZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBIHNlc3Npb24gaXMgY29uc2lkZXJlZCBleHBpcmVkIGJlZm9yZSB0aGUgYWNjZXNzIHRva2VuIF9hY3R1YWxseV9cbiAgICAgICAgICAgIC8vIGV4cGlyZXMuIFdoZW4gdGhlIGF1dG9SZWZyZXNoVG9rZW4gb3B0aW9uIGlzIG9mZiAob3Igd2hlbiB0aGUgdGFiIGlzXG4gICAgICAgICAgICAvLyBpbiB0aGUgYmFja2dyb3VuZCksIHZlcnkgZWFnZXIgdXNlcnMgb2YgZ2V0U2Vzc2lvbigpIC0tIGxpa2VcbiAgICAgICAgICAgIC8vIHJlYWx0aW1lLWpzIC0tIG1pZ2h0IHNlbmQgYSB2YWxpZCBKV1Qgd2hpY2ggd2lsbCBleHBpcmUgYnkgdGhlIHRpbWUgaXRcbiAgICAgICAgICAgIC8vIHJlYWNoZXMgdGhlIHNlcnZlci5cbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGlyZWQgPSBjdXJyZW50U2Vzc2lvbi5leHBpcmVzX2F0XG4gICAgICAgICAgICAgICAgPyBjdXJyZW50U2Vzc2lvbi5leHBpcmVzX2F0ICogMTAwMCAtIERhdGUubm93KCkgPCBFWFBJUllfTUFSR0lOX01TXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX19sb2FkU2Vzc2lvbigpJywgYHNlc3Npb24gaGFzJHtoYXNFeHBpcmVkID8gJycgOiAnIG5vdCd9IGV4cGlyZWRgLCAnZXhwaXJlc19hdCcsIGN1cnJlbnRTZXNzaW9uLmV4cGlyZXNfYXQpO1xuICAgICAgICAgICAgaWYgKCFoYXNFeHBpcmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlclN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF5YmVVc2VyID0gKGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnVzZXJTdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkgKyAnLXVzZXInKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXliZVVzZXIgPT09IG51bGwgfHwgbWF5YmVVc2VyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtYXliZVVzZXIudXNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciA9IG1heWJlVXNlci51c2VyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciA9IHVzZXJOb3RBdmFpbGFibGVQcm94eSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdyYXAgdGhlIHVzZXIgb2JqZWN0IHdpdGggYSB3YXJuaW5nIHByb3h5IG9uIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHdhcm5zIHdoZW4gcHJvcGVydGllcyBvZiB0aGUgdXNlciBhcmUgYWNjZXNzZWQsIG5vdCB3aGVuIHNlc3Npb24udXNlciBpdHNlbGYgaXMgYWNjZXNzZWRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yYWdlLmlzU2VydmVyICYmXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXNzaW9uLnVzZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgIWN1cnJlbnRTZXNzaW9uLnVzZXIuX19pc1VzZXJOb3RBdmFpbGFibGVQcm94eSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXBwcmVzc1dhcm5pbmdSZWYgPSB7IHZhbHVlOiB0aGlzLnN1cHByZXNzR2V0U2Vzc2lvbldhcm5pbmcgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciA9IGluc2VjdXJlVXNlcldhcm5pbmdQcm94eShjdXJyZW50U2Vzc2lvbi51c2VyLCBzdXBwcmVzc1dhcm5pbmdSZWYpO1xuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNsaWVudC1sZXZlbCBzdXBwcmVzc2lvbiBmbGFnIHdoZW4gdGhlIHByb3h5IHN1cHByZXNzZXMgdGhlIHdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHByZXNzV2FybmluZ1JlZi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBwcmVzc0dldFNlc3Npb25XYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHNlc3Npb246IGN1cnJlbnRTZXNzaW9uIH0sIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRhdGE6IHNlc3Npb24sIGVycm9yIH0gPSBhd2FpdCB0aGlzLl9jYWxsUmVmcmVzaFRva2VuKGN1cnJlbnRTZXNzaW9uLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19fbG9hZFNlc3Npb24oKScsICdlbmQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHVzZXIgZGV0YWlscyBpZiB0aGVyZSBpcyBhbiBleGlzdGluZyBzZXNzaW9uLiBUaGlzIG1ldGhvZFxuICAgICAqIHBlcmZvcm1zIGEgbmV0d29yayByZXF1ZXN0IHRvIHRoZSBTdXBhYmFzZSBBdXRoIHNlcnZlciwgc28gdGhlIHJldHVybmVkXG4gICAgICogdmFsdWUgaXMgYXV0aGVudGljIGFuZCBjYW4gYmUgdXNlZCB0byBiYXNlIGF1dGhvcml6YXRpb24gcnVsZXMgb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gand0IFRha2VzIGluIGFuIG9wdGlvbmFsIGFjY2VzcyB0b2tlbiBKV1QuIElmIG5vIEpXVCBpcyBwcm92aWRlZCwgdGhlIEpXVCBmcm9tIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgdXNlZC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRVc2VyKGp3dCkge1xuICAgICAgICBpZiAoand0KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0VXNlcihqd3QpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0VXNlcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5kYXRhLnVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3VwcHJlc3NHZXRTZXNzaW9uV2FybmluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgX2dldFVzZXIoand0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoand0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vdXNlcmAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IGp3dCxcbiAgICAgICAgICAgICAgICAgICAgeGZvcm06IF91c2VyUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJucyBhbiBlcnJvciBpZiB0aGVyZSBpcyBubyBhY2Nlc3NfdG9rZW4gb3IgY3VzdG9tIGF1dGhvcml6YXRpb24gaGVhZGVyXG4gICAgICAgICAgICAgICAgaWYgKCEoKF9hID0gZGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWNjZXNzX3Rva2VuKSAmJiAhdGhpcy5oYXNDdXN0b21BdXRob3JpemF0aW9uSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvcjogbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vdXNlcmAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IChfYyA9IChfYiA9IGRhdGEuc2Vzc2lvbikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmFjY2Vzc190b2tlbikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3VzZXJSZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc0F1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBKV1QgY29udGFpbnMgYSBgc2Vzc2lvbl9pZGAgd2hpY2ggZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbiBhY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgLy8gc2Vzc2lvbiBpbiB0aGUgZGF0YWJhc2UsIGluZGljYXRpbmcgdGhlIHVzZXIgaXMgc2lnbmVkIG91dC5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVtb3ZlU2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdXNlciBkYXRhIGZvciBhIGxvZ2dlZCBpbiB1c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVVzZXIoYXR0cmlidXRlcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hY3F1aXJlTG9jaygtMSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VwZGF0ZVVzZXIoYXR0cmlidXRlcywgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBfdXBkYXRlVXNlcihhdHRyaWJ1dGVzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHNlc3Npb25EYXRhLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzZXNzaW9uRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbkRhdGEuc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHNlc3Npb25EYXRhLnNlc3Npb247XG4gICAgICAgICAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBjb2RlQ2hhbGxlbmdlTWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mbG93VHlwZSA9PT0gJ3BrY2UnICYmIGF0dHJpYnV0ZXMuZW1haWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgICAgIFtjb2RlQ2hhbGxlbmdlLCBjb2RlQ2hhbGxlbmdlTWV0aG9kXSA9IGF3YWl0IGdldENvZGVDaGFsbGVuZ2VBbmRNZXRob2QodGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yOiB1c2VyRXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQVVQnLCBgJHt0aGlzLnVybH0vdXNlcmAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZW1haWxSZWRpcmVjdFRvLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGF0dHJpYnV0ZXMpLCB7IGNvZGVfY2hhbGxlbmdlOiBjb2RlQ2hhbGxlbmdlLCBjb2RlX2NoYWxsZW5nZV9tZXRob2Q6IGNvZGVDaGFsbGVuZ2VNZXRob2QgfSksXG4gICAgICAgICAgICAgICAgICAgIGp3dDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIHhmb3JtOiBfdXNlclJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh1c2VyRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdXNlckVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXNzaW9uLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1VTRVJfVVBEQVRFRCcsIHNlc3Npb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciB9LCBlcnJvcjogbnVsbCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNlc3Npb24gZGF0YSBmcm9tIHRoZSBjdXJyZW50IHNlc3Npb24uIElmIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgZXhwaXJlZCwgc2V0U2Vzc2lvbiB3aWxsIHRha2UgY2FyZSBvZiByZWZyZXNoaW5nIGl0IHRvIG9idGFpbiBhIG5ldyBzZXNzaW9uLlxuICAgICAqIElmIHRoZSByZWZyZXNoIHRva2VuIG9yIGFjY2VzcyB0b2tlbiBpbiB0aGUgY3VycmVudCBzZXNzaW9uIGlzIGludmFsaWQsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgICAqIEBwYXJhbSBjdXJyZW50U2Vzc2lvbiBUaGUgY3VycmVudCBzZXNzaW9uIHRoYXQgbWluaW1hbGx5IGNvbnRhaW5zIGFuIGFjY2VzcyB0b2tlbiBhbmQgcmVmcmVzaCB0b2tlbi5cbiAgICAgKi9cbiAgICBhc3luYyBzZXRTZXNzaW9uKGN1cnJlbnRTZXNzaW9uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hY3F1aXJlTG9jaygtMSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3NldFNlc3Npb24oY3VycmVudFNlc3Npb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3NldFNlc3Npb24oY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghY3VycmVudFNlc3Npb24uYWNjZXNzX3Rva2VuIHx8ICFjdXJyZW50U2Vzc2lvbi5yZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0aW1lTm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgICAgICAgICBsZXQgZXhwaXJlc0F0ID0gdGltZU5vdztcbiAgICAgICAgICAgIGxldCBoYXNFeHBpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBzZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gZGVjb2RlSldUKGN1cnJlbnRTZXNzaW9uLmFjY2Vzc190b2tlbik7XG4gICAgICAgICAgICBpZiAocGF5bG9hZC5leHApIHtcbiAgICAgICAgICAgICAgICBleHBpcmVzQXQgPSBwYXlsb2FkLmV4cDtcbiAgICAgICAgICAgICAgICBoYXNFeHBpcmVkID0gZXhwaXJlc0F0IDw9IHRpbWVOb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzRXhwaXJlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogcmVmcmVzaGVkU2Vzc2lvbiwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX2NhbGxSZWZyZXNoVG9rZW4oY3VycmVudFNlc3Npb24ucmVmcmVzaF90b2tlbik7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3I6IGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlZnJlc2hlZFNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlc3Npb24gPSByZWZyZXNoZWRTZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fZ2V0VXNlcihjdXJyZW50U2Vzc2lvbi5hY2Nlc3NfdG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiBjdXJyZW50U2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IGN1cnJlbnRTZXNzaW9uLnJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IGRhdGEudXNlcixcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5fdHlwZTogJ2JlYXJlcicsXG4gICAgICAgICAgICAgICAgICAgIGV4cGlyZXNfaW46IGV4cGlyZXNBdCAtIHRpbWVOb3csXG4gICAgICAgICAgICAgICAgICAgIGV4cGlyZXNfYXQ6IGV4cGlyZXNBdCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyBzZXNzaW9uOiBudWxsLCB1c2VyOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBzZXNzaW9uLCByZWdhcmRsZXNzIG9mIGV4cGlyeSBzdGF0dXMuXG4gICAgICogVGFrZXMgaW4gYW4gb3B0aW9uYWwgY3VycmVudCBzZXNzaW9uLiBJZiBub3QgcGFzc2VkIGluLCB0aGVuIHJlZnJlc2hTZXNzaW9uKCkgd2lsbCBhdHRlbXB0IHRvIHJldHJpZXZlIGl0IGZyb20gZ2V0U2Vzc2lvbigpLlxuICAgICAqIElmIHRoZSBjdXJyZW50IHNlc3Npb24ncyByZWZyZXNoIHRva2VuIGlzIGludmFsaWQsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgICAqIEBwYXJhbSBjdXJyZW50U2Vzc2lvbiBUaGUgY3VycmVudCBzZXNzaW9uLiBJZiBwYXNzZWQgaW4sIGl0IG11c3QgY29udGFpbiBhIHJlZnJlc2ggdG9rZW4uXG4gICAgICovXG4gICAgYXN5bmMgcmVmcmVzaFNlc3Npb24oY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVmcmVzaFNlc3Npb24oY3VycmVudFNlc3Npb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3JlZnJlc2hTZXNzaW9uKGN1cnJlbnRTZXNzaW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXNzaW9uID0gKF9hID0gZGF0YS5zZXNzaW9uKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghKGN1cnJlbnRTZXNzaW9uID09PSBudWxsIHx8IGN1cnJlbnRTZXNzaW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjdXJyZW50U2Vzc2lvbi5yZWZyZXNoX3Rva2VuKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBzZXNzaW9uLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fY2FsbFJlZnJlc2hUb2tlbihjdXJyZW50U2Vzc2lvbi5yZWZyZXNoX3Rva2VuKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvcjogZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBudWxsIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2Vzc2lvbiBkYXRhIGZyb20gYSBVUkwgc3RyaW5nXG4gICAgICovXG4gICAgYXN5bmMgX2dldFNlc3Npb25Gcm9tVVJMKHBhcmFtcywgY2FsbGJhY2tVcmxUeXBlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzQnJvd3NlcigpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IoJ05vIGJyb3dzZXIgZGV0ZWN0ZWQuJyk7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGVycm9yIGluIHRoZSBVUkwsIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgZmxvdyBpdCBpcywgd2UganVzdCByZXR1cm4gdGhlIGVycm9yLlxuICAgICAgICAgICAgaWYgKHBhcmFtcy5lcnJvciB8fCBwYXJhbXMuZXJyb3JfZGVzY3JpcHRpb24gfHwgcGFyYW1zLmVycm9yX2NvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZXJyb3IgY2xhc3MgcmV0dXJuZWQgaW1wbGllcyB0aGF0IHRoZSByZWRpcmVjdCBpcyBmcm9tIGFuIGltcGxpY2l0IGdyYW50IGZsb3dcbiAgICAgICAgICAgICAgICAvLyBidXQgaXQgY291bGQgYWxzbyBiZSBmcm9tIGEgcmVkaXJlY3QgZXJyb3IgZnJvbSBhIFBLQ0UgZmxvdy5cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yKHBhcmFtcy5lcnJvcl9kZXNjcmlwdGlvbiB8fCAnRXJyb3IgaW4gVVJMIHdpdGggdW5zcGVjaWZpZWQgZXJyb3JfZGVzY3JpcHRpb24nLCB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBwYXJhbXMuZXJyb3IgfHwgJ3Vuc3BlY2lmaWVkX2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogcGFyYW1zLmVycm9yX2NvZGUgfHwgJ3Vuc3BlY2lmaWVkX2NvZGUnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2tzIGZvciBtaXNtYXRjaGVzIGJldHdlZW4gdGhlIGZsb3dUeXBlIGluaXRpYWxpc2VkIGluIHRoZSBjbGllbnQgYW5kIHRoZSBVUkwgcGFyYW1ldGVyc1xuICAgICAgICAgICAgc3dpdGNoIChjYWxsYmFja1VybFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdpbXBsaWNpdCc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3IoJ05vdCBhIHZhbGlkIFBLQ0UgZmxvdyB1cmwuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncGtjZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAnaW1wbGljaXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yKCdOb3QgYSB2YWxpZCBpbXBsaWNpdCBncmFudCBmbG93IHVybC4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gbWlzbWF0Y2ggc28gd2UgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSByZWRpcmVjdCBmb3IgUEtDRSwgd2UgYXR0ZW1wdCB0byByZXRyaWV2ZSB0aGUgY29kZSBmcm9tIHRoZSBVUkwgZm9yIHRoZSBjb2RlIGV4Y2hhbmdlXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tVcmxUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19pbml0aWFsaXplKCknLCAnYmVnaW4nLCAnaXMgUEtDRSBmbG93JywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuY29kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvcignTm8gY29kZSBkZXRlY3RlZC4nKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCB0aGlzLl9leGNoYW5nZUNvZGVGb3JTZXNzaW9uKHBhcmFtcy5jb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdjb2RlJyk7XG4gICAgICAgICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHdpbmRvdy5oaXN0b3J5LnN0YXRlLCAnJywgdXJsLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgc2Vzc2lvbjogZGF0YS5zZXNzaW9uLCByZWRpcmVjdFR5cGU6IG51bGwgfSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgcHJvdmlkZXJfdG9rZW4sIHByb3ZpZGVyX3JlZnJlc2hfdG9rZW4sIGFjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbiwgZXhwaXJlc19pbiwgZXhwaXJlc19hdCwgdG9rZW5fdHlwZSwgfSA9IHBhcmFtcztcbiAgICAgICAgICAgIGlmICghYWNjZXNzX3Rva2VuIHx8ICFleHBpcmVzX2luIHx8ICFyZWZyZXNoX3Rva2VuIHx8ICF0b2tlbl90eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvcignTm8gc2Vzc2lvbiBkZWZpbmVkIGluIFVSTCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGltZU5vdyA9IE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICAgICAgY29uc3QgZXhwaXJlc0luID0gcGFyc2VJbnQoZXhwaXJlc19pbik7XG4gICAgICAgICAgICBsZXQgZXhwaXJlc0F0ID0gdGltZU5vdyArIGV4cGlyZXNJbjtcbiAgICAgICAgICAgIGlmIChleHBpcmVzX2F0KSB7XG4gICAgICAgICAgICAgICAgZXhwaXJlc0F0ID0gcGFyc2VJbnQoZXhwaXJlc19hdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhY3R1YWxseUV4cGlyZXNJbiA9IGV4cGlyZXNBdCAtIHRpbWVOb3c7XG4gICAgICAgICAgICBpZiAoYWN0dWFsbHlFeHBpcmVzSW4gKiAxMDAwIDw9IEFVVE9fUkVGUkVTSF9USUNLX0RVUkFUSU9OX01TKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBAc3VwYWJhc2UvZ290cnVlLWpzOiBTZXNzaW9uIGFzIHJldHJpZXZlZCBmcm9tIFVSTCBleHBpcmVzIGluICR7YWN0dWFsbHlFeHBpcmVzSW59cywgc2hvdWxkIGhhdmUgYmVlbiBjbG9zZXIgdG8gJHtleHBpcmVzSW59c2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXNzdWVkQXQgPSBleHBpcmVzQXQgLSBleHBpcmVzSW47XG4gICAgICAgICAgICBpZiAodGltZU5vdyAtIGlzc3VlZEF0ID49IDEyMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQHN1cGFiYXNlL2dvdHJ1ZS1qczogU2Vzc2lvbiBhcyByZXRyaWV2ZWQgZnJvbSBVUkwgd2FzIGlzc3VlZCBvdmVyIDEyMHMgYWdvLCBVUkwgY291bGQgYmUgc3RhbGUnLCBpc3N1ZWRBdCwgZXhwaXJlc0F0LCB0aW1lTm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVOb3cgLSBpc3N1ZWRBdCA8IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0BzdXBhYmFzZS9nb3RydWUtanM6IFNlc3Npb24gYXMgcmV0cmlldmVkIGZyb20gVVJMIHdhcyBpc3N1ZWQgaW4gdGhlIGZ1dHVyZT8gQ2hlY2sgdGhlIGRldmljZSBjbG9jayBmb3Igc2tldycsIGlzc3VlZEF0LCBleHBpcmVzQXQsIHRpbWVOb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fZ2V0VXNlcihhY2Nlc3NfdG9rZW4pO1xuICAgICAgICAgICAgaWYgKGVycm9yKVxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBwcm92aWRlcl90b2tlbixcbiAgICAgICAgICAgICAgICBwcm92aWRlcl9yZWZyZXNoX3Rva2VuLFxuICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICBleHBpcmVzX2luOiBleHBpcmVzSW4sXG4gICAgICAgICAgICAgICAgZXhwaXJlc19hdDogZXhwaXJlc0F0LFxuICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgICAgICAgdG9rZW5fdHlwZTogdG9rZW5fdHlwZSxcbiAgICAgICAgICAgICAgICB1c2VyOiBkYXRhLnVzZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRva2VucyBmcm9tIFVSTFxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnJztcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2dldFNlc3Npb25Gcm9tVVJMKCknLCAnY2xlYXJpbmcgd2luZG93LmxvY2F0aW9uLmhhc2gnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHNlc3Npb24sIHJlZGlyZWN0VHlwZTogcGFyYW1zLnR5cGUgfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgc2Vzc2lvbjogbnVsbCwgcmVkaXJlY3RUeXBlOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IFVSTCBjb250YWlucyBwYXJhbWV0ZXJzIGdpdmVuIGJ5IGFuIGltcGxpY2l0IG9hdXRoIGdyYW50IGZsb3cgKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2NzQ5Lmh0bWwjc2VjdGlvbi00LjIpXG4gICAgICpcbiAgICAgKiBJZiBgZGV0ZWN0U2Vzc2lvbkluVXJsYCBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBVUkwgYW5kIHBhcmFtcyB0byBkZXRlcm1pbmVcbiAgICAgKiBpZiB0aGUgVVJMIHNob3VsZCBiZSBwcm9jZXNzZWQgYXMgYSBTdXBhYmFzZSBhdXRoIGNhbGxiYWNrLiBUaGlzIGFsbG93cyB1c2VycyB0byBleGNsdWRlXG4gICAgICogVVJMcyBmcm9tIG90aGVyIE9BdXRoIHByb3ZpZGVycyAoZS5nLiwgRmFjZWJvb2sgTG9naW4pIHRoYXQgYWxzbyByZXR1cm4gYWNjZXNzX3Rva2VuIGluIHRoZSBmcmFnbWVudC5cbiAgICAgKi9cbiAgICBfaXNJbXBsaWNpdEdyYW50Q2FsbGJhY2socGFyYW1zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZXRlY3RTZXNzaW9uSW5VcmwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGVjdFNlc3Npb25JblVybChuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSwgcGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQm9vbGVhbihwYXJhbXMuYWNjZXNzX3Rva2VuIHx8IHBhcmFtcy5lcnJvcl9kZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBVUkwgYW5kIGJhY2tpbmcgc3RvcmFnZSBjb250YWluIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgYSBQS0NFIGZsb3dcbiAgICAgKi9cbiAgICBhc3luYyBfaXNQS0NFQ2FsbGJhY2socGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdG9yYWdlQ29udGVudCA9IGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICByZXR1cm4gISEocGFyYW1zLmNvZGUgJiYgY3VycmVudFN0b3JhZ2VDb250ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zaWRlIGEgYnJvd3NlciBjb250ZXh0LCBgc2lnbk91dCgpYCB3aWxsIHJlbW92ZSB0aGUgbG9nZ2VkIGluIHVzZXIgZnJvbSB0aGUgYnJvd3NlciBzZXNzaW9uIGFuZCBsb2cgdGhlbSBvdXQgLSByZW1vdmluZyBhbGwgaXRlbXMgZnJvbSBsb2NhbHN0b3JhZ2UgYW5kIHRoZW4gdHJpZ2dlciBhIGBcIlNJR05FRF9PVVRcImAgZXZlbnQuXG4gICAgICpcbiAgICAgKiBGb3Igc2VydmVyLXNpZGUgbWFuYWdlbWVudCwgeW91IGNhbiByZXZva2UgYWxsIHJlZnJlc2ggdG9rZW5zIGZvciBhIHVzZXIgYnkgcGFzc2luZyBhIHVzZXIncyBKV1QgdGhyb3VnaCB0byBgYXV0aC5hcGkuc2lnbk91dChKV1Q6IHN0cmluZylgLlxuICAgICAqIFRoZXJlIGlzIG5vIHdheSB0byByZXZva2UgYSB1c2VyJ3MgYWNjZXNzIHRva2VuIGp3dCB1bnRpbCBpdCBleHBpcmVzLiBJdCBpcyByZWNvbW1lbmRlZCB0byBzZXQgYSBzaG9ydGVyIGV4cGlyeSBvbiB0aGUgand0IGZvciB0aGlzIHJlYXNvbi5cbiAgICAgKlxuICAgICAqIElmIHVzaW5nIGBvdGhlcnNgIHNjb3BlLCBubyBgU0lHTkVEX09VVGAgZXZlbnQgaXMgZmlyZWQhXG4gICAgICovXG4gICAgYXN5bmMgc2lnbk91dChvcHRpb25zID0geyBzY29wZTogJ2dsb2JhbCcgfSkge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9zaWduT3V0KG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3NpZ25PdXQoeyBzY29wZSB9ID0geyBzY29wZTogJ2dsb2JhbCcgfSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gKF9hID0gZGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWNjZXNzX3Rva2VuO1xuICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gYXdhaXQgdGhpcy5hZG1pbi5zaWduT3V0KGFjY2Vzc1Rva2VuLCBzY29wZSk7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSA0MDRzIHNpbmNlIHVzZXIgbWlnaHQgbm90IGV4aXN0IGFueW1vcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIDQwMXMgc2luY2UgYW4gaW52YWxpZCBvciBleHBpcmVkIEpXVCBzaG91bGQgc2lnbiBvdXQgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAgICAgICAgICAgICAgICBpZiAoIShpc0F1dGhBcGlFcnJvcihlcnJvcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvci5zdGF0dXMgPT09IDQwNCB8fCBlcnJvci5zdGF0dXMgPT09IDQwMSB8fCBlcnJvci5zdGF0dXMgPT09IDQwMykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2NvcGUgIT09ICdvdGhlcnMnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVtb3ZlU2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGVycm9yOiBudWxsIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgb25BdXRoU3RhdGVDaGFuZ2UoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgaWQgPSBnZW5lcmF0ZUNhbGxiYWNrSWQoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyN1bnN1YnNjcmliZSgpJywgJ3N0YXRlIGNoYW5nZSBjYWxsYmFjayB3aXRoIGlkIHJlbW92ZWQnLCBpZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZUVtaXR0ZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kZWJ1ZygnI29uQXV0aFN0YXRlQ2hhbmdlKCknLCAncmVnaXN0ZXJlZCBjYWxsYmFjayB3aXRoIGlkJywgaWQpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlRW1pdHRlcnMuc2V0KGlkLCBzdWJzY3JpcHRpb24pO1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEluaXRpYWxTZXNzaW9uKGlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSgpO1xuICAgICAgICByZXR1cm4geyBkYXRhOiB7IHN1YnNjcmlwdGlvbiB9IH07XG4gICAgfVxuICAgIGFzeW5jIF9lbWl0SW5pdGlhbFNlc3Npb24oaWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSwgZXJyb3IsIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICBhd2FpdCAoKF9hID0gdGhpcy5zdGF0ZUNoYW5nZUVtaXR0ZXJzLmdldChpZCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsYmFjaygnSU5JVElBTF9TRVNTSU9OJywgc2Vzc2lvbikpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdJTklUSUFMX1NFU1NJT04nLCAnY2FsbGJhY2sgaWQnLCBpZCwgJ3Nlc3Npb24nLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCAoKF9iID0gdGhpcy5zdGF0ZUNoYW5nZUVtaXR0ZXJzLmdldChpZCkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsYmFjaygnSU5JVElBTF9TRVNTSU9OJywgbnVsbCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdJTklUSUFMX1NFU1NJT04nLCAnY2FsbGJhY2sgaWQnLCBpZCwgJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIHBhc3N3b3JkIHJlc2V0IHJlcXVlc3QgdG8gYW4gZW1haWwgYWRkcmVzcy4gVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIFBLQ0UgZmxvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbWFpbCBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRpcmVjdFRvIFRoZSBVUkwgdG8gc2VuZCB0aGUgdXNlciB0byBhZnRlciB0aGV5IGNsaWNrIHRoZSBwYXNzd29yZCByZXNldCBsaW5rLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLmNhcHRjaGFUb2tlbiBWZXJpZmljYXRpb24gdG9rZW4gcmVjZWl2ZWQgd2hlbiB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIGNhcHRjaGEgb24gdGhlIHNpdGUuXG4gICAgICovXG4gICAgYXN5bmMgcmVzZXRQYXNzd29yZEZvckVtYWlsKGVtYWlsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2UgPSBudWxsO1xuICAgICAgICBsZXQgY29kZUNoYWxsZW5nZU1ldGhvZCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIFtjb2RlQ2hhbGxlbmdlLCBjb2RlQ2hhbGxlbmdlTWV0aG9kXSA9IGF3YWl0IGdldENvZGVDaGFsbGVuZ2VBbmRNZXRob2QodGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXksIHRydWUgLy8gaXNQYXNzd29yZFJlY292ZXJ5XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vcmVjb3ZlcmAsIHtcbiAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgICAgICAgICBjb2RlX2NoYWxsZW5nZTogY29kZUNoYWxsZW5nZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZV9jaGFsbGVuZ2VfbWV0aG9kOiBjb2RlQ2hhbGxlbmdlTWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiBvcHRpb25zLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86IG9wdGlvbnMucmVkaXJlY3RUbyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgdGhlIGlkZW50aXRpZXMgbGlua2VkIHRvIGEgdXNlci5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRVc2VySWRlbnRpdGllcygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyKCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyBpZGVudGl0aWVzOiAoX2EgPSBkYXRhLnVzZXIuaWRlbnRpdGllcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10gfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgbGlua0lkZW50aXR5KGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIGlmICgndG9rZW4nIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saW5rSWRlbnRpdHlJZFRva2VuKGNyZWRlbnRpYWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5saW5rSWRlbnRpdHlPQXV0aChjcmVkZW50aWFscyk7XG4gICAgfVxuICAgIGFzeW5jIGxpbmtJZGVudGl0eU9BdXRoKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5fZ2V0VXJsRm9yUHJvdmlkZXIoYCR7dGhpcy51cmx9L3VzZXIvaWRlbnRpdGllcy9hdXRob3JpemVgLCBjcmVkZW50aWFscy5wcm92aWRlciwge1xuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiAoX2EgPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVkaXJlY3RUbyxcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVzOiAoX2IgPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc2NvcGVzLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogKF9jID0gY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICBza2lwQnJvd3NlclJlZGlyZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgdXJsLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgand0OiAoX2UgPSAoX2QgPSBkYXRhLnNlc3Npb24pID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5hY2Nlc3NfdG9rZW4pICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGVycm9yKVxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgaWYgKGlzQnJvd3NlcigpICYmICEoKF9hID0gY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNraXBCcm93c2VyUmVkaXJlY3QpKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEudXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHsgcHJvdmlkZXI6IGNyZWRlbnRpYWxzLnByb3ZpZGVyLCB1cmw6IGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS51cmwgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHByb3ZpZGVyOiBjcmVkZW50aWFscy5wcm92aWRlciwgdXJsOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgbGlua0lkZW50aXR5SWRUb2tlbihjcmVkZW50aWFscykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3I6IHNlc3Npb25FcnJvciwgZGF0YTogeyBzZXNzaW9uIH0sIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc2Vzc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgb3B0aW9ucywgcHJvdmlkZXIsIHRva2VuLCBhY2Nlc3NfdG9rZW4sIG5vbmNlIH0gPSBjcmVkZW50aWFscztcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS90b2tlbj9ncmFudF90eXBlPWlkX3Rva2VuYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogKF9hID0gc2Vzc2lvbiA9PT0gbnVsbCB8fCBzZXNzaW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXNzaW9uLmFjY2Vzc190b2tlbikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkX3Rva2VuOiB0b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua19pZGVudGl0eTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeGZvcm06IF9zZXNzaW9uUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZGF0YSB8fCAhZGF0YS5zZXNzaW9uIHx8ICFkYXRhLnVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IoKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1VTRVJfVVBEQVRFRCcsIGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbmxpbmtzIGFuIGlkZW50aXR5IGZyb20gYSB1c2VyIGJ5IGRlbGV0aW5nIGl0LiBUaGUgdXNlciB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHNpZ24gaW4gd2l0aCB0aGF0IGlkZW50aXR5IG9uY2UgaXQncyB1bmxpbmtlZC5cbiAgICAgKi9cbiAgICBhc3luYyB1bmxpbmtJZGVudGl0eShpZGVudGl0eSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdERUxFVEUnLCBgJHt0aGlzLnVybH0vdXNlci9pZGVudGl0aWVzLyR7aWRlbnRpdHkuaWRlbnRpdHlfaWR9YCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogKF9iID0gKF9hID0gZGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWNjZXNzX3Rva2VuKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBuZXcgSldULlxuICAgICAqIEBwYXJhbSByZWZyZXNoVG9rZW4gQSB2YWxpZCByZWZyZXNoIHRva2VuIHRoYXQgd2FzIHJldHVybmVkIG9uIGxvZ2luLlxuICAgICAqL1xuICAgIGFzeW5jIF9yZWZyZXNoQWNjZXNzVG9rZW4ocmVmcmVzaFRva2VuKSB7XG4gICAgICAgIGNvbnN0IGRlYnVnTmFtZSA9IGAjX3JlZnJlc2hBY2Nlc3NUb2tlbigke3JlZnJlc2hUb2tlbi5zdWJzdHJpbmcoMCwgNSl9Li4uKWA7XG4gICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2JlZ2luJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgLy8gd2lsbCBhdHRlbXB0IHRvIHJlZnJlc2ggdGhlIHRva2VuIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJldHJ5YWJsZShhc3luYyAoYXR0ZW1wdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcCgyMDAgKiBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSkpOyAvLyAyMDAsIDQwMCwgODAwLCAuLi5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAncmVmcmVzaGluZyBhdHRlbXB0JywgYXR0ZW1wdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L3Rva2VuP2dyYW50X3R5cGU9cmVmcmVzaF90b2tlbmAsIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keTogeyByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIChhdHRlbXB0LCBlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRCYWNrT2ZmSW50ZXJ2YWwgPSAyMDAgKiBNYXRoLnBvdygyLCBhdHRlbXB0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgIGlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoZXJyb3IpICYmXG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5YWJsZSBvbmx5IGlmIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50IGJlZm9yZSB0aGUgYmFja29mZiBvdmVyZmxvd3MgdGhlIHRpY2sgZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgRGF0ZS5ub3coKSArIG5leHRCYWNrT2ZmSW50ZXJ2YWwgLSBzdGFydGVkQXQgPCBBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHNlc3Npb246IG51bGwsIHVzZXI6IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9pc1ZhbGlkU2Vzc2lvbihtYXliZVNlc3Npb24pIHtcbiAgICAgICAgY29uc3QgaXNWYWxpZFNlc3Npb24gPSB0eXBlb2YgbWF5YmVTZXNzaW9uID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgbWF5YmVTZXNzaW9uICE9PSBudWxsICYmXG4gICAgICAgICAgICAnYWNjZXNzX3Rva2VuJyBpbiBtYXliZVNlc3Npb24gJiZcbiAgICAgICAgICAgICdyZWZyZXNoX3Rva2VuJyBpbiBtYXliZVNlc3Npb24gJiZcbiAgICAgICAgICAgICdleHBpcmVzX2F0JyBpbiBtYXliZVNlc3Npb247XG4gICAgICAgIHJldHVybiBpc1ZhbGlkU2Vzc2lvbjtcbiAgICB9XG4gICAgYXN5bmMgX2hhbmRsZVByb3ZpZGVyU2lnbkluKHByb3ZpZGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuX2dldFVybEZvclByb3ZpZGVyKGAke3RoaXMudXJsfS9hdXRob3JpemVgLCBwcm92aWRlciwge1xuICAgICAgICAgICAgcmVkaXJlY3RUbzogb3B0aW9ucy5yZWRpcmVjdFRvLFxuICAgICAgICAgICAgc2NvcGVzOiBvcHRpb25zLnNjb3BlcyxcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBvcHRpb25zLnF1ZXJ5UGFyYW1zLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfaGFuZGxlUHJvdmlkZXJTaWduSW4oKScsICdwcm92aWRlcicsIHByb3ZpZGVyLCAnb3B0aW9ucycsIG9wdGlvbnMsICd1cmwnLCB1cmwpO1xuICAgICAgICAvLyB0cnkgdG8gb3BlbiBvbiB0aGUgYnJvd3NlclxuICAgICAgICBpZiAoaXNCcm93c2VyKCkgJiYgIW9wdGlvbnMuc2tpcEJyb3dzZXJSZWRpcmVjdCkge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHsgcHJvdmlkZXIsIHVybCB9LCBlcnJvcjogbnVsbCB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWNvdmVycyB0aGUgc2Vzc2lvbiBmcm9tIExvY2FsU3RvcmFnZSBhbmQgcmVmcmVzaGVzIHRoZSB0b2tlblxuICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIGFzeW5jIHRvIGFjY29tbW9kYXRlIGZvciBBc3luY1N0b3JhZ2UgZS5nLiBpbiBSZWFjdCBuYXRpdmUuXG4gICAgICovXG4gICAgYXN5bmMgX3JlY292ZXJBbmRSZWZyZXNoKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBkZWJ1Z05hbWUgPSAnI19yZWNvdmVyQW5kUmVmcmVzaCgpJztcbiAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnYmVnaW4nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZXNzaW9uID0gKGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSkpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRTZXNzaW9uICYmIHRoaXMudXNlclN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWF5YmVVc2VyID0gKGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnVzZXJTdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkgKyAnLXVzZXInKSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3JhZ2UuaXNTZXJ2ZXIgJiYgT2JqZWN0LmlzKHRoaXMuc3RvcmFnZSwgdGhpcy51c2VyU3RvcmFnZSkgJiYgIW1heWJlVXNlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBzdG9yYWdlIGFuZCB1c2VyU3RvcmFnZSBhcmUgdGhlIHNhbWUgc3RvcmFnZSBtZWRpdW0sIGZvciBleGFtcGxlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5sb2NhbFN0b3JhZ2UgaWYgdXNlclN0b3JhZ2UgZG9lcyBub3QgaGF2ZSB0aGUgdXNlciBmcm9tXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0b3JhZ2Ugc3RvcmVkLCBzdG9yZSBpdCBmaXJzdCB0aGVyZWJ5IG1pZ3JhdGluZyB0aGUgdXNlciBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBzdG9yYWdlIC0+IHVzZXJTdG9yYWdlXG4gICAgICAgICAgICAgICAgICAgIG1heWJlVXNlciA9IHsgdXNlcjogY3VycmVudFNlc3Npb24udXNlciB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXRJdGVtQXN5bmModGhpcy51c2VyU3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5ICsgJy11c2VyJywgbWF5YmVVc2VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciA9IChfYSA9IG1heWJlVXNlciA9PT0gbnVsbCB8fCBtYXliZVVzZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1heWJlVXNlci51c2VyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1c2VyTm90QXZhaWxhYmxlUHJveHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRTZXNzaW9uICYmICFjdXJyZW50U2Vzc2lvbi51c2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlciBzdG9yYWdlIGlzIG5vdCBzZXQsIGxldCdzIGNoZWNrIGlmIGl0IHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgc29cbiAgICAgICAgICAgICAgICAvLyB3ZSBicmluZyBiYWNrIHRoZSBzdG9yYWdlIGFzIGl0IHNob3VsZCBiZVxuICAgICAgICAgICAgICAgIGlmICghY3VycmVudFNlc3Npb24udXNlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0IGlmIHVzZXJTdG9yYWdlIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgYW5kIHRoZSBzdG9yYWdlIG1lZGl1bSB3YXMgdGhlIHNhbWUsIHRvIG1vdmUgdGhlIHVzZXIgYmFjayB1bmRlciB0aGUgc2FtZSBrZXlcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VwYXJhdGVVc2VyID0gKGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSArICctdXNlcicpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlcGFyYXRlVXNlciAmJiAoc2VwYXJhdGVVc2VyID09PSBudWxsIHx8IHNlcGFyYXRlVXNlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VwYXJhdGVVc2VyLnVzZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2Vzc2lvbi51c2VyID0gc2VwYXJhdGVVc2VyLnVzZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkgKyAnLXVzZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSwgY3VycmVudFNlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciA9IHVzZXJOb3RBdmFpbGFibGVQcm94eSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnc2Vzc2lvbiBmcm9tIHN0b3JhZ2UnLCBjdXJyZW50U2Vzc2lvbik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzVmFsaWRTZXNzaW9uKGN1cnJlbnRTZXNzaW9uKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ3Nlc3Npb24gaXMgbm90IHZhbGlkJyk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlbW92ZVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXhwaXJlc1dpdGhNYXJnaW4gPSAoKF9iID0gY3VycmVudFNlc3Npb24uZXhwaXJlc19hdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogSW5maW5pdHkpICogMTAwMCAtIERhdGUubm93KCkgPCBFWFBJUllfTUFSR0lOX01TO1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCBgc2Vzc2lvbiBoYXMke2V4cGlyZXNXaXRoTWFyZ2luID8gJycgOiAnIG5vdCd9IGV4cGlyZWQgd2l0aCBtYXJnaW4gb2YgJHtFWFBJUllfTUFSR0lOX01TfXNgKTtcbiAgICAgICAgICAgIGlmIChleHBpcmVzV2l0aE1hcmdpbikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dG9SZWZyZXNoVG9rZW4gJiYgY3VycmVudFNlc3Npb24ucmVmcmVzaF90b2tlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGVycm9yIH0gPSBhd2FpdCB0aGlzLl9jYWxsUmVmcmVzaFRva2VuKGN1cnJlbnRTZXNzaW9uLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0F1dGhSZXRyeWFibGVGZXRjaEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ3JlZnJlc2ggZmFpbGVkIHdpdGggYSBub24tcmV0cnlhYmxlIGVycm9yLCByZW1vdmluZyB0aGUgc2Vzc2lvbicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yZW1vdmVTZXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50U2Vzc2lvbi51c2VyICYmXG4gICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlci5fX2lzVXNlck5vdEF2YWlsYWJsZVByb3h5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHByb3h5IHVzZXIsIHRyeSB0byBnZXQgdGhlIHJlYWwgdXNlciBkYXRhXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvcjogdXNlckVycm9yIH0gPSBhd2FpdCB0aGlzLl9nZXRVc2VyKGN1cnJlbnRTZXNzaW9uLmFjY2Vzc190b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdXNlckVycm9yICYmIChkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEudXNlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXNzaW9uLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihjdXJyZW50U2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnU0lHTkVEX0lOJywgY3VycmVudFNlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnY291bGQgbm90IGdldCB1c2VyIGRhdGEsIHNraXBwaW5nIFNJR05FRF9JTiBub3RpZmljYXRpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZ2V0VXNlckVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdldHRpbmcgdXNlciBkYXRhOicsIGdldFVzZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2Vycm9yIGdldHRpbmcgdXNlciBkYXRhLCBza2lwcGluZyBTSUdORURfSU4gbm90aWZpY2F0aW9uJywgZ2V0VXNlckVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHBlcnNpc3QgY3VycmVudFNlc3Npb24gYWdhaW4sIGFzIHdlIGp1c3QgbG9hZGVkIGl0IGZyb21cbiAgICAgICAgICAgICAgICAvLyBsb2NhbCBzdG9yYWdlOyBwZXJzaXN0aW5nIGl0IGFnYWluIG1heSBvdmVyd3JpdGUgYSB2YWx1ZSBzYXZlZCBieVxuICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgY2xpZW50IHdpdGggYWNjZXNzIHRvIHRoZSBzYW1lIGxvY2FsIHN0b3JhZ2VcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnU0lHTkVEX0lOJywgY3VycmVudFNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9jYWxsUmVmcmVzaFRva2VuKHJlZnJlc2hUb2tlbikge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVmcmVzaGluZyBpcyBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgICAgIGlmICh0aGlzLnJlZnJlc2hpbmdEZWZlcnJlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaGluZ0RlZmVycmVkLnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVidWdOYW1lID0gYCNfY2FsbFJlZnJlc2hUb2tlbigke3JlZnJlc2hUb2tlbi5zdWJzdHJpbmcoMCwgNSl9Li4uKWA7XG4gICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2JlZ2luJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hpbmdEZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpO1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fcmVmcmVzaEFjY2Vzc1Rva2VuKHJlZnJlc2hUb2tlbik7XG4gICAgICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICBpZiAoIWRhdGEuc2Vzc2lvbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnVE9LRU5fUkVGUkVTSEVEJywgZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgZGF0YTogZGF0YS5zZXNzaW9uLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoaW5nRGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlbW92ZVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKF9hID0gdGhpcy5yZWZyZXNoaW5nRGVmZXJyZWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChfYiA9IHRoaXMucmVmcmVzaGluZ0RlZmVycmVkKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoaW5nRGVmZXJyZWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnZW5kJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX25vdGlmeUFsbFN1YnNjcmliZXJzKGV2ZW50LCBzZXNzaW9uLCBicm9hZGNhc3QgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGRlYnVnTmFtZSA9IGAjX25vdGlmeUFsbFN1YnNjcmliZXJzKCR7ZXZlbnR9KWA7XG4gICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2JlZ2luJywgc2Vzc2lvbiwgYGJyb2FkY2FzdCA9ICR7YnJvYWRjYXN0fWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYnJvYWRjYXN0Q2hhbm5lbCAmJiBicm9hZGNhc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwucG9zdE1lc3NhZ2UoeyBldmVudCwgc2Vzc2lvbiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBBcnJheS5mcm9tKHRoaXMuc3RhdGVDaGFuZ2VFbWl0dGVycy52YWx1ZXMoKSkubWFwKGFzeW5jICh4KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgeC5jYWxsYmFjayhldmVudCwgc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlcnJvcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcnNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZyhkZWJ1Z05hbWUsICdlbmQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBzZXQgY3VycmVudFNlc3Npb24gYW5kIGN1cnJlbnRVc2VyXG4gICAgICogcHJvY2VzcyB0byBfc3RhcnRBdXRvUmVmcmVzaFRva2VuIGlmIHBvc3NpYmxlXG4gICAgICovXG4gICAgYXN5bmMgX3NhdmVTZXNzaW9uKHNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfc2F2ZVNlc3Npb24oKScsIHNlc3Npb24pO1xuICAgICAgICAvLyBfc2F2ZVNlc3Npb24gaXMgYWx3YXlzIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBzZXNzaW9uIGhhcyBiZWVuIGFjcXVpcmVkXG4gICAgICAgIC8vIHNvIHdlIGNhbiBzYWZlbHkgc3VwcHJlc3MgdGhlIHdhcm5pbmcgcmV0dXJuZWQgYnkgZnV0dXJlIGdldFNlc3Npb24gY2FsbHNcbiAgICAgICAgdGhpcy5zdXBwcmVzc0dldFNlc3Npb25XYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgIC8vIENyZWF0ZSBhIHNoYWxsb3cgY29weSB0byB3b3JrIHdpdGgsIHRvIGF2b2lkIG11dGF0aW5nIHRoZSBvcmlnaW5hbCBzZXNzaW9uIG9iamVjdCBpZiBpdCdzIHVzZWQgZWxzZXdoZXJlXG4gICAgICAgIGNvbnN0IHNlc3Npb25Ub1Byb2Nlc3MgPSBPYmplY3QuYXNzaWduKHt9LCBzZXNzaW9uKTtcbiAgICAgICAgY29uc3QgdXNlcklzUHJveHkgPSBzZXNzaW9uVG9Qcm9jZXNzLnVzZXIgJiYgc2Vzc2lvblRvUHJvY2Vzcy51c2VyLl9faXNVc2VyTm90QXZhaWxhYmxlUHJveHkgPT09IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnVzZXJTdG9yYWdlKSB7XG4gICAgICAgICAgICBpZiAoIXVzZXJJc1Byb3h5ICYmIHNlc3Npb25Ub1Byb2Nlc3MudXNlcikge1xuICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgYSByZWFsIHVzZXIgb2JqZWN0LCBzYXZlIGl0IHRvIHVzZXJTdG9yYWdlLlxuICAgICAgICAgICAgICAgIGF3YWl0IHNldEl0ZW1Bc3luYyh0aGlzLnVzZXJTdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkgKyAnLXVzZXInLCB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IHNlc3Npb25Ub1Byb2Nlc3MudXNlcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHVzZXJJc1Byb3h5KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgaXQncyB0aGUgcHJveHksIGl0IG1lYW5zIHVzZXIgd2FzIG5vdCBmb3VuZCBpbiB1c2VyU3RvcmFnZS5cbiAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgZW5zdXJlIG5vIHN0YWxlIHVzZXIgZGF0YSBmb3IgdGhpcyBrZXkgZXhpc3RzIGluIHVzZXJTdG9yYWdlIGlmIHdlIHdlcmUgdG8gc2F2ZSBudWxsLFxuICAgICAgICAgICAgICAgIC8vIG9yIHNpbXBseSBub3Qgc2F2ZSB0aGUgcHJveHkuIEZvciBub3csIHdlIGRvbid0IHNhdmUgdGhlIHByb3h5IGhlcmUuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIG5lZWQgdG8gY2xlYXIgdXNlclN0b3JhZ2UgaWYgdXNlciBiZWNvbWVzIHByb3h5LCB0aGF0IGxvZ2ljIHdvdWxkIGdvIGhlcmUuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtYWluIHNlc3Npb24gZGF0YSBmb3IgcHJpbWFyeSBzdG9yYWdlOiByZW1vdmUgdGhlIHVzZXIgcHJvcGVydHkgYmVmb3JlIGNsb25pbmdcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIG9yaWdpbmFsIHNlc3Npb24udXNlciBtaWdodCBiZSB0aGUgcHJveHlcbiAgICAgICAgICAgIGNvbnN0IG1haW5TZXNzaW9uRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHNlc3Npb25Ub1Byb2Nlc3MpO1xuICAgICAgICAgICAgZGVsZXRlIG1haW5TZXNzaW9uRGF0YS51c2VyOyAvLyBSZW1vdmUgdXNlciAocmVhbCBvciBwcm94eSkgYmVmb3JlIGNsb25pbmcgZm9yIG1haW4gc3RvcmFnZVxuICAgICAgICAgICAgY29uc3QgY2xvbmVkTWFpblNlc3Npb25EYXRhID0gZGVlcENsb25lKG1haW5TZXNzaW9uRGF0YSk7XG4gICAgICAgICAgICBhd2FpdCBzZXRJdGVtQXN5bmModGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXksIGNsb25lZE1haW5TZXNzaW9uRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBObyB1c2VyU3RvcmFnZSBpcyBjb25maWd1cmVkLlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBzZXNzaW9uLnVzZXIgc2hvdWxkIGlkZWFsbHkgbm90IGJlIGEgcHJveHkuXG4gICAgICAgICAgICAvLyBJZiBpdCB3ZXJlLCBzdHJ1Y3R1cmVkQ2xvbmUgd291bGQgZmFpbC4gVGhpcyBpbXBsaWVzIGFuIGlzc3VlIGVsc2V3aGVyZSBpZiB1c2VyIGlzIGEgcHJveHkgaGVyZVxuICAgICAgICAgICAgY29uc3QgY2xvbmVkU2Vzc2lvbiA9IGRlZXBDbG9uZShzZXNzaW9uVG9Qcm9jZXNzKTsgLy8gc2Vzc2lvblRvUHJvY2VzcyBzdGlsbCBoYXMgaXRzIG9yaWdpbmFsIHVzZXIgcHJvcGVydHlcbiAgICAgICAgICAgIGF3YWl0IHNldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSwgY2xvbmVkU2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX3JlbW92ZVNlc3Npb24oKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX3JlbW92ZVNlc3Npb24oKScpO1xuICAgICAgICB0aGlzLnN1cHByZXNzR2V0U2Vzc2lvbldhcm5pbmcgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5KTtcbiAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5ICsgJy1jb2RlLXZlcmlmaWVyJyk7XG4gICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSArICctdXNlcicpO1xuICAgICAgICBpZiAodGhpcy51c2VyU3RvcmFnZSkge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMudXNlclN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSArICctdXNlcicpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfT1VUJywgbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYW55IHJlZ2lzdGVyZWQgdmlzaWJpbGl0eWNoYW5nZSBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIHtAc2VlICNzdGFydEF1dG9SZWZyZXNofVxuICAgICAqIHtAc2VlICNzdG9wQXV0b1JlZnJlc2h9XG4gICAgICovXG4gICAgX3JlbW92ZVZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2soKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX3JlbW92ZVZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2soKScpO1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMudmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjaztcbiAgICAgICAgdGhpcy52aXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayAmJiBpc0Jyb3dzZXIoKSAmJiAod2luZG93ID09PSBudWxsIHx8IHdpbmRvdyA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIpKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3JlbW92aW5nIHZpc2liaWxpdHljaGFuZ2UgY2FsbGJhY2sgZmFpbGVkJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgI3N0YXJ0QXV0b1JlZnJlc2h9LiBVc2UgdGhpc1xuICAgICAqIHdpdGhpbiB0aGUgbGlicmFyeS5cbiAgICAgKi9cbiAgICBhc3luYyBfc3RhcnRBdXRvUmVmcmVzaCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RvcEF1dG9SZWZyZXNoKCk7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX3N0YXJ0QXV0b1JlZnJlc2goKScpO1xuICAgICAgICBjb25zdCB0aWNrZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLl9hdXRvUmVmcmVzaFRva2VuVGljaygpLCBBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyk7XG4gICAgICAgIHRoaXMuYXV0b1JlZnJlc2hUaWNrZXIgPSB0aWNrZXI7XG4gICAgICAgIGlmICh0aWNrZXIgJiYgdHlwZW9mIHRpY2tlciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRpY2tlci51bnJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gdGlja2VyIGlzIGEgTm9kZUpTIFRpbWVvdXQgb2JqZWN0IHRoYXQgaGFzIGFuIGB1bnJlZmAgbWV0aG9kXG4gICAgICAgICAgICAvLyBodHRwczovL25vZGVqcy5vcmcvYXBpL3RpbWVycy5odG1sI3RpbWVvdXR1bnJlZlxuICAgICAgICAgICAgLy8gV2hlbiBhdXRvIHJlZnJlc2ggaXMgdXNlZCBpbiBOb2RlSlMgKGxpa2UgZm9yIHRlc3RpbmcpIHRoZVxuICAgICAgICAgICAgLy8gYHNldEludGVydmFsYCBpcyBwcmV2ZW50aW5nIHRoZSBwcm9jZXNzIGZyb20gYmVpbmcgbWFya2VkIGFzXG4gICAgICAgICAgICAvLyBmaW5pc2hlZCBhbmQgdGVzdHMgcnVuIGVuZGxlc3NseS4gVGhpcyBjYW4gYmUgcHJldmVudGVkIGJ5IGNhbGxpbmdcbiAgICAgICAgICAgIC8vIGB1bnJlZigpYCBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0LlxuICAgICAgICAgICAgdGlja2VyLnVucmVmKCk7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRTIGhhcyBubyBjb250ZXh0IG9mIERlbm9cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgRGVubyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIERlbm8udW5yZWZUaW1lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gc2ltaWxhciBsaWtlIGZvciBOb2RlSlMsIGJ1dCB3aXRoIHRoZSBEZW5vIEFQSVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZW5vLmxhbmQvYXBpQGxhdGVzdD91bnN0YWJsZSZzPURlbm8udW5yZWZUaW1lclxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUUyBoYXMgbm8gY29udGV4dCBvZiBEZW5vXG4gICAgICAgICAgICBEZW5vLnVucmVmVGltZXIodGlja2VyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBydW4gdGhlIHRpY2sgaW1tZWRpYXRlbHksIGJ1dCBpbiB0aGUgbmV4dCBwYXNzIG9mIHRoZSBldmVudCBsb29wIHNvIHRoYXRcbiAgICAgICAgLy8gI19pbml0aWFsaXplIGNhbiBiZSBhbGxvd2VkIHRvIGNvbXBsZXRlIHdpdGhvdXQgcmVjdXJzaXZlbHkgd2FpdGluZyBvblxuICAgICAgICAvLyBpdHNlbGZcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fYXV0b1JlZnJlc2hUb2tlblRpY2soKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdGhlIHByaXZhdGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rICNzdG9wQXV0b1JlZnJlc2h9LiBVc2UgdGhpc1xuICAgICAqIHdpdGhpbiB0aGUgbGlicmFyeS5cbiAgICAgKi9cbiAgICBhc3luYyBfc3RvcEF1dG9SZWZyZXNoKCkge1xuICAgICAgICB0aGlzLl9kZWJ1ZygnI19zdG9wQXV0b1JlZnJlc2goKScpO1xuICAgICAgICBjb25zdCB0aWNrZXIgPSB0aGlzLmF1dG9SZWZyZXNoVGlja2VyO1xuICAgICAgICB0aGlzLmF1dG9SZWZyZXNoVGlja2VyID0gbnVsbDtcbiAgICAgICAgaWYgKHRpY2tlcikge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aWNrZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhbiBhdXRvLXJlZnJlc2ggcHJvY2VzcyBpbiB0aGUgYmFja2dyb3VuZC4gVGhlIHNlc3Npb24gaXMgY2hlY2tlZFxuICAgICAqIGV2ZXJ5IGZldyBzZWNvbmRzLiBDbG9zZSB0byB0aGUgdGltZSBvZiBleHBpcmF0aW9uIGEgcHJvY2VzcyBpcyBzdGFydGVkIHRvXG4gICAgICogcmVmcmVzaCB0aGUgc2Vzc2lvbi4gSWYgcmVmcmVzaGluZyBmYWlscyBpdCB3aWxsIGJlIHJldHJpZWQgZm9yIGFzIGxvbmcgYXNcbiAgICAgKiBuZWNlc3NhcnkuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugc2V0IHRoZSB7QGxpbmsgR29UcnVlQ2xpZW50T3B0aW9ucyNhdXRvUmVmcmVzaFRva2VufSB5b3UgZG9uJ3QgbmVlZFxuICAgICAqIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIE9uIGJyb3dzZXJzIHRoZSByZWZyZXNoIHByb2Nlc3Mgd29ya3Mgb25seSB3aGVuIHRoZSB0YWIvd2luZG93IGlzIGluIHRoZVxuICAgICAqIGZvcmVncm91bmQgdG8gY29uc2VydmUgcmVzb3VyY2VzIGFzIHdlbGwgYXMgcHJldmVudCByYWNlIGNvbmRpdGlvbnMgYW5kXG4gICAgICogZmxvb2RpbmcgYXV0aCB3aXRoIHJlcXVlc3RzLiBJZiB5b3UgY2FsbCB0aGlzIG1ldGhvZCBhbnkgbWFuYWdlZFxuICAgICAqIHZpc2liaWxpdHkgY2hhbmdlIGNhbGxiYWNrIHdpbGwgYmUgcmVtb3ZlZCBhbmQgeW91IG11c3QgbWFuYWdlIHZpc2liaWxpdHlcbiAgICAgKiBjaGFuZ2VzIG9uIHlvdXIgb3duLlxuICAgICAqXG4gICAgICogT24gbm9uLWJyb3dzZXIgcGxhdGZvcm1zIHRoZSByZWZyZXNoIHByb2Nlc3Mgd29ya3MgKmNvbnRpbnVvdXNseSogaW4gdGhlXG4gICAgICogYmFja2dyb3VuZCwgd2hpY2ggbWF5IG5vdCBiZSBkZXNpcmFibGUuIFlvdSBzaG91bGQgaG9vayBpbnRvIHlvdXJcbiAgICAgKiBwbGF0Zm9ybSdzIGZvcmVncm91bmQgaW5kaWNhdGlvbiBtZWNoYW5pc20gYW5kIGNhbGwgdGhlc2UgbWV0aG9kc1xuICAgICAqIGFwcHJvcHJpYXRlbHkgdG8gY29uc2VydmUgcmVzb3VyY2VzLlxuICAgICAqXG4gICAgICoge0BzZWUgI3N0b3BBdXRvUmVmcmVzaH1cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydEF1dG9SZWZyZXNoKCkge1xuICAgICAgICB0aGlzLl9yZW1vdmVWaXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3N0YXJ0QXV0b1JlZnJlc2goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RvcHMgYW4gYWN0aXZlIGF1dG8gcmVmcmVzaCBwcm9jZXNzIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQgKGlmIGFueSkuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgY2FsbCB0aGlzIG1ldGhvZCBhbnkgbWFuYWdlZCB2aXNpYmlsaXR5IGNoYW5nZSBjYWxsYmFjayB3aWxsIGJlXG4gICAgICogcmVtb3ZlZCBhbmQgeW91IG11c3QgbWFuYWdlIHZpc2liaWxpdHkgY2hhbmdlcyBvbiB5b3VyIG93bi5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgI3N0YXJ0QXV0b1JlZnJlc2h9IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgYXN5bmMgc3RvcEF1dG9SZWZyZXNoKCkge1xuICAgICAgICB0aGlzLl9yZW1vdmVWaXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3N0b3BBdXRvUmVmcmVzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW5zIHRoZSBhdXRvIHJlZnJlc2ggdG9rZW4gdGljay5cbiAgICAgKi9cbiAgICBhc3luYyBfYXV0b1JlZnJlc2hUb2tlblRpY2soKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX2F1dG9SZWZyZXNoVG9rZW5UaWNrKCknLCAnYmVnaW4nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0sIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uIHx8ICFzZXNzaW9uLnJlZnJlc2hfdG9rZW4gfHwgIXNlc3Npb24uZXhwaXJlc19hdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19hdXRvUmVmcmVzaFRva2VuVGljaygpJywgJ25vIHNlc3Npb24nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXNzaW9uIHdpbGwgZXhwaXJlIGluIHRoaXMgbWFueSB0aWNrcyAob3IgaGFzIGFscmVhZHkgZXhwaXJlZCBpZiA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGlyZXNJblRpY2tzID0gTWF0aC5mbG9vcigoc2Vzc2lvbi5leHBpcmVzX2F0ICogMTAwMCAtIG5vdykgLyBBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfYXV0b1JlZnJlc2hUb2tlblRpY2soKScsIGBhY2Nlc3MgdG9rZW4gZXhwaXJlcyBpbiAke2V4cGlyZXNJblRpY2tzfSB0aWNrcywgYSB0aWNrIGxhc3RzICR7QVVUT19SRUZSRVNIX1RJQ0tfRFVSQVRJT05fTVN9bXMsIHJlZnJlc2ggdGhyZXNob2xkIGlzICR7QVVUT19SRUZSRVNIX1RJQ0tfVEhSRVNIT0xEfSB0aWNrc2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBpcmVzSW5UaWNrcyA8PSBBVVRPX1JFRlJFU0hfVElDS19USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2FsbFJlZnJlc2hUb2tlbihzZXNzaW9uLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBdXRvIHJlZnJlc2ggdGljayBmYWlsZWQgd2l0aCBlcnJvci4gVGhpcyBpcyBsaWtlbHkgYSB0cmFuc2llbnQgZXJyb3IuJywgZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2F1dG9SZWZyZXNoVG9rZW5UaWNrKCknLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmlzQWNxdWlyZVRpbWVvdXQgfHwgZSBpbnN0YW5jZW9mIExvY2tBY3F1aXJlVGltZW91dEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJ2F1dG8gcmVmcmVzaCB0b2tlbiB0aWNrIGxvY2sgbm90IGF2YWlsYWJsZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIG9uIHRoZSBicm93c2VyIC8gcGxhdGZvcm0sIHdoaWNoIGluLXR1cm4gcnVuXG4gICAgICogYWxnb3JpdGhtcyB3aGVuIHRoZSBicm93c2VyIHdpbmRvdy90YWIgYXJlIGluIGZvcmVncm91bmQuIE9uIG5vbi1icm93c2VyXG4gICAgICogcGxhdGZvcm1zIGl0IGFzc3VtZXMgYWx3YXlzIGZvcmVncm91bmQuXG4gICAgICovXG4gICAgYXN5bmMgX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UoKScpO1xuICAgICAgICBpZiAoIWlzQnJvd3NlcigpIHx8ICEod2luZG93ID09PSBudWxsIHx8IHdpbmRvdyA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvUmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICAgICAgLy8gaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzIHRoZSByZWZyZXNoIHRva2VuIHRpY2tlciBydW5zIGFsd2F5c1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvUmVmcmVzaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2sgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLl9vblZpc2liaWxpdHlDaGFuZ2VkKGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdyA9PT0gbnVsbCB8fCB3aW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy52aXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrKTtcbiAgICAgICAgICAgIC8vIG5vdyBpbW1lZGlhdGVseSBjYWxsIHRoZSB2aXNiaWxpdHkgY2hhbmdlZCBjYWxsYmFjayB0byBzZXR1cCB3aXRoIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCB2aXNiaWxpdHkgc3RhdGVcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX29uVmlzaWJpbGl0eUNoYW5nZWQodHJ1ZSk7IC8vIGluaXRpYWwgY2FsbFxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UnLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIGB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScpYC5cbiAgICAgKi9cbiAgICBhc3luYyBfb25WaXNpYmlsaXR5Q2hhbmdlZChjYWxsZWRGcm9tSW5pdGlhbGl6ZSkge1xuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gYCNfb25WaXNpYmlsaXR5Q2hhbmdlZCgke2NhbGxlZEZyb21Jbml0aWFsaXplfSlgO1xuICAgICAgICB0aGlzLl9kZWJ1ZyhtZXRob2ROYW1lLCAndmlzaWJpbGl0eVN0YXRlJywgZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlKTtcbiAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvUmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICAgICAgLy8gaW4gYnJvd3NlciBlbnZpcm9ubWVudHMgdGhlIHJlZnJlc2ggdG9rZW4gdGlja2VyIHJ1bnMgb25seSBvbiBmb2N1c2VkIHRhYnNcbiAgICAgICAgICAgICAgICAvLyB3aGljaCBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbnNcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydEF1dG9SZWZyZXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNhbGxlZEZyb21Jbml0aWFsaXplKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FsbGVkIHdoZW4gdGhlIHZpc2liaWxpdHkgaGFzIGNoYW5nZWQsIGkuZS4gdGhlIGJyb3dzZXJcbiAgICAgICAgICAgICAgICAvLyB0cmFuc2l0aW9uZWQgZnJvbSBoaWRkZW4gLT4gdmlzaWJsZSBzbyB3ZSBuZWVkIHRvIHNlZSBpZiB0aGUgc2Vzc2lvblxuICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSByZWNvdmVyZWQgaW1tZWRpYXRlbHkuLi4gYnV0IHRvIGRvIHRoYXQgd2UgbmVlZCB0byBhY3F1aXJlXG4gICAgICAgICAgICAgICAgLy8gdGhlIGxvY2sgZmlyc3QgYXN5bmNocm9ub3VzbHlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgIT09ICd2aXNpYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcobWV0aG9kTmFtZSwgJ2FjcXVpcmVkIHRoZSBsb2NrIHRvIHJlY292ZXIgdGhlIHNlc3Npb24sIGJ1dCB0aGUgYnJvd3NlciB2aXNpYmlsaXR5U3RhdGUgaXMgbm8gbG9uZ2VyIHZpc2libGUsIGFib3J0aW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2aXNpYmlsaXR5IGhhcyBjaGFuZ2VkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBsb2NrLCBhYm9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgdGhlIHNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVjb3ZlckFuZFJlZnJlc2goKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvUmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcEF1dG9SZWZyZXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSByZWxldmFudCBsb2dpbiBVUkwgZm9yIGEgdGhpcmQtcGFydHkgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMucmVkaXJlY3RUbyBBIFVSTCBvciBtb2JpbGUgYWRkcmVzcyB0byBzZW5kIHRoZSB1c2VyIHRvIGFmdGVyIHRoZXkgYXJlIGNvbmZpcm1lZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5zY29wZXMgQSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBzY29wZXMgZ3JhbnRlZCB0byB0aGUgT0F1dGggYXBwbGljYXRpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMucXVlcnlQYXJhbXMgQW4gb2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyBjb250YWluaW5nIHF1ZXJ5IHBhcmFtZXRlcnMgZ3JhbnRlZCB0byB0aGUgT0F1dGggYXBwbGljYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgX2dldFVybEZvclByb3ZpZGVyKHVybCwgcHJvdmlkZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdXJsUGFyYW1zID0gW2Bwcm92aWRlcj0ke2VuY29kZVVSSUNvbXBvbmVudChwcm92aWRlcil9YF07XG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucmVkaXJlY3RUbykge1xuICAgICAgICAgICAgdXJsUGFyYW1zLnB1c2goYHJlZGlyZWN0X3RvPSR7ZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnMucmVkaXJlY3RUbyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY29wZXMpIHtcbiAgICAgICAgICAgIHVybFBhcmFtcy5wdXNoKGBzY29wZXM9JHtlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5zY29wZXMpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgIGNvbnN0IFtjb2RlQ2hhbGxlbmdlLCBjb2RlQ2hhbGxlbmdlTWV0aG9kXSA9IGF3YWl0IGdldENvZGVDaGFsbGVuZ2VBbmRNZXRob2QodGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgY29uc3QgZmxvd1BhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgICAgIGNvZGVfY2hhbGxlbmdlOiBgJHtlbmNvZGVVUklDb21wb25lbnQoY29kZUNoYWxsZW5nZSl9YCxcbiAgICAgICAgICAgICAgICBjb2RlX2NoYWxsZW5nZV9tZXRob2Q6IGAke2VuY29kZVVSSUNvbXBvbmVudChjb2RlQ2hhbGxlbmdlTWV0aG9kKX1gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1cmxQYXJhbXMucHVzaChmbG93UGFyYW1zLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhvcHRpb25zLnF1ZXJ5UGFyYW1zKTtcbiAgICAgICAgICAgIHVybFBhcmFtcy5wdXNoKHF1ZXJ5LnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2tpcEJyb3dzZXJSZWRpcmVjdCkge1xuICAgICAgICAgICAgdXJsUGFyYW1zLnB1c2goYHNraXBfaHR0cF9yZWRpcmVjdD0ke29wdGlvbnMuc2tpcEJyb3dzZXJSZWRpcmVjdH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7dXJsfT8ke3VybFBhcmFtcy5qb2luKCcmJyl9YDtcbiAgICB9XG4gICAgYXN5bmMgX3VuZW5yb2xsKHBhcmFtcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHNlc3Npb25EYXRhLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdERUxFVEUnLCBgJHt0aGlzLnVybH0vZmFjdG9ycy8ke3BhcmFtcy5mYWN0b3JJZH1gLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgand0OiAoX2EgPSBzZXNzaW9uRGF0YSA9PT0gbnVsbCB8fCBzZXNzaW9uRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2Vzc2lvbkRhdGEuc2Vzc2lvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9lbnJvbGwocGFyYW1zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHNlc3Npb25EYXRhLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IE9iamVjdC5hc3NpZ24oeyBmcmllbmRseV9uYW1lOiBwYXJhbXMuZnJpZW5kbHlOYW1lLCBmYWN0b3JfdHlwZTogcGFyYW1zLmZhY3RvclR5cGUgfSwgKHBhcmFtcy5mYWN0b3JUeXBlID09PSAncGhvbmUnXG4gICAgICAgICAgICAgICAgICAgID8geyBwaG9uZTogcGFyYW1zLnBob25lIH1cbiAgICAgICAgICAgICAgICAgICAgOiBwYXJhbXMuZmFjdG9yVHlwZSA9PT0gJ3RvdHAnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHsgaXNzdWVyOiBwYXJhbXMuaXNzdWVyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSAoYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vZmFjdG9yc2AsIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IChfYSA9IHNlc3Npb25EYXRhID09PSBudWxsIHx8IHNlc3Npb25EYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXNzaW9uRGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmZhY3RvclR5cGUgPT09ICd0b3RwJyAmJiBkYXRhLnR5cGUgPT09ICd0b3RwJyAmJiAoKF9iID0gZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYXRhLnRvdHApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5xcl9jb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnRvdHAucXJfY29kZSA9IGBkYXRhOmltYWdlL3N2Zyt4bWw7dXRmLTgsJHtkYXRhLnRvdHAucXJfY29kZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfdmVyaWZ5KHBhcmFtcykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogc2Vzc2lvbkRhdGEsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IE9iamVjdC5hc3NpZ24oeyBjaGFsbGVuZ2VfaWQ6IHBhcmFtcy5jaGFsbGVuZ2VJZCB9LCAoJ3dlYmF1dGhuJyBpbiBwYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYmF1dGhuOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcy53ZWJhdXRobiksIHsgY3JlZGVudGlhbF9yZXNwb25zZTogcGFyYW1zLndlYmF1dGhuLnR5cGUgPT09ICdjcmVhdGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvblJlc3BvbnNlKHBhcmFtcy53ZWJhdXRobi5jcmVkZW50aWFsX3Jlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdFJlc3BvbnNlKHBhcmFtcy53ZWJhdXRobi5jcmVkZW50aWFsX3Jlc3BvbnNlKSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogeyBjb2RlOiBwYXJhbXMuY29kZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L2ZhY3RvcnMvJHtwYXJhbXMuZmFjdG9ySWR9L3ZlcmlmeWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBqd3Q6IChfYSA9IHNlc3Npb25EYXRhID09PSBudWxsIHx8IHNlc3Npb25EYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXNzaW9uRGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oT2JqZWN0LmFzc2lnbih7IGV4cGlyZXNfYXQ6IE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApICsgZGF0YS5leHBpcmVzX2luIH0sIGRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ01GQV9DSEFMTEVOR0VfVkVSSUZJRUQnLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGEsIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX2NoYWxsZW5nZShwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHNlc3Npb25EYXRhLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L2ZhY3RvcnMvJHtwYXJhbXMuZmFjdG9ySWR9L2NoYWxsZW5nZWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGp3dDogKF9hID0gc2Vzc2lvbkRhdGEgPT09IG51bGwgfHwgc2Vzc2lvbkRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlc3Npb25EYXRhLnNlc3Npb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSAhPT0gJ3dlYmF1dGhuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEud2ViYXV0aG4udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY3JlYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGEpLCB7IHdlYmF1dGhuOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGEud2ViYXV0aG4pLCB7IGNyZWRlbnRpYWxfb3B0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkYXRhLndlYmF1dGhuLmNyZWRlbnRpYWxfb3B0aW9ucyksIHsgcHVibGljS2V5OiBkZXNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMoZGF0YS53ZWJhdXRobi5jcmVkZW50aWFsX29wdGlvbnMucHVibGljS2V5KSB9KSB9KSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlcXVlc3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0YSksIHsgd2ViYXV0aG46IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0YS53ZWJhdXRobiksIHsgY3JlZGVudGlhbF9vcHRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGEud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zKSwgeyBwdWJsaWNLZXk6IGRlc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zKGRhdGEud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zLnB1YmxpY0tleSkgfSkgfSkgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAc2VlIEdvVHJ1ZU1GQUFwaSNjaGFsbGVuZ2VBbmRWZXJpZnl9XG4gICAgICovXG4gICAgYXN5bmMgX2NoYWxsZW5nZUFuZFZlcmlmeShwYXJhbXMpIHtcbiAgICAgICAgLy8gYm90aCBfY2hhbGxlbmdlIGFuZCBfdmVyaWZ5IGluZGVwZW5kZW50bHkgYWNxdWlyZSB0aGUgbG9jaywgc28gbm8gbmVlZFxuICAgICAgICAvLyB0byBhY3F1aXJlIGl0IGhlcmVcbiAgICAgICAgY29uc3QgeyBkYXRhOiBjaGFsbGVuZ2VEYXRhLCBlcnJvcjogY2hhbGxlbmdlRXJyb3IgfSA9IGF3YWl0IHRoaXMuX2NoYWxsZW5nZSh7XG4gICAgICAgICAgICBmYWN0b3JJZDogcGFyYW1zLmZhY3RvcklkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNoYWxsZW5nZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IGNoYWxsZW5nZUVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl92ZXJpZnkoe1xuICAgICAgICAgICAgZmFjdG9ySWQ6IHBhcmFtcy5mYWN0b3JJZCxcbiAgICAgICAgICAgIGNoYWxsZW5nZUlkOiBjaGFsbGVuZ2VEYXRhLmlkLFxuICAgICAgICAgICAgY29kZTogcGFyYW1zLmNvZGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QHNlZSBHb1RydWVNRkFBcGkjbGlzdEZhY3RvcnN9XG4gICAgICovXG4gICAgYXN5bmMgX2xpc3RGYWN0b3JzKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIC8vIHVzZSAjZ2V0VXNlciBpbnN0ZWFkIG9mICNfZ2V0VXNlciBhcyB0aGUgZm9ybWVyIGFjcXVpcmVzIGEgbG9ja1xuICAgICAgICBjb25zdCB7IGRhdGE6IHsgdXNlciB9LCBlcnJvcjogdXNlckVycm9yLCB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyKCk7XG4gICAgICAgIGlmICh1c2VyRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiB1c2VyRXJyb3IgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgYWxsOiBbXSxcbiAgICAgICAgICAgIHBob25lOiBbXSxcbiAgICAgICAgICAgIHRvdHA6IFtdLFxuICAgICAgICAgICAgd2ViYXV0aG46IFtdLFxuICAgICAgICB9O1xuICAgICAgICAvLyBsb29wIG92ZXIgdGhlIGZhY3RvcnMgT05DRVxuICAgICAgICBmb3IgKGNvbnN0IGZhY3RvciBvZiAoX2EgPSB1c2VyID09PSBudWxsIHx8IHVzZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVzZXIuZmFjdG9ycykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10pIHtcbiAgICAgICAgICAgIGRhdGEuYWxsLnB1c2goZmFjdG9yKTtcbiAgICAgICAgICAgIGlmIChmYWN0b3Iuc3RhdHVzID09PSAndmVyaWZpZWQnKSB7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIGRhdGFbZmFjdG9yLmZhY3Rvcl90eXBlXS5wdXNoKGZhY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BzZWUgR29UcnVlTUZBQXBpI2dldEF1dGhlbnRpY2F0b3JBc3N1cmFuY2VMZXZlbH1cbiAgICAgKi9cbiAgICBhc3luYyBfZ2V0QXV0aGVudGljYXRvckFzc3VyYW5jZUxldmVsKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9LCBlcnJvcjogc2Vzc2lvbkVycm9yLCB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKCk7XG4gICAgICAgIGlmIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7IGN1cnJlbnRMZXZlbDogbnVsbCwgbmV4dExldmVsOiBudWxsLCBjdXJyZW50QXV0aGVudGljYXRpb25NZXRob2RzOiBbXSB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHBheWxvYWQgfSA9IGRlY29kZUpXVChzZXNzaW9uLmFjY2Vzc190b2tlbik7XG4gICAgICAgIGxldCBjdXJyZW50TGV2ZWwgPSBudWxsO1xuICAgICAgICBpZiAocGF5bG9hZC5hYWwpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMZXZlbCA9IHBheWxvYWQuYWFsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0TGV2ZWwgPSBjdXJyZW50TGV2ZWw7XG4gICAgICAgIGNvbnN0IHZlcmlmaWVkRmFjdG9ycyA9IChfYiA9IChfYSA9IHNlc3Npb24udXNlci5mYWN0b3JzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmlsdGVyKChmYWN0b3IpID0+IGZhY3Rvci5zdGF0dXMgPT09ICd2ZXJpZmllZCcpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXTtcbiAgICAgICAgaWYgKHZlcmlmaWVkRmFjdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuZXh0TGV2ZWwgPSAnYWFsMic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudEF1dGhlbnRpY2F0aW9uTWV0aG9kcyA9IHBheWxvYWQuYW1yIHx8IFtdO1xuICAgICAgICByZXR1cm4geyBkYXRhOiB7IGN1cnJlbnRMZXZlbCwgbmV4dExldmVsLCBjdXJyZW50QXV0aGVudGljYXRpb25NZXRob2RzIH0sIGVycm9yOiBudWxsIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBkZXRhaWxzIGFib3V0IGFuIE9BdXRoIGF1dGhvcml6YXRpb24gcmVxdWVzdC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqXG4gICAgICogUmV0dXJucyBhdXRob3JpemF0aW9uIGRldGFpbHMgaW5jbHVkaW5nIGNsaWVudCBpbmZvLCBzY29wZXMsIGFuZCB1c2VyIGluZm9ybWF0aW9uLlxuICAgICAqIElmIHRoZSBBUEkgcmV0dXJucyBhIHJlZGlyZWN0X3VyaSwgaXQgbWVhbnMgY29uc2VudCB3YXMgYWxyZWFkeSBnaXZlbiAtIHRoZSBjYWxsZXJcbiAgICAgKiBzaG91bGQgaGFuZGxlIHRoZSByZWRpcmVjdCBtYW51YWxseSBpZiBuZWVkZWQuXG4gICAgICovXG4gICAgYXN5bmMgX2dldEF1dGhvcml6YXRpb25EZXRhaWxzKGF1dGhvcml6YXRpb25JZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0sIGVycm9yOiBzZXNzaW9uRXJyb3IsIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L29hdXRoL2F1dGhvcml6YXRpb25zLyR7YXV0aG9yaXphdGlvbklkfWAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IHNlc3Npb24uYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogKGRhdGEpID0+ICh7IGRhdGEsIGVycm9yOiBudWxsIH0pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwcm92ZXMgYW4gT0F1dGggYXV0aG9yaXphdGlvbiByZXF1ZXN0LlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICovXG4gICAgYXN5bmMgX2FwcHJvdmVBdXRob3JpemF0aW9uKGF1dGhvcml6YXRpb25JZCwgb3B0aW9ucykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0sIGVycm9yOiBzZXNzaW9uRXJyb3IsIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vb2F1dGgvYXV0aG9yaXphdGlvbnMvJHthdXRob3JpemF0aW9uSWR9L2NvbnNlbnRgLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgand0OiBzZXNzaW9uLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogeyBhY3Rpb246ICdhcHByb3ZlJyB9LFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogKGRhdGEpID0+ICh7IGRhdGEsIGVycm9yOiBudWxsIH0pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEucmVkaXJlY3RfdXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgcmVkaXJlY3QgaW4gYnJvd3NlciB1bmxlc3Mgc2tpcEJyb3dzZXJSZWRpcmVjdCBpcyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0Jyb3dzZXIoKSAmJiAhKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5za2lwQnJvd3NlclJlZGlyZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihyZXNwb25zZS5kYXRhLnJlZGlyZWN0X3VybCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVuaWVzIGFuIE9BdXRoIGF1dGhvcml6YXRpb24gcmVxdWVzdC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqL1xuICAgIGFzeW5jIF9kZW55QXV0aG9yaXphdGlvbihhdXRob3JpemF0aW9uSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9LCBlcnJvcjogc2Vzc2lvbkVycm9yLCB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L29hdXRoL2F1dGhvcml6YXRpb25zLyR7YXV0aG9yaXphdGlvbklkfS9jb25zZW50YCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHsgYWN0aW9uOiAnZGVueScgfSxcbiAgICAgICAgICAgICAgICAgICAgeGZvcm06IChkYXRhKSA9PiAoeyBkYXRhLCBlcnJvcjogbnVsbCB9KSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YSAmJiByZXNwb25zZS5kYXRhLnJlZGlyZWN0X3VybCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IHJlZGlyZWN0IGluIGJyb3dzZXIgdW5sZXNzIHNraXBCcm93c2VyUmVkaXJlY3QgaXMgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNCcm93c2VyKCkgJiYgIShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2tpcEJyb3dzZXJSZWRpcmVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24ocmVzcG9uc2UuZGF0YS5yZWRpcmVjdF91cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3RzIGFsbCBPQXV0aCBncmFudHMgdGhhdCB0aGUgYXV0aGVudGljYXRlZCB1c2VyIGhhcyBhdXRob3JpemVkLlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICovXG4gICAgYXN5bmMgX2xpc3RPQXV0aEdyYW50cygpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9LCBlcnJvcjogc2Vzc2lvbkVycm9yLCB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0dFVCcsIGAke3RoaXMudXJsfS91c2VyL29hdXRoL2dyYW50c2AsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IHNlc3Npb24uYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogKGRhdGEpID0+ICh7IGRhdGEsIGVycm9yOiBudWxsIH0pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV2b2tlcyBhIHVzZXIncyBPQXV0aCBncmFudCBmb3IgYSBzcGVjaWZpYyBjbGllbnQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHRoZSBPQXV0aCAyLjEgc2VydmVyIGlzIGVuYWJsZWQgaW4gU3VwYWJhc2UgQXV0aC5cbiAgICAgKi9cbiAgICBhc3luYyBfcmV2b2tlT0F1dGhHcmFudChvcHRpb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSwgZXJyb3I6IHNlc3Npb25FcnJvciwgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0RFTEVURScsIGAke3RoaXMudXJsfS91c2VyL29hdXRoL2dyYW50c2AsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IHNlc3Npb24uYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeTogeyBjbGllbnRfaWQ6IG9wdGlvbnMuY2xpZW50SWQgfSxcbiAgICAgICAgICAgICAgICAgICAgbm9SZXNvbHZlSnNvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZldGNoSndrKGtpZCwgandrcyA9IHsga2V5czogW10gfSkge1xuICAgICAgICAvLyB0cnkgZmV0Y2hpbmcgZnJvbSB0aGUgc3VwcGxpZWQgandrc1xuICAgICAgICBsZXQgandrID0gandrcy5rZXlzLmZpbmQoKGtleSkgPT4ga2V5LmtpZCA9PT0ga2lkKTtcbiAgICAgICAgaWYgKGp3aykge1xuICAgICAgICAgICAgcmV0dXJuIGp3aztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAvLyB0cnkgZmV0Y2hpbmcgZnJvbSBjYWNoZVxuICAgICAgICBqd2sgPSB0aGlzLmp3a3Mua2V5cy5maW5kKChrZXkpID0+IGtleS5raWQgPT09IGtpZCk7XG4gICAgICAgIC8vIGp3ayBleGlzdHMgYW5kIGp3a3MgaXNuJ3Qgc3RhbGVcbiAgICAgICAgaWYgKGp3ayAmJiB0aGlzLmp3a3NfY2FjaGVkX2F0ICsgSldLU19UVEwgPiBub3cpIHtcbiAgICAgICAgICAgIHJldHVybiBqd2s7XG4gICAgICAgIH1cbiAgICAgICAgLy8gandrIGlzbid0IGNhY2hlZCBpbiBtZW1vcnkgc28gd2UgbmVlZCB0byBmZXRjaCBpdCBmcm9tIHRoZSB3ZWxsLWtub3duIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vLndlbGwta25vd24vandrcy5qc29uYCwge1xuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRhdGEua2V5cyB8fCBkYXRhLmtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmp3a3MgPSBkYXRhO1xuICAgICAgICB0aGlzLmp3a3NfY2FjaGVkX2F0ID0gbm93O1xuICAgICAgICAvLyBGaW5kIHRoZSBzaWduaW5nIGtleVxuICAgICAgICBqd2sgPSBkYXRhLmtleXMuZmluZCgoa2V5KSA9PiBrZXkua2lkID09PSBraWQpO1xuICAgICAgICBpZiAoIWp3aykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGp3aztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgdGhlIEpXVCBjbGFpbXMgcHJlc2VudCBpbiB0aGUgYWNjZXNzIHRva2VuIGJ5IGZpcnN0IHZlcmlmeWluZyB0aGVcbiAgICAgKiBKV1QgYWdhaW5zdCB0aGUgc2VydmVyJ3MgSlNPTiBXZWIgS2V5IFNldCBlbmRwb2ludFxuICAgICAqIGAvLndlbGwta25vd24vandrcy5qc29uYCB3aGljaCBpcyBvZnRlbiBjYWNoZWQsIHJlc3VsdGluZyBpbiBzaWduaWZpY2FudGx5XG4gICAgICogZmFzdGVyIHJlc3BvbnNlcy4gUHJlZmVyIHRoaXMgbWV0aG9kIG92ZXIge0BsaW5rICNnZXRVc2VyfSB3aGljaCBhbHdheXNcbiAgICAgKiBzZW5kcyBhIHJlcXVlc3QgdG8gdGhlIEF1dGggc2VydmVyIGZvciBlYWNoIEpXVC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBwcm9qZWN0IGlzIG5vdCB1c2luZyBhbiBhc3ltbWV0cmljIEpXVCBzaWduaW5nIGtleSAobGlrZSBFQ0Mgb3JcbiAgICAgKiBSU0EpIGl0IGFsd2F5cyBzZW5kcyBhIHJlcXVlc3QgdG8gdGhlIEF1dGggc2VydmVyIChzaW1pbGFyIHRvIHtAbGlua1xuICAgICAqICNnZXRVc2VyfSkgdG8gdmVyaWZ5IHRoZSBKV1QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gand0IEFuIG9wdGlvbmFsIHNwZWNpZmljIEpXVCB5b3Ugd2lzaCB0byB2ZXJpZnksIG5vdCB0aGUgb25lIHlvdVxuICAgICAqICAgICAgICAgICAgY2FuIG9idGFpbiBmcm9tIHtAbGluayAjZ2V0U2Vzc2lvbn0uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVmFyaW91cyBhZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBhbGxvdyB5b3UgdG8gY3VzdG9taXplIHRoZVxuICAgICAqICAgICAgICAgICAgICAgIGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kLlxuICAgICAqL1xuICAgIGFzeW5jIGdldENsYWltcyhqd3QsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHRva2VuID0gand0O1xuICAgICAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciB8fCAhZGF0YS5zZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdG9rZW4gPSBkYXRhLnNlc3Npb24uYWNjZXNzX3Rva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBoZWFkZXIsIHBheWxvYWQsIHNpZ25hdHVyZSwgcmF3OiB7IGhlYWRlcjogcmF3SGVhZGVyLCBwYXlsb2FkOiByYXdQYXlsb2FkIH0sIH0gPSBkZWNvZGVKV1QodG9rZW4pO1xuICAgICAgICAgICAgaWYgKCEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmFsbG93RXhwaXJlZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBSZWplY3QgZXhwaXJlZCBKV1RzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiBqd3QgYXJndW1lbnQgd2FzIHBhc3NlZFxuICAgICAgICAgICAgICAgIHZhbGlkYXRlRXhwKHBheWxvYWQuZXhwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNpZ25pbmdLZXkgPSAhaGVhZGVyLmFsZyB8fFxuICAgICAgICAgICAgICAgIGhlYWRlci5hbGcuc3RhcnRzV2l0aCgnSFMnKSB8fFxuICAgICAgICAgICAgICAgICFoZWFkZXIua2lkIHx8XG4gICAgICAgICAgICAgICAgISgnY3J5cHRvJyBpbiBnbG9iYWxUaGlzICYmICdzdWJ0bGUnIGluIGdsb2JhbFRoaXMuY3J5cHRvKVxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogYXdhaXQgdGhpcy5mZXRjaEp3ayhoZWFkZXIua2lkLCAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmtleXMpID8geyBrZXlzOiBvcHRpb25zLmtleXMgfSA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5qd2tzKTtcbiAgICAgICAgICAgIC8vIElmIHN5bW1ldHJpYyBhbGdvcml0aG0gb3IgV2ViQ3J5cHRvIEFQSSBpcyB1bmF2YWlsYWJsZSwgZmFsbGJhY2sgdG8gZ2V0VXNlcigpXG4gICAgICAgICAgICBpZiAoIXNpZ25pbmdLZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVycm9yIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIodG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZ2V0VXNlciBzdWNjZWVkcyBzbyB0aGUgY2xhaW1zIGluIHRoZSBKV1QgY2FuIGJlIHRydXN0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFpbXM6IHBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGdvcml0aG0gPSBnZXRBbGdvcml0aG0oaGVhZGVyLmFsZyk7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IEpXSyB0byBDcnlwdG9LZXlcbiAgICAgICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCdqd2snLCBzaWduaW5nS2V5LCBhbGdvcml0aG0sIHRydWUsIFtcbiAgICAgICAgICAgICAgICAndmVyaWZ5JyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBzaWduYXR1cmVcbiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLnZlcmlmeShhbGdvcml0aG0sIHB1YmxpY0tleSwgc2lnbmF0dXJlLCBzdHJpbmdUb1VpbnQ4QXJyYXkoYCR7cmF3SGVhZGVyfS4ke3Jhd1BheWxvYWR9YCkpO1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbnZhbGlkSnd0RXJyb3IoJ0ludmFsaWQgSldUIHNpZ25hdHVyZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdmVyaWZpY2F0aW9uIHN1Y2NlZWRzLCBkZWNvZGUgYW5kIHJldHVybiBjbGFpbXNcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjbGFpbXM6IHBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxufVxuR29UcnVlQ2xpZW50Lm5leHRJbnN0YW5jZUlEID0ge307XG5leHBvcnQgZGVmYXVsdCBHb1RydWVDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Hb1RydWVDbGllbnQuanMubWFwIl0sIm5hbWVzIjpbIkdvVHJ1ZUFkbWluQXBpIiwiQVVUT19SRUZSRVNIX1RJQ0tfRFVSQVRJT05fTVMiLCJBVVRPX1JFRlJFU0hfVElDS19USFJFU0hPTEQiLCJERUZBVUxUX0hFQURFUlMiLCJFWFBJUllfTUFSR0lOX01TIiwiR09UUlVFX1VSTCIsIkpXS1NfVFRMIiwiU1RPUkFHRV9LRVkiLCJBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IiLCJBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3IiLCJBdXRoSW52YWxpZEp3dEVycm9yIiwiQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IiLCJBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvciIsIkF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvciIsIkF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yIiwiQXV0aFVua25vd25FcnJvciIsImlzQXV0aEFwaUVycm9yIiwiaXNBdXRoRXJyb3IiLCJpc0F1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciIsImlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IiLCJpc0F1dGhTZXNzaW9uTWlzc2luZ0Vycm9yIiwiX3JlcXVlc3QiLCJfc2Vzc2lvblJlc3BvbnNlIiwiX3Nlc3Npb25SZXNwb25zZVBhc3N3b3JkIiwiX3Nzb1Jlc3BvbnNlIiwiX3VzZXJSZXNwb25zZSIsImRlY29kZUpXVCIsImRlZXBDbG9uZSIsIkRlZmVycmVkIiwiZ2VuZXJhdGVDYWxsYmFja0lkIiwiZ2V0QWxnb3JpdGhtIiwiZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZCIsImdldEl0ZW1Bc3luYyIsImluc2VjdXJlVXNlcldhcm5pbmdQcm94eSIsImlzQnJvd3NlciIsInBhcnNlUGFyYW1ldGVyc0Zyb21VUkwiLCJyZW1vdmVJdGVtQXN5bmMiLCJyZXNvbHZlRmV0Y2giLCJyZXRyeWFibGUiLCJzZXRJdGVtQXN5bmMiLCJzbGVlcCIsInN1cHBvcnRzTG9jYWxTdG9yYWdlIiwidXNlck5vdEF2YWlsYWJsZVByb3h5IiwidmFsaWRhdGVFeHAiLCJtZW1vcnlMb2NhbFN0b3JhZ2VBZGFwdGVyIiwiTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IiLCJuYXZpZ2F0b3JMb2NrIiwicG9seWZpbGxHbG9iYWxUaGlzIiwidmVyc2lvbiIsImJ5dGVzVG9CYXNlNjRVUkwiLCJzdHJpbmdUb1VpbnQ4QXJyYXkiLCJjcmVhdGVTaXdlTWVzc2FnZSIsImZyb21IZXgiLCJnZXRBZGRyZXNzIiwidG9IZXgiLCJkZXNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMiLCJkZXNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyIsInNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvblJlc3BvbnNlIiwic2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RSZXNwb25zZSIsIldlYkF1dGhuQXBpIiwiREVGQVVMVF9PUFRJT05TIiwidXJsIiwic3RvcmFnZUtleSIsImF1dG9SZWZyZXNoVG9rZW4iLCJwZXJzaXN0U2Vzc2lvbiIsImRldGVjdFNlc3Npb25JblVybCIsImhlYWRlcnMiLCJmbG93VHlwZSIsImRlYnVnIiwiaGFzQ3VzdG9tQXV0aG9yaXphdGlvbkhlYWRlciIsInRocm93T25FcnJvciIsImxvY2tOb09wIiwibmFtZSIsImFjcXVpcmVUaW1lb3V0IiwiZm4iLCJHTE9CQUxfSldLUyIsIkdvVHJ1ZUNsaWVudCIsImp3a3MiLCJfYSIsIl9iIiwia2V5cyIsInZhbHVlIiwiT2JqZWN0IiwiYXNzaWduIiwiandrc19jYWNoZWRfYXQiLCJjYWNoZWRBdCIsIk51bWJlciIsIk1JTl9TQUZFX0lOVEVHRVIiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJfYyIsInVzZXJTdG9yYWdlIiwibWVtb3J5U3RvcmFnZSIsInN0YXRlQ2hhbmdlRW1pdHRlcnMiLCJNYXAiLCJhdXRvUmVmcmVzaFRpY2tlciIsInZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2siLCJyZWZyZXNoaW5nRGVmZXJyZWQiLCJpbml0aWFsaXplUHJvbWlzZSIsInN1cHByZXNzR2V0U2Vzc2lvbldhcm5pbmciLCJsb2NrQWNxdWlyZWQiLCJwZW5kaW5nSW5Mb2NrIiwiYnJvYWRjYXN0Q2hhbm5lbCIsImxvZ2dlciIsImNvbnNvbGUiLCJsb2ciLCJzZXR0aW5ncyIsImluc3RhbmNlSUQiLCJuZXh0SW5zdGFuY2VJRCIsImxvZ0RlYnVnTWVzc2FnZXMiLCJtZXNzYWdlIiwiX2xvZ1ByZWZpeCIsIndhcm4iLCJ0cmFjZSIsImFkbWluIiwiZmV0Y2giLCJsb2NrIiwiZ2xvYmFsVGhpcyIsIm5hdmlnYXRvciIsImxvY2tzIiwibWZhIiwidmVyaWZ5IiwiX3ZlcmlmeSIsImJpbmQiLCJlbnJvbGwiLCJfZW5yb2xsIiwidW5lbnJvbGwiLCJfdW5lbnJvbGwiLCJjaGFsbGVuZ2UiLCJfY2hhbGxlbmdlIiwibGlzdEZhY3RvcnMiLCJfbGlzdEZhY3RvcnMiLCJjaGFsbGVuZ2VBbmRWZXJpZnkiLCJfY2hhbGxlbmdlQW5kVmVyaWZ5IiwiZ2V0QXV0aGVudGljYXRvckFzc3VyYW5jZUxldmVsIiwiX2dldEF1dGhlbnRpY2F0b3JBc3N1cmFuY2VMZXZlbCIsIndlYmF1dGhuIiwib2F1dGgiLCJnZXRBdXRob3JpemF0aW9uRGV0YWlscyIsIl9nZXRBdXRob3JpemF0aW9uRGV0YWlscyIsImFwcHJvdmVBdXRob3JpemF0aW9uIiwiX2FwcHJvdmVBdXRob3JpemF0aW9uIiwiZGVueUF1dGhvcml6YXRpb24iLCJfZGVueUF1dGhvcml6YXRpb24iLCJsaXN0R3JhbnRzIiwiX2xpc3RPQXV0aEdyYW50cyIsInJldm9rZUdyYW50IiwiX3Jldm9rZU9BdXRoR3JhbnQiLCJzdG9yYWdlIiwibG9jYWxTdG9yYWdlIiwiQnJvYWRjYXN0Q2hhbm5lbCIsImUiLCJlcnJvciIsImFkZEV2ZW50TGlzdGVuZXIiLCJldmVudCIsIl9kZWJ1ZyIsIl9ub3RpZnlBbGxTdWJzY3JpYmVycyIsImRhdGEiLCJzZXNzaW9uIiwiaW5pdGlhbGl6ZSIsImlzVGhyb3dPbkVycm9yRW5hYmxlZCIsIl9yZXR1cm5SZXN1bHQiLCJyZXN1bHQiLCJEYXRlIiwidG9JU09TdHJpbmciLCJhcmdzIiwiX2FjcXVpcmVMb2NrIiwiX2luaXRpYWxpemUiLCJwYXJhbXMiLCJjYWxsYmFja1VybFR5cGUiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhyZWYiLCJfaXNJbXBsaWNpdEdyYW50Q2FsbGJhY2siLCJfaXNQS0NFQ2FsbGJhY2siLCJfZ2V0U2Vzc2lvbkZyb21VUkwiLCJlcnJvckNvZGUiLCJkZXRhaWxzIiwiY29kZSIsIl9yZW1vdmVTZXNzaW9uIiwicmVkaXJlY3RUeXBlIiwiX3NhdmVTZXNzaW9uIiwic2V0VGltZW91dCIsIl9yZWNvdmVyQW5kUmVmcmVzaCIsIl9oYW5kbGVWaXNpYmlsaXR5Q2hhbmdlIiwic2lnbkluQW5vbnltb3VzbHkiLCJjcmVkZW50aWFscyIsInJlcyIsImJvZHkiLCJnb3RydWVfbWV0YV9zZWN1cml0eSIsImNhcHRjaGFfdG9rZW4iLCJjYXB0Y2hhVG9rZW4iLCJ4Zm9ybSIsInVzZXIiLCJzaWduVXAiLCJlbWFpbCIsInBhc3N3b3JkIiwiY29kZUNoYWxsZW5nZSIsImNvZGVDaGFsbGVuZ2VNZXRob2QiLCJyZWRpcmVjdFRvIiwiZW1haWxSZWRpcmVjdFRvIiwiY29kZV9jaGFsbGVuZ2UiLCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiLCJwaG9uZSIsImNoYW5uZWwiLCJzaWduSW5XaXRoUGFzc3dvcmQiLCJpbnZhbGlkVG9rZW5FcnJvciIsIndlYWtfcGFzc3dvcmQiLCJ3ZWFrUGFzc3dvcmQiLCJzaWduSW5XaXRoT0F1dGgiLCJfZCIsIl9oYW5kbGVQcm92aWRlclNpZ25JbiIsInByb3ZpZGVyIiwic2NvcGVzIiwicXVlcnlQYXJhbXMiLCJza2lwQnJvd3NlclJlZGlyZWN0IiwiZXhjaGFuZ2VDb2RlRm9yU2Vzc2lvbiIsImF1dGhDb2RlIiwiX2V4Y2hhbmdlQ29kZUZvclNlc3Npb24iLCJzaWduSW5XaXRoV2ViMyIsImNoYWluIiwic2lnbkluV2l0aEV0aGVyZXVtIiwic2lnbkluV2l0aFNvbGFuYSIsIkVycm9yIiwiX2UiLCJfZiIsIl9nIiwiX2giLCJfaiIsIl9rIiwiX2wiLCJzaWduYXR1cmUiLCJ3YWxsZXQiLCJzdGF0ZW1lbnQiLCJyZXNvbHZlZFdhbGxldCIsIndpbmRvd0FueSIsImV0aGVyZXVtIiwicmVxdWVzdCIsIlVSTCIsImFjY291bnRzIiwibWV0aG9kIiwidGhlbiIsImFjY3MiLCJjYXRjaCIsImxlbmd0aCIsImFkZHJlc3MiLCJjaGFpbklkIiwiY2hhaW5JZEhleCIsInNpd2VNZXNzYWdlIiwiZG9tYWluIiwiaG9zdCIsInVyaSIsIm5vbmNlIiwiaXNzdWVkQXQiLCJleHBpcmF0aW9uVGltZSIsIm5vdEJlZm9yZSIsInJlcXVlc3RJZCIsInJlc291cmNlcyIsIl9tIiwic29sYW5hIiwic2lnbkluIiwic2lnbk1lc3NhZ2UiLCJvdXRwdXQiLCJvdXRwdXRUb1Byb2Nlc3MiLCJBcnJheSIsImlzQXJyYXkiLCJzaWduZWRNZXNzYWdlIiwiVWludDhBcnJheSIsIlRleHREZWNvZGVyIiwiZGVjb2RlIiwicHVibGljS2V5IiwidG9CYXNlNTgiLCJtYXAiLCJyZXNvdXJjZSIsImpvaW4iLCJtYXliZVNpZ25hdHVyZSIsIlRleHRFbmNvZGVyIiwiZW5jb2RlIiwic3RvcmFnZUl0ZW0iLCJjb2RlVmVyaWZpZXIiLCJzcGxpdCIsImF1dGhfY29kZSIsImNvZGVfdmVyaWZpZXIiLCJzaWduSW5XaXRoSWRUb2tlbiIsInRva2VuIiwiYWNjZXNzX3Rva2VuIiwiaWRfdG9rZW4iLCJzaWduSW5XaXRoT3RwIiwiY3JlYXRlX3VzZXIiLCJzaG91bGRDcmVhdGVVc2VyIiwibWVzc2FnZUlkIiwibWVzc2FnZV9pZCIsInZlcmlmeU90cCIsInVuZGVmaW5lZCIsInRva2VuVmVyaWZpY2F0aW9uRXJyb3IiLCJ0eXBlIiwic2lnbkluV2l0aFNTTyIsInByb3ZpZGVyX2lkIiwicHJvdmlkZXJJZCIsInJlZGlyZWN0X3RvIiwic2tpcF9odHRwX3JlZGlyZWN0IiwicmVhdXRoZW50aWNhdGUiLCJfcmVhdXRoZW50aWNhdGUiLCJfdXNlU2Vzc2lvbiIsInNlc3Npb25FcnJvciIsImp3dCIsInJlc2VuZCIsImVuZHBvaW50IiwiZ2V0U2Vzc2lvbiIsImxhc3QiLCJQcm9taXNlIiwicmVzb2x2ZSIsInB1c2giLCJ3YWl0T24iLCJhbGwiLCJzcGxpY2UiLCJfX2xvYWRTZXNzaW9uIiwic3RhY2siLCJjdXJyZW50U2Vzc2lvbiIsIm1heWJlU2Vzc2lvbiIsIl9pc1ZhbGlkU2Vzc2lvbiIsImhhc0V4cGlyZWQiLCJleHBpcmVzX2F0Iiwibm93IiwibWF5YmVVc2VyIiwiaXNTZXJ2ZXIiLCJfX2lzVXNlck5vdEF2YWlsYWJsZVByb3h5Iiwic3VwcHJlc3NXYXJuaW5nUmVmIiwiX2NhbGxSZWZyZXNoVG9rZW4iLCJyZWZyZXNoX3Rva2VuIiwiZ2V0VXNlciIsIl9nZXRVc2VyIiwidXBkYXRlVXNlciIsImF0dHJpYnV0ZXMiLCJfdXBkYXRlVXNlciIsInNlc3Npb25EYXRhIiwidXNlckVycm9yIiwic2V0U2Vzc2lvbiIsIl9zZXRTZXNzaW9uIiwidGltZU5vdyIsImV4cGlyZXNBdCIsInBheWxvYWQiLCJleHAiLCJyZWZyZXNoZWRTZXNzaW9uIiwidG9rZW5fdHlwZSIsImV4cGlyZXNfaW4iLCJyZWZyZXNoU2Vzc2lvbiIsIl9yZWZyZXNoU2Vzc2lvbiIsImVycm9yX2Rlc2NyaXB0aW9uIiwiZXJyb3JfY29kZSIsInNlYXJjaFBhcmFtcyIsImRlbGV0ZSIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJzdGF0ZSIsInRvU3RyaW5nIiwicHJvdmlkZXJfdG9rZW4iLCJwcm92aWRlcl9yZWZyZXNoX3Rva2VuIiwiTWF0aCIsInJvdW5kIiwiZXhwaXJlc0luIiwicGFyc2VJbnQiLCJhY3R1YWxseUV4cGlyZXNJbiIsImhhc2giLCJCb29sZWFuIiwiY3VycmVudFN0b3JhZ2VDb250ZW50Iiwic2lnbk91dCIsInNjb3BlIiwiX3NpZ25PdXQiLCJhY2Nlc3NUb2tlbiIsInN0YXR1cyIsIm9uQXV0aFN0YXRlQ2hhbmdlIiwiY2FsbGJhY2siLCJpZCIsInN1YnNjcmlwdGlvbiIsInVuc3Vic2NyaWJlIiwic2V0IiwiX2VtaXRJbml0aWFsU2Vzc2lvbiIsImdldCIsImVyciIsInJlc2V0UGFzc3dvcmRGb3JFbWFpbCIsImdldFVzZXJJZGVudGl0aWVzIiwiaWRlbnRpdGllcyIsImxpbmtJZGVudGl0eSIsImxpbmtJZGVudGl0eUlkVG9rZW4iLCJsaW5rSWRlbnRpdHlPQXV0aCIsIl9nZXRVcmxGb3JQcm92aWRlciIsImxpbmtfaWRlbnRpdHkiLCJ1bmxpbmtJZGVudGl0eSIsImlkZW50aXR5IiwiaWRlbnRpdHlfaWQiLCJfcmVmcmVzaEFjY2Vzc1Rva2VuIiwicmVmcmVzaFRva2VuIiwiZGVidWdOYW1lIiwic3Vic3RyaW5nIiwic3RhcnRlZEF0IiwiYXR0ZW1wdCIsInBvdyIsIm5leHRCYWNrT2ZmSW50ZXJ2YWwiLCJpc1ZhbGlkU2Vzc2lvbiIsImlzIiwic2VwYXJhdGVVc2VyIiwiZXhwaXJlc1dpdGhNYXJnaW4iLCJJbmZpbml0eSIsImdldFVzZXJFcnJvciIsInByb21pc2UiLCJyZWplY3QiLCJicm9hZGNhc3QiLCJwb3N0TWVzc2FnZSIsImVycm9ycyIsInByb21pc2VzIiwiZnJvbSIsInZhbHVlcyIsIngiLCJpIiwic2Vzc2lvblRvUHJvY2VzcyIsInVzZXJJc1Byb3h5IiwibWFpblNlc3Npb25EYXRhIiwiY2xvbmVkTWFpblNlc3Npb25EYXRhIiwiY2xvbmVkU2Vzc2lvbiIsIl9yZW1vdmVWaXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9zdGFydEF1dG9SZWZyZXNoIiwiX3N0b3BBdXRvUmVmcmVzaCIsInRpY2tlciIsInNldEludGVydmFsIiwiX2F1dG9SZWZyZXNoVG9rZW5UaWNrIiwidW5yZWYiLCJEZW5vIiwidW5yZWZUaW1lciIsImNsZWFySW50ZXJ2YWwiLCJzdGFydEF1dG9SZWZyZXNoIiwic3RvcEF1dG9SZWZyZXNoIiwiZXhwaXJlc0luVGlja3MiLCJmbG9vciIsImlzQWNxdWlyZVRpbWVvdXQiLCJfb25WaXNpYmlsaXR5Q2hhbmdlZCIsImNhbGxlZEZyb21Jbml0aWFsaXplIiwibWV0aG9kTmFtZSIsImRvY3VtZW50IiwidmlzaWJpbGl0eVN0YXRlIiwidXJsUGFyYW1zIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZmxvd1BhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInF1ZXJ5IiwiZmFjdG9ySWQiLCJmcmllbmRseV9uYW1lIiwiZnJpZW5kbHlOYW1lIiwiZmFjdG9yX3R5cGUiLCJmYWN0b3JUeXBlIiwiaXNzdWVyIiwidG90cCIsInFyX2NvZGUiLCJjaGFsbGVuZ2VfaWQiLCJjaGFsbGVuZ2VJZCIsImNyZWRlbnRpYWxfcmVzcG9uc2UiLCJyZXNwb25zZSIsImNyZWRlbnRpYWxfb3B0aW9ucyIsImNoYWxsZW5nZURhdGEiLCJjaGFsbGVuZ2VFcnJvciIsImZhY3RvciIsImZhY3RvcnMiLCJjdXJyZW50TGV2ZWwiLCJuZXh0TGV2ZWwiLCJjdXJyZW50QXV0aGVudGljYXRpb25NZXRob2RzIiwiYWFsIiwidmVyaWZpZWRGYWN0b3JzIiwiZmlsdGVyIiwiYW1yIiwiYXV0aG9yaXphdGlvbklkIiwiYWN0aW9uIiwicmVkaXJlY3RfdXJsIiwiY2xpZW50X2lkIiwiY2xpZW50SWQiLCJub1Jlc29sdmVKc29uIiwiZmV0Y2hKd2siLCJraWQiLCJqd2siLCJmaW5kIiwia2V5IiwiZ2V0Q2xhaW1zIiwiaGVhZGVyIiwicmF3IiwicmF3SGVhZGVyIiwicmF3UGF5bG9hZCIsImFsbG93RXhwaXJlZCIsInNpZ25pbmdLZXkiLCJhbGciLCJzdGFydHNXaXRoIiwiY3J5cHRvIiwiY2xhaW1zIiwiYWxnb3JpdGhtIiwic3VidGxlIiwiaW1wb3J0S2V5IiwiaXNWYWxpZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/index.js":
|
||
/*!*************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/index.js ***!
|
||
\*************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthAdminApi: () => (/* reexport safe */ _AuthAdminApi__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ AuthApiError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthApiError),\n/* harmony export */ AuthClient: () => (/* reexport safe */ _AuthClient__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ AuthError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthError),\n/* harmony export */ AuthImplicitGrantRedirectError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthImplicitGrantRedirectError),\n/* harmony export */ AuthInvalidCredentialsError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthInvalidCredentialsError),\n/* harmony export */ AuthInvalidJwtError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthInvalidJwtError),\n/* harmony export */ AuthInvalidTokenResponseError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthInvalidTokenResponseError),\n/* harmony export */ AuthPKCECodeVerifierMissingError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthPKCECodeVerifierMissingError),\n/* harmony export */ AuthPKCEGrantCodeExchangeError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthPKCEGrantCodeExchangeError),\n/* harmony export */ AuthRetryableFetchError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthRetryableFetchError),\n/* harmony export */ AuthSessionMissingError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthSessionMissingError),\n/* harmony export */ AuthUnknownError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthUnknownError),\n/* harmony export */ AuthWeakPasswordError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthWeakPasswordError),\n/* harmony export */ CustomAuthError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.CustomAuthError),\n/* harmony export */ GoTrueAdminApi: () => (/* reexport safe */ _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ GoTrueClient: () => (/* reexport safe */ _GoTrueClient__WEBPACK_IMPORTED_MODULE_1__[\"default\"]),\n/* harmony export */ NavigatorLockAcquireTimeoutError: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.NavigatorLockAcquireTimeoutError),\n/* harmony export */ SIGN_OUT_SCOPES: () => (/* reexport safe */ _lib_types__WEBPACK_IMPORTED_MODULE_4__.SIGN_OUT_SCOPES),\n/* harmony export */ isAuthApiError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthApiError),\n/* harmony export */ isAuthError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthError),\n/* harmony export */ isAuthImplicitGrantRedirectError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthImplicitGrantRedirectError),\n/* harmony export */ isAuthPKCECodeVerifierMissingError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthPKCECodeVerifierMissingError),\n/* harmony export */ isAuthRetryableFetchError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthRetryableFetchError),\n/* harmony export */ isAuthSessionMissingError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthSessionMissingError),\n/* harmony export */ isAuthWeakPasswordError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthWeakPasswordError),\n/* harmony export */ lockInternals: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.internals),\n/* harmony export */ navigatorLock: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.navigatorLock),\n/* harmony export */ processLock: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.processLock)\n/* harmony export */ });\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n/* harmony import */ var _GoTrueClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./GoTrueClient */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\");\n/* harmony import */ var _AuthAdminApi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AuthAdminApi */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js\");\n/* harmony import */ var _AuthClient__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AuthClient */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js\");\n/* harmony import */ var _lib_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/types */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/types.js\");\n/* harmony import */ var _lib_errors__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib/errors */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _lib_locks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lib/locks */ \"(ssr)/./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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQThDO0FBQ0o7QUFDQTtBQUNKO0FBQzRCO0FBQ3RDO0FBQ0M7QUFDMkYsQ0FDeEgsaUNBQWlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2luZGV4LmpzPzU1MDgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEdvVHJ1ZUFkbWluQXBpIGZyb20gJy4vR29UcnVlQWRtaW5BcGknO1xuaW1wb3J0IEdvVHJ1ZUNsaWVudCBmcm9tICcuL0dvVHJ1ZUNsaWVudCc7XG5pbXBvcnQgQXV0aEFkbWluQXBpIGZyb20gJy4vQXV0aEFkbWluQXBpJztcbmltcG9ydCBBdXRoQ2xpZW50IGZyb20gJy4vQXV0aENsaWVudCc7XG5leHBvcnQgeyBHb1RydWVBZG1pbkFwaSwgR29UcnVlQ2xpZW50LCBBdXRoQWRtaW5BcGksIEF1dGhDbGllbnQgfTtcbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Vycm9ycyc7XG5leHBvcnQgeyBuYXZpZ2F0b3JMb2NrLCBOYXZpZ2F0b3JMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciwgaW50ZXJuYWxzIGFzIGxvY2tJbnRlcm5hbHMsIHByb2Nlc3NMb2NrLCB9IGZyb20gJy4vbGliL2xvY2tzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJuYW1lcyI6WyJHb1RydWVBZG1pbkFwaSIsIkdvVHJ1ZUNsaWVudCIsIkF1dGhBZG1pbkFwaSIsIkF1dGhDbGllbnQiLCJuYXZpZ2F0b3JMb2NrIiwiTmF2aWdhdG9yTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IiLCJpbnRlcm5hbHMiLCJsb2NrSW50ZXJuYWxzIiwicHJvY2Vzc0xvY2siXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/base64url.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ base64UrlToUint8Array: () => (/* binding */ base64UrlToUint8Array),\n/* harmony export */ byteFromBase64URL: () => (/* binding */ byteFromBase64URL),\n/* harmony export */ byteToBase64URL: () => (/* binding */ byteToBase64URL),\n/* harmony export */ bytesToBase64URL: () => (/* binding */ bytesToBase64URL),\n/* harmony export */ codepointToUTF8: () => (/* binding */ codepointToUTF8),\n/* harmony export */ stringFromBase64URL: () => (/* binding */ stringFromBase64URL),\n/* harmony export */ stringFromUTF8: () => (/* binding */ stringFromUTF8),\n/* harmony export */ stringToBase64URL: () => (/* binding */ stringToBase64URL),\n/* harmony export */ stringToUTF8: () => (/* binding */ stringToUTF8),\n/* harmony export */ stringToUint8Array: () => (/* 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 \"${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: ${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2Jhc2U2NHVybC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Q0FJQyxHQUNEOzs7Q0FHQyxHQUNELE1BQU1BLGVBQWUsbUVBQW1FQyxLQUFLLENBQUM7QUFDOUY7OztDQUdDLEdBQ0QsTUFBTUMsbUJBQW1CLFVBQVdELEtBQUssQ0FBQztBQUMxQzs7O0NBR0MsR0FDRCxNQUFNRSxpQkFBaUIsQ0FBQztJQUNwQixNQUFNQyxVQUFVLElBQUlDLE1BQU07SUFDMUIsSUFBSyxJQUFJQyxJQUFJLEdBQUdBLElBQUlGLFFBQVFHLE1BQU0sRUFBRUQsS0FBSyxFQUFHO1FBQ3hDRixPQUFPLENBQUNFLEVBQUUsR0FBRyxDQUFDO0lBQ2xCO0lBQ0EsSUFBSyxJQUFJQSxJQUFJLEdBQUdBLElBQUlKLGlCQUFpQkssTUFBTSxFQUFFRCxLQUFLLEVBQUc7UUFDakRGLE9BQU8sQ0FBQ0YsZ0JBQWdCLENBQUNJLEVBQUUsQ0FBQ0UsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2xEO0lBQ0EsSUFBSyxJQUFJRixJQUFJLEdBQUdBLElBQUlOLGFBQWFPLE1BQU0sRUFBRUQsS0FBSyxFQUFHO1FBQzdDRixPQUFPLENBQUNKLFlBQVksQ0FBQ00sRUFBRSxDQUFDRSxVQUFVLENBQUMsR0FBRyxHQUFHRjtJQUM3QztJQUNBLE9BQU9GO0FBQ1g7QUFDQTs7Ozs7O0NBTUMsR0FDTSxTQUFTSyxnQkFBZ0JDLElBQUksRUFBRUMsS0FBSyxFQUFFQyxJQUFJO0lBQzdDLElBQUlGLFNBQVMsTUFBTTtRQUNmQyxNQUFNRSxLQUFLLEdBQUcsTUFBT0EsS0FBSyxJQUFJLElBQUtIO1FBQ25DQyxNQUFNRyxVQUFVLElBQUk7UUFDcEIsTUFBT0gsTUFBTUcsVUFBVSxJQUFJLEVBQUc7WUFDMUIsTUFBTUMsTUFBTSxNQUFPRixLQUFLLElBQUtGLE1BQU1HLFVBQVUsR0FBRyxJQUFNO1lBQ3RERixLQUFLWixZQUFZLENBQUNlLElBQUk7WUFDdEJKLE1BQU1HLFVBQVUsSUFBSTtRQUN4QjtJQUNKLE9BQ0ssSUFBSUgsTUFBTUcsVUFBVSxHQUFHLEdBQUc7UUFDM0JILE1BQU1FLEtBQUssR0FBR0YsTUFBTUUsS0FBSyxJQUFLLElBQUlGLE1BQU1HLFVBQVU7UUFDbERILE1BQU1HLFVBQVUsR0FBRztRQUNuQixNQUFPSCxNQUFNRyxVQUFVLElBQUksRUFBRztZQUMxQixNQUFNQyxNQUFNLE1BQU9GLEtBQUssSUFBS0YsTUFBTUcsVUFBVSxHQUFHLElBQU07WUFDdERGLEtBQUtaLFlBQVksQ0FBQ2UsSUFBSTtZQUN0QkosTUFBTUcsVUFBVSxJQUFJO1FBQ3hCO0lBQ0o7QUFDSjtBQUNBOzs7Ozs7Q0FNQyxHQUNNLFNBQVNFLGtCQUFrQkMsUUFBUSxFQUFFTixLQUFLLEVBQUVDLElBQUk7SUFDbkQsTUFBTU0sT0FBT2YsY0FBYyxDQUFDYyxTQUFTO0lBQ3JDLElBQUlDLE9BQU8sQ0FBQyxHQUFHO1FBQ1gsNkJBQTZCO1FBQzdCUCxNQUFNRSxLQUFLLEdBQUcsTUFBT0EsS0FBSyxJQUFJLElBQUtLO1FBQ25DUCxNQUFNRyxVQUFVLElBQUk7UUFDcEIsTUFBT0gsTUFBTUcsVUFBVSxJQUFJLEVBQUc7WUFDMUJGLEtBQUssTUFBT0MsS0FBSyxJQUFLRixNQUFNRyxVQUFVLEdBQUcsSUFBTTtZQUMvQ0gsTUFBTUcsVUFBVSxJQUFJO1FBQ3hCO0lBQ0osT0FDSyxJQUFJSSxTQUFTLENBQUMsR0FBRztRQUNsQixtQ0FBbUM7UUFDbkM7SUFDSixPQUNLO1FBQ0QsTUFBTSxJQUFJQyxNQUFNLENBQUMsOEJBQThCLEVBQUVDLE9BQU9DLFlBQVksQ0FBQ0osVUFBVSxDQUFDLENBQUM7SUFDckY7QUFDSjtBQUNBOzs7Ozs7Q0FNQyxHQUNNLFNBQVNLLGtCQUFrQkMsR0FBRztJQUNqQyxNQUFNQyxTQUFTLEVBQUU7SUFDakIsTUFBTUMsVUFBVSxDQUFDQztRQUNiRixPQUFPRyxJQUFJLENBQUNEO0lBQ2hCO0lBQ0EsTUFBTWYsUUFBUTtRQUFFRSxPQUFPO1FBQUdDLFlBQVk7SUFBRTtJQUN4Q2MsYUFBYUwsS0FBSyxDQUFDYjtRQUNmRCxnQkFBZ0JDLE1BQU1DLE9BQU9jO0lBQ2pDO0lBQ0FoQixnQkFBZ0IsTUFBTUUsT0FBT2M7SUFDN0IsT0FBT0QsT0FBT0ssSUFBSSxDQUFDO0FBQ3ZCO0FBQ0E7Ozs7O0NBS0MsR0FDTSxTQUFTQyxvQkFBb0JQLEdBQUc7SUFDbkMsTUFBTVEsT0FBTyxFQUFFO0lBQ2YsTUFBTUMsV0FBVyxDQUFDQztRQUNkRixLQUFLSixJQUFJLENBQUNQLE9BQU9jLGFBQWEsQ0FBQ0Q7SUFDbkM7SUFDQSxNQUFNRSxZQUFZO1FBQ2RDLFNBQVM7UUFDVEgsV0FBVztJQUNmO0lBQ0EsTUFBTUksV0FBVztRQUFFeEIsT0FBTztRQUFHQyxZQUFZO0lBQUU7SUFDM0MsTUFBTXdCLFdBQVcsQ0FBQzVCO1FBQ2Q2QixlQUFlN0IsTUFBTXlCLFdBQVdIO0lBQ3BDO0lBQ0EsSUFBSyxJQUFJMUIsSUFBSSxHQUFHQSxJQUFJaUIsSUFBSWhCLE1BQU0sRUFBRUQsS0FBSyxFQUFHO1FBQ3BDVSxrQkFBa0JPLElBQUlmLFVBQVUsQ0FBQ0YsSUFBSStCLFVBQVVDO0lBQ25EO0lBQ0EsT0FBT1AsS0FBS0YsSUFBSSxDQUFDO0FBQ3JCO0FBQ0E7Ozs7O0NBS0MsR0FDTSxTQUFTVyxnQkFBZ0JQLFNBQVMsRUFBRXJCLElBQUk7SUFDM0MsSUFBSXFCLGFBQWEsTUFBTTtRQUNuQnJCLEtBQUtxQjtRQUNMO0lBQ0osT0FDSyxJQUFJQSxhQUFhLE9BQU87UUFDekJyQixLQUFLLE9BQVFxQixhQUFhO1FBQzFCckIsS0FBSyxPQUFRcUIsWUFBWTtRQUN6QjtJQUNKLE9BQ0ssSUFBSUEsYUFBYSxRQUFRO1FBQzFCckIsS0FBSyxPQUFRcUIsYUFBYTtRQUMxQnJCLEtBQUssT0FBUSxhQUFjLElBQUs7UUFDaENBLEtBQUssT0FBUXFCLFlBQVk7UUFDekI7SUFDSixPQUNLLElBQUlBLGFBQWEsVUFBVTtRQUM1QnJCLEtBQUssT0FBUXFCLGFBQWE7UUFDMUJyQixLQUFLLE9BQVEsYUFBYyxLQUFNO1FBQ2pDQSxLQUFLLE9BQVEsYUFBYyxJQUFLO1FBQ2hDQSxLQUFLLE9BQVFxQixZQUFZO1FBQ3pCO0lBQ0o7SUFDQSxNQUFNLElBQUlkLE1BQU0sQ0FBQyxnQ0FBZ0MsRUFBRWMsVUFBVVEsUUFBUSxDQUFDLElBQUksQ0FBQztBQUMvRTtBQUNBOzs7OztDQUtDLEdBQ00sU0FBU2IsYUFBYUwsR0FBRyxFQUFFWCxJQUFJO0lBQ2xDLElBQUssSUFBSU4sSUFBSSxHQUFHQSxJQUFJaUIsSUFBSWhCLE1BQU0sRUFBRUQsS0FBSyxFQUFHO1FBQ3BDLElBQUkyQixZQUFZVixJQUFJZixVQUFVLENBQUNGO1FBQy9CLElBQUkyQixZQUFZLFVBQVVBLGFBQWEsUUFBUTtZQUMzQyx1RUFBdUU7WUFDdkUsc0VBQXNFO1lBQ3RFLDJDQUEyQztZQUMzQyxNQUFNUyxnQkFBZ0IsQ0FBRVQsWUFBWSxNQUFLLElBQUssUUFBUztZQUN2RCxNQUFNVSxlQUFlLElBQUtuQyxVQUFVLENBQUNGLElBQUksS0FBSyxTQUFVO1lBQ3hEMkIsWUFBWSxDQUFDVSxlQUFlRCxhQUFZLElBQUs7WUFDN0NwQyxLQUFLO1FBQ1Q7UUFDQWtDLGdCQUFnQlAsV0FBV3JCO0lBQy9CO0FBQ0o7QUFDQTs7Ozs7OztDQU9DLEdBQ00sU0FBUzJCLGVBQWU3QixJQUFJLEVBQUVDLEtBQUssRUFBRUMsSUFBSTtJQUM1QyxJQUFJRCxNQUFNeUIsT0FBTyxLQUFLLEdBQUc7UUFDckIsSUFBSTFCLFFBQVEsTUFBTTtZQUNkRSxLQUFLRjtZQUNMO1FBQ0o7UUFDQSx1REFBdUQ7UUFDdkQsSUFBSyxJQUFJa0MsYUFBYSxHQUFHQSxhQUFhLEdBQUdBLGNBQWMsRUFBRztZQUN0RCxJQUFJLENBQUMsUUFBVSxJQUFJQSxhQUFlLE9BQU8sR0FBRztnQkFDeENqQyxNQUFNeUIsT0FBTyxHQUFHUTtnQkFDaEI7WUFDSjtRQUNKO1FBQ0EsSUFBSWpDLE1BQU15QixPQUFPLEtBQUssR0FBRztZQUNyQnpCLE1BQU1zQixTQUFTLEdBQUd2QixPQUFPO1FBQzdCLE9BQ0ssSUFBSUMsTUFBTXlCLE9BQU8sS0FBSyxHQUFHO1lBQzFCekIsTUFBTXNCLFNBQVMsR0FBR3ZCLE9BQU87UUFDN0IsT0FDSyxJQUFJQyxNQUFNeUIsT0FBTyxLQUFLLEdBQUc7WUFDMUJ6QixNQUFNc0IsU0FBUyxHQUFHdkIsT0FBTztRQUM3QixPQUNLO1lBQ0QsTUFBTSxJQUFJUyxNQUFNO1FBQ3BCO1FBQ0FSLE1BQU15QixPQUFPLElBQUk7SUFDckIsT0FDSyxJQUFJekIsTUFBTXlCLE9BQU8sR0FBRyxHQUFHO1FBQ3hCLElBQUkxQixRQUFRLE1BQU07WUFDZCxNQUFNLElBQUlTLE1BQU07UUFDcEI7UUFDQVIsTUFBTXNCLFNBQVMsR0FBRyxNQUFPQSxTQUFTLElBQUksSUFBTXZCLE9BQU87UUFDbkRDLE1BQU15QixPQUFPLElBQUk7UUFDakIsSUFBSXpCLE1BQU15QixPQUFPLEtBQUssR0FBRztZQUNyQnhCLEtBQUtELE1BQU1zQixTQUFTO1FBQ3hCO0lBQ0o7QUFDSjtBQUNBOztDQUVDLEdBQ00sU0FBU1ksc0JBQXNCdEIsR0FBRztJQUNyQyxNQUFNdUIsU0FBUyxFQUFFO0lBQ2pCLE1BQU1uQyxRQUFRO1FBQUVFLE9BQU87UUFBR0MsWUFBWTtJQUFFO0lBQ3hDLE1BQU1pQyxTQUFTLENBQUNyQztRQUNab0MsT0FBT25CLElBQUksQ0FBQ2pCO0lBQ2hCO0lBQ0EsSUFBSyxJQUFJSixJQUFJLEdBQUdBLElBQUlpQixJQUFJaEIsTUFBTSxFQUFFRCxLQUFLLEVBQUc7UUFDcENVLGtCQUFrQk8sSUFBSWYsVUFBVSxDQUFDRixJQUFJSyxPQUFPb0M7SUFDaEQ7SUFDQSxPQUFPLElBQUlDLFdBQVdGO0FBQzFCO0FBQ08sU0FBU0csbUJBQW1CMUIsR0FBRztJQUNsQyxNQUFNdUIsU0FBUyxFQUFFO0lBQ2pCbEIsYUFBYUwsS0FBSyxDQUFDYixPQUFTb0MsT0FBT25CLElBQUksQ0FBQ2pCO0lBQ3hDLE9BQU8sSUFBSXNDLFdBQVdGO0FBQzFCO0FBQ08sU0FBU0ksaUJBQWlCQyxLQUFLO0lBQ2xDLE1BQU1MLFNBQVMsRUFBRTtJQUNqQixNQUFNbkMsUUFBUTtRQUFFRSxPQUFPO1FBQUdDLFlBQVk7SUFBRTtJQUN4QyxNQUFNc0MsU0FBUyxDQUFDMUI7UUFDWm9CLE9BQU9uQixJQUFJLENBQUNEO0lBQ2hCO0lBQ0F5QixNQUFNRSxPQUFPLENBQUMsQ0FBQzNDLE9BQVNELGdCQUFnQkMsTUFBTUMsT0FBT3lDO0lBQ3JELHFEQUFxRDtJQUNyRDNDLGdCQUFnQixNQUFNRSxPQUFPeUM7SUFDN0IsT0FBT04sT0FBT2pCLElBQUksQ0FBQztBQUN2QixFQUNBLHFDQUFxQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvYmFzZTY0dXJsLmpzPzE1ZGUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBdm9pZCBtb2RpZnlpbmcgdGhpcyBmaWxlLiBJdCdzIHBhcnQgb2ZcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBhYmFzZS1jb21tdW5pdHkvYmFzZTY0dXJsLWpzLiAgU3VibWl0IGFsbCBmaXhlcyBvblxuICogdGhhdCByZXBvIVxuICovXG4vKipcbiAqIEFuIGFycmF5IG9mIGNoYXJhY3RlcnMgdGhhdCBlbmNvZGUgNiBiaXRzIGludG8gYSBCYXNlNjQtVVJMIGFscGhhYmV0XG4gKiBjaGFyYWN0ZXIuXG4gKi9cbmNvbnN0IFRPX0JBU0U2NFVSTCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fJy5zcGxpdCgnJyk7XG4vKipcbiAqIEFuIGFycmF5IG9mIGNoYXJhY3RlcnMgdGhhdCBjYW4gYXBwZWFyIGluIGEgQmFzZTY0LVVSTCBlbmNvZGVkIHN0cmluZyBidXRcbiAqIHNob3VsZCBiZSBpZ25vcmVkLlxuICovXG5jb25zdCBJR05PUkVfQkFTRTY0VVJMID0gJyBcXHRcXG5cXHI9Jy5zcGxpdCgnJyk7XG4vKipcbiAqIEFuIGFycmF5IG9mIDEyOCBudW1iZXJzIHRoYXQgbWFwIGEgQmFzZTY0LVVSTCBjaGFyYWN0ZXIgdG8gNiBiaXRzLCBvciBpZiAtMlxuICogdXNlZCB0byBza2lwIHRoZSBjaGFyYWN0ZXIsIG9yIGlmIC0xIHVzZWQgdG8gZXJyb3Igb3V0LlxuICovXG5jb25zdCBGUk9NX0JBU0U2NFVSTCA9ICgoKSA9PiB7XG4gICAgY29uc3QgY2hhck1hcCA9IG5ldyBBcnJheSgxMjgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhck1hcC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjaGFyTWFwW2ldID0gLTE7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgSUdOT1JFX0JBU0U2NFVSTC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjaGFyTWFwW0lHTk9SRV9CQVNFNjRVUkxbaV0uY2hhckNvZGVBdCgwKV0gPSAtMjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUT19CQVNFNjRVUkwubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY2hhck1hcFtUT19CQVNFNjRVUkxbaV0uY2hhckNvZGVBdCgwKV0gPSBpO1xuICAgIH1cbiAgICByZXR1cm4gY2hhck1hcDtcbn0pKCk7XG4vKipcbiAqIENvbnZlcnRzIGEgYnl0ZSB0byBhIEJhc2U2NC1VUkwgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBieXRlIFRoZSBieXRlIHRvIGNvbnZlcnQsIG9yIG51bGwgdG8gZmx1c2ggYXQgdGhlIGVuZCBvZiB0aGUgYnl0ZSBzZXF1ZW5jZS5cbiAqIEBwYXJhbSBzdGF0ZSBUaGUgQmFzZTY0IGNvbnZlcnNpb24gc3RhdGUuIFBhc3MgYW4gaW5pdGlhbCB2YWx1ZSBvZiBgeyBxdWV1ZTogMCwgcXVldWVkQml0czogMCB9YC5cbiAqIEBwYXJhbSBlbWl0IEEgZnVuY3Rpb24gY2FsbGVkIHdpdGggdGhlIG5leHQgQmFzZTY0IGNoYXJhY3RlciB3aGVuIHJlYWR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZVRvQmFzZTY0VVJMKGJ5dGUsIHN0YXRlLCBlbWl0KSB7XG4gICAgaWYgKGJ5dGUgIT09IG51bGwpIHtcbiAgICAgICAgc3RhdGUucXVldWUgPSAoc3RhdGUucXVldWUgPDwgOCkgfCBieXRlO1xuICAgICAgICBzdGF0ZS5xdWV1ZWRCaXRzICs9IDg7XG4gICAgICAgIHdoaWxlIChzdGF0ZS5xdWV1ZWRCaXRzID49IDYpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IChzdGF0ZS5xdWV1ZSA+PiAoc3RhdGUucXVldWVkQml0cyAtIDYpKSAmIDYzO1xuICAgICAgICAgICAgZW1pdChUT19CQVNFNjRVUkxbcG9zXSk7XG4gICAgICAgICAgICBzdGF0ZS5xdWV1ZWRCaXRzIC09IDY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoc3RhdGUucXVldWVkQml0cyA+IDApIHtcbiAgICAgICAgc3RhdGUucXVldWUgPSBzdGF0ZS5xdWV1ZSA8PCAoNiAtIHN0YXRlLnF1ZXVlZEJpdHMpO1xuICAgICAgICBzdGF0ZS5xdWV1ZWRCaXRzID0gNjtcbiAgICAgICAgd2hpbGUgKHN0YXRlLnF1ZXVlZEJpdHMgPj0gNikge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gKHN0YXRlLnF1ZXVlID4+IChzdGF0ZS5xdWV1ZWRCaXRzIC0gNikpICYgNjM7XG4gICAgICAgICAgICBlbWl0KFRPX0JBU0U2NFVSTFtwb3NdKTtcbiAgICAgICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgLT0gNjtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQ29udmVydHMgYSBTdHJpbmcgY2hhciBjb2RlIChleHRyYWN0ZWQgdXNpbmcgYHN0cmluZy5jaGFyQ29kZUF0KHBvc2l0aW9uKWApIHRvIGEgc2VxdWVuY2Ugb2YgQmFzZTY0LVVSTCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwYXJhbSBjaGFyQ29kZSBUaGUgY2hhciBjb2RlIG9mIHRoZSBKYXZhU2NyaXB0IHN0cmluZy5cbiAqIEBwYXJhbSBzdGF0ZSBUaGUgQmFzZTY0IHN0YXRlLiBQYXNzIGFuIGluaXRpYWwgdmFsdWUgb2YgYHsgcXVldWU6IDAsIHF1ZXVlZEJpdHM6IDAgfWAuXG4gKiBAcGFyYW0gZW1pdCBBIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIHRoZSBuZXh0IGJ5dGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlRnJvbUJhc2U2NFVSTChjaGFyQ29kZSwgc3RhdGUsIGVtaXQpIHtcbiAgICBjb25zdCBiaXRzID0gRlJPTV9CQVNFNjRVUkxbY2hhckNvZGVdO1xuICAgIGlmIChiaXRzID4gLTEpIHtcbiAgICAgICAgLy8gdmFsaWQgQmFzZTY0LVVSTCBjaGFyYWN0ZXJcbiAgICAgICAgc3RhdGUucXVldWUgPSAoc3RhdGUucXVldWUgPDwgNikgfCBiaXRzO1xuICAgICAgICBzdGF0ZS5xdWV1ZWRCaXRzICs9IDY7XG4gICAgICAgIHdoaWxlIChzdGF0ZS5xdWV1ZWRCaXRzID49IDgpIHtcbiAgICAgICAgICAgIGVtaXQoKHN0YXRlLnF1ZXVlID4+IChzdGF0ZS5xdWV1ZWRCaXRzIC0gOCkpICYgMHhmZik7XG4gICAgICAgICAgICBzdGF0ZS5xdWV1ZWRCaXRzIC09IDg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYml0cyA9PT0gLTIpIHtcbiAgICAgICAgLy8gaWdub3JlIHNwYWNlcywgdGFicywgbmV3bGluZXMsID1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEJhc2U2NC1VUkwgY2hhcmFjdGVyIFwiJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKX1cImApO1xuICAgIH1cbn1cbi8qKlxuICogQ29udmVydHMgYSBKYXZhU2NyaXB0IHN0cmluZyAod2hpY2ggbWF5IGluY2x1ZGUgYW55IHZhbGlkIGNoYXJhY3RlcikgaW50byBhXG4gKiBCYXNlNjQtVVJMIGVuY29kZWQgc3RyaW5nLiBUaGUgc3RyaW5nIGlzIGZpcnN0IGVuY29kZWQgaW4gVVRGLTggd2hpY2ggaXNcbiAqIHRoZW4gZW5jb2RlZCBhcyBCYXNlNjQtVVJMLlxuICpcbiAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9CYXNlNjRVUkwoc3RyKSB7XG4gICAgY29uc3QgYmFzZTY0ID0gW107XG4gICAgY29uc3QgZW1pdHRlciA9IChjaGFyKSA9PiB7XG4gICAgICAgIGJhc2U2NC5wdXNoKGNoYXIpO1xuICAgIH07XG4gICAgY29uc3Qgc3RhdGUgPSB7IHF1ZXVlOiAwLCBxdWV1ZWRCaXRzOiAwIH07XG4gICAgc3RyaW5nVG9VVEY4KHN0ciwgKGJ5dGUpID0+IHtcbiAgICAgICAgYnl0ZVRvQmFzZTY0VVJMKGJ5dGUsIHN0YXRlLCBlbWl0dGVyKTtcbiAgICB9KTtcbiAgICBieXRlVG9CYXNlNjRVUkwobnVsbCwgc3RhdGUsIGVtaXR0ZXIpO1xuICAgIHJldHVybiBiYXNlNjQuam9pbignJyk7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgQmFzZTY0LVVSTCBlbmNvZGVkIHN0cmluZyBpbnRvIGEgSmF2YVNjcmlwdCBzdHJpbmcuIEl0IGlzIGFzc3VtZWRcbiAqIHRoYXQgdGhlIHVuZGVybHlpbmcgc3RyaW5nIGhhcyBiZWVuIGVuY29kZWQgYXMgVVRGLTguXG4gKlxuICogQHBhcmFtIHN0ciBUaGUgQmFzZTY0LVVSTCBlbmNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0Zyb21CYXNlNjRVUkwoc3RyKSB7XG4gICAgY29uc3QgY29udiA9IFtdO1xuICAgIGNvbnN0IHV0ZjhFbWl0ID0gKGNvZGVwb2ludCkgPT4ge1xuICAgICAgICBjb252LnB1c2goU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZXBvaW50KSk7XG4gICAgfTtcbiAgICBjb25zdCB1dGY4U3RhdGUgPSB7XG4gICAgICAgIHV0ZjhzZXE6IDAsXG4gICAgICAgIGNvZGVwb2ludDogMCxcbiAgICB9O1xuICAgIGNvbnN0IGI2NFN0YXRlID0geyBxdWV1ZTogMCwgcXVldWVkQml0czogMCB9O1xuICAgIGNvbnN0IGJ5dGVFbWl0ID0gKGJ5dGUpID0+IHtcbiAgICAgICAgc3RyaW5nRnJvbVVURjgoYnl0ZSwgdXRmOFN0YXRlLCB1dGY4RW1pdCk7XG4gICAgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBieXRlRnJvbUJhc2U2NFVSTChzdHIuY2hhckNvZGVBdChpKSwgYjY0U3RhdGUsIGJ5dGVFbWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnYuam9pbignJyk7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgVW5pY29kZSBjb2RlcG9pbnQgdG8gYSBtdWx0aS1ieXRlIFVURi04IHNlcXVlbmNlLlxuICpcbiAqIEBwYXJhbSBjb2RlcG9pbnQgVGhlIFVuaWNvZGUgY29kZXBvaW50LlxuICogQHBhcmFtIGVtaXQgICAgICBGdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBVVEYtOCBieXRlIHRoYXQgcmVwcmVzZW50cyB0aGUgY29kZXBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXBvaW50VG9VVEY4KGNvZGVwb2ludCwgZW1pdCkge1xuICAgIGlmIChjb2RlcG9pbnQgPD0gMHg3Zikge1xuICAgICAgICBlbWl0KGNvZGVwb2ludCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4N2ZmKSB7XG4gICAgICAgIGVtaXQoMHhjMCB8IChjb2RlcG9pbnQgPj4gNikpO1xuICAgICAgICBlbWl0KDB4ODAgfCAoY29kZXBvaW50ICYgMHgzZikpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweGZmZmYpIHtcbiAgICAgICAgZW1pdCgweGUwIHwgKGNvZGVwb2ludCA+PiAxMikpO1xuICAgICAgICBlbWl0KDB4ODAgfCAoKGNvZGVwb2ludCA+PiA2KSAmIDB4M2YpKTtcbiAgICAgICAgZW1pdCgweDgwIHwgKGNvZGVwb2ludCAmIDB4M2YpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHgxMGZmZmYpIHtcbiAgICAgICAgZW1pdCgweGYwIHwgKGNvZGVwb2ludCA+PiAxOCkpO1xuICAgICAgICBlbWl0KDB4ODAgfCAoKGNvZGVwb2ludCA+PiAxMikgJiAweDNmKSk7XG4gICAgICAgIGVtaXQoMHg4MCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHgzZikpO1xuICAgICAgICBlbWl0KDB4ODAgfCAoY29kZXBvaW50ICYgMHgzZikpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIFVuaWNvZGUgY29kZXBvaW50OiAke2NvZGVwb2ludC50b1N0cmluZygxNil9YCk7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgSmF2YVNjcmlwdCBzdHJpbmcgdG8gYSBzZXF1ZW5jZSBvZiBVVEYtOCBieXRlcy5cbiAqXG4gKiBAcGFyYW0gc3RyICBUaGUgc3RyaW5nIHRvIGNvbnZlcnQgdG8gVVRGLTguXG4gKiBAcGFyYW0gZW1pdCBGdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBVVEYtOCBieXRlIG9mIHRoZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb1VURjgoc3RyLCBlbWl0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgbGV0IGNvZGVwb2ludCA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoY29kZXBvaW50ID4gMHhkN2ZmICYmIGNvZGVwb2ludCA8PSAweGRiZmYpIHtcbiAgICAgICAgICAgIC8vIG1vc3QgVVRGLTE2IGNvZGVwb2ludHMgYXJlIFVuaWNvZGUgY29kZXBvaW50cywgZXhjZXB0IHZhbHVlcyBpbiB0aGlzXG4gICAgICAgICAgICAvLyByYW5nZSB3aGVyZSB0aGUgbmV4dCBVVEYtMTYgY29kZXBvaW50IG5lZWRzIHRvIGJlIGNvbWJpbmVkIHdpdGggdGhlXG4gICAgICAgICAgICAvLyBjdXJyZW50IG9uZSB0byBnZXQgdGhlIFVuaWNvZGUgY29kZXBvaW50XG4gICAgICAgICAgICBjb25zdCBoaWdoU3Vycm9nYXRlID0gKChjb2RlcG9pbnQgLSAweGQ4MDApICogMHg0MDApICYgMHhmZmZmO1xuICAgICAgICAgICAgY29uc3QgbG93U3Vycm9nYXRlID0gKHN0ci5jaGFyQ29kZUF0KGkgKyAxKSAtIDB4ZGMwMCkgJiAweGZmZmY7XG4gICAgICAgICAgICBjb2RlcG9pbnQgPSAobG93U3Vycm9nYXRlIHwgaGlnaFN1cnJvZ2F0ZSkgKyAweDEwMDAwO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludFRvVVRGOChjb2RlcG9pbnQsIGVtaXQpO1xuICAgIH1cbn1cbi8qKlxuICogQ29udmVydHMgYSBVVEYtOCBieXRlIHRvIGEgVW5pY29kZSBjb2RlcG9pbnQuXG4gKlxuICogQHBhcmFtIGJ5dGUgIFRoZSBVVEYtOCBieXRlIG5leHQgaW4gdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHN0YXRlIFRoZSBzaGFyZWQgc3RhdGUgYmV0d2VlbiBjb25zZWN1dGl2ZSBVVEYtOCBieXRlcyBpbiB0aGVcbiAqICAgICAgICAgICAgICBzZXF1ZW5jZSwgYW4gb2JqZWN0IHdpdGggdGhlIHNoYXBlIGB7IHV0ZjhzZXE6IDAsIGNvZGVwb2ludDogMCB9YC5cbiAqIEBwYXJhbSBlbWl0ICBGdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBjb2RlcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGcm9tVVRGOChieXRlLCBzdGF0ZSwgZW1pdCkge1xuICAgIGlmIChzdGF0ZS51dGY4c2VxID09PSAwKSB7XG4gICAgICAgIGlmIChieXRlIDw9IDB4N2YpIHtcbiAgICAgICAgICAgIGVtaXQoYnl0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiAxIGxlYWRpbmcgYml0cyB1bnRpbCB5b3UgcmVhY2ggMFxuICAgICAgICBmb3IgKGxldCBsZWFkaW5nQml0ID0gMTsgbGVhZGluZ0JpdCA8IDY7IGxlYWRpbmdCaXQgKz0gMSkge1xuICAgICAgICAgICAgaWYgKCgoYnl0ZSA+PiAoNyAtIGxlYWRpbmdCaXQpKSAmIDEpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudXRmOHNlcSA9IGxlYWRpbmdCaXQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLnV0ZjhzZXEgPT09IDIpIHtcbiAgICAgICAgICAgIHN0YXRlLmNvZGVwb2ludCA9IGJ5dGUgJiAzMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS51dGY4c2VxID09PSAzKSB7XG4gICAgICAgICAgICBzdGF0ZS5jb2RlcG9pbnQgPSBieXRlICYgMTU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUudXRmOHNlcSA9PT0gNCkge1xuICAgICAgICAgICAgc3RhdGUuY29kZXBvaW50ID0gYnl0ZSAmIDc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgVVRGLTggc2VxdWVuY2UnKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS51dGY4c2VxIC09IDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKHN0YXRlLnV0ZjhzZXEgPiAwKSB7XG4gICAgICAgIGlmIChieXRlIDw9IDB4N2YpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBVVEYtOCBzZXF1ZW5jZScpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmNvZGVwb2ludCA9IChzdGF0ZS5jb2RlcG9pbnQgPDwgNikgfCAoYnl0ZSAmIDYzKTtcbiAgICAgICAgc3RhdGUudXRmOHNlcSAtPSAxO1xuICAgICAgICBpZiAoc3RhdGUudXRmOHNlcSA9PT0gMCkge1xuICAgICAgICAgICAgZW1pdChzdGF0ZS5jb2RlcG9pbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHRvIGNvbnZlcnQgZGlmZmVyZW50IHR5cGVzIG9mIHN0cmluZ3MgdG8gVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0VXJsVG9VaW50OEFycmF5KHN0cikge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IHN0YXRlID0geyBxdWV1ZTogMCwgcXVldWVkQml0czogMCB9O1xuICAgIGNvbnN0IG9uQnl0ZSA9IChieXRlKSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGJ5dGUpO1xuICAgIH07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYnl0ZUZyb21CYXNlNjRVUkwoc3RyLmNoYXJDb2RlQXQoaSksIHN0YXRlLCBvbkJ5dGUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVzdWx0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb1VpbnQ4QXJyYXkoc3RyKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgc3RyaW5nVG9VVEY4KHN0ciwgKGJ5dGUpID0+IHJlc3VsdC5wdXNoKGJ5dGUpKTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVzdWx0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBieXRlc1RvQmFzZTY0VVJMKGJ5dGVzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3Qgc3RhdGUgPSB7IHF1ZXVlOiAwLCBxdWV1ZWRCaXRzOiAwIH07XG4gICAgY29uc3Qgb25DaGFyID0gKGNoYXIpID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2goY2hhcik7XG4gICAgfTtcbiAgICBieXRlcy5mb3JFYWNoKChieXRlKSA9PiBieXRlVG9CYXNlNjRVUkwoYnl0ZSwgc3RhdGUsIG9uQ2hhcikpO1xuICAgIC8vIGFsd2F5cyBjYWxsIHdpdGggYG51bGxgIGFmdGVyIHByb2Nlc3NpbmcgYWxsIGJ5dGVzXG4gICAgYnl0ZVRvQmFzZTY0VVJMKG51bGwsIHN0YXRlLCBvbkNoYXIpO1xuICAgIHJldHVybiByZXN1bHQuam9pbignJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlNjR1cmwuanMubWFwIl0sIm5hbWVzIjpbIlRPX0JBU0U2NFVSTCIsInNwbGl0IiwiSUdOT1JFX0JBU0U2NFVSTCIsIkZST01fQkFTRTY0VVJMIiwiY2hhck1hcCIsIkFycmF5IiwiaSIsImxlbmd0aCIsImNoYXJDb2RlQXQiLCJieXRlVG9CYXNlNjRVUkwiLCJieXRlIiwic3RhdGUiLCJlbWl0IiwicXVldWUiLCJxdWV1ZWRCaXRzIiwicG9zIiwiYnl0ZUZyb21CYXNlNjRVUkwiLCJjaGFyQ29kZSIsImJpdHMiLCJFcnJvciIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsInN0cmluZ1RvQmFzZTY0VVJMIiwic3RyIiwiYmFzZTY0IiwiZW1pdHRlciIsImNoYXIiLCJwdXNoIiwic3RyaW5nVG9VVEY4Iiwiam9pbiIsInN0cmluZ0Zyb21CYXNlNjRVUkwiLCJjb252IiwidXRmOEVtaXQiLCJjb2RlcG9pbnQiLCJmcm9tQ29kZVBvaW50IiwidXRmOFN0YXRlIiwidXRmOHNlcSIsImI2NFN0YXRlIiwiYnl0ZUVtaXQiLCJzdHJpbmdGcm9tVVRGOCIsImNvZGVwb2ludFRvVVRGOCIsInRvU3RyaW5nIiwiaGlnaFN1cnJvZ2F0ZSIsImxvd1N1cnJvZ2F0ZSIsImxlYWRpbmdCaXQiLCJiYXNlNjRVcmxUb1VpbnQ4QXJyYXkiLCJyZXN1bHQiLCJvbkJ5dGUiLCJVaW50OEFycmF5Iiwic3RyaW5nVG9VaW50OEFycmF5IiwiYnl0ZXNUb0Jhc2U2NFVSTCIsImJ5dGVzIiwib25DaGFyIiwiZm9yRWFjaCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/constants.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ API_VERSIONS: () => (/* binding */ API_VERSIONS),\n/* harmony export */ API_VERSION_HEADER_NAME: () => (/* binding */ API_VERSION_HEADER_NAME),\n/* harmony export */ AUDIENCE: () => (/* binding */ AUDIENCE),\n/* harmony export */ AUTO_REFRESH_TICK_DURATION_MS: () => (/* binding */ AUTO_REFRESH_TICK_DURATION_MS),\n/* harmony export */ AUTO_REFRESH_TICK_THRESHOLD: () => (/* binding */ AUTO_REFRESH_TICK_THRESHOLD),\n/* harmony export */ BASE64URL_REGEX: () => (/* binding */ BASE64URL_REGEX),\n/* harmony export */ DEFAULT_HEADERS: () => (/* binding */ DEFAULT_HEADERS),\n/* harmony export */ EXPIRY_MARGIN_MS: () => (/* binding */ EXPIRY_MARGIN_MS),\n/* harmony export */ GOTRUE_URL: () => (/* binding */ GOTRUE_URL),\n/* harmony export */ JWKS_TTL: () => (/* binding */ JWKS_TTL),\n/* harmony export */ NETWORK_FAILURE: () => (/* binding */ NETWORK_FAILURE),\n/* harmony export */ STORAGE_KEY: () => (/* binding */ STORAGE_KEY)\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./version */ \"(ssr)/./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/${_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2NvbnN0YW50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQW9DO0FBQ3BDLGtFQUFrRSxHQUMzRCxNQUFNQyxnQ0FBZ0MsS0FBSyxLQUFLO0FBQ3ZEO3lGQUN5RixHQUNsRixNQUFNQyw4QkFBOEIsRUFBRTtBQUM3Qzs7Q0FFQyxHQUNNLE1BQU1DLG1CQUFtQkQsOEJBQThCRCw4QkFBOEI7QUFDckYsTUFBTUcsYUFBYSx3QkFBd0I7QUFDM0MsTUFBTUMsY0FBYyxzQkFBc0I7QUFDMUMsTUFBTUMsV0FBVyxHQUFHO0FBQ3BCLE1BQU1DLGtCQUFrQjtJQUFFLGlCQUFpQixDQUFDLFVBQVUsRUFBRVAsNkNBQU9BLENBQUMsQ0FBQztBQUFDLEVBQUU7QUFDcEUsTUFBTVEsa0JBQWtCO0lBQzNCQyxhQUFhO0lBQ2JDLGdCQUFnQjtBQUNwQixFQUFFO0FBQ0ssTUFBTUMsMEJBQTBCLHlCQUF5QjtBQUN6RCxNQUFNQyxlQUFlO0lBQ3hCLGNBQWM7UUFDVkMsV0FBV0MsS0FBS0MsS0FBSyxDQUFDO1FBQ3RCQyxNQUFNO0lBQ1Y7QUFDSixFQUFFO0FBQ0ssTUFBTUMsa0JBQWtCLHVEQUF1RDtBQUMvRSxNQUFNQyxXQUFXLEtBQUssS0FBSyxLQUFLLENBQUMsYUFBYTtDQUNyRCxxQ0FBcUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2NvbnN0YW50cy5qcz9mMDQ4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24nO1xuLyoqIEN1cnJlbnQgc2Vzc2lvbiB3aWxsIGJlIGNoZWNrZWQgZm9yIHJlZnJlc2ggYXQgdGhpcyBpbnRlcnZhbC4gKi9cbmV4cG9ydCBjb25zdCBBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyA9IDMwICogMTAwMDtcbi8qKlxuICogQSB0b2tlbiByZWZyZXNoIHdpbGwgYmUgYXR0ZW1wdGVkIHRoaXMgbWFueSB0aWNrcyBiZWZvcmUgdGhlIGN1cnJlbnQgc2Vzc2lvbiBleHBpcmVzLiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9fUkVGUkVTSF9USUNLX1RIUkVTSE9MRCA9IDM7XG4vKlxuICogRWFybGllc3QgdGltZSBiZWZvcmUgYW4gYWNjZXNzIHRva2VuIGV4cGlyZXMgdGhhdCB0aGUgc2Vzc2lvbiBzaG91bGQgYmUgcmVmcmVzaGVkLlxuICovXG5leHBvcnQgY29uc3QgRVhQSVJZX01BUkdJTl9NUyA9IEFVVE9fUkVGUkVTSF9USUNLX1RIUkVTSE9MRCAqIEFVVE9fUkVGUkVTSF9USUNLX0RVUkFUSU9OX01TO1xuZXhwb3J0IGNvbnN0IEdPVFJVRV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdDo5OTk5JztcbmV4cG9ydCBjb25zdCBTVE9SQUdFX0tFWSA9ICdzdXBhYmFzZS5hdXRoLnRva2VuJztcbmV4cG9ydCBjb25zdCBBVURJRU5DRSA9ICcnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSEVBREVSUyA9IHsgJ1gtQ2xpZW50LUluZm8nOiBgZ290cnVlLWpzLyR7dmVyc2lvbn1gIH07XG5leHBvcnQgY29uc3QgTkVUV09SS19GQUlMVVJFID0ge1xuICAgIE1BWF9SRVRSSUVTOiAxMCxcbiAgICBSRVRSWV9JTlRFUlZBTDogMiwgLy8gaW4gZGVjaXNlY29uZHNcbn07XG5leHBvcnQgY29uc3QgQVBJX1ZFUlNJT05fSEVBREVSX05BTUUgPSAnWC1TdXBhYmFzZS1BcGktVmVyc2lvbic7XG5leHBvcnQgY29uc3QgQVBJX1ZFUlNJT05TID0ge1xuICAgICcyMDI0LTAxLTAxJzoge1xuICAgICAgICB0aW1lc3RhbXA6IERhdGUucGFyc2UoJzIwMjQtMDEtMDFUMDA6MDA6MDAuMFonKSxcbiAgICAgICAgbmFtZTogJzIwMjQtMDEtMDEnLFxuICAgIH0sXG59O1xuZXhwb3J0IGNvbnN0IEJBU0U2NFVSTF9SRUdFWCA9IC9eKFthLXowLTlfLV17NH0pKigkfFthLXowLTlfLV17M30kfFthLXowLTlfLV17Mn0kKSQvaTtcbmV4cG9ydCBjb25zdCBKV0tTX1RUTCA9IDEwICogNjAgKiAxMDAwOyAvLyAxMCBtaW51dGVzXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIl0sIm5hbWVzIjpbInZlcnNpb24iLCJBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyIsIkFVVE9fUkVGUkVTSF9USUNLX1RIUkVTSE9MRCIsIkVYUElSWV9NQVJHSU5fTVMiLCJHT1RSVUVfVVJMIiwiU1RPUkFHRV9LRVkiLCJBVURJRU5DRSIsIkRFRkFVTFRfSEVBREVSUyIsIk5FVFdPUktfRkFJTFVSRSIsIk1BWF9SRVRSSUVTIiwiUkVUUllfSU5URVJWQUwiLCJBUElfVkVSU0lPTl9IRUFERVJfTkFNRSIsIkFQSV9WRVJTSU9OUyIsInRpbWVzdGFtcCIsIkRhdGUiLCJwYXJzZSIsIm5hbWUiLCJCQVNFNjRVUkxfUkVHRVgiLCJKV0tTX1RUTCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/errors.js ***!
|
||
\******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthApiError: () => (/* binding */ AuthApiError),\n/* harmony export */ AuthError: () => (/* binding */ AuthError),\n/* harmony export */ AuthImplicitGrantRedirectError: () => (/* binding */ AuthImplicitGrantRedirectError),\n/* harmony export */ AuthInvalidCredentialsError: () => (/* binding */ AuthInvalidCredentialsError),\n/* harmony export */ AuthInvalidJwtError: () => (/* binding */ AuthInvalidJwtError),\n/* harmony export */ AuthInvalidTokenResponseError: () => (/* binding */ AuthInvalidTokenResponseError),\n/* harmony export */ AuthPKCECodeVerifierMissingError: () => (/* binding */ AuthPKCECodeVerifierMissingError),\n/* harmony export */ AuthPKCEGrantCodeExchangeError: () => (/* binding */ AuthPKCEGrantCodeExchangeError),\n/* harmony export */ AuthRetryableFetchError: () => (/* binding */ AuthRetryableFetchError),\n/* harmony export */ AuthSessionMissingError: () => (/* binding */ AuthSessionMissingError),\n/* harmony export */ AuthUnknownError: () => (/* binding */ AuthUnknownError),\n/* harmony export */ AuthWeakPasswordError: () => (/* binding */ AuthWeakPasswordError),\n/* harmony export */ CustomAuthError: () => (/* binding */ CustomAuthError),\n/* harmony export */ isAuthApiError: () => (/* binding */ isAuthApiError),\n/* harmony export */ isAuthError: () => (/* binding */ isAuthError),\n/* harmony export */ isAuthImplicitGrantRedirectError: () => (/* binding */ isAuthImplicitGrantRedirectError),\n/* harmony export */ isAuthPKCECodeVerifierMissingError: () => (/* binding */ isAuthPKCECodeVerifierMissingError),\n/* harmony export */ isAuthRetryableFetchError: () => (/* binding */ isAuthRetryableFetchError),\n/* harmony export */ isAuthSessionMissingError: () => (/* binding */ isAuthSessionMissingError),\n/* harmony export */ isAuthWeakPasswordError: () => (/* 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 constructor(message, details = null){\n super(message, \"AuthImplicitGrantRedirectError\", 500, undefined);\n this.details = null;\n this.details = details;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n details: this.details\n };\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 constructor(message, details = null){\n super(message, \"AuthPKCEGrantCodeExchangeError\", 500, undefined);\n this.details = null;\n this.details = details;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n details: this.details\n };\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2Vycm9ycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Q0FTQyxHQUNNLE1BQU1BLGtCQUFrQkM7SUFDM0JDLFlBQVlDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLENBQUU7UUFDL0IsS0FBSyxDQUFDRjtRQUNOLElBQUksQ0FBQ0csYUFBYSxHQUFHO1FBQ3JCLElBQUksQ0FBQ0MsSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDSCxNQUFNLEdBQUdBO1FBQ2QsSUFBSSxDQUFDQyxJQUFJLEdBQUdBO0lBQ2hCO0FBQ0o7QUFDTyxTQUFTRyxZQUFZQyxLQUFLO0lBQzdCLE9BQU8sT0FBT0EsVUFBVSxZQUFZQSxVQUFVLFFBQVEsbUJBQW1CQTtBQUM3RTtBQUNBOzs7Ozs7Ozs7Q0FTQyxHQUNNLE1BQU1DLHFCQUFxQlY7SUFDOUJFLFlBQVlDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLENBQUU7UUFDL0IsS0FBSyxDQUFDRixTQUFTQyxRQUFRQztRQUN2QixJQUFJLENBQUNFLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ0gsTUFBTSxHQUFHQTtRQUNkLElBQUksQ0FBQ0MsSUFBSSxHQUFHQTtJQUNoQjtBQUNKO0FBQ08sU0FBU00sZUFBZUYsS0FBSztJQUNoQyxPQUFPRCxZQUFZQyxVQUFVQSxNQUFNRixJQUFJLEtBQUs7QUFDaEQ7QUFDQTs7Ozs7Ozs7Ozs7OztDQWFDLEdBQ00sTUFBTUsseUJBQXlCWjtJQUNsQ0UsWUFBWUMsT0FBTyxFQUFFVSxhQUFhLENBQUU7UUFDaEMsS0FBSyxDQUFDVjtRQUNOLElBQUksQ0FBQ0ksSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDTSxhQUFhLEdBQUdBO0lBQ3pCO0FBQ0o7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNQyx3QkFBd0JkO0lBQ2pDRSxZQUFZQyxPQUFPLEVBQUVJ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QyxVQUFVQSxNQUFNRixJQUFJLEtBQUs7QUFDaEQ7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNeUIsNEJBQTRCbEI7SUFDckNaLFlBQVlDLE9BQU8sQ0FBRTtRQUNqQixLQUFLLENBQUNBLFNBQVMsdUJBQXVCLEtBQUs7SUFDL0M7QUFDSixFQUNBLGtDQUFrQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvZXJyb3JzLmpzP2RkZWQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXNlIGVycm9yIHRocm93biBieSBTdXBhYmFzZSBBdXRoIGhlbHBlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aEVycm9yKCdVbmV4cGVjdGVkIGF1dGggZXJyb3InLCA1MDAsICd1bmV4cGVjdGVkJylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cywgY29kZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5fX2lzQXV0aEVycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0F1dGhFcnJvcic7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dGhFcnJvcihlcnJvcikge1xuICAgIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdfX2lzQXV0aEVycm9yJyBpbiBlcnJvcjtcbn1cbi8qKlxuICogRXJyb3IgcmV0dXJuZWQgZGlyZWN0bHkgZnJvbSB0aGUgR29UcnVlIFJFU1QgQVBJLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aEFwaUVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhBcGlFcnJvcignSW52YWxpZCBjcmVkZW50aWFscycsIDQwMCwgJ2ludmFsaWRfY3JlZGVudGlhbHMnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoQXBpRXJyb3IgZXh0ZW5kcyBBdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cywgY29kZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBzdGF0dXMsIGNvZGUpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnQXV0aEFwaUVycm9yJztcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aEFwaUVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGlzQXV0aEVycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQXV0aEFwaUVycm9yJztcbn1cbi8qKlxuICogV3JhcHMgbm9uLXN0YW5kYXJkIGVycm9ycyBzbyBjYWxsZXJzIGNhbiBpbnNwZWN0IHRoZSByb290IGNhdXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aFVua25vd25FcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IHNvbWVBdXRoQ2FsbCgpXG4gKiB9IGNhdGNoIChlcnIpIHtcbiAqICAgdGhyb3cgbmV3IEF1dGhVbmtub3duRXJyb3IoJ0F1dGggZmFpbGVkJywgZXJyKVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoVW5rbm93bkVycm9yIGV4dGVuZHMgQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcmlnaW5hbEVycm9yKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnQXV0aFVua25vd25FcnJvcic7XG4gICAgICAgIHRoaXMub3JpZ2luYWxFcnJvciA9IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxufVxuLyoqXG4gKiBGbGV4aWJsZSBlcnJvciBjbGFzcyB1c2VkIHRvIGNyZWF0ZSBuYW1lZCBhdXRoIGVycm9ycyBhdCBydW50aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQ3VzdG9tQXV0aEVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEN1c3RvbUF1dGhFcnJvcignTXkgY3VzdG9tIGF1dGggZXJyb3InLCAnTXlBdXRoRXJyb3InLCA0MDAsICdjdXN0b21fY29kZScpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEN1c3RvbUF1dGhFcnJvciBleHRlbmRzIEF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgbmFtZSwgc3RhdHVzLCBjb2RlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIHN0YXR1cywgY29kZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIHJlcXVpcmVzIGEgc2Vzc2lvbiBidXQgbm9uZSBpcyBwcmVzZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdBdXRoIHNlc3Npb24gbWlzc2luZyEnLCAnQXV0aFNlc3Npb25NaXNzaW5nRXJyb3InLCA0MDAsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gaXNBdXRoRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcic7XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSB0b2tlbiByZXNwb25zZSBpcyBtYWxmb3JtZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvcigpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhJbnZhbGlkVG9rZW5SZXNwb25zZUVycm9yIGV4dGVuZHMgQ3VzdG9tQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ0F1dGggc2Vzc2lvbiBvciB1c2VyIG1pc3NpbmcnLCAnQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3InLCA1MDAsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBlbWFpbC9wYXNzd29yZCBjcmVkZW50aWFscyBhcmUgaW52YWxpZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3IoJ0VtYWlsIG9yIHBhc3N3b3JkIGlzIGluY29ycmVjdCcpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCAnQXV0aEludmFsaWRDcmVkZW50aWFsc0Vycm9yJywgNDAwLCB1bmRlZmluZWQpO1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gaW1wbGljaXQgZ3JhbnQgcmVkaXJlY3RzIGNvbnRhaW4gYW4gZXJyb3IuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yKCdPQXV0aCByZWRpcmVjdCBmYWlsZWQnLCB7XG4gKiAgIGVycm9yOiAnYWNjZXNzX2RlbmllZCcsXG4gKiAgIGNvZGU6ICdvYXV0aF9lcnJvcicsXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGRldGFpbHMgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsICdBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3InLCA1MDAsIHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuZGV0YWlscyA9IG51bGw7XG4gICAgICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmRldGFpbHMsXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGlzQXV0aEVycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yJztcbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIGR1cmluZyBQS0NFIGNvZGUgZXhjaGFuZ2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aFBLQ0VHcmFudENvZGVFeGNoYW5nZUVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvcignUEtDRSBleGNoYW5nZSBmYWlsZWQnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGRldGFpbHMgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsICdBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3InLCA1MDAsIHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuZGV0YWlscyA9IG51bGw7XG4gICAgICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmRldGFpbHMsXG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGUgUEtDRSBjb2RlIHZlcmlmaWVyIGlzIG5vdCBmb3VuZCBpbiBzdG9yYWdlLlxuICogVGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuIHRoZSBhdXRoIGZsb3cgd2FzIGluaXRpYXRlZCBpbiBhIGRpZmZlcmVudFxuICogYnJvd3NlciwgZGV2aWNlLCBvciB0aGUgc3RvcmFnZSB3YXMgY2xlYXJlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yKClcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignUEtDRSBjb2RlIHZlcmlmaWVyIG5vdCBmb3VuZCBpbiBzdG9yYWdlLiAnICtcbiAgICAgICAgICAgICdUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGF1dGggZmxvdyB3YXMgaW5pdGlhdGVkIGluIGEgZGlmZmVyZW50IGJyb3dzZXIgb3IgZGV2aWNlLCAnICtcbiAgICAgICAgICAgICdvciBpZiB0aGUgc3RvcmFnZSB3YXMgY2xlYXJlZC4gRm9yIFNTUiBmcmFtZXdvcmtzIChOZXh0LmpzLCBTdmVsdGVLaXQsIGV0Yy4pLCAnICtcbiAgICAgICAgICAgICd1c2UgQHN1cGFiYXNlL3NzciBvbiBib3RoIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCB0byBzdG9yZSB0aGUgY29kZSB2ZXJpZmllciBpbiBjb29raWVzLicsICdBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvcicsIDQwMCwgJ3BrY2VfY29kZV92ZXJpZmllcl9ub3RfZm91bmQnKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvcihlcnJvcikge1xuICAgIHJldHVybiBpc0F1dGhFcnJvcihlcnJvcikgJiYgZXJyb3IubmFtZSA9PT0gJ0F1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yJztcbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSB0cmFuc2llbnQgZmV0Y2ggaXNzdWUgb2NjdXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoJ1NlcnZpY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUnLCA1MDMpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhSZXRyeWFibGVGZXRjaEVycm9yIGV4dGVuZHMgQ3VzdG9tQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBzdGF0dXMpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgJ0F1dGhSZXRyeWFibGVGZXRjaEVycm9yJywgc3RhdHVzLCB1bmRlZmluZWQpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dGhSZXRyeWFibGVGZXRjaEVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGlzQXV0aEVycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQXV0aFJldHJ5YWJsZUZldGNoRXJyb3InO1xufVxuLyoqXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biBvbiBjZXJ0YWluIG1ldGhvZHMgd2hlbiB0aGUgcGFzc3dvcmQgdXNlZCBpcyBkZWVtZWRcbiAqIHdlYWsuIEluc3BlY3QgdGhlIHJlYXNvbnMgdG8gaWRlbnRpZnkgd2hhdCBwYXNzd29yZCBzdHJlbmd0aCBydWxlcyBhcmVcbiAqIGluYWRlcXVhdGUuXG4gKi9cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSBzdXBwbGllZCBwYXNzd29yZCBpcyBjb25zaWRlcmVkIHdlYWsuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoV2Vha1Bhc3N3b3JkRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aFdlYWtQYXNzd29yZEVycm9yKCdQYXNzd29yZCB0b28gc2hvcnQnLCA0MDAsIFsnbWluX2xlbmd0aCddKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoV2Vha1Bhc3N3b3JkRXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cywgcmVhc29ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCAnQXV0aFdlYWtQYXNzd29yZEVycm9yJywgc3RhdHVzLCAnd2Vha19wYXNzd29yZCcpO1xuICAgICAgICB0aGlzLnJlYXNvbnMgPSByZWFzb25zO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dGhXZWFrUGFzc3dvcmRFcnJvcihlcnJvcikge1xuICAgIHJldHVybiBpc0F1dGhFcnJvcihlcnJvcikgJiYgZXJyb3IubmFtZSA9PT0gJ0F1dGhXZWFrUGFzc3dvcmRFcnJvcic7XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgSldUIGNhbm5vdCBiZSB2ZXJpZmllZCBvciBwYXJzZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoSW52YWxpZEp3dEVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhJbnZhbGlkSnd0RXJyb3IoJ1Rva2VuIHNpZ25hdHVyZSBpcyBpbnZhbGlkJylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aEludmFsaWRKd3RFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCAnQXV0aEludmFsaWRKd3RFcnJvcicsIDQwMCwgJ2ludmFsaWRfand0Jyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCJdLCJuYW1lcyI6WyJBdXRoRXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwibWVzc2FnZSIsInN0YXR1cyIsImNvZGUiLCJfX2lzQXV0aEVycm9yIiwibmFtZSIsImlzQXV0aEVycm9yIiwiZXJyb3IiLCJBdXRoQXBpRXJyb3IiLCJpc0F1dGhBcGlFcnJvciIsIkF1dGhVbmtub3duRXJyb3IiLCJvcmlnaW5hbEVycm9yIiwiQ3VzdG9tQXV0aEVycm9yIiwiQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IiLCJ1bmRlZmluZWQiLCJpc0F1dGhTZXNzaW9uTWlzc2luZ0Vycm9yIiwiQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IiLCJBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3IiLCJBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IiLCJkZXRhaWxzIiwidG9KU09OIiwiaXNBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IiLCJBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3IiLCJBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvciIsImlzQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3IiLCJBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvciIsImlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IiLCJBdXRoV2Vha1Bhc3N3b3JkRXJyb3IiLCJyZWFzb25zIiwiaXNBdXRoV2Vha1Bhc3N3b3JkRXJyb3IiLCJBdXRoSW52YWxpZEp3dEVycm9yIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/fetch.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ _generateLinkResponse: () => (/* binding */ _generateLinkResponse),\n/* harmony export */ _noResolveJsonResponse: () => (/* binding */ _noResolveJsonResponse),\n/* harmony export */ _request: () => (/* binding */ _request),\n/* harmony export */ _sessionResponse: () => (/* binding */ _sessionResponse),\n/* harmony export */ _sessionResponsePassword: () => (/* binding */ _sessionResponsePassword),\n/* harmony export */ _ssoResponse: () => (/* binding */ _ssoResponse),\n/* harmony export */ _userResponse: () => (/* binding */ _userResponse),\n/* harmony export */ handleError: () => (/* binding */ handleError)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tslib */ \"(ssr)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./errors */ \"(ssr)/./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 ${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2ZldGNoLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUErQjtBQUNxQztBQUNtQjtBQUM2QztBQUNwSSxNQUFNVyxtQkFBbUIsQ0FBQ0MsTUFBUUEsSUFBSUMsR0FBRyxJQUFJRCxJQUFJRSxPQUFPLElBQUlGLElBQUlHLGlCQUFpQixJQUFJSCxJQUFJSSxLQUFLLElBQUlDLEtBQUtDLFNBQVMsQ0FBQ047QUFDakgsTUFBTU8sc0JBQXNCO0lBQUM7SUFBSztJQUFLO0NBQUk7QUFDcEMsZUFBZUMsWUFBWUosS0FBSztJQUNuQyxJQUFJSztJQUNKLElBQUksQ0FBQ2pCLGdFQUFzQkEsQ0FBQ1ksUUFBUTtRQUNoQyxNQUFNLElBQUlULDREQUF1QkEsQ0FBQ0ksaUJBQWlCSyxRQUFRO0lBQy9EO0lBQ0EsSUFBSUcsb0JBQW9CRyxRQUFRLENBQUNOLE1BQU1PLE1BQU0sR0FBRztRQUM1Qyw2RUFBNkU7UUFDN0UsTUFBTSxJQUFJaEIsNERBQXVCQSxDQUFDSSxpQkFBaUJLLFFBQVFBLE1BQU1PLE1BQU07SUFDM0U7SUFDQSxJQUFJQztJQUNKLElBQUk7UUFDQUEsT0FBTyxNQUFNUixNQUFNUyxJQUFJO0lBQzNCLEVBQ0EsT0FBT0MsR0FBRztRQUNOLE1BQU0sSUFBSWpCLHFEQUFnQkEsQ0FBQ0UsaUJBQWlCZSxJQUFJQTtJQUNwRDtJQUNBLElBQUlDLFlBQVlDO0lBQ2hCLE1BQU1DLHFCQUFxQnhCLGlFQUF1QkEsQ0FBQ1c7SUFDbkQsSUFBSWEsc0JBQ0FBLG1CQUFtQkMsT0FBTyxNQUFNN0Isb0RBQVksQ0FBQyxhQUFhLENBQUM4QixTQUFTLElBQ3BFLE9BQU9QLFNBQVMsWUFDaEJBLFFBQ0EsT0FBT0EsS0FBS1EsSUFBSSxLQUFLLFVBQVU7UUFDL0JMLFlBQVlILEtBQUtRLElBQUk7SUFDekIsT0FDSyxJQUFJLE9BQU9SLFNBQVMsWUFBWUEsUUFBUSxPQUFPQSxLQUFLUyxVQUFVLEtBQUssVUFBVTtRQUM5RU4sWUFBWUgsS0FBS1MsVUFBVTtJQUMvQjtJQUNBLElBQUksQ0FBQ04sV0FBVztRQUNaLDBFQUEwRTtRQUMxRSxJQUFJLE9BQU9ILFNBQVMsWUFDaEJBLFFBQ0EsT0FBT0EsS0FBS1UsYUFBYSxLQUFLLFlBQzlCVixLQUFLVSxhQUFhLElBQ2xCQyxNQUFNQyxPQUFPLENBQUNaLEtBQUtVLGFBQWEsQ0FBQ0csT0FBTyxLQUN4Q2IsS0FBS1UsYUFBYSxDQUFDRyxPQUFPLENBQUNDLE1BQU0sSUFDakNkLEtBQUtVLGFBQWEsQ0FBQ0csT0FBTyxDQUFDRSxNQUFNLENBQUMsQ0FBQ0MsR0FBR0MsSUFBTUQsS0FBSyxPQUFPQyxNQUFNLFVBQVUsT0FBTztZQUMvRSxNQUFNLElBQUlqQywwREFBcUJBLENBQUNHLGlCQUFpQmEsT0FBT1IsTUFBTU8sTUFBTSxFQUFFQyxLQUFLVSxhQUFhLENBQUNHLE9BQU87UUFDcEc7SUFDSixPQUNLLElBQUlWLGNBQWMsaUJBQWlCO1FBQ3BDLE1BQU0sSUFBSW5CLDBEQUFxQkEsQ0FBQ0csaUJBQWlCYSxPQUFPUixNQUFNTyxNQUFNLEVBQUUsQ0FBQyxDQUFDRixLQUFLRyxLQUFLVSxhQUFhLE1BQU0sUUFBUWIsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHZ0IsT0FBTyxLQUFLLEVBQUU7SUFDM0osT0FDSyxJQUFJVixjQUFjLHFCQUFxQjtRQUN4QyxzRUFBc0U7UUFDdEUseUVBQXlFO1FBQ3pFLHlEQUF5RDtRQUN6RCxNQUFNLElBQUlqQiw0REFBdUJBO0lBQ3JDO0lBQ0EsTUFBTSxJQUFJSixpREFBWUEsQ0FBQ0ssaUJBQWlCYSxPQUFPUixNQUFNTyxNQUFNLElBQUksS0FBS0k7QUFDeEU7QUFDQSxNQUFNZSxvQkFBb0IsQ0FBQ0MsUUFBUUMsU0FBU0MsWUFBWUM7SUFDcEQsTUFBTUMsU0FBUztRQUFFSjtRQUFRSyxTQUFTLENBQUNKLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRSSxPQUFPLEtBQUssQ0FBQztJQUFFO0lBQzVHLElBQUlMLFdBQVcsT0FBTztRQUNsQixPQUFPSTtJQUNYO0lBQ0FBLE9BQU9DLE9BQU8sR0FBR0MsT0FBT0MsTUFBTSxDQUFDO1FBQUUsZ0JBQWdCO0lBQWlDLEdBQUdOLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRSSxPQUFPO0lBQ3RKRCxPQUFPRCxJQUFJLEdBQUc3QixLQUFLQyxTQUFTLENBQUM0QjtJQUM3QixPQUFPRyxPQUFPQyxNQUFNLENBQUNELE9BQU9DLE1BQU0sQ0FBQyxDQUFDLEdBQUdILFNBQVNGO0FBQ3BEO0FBQ08sZUFBZU0sU0FBU0MsT0FBTyxFQUFFVCxNQUFNLEVBQUVVLEdBQUcsRUFBRVQsT0FBTztJQUN4RCxJQUFJdkI7SUFDSixNQUFNMkIsVUFBVUMsT0FBT0MsTUFBTSxDQUFDLENBQUMsR0FBR04sWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFJLE9BQU87SUFDbkcsSUFBSSxDQUFDQSxPQUFPLENBQUM5QywrREFBdUJBLENBQUMsRUFBRTtRQUNuQzhDLE9BQU8sQ0FBQzlDLCtEQUF1QkEsQ0FBQyxHQUFHRCxvREFBWSxDQUFDLGFBQWEsQ0FBQ3FELElBQUk7SUFDdEU7SUFDQSxJQUFJVixZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUVcsR0FBRyxFQUFFO1FBQy9EUCxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxPQUFPLEVBQUVKLFFBQVFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3REO0lBQ0EsTUFBTUMsS0FBSyxDQUFDbkMsS0FBS3VCLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRYSxLQUFLLE1BQU0sUUFBUXBDLE9BQU8sS0FBSyxJQUFJQSxLQUFLLENBQUM7SUFDcEgsSUFBSXVCLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRYyxVQUFVLEVBQUU7UUFDdEVGLEVBQUUsQ0FBQyxjQUFjLEdBQUdaLFFBQVFjLFVBQVU7SUFDMUM7SUFDQSxNQUFNQyxjQUFjVixPQUFPVyxJQUFJLENBQUNKLElBQUlsQixNQUFNLEdBQUcsTUFBTSxJQUFJdUIsZ0JBQWdCTCxJQUFJTSxRQUFRLEtBQUs7SUFDeEYsTUFBTXRDLE9BQU8sTUFBTXVDLGVBQWVYLFNBQVNULFFBQVFVLE1BQU1NLGFBQWE7UUFDbEVYO1FBQ0FnQixlQUFlcEIsWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFvQixhQUFhO0lBQzFGLEdBQUcsQ0FBQyxHQUFHcEIsWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFFLElBQUk7SUFDckUsT0FBTyxDQUFDRixZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUXFCLEtBQUssSUFBSXJCLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRcUIsS0FBSyxDQUFDekMsUUFBUTtRQUFFQSxNQUFNeUIsT0FBT0MsTUFBTSxDQUFDLENBQUMsR0FBRzFCO1FBQU9SLE9BQU87SUFBSztBQUNwTTtBQUNBLGVBQWUrQyxlQUFlWCxPQUFPLEVBQUVULE1BQU0sRUFBRVUsR0FBRyxFQUFFVCxPQUFPLEVBQUVDLFVBQVUsRUFBRUMsSUFBSTtJQUN6RSxNQUFNb0IsZ0JBQWdCeEIsa0JBQWtCQyxRQUFRQyxTQUFTQyxZQUFZQztJQUNyRSxJQUFJcUI7SUFDSixJQUFJO1FBQ0FBLFNBQVMsTUFBTWYsUUFBUUMsS0FBS0osT0FBT0MsTUFBTSxDQUFDLENBQUMsR0FBR2dCO0lBQ2xELEVBQ0EsT0FBT3hDLEdBQUc7UUFDTjBDLFFBQVFwRCxLQUFLLENBQUNVO1FBQ2Qsc0RBQXNEO1FBQ3RELE1BQU0sSUFBSW5CLDREQUF1QkEsQ0FBQ0ksaUJBQWlCZSxJQUFJO0lBQzNEO0lBQ0EsSUFBSSxDQUFDeUMsT0FBT0UsRUFBRSxFQUFFO1FBQ1osTUFBTWpELFlBQVkrQztJQUN0QjtJQUNBLElBQUl2QixZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUW9CLGFBQWEsRUFBRTtRQUN6RSxPQUFPRztJQUNYO0lBQ0EsSUFBSTtRQUNBLE9BQU8sTUFBTUEsT0FBTzFDLElBQUk7SUFDNUIsRUFDQSxPQUFPQyxHQUFHO1FBQ04sTUFBTU4sWUFBWU07SUFDdEI7QUFDSjtBQUNPLFNBQVM0QyxpQkFBaUI5QyxJQUFJO0lBQ2pDLElBQUlIO0lBQ0osSUFBSWtELFVBQVU7SUFDZCxJQUFJQyxXQUFXaEQsT0FBTztRQUNsQitDLFVBQVV0QixPQUFPQyxNQUFNLENBQUMsQ0FBQyxHQUFHMUI7UUFDNUIsSUFBSSxDQUFDQSxLQUFLaUQsVUFBVSxFQUFFO1lBQ2xCRixRQUFRRSxVQUFVLEdBQUd0RSxtREFBU0EsQ0FBQ3FCLEtBQUtrRCxVQUFVO1FBQ2xEO0lBQ0o7SUFDQSxNQUFNQyxPQUFPLENBQUN0RCxLQUFLRyxLQUFLbUQsSUFBSSxNQUFNLFFBQVF0RCxPQUFPLEtBQUssSUFBSUEsS0FBS0c7SUFDL0QsT0FBTztRQUFFQSxNQUFNO1lBQUUrQztZQUFTSTtRQUFLO1FBQUczRCxPQUFPO0lBQUs7QUFDbEQ7QUFDTyxTQUFTNEQseUJBQXlCcEQsSUFBSTtJQUN6QyxNQUFNcUQsV0FBV1AsaUJBQWlCOUM7SUFDbEMsSUFBSSxDQUFDcUQsU0FBUzdELEtBQUssSUFDZlEsS0FBS1UsYUFBYSxJQUNsQixPQUFPVixLQUFLVSxhQUFhLEtBQUssWUFDOUJDLE1BQU1DLE9BQU8sQ0FBQ1osS0FBS1UsYUFBYSxDQUFDRyxPQUFPLEtBQ3hDYixLQUFLVSxhQUFhLENBQUNHLE9BQU8sQ0FBQ0MsTUFBTSxJQUNqQ2QsS0FBS1UsYUFBYSxDQUFDcEIsT0FBTyxJQUMxQixPQUFPVSxLQUFLVSxhQUFhLENBQUNwQixPQUFPLEtBQUssWUFDdENVLEtBQUtVLGFBQWEsQ0FBQ0csT0FBTyxDQUFDRSxNQUFNLENBQUMsQ0FBQ0MsR0FBR0MsSUFBTUQsS0FBSyxPQUFPQyxNQUFNLFVBQVUsT0FBTztRQUMvRW9DLFNBQVNyRCxJQUFJLENBQUNVLGFBQWEsR0FBR1YsS0FBS1UsYUFBYTtJQUNwRDtJQUNBLE9BQU8yQztBQUNYO0FBQ08sU0FBU0MsY0FBY3RELElBQUk7SUFDOUIsSUFBSUg7SUFDSixNQUFNc0QsT0FBTyxDQUFDdEQsS0FBS0csS0FBS21ELElBQUksTUFBTSxRQUFRdEQsT0FBTyxLQUFLLElBQUlBLEtBQUtHO0lBQy9ELE9BQU87UUFBRUEsTUFBTTtZQUFFbUQ7UUFBSztRQUFHM0QsT0FBTztJQUFLO0FBQ3pDO0FBQ08sU0FBUytELGFBQWF2RCxJQUFJO0lBQzdCLE9BQU87UUFBRUE7UUFBTVIsT0FBTztJQUFLO0FBQy9CO0FBQ08sU0FBU2dFLHNCQUFzQnhELElBQUk7SUFDdEMsTUFBTSxFQUFFeUQsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLFlBQVksRUFBRUMsV0FBVyxFQUFFQyxpQkFBaUIsRUFBRSxHQUFHN0QsTUFBTThELE9BQU90Riw2Q0FBTUEsQ0FBQ3dCLE1BQU07UUFBQztRQUFlO1FBQWE7UUFBZ0I7UUFBZTtLQUFvQjtJQUMzTCxNQUFNK0QsYUFBYTtRQUNmTjtRQUNBQztRQUNBQztRQUNBQztRQUNBQztJQUNKO0lBQ0EsTUFBTVYsT0FBTzFCLE9BQU9DLE1BQU0sQ0FBQyxDQUFDLEdBQUdvQztJQUMvQixPQUFPO1FBQ0g5RCxNQUFNO1lBQ0YrRDtZQUNBWjtRQUNKO1FBQ0EzRCxPQUFPO0lBQ1g7QUFDSjtBQUNPLFNBQVN3RSx1QkFBdUJoRSxJQUFJO0lBQ3ZDLE9BQU9BO0FBQ1g7QUFDQTs7OztDQUlDLEdBQ0QsU0FBU2dELFdBQVdoRCxJQUFJO0lBQ3BCLE9BQU9BLEtBQUtpRSxZQUFZLElBQUlqRSxLQUFLa0UsYUFBYSxJQUFJbEUsS0FBS2tELFVBQVU7QUFDckUsRUFDQSxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2ZldGNoLmpzPzAyMzAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBUElfVkVSU0lPTlMsIEFQSV9WRVJTSU9OX0hFQURFUl9OQU1FIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZXhwaXJlc0F0LCBsb29rc0xpa2VGZXRjaFJlc3BvbnNlLCBwYXJzZVJlc3BvbnNlQVBJVmVyc2lvbiB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBBdXRoQXBpRXJyb3IsIEF1dGhSZXRyeWFibGVGZXRjaEVycm9yLCBBdXRoV2Vha1Bhc3N3b3JkRXJyb3IsIEF1dGhVbmtub3duRXJyb3IsIEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yLCB9IGZyb20gJy4vZXJyb3JzJztcbmNvbnN0IF9nZXRFcnJvck1lc3NhZ2UgPSAoZXJyKSA9PiBlcnIubXNnIHx8IGVyci5tZXNzYWdlIHx8IGVyci5lcnJvcl9kZXNjcmlwdGlvbiB8fCBlcnIuZXJyb3IgfHwgSlNPTi5zdHJpbmdpZnkoZXJyKTtcbmNvbnN0IE5FVFdPUktfRVJST1JfQ09ERVMgPSBbNTAyLCA1MDMsIDUwNF07XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3IpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCFsb29rc0xpa2VGZXRjaFJlc3BvbnNlKGVycm9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoX2dldEVycm9yTWVzc2FnZShlcnJvciksIDApO1xuICAgIH1cbiAgICBpZiAoTkVUV09SS19FUlJPUl9DT0RFUy5pbmNsdWRlcyhlcnJvci5zdGF0dXMpKSB7XG4gICAgICAgIC8vIHN0YXR1cyBpbiA1MDAuLi41OTkgcmFuZ2UgLSBzZXJ2ZXIgaGFkIGFuIGVycm9yLCByZXF1ZXN0IG1pZ2h0IGJlIHJldHJ5ZWQuXG4gICAgICAgIHRocm93IG5ldyBBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvcihfZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSwgZXJyb3Iuc3RhdHVzKTtcbiAgICB9XG4gICAgbGV0IGRhdGE7XG4gICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IGF3YWl0IGVycm9yLmpzb24oKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhVbmtub3duRXJyb3IoX2dldEVycm9yTWVzc2FnZShlKSwgZSk7XG4gICAgfVxuICAgIGxldCBlcnJvckNvZGUgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzcG9uc2VBUElWZXJzaW9uID0gcGFyc2VSZXNwb25zZUFQSVZlcnNpb24oZXJyb3IpO1xuICAgIGlmIChyZXNwb25zZUFQSVZlcnNpb24gJiZcbiAgICAgICAgcmVzcG9uc2VBUElWZXJzaW9uLmdldFRpbWUoKSA+PSBBUElfVkVSU0lPTlNbJzIwMjQtMDEtMDEnXS50aW1lc3RhbXAgJiZcbiAgICAgICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAgIGRhdGEgJiZcbiAgICAgICAgdHlwZW9mIGRhdGEuY29kZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZXJyb3JDb2RlID0gZGF0YS5jb2RlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAmJiB0eXBlb2YgZGF0YS5lcnJvcl9jb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgICBlcnJvckNvZGUgPSBkYXRhLmVycm9yX2NvZGU7XG4gICAgfVxuICAgIGlmICghZXJyb3JDb2RlKSB7XG4gICAgICAgIC8vIExlZ2FjeSBzdXBwb3J0IGZvciB3ZWFrIHBhc3N3b3JkIGVycm9ycywgd2hlbiB0aGVyZSB3ZXJlIG5vIGVycm9yIGNvZGVzXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGRhdGEgJiZcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLndlYWtfcGFzc3dvcmQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICBkYXRhLndlYWtfcGFzc3dvcmQgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZGF0YS53ZWFrX3Bhc3N3b3JkLnJlYXNvbnMpICYmXG4gICAgICAgICAgICBkYXRhLndlYWtfcGFzc3dvcmQucmVhc29ucy5sZW5ndGggJiZcbiAgICAgICAgICAgIGRhdGEud2Vha19wYXNzd29yZC5yZWFzb25zLnJlZHVjZSgoYSwgaSkgPT4gYSAmJiB0eXBlb2YgaSA9PT0gJ3N0cmluZycsIHRydWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFdlYWtQYXNzd29yZEVycm9yKF9nZXRFcnJvck1lc3NhZ2UoZGF0YSksIGVycm9yLnN0YXR1cywgZGF0YS53ZWFrX3Bhc3N3b3JkLnJlYXNvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yQ29kZSA9PT0gJ3dlYWtfcGFzc3dvcmQnKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoV2Vha1Bhc3N3b3JkRXJyb3IoX2dldEVycm9yTWVzc2FnZShkYXRhKSwgZXJyb3Iuc3RhdHVzLCAoKF9hID0gZGF0YS53ZWFrX3Bhc3N3b3JkKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVhc29ucykgfHwgW10pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvckNvZGUgPT09ICdzZXNzaW9uX25vdF9mb3VuZCcpIHtcbiAgICAgICAgLy8gVGhlIGBzZXNzaW9uX2lkYCBpbnNpZGUgdGhlIEpXVCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcm93IGluIHRoZVxuICAgICAgICAvLyBgc2Vzc2lvbnNgIHRhYmxlLiBUaGlzIHVzdWFsbHkgbWVhbnMgdGhlIHVzZXIgaGFzIHNpZ25lZCBvdXQsIGhhcyBiZWVuXG4gICAgICAgIC8vIGRlbGV0ZWQsIG9yIHRoZWlyIHNlc3Npb24gaGFzIHNvbWVob3cgYmVlbiB0ZXJtaW5hdGVkLlxuICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEF1dGhBcGlFcnJvcihfZ2V0RXJyb3JNZXNzYWdlKGRhdGEpLCBlcnJvci5zdGF0dXMgfHwgNTAwLCBlcnJvckNvZGUpO1xufVxuY29uc3QgX2dldFJlcXVlc3RQYXJhbXMgPSAobWV0aG9kLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KSA9PiB7XG4gICAgY29uc3QgcGFyYW1zID0geyBtZXRob2QsIGhlYWRlcnM6IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhZGVycykgfHwge30gfTtcbiAgICBpZiAobWV0aG9kID09PSAnR0VUJykge1xuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICBwYXJhbXMuaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcgfSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlYWRlcnMpO1xuICAgIHBhcmFtcy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKSwgcGFyYW1ldGVycyk7XG59O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9yZXF1ZXN0KGZldGNoZXIsIG1ldGhvZCwgdXJsLCBvcHRpb25zKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhZGVycyk7XG4gICAgaWYgKCFoZWFkZXJzW0FQSV9WRVJTSU9OX0hFQURFUl9OQU1FXSkge1xuICAgICAgICBoZWFkZXJzW0FQSV9WRVJTSU9OX0hFQURFUl9OQU1FXSA9IEFQSV9WRVJTSU9OU1snMjAyNC0wMS0wMSddLm5hbWU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuand0KSB7XG4gICAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHtvcHRpb25zLmp3dH1gO1xuICAgIH1cbiAgICBjb25zdCBxcyA9IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5xdWVyeSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge307XG4gICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZWRpcmVjdFRvKSB7XG4gICAgICAgIHFzWydyZWRpcmVjdF90byddID0gb3B0aW9ucy5yZWRpcmVjdFRvO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IE9iamVjdC5rZXlzKHFzKS5sZW5ndGggPyAnPycgKyBuZXcgVVJMU2VhcmNoUGFyYW1zKHFzKS50b1N0cmluZygpIDogJyc7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IF9oYW5kbGVSZXF1ZXN0KGZldGNoZXIsIG1ldGhvZCwgdXJsICsgcXVlcnlTdHJpbmcsIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgbm9SZXNvbHZlSnNvbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm5vUmVzb2x2ZUpzb24sXG4gICAgfSwge30sIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib2R5KTtcbiAgICByZXR1cm4gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy54Zm9ybSkgPyBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueGZvcm0oZGF0YSkgOiB7IGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpLCBlcnJvcjogbnVsbCB9O1xufVxuYXN5bmMgZnVuY3Rpb24gX2hhbmRsZVJlcXVlc3QoZmV0Y2hlciwgbWV0aG9kLCB1cmwsIG9wdGlvbnMsIHBhcmFtZXRlcnMsIGJvZHkpIHtcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0gX2dldFJlcXVlc3RQYXJhbXMobWV0aG9kLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZldGNoZXIodXJsLCBPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0UGFyYW1zKSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIC8vIGZldGNoIGZhaWxlZCwgbGlrZWx5IGR1ZSB0byBhIG5ldHdvcmsgb3IgQ09SUyBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoX2dldEVycm9yTWVzc2FnZShlKSwgMCk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZUVycm9yKHJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubm9SZXNvbHZlSnNvbikge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdWx0Lmpzb24oKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgYXdhaXQgaGFuZGxlRXJyb3IoZSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9zZXNzaW9uUmVzcG9uc2UoZGF0YSkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgc2Vzc2lvbiA9IG51bGw7XG4gICAgaWYgKGhhc1Nlc3Npb24oZGF0YSkpIHtcbiAgICAgICAgc2Vzc2lvbiA9IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpO1xuICAgICAgICBpZiAoIWRhdGEuZXhwaXJlc19hdCkge1xuICAgICAgICAgICAgc2Vzc2lvbi5leHBpcmVzX2F0ID0gZXhwaXJlc0F0KGRhdGEuZXhwaXJlc19pbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdXNlciA9IChfYSA9IGRhdGEudXNlcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZGF0YTtcbiAgICByZXR1cm4geyBkYXRhOiB7IHNlc3Npb24sIHVzZXIgfSwgZXJyb3I6IG51bGwgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc2Vzc2lvblJlc3BvbnNlUGFzc3dvcmQoZGF0YSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gX3Nlc3Npb25SZXNwb25zZShkYXRhKTtcbiAgICBpZiAoIXJlc3BvbnNlLmVycm9yICYmXG4gICAgICAgIGRhdGEud2Vha19wYXNzd29yZCAmJlxuICAgICAgICB0eXBlb2YgZGF0YS53ZWFrX3Bhc3N3b3JkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGRhdGEud2Vha19wYXNzd29yZC5yZWFzb25zKSAmJlxuICAgICAgICBkYXRhLndlYWtfcGFzc3dvcmQucmVhc29ucy5sZW5ndGggJiZcbiAgICAgICAgZGF0YS53ZWFrX3Bhc3N3b3JkLm1lc3NhZ2UgJiZcbiAgICAgICAgdHlwZW9mIGRhdGEud2Vha19wYXNzd29yZC5tZXNzYWdlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICBkYXRhLndlYWtfcGFzc3dvcmQucmVhc29ucy5yZWR1Y2UoKGEsIGkpID0+IGEgJiYgdHlwZW9mIGkgPT09ICdzdHJpbmcnLCB0cnVlKSkge1xuICAgICAgICByZXNwb25zZS5kYXRhLndlYWtfcGFzc3dvcmQgPSBkYXRhLndlYWtfcGFzc3dvcmQ7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdXNlclJlc3BvbnNlKGRhdGEpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgdXNlciA9IChfYSA9IGRhdGEudXNlcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZGF0YTtcbiAgICByZXR1cm4geyBkYXRhOiB7IHVzZXIgfSwgZXJyb3I6IG51bGwgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc3NvUmVzcG9uc2UoZGF0YSkge1xuICAgIHJldHVybiB7IGRhdGEsIGVycm9yOiBudWxsIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX2dlbmVyYXRlTGlua1Jlc3BvbnNlKGRhdGEpIHtcbiAgICBjb25zdCB7IGFjdGlvbl9saW5rLCBlbWFpbF9vdHAsIGhhc2hlZF90b2tlbiwgcmVkaXJlY3RfdG8sIHZlcmlmaWNhdGlvbl90eXBlIH0gPSBkYXRhLCByZXN0ID0gX19yZXN0KGRhdGEsIFtcImFjdGlvbl9saW5rXCIsIFwiZW1haWxfb3RwXCIsIFwiaGFzaGVkX3Rva2VuXCIsIFwicmVkaXJlY3RfdG9cIiwgXCJ2ZXJpZmljYXRpb25fdHlwZVwiXSk7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgICAgYWN0aW9uX2xpbmssXG4gICAgICAgIGVtYWlsX290cCxcbiAgICAgICAgaGFzaGVkX3Rva2VuLFxuICAgICAgICByZWRpcmVjdF90byxcbiAgICAgICAgdmVyaWZpY2F0aW9uX3R5cGUsXG4gICAgfTtcbiAgICBjb25zdCB1c2VyID0gT2JqZWN0LmFzc2lnbih7fSwgcmVzdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgIHVzZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX25vUmVzb2x2ZUpzb25SZXNwb25zZShkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGE7XG59XG4vKipcbiAqIGhhc1Nlc3Npb24gY2hlY2tzIGlmIHRoZSByZXNwb25zZSBvYmplY3QgY29udGFpbnMgYSB2YWxpZCBzZXNzaW9uXG4gKiBAcGFyYW0gZGF0YSBBIHJlc3BvbnNlIG9iamVjdFxuICogQHJldHVybnMgdHJ1ZSBpZiBhIHNlc3Npb24gaXMgaW4gdGhlIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGhhc1Nlc3Npb24oZGF0YSkge1xuICAgIHJldHVybiBkYXRhLmFjY2Vzc190b2tlbiAmJiBkYXRhLnJlZnJlc2hfdG9rZW4gJiYgZGF0YS5leHBpcmVzX2luO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmV0Y2guanMubWFwIl0sIm5hbWVzIjpbIl9fcmVzdCIsIkFQSV9WRVJTSU9OUyIsIkFQSV9WRVJTSU9OX0hFQURFUl9OQU1FIiwiZXhwaXJlc0F0IiwibG9va3NMaWtlRmV0Y2hSZXNwb25zZSIsInBhcnNlUmVzcG9uc2VBUElWZXJzaW9uIiwiQXV0aEFwaUVycm9yIiwiQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IiLCJBdXRoV2Vha1Bhc3N3b3JkRXJyb3IiLCJBdXRoVW5rbm93bkVycm9yIiwiQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IiLCJfZ2V0RXJyb3JNZXNzYWdlIiwiZXJyIiwibXNnIiwibWVzc2FnZSIsImVycm9yX2Rlc2NyaXB0aW9uIiwiZXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiTkVUV09SS19FUlJPUl9DT0RFUyIsImhhbmRsZUVycm9yIiwiX2EiLCJpbmNsdWRlcyIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwiZSIsImVycm9yQ29kZSIsInVuZGVmaW5lZCIsInJlc3BvbnNlQVBJVmVyc2lvbiIsImdldFRpbWUiLCJ0aW1lc3RhbXAiLCJjb2RlIiwiZXJyb3JfY29kZSIsIndlYWtfcGFzc3dvcmQiLCJBcnJheSIsImlzQXJyYXkiLCJyZWFzb25zIiwibGVuZ3RoIiwicmVkdWNlIiwiYSIsImkiLCJfZ2V0UmVxdWVzdFBhcmFtcyIsIm1ldGhvZCIsIm9wdGlvbnMiLCJwYXJhbWV0ZXJzIiwiYm9keSIsInBhcmFtcyIsImhlYWRlcnMiLCJPYmplY3QiLCJhc3NpZ24iLCJfcmVxdWVzdCIsImZldGNoZXIiLCJ1cmwiLCJuYW1lIiwiand0IiwicXMiLCJxdWVyeSIsInJlZGlyZWN0VG8iLCJxdWVyeVN0cmluZyIsImtleXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJ0b1N0cmluZyIsIl9oYW5kbGVSZXF1ZXN0Iiwibm9SZXNvbHZlSnNvbiIsInhmb3JtIiwicmVxdWVzdFBhcmFtcyIsInJlc3VsdCIsImNvbnNvbGUiLCJvayIsIl9zZXNzaW9uUmVzcG9uc2UiLCJzZXNzaW9uIiwiaGFzU2Vzc2lvbiIsImV4cGlyZXNfYXQiLCJleHBpcmVzX2luIiwidXNlciIsIl9zZXNzaW9uUmVzcG9uc2VQYXNzd29yZCIsInJlc3BvbnNlIiwiX3VzZXJSZXNwb25zZSIsIl9zc29SZXNwb25zZSIsIl9nZW5lcmF0ZUxpbmtSZXNwb25zZSIsImFjdGlvbl9saW5rIiwiZW1haWxfb3RwIiwiaGFzaGVkX3Rva2VuIiwicmVkaXJlY3RfdG8iLCJ2ZXJpZmljYXRpb25fdHlwZSIsInJlc3QiLCJwcm9wZXJ0aWVzIiwiX25vUmVzb2x2ZUpzb25SZXNwb25zZSIsImFjY2Vzc190b2tlbiIsInJlZnJlc2hfdG9rZW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/helpers.js ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Deferred: () => (/* binding */ Deferred),\n/* harmony export */ decodeJWT: () => (/* binding */ decodeJWT),\n/* harmony export */ deepClone: () => (/* binding */ deepClone),\n/* harmony export */ expiresAt: () => (/* binding */ expiresAt),\n/* harmony export */ generateCallbackId: () => (/* binding */ generateCallbackId),\n/* harmony export */ generatePKCEChallenge: () => (/* binding */ generatePKCEChallenge),\n/* harmony export */ generatePKCEVerifier: () => (/* binding */ generatePKCEVerifier),\n/* harmony export */ getAlgorithm: () => (/* binding */ getAlgorithm),\n/* harmony export */ getCodeChallengeAndMethod: () => (/* binding */ getCodeChallengeAndMethod),\n/* harmony export */ getItemAsync: () => (/* binding */ getItemAsync),\n/* harmony export */ insecureUserWarningProxy: () => (/* binding */ insecureUserWarningProxy),\n/* harmony export */ isBrowser: () => (/* binding */ isBrowser),\n/* harmony export */ looksLikeFetchResponse: () => (/* binding */ looksLikeFetchResponse),\n/* harmony export */ parseParametersFromURL: () => (/* binding */ parseParametersFromURL),\n/* harmony export */ parseResponseAPIVersion: () => (/* binding */ parseResponseAPIVersion),\n/* harmony export */ removeItemAsync: () => (/* binding */ removeItemAsync),\n/* harmony export */ resolveFetch: () => (/* binding */ resolveFetch),\n/* harmony export */ retryable: () => (/* binding */ retryable),\n/* harmony export */ setItemAsync: () => (/* binding */ setItemAsync),\n/* harmony export */ sleep: () => (/* binding */ sleep),\n/* harmony export */ supportsLocalStorage: () => (/* binding */ supportsLocalStorage),\n/* harmony export */ userNotAvailableProxy: () => (/* binding */ userNotAvailableProxy),\n/* harmony export */ validateExp: () => (/* binding */ validateExp),\n/* harmony export */ validateUUID: () => (/* binding */ validateUUID)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./errors */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _base64url__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base64url */ \"(ssr)/./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 = ()=> false && 0;\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-${Math.random()}${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 (...args)=>customFetch(...args);\n }\n return (...args)=>fetch(...args);\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, isPasswordRecovery = false) {\n const codeVerifier = generatePKCEVerifier();\n let storedCodeVerifier = codeVerifier;\n if (isPasswordRecovery) {\n storedCodeVerifier += \"/PASSWORD_RECOVERY\";\n }\n await setItemAsync(storage, `${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(`${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 \"${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 \"${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 \"${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2hlbHBlcnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXVFO0FBQ3hCO0FBQzBCO0FBQ2xFLFNBQVNLLFVBQVVDLFNBQVM7SUFDL0IsTUFBTUMsVUFBVUMsS0FBS0MsS0FBSyxDQUFDQyxLQUFLQyxHQUFHLEtBQUs7SUFDeEMsT0FBT0osVUFBVUQ7QUFDckI7QUFDQTs7Ozs7Ozs7Ozs7O0NBWUMsR0FDTSxTQUFTTTtJQUNaLE9BQU9DLE9BQU87QUFDbEI7QUFDTyxNQUFNQyxZQUFZLElBQU0sTUFBa0IsSUFBZSxDQUFvQixDQUFZO0FBQ2hHLE1BQU1FLHlCQUF5QjtJQUMzQkMsUUFBUTtJQUNSQyxVQUFVO0FBQ2Q7QUFDQTs7Q0FFQyxHQUNNLE1BQU1DLHVCQUF1QjtJQUNoQyxJQUFJLENBQUNMLGFBQWE7UUFDZCxPQUFPO0lBQ1g7SUFDQSxJQUFJO1FBQ0EsSUFBSSxPQUFPTSxXQUFXQyxZQUFZLEtBQUssVUFBVTtZQUM3QyxPQUFPO1FBQ1g7SUFDSixFQUNBLE9BQU9DLEdBQUc7UUFDTiw4Q0FBOEM7UUFDOUMsT0FBTztJQUNYO0lBQ0EsSUFBSU4sdUJBQXVCQyxNQUFNLEVBQUU7UUFDL0IsT0FBT0QsdUJBQXVCRSxRQUFRO0lBQzFDO0lBQ0EsTUFBTUssWUFBWSxDQUFDLEtBQUssRUFBRWYsS0FBS2dCLE1BQU0sR0FBRyxFQUFFaEIsS0FBS2dCLE1BQU0sR0FBRyxDQUFDO0lBQ3pELElBQUk7UUFDQUosV0FBV0MsWUFBWSxDQUFDSSxPQUFPLENBQUNGLFdBQVdBO1FBQzNDSCxXQUFXQyxZQUFZLENBQUNLLFVBQVUsQ0FBQ0g7UUFDbkNQLHVCQUF1QkMsTUFBTSxHQUFHO1FBQ2hDRCx1QkFBdUJFLFFBQVEsR0FBRztJQUN0QyxFQUNBLE9BQU9JLEdBQUc7UUFDTixtQ0FBbUM7UUFDbkMsK0tBQStLO1FBQy9LTix1QkFB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O2dCQUMxQixNQUFNQyxRQUFRRCxLQUFLbEUsUUFBUTtnQkFDM0IsSUFBSW1FLFVBQVUsZ0NBQ1ZBLFVBQVUsZ0NBQ1ZBLFVBQVUsaUNBQ1ZBLFVBQVUsc0NBQXNDO29CQUNoRCx1RUFBdUU7b0JBQ3ZFLE9BQU9TLFFBQVEzQixHQUFHLENBQUNnQixRQUFRQyxNQUFNUztnQkFDckM7WUFDSjtZQUNBLHdDQUF3QztZQUN4QyxJQUFJLENBQUNELG1CQUFtQjdILEtBQUssSUFBSSxPQUFPcUgsU0FBUyxVQUFVO2dCQUN2RGxDLFFBQVFDLElBQUksQ0FBQztnQkFDYnlDLG1CQUFtQjdILEtBQUssR0FBRztZQUMvQjtZQUNBLE9BQU8rSCxRQUFRM0IsR0FBRyxDQUFDZ0IsUUFBUUMsTUFBTVM7UUFDckM7SUFDSjtBQUNKO0FBQ0E7OztDQUdDLEdBQ00sU0FBU0UsVUFBVUMsR0FBRztJQUN6QixPQUFPcEgsS0FBS0ksS0FBSyxDQUFDSixLQUFLQyxTQUFTLENBQUNtSDtBQUNyQyxFQUNBLG1DQUFtQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvaGVscGVycy5qcz81YTY4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQSV9WRVJTSU9OX0hFQURFUl9OQU1FLCBCQVNFNjRVUkxfUkVHRVggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBdXRoSW52YWxpZEp3dEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgYmFzZTY0VXJsVG9VaW50OEFycmF5LCBzdHJpbmdGcm9tQmFzZTY0VVJMIH0gZnJvbSAnLi9iYXNlNjR1cmwnO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGlyZXNBdChleHBpcmVzSW4pIHtcbiAgICBjb25zdCB0aW1lTm93ID0gTWF0aC5yb3VuZChEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgcmV0dXJuIHRpbWVOb3cgKyBleHBpcmVzSW47XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBpbnRlcm5hbCBjYWxsYmFjayBzdWJzY3JpcHRpb25zLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBKYXZhU2NyaXB0IFN5bWJvbHMgdG8gY3JlYXRlIGd1YXJhbnRlZWQtdW5pcXVlIGlkZW50aWZpZXJzXG4gKiBmb3IgYXV0aCBzdGF0ZSBjaGFuZ2UgY2FsbGJhY2tzLiBTeW1ib2xzIGFyZSBpZGVhbCBmb3IgdGhpcyB1c2UgY2FzZSBiZWNhdXNlOlxuICogLSBUaGV5IGFyZSBndWFyYW50ZWVkIHVuaXF1ZSBieSB0aGUgSmF2YVNjcmlwdCBydW50aW1lXG4gKiAtIFRoZXkgd29yayBpbiBhbGwgZW52aXJvbm1lbnRzIChicm93c2VyLCBTU1IsIE5vZGUuanMpXG4gKiAtIFRoZXkgYXZvaWQgaXNzdWVzIHdpdGggTmV4dC5qcyAxNiBkZXRlcm1pbmlzdGljIHJlbmRlcmluZyByZXF1aXJlbWVudHNcbiAqIC0gVGhleSBhcmUgcGVyZmVjdCBmb3IgaW50ZXJuYWwsIG5vbi1zZXJpYWxpemFibGUgaWRlbnRpZmllcnNcbiAqXG4gKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3IgaW50ZXJuYWwgc3Vic2NyaXB0aW9uIG1hbmFnZW1lbnQsXG4gKiBub3QgZm9yIHNlY3VyaXR5LWNyaXRpY2FsIG9wZXJhdGlvbnMgbGlrZSBzZXNzaW9uIHRva2Vucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ2FsbGJhY2tJZCgpIHtcbiAgICByZXR1cm4gU3ltYm9sKCdhdXRoLWNhbGxiYWNrJyk7XG59XG5leHBvcnQgY29uc3QgaXNCcm93c2VyID0gKCkgPT4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbmNvbnN0IGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMgPSB7XG4gICAgdGVzdGVkOiBmYWxzZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG59O1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBsb2NhbFN0b3JhZ2UgaXMgc3VwcG9ydGVkIG9uIHRoaXMgYnJvd3Nlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHN1cHBvcnRzTG9jYWxTdG9yYWdlID0gKCkgPT4ge1xuICAgIGlmICghaXNCcm93c2VyKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMubG9jYWxTdG9yYWdlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIERPTSBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcgYGxvY2FsU3RvcmFnZWBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobG9jYWxTdG9yYWdlV3JpdGVUZXN0cy50ZXN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMud3JpdGFibGU7XG4gICAgfVxuICAgIGNvbnN0IHJhbmRvbUtleSA9IGBsc3d0LSR7TWF0aC5yYW5kb20oKX0ke01hdGgucmFuZG9tKCl9YDtcbiAgICB0cnkge1xuICAgICAgICBnbG9iYWxUaGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHJhbmRvbUtleSwgcmFuZG9tS2V5KTtcbiAgICAgICAgZ2xvYmFsVGhpcy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShyYW5kb21LZXkpO1xuICAgICAgICBsb2NhbFN0b3JhZ2VXcml0ZVRlc3RzLnRlc3RlZCA9IHRydWU7XG4gICAgICAgIGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMud3JpdGFibGUgPSB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAvLyBsb2NhbFN0b3JhZ2UgY2FuJ3QgYmUgd3JpdHRlbiB0b1xuICAgICAgICAvLyBodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvZm9yLXRlc3RlcnMvYnVnLXJlcG9ydGluZy1ndWlkZWxpbmVzL3VuY2F1Z2h0LXNlY3VyaXR5ZXJyb3ItZmFpbGVkLXRvLXJlYWQtdGhlLWxvY2Fsc3RvcmFnZS1wcm9wZXJ0eS1mcm9tLXdpbmRvdy1hY2Nlc3MtaXMtZGVuaWVkLWZvci10aGlzLWRvY3VtZW50XG4gICAgICAgIGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMudGVzdGVkID0gdHJ1ZTtcbiAgICAgICAgbG9jYWxTdG9yYWdlV3JpdGVUZXN0cy53cml0YWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlV3JpdGVUZXN0cy53cml0YWJsZTtcbn07XG4vKipcbiAqIEV4dHJhY3RzIHBhcmFtZXRlcnMgZW5jb2RlZCBpbiB0aGUgVVJMIGJvdGggaW4gdGhlIHF1ZXJ5IGFuZCBmcmFnbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGFyYW1ldGVyc0Zyb21VUkwoaHJlZikge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoaHJlZik7XG4gICAgaWYgKHVybC5oYXNoICYmIHVybC5oYXNoWzBdID09PSAnIycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhhc2hTZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5oYXNoLnN1YnN0cmluZygxKSk7XG4gICAgICAgICAgICBoYXNoU2VhcmNoUGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGhhc2ggaXMgbm90IGEgcXVlcnkgc3RyaW5nXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gc2VhcmNoIHBhcmFtZXRlcnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgaGFzaCBwYXJhbWV0ZXJzXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCByZXNvbHZlRmV0Y2ggPSAoY3VzdG9tRmV0Y2gpID0+IHtcbiAgICBpZiAoY3VzdG9tRmV0Y2gpIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiBjdXN0b21GZXRjaCguLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiBmZXRjaCguLi5hcmdzKTtcbn07XG5leHBvcnQgY29uc3QgbG9va3NMaWtlRmV0Y2hSZXNwb25zZSA9IChtYXliZVJlc3BvbnNlKSA9PiB7XG4gICAgcmV0dXJuICh0eXBlb2YgbWF5YmVSZXNwb25zZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgbWF5YmVSZXNwb25zZSAhPT0gbnVsbCAmJlxuICAgICAgICAnc3RhdHVzJyBpbiBtYXliZVJlc3BvbnNlICYmXG4gICAgICAgICdvaycgaW4gbWF5YmVSZXNwb25zZSAmJlxuICAgICAgICAnanNvbicgaW4gbWF5YmVSZXNwb25zZSAmJlxuICAgICAgICB0eXBlb2YgbWF5YmVSZXNwb25zZS5qc29uID09PSAnZnVuY3Rpb24nKTtcbn07XG4vLyBTdG9yYWdlIGhlbHBlcnNcbmV4cG9ydCBjb25zdCBzZXRJdGVtQXN5bmMgPSBhc3luYyAoc3RvcmFnZSwga2V5LCBkYXRhKSA9PiB7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRJdGVtQXN5bmMgPSBhc3luYyAoc3RvcmFnZSwga2V5KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBzdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCByZW1vdmVJdGVtQXN5bmMgPSBhc3luYyAoc3RvcmFnZSwga2V5KSA9PiB7XG4gICAgYXdhaXQgc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG59O1xuLyoqXG4gKiBBIGRlZmVycmVkIHJlcHJlc2VudHMgc29tZSBhc3luY2hyb25vdXMgd29yayB0aGF0IGlzIG5vdCB5ZXQgZmluaXNoZWQsIHdoaWNoXG4gKiBtYXkgb3IgbWF5IG5vdCBjdWxtaW5hdGUgaW4gYSB2YWx1ZS5cbiAqIFRha2VuIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9taWtlLW5vcnRoL3R5cGVzL2Jsb2IvbWFzdGVyL3NyYy9hc3luYy50c1xuICovXG5leHBvcnQgY2xhc3MgRGVmZXJyZWQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4dHJhLXNlbWlcbiAgICAgICAgO1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgRGVmZXJyZWQucHJvbWlzZUNvbnN0cnVjdG9yKChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHRyYS1zZW1pXG4gICAgICAgICAgICA7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXM7XG4gICAgICAgICAgICB0aGlzLnJlamVjdCA9IHJlajtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuRGVmZXJyZWQucHJvbWlzZUNvbnN0cnVjdG9yID0gUHJvbWlzZTtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVKV1QodG9rZW4pIHtcbiAgICBjb25zdCBwYXJ0cyA9IHRva2VuLnNwbGl0KCcuJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEludmFsaWRKd3RFcnJvcignSW52YWxpZCBKV1Qgc3RydWN0dXJlJyk7XG4gICAgfVxuICAgIC8vIFJlZ2V4IGNoZWNrcyBmb3IgYmFzZTY0dXJsIGZvcm1hdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFCQVNFNjRVUkxfUkVHRVgudGVzdChwYXJ0c1tpXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBdXRoSW52YWxpZEp3dEVycm9yKCdKV1Qgbm90IGluIGJhc2U2NHVybCBmb3JtYXQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAvLyB1c2luZyBiYXNlNjR1cmwgbGliXG4gICAgICAgIGhlYWRlcjogSlNPTi5wYXJzZShzdHJpbmdGcm9tQmFzZTY0VVJMKHBhcnRzWzBdKSksXG4gICAgICAgIHBheWxvYWQ6IEpTT04ucGFyc2Uoc3RyaW5nRnJvbUJhc2U2NFVSTChwYXJ0c1sxXSkpLFxuICAgICAgICBzaWduYXR1cmU6IGJhc2U2NFVybFRvVWludDhBcnJheShwYXJ0c1syXSksXG4gICAgICAgIHJhdzoge1xuICAgICAgICAgICAgaGVhZGVyOiBwYXJ0c1swXSxcbiAgICAgICAgICAgIHBheWxvYWQ6IHBhcnRzWzFdLFxuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIGRhdGE7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gbnVsbCBhZnRlciBzb21lIHRpbWUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcCh0aW1lKSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChhY2NlcHQpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBhY2NlcHQobnVsbCksIHRpbWUpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgcHJvdmlkZWQgYXN5bmMgZnVuY3Rpb24gaW50byBhIHJldHJ5YWJsZSBmdW5jdGlvbi4gRWFjaCByZXN1bHRcbiAqIG9yIHRocm93biBlcnJvciBpcyBzZW50IHRvIHRoZSBpc1JldHJ5YWJsZSBmdW5jdGlvbiB3aGljaCBzaG91bGQgcmV0dXJuIHRydWVcbiAqIGlmIHRoZSBmdW5jdGlvbiBzaG91bGQgcnVuIGFnYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV0cnlhYmxlKGZuLCBpc1JldHJ5YWJsZSkge1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoYWNjZXB0LCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHRyYS1zZW1pXG4gICAgICAgIDtcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgSW5maW5pdHk7IGF0dGVtcHQrKykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGF0dGVtcHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUmV0cnlhYmxlKGF0dGVtcHQsIG51bGwsIHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNSZXRyeWFibGUoYXR0ZW1wdCwgZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGRlYzJoZXgoZGVjKSB7XG4gICAgcmV0dXJuICgnMCcgKyBkZWMudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTIpO1xufVxuLy8gRnVuY3Rpb25zIGJlbG93IHRha2VuIGZyb206IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYzMzA5NDA5L2NyZWF0aW5nLWEtY29kZS12ZXJpZmllci1hbmQtY2hhbGxlbmdlLWZvci1wa2NlLWF1dGgtb24tc3BvdGlmeS1hcGktaW4tcmVhY3Rqc1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUEtDRVZlcmlmaWVyKCkge1xuICAgIGNvbnN0IHZlcmlmaWVyTGVuZ3RoID0gNTY7XG4gICAgY29uc3QgYXJyYXkgPSBuZXcgVWludDMyQXJyYXkodmVyaWZpZXJMZW5ndGgpO1xuICAgIGlmICh0eXBlb2YgY3J5cHRvID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCBjaGFyU2V0ID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LS5ffic7XG4gICAgICAgIGNvbnN0IGNoYXJTZXRMZW4gPSBjaGFyU2V0Lmxlbmd0aDtcbiAgICAgICAgbGV0IHZlcmlmaWVyID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVyaWZpZXJMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmVyaWZpZXIgKz0gY2hhclNldC5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhclNldExlbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2ZXJpZmllcjtcbiAgICB9XG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oYXJyYXksIGRlYzJoZXgpLmpvaW4oJycpO1xufVxuYXN5bmMgZnVuY3Rpb24gc2hhMjU2KHJhbmRvbVN0cmluZykge1xuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICBjb25zdCBlbmNvZGVkRGF0YSA9IGVuY29kZXIuZW5jb2RlKHJhbmRvbVN0cmluZyk7XG4gICAgY29uc3QgaGFzaCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgZW5jb2RlZERhdGEpO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoaGFzaCk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMpXG4gICAgICAgIC5tYXAoKGMpID0+IFN0cmluZy5mcm9tQ2hhckNvZGUoYykpXG4gICAgICAgIC5qb2luKCcnKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBLQ0VDaGFsbGVuZ2UodmVyaWZpZXIpIHtcbiAgICBjb25zdCBoYXNDcnlwdG9TdXBwb3J0ID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIGNyeXB0by5zdWJ0bGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgaWYgKCFoYXNDcnlwdG9TdXBwb3J0KSB7XG4gICAgICAgIGNvbnNvbGUud2FybignV2ViQ3J5cHRvIEFQSSBpcyBub3Qgc3VwcG9ydGVkLiBDb2RlIGNoYWxsZW5nZSBtZXRob2Qgd2lsbCBkZWZhdWx0IHRvIHVzZSBwbGFpbiBpbnN0ZWFkIG9mIHNoYTI1Ni4nKTtcbiAgICAgICAgcmV0dXJuIHZlcmlmaWVyO1xuICAgIH1cbiAgICBjb25zdCBoYXNoZWQgPSBhd2FpdCBzaGEyNTYodmVyaWZpZXIpO1xuICAgIHJldHVybiBidG9hKGhhc2hlZCkucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvZGVDaGFsbGVuZ2VBbmRNZXRob2Qoc3RvcmFnZSwgc3RvcmFnZUtleSwgaXNQYXNzd29yZFJlY292ZXJ5ID0gZmFsc2UpIHtcbiAgICBjb25zdCBjb2RlVmVyaWZpZXIgPSBnZW5lcmF0ZVBLQ0VWZXJpZmllcigpO1xuICAgIGxldCBzdG9yZWRDb2RlVmVyaWZpZXIgPSBjb2RlVmVyaWZpZXI7XG4gICAgaWYgKGlzUGFzc3dvcmRSZWNvdmVyeSkge1xuICAgICAgICBzdG9yZWRDb2RlVmVyaWZpZXIgKz0gJy9QQVNTV09SRF9SRUNPVkVSWSc7XG4gICAgfVxuICAgIGF3YWl0IHNldEl0ZW1Bc3luYyhzdG9yYWdlLCBgJHtzdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCwgc3RvcmVkQ29kZVZlcmlmaWVyKTtcbiAgICBjb25zdCBjb2RlQ2hhbGxlbmdlID0gYXdhaXQgZ2VuZXJhdGVQS0NFQ2hhbGxlbmdlKGNvZGVWZXJpZmllcik7XG4gICAgY29uc3QgY29kZUNoYWxsZW5nZU1ldGhvZCA9IGNvZGVWZXJpZmllciA9PT0gY29kZUNoYWxsZW5nZSA/ICdwbGFpbicgOiAnczI1Nic7XG4gICAgcmV0dXJuIFtjb2RlQ2hhbGxlbmdlLCBjb2RlQ2hhbGxlbmdlTWV0aG9kXTtcbn1cbi8qKiBQYXJzZXMgdGhlIEFQSSB2ZXJzaW9uIHdoaWNoIGlzIDJZWVktTU0tREQuICovXG5jb25zdCBBUElfVkVSU0lPTl9SRUdFWCA9IC9eMlswLTldezN9LSgwWzEtOV18MVswLTJdKS0oMFsxLTldfDFbMC05XXwyWzAtOV18M1swLTFdKSQvaTtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlc3BvbnNlQVBJVmVyc2lvbihyZXNwb25zZSkge1xuICAgIGNvbnN0IGFwaVZlcnNpb24gPSByZXNwb25zZS5oZWFkZXJzLmdldChBUElfVkVSU0lPTl9IRUFERVJfTkFNRSk7XG4gICAgaWYgKCFhcGlWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoIWFwaVZlcnNpb24ubWF0Y2goQVBJX1ZFUlNJT05fUkVHRVgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoYCR7YXBpVmVyc2lvbn1UMDA6MDA6MDAuMFpgKTtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUV4cChleHApIHtcbiAgICBpZiAoIWV4cCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZXhwIGNsYWltJyk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVOb3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBpZiAoZXhwIDw9IHRpbWVOb3cpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdKV1QgaGFzIGV4cGlyZWQnKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxnb3JpdGhtKGFsZykge1xuICAgIHN3aXRjaCAoYWxnKSB7XG4gICAgICAgIGNhc2UgJ1JTMjU2JzpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQVNTQS1QS0NTMS12MV81JyxcbiAgICAgICAgICAgICAgICBoYXNoOiB7IG5hbWU6ICdTSEEtMjU2JyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnRVMyNTYnOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRUNEU0EnLFxuICAgICAgICAgICAgICAgIG5hbWVkQ3VydmU6ICdQLTI1NicsXG4gICAgICAgICAgICAgICAgaGFzaDogeyBuYW1lOiAnU0hBLTI1NicgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYWxnIGNsYWltJyk7XG4gICAgfVxufVxuY29uc3QgVVVJRF9SRUdFWCA9IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC87XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVVVUlEKHN0cikge1xuICAgIGlmICghVVVJRF9SRUdFWC50ZXN0KHN0cikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc3VwYWJhc2UvYXV0aC1qczogRXhwZWN0ZWQgcGFyYW1ldGVyIHRvIGJlIFVVSUQgYnV0IGlzIG5vdCcpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VyTm90QXZhaWxhYmxlUHJveHkoKSB7XG4gICAgY29uc3QgcHJveHlUYXJnZXQgPSB7fTtcbiAgICByZXR1cm4gbmV3IFByb3h5KHByb3h5VGFyZ2V0LCB7XG4gICAgICAgIGdldDogKHRhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdfX2lzVXNlck5vdEF2YWlsYWJsZVByb3h5Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUHJldmVudGF0aXZlIGNoZWNrIGZvciBjb21tb24gcHJvYmxlbWF0aWMgc3ltYm9scyBkdXJpbmcgY2xvbmluZy9pbnNwZWN0aW9uXG4gICAgICAgICAgICAvLyBUaGVzZSBzeW1ib2xzIG1pZ2h0IGJlIGFjY2Vzc2VkIGJ5IHN0cnVjdHVyZWRDbG9uZSBvciBvdGhlciBpbnRlcm5hbCBtZWNoYW5pc21zLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNQcm9wID0gcHJvcC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmIChzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9QcmltaXRpdmUpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9TdHJpbmdUYWcpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbCh1dGlsLmluc3BlY3QuY3VzdG9tKScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm9kZS5qcyB1dGlsLmluc3BlY3RcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBjbGllbnQgd2FzIGNyZWF0ZWQgd2l0aCB1c2VyU3RvcmFnZSBvcHRpb24gYW5kIHRoZXJlIHdhcyBubyB1c2VyIHN0b3JlZCBpbiB0aGUgdXNlciBzdG9yYWdlLiBBY2Nlc3NpbmcgdGhlIFwiJHtwcm9wfVwiIHByb3BlcnR5IG9mIHRoZSBzZXNzaW9uIG9iamVjdCBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIGdldFVzZXIoKSBpbnN0ZWFkLmApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBjbGllbnQgd2FzIGNyZWF0ZWQgd2l0aCB1c2VyU3RvcmFnZSBvcHRpb24gYW5kIHRoZXJlIHdhcyBubyB1c2VyIHN0b3JlZCBpbiB0aGUgdXNlciBzdG9yYWdlLiBTZXR0aW5nIHRoZSBcIiR7cHJvcH1cIiBwcm9wZXJ0eSBvZiB0aGUgc2Vzc2lvbiBvYmplY3QgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBnZXRVc2VyKCkgdG8gZmV0Y2ggYSB1c2VyIG9iamVjdCB5b3UgY2FuIG1hbmlwdWxhdGUuYCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZVByb3BlcnR5OiAoX3RhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogY2xpZW50IHdhcyBjcmVhdGVkIHdpdGggdXNlclN0b3JhZ2Ugb3B0aW9uIGFuZCB0aGVyZSB3YXMgbm8gdXNlciBzdG9yZWQgaW4gdGhlIHVzZXIgc3RvcmFnZS4gRGVsZXRpbmcgdGhlIFwiJHtwcm9wfVwiIHByb3BlcnR5IG9mIHRoZSBzZXNzaW9uIG9iamVjdCBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIGdldFVzZXIoKSB0byBmZXRjaCBhIHVzZXIgb2JqZWN0IHlvdSBjYW4gbWFuaXB1bGF0ZS5gKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHByb3h5IGFyb3VuZCBhIHVzZXIgb2JqZWN0IHRoYXQgd2FybnMgd2hlbiBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZCBvbiB0aGUgc2VydmVyLlxuICogVGhpcyBpcyB1c2VkIHRvIGFsZXJ0IGRldmVsb3BlcnMgdGhhdCB1c2luZyB1c2VyIGRhdGEgZnJvbSBnZXRTZXNzaW9uKCkgb24gdGhlIHNlcnZlciBpcyBpbnNlY3VyZS5cbiAqXG4gKiBAcGFyYW0gdXNlciBUaGUgYWN0dWFsIHVzZXIgb2JqZWN0IHRvIHdyYXBcbiAqIEBwYXJhbSBzdXBwcmVzc1dhcm5pbmdSZWYgQW4gb2JqZWN0IHdpdGggYSAndmFsdWUnIHByb3BlcnR5IHRoYXQgY29udHJvbHMgd2FybmluZyBzdXBwcmVzc2lvblxuICogQHJldHVybnMgQSBwcm94aWVkIHVzZXIgb2JqZWN0IHRoYXQgd2FybnMgb24gcHJvcGVydHkgYWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlY3VyZVVzZXJXYXJuaW5nUHJveHkodXNlciwgc3VwcHJlc3NXYXJuaW5nUmVmKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh1c2VyLCB7XG4gICAgICAgIGdldDogKHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgICAgIC8vIEFsbG93IGludGVybmFsIGNoZWNrcyB3aXRob3V0IHdhcm5pbmdcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnX19pc0luc2VjdXJlVXNlcldhcm5pbmdQcm94eScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFByZXZlbnRhdGl2ZSBjaGVjayBmb3IgY29tbW9uIHByb2JsZW1hdGljIHN5bWJvbHMgZHVyaW5nIGNsb25pbmcvaW5zcGVjdGlvblxuICAgICAgICAgICAgLy8gVGhlc2Ugc3ltYm9scyBtaWdodCBiZSBhY2Nlc3NlZCBieSBzdHJ1Y3R1cmVkQ2xvbmUgb3Igb3RoZXIgaW50ZXJuYWwgbWVjaGFuaXNtc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNQcm9wID0gcHJvcC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmIChzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9QcmltaXRpdmUpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9TdHJpbmdUYWcpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbCh1dGlsLmluc3BlY3QuY3VzdG9tKScgfHxcbiAgICAgICAgICAgICAgICAgICAgc1Byb3AgPT09ICdTeW1ib2wobm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20pJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGFjdHVhbCB2YWx1ZSBmb3IgdGhlc2Ugc3ltYm9scyB0byBhbGxvdyBwcm9wZXIgaW5zcGVjdGlvblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW1pdCB3YXJuaW5nIG9uIGZpcnN0IHByb3BlcnR5IGFjY2Vzc1xuICAgICAgICAgICAgaWYgKCFzdXBwcmVzc1dhcm5pbmdSZWYudmFsdWUgJiYgdHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdVc2luZyB0aGUgdXNlciBvYmplY3QgYXMgcmV0dXJuZWQgZnJvbSBzdXBhYmFzZS5hdXRoLmdldFNlc3Npb24oKSBvciBmcm9tIHNvbWUgc3VwYWJhc2UuYXV0aC5vbkF1dGhTdGF0ZUNoYW5nZSgpIGV2ZW50cyBjb3VsZCBiZSBpbnNlY3VyZSEgVGhpcyB2YWx1ZSBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBzdG9yYWdlIG1lZGl1bSAodXN1YWxseSBjb29raWVzIG9uIHRoZSBzZXJ2ZXIpIGFuZCBtYXkgbm90IGJlIGF1dGhlbnRpYy4gVXNlIHN1cGFiYXNlLmF1dGguZ2V0VXNlcigpIGluc3RlYWQgd2hpY2ggYXV0aGVudGljYXRlcyB0aGUgZGF0YSBieSBjb250YWN0aW5nIHRoZSBTdXBhYmFzZSBBdXRoIHNlcnZlci4nKTtcbiAgICAgICAgICAgICAgICBzdXBwcmVzc1dhcm5pbmdSZWYudmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuLyoqXG4gKiBEZWVwIGNsb25lcyBhIEpTT04tc2VyaWFsaXphYmxlIG9iamVjdCB1c2luZyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpLlxuICogTm90ZTogT25seSB3b3JrcyBmb3IgSlNPTi1zYWZlIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmUob2JqKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXJzLmpzLm1hcCJdLCJuYW1lcyI6WyJBUElfVkVSU0lPTl9IRUFERVJfTkFNRSIsIkJBU0U2NFVSTF9SRUdFWCIsIkF1dGhJbnZhbGlkSnd0RXJyb3IiLCJiYXNlNjRVcmxUb1VpbnQ4QXJyYXkiLCJzdHJpbmdGcm9tQmFzZTY0VVJMIiwiZXhwaXJlc0F0IiwiZXhwaXJlc0luIiwidGltZU5vdyIsIk1hdGgiLCJyb3VuZCIsIkRhdGUiLCJub3ciLCJnZW5lcmF0ZUNhbGxiYWNrSWQiLCJTeW1ib2wiLCJpc0Jyb3dzZXIiLCJkb2N1bWVudCIsImxvY2FsU3RvcmFnZVdyaXRlVGVzdHMiLCJ0ZXN0ZWQiLCJ3cml0YWJsZSIsInN1cHBvcnRzTG9jYWxTdG9yYWdlIiwiZ2xvYmFsVGhpcyIsImxvY2FsU3RvcmFnZSIsImUiLCJyYW5kb21LZXkiLCJyYW5kb20iLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsInBhcnNlUGFyYW1ldGVyc0Zyb21VUkwiLCJocmVmIiwicmVzdWx0IiwidXJsIiwiVVJMIiwiaGFzaCIsImhhc2hTZWFyY2hQYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJzdWJzdHJpbmciLCJmb3JFYWNoIiwidmFsdWUiLCJrZXkiLCJzZWFyY2hQYXJhbXMiLCJyZXNvbHZlRmV0Y2giLCJjdXN0b21GZXRjaCIsImFyZ3MiLCJmZXRjaCIsImxvb2tzTGlrZUZldGNoUmVzcG9uc2UiLCJtYXliZVJlc3BvbnNlIiwianNvbiIsInNldEl0ZW1Bc3luYyIsInN0b3JhZ2UiLCJkYXRhIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldEl0ZW1Bc3luYyIsImdldEl0ZW0iLCJwYXJzZSIsIl9hIiwicmVtb3ZlSXRlbUFzeW5jIiwiRGVmZXJyZWQiLCJjb25zdHJ1Y3RvciIsInByb21pc2UiLCJwcm9taXNlQ29uc3RydWN0b3IiLCJyZXMiLCJyZWoiLCJyZXNvbHZlIiwicmVqZWN0IiwiUHJvbWlzZSIsImRlY29kZUpXVCIsInRva2VuIiwicGFydHMiLCJzcGxpdCIsImxlbmd0aCIsImkiLCJ0ZXN0IiwiaGVhZGVyIiwicGF5bG9hZCIsInNpZ25hdHVyZSIsInJhdyIsInNsZWVwIiwidGltZSIsImFjY2VwdCIsInNldFRpbWVvdXQiLCJyZXRyeWFibGUiLCJmbiIsImlzUmV0cnlhYmxlIiwiYXR0ZW1wdCIsIkluZmluaXR5IiwiZGVjMmhleCIsImRlYyIsInRvU3RyaW5nIiwic3Vic3RyIiwiZ2VuZXJhdGVQS0NFVmVyaWZpZXIiLCJ2ZXJpZmllckxlbmd0aCIsImFycmF5IiwiVWludDMyQXJyYXkiLCJjcnlwdG8iLCJjaGFyU2V0IiwiY2hhclNldExlbiIsInZlcmlmaWVyIiwiY2hhckF0IiwiZmxvb3IiLCJnZXRSYW5kb21WYWx1ZXMiLCJBcnJheSIsImZyb20iLCJqb2luIiwic2hhMjU2IiwicmFuZG9tU3RyaW5nIiwiZW5jb2RlciIsIlRleHRFbmNvZGVyIiwiZW5jb2RlZERhdGEiLCJlbmNvZGUiLCJzdWJ0bGUiLCJkaWdlc3QiLCJieXRlcyIsIlVpbnQ4QXJyYXkiLCJtYXAiLCJjIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiZ2VuZXJhdGVQS0NFQ2hhbGxlbmdlIiwiaGFzQ3J5cHRvU3VwcG9ydCIsImNvbnNvbGUiLCJ3YXJuIiwiaGFzaGVkIiwiYnRvYSIsInJlcGxhY2UiLCJnZXRDb2RlQ2hhbGxlbmdlQW5kTWV0aG9kIiwic3RvcmFnZUtleSIsImlzUGFzc3dvcmRSZWNvdmVyeSIsImNvZGVWZXJpZmllciIsInN0b3JlZENvZGVWZXJpZmllciIsImNvZGVDaGFsbGVuZ2UiLCJjb2RlQ2hhbGxlbmdlTWV0aG9kIiwiQVBJX1ZFUlNJT05fUkVHRVgiLCJwYXJzZVJlc3BvbnNlQVBJVmVyc2lvbiIsInJlc3BvbnNlIiwiYXBpVmVyc2lvbiIsImhlYWRlcnMiLCJnZXQiLCJtYXRjaCIsImRhdGUiLCJ2YWxpZGF0ZUV4cCIsImV4cCIsIkVycm9yIiwiZ2V0QWxnb3JpdGhtIiwiYWxnIiwibmFtZSIsIm5hbWVkQ3VydmUiLCJVVUlEX1JFR0VYIiwidmFsaWRhdGVVVUlEIiwic3RyIiwidXNlck5vdEF2YWlsYWJsZVByb3h5IiwicHJveHlUYXJnZXQiLCJQcm94eSIsInRhcmdldCIsInByb3AiLCJzUHJvcCIsInVuZGVmaW5lZCIsInNldCIsIl90YXJnZXQiLCJkZWxldGVQcm9wZXJ0eSIsImluc2VjdXJlVXNlcldhcm5pbmdQcm94eSIsInVzZXIiLCJzdXBwcmVzc1dhcm5pbmdSZWYiLCJyZWNlaXZlciIsIlJlZmxlY3QiLCJkZWVwQ2xvbmUiLCJvYmoiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js":
|
||
/*!*************************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js ***!
|
||
\*************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ memoryLocalStorageAdapter: () => (/* binding */ memoryLocalStorageAdapter)\n/* harmony export */ });\n/**\n * Returns a localStorage-like object that stores the key-value pairs in\n * memory.\n */ function memoryLocalStorageAdapter(store = {}) {\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2xvY2FsLXN0b3JhZ2UuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7Q0FHQyxHQUNNLFNBQVNBLDBCQUEwQkMsUUFBUSxDQUFDLENBQUM7SUFDaEQsT0FBTztRQUNIQyxTQUFTLENBQUNDO1lBQ04sT0FBT0YsS0FBSyxDQUFDRSxJQUFJLElBQUk7UUFDekI7UUFDQUMsU0FBUyxDQUFDRCxLQUFLRTtZQUNYSixLQUFLLENBQUNFLElBQUksR0FBR0U7UUFDakI7UUFDQUMsWUFBWSxDQUFDSDtZQUNULE9BQU9GLEtBQUssQ0FBQ0UsSUFBSTtRQUNyQjtJQUNKO0FBQ0osRUFDQSx5Q0FBeUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2xvY2FsLXN0b3JhZ2UuanM/MjNjMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJldHVybnMgYSBsb2NhbFN0b3JhZ2UtbGlrZSBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIGtleS12YWx1ZSBwYWlycyBpblxuICogbWVtb3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtb3J5TG9jYWxTdG9yYWdlQWRhcHRlcihzdG9yZSA9IHt9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0SXRlbTogKGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlW2tleV0gfHwgbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0SXRlbTogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIHN0b3JlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlSXRlbTogKGtleSkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHN0b3JlW2tleV07XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvY2FsLXN0b3JhZ2UuanMubWFwIl0sIm5hbWVzIjpbIm1lbW9yeUxvY2FsU3RvcmFnZUFkYXB0ZXIiLCJzdG9yZSIsImdldEl0ZW0iLCJrZXkiLCJzZXRJdGVtIiwidmFsdWUiLCJyZW1vdmVJdGVtIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/locks.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LockAcquireTimeoutError: () => (/* binding */ LockAcquireTimeoutError),\n/* harmony export */ NavigatorLockAcquireTimeoutError: () => (/* binding */ NavigatorLockAcquireTimeoutError),\n/* harmony export */ ProcessLockAcquireTimeoutError: () => (/* binding */ ProcessLockAcquireTimeoutError),\n/* harmony export */ internals: () => (/* binding */ internals),\n/* harmony export */ navigatorLock: () => (/* binding */ navigatorLock),\n/* harmony export */ processLock: () => (/* binding */ processLock)\n/* harmony export */ });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"(ssr)/./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 \"${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 \"${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2xvY2tzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBaUQ7QUFDakQ7O0NBRUMsR0FDTSxNQUFNQyxZQUFZO0lBQ3JCOztLQUVDLEdBQ0RDLE9BQU8sQ0FBQyxDQUFFQyxDQUFBQSxjQUNOSCw4REFBb0JBLE1BQ3BCRyxXQUFXQyxZQUFZLElBQ3ZCRCxXQUFXQyxZQUFZLENBQUNDLE9BQU8sQ0FBQyxzQ0FBc0MsTUFBSztBQUNuRixFQUFFO0FBQ0Y7Ozs7Ozs7Ozs7Ozs7OztDQWVDLEdBQ00sTUFBTUMsZ0NBQWdDQztJQUN6Q0MsWUFBWUMsT0FBTyxDQUFFO1FBQ2pCLEtBQUssQ0FBQ0E7UUFDTixJQUFJLENBQUNDLGdCQUFnQixHQUFHO0lBQzVCO0FBQ0o7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNQyx5Q0FBeUNMO0FBQ3REO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTU0sdUNBQXVDTjtBQUNwRDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4QkMsR0FDTSxlQUFlTyxjQUFjQyxJQUFJLEVBQUVDLGNBQWMsRUFBRUMsRUFBRTtJQUN4RCxJQUFJZixVQUFVQyxLQUFLLEVBQUU7UUFDakJlLFFBQVFDLEdBQUcsQ0FBQyxvREFBb0RKLE1BQU1DO0lBQzFFO0lBQ0EsTUFBTUksa0JBQWtCLElBQUloQixXQUFXaUIsZUFBZTtJQUN0RCxJQUFJTCxpQkFBaUIsR0FBRztRQUNwQk0sV0FBVztZQUNQRixnQkFBZ0JHLEtBQUs7WUFDckIsSUFBSXJCLFVBQVVDLEtBQUssRUFBRTtnQkFDakJlLFFBQVFDLEdBQUcsQ0FBQyx3REFBd0RKO1lBQ3hFO1FBQ0osR0FBR0M7SUFDUDtJQUNBLG9GQUFvRjtJQUNwRiwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsNkVBQTZFO0lBQzdFLHdFQUF3RTtJ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QSxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2xvY2tzLmpzPzAzODciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3VwcG9ydHNMb2NhbFN0b3JhZ2UgfSBmcm9tICcuL2hlbHBlcnMnO1xuLyoqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjb25zdCBpbnRlcm5hbHMgPSB7XG4gICAgLyoqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqL1xuICAgIGRlYnVnOiAhIShnbG9iYWxUaGlzICYmXG4gICAgICAgIHN1cHBvcnRzTG9jYWxTdG9yYWdlKCkgJiZcbiAgICAgICAgZ2xvYmFsVGhpcy5sb2NhbFN0b3JhZ2UgJiZcbiAgICAgICAgZ2xvYmFsVGhpcy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3VwYWJhc2UuZ290cnVlLWpzLmxvY2tzLmRlYnVnJykgPT09ICd0cnVlJyksXG59O1xuLyoqXG4gKiBBbiBlcnJvciB0aHJvd24gd2hlbiBhIGxvY2sgY2Fubm90IGJlIGFjcXVpcmVkIGFmdGVyIHNvbWUgYW1vdW50IG9mIHRpbWUuXG4gKlxuICogVXNlIHRoZSB7QGxpbmsgI2lzQWNxdWlyZVRpbWVvdXR9IHByb3BlcnR5IGluc3RlYWQgb2YgY2hlY2tpbmcgd2l0aCBgaW5zdGFuY2VvZmAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIGNsYXNzIEN1c3RvbUxvY2tFcnJvciBleHRlbmRzIExvY2tBY3F1aXJlVGltZW91dEVycm9yIHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoJ0xvY2sgdGltZWQgb3V0JylcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmlzQWNxdWlyZVRpbWVvdXQgPSB0cnVlO1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIGJyb3dzZXIgTmF2aWdhdG9yIExvY2sgQVBJIGZhaWxzIHRvIGFjcXVpcmUgYSBsb2NrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgTmF2aWdhdG9yTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgTmF2aWdhdG9yTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IoJ0xvY2sgdGltZWQgb3V0JylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTmF2aWdhdG9yTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IgZXh0ZW5kcyBMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciB7XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSBwcm9jZXNzLWxldmVsIGxvY2sgaGVscGVyIGNhbm5vdCBhY3F1aXJlIGEgbG9jay5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IFByb2Nlc3NMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBQcm9jZXNzTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IoJ0xvY2sgdGltZWQgb3V0JylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUHJvY2Vzc0xvY2tBY3F1aXJlVGltZW91dEVycm9yIGV4dGVuZHMgTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3Ige1xufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgZ2xvYmFsIGV4Y2x1c2l2ZSBsb2NrIHVzaW5nIHRoZSBOYXZpZ2F0b3IgTG9ja01hbmFnZXIgQVBJLiBJdFxuICogaXMgYXZhaWxhYmxlIG9uIGFsbCBicm93c2VycyByZWxlYXNlZCBhZnRlciAyMDIyLTAzLTE1IHdpdGggU2FmYXJpIGJlaW5nIHRoZVxuICogbGFzdCBvbmUgdG8gcmVsZWFzZSBzdXBwb3J0LiBJZiB0aGUgQVBJIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgZnVuY3Rpb24gd2lsbFxuICogdGhyb3cuIE1ha2Ugc3VyZSB5b3UgY2hlY2sgYXZhaWxhYmxpbGl0eSBiZWZvcmUgY29uZmlndXJpbmcge0BsaW5rXG4gKiBHb1RydWVDbGllbnR9LlxuICpcbiAqIFlvdSBjYW4gdHVybiBvbiBkZWJ1Z2dpbmcgYnkgc2V0dGluZyB0aGUgYHN1cGFiYXNlLmdvdHJ1ZS1qcy5sb2Nrcy5kZWJ1Z2BcbiAqIGxvY2FsIHN0b3JhZ2UgaXRlbSB0byBgdHJ1ZWAuXG4gKlxuICogSW50ZXJuYWxzOlxuICpcbiAqIFNpbmNlIHRoZSBMb2NrTWFuYWdlciBBUEkgZG9lcyBub3QgcHJlc2VydmUgc3RhY2sgdHJhY2VzIGZvciB0aGUgYXN5bmNcbiAqIGZ1bmN0aW9uIHBhc3NlZCBpbiB0aGUgYHJlcXVlc3RgIG1ldGhvZCwgYSB0cmljayBpcyB1c2VkIHdoZXJlIGFjcXVpcmluZyB0aGVcbiAqIGxvY2sgcmVsZWFzZXMgYSBwcmV2aW91c2x5IHN0YXJ0ZWQgcHJvbWlzZSB0byBydW4gdGhlIG9wZXJhdGlvbiBpbiB0aGUgYGZuYFxuICogZnVuY3Rpb24uIFRoZSBsb2NrIHdhaXRzIGZvciB0aGF0IHByb21pc2UgdG8gZmluaXNoICh3aXRoIG9yIHdpdGhvdXQgZXJyb3IpLFxuICogd2hpbGUgdGhlIGZ1bmN0aW9uIHdpbGwgZmluYWxseSB3YWl0IGZvciB0aGUgcmVzdWx0IGFueXdheS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBsb2NrIHRvIGJlIGFjcXVpcmVkLlxuICogQHBhcmFtIGFjcXVpcmVUaW1lb3V0IElmIG5lZ2F0aXZlLCBubyB0aW1lb3V0LiBJZiAwIGFuIGVycm9yIGlzIHRocm93biBpZlxuICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBsb2NrIGNhbid0IGJlIGFjcXVpcmVkIHdpdGhvdXQgd2FpdGluZy4gSWYgcG9zaXRpdmUsIHRoZSBsb2NrIGFjcXVpcmVcbiAqICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHRpbWUgb3V0IGFmdGVyIHNvIG1hbnkgbWlsbGlzZWNvbmRzLiBBbiBlcnJvciBpc1xuICogICAgICAgICAgICAgICAgICAgICAgIGEgdGltZW91dCBpZiBpdCBoYXMgYGlzQWNxdWlyZVRpbWVvdXRgIHNldCB0byB0cnVlLlxuICogQHBhcmFtIGZuIFRoZSBvcGVyYXRpb24gdG8gcnVuIG9uY2UgdGhlIGxvY2sgaXMgYWNxdWlyZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGF3YWl0IG5hdmlnYXRvckxvY2soJ3N5bmMtdXNlcicsIDEwMDAsIGFzeW5jICgpID0+IHtcbiAqICAgYXdhaXQgcmVmcmVzaFNlc3Npb24oKVxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmF2aWdhdG9yTG9jayhuYW1lLCBhY3F1aXJlVGltZW91dCwgZm4pIHtcbiAgICBpZiAoaW50ZXJuYWxzLmRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdAc3VwYWJhc2UvZ290cnVlLWpzOiBuYXZpZ2F0b3JMb2NrOiBhY3F1aXJlIGxvY2snLCBuYW1lLCBhY3F1aXJlVGltZW91dCk7XG4gICAgfVxuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlcigpO1xuICAgIGlmIChhY3F1aXJlVGltZW91dCA+IDApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIGlmIChpbnRlcm5hbHMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQHN1cGFiYXNlL2dvdHJ1ZS1qczogbmF2aWdhdG9yTG9jayBhY3F1aXJlIHRpbWVkIG91dCcsIG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBhY3F1aXJlVGltZW91dCk7XG4gICAgfVxuICAgIC8vIE1ETiBhcnRpY2xlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTG9ja01hbmFnZXIvcmVxdWVzdFxuICAgIC8vIFdyYXBwaW5nIG5hdmlnYXRvci5sb2Nrcy5yZXF1ZXN0KCkgd2l0aCBhIHBsYWluIFByb21pc2UgaXMgZG9uZSBhcyBzb21lXG4gICAgLy8gbGlicmFyaWVzIGxpa2Ugem9uZS5qcyBwYXRjaCB0aGUgUHJvbWlzZSBvYmplY3QgdG8gdHJhY2sgdGhlIGV4ZWN1dGlvblxuICAgIC8vIGNvbnRleHQuIEhvd2V2ZXIsIGl0IGFwcGVhcnMgdGhhdCBtb3N0IGJyb3dzZXJzIHVzZSBhbiBpbnRlcm5hbCBwcm9taXNlXG4gICAgLy8gaW1wbGVtZW50YXRpb24gd2hlbiB1c2luZyB0aGUgbmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QoKSBBUEkgY2F1c2luZyB0aGVtXG4gICAgLy8gdG8gbG9zZSBjb250ZXh0IGFuZCBlbWl0IGNvbmZ1c2luZyBsb2cgbWVzc2FnZXMgb3IgYnJlYWsgY2VydGFpbiBmZWF0dXJlcy5cbiAgICAvLyBUaGlzIHdyYXBwaW5nIGlzIGJlbGlldmVkIHRvIGhlbHAgem9uZS5qcyB0cmFjayB0aGUgZXhlY3V0aW9uIGNvbnRleHRcbiAgICAvLyBiZXR0ZXIuXG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gZ2xvYmFsVGhpcy5uYXZpZ2F0b3IubG9ja3MucmVxdWVzdChuYW1lLCBhY3F1aXJlVGltZW91dCA9PT0gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIG1vZGU6ICdleGNsdXNpdmUnLFxuICAgICAgICAgICAgaWZBdmFpbGFibGU6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBtb2RlOiAnZXhjbHVzaXZlJyxcbiAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgfSwgYXN5bmMgKGxvY2spID0+IHtcbiAgICAgICAgaWYgKGxvY2spIHtcbiAgICAgICAgICAgIGlmIChpbnRlcm5hbHMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQHN1cGFiYXNlL2dvdHJ1ZS1qczogbmF2aWdhdG9yTG9jazogYWNxdWlyZWQnLCBuYW1lLCBsb2NrLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbHMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0BzdXBhYmFzZS9nb3RydWUtanM6IG5hdmlnYXRvckxvY2s6IHJlbGVhc2VkJywgbmFtZSwgbG9jay5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoYWNxdWlyZVRpbWVvdXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdAc3VwYWJhc2UvZ290cnVlLWpzOiBuYXZpZ2F0b3JMb2NrOiBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlJywgbmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYXZpZ2F0b3JMb2NrQWNxdWlyZVRpbWVvdXRFcnJvcihgQWNxdWlyaW5nIGFuIGV4Y2x1c2l2ZSBOYXZpZ2F0b3IgTG9ja01hbmFnZXIgbG9jayBcIiR7bmFtZX1cIiBpbW1lZGlhdGVseSBmYWlsZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbHMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdsb2JhbFRoaXMubmF2aWdhdG9yLmxvY2tzLnF1ZXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQHN1cGFiYXNlL2dvdHJ1ZS1qczogTmF2aWdhdG9yIExvY2tNYW5hZ2VyIHN0YXRlJywgSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAnICAnKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQHN1cGFiYXNlL2dvdHJ1ZS1qczogRXJyb3Igd2hlbiBxdWVyeWluZyBOYXZpZ2F0b3IgTG9ja01hbmFnZXIgc3RhdGUnLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBCcm93c2VyIGlzIG5vdCBmb2xsb3dpbmcgdGhlIE5hdmlnYXRvciBMb2NrTWFuYWdlciBzcGVjLCBpdFxuICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGEgbnVsbCBsb2NrIHdoZW4gd2UgZGlkbid0IHVzZSBpZkF2YWlsYWJsZS4gU28gd2UgY2FuXG4gICAgICAgICAgICAgICAgLy8gcHJldGVuZCB0aGUgbG9jayBpcyBhY3F1aXJlZCBpbiB0aGUgbmFtZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICAgICAgLy8gYW5kIHVzZXIgZXhwZXJpZW5jZSBhbmQganVzdCBydW4gdGhlIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQHN1cGFiYXNlL2dvdHJ1ZS1qczogTmF2aWdhdG9yIExvY2tNYW5hZ2VyIHJldHVybmVkIGEgbnVsbCBsb2NrIHdoZW4gdXNpbmcgI3JlcXVlc3Qgd2l0aG91dCBpZkF2YWlsYWJsZSBzZXQgdG8gdHJ1ZSwgaXQgYXBwZWFycyB0aGlzIGJyb3dzZXIgaXMgbm90IGZvbGxvd2luZyB0aGUgTG9ja01hbmFnZXIgc3BlYyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTG9ja01hbmFnZXIvcmVxdWVzdCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSkpO1xufVxuY29uc3QgUFJPQ0VTU19MT0NLUyA9IHt9O1xuLyoqXG4gKiBJbXBsZW1lbnRzIGEgZ2xvYmFsIGV4Y2x1c2l2ZSBsb2NrIHRoYXQgd29ya3Mgb25seSBpbiB0aGUgY3VycmVudCBwcm9jZXNzLlxuICogVXNlZnVsIGZvciBlbnZpcm9ubWVudHMgbGlrZSBSZWFjdCBOYXRpdmUgb3Igb3RoZXIgbm9uLWJyb3dzZXJcbiAqIHNpbmdsZS1wcm9jZXNzIChpLmUuIG5vIGNvbmNlcHQgb2YgXCJ0YWJzXCIpIGVudmlyb25tZW50cy5cbiAqXG4gKiBVc2Uge0BsaW5rICNuYXZpZ2F0b3JMb2NrfSBpbiBicm93c2VyIGVudmlyb25tZW50cy5cbiAqXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBsb2NrIHRvIGJlIGFjcXVpcmVkLlxuICogQHBhcmFtIGFjcXVpcmVUaW1lb3V0IElmIG5lZ2F0aXZlLCBubyB0aW1lb3V0LiBJZiAwIGFuIGVycm9yIGlzIHRocm93biBpZlxuICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBsb2NrIGNhbid0IGJlIGFjcXVpcmVkIHdpdGhvdXQgd2FpdGluZy4gSWYgcG9zaXRpdmUsIHRoZSBsb2NrIGFjcXVpcmVcbiAqICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHRpbWUgb3V0IGFmdGVyIHNvIG1hbnkgbWlsbGlzZWNvbmRzLiBBbiBlcnJvciBpc1xuICogICAgICAgICAgICAgICAgICAgICAgIGEgdGltZW91dCBpZiBpdCBoYXMgYGlzQWNxdWlyZVRpbWVvdXRgIHNldCB0byB0cnVlLlxuICogQHBhcmFtIGZuIFRoZSBvcGVyYXRpb24gdG8gcnVuIG9uY2UgdGhlIGxvY2sgaXMgYWNxdWlyZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGF3YWl0IHByb2Nlc3NMb2NrKCdtaWdyYXRlJywgNTAwMCwgYXN5bmMgKCkgPT4ge1xuICogICBhd2FpdCBydW5NaWdyYXRpb24oKVxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0xvY2sobmFtZSwgYWNxdWlyZVRpbWVvdXQsIGZuKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHByZXZpb3VzT3BlcmF0aW9uID0gKF9hID0gUFJPQ0VTU19MT0NLU1tuYW1lXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgY3VycmVudE9wZXJhdGlvbiA9IFByb21pc2UucmFjZShbXG4gICAgICAgIHByZXZpb3VzT3BlcmF0aW9uLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvciBvZiBwcmV2aW91cyBvcGVyYXRpb24gdGhhdCB3ZSdyZSB3YWl0aW5nIHRvIGZpbmlzaFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pLFxuICAgICAgICBhY3F1aXJlVGltZW91dCA+PSAwXG4gICAgICAgICAgICA/IG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBQcm9jZXNzTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IoYEFjcXVpcmluZyBwcm9jZXNzIGxvY2sgd2l0aCBuYW1lIFwiJHtuYW1lfVwiIHRpbWVkIG91dGApKTtcbiAgICAgICAgICAgICAgICB9LCBhY3F1aXJlVGltZW91dCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBudWxsLFxuICAgIF0uZmlsdGVyKCh4KSA9PiB4KSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGlmIChlICYmIGUuaXNBY3F1aXJlVGltZW91dCkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9KVxuICAgICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIHByZXZpb3VzIG9wZXJhdGlvbnMgZmluaXNoZWQgYW5kIHdlIGRpZG4ndCBnZXQgYSByYWNlIG9uIHRoZSBhY3F1aXJlXG4gICAgICAgIC8vIHRpbWVvdXQsIHNvIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBjYW4gZmluYWxseSBzdGFydFxuICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9KTtcbiAgICBQUk9DRVNTX0xPQ0tTW25hbWVdID0gY3VycmVudE9wZXJhdGlvbi5jYXRjaChhc3luYyAoZSkgPT4ge1xuICAgICAgICBpZiAoZSAmJiBlLmlzQWNxdWlyZVRpbWVvdXQpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IG9wZXJhdGlvbiB0aW1lZCBvdXQsIGl0IGRvZXNuJ3QgbWVhbiB0aGF0IHRoZSBwcmV2aW91c1xuICAgICAgICAgICAgLy8gb3BlcmF0aW9uIGZpbmlzaGVkLCBzbyB3ZSBuZWVkIGNvbnRudWUgd2FpdGluZyBmb3IgaXQgdG8gZmluaXNoXG4gICAgICAgICAgICBhd2FpdCBwcmV2aW91c09wZXJhdGlvbjtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gICAgLy8gZmluYWxseSB3YWl0IGZvciB0aGUgY3VycmVudCBvcGVyYXRpb24gdG8gZmluaXNoIHN1Y2Nlc3NmdWxseSwgd2l0aCBhblxuICAgIC8vIGVycm9yIG9yIHdpdGggYW4gYWNxdWlyZSB0aW1lb3V0IGVycm9yXG4gICAgcmV0dXJuIGF3YWl0IGN1cnJlbnRPcGVyYXRpb247XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2Nrcy5qcy5tYXAiXSwibmFtZXMiOlsic3VwcG9ydHNMb2NhbFN0b3JhZ2UiLCJpbnRlcm5hbHMiLCJkZWJ1ZyIsImdsb2JhbFRoaXMiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwibWVzc2FnZSIsImlzQWNxdWlyZVRpbWVvdXQiLCJOYXZpZ2F0b3JMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciIsIlByb2Nlc3NMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciIsIm5hdmlnYXRvckxvY2siLCJuYW1lIiwiYWNxdWlyZVRpbWVvdXQiLCJmbiIsImNvbnNvbGUiLCJsb2ciLCJhYm9ydENvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJzZXRUaW1lb3V0IiwiYWJvcnQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJuYXZpZ2F0b3IiLCJsb2NrcyIsInJlcXVlc3QiLCJtb2RlIiwiaWZBdmFpbGFibGUiLCJzaWduYWwiLCJsb2NrIiwicmVzdWx0IiwicXVlcnkiLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsIndhcm4iLCJQUk9DRVNTX0xPQ0tTIiwicHJvY2Vzc0xvY2siLCJfYSIsInByZXZpb3VzT3BlcmF0aW9uIiwiY3VycmVudE9wZXJhdGlvbiIsInJhY2UiLCJjYXRjaCIsIl8iLCJyZWplY3QiLCJmaWx0ZXIiLCJ4Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ polyfillGlobalThis: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3BvbHlmaWxscy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7O0NBRUMsR0FDTSxTQUFTQTtJQUNaLElBQUksT0FBT0MsZUFBZSxVQUN0QjtJQUNKLElBQUk7UUFDQUMsT0FBT0MsY0FBYyxDQUFDRCxPQUFPRSxTQUFTLEVBQUUsYUFBYTtZQUNqREMsS0FBSztnQkFDRCxPQUFPLElBQUk7WUFDZjtZQUNBQyxjQUFjO1FBQ2xCO1FBQ0EsMkNBQTJDO1FBQzNDQyxVQUFVTixVQUFVLEdBQUdNO1FBQ3ZCLDJDQUEyQztRQUMzQyxPQUFPTCxPQUFPRSxTQUFTLENBQUNHLFNBQVM7SUFDckMsRUFDQSxPQUFPQyxHQUFHO1FBQ04sSUFBSSxPQUFPQyxTQUFTLGFBQWE7WUFDN0IsNkNBQTZDO1lBQzdDQSxLQUFLUixVQUFVLEdBQUdRO1FBQ3RCO0lBQ0o7QUFDSixFQUNBLHFDQUFxQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvcG9seWZpbGxzLmpzPzYzZTUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvZ2xvYmFsdGhpc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcG9seWZpbGxHbG9iYWxUaGlzKCkge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgJ19fbWFnaWNfXycsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgJ0FsbG93IGFjY2VzcyB0byBtYWdpYydcbiAgICAgICAgX19tYWdpY19fLmdsb2JhbFRoaXMgPSBfX21hZ2ljX187XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgJ0FsbG93IGFjY2VzcyB0byBtYWdpYydcbiAgICAgICAgZGVsZXRlIE9iamVjdC5wcm90b3R5cGUuX19tYWdpY19fO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yICdBbGxvdyBhY2Nlc3MgdG8gZ2xvYmFscydcbiAgICAgICAgICAgIHNlbGYuZ2xvYmFsVGhpcyA9IHNlbGY7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2x5ZmlsbHMuanMubWFwIl0sIm5hbWVzIjpbInBvbHlmaWxsR2xvYmFsVGhpcyIsImdsb2JhbFRoaXMiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInByb3RvdHlwZSIsImdldCIsImNvbmZpZ3VyYWJsZSIsIl9fbWFnaWNfXyIsImUiLCJzZWxmIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/types.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/types.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SIGN_OUT_SCOPES: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3R5cGVzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSxNQUFNQSxzQkFBc0I7SUFBQztJQUFVO0lBQWM7Q0FBUTtBQUM3RCxNQUFNQyxhQUFhO0lBQ2Y7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtDQUNIO0FBQ0QsTUFBTUMsY0FBYztJQUFDO0lBQVE7SUFBUztDQUFXO0FBQ2pELE1BQU1DLDZCQUE2QjtJQUFDO0lBQVk7Q0FBYTtBQUM3RCxNQUFNQyxrQkFBa0I7SUFBQztJQUFPO0NBQVc7QUFDcEMsTUFBTUMsa0JBQWtCO0lBQUM7SUFBVTtJQUFTO0NBQVMsQ0FBQyxDQUM3RCxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3R5cGVzLmpzPzFmNjEiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgV2Vha1Bhc3N3b3JkUmVhc29ucyA9IFsnbGVuZ3RoJywgJ2NoYXJhY3RlcnMnLCAncHduZWQnXTtcbmNvbnN0IEFNUk1ldGhvZHMgPSBbXG4gICAgJ3Bhc3N3b3JkJyxcbiAgICAnb3RwJyxcbiAgICAnb2F1dGgnLFxuICAgICd0b3RwJyxcbiAgICAnbWZhL3RvdHAnLFxuICAgICdtZmEvcGhvbmUnLFxuICAgICdtZmEvd2ViYXV0aG4nLFxuICAgICdhbm9ueW1vdXMnLFxuICAgICdzc28vc2FtbCcsXG4gICAgJ21hZ2ljbGluaycsXG4gICAgJ3dlYjMnLFxuXTtcbmNvbnN0IEZhY3RvclR5cGVzID0gWyd0b3RwJywgJ3Bob25lJywgJ3dlYmF1dGhuJ107XG5jb25zdCBGYWN0b3JWZXJpZmljYXRpb25TdGF0dXNlcyA9IFsndmVyaWZpZWQnLCAndW52ZXJpZmllZCddO1xuY29uc3QgTUZBVE9UUENoYW5uZWxzID0gWydzbXMnLCAnd2hhdHNhcHAnXTtcbmV4cG9ydCBjb25zdCBTSUdOX09VVF9TQ09QRVMgPSBbJ2dsb2JhbCcsICdsb2NhbCcsICdvdGhlcnMnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCJdLCJuYW1lcyI6WyJXZWFrUGFzc3dvcmRSZWFzb25zIiwiQU1STWV0aG9kcyIsIkZhY3RvclR5cGVzIiwiRmFjdG9yVmVyaWZpY2F0aW9uU3RhdHVzZXMiLCJNRkFUT1RQQ2hhbm5lbHMiLCJTSUdOX09VVF9TQ09QRVMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/types.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/version.js":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/version.js ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ version: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3ZlcnNpb24uanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZFQUE2RTtBQUM3RSxnRUFBZ0U7QUFDaEUsdUVBQXVFO0FBQ3ZFLGlFQUFpRTtBQUNqRSxrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQzFELE1BQU1BLFVBQVUsU0FBUyxDQUNoQyxtQ0FBbUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3ZlcnNpb24uanM/OTc3YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgcmVsZWFzZXMgYnkgc2NyaXB0cy91cGRhdGUtdmVyc2lvbi1maWxlcy50c1xuLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHJ1bnRpbWUgYWNjZXNzIHRvIHRoZSBwYWNrYWdlIHZlcnNpb24gZm9yOlxuLy8gLSBIVFRQIHJlcXVlc3QgaGVhZGVycyAoZS5nLiwgWC1DbGllbnQtSW5mbyBoZWFkZXIgZm9yIEFQSSByZXF1ZXN0cylcbi8vIC0gRGVidWdnaW5nIGFuZCBzdXBwb3J0IChpZGVudGlmeWluZyB3aGljaCB2ZXJzaW9uIGlzIHJ1bm5pbmcpXG4vLyAtIFRlbGVtZXRyeSBhbmQgbG9nZ2luZyAodmVyc2lvbiByZXBvcnRpbmcgaW4gZXJyb3JzL2FuYWx5dGljcylcbi8vIC0gRW5zdXJpbmcgYnVpbGQgYXJ0aWZhY3RzIG1hdGNoIHRoZSBwdWJsaXNoZWQgcGFja2FnZSB2ZXJzaW9uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICcyLjg4LjAnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVyc2lvbi5qcy5tYXAiXSwibmFtZXMiOlsidmVyc2lvbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/version.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js":
|
||
/*!*************************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js ***!
|
||
\*************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createSiweMessage: () => (/* binding */ createSiweMessage),\n/* harmony export */ fromHex: () => (/* binding */ fromHex),\n/* harmony export */ getAddress: () => (/* binding */ getAddress),\n/* harmony export */ toHex: () => (/* 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 \"${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: ${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: ${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: ${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: ${parameters.statement}`);\n }\n // Construct message\n const address = getAddress(parameters.address);\n const origin = scheme ? `${scheme}://${domain}` : domain;\n const statement = parameters.statement ? `${parameters.statement}\\n` : \"\";\n const prefix = `${origin} wants you to sign in with your Ethereum account:\\n${address}\\n\\n${statement}`;\n let suffix = `URI: ${uri}\\nVersion: ${version}\\nChain ID: ${chainId}${nonce ? `\\nNonce: ${nonce}` : \"\"}\\nIssued At: ${issuedAt.toISOString()}`;\n if (expirationTime) suffix += `\\nExpiration Time: ${expirationTime.toISOString()}`;\n if (notBefore) suffix += `\\nNot Before: ${notBefore.toISOString()}`;\n if (requestId) suffix += `\\nRequest ID: ${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: ${resource}`);\n content += `\\n- ${resource}`;\n }\n suffix += content;\n }\n return `${prefix}\\n${suffix}`;\n} //# sourceMappingURL=ethereum.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3dlYjMvZXRoZXJldW0uanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLGlGQUFpRjtBQUMxRSxTQUFTQSxXQUFXQyxPQUFPO0lBQzlCLElBQUksQ0FBQyxzQkFBc0JDLElBQUksQ0FBQ0QsVUFBVTtRQUN0QyxNQUFNLElBQUlFLE1BQU0sQ0FBQyw0QkFBNEIsRUFBRUYsUUFBUSxhQUFhLENBQUM7SUFDekU7SUFDQSxPQUFPQSxRQUFRRyxXQUFXO0FBQzlCO0FBQ08sU0FBU0MsUUFBUUMsR0FBRztJQUN2QixPQUFPQyxTQUFTRCxLQUFLO0FBQ3pCO0FBQ08sU0FBU0UsTUFBTUMsS0FBSztJQUN2QixNQUFNQyxRQUFRLElBQUlDLGNBQWNDLE1BQU0sQ0FBQ0g7SUFDdkMsTUFBTUgsTUFBTU8sTUFBTUMsSUFBSSxDQUFDSixPQUFPLENBQUNLLE9BQVNBLEtBQUtDLFFBQVEsQ0FBQyxJQUFJQyxRQUFRLENBQUMsR0FBRyxNQUFNQyxJQUFJLENBQUM7SUFDakYsT0FBUSxPQUFPWjtBQUNuQjtBQUNBOztDQUVDLEdBQ00sU0FBU2Esa0JBQWtCQyxVQUFVO0lBQ3hDLElBQUlDO0lBQ0osTUFBTSxFQUFFQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsY0FBYyxFQUFFQyxXQUFXLElBQUlDLE1BQU0sRUFBRUMsS0FBSyxFQUFFQyxTQUFTLEVBQUVDLFNBQVMsRUFBRUMsU0FBUyxFQUFFQyxNQUFNLEVBQUVDLEdBQUcsRUFBRUMsT0FBTyxFQUFHLEdBQUdiO0lBQ2xJLGtCQUFrQjtJQUNsQjtRQUNJLElBQUksQ0FBQ2MsT0FBT0MsU0FBUyxDQUFDYixVQUNsQixNQUFNLElBQUluQixNQUFNLENBQUMsOEdBQThHLEVBQUVtQixRQUFRLENBQUM7UUFDOUksSUFBSSxDQUFDQyxRQUNELE1BQU0sSUFBSXBCLE1BQU0sQ0FBQyxnRkFBZ0YsQ0FBQztRQUN0RyxJQUFJd0IsU0FBU0EsTUFBTVMsTUFBTSxHQUFHLEdBQ3hCLE1BQU0sSUFBSWpDLE1BQU0sQ0FBQyw0R0FBNEcsRUFBRXdCLE1BQU0sQ0FBQztRQUMxSSxJQUFJLENBQUNLLEtBQ0QsTUFBTSxJQUFJN0IsTUFBTSxDQUFDLDBFQUEwRSxDQUFDO1FBQ2hHLElBQUk4QixZQUFZLEtBQ1osTUFBTSxJQUFJOUIsTUFBTSxDQUFDLDhGQUE4RixFQUFFOEIsUUFBUSxDQUFDO1FBQzlILElBQUksQ0FBQ1osS0FBS0QsV0FBV2lCLFNBQVMsTUFBTSxRQUFRaEIsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHaUIsUUFBUSxDQUFDLE9BQzdFLE1BQU0sSUFBSW5DLE1BQU0sQ0FBQyw2R0FBNkcsRUFBRWlCLFdBQVdpQixTQUFTLENBQUMsQ0FBQztJQUM5SjtJQUNBLG9CQUFvQjtJQUNwQixNQUFNcEMsVUFBVUQsV0FBV29CLFdBQVduQixPQUFPO0lBQzdDLE1BQU1zQyxTQUFTUixTQUFTLENBQUMsRUFBRUEsT0FBTyxHQUFHLEVBQUVSLE9BQU8sQ0FBQyxHQUFHQTtJQUNsRCxNQUFNYyxZQUFZakIsV0FBV2lCLFNBQVMsR0FBRyxDQUFDLEVBQUVqQixXQUFXaUIsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHO0lBQ3ZFLE1BQU1HLFNBQVMsQ0FBQyxFQUFFRCxPQUFPLG1EQUFtRCxFQUFFdEMsUUFBUSxJQUFJLEVBQUVvQyxVQUFVLENBQUM7SUFDdkcsSUFBSUksU0FBUyxDQUFDLEtBQUssRUFBRVQsSUFBSSxXQUFXLEVBQUVDLFFBQVEsWUFBWSxFQUFFWCxRQUFRLEVBQUVLLFFBQVEsQ0FBQyxTQUFTLEVBQUVBLE1BQU0sQ0FBQyxHQUFHLEdBQUcsYUFBYSxFQUFFRixTQUFTaUIsV0FBVyxHQUFHLENBQUM7SUFDOUksSUFBSWxCLGdCQUNBaUIsVUFBVSxDQUFDLG1CQUFtQixFQUFFakIsZUFBZWtCLFdBQVcsR0FBRyxDQUFDO0lBQ2xFLElBQUlkLFdBQ0FhLFVBQVUsQ0FBQyxjQUFjLEVBQUViLFVBQVVjLFdBQVcsR0FBRyxDQUFDO0lBQ3hELElBQUliLFdBQ0FZLFVBQVUsQ0FBQyxjQUFjLEVBQUVaLFVBQVUsQ0FBQztJQUMxQyxJQUFJQyxXQUFXO1FBQ1gsSUFBSWEsVUFBVTtRQUNkLEtBQUssTUFBTUMsWUFBWWQsVUFBVztZQUM5QixJQUFJLENBQUNjLFlBQVksT0FBT0EsYUFBYSxVQUNqQyxNQUFNLElBQUl6QyxNQUFNLENBQUMsa0hBQWtILEVBQUV5QyxTQUFTLENBQUM7WUFDbkpELFdBQVcsQ0FBQyxJQUFJLEVBQUVDLFNBQVMsQ0FBQztRQUNoQztRQUNBSCxVQUFVRTtJQUNkO0lBQ0EsT0FBTyxDQUFDLEVBQUVILE9BQU8sRUFBRSxFQUFFQyxPQUFPLENBQUM7QUFDakMsRUFDQSxvQ0FBb0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3dlYjMvZXRoZXJldW0uanM/MjBkNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0eXBlcyBhbmQgZnVuY3Rpb25zIGNvcGllZCBvdmVyIGZyb20gdmllbSBzbyB0aGlzIGxpYnJhcnkgZG9lc24ndCBkZXBlbmQgb24gaXRcbmV4cG9ydCBmdW5jdGlvbiBnZXRBZGRyZXNzKGFkZHJlc3MpIHtcbiAgICBpZiAoIS9eMHhbYS1mQS1GMC05XXs0MH0kLy50ZXN0KGFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IEFkZHJlc3MgXCIke2FkZHJlc3N9XCIgaXMgaW52YWxpZC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmcm9tSGV4KGhleCkge1xuICAgIHJldHVybiBwYXJzZUludChoZXgsIDE2KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b0hleCh2YWx1ZSkge1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKTtcbiAgICBjb25zdCBoZXggPSBBcnJheS5mcm9tKGJ5dGVzLCAoYnl0ZSkgPT4gYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuICgnMHgnICsgaGV4KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBFSVAtNDM2MSBmb3JtYXR0ZWQgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNpd2VNZXNzYWdlKHBhcmFtZXRlcnMpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgeyBjaGFpbklkLCBkb21haW4sIGV4cGlyYXRpb25UaW1lLCBpc3N1ZWRBdCA9IG5ldyBEYXRlKCksIG5vbmNlLCBub3RCZWZvcmUsIHJlcXVlc3RJZCwgcmVzb3VyY2VzLCBzY2hlbWUsIHVyaSwgdmVyc2lvbiwgfSA9IHBhcmFtZXRlcnM7XG4gICAgLy8gVmFsaWRhdGUgZmllbGRzXG4gICAge1xuICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoY2hhaW5JZCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBJbnZhbGlkIFNJV0UgbWVzc2FnZSBmaWVsZCBcImNoYWluSWRcIi4gQ2hhaW4gSUQgbXVzdCBiZSBhIEVJUC0xNTUgY2hhaW4gSUQuIFByb3ZpZGVkIHZhbHVlOiAke2NoYWluSWR9YCk7XG4gICAgICAgIGlmICghZG9tYWluKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJkb21haW5cIi4gRG9tYWluIG11c3QgYmUgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlmIChub25jZSAmJiBub25jZS5sZW5ndGggPCA4KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJub25jZVwiLiBOb25jZSBtdXN0IGJlIGF0IGxlYXN0IDggY2hhcmFjdGVycy4gUHJvdmlkZWQgdmFsdWU6ICR7bm9uY2V9YCk7XG4gICAgICAgIGlmICghdXJpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJ1cmlcIi4gVVJJIG11c3QgYmUgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlmICh2ZXJzaW9uICE9PSAnMScpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBJbnZhbGlkIFNJV0UgbWVzc2FnZSBmaWVsZCBcInZlcnNpb25cIi4gVmVyc2lvbiBtdXN0IGJlICcxJy4gUHJvdmlkZWQgdmFsdWU6ICR7dmVyc2lvbn1gKTtcbiAgICAgICAgaWYgKChfYSA9IHBhcmFtZXRlcnMuc3RhdGVtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5jbHVkZXMoJ1xcbicpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJzdGF0ZW1lbnRcIi4gU3RhdGVtZW50IG11c3Qgbm90IGluY2x1ZGUgJ1xcXFxuJy4gUHJvdmlkZWQgdmFsdWU6ICR7cGFyYW1ldGVycy5zdGF0ZW1lbnR9YCk7XG4gICAgfVxuICAgIC8vIENvbnN0cnVjdCBtZXNzYWdlXG4gICAgY29uc3QgYWRkcmVzcyA9IGdldEFkZHJlc3MocGFyYW1ldGVycy5hZGRyZXNzKTtcbiAgICBjb25zdCBvcmlnaW4gPSBzY2hlbWUgPyBgJHtzY2hlbWV9Oi8vJHtkb21haW59YCA6IGRvbWFpbjtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBwYXJhbWV0ZXJzLnN0YXRlbWVudCA/IGAke3BhcmFtZXRlcnMuc3RhdGVtZW50fVxcbmAgOiAnJztcbiAgICBjb25zdCBwcmVmaXggPSBgJHtvcmlnaW59IHdhbnRzIHlvdSB0byBzaWduIGluIHdpdGggeW91ciBFdGhlcmV1bSBhY2NvdW50OlxcbiR7YWRkcmVzc31cXG5cXG4ke3N0YXRlbWVudH1gO1xuICAgIGxldCBzdWZmaXggPSBgVVJJOiAke3VyaX1cXG5WZXJzaW9uOiAke3ZlcnNpb259XFxuQ2hhaW4gSUQ6ICR7Y2hhaW5JZH0ke25vbmNlID8gYFxcbk5vbmNlOiAke25vbmNlfWAgOiAnJ31cXG5Jc3N1ZWQgQXQ6ICR7aXNzdWVkQXQudG9JU09TdHJpbmcoKX1gO1xuICAgIGlmIChleHBpcmF0aW9uVGltZSlcbiAgICAgICAgc3VmZml4ICs9IGBcXG5FeHBpcmF0aW9uIFRpbWU6ICR7ZXhwaXJhdGlvblRpbWUudG9JU09TdHJpbmcoKX1gO1xuICAgIGlmIChub3RCZWZvcmUpXG4gICAgICAgIHN1ZmZpeCArPSBgXFxuTm90IEJlZm9yZTogJHtub3RCZWZvcmUudG9JU09TdHJpbmcoKX1gO1xuICAgIGlmIChyZXF1ZXN0SWQpXG4gICAgICAgIHN1ZmZpeCArPSBgXFxuUmVxdWVzdCBJRDogJHtyZXF1ZXN0SWR9YDtcbiAgICBpZiAocmVzb3VyY2VzKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gJ1xcblJlc291cmNlczonO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFyZXNvdXJjZSB8fCB0eXBlb2YgcmVzb3VyY2UgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IEludmFsaWQgU0lXRSBtZXNzYWdlIGZpZWxkIFwicmVzb3VyY2VzXCIuIEV2ZXJ5IHJlc291cmNlIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcuIFByb3ZpZGVkIHZhbHVlOiAke3Jlc291cmNlfWApO1xuICAgICAgICAgICAgY29udGVudCArPSBgXFxuLSAke3Jlc291cmNlfWA7XG4gICAgICAgIH1cbiAgICAgICAgc3VmZml4ICs9IGNvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9XFxuJHtzdWZmaXh9YDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV0aGVyZXVtLmpzLm1hcCJdLCJuYW1lcyI6WyJnZXRBZGRyZXNzIiwiYWRkcmVzcyIsInRlc3QiLCJFcnJvciIsInRvTG93ZXJDYXNlIiwiZnJvbUhleCIsImhleCIsInBhcnNlSW50IiwidG9IZXgiLCJ2YWx1ZSIsImJ5dGVzIiwiVGV4dEVuY29kZXIiLCJlbmNvZGUiLCJBcnJheSIsImZyb20iLCJieXRlIiwidG9TdHJpbmciLCJwYWRTdGFydCIsImpvaW4iLCJjcmVhdGVTaXdlTWVzc2FnZSIsInBhcmFtZXRlcnMiLCJfYSIsImNoYWluSWQiLCJkb21haW4iLCJleHBpcmF0aW9uVGltZSIsImlzc3VlZEF0IiwiRGF0ZSIsIm5vbmNlIiwibm90QmVmb3JlIiwicmVxdWVzdElkIiwicmVzb3VyY2VzIiwic2NoZW1lIiwidXJpIiwidmVyc2lvbiIsIk51bWJlciIsImlzSW50ZWdlciIsImxlbmd0aCIsInN0YXRlbWVudCIsImluY2x1ZGVzIiwib3JpZ2luIiwicHJlZml4Iiwic3VmZml4IiwidG9JU09TdHJpbmciLCJjb250ZW50IiwicmVzb3VyY2UiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js":
|
||
/*!***************************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js ***!
|
||
\***************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAuthnError: () => (/* binding */ WebAuthnError),\n/* harmony export */ WebAuthnUnknownError: () => (/* binding */ WebAuthnUnknownError),\n/* harmony export */ identifyAuthenticationError: () => (/* binding */ identifyAuthenticationError),\n/* harmony export */ identifyRegistrationError: () => (/* binding */ identifyRegistrationError),\n/* harmony export */ isWebAuthnError: () => (/* binding */ isWebAuthnError)\n/* harmony export */ });\n/* harmony import */ var _webauthn__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webauthn */ \"(ssr)/./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({ error, options }) {\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: `${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 \"${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({ error, options }) {\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: `${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 \"${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3dlYmF1dGhuLmVycm9ycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxvREFBb0QsR0FDVDtBQUMzQzs7Ozs7Ozs7Ozs7Ozs7OztDQWdCQyxHQUNNLE1BQU1DLHNCQUFzQkM7SUFDL0JDLFlBQVksRUFBRUMsT0FBTyxFQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxFQUFHLENBQUU7UUFDekMsSUFBSUM7UUFDSixpRUFBaUU7UUFDakUsS0FBSyxDQUFDSixTQUFTO1lBQUVFO1FBQU07UUFDdkIsSUFBSSxDQUFDRyxpQkFBaUIsR0FBRztRQUN6QixJQUFJLENBQUNGLElBQUksR0FBRyxDQUFDQyxLQUFLRCxTQUFTLFFBQVFBLFNBQVMsS0FBSyxJQUFJQSxPQUFRRCxpQkFBaUJKLFFBQVFJLE1BQU1DLElBQUksR0FBR0csU0FBUyxNQUFPLFFBQVFGLE9BQU8sS0FBSyxJQUFJQSxLQUFLO1FBQ2hKLElBQUksQ0FBQ0gsSUFBSSxHQUFHQTtJQUNoQjtBQUNKO0FBQ0E7OztDQUdDLEdBQ00sTUFBTU0sNkJBQTZCVjtJQUN0Q0UsWUFBWUMsT0FBTyxFQUFFUSxhQUFhLENBQUU7UUFDaEMsS0FBSyxDQUFDO1lBQ0ZQLE1BQU07WUFDTkMsT0FBT007WUFDUFI7UUFDSjtRQUNBLElBQUksQ0FBQ0csSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDSyxhQUFhLEdBQUdBO0lBQ3pCO0FBQ0o7QUFDQTs7OztDQUlDLEdBQ00sU0FBU0MsZ0JBQWdCQyxLQUFLO0lBQ2pDLE9BQU8sT0FBT0EsVUFBVSxZQUFZQSxVQUFVLFFBQVEsdUJBQXVCQTtBQUNqRjtBQUNBOzs7Ozs7OztDQVFDLEdBQ00sU0FBU0MsMEJBQTBCLEVBQUVELEtBQUssRUFBRUUsT0FBTyxFQUFHO0lBQ3pELElBQUlSLElBQUlTLElBQUlDO0lBQ1osTUFBTSxFQUFFQyxTQUFTLEVBQUUsR0FBR0g7SUFD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SyxpQkFBaUI7UUFDckMsTUFBTXlCLGtCQUFrQkMsT0FBT0MsUUFBUSxDQUFDQyxRQUFRO1FBQ2hELElBQUksQ0FBQ25DLHdEQUFhQSxDQUFDZ0Msa0JBQWtCO1lBQ2pDLGdGQUFnRjtZQUNoRixPQUFPLElBQUkvQixjQUFjO2dCQUNyQkcsU0FBUyxDQUFDLEVBQUU2QixPQUFPQyxRQUFRLENBQUNDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDM0Q5QixNQUFNO2dCQUNOQyxPQUFPUTtZQUNYO1FBQ0osT0FDSyxJQUFJSyxVQUFVc0IsSUFBSSxLQUFLVCxpQkFBaUI7WUFDekMsZ0ZBQWdGO1lBQ2hGLE9BQU8sSUFBSS9CLGNBQWM7Z0JBQ3JCRyxTQUFTLENBQUMsV0FBVyxFQUFFZSxVQUFVc0IsSUFBSSxDQUFDLDRCQUE0QixDQUFDO2dCQUNuRXBDLE1BQU07Z0JBQ05DLE9BQU9RO1lBQ1g7UUFDSjtJQUNKLE9BQ0ssSUFBSUEsTUFBTVAsSUFBSSxLQUFLLGdCQUFnQjtRQUNwQyxtRUFBbUU7UUFDbkUsb0VBQW9FO1FBQ3BFLE9BQU8sSUFBSU4sY0FBYztZQUNyQkcsU0FBUztZQUNUQyxNQUFNO1lBQ05DLE9BQU9RO1FBQ1g7SUFDSjtJQUNBLE9BQU8sSUFBSWIsY0FBYztRQUNyQkcsU0FBUztRQUNUQyxNQUFNO1FBQ05DLE9BQU9RO0lBQ1g7QUFDSixFQUNBLDJDQUEyQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvd2ViYXV0aG4uZXJyb3JzLmpzP2I5NWMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG5pbXBvcnQgeyBpc1ZhbGlkRG9tYWluIH0gZnJvbSAnLi93ZWJhdXRobic7XG4vKipcbiAqIEEgY3VzdG9tIEVycm9yIHVzZWQgdG8gcmV0dXJuIGEgbW9yZSBudWFuY2VkIGVycm9yIGRldGFpbGluZyBfd2h5XyBvbmUgb2YgdGhlIGVpZ2h0IGRvY3VtZW50ZWRcbiAqIGVycm9ycyBpbiB0aGUgc3BlYyB3YXMgcmFpc2VkIGFmdGVyIGNhbGxpbmcgYG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKWAgb3JcbiAqIGBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClgOlxuICpcbiAqIC0gYEFib3J0RXJyb3JgXG4gKiAtIGBDb25zdHJhaW50RXJyb3JgXG4gKiAtIGBJbnZhbGlkU3RhdGVFcnJvcmBcbiAqIC0gYE5vdEFsbG93ZWRFcnJvcmBcbiAqIC0gYE5vdFN1cHBvcnRlZEVycm9yYFxuICogLSBgU2VjdXJpdHlFcnJvcmBcbiAqIC0gYFR5cGVFcnJvcmBcbiAqIC0gYFVua25vd25FcnJvcmBcbiAqXG4gKiBFcnJvciBtZXNzYWdlcyB3ZXJlIGRldGVybWluZWQgdGhyb3VnaCBpbnZlc3RpZ2F0aW9uIG9mIHRoZSBzcGVjIHRvIGRldGVybWluZSB1bmRlciB3aGljaFxuICogc2NlbmFyaW9zIGEgZ2l2ZW4gZXJyb3Igd291bGQgYmUgcmFpc2VkLlxuICovXG5leHBvcnQgY2xhc3MgV2ViQXV0aG5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UsIGNvZGUsIGNhdXNlLCBuYW1lLCB9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogaGVscCBSb2xsdXAgdW5kZXJzdGFuZCB0aGF0IGBjYXVzZWAgaXMgb2theSB0byBzZXRcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgeyBjYXVzZSB9KTtcbiAgICAgICAgdGhpcy5fX2lzV2ViQXV0aG5FcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMubmFtZSA9IChfYSA9IG5hbWUgIT09IG51bGwgJiYgbmFtZSAhPT0gdm9pZCAwID8gbmFtZSA6IChjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubmFtZSA6IHVuZGVmaW5lZCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdVbmtub3duIEVycm9yJztcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIGNsYXNzIGZvciB1bmtub3duIFdlYkF1dGhuIGVycm9ycy5cbiAqIFdyYXBzIHVuZXhwZWN0ZWQgZXJyb3JzIHRoYXQgZG9uJ3QgbWF0Y2gga25vd24gV2ViQXV0aG4gZXJyb3IgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkF1dGhuVW5rbm93bkVycm9yIGV4dGVuZHMgV2ViQXV0aG5FcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgb3JpZ2luYWxFcnJvcikge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBjb2RlOiAnRVJST1JfUEFTU1RIUk9VR0hfU0VFX0NBVVNFX1BST1BFUlRZJyxcbiAgICAgICAgICAgIGNhdXNlOiBvcmlnaW5hbEVycm9yLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdXZWJBdXRoblVua25vd25FcnJvcic7XG4gICAgICAgIHRoaXMub3JpZ2luYWxFcnJvciA9IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxufVxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIGVycm9yIGlzIGEgV2ViQXV0aG5FcnJvci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBlcnJvciBpcyBhIFdlYkF1dGhuRXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViQXV0aG5FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdfX2lzV2ViQXV0aG5FcnJvcicgaW4gZXJyb3I7XG59XG4vKipcbiAqIEF0dGVtcHQgdG8gaW50dWl0IF93aHlfIGFuIGVycm9yIHdhcyByYWlzZWQgYWZ0ZXIgY2FsbGluZyBgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpYC5cbiAqIE1hcHMgYnJvd3NlciBlcnJvcnMgdG8gc3BlY2lmaWMgV2ViQXV0aG4gZXJyb3IgY29kZXMgZm9yIGJldHRlciBkZWJ1Z2dpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gRXJyb3IgaWRlbnRpZmljYXRpb24gcGFyYW1ldGVyc1xuICogQHBhcmFtIHtFcnJvcn0gcGFyYW1zLmVycm9yIC0gVGhlIGVycm9yIHRocm93biBieSB0aGUgYnJvd3NlclxuICogQHBhcmFtIHtDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zfSBwYXJhbXMub3B0aW9ucyAtIFRoZSBvcHRpb25zIHBhc3NlZCB0byBjcmVkZW50aWFscy5jcmVhdGUoKVxuICogQHJldHVybnMge1dlYkF1dGhuRXJyb3J9IEEgV2ViQXV0aG5FcnJvciB3aXRoIGEgc3BlY2lmaWMgZXJyb3IgY29kZVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgVzNDIFdlYkF1dGhuIFNwZWMgLSBDcmVhdGUgQ3JlZGVudGlhbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aWZ5UmVnaXN0cmF0aW9uRXJyb3IoeyBlcnJvciwgb3B0aW9ucywgfSkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIGNvbnN0IHsgcHVibGljS2V5IH0gPSBvcHRpb25zO1xuICAgIGlmICghcHVibGljS2V5KSB7XG4gICAgICAgIHRocm93IEVycm9yKCdvcHRpb25zIHdhcyBtaXNzaW5nIHJlcXVpcmVkIHB1YmxpY0tleSBwcm9wZXJ0eScpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnNpZ25hbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDE2KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUmVnaXN0cmF0aW9uIGNlcmVtb255IHdhcyBzZW50IGFuIGFib3J0IHNpZ25hbCcsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0NFUkVNT05ZX0FCT1JURUQnLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdDb25zdHJhaW50RXJyb3InKSB7XG4gICAgICAgIGlmICgoKF9hID0gcHVibGljS2V5LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXF1aXJlUmVzaWRlbnRLZXkpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgNClcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Rpc2NvdmVyYWJsZSBjcmVkZW50aWFscyB3ZXJlIHJlcXVpcmVkIGJ1dCBubyBhdmFpbGFibGUgYXV0aGVudGljYXRvciBzdXBwb3J0ZWQgaXQnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX01JU1NJTkdfRElTQ09WRVJBQkxFX0NSRURFTlRJQUxfU1VQUE9SVCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGBtZWRpYXRpb25gIGRvZXNuJ3QgeWV0IGV4aXN0IG9uIENyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMgYnV0IGl0J3MgcG9zc2libGUgYXMgb2YgU2VwdCAyMDI0XG4gICAgICAgIG9wdGlvbnMubWVkaWF0aW9uID09PSAnY29uZGl0aW9uYWwnICYmXG4gICAgICAgICAgICAoKF9iID0gcHVibGljS2V5LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi51c2VyVmVyaWZpY2F0aW9uKSA9PT0gJ3JlcXVpcmVkJykge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgKFN0ZXAgMjIuNClcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZXIgdmVyaWZpY2F0aW9uIHdhcyByZXF1aXJlZCBkdXJpbmcgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBidXQgaXQgY291bGQgbm90IGJlIHBlcmZvcm1lZCcsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0FVVE9fUkVHSVNURVJfVVNFUl9WRVJJRklDQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKChfYyA9IHB1YmxpY0tleS5hdXRoZW50aWNhdG9yU2VsZWN0aW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudXNlclZlcmlmaWNhdGlvbikgPT09ICdyZXF1aXJlZCcpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLW9wLW1ha2UtY3JlZCAoU3RlcCA1KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVXNlciB2ZXJpZmljYXRpb24gd2FzIHJlcXVpcmVkIGJ1dCBubyBhdmFpbGFibGUgYXV0aGVudGljYXRvciBzdXBwb3J0ZWQgaXQnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX01JU1NJTkdfVVNFUl9WRVJJRklDQVRJT05fU1VQUE9SVCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ0ludmFsaWRTdGF0ZUVycm9yJykge1xuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDIwKVxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgMylcbiAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGUgYXV0aGVudGljYXRvciB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkJyxcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX1BSRVZJT1VTTFlfUkVHSVNURVJFRCcsXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnTm90QWxsb3dlZEVycm9yJykge1xuICAgICAgICAvKipcbiAgICAgICAgICogUGFzcyB0aGUgZXJyb3IgZGlyZWN0bHkgdGhyb3VnaC4gUGxhdGZvcm1zIGFyZSBvdmVybG9hZGluZyB0aGlzIGVycm9yIGJleW9uZCB3aGF0IHRoZSBzcGVjXG4gICAgICAgICAqIGRlZmluZXMgYW5kIHdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHBvdGVudGlhbGx5IHVzZWZ1bCBlcnJvciBtZXNzYWdlcy5cbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgY29kZTogJ0VSUk9SX1BBU1NUSFJPVUdIX1NFRV9DQVVTRV9QUk9QRVJUWScsXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnTm90U3VwcG9ydGVkRXJyb3InKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkUHViS2V5Q3JlZFBhcmFtcyA9IHB1YmxpY0tleS5wdWJLZXlDcmVkUGFyYW1zLmZpbHRlcigocGFyYW0pID0+IHBhcmFtLnR5cGUgPT09ICdwdWJsaWMta2V5Jyk7XG4gICAgICAgIGlmICh2YWxpZFB1YktleUNyZWRQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDEwKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTm8gZW50cnkgaW4gcHViS2V5Q3JlZFBhcmFtcyB3YXMgb2YgdHlwZSBcInB1YmxpYy1rZXlcIicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX01BTEZPUk1FRF9QVUJLRVlDUkVEUEFSQU1TJyxcbiAgICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgMilcbiAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdObyBhdmFpbGFibGUgYXV0aGVudGljYXRvciBzdXBwb3J0ZWQgYW55IG9mIHRoZSBzcGVjaWZpZWQgcHViS2V5Q3JlZFBhcmFtcyBhbGdvcml0aG1zJyxcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX05PX1NVUFBPUlRFRF9QVUJLRVlDUkVEUEFSQU1TX0FMRycsXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnU2VjdXJpdHlFcnJvcicpIHtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRG9tYWluID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO1xuICAgICAgICBpZiAoIWlzVmFsaWREb21haW4oZWZmZWN0aXZlRG9tYWluKSkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tY3JlYXRlQ3JlZGVudGlhbCAoU3RlcCA3KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJHt3aW5kb3cubG9jYXRpb24uaG9zdG5hbWV9IGlzIGFuIGludmFsaWQgZG9tYWluYCxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfSU5WQUxJRF9ET01BSU4nLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHB1YmxpY0tleS5ycC5pZCAhPT0gZWZmZWN0aXZlRG9tYWluKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDgpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgUlAgSUQgXCIke3B1YmxpY0tleS5ycC5pZH1cIiBpcyBpbnZhbGlkIGZvciB0aGlzIGRvbWFpbmAsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0lOVkFMSURfUlBfSUQnLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdUeXBlRXJyb3InKSB7XG4gICAgICAgIGlmIChwdWJsaWNLZXkudXNlci5pZC5ieXRlTGVuZ3RoIDwgMSB8fCBwdWJsaWNLZXkudXNlci5pZC5ieXRlTGVuZ3RoID4gNjQpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgKFN0ZXAgNSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZXIgSUQgd2FzIG5vdCBiZXR3ZWVuIDEgYW5kIDY0IGNoYXJhY3RlcnMnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9JTlZBTElEX1VTRVJfSURfTEVOR1RIJyxcbiAgICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnVW5rbm93bkVycm9yJykge1xuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgMSlcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tb3AtbWFrZS1jcmVkIChTdGVwIDgpXG4gICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICBtZXNzYWdlOiAnVGhlIGF1dGhlbnRpY2F0b3Igd2FzIHVuYWJsZSB0byBwcm9jZXNzIHRoZSBzcGVjaWZpZWQgb3B0aW9ucywgb3IgY291bGQgbm90IGNyZWF0ZSBhIG5ldyBjcmVkZW50aWFsJyxcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX0dFTkVSQUxfRVJST1InLFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgbWVzc2FnZTogJ2EgTm9uLVdlYmF1dGhuIHJlbGF0ZWQgZXJyb3IgaGFzIG9jY3VycmVkJyxcbiAgICAgICAgY29kZTogJ0VSUk9SX1BBU1NUSFJPVUdIX1NFRV9DQVVTRV9QUk9QRVJUWScsXG4gICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbn1cbi8qKlxuICogQXR0ZW1wdCB0byBpbnR1aXQgX3doeV8gYW4gZXJyb3Igd2FzIHJhaXNlZCBhZnRlciBjYWxsaW5nIGBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClgLlxuICogTWFwcyBicm93c2VyIGVycm9ycyB0byBzcGVjaWZpYyBXZWJBdXRobiBlcnJvciBjb2RlcyBmb3IgYmV0dGVyIGRlYnVnZ2luZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBFcnJvciBpZGVudGlmaWNhdGlvbiBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0Vycm9yfSBwYXJhbXMuZXJyb3IgLSBUaGUgZXJyb3IgdGhyb3duIGJ5IHRoZSBicm93c2VyXG4gKiBAcGFyYW0ge0NyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc30gcGFyYW1zLm9wdGlvbnMgLSBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gY3JlZGVudGlhbHMuZ2V0KClcbiAqIEByZXR1cm5zIHtXZWJBdXRobkVycm9yfSBBIFdlYkF1dGhuRXJyb3Igd2l0aCBhIHNwZWNpZmljIGVycm9yIGNvZGVcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1nZXRBc3NlcnRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBHZXQgQXNzZXJ0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZnlBdXRoZW50aWNhdGlvbkVycm9yKHsgZXJyb3IsIG9wdGlvbnMsIH0pIHtcbiAgICBjb25zdCB7IHB1YmxpY0tleSB9ID0gb3B0aW9ucztcbiAgICBpZiAoIXB1YmxpY0tleSkge1xuICAgICAgICB0aHJvdyBFcnJvcignb3B0aW9ucyB3YXMgbWlzc2luZyByZXF1aXJlZCBwdWJsaWNLZXkgcHJvcGVydHknKTtcbiAgICB9XG4gICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICBpZiAob3B0aW9ucy5zaWduYWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tY3JlYXRlQ3JlZGVudGlhbCAoU3RlcCAxNilcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0F1dGhlbnRpY2F0aW9uIGNlcmVtb255IHdhcyBzZW50IGFuIGFib3J0IHNpZ25hbCcsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0NFUkVNT05ZX0FCT1JURUQnLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdOb3RBbGxvd2VkRXJyb3InKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXNzIHRoZSBlcnJvciBkaXJlY3RseSB0aHJvdWdoLiBQbGF0Zm9ybXMgYXJlIG92ZXJsb2FkaW5nIHRoaXMgZXJyb3IgYmV5b25kIHdoYXQgdGhlIHNwZWNcbiAgICAgICAgICogZGVmaW5lcyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgcG90ZW50aWFsbHkgdXNlZnVsIGVycm9yIG1lc3NhZ2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICBjb2RlOiAnRVJST1JfUEFTU1RIUk9VR0hfU0VFX0NBVVNFX1BST1BFUlRZJyxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdTZWN1cml0eUVycm9yJykge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVEb21haW4gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XG4gICAgICAgIGlmICghaXNWYWxpZERvbWFpbihlZmZlY3RpdmVEb21haW4pKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1kaXNjb3Zlci1mcm9tLWV4dGVybmFsLXNvdXJjZSAoU3RlcCA1KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJHt3aW5kb3cubG9jYXRpb24uaG9zdG5hbWV9IGlzIGFuIGludmFsaWQgZG9tYWluYCxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfSU5WQUxJRF9ET01BSU4nLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHB1YmxpY0tleS5ycElkICE9PSBlZmZlY3RpdmVEb21haW4pIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLWRpc2NvdmVyLWZyb20tZXh0ZXJuYWwtc291cmNlIChTdGVwIDYpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgUlAgSUQgXCIke3B1YmxpY0tleS5ycElkfVwiIGlzIGludmFsaWQgZm9yIHRoaXMgZG9tYWluYCxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfSU5WQUxJRF9SUF9JRCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ1Vua25vd25FcnJvcicpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tb3AtZ2V0LWFzc2VydGlvbiAoU3RlcCAxKVxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1nZXQtYXNzZXJ0aW9uIChTdGVwIDEyKVxuICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgbWVzc2FnZTogJ1RoZSBhdXRoZW50aWNhdG9yIHdhcyB1bmFibGUgdG8gcHJvY2VzcyB0aGUgc3BlY2lmaWVkIG9wdGlvbnMsIG9yIGNvdWxkIG5vdCBjcmVhdGUgYSBuZXcgYXNzZXJ0aW9uIHNpZ25hdHVyZScsXG4gICAgICAgICAgICBjb2RlOiAnRVJST1JfQVVUSEVOVElDQVRPUl9HRU5FUkFMX0VSUk9SJyxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgIG1lc3NhZ2U6ICdhIE5vbi1XZWJhdXRobiByZWxhdGVkIGVycm9yIGhhcyBvY2N1cnJlZCcsXG4gICAgICAgIGNvZGU6ICdFUlJPUl9QQVNTVEhST1VHSF9TRUVfQ0FVU0VfUFJPUEVSVFknLFxuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJhdXRobi5lcnJvcnMuanMubWFwIl0sIm5hbWVzIjpbImlzVmFsaWREb21haW4iLCJXZWJBdXRobkVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm1lc3NhZ2UiLCJjb2RlIiwiY2F1c2UiLCJuYW1lIiwiX2EiLCJfX2lzV2ViQXV0aG5FcnJvciIsInVuZGVmaW5lZCIsIldlYkF1dGhuVW5rbm93bkVycm9yIiwib3JpZ2luYWxFcnJvciIsImlzV2ViQXV0aG5FcnJvciIsImVycm9yIiwiaWRlbnRpZnlSZWdpc3RyYXRpb25FcnJvciIsIm9wdGlvbnMiLCJfYiIsIl9jIiwicHVibGljS2V5Iiwic2lnbmFsIiwiQWJvcnRTaWduYWwiLCJhdXRoZW50aWNhdG9yU2VsZWN0aW9uIiwicmVxdWlyZVJlc2lkZW50S2V5IiwibWVkaWF0aW9uIiwidXNlclZlcmlmaWNhdGlvbiIsInZhbGlkUHViS2V5Q3JlZFBhcmFtcyIsInB1YktleUNyZWRQYXJhbXMiLCJmaWx0ZXIiLCJwYXJhbSIsInR5cGUiLCJsZW5ndGgiLCJlZmZlY3RpdmVEb21haW4iLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhvc3RuYW1lIiwicnAiLCJpZCIsInVzZXIiLCJieXRlTGVuZ3RoIiwiaWRlbnRpZnlBdXRoZW50aWNhdGlvbkVycm9yIiwicnBJZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DEFAULT_CREATION_OPTIONS: () => (/* binding */ DEFAULT_CREATION_OPTIONS),\n/* harmony export */ DEFAULT_REQUEST_OPTIONS: () => (/* binding */ DEFAULT_REQUEST_OPTIONS),\n/* harmony export */ WebAuthnAbortService: () => (/* binding */ WebAuthnAbortService),\n/* harmony export */ WebAuthnApi: () => (/* binding */ WebAuthnApi),\n/* harmony export */ WebAuthnError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.WebAuthnError),\n/* harmony export */ createCredential: () => (/* binding */ createCredential),\n/* harmony export */ deserializeCredentialCreationOptions: () => (/* binding */ deserializeCredentialCreationOptions),\n/* harmony export */ deserializeCredentialRequestOptions: () => (/* binding */ deserializeCredentialRequestOptions),\n/* harmony export */ getCredential: () => (/* binding */ getCredential),\n/* harmony export */ identifyAuthenticationError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.identifyAuthenticationError),\n/* harmony export */ identifyRegistrationError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.identifyRegistrationError),\n/* harmony export */ isValidDomain: () => (/* binding */ isValidDomain),\n/* harmony export */ isWebAuthnError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.isWebAuthnError),\n/* harmony export */ mergeCredentialCreationOptions: () => (/* binding */ mergeCredentialCreationOptions),\n/* harmony export */ mergeCredentialRequestOptions: () => (/* binding */ mergeCredentialRequestOptions),\n/* harmony export */ serializeCredentialCreationResponse: () => (/* binding */ serializeCredentialCreationResponse),\n/* harmony export */ serializeCredentialRequestResponse: () => (/* binding */ serializeCredentialRequestResponse),\n/* harmony export */ webAuthnAbortService: () => (/* binding */ webAuthnAbortService)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tslib */ \"(ssr)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _base64url__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base64url */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./errors */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n/* harmony import */ var _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./webauthn.errors */ \"(ssr)/./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(...sources) {\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 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 /**\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({ factorId, webauthn, friendlyName, signal }, overrides) {\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 = `${user.id}:${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({ challengeId, factorId, webauthn }) {\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({ factorId, webauthn: { rpId = false ? 0 : undefined, rpOrigins = false ? 0 : undefined, signal } = {} }, overrides) {\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({ friendlyName, webauthn: { rpId = false ? 0 : undefined, rpOrigins = false ? 0 : undefined, signal } = {} }, overrides) {\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} //# sourceMappingURL=webauthn.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3dlYmF1dGhuLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQStCO0FBQ3VDO0FBQ0Y7QUFDOUI7QUFDNEc7QUFDaEQ7QUFDbEc7Ozs7OztDQU1DLEdBQ00sTUFBTVk7SUFDVDs7Ozs7O0tBTUMsR0FDREMsdUJBQXVCO1FBQ25CLDRGQUE0RjtRQUM1RixJQUFJLElBQUksQ0FBQ0MsVUFBVSxFQUFFO1lBQ2pCLE1BQU1DLGFBQWEsSUFBSUMsTUFBTTtZQUM3QkQsV0FBV0UsSUFBSSxHQUFHO1lBQ2xCLElBQUksQ0FBQ0gsVUFBVSxDQUFDSSxLQUFLLENBQUNIO1FBQzFCO1FBQ0EsTUFBTUksZ0JBQWdCLElBQUlDO1FBQzFCLElBQUksQ0FBQ04sVUFBVSxHQUFHSztRQUNsQixPQUFPQSxjQUFjRSxNQUFNO0lBQy9CO0lBQ0E7Ozs7O0tBS0MsR0FDREMsaUJBQWlCO1FBQ2IsSUFBSSxJQUFJLENBQUNSLFVBQVUsRUFBRTtZQUNqQixNQUFNQyxhQUFhLElBQUlDLE1BQU07WUFDN0JELFdBQVdFLElBQUksR0FBRztZQUNsQixJQUFJLENBQUNILFVBQVUsQ0FBQ0ksS0FBSyxDQUFDSDtZQUN0QixJQUFJLENBQUNELFVBQVUsR0FBR1M7UUFDdEI7SUFDSjtBQUNKO0FBQ0E7Ozs7O0NBS0MsR0FDTSxNQUFNQyx1QkFBdUIsSUFBSVosdUJBQXVCO0FBQy9EOzs7Ozs7OztDQVFDLEdBQ00sU0FBU2EscUNBQXFDQyxPQUFPO0lBQ3hELElBQUksQ0FBQ0EsU0FBUztRQUNWLE1BQU0sSUFBSVYsTUFBTTtJQUNwQjtJQUNBLHVFQUF1RTtJQUN2RSxJQUFJLE9BQU9XLHdCQUF3QixlQUMvQixrQ0FBa0NBLHVCQUNsQyxPQUFPQSxvQkFDRkMsNEJBQTRCLEtBQUssWUFBWTtRQUNsRCx5Q0FBeUM7UUFDekMsT0FBT0Qsb0JBQW9CQyw0QkFBNEIsQ0FDdkQs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T0FBTyxDQUFDO2dCQUNoQlEsVUFBVWdCLE9BQU9wRyxFQUFFO2dCQUNuQjZGLGFBQWFOLGtCQUFrQk0sV0FBVztnQkFDMUNSLFVBQVU7b0JBQ05XO29CQUNBRTtvQkFDQTVGLE1BQU1pRixrQkFBa0JGLFFBQVEsQ0FBQy9FLElBQUk7b0JBQ3JDd0YscUJBQXFCUCxrQkFBa0JGLFFBQVEsQ0FBQ1MsbUJBQW1CO2dCQUN2RTtZQUNKO1FBQ0osRUFDQSxPQUFPckQsT0FBTztZQUNWLElBQUkxRSxvREFBV0EsQ0FBQzBFLFFBQVE7Z0JBQ3BCLE9BQU87b0JBQUVELE1BQU07b0JBQU1DO2dCQUFNO1lBQy9CO1lBQ0EsT0FBTztnQkFDSEQsTUFBTTtnQkFDTkMsT0FBTyxJQUFJM0UscURBQWdCQSxDQUFDLGdDQUFnQzJFO1lBQ2hFO1FBQ0o7SUFDSjtBQUNKLEVBQ0Esb0NBQW9DIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi93ZWJhdXRobi5qcz84OGNjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYmFzZTY0VXJsVG9VaW50OEFycmF5LCBieXRlc1RvQmFzZTY0VVJMIH0gZnJvbSAnLi9iYXNlNjR1cmwnO1xuaW1wb3J0IHsgQXV0aEVycm9yLCBBdXRoVW5rbm93bkVycm9yLCBpc0F1dGhFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGlzQnJvd3NlciB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBpZGVudGlmeUF1dGhlbnRpY2F0aW9uRXJyb3IsIGlkZW50aWZ5UmVnaXN0cmF0aW9uRXJyb3IsIGlzV2ViQXV0aG5FcnJvciwgV2ViQXV0aG5FcnJvciwgV2ViQXV0aG5Vbmtub3duRXJyb3IsIH0gZnJvbSAnLi93ZWJhdXRobi5lcnJvcnMnO1xuZXhwb3J0IHsgV2ViQXV0aG5FcnJvciwgaXNXZWJBdXRobkVycm9yLCBpZGVudGlmeVJlZ2lzdHJhdGlvbkVycm9yLCBpZGVudGlmeUF1dGhlbnRpY2F0aW9uRXJyb3IgfTtcbi8qKlxuICogV2ViQXV0aG4gYWJvcnQgc2VydmljZSB0byBtYW5hZ2UgY2VyZW1vbnkgY2FuY2VsbGF0aW9uLlxuICogRW5zdXJlcyBvbmx5IG9uZSBXZWJBdXRobiBjZXJlbW9ueSBpcyBhY3RpdmUgYXQgYSB0aW1lIHRvIHByZXZlbnQgXCJvcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzc1wiIGVycm9ycy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgY2xhc3MgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWF1dG9tYXRpb24td2ViZHJpdmVyLWNhcGFiaWxpdHkgVzNDIFdlYkF1dGhuIFNwZWMgLSBBYm9ydGluZyBDZXJlbW9uaWVzfVxuICovXG5leHBvcnQgY2xhc3MgV2ViQXV0aG5BYm9ydFNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBhYm9ydCBzaWduYWwgZm9yIGEgbmV3IFdlYkF1dGhuIG9wZXJhdGlvbi5cbiAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbmNlbHMgYW55IGV4aXN0aW5nIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBYm9ydFNpZ25hbH0gU2lnbmFsIHRvIHBhc3MgdG8gbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpIG9yIC5nZXQoKVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydFNpZ25hbCBNRE4gLSBBYm9ydFNpZ25hbH1cbiAgICAgKi9cbiAgICBjcmVhdGVOZXdBYm9ydFNpZ25hbCgpIHtcbiAgICAgICAgLy8gQWJvcnQgYW55IGV4aXN0aW5nIGNhbGxzIHRvIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKSBvciBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlcikge1xuICAgICAgICAgICAgY29uc3QgYWJvcnRFcnJvciA9IG5ldyBFcnJvcignQ2FuY2VsbGluZyBleGlzdGluZyBXZWJBdXRobiBBUEkgY2FsbCBmb3IgbmV3IG9uZScpO1xuICAgICAgICAgICAgYWJvcnRFcnJvci5uYW1lID0gJ0Fib3J0RXJyb3InO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KGFib3J0RXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IG5ld0NvbnRyb2xsZXI7XG4gICAgICAgIHJldHVybiBuZXdDb250cm9sbGVyLnNpZ25hbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgY2FuY2VsIHRoZSBjdXJyZW50IFdlYkF1dGhuIG9wZXJhdGlvbi5cbiAgICAgKiBVc2VmdWwgZm9yIGNsZWFuaW5nIHVwIHdoZW4gdXNlciBjYW5jZWxzIG9yIG5hdmlnYXRlcyBhd2F5LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlci9hYm9ydCBNRE4gLSBBYm9ydENvbnRyb2xsZXIuYWJvcnR9XG4gICAgICovXG4gICAgY2FuY2VsQ2VyZW1vbnkoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGFib3J0RXJyb3IgPSBuZXcgRXJyb3IoJ01hbnVhbGx5IGNhbmNlbGxpbmcgZXhpc3RpbmcgV2ViQXV0aG4gQVBJIGNhbGwnKTtcbiAgICAgICAgICAgIGFib3J0RXJyb3IubmFtZSA9ICdBYm9ydEVycm9yJztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5hYm9ydChhYm9ydEVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogU2luZ2xldG9uIGluc3RhbmNlIHRvIGVuc3VyZSBvbmx5IG9uZSBXZWJBdXRobiBjZXJlbW9ueSBpcyBhY3RpdmUgYXQgYSB0aW1lLlxuICogVGhpcyBwcmV2ZW50cyBcIm9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzXCIgZXJyb3JzIHdoZW4gcmV0cnlpbmcgV2ViQXV0aG4gb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgaW5zdGFuY2UgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICovXG5leHBvcnQgY29uc3Qgd2ViQXV0aG5BYm9ydFNlcnZpY2UgPSBuZXcgV2ViQXV0aG5BYm9ydFNlcnZpY2UoKTtcbi8qKlxuICogQ29udmVydCBiYXNlNjR1cmwgZW5jb2RlZCBzdHJpbmdzIGluIFdlYkF1dGhuIGNyZWRlbnRpYWwgY3JlYXRpb24gb3B0aW9ucyB0byBBcnJheUJ1ZmZlcnNcbiAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBXZWJBdXRobiBicm93c2VyIEFQSS5cbiAqIFN1cHBvcnRzIGJvdGggbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgcGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTiBhbmQgbWFudWFsIGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7U2VydmVyQ3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc30gb3B0aW9ucyAtIEpTT04gb3B0aW9ucyBmcm9tIHNlcnZlciB3aXRoIGJhc2U2NHVybCBlbmNvZGVkIGZpZWxkc1xuICogQHJldHVybnMge1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNGdXR1cmV9IE9wdGlvbnMgcmVhZHkgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXBhcnNlQ3JlYXRpb25PcHRpb25zRnJvbUpTT04gVzNDIFdlYkF1dGhuIFNwZWMgLSBwYXJzZUNyZWF0aW9uT3B0aW9uc0Zyb21KU09OfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDcmVkZW50aWFsIGNyZWF0aW9uIG9wdGlvbnMgYXJlIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIHRoZSBuYXRpdmUgcGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTiBtZXRob2QgaXMgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBQdWJsaWNLZXlDcmVkZW50aWFsICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAncGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTicgaW4gUHVibGljS2V5Q3JlZGVudGlhbCAmJlxuICAgICAgICB0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbFxuICAgICAgICAgICAgLnBhcnNlQ3JlYXRpb25PcHRpb25zRnJvbUpTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgV2ViQXV0aG4gTGV2ZWwgMyBtZXRob2RcbiAgICAgICAgcmV0dXJuIFB1YmxpY0tleUNyZWRlbnRpYWwucGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTihcbiAgICAgICAgLyoqIHdlIGFzc2VydCB0aGUgb3B0aW9ucyBoZXJlIGFzIHR5cGVzY3JpcHQgc3RpbGwgZG9lc24ndCBrbm93IGFib3V0IGZ1dHVyZSB3ZWJhdXRobiB0eXBlcyAqL1xuICAgICAgICBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gbWFudWFsIHBhcnNpbmcgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgbmF0aXZlIG1ldGhvZFxuICAgIC8vIERlc3RydWN0dXJlIHRvIHNlcGFyYXRlIGZpZWxkcyB0aGF0IG5lZWQgdHJhbnNmb3JtYXRpb25cbiAgICBjb25zdCB7IGNoYWxsZW5nZTogY2hhbGxlbmdlU3RyLCB1c2VyOiB1c2VyT3B0cywgZXhjbHVkZUNyZWRlbnRpYWxzIH0gPSBvcHRpb25zLCByZXN0T3B0aW9ucyA9IF9fcmVzdChvcHRpb25zXG4gICAgLy8gQ29udmVydCBjaGFsbGVuZ2UgZnJvbSBiYXNlNjR1cmwgdG8gQXJyYXlCdWZmZXJcbiAgICAsIFtcImNoYWxsZW5nZVwiLCBcInVzZXJcIiwgXCJleGNsdWRlQ3JlZGVudGlhbHNcIl0pO1xuICAgIC8vIENvbnZlcnQgY2hhbGxlbmdlIGZyb20gYmFzZTY0dXJsIHRvIEFycmF5QnVmZmVyXG4gICAgY29uc3QgY2hhbGxlbmdlID0gYmFzZTY0VXJsVG9VaW50OEFycmF5KGNoYWxsZW5nZVN0cikuYnVmZmVyO1xuICAgIC8vIENvbnZlcnQgdXNlci5pZCBmcm9tIGJhc2U2NHVybCB0byBBcnJheUJ1ZmZlclxuICAgIGNvbnN0IHVzZXIgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHVzZXJPcHRzKSwgeyBpZDogYmFzZTY0VXJsVG9VaW50OEFycmF5KHVzZXJPcHRzLmlkKS5idWZmZXIgfSk7XG4gICAgLy8gQnVpbGQgdGhlIHJlc3VsdCBvYmplY3RcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3RPcHRpb25zKSwgeyBjaGFsbGVuZ2UsXG4gICAgICAgIHVzZXIgfSk7XG4gICAgLy8gT25seSBhZGQgZXhjbHVkZUNyZWRlbnRpYWxzIGlmIGl0IGV4aXN0c1xuICAgIGlmIChleGNsdWRlQ3JlZGVudGlhbHMgJiYgZXhjbHVkZUNyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LmV4Y2x1ZGVDcmVkZW50aWFscyA9IG5ldyBBcnJheShleGNsdWRlQ3JlZGVudGlhbHMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGNsdWRlQ3JlZGVudGlhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNyZWQgPSBleGNsdWRlQ3JlZGVudGlhbHNbaV07XG4gICAgICAgICAgICByZXN1bHQuZXhjbHVkZUNyZWRlbnRpYWxzW2ldID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjcmVkKSwgeyBpZDogYmFzZTY0VXJsVG9VaW50OEFycmF5KGNyZWQuaWQpLmJ1ZmZlciwgdHlwZTogY3JlZC50eXBlIHx8ICdwdWJsaWMta2V5JywgXG4gICAgICAgICAgICAgICAgLy8gQ2FzdCB0cmFuc3BvcnRzIHRvIGhhbmRsZSBmdXR1cmUgdHJhbnNwb3J0IHR5cGVzIGxpa2UgXCJjYWJsZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNwb3J0czogY3JlZC50cmFuc3BvcnRzIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvbnZlcnQgYmFzZTY0dXJsIGVuY29kZWQgc3RyaW5ncyBpbiBXZWJBdXRobiBjcmVkZW50aWFsIHJlcXVlc3Qgb3B0aW9ucyB0byBBcnJheUJ1ZmZlcnNcbiAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBXZWJBdXRobiBicm93c2VyIEFQSS5cbiAqIFN1cHBvcnRzIGJvdGggbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgcGFyc2VSZXF1ZXN0T3B0aW9uc0Zyb21KU09OIGFuZCBtYW51YWwgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIHtTZXJ2ZXJDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnN9IG9wdGlvbnMgLSBKU09OIG9wdGlvbnMgZnJvbSBzZXJ2ZXIgd2l0aCBiYXNlNjR1cmwgZW5jb2RlZCBmaWVsZHNcbiAqIEByZXR1cm5zIHtQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNGdXR1cmV9IE9wdGlvbnMgcmVhZHkgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoKVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTiBXM0MgV2ViQXV0aG4gU3BlYyAtIHBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDcmVkZW50aWFsIHJlcXVlc3Qgb3B0aW9ucyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgdGhlIG5hdGl2ZSBwYXJzZVJlcXVlc3RPcHRpb25zRnJvbUpTT04gbWV0aG9kIGlzIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgJ3BhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTicgaW4gUHVibGljS2V5Q3JlZGVudGlhbCAmJlxuICAgICAgICB0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbFxuICAgICAgICAgICAgLnBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBXZWJBdXRobiBMZXZlbCAzIG1ldGhvZFxuICAgICAgICByZXR1cm4gUHVibGljS2V5Q3JlZGVudGlhbC5wYXJzZVJlcXVlc3RPcHRpb25zRnJvbUpTT04ob3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG1hbnVhbCBwYXJzaW5nIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlIG5hdGl2ZSBtZXRob2RcbiAgICAvLyBEZXN0cnVjdHVyZSB0byBzZXBhcmF0ZSBmaWVsZHMgdGhhdCBuZWVkIHRyYW5zZm9ybWF0aW9uXG4gICAgY29uc3QgeyBjaGFsbGVuZ2U6IGNoYWxsZW5nZVN0ciwgYWxsb3dDcmVkZW50aWFscyB9ID0gb3B0aW9ucywgcmVzdE9wdGlvbnMgPSBfX3Jlc3Qob3B0aW9uc1xuICAgIC8vIENvbnZlcnQgY2hhbGxlbmdlIGZyb20gYmFzZTY0dXJsIHRvIEFycmF5QnVmZmVyXG4gICAgLCBbXCJjaGFsbGVuZ2VcIiwgXCJhbGxvd0NyZWRlbnRpYWxzXCJdKTtcbiAgICAvLyBDb252ZXJ0IGNoYWxsZW5nZSBmcm9tIGJhc2U2NHVybCB0byBBcnJheUJ1ZmZlclxuICAgIGNvbnN0IGNoYWxsZW5nZSA9IGJhc2U2NFVybFRvVWludDhBcnJheShjaGFsbGVuZ2VTdHIpLmJ1ZmZlcjtcbiAgICAvLyBCdWlsZCB0aGUgcmVzdWx0IG9iamVjdFxuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdE9wdGlvbnMpLCB7IGNoYWxsZW5nZSB9KTtcbiAgICAvLyBPbmx5IGFkZCBhbGxvd0NyZWRlbnRpYWxzIGlmIGl0IGV4aXN0c1xuICAgIGlmIChhbGxvd0NyZWRlbnRpYWxzICYmIGFsbG93Q3JlZGVudGlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuYWxsb3dDcmVkZW50aWFscyA9IG5ldyBBcnJheShhbGxvd0NyZWRlbnRpYWxzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsb3dDcmVkZW50aWFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY3JlZCA9IGFsbG93Q3JlZGVudGlhbHNbaV07XG4gICAgICAgICAgICByZXN1bHQuYWxsb3dDcmVkZW50aWFsc1tpXSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY3JlZCksIHsgaWQ6IGJhc2U2NFVybFRvVWludDhBcnJheShjcmVkLmlkKS5idWZmZXIsIHR5cGU6IGNyZWQudHlwZSB8fCAncHVibGljLWtleScsIFxuICAgICAgICAgICAgICAgIC8vIENhc3QgdHJhbnNwb3J0cyB0byBoYW5kbGUgZnV0dXJlIHRyYW5zcG9ydCB0eXBlcyBsaWtlIFwiY2FibGVcIlxuICAgICAgICAgICAgICAgIHRyYW5zcG9ydHM6IGNyZWQudHJhbnNwb3J0cyB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgcmVnaXN0cmF0aW9uL2Vucm9sbG1lbnQgY3JlZGVudGlhbCByZXNwb25zZSB0byBzZXJ2ZXIgZm9ybWF0LlxuICogU2VyaWFsaXplcyBiaW5hcnkgZmllbGRzIHRvIGJhc2U2NHVybCBmb3IgSlNPTiB0cmFuc21pc3Npb24uXG4gKiBTdXBwb3J0cyBib3RoIG5hdGl2ZSBXZWJBdXRobiBMZXZlbCAzIHRvSlNPTiBhbmQgbWFudWFsIGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7UmVnaXN0cmF0aW9uQ3JlZGVudGlhbH0gY3JlZGVudGlhbCAtIENyZWRlbnRpYWwgZnJvbSBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKClcbiAqIEByZXR1cm5zIHtSZWdpc3RyYXRpb25SZXNwb25zZUpTT059IEpTT04tc2VyaWFsaXphYmxlIGNyZWRlbnRpYWwgZm9yIHNlcnZlclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNkb20tcHVibGlja2V5Y3JlZGVudGlhbC10b2pzb24gVzNDIFdlYkF1dGhuIFNwZWMgLSB0b0pTT059XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25SZXNwb25zZShjcmVkZW50aWFsKSB7XG4gICAgdmFyIF9hO1xuICAgIC8vIENoZWNrIGlmIHRoZSBjcmVkZW50aWFsIGluc3RhbmNlIGhhcyB0aGUgdG9KU09OIG1ldGhvZFxuICAgIGlmICgndG9KU09OJyBpbiBjcmVkZW50aWFsICYmIHR5cGVvZiBjcmVkZW50aWFsLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBXZWJBdXRobiBMZXZlbCAzIG1ldGhvZFxuICAgICAgICByZXR1cm4gY3JlZGVudGlhbC50b0pTT04oKTtcbiAgICB9XG4gICAgY29uc3QgY3JlZGVudGlhbFdpdGhBdHRhY2htZW50ID0gY3JlZGVudGlhbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogY3JlZGVudGlhbC5pZCxcbiAgICAgICAgcmF3SWQ6IGNyZWRlbnRpYWwuaWQsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICBhdHRlc3RhdGlvbk9iamVjdDogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShjcmVkZW50aWFsLnJlc3BvbnNlLmF0dGVzdGF0aW9uT2JqZWN0KSksXG4gICAgICAgICAgICBjbGllbnREYXRhSlNPTjogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShjcmVkZW50aWFsLnJlc3BvbnNlLmNsaWVudERhdGFKU09OKSksXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdwdWJsaWMta2V5JyxcbiAgICAgICAgY2xpZW50RXh0ZW5zaW9uUmVzdWx0czogY3JlZGVudGlhbC5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCksXG4gICAgICAgIC8vIENvbnZlcnQgbnVsbCB0byB1bmRlZmluZWQgYW5kIGNhc3QgdG8gQXV0aGVudGljYXRvckF0dGFjaG1lbnQgdHlwZVxuICAgICAgICBhdXRoZW50aWNhdG9yQXR0YWNobWVudDogKChfYSA9IGNyZWRlbnRpYWxXaXRoQXR0YWNobWVudC5hdXRoZW50aWNhdG9yQXR0YWNobWVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdW5kZWZpbmVkKSxcbiAgICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0IGFuIGF1dGhlbnRpY2F0aW9uL3ZlcmlmaWNhdGlvbiBjcmVkZW50aWFsIHJlc3BvbnNlIHRvIHNlcnZlciBmb3JtYXQuXG4gKiBTZXJpYWxpemVzIGJpbmFyeSBmaWVsZHMgdG8gYmFzZTY0dXJsIGZvciBKU09OIHRyYW5zbWlzc2lvbi5cbiAqIFN1cHBvcnRzIGJvdGggbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgdG9KU09OIGFuZCBtYW51YWwgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIHtBdXRoZW50aWNhdGlvbkNyZWRlbnRpYWx9IGNyZWRlbnRpYWwgLSBDcmVkZW50aWFsIGZyb20gbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCgpXG4gKiBAcmV0dXJucyB7QXV0aGVudGljYXRpb25SZXNwb25zZUpTT059IEpTT04tc2VyaWFsaXphYmxlIGNyZWRlbnRpYWwgZm9yIHNlcnZlclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNkb20tcHVibGlja2V5Y3JlZGVudGlhbC10b2pzb24gVzNDIFdlYkF1dGhuIFNwZWMgLSB0b0pTT059XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdFJlc3BvbnNlKGNyZWRlbnRpYWwpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNyZWRlbnRpYWwgaW5zdGFuY2UgaGFzIHRoZSB0b0pTT04gbWV0aG9kXG4gICAgaWYgKCd0b0pTT04nIGluIGNyZWRlbnRpYWwgJiYgdHlwZW9mIGNyZWRlbnRpYWwudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgbWV0aG9kXG4gICAgICAgIHJldHVybiBjcmVkZW50aWFsLnRvSlNPTigpO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBtYW51YWwgY29udmVyc2lvbiBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRvSlNPTlxuICAgIC8vIEFjY2VzcyBhdXRoZW50aWNhdG9yQXR0YWNobWVudCB2aWEgdHlwZSBhc3NlcnRpb24gdG8gaGFuZGxlIFR5cGVTY3JpcHQgdmVyc2lvbiBkaWZmZXJlbmNlc1xuICAgIC8vIEBzaW1wbGV3ZWJhdXRobi90eXBlcyBpbmNsdWRlcyB0aGlzIHByb3BlcnR5IGJ1dCBiYXNlIFR5cGVTY3JpcHQgNC43LjQgZG9lc24ndFxuICAgIGNvbnN0IGNyZWRlbnRpYWxXaXRoQXR0YWNobWVudCA9IGNyZWRlbnRpYWw7XG4gICAgY29uc3QgY2xpZW50RXh0ZW5zaW9uUmVzdWx0cyA9IGNyZWRlbnRpYWwuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpO1xuICAgIGNvbnN0IGFzc2VydGlvblJlc3BvbnNlID0gY3JlZGVudGlhbC5yZXNwb25zZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogY3JlZGVudGlhbC5pZCxcbiAgICAgICAgcmF3SWQ6IGNyZWRlbnRpYWwuaWQsIC8vIFczQyBzcGVjIGV4cGVjdHMgcmF3SWQgdG8gbWF0Y2ggaWQgZm9yIEpTT04gZm9ybWF0XG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICBhdXRoZW50aWNhdG9yRGF0YTogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShhc3NlcnRpb25SZXNwb25zZS5hdXRoZW50aWNhdG9yRGF0YSkpLFxuICAgICAgICAgICAgY2xpZW50RGF0YUpTT046IGJ5dGVzVG9CYXNlNjRVUkwobmV3IFVpbnQ4QXJyYXkoYXNzZXJ0aW9uUmVzcG9uc2UuY2xpZW50RGF0YUpTT04pKSxcbiAgICAgICAgICAgIHNpZ25hdHVyZTogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShhc3NlcnRpb25SZXNwb25zZS5zaWduYXR1cmUpKSxcbiAgICAgICAgICAgIHVzZXJIYW5kbGU6IGFzc2VydGlvblJlc3BvbnNlLnVzZXJIYW5kbGVcbiAgICAgICAgICAgICAgICA/IGJ5dGVzVG9CYXNlNjRVUkwobmV3IFVpbnQ4QXJyYXkoYXNzZXJ0aW9uUmVzcG9uc2UudXNlckhhbmRsZSkpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdwdWJsaWMta2V5JyxcbiAgICAgICAgY2xpZW50RXh0ZW5zaW9uUmVzdWx0cyxcbiAgICAgICAgLy8gQ29udmVydCBudWxsIHRvIHVuZGVmaW5lZCBhbmQgY2FzdCB0byBBdXRoZW50aWNhdG9yQXR0YWNobWVudCB0eXBlXG4gICAgICAgIGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OiAoKF9hID0gY3JlZGVudGlhbFdpdGhBdHRhY2htZW50LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQpLFxuICAgIH07XG59XG4vKipcbiAqIEEgc2ltcGxlIHRlc3QgdG8gZGV0ZXJtaW5lIGlmIGEgaG9zdG5hbWUgaXMgYSBwcm9wZXJseS1mb3JtYXR0ZWQgZG9tYWluIG5hbWUuXG4gKiBDb25zaWRlcnMgbG9jYWxob3N0IHZhbGlkIGZvciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gKlxuICogQSBcInZhbGlkIGRvbWFpblwiIGlzIGRlZmluZWQgaGVyZTogaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN2YWxpZC1kb21haW5cbiAqXG4gKiBSZWdleCBzb3VyY2VkIGZyb20gaGVyZTpcbiAqIGh0dHBzOi8vd3d3Lm9yZWlsbHkuY29tL2xpYnJhcnkvdmlldy9yZWd1bGFyLWV4cHJlc3Npb25zLWNvb2tib29rLzk3ODE0NDkzMjc0NTMvY2gwOHMxNS5odG1sXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhvc3RuYW1lIC0gVGhlIGhvc3RuYW1lIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWxpZCBkb21haW4gb3IgbG9jYWxob3N0XG4gKiBAc2VlIHtAbGluayBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3ZhbGlkLWRvbWFpbiBXSEFUV0cgVVJMIFNwZWMgLSBWYWxpZCBEb21haW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRG9tYWluKGhvc3RuYW1lKSB7XG4gICAgcmV0dXJuIChcbiAgICAvLyBDb25zaWRlciBsb2NhbGhvc3QgdmFsaWQgYXMgd2VsbCBzaW5jZSBpdCdzIG9rYXkgd3J0IFNlY3VyZSBDb250ZXh0c1xuICAgIGhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fCAvXihbYS16MC05XSsoLVthLXowLTldKykqXFwuKStbYS16XXsyLH0kL2kudGVzdChob3N0bmFtZSkpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGJyb3dzZXIgaXMgY2FwYWJsZSBvZiBXZWJBdXRobi5cbiAqIENoZWNrcyBmb3IgbmVjZXNzYXJ5IFdlYiBBUElzOiBQdWJsaWNLZXlDcmVkZW50aWFsIGFuZCBDcmVkZW50aWFsIE1hbmFnZW1lbnQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYnJvd3NlciBzdXBwb3J0cyBXZWJBdXRoblxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1B1YmxpY0tleUNyZWRlbnRpYWwjYnJvd3Nlcl9jb21wYXRpYmlsaXR5IE1ETiAtIFB1YmxpY0tleUNyZWRlbnRpYWwgQnJvd3NlciBDb21wYXRpYmlsaXR5fVxuICovXG5mdW5jdGlvbiBicm93c2VyU3VwcG9ydHNXZWJBdXRobigpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiAhIShpc0Jyb3dzZXIoKSAmJlxuICAgICAgICAnUHVibGljS2V5Q3JlZGVudGlhbCcgaW4gd2luZG93ICYmXG4gICAgICAgIHdpbmRvdy5QdWJsaWNLZXlDcmVkZW50aWFsICYmXG4gICAgICAgICdjcmVkZW50aWFscycgaW4gbmF2aWdhdG9yICYmXG4gICAgICAgIHR5cGVvZiAoKF9hID0gbmF2aWdhdG9yID09PSBudWxsIHx8IG5hdmlnYXRvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yLmNyZWRlbnRpYWxzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY3JlYXRlKSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgKChfYiA9IG5hdmlnYXRvciA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvci5jcmVkZW50aWFscykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmdldCkgPT09ICdmdW5jdGlvbicpO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBXZWJBdXRobiBjcmVkZW50aWFsIHVzaW5nIHRoZSBicm93c2VyJ3MgY3JlZGVudGlhbHMgQVBJLlxuICogV3JhcHMgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpIHdpdGggZXJyb3IgaGFuZGxpbmcuXG4gKlxuICogQHBhcmFtIHtDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBpbmNsdWRpbmcgcHVibGljS2V5IHBhcmFtZXRlcnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlcXVlc3RSZXN1bHQ8UmVnaXN0cmF0aW9uQ3JlZGVudGlhbCwgV2ViQXV0aG5FcnJvcj4+fSBDcmVhdGVkIGNyZWRlbnRpYWwgb3IgZXJyb3JcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIFczQyBXZWJBdXRobiBTcGVjIC0gQ3JlYXRlIENyZWRlbnRpYWx9XG4gKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3JlZGVudGlhbHNDb250YWluZXIvY3JlYXRlIE1ETiAtIGNyZWRlbnRpYWxzLmNyZWF0ZX1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNyZWRlbnRpYWwob3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZShcbiAgICAgICAgLyoqIHdlIGFzc2VydCB0aGUgdHlwZSBoZXJlIHVudGlsIHR5cGVzY3JpcHQgdHlwZXMgYXJlIHVwZGF0ZWQgKi9cbiAgICAgICAgb3B0aW9ucyk7XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IFdlYkF1dGhuVW5rbm93bkVycm9yKCdFbXB0eSBjcmVkZW50aWFsIHJlc3BvbnNlJywgcmVzcG9uc2UpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShyZXNwb25zZSBpbnN0YW5jZW9mIFB1YmxpY0tleUNyZWRlbnRpYWwpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBXZWJBdXRoblVua25vd25FcnJvcignQnJvd3NlciByZXR1cm5lZCB1bmV4cGVjdGVkIGNyZWRlbnRpYWwgdHlwZScsIHJlc3BvbnNlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzcG9uc2UsIGVycm9yOiBudWxsIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICBlcnJvcjogaWRlbnRpZnlSZWdpc3RyYXRpb25FcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG4gKiBHZXQgYSBXZWJBdXRobiBjcmVkZW50aWFsIHVzaW5nIHRoZSBicm93c2VyJ3MgY3JlZGVudGlhbHMgQVBJLlxuICogV3JhcHMgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCgpIHdpdGggZXJyb3IgaGFuZGxpbmcuXG4gKlxuICogQHBhcmFtIHtDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGluY2x1ZGluZyBwdWJsaWNLZXkgcGFyYW1ldGVyc1xuICogQHJldHVybnMge1Byb21pc2U8UmVxdWVzdFJlc3VsdDxBdXRoZW50aWNhdGlvbkNyZWRlbnRpYWwsIFdlYkF1dGhuRXJyb3I+Pn0gUmV0cmlldmVkIGNyZWRlbnRpYWwgb3IgZXJyb3JcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1nZXRBc3NlcnRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBHZXQgQXNzZXJ0aW9ufVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NyZWRlbnRpYWxzQ29udGFpbmVyL2dldCBNRE4gLSBjcmVkZW50aWFscy5nZXR9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDcmVkZW50aWFsKG9wdGlvbnMpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoXG4gICAgICAgIC8qKiB3ZSBhc3NlcnQgdGhlIHR5cGUgaGVyZSB1bnRpbCB0eXBlc2NyaXB0IHR5cGVzIGFyZSB1cGRhdGVkICovXG4gICAgICAgIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBXZWJBdXRoblVua25vd25FcnJvcignRW1wdHkgY3JlZGVudGlhbCByZXNwb25zZScsIHJlc3BvbnNlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocmVzcG9uc2UgaW5zdGFuY2VvZiBQdWJsaWNLZXlDcmVkZW50aWFsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgV2ViQXV0aG5Vbmtub3duRXJyb3IoJ0Jyb3dzZXIgcmV0dXJuZWQgdW5leHBlY3RlZCBjcmVkZW50aWFsIHR5cGUnLCByZXNwb25zZSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3BvbnNlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgZXJyb3I6IGlkZW50aWZ5QXV0aGVudGljYXRpb25FcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ1JFQVRJT05fT1BUSU9OUyA9IHtcbiAgICBoaW50czogWydzZWN1cml0eS1rZXknXSxcbiAgICBhdXRoZW50aWNhdG9yU2VsZWN0aW9uOiB7XG4gICAgICAgIGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OiAnY3Jvc3MtcGxhdGZvcm0nLFxuICAgICAgICByZXF1aXJlUmVzaWRlbnRLZXk6IGZhbHNlLFxuICAgICAgICAvKiogc2V0IHRvIHByZWZlcnJlZCBiZWNhdXNlIG9sZGVyIHl1YmlrZXlzIGRvbid0IGhhdmUgUElOL0Jpb21ldHJpYyAqL1xuICAgICAgICB1c2VyVmVyaWZpY2F0aW9uOiAncHJlZmVycmVkJyxcbiAgICAgICAgcmVzaWRlbnRLZXk6ICdkaXNjb3VyYWdlZCcsXG4gICAgfSxcbiAgICBhdHRlc3RhdGlvbjogJ2RpcmVjdCcsXG59O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVRVUVTVF9PUFRJT05TID0ge1xuICAgIC8qKiBzZXQgdG8gcHJlZmVycmVkIGJlY2F1c2Ugb2xkZXIgeXViaWtleXMgZG9uJ3QgaGF2ZSBQSU4vQmlvbWV0cmljICovXG4gICAgdXNlclZlcmlmaWNhdGlvbjogJ3ByZWZlcnJlZCcsXG4gICAgaGludHM6IFsnc2VjdXJpdHkta2V5J10sXG4gICAgYXR0ZXN0YXRpb246ICdkaXJlY3QnLFxufTtcbmZ1bmN0aW9uIGRlZXBNZXJnZSguLi5zb3VyY2VzKSB7XG4gICAgY29uc3QgaXNPYmplY3QgPSAodmFsKSA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcbiAgICBjb25zdCBpc0FycmF5QnVmZmVyTGlrZSA9ICh2YWwpID0+IHZhbCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgaWYgKCFzb3VyY2UpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZSBhcnJheSByZWZlcmVuY2UsIGluY2x1ZGluZyB1bmlvbnMgbGlrZSBBdXRoZW50aWNhdG9yVHJhbnNwb3J0W11cbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUJ1ZmZlckxpa2UodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gcmVzdWx0W2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGV4aXN0aW5nKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGRlZXBNZXJnZShleGlzdGluZywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBkZWVwTWVyZ2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogTWVyZ2VzIFdlYkF1dGhuIGNyZWRlbnRpYWwgY3JlYXRpb24gb3B0aW9ucyB3aXRoIG92ZXJyaWRlcy5cbiAqIFNldHMgc2Vuc2libGUgZGVmYXVsdHMgZm9yIGF1dGhlbnRpY2F0b3Igc2VsZWN0aW9uIGFuZCBleHRlbnNpb25zLlxuICpcbiAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc0Z1dHVyZX0gYmFzZU9wdGlvbnMgLSBUaGUgYmFzZSBvcHRpb25zIGZyb20gdGhlIHNlcnZlclxuICogQHBhcmFtIHtQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zRnV0dXJlfSBvdmVycmlkZXMgLSBPcHRpb25hbCBvdmVycmlkZXMgdG8gYXBwbHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBmcmllbmRseU5hbWUgLSBPcHRpb25hbCBmcmllbmRseSBuYW1lIGZvciB0aGUgY3JlZGVudGlhbFxuICogQHJldHVybnMge1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNGdXR1cmV9IE1lcmdlZCBjcmVkZW50aWFsIGNyZWF0aW9uIG9wdGlvbnNcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jZGljdGRlZi1hdXRoZW50aWNhdG9yc2VsZWN0aW9uY3JpdGVyaWEgVzNDIFdlYkF1dGhuIFNwZWMgLSBBdXRoZW50aWNhdG9yU2VsZWN0aW9uQ3JpdGVyaWF9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMoYmFzZU9wdGlvbnMsIG92ZXJyaWRlcykge1xuICAgIHJldHVybiBkZWVwTWVyZ2UoREVGQVVMVF9DUkVBVElPTl9PUFRJT05TLCBiYXNlT3B0aW9ucywgb3ZlcnJpZGVzIHx8IHt9KTtcbn1cbi8qKlxuICogTWVyZ2VzIFdlYkF1dGhuIGNyZWRlbnRpYWwgcmVxdWVzdCBvcHRpb25zIHdpdGggb3ZlcnJpZGVzLlxuICogU2V0cyBzZW5zaWJsZSBkZWZhdWx0cyBmb3IgdXNlciB2ZXJpZmljYXRpb24gYW5kIGhpbnRzLlxuICpcbiAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBiYXNlT3B0aW9ucyAtIFRoZSBiYXNlIG9wdGlvbnMgZnJvbSB0aGUgc2VydmVyXG4gKiBAcGFyYW0ge1B1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc0Z1dHVyZX0gb3ZlcnJpZGVzIC0gT3B0aW9uYWwgb3ZlcnJpZGVzIHRvIGFwcGx5XG4gKiBAcmV0dXJucyB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBNZXJnZWQgY3JlZGVudGlhbCByZXF1ZXN0IG9wdGlvbnNcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jZGljdGRlZi1wdWJsaWNrZXljcmVkZW50aWFscmVxdWVzdG9wdGlvbnMgVzNDIFdlYkF1dGhuIFNwZWMgLSBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyhiYXNlT3B0aW9ucywgb3ZlcnJpZGVzKSB7XG4gICAgcmV0dXJuIGRlZXBNZXJnZShERUZBVUxUX1JFUVVFU1RfT1BUSU9OUywgYmFzZU9wdGlvbnMsIG92ZXJyaWRlcyB8fCB7fSk7XG59XG4vKipcbiAqIFdlYkF1dGhuIEFQSSB3cmFwcGVyIGZvciBTdXBhYmFzZSBBdXRoLlxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgZW5yb2xsaW5nLCBjaGFsbGVuZ2luZywgdmVyaWZ5aW5nLCBhdXRoZW50aWNhdGluZywgYW5kIHJlZ2lzdGVyaW5nIFdlYkF1dGhuIGNyZWRlbnRpYWxzLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBBUEkgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyBXM0MgV2ViQXV0aG4gU3BlY2lmaWNhdGlvbn1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfQXV0aGVudGljYXRpb25fQVBJIE1ETiAtIFdlYiBBdXRoZW50aWNhdGlvbiBBUEl9XG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJBdXRobkFwaSB7XG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgICAgICAvLyBCaW5kIGFsbCBtZXRob2RzIHNvIHRoZXkgY2FuIGJlIGRlc3RydWN0dXJlZFxuICAgICAgICB0aGlzLmVucm9sbCA9IHRoaXMuX2Vucm9sbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNoYWxsZW5nZSA9IHRoaXMuX2NoYWxsZW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnZlcmlmeSA9IHRoaXMuX3ZlcmlmeS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZSA9IHRoaXMuX2F1dGhlbnRpY2F0ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5fcmVnaXN0ZXIuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5yb2xsIGEgbmV3IFdlYkF1dGhuIGZhY3Rvci5cbiAgICAgKiBDcmVhdGVzIGFuIHVudmVyaWZpZWQgV2ViQXV0aG4gZmFjdG9yIHRoYXQgbXVzdCBiZSB2ZXJpZmllZCB3aXRoIGEgY3JlZGVudGlhbC5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWwgVGhpcyBtZXRob2QgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICAgICAqIEBwYXJhbSB7T21pdDxNRkFFbnJvbGxXZWJhdXRoblBhcmFtcywgJ2ZhY3RvclR5cGUnPn0gcGFyYW1zIC0gRW5yb2xsbWVudCBwYXJhbWV0ZXJzIChmcmllbmRseU5hbWUgcmVxdWlyZWQpXG4gICAgICogQHJldHVybnMge1Byb21pc2U8QXV0aE1GQUVucm9sbFdlYmF1dGhuUmVzcG9uc2U+fSBFbnJvbGxlZCBmYWN0b3IgZGV0YWlscyBvciBlcnJvclxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1yZWdpc3RlcmluZy1hLW5ldy1jcmVkZW50aWFsIFczQyBXZWJBdXRobiBTcGVjIC0gUmVnaXN0ZXJpbmcgYSBOZXcgQ3JlZGVudGlhbH1cbiAgICAgKi9cbiAgICBhc3luYyBfZW5yb2xsKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQubWZhLmVucm9sbChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyksIHsgZmFjdG9yVHlwZTogJ3dlYmF1dGhuJyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYWxsZW5nZSBmb3IgV2ViQXV0aG4gY3JlZGVudGlhbCBjcmVhdGlvbiBvciBhdXRoZW50aWNhdGlvbi5cbiAgICAgKiBDb21iaW5lcyBzZXJ2ZXIgY2hhbGxlbmdlIHdpdGggYnJvd3NlciBjcmVkZW50aWFsIG9wZXJhdGlvbnMuXG4gICAgICogSGFuZGxlcyBib3RoIHJlZ2lzdHJhdGlvbiAoY3JlYXRlKSBhbmQgYXV0aGVudGljYXRpb24gKHJlcXVlc3QpIGZsb3dzLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbCBUaGlzIG1ldGhvZCBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzXG4gICAgICogQHBhcmFtIHtNRkFDaGFsbGVuZ2VXZWJhdXRoblBhcmFtcyAmIHsgZnJpZW5kbHlOYW1lPzogc3RyaW5nOyBzaWduYWw/OiBBYm9ydFNpZ25hbCB9fSBwYXJhbXMgLSBDaGFsbGVuZ2UgcGFyYW1ldGVycyBpbmNsdWRpbmcgZmFjdG9ySWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3ZlcnJpZGVzIC0gQWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gbmF2aWdhdG9yLmNyZWRlbnRpYWxzXG4gICAgICogQHBhcmFtIHtQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zRnV0dXJlfSBvdmVycmlkZXMuY3JlYXRlIC0gT3ZlcnJpZGUgb3B0aW9ucyBmb3IgY3JlZGVudGlhbCBjcmVhdGlvblxuICAgICAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBvdmVycmlkZXMucmVxdWVzdCAtIE92ZXJyaWRlIG9wdGlvbnMgZm9yIGNyZWRlbnRpYWwgcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFJlcXVlc3RSZXN1bHQ+fSBDaGFsbGVuZ2UgcmVzcG9uc2Ugd2l0aCBjcmVkZW50aWFsIG9yIGVycm9yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWNyZWRlbnRpYWwtY3JlYXRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBDcmVkZW50aWFsIENyZWF0aW9ufVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi12ZXJpZnlpbmctYXNzZXJ0aW9uIFczQyBXZWJBdXRobiBTcGVjIC0gVmVyaWZ5aW5nIEFzc2VydGlvbn1cbiAgICAgKi9cbiAgICBhc3luYyBfY2hhbGxlbmdlKHsgZmFjdG9ySWQsIHdlYmF1dGhuLCBmcmllbmRseU5hbWUsIHNpZ25hbCwgfSwgb3ZlcnJpZGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBHZXQgY2hhbGxlbmdlIGZyb20gc2VydmVyIHVzaW5nIHRoZSBjbGllbnQncyBNRkEgbWV0aG9kc1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBjaGFsbGVuZ2VSZXNwb25zZSwgZXJyb3I6IGNoYWxsZW5nZUVycm9yIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tZmEuY2hhbGxlbmdlKHtcbiAgICAgICAgICAgICAgICBmYWN0b3JJZCxcbiAgICAgICAgICAgICAgICB3ZWJhdXRobixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFsbGVuZ2VSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiBjaGFsbGVuZ2VFcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWJvcnRTaWduYWwgPSBzaWduYWwgIT09IG51bGwgJiYgc2lnbmFsICE9PSB2b2lkIDAgPyBzaWduYWwgOiB3ZWJBdXRobkFib3J0U2VydmljZS5jcmVhdGVOZXdBYm9ydFNpZ25hbCgpO1xuICAgICAgICAgICAgLyoqIHdlYmF1dGhuIHdpbGwgZmFpbCBpZiBlaXRoZXIgb2YgdGhlIG5hbWUvZGlzcGxheW5hbWUgYXJlIGJsYW5rICovXG4gICAgICAgICAgICBpZiAoY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4udHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHVzZXIgfSA9IGNoYWxsZW5nZVJlc3BvbnNlLndlYmF1dGhuLmNyZWRlbnRpYWxfb3B0aW9ucy5wdWJsaWNLZXk7XG4gICAgICAgICAgICAgICAgaWYgKCF1c2VyLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lID0gYCR7dXNlci5pZH06JHtmcmllbmRseU5hbWV9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF1c2VyLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXIuZGlzcGxheU5hbWUgPSB1c2VyLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY3JlYXRlJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gbWVyZ2VDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zKGNoYWxsZW5nZVJlc3BvbnNlLndlYmF1dGhuLmNyZWRlbnRpYWxfb3B0aW9ucy5wdWJsaWNLZXksIG92ZXJyaWRlcyA9PT0gbnVsbCB8fCBvdmVycmlkZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG92ZXJyaWRlcy5jcmVhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBjcmVhdGVDcmVkZW50aWFsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleTogb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VJZDogY2hhbGxlbmdlUmVzcG9uc2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdyZXF1ZXN0Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gbWVyZ2VDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMoY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zLnB1YmxpY0tleSwgb3ZlcnJpZGVzID09PSBudWxsIHx8IG92ZXJyaWRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3ZlcnJpZGVzLnJlcXVlc3QpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBnZXRDcmVkZW50aWFsKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zKSwgeyBwdWJsaWNLZXk6IG9wdGlvbnMsIHNpZ25hbDogYWJvcnRTaWduYWwgfSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VJZDogY2hhbGxlbmdlUmVzcG9uc2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignVW5leHBlY3RlZCBlcnJvciBpbiBjaGFsbGVuZ2UnLCBlcnJvciksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFZlcmlmeSBhIFdlYkF1dGhuIGNyZWRlbnRpYWwgd2l0aCB0aGUgc2VydmVyLlxuICAgICAqIENvbXBsZXRlcyB0aGUgV2ViQXV0aG4gY2VyZW1vbnkgYnkgc2VuZGluZyB0aGUgY3JlZGVudGlhbCB0byB0aGUgc2VydmVyIGZvciB2ZXJpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsIFRoaXMgbWV0aG9kIGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmNoYWxsZW5nZUlkIC0gSUQgb2YgdGhlIGNoYWxsZW5nZSBiZWluZyB2ZXJpZmllZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuZmFjdG9ySWQgLSBJRCBvZiB0aGUgV2ViQXV0aG4gZmFjdG9yXG4gICAgICogQHBhcmFtIHtNRkFWZXJpZnlXZWJhdXRoblBhcmFtczxUPlsnd2ViYXV0aG4nXX0gcGFyYW1zLndlYmF1dGhuIC0gV2ViQXV0aG4gY3JlZGVudGlhbCByZXNwb25zZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEF1dGhNRkFWZXJpZnlSZXNwb25zZT59IFZlcmlmaWNhdGlvbiByZXN1bHQgd2l0aCBzZXNzaW9uIG9yIGVycm9yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXZlcmlmeWluZy1hc3NlcnRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBWZXJpZnlpbmcgYW4gQXV0aGVudGljYXRpb24gQXNzZXJ0aW9ufVxuICAgICAqICovXG4gICAgYXN5bmMgX3ZlcmlmeSh7IGNoYWxsZW5nZUlkLCBmYWN0b3JJZCwgd2ViYXV0aG4sIH0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50Lm1mYS52ZXJpZnkoe1xuICAgICAgICAgICAgZmFjdG9ySWQsXG4gICAgICAgICAgICBjaGFsbGVuZ2VJZCxcbiAgICAgICAgICAgIHdlYmF1dGhuOiB3ZWJhdXRobixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXBsZXRlIFdlYkF1dGhuIGF1dGhlbnRpY2F0aW9uIGZsb3cuXG4gICAgICogUGVyZm9ybXMgY2hhbGxlbmdlIGFuZCB2ZXJpZmljYXRpb24gaW4gYSBzaW5nbGUgb3BlcmF0aW9uIGZvciBleGlzdGluZyBjcmVkZW50aWFscy5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWwgVGhpcyBtZXRob2QgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBBdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5mYWN0b3JJZCAtIElEIG9mIHRoZSBXZWJBdXRobiBmYWN0b3IgdG8gYXV0aGVudGljYXRlIHdpdGhcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLndlYmF1dGhuIC0gV2ViQXV0aG4gY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMud2ViYXV0aG4ucnBJZCAtIFJlbHlpbmcgUGFydHkgSUQgKGRlZmF1bHRzIHRvIGN1cnJlbnQgaG9zdG5hbWUpXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGFyYW1zLndlYmF1dGhuLnJwT3JpZ2lucyAtIEFsbG93ZWQgb3JpZ2lucyAoZGVmYXVsdHMgdG8gY3VycmVudCBvcmlnaW4pXG4gICAgICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gcGFyYW1zLndlYmF1dGhuLnNpZ25hbCAtIE9wdGlvbmFsIGFib3J0IHNpZ25hbFxuICAgICAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBvdmVycmlkZXMgLSBPdmVycmlkZSBvcHRpb25zIGZvciBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0XG4gICAgICogQHJldHVybnMge1Byb21pc2U8UmVxdWVzdFJlc3VsdDxBdXRoTUZBVmVyaWZ5UmVzcG9uc2VEYXRhLCBXZWJBdXRobkVycm9yIHwgQXV0aEVycm9yPj59IEF1dGhlbnRpY2F0aW9uIHJlc3VsdFxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1hdXRoZW50aWNhdGlvbiBXM0MgV2ViQXV0aG4gU3BlYyAtIEF1dGhlbnRpY2F0aW9uIENlcmVtb255fVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMgTUROIC0gUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zfVxuICAgICAqL1xuICAgIGFzeW5jIF9hdXRoZW50aWNhdGUoeyBmYWN0b3JJZCwgd2ViYXV0aG46IHsgcnBJZCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lIDogdW5kZWZpbmVkLCBycE9yaWdpbnMgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IFt3aW5kb3cubG9jYXRpb24ub3JpZ2luXSA6IHVuZGVmaW5lZCwgc2lnbmFsLCB9ID0ge30sIH0sIG92ZXJyaWRlcykge1xuICAgICAgICBpZiAoIXJwSWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEF1dGhFcnJvcigncnBJZCBpcyByZXF1aXJlZCBmb3IgV2ViQXV0aG4gYXV0aGVudGljYXRpb24nKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghYnJvd3NlclN1cHBvcnRzV2ViQXV0aG4oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFdlYkF1dGhuJywgbnVsbCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdldCBjaGFsbGVuZ2UgYW5kIGNyZWRlbnRpYWxcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogY2hhbGxlbmdlUmVzcG9uc2UsIGVycm9yOiBjaGFsbGVuZ2VFcnJvciB9ID0gYXdhaXQgdGhpcy5jaGFsbGVuZ2Uoe1xuICAgICAgICAgICAgICAgIGZhY3RvcklkLFxuICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7IHJwSWQsIHJwT3JpZ2lucyB9LFxuICAgICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgIH0sIHsgcmVxdWVzdDogb3ZlcnJpZGVzIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFsbGVuZ2VSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiBjaGFsbGVuZ2VFcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyB3ZWJhdXRobiB9ID0gY2hhbGxlbmdlUmVzcG9uc2U7XG4gICAgICAgICAgICAvLyBWZXJpZnkgY3JlZGVudGlhbFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeSh7XG4gICAgICAgICAgICAgICAgZmFjdG9ySWQsXG4gICAgICAgICAgICAgICAgY2hhbGxlbmdlSWQ6IGNoYWxsZW5nZVJlc3BvbnNlLmNoYWxsZW5nZUlkLFxuICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHdlYmF1dGhuLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJwSWQsXG4gICAgICAgICAgICAgICAgICAgIHJwT3JpZ2lucyxcbiAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogd2ViYXV0aG4uY3JlZGVudGlhbF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEF1dGhVbmtub3duRXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IgaW4gYXV0aGVudGljYXRlJywgZXJyb3IpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wbGV0ZSBXZWJBdXRobiByZWdpc3RyYXRpb24gZmxvdy5cbiAgICAgKiBQZXJmb3JtcyBlbnJvbGxtZW50LCBjaGFsbGVuZ2UsIGFuZCB2ZXJpZmljYXRpb24gaW4gYSBzaW5nbGUgb3BlcmF0aW9uIGZvciBuZXcgY3JlZGVudGlhbHMuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsIFRoaXMgbWV0aG9kIGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gUmVnaXN0cmF0aW9uIHBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmZyaWVuZGx5TmFtZSAtIFVzZXItZnJpZW5kbHkgbmFtZSBmb3IgdGhlIGNyZWRlbnRpYWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJwSWQgLSBSZWx5aW5nIFBhcnR5IElEIChkZWZhdWx0cyB0byBjdXJyZW50IGhvc3RuYW1lKVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhcmFtcy5ycE9yaWdpbnMgLSBBbGxvd2VkIG9yaWdpbnMgKGRlZmF1bHRzIHRvIGN1cnJlbnQgb3JpZ2luKVxuICAgICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IHBhcmFtcy5zaWduYWwgLSBPcHRpb25hbCBhYm9ydCBzaWduYWxcbiAgICAgKiBAcGFyYW0ge1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNGdXR1cmV9IG92ZXJyaWRlcyAtIE92ZXJyaWRlIG9wdGlvbnMgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXF1ZXN0UmVzdWx0PEF1dGhNRkFWZXJpZnlSZXNwb25zZURhdGEsIFdlYkF1dGhuRXJyb3IgfCBBdXRoRXJyb3I+Pn0gUmVnaXN0cmF0aW9uIHJlc3VsdFxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1yZWdpc3RlcmluZy1hLW5ldy1jcmVkZW50aWFsIFczQyBXZWJBdXRobiBTcGVjIC0gUmVnaXN0cmF0aW9uIENlcmVtb255fVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zIE1ETiAtIFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnN9XG4gICAgICovXG4gICAgYXN5bmMgX3JlZ2lzdGVyKHsgZnJpZW5kbHlOYW1lLCB3ZWJhdXRobjogeyBycElkID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgOiB1bmRlZmluZWQsIHJwT3JpZ2lucyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gW3dpbmRvdy5sb2NhdGlvbi5vcmlnaW5dIDogdW5kZWZpbmVkLCBzaWduYWwsIH0gPSB7fSwgfSwgb3ZlcnJpZGVzKSB7XG4gICAgICAgIGlmICghcnBJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aEVycm9yKCdycElkIGlzIHJlcXVpcmVkIGZvciBXZWJBdXRobiByZWdpc3RyYXRpb24nKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghYnJvd3NlclN1cHBvcnRzV2ViQXV0aG4oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFdlYkF1dGhuJywgbnVsbCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVucm9sbCBmYWN0b3JcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogZmFjdG9yLCBlcnJvcjogZW5yb2xsRXJyb3IgfSA9IGF3YWl0IHRoaXMuX2Vucm9sbCh7XG4gICAgICAgICAgICAgICAgZnJpZW5kbHlOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWZhY3Rvcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpZW50Lm1mYVxuICAgICAgICAgICAgICAgICAgICAubGlzdEZhY3RvcnMoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoZmFjdG9ycykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2EgPSBmYWN0b3JzLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hbGwuZmluZCgodikgPT4gdi5mYWN0b3JfdHlwZSA9PT0gJ3dlYmF1dGhuJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdi5mcmllbmRseV9uYW1lID09PSBmcmllbmRseU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHYuc3RhdHVzICE9PSAndW52ZXJpZmllZCcpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChmYWN0b3IpID0+IChmYWN0b3IgPyB0aGlzLmNsaWVudC5tZmEudW5lbnJvbGwoeyBmYWN0b3JJZDogZmFjdG9yID09PSBudWxsIHx8IGZhY3RvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmFjdG9yLmlkIH0pIDogdm9pZCAwKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3I6IGVucm9sbEVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgY2hhbGxlbmdlIGFuZCBjcmVhdGUgY3JlZGVudGlhbFxuICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBjaGFsbGVuZ2VSZXNwb25zZSwgZXJyb3I6IGNoYWxsZW5nZUVycm9yIH0gPSBhd2FpdCB0aGlzLl9jaGFsbGVuZ2Uoe1xuICAgICAgICAgICAgICAgIGZhY3RvcklkOiBmYWN0b3IuaWQsXG4gICAgICAgICAgICAgICAgZnJpZW5kbHlOYW1lOiBmYWN0b3IuZnJpZW5kbHlfbmFtZSxcbiAgICAgICAgICAgICAgICB3ZWJhdXRobjogeyBycElkLCBycE9yaWdpbnMgfSxcbiAgICAgICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgY3JlYXRlOiBvdmVycmlkZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghY2hhbGxlbmdlUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvcjogY2hhbGxlbmdlRXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnkoe1xuICAgICAgICAgICAgICAgIGZhY3RvcklkOiBmYWN0b3IuaWQsXG4gICAgICAgICAgICAgICAgY2hhbGxlbmdlSWQ6IGNoYWxsZW5nZVJlc3BvbnNlLmNoYWxsZW5nZUlkLFxuICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgIHJwSWQsXG4gICAgICAgICAgICAgICAgICAgIHJwT3JpZ2lucyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4uY3JlZGVudGlhbF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEF1dGhVbmtub3duRXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IgaW4gcmVnaXN0ZXInLCBlcnJvciksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViYXV0aG4uanMubWFwIl0sIm5hbWVzIjpbIl9fcmVzdCIsImJhc2U2NFVybFRvVWludDhBcnJheSIsImJ5dGVzVG9CYXNlNjRVUkwiLCJBdXRoRXJyb3IiLCJBdXRoVW5rbm93bkVycm9yIiwiaXNBdXRoRXJyb3IiLCJpc0Jyb3dzZXIiLCJpZGVudGlmeUF1dGhlbnRpY2F0aW9uRXJyb3IiLCJpZGVudGlmeVJlZ2lzdHJhdGlvbkVycm9yIiwiaXNXZWJBdXRobkVycm9yIiwiV2ViQXV0aG5FcnJvciIsIldlYkF1dGhuVW5rbm93bkVycm9yIiwiV2ViQXV0aG5BYm9ydFNlcnZpY2UiLCJjcmVhdGVOZXdBYm9ydFNpZ25hbCIsImNvbnRyb2xsZXIiLCJhYm9ydEVycm9yIiwiRXJyb3IiLCJuYW1lIiwiYWJvcnQiLCJuZXdDb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwic2lnbmFsIiwiY2FuY2VsQ2VyZW1vbnkiLCJ1bmRlZmluZWQiLCJ3ZWJBdXRobkFib3J0U2VydmljZSIsImRlc2VyaWFsaXplQ3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyIsIm9wdGlvbnMiLCJQdWJsaWNLZXlDcmVkZW50aWFsIiwicGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTiIsImNoYWxsZW5nZSIsImNoYWxsZW5nZVN0ciIsInVzZXIiLCJ1c2VyT3B0cyIsImV4Y2x1ZGVDcmVkZW50aWFscyIsInJlc3RPcHRpb25zIiwiYnVmZmVyIiwiT2JqZWN0IiwiYXNzaWduIiwiaWQiLCJyZXN1bHQiLCJsZW5ndGgiLCJBcnJheSIsImkiLCJjcmVkIiwidHlwZSIsInRyYW5zcG9ydHMiLCJkZXNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyIsInBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTiIsImFsbG93Q3JlZGVudGlhbHMiLCJzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25SZXNwb25zZSIsImNyZWRlbnRpYWwiLCJfYSIsInRvSlNPTiIsImNyZWRlbnRpYWxXaXRoQXR0YWNobWVudCIsInJhd0lkIiwicmVzcG9uc2UiLCJhdHRlc3RhdGlvbk9iamVjdCIsIlVpbnQ4QXJyYXkiLCJjbGllbnREYXRhSlNPTiIsImNsaWVudEV4dGVuc2lvblJlc3VsdHMiLCJnZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzIiwiYXV0aGVudGljYXRvckF0dGFjaG1lbnQiLCJzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdFJlc3BvbnNlIiwiYXNzZXJ0aW9uUmVzcG9uc2UiLCJhdXRoZW50aWNhdG9yRGF0YSIsInNpZ25hdHVyZSIsInVzZXJIYW5kbGUiLCJpc1ZhbGlkRG9tYWluIiwiaG9zdG5hbWUiLCJ0ZXN0IiwiYnJvd3NlclN1cHBvcnRzV2ViQXV0aG4iLCJfYiIsIndpbmRvdyIsIm5hdmlnYXRvciIsImNyZWRlbnRpYWxzIiwiY3JlYXRlIiwiZ2V0IiwiY3JlYXRlQ3JlZGVudGlhbCIsImRhdGEiLCJlcnJvciIsImVyciIsImdldENyZWRlbnRpYWwiLCJERUZBVUxUX0NSRUFUSU9OX09QVElPTlMiLCJoaW50cyIsImF1dGhlbnRpY2F0b3JTZWxlY3Rpb24iLCJyZXF1aXJlUmVzaWRlbnRLZXkiLCJ1c2VyVmVyaWZpY2F0aW9uIiwicmVzaWRlbnRLZXkiLCJhdHRlc3RhdGlvbiIsIkRFRkFVTFRfUkVRVUVTVF9PUFRJT05TIiwiZGVlcE1lcmdlIiwic291cmNlcyIsImlzT2JqZWN0IiwidmFsIiwiaXNBcnJheSIsImlzQXJyYXlCdWZmZXJMaWtlIiwiQXJyYXlCdWZmZXIiLCJpc1ZpZXciLCJzb3VyY2UiLCJrZXkiLCJ2YWx1ZSIsImV4aXN0aW5nIiwibWVyZ2VDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zIiwiYmFzZU9wdGlvbnMiLCJvdmVycmlkZXMiLCJtZXJnZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyIsIldlYkF1dGhuQXBpIiwiY29uc3RydWN0b3IiLCJjbGllbnQiLCJlbnJvbGwiLCJfZW5yb2xsIiwiYmluZCIsIl9jaGFsbGVuZ2UiLCJ2ZXJpZnkiLCJfdmVyaWZ5IiwiYXV0aGVudGljYXRlIiwiX2F1dGhlbnRpY2F0ZSIsInJlZ2lzdGVyIiwiX3JlZ2lzdGVyIiwicGFyYW1zIiwibWZhIiwiZmFjdG9yVHlwZSIsImZhY3RvcklkIiwid2ViYXV0aG4iLCJmcmllbmRseU5hbWUiLCJjaGFsbGVuZ2VSZXNwb25zZSIsImNoYWxsZW5nZUVycm9yIiwiYWJvcnRTaWduYWwiLCJjcmVkZW50aWFsX29wdGlvbnMiLCJwdWJsaWNLZXkiLCJkaXNwbGF5TmFtZSIsImNoYWxsZW5nZUlkIiwiY3JlZGVudGlhbF9yZXNwb25zZSIsInJlcXVlc3QiLCJycElkIiwibG9jYXRpb24iLCJycE9yaWdpbnMiLCJvcmlnaW4iLCJmYWN0b3IiLCJlbnJvbGxFcnJvciIsImxpc3RGYWN0b3JzIiwidGhlbiIsImZhY3RvcnMiLCJhbGwiLCJmaW5kIiwidiIsImZhY3Rvcl90eXBlIiwiZnJpZW5kbHlfbmFtZSIsInN0YXR1cyIsInVuZW5yb2xsIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js":
|
||
/*!****************************************************************************!*\
|
||
!*** ./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js ***!
|
||
\****************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FunctionsClient: () => (/* binding */ FunctionsClient)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ \"(ssr)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helper */ \"(ssr)/./node_modules/@supabase/functions-js/dist/module/helper.js\");\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types */ \"(ssr)/./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 * 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_0__.FunctionRegion.Any } = {}){\n this.url = url;\n this.headers = headers;\n this.region = region;\n this.fetch = (0,_helper__WEBPACK_IMPORTED_MODULE_1__.resolveFetch)(customFetch);\n }\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 ${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_2__.__awaiter)(this, arguments, void 0, function*(functionName, options = {}) {\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(`${this.url}/${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_0__.FunctionsFetchError(fetchError);\n });\n const isRelayError = response.headers.get(\"x-relay-error\");\n if (isRelayError && isRelayError === \"true\") {\n throw new _types__WEBPACK_IMPORTED_MODULE_0__.FunctionsRelayError(response);\n }\n if (!response.ok) {\n throw new _types__WEBPACK_IMPORTED_MODULE_0__.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_0__.FunctionsHttpError || error instanceof _types__WEBPACK_IMPORTED_MODULE_0__.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} //# sourceMappingURL=FunctionsClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcy9kaXN0L21vZHVsZS9GdW5jdGlvbnNDbGllbnQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFrQztBQUNNO0FBQ2dFO0FBQ3hHOztDQUVDLEdBQ00sTUFBTU07SUFDVDs7Ozs7Ozs7Ozs7O0tBWUMsR0FDREMsWUFBWUMsR0FBRyxFQUFFLEVBQUVDLFVBQVUsQ0FBQyxDQUFDLEVBQUVDLFdBQVcsRUFBRUMsU0FBU1Qsa0RBQWNBLENBQUNVLEdBQUcsRUFBRyxHQUFHLENBQUMsQ0FBQyxDQUFFO1FBQy9FLElBQUksQ0FBQ0osR0FBRyxHQUFHQTtRQUNYLElBQUksQ0FBQ0MsT0FBTyxHQUFHQTtRQUNmLElBQUksQ0FBQ0UsTUFBTSxHQUFHQTtRQUNkLElBQUksQ0FBQ0UsS0FBSyxHQUFHWixxREFBWUEsQ0FBQ1M7SUFDOUI7SUFDQTs7Ozs7OztLQU9DLEdBQ0RJLFFBQVFDLEtBQUssRUFBRTtRQUNYLElBQUksQ0FBQ04sT0FBTyxDQUFDTyxhQUFhLEdBQUcsQ0FBQyxPQUFPLEVBQUVELE1BQU0sQ0FBQztJQUNsRDtJQUNBOzs7Ozs7Ozs7O0tBVUMsR0FDREUsT0FBT0MsY0FBYyxFQUFFO1FBQ25CLE9BQU9sQixnREFBU0EsQ0FBQyxJQUFJLEVBQUVtQixXQUFXLEtBQUssR0FBRyxVQUFXQyxZQUFZLEVBQUVDLFVBQVUsQ0FBQyxDQUFDO1lBQzNFLElBQUlDO1lBQ0osSUFBSUM7WUFDSixJQUFJQztZQUNKLElBQUk7Z0JBQ0EsTUFBTSxFQUFFZixPQUFPLEVBQUVnQixNQUFNLEVBQUVDLE1BQU1DLFlBQVksRUFBRUMsTUFBTSxFQUFFQyxPQUFPLEVBQUUsR0FBR1I7Z0JBQ2pFLElBQUlTLFdBQVcsQ0FBQztnQkFDaEIsSUFBSSxFQUFFbkIsTUFBTSxFQUFFLEdBQUdVO2dCQUNqQixJQUFJLENBQUNWLFFBQVE7b0JBQ1RBLFNBQVMsSUFBSSxDQUFDQSxNQUFNO2dCQUN4QjtnQkFDQSw4Q0FB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QUk7Z0JBQzlCLE9BQ0ssSUFBSUosaUJBQWlCLDhCQUN0QkEsaUJBQWlCLG1CQUFtQjtvQkFDcENHLE9BQU8sTUFBTVgsU0FBU2EsSUFBSTtnQkFDOUIsT0FDSyxJQUFJTCxpQkFBaUIscUJBQXFCO29CQUMzQ0csT0FBT1g7Z0JBQ1gsT0FDSyxJQUFJUSxpQkFBaUIsdUJBQXVCO29CQUM3Q0csT0FBTyxNQUFNWCxTQUFTYyxRQUFRO2dCQUNsQyxPQUNLO29CQUNELGtCQUFrQjtvQkFDbEJILE9BQU8sTUFBTVgsU0FBU2UsSUFBSTtnQkFDOUI7Z0JBQ0EsT0FBTztvQkFBRUo7b0JBQU1LLE9BQU87b0JBQU1oQjtnQkFBUztZQUN6QyxFQUNBLE9BQU9nQixPQUFPO2dCQUNWLE9BQU87b0JBQ0hMLE1BQU07b0JBQ05LO29CQUNBaEIsVUFBVWdCLGlCQUFpQjVELHNEQUFrQkEsSUFBSTRELGlCQUFpQjNELHVEQUFtQkEsR0FDL0UyRCxNQUFNQyxPQUFPLEdBQ2JDO2dCQUNWO1lBQ0osU0FDUTtnQkFDSixrQ0FBa0M7Z0JBQ2xDLElBQUkzQyxXQUFXO29CQUNYNEMsYUFBYTVDO2dCQUNqQjtZQUNKO1FBQ0o7SUFDSjtBQUNKLEVBQ0EsMkNBQTJDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9mdW5jdGlvbnMtanMvZGlzdC9tb2R1bGUvRnVuY3Rpb25zQ2xpZW50LmpzPzVjMzgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyByZXNvbHZlRmV0Y2ggfSBmcm9tICcuL2hlbHBlcic7XG5pbXBvcnQgeyBGdW5jdGlvblJlZ2lvbiwgRnVuY3Rpb25zRmV0Y2hFcnJvciwgRnVuY3Rpb25zSHR0cEVycm9yLCBGdW5jdGlvbnNSZWxheUVycm9yLCB9IGZyb20gJy4vdHlwZXMnO1xuLyoqXG4gKiBDbGllbnQgZm9yIGludm9raW5nIFN1cGFiYXNlIEVkZ2UgRnVuY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25zQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZ1bmN0aW9ucyBjbGllbnQgYm91bmQgdG8gYW4gRWRnZSBGdW5jdGlvbnMgVVJMLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IEZ1bmN0aW9uc0NsaWVudCwgRnVuY3Rpb25SZWdpb24gfSBmcm9tICdAc3VwYWJhc2UvZnVuY3Rpb25zLWpzJ1xuICAgICAqXG4gICAgICogY29uc3QgZnVuY3Rpb25zID0gbmV3IEZ1bmN0aW9uc0NsaWVudCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL2Z1bmN0aW9ucy92MScsIHtcbiAgICAgKiAgIGhlYWRlcnM6IHsgYXBpa2V5OiAncHVibGljLWFub24ta2V5JyB9LFxuICAgICAqICAgcmVnaW9uOiBGdW5jdGlvblJlZ2lvbi5Vc0Vhc3QxLFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJsLCB7IGhlYWRlcnMgPSB7fSwgY3VzdG9tRmV0Y2gsIHJlZ2lvbiA9IEZ1bmN0aW9uUmVnaW9uLkFueSwgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB0aGlzLnJlZ2lvbiA9IHJlZ2lvbjtcbiAgICAgICAgdGhpcy5mZXRjaCA9IHJlc29sdmVGZXRjaChjdXN0b21GZXRjaCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGF1dGhvcml6YXRpb24gaGVhZGVyXG4gICAgICogQHBhcmFtIHRva2VuIC0gdGhlIG5ldyBqd3QgdG9rZW4gc2VudCBpbiB0aGUgYXV0aG9yaXNhdGlvbiBoZWFkZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogZnVuY3Rpb25zLnNldEF1dGgoc2Vzc2lvbi5hY2Nlc3NfdG9rZW4pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0QXV0aCh0b2tlbikge1xuICAgICAgICB0aGlzLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIGEgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gZnVuY3Rpb25OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIEZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGludm9raW5nIHRoZSBGdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgZnVuY3Rpb25zLmludm9rZSgnaGVsbG8td29ybGQnLCB7XG4gICAgICogICBib2R5OiB7IG5hbWU6ICdBZGEnIH0sXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBpbnZva2UoZnVuY3Rpb25OYW1lXzEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qIChmdW5jdGlvbk5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgbGV0IHRpbWVvdXRJZDtcbiAgICAgICAgICAgIGxldCB0aW1lb3V0Q29udHJvbGxlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBoZWFkZXJzLCBtZXRob2QsIGJvZHk6IGZ1bmN0aW9uQXJncywgc2lnbmFsLCB0aW1lb3V0IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIGxldCBfaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgICAgIGxldCB7IHJlZ2lvbiB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZWdpb24gPSB0aGlzLnJlZ2lvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkIHJlZ2lvbiBhcyBxdWVyeSBwYXJhbWV0ZXIgdXNpbmcgVVJMIEFQSVxuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYCR7dGhpcy51cmx9LyR7ZnVuY3Rpb25OYW1lfWApO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpb24gJiYgcmVnaW9uICE9PSAnYW55Jykge1xuICAgICAgICAgICAgICAgICAgICBfaGVhZGVyc1sneC1yZWdpb24nXSA9IHJlZ2lvbjtcbiAgICAgICAgICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2ZvcmNlRnVuY3Rpb25SZWdpb24nLCByZWdpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgYm9keTtcbiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25BcmdzICYmXG4gICAgICAgICAgICAgICAgICAgICgoaGVhZGVycyAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKSkgfHwgIWhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIGZ1bmN0aW9uQXJncyBpbnN0YW5jZW9mIEJsb2IpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3MgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCB3b3JrIGZvciBGaWxlIGFzIEZpbGUgaW5oZXJpdHMgQmxvYlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyB3b3JrcyBmb3IgQXJyYXlCdWZmZXIgYXMgaXQgaXMgdGhlIHNhbWUgdW5kZXJseWluZyBzdHJ1Y3R1cmUgYXMgYSBCbG9iXG4gICAgICAgICAgICAgICAgICAgICAgICBfaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBmdW5jdGlvbkFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGZ1bmN0aW9uQXJncyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYWluIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgX2hlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IGZ1bmN0aW9uQXJncztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGZ1bmN0aW9uQXJncyBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZXQgY29udGVudC10eXBlIGhlYWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVlc3Qgd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgcmlnaHQgYm91bmRhcnkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBmdW5jdGlvbkFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0LCBhc3N1bWUgdGhpcyBpcyBKU09OXG4gICAgICAgICAgICAgICAgICAgICAgICBfaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZnVuY3Rpb25BcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIENvbnRlbnQtVHlwZSB3YXMgc3VwcGxpZWQsIHNpbXBseSBzZXQgdGhlIGJvZHlcbiAgICAgICAgICAgICAgICAgICAgYm9keSA9IGZ1bmN0aW9uQXJncztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRpbWVvdXQgYnkgY3JlYXRpbmcgYW4gQWJvcnRDb250cm9sbGVyXG4gICAgICAgICAgICAgICAgbGV0IGVmZmVjdGl2ZVNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB0aW1lb3V0Q29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdXNlciBwcm92aWRlZCB0aGVpciBvd24gc2lnbmFsLCB3ZSBuZWVkIHRvIHJlc3BlY3QgYm90aFxuICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVTaWduYWwgPSB0aW1lb3V0Q29udHJvbGxlci5zaWduYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlcidzIHNpZ25hbCBpcyBhYm9ydGVkLCBhYm9ydCBvdXIgdGltZW91dCBjb250cm9sbGVyIHRvb1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGltZW91dENvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVTaWduYWwgPSB0aW1lb3V0Q29udHJvbGxlci5zaWduYWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCB0aGlzLmZldGNoKHVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kIHx8ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVycyBwcmlvcml0eSBpcyAoaGlnaCB0byBsb3cpOlxuICAgICAgICAgICAgICAgICAgICAvLyAxLiBpbnZva2UtbGV2ZWwgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAvLyAyLiBjbGllbnQtbGV2ZWwgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAvLyAzLiBkZWZhdWx0IENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIF9oZWFkZXJzKSwgdGhpcy5oZWFkZXJzKSwgaGVhZGVycyksXG4gICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hbDogZWZmZWN0aXZlU2lnbmFsLFxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChmZXRjaEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGdW5jdGlvbnNGZXRjaEVycm9yKGZldGNoRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVsYXlFcnJvciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJlbGF5LWVycm9yJyk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVsYXlFcnJvciAmJiBpc1JlbGF5RXJyb3IgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRnVuY3Rpb25zUmVsYXlFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZ1bmN0aW9uc0h0dHBFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZVR5cGUgPSAoKF9hID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAndGV4dC9wbGFpbicpLnNwbGl0KCc7JylbMF0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZicpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHlpZWxkIHJlc3BvbnNlLmJsb2IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2VUeXBlID09PSAndGV4dC9ldmVudC1zdHJlYW0nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2VUeXBlID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHlpZWxkIHJlc3BvbnNlLmZvcm1EYXRhKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIHRleHRcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHlpZWxkIHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgZXJyb3I6IG51bGwsIHJlc3BvbnNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGVycm9yIGluc3RhbmNlb2YgRnVuY3Rpb25zSHR0cEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRnVuY3Rpb25zUmVsYXlFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnJvci5jb250ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHRpbWVvdXQgaWYgaXQgd2FzIHNldFxuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdW5jdGlvbnNDbGllbnQuanMubWFwIl0sIm5hbWVzIjpbIl9fYXdhaXRlciIsInJlc29sdmVGZXRjaCIsIkZ1bmN0aW9uUmVnaW9uIiwiRnVuY3Rpb25zRmV0Y2hFcnJvciIsIkZ1bmN0aW9uc0h0dHBFcnJvciIsIkZ1bmN0aW9uc1JlbGF5RXJyb3IiLCJGdW5jdGlvbnNDbGllbnQiLCJjb25zdHJ1Y3RvciIsInVybCIsImhlYWRlcnMiLCJjdXN0b21GZXRjaCIsInJlZ2lvbiIsIkFueSIsImZldGNoIiwic2V0QXV0aCIsInRva2VuIiwiQXV0aG9yaXphdGlvbiIsImludm9rZSIsImZ1bmN0aW9uTmFtZV8xIiwiYXJndW1lbnRzIiwiZnVuY3Rpb25OYW1lIiwib3B0aW9ucyIsIl9hIiwidGltZW91dElkIiwidGltZW91dENvbnRyb2xsZXIiLCJtZXRob2QiLCJib2R5IiwiZnVuY3Rpb25BcmdzIiwic2lnbmFsIiwidGltZW91dCIsIl9oZWFkZXJzIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiQmxvYiIsIkFycmF5QnVmZmVyIiwiRm9ybURhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiZWZmZWN0aXZlU2lnbmFsIiwiQWJvcnRDb250cm9sbGVyIiwic2V0VGltZW91dCIsImFib3J0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlc3BvbnNlIiwidG9TdHJpbmciLCJhc3NpZ24iLCJjYXRjaCIsImZldGNoRXJyb3IiLCJpc1JlbGF5RXJyb3IiLCJnZXQiLCJvayIsInJlc3BvbnNlVHlwZSIsInNwbGl0IiwidHJpbSIsImRhdGEiLCJqc29uIiwiYmxvYiIsImZvcm1EYXRhIiwidGV4dCIsImVycm9yIiwiY29udGV4dCIsInVuZGVmaW5lZCIsImNsZWFyVGltZW91dCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/functions-js/dist/module/helper.js":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/functions-js/dist/module/helper.js ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ resolveFetch: () => (/* binding */ resolveFetch)\n/* harmony export */ });\nconst resolveFetch = (customFetch)=>{\n if (customFetch) {\n return (...args)=>customFetch(...args);\n }\n return (...args)=>fetch(...args);\n}; //# sourceMappingURL=helper.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcy9kaXN0L21vZHVsZS9oZWxwZXIuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFPLE1BQU1BLGVBQWUsQ0FBQ0M7SUFDekIsSUFBSUEsYUFBYTtRQUNiLE9BQU8sQ0FBQyxHQUFHQyxPQUFTRCxlQUFlQztJQUN2QztJQUNBLE9BQU8sQ0FBQyxHQUFHQSxPQUFTQyxTQUFTRDtBQUNqQyxFQUFFLENBQ0Ysa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9mdW5jdGlvbnMtanMvZGlzdC9tb2R1bGUvaGVscGVyLmpzP2I2OTUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHJlc29sdmVGZXRjaCA9IChjdXN0b21GZXRjaCkgPT4ge1xuICAgIGlmIChjdXN0b21GZXRjaCkge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IGN1c3RvbUZldGNoKC4uLmFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gKC4uLmFyZ3MpID0+IGZldGNoKC4uLmFyZ3MpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhlbHBlci5qcy5tYXAiXSwibmFtZXMiOlsicmVzb2x2ZUZldGNoIiwiY3VzdG9tRmV0Y2giLCJhcmdzIiwiZmV0Y2giXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/functions-js/dist/module/helper.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/functions-js/dist/module/types.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/functions-js/dist/module/types.js ***!
|
||
\******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FunctionRegion: () => (/* binding */ FunctionRegion),\n/* harmony export */ FunctionsError: () => (/* binding */ FunctionsError),\n/* harmony export */ FunctionsFetchError: () => (/* binding */ FunctionsFetchError),\n/* harmony export */ FunctionsHttpError: () => (/* binding */ FunctionsHttpError),\n/* harmony export */ FunctionsRelayError: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcy9kaXN0L21vZHVsZS90eXBlcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOzs7Ozs7Ozs7OztDQVdDLEdBQ00sTUFBTUEsdUJBQXVCQztJQUNoQ0MsWUFBWUMsT0FBTyxFQUFFQyxPQUFPLGdCQUFnQixFQUFFQyxPQUFPLENBQUU7UUFDbkQsS0FBSyxDQUFDRjtRQUNOLElBQUksQ0FBQ0MsSUFBSSxHQUFHQTtRQUNaLElBQUksQ0FBQ0MsT0FBTyxHQUFHQTtJQUNuQjtBQUNKO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTUMsNEJBQTRCTjtJQUNyQ0UsWUFBWUcsT0FBTyxDQUFFO1FBQ2pCLEtBQUssQ0FBQyxpREFBaUQsdUJBQXVCQTtJQUNsRjtBQUNKO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTUUsNEJBQTRCUDtJQUNyQ0UsWUFBWUcsT0FBTyxDQUFFO1FBQ2pCLEtBQUssQ0FBQywwQ0FBMEMsdUJBQXVCQTtJQUMzRTtBQUNKO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTUcsMkJBQTJCUjtJQUNwQ0UsWUFBWUcsT0FBTyxDQUFFO1FBQ2pCLEtBQUssQ0FBQyxnREFBZ0Qsc0JBQXNCQTtJQUNoRjtBQUNKO0FBQ0EsNENBQTRDO0FBQ3JDLElBQUlJLGVBQWU7QUFDekIsVUFBVUEsY0FBYztJQUNyQkEsY0FBYyxDQUFDLE1BQU0sR0FBRztJQUN4QkEsY0FBYyxDQUFDLGVBQWUsR0FBRztJQUNqQ0EsY0FBYyxDQUFDLGVBQWUsR0FBRztJQUNqQ0EsY0FBYyxDQUFDLFdBQVcsR0FBRztJQUM3QkEsY0FBYyxDQUFDLGVBQWUsR0FBRztJQUNqQ0EsY0FBYyxDQUFDLGVBQWUsR0FBRztJQUNqQ0EsY0FBYyxDQUFDLGFBQWEsR0FBRztJQUMvQkEsY0FBYyxDQUFDLGFBQWEsR0FBRztJQUMvQkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztBQUNoQyxHQUFHQSxrQkFBbUJBLENBQUFBLGlCQUFpQixDQUFDLEtBQ3hDLGlDQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL3R5cGVzLmpzPzY4OGUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXNlIGVycm9yIGZvciBTdXBhYmFzZSBFZGdlIEZ1bmN0aW9uIGludm9jYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgRnVuY3Rpb25zRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvZnVuY3Rpb25zLWpzJ1xuICpcbiAqIHRocm93IG5ldyBGdW5jdGlvbnNFcnJvcignVW5leHBlY3RlZCBlcnJvciBpbnZva2luZyBmdW5jdGlvbicsICdGdW5jdGlvbnNFcnJvcicsIHtcbiAqICAgcmVxdWVzdElkOiAnYWJjMTIzJyxcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIG5hbWUgPSAnRnVuY3Rpb25zRXJyb3InLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIG5ldHdvcmsgcmVxdWVzdCB0byBhbiBFZGdlIEZ1bmN0aW9uIGZhaWxzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgRnVuY3Rpb25zRmV0Y2hFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9mdW5jdGlvbnMtanMnXG4gKlxuICogdGhyb3cgbmV3IEZ1bmN0aW9uc0ZldGNoRXJyb3IoeyByZXF1ZXN0SWQ6ICdhYmMxMjMnIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uc0ZldGNoRXJyb3IgZXh0ZW5kcyBGdW5jdGlvbnNFcnJvciB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dCkge1xuICAgICAgICBzdXBlcignRmFpbGVkIHRvIHNlbmQgYSByZXF1ZXN0IHRvIHRoZSBFZGdlIEZ1bmN0aW9uJywgJ0Z1bmN0aW9uc0ZldGNoRXJyb3InLCBjb250ZXh0KTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSBTdXBhYmFzZSByZWxheSBjYW5ub3QgcmVhY2ggdGhlIEVkZ2UgRnVuY3Rpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBGdW5jdGlvbnNSZWxheUVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcydcbiAqXG4gKiB0aHJvdyBuZXcgRnVuY3Rpb25zUmVsYXlFcnJvcih7IHJlZ2lvbjogJ3VzLWVhc3QtMScgfSlcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25zUmVsYXlFcnJvciBleHRlbmRzIEZ1bmN0aW9uc0Vycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKCdSZWxheSBFcnJvciBpbnZva2luZyB0aGUgRWRnZSBGdW5jdGlvbicsICdGdW5jdGlvbnNSZWxheUVycm9yJywgY29udGV4dCk7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGUgRWRnZSBGdW5jdGlvbiByZXR1cm5zIGEgbm9uLTJ4eCBzdGF0dXMgY29kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEZ1bmN0aW9uc0h0dHBFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9mdW5jdGlvbnMtanMnXG4gKlxuICogdGhyb3cgbmV3IEZ1bmN0aW9uc0h0dHBFcnJvcih7IHN0YXR1czogNTAwIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uc0h0dHBFcnJvciBleHRlbmRzIEZ1bmN0aW9uc0Vycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKCdFZGdlIEZ1bmN0aW9uIHJldHVybmVkIGEgbm9uLTJ4eCBzdGF0dXMgY29kZScsICdGdW5jdGlvbnNIdHRwRXJyb3InLCBjb250ZXh0KTtcbiAgICB9XG59XG4vLyBEZWZpbmUgdGhlIGVudW0gZm9yIHRoZSAncmVnaW9uJyBwcm9wZXJ0eVxuZXhwb3J0IHZhciBGdW5jdGlvblJlZ2lvbjtcbihmdW5jdGlvbiAoRnVuY3Rpb25SZWdpb24pIHtcbiAgICBGdW5jdGlvblJlZ2lvbltcIkFueVwiXSA9IFwiYW55XCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJBcE5vcnRoZWFzdDFcIl0gPSBcImFwLW5vcnRoZWFzdC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJBcE5vcnRoZWFzdDJcIl0gPSBcImFwLW5vcnRoZWFzdC0yXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJBcFNvdXRoMVwiXSA9IFwiYXAtc291dGgtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiQXBTb3V0aGVhc3QxXCJdID0gXCJhcC1zb3V0aGVhc3QtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiQXBTb3V0aGVhc3QyXCJdID0gXCJhcC1zb3V0aGVhc3QtMlwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiQ2FDZW50cmFsMVwiXSA9IFwiY2EtY2VudHJhbC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJFdUNlbnRyYWwxXCJdID0gXCJldS1jZW50cmFsLTFcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIkV1V2VzdDFcIl0gPSBcImV1LXdlc3QtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiRXVXZXN0MlwiXSA9IFwiZXUtd2VzdC0yXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJFdVdlc3QzXCJdID0gXCJldS13ZXN0LTNcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIlNhRWFzdDFcIl0gPSBcInNhLWVhc3QtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiVXNFYXN0MVwiXSA9IFwidXMtZWFzdC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJVc1dlc3QxXCJdID0gXCJ1cy13ZXN0LTFcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIlVzV2VzdDJcIl0gPSBcInVzLXdlc3QtMlwiO1xufSkoRnVuY3Rpb25SZWdpb24gfHwgKEZ1bmN0aW9uUmVnaW9uID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCJdLCJuYW1lcyI6WyJGdW5jdGlvbnNFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJtZXNzYWdlIiwibmFtZSIsImNvbnRleHQiLCJGdW5jdGlvbnNGZXRjaEVycm9yIiwiRnVuY3Rpb25zUmVsYXlFcnJvciIsIkZ1bmN0aW9uc0h0dHBFcnJvciIsIkZ1bmN0aW9uUmVnaW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/functions-js/dist/module/types.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js":
|
||
/*!***************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js ***!
|
||
\***************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_CHANNEL_STATES: () => (/* binding */ REALTIME_CHANNEL_STATES),\n/* harmony export */ REALTIME_LISTEN_TYPES: () => (/* binding */ REALTIME_LISTEN_TYPES),\n/* harmony export */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT: () => (/* binding */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT),\n/* harmony export */ REALTIME_SUBSCRIBE_STATES: () => (/* binding */ REALTIME_SUBSCRIBE_STATES),\n/* harmony export */ \"default\": () => (/* binding */ RealtimeChannel)\n/* harmony export */ });\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/constants */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\");\n/* harmony import */ var _lib_push__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/push */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/push.js\");\n/* harmony import */ var _lib_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/timer */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js\");\n/* harmony import */ var _RealtimePresence__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./RealtimePresence */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js\");\n/* harmony import */ var _lib_transformers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/transformers */ \"(ssr)/./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;\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 */ class RealtimeChannel {\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 ${this.topic} ${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 ${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 ${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 ${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 '${this.topic}'. It must be a private channel.`;\n }\n }\n /** Subscribe registers your client with the server */ subscribe(callback, timeout = 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 ({ postgres_changes })=>{\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, opts = {}) {\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(opts = {}) {\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 ${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, opts = {}) {\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 ${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, opts = {}) {\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 ${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(timeout = this.timeout) {\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.leaving;\n const onClose = ()=>{\n this.socket.log(\"channel\", `leave ${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, timeout = this.timeout) {\n if (!this.joinedOnce) {\n throw `tried to push '${event}' to '${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: ${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_${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(timeout = 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} //# sourceMappingURL=RealtimeChannel.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lQ2hhbm5lbC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQXVGO0FBQ3pEO0FBQ0U7QUFDa0I7QUFDQztBQUNFO0FBQzlDLElBQUlRLHVDQUF1QztBQUNqRCxVQUFVQSxzQ0FBc0M7SUFDN0NBLHNDQUFzQyxDQUFDLE1BQU0sR0FBRztJQUNoREEsc0NBQXNDLENBQUMsU0FBUyxHQUFHO0lBQ25EQSxzQ0FBc0MsQ0FBQyxTQUFTLEdBQUc7SUFDbkRBLHNDQUFzQyxDQUFDLFNBQVMsR0FBRztBQUN2RCxHQUFHQSwwQ0FBMkNBLENBQUFBLHlDQUF5QyxDQUFDO0FBQ2pGLElBQUlDLHNCQUFzQjtBQUNoQyxVQUFVQSxxQkFBcUI7SUFDNUJBLHFCQUFxQixDQUFDLFlBQVksR0FBRztJQUNyQ0EscUJBQXFCLENBQUMsV0FBVyxHQUFHO0lBQ3BDQSxxQkFBcUIsQ0FBQyxtQkFBbUIsR0FBRztJQUM1Q0EscUJBQXFCLENBQUMsU0FBUyxHQUFHO0FBQ3RDLEdBQUdBLHlCQUEwQkEsQ0FBQUEsd0JBQXdCLENBQUM7QUFDL0MsSUFBSUMsMEJBQTBCO0FBQ3BDLFVBQVVBLHlCQUF5QjtJQUNoQ0EseUJBQXlCLENBQUMsYUFBYSxHQUFHO0lBQzFDQSx5QkFBeUIsQ0FBQyxZQUFZLEdBQUc7SUFDekNBLHlCQUF5QixDQUFDLFNBQVMsR0FBRztJQUN0Q0EseUJBQXlCLENBQUMsZ0JBQWdCLEdBQUc7QUFDakQsR0FBR0EsNkJBQThCQSxDQUFBQSw0QkFBNEIsQ0FBQztBQUN2RCxNQUFNQywwQkFBMEJWLDBEQUFjQSxDQUFDO0FBQ3REOzs7O0NBSUMsR0FDYyxNQUFNVztJQUNqQjs7Ozs7Ozs7Ozs7Ozs7O0tBZUMsR0FDREMsWUFDQSxrQ0FBa0MsR0FDbENDLEtBQUssRUFBRUMsU0FBUztRQUFFQyxRQUFRLENBQUM7SUFBRSxDQUFDLEVBQUVDLE1BQU0sQ0FBRTtR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QUksSUFBSSxDQUFDa0IsVUFBVSxJQUFJO1lBQ25CO1FBQ0o7UUFDQSxJQUFJLENBQUNyQyxNQUFNLENBQUNnTSxlQUFlLENBQUMsSUFBSSxDQUFDbk0sS0FBSztRQUN0QyxJQUFJLENBQUNPLEtBQUssR0FBR3BCLDBEQUFjQSxDQUFDb00sT0FBTztRQUNuQyxJQUFJLENBQUNoSyxRQUFRLENBQUM2SyxNQUFNLENBQUM5SztJQUN6QjtJQUNBLGNBQWMsR0FDZCtKLG1CQUFtQnRJLE9BQU8sRUFBRTtRQUN4QixNQUFNc0osVUFBVTtZQUNabEIsS0FBSyxDQUFDO1lBQ05DLEtBQUssQ0FBQztRQUNWO1FBQ0EsSUFBSXJJLFFBQVFzRCxJQUFJLEtBQUssWUFBWXRELFFBQVFzRCxJQUFJLEtBQUssVUFBVTtZQUN4RGdHLFFBQVFsQixHQUFHLEdBQUczTCxnRUFBOEIsQ0FBQ3VELFFBQVF3SixPQUFPLEVBQUV4SixRQUFReUosTUFBTTtRQUNoRjtRQUNBLElBQUl6SixRQUFRc0QsSUFBSSxLQUFLLFlBQVl0RCxRQUFRc0QsSUFBSSxLQUFLLFVBQVU7WUFDeERnRyxRQUFRakIsR0FBRyxHQUFHNUwsZ0VBQThCLENBQUN1RCxRQUFRd0osT0FBTyxFQUFFeEosUUFBUTBKLFVBQVU7UUFDcEY7UUFDQSxPQUFPSjtJQUNYO0FBQ0osRUFDQSwyQ0FBMkMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lQ2hhbm5lbC5qcz9lYzRjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENIQU5ORUxfRVZFTlRTLCBDSEFOTkVMX1NUQVRFUywgTUFYX1BVU0hfQlVGRkVSX1NJWkUgfSBmcm9tICcuL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IFB1c2ggZnJvbSAnLi9saWIvcHVzaCc7XG5pbXBvcnQgVGltZXIgZnJvbSAnLi9saWIvdGltZXInO1xuaW1wb3J0IFJlYWx0aW1lUHJlc2VuY2UgZnJvbSAnLi9SZWFsdGltZVByZXNlbmNlJztcbmltcG9ydCAqIGFzIFRyYW5zZm9ybWVycyBmcm9tICcuL2xpYi90cmFuc2Zvcm1lcnMnO1xuaW1wb3J0IHsgaHR0cEVuZHBvaW50VVJMIH0gZnJvbSAnLi9saWIvdHJhbnNmb3JtZXJzJztcbmV4cG9ydCB2YXIgUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlQ7XG4oZnVuY3Rpb24gKFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UKSB7XG4gICAgUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlRbXCJBTExcIl0gPSBcIipcIjtcbiAgICBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVFtcIklOU0VSVFwiXSA9IFwiSU5TRVJUXCI7XG4gICAgUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlRbXCJVUERBVEVcIl0gPSBcIlVQREFURVwiO1xuICAgIFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UW1wiREVMRVRFXCJdID0gXCJERUxFVEVcIjtcbn0pKFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UIHx8IChSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCA9IHt9KSk7XG5leHBvcnQgdmFyIFJFQUxUSU1FX0xJU1RFTl9UWVBFUztcbihmdW5jdGlvbiAoUkVBTFRJTUVfTElTVEVOX1RZUEVTKSB7XG4gICAgUkVBTFRJTUVfTElTVEVOX1RZUEVTW1wiQlJPQURDQVNUXCJdID0gXCJicm9hZGNhc3RcIjtcbiAgICBSRUFMVElNRV9MSVNURU5fVFlQRVNbXCJQUkVTRU5DRVwiXSA9IFwicHJlc2VuY2VcIjtcbiAgICBSRUFMVElNRV9MSVNURU5fVFlQRVNbXCJQT1NUR1JFU19DSEFOR0VTXCJdID0gXCJwb3N0Z3Jlc19jaGFuZ2VzXCI7XG4gICAgUkVBTFRJTUVfTElTVEVOX1RZUEVTW1wiU1lTVEVNXCJdID0gXCJzeXN0ZW1cIjtcbn0pKFJFQUxUSU1FX0xJU1RFTl9UWVBFUyB8fCAoUkVBTFRJTUVfTElTVEVOX1RZUEVTID0ge30pKTtcbmV4cG9ydCB2YXIgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUztcbihmdW5jdGlvbiAoUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUykge1xuICAgIFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVNbXCJTVUJTQ1JJQkVEXCJdID0gXCJTVUJTQ1JJQkVEXCI7XG4gICAgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFU1tcIlRJTUVEX09VVFwiXSA9IFwiVElNRURfT1VUXCI7XG4gICAgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFU1tcIkNMT1NFRFwiXSA9IFwiQ0xPU0VEXCI7XG4gICAgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFU1tcIkNIQU5ORUxfRVJST1JcIl0gPSBcIkNIQU5ORUxfRVJST1JcIjtcbn0pKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMgfHwgKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IFJFQUxUSU1FX0NIQU5ORUxfU1RBVEVTID0gQ0hBTk5FTF9TVEFURVM7XG4vKiogQSBjaGFubmVsIGlzIHRoZSBiYXNpYyBidWlsZGluZyBibG9jayBvZiBSZWFsdGltZVxuICogYW5kIG5hcnJvd3MgdGhlIHNjb3BlIG9mIGRhdGEgZmxvdyB0byBzdWJzY3JpYmVkIGNsaWVudHMuXG4gKiBZb3UgY2FuIHRoaW5rIG9mIGEgY2hhbm5lbCBhcyBhIGNoYXRyb29tIHdoZXJlIHBhcnRpY2lwYW50cyBhcmUgYWJsZSB0byBzZWUgd2hvJ3Mgb25saW5lXG4gKiBhbmQgc2VuZCBhbmQgcmVjZWl2ZSBtZXNzYWdlcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVhbHRpbWVDaGFubmVsIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2hhbm5lbCB0aGF0IGNhbiBicm9hZGNhc3QgbWVzc2FnZXMsIHN5bmMgcHJlc2VuY2UsIGFuZCBsaXN0ZW4gdG8gUG9zdGdyZXMgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIFRoZSB0b3BpYyBkZXRlcm1pbmVzIHdoaWNoIHJlYWx0aW1lIHN0cmVhbSB5b3UgYXJlIHN1YnNjcmliaW5nIHRvLiBDb25maWcgb3B0aW9ucyBsZXQgeW91XG4gICAgICogZW5hYmxlIGFja25vd2xlZGdlbWVudCBmb3IgYnJvYWRjYXN0cywgcHJlc2VuY2UgdHJhY2tpbmcsIG9yIHByaXZhdGUgY2hhbm5lbHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IFJlYWx0aW1lQ2xpZW50IGZyb20gJ0BzdXBhYmFzZS9yZWFsdGltZS1qcydcbiAgICAgKlxuICAgICAqIGNvbnN0IGNsaWVudCA9IG5ldyBSZWFsdGltZUNsaWVudCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL3JlYWx0aW1lL3YxJywge1xuICAgICAqICAgcGFyYW1zOiB7IGFwaWtleTogJ3B1YmxpYy1hbm9uLWtleScgfSxcbiAgICAgKiB9KVxuICAgICAqIGNvbnN0IGNoYW5uZWwgPSBuZXcgUmVhbHRpbWVDaGFubmVsKCdyZWFsdGltZTpwdWJsaWM6bWVzc2FnZXMnLCB7IGNvbmZpZzoge30gfSwgY2xpZW50KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUb3BpYyBuYW1lIGNhbiBiZSBhbnkgc3RyaW5nLiAqL1xuICAgIHRvcGljLCBwYXJhbXMgPSB7IGNvbmZpZzoge30gfSwgc29ja2V0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMudG9waWMgPSB0b3BpYztcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0ge307XG4gICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWQ7XG4gICAgICAgIHRoaXMuam9pbmVkT25jZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnB1c2hCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5zdWJUb3BpYyA9IHRvcGljLnJlcGxhY2UoL15yZWFsdGltZTovaSwgJycpO1xuICAgICAgICB0aGlzLnBhcmFtcy5jb25maWcgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGJyb2FkY2FzdDogeyBhY2s6IGZhbHNlLCBzZWxmOiBmYWxzZSB9LFxuICAgICAgICAgICAgcHJlc2VuY2U6IHsga2V5OiAnJywgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHByaXZhdGU6IGZhbHNlLFxuICAgICAgICB9LCBwYXJhbXMuY29uZmlnKTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gdGhpcy5zb2NrZXQudGltZW91dDtcbiAgICAgICAgdGhpcy5qb2luUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmpvaW4sIHRoaXMucGFyYW1zLCB0aGlzLnRpbWVvdXQpO1xuICAgICAgICB0aGlzLnJlam9pblRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHRoaXMuX3Jlam9pblVudGlsQ29ubmVjdGVkKCksIHRoaXMuc29ja2V0LnJlY29ubmVjdEFmdGVyTXMpO1xuICAgICAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoJ29rJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5lZDtcbiAgICAgICAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMucHVzaEJ1ZmZlci5mb3JFYWNoKChwdXNoRXZlbnQpID0+IHB1c2hFdmVudC5zZW5kKCkpO1xuICAgICAgICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW107XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9vbkNsb3NlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmxvZygnY2hhbm5lbCcsIGBjbG9zZSAke3RoaXMudG9waWN9ICR7dGhpcy5fam9pblJlZigpfWApO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmNsb3NlZDtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Ll9yZW1vdmUodGhpcyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9vbkVycm9yKChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0xlYXZpbmcoKSB8fCB0aGlzLl9pc0Nsb3NlZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zb2NrZXQubG9nKCdjaGFubmVsJywgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWQ7XG4gICAgICAgICAgICB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5qb2luUHVzaC5yZWNlaXZlKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0pvaW5pbmcoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmxvZygnY2hhbm5lbCcsIGB0aW1lb3V0ICR7dGhpcy50b3BpY31gLCB0aGlzLmpvaW5QdXNoLnRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWQ7XG4gICAgICAgICAgICB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5qb2luUHVzaC5yZWNlaXZlKCdlcnJvcicsIChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0xlYXZpbmcoKSB8fCB0aGlzLl9pc0Nsb3NlZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zb2NrZXQubG9nKCdjaGFubmVsJywgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWQ7XG4gICAgICAgICAgICB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fb24oQ0hBTk5FTF9FVkVOVFMucmVwbHksIHt9LCAocGF5bG9hZCwgcmVmKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyKHRoaXMuX3JlcGx5RXZlbnROYW1lKHJlZiksIHBheWxvYWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcmVzZW5jZSA9IG5ldyBSZWFsdGltZVByZXNlbmNlKHRoaXMpO1xuICAgICAgICB0aGlzLmJyb2FkY2FzdEVuZHBvaW50VVJMID0gaHR0cEVuZHBvaW50VVJMKHRoaXMuc29ja2V0LmVuZFBvaW50KTtcbiAgICAgICAgdGhpcy5wcml2YXRlID0gdGhpcy5wYXJhbXMuY29uZmlnLnByaXZhdGUgfHwgZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5wcml2YXRlICYmICgoX2IgPSAoX2EgPSB0aGlzLnBhcmFtcy5jb25maWcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5icm9hZGNhc3QpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5yZXBsYXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBgdHJpZWQgdG8gdXNlIHJlcGxheSBvbiBwdWJsaWMgY2hhbm5lbCAnJHt0aGlzLnRvcGljfScuIEl0IG11c3QgYmUgYSBwcml2YXRlIGNoYW5uZWwuYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogU3Vic2NyaWJlIHJlZ2lzdGVycyB5b3VyIGNsaWVudCB3aXRoIHRoZSBzZXJ2ZXIgKi9cbiAgICBzdWJzY3JpYmUoY2FsbGJhY2ssIHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGlmICghdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09IENIQU5ORUxfU1RBVEVTLmNsb3NlZCkge1xuICAgICAgICAgICAgY29uc3QgeyBjb25maWc6IHsgYnJvYWRjYXN0LCBwcmVzZW5jZSwgcHJpdmF0ZTogaXNQcml2YXRlIH0sIH0gPSB0aGlzLnBhcmFtcztcbiAgICAgICAgICAgIGNvbnN0IHBvc3RncmVzX2NoYW5nZXMgPSAoX2IgPSAoX2EgPSB0aGlzLmJpbmRpbmdzLnBvc3RncmVzX2NoYW5nZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoKHIpID0+IHIuZmlsdGVyKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW107XG4gICAgICAgICAgICBjb25zdCBwcmVzZW5jZV9lbmFibGVkID0gKCEhdGhpcy5iaW5kaW5nc1tSRUFMVElNRV9MSVNURU5fVFlQRVMuUFJFU0VOQ0VdICYmXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1tSRUFMVElNRV9MSVNURU5fVFlQRVMuUFJFU0VOQ0VdLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgKChfYyA9IHRoaXMucGFyYW1zLmNvbmZpZy5wcmVzZW5jZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmVuYWJsZWQpID09PSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW5QYXlsb2FkID0ge307XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICAgICAgYnJvYWRjYXN0LFxuICAgICAgICAgICAgICAgIHByZXNlbmNlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXNlbmNlKSwgeyBlbmFibGVkOiBwcmVzZW5jZV9lbmFibGVkIH0pLFxuICAgICAgICAgICAgICAgIHBvc3RncmVzX2NoYW5nZXMsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZTogaXNQcml2YXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldC5hY2Nlc3NUb2tlblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWNjZXNzVG9rZW5QYXlsb2FkLmFjY2Vzc190b2tlbiA9IHRoaXMuc29ja2V0LmFjY2Vzc1Rva2VuVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKChlKSA9PiBjYWxsYmFjayA9PT0gbnVsbCB8fCBjYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FsbGJhY2soUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUy5DSEFOTkVMX0VSUk9SLCBlKSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNsb3NlKCgpID0+IGNhbGxiYWNrID09PSBudWxsIHx8IGNhbGxiYWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWxsYmFjayhSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTLkNMT1NFRCkpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVKb2luUGF5bG9hZChPYmplY3QuYXNzaWduKHsgY29uZmlnIH0sIGFjY2Vzc1Rva2VuUGF5bG9hZCkpO1xuICAgICAgICAgICAgdGhpcy5qb2luZWRPbmNlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3Jlam9pbih0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMuam9pblB1c2hcbiAgICAgICAgICAgICAgICAucmVjZWl2ZSgnb2snLCBhc3luYyAoeyBwb3N0Z3Jlc19jaGFuZ2VzIH0pID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgLy8gT25seSByZWZyZXNoIGF1dGggaWYgdXNpbmcgY2FsbGJhY2stYmFzZWQgdG9rZW5zXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNvY2tldC5faXNNYW51YWxUb2tlbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNldEF1dGgoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBvc3RncmVzX2NoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9PT0gbnVsbCB8fCBjYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FsbGJhY2soUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUy5TVUJTQ1JJQkVEKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50UG9zdGdyZXNCaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MucG9zdGdyZXNfY2hhbmdlcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmluZGluZ3NMZW4gPSAoX2EgPSBjbGllbnRQb3N0Z3Jlc0JpbmRpbmdzID09PSBudWxsIHx8IGNsaWVudFBvc3RncmVzQmluZGluZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsaWVudFBvc3RncmVzQmluZGluZ3MubGVuZ3RoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQb3N0Z3Jlc0JpbmRpbmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluZGluZ3NMZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50UG9zdGdyZXNCaW5kaW5nID0gY2xpZW50UG9zdGdyZXNCaW5kaW5nc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZmlsdGVyOiB7IGV2ZW50LCBzY2hlbWEsIHRhYmxlLCBmaWx0ZXIgfSwgfSA9IGNsaWVudFBvc3RncmVzQmluZGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZlclBvc3RncmVzRmlsdGVyID0gcG9zdGdyZXNfY2hhbmdlcyAmJiBwb3N0Z3Jlc19jaGFuZ2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlclBvc3RncmVzRmlsdGVyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUG9zdGdyZXNGaWx0ZXIuZXZlbnQgPT09IGV2ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbHRpbWVDaGFubmVsLmlzRmlsdGVyVmFsdWVFcXVhbChzZXJ2ZXJQb3N0Z3Jlc0ZpbHRlci5zY2hlbWEsIHNjaGVtYSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsdGltZUNoYW5uZWwuaXNGaWx0ZXJWYWx1ZUVxdWFsKHNlcnZlclBvc3RncmVzRmlsdGVyLnRhYmxlLCB0YWJsZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsdGltZUNoYW5uZWwuaXNGaWx0ZXJWYWx1ZUVxdWFsKHNlcnZlclBvc3RncmVzRmlsdGVyLmZpbHRlciwgZmlsdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Bvc3RncmVzQmluZGluZ3MucHVzaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNsaWVudFBvc3RncmVzQmluZGluZyksIHsgaWQ6IHNlcnZlclBvc3RncmVzRmlsdGVyLmlkIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9PT0gbnVsbCB8fCBjYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FsbGJhY2soUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUy5DSEFOTkVMX0VSUk9SLCBuZXcgRXJyb3IoJ21pc21hdGNoIGJldHdlZW4gc2VydmVyIGFuZCBjbGllbnQgYmluZGluZ3MgZm9yIHBvc3RncmVzIGNoYW5nZXMnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZGluZ3MucG9zdGdyZXNfY2hhbmdlcyA9IG5ld1Bvc3RncmVzQmluZGluZ3M7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMuU1VCU0NSSUJFRCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZWNlaXZlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID09PSBudWxsIHx8IGNhbGxiYWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWxsYmFjayhSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTLkNIQU5ORUxfRVJST1IsIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShPYmplY3QudmFsdWVzKGVycm9yKS5qb2luKCcsICcpIHx8ICdlcnJvcicpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVjZWl2ZSgndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9PT0gbnVsbCB8fCBjYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FsbGJhY2soUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUy5USU1FRF9PVVQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByZXNlbmNlIHN0YXRlIGZvciB0aGlzIGNoYW5uZWwuXG4gICAgICpcbiAgICAgKiBUaGUgc2hhcGUgaXMgYSBtYXAga2V5ZWQgYnkgcHJlc2VuY2Uga2V5IChmb3IgZXhhbXBsZSBhIHVzZXIgaWQpIHdoZXJlIGVhY2ggZW50cnkgY29udGFpbnMgdGhlXG4gICAgICogdHJhY2tlZCBtZXRhZGF0YSBmb3IgdGhhdCB1c2VyLlxuICAgICAqL1xuICAgIHByZXNlbmNlU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXNlbmNlLnN0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyB0aGUgc3VwcGxpZWQgcGF5bG9hZCB0byB0aGUgcHJlc2VuY2UgdHJhY2tlciBzbyBvdGhlciBzdWJzY3JpYmVycyBjYW4gc2VlIHRoYXQgdGhpc1xuICAgICAqIGNsaWVudCBpcyBvbmxpbmUuIFVzZSBgdW50cmFja2AgdG8gc3RvcCBicm9hZGNhc3RpbmcgcHJlc2VuY2UgZm9yIHRoZSBzYW1lIGtleS5cbiAgICAgKi9cbiAgICBhc3luYyB0cmFjayhwYXlsb2FkLCBvcHRzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICAgICAgICB0eXBlOiAncHJlc2VuY2UnLFxuICAgICAgICAgICAgZXZlbnQ6ICd0cmFjaycsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICB9LCBvcHRzLnRpbWVvdXQgfHwgdGhpcy50aW1lb3V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY3VycmVudCBwcmVzZW5jZSBzdGF0ZSBmb3IgdGhpcyBjbGllbnQuXG4gICAgICovXG4gICAgYXN5bmMgdW50cmFjayhvcHRzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICAgICAgICB0eXBlOiAncHJlc2VuY2UnLFxuICAgICAgICAgICAgZXZlbnQ6ICd1bnRyYWNrJyxcbiAgICAgICAgfSwgb3B0cyk7XG4gICAgfVxuICAgIG9uKHR5cGUsIGZpbHRlciwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmpvaW5lZCAmJiB0eXBlID09PSBSRUFMVElNRV9MSVNURU5fVFlQRVMuUFJFU0VOQ0UpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmxvZygnY2hhbm5lbCcsIGByZXN1YnNjcmliZSB0byAke3RoaXMudG9waWN9IGR1ZSB0byBjaGFuZ2UgaW4gcHJlc2VuY2UgY2FsbGJhY2tzIG9uIGpvaW5lZCBjaGFubmVsYCk7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCkudGhlbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnN1YnNjcmliZSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fb24odHlwZSwgZmlsdGVyLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgYnJvYWRjYXN0IG1lc3NhZ2UgZXhwbGljaXRseSB2aWEgUkVTVCBBUEkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBhbHdheXMgdXNlcyB0aGUgUkVTVCBBUEkgZW5kcG9pbnQgcmVnYXJkbGVzcyBvZiBXZWJTb2NrZXQgY29ubmVjdGlvbiBzdGF0ZS5cbiAgICAgKiBVc2VmdWwgd2hlbiB5b3Ugd2FudCB0byBndWFyYW50ZWUgUkVTVCBkZWxpdmVyeSBvciB3aGVuIGdyYWR1YWxseSBtaWdyYXRpbmcgZnJvbSBpbXBsaWNpdCBSRVNUIGZhbGxiYWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBuYW1lIG9mIHRoZSBicm9hZGNhc3QgZXZlbnRcbiAgICAgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIHRvIGJlIHNlbnQgKHJlcXVpcmVkKVxuICAgICAqIEBwYXJhbSBvcHRzIE9wdGlvbnMgaW5jbHVkaW5nIHRpbWVvdXRcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBvYmplY3Qgd2l0aCBzdWNjZXNzIHN0YXR1cywgYW5kIGVycm9yIGRldGFpbHMgaWYgZmFpbGVkXG4gICAgICovXG4gICAgYXN5bmMgaHR0cFNlbmQoZXZlbnQsIHBheWxvYWQsIG9wdHMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChwYXlsb2FkID09PSB1bmRlZmluZWQgfHwgcGF5bG9hZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdQYXlsb2FkIGlzIHJlcXVpcmVkIGZvciBodHRwU2VuZCgpJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgIGFwaWtleTogdGhpcy5zb2NrZXQuYXBpS2V5ID8gdGhpcy5zb2NrZXQuYXBpS2V5IDogJycsXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5zb2NrZXQuYWNjZXNzVG9rZW5WYWx1ZSkge1xuICAgICAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3RoaXMuc29ja2V0LmFjY2Vzc1Rva2VuVmFsdWV9YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljOiB0aGlzLnN1YlRvcGljLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZTogdGhpcy5wcml2YXRlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9mZXRjaFdpdGhUaW1lb3V0KHRoaXMuYnJvYWRjYXN0RW5kcG9pbnRVUkwsIG9wdGlvbnMsIChfYSA9IG9wdHMudGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy50aW1lb3V0KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAyKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvckJvZHkgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvckJvZHkuZXJyb3IgfHwgZXJyb3JCb2R5Lm1lc3NhZ2UgfHwgZXJyb3JNZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYikgeyB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZSBpbnRvIHRoZSBjaGFubmVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFyZ3MgQXJndW1lbnRzIHRvIHNlbmQgdG8gY2hhbm5lbFxuICAgICAqIEBwYXJhbSBhcmdzLnR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gc2VuZFxuICAgICAqIEBwYXJhbSBhcmdzLmV2ZW50IFRoZSBuYW1lIG9mIHRoZSBldmVudCBiZWluZyBzZW50XG4gICAgICogQHBhcmFtIGFyZ3MucGF5bG9hZCBQYXlsb2FkIHRvIGJlIHNlbnRcbiAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIHRvIGJlIHVzZWQgZHVyaW5nIHRoZSBzZW5kIHByb2Nlc3NcbiAgICAgKi9cbiAgICBhc3luYyBzZW5kKGFyZ3MsIG9wdHMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBpZiAoIXRoaXMuX2NhblB1c2goKSAmJiBhcmdzLnR5cGUgPT09ICdicm9hZGNhc3QnKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlYWx0aW1lIHNlbmQoKSBpcyBhdXRvbWF0aWNhbGx5IGZhbGxpbmcgYmFjayB0byBSRVNUIEFQSS4gJyArXG4gICAgICAgICAgICAgICAgJ1RoaXMgYmVoYXZpb3Igd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuICcgK1xuICAgICAgICAgICAgICAgICdQbGVhc2UgdXNlIGh0dHBTZW5kKCkgZXhwbGljaXRseSBmb3IgUkVTVCBkZWxpdmVyeS4nKTtcbiAgICAgICAgICAgIGNvbnN0IHsgZXZlbnQsIHBheWxvYWQ6IGVuZHBvaW50X3BheWxvYWQgfSA9IGFyZ3M7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgIGFwaWtleTogdGhpcy5zb2NrZXQuYXBpS2V5ID8gdGhpcy5zb2NrZXQuYXBpS2V5IDogJycsXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5zb2NrZXQuYWNjZXNzVG9rZW5WYWx1ZSkge1xuICAgICAgICAgICAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0aGlzLnNvY2tldC5hY2Nlc3NUb2tlblZhbHVlfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljOiB0aGlzLnN1YlRvcGljLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGVuZHBvaW50X3BheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZTogdGhpcy5wcml2YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fZmV0Y2hXaXRoVGltZW91dCh0aGlzLmJyb2FkY2FzdEVuZHBvaW50VVJMLCBvcHRpb25zLCAoX2EgPSBvcHRzLnRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMudGltZW91dCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgKChfYiA9IHJlc3BvbnNlLmJvZHkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYW5jZWwoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLm9rID8gJ29rJyA6ICdlcnJvcic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndGltZWQgb3V0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZXJyb3InO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICAgICAgICAgIGNvbnN0IHB1c2ggPSB0aGlzLl9wdXNoKGFyZ3MudHlwZSwgYXJncywgb3B0cy50aW1lb3V0IHx8IHRoaXMudGltZW91dCk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MudHlwZSA9PT0gJ2Jyb2FkY2FzdCcgJiYgISgoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLnBhcmFtcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbmZpZykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmJyb2FkY2FzdCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmFjaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgnb2snKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHVzaC5yZWNlaXZlKCdvaycsICgpID0+IHJlc29sdmUoJ29rJykpO1xuICAgICAgICAgICAgICAgIHB1c2gucmVjZWl2ZSgnZXJyb3InLCAoKSA9PiByZXNvbHZlKCdlcnJvcicpKTtcbiAgICAgICAgICAgICAgICBwdXNoLnJlY2VpdmUoJ3RpbWVvdXQnLCAoKSA9PiByZXNvbHZlKCd0aW1lZCBvdXQnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBwYXlsb2FkIHRoYXQgd2lsbCBiZSBzZW50IHRoZSBuZXh0IHRpbWUgdGhlIGNoYW5uZWwgam9pbnMgKHJlY29ubmVjdHMpLlxuICAgICAqIFVzZWZ1bCBmb3Igcm90YXRpbmcgYWNjZXNzIHRva2VucyBvciB1cGRhdGluZyBjb25maWcgd2l0aG91dCByZS1jcmVhdGluZyB0aGUgY2hhbm5lbC5cbiAgICAgKi9cbiAgICB1cGRhdGVKb2luUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgIHRoaXMuam9pblB1c2gudXBkYXRlUGF5bG9hZChwYXlsb2FkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGVhdmVzIHRoZSBjaGFubmVsLlxuICAgICAqXG4gICAgICogVW5zdWJzY3JpYmVzIGZyb20gc2VydmVyIGV2ZW50cywgYW5kIGluc3RydWN0cyBjaGFubmVsIHRvIHRlcm1pbmF0ZSBvbiBzZXJ2ZXIuXG4gICAgICogVHJpZ2dlcnMgb25DbG9zZSgpIGhvb2tzLlxuICAgICAqXG4gICAgICogVG8gcmVjZWl2ZSBsZWF2ZSBhY2tub3dsZWRnZW1lbnRzLCB1c2UgdGhlIGEgYHJlY2VpdmVgIGhvb2sgdG8gYmluZCB0byB0aGUgc2VydmVyIGFjaywgaWU6XG4gICAgICogY2hhbm5lbC51bnN1YnNjcmliZSgpLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBhbGVydChcImxlZnQhXCIpIClcbiAgICAgKi9cbiAgICB1bnN1YnNjcmliZSh0aW1lb3V0ID0gdGhpcy50aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5sZWF2aW5nO1xuICAgICAgICBjb25zdCBvbkNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQubG9nKCdjaGFubmVsJywgYGxlYXZlICR7dGhpcy50b3BpY31gKTtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoQ0hBTk5FTF9FVkVOVFMuY2xvc2UsICdsZWF2ZScsIHRoaXMuX2pvaW5SZWYoKSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuam9pblB1c2guZGVzdHJveSgpO1xuICAgICAgICBsZXQgbGVhdmVQdXNoID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwge30sIHRpbWVvdXQpO1xuICAgICAgICAgICAgbGVhdmVQdXNoXG4gICAgICAgICAgICAgICAgLnJlY2VpdmUoJ29rJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG9uQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCdvaycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVjZWl2ZSgndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBvbkNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgndGltZWQgb3V0Jyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZWNlaXZlKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCdlcnJvcicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZWF2ZVB1c2guc2VuZCgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9jYW5QdXNoKCkpIHtcbiAgICAgICAgICAgICAgICBsZWF2ZVB1c2gudHJpZ2dlcignb2snLCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgbGVhdmVQdXNoID09PSBudWxsIHx8IGxlYXZlUHVzaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGVhdmVQdXNoLmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlYXJkb3duIHRoZSBjaGFubmVsLlxuICAgICAqXG4gICAgICogRGVzdHJveXMgYW5kIHN0b3BzIHJlbGF0ZWQgdGltZXJzLlxuICAgICAqL1xuICAgIHRlYXJkb3duKCkge1xuICAgICAgICB0aGlzLnB1c2hCdWZmZXIuZm9yRWFjaCgocHVzaCkgPT4gcHVzaC5kZXN0cm95KCkpO1xuICAgICAgICB0aGlzLnB1c2hCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpO1xuICAgICAgICB0aGlzLmpvaW5QdXNoLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmNsb3NlZDtcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IHt9O1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgYXN5bmMgX2ZldGNoV2l0aFRpbWVvdXQodXJsLCBvcHRpb25zLCB0aW1lb3V0KSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGNvbnN0IGlkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXQpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc29ja2V0LmZldGNoKHVybCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3B1c2goZXZlbnQsIHBheWxvYWQsIHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmpvaW5lZE9uY2UpIHtcbiAgICAgICAgICAgIHRocm93IGB0cmllZCB0byBwdXNoICcke2V2ZW50fScgdG8gJyR7dGhpcy50b3BpY30nIGJlZm9yZSBqb2luaW5nLiBVc2UgY2hhbm5lbC5zdWJzY3JpYmUoKSBiZWZvcmUgcHVzaGluZyBldmVudHNgO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwdXNoRXZlbnQgPSBuZXcgUHVzaCh0aGlzLCBldmVudCwgcGF5bG9hZCwgdGltZW91dCk7XG4gICAgICAgIGlmICh0aGlzLl9jYW5QdXNoKCkpIHtcbiAgICAgICAgICAgIHB1c2hFdmVudC5zZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hZGRUb1B1c2hCdWZmZXIocHVzaEV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHVzaEV2ZW50O1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2FkZFRvUHVzaEJ1ZmZlcihwdXNoRXZlbnQpIHtcbiAgICAgICAgcHVzaEV2ZW50LnN0YXJ0VGltZW91dCgpO1xuICAgICAgICB0aGlzLnB1c2hCdWZmZXIucHVzaChwdXNoRXZlbnQpO1xuICAgICAgICAvLyBFbmZvcmNlIGJ1ZmZlciBzaXplIGxpbWl0XG4gICAgICAgIGlmICh0aGlzLnB1c2hCdWZmZXIubGVuZ3RoID4gTUFYX1BVU0hfQlVGRkVSX1NJWkUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRQdXNoID0gdGhpcy5wdXNoQnVmZmVyLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZFB1c2gpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVkUHVzaC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQubG9nKCdjaGFubmVsJywgYGRpc2NhcmRlZCBwdXNoIGR1ZSB0byBidWZmZXIgb3ZlcmZsb3c6ICR7cmVtb3ZlZFB1c2guZXZlbnR9YCwgcmVtb3ZlZFB1c2gucGF5bG9hZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGFibGUgbWVzc2FnZSBob29rXG4gICAgICpcbiAgICAgKiBSZWNlaXZlcyBhbGwgZXZlbnRzIGZvciBzcGVjaWFsaXplZCBtZXNzYWdlIGhhbmRsaW5nIGJlZm9yZSBkaXNwYXRjaGluZyB0byB0aGUgY2hhbm5lbCBjYWxsYmFja3MuXG4gICAgICogTXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfb25NZXNzYWdlKF9ldmVudCwgcGF5bG9hZCwgX3JlZikge1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9pc01lbWJlcih0b3BpYykge1xuICAgICAgICByZXR1cm4gdGhpcy50b3BpYyA9PT0gdG9waWM7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfam9pblJlZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9pblB1c2gucmVmO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3RyaWdnZXIodHlwZSwgcGF5bG9hZCwgcmVmKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IHR5cGVMb3dlciA9IHR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgeyBjbG9zZSwgZXJyb3IsIGxlYXZlLCBqb2luIH0gPSBDSEFOTkVMX0VWRU5UUztcbiAgICAgICAgY29uc3QgZXZlbnRzID0gW2Nsb3NlLCBlcnJvciwgbGVhdmUsIGpvaW5dO1xuICAgICAgICBpZiAocmVmICYmIGV2ZW50cy5pbmRleE9mKHR5cGVMb3dlcikgPj0gMCAmJiByZWYgIT09IHRoaXMuX2pvaW5SZWYoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMuX29uTWVzc2FnZSh0eXBlTG93ZXIsIHBheWxvYWQsIHJlZik7XG4gICAgICAgIGlmIChwYXlsb2FkICYmICFoYW5kbGVkUGF5bG9hZCkge1xuICAgICAgICAgICAgdGhyb3cgJ2NoYW5uZWwgb25NZXNzYWdlIGNhbGxiYWNrcyBtdXN0IHJldHVybiB0aGUgcGF5bG9hZCwgbW9kaWZpZWQgb3IgdW5tb2RpZmllZCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFsnaW5zZXJ0JywgJ3VwZGF0ZScsICdkZWxldGUnXS5pbmNsdWRlcyh0eXBlTG93ZXIpKSB7XG4gICAgICAgICAgICAoX2EgPSB0aGlzLmJpbmRpbmdzLnBvc3RncmVzX2NoYW5nZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5maWx0ZXIoKGJpbmQpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgICAgICByZXR1cm4gKChfYSA9IGJpbmQuZmlsdGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXZlbnQpID09PSAnKicgfHwgKChfYyA9IChfYiA9IGJpbmQuZmlsdGVyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZXZlbnQpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50b0xvY2FsZUxvd2VyQ2FzZSgpKSA9PT0gdHlwZUxvd2VyO1xuICAgICAgICAgICAgfSkubWFwKChiaW5kKSA9PiBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIChfYiA9IHRoaXMuYmluZGluZ3NbdHlwZUxvd2VyXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICAgICAgICAgIGlmIChbJ2Jyb2FkY2FzdCcsICdwcmVzZW5jZScsICdwb3N0Z3Jlc19jaGFuZ2VzJ10uaW5jbHVkZXModHlwZUxvd2VyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJ2lkJyBpbiBiaW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaW5kSWQgPSBiaW5kLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmluZEV2ZW50ID0gKF9hID0gYmluZC5maWx0ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYmluZElkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfYiA9IHBheWxvYWQuaWRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaW5jbHVkZXMoYmluZElkKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmluZEV2ZW50ID09PSAnKicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpbmRFdmVudCA9PT0gbnVsbCB8fCBiaW5kRXZlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJpbmRFdmVudC50b0xvY2FsZUxvd2VyQ2FzZSgpKSA9PT0gKChfYyA9IHBheWxvYWQuZGF0YSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbmRFdmVudCA9IChfZSA9IChfZCA9IGJpbmQgPT09IG51bGwgfHwgYmluZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYmluZC5maWx0ZXIpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5ldmVudCkgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZEV2ZW50ID09PSAnKicgfHwgYmluZEV2ZW50ID09PSAoKF9mID0gcGF5bG9hZCA9PT0gbnVsbCB8fCBwYXlsb2FkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXlsb2FkLmV2ZW50KSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiaW5kLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gdHlwZUxvd2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLm1hcCgoYmluZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlZFBheWxvYWQgPT09ICdvYmplY3QnICYmICdpZHMnIGluIGhhbmRsZWRQYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc3RncmVzQ2hhbmdlcyA9IGhhbmRsZWRQYXlsb2FkLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgc2NoZW1hLCB0YWJsZSwgY29tbWl0X3RpbWVzdGFtcCwgdHlwZSwgZXJyb3JzIH0gPSBwb3N0Z3Jlc0NoYW5nZXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVucmljaGVkUGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0X3RpbWVzdGFtcDogY29tbWl0X3RpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldzoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBvbGQ6IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBlcnJvcnMsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZWRQYXlsb2FkID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBlbnJpY2hlZFBheWxvYWQpLCB0aGlzLl9nZXRQYXlsb2FkUmVjb3Jkcyhwb3N0Z3Jlc0NoYW5nZXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmluZC5jYWxsYmFjayhoYW5kbGVkUGF5bG9hZCwgcmVmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaXNDbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5jbG9zZWQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaXNKb2luZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5qb2luZWQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaXNKb2luaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZztcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9pc0xlYXZpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5sZWF2aW5nO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3JlcGx5RXZlbnROYW1lKHJlZikge1xuICAgICAgICByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbih0eXBlLCBmaWx0ZXIsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHR5cGVMb3dlciA9IHR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgYmluZGluZyA9IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGVMb3dlcixcbiAgICAgICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5iaW5kaW5nc1t0eXBlTG93ZXJdKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzW3R5cGVMb3dlcl0ucHVzaChiaW5kaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NbdHlwZUxvd2VyXSA9IFtiaW5kaW5nXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vZmYodHlwZSwgZmlsdGVyKSB7XG4gICAgICAgIGNvbnN0IHR5cGVMb3dlciA9IHR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRoaXMuYmluZGluZ3NbdHlwZUxvd2VyXSkge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1t0eXBlTG93ZXJdID0gdGhpcy5iaW5kaW5nc1t0eXBlTG93ZXJdLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gISgoKF9hID0gYmluZC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudG9Mb2NhbGVMb3dlckNhc2UoKSkgPT09IHR5cGVMb3dlciAmJlxuICAgICAgICAgICAgICAgICAgICBSZWFsdGltZUNoYW5uZWwuaXNFcXVhbChiaW5kLmZpbHRlciwgZmlsdGVyKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBpc0VxdWFsKG9iajEsIG9iajIpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9iajEpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMob2JqMikubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBrIGluIG9iajEpIHtcbiAgICAgICAgICAgIGlmIChvYmoxW2tdICE9PSBvYmoyW2tdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0d28gb3B0aW9uYWwgZmlsdGVyIHZhbHVlcyBmb3IgZXF1YWxpdHkuXG4gICAgICogVHJlYXRzIHVuZGVmaW5lZCwgbnVsbCwgYW5kIGVtcHR5IHN0cmluZyBhcyBlcXVpdmFsZW50IGVtcHR5IHZhbHVlcy5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNGaWx0ZXJWYWx1ZUVxdWFsKHNlcnZlclZhbHVlLCBjbGllbnRWYWx1ZSkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU2VydmVyID0gc2VydmVyVmFsdWUgIT09IG51bGwgJiYgc2VydmVyVmFsdWUgIT09IHZvaWQgMCA/IHNlcnZlclZhbHVlIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50ID0gY2xpZW50VmFsdWUgIT09IG51bGwgJiYgY2xpZW50VmFsdWUgIT09IHZvaWQgMCA/IGNsaWVudFZhbHVlIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZFNlcnZlciA9PT0gbm9ybWFsaXplZENsaWVudDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9yZWpvaW5VbnRpbENvbm5lY3RlZCgpIHtcbiAgICAgICAgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKTtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlam9pbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjaGFubmVsIGNsb3Nlcy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbkNsb3NlKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uKENIQU5ORUxfRVZFTlRTLmNsb3NlLCB7fSwgY2FsbGJhY2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2hhbm5lbCBlbmNvdW50ZXJlcyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbkVycm9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uKENIQU5ORUxfRVZFTlRTLmVycm9yLCB7fSwgKHJlYXNvbikgPT4gY2FsbGJhY2socmVhc29uKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIGFuZCB0aGUgY2hhbm5lbCBoYXMgYmVlbiBqb2luZWQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfY2FuUHVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkgJiYgdGhpcy5faXNKb2luZWQoKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9yZWpvaW4odGltZW91dCA9IHRoaXMudGltZW91dCkge1xuICAgICAgICBpZiAodGhpcy5faXNMZWF2aW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNvY2tldC5fbGVhdmVPcGVuVG9waWModGhpcy50b3BpYyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5qb2luaW5nO1xuICAgICAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9nZXRQYXlsb2FkUmVjb3JkcyhwYXlsb2FkKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZHMgPSB7XG4gICAgICAgICAgICBuZXc6IHt9LFxuICAgICAgICAgICAgb2xkOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBheWxvYWQudHlwZSA9PT0gJ0lOU0VSVCcgfHwgcGF5bG9hZC50eXBlID09PSAnVVBEQVRFJykge1xuICAgICAgICAgICAgcmVjb3Jkcy5uZXcgPSBUcmFuc2Zvcm1lcnMuY29udmVydENoYW5nZURhdGEocGF5bG9hZC5jb2x1bW5zLCBwYXlsb2FkLnJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBheWxvYWQudHlwZSA9PT0gJ1VQREFURScgfHwgcGF5bG9hZC50eXBlID09PSAnREVMRVRFJykge1xuICAgICAgICAgICAgcmVjb3Jkcy5vbGQgPSBUcmFuc2Zvcm1lcnMuY29udmVydENoYW5nZURhdGEocGF5bG9hZC5jb2x1bW5zLCBwYXlsb2FkLm9sZF9yZWNvcmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvcmRzO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWx0aW1lQ2hhbm5lbC5qcy5tYXAiXSwibmFtZXMiOlsiQ0hBTk5FTF9FVkVOVFMiLCJDSEFOTkVMX1NUQVRFUyIsIk1BWF9QVVNIX0JVRkZFUl9TSVpFIiwiUHVzaCIsIlRpbWVyIiwiUmVhbHRpbWVQcmVzZW5jZSIsIlRyYW5zZm9ybWVycyIsImh0dHBFbmRwb2ludFVSTCIsIlJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UIiwiUkVBTFRJTUVfTElTVEVOX1RZUEVTIiwiUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUyIsIlJFQUxUSU1FX0NIQU5ORUxfU1RBVEVTIiwiUmVhbHRpbWVDaGFubmVsIiwiY29uc3RydWN0b3IiLCJ0b3BpYyIsInBhcmFtcyIsImNvbmZpZyIsInNvY2tldCIsIl9hIiwiX2IiLCJiaW5kaW5ncyIsInN0YXRlIiwiY2xvc2VkIiwiam9pbmVkT25jZSIsInB1c2hCdWZmZXIiLCJzdWJUb3BpYyIsInJlcGxhY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJicm9hZGNhc3QiLCJhY2siLCJzZWxmIiwicHJlc2VuY2UiLCJrZXkiLCJlbmFibGVkIiwicHJpdmF0ZSIsInRpbWVvdXQiLCJqb2luUHVzaCIsImpvaW4iLCJyZWpvaW5UaW1lciIsIl9yZWpvaW5VbnRpbENvbm5lY3RlZCIsInJlY29ubmVjdEFmdGVyTXMiLCJyZWNlaXZlIiwiam9pbmVkIiwicmVzZXQiLCJmb3JFYWNoIiwicHVzaEV2ZW50Iiwic2VuZCIsIl9vbkNsb3NlIiwibG9nIiwiX2pvaW5SZWYiLCJfcmVtb3ZlIiwiX29uRXJyb3IiLCJyZWFzb24iLCJfaXNMZWF2aW5nIiwiX2lzQ2xvc2VkIiwiZXJyb3JlZCIsInNjaGVkdWxlVGltZW91dCIsIl9pc0pvaW5pbmciLCJfb24iLCJyZXBseSIsInBheWxvYWQiLCJyZWYiLCJfdHJpZ2dlciIsIl9yZXBseUV2ZW50TmFtZSIsImJyb2FkY2FzdEVuZHBvaW50VVJMIiwiZW5kUG9pbnQiLCJyZXBsYXkiLCJzdWJzY3JpYmUiLCJjYWxsYmFjayIsIl9jIiwiaXNDb25uZWN0ZWQiLCJjb25uZWN0IiwiaXNQcml2YXRlIiwicG9zdGdyZXNfY2hhbmdlcyIsIm1hcCIsInIiLCJmaWx0ZXIiLCJwcmVzZW5jZV9lbmFibGVkIiwiUFJFU0VOQ0UiLCJsZW5ndGgiLCJhY2Nlc3NUb2tlblBheWxvYWQiLCJhY2Nlc3NUb2tlblZhbHVlIiwiYWNjZXNzX3Rva2VuIiwiZSIsIkNIQU5ORUxfRVJST1IiLCJDTE9TRUQiLCJ1cGRhdGVKb2luUGF5bG9hZCIsIl9yZWpvaW4iLCJfaXNNYW51YWxUb2tlbiIsInNldEF1dGgiLCJ1bmRlZmluZWQiLCJTVUJTQ1JJQkVEIiwiY2xpZW50UG9zdGdyZXNCaW5kaW5ncyIsImJpbmRpbmdzTGVuIiwibmV3UG9zdGdyZXNCaW5kaW5ncyIsImkiLCJjbGllbnRQb3N0Z3Jlc0JpbmRpbmciLCJldmVudCIsInNjaGVtYSIsInRhYmxlIiwic2VydmVyUG9zdGdyZXNGaWx0ZXIiLCJpc0ZpbHRlclZhbHVlRXF1YWwiLCJwdXNoIiwiaWQiLCJ1bnN1YnNjcmliZSIsIkVycm9yIiwiZXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsdWVzIiwiVElNRURfT1VUIiwicHJlc2VuY2VTdGF0ZSIsInRyYWNrIiwib3B0cyIsInR5cGUiLCJ1bnRyYWNrIiwib24iLCJ0aGVuIiwiaHR0cFNlbmQiLCJQcm9taXNlIiwicmVqZWN0IiwiaGVhZGVycyIsImFwaWtleSIsImFwaUtleSIsIm9wdGlvbnMiLCJtZXRob2QiLCJib2R5IiwibWVzc2FnZXMiLCJyZXNwb25zZSIsIl9mZXRjaFdpdGhUaW1lb3V0Iiwic3RhdHVzIiwic3VjY2VzcyIsImVycm9yTWVzc2FnZSIsInN0YXR1c1RleHQiLCJlcnJvckJvZHkiLCJqc29uIiwibWVzc2FnZSIsImFyZ3MiLCJfY2FuUHVzaCIsImNvbnNvbGUiLCJ3YXJuIiwiZW5kcG9pbnRfcGF5bG9hZCIsImNhbmNlbCIsIm9rIiwibmFtZSIsInJlc29sdmUiLCJfcHVzaCIsInVwZGF0ZVBheWxvYWQiLCJsZWF2aW5nIiwib25DbG9zZSIsImNsb3NlIiwiZGVzdHJveSIsImxlYXZlUHVzaCIsImxlYXZlIiwidHJpZ2dlciIsImZpbmFsbHkiLCJ0ZWFyZG93biIsInVybCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJzZXRUaW1lb3V0IiwiYWJvcnQiLCJmZXRjaCIsInNpZ25hbCIsImNsZWFyVGltZW91dCIsIl9hZGRUb1B1c2hCdWZmZXIiLCJzdGFydFRpbWVvdXQiLCJyZW1vdmVkUHVzaCIsInNoaWZ0IiwiX29uTWVzc2FnZSIsIl9ldmVudCIsIl9yZWYiLCJfaXNNZW1iZXIiLCJ0eXBlTG93ZXIiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsImV2ZW50cyIsImluZGV4T2YiLCJoYW5kbGVkUGF5bG9hZCIsImluY2x1ZGVzIiwiYmluZCIsIl9kIiwiX2UiLCJfZiIsImJpbmRJZCIsImJpbmRFdmVudCIsImlkcyIsImRhdGEiLCJwb3N0Z3Jlc0NoYW5nZXMiLCJjb21taXRfdGltZXN0YW1wIiwiZXJyb3JzIiwiZW5yaWNoZWRQYXlsb2FkIiwiZXZlbnRUeXBlIiwibmV3Iiwib2xkIiwiX2dldFBheWxvYWRSZWNvcmRzIiwiX2lzSm9pbmVkIiwiam9pbmluZyIsImJpbmRpbmciLCJfb2ZmIiwiaXNFcXVhbCIsIm9iajEiLCJvYmoyIiwia2V5cyIsImsiLCJzZXJ2ZXJWYWx1ZSIsImNsaWVudFZhbHVlIiwibm9ybWFsaXplZFNlcnZlciIsIm5vcm1hbGl6ZWRDbGllbnQiLCJfbGVhdmVPcGVuVG9waWMiLCJyZXNlbmQiLCJyZWNvcmRzIiwiY29udmVydENoYW5nZURhdGEiLCJjb2x1bW5zIiwicmVjb3JkIiwib2xkX3JlY29yZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js":
|
||
/*!**************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js ***!
|
||
\**************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ RealtimeClient)\n/* harmony export */ });\n/* harmony import */ var _lib_websocket_factory__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/websocket-factory */ \"(ssr)/./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 */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\");\n/* harmony import */ var _lib_serializer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/serializer */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js\");\n/* harmony import */ var _lib_timer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/timer */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js\");\n/* harmony import */ var _lib_transformers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/transformers */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js\");\n/* harmony import */ var _RealtimeChannel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./RealtimeChannel */ \"(ssr)/./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 * 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 (...args)=>customFetch(...args);\n }\n return (...args)=>fetch(...args);\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 = `${endPoint}/${_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 /**\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(`${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: ${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, params = {\n config: {}\n }) {\n const realtimeTopic = `realtime:${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:${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\", `${topic} ${event} (${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(token = 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 \"${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 ? `(${ref})` : \"\";\n const status = payload.status || \"\";\n this.log(\"receive\", `${status} ${topic} ${event} ${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 ${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 ${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\", `${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 `${url}${prefix}${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, manual = 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(token = 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(context = \"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 ${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 ${event} callback`, e);\n }\n });\n } catch (e) {\n this.log(\"error\", `error triggering ${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: ${this.vsn}`);\n }\n // Handle worker setup\n if (this.worker) {\n if (false) {}\n this.workerUrl = options === null || options === void 0 ? void 0 : options.workerUrl;\n }\n }\n} //# sourceMappingURL=RealtimeClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lQ2xpZW50LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBdUQ7QUFDOEg7QUFDM0k7QUFDVjtBQUNxQjtBQUNMO0FBQ2hELE1BQU1lLE9BQU8sS0FBUTtBQUNyQiwrQkFBK0I7QUFDL0IsTUFBTUMsc0JBQXNCO0lBQ3hCQyxvQkFBb0I7SUFDcEJDLGlCQUFpQjtJQUNqQkMsNEJBQTRCO0FBQ2hDO0FBQ0EsTUFBTUMsc0JBQXNCO0lBQUM7SUFBTTtJQUFNO0lBQU07Q0FBTTtBQUNyRCxNQUFNQyw2QkFBNkI7QUFDbkMsTUFBTUMsZ0JBQWdCLENBQUM7Ozs7O0tBS2xCLENBQUM7QUFDUyxNQUFNQztJQUNqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBMkJDLEdBQ0RDLFlBQVlDLFFBQVEsRUFBRUMsT0FBTyxDQUFFO1FBQzNCLElBQUlDO1FBQ0osSUFBSSxDQUFDQyxnQkFBZ0IsR0FBRztRQUN4QixJQUFJLENBQUNDLE1BQU0sR0FBRztRQUNkLElBQUksQ0FBQ0MsaUJBQWlCLEdBQUc7UUFDekIsSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSUM7UUFDcEIsSUFBSSxDQUFDUCxRQUFRLEdBQUc7UUFDaEIsSUFBSSxDQUFDUSxZQUFZLEdBQUc7UUFDcEIsK0RBQStELEdBQy9ELElBQUksQ0FBQ0MsT0FBTyxHQUFHLENBQUM7UUFDaEIsSUFBSSxDQUFDQyxNQUFNLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQ0MsT0FBTyxHQUFHaEMsMkRBQWVBO1FBQzlCLElBQUksQ0FBQ2lDLFNBQVMsR0FBRztRQUNqQixJQUFJLENBQUNDLG1CQUFtQixHQUFHdEIsb0JBQW9CQyxrQkFBa0I7UUFDakUsSUFBSSxDQUFDc0IsY0FBYyxHQUFHQztRQUN0QixJQUFJLENBQUNDLG1CQUFtQixHQUFHO1FBQzNCLElBQUksQ0FBQ0MsaUJBQWlCLEdBQUczQjtRQUN6QixJ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SUFBSSxLQUFLLElBQUlBLFFBQVEwSCxNQUFNLE1BQU0sUUFBUXFFLE9BQU8sS0FBSyxJQUFJQSxLQUFNLENBQUMvRixTQUFTQztvQkFDaEgsT0FBT0EsU0FBU29HLEtBQUtFLEtBQUssQ0FBQ3ZHO2dCQUMvQjtnQkFDSjtZQUNKLEtBQUtqSCxxREFBU0E7Z0JBQ1YsSUFBSSxDQUFDbUgsTUFBTSxHQUFHLENBQUM4RixLQUFLaE0sWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFrRyxNQUFNLE1BQU0sUUFBUThGLE9BQU8sS0FBSyxJQUFJQSxLQUFLLElBQUksQ0FBQ3pLLFVBQVUsQ0FBQzJFLE1BQU0sQ0FBQ3NHLElBQUksQ0FBQyxJQUFJLENBQUNqTCxVQUFVO2dCQUNsSyxJQUFJLENBQUNtRyxNQUFNLEdBQUcsQ0FBQ3VFLEtBQUtqTSxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUTBILE1BQU0sTUFBTSxRQUFRdUUsT0FBTyxLQUFLLElBQUlBLEtBQUssSUFBSSxDQUFDMUssVUFBVSxDQUFDbUcsTUFBTSxDQUFDOEUsSUFBSSxDQUFDLElBQUksQ0FBQ2pMLFVBQVU7Z0JBQ2xLO1lBQ0o7Z0JBQ0ksTUFBTSxJQUFJZSxNQUFNLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxDQUFDbkIsR0FBRyxDQUFDLENBQUM7UUFDckU7UUFDQSxzQkFBc0I7UUFDdEIsSUFBSSxJQUFJLENBQUMrSCxNQUFNLEVBQUU7WUFDYixJQUFJLEtBQStDLEVBQUUsRUFFcEQ7WUFDRCxJQUFJLENBQUNLLFNBQVMsR0FBR3ZKLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRdUosU0FBUztRQUN4RjtJQUNKO0FBQ0osRUFDQSwwQ0FBMEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lQ2xpZW50LmpzPzZiNmQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdlYlNvY2tldEZhY3RvcnkgZnJvbSAnLi9saWIvd2Vic29ja2V0LWZhY3RvcnknO1xuaW1wb3J0IHsgQ0hBTk5FTF9FVkVOVFMsIENPTk5FQ1RJT05fU1RBVEUsIERFRkFVTFRfVkVSU0lPTiwgREVGQVVMVF9USU1FT1VULCBTT0NLRVRfU1RBVEVTLCBUUkFOU1BPUlRTLCBERUZBVUxUX1ZTTiwgVlNOXzFfMF8wLCBWU05fMl8wXzAsIFdTX0NMT1NFX05PUk1BTCwgfSBmcm9tICcuL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IFNlcmlhbGl6ZXIgZnJvbSAnLi9saWIvc2VyaWFsaXplcic7XG5pbXBvcnQgVGltZXIgZnJvbSAnLi9saWIvdGltZXInO1xuaW1wb3J0IHsgaHR0cEVuZHBvaW50VVJMIH0gZnJvbSAnLi9saWIvdHJhbnNmb3JtZXJzJztcbmltcG9ydCBSZWFsdGltZUNoYW5uZWwgZnJvbSAnLi9SZWFsdGltZUNoYW5uZWwnO1xuY29uc3Qgbm9vcCA9ICgpID0+IHsgfTtcbi8vIENvbm5lY3Rpb24tcmVsYXRlZCBjb25zdGFudHNcbmNvbnN0IENPTk5FQ1RJT05fVElNRU9VVFMgPSB7XG4gICAgSEVBUlRCRUFUX0lOVEVSVkFMOiAyNTAwMCxcbiAgICBSRUNPTk5FQ1RfREVMQVk6IDEwLFxuICAgIEhFQVJUQkVBVF9USU1FT1VUX0ZBTExCQUNLOiAxMDAsXG59O1xuY29uc3QgUkVDT05ORUNUX0lOVEVSVkFMUyA9IFsxMDAwLCAyMDAwLCA1MDAwLCAxMDAwMF07XG5jb25zdCBERUZBVUxUX1JFQ09OTkVDVF9GQUxMQkFDSyA9IDEwMDAwO1xuY29uc3QgV09SS0VSX1NDUklQVCA9IGBcbiAgYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKGUpID0+IHtcbiAgICBpZiAoZS5kYXRhLmV2ZW50ID09PSBcInN0YXJ0XCIpIHtcbiAgICAgIHNldEludGVydmFsKCgpID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFwia2VlcEFsaXZlXCIgfSksIGUuZGF0YS5pbnRlcnZhbCk7XG4gICAgfVxuICB9KTtgO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVhbHRpbWVDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRoZSBTb2NrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW5kUG9pbnQgVGhlIHN0cmluZyBXZWJTb2NrZXQgZW5kcG9pbnQsIGllLCBcIndzOi8vZXhhbXBsZS5jb20vc29ja2V0XCIsIFwid3NzOi8vZXhhbXBsZS5jb21cIiwgXCIvc29ja2V0XCIgKGluaGVyaXRlZCBob3N0ICYgcHJvdG9jb2wpXG4gICAgICogQHBhcmFtIGh0dHBFbmRwb2ludCBUaGUgc3RyaW5nIEhUVFAgZW5kcG9pbnQsIGllLCBcImh0dHBzOi8vZXhhbXBsZS5jb21cIiwgXCIvXCIgKGluaGVyaXRlZCBob3N0ICYgcHJvdG9jb2wpXG4gICAgICogQHBhcmFtIG9wdGlvbnMudHJhbnNwb3J0IFRoZSBXZWJzb2NrZXQgVHJhbnNwb3J0LCBmb3IgZXhhbXBsZSBXZWJTb2NrZXQuIFRoaXMgY2FuIGJlIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnMudGltZW91dCBUaGUgZGVmYXVsdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byB0cmlnZ2VyIHB1c2ggdGltZW91dHMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMucGFyYW1zIFRoZSBvcHRpb25hbCBwYXJhbXMgdG8gcGFzcyB3aGVuIGNvbm5lY3RpbmcuXG4gICAgICogQHBhcmFtIG9wdGlvbnMuaGVhZGVycyBEZXByZWNhdGVkOiBoZWFkZXJzIGNhbm5vdCBiZSBzZXQgb24gd2Vic29ja2V0IGNvbm5lY3Rpb25zIGFuZCB0aGlzIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5oZWFydGJlYXRJbnRlcnZhbE1zIFRoZSBtaWxsaXNlYyBpbnRlcnZhbCB0byBzZW5kIGEgaGVhcnRiZWF0IG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMuaGVhcnRiZWF0Q2FsbGJhY2sgVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGhhbmRsZSBoZWFydGJlYXQgc3RhdHVzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLmxvZ2dlciBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gZm9yIHNwZWNpYWxpemVkIGxvZ2dpbmcsIGllOiBsb2dnZXI6IChraW5kLCBtc2csIGRhdGEpID0+IHsgY29uc29sZS5sb2coYCR7a2luZH06ICR7bXNnfWAsIGRhdGEpIH1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5sb2dMZXZlbCBTZXRzIHRoZSBsb2cgbGV2ZWwgZm9yIFJlYWx0aW1lXG4gICAgICogQHBhcmFtIG9wdGlvbnMuZW5jb2RlIFRoZSBmdW5jdGlvbiB0byBlbmNvZGUgb3V0Z29pbmcgbWVzc2FnZXMuIERlZmF1bHRzIHRvIEpTT046IChwYXlsb2FkLCBjYWxsYmFjaykgPT4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgICogQHBhcmFtIG9wdGlvbnMuZGVjb2RlIFRoZSBmdW5jdGlvbiB0byBkZWNvZGUgaW5jb21pbmcgbWVzc2FnZXMuIERlZmF1bHRzIHRvIFNlcmlhbGl6ZXIncyBkZWNvZGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMucmVjb25uZWN0QWZ0ZXJNcyBoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxzZWMgcmVjb25uZWN0IGludGVydmFsLiBEZWZhdWx0cyB0byBzdGVwcGVkIGJhY2tvZmYgb2ZmLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLndvcmtlciBVc2UgV2ViIFdvcmtlciB0byBzZXQgYSBzaWRlIGZsb3cuIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLndvcmtlclVybCBUaGUgVVJMIG9mIHRoZSB3b3JrZXIgc2NyaXB0LiBEZWZhdWx0cyB0byBodHRwczovL3JlYWx0aW1lLnN1cGFiYXNlLmNvbS93b3JrZXIuanMgdGhhdCBpbmNsdWRlcyBhIGhlYXJ0YmVhdCBldmVudCBjYWxsIHRvIGtlZXAgdGhlIGNvbm5lY3Rpb24gYWxpdmUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCBSZWFsdGltZUNsaWVudCBmcm9tICdAc3VwYWJhc2UvcmVhbHRpbWUtanMnXG4gICAgICpcbiAgICAgKiBjb25zdCBjbGllbnQgPSBuZXcgUmVhbHRpbWVDbGllbnQoJ2h0dHBzOi8veHl6Y29tcGFueS5zdXBhYmFzZS5jby9yZWFsdGltZS92MScsIHtcbiAgICAgKiAgIHBhcmFtczogeyBhcGlrZXk6ICdwdWJsaWMtYW5vbi1rZXknIH0sXG4gICAgICogfSlcbiAgICAgKiBjbGllbnQuY29ubmVjdCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZW5kUG9pbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmFwaUtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuX21hbnVhbGx5U2V0VG9rZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFubmVscyA9IG5ldyBBcnJheSgpO1xuICAgICAgICB0aGlzLmVuZFBvaW50ID0gJyc7XG4gICAgICAgIHRoaXMuaHR0cEVuZHBvaW50ID0gJyc7XG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCBoZWFkZXJzIGNhbm5vdCBiZSBzZXQgb24gd2Vic29ja2V0IGNvbm5lY3Rpb25zICovXG4gICAgICAgIHRoaXMuaGVhZGVycyA9IHt9O1xuICAgICAgICB0aGlzLnBhcmFtcyA9IHt9O1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQ7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zID0gQ09OTkVDVElPTl9USU1FT1VUUy5IRUFSVEJFQVRfSU5URVJWQUw7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGw7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2sgPSBub29wO1xuICAgICAgICB0aGlzLnJlZiA9IDA7XG4gICAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnZzbiA9IERFRkFVTFRfVlNOO1xuICAgICAgICB0aGlzLmxvZ2dlciA9IG5vb3A7XG4gICAgICAgIHRoaXMuY29ubiA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplcigpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzID0ge1xuICAgICAgICAgICAgb3BlbjogW10sXG4gICAgICAgICAgICBjbG9zZTogW10sXG4gICAgICAgICAgICBlcnJvcjogW10sXG4gICAgICAgICAgICBtZXNzYWdlOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25TdGF0ZSA9ICdkaXNjb25uZWN0ZWQnO1xuICAgICAgICB0aGlzLl93YXNNYW51YWxEaXNjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2F1dGhQcm9taXNlID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBlaXRoZXIgY3VzdG9tIGZldGNoLCBpZiBwcm92aWRlZCwgb3IgZGVmYXVsdCBmZXRjaCB0byBtYWtlIEhUVFAgcmVxdWVzdHNcbiAgICAgICAgICpcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9yZXNvbHZlRmV0Y2ggPSAoY3VzdG9tRmV0Y2gpID0+IHtcbiAgICAgICAgICAgIGlmIChjdXN0b21GZXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoLi4uYXJncykgPT4gY3VzdG9tRmV0Y2goLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IGZldGNoKC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBwYXJhbWV0ZXJzXG4gICAgICAgIGlmICghKChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wYXJhbXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hcGlrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FQSSBrZXkgaXMgcmVxdWlyZWQgdG8gY29ubmVjdCB0byBSZWFsdGltZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBpS2V5ID0gb3B0aW9ucy5wYXJhbXMuYXBpa2V5O1xuICAgICAgICAvLyBJbml0aWFsaXplIGVuZHBvaW50IFVSTHNcbiAgICAgICAgdGhpcy5lbmRQb2ludCA9IGAke2VuZFBvaW50fS8ke1RSQU5TUE9SVFMud2Vic29ja2V0fWA7XG4gICAgICAgIHRoaXMuaHR0cEVuZHBvaW50ID0gaHR0cEVuZHBvaW50VVJMKGVuZFBvaW50KTtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3NldHVwUmVjb25uZWN0aW9uVGltZXIoKTtcbiAgICAgICAgdGhpcy5mZXRjaCA9IHRoaXMuX3Jlc29sdmVGZXRjaChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmV0Y2gpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25uZWN0cyB0aGUgc29ja2V0LCB1bmxlc3MgYWxyZWFkeSBjb25uZWN0ZWQuXG4gICAgICovXG4gICAgY29ubmVjdCgpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGNvbm5lY3RpbmcsIGRpc2Nvbm5lY3RpbmcsIG9yIGNvbm5lY3RlZFxuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RpbmcoKSB8fFxuICAgICAgICAgICAgdGhpcy5pc0Rpc2Nvbm5lY3RpbmcoKSB8fFxuICAgICAgICAgICAgKHRoaXMuY29ubiAhPT0gbnVsbCAmJiB0aGlzLmlzQ29ubmVjdGVkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0aW5nJyk7XG4gICAgICAgIC8vIFRyaWdnZXIgYXV0aCBpZiBuZWVkZWQgYW5kIG5vdCBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBhdXRoIGlzIGNhbGxlZCBmb3Igc3RhbmRhbG9uZSBSZWFsdGltZUNsaWVudCB1c2FnZVxuICAgICAgICAvLyB3aGlsZSBhdm9pZGluZyByYWNlIGNvbmRpdGlvbnMgd2l0aCBTdXBhYmFzZUNsaWVudCdzIGltbWVkaWF0ZSBzZXRBdXRoIGNhbGxcbiAgICAgICAgaWYgKHRoaXMuYWNjZXNzVG9rZW4gJiYgIXRoaXMuX2F1dGhQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRBdXRoU2FmZWx5KCdjb25uZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXN0YWJsaXNoIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLnRyYW5zcG9ydCkge1xuICAgICAgICAgICAgLy8gVXNlIGN1c3RvbSB0cmFuc3BvcnQgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIHRoaXMuY29ubiA9IG5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZHBvaW50VVJMKCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIHVzZSBuYXRpdmUgV2ViU29ja2V0XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubiA9IFdlYlNvY2tldEZhY3RvcnkuY3JlYXRlV2ViU29ja2V0KHRoaXMuZW5kcG9pbnRVUkwoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgLy8gUHJvdmlkZSBoZWxwZnVsIGVycm9yIG1lc3NhZ2UgYmFzZWQgb24gZW52aXJvbm1lbnRcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdOb2RlLmpzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yTWVzc2FnZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdUbyB1c2UgUmVhbHRpbWUgaW4gTm9kZS5qcywgeW91IG5lZWQgdG8gcHJvdmlkZSBhIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbjpcXG5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdPcHRpb24gMTogVXNlIE5vZGUuanMgMjIrIHdoaWNoIGhhcyBuYXRpdmUgV2ViU29ja2V0IHN1cHBvcnRcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdPcHRpb24gMjogSW5zdGFsbCBhbmQgcHJvdmlkZSB0aGUgXCJ3c1wiIHBhY2thZ2U6XFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICBucG0gaW5zdGFsbCB3c1xcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgaW1wb3J0IHdzIGZyb20gXCJ3c1wiXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICBjb25zdCBjbGllbnQgPSBuZXcgUmVhbHRpbWVDbGllbnQodXJsLCB7XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgIC4uLm9wdGlvbnMsXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgIHRyYW5zcG9ydDogd3NcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgIH0pJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2ViU29ja2V0IG5vdCBhdmFpbGFibGU6ICR7ZXJyb3JNZXNzYWdlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldHVwQ29ubmVjdGlvbkhhbmRsZXJzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIFVSTCBvZiB0aGUgd2Vic29ja2V0LlxuICAgICAqIEByZXR1cm5zIHN0cmluZyBUaGUgVVJMIG9mIHRoZSB3ZWJzb2NrZXQuXG4gICAgICovXG4gICAgZW5kcG9pbnRVUkwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBlbmRQYXJhbXModGhpcy5lbmRQb2ludCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXJhbXMsIHsgdnNuOiB0aGlzLnZzbiB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29kZSBBIG51bWVyaWMgc3RhdHVzIGNvZGUgdG8gc2VuZCBvbiBkaXNjb25uZWN0LlxuICAgICAqIEBwYXJhbSByZWFzb24gQSBjdXN0b20gcmVhc29uIGZvciB0aGUgZGlzY29ubmVjdC5cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KGNvZGUsIHJlYXNvbikge1xuICAgICAgICBpZiAodGhpcy5pc0Rpc2Nvbm5lY3RpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGluZycsIHRydWUpO1xuICAgICAgICBpZiAodGhpcy5jb25uKSB7XG4gICAgICAgICAgICAvLyBTZXR1cCBmYWxsYmFjayB0aW1lciB0byBwcmV2ZW50IGhhbmdpbmcgaW4gZGlzY29ubmVjdGluZyBzdGF0ZVxuICAgICAgICAgICAgY29uc3QgZmFsbGJhY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgdGhpcy5jb25uLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGZhbGxiYWNrVGltZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlmIGNsb3NlIG1ldGhvZCBleGlzdHNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25uLmNsb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiAhPT0gbnVsbCAmJiByZWFzb24gIT09IHZvaWQgMCA/IHJlYXNvbiA6ICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3RlYXJkb3duQ29ubmVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBjcmVhdGVkIGNoYW5uZWxzXG4gICAgICovXG4gICAgZ2V0Q2hhbm5lbHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWxzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbnN1YnNjcmliZXMgYW5kIHJlbW92ZXMgYSBzaW5nbGUgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBjaGFubmVsIEEgUmVhbHRpbWVDaGFubmVsIGluc3RhbmNlXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGNoYW5uZWwudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKHRoaXMuY2hhbm5lbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbnN1YnNjcmliZXMgYW5kIHJlbW92ZXMgYWxsIGNoYW5uZWxzXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlQWxsQ2hhbm5lbHMoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlc18xID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5jaGFubmVscy5tYXAoKGNoYW5uZWwpID0+IGNoYW5uZWwudW5zdWJzY3JpYmUoKSkpO1xuICAgICAgICB0aGlzLmNoYW5uZWxzID0gW107XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgICByZXR1cm4gdmFsdWVzXzE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZ3MgdGhlIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBGb3IgY3VzdG9taXplZCBsb2dnaW5nLCBgdGhpcy5sb2dnZXJgIGNhbiBiZSBvdmVycmlkZGVuLlxuICAgICAqL1xuICAgIGxvZyhraW5kLCBtc2csIGRhdGEpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIoa2luZCwgbXNnLCBkYXRhKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc29ja2V0LlxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25TdGF0ZSgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmNvbm4gJiYgdGhpcy5jb25uLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nOlxuICAgICAgICAgICAgICAgIHJldHVybiBDT05ORUNUSU9OX1NUQVRFLkNvbm5lY3Rpbmc7XG4gICAgICAgICAgICBjYXNlIFNPQ0tFVF9TVEFURVMub3BlbjpcbiAgICAgICAgICAgICAgICByZXR1cm4gQ09OTkVDVElPTl9TVEFURS5PcGVuO1xuICAgICAgICAgICAgY2FzZSBTT0NLRVRfU1RBVEVTLmNsb3Npbmc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIENPTk5FQ1RJT05fU1RBVEUuQ2xvc2luZztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIENPTk5FQ1RJT05fU1RBVEUuQ2xvc2VkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlzIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4uXG4gICAgICovXG4gICAgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25TdGF0ZSgpID09PSBDT05ORUNUSU9OX1NUQVRFLk9wZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBjb25uZWN0aW9uIGlzIGN1cnJlbnRseSBjb25uZWN0aW5nLlxuICAgICAqL1xuICAgIGlzQ29ubmVjdGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25TdGF0ZSA9PT0gJ2Nvbm5lY3RpbmcnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkgZGlzY29ubmVjdGluZy5cbiAgICAgKi9cbiAgICBpc0Rpc2Nvbm5lY3RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uU3RhdGUgPT09ICdkaXNjb25uZWN0aW5nJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyAob3IgcmV1c2VzKSBhIHtAbGluayBSZWFsdGltZUNoYW5uZWx9IGZvciB0aGUgcHJvdmlkZWQgdG9waWMuXG4gICAgICpcbiAgICAgKiBUb3BpY3MgYXJlIGF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aCBgcmVhbHRpbWU6YCB0byBtYXRjaCB0aGUgUmVhbHRpbWUgc2VydmljZS5cbiAgICAgKiBJZiBhIGNoYW5uZWwgd2l0aCB0aGUgc2FtZSB0b3BpYyBhbHJlYWR5IGV4aXN0cyBpdCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgY3JlYXRpbmdcbiAgICAgKiBhIGR1cGxpY2F0ZSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIGNoYW5uZWwodG9waWMsIHBhcmFtcyA9IHsgY29uZmlnOiB7fSB9KSB7XG4gICAgICAgIGNvbnN0IHJlYWx0aW1lVG9waWMgPSBgcmVhbHRpbWU6JHt0b3BpY31gO1xuICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmdldENoYW5uZWxzKCkuZmluZCgoYykgPT4gYy50b3BpYyA9PT0gcmVhbHRpbWVUb3BpYyk7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFuID0gbmV3IFJlYWx0aW1lQ2hhbm5lbChgcmVhbHRpbWU6JHt0b3BpY31gLCBwYXJhbXMsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5jaGFubmVscy5wdXNoKGNoYW4pO1xuICAgICAgICAgICAgcmV0dXJuIGNoYW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RzO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1c2ggb3V0IGEgbWVzc2FnZSBpZiB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBzb2NrZXQgaXMgbm90IGNvbm5lY3RlZCwgdGhlIG1lc3NhZ2UgZ2V0cyBlbnF1ZXVlZCB3aXRoaW4gYSBsb2NhbCBidWZmZXIsIGFuZCBzZW50IG91dCB3aGVuIGEgY29ubmVjdGlvbiBpcyBuZXh0IGVzdGFibGlzaGVkLlxuICAgICAqL1xuICAgIHB1c2goZGF0YSkge1xuICAgICAgICBjb25zdCB7IHRvcGljLCBldmVudCwgcGF5bG9hZCwgcmVmIH0gPSBkYXRhO1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW5jb2RlKGRhdGEsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgKF9hID0gdGhpcy5jb25uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2VuZChyZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubG9nKCdwdXNoJywgYCR7dG9waWN9ICR7ZXZlbnR9ICgke3JlZn0pYCwgcGF5bG9hZCk7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRCdWZmZXIucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgSldUIGFjY2VzcyB0b2tlbiB1c2VkIGZvciBjaGFubmVsIHN1YnNjcmlwdGlvbiBhdXRob3JpemF0aW9uIGFuZCBSZWFsdGltZSBSTFMuXG4gICAgICpcbiAgICAgKiBJZiBwYXJhbSBpcyBudWxsIGl0IHdpbGwgdXNlIHRoZSBgYWNjZXNzVG9rZW5gIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIHRoZSB0b2tlbiBzZXQgb24gdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIE9uIGNhbGxiYWNrIHVzZWQsIGl0IHdpbGwgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgdG9rZW4gaW50ZXJuYWwgdG8gdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIFdoZW4gYSB0b2tlbiBpcyBleHBsaWNpdGx5IHByb3ZpZGVkLCBpdCB3aWxsIGJlIHByZXNlcnZlZCBhY3Jvc3MgY2hhbm5lbCBvcGVyYXRpb25zXG4gICAgICogKGluY2x1ZGluZyByZW1vdmVDaGFubmVsIGFuZCByZXN1YnNjcmliZSkuIFRoZSBgYWNjZXNzVG9rZW5gIGNhbGxiYWNrIHdpbGwgbm90IGJlXG4gICAgICogaW52b2tlZCB1bnRpbCBgc2V0QXV0aCgpYCBpcyBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9rZW4gQSBKV1Qgc3RyaW5nIHRvIG92ZXJyaWRlIHRoZSB0b2tlbiBzZXQgb24gdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gVXNlIGEgbWFudWFsIHRva2VuIChwcmVzZXJ2ZWQgYWNyb3NzIHJlc3Vic2NyaWJlcywgaWdub3JlcyBhY2Nlc3NUb2tlbiBjYWxsYmFjaylcbiAgICAgKiBjbGllbnQucmVhbHRpbWUuc2V0QXV0aCgnbXktY3VzdG9tLWp3dCcpXG4gICAgICpcbiAgICAgKiAvLyBTd2l0Y2ggYmFjayB0byB1c2luZyB0aGUgYWNjZXNzVG9rZW4gY2FsbGJhY2tcbiAgICAgKiBjbGllbnQucmVhbHRpbWUuc2V0QXV0aCgpXG4gICAgICovXG4gICAgYXN5bmMgc2V0QXV0aCh0b2tlbiA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fYXV0aFByb21pc2UgPSB0aGlzLl9wZXJmb3JtQXV0aCh0b2tlbik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9hdXRoUHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2F1dGhQcm9taXNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgYWNjZXNzIHRva2VuIHdhcyBleHBsaWNpdGx5IHNldCB2aWEgc2V0QXV0aCh0b2tlbiksXG4gICAgICogZmFsc2UgaWYgaXQgd2FzIG9idGFpbmVkIHZpYSB0aGUgYWNjZXNzVG9rZW4gY2FsbGJhY2suXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2lzTWFudWFsVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYW51YWxseVNldFRva2VuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIGhlYXJ0YmVhdCBtZXNzYWdlIGlmIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkLlxuICAgICAqL1xuICAgIGFzeW5jIHNlbmRIZWFydGJlYXQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFydGJlYXRDYWxsYmFjaygnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsICdlcnJvciBpbiBoZWFydGJlYXQgY2FsbGJhY2snLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGUgaGVhcnRiZWF0IHRpbWVvdXQgYW5kIGZvcmNlIHJlY29ubmVjdGlvbiBpZiBuZWVkZWRcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZikge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMubG9nKCd0cmFuc3BvcnQnLCAnaGVhcnRiZWF0IHRpbWVvdXQuIEF0dGVtcHRpbmcgdG8gcmUtZXN0YWJsaXNoIGNvbm5lY3Rpb24nKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFydGJlYXRDYWxsYmFjaygndGltZW91dCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnZXJyb3IgaW4gaGVhcnRiZWF0IGNhbGxiYWNrJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb3JjZSByZWNvbm5lY3Rpb24gYWZ0ZXIgaGVhcnRiZWF0IHRpbWVvdXRcbiAgICAgICAgICAgIHRoaXMuX3dhc01hbnVhbERpc2Nvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIChfYSA9IHRoaXMuY29ubikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsb3NlKFdTX0NMT1NFX05PUk1BTCwgJ2hlYXJ0YmVhdCB0aW1lb3V0Jyk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgKF9hID0gdGhpcy5yZWNvbm5lY3RUaW1lcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIENPTk5FQ1RJT05fVElNRU9VVFMuSEVBUlRCRUFUX1RJTUVPVVRfRkFMTEJBQ0spO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlbmQgaGVhcnRiZWF0IG1lc3NhZ2UgdG8gc2VydmVyXG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IHRoaXMuX21ha2VSZWYoKTtcbiAgICAgICAgdGhpcy5wdXNoKHtcbiAgICAgICAgICAgIHRvcGljOiAncGhvZW5peCcsXG4gICAgICAgICAgICBldmVudDogJ2hlYXJ0YmVhdCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7fSxcbiAgICAgICAgICAgIHJlZjogdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmLFxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2soJ3NlbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgJ2Vycm9yIGluIGhlYXJ0YmVhdCBjYWxsYmFjaycsIGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldEF1dGhTYWZlbHkoJ2hlYXJ0YmVhdCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdGhhdCByZWNlaXZlcyBsaWZlY3ljbGUgZXZlbnRzIGZvciBpbnRlcm5hbCBoZWFydGJlYXQgbWVzc2FnZXMuXG4gICAgICogVXNlZnVsIGZvciBpbnN0cnVtZW50aW5nIGNvbm5lY3Rpb24gaGVhbHRoIChlLmcuIHNlbnQvb2svdGltZW91dC9kaXNjb25uZWN0ZWQpLlxuICAgICAqL1xuICAgIG9uSGVhcnRiZWF0KGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmx1c2hlcyBzZW5kIGJ1ZmZlclxuICAgICAqL1xuICAgIGZsdXNoU2VuZEJ1ZmZlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLnNlbmRCdWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zZW5kQnVmZmVyLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjaygpKTtcbiAgICAgICAgICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbmV4dCBtZXNzYWdlIHJlZiwgYWNjb3VudGluZyBmb3Igb3ZlcmZsb3dzXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfbWFrZVJlZigpIHtcbiAgICAgICAgbGV0IG5ld1JlZiA9IHRoaXMucmVmICsgMTtcbiAgICAgICAgaWYgKG5ld1JlZiA9PT0gdGhpcy5yZWYpIHtcbiAgICAgICAgICAgIHRoaXMucmVmID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVmID0gbmV3UmVmO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZi50b1N0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbnN1YnNjcmliZSBmcm9tIGNoYW5uZWxzIHdpdGggdGhlIHNwZWNpZmllZCB0b3BpYy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9sZWF2ZU9wZW5Ub3BpYyh0b3BpYykge1xuICAgICAgICBsZXQgZHVwQ2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZmluZCgoYykgPT4gYy50b3BpYyA9PT0gdG9waWMgJiYgKGMuX2lzSm9pbmVkKCkgfHwgYy5faXNKb2luaW5nKCkpKTtcbiAgICAgICAgaWYgKGR1cENoYW5uZWwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKCd0cmFuc3BvcnQnLCBgbGVhdmluZyBkdXBsaWNhdGUgdG9waWMgXCIke3RvcGljfVwiYCk7XG4gICAgICAgICAgICBkdXBDaGFubmVsLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHN1YnNjcmlwdGlvbiBmcm9tIHRoZSBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBBbiBvcGVuIHN1YnNjcmlwdGlvbi5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9yZW1vdmUoY2hhbm5lbCkge1xuICAgICAgICB0aGlzLmNoYW5uZWxzID0gdGhpcy5jaGFubmVscy5maWx0ZXIoKGMpID0+IGMudG9waWMgIT09IGNoYW5uZWwudG9waWMpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX29uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSkge1xuICAgICAgICB0aGlzLmRlY29kZShyYXdNZXNzYWdlLmRhdGEsIChtc2cpID0+IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBoZWFydGJlYXQgcmVzcG9uc2VzXG4gICAgICAgICAgICBpZiAobXNnLnRvcGljID09PSAncGhvZW5peCcgJiYgbXNnLmV2ZW50ID09PSAncGh4X3JlcGx5Jykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2sobXNnLnBheWxvYWQuc3RhdHVzID09PSAnb2snID8gJ29rJyA6ICdlcnJvcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnZXJyb3IgaW4gaGVhcnRiZWF0IGNhbGxiYWNrJywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFuZGxlIHBlbmRpbmcgaGVhcnRiZWF0IHJlZmVyZW5jZSBjbGVhbnVwXG4gICAgICAgICAgICBpZiAobXNnLnJlZiAmJiBtc2cucmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTG9nIGluY29taW5nIG1lc3NhZ2VcbiAgICAgICAgICAgIGNvbnN0IHsgdG9waWMsIGV2ZW50LCBwYXlsb2FkLCByZWYgfSA9IG1zZztcbiAgICAgICAgICAgIGNvbnN0IHJlZlN0cmluZyA9IHJlZiA/IGAoJHtyZWZ9KWAgOiAnJztcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHBheWxvYWQuc3RhdHVzIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5sb2coJ3JlY2VpdmUnLCBgJHtzdGF0dXN9ICR7dG9waWN9ICR7ZXZlbnR9ICR7cmVmU3RyaW5nfWAudHJpbSgpLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIC8vIFJvdXRlIG1lc3NhZ2UgdG8gYXBwcm9wcmlhdGUgY2hhbm5lbHNcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChjaGFubmVsKSA9PiBjaGFubmVsLl9pc01lbWJlcih0b3BpYykpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKGNoYW5uZWwpID0+IGNoYW5uZWwuX3RyaWdnZXIoZXZlbnQsIHBheWxvYWQsIHJlZikpO1xuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlclN0YXRlQ2FsbGJhY2tzKCdtZXNzYWdlJywgbXNnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFyIHNwZWNpZmljIHRpbWVyXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2NsZWFyVGltZXIodGltZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGltZXIgPT09ICdoZWFydGJlYXQnICYmIHRoaXMuaGVhcnRiZWF0VGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRUaW1lcik7XG4gICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRpbWVyID09PSAncmVjb25uZWN0Jykge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5yZWNvbm5lY3RUaW1lcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHRpbWVyc1xuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9jbGVhckFsbFRpbWVycygpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lcignaGVhcnRiZWF0Jyk7XG4gICAgICAgIHRoaXMuX2NsZWFyVGltZXIoJ3JlY29ubmVjdCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXR1cCBjb25uZWN0aW9uIGhhbmRsZXJzIGZvciBXZWJTb2NrZXQgZXZlbnRzXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3NldHVwQ29ubmVjdGlvbkhhbmRsZXJzKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29ubilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gU2V0IGJpbmFyeSB0eXBlIGlmIHN1cHBvcnRlZCAoYnJvd3NlcnMgYW5kIG1vc3QgV2ViU29ja2V0IGltcGxlbWVudGF0aW9ucylcbiAgICAgICAgaWYgKCdiaW5hcnlUeXBlJyBpbiB0aGlzLmNvbm4pIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIHRoaXMuY29ubi5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm4ub25vcGVuID0gKCkgPT4gdGhpcy5fb25Db25uT3BlbigpO1xuICAgICAgICB0aGlzLmNvbm4ub25lcnJvciA9IChlcnJvcikgPT4gdGhpcy5fb25Db25uRXJyb3IoZXJyb3IpO1xuICAgICAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gKGV2ZW50KSA9PiB0aGlzLl9vbkNvbm5NZXNzYWdlKGV2ZW50KTtcbiAgICAgICAgdGhpcy5jb25uLm9uY2xvc2UgPSAoZXZlbnQpID0+IHRoaXMuX29uQ29ubkNsb3NlKGV2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMuY29ubi5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ29ubk9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZWFyZG93biBjb25uZWN0aW9uIGFuZCBjbGVhbnVwIHJlc291cmNlc1xuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF90ZWFyZG93bkNvbm5lY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm4ucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5vcGVuIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uLnJlYWR5U3RhdGUgPT09IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnRXJyb3IgY2xvc2luZyBjb25uZWN0aW9uJywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb25uLm9ub3BlbiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNvbm4ub25lcnJvciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29ubi5vbmNsb3NlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29ubiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2xlYXJBbGxUaW1lcnMoKTtcbiAgICAgICAgdGhpcy5fdGVybWluYXRlV29ya2VyKCk7XG4gICAgICAgIHRoaXMuY2hhbm5lbHMuZm9yRWFjaCgoY2hhbm5lbCkgPT4gY2hhbm5lbC50ZWFyZG93bigpKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbkNvbm5PcGVuKCkge1xuICAgICAgICB0aGlzLl9zZXRDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICB0aGlzLmxvZygndHJhbnNwb3J0JywgYGNvbm5lY3RlZCB0byAke3RoaXMuZW5kcG9pbnRVUkwoKX1gKTtcbiAgICAgICAgLy8gV2FpdCBmb3IgYW55IHBlbmRpbmcgYXV0aCBvcGVyYXRpb25zIGJlZm9yZSBmbHVzaGluZyBzZW5kIGJ1ZmZlclxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY2hhbm5lbCBqb2luIG1lc3NhZ2VzIGluY2x1ZGUgdGhlIGNvcnJlY3QgYWNjZXNzIHRva2VuXG4gICAgICAgIGNvbnN0IGF1dGhQcm9taXNlID0gdGhpcy5fYXV0aFByb21pc2UgfHxcbiAgICAgICAgICAgICh0aGlzLmFjY2Vzc1Rva2VuICYmICF0aGlzLmFjY2Vzc1Rva2VuVmFsdWUgPyB0aGlzLnNldEF1dGgoKSA6IFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICAgICAgYXV0aFByb21pc2VcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hTZW5kQnVmZmVyKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsICdlcnJvciB3YWl0aW5nIGZvciBhdXRoIG9uIGNvbm5lY3QnLCBlKTtcbiAgICAgICAgICAgIC8vIFByb2NlZWQgYW55d2F5IHRvIGF2b2lkIGhhbmdpbmcgY29ubmVjdGlvbnNcbiAgICAgICAgICAgIHRoaXMuZmx1c2hTZW5kQnVmZmVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jbGVhclRpbWVyKCdyZWNvbm5lY3QnKTtcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRIZWFydGJlYXQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy53b3JrZXJSZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFdvcmtlckhlYXJ0YmVhdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RyaWdnZXJTdGF0ZUNhbGxiYWNrcygnb3BlbicpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3N0YXJ0SGVhcnRiZWF0KCkge1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyICYmIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRUaW1lcik7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnNlbmRIZWFydGJlYXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9zdGFydFdvcmtlckhlYXJ0YmVhdCgpIHtcbiAgICAgICAgaWYgKHRoaXMud29ya2VyVXJsKSB7XG4gICAgICAgICAgICB0aGlzLmxvZygnd29ya2VyJywgYHN0YXJ0aW5nIHdvcmtlciBmb3IgZnJvbSAke3RoaXMud29ya2VyVXJsfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2coJ3dvcmtlcicsIGBzdGFydGluZyBkZWZhdWx0IHdvcmtlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9iamVjdFVybCA9IHRoaXMuX3dvcmtlck9iamVjdFVybCh0aGlzLndvcmtlclVybCk7XG4gICAgICAgIHRoaXMud29ya2VyUmVmID0gbmV3IFdvcmtlcihvYmplY3RVcmwpO1xuICAgICAgICB0aGlzLndvcmtlclJlZi5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZygnd29ya2VyJywgJ3dvcmtlciBlcnJvcicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYXRlV29ya2VyKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud29ya2VyUmVmLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZXZlbnQgPT09ICdrZWVwQWxpdmUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kSGVhcnRiZWF0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud29ya2VyUmVmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIGV2ZW50OiAnc3RhcnQnLFxuICAgICAgICAgICAgaW50ZXJ2YWw6IHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlcm1pbmF0ZSB0aGUgV2ViIFdvcmtlciBhbmQgY2xlYXIgdGhlIHJlZmVyZW5jZVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF90ZXJtaW5hdGVXb3JrZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtlclJlZikge1xuICAgICAgICAgICAgdGhpcy5sb2coJ3dvcmtlcicsICd0ZXJtaW5hdGluZyB3b3JrZXInKTtcbiAgICAgICAgICAgIHRoaXMud29ya2VyUmVmLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJSZWYgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbkNvbm5DbG9zZShldmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgIHRoaXMubG9nKCd0cmFuc3BvcnQnLCAnY2xvc2UnLCBldmVudCk7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJDaGFuRXJyb3IoKTtcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lcignaGVhcnRiZWF0Jyk7XG4gICAgICAgIC8vIE9ubHkgc2NoZWR1bGUgcmVjb25uZWN0aW9uIGlmIGl0IHdhc24ndCBhIG1hbnVhbCBkaXNjb25uZWN0XG4gICAgICAgIGlmICghdGhpcy5fd2FzTWFudWFsRGlzY29ubmVjdCkge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5yZWNvbm5lY3RUaW1lcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RyaWdnZXJTdGF0ZUNhbGxiYWNrcygnY2xvc2UnLCBldmVudCk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb25Db25uRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5sb2coJ3RyYW5zcG9ydCcsIGAke2Vycm9yfWApO1xuICAgICAgICB0aGlzLl90cmlnZ2VyQ2hhbkVycm9yKCk7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJTdGF0ZUNhbGxiYWNrcygnZXJyb3InLCBlcnJvcik7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfdHJpZ2dlckNoYW5FcnJvcigpIHtcbiAgICAgICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKChjaGFubmVsKSA9PiBjaGFubmVsLl90cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmVycm9yKSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmVmaXggPSB1cmwubWF0Y2goL1xcPy8pID8gJyYnIDogJz8nO1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3F1ZXJ5fWA7XG4gICAgfVxuICAgIF93b3JrZXJPYmplY3RVcmwodXJsKSB7XG4gICAgICAgIGxldCByZXN1bHRfdXJsO1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICByZXN1bHRfdXJsID0gdXJsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtXT1JLRVJfU0NSSVBUXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSk7XG4gICAgICAgICAgICByZXN1bHRfdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0X3VybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IGNvbm5lY3Rpb24gc3RhdGUgd2l0aCBwcm9wZXIgc3RhdGUgbWFuYWdlbWVudFxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9zZXRDb25uZWN0aW9uU3RhdGUoc3RhdGUsIG1hbnVhbCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgPT09ICdjb25uZWN0aW5nJykge1xuICAgICAgICAgICAgdGhpcy5fd2FzTWFudWFsRGlzY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlID09PSAnZGlzY29ubmVjdGluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX3dhc01hbnVhbERpc2Nvbm5lY3QgPSBtYW51YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybSB0aGUgYWN0dWFsIGF1dGggb3BlcmF0aW9uXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgX3BlcmZvcm1BdXRoKHRva2VuID0gbnVsbCkge1xuICAgICAgICBsZXQgdG9rZW5Ub1NlbmQ7XG4gICAgICAgIGxldCBpc01hbnVhbFRva2VuID0gZmFsc2U7XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgdG9rZW5Ub1NlbmQgPSB0b2tlbjtcbiAgICAgICAgICAgIC8vIFRyYWNrIGlmIHRoaXMgaXMgYSBtYW51YWxseS1wcm92aWRlZCB0b2tlblxuICAgICAgICAgICAgaXNNYW51YWxUb2tlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgYWNjZXNzVG9rZW4gY2FsbGJhY2sgdG8gZ2V0IGZyZXNoIHRva2VuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRva2VuVG9TZW5kID0gYXdhaXQgdGhpcy5hY2Nlc3NUb2tlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnRXJyb3IgZmV0Y2hpbmcgYWNjZXNzIHRva2VuIGZyb20gY2FsbGJhY2snLCBlKTtcbiAgICAgICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gY2FjaGVkIHZhbHVlIGlmIGNhbGxiYWNrIGZhaWxzXG4gICAgICAgICAgICAgICAgdG9rZW5Ub1NlbmQgPSB0aGlzLmFjY2Vzc1Rva2VuVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0b2tlblRvU2VuZCA9IHRoaXMuYWNjZXNzVG9rZW5WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUcmFjayB3aGV0aGVyIHRoaXMgdG9rZW4gd2FzIG1hbnVhbGx5IHNldCBvciBmZXRjaGVkIHZpYSBjYWxsYmFja1xuICAgICAgICBpZiAoaXNNYW51YWxUb2tlbikge1xuICAgICAgICAgICAgdGhpcy5fbWFudWFsbHlTZXRUb2tlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgLy8gSWYgd2UgdXNlZCB0aGUgY2FsbGJhY2ssIGNsZWFyIHRoZSBtYW51YWwgZmxhZ1xuICAgICAgICAgICAgdGhpcy5fbWFudWFsbHlTZXRUb2tlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuVmFsdWUgIT0gdG9rZW5Ub1NlbmQpIHtcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW5WYWx1ZSA9IHRva2VuVG9TZW5kO1xuICAgICAgICAgICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKChjaGFubmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiB0b2tlblRvU2VuZCxcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogREVGQVVMVF9WRVJTSU9OLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdG9rZW5Ub1NlbmQgJiYgY2hhbm5lbC51cGRhdGVKb2luUGF5bG9hZChwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbC5qb2luZWRPbmNlICYmIGNoYW5uZWwuX2lzSm9pbmVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5fcHVzaChDSEFOTkVMX0VWRU5UUy5hY2Nlc3NfdG9rZW4sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbjogdG9rZW5Ub1NlbmQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdhaXQgZm9yIGFueSBpbi1mbGlnaHQgYXV0aCBvcGVyYXRpb25zIHRvIGNvbXBsZXRlXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgX3dhaXRGb3JBdXRoSWZOZWVkZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hdXRoUHJvbWlzZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fYXV0aFByb21pc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2FmZWx5IGNhbGwgc2V0QXV0aCB3aXRoIHN0YW5kYXJkaXplZCBlcnJvciBoYW5kbGluZ1xuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9zZXRBdXRoU2FmZWx5KGNvbnRleHQgPSAnZ2VuZXJhbCcpIHtcbiAgICAgICAgLy8gT25seSByZWZyZXNoIGF1dGggaWYgdXNpbmcgY2FsbGJhY2stYmFzZWQgdG9rZW5zXG4gICAgICAgIGlmICghdGhpcy5faXNNYW51YWxUb2tlbigpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEF1dGgoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsIGBFcnJvciBzZXR0aW5nIGF1dGggaW4gJHtjb250ZXh0fWAsIGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJpZ2dlciBzdGF0ZSBjaGFuZ2UgY2FsbGJhY2tzIHdpdGggcHJvcGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3RyaWdnZXJTdGF0ZUNhbGxiYWNrcyhldmVudCwgZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1tldmVudF0uZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgYGVycm9yIGluICR7ZXZlbnR9IGNhbGxiYWNrYCwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsIGBlcnJvciB0cmlnZ2VyaW5nICR7ZXZlbnR9IGNhbGxiYWNrc2AsIGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHVwIHJlY29ubmVjdGlvbiB0aW1lciB3aXRoIHByb3BlciBjb25maWd1cmF0aW9uXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3NldHVwUmVjb25uZWN0aW9uVGltZXIoKSB7XG4gICAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBuZXcgVGltZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd2FpdEZvckF1dGhJZk5lZWRlZCgpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIENPTk5FQ1RJT05fVElNRU9VVFMuUkVDT05ORUNUX0RFTEFZKTtcbiAgICAgICAgfSwgdGhpcy5yZWNvbm5lY3RBZnRlck1zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBjbGllbnQgb3B0aW9ucyB3aXRoIGRlZmF1bHRzXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2luaXRpYWxpemVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX207XG4gICAgICAgIC8vIFNldCBkZWZhdWx0c1xuICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50cmFuc3BvcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG51bGw7XG4gICAgICAgIHRoaXMudGltZW91dCA9IChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50aW1lb3V0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBERUZBVUxUX1RJTUVPVVQ7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcyA9XG4gICAgICAgICAgICAoX2MgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhcnRiZWF0SW50ZXJ2YWxNcykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogQ09OTkVDVElPTl9USU1FT1VUUy5IRUFSVEJFQVRfSU5URVJWQUw7XG4gICAgICAgIHRoaXMud29ya2VyID0gKF9kID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndvcmtlcikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZmFsc2U7XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSAoX2UgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYWNjZXNzVG9rZW4pICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IG51bGw7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2sgPSAoX2YgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhcnRiZWF0Q2FsbGJhY2spICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IG5vb3A7XG4gICAgICAgIHRoaXMudnNuID0gKF9nID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnZzbikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogREVGQVVMVF9WU047XG4gICAgICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzXG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucGFyYW1zKVxuICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBvcHRpb25zLnBhcmFtcztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5sb2dnZXIpXG4gICAgICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyO1xuICAgICAgICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5sb2dMZXZlbCkgfHwgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5sb2dfbGV2ZWwpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0xldmVsID0gb3B0aW9ucy5sb2dMZXZlbCB8fCBvcHRpb25zLmxvZ19sZXZlbDtcbiAgICAgICAgICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLnBhcmFtcyksIHsgbG9nX2xldmVsOiB0aGlzLmxvZ0xldmVsIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCB1cCBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0c1xuICAgICAgICB0aGlzLnJlY29ubmVjdEFmdGVyTXMgPVxuICAgICAgICAgICAgKF9oID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJlY29ubmVjdEFmdGVyTXMpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6ICgodHJpZXMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUkVDT05ORUNUX0lOVEVSVkFMU1t0cmllcyAtIDFdIHx8IERFRkFVTFRfUkVDT05ORUNUX0ZBTExCQUNLO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHN3aXRjaCAodGhpcy52c24pIHtcbiAgICAgICAgICAgIGNhc2UgVlNOXzFfMF8wOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5jb2RlID1cbiAgICAgICAgICAgICAgICAgICAgKF9qID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmVuY29kZSkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogKChwYXlsb2FkLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvZGUgPVxuICAgICAgICAgICAgICAgICAgICAoX2sgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVjb2RlKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiAoKHBheWxvYWQsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5wYXJzZShwYXlsb2FkKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWU05fMl8wXzA6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmNvZGUgPSAoX2wgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZW5jb2RlKSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiB0aGlzLnNlcmlhbGl6ZXIuZW5jb2RlLmJpbmQodGhpcy5zZXJpYWxpemVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29kZSA9IChfbSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZWNvZGUpICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6IHRoaXMuc2VyaWFsaXplci5kZWNvZGUuYmluZCh0aGlzLnNlcmlhbGl6ZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6ZXIgdmVyc2lvbjogJHt0aGlzLnZzbn1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGUgd29ya2VyIHNldHVwXG4gICAgICAgIGlmICh0aGlzLndvcmtlcikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICF3aW5kb3cuV29ya2VyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWIgV29ya2VyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMud29ya2VyVXJsID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndvcmtlclVybDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWx0aW1lQ2xpZW50LmpzLm1hcCJdLCJuYW1lcyI6WyJXZWJTb2NrZXRGYWN0b3J5IiwiQ0hBTk5FTF9FVkVOVFMiLCJDT05ORUNUSU9OX1NUQVRFIiwiREVGQVVMVF9WRVJTSU9OIiwiREVGQVVMVF9USU1FT1VUIiwiU09DS0VUX1NUQVRFUyIsIlRSQU5TUE9SVFMiLCJERUZBVUxUX1ZTTiIsIlZTTl8xXzBfMCIsIlZTTl8yXzBfMCIsIldTX0NMT1NFX05PUk1BTCIsIlNlcmlhbGl6ZXIiLCJUaW1lciIsImh0dHBFbmRwb2ludFVSTCIsIlJlYWx0aW1lQ2hhbm5lbCIsIm5vb3AiLCJDT05ORUNUSU9OX1RJTUVPVVRTIiwiSEVBUlRCRUFUX0lOVEVSVkFMIiwiUkVDT05ORUNUX0RFTEFZIiwiSEVBUlRCRUFUX1RJTUVPVVRfRkFMTEJBQ0siLCJSRUNPTk5FQ1RfSU5URVJWQUxTIiwiREVGQVVMVF9SRUNPTk5FQ1RfRkFMTEJBQ0siLCJXT1JLRVJfU0NSSVBUIiwiUmVhbHRpbWVDbGllbnQiLCJjb25zdHJ1Y3RvciIsImVuZFBvaW50Iiwib3B0aW9ucyIsIl9hIiwiYWNjZXNzVG9rZW5WYWx1ZSIsImFwaUtleSIsIl9tYW51YWxseVNldFRva2VuIiwiY2hhbm5lbHMiLCJBcnJheSIsImh0dHBFbmRwb2ludCIsImhlYWRlcnMiLCJwYXJhbXMiLCJ0aW1lb3V0IiwidHJhbnNwb3J0IiwiaGVhcnRiZWF0SW50ZXJ2YWxNcyIsImhlYXJ0YmVhdFRpbWVyIiwidW5kZWZpbmVkIiwicGVuZGluZ0hlYXJ0YmVhdFJlZiIsImhlYXJ0YmVhdENhbGxiYWNrIiwicmVmIiwicmVjb25uZWN0VGltZXIiLCJ2c24iLCJsb2dnZXIiLCJjb25uIiwic2VuZEJ1ZmZlciIsInNlcmlhbGl6ZXIiLCJzdGF0ZUNoYW5nZUNhbGxiYWNrcyIsIm9wZW4iLCJjbG9zZSIsImVycm9yIiwibWVzc2FnZSIsImFjY2Vzc1Rva2VuIiwiX2Nvbm5lY3Rpb25TdGF0ZSIsIl93YXNNYW51YWxEaXNjb25uZWN0IiwiX2F1dGhQcm9taXNlIiwiX3Jlc29sdmVGZXRjaCIsImN1c3RvbUZldGNoIiwiYXJncyIsImZldGNoIiwiYXBpa2V5IiwiRXJyb3IiLCJ3ZWJzb2NrZXQiLCJfaW5pdGlhbGl6ZU9wdGlvbnMiLCJfc2V0dXBSZWNvbm5lY3Rpb25UaW1lciIsImNvbm5lY3QiLCJpc0Nvbm5lY3RpbmciLCJpc0Rpc2Nvbm5lY3RpbmciLCJpc0Nvbm5lY3RlZCIsIl9zZXRDb25uZWN0aW9uU3RhdGUiLCJfc2V0QXV0aFNhZmVseSIsImVuZHBvaW50VVJMIiwiY3JlYXRlV2ViU29ja2V0IiwiZXJyb3JNZXNzYWdlIiwiaW5jbHVkZXMiLCJfc2V0dXBDb25uZWN0aW9uSGFuZGxlcnMiLCJfYXBwZW5kUGFyYW1zIiwiT2JqZWN0IiwiYXNzaWduIiwiZGlzY29ubmVjdCIsImNvZGUiLCJyZWFzb24iLCJmYWxsYmFja1RpbWVyIiwic2V0VGltZW91dCIsIm9uY2xvc2UiLCJjbGVhclRpbWVvdXQiLCJfdGVhcmRvd25Db25uZWN0aW9uIiwiZ2V0Q2hhbm5lbHMiLCJyZW1vdmVDaGFubmVsIiwiY2hhbm5lbCIsInN0YXR1cyIsInVuc3Vic2NyaWJlIiwibGVuZ3RoIiwicmVtb3ZlQWxsQ2hhbm5lbHMiLCJ2YWx1ZXNfMSIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJsb2ciLCJraW5kIiwibXNnIiwiZGF0YSIsImNvbm5lY3Rpb25TdGF0ZSIsInJlYWR5U3RhdGUiLCJjb25uZWN0aW5nIiwiQ29ubmVjdGluZyIsIk9wZW4iLCJjbG9zaW5nIiwiQ2xvc2luZyIsIkNsb3NlZCIsInRvcGljIiwiY29uZmlnIiwicmVhbHRpbWVUb3BpYyIsImV4aXN0cyIsImZpbmQiLCJjIiwiY2hhbiIsInB1c2giLCJldmVudCIsInBheWxvYWQiLCJjYWxsYmFjayIsImVuY29kZSIsInJlc3VsdCIsInNlbmQiLCJzZXRBdXRoIiwidG9rZW4iLCJfcGVyZm9ybUF1dGgiLCJfaXNNYW51YWxUb2tlbiIsInNlbmRIZWFydGJlYXQiLCJlIiwic2NoZWR1bGVUaW1lb3V0IiwiX21ha2VSZWYiLCJvbkhlYXJ0YmVhdCIsImZsdXNoU2VuZEJ1ZmZlciIsImZvckVhY2giLCJuZXdSZWYiLCJ0b1N0cmluZyIsIl9sZWF2ZU9wZW5Ub3BpYyIsImR1cENoYW5uZWwiLCJfaXNKb2luZWQiLCJfaXNKb2luaW5nIiwiX3JlbW92ZSIsImZpbHRlciIsIl9vbkNvbm5NZXNzYWdlIiwicmF3TWVzc2FnZSIsImRlY29kZSIsInJlZlN0cmluZyIsInRyaW0iLCJfaXNNZW1iZXIiLCJfdHJpZ2dlciIsIl90cmlnZ2VyU3RhdGVDYWxsYmFja3MiLCJfY2xlYXJUaW1lciIsInRpbWVyIiwiY2xlYXJJbnRlcnZhbCIsInJlc2V0IiwiX2NsZWFyQWxsVGltZXJzIiwiYmluYXJ5VHlwZSIsIm9ub3BlbiIsIl9vbkNvbm5PcGVuIiwib25lcnJvciIsIl9vbkNvbm5FcnJvciIsIm9ubWVzc2FnZSIsIl9vbkNvbm5DbG9zZSIsIl90ZXJtaW5hdGVXb3JrZXIiLCJ0ZWFyZG93biIsImF1dGhQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJjYXRjaCIsIndvcmtlciIsIl9zdGFydEhlYXJ0YmVhdCIsIndvcmtlclJlZiIsIl9zdGFydFdvcmtlckhlYXJ0YmVhdCIsInNldEludGVydmFsIiwid29ya2VyVXJsIiwib2JqZWN0VXJsIiwiX3dvcmtlck9iamVjdFVybCIsIldvcmtlciIsInBvc3RNZXNzYWdlIiwiaW50ZXJ2YWwiLCJ0ZXJtaW5hdGUiLCJfdHJpZ2dlckNoYW5FcnJvciIsInVybCIsImtleXMiLCJwcmVmaXgiLCJtYXRjaCIsInF1ZXJ5IiwiVVJMU2VhcmNoUGFyYW1zIiwicmVzdWx0X3VybCIsImJsb2IiLCJCbG9iIiwidHlwZSIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsInN0YXRlIiwibWFudWFsIiwidG9rZW5Ub1NlbmQiLCJpc01hbnVhbFRva2VuIiwiYWNjZXNzX3Rva2VuIiwidmVyc2lvbiIsInVwZGF0ZUpvaW5QYXlsb2FkIiwiam9pbmVkT25jZSIsIl9wdXNoIiwiX3dhaXRGb3JBdXRoSWZOZWVkZWQiLCJjb250ZXh0IiwicmVjb25uZWN0QWZ0ZXJNcyIsIl9iIiwiX2MiLCJfZCIsIl9lIiwiX2YiLCJfZyIsIl9oIiwiX2oiLCJfayIsIl9sIiwiX20iLCJsb2dMZXZlbCIsImxvZ19sZXZlbCIsInRyaWVzIiwiSlNPTiIsInN0cmluZ2lmeSIsInBhcnNlIiwiYmluZCIsIndpbmRvdyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js":
|
||
/*!****************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js ***!
|
||
\****************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_PRESENCE_LISTEN_EVENTS: () => (/* binding */ REALTIME_PRESENCE_LISTEN_EVENTS),\n/* harmony export */ \"default\": () => (/* 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 * 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 /**\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} //# sourceMappingURL=RealtimePresence.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lUHJlc2VuY2UuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7O0FBR0EsR0FDTyxJQUFJQSxnQ0FBZ0M7QUFDMUMsVUFBVUEsK0JBQStCO0lBQ3RDQSwrQkFBK0IsQ0FBQyxPQUFPLEdBQUc7SUFDMUNBLCtCQUErQixDQUFDLE9BQU8sR0FBRztJQUMxQ0EsK0JBQStCLENBQUMsUUFBUSxHQUFHO0FBQy9DLEdBQUdBLG1DQUFvQ0EsQ0FBQUEsa0NBQWtDLENBQUM7QUFDM0QsTUFBTUM7SUFDakI7Ozs7Ozs7Ozs7Ozs7O0tBY0MsR0FDREMsWUFBWUMsT0FBTyxFQUFFQyxJQUFJLENBQUU7UUFDdkIsSUFBSSxDQUFDRCxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDRSxLQUFLLEdBQUcsQ0FBQztRQUNkLElBQUksQ0FBQ0MsWUFBWSxHQUFHLEVBQUU7UUFDdEIsSUFBSSxDQUFDQyxPQUFPLEdBQUc7UUFDZixJQUFJLENBQUNDLE9BQU8sR0FBRztRQUNmLElBQUksQ0FBQ0MsTUFBTSxHQUFHO1lBQ1ZDLFFBQVEsS0FBUTtZQUNoQkMsU0FBUyxLQUFRO1lBQ2pCQyxRQUFRLEtBQVE7UUFDcEI7UUFDQSxNQUFNQyxTQUFTLENBQUNULFNBQVMsUUFBUUEsU0FBUyxLQUFLLElBQUksS0FBSyxJQUFJQSxLQUFLUyxNQUFNLEtBQUs7WUFDeEVSLE9BQU87WUFDUFMsTUFBTTtRQUNWO1FBQ0EsSUFBSSxDQUFDWCxPQUFPLENBQUNZLEdBQUcsQ0FBQ0YsT0FBT1IsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDVztZQUNoQyxNQUFNLEVBQUVOLE1BQU0sRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUNILE1BQU07WUFDL0MsSUFBSSxDQUFDRixPQUFPLEdBQUcsSUFBSSxDQUFDSixPQUFPLENBQUNjLFFBQVE7WUFDcEMsSUFBSSxDQUFDWixLQUFL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QyxVQUFVO29CQUMxQixPQUFPQSxRQUFRLENBQUMsZUFBZTtvQkFDL0IsT0FBT0E7Z0JBQ1g7WUFDSixPQUNLO2dCQUNEeEMsUUFBUSxDQUFDTyxJQUFJLEdBQUdhO1lBQ3BCO1lBQ0EsT0FBT3BCO1FBQ1gsR0FBRyxDQUFDO0lBQ1I7SUFDQSxjQUFjLEdBQ2QsT0FBT2MsVUFBVW9CLEdBQUcsRUFBRTtRQUNsQixPQUFPTyxLQUFLQyxLQUFLLENBQUNELEtBQUtFLFNBQVMsQ0FBQ1Q7SUFDckM7SUFDQSxjQUFjLEdBQ2R4QyxPQUFPa0QsUUFBUSxFQUFFO1FBQ2IsSUFBSSxDQUFDbkQsTUFBTSxDQUFDQyxNQUFNLEdBQUdrRDtJQUN6QjtJQUNBLGNBQWMsR0FDZGpELFFBQVFpRCxRQUFRLEVBQUU7UUFDZCxJQUFJLENBQUNuRCxNQUFNLENBQUNFLE9BQU8sR0FBR2lEO0lBQzFCO0lBQ0EsY0FBYyxHQUNkaEQsT0FBT2dELFFBQVEsRUFBRTtRQUNiLElBQUksQ0FBQ25ELE1BQU0sQ0FBQ0csTUFBTSxHQUFHZ0Q7SUFDekI7SUFDQSxjQUFjLEdBQ2R2QyxxQkFBcUI7UUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQ2QsT0FBTyxJQUFJLElBQUksQ0FBQ0EsT0FBTyxLQUFLLElBQUksQ0FBQ0osT0FBTyxDQUFDYyxRQUFRO0lBQ2xFO0FBQ0osRUFDQSw0Q0FBNEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lUHJlc2VuY2UuanM/Y2VjMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBUaGlzIGZpbGUgZHJhd3MgaGVhdmlseSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXgvYmxvYi9kMzQ0ZWMwYTczMmFiNGVlMjA0MjE1YjMxZGU2OWNmNGJlNzJlM2JmL2Fzc2V0cy9qcy9waG9lbml4L3ByZXNlbmNlLmpzXG4gIExpY2Vuc2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXgvYmxvYi9kMzQ0ZWMwYTczMmFiNGVlMjA0MjE1YjMxZGU2OWNmNGJlNzJlM2JmL0xJQ0VOU0UubWRcbiovXG5leHBvcnQgdmFyIFJFQUxUSU1FX1BSRVNFTkNFX0xJU1RFTl9FVkVOVFM7XG4oZnVuY3Rpb24gKFJFQUxUSU1FX1BSRVNFTkNFX0xJU1RFTl9FVkVOVFMpIHtcbiAgICBSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTW1wiU1lOQ1wiXSA9IFwic3luY1wiO1xuICAgIFJFQUxUSU1FX1BSRVNFTkNFX0xJU1RFTl9FVkVOVFNbXCJKT0lOXCJdID0gXCJqb2luXCI7XG4gICAgUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UU1tcIkxFQVZFXCJdID0gXCJsZWF2ZVwiO1xufSkoUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUyB8fCAoUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUyA9IHt9KSk7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWFsdGltZVByZXNlbmNlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUHJlc2VuY2UgaGVscGVyIHRoYXQga2VlcHMgdGhlIGxvY2FsIHByZXNlbmNlIHN0YXRlIGluIHN5bmMgd2l0aCB0aGUgc2VydmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5uZWwgLSBUaGUgcmVhbHRpbWUgY2hhbm5lbCB0byBiaW5kIHRvLlxuICAgICAqIEBwYXJhbSBvcHRzIC0gT3B0aW9uYWwgY3VzdG9tIGV2ZW50IG5hbWVzLCBlLmcuIGB7IGV2ZW50czogeyBzdGF0ZTogJ3N0YXRlJywgZGlmZjogJ2RpZmYnIH0gfWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcHJlc2VuY2UgPSBuZXcgUmVhbHRpbWVQcmVzZW5jZShjaGFubmVsKVxuICAgICAqXG4gICAgICogY2hhbm5lbC5vbigncHJlc2VuY2UnLCAoeyBldmVudCwga2V5IH0pID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQcmVzZW5jZSAke2V2ZW50fSBvbiAke2tleX1gKVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2hhbm5lbCwgb3B0cykge1xuICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuICAgICAgICB0aGlzLnN0YXRlID0ge307XG4gICAgICAgIHRoaXMucGVuZGluZ0RpZmZzID0gW107XG4gICAgICAgIHRoaXMuam9pblJlZiA9IG51bGw7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgICAgICAgIG9uSm9pbjogKCkgPT4geyB9LFxuICAgICAgICAgICAgb25MZWF2ZTogKCkgPT4geyB9LFxuICAgICAgICAgICAgb25TeW5jOiAoKSA9PiB7IH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMuZXZlbnRzKSB8fCB7XG4gICAgICAgICAgICBzdGF0ZTogJ3ByZXNlbmNlX3N0YXRlJyxcbiAgICAgICAgICAgIGRpZmY6ICdwcmVzZW5jZV9kaWZmJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jaGFubmVsLl9vbihldmVudHMuc3RhdGUsIHt9LCAobmV3U3RhdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgb25Kb2luLCBvbkxlYXZlLCBvblN5bmMgfSA9IHRoaXMuY2FsbGVyO1xuICAgICAgICAgICAgdGhpcy5qb2luUmVmID0gdGhpcy5jaGFubmVsLl9qb2luUmVmKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gUmVhbHRpbWVQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdEaWZmcy5mb3JFYWNoKChkaWZmKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFJlYWx0aW1lUHJlc2VuY2Uuc3luY0RpZmYodGhpcy5zdGF0ZSwgZGlmZiwgb25Kb2luLCBvbkxlYXZlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXTtcbiAgICAgICAgICAgIG9uU3luYygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGFubmVsLl9vbihldmVudHMuZGlmZiwge30sIChkaWZmKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG9uSm9pbiwgb25MZWF2ZSwgb25TeW5jIH0gPSB0aGlzLmNhbGxlcjtcbiAgICAgICAgICAgIGlmICh0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBSZWFsdGltZVByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSk7XG4gICAgICAgICAgICAgICAgb25TeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uSm9pbigoa2V5LCBjdXJyZW50UHJlc2VuY2VzLCBuZXdQcmVzZW5jZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5fdHJpZ2dlcigncHJlc2VuY2UnLCB7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdqb2luJyxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgY3VycmVudFByZXNlbmNlcyxcbiAgICAgICAgICAgICAgICBuZXdQcmVzZW5jZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25MZWF2ZSgoa2V5LCBjdXJyZW50UHJlc2VuY2VzLCBsZWZ0UHJlc2VuY2VzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWwuX3RyaWdnZXIoJ3ByZXNlbmNlJywge1xuICAgICAgICAgICAgICAgIGV2ZW50OiAnbGVhdmUnLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBjdXJyZW50UHJlc2VuY2VzLFxuICAgICAgICAgICAgICAgIGxlZnRQcmVzZW5jZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25TeW5jKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5fdHJpZ2dlcigncHJlc2VuY2UnLCB7IGV2ZW50OiAnc3luYycgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHN5bmMgdGhlIGxpc3Qgb2YgcHJlc2VuY2VzIG9uIHRoZSBzZXJ2ZXIgd2l0aCB0aGVcbiAgICAgKiBjbGllbnQncyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEFuIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2sgY2FuIGJlIHByb3ZpZGVkIHRvXG4gICAgICogcmVhY3QgdG8gY2hhbmdlcyBpbiB0aGUgY2xpZW50J3MgbG9jYWwgcHJlc2VuY2VzIGFjcm9zc1xuICAgICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBzeW5jU3RhdGUoY3VycmVudFN0YXRlLCBuZXdTdGF0ZSwgb25Kb2luLCBvbkxlYXZlKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jbG9uZURlZXAoY3VycmVudFN0YXRlKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRTdGF0ZSA9IHRoaXMudHJhbnNmb3JtU3RhdGUobmV3U3RhdGUpO1xuICAgICAgICBjb25zdCBqb2lucyA9IHt9O1xuICAgICAgICBjb25zdCBsZWF2ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5tYXAoc3RhdGUsIChrZXksIHByZXNlbmNlcykgPT4ge1xuICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1lZFN0YXRlW2tleV0pIHtcbiAgICAgICAgICAgICAgICBsZWF2ZXNba2V5XSA9IHByZXNlbmNlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFwKHRyYW5zZm9ybWVkU3RhdGUsIChrZXksIG5ld1ByZXNlbmNlcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFByZXNlbmNlcyA9IHN0YXRlW2tleV07XG4gICAgICAgICAgICBpZiAoY3VycmVudFByZXNlbmNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ByZXNlbmNlUmVmcyA9IG5ld1ByZXNlbmNlcy5tYXAoKG0pID0+IG0ucHJlc2VuY2VfcmVmKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJQcmVzZW5jZVJlZnMgPSBjdXJyZW50UHJlc2VuY2VzLm1hcCgobSkgPT4gbS5wcmVzZW5jZV9yZWYpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvaW5lZFByZXNlbmNlcyA9IG5ld1ByZXNlbmNlcy5maWx0ZXIoKG0pID0+IGN1clByZXNlbmNlUmVmcy5pbmRleE9mKG0ucHJlc2VuY2VfcmVmKSA8IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnRQcmVzZW5jZXMgPSBjdXJyZW50UHJlc2VuY2VzLmZpbHRlcigobSkgPT4gbmV3UHJlc2VuY2VSZWZzLmluZGV4T2YobS5wcmVzZW5jZV9yZWYpIDwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKGpvaW5lZFByZXNlbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGpvaW5zW2tleV0gPSBqb2luZWRQcmVzZW5jZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsZWZ0UHJlc2VuY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhdmVzW2tleV0gPSBsZWZ0UHJlc2VuY2VzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGpvaW5zW2tleV0gPSBuZXdQcmVzZW5jZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwgeyBqb2lucywgbGVhdmVzIH0sIG9uSm9pbiwgb25MZWF2ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gc3luYyBhIGRpZmYgb2YgcHJlc2VuY2Ugam9pbiBhbmQgbGVhdmUgZXZlbnRzIGZyb20gdGhlXG4gICAgICogc2VydmVyLCBhcyB0aGV5IGhhcHBlbi5cbiAgICAgKlxuICAgICAqIExpa2UgYHN5bmNTdGF0ZWAsIGBzeW5jRGlmZmAgYWNjZXB0cyBvcHRpb25hbCBgb25Kb2luYCBhbmRcbiAgICAgKiBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlciBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhXG4gICAgICogZGV2aWNlLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpIHtcbiAgICAgICAgY29uc3QgeyBqb2lucywgbGVhdmVzIH0gPSB7XG4gICAgICAgICAgICBqb2luczogdGhpcy50cmFuc2Zvcm1TdGF0ZShkaWZmLmpvaW5zKSxcbiAgICAgICAgICAgIGxlYXZlczogdGhpcy50cmFuc2Zvcm1TdGF0ZShkaWZmLmxlYXZlcyksXG4gICAgICAgIH07XG4gICAgICAgIGlmICghb25Kb2luKSB7XG4gICAgICAgICAgICBvbkpvaW4gPSAoKSA9PiB7IH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvbkxlYXZlKSB7XG4gICAgICAgICAgICBvbkxlYXZlID0gKCkgPT4geyB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFwKGpvaW5zLCAoa2V5LCBuZXdQcmVzZW5jZXMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcmVzZW5jZXMgPSAoX2EgPSBzdGF0ZVtrZXldKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgICAgIHN0YXRlW2tleV0gPSB0aGlzLmNsb25lRGVlcChuZXdQcmVzZW5jZXMpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQcmVzZW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvaW5lZFByZXNlbmNlUmVmcyA9IHN0YXRlW2tleV0ubWFwKChtKSA9PiBtLnByZXNlbmNlX3JlZik7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VyUHJlc2VuY2VzID0gY3VycmVudFByZXNlbmNlcy5maWx0ZXIoKG0pID0+IGpvaW5lZFByZXNlbmNlUmVmcy5pbmRleE9mKG0ucHJlc2VuY2VfcmVmKSA8IDApO1xuICAgICAgICAgICAgICAgIHN0YXRlW2tleV0udW5zaGlmdCguLi5jdXJQcmVzZW5jZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25Kb2luKGtleSwgY3VycmVudFByZXNlbmNlcywgbmV3UHJlc2VuY2VzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFwKGxlYXZlcywgKGtleSwgbGVmdFByZXNlbmNlcykgPT4ge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZXMgPSBzdGF0ZVtrZXldO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50UHJlc2VuY2VzKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbmNlUmVmc1RvUmVtb3ZlID0gbGVmdFByZXNlbmNlcy5tYXAoKG0pID0+IG0ucHJlc2VuY2VfcmVmKTtcbiAgICAgICAgICAgIGN1cnJlbnRQcmVzZW5jZXMgPSBjdXJyZW50UHJlc2VuY2VzLmZpbHRlcigobSkgPT4gcHJlc2VuY2VSZWZzVG9SZW1vdmUuaW5kZXhPZihtLnByZXNlbmNlX3JlZikgPCAwKTtcbiAgICAgICAgICAgIHN0YXRlW2tleV0gPSBjdXJyZW50UHJlc2VuY2VzO1xuICAgICAgICAgICAgb25MZWF2ZShrZXksIGN1cnJlbnRQcmVzZW5jZXMsIGxlZnRQcmVzZW5jZXMpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQcmVzZW5jZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBzdGF0ZVtrZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgc3RhdGljIG1hcChvYmosIGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKChrZXkpID0+IGZ1bmMoa2V5LCBvYmpba2V5XSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgJ21ldGFzJyBrZXlcbiAgICAgKiBDaGFuZ2UgJ3BoeF9yZWYnIHRvICdwcmVzZW5jZV9yZWYnXG4gICAgICogUmVtb3ZlICdwaHhfcmVmJyBhbmQgJ3BoeF9yZWZfcHJldidcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gcmV0dXJucyB7XG4gICAgICogIGFiYzEyMzogW1xuICAgICAqICAgIHsgcHJlc2VuY2VfcmVmOiAnMicsIHVzZXJfaWQ6IDEgfSxcbiAgICAgKiAgICB7IHByZXNlbmNlX3JlZjogJzMnLCB1c2VyX2lkOiAyIH1cbiAgICAgKiAgXVxuICAgICAqIH1cbiAgICAgKiBSZWFsdGltZVByZXNlbmNlLnRyYW5zZm9ybVN0YXRlKHtcbiAgICAgKiAgYWJjMTIzOiB7XG4gICAgICogICAgbWV0YXM6IFtcbiAgICAgKiAgICAgIHsgcGh4X3JlZjogJzInLCBwaHhfcmVmX3ByZXY6ICcxJyB1c2VyX2lkOiAxIH0sXG4gICAgICogICAgICB7IHBoeF9yZWY6ICczJywgdXNlcl9pZDogMiB9XG4gICAgICogICAgXVxuICAgICAqICB9XG4gICAgICogfSlcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyB0cmFuc2Zvcm1TdGF0ZShzdGF0ZSkge1xuICAgICAgICBzdGF0ZSA9IHRoaXMuY2xvbmVEZWVwKHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHN0YXRlKS5yZWR1Y2UoKG5ld1N0YXRlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbmNlcyA9IHN0YXRlW2tleV07XG4gICAgICAgICAgICBpZiAoJ21ldGFzJyBpbiBwcmVzZW5jZXMpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZVtrZXldID0gcHJlc2VuY2VzLm1ldGFzLm1hcCgocHJlc2VuY2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcHJlc2VuY2VbJ3ByZXNlbmNlX3JlZiddID0gcHJlc2VuY2VbJ3BoeF9yZWYnXTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHByZXNlbmNlWydwaHhfcmVmJ107XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwcmVzZW5jZVsncGh4X3JlZl9wcmV2J107XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmVzZW5jZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlW2tleV0gPSBwcmVzZW5jZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBjbG9uZURlZXAob2JqKSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgb25Kb2luKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLm9uSm9pbiA9IGNhbGxiYWNrO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgb25MZWF2ZShjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBvblN5bmMoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5jYWxsZXIub25TeW5jID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBpblBlbmRpbmdTeW5jU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5qb2luUmVmIHx8IHRoaXMuam9pblJlZiAhPT0gdGhpcy5jaGFubmVsLl9qb2luUmVmKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVhbHRpbWVQcmVzZW5jZS5qcy5tYXAiXSwibmFtZXMiOlsiUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUyIsIlJlYWx0aW1lUHJlc2VuY2UiLCJjb25zdHJ1Y3RvciIsImNoYW5uZWwiLCJvcHRzIiwic3RhdGUiLCJwZW5kaW5nRGlmZnMiLCJqb2luUmVmIiwiZW5hYmxlZCIsImNhbGxlciIsIm9uSm9pbiIsIm9uTGVhdmUiLCJvblN5bmMiLCJldmVudHMiLCJkaWZmIiwiX29uIiwibmV3U3RhdGUiLCJfam9pblJlZiIsInN5bmNTdGF0ZSIsImZvckVhY2giLCJzeW5jRGlmZiIsImluUGVuZGluZ1N5bmNTdGF0ZSIsInB1c2giLCJrZXkiLCJjdXJyZW50UHJlc2VuY2VzIiwibmV3UHJlc2VuY2VzIiwiX3RyaWdnZXIiLCJldmVudCIsImxlZnRQcmVzZW5jZXMiLCJjdXJyZW50U3RhdGUiLCJjbG9uZURlZXAiLCJ0cmFuc2Zvcm1lZFN0YXRlIiwidHJhbnNmb3JtU3RhdGUiLCJqb2lucyIsImxlYXZlcyIsIm1hcCIsInByZXNlbmNlcyIsIm5ld1ByZXNlbmNlUmVmcyIsIm0iLCJwcmVzZW5jZV9yZWYiLCJjdXJQcmVzZW5jZVJlZnMiLCJqb2luZWRQcmVzZW5jZXMiLCJmaWx0ZXIiLCJpbmRleE9mIiwibGVuZ3RoIiwiX2EiLCJqb2luZWRQcmVzZW5jZVJlZnMiLCJjdXJQcmVzZW5jZXMiLCJ1bnNoaWZ0IiwicHJlc2VuY2VSZWZzVG9SZW1vdmUiLCJvYmoiLCJmdW5jIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInJlZHVjZSIsIm1ldGFzIiwicHJlc2VuY2UiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJjYWxsYmFjayJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/realtime-js/dist/module/index.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/index.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_CHANNEL_STATES: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_CHANNEL_STATES),\n/* harmony export */ REALTIME_LISTEN_TYPES: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_LISTEN_TYPES),\n/* harmony export */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_POSTGRES_CHANGES_LISTEN_EVENT),\n/* harmony export */ REALTIME_PRESENCE_LISTEN_EVENTS: () => (/* reexport safe */ _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__.REALTIME_PRESENCE_LISTEN_EVENTS),\n/* harmony export */ REALTIME_SUBSCRIBE_STATES: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_SUBSCRIBE_STATES),\n/* harmony export */ RealtimeChannel: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__[\"default\"]),\n/* harmony export */ RealtimeClient: () => (/* reexport safe */ _RealtimeClient__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ RealtimePresence: () => (/* reexport safe */ _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ WebSocketFactory: () => (/* 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 */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js\");\n/* harmony import */ var _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RealtimeChannel */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js\");\n/* harmony import */ var _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RealtimePresence */ \"(ssr)/./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 */ \"(ssr)/./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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2luZGV4LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBOEM7QUFDMEg7QUFDaEY7QUFDakM7QUFDNkssQ0FDcE8saUNBQWlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9pbmRleC5qcz81NTVkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFsdGltZUNsaWVudCBmcm9tICcuL1JlYWx0aW1lQ2xpZW50JztcbmltcG9ydCBSZWFsdGltZUNoYW5uZWwsIHsgUkVBTFRJTUVfTElTVEVOX1RZUEVTLCBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCwgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUywgUkVBTFRJTUVfQ0hBTk5FTF9TVEFURVMsIH0gZnJvbSAnLi9SZWFsdGltZUNoYW5uZWwnO1xuaW1wb3J0IFJlYWx0aW1lUHJlc2VuY2UsIHsgUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUywgfSBmcm9tICcuL1JlYWx0aW1lUHJlc2VuY2UnO1xuaW1wb3J0IFdlYlNvY2tldEZhY3RvcnkgZnJvbSAnLi9saWIvd2Vic29ja2V0LWZhY3RvcnknO1xuZXhwb3J0IHsgUmVhbHRpbWVQcmVzZW5jZSwgUmVhbHRpbWVDaGFubmVsLCBSZWFsdGltZUNsaWVudCwgUkVBTFRJTUVfTElTVEVOX1RZUEVTLCBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCwgUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUywgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUywgUkVBTFRJTUVfQ0hBTk5FTF9TVEFURVMsIFdlYlNvY2tldEZhY3RvcnksIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOlsiUmVhbHRpbWVDbGllbnQiLCJSZWFsdGltZUNoYW5uZWwiLCJSRUFMVElNRV9MSVNURU5fVFlQRVMiLCJSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCIsIlJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMiLCJSRUFMVElNRV9DSEFOTkVMX1NUQVRFUyIsIlJlYWx0aW1lUHJlc2VuY2UiLCJSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTIiwiV2ViU29ja2V0RmFjdG9yeSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/realtime-js/dist/module/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js":
|
||
/*!*************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/constants.js ***!
|
||
\*************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CHANNEL_EVENTS: () => (/* binding */ CHANNEL_EVENTS),\n/* harmony export */ CHANNEL_STATES: () => (/* binding */ CHANNEL_STATES),\n/* harmony export */ CONNECTION_STATE: () => (/* binding */ CONNECTION_STATE),\n/* harmony export */ DEFAULT_TIMEOUT: () => (/* binding */ DEFAULT_TIMEOUT),\n/* harmony export */ DEFAULT_VERSION: () => (/* binding */ DEFAULT_VERSION),\n/* harmony export */ DEFAULT_VSN: () => (/* binding */ DEFAULT_VSN),\n/* harmony export */ MAX_PUSH_BUFFER_SIZE: () => (/* binding */ MAX_PUSH_BUFFER_SIZE),\n/* harmony export */ SOCKET_STATES: () => (/* binding */ SOCKET_STATES),\n/* harmony export */ TRANSPORTS: () => (/* binding */ TRANSPORTS),\n/* harmony export */ VERSION: () => (/* binding */ VERSION),\n/* harmony export */ VSN_1_0_0: () => (/* binding */ VSN_1_0_0),\n/* harmony export */ VSN_2_0_0: () => (/* binding */ VSN_2_0_0),\n/* harmony export */ WS_CLOSE_NORMAL: () => (/* binding */ WS_CLOSE_NORMAL)\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./version */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js\");\n\nconst DEFAULT_VERSION = `realtime-js/${_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi9jb25zdGFudHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBb0M7QUFDN0IsTUFBTUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFRCw2Q0FBT0EsQ0FBQyxDQUFDLENBQUM7QUFDakQsTUFBTUUsWUFBWSxRQUFRO0FBQzFCLE1BQU1DLFlBQVksUUFBUTtBQUMxQixNQUFNQyxjQUFjRixVQUFVO0FBQzlCLE1BQU1HLFVBQVVMLDZDQUFPQSxDQUFDO0FBQ3hCLE1BQU1NLGtCQUFrQixNQUFNO0FBQzlCLE1BQU1DLGtCQUFrQixLQUFLO0FBQzdCLE1BQU1DLHVCQUF1QixJQUFJO0FBQ2pDLElBQUlDLGNBQWM7QUFDeEIsVUFBVUEsYUFBYTtJQUNwQkEsYUFBYSxDQUFDQSxhQUFhLENBQUMsYUFBYSxHQUFHLEVBQUUsR0FBRztJQUNqREEsYUFBYSxDQUFDQSxhQUFhLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRztJQUMzQ0EsYUFBYSxDQUFDQSxhQUFhLENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRztJQUM5Q0EsYUFBYSxDQUFDQSxhQUFhLENBQUMsU0FBUyxHQUFHLEVBQUUsR0FBRztBQUNqRCxHQUFHQSxpQkFBa0JBLENBQUFBLGdCQUFnQixDQUFDO0FBQy9CLElBQUlDLGVBQWU7QUFDekIsVUFBVUEsY0FBYztJQUNyQkEsY0FBYyxDQUFDLFNBQVMsR0FBRztJQUMzQkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFNBQVMsR0FBRztJQUMzQkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztBQUNoQyxHQUFHQSxrQkFBbUJBLENBQUFBLGlCQUFpQixDQUFDO0FBQ2pDLElBQUlDLGVBQWU7QUFDekIsVUFBVUEsY0FBYztJQUNyQkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLE9BQU8sR0FBRztJQUN6QkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLGVBQWUsR0FBRztBQUNyQyxHQUFHQSxrQkFBbUJBLENBQUFBLGlCQUFpQixDQUFDO0FBQ2pDLElBQUlDLFdBQVc7QUFDckIsVUFBVUEsVUFBVTtJQUNqQkEsVUFBVSxDQUFDLFlBQVksR0FBRztBQUM5QixHQUFHQSxjQUFlQSxDQUFBQSxhQUFhLENBQUM7QUFDekIsSUFBSUMsaUJBQWlCO0FBQzNCLFVBQVVBLGdCQUFnQjtJQUN2QkEsZ0JBQWdCLENBQUMsYUFBYSxHQUFHO0lBQ2pDQSxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUc7SUFDM0JBLGdCQUFnQixDQUFDLFVBQVUsR0FBRztJQUM5QkEsZ0JBQWdCLENBQUMsU0FBUyxHQUFHO0FBQ2pDLEdBQUdBLG9CQUFxQkEsQ0FBQUEsbUJBQW1CLENBQUMsS0FDNUMscUNBQXFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9saWIvY29uc3RhbnRzLmpzP2FjMTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG5leHBvcnQgY29uc3QgREVGQVVMVF9WRVJTSU9OID0gYHJlYWx0aW1lLWpzLyR7dmVyc2lvbn1gO1xuZXhwb3J0IGNvbnN0IFZTTl8xXzBfMCA9ICcxLjAuMCc7XG5leHBvcnQgY29uc3QgVlNOXzJfMF8wID0gJzIuMC4wJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX1ZTTiA9IFZTTl8xXzBfMDtcbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gdmVyc2lvbjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMDtcbmV4cG9ydCBjb25zdCBXU19DTE9TRV9OT1JNQUwgPSAxMDAwO1xuZXhwb3J0IGNvbnN0IE1BWF9QVVNIX0JVRkZFUl9TSVpFID0gMTAwO1xuZXhwb3J0IHZhciBTT0NLRVRfU1RBVEVTO1xuKGZ1bmN0aW9uIChTT0NLRVRfU1RBVEVTKSB7XG4gICAgU09DS0VUX1NUQVRFU1tTT0NLRVRfU1RBVEVTW1wiY29ubmVjdGluZ1wiXSA9IDBdID0gXCJjb25uZWN0aW5nXCI7XG4gICAgU09DS0VUX1NUQVRFU1tTT0NLRVRfU1RBVEVTW1wib3BlblwiXSA9IDFdID0gXCJvcGVuXCI7XG4gICAgU09DS0VUX1NUQVRFU1tTT0NLRVRfU1RBVEVTW1wiY2xvc2luZ1wiXSA9IDJdID0gXCJjbG9zaW5nXCI7XG4gICAgU09DS0VUX1NUQVRFU1tTT0NLRVRfU1RBVEVTW1wiY2xvc2VkXCJdID0gM10gPSBcImNsb3NlZFwiO1xufSkoU09DS0VUX1NUQVRFUyB8fCAoU09DS0VUX1NUQVRFUyA9IHt9KSk7XG5leHBvcnQgdmFyIENIQU5ORUxfU1RBVEVTO1xuKGZ1bmN0aW9uIChDSEFOTkVMX1NUQVRFUykge1xuICAgIENIQU5ORUxfU1RBVEVTW1wiY2xvc2VkXCJdID0gXCJjbG9zZWRcIjtcbiAgICBDSEFOTkVMX1NUQVRFU1tcImVycm9yZWRcIl0gPSBcImVycm9yZWRcIjtcbiAgICBDSEFOTkVMX1NUQVRFU1tcImpvaW5lZFwiXSA9IFwiam9pbmVkXCI7XG4gICAgQ0hBTk5FTF9TVEFURVNbXCJqb2luaW5nXCJdID0gXCJqb2luaW5nXCI7XG4gICAgQ0hBTk5FTF9TVEFURVNbXCJsZWF2aW5nXCJdID0gXCJsZWF2aW5nXCI7XG59KShDSEFOTkVMX1NUQVRFUyB8fCAoQ0hBTk5FTF9TVEFURVMgPSB7fSkpO1xuZXhwb3J0IHZhciBDSEFOTkVMX0VWRU5UUztcbihmdW5jdGlvbiAoQ0hBTk5FTF9FVkVOVFMpIHtcbiAgICBDSEFOTkVMX0VWRU5UU1tcImNsb3NlXCJdID0gXCJwaHhfY2xvc2VcIjtcbiAgICBDSEFOTkVMX0VWRU5UU1tcImVycm9yXCJdID0gXCJwaHhfZXJyb3JcIjtcbiAgICBDSEFOTkVMX0VWRU5UU1tcImpvaW5cIl0gPSBcInBoeF9qb2luXCI7XG4gICAgQ0hBTk5FTF9FVkVOVFNbXCJyZXBseVwiXSA9IFwicGh4X3JlcGx5XCI7XG4gICAgQ0hBTk5FTF9FVkVOVFNbXCJsZWF2ZVwiXSA9IFwicGh4X2xlYXZlXCI7XG4gICAgQ0hBTk5FTF9FVkVOVFNbXCJhY2Nlc3NfdG9rZW5cIl0gPSBcImFjY2Vzc190b2tlblwiO1xufSkoQ0hBTk5FTF9FVkVOVFMgfHwgKENIQU5ORUxfRVZFTlRTID0ge30pKTtcbmV4cG9ydCB2YXIgVFJBTlNQT1JUUztcbihmdW5jdGlvbiAoVFJBTlNQT1JUUykge1xuICAgIFRSQU5TUE9SVFNbXCJ3ZWJzb2NrZXRcIl0gPSBcIndlYnNvY2tldFwiO1xufSkoVFJBTlNQT1JUUyB8fCAoVFJBTlNQT1JUUyA9IHt9KSk7XG5leHBvcnQgdmFyIENPTk5FQ1RJT05fU1RBVEU7XG4oZnVuY3Rpb24gKENPTk5FQ1RJT05fU1RBVEUpIHtcbiAgICBDT05ORUNUSU9OX1NUQVRFW1wiQ29ubmVjdGluZ1wiXSA9IFwiY29ubmVjdGluZ1wiO1xuICAgIENPTk5FQ1RJT05fU1RBVEVbXCJPcGVuXCJdID0gXCJvcGVuXCI7XG4gICAgQ09OTkVDVElPTl9TVEFURVtcIkNsb3NpbmdcIl0gPSBcImNsb3NpbmdcIjtcbiAgICBDT05ORUNUSU9OX1NUQVRFW1wiQ2xvc2VkXCJdID0gXCJjbG9zZWRcIjtcbn0pKENPTk5FQ1RJT05fU1RBVEUgfHwgKENPTk5FQ1RJT05fU1RBVEUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCJdLCJuYW1lcyI6WyJ2ZXJzaW9uIiwiREVGQVVMVF9WRVJTSU9OIiwiVlNOXzFfMF8wIiwiVlNOXzJfMF8wIiwiREVGQVVMVF9WU04iLCJWRVJTSU9OIiwiREVGQVVMVF9USU1FT1VUIiwiV1NfQ0xPU0VfTk9STUFMIiwiTUFYX1BVU0hfQlVGRkVSX1NJWkUiLCJTT0NLRVRfU1RBVEVTIiwiQ0hBTk5FTF9TVEFURVMiLCJDSEFOTkVMX0VWRU5UUyIsIlRSQU5TUE9SVFMiLCJDT05ORUNUSU9OX1NUQVRFIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/push.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/push.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Push)\n/* harmony export */ });\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/constants */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\");\n\nclass Push {\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 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({ status, response }) {\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} //# sourceMappingURL=push.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi9wdXNoLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQW1EO0FBQ3BDLE1BQU1DO0lBQ2pCOzs7Ozs7O0tBT0MsR0FDREMsWUFBWUMsT0FBTyxFQUFFQyxLQUFLLEVBQUVDLFVBQVUsQ0FBQyxDQUFDLEVBQUVDLFVBQVVOLDJEQUFlLENBQUU7UUFDakUsSUFBSSxDQUFDRyxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDQyxLQUFLLEdBQUdBO1FBQ2IsSUFBSSxDQUFDQyxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDQyxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDQyxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNDLFlBQVksR0FBR0M7UUFDcEIsSUFBSSxDQUFDQyxHQUFHLEdBQUc7UUFDWCxJQUFJLENBQUNDLFlBQVksR0FBRztRQUNwQixJQUFJLENBQUNDLFFBQVEsR0FBRyxFQUFFO1FBQ2xCLElBQUksQ0FBQ0MsUUFBUSxHQUFHO0lBQ3BCO0lBQ0FDLE9BQU9SLE9BQU8sRUFBRTtRQUNaLElBQUksQ0FBQ0EsT0FBTyxHQUFHQTtRQUNmLElBQUksQ0FBQ1MsZUFBZTtRQUNwQixJQUFJLENBQUNMLEdBQUcsR0FBRztRQUNYLElBQUksQ0FBQ0csUUFBUSxHQUFHO1FBQ2hCLElBQUksQ0FBQ0YsWUFBWSxHQUFHO1FBQ3BCLElBQUksQ0FBQ0osSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDUyxJQUFJO0lBQ2I7SUFDQUEsT0FBTztRQUNILElBQUksSUFBSSxDQUFDQyxZQUFZLENBQUMsWUFBWTtZQUM5QjtRQUNKO1FBQ0EsSUFBSSxDQUFDQyxZQUFZO1FBQ2pCLElBQUksQ0FBQ1gsSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDSixPQUFPLENBQUNnQixNQUFNLENBQUNDLElBQUksQ0FBQztZQUNyQkMsT0FBTyxJQUFJLENBQUNsQixPQUFPLENBQUNrQixLQUFLO1lBQ3pCakIsT0FBTyxJQUFJLENBQUNBLEtBQUs7WUFDakJDLFNBQVMsSUFBSSxDQUFDQSxPQUFPO1lBQ3JCSyxLQUFLLElBQUksQ0FBQ0EsR0FBRztZQUNiWSxVQUFVLElBQUksQ0FBQ25CLE9BQU8sQ0FBQ29CLFFBQVE7UUFDbkM7SUFDSjtJQUNBQyxjQUFjbkIsT0FBTyxFQUFFO1FBQ25CLElBQUksQ0FBQ0EsT0FBTyxHQUFHb0IsT0FBT0MsTUFBTSxDQUFDRCxPQUFPQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQ3JCLE9BQU8sR0FBR0E7SUFDbEU7SUFDQXNCLFFBQVFDLE1BQU0sRUFBRUMsUUFBUSxFQUFFO1FBQ3RCLElBQUlDO1FBQ0osSUFBSSxJQUFJLENBQUNiLFlBQVksQ0FBQ1csU0FBUztZQUMzQkMsU0FBUyxDQUFDQyxLQUFLLElBQUksQ0FBQ25CLFlBQVksTUFBTSxRQUFRbUIsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHQyxRQUFRO1FBQ3RGO1FBQ0EsSUFBSSxDQUFDbkIsUUFBUSxDQUFDUSxJQUFJLENBQUM7WUFBRVE7WUFBUUM7UUFBUztRQUN0QyxPQUFPLElBQUk7SUFDZjtJQUNBWCxlQUFlO1FBQ1gsSUFBSSxJQUFJLENBQUNWLFlBQVksRUFBRTtZQUNuQjtRQUNKO1FBQ0EsSUFBSSxDQUFDRSxHQUFHLEdBQUcsSUFBSSxDQUFDUCxPQUFPLENBQUNnQixNQUFNLENBQUNhLFFBQVE7UUFDdkMsSUFBSSxDQUFDbkIsUUFBUSxHQUFHLElBQUksQ0FBQ1YsT0FBTyxDQUFDOEIsZUFBZSxDQUFDLElBQUksQ0FBQ3ZCLEdBQUc7UUFDckQsTUFBTW1CLFdBQVcsQ0FBQ3hCO1lBQ2QsSUFBSSxDQUFDVSxlQUFlO1lBQ3BCLElBQUksQ0FBQ21CLGNBQWM7WUFDbkIsSUFBSSxDQUFDdkIsWUFBWSxHQUFHTjtZQUNwQixJQUFJLENBQUM4QixhQUFhLENBQUM5QjtRQUN2QjtRQUNBLElBQUksQ0FBQ0YsT0FBTyxDQUFDaUMsR0FBRyxDQUFDLElBQUksQ0FBQ3ZCLFFBQVEsRUFBRSxDQUFDLEdBQUdnQjtRQUNwQyxJQUFJLENBQUNyQixZQUFZLEdBQUc2QixXQUFXO1lBQzNCLElBQUksQ0FBQ0MsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUM3QixHQUFHLElBQUksQ0FBQ2hDLE9BQU87SUFDbkI7SUFDQWdDLFFBQVFWLE1BQU0sRUFBRUcsUUFBUSxFQUFFO1FBQ3RCLElBQUksSUFBSSxDQUFDbEIsUUFBUSxFQUNiLElBQUksQ0FBQ1YsT0FBTyxDQUFDb0MsUUFBUSxDQUFDLElBQUksQ0FBQzFCLFFBQVEsRUFBRTtZQUFFZTtZQUFRRztRQUFTO0lBQ2hFO0lBQ0FTLFVBQVU7UUFDTixJQUFJLENBQUN6QixlQUFlO1FBQ3BCLElBQUksQ0FBQ21CLGNBQWM7SUFDdkI7SUFDQW5CLGtCQUFrQjtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUNGLFFBQVEsRUFBRTtZQUNoQjtRQUNKO1FBQ0EsSUFBSSxDQUFDVixPQUFPLENBQUNzQyxJQUFJLENBQUMsSUFBSSxDQUFDNUIsUUFBUSxFQUFFLENBQUM7SUFDdEM7SUFDQXFCLGlCQUFpQjtRQUNiUSxhQUFhLElBQUksQ0FBQ2xDLFlBQVk7UUFDOUIsSUFBSSxDQUFDQSxZQUFZLEdBQUdDO0lBQ3hCO0lBQ0EwQixjQUFjLEVBQUVQLE1BQU0sRUFBRUcsUUFBUSxFQUFFLEVBQUU7UUFDaEMsSUFBSSxDQUFDbkIsUUFBUSxDQUFDK0IsTUFBTSxDQUFDLENBQUNDLElBQU1BLEVBQUVoQixNQUFNLEtBQUtBLFFBQVFpQixPQUFPLENBQUMsQ0FBQ0QsSUFBTUEsRUFBRWYsUUFBUSxDQUFDRTtJQUMvRTtJQUNBZCxhQUFhVyxNQUFNLEVBQUU7UUFDakIsT0FBTyxJQUFJLENBQUNqQixZQUFZLElBQUksSUFBSSxDQUFDQSxZQUFZLENBQUNpQixNQUFNLEtBQUtBO0lBQzdEO0FBQ0osRUFDQSxnQ0FBZ0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi9wdXNoLmpzPzQ0OGYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREVGQVVMVF9USU1FT1VUIH0gZnJvbSAnLi4vbGliL2NvbnN0YW50cyc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQdXNoIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5uZWwgVGhlIENoYW5uZWxcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LCBmb3IgZXhhbXBsZSBgXCJwaHhfam9pblwiYFxuICAgICAqIEBwYXJhbSBwYXlsb2FkIFRoZSBwYXlsb2FkLCBmb3IgZXhhbXBsZSBge3VzZXJfaWQ6IDEyM31gXG4gICAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjaGFubmVsLCBldmVudCwgcGF5bG9hZCA9IHt9LCB0aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgdGhpcy5zZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGltZW91dFRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnJlZiA9ICcnO1xuICAgICAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGw7XG4gICAgICAgIHRoaXMucmVjSG9va3MgPSBbXTtcbiAgICAgICAgdGhpcy5yZWZFdmVudCA9IG51bGw7XG4gICAgfVxuICAgIHJlc2VuZCh0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgIHRoaXMuX2NhbmNlbFJlZkV2ZW50KCk7XG4gICAgICAgIHRoaXMucmVmID0gJyc7XG4gICAgICAgIHRoaXMucmVmRXZlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VudCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbmQoKTtcbiAgICB9XG4gICAgc2VuZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc1JlY2VpdmVkKCd0aW1lb3V0JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXJ0VGltZW91dCgpO1xuICAgICAgICB0aGlzLnNlbnQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoYW5uZWwuc29ja2V0LnB1c2goe1xuICAgICAgICAgICAgdG9waWM6IHRoaXMuY2hhbm5lbC50b3BpYyxcbiAgICAgICAgICAgIGV2ZW50OiB0aGlzLmV2ZW50LFxuICAgICAgICAgICAgcGF5bG9hZDogdGhpcy5wYXlsb2FkLFxuICAgICAgICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgICAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuX2pvaW5SZWYoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVwZGF0ZVBheWxvYWQocGF5bG9hZCkge1xuICAgICAgICB0aGlzLnBheWxvYWQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucGF5bG9hZCksIHBheWxvYWQpO1xuICAgIH1cbiAgICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5faGFzUmVjZWl2ZWQoc3RhdHVzKSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKF9hID0gdGhpcy5yZWNlaXZlZFJlc3ApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWNIb29rcy5wdXNoKHsgc3RhdHVzLCBjYWxsYmFjayB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXJ0VGltZW91dCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZW91dFRpbWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWYgPSB0aGlzLmNoYW5uZWwuc29ja2V0Ll9tYWtlUmVmKCk7XG4gICAgICAgIHRoaXMucmVmRXZlbnQgPSB0aGlzLmNoYW5uZWwuX3JlcGx5RXZlbnROYW1lKHRoaXMucmVmKTtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsUmVmRXZlbnQoKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRpbWVvdXQoKTtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZWRSZXNwID0gcGF5bG9hZDtcbiAgICAgICAgICAgIHRoaXMuX21hdGNoUmVjZWl2ZShwYXlsb2FkKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jaGFubmVsLl9vbih0aGlzLnJlZkV2ZW50LCB7fSwgY2FsbGJhY2spO1xuICAgICAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCd0aW1lb3V0Jywge30pO1xuICAgICAgICB9LCB0aGlzLnRpbWVvdXQpO1xuICAgIH1cbiAgICB0cmlnZ2VyKHN0YXR1cywgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHRoaXMucmVmRXZlbnQpXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWwuX3RyaWdnZXIodGhpcy5yZWZFdmVudCwgeyBzdGF0dXMsIHJlc3BvbnNlIH0pO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9jYW5jZWxSZWZFdmVudCgpO1xuICAgICAgICB0aGlzLl9jYW5jZWxUaW1lb3V0KCk7XG4gICAgfVxuICAgIF9jYW5jZWxSZWZFdmVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZkV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFubmVsLl9vZmYodGhpcy5yZWZFdmVudCwge30pO1xuICAgIH1cbiAgICBfY2FuY2VsVGltZW91dCgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFRpbWVyKTtcbiAgICAgICAgdGhpcy50aW1lb3V0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIF9tYXRjaFJlY2VpdmUoeyBzdGF0dXMsIHJlc3BvbnNlIH0pIHtcbiAgICAgICAgdGhpcy5yZWNIb29rcy5maWx0ZXIoKGgpID0+IGguc3RhdHVzID09PSBzdGF0dXMpLmZvckVhY2goKGgpID0+IGguY2FsbGJhY2socmVzcG9uc2UpKTtcbiAgICB9XG4gICAgX2hhc1JlY2VpdmVkKHN0YXR1cykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWNlaXZlZFJlc3AgJiYgdGhpcy5yZWNlaXZlZFJlc3Auc3RhdHVzID09PSBzdGF0dXM7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVzaC5qcy5tYXAiXSwibmFtZXMiOlsiREVGQVVMVF9USU1FT1VUIiwiUHVzaCIsImNvbnN0cnVjdG9yIiwiY2hhbm5lbCIsImV2ZW50IiwicGF5bG9hZCIsInRpbWVvdXQiLCJzZW50IiwidGltZW91dFRpbWVyIiwidW5kZWZpbmVkIiwicmVmIiwicmVjZWl2ZWRSZXNwIiwicmVjSG9va3MiLCJyZWZFdmVudCIsInJlc2VuZCIsIl9jYW5jZWxSZWZFdmVudCIsInNlbmQiLCJfaGFzUmVjZWl2ZWQiLCJzdGFydFRpbWVvdXQiLCJzb2NrZXQiLCJwdXNoIiwidG9waWMiLCJqb2luX3JlZiIsIl9qb2luUmVmIiwidXBkYXRlUGF5bG9hZCIsIk9iamVjdCIsImFzc2lnbiIsInJlY2VpdmUiLCJzdGF0dXMiLCJjYWxsYmFjayIsIl9hIiwicmVzcG9uc2UiLCJfbWFrZVJlZiIsIl9yZXBseUV2ZW50TmFtZSIsIl9jYW5jZWxUaW1lb3V0IiwiX21hdGNoUmVjZWl2ZSIsIl9vbiIsInNldFRpbWVvdXQiLCJ0cmlnZ2VyIiwiX3RyaWdnZXIiLCJkZXN0cm95IiwiX29mZiIsImNsZWFyVGltZW91dCIsImZpbHRlciIsImgiLCJmb3JFYWNoIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/push.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js":
|
||
/*!**************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js ***!
|
||
\**************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Serializer)\n/* harmony export */ });\nclass Serializer {\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 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 ${joinRef.length} exceeds maximum of 255`);\n }\n if (ref.length > 255) {\n throw new Error(`ref length ${ref.length} exceeds maximum of 255`);\n }\n if (topic.length > 255) {\n throw new Error(`topic length ${topic.length} exceeds maximum of 255`);\n }\n if (userEvent.length > 255) {\n throw new Error(`userEvent length ${userEvent.length} exceeds maximum of 255`);\n }\n if (metadata.length > 255) {\n throw new Error(`metadata length ${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(([key])=>keys.includes(key)));\n }\n} //# sourceMappingURL=serializer.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi9zZXJpYWxpemVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBZSxNQUFNQTtJQUNqQkMsWUFBWUMsbUJBQW1CLENBQUU7UUFDN0IsSUFBSSxDQUFDQyxhQUFhLEdBQUc7UUFDckIsSUFBSSxDQUFDQywrQkFBK0IsR0FBRztRQUN2QyxJQUFJLENBQUNDLEtBQUssR0FBRztZQUFFQyxtQkFBbUI7WUFBR0MsZUFBZTtRQUFFO1FBQ3RELElBQUksQ0FBQ0MsZUFBZSxHQUFHO1FBQ3ZCLElBQUksQ0FBQ0MsYUFBYSxHQUFHO1FBQ3JCLElBQUksQ0FBQ0MsZUFBZSxHQUFHO1FBQ3ZCLElBQUksQ0FBQ1IsbUJBQW1CLEdBQUcsRUFBRTtRQUM3QixJQUFJLENBQUNBLG1CQUFtQixHQUFHQSx3QkFBd0IsUUFBUUEsd0JBQXdCLEtBQUssSUFBSUEsc0JBQXNCLEVBQUU7SUFDeEg7SUFDQVMsT0FBT0MsR0FBRyxFQUFFQyxRQUFRLEVBQUU7UUFDbEIsSUFBSUQsSUFBSUUsS0FBSyxLQUFLLElBQUksQ0FBQ0osZUFBZSxJQUNsQyxDQUFFRSxDQUFBQSxJQUFJRyxPQUFPLFlBQVlDLFdBQVUsS0FDbkMsT0FBT0osSUFBSUcsT0FBTyxDQUFDRCxLQUFLLEtBQUssVUFBVTtZQUN2QyxPQUFPRCxTQUFTLElBQUksQ0FBQ0ksOEJBQThCLENBQUNMO1FBQ3hEO1FBQ0EsSUFBSUcsVUFBVTtZQUFDSCxJQUFJTSxRQUFRO1lBQUVOLElBQUlPLEdBQUc7WUFBRVAsSUFBSVEsS0FBSztZQUFFUixJQUFJRSxLQUFLO1lBQUVGLElBQUlHLE9BQU87U0FBQztRQUN4RSxPQUFPRixTQUFTUSxLQUFLQyxTQUFTLENBQUNQO0lBQ25DO0lBQ0FFLCtCQUErQk0sT0FBTyxFQUFFO1FBQ3BDLElBQUlDO1FBQ0osSUFBSSxJQUFJLENBQUNDLGNBQWMsQ0FBQyxDQUFDRCxLQUFLRCxRQUFRUixPQUFPLE1B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QVcsTUFBTSxRQUFRdUIsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHdUQsSUFBSSxNQUFNO0lBQ3pLO0lBQ0F2QyxNQUFNd0MsR0FBRyxFQUFFckMsSUFBSSxFQUFFO1FBQ2IsSUFBSSxDQUFDcUMsT0FBTyxPQUFPQSxRQUFRLFVBQVU7WUFDakMsT0FBTyxDQUFDO1FBQ1o7UUFDQSxPQUFPdEMsT0FBT3VDLFdBQVcsQ0FBQ3ZDLE9BQU93QyxPQUFPLENBQUNGLEtBQUtHLE1BQU0sQ0FBQyxDQUFDLENBQUNDLElBQUksR0FBS3pDLEtBQUswQyxRQUFRLENBQUNEO0lBQ2xGO0FBQ0osRUFDQSxzQ0FBc0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi9zZXJpYWxpemVyLmpzPzgxZGIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VyaWFsaXplciB7XG4gICAgY29uc3RydWN0b3IoYWxsb3dlZE1ldGFkYXRhS2V5cykge1xuICAgICAgICB0aGlzLkhFQURFUl9MRU5HVEggPSAxO1xuICAgICAgICB0aGlzLlVTRVJfQlJPQURDQVNUX1BVU0hfTUVUQV9MRU5HVEggPSA2O1xuICAgICAgICB0aGlzLktJTkRTID0geyB1c2VyQnJvYWRjYXN0UHVzaDogMywgdXNlckJyb2FkY2FzdDogNCB9O1xuICAgICAgICB0aGlzLkJJTkFSWV9FTkNPRElORyA9IDA7XG4gICAgICAgIHRoaXMuSlNPTl9FTkNPRElORyA9IDE7XG4gICAgICAgIHRoaXMuQlJPQURDQVNUX0VWRU5UID0gJ2Jyb2FkY2FzdCc7XG4gICAgICAgIHRoaXMuYWxsb3dlZE1ldGFkYXRhS2V5cyA9IFtdO1xuICAgICAgICB0aGlzLmFsbG93ZWRNZXRhZGF0YUtleXMgPSBhbGxvd2VkTWV0YWRhdGFLZXlzICE9PSBudWxsICYmIGFsbG93ZWRNZXRhZGF0YUtleXMgIT09IHZvaWQgMCA/IGFsbG93ZWRNZXRhZGF0YUtleXMgOiBbXTtcbiAgICB9XG4gICAgZW5jb2RlKG1zZywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKG1zZy5ldmVudCA9PT0gdGhpcy5CUk9BRENBU1RfRVZFTlQgJiZcbiAgICAgICAgICAgICEobXNnLnBheWxvYWQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgJiZcbiAgICAgICAgICAgIHR5cGVvZiBtc2cucGF5bG9hZC5ldmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh0aGlzLl9iaW5hcnlFbmNvZGVVc2VyQnJvYWRjYXN0UHVzaChtc2cpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF5bG9hZCA9IFttc2cuam9pbl9yZWYsIG1zZy5yZWYsIG1zZy50b3BpYywgbXNnLmV2ZW50LCBtc2cucGF5bG9hZF07XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG4gICAgfVxuICAgIF9iaW5hcnlFbmNvZGVVc2VyQnJvYWRjYXN0UHVzaChtZXNzYWdlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQXJyYXlCdWZmZXIoKF9hID0gbWVzc2FnZS5wYXlsb2FkKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF5bG9hZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVCaW5hcnlVc2VyQnJvYWRjYXN0UHVzaChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVKc29uVXNlckJyb2FkY2FzdFB1c2gobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2VuY29kZUJpbmFyeVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgdXNlclBheWxvYWQgPSAoX2IgPSAoX2EgPSBtZXNzYWdlLnBheWxvYWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXlsb2FkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVVc2VyQnJvYWRjYXN0UHVzaChtZXNzYWdlLCB0aGlzLkJJTkFSWV9FTkNPRElORywgdXNlclBheWxvYWQpO1xuICAgIH1cbiAgICBfZW5jb2RlSnNvblVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgdXNlclBheWxvYWQgPSAoX2IgPSAoX2EgPSBtZXNzYWdlLnBheWxvYWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXlsb2FkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB7fTtcbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgICBjb25zdCBlbmNvZGVkVXNlclBheWxvYWQgPSBlbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh1c2VyUGF5bG9hZCkpLmJ1ZmZlcjtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UsIHRoaXMuSlNPTl9FTkNPRElORywgZW5jb2RlZFVzZXJQYXlsb2FkKTtcbiAgICB9XG4gICAgX2VuY29kZVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UsIGVuY29kaW5nVHlwZSwgZW5jb2RlZFBheWxvYWQpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgdG9waWMgPSBtZXNzYWdlLnRvcGljO1xuICAgICAgICBjb25zdCByZWYgPSAoX2EgPSBtZXNzYWdlLnJlZikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgICAgIGNvbnN0IGpvaW5SZWYgPSAoX2IgPSBtZXNzYWdlLmpvaW5fcmVmKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcbiAgICAgICAgY29uc3QgdXNlckV2ZW50ID0gbWVzc2FnZS5wYXlsb2FkLmV2ZW50O1xuICAgICAgICAvLyBGaWx0ZXIgbWV0YWRhdGEgYmFzZWQgb24gYWxsb3dlZCBrZXlzXG4gICAgICAgIGNvbnN0IHJlc3QgPSB0aGlzLmFsbG93ZWRNZXRhZGF0YUtleXNcbiAgICAgICAgICAgID8gdGhpcy5fcGljayhtZXNzYWdlLnBheWxvYWQsIHRoaXMuYWxsb3dlZE1ldGFkYXRhS2V5cylcbiAgICAgICAgICAgIDoge307XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gT2JqZWN0LmtleXMocmVzdCkubGVuZ3RoID09PSAwID8gJycgOiBKU09OLnN0cmluZ2lmeShyZXN0KTtcbiAgICAgICAgLy8gVmFsaWRhdGUgbGVuZ3RocyBkb24ndCBleGNlZWQgdWludDggbWF4IHZhbHVlICgyNTUpXG4gICAgICAgIGlmIChqb2luUmVmLmxlbmd0aCA+IDI1NSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBqb2luUmVmIGxlbmd0aCAke2pvaW5SZWYubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgMjU1YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZi5sZW5ndGggPiAyNTUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVmIGxlbmd0aCAke3JlZi5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAyNTVgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9waWMubGVuZ3RoID4gMjU1KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRvcGljIGxlbmd0aCAke3RvcGljLmxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtIG9mIDI1NWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VyRXZlbnQubGVuZ3RoID4gMjU1KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVzZXJFdmVudCBsZW5ndGggJHt1c2VyRXZlbnQubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgMjU1YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLmxlbmd0aCA+IDI1NSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtZXRhZGF0YSBsZW5ndGggJHttZXRhZGF0YS5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAyNTVgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhTGVuZ3RoID0gdGhpcy5VU0VSX0JST0FEQ0FTVF9QVVNIX01FVEFfTEVOR1RIICtcbiAgICAgICAgICAgIGpvaW5SZWYubGVuZ3RoICtcbiAgICAgICAgICAgIHJlZi5sZW5ndGggK1xuICAgICAgICAgICAgdG9waWMubGVuZ3RoICtcbiAgICAgICAgICAgIHVzZXJFdmVudC5sZW5ndGggK1xuICAgICAgICAgICAgbWV0YWRhdGEubGVuZ3RoO1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5IRUFERVJfTEVOR1RIICsgbWV0YUxlbmd0aCk7XG4gICAgICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGhlYWRlcik7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnVzZXJCcm9hZGNhc3RQdXNoKTsgLy8ga2luZFxuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luUmVmLmxlbmd0aCk7XG4gICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIHJlZi5sZW5ndGgpO1xuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpO1xuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB1c2VyRXZlbnQubGVuZ3RoKTtcbiAgICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgbWV0YWRhdGEubGVuZ3RoKTtcbiAgICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZW5jb2RpbmdUeXBlKTtcbiAgICAgICAgQXJyYXkuZnJvbShqb2luUmVmLCAoY2hhcikgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSk7XG4gICAgICAgIEFycmF5LmZyb20ocmVmLCAoY2hhcikgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSk7XG4gICAgICAgIEFycmF5LmZyb20odG9waWMsIChjaGFyKSA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbiAgICAgICAgQXJyYXkuZnJvbSh1c2VyRXZlbnQsIChjaGFyKSA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbiAgICAgICAgQXJyYXkuZnJvbShtZXRhZGF0YSwgKGNoYXIpID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpO1xuICAgICAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIGVuY29kZWRQYXlsb2FkLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMCk7XG4gICAgICAgIGNvbWJpbmVkLnNldChuZXcgVWludDhBcnJheShlbmNvZGVkUGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlcjtcbiAgICB9XG4gICAgZGVjb2RlKHJhd1BheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0FycmF5QnVmZmVyKHJhd1BheWxvYWQpKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByYXdQYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QganNvblBheWxvYWQgPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpO1xuICAgICAgICAgICAgY29uc3QgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBqc29uUGF5bG9hZDtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh7IGpvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2soe30pO1xuICAgIH1cbiAgICBfYmluYXJ5RGVjb2RlKGJ1ZmZlcikge1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IGtpbmQgPSB2aWV3LmdldFVpbnQ4KDApO1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSB0aGlzLktJTkRTLnVzZXJCcm9hZGNhc3Q6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29kZVVzZXJCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZGVjb2RlVXNlckJyb2FkY2FzdChidWZmZXIsIHZpZXcsIGRlY29kZXIpIHtcbiAgICAgICAgY29uc3QgdG9waWNTaXplID0gdmlldy5nZXRVaW50OCgxKTtcbiAgICAgICAgY29uc3QgdXNlckV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMik7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhU2l6ZSA9IHZpZXcuZ2V0VWludDgoMyk7XG4gICAgICAgIGNvbnN0IHBheWxvYWRFbmNvZGluZyA9IHZpZXcuZ2V0VWludDgoNCk7XG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyA0O1xuICAgICAgICBjb25zdCB0b3BpYyA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHRvcGljU2l6ZSkpO1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemU7XG4gICAgICAgIGNvbnN0IHVzZXJFdmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHVzZXJFdmVudFNpemUpKTtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgdXNlckV2ZW50U2l6ZTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBtZXRhZGF0YVNpemUpKTtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgbWV0YWRhdGFTaXplO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCBwYXJzZWRQYXlsb2FkID0gcGF5bG9hZEVuY29kaW5nID09PSB0aGlzLkpTT05fRU5DT0RJTkcgPyBKU09OLnBhcnNlKGRlY29kZXIuZGVjb2RlKHBheWxvYWQpKSA6IHBheWxvYWQ7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLkJST0FEQ0FTVF9FVkVOVCxcbiAgICAgICAgICAgIGV2ZW50OiB1c2VyRXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkOiBwYXJzZWRQYXlsb2FkLFxuICAgICAgICB9O1xuICAgICAgICAvLyBNZXRhZGF0YSBpcyBvcHRpb25hbCBhbmQgYWx3YXlzIEpTT04gZW5jb2RlZFxuICAgICAgICBpZiAobWV0YWRhdGFTaXplID4gMCkge1xuICAgICAgICAgICAgZGF0YVsnbWV0YSddID0gSlNPTi5wYXJzZShtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgam9pbl9yZWY6IG51bGwsIHJlZjogbnVsbCwgdG9waWM6IHRvcGljLCBldmVudDogdGhpcy5CUk9BRENBU1RfRVZFTlQsIHBheWxvYWQ6IGRhdGEgfTtcbiAgICB9XG4gICAgX2lzQXJyYXlCdWZmZXIoYnVmZmVyKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8ICgoX2EgPSBidWZmZXIgPT09IG51bGwgfHwgYnVmZmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBidWZmZXIuY29uc3RydWN0b3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uYW1lKSA9PT0gJ0FycmF5QnVmZmVyJztcbiAgICB9XG4gICAgX3BpY2sob2JqLCBrZXlzKSB7XG4gICAgICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhvYmopLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcmlhbGl6ZXIuanMubWFwIl0sIm5hbWVzIjpbIlNlcmlhbGl6ZXIiLCJjb25zdHJ1Y3RvciIsImFsbG93ZWRNZXRhZGF0YUtleXMiLCJIRUFERVJfTEVOR1RIIiwiVVNFUl9CUk9BRENBU1RfUFVTSF9NRVRBX0xFTkdUSCIsIktJTkRTIiwidXNlckJyb2FkY2FzdFB1c2giLCJ1c2VyQnJvYWRjYXN0IiwiQklOQVJZX0VOQ09ESU5HIiwiSlNPTl9FTkNPRElORyIsIkJST0FEQ0FTVF9FVkVOVCIsImVuY29kZSIsIm1zZyIsImNhbGxiYWNrIiwiZXZlbnQiLCJwYXlsb2FkIiwiQXJyYXlCdWZmZXIiLCJfYmluYXJ5RW5jb2RlVXNlckJyb2FkY2FzdFB1c2giLCJqb2luX3JlZiIsInJlZiIsInRvcGljIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1lc3NhZ2UiLCJfYSIsIl9pc0FycmF5QnVmZmVyIiwiX2VuY29kZUJpbmFyeVVzZXJCcm9hZGNhc3RQdXNoIiwiX2VuY29kZUpzb25Vc2VyQnJvYWRjYXN0UHVzaCIsIl9iIiwidXNlclBheWxvYWQiLCJfZW5jb2RlVXNlckJyb2FkY2FzdFB1c2giLCJlbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJlbmNvZGVkVXNlclBheWxvYWQiLCJidWZmZXIiLCJlbmNvZGluZ1R5cGUiLCJlbmNvZGVkUGF5bG9hZCIsImpvaW5SZWYiLCJ1c2VyRXZlbnQiLCJyZXN0IiwiX3BpY2siLCJtZXRhZGF0YSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJFcnJvciIsIm1ldGFMZW5ndGgiLCJoZWFkZXIiLCJ2aWV3IiwiRGF0YVZpZXciLCJvZmZzZXQiLCJzZXRVaW50OCIsIkFycmF5IiwiZnJvbSIsImNoYXIiLCJjaGFyQ29kZUF0IiwiY29tYmluZWQiLCJVaW50OEFycmF5IiwiYnl0ZUxlbmd0aCIsInNldCIsImRlY29kZSIsInJhd1BheWxvYWQiLCJyZXN1bHQiLCJfYmluYXJ5RGVjb2RlIiwianNvblBheWxvYWQiLCJwYXJzZSIsImtpbmQiLCJnZXRVaW50OCIsImRlY29kZXIiLCJUZXh0RGVjb2RlciIsIl9kZWNvZGVVc2VyQnJvYWRjYXN0IiwidG9waWNTaXplIiwidXNlckV2ZW50U2l6ZSIsIm1ldGFkYXRhU2l6ZSIsInBheWxvYWRFbmNvZGluZyIsInNsaWNlIiwicGFyc2VkUGF5bG9hZCIsImRhdGEiLCJ0eXBlIiwibmFtZSIsIm9iaiIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsImZpbHRlciIsImtleSIsImluY2x1ZGVzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/timer.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* 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 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 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} //# sourceMappingURL=timer.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi90aW1lci5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7Ozs7Ozs7Ozs7O0NBV0MsR0FDYyxNQUFNQTtJQUNqQkMsWUFBWUMsUUFBUSxFQUFFQyxTQUFTLENBQUU7UUFDN0IsSUFBSSxDQUFDRCxRQUFRLEdBQUdBO1FBQ2hCLElBQUksQ0FBQ0MsU0FBUyxHQUFHQTtRQUNqQixJQUFJLENBQUNDLEtBQUssR0FBR0M7UUFDYixJQUFJLENBQUNDLEtBQUssR0FBRztRQUNiLElBQUksQ0FBQ0osUUFBUSxHQUFHQTtRQUNoQixJQUFJLENBQUNDLFNBQVMsR0FBR0E7SUFDckI7SUFDQUksUUFBUTtRQUNKLElBQUksQ0FBQ0QsS0FBSyxHQUFHO1FBQ2JFLGFBQWEsSUFBSSxDQUFDSixLQUFLO1FBQ3ZCLElBQUksQ0FBQ0EsS0FBSyxHQUFHQztJQUNqQjtJQUNBLDhEQUE4RDtJQUM5REksa0JBQWtCO1FBQ2RELGFBQWEsSUFBSSxDQUFDSixLQUFLO1FBQ3ZCLElBQUksQ0FBQ0EsS0FBSyxHQUFHTSxXQUFXO1lBQ3BCLElBQUksQ0FBQ0osS0FBSyxHQUFHLElBQUksQ0FBQ0EsS0FBSyxHQUFHO1lBQzFCLElBQUksQ0FBQ0osUUFBUTtRQUNqQixHQUFHLElBQUksQ0FBQ0MsU0FBUyxDQUFDLElBQUksQ0FBQ0csS0FBSyxHQUFHO0lBQ25DO0FBQ0osRUFDQSxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi90aW1lci5qcz8xMTVlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm0gY2FsY3VsYXRlZCB0aW1lb3V0IHJldHJpZXMsIHN1Y2ggYXMgZXhwb25lbnRpYWwgYmFja29mZi5cbiAqXG4gKiBAZXhhbXBsZVxuICogICAgbGV0IHJlY29ubmVjdFRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHRoaXMuY29ubmVjdCgpLCBmdW5jdGlvbih0cmllcyl7XG4gKiAgICAgIHJldHVybiBbMTAwMCwgNTAwMCwgMTAwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAqICAgIH0pXG4gKiAgICByZWNvbm5lY3RUaW1lci5zY2hlZHVsZVRpbWVvdXQoKSAvLyBmaXJlcyBhZnRlciAxMDAwXG4gKiAgICByZWNvbm5lY3RUaW1lci5zY2hlZHVsZVRpbWVvdXQoKSAvLyBmaXJlcyBhZnRlciA1MDAwXG4gKiAgICByZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gKiAgICByZWNvbm5lY3RUaW1lci5zY2hlZHVsZVRpbWVvdXQoKSAvLyBmaXJlcyBhZnRlciAxMDAwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbWVyIHtcbiAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgdGhpcy50aW1lckNhbGMgPSB0aW1lckNhbGM7XG4gICAgICAgIHRoaXMudGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudHJpZXMgPSAwO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMudGltZXJDYWxjID0gdGltZXJDYWxjO1xuICAgIH1cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy50cmllcyA9IDA7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gQ2FuY2VscyBhbnkgcHJldmlvdXMgc2NoZWR1bGVUaW1lb3V0IGFuZCBzY2hlZHVsZXMgY2FsbGJhY2tcbiAgICBzY2hlZHVsZVRpbWVvdXQoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmllcyA9IHRoaXMudHJpZXMgKyAxO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjaygpO1xuICAgICAgICB9LCB0aGlzLnRpbWVyQ2FsYyh0aGlzLnRyaWVzICsgMSkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWVyLmpzLm1hcCJdLCJuYW1lcyI6WyJUaW1lciIsImNvbnN0cnVjdG9yIiwiY2FsbGJhY2siLCJ0aW1lckNhbGMiLCJ0aW1lciIsInVuZGVmaW5lZCIsInRyaWVzIiwicmVzZXQiLCJjbGVhclRpbWVvdXQiLCJzY2hlZHVsZVRpbWVvdXQiLCJzZXRUaW1lb3V0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js":
|
||
/*!****************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js ***!
|
||
\****************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PostgresTypes: () => (/* binding */ PostgresTypes),\n/* harmony export */ convertCell: () => (/* binding */ convertCell),\n/* harmony export */ convertChangeData: () => (/* binding */ convertChangeData),\n/* harmony export */ convertColumn: () => (/* binding */ convertColumn),\n/* harmony export */ httpEndpointURL: () => (/* binding */ httpEndpointURL),\n/* harmony export */ toArray: () => (/* binding */ toArray),\n/* harmony export */ toBoolean: () => (/* binding */ toBoolean),\n/* harmony export */ toJson: () => (/* binding */ toJson),\n/* harmony export */ toNumber: () => (/* binding */ toNumber),\n/* harmony export */ toTimestampString: () => (/* 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 = (columns, record, options = {})=>{\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi90cmFuc2Zvcm1lcnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztDQUVDLEdBQ0QsMEVBQTBFO0FBQzFFLHlGQUF5RjtBQUNsRixJQUFJQSxjQUFjO0FBQ3hCLFVBQVVBLGFBQWE7SUFDcEJBLGFBQWEsQ0FBQyxVQUFVLEdBQUc7SUFDM0JBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxZQUFZLEdBQUc7SUFDN0JBLGFBQWEsQ0FBQyxTQUFTLEdBQUc7SUFDMUJBLGFBQWEsQ0FBQyxTQUFTLEdBQUc7SUFDMUJBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxZQUFZLEdBQUc7SUFDN0JBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxZQUFZLEdBQUc7SUFDN0JBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxRQUFRLEdBQUc7SUFDekJBLGFBQWEsQ0FBQyxRQUFRLEdBQUc7SUFDekJBLGFBQWEsQ0FBQyxVQUFVLEdBQUc7SUFDM0JBLGFBQWEsQ0FBQyxNQUFNLEdBQUc7SUFDdkJBLGFBQWEsQ0FBQyxVQUFVLEdBQUc7SUFDM0JBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxZQUFZLEdBQUc7SUFDN0JBLGFBQWEsQ0FBQyxjQUFjLEdBQUc7SUFDL0JBLGFBQWEsQ0FBQyxTQUFTLEdBQUc7SUFDMUJBLGFBQWEsQ0FBQyxVQUFVLEdBQUc7SUFDM0JBLGFBQWEsQ0FBQyxZQUFZLEdBQUc7QUFDakMsR0FBR0EsaUJBQWtCQSxDQUFBQSxnQkFBZ0IsQ0FBQztBQUN0Qzs7Ozs7Ozs7Ozs7Q0FXQyxH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QUMsS0FBSztJQUM5QjtJQUNBLE9BQU9wRDtBQUNYLEVBQUU7QUFDSyxNQUFNcUQsa0JBQWtCLENBQUNDO0lBQzVCLE1BQU1DLFFBQVEsSUFBSUMsSUFBSUY7SUFDdEJDLE1BQU1FLFFBQVEsR0FBR0YsTUFBTUUsUUFBUSxDQUFDTCxPQUFPLENBQUMsUUFBUTtJQUNoREcsTUFBTUcsUUFBUSxHQUFHSCxNQUFNRyxRQUFRLENBQzFCTixPQUFPLENBQUMsUUFBUSxJQUFJLDhCQUE4QjtLQUNsREEsT0FBTyxDQUFDLHlCQUF5QixJQUFJLG1DQUFtQztLQUN4RUEsT0FBTyxDQUFDLGNBQWMsSUFBSSx5QkFBeUI7S0FDbkRBLE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyw0QkFBNEI7SUFDL0QsSUFBSUcsTUFBTUcsUUFBUSxLQUFLLE1BQU1ILE1BQU1HLFFBQVEsS0FBSyxLQUFLO1FBQ2pESCxNQUFNRyxRQUFRLEdBQUc7SUFDckIsT0FDSztRQUNESCxNQUFNRyxRQUFRLEdBQUdILE1BQU1HLFFBQVEsR0FBRztJQUN0QztJQUNBLE9BQU9ILE1BQU1JLElBQUk7QUFDckIsRUFBRSxDQUNGLHdDQUF3QyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3RyYW5zZm9ybWVycy5qcz8zZmMwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGVscGVycyB0byBjb252ZXJ0IHRoZSBjaGFuZ2UgUGF5bG9hZCBpbnRvIG5hdGl2ZSBKUyB0eXBlcy5cbiAqL1xuLy8gQWRhcHRlZCBmcm9tIGVwZ3NxbCAoc3JjL2VwZ3NxbF9iaW5hcnkuZXJsKSwgdGhpcyBtb2R1bGUgbGljZW5zZWQgdW5kZXJcbi8vIDMtY2xhdXNlIEJTRCBmb3VuZCBoZXJlOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZXBnc3FsL2VwZ3NxbC9kZXZlbC9MSUNFTlNFXG5leHBvcnQgdmFyIFBvc3RncmVzVHlwZXM7XG4oZnVuY3Rpb24gKFBvc3RncmVzVHlwZXMpIHtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiYWJzdGltZVwiXSA9IFwiYWJzdGltZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJib29sXCJdID0gXCJib29sXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImRhdGVcIl0gPSBcImRhdGVcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiZGF0ZXJhbmdlXCJdID0gXCJkYXRlcmFuZ2VcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiZmxvYXQ0XCJdID0gXCJmbG9hdDRcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiZmxvYXQ4XCJdID0gXCJmbG9hdDhcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiaW50MlwiXSA9IFwiaW50MlwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJpbnQ0XCJdID0gXCJpbnQ0XCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImludDRyYW5nZVwiXSA9IFwiaW50NHJhbmdlXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImludDhcIl0gPSBcImludDhcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiaW50OHJhbmdlXCJdID0gXCJpbnQ4cmFuZ2VcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wianNvblwiXSA9IFwianNvblwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJqc29uYlwiXSA9IFwianNvbmJcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wibW9uZXlcIl0gPSBcIm1vbmV5XCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcIm51bWVyaWNcIl0gPSBcIm51bWVyaWNcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wib2lkXCJdID0gXCJvaWRcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wicmVsdGltZVwiXSA9IFwicmVsdGltZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJ0ZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcInRpbWVcIl0gPSBcInRpbWVcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widGltZXN0YW1wXCJdID0gXCJ0aW1lc3RhbXBcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widGltZXN0YW1wdHpcIl0gPSBcInRpbWVzdGFtcHR6XCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcInRpbWV0elwiXSA9IFwidGltZXR6XCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcInRzcmFuZ2VcIl0gPSBcInRzcmFuZ2VcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widHN0enJhbmdlXCJdID0gXCJ0c3R6cmFuZ2VcIjtcbn0pKFBvc3RncmVzVHlwZXMgfHwgKFBvc3RncmVzVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBjb2x1bW5zIGFuZCBhbiBvYmplY3Qgb2Ygc3RyaW5nIHZhbHVlcyB0aGVuIGNvbnZlcnRzIGVhY2ggc3RyaW5nIHZhbHVlXG4gKiB0byBpdHMgbWFwcGVkIHR5cGUuXG4gKlxuICogQHBhcmFtIHt7bmFtZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9W119IGNvbHVtbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWNvcmRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBtYXAgb2YgdmFyaW91cyBvcHRpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIG1hcHBlclxuICogQHBhcmFtIHtBcnJheX0gb3B0aW9ucy5za2lwVHlwZXMgVGhlIGFycmF5IG9mIHR5cGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBjb252ZXJ0ZWRcbiAqXG4gKiBAZXhhbXBsZSBjb252ZXJ0Q2hhbmdlRGF0YShbe25hbWU6ICdmaXJzdF9uYW1lJywgdHlwZTogJ3RleHQnfSwge25hbWU6ICdhZ2UnLCB0eXBlOiAnaW50NCd9XSwge2ZpcnN0X25hbWU6ICdQYXVsJywgYWdlOiczMyd9LCB7fSlcbiAqIC8vPT57IGZpcnN0X25hbWU6ICdQYXVsJywgYWdlOiAzMyB9XG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0Q2hhbmdlRGF0YSA9IChjb2x1bW5zLCByZWNvcmQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBza2lwVHlwZXMgPSAoX2EgPSBvcHRpb25zLnNraXBUeXBlcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW107XG4gICAgaWYgKCFyZWNvcmQpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVjb3JkKS5yZWR1Y2UoKGFjYywgcmVjX2tleSkgPT4ge1xuICAgICAgICBhY2NbcmVjX2tleV0gPSBjb252ZXJ0Q29sdW1uKHJlY19rZXksIGNvbHVtbnMsIHJlY29yZCwgc2tpcFR5cGVzKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59O1xuLyoqXG4gKiBDb252ZXJ0cyB0aGUgdmFsdWUgb2YgYW4gaW5kaXZpZHVhbCBjb2x1bW4uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGNvbHVtbk5hbWUgVGhlIGNvbHVtbiB0aGF0IHlvdSB3YW50IHRvIGNvbnZlcnRcbiAqIEBwYXJhbSB7e25hbWU6IFN0cmluZywgdHlwZTogU3RyaW5nfVtdfSBjb2x1bW5zIEFsbCBvZiB0aGUgY29sdW1uc1xuICogQHBhcmFtIHtPYmplY3R9IHJlY29yZCBUaGUgbWFwIG9mIHN0cmluZyB2YWx1ZXNcbiAqIEBwYXJhbSB7QXJyYXl9IHNraXBUeXBlcyBBbiBhcnJheSBvZiB0eXBlcyB0aGF0IHNob3VsZCBub3QgYmUgY29udmVydGVkXG4gKiBAcmV0dXJuIHtvYmplY3R9IFVzZWxlc3MgaW5mb3JtYXRpb25cbiAqXG4gKiBAZXhhbXBsZSBjb252ZXJ0Q29sdW1uKCdhZ2UnLCBbe25hbWU6ICdmaXJzdF9uYW1lJywgdHlwZTogJ3RleHQnfSwge25hbWU6ICdhZ2UnLCB0eXBlOiAnaW50NCd9XSwge2ZpcnN0X25hbWU6ICdQYXVsJywgYWdlOiAnMzMnfSwgW10pXG4gKiAvLz0+IDMzXG4gKiBAZXhhbXBsZSBjb252ZXJ0Q29sdW1uKCdhZ2UnLCBbe25hbWU6ICdmaXJzdF9uYW1lJywgdHlwZTogJ3RleHQnfSwge25hbWU6ICdhZ2UnLCB0eXBlOiAnaW50NCd9XSwge2ZpcnN0X25hbWU6ICdQYXVsJywgYWdlOiAnMzMnfSwgWydpbnQ0J10pXG4gKiAvLz0+IFwiMzNcIlxuICovXG5leHBvcnQgY29uc3QgY29udmVydENvbHVtbiA9IChjb2x1bW5OYW1lLCBjb2x1bW5zLCByZWNvcmQsIHNraXBUeXBlcykgPT4ge1xuICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnMuZmluZCgoeCkgPT4geC5uYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICBjb25zdCBjb2xUeXBlID0gY29sdW1uID09PSBudWxsIHx8IGNvbHVtbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29sdW1uLnR5cGU7XG4gICAgY29uc3QgdmFsdWUgPSByZWNvcmRbY29sdW1uTmFtZV07XG4gICAgaWYgKGNvbFR5cGUgJiYgIXNraXBUeXBlcy5pbmNsdWRlcyhjb2xUeXBlKSkge1xuICAgICAgICByZXR1cm4gY29udmVydENlbGwoY29sVHlwZSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gbm9vcCh2YWx1ZSk7XG59O1xuLyoqXG4gKiBJZiB0aGUgdmFsdWUgb2YgdGhlIGNlbGwgaXMgYG51bGxgLCByZXR1cm5zIG51bGwuXG4gKiBPdGhlcndpc2UgY29udmVydHMgdGhlIHN0cmluZyB2YWx1ZSB0byB0aGUgY29ycmVjdCB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQSBwb3N0Z3JlcyBjb2x1bW4gdHlwZVxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIFRoZSBjZWxsIHZhbHVlXG4gKlxuICogQGV4YW1wbGUgY29udmVydENlbGwoJ2Jvb2wnLCAndCcpXG4gKiAvLz0+IHRydWVcbiAqIEBleGFtcGxlIGNvbnZlcnRDZWxsKCdpbnQ4JywgJzEwJylcbiAqIC8vPT4gMTBcbiAqIEBleGFtcGxlIGNvbnZlcnRDZWxsKCdfaW50NCcsICd7MSwyLDMsNH0nKVxuICogLy89PiBbMSwyLDMsNF1cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRDZWxsID0gKHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgLy8gaWYgZGF0YSB0eXBlIGlzIGFuIGFycmF5XG4gICAgaWYgKHR5cGUuY2hhckF0KDApID09PSAnXycpIHtcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB0eXBlLnNsaWNlKDEsIHR5cGUubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRvQXJyYXkodmFsdWUsIGRhdGFUeXBlKTtcbiAgICB9XG4gICAgLy8gSWYgbm90IG51bGwsIGNvbnZlcnQgdG8gY29ycmVjdCB0eXBlLlxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuYm9vbDpcbiAgICAgICAgICAgIHJldHVybiB0b0Jvb2xlYW4odmFsdWUpO1xuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuZmxvYXQ0OlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuZmxvYXQ4OlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuaW50MjpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmludDQ6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5pbnQ4OlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMubnVtZXJpYzpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLm9pZDpcbiAgICAgICAgICAgIHJldHVybiB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5qc29uOlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuanNvbmI6XG4gICAgICAgICAgICByZXR1cm4gdG9Kc29uKHZhbHVlKTtcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnRpbWVzdGFtcDpcbiAgICAgICAgICAgIHJldHVybiB0b1RpbWVzdGFtcFN0cmluZyh2YWx1ZSk7IC8vIEZvcm1hdCB0byBiZSBjb25zaXN0ZW50IHdpdGggUG9zdGdSRVNUXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5hYnN0aW1lOiAvLyBUbyBhbGxvdyB1c2VycyB0byBjYXN0IGl0IGJhc2VkIG9uIFRpbWV6b25lXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5kYXRlOiAvLyBUbyBhbGxvdyB1c2VycyB0byBjYXN0IGl0IGJhc2VkIG9uIFRpbWV6b25lXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5kYXRlcmFuZ2U6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5pbnQ0cmFuZ2U6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5pbnQ4cmFuZ2U6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5tb25leTpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnJlbHRpbWU6IC8vIFRvIGFsbG93IHVzZXJzIHRvIGNhc3QgaXQgYmFzZWQgb24gVGltZXpvbmVcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnRleHQ6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy50aW1lOiAvLyBUbyBhbGxvdyB1c2VycyB0byBjYXN0IGl0IGJhc2VkIG9uIFRpbWV6b25lXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy50aW1lc3RhbXB0ejogLy8gVG8gYWxsb3cgdXNlcnMgdG8gY2FzdCBpdCBiYXNlZCBvbiBUaW1lem9uZVxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMudGltZXR6OiAvLyBUbyBhbGxvdyB1c2VycyB0byBjYXN0IGl0IGJhc2VkIG9uIFRpbWV6b25lXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy50c3JhbmdlOlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMudHN0enJhbmdlOlxuICAgICAgICAgICAgcmV0dXJuIG5vb3AodmFsdWUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBmb3IgcmVtYWluaW5nIHR5cGVzXG4gICAgICAgICAgICByZXR1cm4gbm9vcCh2YWx1ZSk7XG4gICAgfVxufTtcbmNvbnN0IG5vb3AgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWU7XG59O1xuZXhwb3J0IGNvbnN0IHRvQm9vbGVhbiA9ICh2YWx1ZSkgPT4ge1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSAndCc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnZic6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCB0b051bWJlciA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZFZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlZFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5leHBvcnQgY29uc3QgdG9Kc29uID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuLyoqXG4gKiBDb252ZXJ0cyBhIFBvc3RncmVzIEFycmF5IGludG8gYSBuYXRpdmUgSlMgYXJyYXlcbiAqXG4gKiBAZXhhbXBsZSB0b0FycmF5KCd7fScsICdpbnQ0JylcbiAqIC8vPT4gW11cbiAqIEBleGFtcGxlIHRvQXJyYXkoJ3tcIlsyMDIxLTAxLTAxLDIwMjEtMTItMzEpXCIsXCIoMjAyMS0wMS0wMSwyMDIxLTEyLTMyXVwifScsICdkYXRlcmFuZ2UnKVxuICogLy89PiBbJ1syMDIxLTAxLTAxLDIwMjEtMTItMzEpJywgJygyMDIxLTAxLTAxLDIwMjEtMTItMzJdJ11cbiAqIEBleGFtcGxlIHRvQXJyYXkoWzEsMiwzLDRdLCAnaW50NCcpXG4gKiAvLz0+IFsxLDIsMyw0XVxuICovXG5leHBvcnQgY29uc3QgdG9BcnJheSA9ICh2YWx1ZSwgdHlwZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgbGFzdElkeCA9IHZhbHVlLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgY2xvc2VCcmFjZSA9IHZhbHVlW2xhc3RJZHhdO1xuICAgIGNvbnN0IG9wZW5CcmFjZSA9IHZhbHVlWzBdO1xuICAgIC8vIENvbmZpcm0gdmFsdWUgaXMgYSBQb3N0Z3JlcyBhcnJheSBieSBjaGVja2luZyBjdXJseSBicmFja2V0c1xuICAgIGlmIChvcGVuQnJhY2UgPT09ICd7JyAmJiBjbG9zZUJyYWNlID09PSAnfScpIHtcbiAgICAgICAgbGV0IGFycjtcbiAgICAgICAgY29uc3QgdmFsVHJpbSA9IHZhbHVlLnNsaWNlKDEsIGxhc3RJZHgpO1xuICAgICAgICAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHNvbHV0aW9uIHRvIHNlcGFyYXRlIFBvc3RncmVzIGFycmF5IGRhdGFcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFyciA9IEpTT04ucGFyc2UoJ1snICsgdmFsVHJpbSArICddJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIC8vIFdBUk5JTkc6IHNwbGl0dGluZyBvbiBjb21tYSBkb2VzIG5vdCBjb3ZlciBhbGwgZWRnZSBjYXNlc1xuICAgICAgICAgICAgYXJyID0gdmFsVHJpbSA/IHZhbFRyaW0uc3BsaXQoJywnKSA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnIubWFwKCh2YWwpID0+IGNvbnZlcnRDZWxsKHR5cGUsIHZhbCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuLyoqXG4gKiBGaXhlcyB0aW1lc3RhbXAgdG8gYmUgSVNPLTg2MDEuIFN3YXBzIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBkYXRlIGFuZCB0aW1lIGZvciBhICdUJ1xuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBhYmFzZS9zdXBhYmFzZS9pc3N1ZXMvMThcbiAqXG4gKiBAZXhhbXBsZSB0b1RpbWVzdGFtcFN0cmluZygnMjAxOS0wOS0xMCAwMDowMDowMCcpXG4gKiAvLz0+ICcyMDE5LTA5LTEwVDAwOjAwOjAwJ1xuICovXG5leHBvcnQgY29uc3QgdG9UaW1lc3RhbXBTdHJpbmcgPSAodmFsdWUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgnICcsICdUJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5leHBvcnQgY29uc3QgaHR0cEVuZHBvaW50VVJMID0gKHNvY2tldFVybCkgPT4ge1xuICAgIGNvbnN0IHdzVXJsID0gbmV3IFVSTChzb2NrZXRVcmwpO1xuICAgIHdzVXJsLnByb3RvY29sID0gd3NVcmwucHJvdG9jb2wucmVwbGFjZSgvXndzL2ksICdodHRwJyk7XG4gICAgd3NVcmwucGF0aG5hbWUgPSB3c1VybC5wYXRobmFtZVxuICAgICAgICAucmVwbGFjZSgvXFwvKyQvLCAnJykgLy8gcmVtb3ZlIGFsbCB0cmFpbGluZyBzbGFzaGVzXG4gICAgICAgIC5yZXBsYWNlKC9cXC9zb2NrZXRcXC93ZWJzb2NrZXQkL2ksICcnKSAvLyByZW1vdmUgdGhlIHNvY2tldC93ZWJzb2NrZXQgcGF0aFxuICAgICAgICAucmVwbGFjZSgvXFwvc29ja2V0JC9pLCAnJykgLy8gcmVtb3ZlIHRoZSBzb2NrZXQgcGF0aFxuICAgICAgICAucmVwbGFjZSgvXFwvd2Vic29ja2V0JC9pLCAnJyk7IC8vIHJlbW92ZSB0aGUgd2Vic29ja2V0IHBhdGhcbiAgICBpZiAod3NVcmwucGF0aG5hbWUgPT09ICcnIHx8IHdzVXJsLnBhdGhuYW1lID09PSAnLycpIHtcbiAgICAgICAgd3NVcmwucGF0aG5hbWUgPSAnL2FwaS9icm9hZGNhc3QnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgd3NVcmwucGF0aG5hbWUgPSB3c1VybC5wYXRobmFtZSArICcvYXBpL2Jyb2FkY2FzdCc7XG4gICAgfVxuICAgIHJldHVybiB3c1VybC5ocmVmO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYW5zZm9ybWVycy5qcy5tYXAiXSwibmFtZXMiOlsiUG9zdGdyZXNUeXBlcyIsImNvbnZlcnRDaGFuZ2VEYXRhIiwiY29sdW1ucyIsInJlY29yZCIsIm9wdGlvbnMiLCJfYSIsInNraXBUeXBlcyIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJhY2MiLCJyZWNfa2V5IiwiY29udmVydENvbHVtbiIsImNvbHVtbk5hbWUiLCJjb2x1bW4iLCJmaW5kIiwieCIsIm5hbWUiLCJjb2xUeXBlIiwidHlwZSIsInZhbHVlIiwiaW5jbHVkZXMiLCJjb252ZXJ0Q2VsbCIsIm5vb3AiLCJjaGFyQXQiLCJkYXRhVHlwZSIsInNsaWNlIiwibGVuZ3RoIiwidG9BcnJheSIsImJvb2wiLCJ0b0Jvb2xlYW4iLCJmbG9hdDQiLCJmbG9hdDgiLCJpbnQyIiwiaW50NCIsImludDgiLCJudW1lcmljIiwib2lkIiwidG9OdW1iZXIiLCJqc29uIiwianNvbmIiLCJ0b0pzb24iLCJ0aW1lc3RhbXAiLCJ0b1RpbWVzdGFtcFN0cmluZyIsImFic3RpbWUiLCJkYXRlIiwiZGF0ZXJhbmdlIiwiaW50NHJhbmdlIiwiaW50OHJhbmdlIiwibW9uZXkiLCJyZWx0aW1lIiwidGV4dCIsInRpbWUiLCJ0aW1lc3RhbXB0eiIsInRpbWV0eiIsInRzcmFuZ2UiLCJ0c3R6cmFuZ2UiLCJwYXJzZWRWYWx1ZSIsInBhcnNlRmxvYXQiLCJOdW1iZXIiLCJpc05hTiIsIkpTT04iLCJwYXJzZSIsImxhc3RJZHgiLCJjbG9zZUJyYWNlIiwib3BlbkJyYWNlIiwiYXJyIiwidmFsVHJpbSIsIl8iLCJzcGxpdCIsIm1hcCIsInZhbCIsInJlcGxhY2UiLCJodHRwRW5kcG9pbnRVUkwiLCJzb2NrZXRVcmwiLCJ3c1VybCIsIlVSTCIsInByb3RvY29sIiwicGF0aG5hbWUiLCJocmVmIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js":
|
||
/*!***********************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/version.js ***!
|
||
\***********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ version: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi92ZXJzaW9uLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2RUFBNkU7QUFDN0UsZ0VBQWdFO0FBQ2hFLHVFQUF1RTtBQUN2RSxpRUFBaUU7QUFDakUsa0VBQWtFO0FBQ2xFLGlFQUFpRTtBQUMxRCxNQUFNQSxVQUFVLFNBQVMsQ0FDaEMsbUNBQW1DIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9saWIvdmVyc2lvbi5qcz8xZmQ1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGR1cmluZyByZWxlYXNlcyBieSBzY3JpcHRzL3VwZGF0ZS12ZXJzaW9uLWZpbGVzLnRzXG4vLyBUaGlzIGZpbGUgcHJvdmlkZXMgcnVudGltZSBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgdmVyc2lvbiBmb3I6XG4vLyAtIEhUVFAgcmVxdWVzdCBoZWFkZXJzIChlLmcuLCBYLUNsaWVudC1JbmZvIGhlYWRlciBmb3IgQVBJIHJlcXVlc3RzKVxuLy8gLSBEZWJ1Z2dpbmcgYW5kIHN1cHBvcnQgKGlkZW50aWZ5aW5nIHdoaWNoIHZlcnNpb24gaXMgcnVubmluZylcbi8vIC0gVGVsZW1ldHJ5IGFuZCBsb2dnaW5nICh2ZXJzaW9uIHJlcG9ydGluZyBpbiBlcnJvcnMvYW5hbHl0aWNzKVxuLy8gLSBFbnN1cmluZyBidWlsZCBhcnRpZmFjdHMgbWF0Y2ggdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIHZlcnNpb25cbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0gJzIuODguMCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZXJzaW9uLmpzLm1hcCJdLCJuYW1lcyI6WyJ2ZXJzaW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js":
|
||
/*!*********************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js ***!
|
||
\*********************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebSocketFactory: () => (/* binding */ WebSocketFactory),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**\n * Utilities for creating WebSocket instances across runtimes.\n */ class WebSocketFactory {\n /**\n * Static-only utility – prevent instantiation.\n */ constructor(){}\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 global !== \"undefined\" && typeof global.WebSocket !== \"undefined\") {\n return {\n type: \"native\",\n constructor: global.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 ${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 ${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: ${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/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WebSocketFactory); //# sourceMappingURL=websocket-factory.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi93ZWJzb2NrZXQtZmFjdG9yeS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBOztDQUVDLEdBQ00sTUFBTUE7SUFDVDs7S0FFQyxHQUNEQyxhQUFjLENBQUU7SUFDaEIsT0FBT0Msb0JBQW9CO1FBQ3ZCLElBQUlDO1FBQ0osSUFBSSxPQUFPQyxjQUFjLGFBQWE7WUFDbEMsT0FBTztnQkFBRUMsTUFBTTtnQkFBVUosYUFBYUc7WUFBVTtRQUNwRDtRQUNBLElBQUksT0FBT0UsZUFBZSxlQUFlLE9BQU9BLFdBQVdGLFNBQVMsS0FBSyxhQUFhO1lBQ2xGLE9BQU87Z0JBQUVDLE1BQU07Z0JBQVVKLGFBQWFLLFdBQVdGLFNBQVM7WUFBQztRQUMvRDtRQUNBLElBQUksT0FBT0csV0FBVyxlQUFlLE9BQU9BLE9BQU9ILFNBQVMsS0FBSyxhQUFhO1lBQzFFLE9BQU87Z0JBQUVDLE1BQU07Z0JBQVVKLGFBQWFNLE9BQU9ILFNBQVM7WUFBQztRQUMzRDtRQUNBLElBQUksT0FBT0UsZUFBZSxlQUN0QixPQUFPQSxXQUFXRSxhQUFhLEtBQUssZUFDcEMsT0FBT0YsV0FBV0YsU0FBUyxLQUFLLGFBQWE7WUFDN0MsT0FBTztnQkFDSEMsTUFBTTtnQkFDTkksT0FBTztnQkFDUEMsWUFBWTtZQUNoQjtRQUNKO1FBQ0EsSUFBSSxPQUFRSixlQUFlLGVBQWVBLFdBQVdLLFdBQVcsSUFDM0QsT0FBT0MsY0FBYyxlQUFnQixFQUFDVCxLQUFLUyxVQUFVQyxTQUFTLE1BQU0sUUFBUVYsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHVyxRQUFRLENBQUMsY0FBYSxHQUFLO1lBQ3BJLE9BQU87Z0JBQ0hULE1BQU07Z0JBQ05JLE9BQU87Z0JBQ1BDLFlBQVk7WUFDaEI7UUFDSjtRQUNBLElBQUksT0FBT0ssWUFBWSxhQUFhO1lBQ2hDLHFGQUFxRjtZQUNyRixNQUFNQyxrQkFBa0JELE9BQU8sQ0FBQyxXQUFXO1lBQzNDLElBQUlDLG1CQUFtQkEsZUFBZSxDQUFDLE9BQU8sRUFBRTtnQkFDNUMsMkRBQTJEO2dCQUMzRCxNQUFNQyxnQkFBZ0JELGVBQWUsQ0FBQyxPQUFPO2dCQUM3QyxNQUFNRSxjQUFjQyxTQUFTRixjQUFjRyxPQUFPLENBQUMsTUFBTSxJQUFJQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFFLDJDQUEyQztnQkFDM0MsSUFBSUgsZUFBZSxJQUFJO29CQUNuQixvRUFBb0U7b0JBQ3BFLElBQUksT0FBT1osV0FBV0YsU0FBUyxLQUFLLGFBQWE7d0JBQzdDLE9BQU87NEJBQUVDLE1BQU07NEJBQVVKLGFBQWFLLFdBQVdGLFNBQVM7d0JBQUM7b0JBQy9EO29CQUNBLDZDQUE2QztvQkFDN0MsT0FBTzt3QkFDSEMsTUFBTTt3QkFDTkksT0FBTyxDQUFDLFFBQVEsRUFBRVMsWUFBWSx5Q0FBeUMsQ0FBQzt3QkFDeEVSLFlBQVk7b0JBQ2hCO2dCQUNKO2dCQUNBLDZDQUE2QztnQkFDN0MsT0FBTztvQkFDSEwsTUFBTTtvQkFDTkksT0FBTyxDQUFDLFFBQVEsRUFBRVMsWUFBWSwyQ0FBMkMsQ0FBQztvQkFDMUVSLFlBQVksc0ZBQ1IsMEJBQ0E7Z0JBQ1I7WUFDSjtRQUNKO1FBQ0EsT0FBTztZQUNITCxNQUFNO1lBQ05JLE9BQU87WUFDUEMsWUFBWTtRQUNoQjtJQUNKO0lBQ0E7Ozs7Ozs7O0tBUUMsR0FDRCxPQUFPWSwwQkFBMEI7UUFDN0IsTUFBTUMsTUFBTSxJQUFJLENBQUNyQixpQkFBaUI7UUFDbEMsSUFBSXFCLElBQUl0QixXQUFXLEVBQUU7WUFDakIsT0FBT3NCLElBQUl0QixXQUFXO1FBQzFCO1FBQ0EsSUFBSXVCLGVBQWVELElBQUlkLEtBQUssSUFBSTtRQUNoQyxJQUFJYyxJQUFJYixVQUFVLEVBQUU7WUFDaEJjLGdCQUFnQixDQUFDLHdCQUF3QixFQUFFRCxJQUFJYixVQUFVLENBQUMsQ0FBQztRQUMvRDtRQUNBLE1BQU0sSUFBSWUsTUFBTUQ7SUFDcEI7SUFDQTs7Ozs7OztLQU9DLEdBQ0QsT0FBT0UsZ0JBQWdCQyxHQUFHLEVBQUVDLFNBQVMsRUFBRTtRQUNuQyxNQUFNQyxLQUFLLElBQUksQ0FBQ1AsdUJBQXVCO1FBQ3ZDLE9BQU8sSUFBSU8sR0FBR0YsS0FBS0M7SUFDdkI7SUFDQTs7Ozs7Ozs7O0tBU0MsR0FDRCxPQUFPRSx1QkFBdUI7UUFDMUIsSUFBSTtZQUNBLE1BQU1QLE1BQU0sSUFBSSxDQUFDckIsaUJBQWlCO1lBQ2xDLE9BQU9xQixJQUFJbEIsSUFBSSxLQUFLLFlBQVlrQixJQUFJbEIsSUFBSSxLQUFLO1FBQ2pELEVBQ0EsT0FBT0YsSUFBSTtZQUNQLE9BQU87UUFDWDtJQUNKO0FBQ0o7QUFDQSxpRUFBZUgsZ0JBQWdCQSxFQUFDLENBQ2hDLDZDQUE2QyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3dlYnNvY2tldC1mYWN0b3J5LmpzP2E1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlsaXRpZXMgZm9yIGNyZWF0aW5nIFdlYlNvY2tldCBpbnN0YW5jZXMgYWNyb3NzIHJ1bnRpbWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0RmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICogU3RhdGljLW9ubHkgdXRpbGl0eSDigJMgcHJldmVudCBpbnN0YW50aWF0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgc3RhdGljIGRldGVjdEVudmlyb25tZW50KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0eXBlb2YgV2ViU29ja2V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ25hdGl2ZScsIGNvbnN0cnVjdG9yOiBXZWJTb2NrZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWxUaGlzLldlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICduYXRpdmUnLCBjb25zdHJ1Y3RvcjogZ2xvYmFsVGhpcy5XZWJTb2NrZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGdsb2JhbC5XZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnbmF0aXZlJywgY29uc3RydWN0b3I6IGdsb2JhbC5XZWJTb2NrZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgZ2xvYmFsVGhpcy5XZWJTb2NrZXRQYWlyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIGdsb2JhbFRoaXMuV2ViU29ja2V0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2xvdWRmbGFyZScsXG4gICAgICAgICAgICAgICAgZXJyb3I6ICdDbG91ZGZsYXJlIFdvcmtlcnMgZGV0ZWN0ZWQuIFdlYlNvY2tldCBjbGllbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIENsb3VkZmxhcmUgV29ya2Vycy4nLFxuICAgICAgICAgICAgICAgIHdvcmthcm91bmQ6ICdVc2UgQ2xvdWRmbGFyZSBXb3JrZXJzIFdlYlNvY2tldCBBUEkgZm9yIHNlcnZlci1zaWRlIFdlYlNvY2tldCBoYW5kbGluZywgb3IgZGVwbG95IHRvIGEgZGlmZmVyZW50IHJ1bnRpbWUuJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcy5FZGdlUnVudGltZSkgfHxcbiAgICAgICAgICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAoKF9hID0gbmF2aWdhdG9yLnVzZXJBZ2VudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmluY2x1ZGVzKCdWZXJjZWwtRWRnZScpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3Vuc3VwcG9ydGVkJyxcbiAgICAgICAgICAgICAgICBlcnJvcjogJ0VkZ2UgcnVudGltZSBkZXRlY3RlZCAoVmVyY2VsIEVkZ2UvTmV0bGlmeSBFZGdlKS4gV2ViU29ja2V0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiBlZGdlIGZ1bmN0aW9ucy4nLFxuICAgICAgICAgICAgICAgIHdvcmthcm91bmQ6ICdVc2Ugc2VydmVybGVzcyBmdW5jdGlvbnMgb3IgYSBkaWZmZXJlbnQgZGVwbG95bWVudCB0YXJnZXQgZm9yIFdlYlNvY2tldCBmdW5jdGlvbmFsaXR5LicsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFVzZSBkeW5hbWljIHByb3BlcnR5IGFjY2VzcyB0byBhdm9pZCBOZXh0LmpzIEVkZ2UgUnVudGltZSBzdGF0aWMgYW5hbHlzaXMgd2FybmluZ3NcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NWZXJzaW9ucyA9IHByb2Nlc3NbJ3ZlcnNpb25zJ107XG4gICAgICAgICAgICBpZiAocHJvY2Vzc1ZlcnNpb25zICYmIHByb2Nlc3NWZXJzaW9uc1snbm9kZSddKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlICd2JyBwcmVmaXggaWYgcHJlc2VudCBhbmQgcGFyc2UgdGhlIG1ham9yIHZlcnNpb25cbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uU3RyaW5nID0gcHJvY2Vzc1ZlcnNpb25zWydub2RlJ107XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZVZlcnNpb24gPSBwYXJzZUludCh2ZXJzaW9uU3RyaW5nLnJlcGxhY2UoL152LywgJycpLnNwbGl0KCcuJylbMF0pO1xuICAgICAgICAgICAgICAgIC8vIE5vZGUuanMgMjIrIHNob3VsZCBoYXZlIG5hdGl2ZSBXZWJTb2NrZXRcbiAgICAgICAgICAgICAgICBpZiAobm9kZVZlcnNpb24gPj0gMjIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbmF0aXZlIFdlYlNvY2tldCBpcyBhdmFpbGFibGUgKHNob3VsZCBiZSBpbiBOb2RlLmpzIDIyKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLldlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICduYXRpdmUnLCBjb25zdHJ1Y3RvcjogZ2xvYmFsVGhpcy5XZWJTb2NrZXQgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QgYXZhaWxhYmxlLCB1c2VyIG5lZWRzIHRvIHByb3ZpZGUgaXRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd1bnN1cHBvcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYE5vZGUuanMgJHtub2RlVmVyc2lvbn0gZGV0ZWN0ZWQgYnV0IG5hdGl2ZSBXZWJTb2NrZXQgbm90IGZvdW5kLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrYXJvdW5kOiAnUHJvdmlkZSBhIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbiB2aWEgdGhlIHRyYW5zcG9ydCBvcHRpb24uJyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTm9kZS5qcyA8IDIyIGRvZXNuJ3QgaGF2ZSBuYXRpdmUgV2ViU29ja2V0XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3Vuc3VwcG9ydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGBOb2RlLmpzICR7bm9kZVZlcnNpb259IGRldGVjdGVkIHdpdGhvdXQgbmF0aXZlIFdlYlNvY2tldCBzdXBwb3J0LmAsXG4gICAgICAgICAgICAgICAgICAgIHdvcmthcm91bmQ6ICdGb3IgTm9kZS5qcyA8IDIyLCBpbnN0YWxsIFwid3NcIiBwYWNrYWdlIGFuZCBwcm92aWRlIGl0IHZpYSB0aGUgdHJhbnNwb3J0IG9wdGlvbjpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgd3MgZnJvbSBcIndzXCJcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICduZXcgUmVhbHRpbWVDbGllbnQodXJsLCB7IHRyYW5zcG9ydDogd3MgfSknLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICd1bnN1cHBvcnRlZCcsXG4gICAgICAgICAgICBlcnJvcjogJ1Vua25vd24gSmF2YVNjcmlwdCBydW50aW1lIHdpdGhvdXQgV2ViU29ja2V0IHN1cHBvcnQuJyxcbiAgICAgICAgICAgIHdvcmthcm91bmQ6IFwiRW5zdXJlIHlvdSdyZSBydW5uaW5nIGluIGEgc3VwcG9ydGVkIGVudmlyb25tZW50IChicm93c2VyLCBOb2RlLmpzLCBEZW5vKSBvciBwcm92aWRlIGEgY3VzdG9tIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbi5cIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYmVzdCBhdmFpbGFibGUgV2ViU29ja2V0IGNvbnN0cnVjdG9yIGZvciB0aGUgY3VycmVudCBydW50aW1lLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IFdTID0gV2ViU29ja2V0RmFjdG9yeS5nZXRXZWJTb2NrZXRDb25zdHJ1Y3RvcigpXG4gICAgICogY29uc3Qgc29ja2V0ID0gbmV3IFdTKCd3c3M6Ly9yZWFsdGltZS5zdXBhYmFzZS5jby9zb2NrZXQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXZWJTb2NrZXRDb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgZW52ID0gdGhpcy5kZXRlY3RFbnZpcm9ubWVudCgpO1xuICAgICAgICBpZiAoZW52LmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZW52LmNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlbnYuZXJyb3IgfHwgJ1dlYlNvY2tldCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQuJztcbiAgICAgICAgaWYgKGVudi53b3JrYXJvdW5kKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcblxcblN1Z2dlc3RlZCBzb2x1dGlvbjogJHtlbnYud29ya2Fyb3VuZH1gO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgV2ViU29ja2V0IHVzaW5nIHRoZSBkZXRlY3RlZCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBXZWJTb2NrZXRGYWN0b3J5LmNyZWF0ZVdlYlNvY2tldCgnd3NzOi8vcmVhbHRpbWUuc3VwYWJhc2UuY28vc29ja2V0JylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlV2ViU29ja2V0KHVybCwgcHJvdG9jb2xzKSB7XG4gICAgICAgIGNvbnN0IFdTID0gdGhpcy5nZXRXZWJTb2NrZXRDb25zdHJ1Y3RvcigpO1xuICAgICAgICByZXR1cm4gbmV3IFdTKHVybCwgcHJvdG9jb2xzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZWN0cyB3aGV0aGVyIHRoZSBydW50aW1lIGNhbiBlc3RhYmxpc2ggV2ViU29ja2V0IGNvbm5lY3Rpb25zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGlmICghV2ViU29ja2V0RmFjdG9yeS5pc1dlYlNvY2tldFN1cHBvcnRlZCgpKSB7XG4gICAgICogICBjb25zb2xlLndhcm4oJ0ZhbGxpbmcgYmFjayB0byBsb25nIHBvbGxpbmcnKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNXZWJTb2NrZXRTdXBwb3J0ZWQoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbnYgPSB0aGlzLmRldGVjdEVudmlyb25tZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gZW52LnR5cGUgPT09ICduYXRpdmUnIHx8IGVudi50eXBlID09PSAnd3MnO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgV2ViU29ja2V0RmFjdG9yeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYnNvY2tldC1mYWN0b3J5LmpzLm1hcCJdLCJuYW1lcyI6WyJXZWJTb2NrZXRGYWN0b3J5IiwiY29uc3RydWN0b3IiLCJkZXRlY3RFbnZpcm9ubWVudCIsIl9hIiwiV2ViU29ja2V0IiwidHlwZSIsImdsb2JhbFRoaXMiLCJnbG9iYWwiLCJXZWJTb2NrZXRQYWlyIiwiZXJyb3IiLCJ3b3JrYXJvdW5kIiwiRWRnZVJ1bnRpbWUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJpbmNsdWRlcyIsInByb2Nlc3MiLCJwcm9jZXNzVmVyc2lvbnMiLCJ2ZXJzaW9uU3RyaW5nIiwibm9kZVZlcnNpb24iLCJwYXJzZUludCIsInJlcGxhY2UiLCJzcGxpdCIsImdldFdlYlNvY2tldENvbnN0cnVjdG9yIiwiZW52IiwiZXJyb3JNZXNzYWdlIiwiRXJyb3IiLCJjcmVhdGVXZWJTb2NrZXQiLCJ1cmwiLCJwcm90b2NvbHMiLCJXUyIsImlzV2ViU29ja2V0U3VwcG9ydGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-helpers-nextjs/dist/index.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-helpers-nextjs/dist/index.js ***!
|
||
\******************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all)=>{\n for(var name in all)__defProp(target, name, {\n get: all[name],\n enumerable: true\n });\n};\nvar __copyProps = (to, from, except, desc)=>{\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n get: ()=>from[key],\n enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n });\n }\n return to;\n};\nvar __toCommonJS = (mod)=>__copyProps(__defProp({}, \"__esModule\", {\n value: true\n }), mod);\n// src/index.ts\nvar src_exports = {};\n__export(src_exports, {\n createBrowserSupabaseClient: ()=>createBrowserSupabaseClient,\n createClientComponentClient: ()=>createClientComponentClient,\n createMiddlewareClient: ()=>createMiddlewareClient,\n createMiddlewareSupabaseClient: ()=>createMiddlewareSupabaseClient,\n createPagesBrowserClient: ()=>createPagesBrowserClient,\n createPagesServerClient: ()=>createPagesServerClient,\n createRouteHandlerClient: ()=>createRouteHandlerClient,\n createServerActionClient: ()=>createServerActionClient,\n createServerComponentClient: ()=>createServerComponentClient,\n createServerSupabaseClient: ()=>createServerSupabaseClient\n});\nmodule.exports = __toCommonJS(src_exports);\n// src/clientComponentClient.ts\nvar import_auth_helpers_shared = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(action-browser)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar supabase;\nfunction createClientComponentClient({ supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions, isSingleton = true } = {}) {\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n const createNewClient = ()=>{\n var _a;\n return (0, import_auth_helpers_shared.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new import_auth_helpers_shared.BrowserCookieAuthStorageAdapter(cookieOptions)\n }\n });\n };\n if (isSingleton) {\n const _supabase = supabase ?? createNewClient();\n if (true) return _supabase;\n if (!supabase) supabase = _supabase;\n return supabase;\n }\n return createNewClient();\n}\n// src/pagesBrowserClient.ts\nvar createPagesBrowserClient = createClientComponentClient;\n// src/pagesServerClient.ts\nvar import_auth_helpers_shared2 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(action-browser)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar import_set_cookie_parser = __webpack_require__(/*! set-cookie-parser */ \"(action-browser)/./node_modules/set-cookie-parser/lib/set-cookie.js\");\nvar NextServerAuthStorageAdapter = class extends import_auth_helpers_shared2.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n }\n getCookie(name) {\n var _a, _b, _c;\n const setCookie = (0, import_set_cookie_parser.splitCookiesString)(((_b = (_a = this.context.res) == null ? void 0 : _a.getHeader(\"set-cookie\")) == null ? void 0 : _b.toString()) ?? \"\").map((c)=>(0, import_auth_helpers_shared2.parseCookies)(c)[name]).find((c)=>!!c);\n const value = setCookie ?? ((_c = this.context.req) == null ? void 0 : _c.cookies[name]);\n return value;\n }\n setCookie(name, value) {\n this._setCookie(name, value);\n }\n deleteCookie(name) {\n this._setCookie(name, \"\", {\n maxAge: 0\n });\n }\n _setCookie(name, value, options) {\n var _a;\n const setCookies = (0, import_set_cookie_parser.splitCookiesString)(((_a = this.context.res.getHeader(\"set-cookie\")) == null ? void 0 : _a.toString()) ?? \"\").filter((c)=>!(name in (0, import_auth_helpers_shared2.parseCookies)(c)));\n const cookieStr = (0, import_auth_helpers_shared2.serializeCookie)(name, value, {\n ...this.cookieOptions,\n ...options,\n // Allow supabase-js on the client to read the cookie as well\n httpOnly: false\n });\n this.context.res.setHeader(\"set-cookie\", [\n ...setCookies,\n cookieStr\n ]);\n }\n};\nfunction createPagesServerClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared2.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextServerAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/middlewareClient.ts\nvar import_auth_helpers_shared3 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(action-browser)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar import_set_cookie_parser2 = __webpack_require__(/*! set-cookie-parser */ \"(action-browser)/./node_modules/set-cookie-parser/lib/set-cookie.js\");\nvar NextMiddlewareAuthStorageAdapter = class extends import_auth_helpers_shared3.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n }\n getCookie(name) {\n var _a;\n const setCookie = (0, import_set_cookie_parser2.splitCookiesString)(((_a = this.context.res.headers.get(\"set-cookie\")) == null ? void 0 : _a.toString()) ?? \"\").map((c)=>(0, import_auth_helpers_shared3.parseCookies)(c)[name]).find((c)=>!!c);\n if (setCookie) {\n return setCookie;\n }\n const cookies = (0, import_auth_helpers_shared3.parseCookies)(this.context.req.headers.get(\"cookie\") ?? \"\");\n return cookies[name];\n }\n setCookie(name, value) {\n this._setCookie(name, value);\n }\n deleteCookie(name) {\n this._setCookie(name, \"\", {\n maxAge: 0\n });\n }\n _setCookie(name, value, options) {\n const newSessionStr = (0, import_auth_helpers_shared3.serializeCookie)(name, value, {\n ...this.cookieOptions,\n ...options,\n // Allow supabase-js on the client to read the cookie as well\n httpOnly: false\n });\n if (this.context.res.headers) {\n this.context.res.headers.append(\"set-cookie\", newSessionStr);\n }\n }\n};\nfunction createMiddlewareClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared3.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextMiddlewareAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/serverComponentClient.ts\nvar import_auth_helpers_shared4 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(action-browser)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar NextServerComponentAuthStorageAdapter = class extends import_auth_helpers_shared4.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n this.isServer = true;\n }\n getCookie(name) {\n var _a;\n const nextCookies = this.context.cookies();\n return (_a = nextCookies.get(name)) == null ? void 0 : _a.value;\n }\n setCookie(name, value) {}\n deleteCookie(name) {}\n};\nfunction createServerComponentClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared4.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextServerComponentAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/routeHandlerClient.ts\nvar import_auth_helpers_shared5 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(action-browser)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar NextRouteHandlerAuthStorageAdapter = class extends import_auth_helpers_shared5.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n }\n getCookie(name) {\n var _a;\n const nextCookies = this.context.cookies();\n return (_a = nextCookies.get(name)) == null ? void 0 : _a.value;\n }\n setCookie(name, value) {\n const nextCookies = this.context.cookies();\n nextCookies.set(name, value, this.cookieOptions);\n }\n deleteCookie(name) {\n const nextCookies = this.context.cookies();\n nextCookies.set(name, \"\", {\n ...this.cookieOptions,\n maxAge: 0\n });\n }\n};\nfunction createRouteHandlerClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared5.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextRouteHandlerAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/serverActionClient.ts\nvar createServerActionClient = createRouteHandlerClient;\n// src/deprecated.ts\nfunction createBrowserSupabaseClient({ supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n console.warn(\"Please utilize the `createPagesBrowserClient` function instead of the deprecated `createBrowserSupabaseClient` function. Learn more: https://supabase.com/docs/guides/auth/auth-helpers/nextjs-pages\");\n return createPagesBrowserClient({\n supabaseUrl,\n supabaseKey,\n options,\n cookieOptions\n });\n}\nfunction createServerSupabaseClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n console.warn(\"Please utilize the `createPagesServerClient` function instead of the deprecated `createServerSupabaseClient` function. Learn more: https://supabase.com/docs/guides/auth/auth-helpers/nextjs-pages\");\n return createPagesServerClient(context, {\n supabaseUrl,\n supabaseKey,\n options,\n cookieOptions\n });\n}\nfunction createMiddlewareSupabaseClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n console.warn(\"Please utilize the `createMiddlewareClient` function instead of the deprecated `createMiddlewareSupabaseClient` function. Learn more: https://supabase.com/docs/guides/auth/auth-helpers/nextjs#middleware\");\n return createMiddlewareClient(context, {\n supabaseUrl,\n supabaseKey,\n options,\n cookieOptions\n });\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (0); //# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1oZWxwZXJzLW5leHRqcy9kaXN0L2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsSUFBSUEsWUFBWUMsT0FBT0MsY0FBYztBQUNyQyxJQUFJQyxtQkFBbUJGLE9BQU9HLHdCQUF3QjtBQUN0RCxJQUFJQyxvQkFBb0JKLE9BQU9LLG1CQUFtQjtBQUNsRCxJQUFJQyxlQUFlTixPQUFPTyxTQUFTLENBQUNDLGNBQWM7QUFDbEQsSUFBSUMsV0FBVyxDQUFDQyxRQUFRQztJQUN0QixJQUFLLElBQUlDLFFBQVFELElBQ2ZaLFVBQVVXLFFBQVFFLE1BQU07UUFBRUMsS0FBS0YsR0FBRyxDQUFDQyxLQUFLO1FBQUVFLFlBQVk7SUFBSztBQUMvRDtBQUNBLElBQUlDLGNBQWMsQ0FBQ0MsSUFBSUMsTUFBTUMsUUFBUUM7SUFDbkMsSUFBSUYsUUFBUSxPQUFPQSxTQUFTLFlBQVksT0FBT0EsU0FBUyxZQUFZO1FBQ2xFLEtBQUssSUFBSUcsT0FBT2hCLGtCQUFrQmEsTUFDaEMsSUFBSSxDQUFDWCxhQUFhZSxJQUFJLENBQUNMLElBQUlJLFFBQVFBLFFBQVFGLFFBQ3pDbkIsVUFBVWlCLElBQUlJLEtBQUs7WUFBRVAsS0FBSyxJQUFNSSxJQUFJLENBQUNHLElBQUk7WUFBRU4sWUFBWSxDQUFFSyxDQUFBQSxPQUFPakIsaUJBQWlCZSxNQUFNRyxJQUFHLEtBQU1ELEtBQUtMLFVBQVU7UUFBQztJQUN0SDtJQUNBLE9BQU9FO0FBQ1Q7QUFDQSxJQUFJTSxlQUFlLENBQUNDLE1BQVFSLFlBQVloQixVQUFVLENBQUMsR0FBRyxjQUFjO1FBQUV5QixPQUFPO0lBQUssSUFBSUQ7QUFFdEYsZUFBZTtBQUNmLElBQUlFLGNBQWMsQ0FBQztBQUNuQmhCLFNBQVNnQixhQUFhO0lBQ3BCQyw2QkFBNkIsSUFBTUE7SUFDbkNDLDZCQUE2QixJQUFNQTtJQUNuQ0Msd0JBQXdCLElBQU1BO0lBQzlCQyxnQ0FB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LFNBQVNuQiwrQkFBK0JvQyxPQUFPLEVBQUUsRUFDL0N4QixjQUFjQywwQkFBb0MsRUFDbERHLGNBQWNILDJLQUF5QyxFQUN2REssT0FBTyxFQUNQQyxhQUFhLEVBQ2QsR0FBRyxDQUFDLENBQUM7SUFDSnFELFFBQVFDLElBQUksQ0FDVjtJQUVGLE9BQU8xRSx1QkFBdUJxQyxTQUFTO1FBQ3JDeEI7UUFDQUk7UUFDQUU7UUFDQUM7SUFDRjtBQUNGO0FBQ0EsNkRBQTZEO0FBQzdELEtBQU1aLENBQUFBLENBV04sR0FDQSxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtaGVscGVycy1uZXh0anMvZGlzdC9pbmRleC5qcz9jZjkzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2dldE93blByb3BEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBfX2dldE93blByb3BOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHtcbiAgZm9yICh2YXIgbmFtZSBpbiBhbGwpXG4gICAgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwgeyBnZXQ6IGFsbFtuYW1lXSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbn07XG52YXIgX19jb3B5UHJvcHMgPSAodG8sIGZyb20sIGV4Y2VwdCwgZGVzYykgPT4ge1xuICBpZiAoZnJvbSAmJiB0eXBlb2YgZnJvbSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZnJvbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIF9fZ2V0T3duUHJvcE5hbWVzKGZyb20pKVxuICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5KSAmJiBrZXkgIT09IGV4Y2VwdClcbiAgICAgICAgX19kZWZQcm9wKHRvLCBrZXksIHsgZ2V0OiAoKSA9PiBmcm9tW2tleV0sIGVudW1lcmFibGU6ICEoZGVzYyA9IF9fZ2V0T3duUHJvcERlc2MoZnJvbSwga2V5KSkgfHwgZGVzYy5lbnVtZXJhYmxlIH0pO1xuICB9XG4gIHJldHVybiB0bztcbn07XG52YXIgX190b0NvbW1vbkpTID0gKG1vZCkgPT4gX19jb3B5UHJvcHMoX19kZWZQcm9wKHt9LCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KSwgbW9kKTtcblxuLy8gc3JjL2luZGV4LnRzXG52YXIgc3JjX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KHNyY19leHBvcnRzLCB7XG4gIGNyZWF0ZUJyb3dzZXJTdXBhYmFzZUNsaWVudDogKCkgPT4gY3JlYXRlQnJvd3NlclN1cGFiYXNlQ2xpZW50LFxuICBjcmVhdGVDbGllbnRDb21wb25lbnRDbGllbnQ6ICgpID0+IGNyZWF0ZUNsaWVudENvbXBvbmVudENsaWVudCxcbiAgY3JlYXRlTWlkZGxld2FyZUNsaWVudDogKCkgPT4gY3JlYXRlTWlkZGxld2FyZUNsaWVudCxcbiAgY3JlYXRlTWlkZGxld2FyZVN1cGFiYXNlQ2xpZW50OiAoKSA9PiBjcmVhdGVNaWRkbGV3YXJlU3VwYWJhc2VDbGllbnQsXG4gIGNyZWF0ZVBhZ2VzQnJvd3NlckNsaWVudDogKCkgPT4gY3JlYXRlUGFnZXNCcm93c2VyQ2xpZW50LFxuICBjcmVhdGVQYWdlc1NlcnZlckNsaWVudDogKCkgPT4gY3JlYXRlUGFnZXNTZXJ2ZXJDbGllbnQsXG4gIGNyZWF0ZVJvdXRlSGFuZGxlckNsaWVudDogKCkgPT4gY3JlYXRlUm91dGVIYW5kbGVyQ2xpZW50LFxuICBjcmVhdGVTZXJ2ZXJBY3Rpb25DbGllbnQ6ICgpID0+IGNyZWF0ZVNlcnZlckFjdGlvbkNsaWVudCxcbiAgY3JlYXRlU2VydmVyQ29tcG9uZW50Q2xpZW50OiAoKSA9PiBjcmVhdGVTZXJ2ZXJDb21wb25lbnRDbGllbnQsXG4gIGNyZWF0ZVNlcnZlclN1cGFiYXNlQ2xpZW50OiAoKSA9PiBjcmVhdGVTZXJ2ZXJTdXBhYmFzZUNsaWVudFxufSk7XG5tb2R1bGUuZXhwb3J0cyA9IF9fdG9Db21tb25KUyhzcmNfZXhwb3J0cyk7XG5cbi8vIHNyYy9jbGllbnRDb21wb25lbnRDbGllbnQudHNcbnZhciBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZCA9IHJlcXVpcmUoXCJAc3VwYWJhc2UvYXV0aC1oZWxwZXJzLXNoYXJlZFwiKTtcbnZhciBzdXBhYmFzZTtcbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudENvbXBvbmVudENsaWVudCh7XG4gIHN1cGFiYXNlVXJsID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMLFxuICBzdXBhYmFzZUtleSA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZLFxuICBvcHRpb25zLFxuICBjb29raWVPcHRpb25zLFxuICBpc1NpbmdsZXRvbiA9IHRydWVcbn0gPSB7fSkge1xuICBpZiAoIXN1cGFiYXNlVXJsIHx8ICFzdXBhYmFzZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiZWl0aGVyIE5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCBhbmQgTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVkgZW52IHZhcmlhYmxlcyBvciBzdXBhYmFzZVVybCBhbmQgc3VwYWJhc2VLZXkgYXJlIHJlcXVpcmVkIVwiXG4gICAgKTtcbiAgfVxuICBjb25zdCBjcmVhdGVOZXdDbGllbnQgPSAoKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoMCwgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQuY3JlYXRlU3VwYWJhc2VDbGllbnQpKHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGdsb2JhbDoge1xuICAgICAgICAuLi5vcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdsb2JhbCxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIC4uLihfYSA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2xvYmFsKSA9PSBudWxsID8gdm9pZCAwIDogX2EuaGVhZGVycyxcbiAgICAgICAgICBcIlgtQ2xpZW50LUluZm9cIjogYCR7XCJAc3VwYWJhc2UvYXV0aC1oZWxwZXJzLW5leHRqc1wifUAke1wiMC4xMC4wXCJ9YFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXV0aDoge1xuICAgICAgICBzdG9yYWdlOiBuZXcgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQuQnJvd3NlckNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlcihjb29raWVPcHRpb25zKVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBpZiAoaXNTaW5nbGV0b24pIHtcbiAgICBjb25zdCBfc3VwYWJhc2UgPSBzdXBhYmFzZSA/PyBjcmVhdGVOZXdDbGllbnQoKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHJldHVybiBfc3VwYWJhc2U7XG4gICAgaWYgKCFzdXBhYmFzZSlcbiAgICAgIHN1cGFiYXNlID0gX3N1cGFiYXNlO1xuICAgIHJldHVybiBzdXBhYmFzZTtcbiAgfVxuICByZXR1cm4gY3JlYXRlTmV3Q2xpZW50KCk7XG59XG5cbi8vIHNyYy9wYWdlc0Jyb3dzZXJDbGllbnQudHNcbnZhciBjcmVhdGVQYWdlc0Jyb3dzZXJDbGllbnQgPSBjcmVhdGVDbGllbnRDb21wb25lbnRDbGllbnQ7XG5cbi8vIHNyYy9wYWdlc1NlcnZlckNsaWVudC50c1xudmFyIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMiA9IHJlcXVpcmUoXCJAc3VwYWJhc2UvYXV0aC1oZWxwZXJzLXNoYXJlZFwiKTtcbnZhciBpbXBvcnRfc2V0X2Nvb2tpZV9wYXJzZXIgPSByZXF1aXJlKFwic2V0LWNvb2tpZS1wYXJzZXJcIik7XG52YXIgTmV4dFNlcnZlckF1dGhTdG9yYWdlQWRhcHRlciA9IGNsYXNzIGV4dGVuZHMgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQyLkNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIGNvb2tpZU9wdGlvbnMpIHtcbiAgICBzdXBlcihjb29raWVPcHRpb25zKTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB9XG4gIGdldENvb2tpZShuYW1lKSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgY29uc3Qgc2V0Q29va2llID0gKDAsIGltcG9ydF9zZXRfY29va2llX3BhcnNlci5zcGxpdENvb2tpZXNTdHJpbmcpKFxuICAgICAgKChfYiA9IChfYSA9IHRoaXMuY29udGV4dC5yZXMpID09IG51bGwgPyB2b2lkIDAgOiBfYS5nZXRIZWFkZXIoXCJzZXQtY29va2llXCIpKSA9PSBudWxsID8gdm9pZCAwIDogX2IudG9TdHJpbmcoKSkgPz8gXCJcIlxuICAgICkubWFwKChjKSA9PiAoMCwgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQyLnBhcnNlQ29va2llcykoYylbbmFtZV0pLmZpbmQoKGMpID0+ICEhYyk7XG4gICAgY29uc3QgdmFsdWUgPSBzZXRDb29raWUgPz8gKChfYyA9IHRoaXMuY29udGV4dC5yZXEpID09IG51bGwgPyB2b2lkIDAgOiBfYy5jb29raWVzW25hbWVdKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlKSB7XG4gICAgdGhpcy5fc2V0Q29va2llKG5hbWUsIHZhbHVlKTtcbiAgfVxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIHRoaXMuX3NldENvb2tpZShuYW1lLCBcIlwiLCB7XG4gICAgICBtYXhBZ2U6IDBcbiAgICB9KTtcbiAgfVxuICBfc2V0Q29va2llKG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHNldENvb2tpZXMgPSAoMCwgaW1wb3J0X3NldF9jb29raWVfcGFyc2VyLnNwbGl0Q29va2llc1N0cmluZykoXG4gICAgICAoKF9hID0gdGhpcy5jb250ZXh0LnJlcy5nZXRIZWFkZXIoXCJzZXQtY29va2llXCIpKSA9PSBudWxsID8gdm9pZCAwIDogX2EudG9TdHJpbmcoKSkgPz8gXCJcIlxuICAgICkuZmlsdGVyKChjKSA9PiAhKG5hbWUgaW4gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMi5wYXJzZUNvb2tpZXMpKGMpKSk7XG4gICAgY29uc3QgY29va2llU3RyID0gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMi5zZXJpYWxpemVDb29raWUpKG5hbWUsIHZhbHVlLCB7XG4gICAgICAuLi50aGlzLmNvb2tpZU9wdGlvbnMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgLy8gQWxsb3cgc3VwYWJhc2UtanMgb24gdGhlIGNsaWVudCB0byByZWFkIHRoZSBjb29raWUgYXMgd2VsbFxuICAgICAgaHR0cE9ubHk6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5jb250ZXh0LnJlcy5zZXRIZWFkZXIoXCJzZXQtY29va2llXCIsIFsuLi5zZXRDb29raWVzLCBjb29raWVTdHJdKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZVBhZ2VzU2VydmVyQ2xpZW50KGNvbnRleHQsIHtcbiAgc3VwYWJhc2VVcmwgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwsXG4gIHN1cGFiYXNlS2V5ID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVksXG4gIG9wdGlvbnMsXG4gIGNvb2tpZU9wdGlvbnNcbn0gPSB7fSkge1xuICB2YXIgX2E7XG4gIGlmICghc3VwYWJhc2VVcmwgfHwgIXN1cGFiYXNlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJlaXRoZXIgTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMIGFuZCBORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSBlbnYgdmFyaWFibGVzIG9yIHN1cGFiYXNlVXJsIGFuZCBzdXBhYmFzZUtleSBhcmUgcmVxdWlyZWQhXCJcbiAgICApO1xuICB9XG4gIHJldHVybiAoMCwgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQyLmNyZWF0ZVN1cGFiYXNlQ2xpZW50KShzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXksIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGdsb2JhbDoge1xuICAgICAgLi4ub3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5nbG9iYWwsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLihfYSA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2xvYmFsKSA9PSBudWxsID8gdm9pZCAwIDogX2EuaGVhZGVycyxcbiAgICAgICAgXCJYLUNsaWVudC1JbmZvXCI6IGAke1wiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1uZXh0anNcIn1AJHtcIjAuMTAuMFwifWBcbiAgICAgIH1cbiAgICB9LFxuICAgIGF1dGg6IHtcbiAgICAgIHN0b3JhZ2U6IG5ldyBOZXh0U2VydmVyQXV0aFN0b3JhZ2VBZGFwdGVyKGNvbnRleHQsIGNvb2tpZU9wdGlvbnMpXG4gICAgfVxuICB9KTtcbn1cblxuLy8gc3JjL21pZGRsZXdhcmVDbGllbnQudHNcbnZhciBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDMgPSByZXF1aXJlKFwiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1zaGFyZWRcIik7XG52YXIgaW1wb3J0X3NldF9jb29raWVfcGFyc2VyMiA9IHJlcXVpcmUoXCJzZXQtY29va2llLXBhcnNlclwiKTtcbnZhciBOZXh0TWlkZGxld2FyZUF1dGhTdG9yYWdlQWRhcHRlciA9IGNsYXNzIGV4dGVuZHMgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQzLkNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIGNvb2tpZU9wdGlvbnMpIHtcbiAgICBzdXBlcihjb29raWVPcHRpb25zKTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB9XG4gIGdldENvb2tpZShuYW1lKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHNldENvb2tpZSA9ICgwLCBpbXBvcnRfc2V0X2Nvb2tpZV9wYXJzZXIyLnNwbGl0Q29va2llc1N0cmluZykoXG4gICAgICAoKF9hID0gdGhpcy5jb250ZXh0LnJlcy5oZWFkZXJzLmdldChcInNldC1jb29raWVcIikpID09IG51bGwgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpKSA/PyBcIlwiXG4gICAgKS5tYXAoKGMpID0+ICgwLCBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDMucGFyc2VDb29raWVzKShjKVtuYW1lXSkuZmluZCgoYykgPT4gISFjKTtcbiAgICBpZiAoc2V0Q29va2llKSB7XG4gICAgICByZXR1cm4gc2V0Q29va2llO1xuICAgIH1cbiAgICBjb25zdCBjb29raWVzID0gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMy5wYXJzZUNvb2tpZXMpKHRoaXMuY29udGV4dC5yZXEuaGVhZGVycy5nZXQoXCJjb29raWVcIikgPz8gXCJcIik7XG4gICAgcmV0dXJuIGNvb2tpZXNbbmFtZV07XG4gIH1cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlKSB7XG4gICAgdGhpcy5fc2V0Q29va2llKG5hbWUsIHZhbHVlKTtcbiAgfVxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIHRoaXMuX3NldENvb2tpZShuYW1lLCBcIlwiLCB7XG4gICAgICBtYXhBZ2U6IDBcbiAgICB9KTtcbiAgfVxuICBfc2V0Q29va2llKG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbmV3U2Vzc2lvblN0ciA9ICgwLCBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDMuc2VyaWFsaXplQ29va2llKShuYW1lLCB2YWx1ZSwge1xuICAgICAgLi4udGhpcy5jb29raWVPcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC8vIEFsbG93IHN1cGFiYXNlLWpzIG9uIHRoZSBjbGllbnQgdG8gcmVhZCB0aGUgY29va2llIGFzIHdlbGxcbiAgICAgIGh0dHBPbmx5OiBmYWxzZVxuICAgIH0pO1xuICAgIGlmICh0aGlzLmNvbnRleHQucmVzLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuY29udGV4dC5yZXMuaGVhZGVycy5hcHBlbmQoXCJzZXQtY29va2llXCIsIG5ld1Nlc3Npb25TdHIpO1xuICAgIH1cbiAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZU1pZGRsZXdhcmVDbGllbnQoY29udGV4dCwge1xuICBzdXBhYmFzZVVybCA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCxcbiAgc3VwYWJhc2VLZXkgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSxcbiAgb3B0aW9ucyxcbiAgY29va2llT3B0aW9uc1xufSA9IHt9KSB7XG4gIHZhciBfYTtcbiAgaWYgKCFzdXBhYmFzZVVybCB8fCAhc3VwYWJhc2VLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImVpdGhlciBORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwgYW5kIE5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZIGVudiB2YXJpYWJsZXMgb3Igc3VwYWJhc2VVcmwgYW5kIHN1cGFiYXNlS2V5IGFyZSByZXF1aXJlZCFcIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuICgwLCBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDMuY3JlYXRlU3VwYWJhc2VDbGllbnQpKHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZ2xvYmFsOiB7XG4gICAgICAuLi5vcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdsb2JhbCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uKF9hID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5nbG9iYWwpID09IG51bGwgPyB2b2lkIDAgOiBfYS5oZWFkZXJzLFxuICAgICAgICBcIlgtQ2xpZW50LUluZm9cIjogYCR7XCJAc3VwYWJhc2UvYXV0aC1oZWxwZXJzLW5leHRqc1wifUAke1wiMC4xMC4wXCJ9YFxuICAgICAgfVxuICAgIH0sXG4gICAgYXV0aDoge1xuICAgICAgc3RvcmFnZTogbmV3IE5leHRNaWRkbGV3YXJlQXV0aFN0b3JhZ2VBZGFwdGVyKGNvbnRleHQsIGNvb2tpZU9wdGlvbnMpXG4gICAgfVxuICB9KTtcbn1cblxuLy8gc3JjL3NlcnZlckNvbXBvbmVudENsaWVudC50c1xudmFyIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkNCA9IHJlcXVpcmUoXCJAc3VwYWJhc2UvYXV0aC1oZWxwZXJzLXNoYXJlZFwiKTtcbnZhciBOZXh0U2VydmVyQ29tcG9uZW50QXV0aFN0b3JhZ2VBZGFwdGVyID0gY2xhc3MgZXh0ZW5kcyBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDQuQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgY29va2llT3B0aW9ucykge1xuICAgIHN1cGVyKGNvb2tpZU9wdGlvbnMpO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5pc1NlcnZlciA9IHRydWU7XG4gIH1cbiAgZ2V0Q29va2llKG5hbWUpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgbmV4dENvb2tpZXMgPSB0aGlzLmNvbnRleHQuY29va2llcygpO1xuICAgIHJldHVybiAoX2EgPSBuZXh0Q29va2llcy5nZXQobmFtZSkpID09IG51bGwgPyB2b2lkIDAgOiBfYS52YWx1ZTtcbiAgfVxuICBzZXRDb29raWUobmFtZSwgdmFsdWUpIHtcbiAgfVxuICBkZWxldGVDb29raWUobmFtZSkge1xuICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlU2VydmVyQ29tcG9uZW50Q2xpZW50KGNvbnRleHQsIHtcbiAgc3VwYWJhc2VVcmwgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwsXG4gIHN1cGFiYXNlS2V5ID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVksXG4gIG9wdGlvbnMsXG4gIGNvb2tpZU9wdGlvbnNcbn0gPSB7fSkge1xuICB2YXIgX2E7XG4gIGlmICghc3VwYWJhc2VVcmwgfHwgIXN1cGFiYXNlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJlaXRoZXIgTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMIGFuZCBORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSBlbnYgdmFyaWFibGVzIG9yIHN1cGFiYXNlVXJsIGFuZCBzdXBhYmFzZUtleSBhcmUgcmVxdWlyZWQhXCJcbiAgICApO1xuICB9XG4gIHJldHVybiAoMCwgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQ0LmNyZWF0ZVN1cGFiYXNlQ2xpZW50KShzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXksIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGdsb2JhbDoge1xuICAgICAgLi4ub3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5nbG9iYWwsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLihfYSA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2xvYmFsKSA9PSBudWxsID8gdm9pZCAwIDogX2EuaGVhZGVycyxcbiAgICAgICAgXCJYLUNsaWVudC1JbmZvXCI6IGAke1wiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1uZXh0anNcIn1AJHtcIjAuMTAuMFwifWBcbiAgICAgIH1cbiAgICB9LFxuICAgIGF1dGg6IHtcbiAgICAgIHN0b3JhZ2U6IG5ldyBOZXh0U2VydmVyQ29tcG9uZW50QXV0aFN0b3JhZ2VBZGFwdGVyKGNvbnRleHQsIGNvb2tpZU9wdGlvbnMpXG4gICAgfVxuICB9KTtcbn1cblxuLy8gc3JjL3JvdXRlSGFuZGxlckNsaWVudC50c1xudmFyIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkNSA9IHJlcXVpcmUoXCJAc3VwYWJhc2UvYXV0aC1oZWxwZXJzLXNoYXJlZFwiKTtcbnZhciBOZXh0Um91dGVIYW5kbGVyQXV0aFN0b3JhZ2VBZGFwdGVyID0gY2xhc3MgZXh0ZW5kcyBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDUuQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgY29va2llT3B0aW9ucykge1xuICAgIHN1cGVyKGNvb2tpZU9wdGlvbnMpO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIH1cbiAgZ2V0Q29va2llKG5hbWUpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgbmV4dENvb2tpZXMgPSB0aGlzLmNvbnRleHQuY29va2llcygpO1xuICAgIHJldHVybiAoX2EgPSBuZXh0Q29va2llcy5nZXQobmFtZSkpID09IG51bGwgPyB2b2lkIDAgOiBfYS52YWx1ZTtcbiAgfVxuICBzZXRDb29raWUobmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCBuZXh0Q29va2llcyA9IHRoaXMuY29udGV4dC5jb29raWVzKCk7XG4gICAgbmV4dENvb2tpZXMuc2V0KG5hbWUsIHZhbHVlLCB0aGlzLmNvb2tpZU9wdGlvbnMpO1xuICB9XG4gIGRlbGV0ZUNvb2tpZShuYW1lKSB7XG4gICAgY29uc3QgbmV4dENvb2tpZXMgPSB0aGlzLmNvbnRleHQuY29va2llcygpO1xuICAgIG5leHRDb29raWVzLnNldChuYW1lLCBcIlwiLCB7XG4gICAgICAuLi50aGlzLmNvb2tpZU9wdGlvbnMsXG4gICAgICBtYXhBZ2U6IDBcbiAgICB9KTtcbiAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZVJvdXRlSGFuZGxlckNsaWVudChjb250ZXh0LCB7XG4gIHN1cGFiYXNlVXJsID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMLFxuICBzdXBhYmFzZUtleSA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZLFxuICBvcHRpb25zLFxuICBjb29raWVPcHRpb25zXG59ID0ge30pIHtcbiAgdmFyIF9hO1xuICBpZiAoIXN1cGFiYXNlVXJsIHx8ICFzdXBhYmFzZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiZWl0aGVyIE5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCBhbmQgTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVkgZW52IHZhcmlhYmxlcyBvciBzdXBhYmFzZVVybCBhbmQgc3VwYWJhc2VLZXkgYXJlIHJlcXVpcmVkIVwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkNS5jcmVhdGVTdXBhYmFzZUNsaWVudCkoc3VwYWJhc2VVcmwsIHN1cGFiYXNlS2V5LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBnbG9iYWw6IHtcbiAgICAgIC4uLm9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2xvYmFsLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAuLi4oX2EgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdsb2JhbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmhlYWRlcnMsXG4gICAgICAgIFwiWC1DbGllbnQtSW5mb1wiOiBgJHtcIkBzdXBhYmFzZS9hdXRoLWhlbHBlcnMtbmV4dGpzXCJ9QCR7XCIwLjEwLjBcIn1gXG4gICAgICB9XG4gICAgfSxcbiAgICBhdXRoOiB7XG4gICAgICBzdG9yYWdlOiBuZXcgTmV4dFJvdXRlSGFuZGxlckF1dGhTdG9yYWdlQWRhcHRlcihjb250ZXh0LCBjb29raWVPcHRpb25zKVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIHNyYy9zZXJ2ZXJBY3Rpb25DbGllbnQudHNcbnZhciBjcmVhdGVTZXJ2ZXJBY3Rpb25DbGllbnQgPSBjcmVhdGVSb3V0ZUhhbmRsZXJDbGllbnQ7XG5cbi8vIHNyYy9kZXByZWNhdGVkLnRzXG5mdW5jdGlvbiBjcmVhdGVCcm93c2VyU3VwYWJhc2VDbGllbnQoe1xuICBzdXBhYmFzZVVybCA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCxcbiAgc3VwYWJhc2VLZXkgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSxcbiAgb3B0aW9ucyxcbiAgY29va2llT3B0aW9uc1xufSA9IHt9KSB7XG4gIGNvbnNvbGUud2FybihcbiAgICBcIlBsZWFzZSB1dGlsaXplIHRoZSBgY3JlYXRlUGFnZXNCcm93c2VyQ2xpZW50YCBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBkZXByZWNhdGVkIGBjcmVhdGVCcm93c2VyU3VwYWJhc2VDbGllbnRgIGZ1bmN0aW9uLiBMZWFybiBtb3JlOiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL2d1aWRlcy9hdXRoL2F1dGgtaGVscGVycy9uZXh0anMtcGFnZXNcIlxuICApO1xuICByZXR1cm4gY3JlYXRlUGFnZXNCcm93c2VyQ2xpZW50KHtcbiAgICBzdXBhYmFzZVVybCxcbiAgICBzdXBhYmFzZUtleSxcbiAgICBvcHRpb25zLFxuICAgIGNvb2tpZU9wdGlvbnNcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVTZXJ2ZXJTdXBhYmFzZUNsaWVudChjb250ZXh0LCB7XG4gIHN1cGFiYXNlVXJsID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMLFxuICBzdXBhYmFzZUtleSA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZLFxuICBvcHRpb25zLFxuICBjb29raWVPcHRpb25zXG59ID0ge30pIHtcbiAgY29uc29sZS53YXJuKFxuICAgIFwiUGxlYXNlIHV0aWxpemUgdGhlIGBjcmVhdGVQYWdlc1NlcnZlckNsaWVudGAgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgZGVwcmVjYXRlZCBgY3JlYXRlU2VydmVyU3VwYWJhc2VDbGllbnRgIGZ1bmN0aW9uLiBMZWFybiBtb3JlOiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL2d1aWRlcy9hdXRoL2F1dGgtaGVscGVycy9uZXh0anMtcGFnZXNcIlxuICApO1xuICByZXR1cm4gY3JlYXRlUGFnZXNTZXJ2ZXJDbGllbnQoY29udGV4dCwge1xuICAgIHN1cGFiYXNlVXJsLFxuICAgIHN1cGFiYXNlS2V5LFxuICAgIG9wdGlvbnMsXG4gICAgY29va2llT3B0aW9uc1xuICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU1pZGRsZXdhcmVTdXBhYmFzZUNsaWVudChjb250ZXh0LCB7XG4gIHN1cGFiYXNlVXJsID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMLFxuICBzdXBhYmFzZUtleSA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZLFxuICBvcHRpb25zLFxuICBjb29raWVPcHRpb25zXG59ID0ge30pIHtcbiAgY29uc29sZS53YXJuKFxuICAgIFwiUGxlYXNlIHV0aWxpemUgdGhlIGBjcmVhdGVNaWRkbGV3YXJlQ2xpZW50YCBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBkZXByZWNhdGVkIGBjcmVhdGVNaWRkbGV3YXJlU3VwYWJhc2VDbGllbnRgIGZ1bmN0aW9uLiBMZWFybiBtb3JlOiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL2d1aWRlcy9hdXRoL2F1dGgtaGVscGVycy9uZXh0anMjbWlkZGxld2FyZVwiXG4gICk7XG4gIHJldHVybiBjcmVhdGVNaWRkbGV3YXJlQ2xpZW50KGNvbnRleHQsIHtcbiAgICBzdXBhYmFzZVVybCxcbiAgICBzdXBhYmFzZUtleSxcbiAgICBvcHRpb25zLFxuICAgIGNvb2tpZU9wdGlvbnNcbiAgfSk7XG59XG4vLyBBbm5vdGF0ZSB0aGUgQ29tbW9uSlMgZXhwb3J0IG5hbWVzIGZvciBFU00gaW1wb3J0IGluIG5vZGU6XG4wICYmIChtb2R1bGUuZXhwb3J0cyA9IHtcbiAgY3JlYXRlQnJvd3NlclN1cGFiYXNlQ2xpZW50LFxuICBjcmVhdGVDbGllbnRDb21wb25lbnRDbGllbnQsXG4gIGNyZWF0ZU1pZGRsZXdhcmVDbGllbnQsXG4gIGNyZWF0ZU1pZGRsZXdhcmVTdXBhYmFzZUNsaWVudCxcbiAgY3JlYXRlUGFnZXNCcm93c2VyQ2xpZW50LFxuICBjcmVhdGVQYWdlc1NlcnZlckNsaWVudCxcbiAgY3JlYXRlUm91dGVIYW5kbGVyQ2xpZW50LFxuICBjcmVhdGVTZXJ2ZXJBY3Rpb25DbGllbnQsXG4gIGNyZWF0ZVNlcnZlckNvbXBvbmVudENsaWVudCxcbiAgY3JlYXRlU2VydmVyU3VwYWJhc2VDbGllbnRcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sIm5hbWVzIjpbIl9fZGVmUHJvcCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiX19nZXRPd25Qcm9wRGVzYyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIl9fZ2V0T3duUHJvcE5hbWVzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsIl9faGFzT3duUHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiX19leHBvcnQiLCJ0YXJnZXQiLCJhbGwiLCJuYW1lIiwiZ2V0IiwiZW51bWVyYWJsZSIsIl9fY29weVByb3BzIiwidG8iLCJmcm9tIiwiZXhjZXB0IiwiZGVzYyIsImtleSIsImNhbGwiLCJfX3RvQ29tbW9uSlMiLCJtb2QiLCJ2YWx1ZSIsInNyY19leHBvcnRzIiwiY3JlYXRlQnJvd3NlclN1cGFiYXNlQ2xpZW50IiwiY3JlYXRlQ2xpZW50Q29tcG9uZW50Q2xpZW50IiwiY3JlYXRlTWlkZGxld2FyZUNsaWVudCIsImNyZWF0ZU1pZGRsZXdhcmVTdXBhYmFzZUNsaWVudCIsImNyZWF0ZVBhZ2VzQnJvd3NlckNsaWVudCIsImNyZWF0ZVBhZ2VzU2VydmVyQ2xpZW50IiwiY3JlYXRlUm91dGVIYW5kbGVyQ2xpZW50IiwiY3JlYXRlU2VydmVyQWN0aW9uQ2xpZW50IiwiY3JlYXRlU2VydmVyQ29tcG9uZW50Q2xpZW50IiwiY3JlYXRlU2VydmVyU3VwYWJhc2VDbGllbnQiLCJtb2R1bGUiLCJleHBvcnRzIiwiaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQiLCJyZXF1aXJlIiwic3VwYWJhc2UiLCJzdXBhYmFzZVVybCIsInByb2Nlc3MiLCJlbnYiLCJORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwiLCJzdXBhYmFzZUtleSIsIk5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZIiwib3B0aW9ucyIsImNvb2tpZU9wdGlvbnMiLCJpc1NpbmdsZXRvbiIsIkVycm9yIiwiY3JlYXRlTmV3Q2xpZW50IiwiX2EiLCJjcmVhdGVTdXBhYmFzZUNsaWVudCIsImdsb2JhbCIsImhlYWRlcnMiLCJhdXRoIiwic3RvcmFnZSIsIkJyb3dzZXJDb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIiLCJfc3VwYWJhc2UiLCJpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDIiLCJpbXBvcnRfc2V0X2Nvb2tpZV9wYXJzZXIiLCJOZXh0U2VydmVyQXV0aFN0b3JhZ2VBZGFwdGVyIiwiQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIiwiY29uc3RydWN0b3IiLCJjb250ZXh0IiwiZ2V0Q29va2llIiwiX2IiLCJfYyIsInNldENvb2tpZSIsInNwbGl0Q29va2llc1N0cmluZyIsInJlcyIsImdldEhlYWRlciIsInRvU3RyaW5nIiwibWFwIiwiYyIsInBhcnNlQ29va2llcyIsImZpbmQiLCJyZXEiLCJjb29raWVzIiwiX3NldENvb2tpZSIsImRlbGV0ZUNvb2tpZSIsIm1heEFnZSIsInNldENvb2tpZXMiLCJmaWx0ZXIiLCJjb29raWVTdHIiLCJzZXJpYWxpemVDb29raWUiLCJodHRwT25seSIsInNldEhlYWRlciIsImltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMyIsImltcG9ydF9zZXRfY29va2llX3BhcnNlcjIiLCJOZXh0TWlkZGxld2FyZUF1dGhTdG9yYWdlQWRhcHRlciIsIm5ld1Nlc3Npb25TdHIiLCJhcHBlbmQiLCJpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDQiLCJOZXh0U2VydmVyQ29tcG9uZW50QXV0aFN0b3JhZ2VBZGFwdGVyIiwiaXNTZXJ2ZXIiLCJuZXh0Q29va2llcyIsImltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkNSIsIk5leHRSb3V0ZUhhbmRsZXJBdXRoU3RvcmFnZUFkYXB0ZXIiLCJzZXQiLCJjb25zb2xlIiwid2FybiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-helpers-nextjs/dist/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-helpers-nextjs/dist/index.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-helpers-nextjs/dist/index.js ***!
|
||
\******************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all)=>{\n for(var name in all)__defProp(target, name, {\n get: all[name],\n enumerable: true\n });\n};\nvar __copyProps = (to, from, except, desc)=>{\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n get: ()=>from[key],\n enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n });\n }\n return to;\n};\nvar __toCommonJS = (mod)=>__copyProps(__defProp({}, \"__esModule\", {\n value: true\n }), mod);\n// src/index.ts\nvar src_exports = {};\n__export(src_exports, {\n createBrowserSupabaseClient: ()=>createBrowserSupabaseClient,\n createClientComponentClient: ()=>createClientComponentClient,\n createMiddlewareClient: ()=>createMiddlewareClient,\n createMiddlewareSupabaseClient: ()=>createMiddlewareSupabaseClient,\n createPagesBrowserClient: ()=>createPagesBrowserClient,\n createPagesServerClient: ()=>createPagesServerClient,\n createRouteHandlerClient: ()=>createRouteHandlerClient,\n createServerActionClient: ()=>createServerActionClient,\n createServerComponentClient: ()=>createServerComponentClient,\n createServerSupabaseClient: ()=>createServerSupabaseClient\n});\nmodule.exports = __toCommonJS(src_exports);\n// src/clientComponentClient.ts\nvar import_auth_helpers_shared = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(rsc)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar supabase;\nfunction createClientComponentClient({ supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions, isSingleton = true } = {}) {\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n const createNewClient = ()=>{\n var _a;\n return (0, import_auth_helpers_shared.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new import_auth_helpers_shared.BrowserCookieAuthStorageAdapter(cookieOptions)\n }\n });\n };\n if (isSingleton) {\n const _supabase = supabase ?? createNewClient();\n if (true) return _supabase;\n if (!supabase) supabase = _supabase;\n return supabase;\n }\n return createNewClient();\n}\n// src/pagesBrowserClient.ts\nvar createPagesBrowserClient = createClientComponentClient;\n// src/pagesServerClient.ts\nvar import_auth_helpers_shared2 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(rsc)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar import_set_cookie_parser = __webpack_require__(/*! set-cookie-parser */ \"(rsc)/./node_modules/set-cookie-parser/lib/set-cookie.js\");\nvar NextServerAuthStorageAdapter = class extends import_auth_helpers_shared2.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n }\n getCookie(name) {\n var _a, _b, _c;\n const setCookie = (0, import_set_cookie_parser.splitCookiesString)(((_b = (_a = this.context.res) == null ? void 0 : _a.getHeader(\"set-cookie\")) == null ? void 0 : _b.toString()) ?? \"\").map((c)=>(0, import_auth_helpers_shared2.parseCookies)(c)[name]).find((c)=>!!c);\n const value = setCookie ?? ((_c = this.context.req) == null ? void 0 : _c.cookies[name]);\n return value;\n }\n setCookie(name, value) {\n this._setCookie(name, value);\n }\n deleteCookie(name) {\n this._setCookie(name, \"\", {\n maxAge: 0\n });\n }\n _setCookie(name, value, options) {\n var _a;\n const setCookies = (0, import_set_cookie_parser.splitCookiesString)(((_a = this.context.res.getHeader(\"set-cookie\")) == null ? void 0 : _a.toString()) ?? \"\").filter((c)=>!(name in (0, import_auth_helpers_shared2.parseCookies)(c)));\n const cookieStr = (0, import_auth_helpers_shared2.serializeCookie)(name, value, {\n ...this.cookieOptions,\n ...options,\n // Allow supabase-js on the client to read the cookie as well\n httpOnly: false\n });\n this.context.res.setHeader(\"set-cookie\", [\n ...setCookies,\n cookieStr\n ]);\n }\n};\nfunction createPagesServerClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared2.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextServerAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/middlewareClient.ts\nvar import_auth_helpers_shared3 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(rsc)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar import_set_cookie_parser2 = __webpack_require__(/*! set-cookie-parser */ \"(rsc)/./node_modules/set-cookie-parser/lib/set-cookie.js\");\nvar NextMiddlewareAuthStorageAdapter = class extends import_auth_helpers_shared3.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n }\n getCookie(name) {\n var _a;\n const setCookie = (0, import_set_cookie_parser2.splitCookiesString)(((_a = this.context.res.headers.get(\"set-cookie\")) == null ? void 0 : _a.toString()) ?? \"\").map((c)=>(0, import_auth_helpers_shared3.parseCookies)(c)[name]).find((c)=>!!c);\n if (setCookie) {\n return setCookie;\n }\n const cookies = (0, import_auth_helpers_shared3.parseCookies)(this.context.req.headers.get(\"cookie\") ?? \"\");\n return cookies[name];\n }\n setCookie(name, value) {\n this._setCookie(name, value);\n }\n deleteCookie(name) {\n this._setCookie(name, \"\", {\n maxAge: 0\n });\n }\n _setCookie(name, value, options) {\n const newSessionStr = (0, import_auth_helpers_shared3.serializeCookie)(name, value, {\n ...this.cookieOptions,\n ...options,\n // Allow supabase-js on the client to read the cookie as well\n httpOnly: false\n });\n if (this.context.res.headers) {\n this.context.res.headers.append(\"set-cookie\", newSessionStr);\n }\n }\n};\nfunction createMiddlewareClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared3.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextMiddlewareAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/serverComponentClient.ts\nvar import_auth_helpers_shared4 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(rsc)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar NextServerComponentAuthStorageAdapter = class extends import_auth_helpers_shared4.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n this.isServer = true;\n }\n getCookie(name) {\n var _a;\n const nextCookies = this.context.cookies();\n return (_a = nextCookies.get(name)) == null ? void 0 : _a.value;\n }\n setCookie(name, value) {}\n deleteCookie(name) {}\n};\nfunction createServerComponentClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared4.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextServerComponentAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/routeHandlerClient.ts\nvar import_auth_helpers_shared5 = __webpack_require__(/*! @supabase/auth-helpers-shared */ \"(rsc)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\");\nvar NextRouteHandlerAuthStorageAdapter = class extends import_auth_helpers_shared5.CookieAuthStorageAdapter {\n constructor(context, cookieOptions){\n super(cookieOptions);\n this.context = context;\n }\n getCookie(name) {\n var _a;\n const nextCookies = this.context.cookies();\n return (_a = nextCookies.get(name)) == null ? void 0 : _a.value;\n }\n setCookie(name, value) {\n const nextCookies = this.context.cookies();\n nextCookies.set(name, value, this.cookieOptions);\n }\n deleteCookie(name) {\n const nextCookies = this.context.cookies();\n nextCookies.set(name, \"\", {\n ...this.cookieOptions,\n maxAge: 0\n });\n }\n};\nfunction createRouteHandlerClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n var _a;\n if (!supabaseUrl || !supabaseKey) {\n throw new Error(\"either NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY env variables or supabaseUrl and supabaseKey are required!\");\n }\n return (0, import_auth_helpers_shared5.createSupabaseClient)(supabaseUrl, supabaseKey, {\n ...options,\n global: {\n ...options == null ? void 0 : options.global,\n headers: {\n ...(_a = options == null ? void 0 : options.global) == null ? void 0 : _a.headers,\n \"X-Client-Info\": `${\"@supabase/auth-helpers-nextjs\"}@${\"0.10.0\"}`\n }\n },\n auth: {\n storage: new NextRouteHandlerAuthStorageAdapter(context, cookieOptions)\n }\n });\n}\n// src/serverActionClient.ts\nvar createServerActionClient = createRouteHandlerClient;\n// src/deprecated.ts\nfunction createBrowserSupabaseClient({ supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n console.warn(\"Please utilize the `createPagesBrowserClient` function instead of the deprecated `createBrowserSupabaseClient` function. Learn more: https://supabase.com/docs/guides/auth/auth-helpers/nextjs-pages\");\n return createPagesBrowserClient({\n supabaseUrl,\n supabaseKey,\n options,\n cookieOptions\n });\n}\nfunction createServerSupabaseClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n console.warn(\"Please utilize the `createPagesServerClient` function instead of the deprecated `createServerSupabaseClient` function. Learn more: https://supabase.com/docs/guides/auth/auth-helpers/nextjs-pages\");\n return createPagesServerClient(context, {\n supabaseUrl,\n supabaseKey,\n options,\n cookieOptions\n });\n}\nfunction createMiddlewareSupabaseClient(context, { supabaseUrl = \"http://192.168.0.66:8001\", supabaseKey = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U\", options, cookieOptions } = {}) {\n console.warn(\"Please utilize the `createMiddlewareClient` function instead of the deprecated `createMiddlewareSupabaseClient` function. Learn more: https://supabase.com/docs/guides/auth/auth-helpers/nextjs#middleware\");\n return createMiddlewareClient(context, {\n supabaseUrl,\n supabaseKey,\n options,\n cookieOptions\n });\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (0); //# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtaGVscGVycy1uZXh0anMvZGlzdC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLElBQUlBLFlBQVlDLE9BQU9DLGNBQWM7QUFDckMsSUFBSUMsbUJBQW1CRixPQUFPRyx3QkFBd0I7QUFDdEQsSUFBSUMsb0JBQW9CSixPQUFPSyxtQkFBbUI7QUFDbEQsSUFBSUMsZUFBZU4sT0FBT08sU0FBUyxDQUFDQyxjQUFjO0FBQ2xELElBQUlDLFdBQVcsQ0FBQ0MsUUFBUUM7SUFDdEIsSUFBSyxJQUFJQyxRQUFRRCxJQUNmWixVQUFVVyxRQUFRRSxNQUFNO1FBQUVDLEtBQUtGLEdBQUcsQ0FBQ0MsS0FBSztRQUFFRSxZQUFZO0lBQUs7QUFDL0Q7QUFDQSxJQUFJQyxjQUFjLENBQUNDLElBQUlDLE1BQU1DLFFBQVFDO0lBQ25DLElBQUlGLFFBQVEsT0FBT0EsU0FBUyxZQUFZLE9BQU9BLFNBQVMsWUFBWTtRQUNsRSxLQUFLLElBQUlHLE9BQU9oQixrQkFBa0JhLE1BQ2hDLElBQUksQ0FBQ1gsYUFBYWUsSUFBSSxDQUFDTCxJQUFJSSxRQUFRQSxRQUFRRixRQUN6Q25CLFVBQVVpQixJQUFJSSxLQUFLO1lBQUVQLEtBQUssSUFBTUksSUFBSSxDQUFDRyxJQUFJO1lBQUVOLFlBQVksQ0FBRUssQ0FBQUEsT0FBT2pCLGlCQUFpQmUsTUFBTUcsSUFBRyxLQUFNRCxLQUFLTCxVQUFVO1FBQUM7SUFDdEg7SUFDQSxPQUFPRTtBQUNUO0FBQ0EsSUFBSU0sZUFBZSxDQUFDQyxNQUFRUixZQUFZaEIsVUFBVSxDQUFDLEdBQUcsY0FBYztRQUFFeUIsT0FBTztJQUFLLElBQUlEO0FBRXRGLGVBQWU7QUFDZixJQUFJRSxjQUFjLENBQUM7QUFDbkJoQixTQUFTZ0IsYUFBYTtJQUNwQkMsNkJBQTZCLElBQU1BO0lBQ25DQyw2QkFBNkIsSUFBTUE7SUFDbkNDLHdCQUF3QixJQUFNQTtJQUM5QkMsZ0NBQWdDLElBQU1BO0lB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QStCb0MsT0FBTyxFQUFFLEVBQy9DeEIsY0FBY0MsMEJBQW9DLEVBQ2xERyxjQUFjSCwyS0FBeUMsRUFDdkRLLE9BQU8sRUFDUEMsYUFBYSxFQUNkLEdBQUcsQ0FBQyxDQUFDO0lBQ0pxRCxRQUFRQyxJQUFJLENBQ1Y7SUFFRixPQUFPMUUsdUJBQXVCcUMsU0FBUztRQUNyQ3hCO1FBQ0FJO1FBQ0FFO1FBQ0FDO0lBQ0Y7QUFDRjtBQUNBLDZEQUE2RDtBQUM3RCxLQUFNWixDQUFBQSxDQVdOLEdBQ0EsaUNBQWlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWhlbHBlcnMtbmV4dGpzL2Rpc3QvaW5kZXguanM/Y2Y5MyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG4gIGZvciAodmFyIG5hbWUgaW4gYWxsKVxuICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsgZ2V0OiBhbGxbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9Db21tb25KUyA9IChtb2QpID0+IF9fY29weVByb3BzKF9fZGVmUHJvcCh7fSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7XG5cbi8vIHNyYy9pbmRleC50c1xudmFyIHNyY19leHBvcnRzID0ge307XG5fX2V4cG9ydChzcmNfZXhwb3J0cywge1xuICBjcmVhdGVCcm93c2VyU3VwYWJhc2VDbGllbnQ6ICgpID0+IGNyZWF0ZUJyb3dzZXJTdXBhYmFzZUNsaWVudCxcbiAgY3JlYXRlQ2xpZW50Q29tcG9uZW50Q2xpZW50OiAoKSA9PiBjcmVhdGVDbGllbnRDb21wb25lbnRDbGllbnQsXG4gIGNyZWF0ZU1pZGRsZXdhcmVDbGllbnQ6ICgpID0+IGNyZWF0ZU1pZGRsZXdhcmVDbGllbnQsXG4gIGNyZWF0ZU1pZGRsZXdhcmVTdXBhYmFzZUNsaWVudDogKCkgPT4gY3JlYXRlTWlkZGxld2FyZVN1cGFiYXNlQ2xpZW50LFxuICBjcmVhdGVQYWdlc0Jyb3dzZXJDbGllbnQ6ICgpID0+IGNyZWF0ZVBhZ2VzQnJvd3NlckNsaWVudCxcbiAgY3JlYXRlUGFnZXNTZXJ2ZXJDbGllbnQ6ICgpID0+IGNyZWF0ZVBhZ2VzU2VydmVyQ2xpZW50LFxuICBjcmVhdGVSb3V0ZUhhbmRsZXJDbGllbnQ6ICgpID0+IGNyZWF0ZVJvdXRlSGFuZGxlckNsaWVudCxcbiAgY3JlYXRlU2VydmVyQWN0aW9uQ2xpZW50OiAoKSA9PiBjcmVhdGVTZXJ2ZXJBY3Rpb25DbGllbnQsXG4gIGNyZWF0ZVNlcnZlckNvbXBvbmVudENsaWVudDogKCkgPT4gY3JlYXRlU2VydmVyQ29tcG9uZW50Q2xpZW50LFxuICBjcmVhdGVTZXJ2ZXJTdXBhYmFzZUNsaWVudDogKCkgPT4gY3JlYXRlU2VydmVyU3VwYWJhc2VDbGllbnRcbn0pO1xubW9kdWxlLmV4cG9ydHMgPSBfX3RvQ29tbW9uSlMoc3JjX2V4cG9ydHMpO1xuXG4vLyBzcmMvY2xpZW50Q29tcG9uZW50Q2xpZW50LnRzXG52YXIgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQgPSByZXF1aXJlKFwiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1zaGFyZWRcIik7XG52YXIgc3VwYWJhc2U7XG5mdW5jdGlvbiBjcmVhdGVDbGllbnRDb21wb25lbnRDbGllbnQoe1xuICBzdXBhYmFzZVVybCA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCxcbiAgc3VwYWJhc2VLZXkgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSxcbiAgb3B0aW9ucyxcbiAgY29va2llT3B0aW9ucyxcbiAgaXNTaW5nbGV0b24gPSB0cnVlXG59ID0ge30pIHtcbiAgaWYgKCFzdXBhYmFzZVVybCB8fCAhc3VwYWJhc2VLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImVpdGhlciBORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwgYW5kIE5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZIGVudiB2YXJpYWJsZXMgb3Igc3VwYWJhc2VVcmwgYW5kIHN1cGFiYXNlS2V5IGFyZSByZXF1aXJlZCFcIlxuICAgICk7XG4gIH1cbiAgY29uc3QgY3JlYXRlTmV3Q2xpZW50ID0gKCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkLmNyZWF0ZVN1cGFiYXNlQ2xpZW50KShzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXksIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBnbG9iYWw6IHtcbiAgICAgICAgLi4ub3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5nbG9iYWwsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4oX2EgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdsb2JhbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmhlYWRlcnMsXG4gICAgICAgICAgXCJYLUNsaWVudC1JbmZvXCI6IGAke1wiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1uZXh0anNcIn1AJHtcIjAuMTAuMFwifWBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGF1dGg6IHtcbiAgICAgICAgc3RvcmFnZTogbmV3IGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkLkJyb3dzZXJDb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIoY29va2llT3B0aW9ucylcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgaWYgKGlzU2luZ2xldG9uKSB7XG4gICAgY29uc3QgX3N1cGFiYXNlID0gc3VwYWJhc2UgPz8gY3JlYXRlTmV3Q2xpZW50KCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gX3N1cGFiYXNlO1xuICAgIGlmICghc3VwYWJhc2UpXG4gICAgICBzdXBhYmFzZSA9IF9zdXBhYmFzZTtcbiAgICByZXR1cm4gc3VwYWJhc2U7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZU5ld0NsaWVudCgpO1xufVxuXG4vLyBzcmMvcGFnZXNCcm93c2VyQ2xpZW50LnRzXG52YXIgY3JlYXRlUGFnZXNCcm93c2VyQ2xpZW50ID0gY3JlYXRlQ2xpZW50Q29tcG9uZW50Q2xpZW50O1xuXG4vLyBzcmMvcGFnZXNTZXJ2ZXJDbGllbnQudHNcbnZhciBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDIgPSByZXF1aXJlKFwiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1zaGFyZWRcIik7XG52YXIgaW1wb3J0X3NldF9jb29raWVfcGFyc2VyID0gcmVxdWlyZShcInNldC1jb29raWUtcGFyc2VyXCIpO1xudmFyIE5leHRTZXJ2ZXJBdXRoU3RvcmFnZUFkYXB0ZXIgPSBjbGFzcyBleHRlbmRzIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMi5Db29raWVBdXRoU3RvcmFnZUFkYXB0ZXIge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBjb29raWVPcHRpb25zKSB7XG4gICAgc3VwZXIoY29va2llT3B0aW9ucyk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuICBnZXRDb29raWUobmFtZSkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIGNvbnN0IHNldENvb2tpZSA9ICgwLCBpbXBvcnRfc2V0X2Nvb2tpZV9wYXJzZXIuc3BsaXRDb29raWVzU3RyaW5nKShcbiAgICAgICgoX2IgPSAoX2EgPSB0aGlzLmNvbnRleHQucmVzKSA9PSBudWxsID8gdm9pZCAwIDogX2EuZ2V0SGVhZGVyKFwic2V0LWNvb2tpZVwiKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLnRvU3RyaW5nKCkpID8/IFwiXCJcbiAgICApLm1hcCgoYykgPT4gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMi5wYXJzZUNvb2tpZXMpKGMpW25hbWVdKS5maW5kKChjKSA9PiAhIWMpO1xuICAgIGNvbnN0IHZhbHVlID0gc2V0Q29va2llID8/ICgoX2MgPSB0aGlzLmNvbnRleHQucmVxKSA9PSBudWxsID8gdm9pZCAwIDogX2MuY29va2llc1tuYW1lXSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHNldENvb2tpZShuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuX3NldENvb2tpZShuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgZGVsZXRlQ29va2llKG5hbWUpIHtcbiAgICB0aGlzLl9zZXRDb29raWUobmFtZSwgXCJcIiwge1xuICAgICAgbWF4QWdlOiAwXG4gICAgfSk7XG4gIH1cbiAgX3NldENvb2tpZShuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBzZXRDb29raWVzID0gKDAsIGltcG9ydF9zZXRfY29va2llX3BhcnNlci5zcGxpdENvb2tpZXNTdHJpbmcpKFxuICAgICAgKChfYSA9IHRoaXMuY29udGV4dC5yZXMuZ2V0SGVhZGVyKFwic2V0LWNvb2tpZVwiKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkpID8/IFwiXCJcbiAgICApLmZpbHRlcigoYykgPT4gIShuYW1lIGluICgwLCBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDIucGFyc2VDb29raWVzKShjKSkpO1xuICAgIGNvbnN0IGNvb2tpZVN0ciA9ICgwLCBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDIuc2VyaWFsaXplQ29va2llKShuYW1lLCB2YWx1ZSwge1xuICAgICAgLi4udGhpcy5jb29raWVPcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC8vIEFsbG93IHN1cGFiYXNlLWpzIG9uIHRoZSBjbGllbnQgdG8gcmVhZCB0aGUgY29va2llIGFzIHdlbGxcbiAgICAgIGh0dHBPbmx5OiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuY29udGV4dC5yZXMuc2V0SGVhZGVyKFwic2V0LWNvb2tpZVwiLCBbLi4uc2V0Q29va2llcywgY29va2llU3RyXSk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVQYWdlc1NlcnZlckNsaWVudChjb250ZXh0LCB7XG4gIHN1cGFiYXNlVXJsID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMLFxuICBzdXBhYmFzZUtleSA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZLFxuICBvcHRpb25zLFxuICBjb29raWVPcHRpb25zXG59ID0ge30pIHtcbiAgdmFyIF9hO1xuICBpZiAoIXN1cGFiYXNlVXJsIHx8ICFzdXBhYmFzZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiZWl0aGVyIE5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCBhbmQgTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVkgZW52IHZhcmlhYmxlcyBvciBzdXBhYmFzZVVybCBhbmQgc3VwYWJhc2VLZXkgYXJlIHJlcXVpcmVkIVwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMi5jcmVhdGVTdXBhYmFzZUNsaWVudCkoc3VwYWJhc2VVcmwsIHN1cGFiYXNlS2V5LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBnbG9iYWw6IHtcbiAgICAgIC4uLm9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2xvYmFsLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAuLi4oX2EgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdsb2JhbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmhlYWRlcnMsXG4gICAgICAgIFwiWC1DbGllbnQtSW5mb1wiOiBgJHtcIkBzdXBhYmFzZS9hdXRoLWhlbHBlcnMtbmV4dGpzXCJ9QCR7XCIwLjEwLjBcIn1gXG4gICAgICB9XG4gICAgfSxcbiAgICBhdXRoOiB7XG4gICAgICBzdG9yYWdlOiBuZXcgTmV4dFNlcnZlckF1dGhTdG9yYWdlQWRhcHRlcihjb250ZXh0LCBjb29raWVPcHRpb25zKVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIHNyYy9taWRkbGV3YXJlQ2xpZW50LnRzXG52YXIgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQzID0gcmVxdWlyZShcIkBzdXBhYmFzZS9hdXRoLWhlbHBlcnMtc2hhcmVkXCIpO1xudmFyIGltcG9ydF9zZXRfY29va2llX3BhcnNlcjIgPSByZXF1aXJlKFwic2V0LWNvb2tpZS1wYXJzZXJcIik7XG52YXIgTmV4dE1pZGRsZXdhcmVBdXRoU3RvcmFnZUFkYXB0ZXIgPSBjbGFzcyBleHRlbmRzIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkMy5Db29raWVBdXRoU3RvcmFnZUFkYXB0ZXIge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBjb29raWVPcHRpb25zKSB7XG4gICAgc3VwZXIoY29va2llT3B0aW9ucyk7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuICBnZXRDb29raWUobmFtZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBzZXRDb29raWUgPSAoMCwgaW1wb3J0X3NldF9jb29raWVfcGFyc2VyMi5zcGxpdENvb2tpZXNTdHJpbmcpKFxuICAgICAgKChfYSA9IHRoaXMuY29udGV4dC5yZXMuaGVhZGVycy5nZXQoXCJzZXQtY29va2llXCIpKSA9PSBudWxsID8gdm9pZCAwIDogX2EudG9TdHJpbmcoKSkgPz8gXCJcIlxuICAgICkubWFwKChjKSA9PiAoMCwgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQzLnBhcnNlQ29va2llcykoYylbbmFtZV0pLmZpbmQoKGMpID0+ICEhYyk7XG4gICAgaWYgKHNldENvb2tpZSkge1xuICAgICAgcmV0dXJuIHNldENvb2tpZTtcbiAgICB9XG4gICAgY29uc3QgY29va2llcyA9ICgwLCBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDMucGFyc2VDb29raWVzKSh0aGlzLmNvbnRleHQucmVxLmhlYWRlcnMuZ2V0KFwiY29va2llXCIpID8/IFwiXCIpO1xuICAgIHJldHVybiBjb29raWVzW25hbWVdO1xuICB9XG4gIHNldENvb2tpZShuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuX3NldENvb2tpZShuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgZGVsZXRlQ29va2llKG5hbWUpIHtcbiAgICB0aGlzLl9zZXRDb29raWUobmFtZSwgXCJcIiwge1xuICAgICAgbWF4QWdlOiAwXG4gICAgfSk7XG4gIH1cbiAgX3NldENvb2tpZShuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IG5ld1Nlc3Npb25TdHIgPSAoMCwgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQzLnNlcmlhbGl6ZUNvb2tpZSkobmFtZSwgdmFsdWUsIHtcbiAgICAgIC4uLnRoaXMuY29va2llT3B0aW9ucyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAvLyBBbGxvdyBzdXBhYmFzZS1qcyBvbiB0aGUgY2xpZW50IHRvIHJlYWQgdGhlIGNvb2tpZSBhcyB3ZWxsXG4gICAgICBodHRwT25seTogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAodGhpcy5jb250ZXh0LnJlcy5oZWFkZXJzKSB7XG4gICAgICB0aGlzLmNvbnRleHQucmVzLmhlYWRlcnMuYXBwZW5kKFwic2V0LWNvb2tpZVwiLCBuZXdTZXNzaW9uU3RyKTtcbiAgICB9XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVNaWRkbGV3YXJlQ2xpZW50KGNvbnRleHQsIHtcbiAgc3VwYWJhc2VVcmwgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwsXG4gIHN1cGFiYXNlS2V5ID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVksXG4gIG9wdGlvbnMsXG4gIGNvb2tpZU9wdGlvbnNcbn0gPSB7fSkge1xuICB2YXIgX2E7XG4gIGlmICghc3VwYWJhc2VVcmwgfHwgIXN1cGFiYXNlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJlaXRoZXIgTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMIGFuZCBORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSBlbnYgdmFyaWFibGVzIG9yIHN1cGFiYXNlVXJsIGFuZCBzdXBhYmFzZUtleSBhcmUgcmVxdWlyZWQhXCJcbiAgICApO1xuICB9XG4gIHJldHVybiAoMCwgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQzLmNyZWF0ZVN1cGFiYXNlQ2xpZW50KShzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXksIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGdsb2JhbDoge1xuICAgICAgLi4ub3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5nbG9iYWwsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLihfYSA9IG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2xvYmFsKSA9PSBudWxsID8gdm9pZCAwIDogX2EuaGVhZGVycyxcbiAgICAgICAgXCJYLUNsaWVudC1JbmZvXCI6IGAke1wiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1uZXh0anNcIn1AJHtcIjAuMTAuMFwifWBcbiAgICAgIH1cbiAgICB9LFxuICAgIGF1dGg6IHtcbiAgICAgIHN0b3JhZ2U6IG5ldyBOZXh0TWlkZGxld2FyZUF1dGhTdG9yYWdlQWRhcHRlcihjb250ZXh0LCBjb29raWVPcHRpb25zKVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIHNyYy9zZXJ2ZXJDb21wb25lbnRDbGllbnQudHNcbnZhciBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDQgPSByZXF1aXJlKFwiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1zaGFyZWRcIik7XG52YXIgTmV4dFNlcnZlckNvbXBvbmVudEF1dGhTdG9yYWdlQWRhcHRlciA9IGNsYXNzIGV4dGVuZHMgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQ0LkNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIGNvb2tpZU9wdGlvbnMpIHtcbiAgICBzdXBlcihjb29raWVPcHRpb25zKTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuaXNTZXJ2ZXIgPSB0cnVlO1xuICB9XG4gIGdldENvb2tpZShuYW1lKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG5leHRDb29raWVzID0gdGhpcy5jb250ZXh0LmNvb2tpZXMoKTtcbiAgICByZXR1cm4gKF9hID0gbmV4dENvb2tpZXMuZ2V0KG5hbWUpKSA9PSBudWxsID8gdm9pZCAwIDogX2EudmFsdWU7XG4gIH1cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlKSB7XG4gIH1cbiAgZGVsZXRlQ29va2llKG5hbWUpIHtcbiAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZVNlcnZlckNvbXBvbmVudENsaWVudChjb250ZXh0LCB7XG4gIHN1cGFiYXNlVXJsID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMLFxuICBzdXBhYmFzZUtleSA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZLFxuICBvcHRpb25zLFxuICBjb29raWVPcHRpb25zXG59ID0ge30pIHtcbiAgdmFyIF9hO1xuICBpZiAoIXN1cGFiYXNlVXJsIHx8ICFzdXBhYmFzZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiZWl0aGVyIE5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCBhbmQgTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVkgZW52IHZhcmlhYmxlcyBvciBzdXBhYmFzZVVybCBhbmQgc3VwYWJhc2VLZXkgYXJlIHJlcXVpcmVkIVwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gKDAsIGltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkNC5jcmVhdGVTdXBhYmFzZUNsaWVudCkoc3VwYWJhc2VVcmwsIHN1cGFiYXNlS2V5LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBnbG9iYWw6IHtcbiAgICAgIC4uLm9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2xvYmFsLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAuLi4oX2EgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdsb2JhbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmhlYWRlcnMsXG4gICAgICAgIFwiWC1DbGllbnQtSW5mb1wiOiBgJHtcIkBzdXBhYmFzZS9hdXRoLWhlbHBlcnMtbmV4dGpzXCJ9QCR7XCIwLjEwLjBcIn1gXG4gICAgICB9XG4gICAgfSxcbiAgICBhdXRoOiB7XG4gICAgICBzdG9yYWdlOiBuZXcgTmV4dFNlcnZlckNvbXBvbmVudEF1dGhTdG9yYWdlQWRhcHRlcihjb250ZXh0LCBjb29raWVPcHRpb25zKVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIHNyYy9yb3V0ZUhhbmRsZXJDbGllbnQudHNcbnZhciBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDUgPSByZXF1aXJlKFwiQHN1cGFiYXNlL2F1dGgtaGVscGVycy1zaGFyZWRcIik7XG52YXIgTmV4dFJvdXRlSGFuZGxlckF1dGhTdG9yYWdlQWRhcHRlciA9IGNsYXNzIGV4dGVuZHMgaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQ1LkNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIGNvb2tpZU9wdGlvbnMpIHtcbiAgICBzdXBlcihjb29raWVPcHRpb25zKTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB9XG4gIGdldENvb2tpZShuYW1lKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG5leHRDb29raWVzID0gdGhpcy5jb250ZXh0LmNvb2tpZXMoKTtcbiAgICByZXR1cm4gKF9hID0gbmV4dENvb2tpZXMuZ2V0KG5hbWUpKSA9PSBudWxsID8gdm9pZCAwIDogX2EudmFsdWU7XG4gIH1cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3QgbmV4dENvb2tpZXMgPSB0aGlzLmNvbnRleHQuY29va2llcygpO1xuICAgIG5leHRDb29raWVzLnNldChuYW1lLCB2YWx1ZSwgdGhpcy5jb29raWVPcHRpb25zKTtcbiAgfVxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIGNvbnN0IG5leHRDb29raWVzID0gdGhpcy5jb250ZXh0LmNvb2tpZXMoKTtcbiAgICBuZXh0Q29va2llcy5zZXQobmFtZSwgXCJcIiwge1xuICAgICAgLi4udGhpcy5jb29raWVPcHRpb25zLFxuICAgICAgbWF4QWdlOiAwXG4gICAgfSk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVSb3V0ZUhhbmRsZXJDbGllbnQoY29udGV4dCwge1xuICBzdXBhYmFzZVVybCA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCxcbiAgc3VwYWJhc2VLZXkgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSxcbiAgb3B0aW9ucyxcbiAgY29va2llT3B0aW9uc1xufSA9IHt9KSB7XG4gIHZhciBfYTtcbiAgaWYgKCFzdXBhYmFzZVVybCB8fCAhc3VwYWJhc2VLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImVpdGhlciBORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwgYW5kIE5FWFRfUFVCTElDX1NVUEFCQVNFX0FOT05fS0VZIGVudiB2YXJpYWJsZXMgb3Igc3VwYWJhc2VVcmwgYW5kIHN1cGFiYXNlS2V5IGFyZSByZXF1aXJlZCFcIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuICgwLCBpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDUuY3JlYXRlU3VwYWJhc2VDbGllbnQpKHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZ2xvYmFsOiB7XG4gICAgICAuLi5vcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdsb2JhbCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uKF9hID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5nbG9iYWwpID09IG51bGwgPyB2b2lkIDAgOiBfYS5oZWFkZXJzLFxuICAgICAgICBcIlgtQ2xpZW50LUluZm9cIjogYCR7XCJAc3VwYWJhc2UvYXV0aC1oZWxwZXJzLW5leHRqc1wifUAke1wiMC4xMC4wXCJ9YFxuICAgICAgfVxuICAgIH0sXG4gICAgYXV0aDoge1xuICAgICAgc3RvcmFnZTogbmV3IE5leHRSb3V0ZUhhbmRsZXJBdXRoU3RvcmFnZUFkYXB0ZXIoY29udGV4dCwgY29va2llT3B0aW9ucylcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBzcmMvc2VydmVyQWN0aW9uQ2xpZW50LnRzXG52YXIgY3JlYXRlU2VydmVyQWN0aW9uQ2xpZW50ID0gY3JlYXRlUm91dGVIYW5kbGVyQ2xpZW50O1xuXG4vLyBzcmMvZGVwcmVjYXRlZC50c1xuZnVuY3Rpb24gY3JlYXRlQnJvd3NlclN1cGFiYXNlQ2xpZW50KHtcbiAgc3VwYWJhc2VVcmwgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9VUkwsXG4gIHN1cGFiYXNlS2V5ID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfU1VQQUJBU0VfQU5PTl9LRVksXG4gIG9wdGlvbnMsXG4gIGNvb2tpZU9wdGlvbnNcbn0gPSB7fSkge1xuICBjb25zb2xlLndhcm4oXG4gICAgXCJQbGVhc2UgdXRpbGl6ZSB0aGUgYGNyZWF0ZVBhZ2VzQnJvd3NlckNsaWVudGAgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgZGVwcmVjYXRlZCBgY3JlYXRlQnJvd3NlclN1cGFiYXNlQ2xpZW50YCBmdW5jdGlvbi4gTGVhcm4gbW9yZTogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9ndWlkZXMvYXV0aC9hdXRoLWhlbHBlcnMvbmV4dGpzLXBhZ2VzXCJcbiAgKTtcbiAgcmV0dXJuIGNyZWF0ZVBhZ2VzQnJvd3NlckNsaWVudCh7XG4gICAgc3VwYWJhc2VVcmwsXG4gICAgc3VwYWJhc2VLZXksXG4gICAgb3B0aW9ucyxcbiAgICBjb29raWVPcHRpb25zXG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlU2VydmVyU3VwYWJhc2VDbGllbnQoY29udGV4dCwge1xuICBzdXBhYmFzZVVybCA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCxcbiAgc3VwYWJhc2VLZXkgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSxcbiAgb3B0aW9ucyxcbiAgY29va2llT3B0aW9uc1xufSA9IHt9KSB7XG4gIGNvbnNvbGUud2FybihcbiAgICBcIlBsZWFzZSB1dGlsaXplIHRoZSBgY3JlYXRlUGFnZXNTZXJ2ZXJDbGllbnRgIGZ1bmN0aW9uIGluc3RlYWQgb2YgdGhlIGRlcHJlY2F0ZWQgYGNyZWF0ZVNlcnZlclN1cGFiYXNlQ2xpZW50YCBmdW5jdGlvbi4gTGVhcm4gbW9yZTogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9ndWlkZXMvYXV0aC9hdXRoLWhlbHBlcnMvbmV4dGpzLXBhZ2VzXCJcbiAgKTtcbiAgcmV0dXJuIGNyZWF0ZVBhZ2VzU2VydmVyQ2xpZW50KGNvbnRleHQsIHtcbiAgICBzdXBhYmFzZVVybCxcbiAgICBzdXBhYmFzZUtleSxcbiAgICBvcHRpb25zLFxuICAgIGNvb2tpZU9wdGlvbnNcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVNaWRkbGV3YXJlU3VwYWJhc2VDbGllbnQoY29udGV4dCwge1xuICBzdXBhYmFzZVVybCA9IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1NVUEFCQVNFX1VSTCxcbiAgc3VwYWJhc2VLZXkgPSBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSxcbiAgb3B0aW9ucyxcbiAgY29va2llT3B0aW9uc1xufSA9IHt9KSB7XG4gIGNvbnNvbGUud2FybihcbiAgICBcIlBsZWFzZSB1dGlsaXplIHRoZSBgY3JlYXRlTWlkZGxld2FyZUNsaWVudGAgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgZGVwcmVjYXRlZCBgY3JlYXRlTWlkZGxld2FyZVN1cGFiYXNlQ2xpZW50YCBmdW5jdGlvbi4gTGVhcm4gbW9yZTogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9ndWlkZXMvYXV0aC9hdXRoLWhlbHBlcnMvbmV4dGpzI21pZGRsZXdhcmVcIlxuICApO1xuICByZXR1cm4gY3JlYXRlTWlkZGxld2FyZUNsaWVudChjb250ZXh0LCB7XG4gICAgc3VwYWJhc2VVcmwsXG4gICAgc3VwYWJhc2VLZXksXG4gICAgb3B0aW9ucyxcbiAgICBjb29raWVPcHRpb25zXG4gIH0pO1xufVxuLy8gQW5ub3RhdGUgdGhlIENvbW1vbkpTIGV4cG9ydCBuYW1lcyBmb3IgRVNNIGltcG9ydCBpbiBub2RlOlxuMCAmJiAobW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZUJyb3dzZXJTdXBhYmFzZUNsaWVudCxcbiAgY3JlYXRlQ2xpZW50Q29tcG9uZW50Q2xpZW50LFxuICBjcmVhdGVNaWRkbGV3YXJlQ2xpZW50LFxuICBjcmVhdGVNaWRkbGV3YXJlU3VwYWJhc2VDbGllbnQsXG4gIGNyZWF0ZVBhZ2VzQnJvd3NlckNsaWVudCxcbiAgY3JlYXRlUGFnZXNTZXJ2ZXJDbGllbnQsXG4gIGNyZWF0ZVJvdXRlSGFuZGxlckNsaWVudCxcbiAgY3JlYXRlU2VydmVyQWN0aW9uQ2xpZW50LFxuICBjcmVhdGVTZXJ2ZXJDb21wb25lbnRDbGllbnQsXG4gIGNyZWF0ZVNlcnZlclN1cGFiYXNlQ2xpZW50XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJuYW1lcyI6WyJfX2RlZlByb3AiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIl9fZ2V0T3duUHJvcERlc2MiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfX2dldE93blByb3BOYW1lcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJfX2hhc093blByb3AiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsIl9fZXhwb3J0IiwidGFyZ2V0IiwiYWxsIiwibmFtZSIsImdldCIsImVudW1lcmFibGUiLCJfX2NvcHlQcm9wcyIsInRvIiwiZnJvbSIsImV4Y2VwdCIsImRlc2MiLCJrZXkiLCJjYWxsIiwiX190b0NvbW1vbkpTIiwibW9kIiwidmFsdWUiLCJzcmNfZXhwb3J0cyIsImNyZWF0ZUJyb3dzZXJTdXBhYmFzZUNsaWVudCIsImNyZWF0ZUNsaWVudENvbXBvbmVudENsaWVudCIsImNyZWF0ZU1pZGRsZXdhcmVDbGllbnQiLCJjcmVhdGVNaWRkbGV3YXJlU3VwYWJhc2VDbGllbnQiLCJjcmVhdGVQYWdlc0Jyb3dzZXJDbGllbnQiLCJjcmVhdGVQYWdlc1NlcnZlckNsaWVudCIsImNyZWF0ZVJvdXRlSGFuZGxlckNsaWVudCIsImNyZWF0ZVNlcnZlckFjdGlvbkNsaWVudCIsImNyZWF0ZVNlcnZlckNvbXBvbmVudENsaWVudCIsImNyZWF0ZVNlcnZlclN1cGFiYXNlQ2xpZW50IiwibW9kdWxlIiwiZXhwb3J0cyIsImltcG9ydF9hdXRoX2hlbHBlcnNfc2hhcmVkIiwicmVxdWlyZSIsInN1cGFiYXNlIiwic3VwYWJhc2VVcmwiLCJwcm9jZXNzIiwiZW52IiwiTkVYVF9QVUJMSUNfU1VQQUJBU0VfVVJMIiwic3VwYWJhc2VLZXkiLCJORVhUX1BVQkxJQ19TVVBBQkFTRV9BTk9OX0tFWSIsIm9wdGlvbnMiLCJjb29raWVPcHRpb25zIiwiaXNTaW5nbGV0b24iLCJFcnJvciIsImNyZWF0ZU5ld0NsaWVudCIsIl9hIiwiY3JlYXRlU3VwYWJhc2VDbGllbnQiLCJnbG9iYWwiLCJoZWFkZXJzIiwiYXV0aCIsInN0b3JhZ2UiLCJCcm93c2VyQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIiwiX3N1cGFiYXNlIiwiaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQyIiwiaW1wb3J0X3NldF9jb29raWVfcGFyc2VyIiwiTmV4dFNlcnZlckF1dGhTdG9yYWdlQWRhcHRlciIsIkNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlciIsImNvbnN0cnVjdG9yIiwiY29udGV4dCIsImdldENvb2tpZSIsIl9iIiwiX2MiLCJzZXRDb29raWUiLCJzcGxpdENvb2tpZXNTdHJpbmciLCJyZXMiLCJnZXRIZWFkZXIiLCJ0b1N0cmluZyIsIm1hcCIsImMiLCJwYXJzZUNvb2tpZXMiLCJmaW5kIiwicmVxIiwiY29va2llcyIsIl9zZXRDb29raWUiLCJkZWxldGVDb29raWUiLCJtYXhBZ2UiLCJzZXRDb29raWVzIiwiZmlsdGVyIiwiY29va2llU3RyIiwic2VyaWFsaXplQ29va2llIiwiaHR0cE9ubHkiLCJzZXRIZWFkZXIiLCJpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDMiLCJpbXBvcnRfc2V0X2Nvb2tpZV9wYXJzZXIyIiwiTmV4dE1pZGRsZXdhcmVBdXRoU3RvcmFnZUFkYXB0ZXIiLCJuZXdTZXNzaW9uU3RyIiwiYXBwZW5kIiwiaW1wb3J0X2F1dGhfaGVscGVyc19zaGFyZWQ0IiwiTmV4dFNlcnZlckNvbXBvbmVudEF1dGhTdG9yYWdlQWRhcHRlciIsImlzU2VydmVyIiwibmV4dENvb2tpZXMiLCJpbXBvcnRfYXV0aF9oZWxwZXJzX3NoYXJlZDUiLCJOZXh0Um91dGVIYW5kbGVyQXV0aFN0b3JhZ2VBZGFwdGVyIiwic2V0IiwiY29uc29sZSIsIndhcm4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-helpers-nextjs/dist/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n\nconst AuthAdminApi = _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AuthAdminApi); //# sourceMappingURL=AuthAdminApi.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9BdXRoQWRtaW5BcGkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBOEM7QUFDOUMsTUFBTUMsZUFBZUQsdURBQWNBO0FBQ25DLGlFQUFlQyxZQUFZQSxFQUFDLENBQzVCLHdDQUF3QyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9BdXRoQWRtaW5BcGkuanM/MjA2MSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR29UcnVlQWRtaW5BcGkgZnJvbSAnLi9Hb1RydWVBZG1pbkFwaSc7XG5jb25zdCBBdXRoQWRtaW5BcGkgPSBHb1RydWVBZG1pbkFwaTtcbmV4cG9ydCBkZWZhdWx0IEF1dGhBZG1pbkFwaTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF1dGhBZG1pbkFwaS5qcy5tYXAiXSwibmFtZXMiOlsiR29UcnVlQWRtaW5BcGkiLCJBdXRoQWRtaW5BcGkiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n\nconst AuthAdminApi = _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AuthAdminApi); //# sourceMappingURL=AuthAdminApi.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvQXV0aEFkbWluQXBpLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQThDO0FBQzlDLE1BQU1DLGVBQWVELHVEQUFjQTtBQUNuQyxpRUFBZUMsWUFBWUEsRUFBQyxDQUM1Qix3Q0FBd0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvQXV0aEFkbWluQXBpLmpzPzIwNjEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEdvVHJ1ZUFkbWluQXBpIGZyb20gJy4vR29UcnVlQWRtaW5BcGknO1xuY29uc3QgQXV0aEFkbWluQXBpID0gR29UcnVlQWRtaW5BcGk7XG5leHBvcnQgZGVmYXVsdCBBdXRoQWRtaW5BcGk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdXRoQWRtaW5BcGkuanMubWFwIl0sIm5hbWVzIjpbIkdvVHJ1ZUFkbWluQXBpIiwiQXV0aEFkbWluQXBpIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/AuthClient.js ***!
|
||
\******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _GoTrueClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueClient */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\");\n\nconst AuthClient = _GoTrueClient__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AuthClient); //# sourceMappingURL=AuthClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9BdXRoQ2xpZW50LmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQTBDO0FBQzFDLE1BQU1DLGFBQWFELHFEQUFZQTtBQUMvQixpRUFBZUMsVUFBVUEsRUFBQyxDQUMxQixzQ0FBc0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvQXV0aENsaWVudC5qcz80ZjhmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHb1RydWVDbGllbnQgZnJvbSAnLi9Hb1RydWVDbGllbnQnO1xuY29uc3QgQXV0aENsaWVudCA9IEdvVHJ1ZUNsaWVudDtcbmV4cG9ydCBkZWZhdWx0IEF1dGhDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BdXRoQ2xpZW50LmpzLm1hcCJdLCJuYW1lcyI6WyJHb1RydWVDbGllbnQiLCJBdXRoQ2xpZW50Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/AuthClient.js ***!
|
||
\******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _GoTrueClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueClient */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\");\n\nconst AuthClient = _GoTrueClient__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AuthClient); //# sourceMappingURL=AuthClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvQXV0aENsaWVudC5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUEwQztBQUMxQyxNQUFNQyxhQUFhRCxxREFBWUE7QUFDL0IsaUVBQWVDLFVBQVVBLEVBQUMsQ0FDMUIsc0NBQXNDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL0F1dGhDbGllbnQuanM/NGY4ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR29UcnVlQ2xpZW50IGZyb20gJy4vR29UcnVlQ2xpZW50JztcbmNvbnN0IEF1dGhDbGllbnQgPSBHb1RydWVDbGllbnQ7XG5leHBvcnQgZGVmYXVsdCBBdXRoQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXV0aENsaWVudC5qcy5tYXAiXSwibmFtZXMiOlsiR29UcnVlQ2xpZW50IiwiQXV0aENsaWVudCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js":
|
||
/*!**********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js ***!
|
||
\**********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ GoTrueAdminApi)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tslib */ \"(action-browser)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _lib_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/fetch */ \"(action-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 */ \"(action-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 */ \"(action-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 */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n\n\n\n\n\nclass GoTrueAdminApi {\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 /**\n * Removes a logged-in session.\n * @param jwt A valid, logged-in JWT.\n * @param scope The logout sope.\n */ async signOut(jwt, scope = _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 ${_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\", `${this.url}/logout?scope=${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, options = {}) {\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"POST\", `${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\", `${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\", `${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\", `${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[`${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\", `${this.url}/admin/users/${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\", `${this.url}/admin/users/${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, shouldSoftDelete = 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\", `${this.url}/admin/users/${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\", `${this.url}/admin/users/${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\", `${this.url}/admin/users/${params.userId}/factors/${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\", `${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[`${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\", `${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\", `${this.url}/admin/oauth/clients/${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\", `${this.url}/admin/oauth/clients/${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\", `${this.url}/admin/oauth/clients/${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\", `${this.url}/admin/oauth/clients/${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} //# sourceMappingURL=GoTrueAdminApi.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9Hb1RydWVBZG1pbkFwaS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBK0I7QUFDdUU7QUFDM0M7QUFDWjtBQUNKO0FBQzVCLE1BQU1TO0lBQ2pCOzs7Ozs7Ozs7Ozs7S0FZQyxHQUNEQyxZQUFZLEVBQUVDLE1BQU0sRUFBRSxFQUFFQyxVQUFVLENBQUMsQ0FBQyxFQUFFQyxLQUFLLEVBQUcsQ0FBRTtRQUM1QyxJQUFJLENBQUNGLEdBQUcsR0FBR0E7UUFDWCxJQUFJLENBQUNDLE9BQU8sR0FBR0E7UUFDZixJQUFJLENBQUNDLEtBQUssR0FBR1IsMERBQVlBLENBQUNRO1FBQzFCLElBQUksQ0FBQ0MsR0FBRyxHQUFHO1lBQ1BDLGFBQWEsSUFBSSxDQUFDQyxZQUFZLENBQUNDLElBQUksQ0FBQyxJQUFJO1lBQ3hDQyxjQUFjLElBQUksQ0FBQ0MsYUFBYSxDQUFDRixJQUFJLENBQUMsSUFBSTtRQUM5QztRQUNBLElBQUksQ0FBQ0csS0FBSyxHQUFHO1lBQ1RDLGFBQWEsSUFBSSxDQUFDQyxpQkFBaUIsQ0FBQ0wsSUFBSSxDQUFDLElBQUk7WUFDN0NNLGNBQWMsSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQ1AsSUFBSSxDQUFDLElBQUk7WUFDL0NRLFdBQVcsSUFBSSxDQUFDQyxlQUFlLENBQUNULElBQUksQ0FBQyxJQUFJO1lBQ3pDVSxjQUFjLElBQUksQ0FBQ0Msa0JBQWtCLENBQUNYLElBQUksQ0FBQyxJQUFJO1lBQy9DWSxjQUFjLElBQUksQ0FBQ0Msa0JBQWtCLENBQUNiLElBQUksQ0FBQyxJQUFJO1lBQy9DYyx3QkFBd0IsSUFBSSxDQUFDQyw0QkFBNEIsQ0FBQ2YsSUFBSSxDQUFDLElBQUk7UUFDdkU7SUFDSjtJQUNBOzs7O0tBSUMsR0FDRCxNQUFNZ0IsUUFBUUMsR0FBRyxFQUFFQyxRQUFRNUIsdURBQWUsQ0FBQyxFQUFFLEVBQUU7UUFDM0MsSUFB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QUFRO2dCQUNwQixPQUFPO29CQUFFRCxNQUFNO29CQUFNQztnQkFBTTtZQUMvQjtZQUNBLE1BQU1BO1FBQ1Y7SUFDSjtJQUNBOzs7OztLQUtDLEdBQ0QsTUFBTVQsNkJBQTZCcUUsUUFBUSxFQUFFO1FBQ3pDLElBQUk7WUFDQSxPQUFPLE1BQU1sRyxvREFBUUEsQ0FBQyxJQUFJLENBQUNVLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUNGLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRTBGLFNBQVMsa0JBQWtCLENBQUMsRUFBRTtnQkFDdkd6RixTQUFTLElBQUksQ0FBQ0EsT0FBTztnQkFDckJtQyxPQUFPLENBQUNxRDtvQkFDSixPQUFPO3dCQUFFNUQsTUFBTTREO3dCQUFRM0QsT0FBTztvQkFBSztnQkFDdkM7WUFDSjtRQUNKLEVBQ0EsT0FBT0EsT0FBTztZQUNWLElBQUlqQyx3REFBV0EsQ0FBQ2lDLFFBQVE7Z0JBQ3BCLE9BQU87b0JBQUVELE1BQU07b0JBQU1DO2dCQUFNO1lBQy9CO1lBQ0EsTUFBTUE7UUFDVjtJQUNKO0FBQ0osRUFDQSwwQ0FBMEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvR29UcnVlQWRtaW5BcGkuanM/NGEwOCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IF9nZW5lcmF0ZUxpbmtSZXNwb25zZSwgX25vUmVzb2x2ZUpzb25SZXNwb25zZSwgX3JlcXVlc3QsIF91c2VyUmVzcG9uc2UsIH0gZnJvbSAnLi9saWIvZmV0Y2gnO1xuaW1wb3J0IHsgcmVzb2x2ZUZldGNoLCB2YWxpZGF0ZVVVSUQgfSBmcm9tICcuL2xpYi9oZWxwZXJzJztcbmltcG9ydCB7IFNJR05fT1VUX1NDT1BFUywgfSBmcm9tICcuL2xpYi90eXBlcyc7XG5pbXBvcnQgeyBpc0F1dGhFcnJvciB9IGZyb20gJy4vbGliL2Vycm9ycyc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHb1RydWVBZG1pbkFwaSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhZG1pbiBBUEkgY2xpZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIHVzZXJzIGFuZCBPQXV0aCBjbGllbnRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IEdvVHJ1ZUFkbWluQXBpIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gICAgICpcbiAgICAgKiBjb25zdCBhZG1pbiA9IG5ldyBHb1RydWVBZG1pbkFwaSh7XG4gICAgICogICB1cmw6ICdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vYXV0aC92MScsXG4gICAgICogICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtwcm9jZXNzLmVudi5TVVBBQkFTRV9TRVJWSUNFX1JPTEVfS0VZfWAgfSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHsgdXJsID0gJycsIGhlYWRlcnMgPSB7fSwgZmV0Y2gsIH0pIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHRoaXMuZmV0Y2ggPSByZXNvbHZlRmV0Y2goZmV0Y2gpO1xuICAgICAgICB0aGlzLm1mYSA9IHtcbiAgICAgICAgICAgIGxpc3RGYWN0b3JzOiB0aGlzLl9saXN0RmFjdG9ycy5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZGVsZXRlRmFjdG9yOiB0aGlzLl9kZWxldGVGYWN0b3IuYmluZCh0aGlzKSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vYXV0aCA9IHtcbiAgICAgICAgICAgIGxpc3RDbGllbnRzOiB0aGlzLl9saXN0T0F1dGhDbGllbnRzLmJpbmQodGhpcyksXG4gICAgICAgICAgICBjcmVhdGVDbGllbnQ6IHRoaXMuX2NyZWF0ZU9BdXRoQ2xpZW50LmJpbmQodGhpcyksXG4gICAgICAgICAgICBnZXRDbGllbnQ6IHRoaXMuX2dldE9BdXRoQ2xpZW50LmJpbmQodGhpcyksXG4gICAgICAgICAgICB1cGRhdGVDbGllbnQ6IHRoaXMuX3VwZGF0ZU9BdXRoQ2xpZW50LmJpbmQodGhpcyksXG4gICAgICAgICAgICBkZWxldGVDbGllbnQ6IHRoaXMuX2RlbGV0ZU9BdXRoQ2xpZW50LmJpbmQodGhpcyksXG4gICAgICAgICAgICByZWdlbmVyYXRlQ2xpZW50U2VjcmV0OiB0aGlzLl9yZWdlbmVyYXRlT0F1dGhDbGllbnRTZWNyZXQuYmluZCh0aGlzKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGxvZ2dlZC1pbiBzZXNzaW9uLlxuICAgICAqIEBwYXJhbSBqd3QgQSB2YWxpZCwgbG9nZ2VkLWluIEpXVC5cbiAgICAgKiBAcGFyYW0gc2NvcGUgVGhlIGxvZ291dCBzb3BlLlxuICAgICAqL1xuICAgIGFzeW5jIHNpZ25PdXQoand0LCBzY29wZSA9IFNJR05fT1VUX1NDT1BFU1swXSkge1xuICAgICAgICBpZiAoU0lHTl9PVVRfU0NPUEVTLmluZGV4T2Yoc2NvcGUpIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogUGFyYW1ldGVyIHNjb3BlIG11c3QgYmUgb25lIG9mICR7U0lHTl9PVVRfU0NPUEVTLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L2xvZ291dD9zY29wZT0ke3Njb3BlfWAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgand0LFxuICAgICAgICAgICAgICAgIG5vUmVzb2x2ZUpzb246IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGFuIGludml0ZSBsaW5rIHRvIGFuIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHBhcmFtIGVtYWlsIFRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSB1c2VyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFkZGl0aW9uYWwgb3B0aW9ucyB0byBiZSBpbmNsdWRlZCB3aGVuIGludml0aW5nLlxuICAgICAqL1xuICAgIGFzeW5jIGludml0ZVVzZXJCeUVtYWlsKGVtYWlsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9pbnZpdGVgLCB7XG4gICAgICAgICAgICAgICAgYm9keTogeyBlbWFpbCwgZGF0YTogb3B0aW9ucy5kYXRhIH0sXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86IG9wdGlvbnMucmVkaXJlY3RUbyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3VzZXJSZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGVtYWlsIGxpbmtzIGFuZCBPVFBzIHRvIGJlIHNlbnQgdmlhIGEgY3VzdG9tIGVtYWlsIHByb3ZpZGVyLlxuICAgICAqIEBwYXJhbSBlbWFpbCBUaGUgdXNlcidzIGVtYWlsLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLnBhc3N3b3JkIFVzZXIgcGFzc3dvcmQuIEZvciBzaWdudXAgb25seS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5kYXRhIE9wdGlvbmFsIHVzZXIgbWV0YWRhdGEuIEZvciBzaWdudXAgb25seS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRpcmVjdFRvIFRoZSByZWRpcmVjdCB1cmwgd2hpY2ggc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBnZW5lcmF0ZWQgbGlua1xuICAgICAqL1xuICAgIGFzeW5jIGdlbmVyYXRlTGluayhwYXJhbXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyYW1zLCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wib3B0aW9uc1wiXSk7XG4gICAgICAgICAgICBjb25zdCBib2R5ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXN0KSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoJ25ld0VtYWlsJyBpbiByZXN0KSB7XG4gICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBuZXdFbWFpbCB3aXRoIG5ld19lbWFpbCBpbiByZXF1ZXN0IGJvZHlcbiAgICAgICAgICAgICAgICBib2R5Lm5ld19lbWFpbCA9IHJlc3QgPT09IG51bGwgfHwgcmVzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzdC5uZXdFbWFpbDtcbiAgICAgICAgICAgICAgICBkZWxldGUgYm9keVsnbmV3RW1haWwnXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9hZG1pbi9nZW5lcmF0ZV9saW5rYCwge1xuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfZ2VuZXJhdGVMaW5rUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RUbzogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJlZGlyZWN0VG8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFVzZXIgQWRtaW4gQVBJXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB1c2VyLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlVXNlcihhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vYWRtaW4vdXNlcnNgLCB7XG4gICAgICAgICAgICAgICAgYm9keTogYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IF91c2VyUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IG51bGwgfSwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgdXNlcnMuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqIEBwYXJhbSBwYXJhbXMgQW4gb2JqZWN0IHdoaWNoIHN1cHBvcnRzIGBwYWdlYCBhbmQgYHBlclBhZ2VgIGFzIG51bWJlcnMsIHRvIGFsdGVyIHRoZSBwYWdpbmF0ZWQgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0VXNlcnMocGFyYW1zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2luYXRpb24gPSB7IG5leHRQYWdlOiBudWxsLCBsYXN0UGFnZTogMCwgdG90YWw6IDAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0dFVCcsIGAke3RoaXMudXJsfS9hZG1pbi91c2Vyc2AsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgbm9SZXNvbHZlSnNvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgICAgICAgICBwYWdlOiAoX2IgPSAoX2EgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMucGFnZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBwZXJfcGFnZTogKF9kID0gKF9jID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBlclBhZ2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50b1N0cmluZygpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfbm9SZXNvbHZlSnNvblJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2UuZXJyb3I7XG4gICAgICAgICAgICBjb25zdCB1c2VycyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gKF9lID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtdG90YWwtY291bnQnKSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtzID0gKF9nID0gKF9mID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2xpbmsnKSkgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLnNwbGl0KCcsJykpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IFtdO1xuICAgICAgICAgICAgaWYgKGxpbmtzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBwYXJzZUludChsaW5rLnNwbGl0KCc7JylbMF0uc3BsaXQoJz0nKVsxXS5zdWJzdHJpbmcoMCwgMSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWwgPSBKU09OLnBhcnNlKGxpbmsuc3BsaXQoJzsnKVsxXS5zcGxpdCgnPScpWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgcGFnaW5hdGlvbltgJHtyZWx9UGFnZWBdID0gcGFnZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBwYWdpbmF0aW9uLnRvdGFsID0gcGFyc2VJbnQodG90YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB1c2VycyksIHBhZ2luYXRpb24pLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcnM6IFtdIH0sIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdXNlciBieSBpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1aWQgVGhlIHVzZXIncyB1bmlxdWUgaWRlbnRpZmllclxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRVc2VyQnlJZCh1aWQpIHtcbiAgICAgICAgdmFsaWRhdGVVVUlEKHVpZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0dFVCcsIGAke3RoaXMudXJsfS9hZG1pbi91c2Vycy8ke3VpZH1gLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfdXNlclJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBudWxsIH0sIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSB1c2VyIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgZGF0YSB5b3Ugd2FudCB0byB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVVzZXJCeUlkKHVpZCwgYXR0cmlidXRlcykge1xuICAgICAgICB2YWxpZGF0ZVVVSUQodWlkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUFVUJywgYCR7dGhpcy51cmx9L2FkbWluL3VzZXJzLyR7dWlkfWAsIHtcbiAgICAgICAgICAgICAgICBib2R5OiBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3VzZXJSZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEgdXNlci4gUmVxdWlyZXMgYSBgc2VydmljZV9yb2xlYCBrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgVGhlIHVzZXIgaWQgeW91IHdhbnQgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSBzaG91bGRTb2Z0RGVsZXRlIElmIHRydWUsIHRoZW4gdGhlIHVzZXIgd2lsbCBiZSBzb2Z0LWRlbGV0ZWQgZnJvbSB0aGUgYXV0aCBzY2hlbWEuIFNvZnQgZGVsZXRpb24gYWxsb3dzIHVzZXIgaWRlbnRpZmljYXRpb24gZnJvbSB0aGUgaGFzaGVkIHVzZXIgSUQgYnV0IGlzIG5vdCByZXZlcnNpYmxlLlxuICAgICAqIERlZmF1bHRzIHRvIGZhbHNlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVVc2VyKGlkLCBzaG91bGRTb2Z0RGVsZXRlID0gZmFsc2UpIHtcbiAgICAgICAgdmFsaWRhdGVVVUlEKGlkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnREVMRVRFJywgYCR7dGhpcy51cmx9L2FkbWluL3VzZXJzLyR7aWR9YCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgIHNob3VsZF9zb2Z0X2RlbGV0ZTogc2hvdWxkU29mdERlbGV0ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfdXNlclJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBudWxsIH0sIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfbGlzdEZhY3RvcnMocGFyYW1zKSB7XG4gICAgICAgIHZhbGlkYXRlVVVJRChwYXJhbXMudXNlcklkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vYWRtaW4vdXNlcnMvJHtwYXJhbXMudXNlcklkfS9mYWN0b3JzYCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogKGZhY3RvcnMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyBmYWN0b3JzIH0sIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgZXJyb3IgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX2RlbGV0ZUZhY3RvcihwYXJhbXMpIHtcbiAgICAgICAgdmFsaWRhdGVVVUlEKHBhcmFtcy51c2VySWQpO1xuICAgICAgICB2YWxpZGF0ZVVVSUQocGFyYW1zLmlkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnREVMRVRFJywgYCR7dGhpcy51cmx9L2FkbWluL3VzZXJzLyR7cGFyYW1zLnVzZXJJZH0vZmFjdG9ycy8ke3BhcmFtcy5pZH1gLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0cyBhbGwgT0F1dGggY2xpZW50cyB3aXRoIG9wdGlvbmFsIHBhZ2luYXRpb24uXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHRoZSBPQXV0aCAyLjEgc2VydmVyIGlzIGVuYWJsZWQgaW4gU3VwYWJhc2UgQXV0aC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgX2xpc3RPQXV0aENsaWVudHMocGFyYW1zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2luYXRpb24gPSB7IG5leHRQYWdlOiBudWxsLCBsYXN0UGFnZTogMCwgdG90YWw6IDAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0dFVCcsIGAke3RoaXMudXJsfS9hZG1pbi9vYXV0aC9jbGllbnRzYCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBub1Jlc29sdmVKc29uOiB0cnVlLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IChfYiA9IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wYWdlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudG9TdHJpbmcoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJycsXG4gICAgICAgICAgICAgICAgICAgIHBlcl9wYWdlOiAoX2QgPSAoX2MgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMucGVyUGFnZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnRvU3RyaW5nKCkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICcnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeGZvcm06IF9ub1Jlc29sdmVKc29uUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvcilcbiAgICAgICAgICAgICAgICB0aHJvdyByZXNwb25zZS5lcnJvcjtcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudHMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbCA9IChfZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXRvdGFsLWNvdW50JykpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgICAgICBjb25zdCBsaW5rcyA9IChfZyA9IChfZiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdsaW5rJykpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5zcGxpdCgnLCcpKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBbXTtcbiAgICAgICAgICAgIGlmIChsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gcGFyc2VJbnQobGluay5zcGxpdCgnOycpWzBdLnNwbGl0KCc9JylbMV0uc3Vic3RyaW5nKDAsIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsID0gSlNPTi5wYXJzZShsaW5rLnNwbGl0KCc7JylbMV0uc3BsaXQoJz0nKVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2luYXRpb25bYCR7cmVsfVBhZ2VgXSA9IHBhZ2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGFnaW5hdGlvbi50b3RhbCA9IHBhcnNlSW50KHRvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2xpZW50cyksIHBhZ2luYXRpb24pLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgY2xpZW50czogW10gfSwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgT0F1dGggY2xpZW50LlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIF9jcmVhdGVPQXV0aENsaWVudChwYXJhbXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9hZG1pbi9vYXV0aC9jbGllbnRzYCwge1xuICAgICAgICAgICAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IChjbGllbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogY2xpZW50LCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBkZXRhaWxzIG9mIGEgc3BlY2lmaWMgT0F1dGggY2xpZW50LlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIF9nZXRPQXV0aENsaWVudChjbGllbnRJZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vYWRtaW4vb2F1dGgvY2xpZW50cy8ke2NsaWVudElkfWAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IChjbGllbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogY2xpZW50LCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhbiBleGlzdGluZyBPQXV0aCBjbGllbnQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHRoZSBPQXV0aCAyLjEgc2VydmVyIGlzIGVuYWJsZWQgaW4gU3VwYWJhc2UgQXV0aC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgX3VwZGF0ZU9BdXRoQ2xpZW50KGNsaWVudElkLCBwYXJhbXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUFVUJywgYCR7dGhpcy51cmx9L2FkbWluL29hdXRoL2NsaWVudHMvJHtjbGllbnRJZH1gLCB7XG4gICAgICAgICAgICAgICAgYm9keTogcGFyYW1zLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogKGNsaWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBjbGllbnQsIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGFuIE9BdXRoIGNsaWVudC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBfZGVsZXRlT0F1dGhDbGllbnQoY2xpZW50SWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdERUxFVEUnLCBgJHt0aGlzLnVybH0vYWRtaW4vb2F1dGgvY2xpZW50cy8ke2NsaWVudElkfWAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgbm9SZXNvbHZlSnNvbjogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnZW5lcmF0ZXMgdGhlIHNlY3JldCBmb3IgYW4gT0F1dGggY2xpZW50LlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIF9yZWdlbmVyYXRlT0F1dGhDbGllbnRTZWNyZXQoY2xpZW50SWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9hZG1pbi9vYXV0aC9jbGllbnRzLyR7Y2xpZW50SWR9L3JlZ2VuZXJhdGVfc2VjcmV0YCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogKGNsaWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBjbGllbnQsIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdvVHJ1ZUFkbWluQXBpLmpzLm1hcCJdLCJuYW1lcyI6WyJfX3Jlc3QiLCJfZ2VuZXJhdGVMaW5rUmVzcG9uc2UiLCJfbm9SZXNvbHZlSnNvblJlc3BvbnNlIiwiX3JlcXVlc3QiLCJfdXNlclJlc3BvbnNlIiwicmVzb2x2ZUZldGNoIiwidmFsaWRhdGVVVUlEIiwiU0lHTl9PVVRfU0NPUEVTIiwiaXNBdXRoRXJyb3IiLCJHb1RydWVBZG1pbkFwaSIsImNvbnN0cnVjdG9yIiwidXJsIiwiaGVhZGVycyIsImZldGNoIiwibWZhIiwibGlzdEZhY3RvcnMiLCJfbGlzdEZhY3RvcnMiLCJiaW5kIiwiZGVsZXRlRmFjdG9yIiwiX2RlbGV0ZUZhY3RvciIsIm9hdXRoIiwibGlzdENsaWVudHMiLCJfbGlzdE9BdXRoQ2xpZW50cyIsImNyZWF0ZUNsaWVudCIsIl9jcmVhdGVPQXV0aENsaWVudCIsImdldENsaWVudCIsIl9nZXRPQXV0aENsaWVudCIsInVwZGF0ZUNsaWVudCIsIl91cGRhdGVPQXV0aENsaWVudCIsImRlbGV0ZUNsaWVudCIsIl9kZWxldGVPQXV0aENsaWVudCIsInJlZ2VuZXJhdGVDbGllbnRTZWNyZXQiLCJfcmVnZW5lcmF0ZU9BdXRoQ2xpZW50U2VjcmV0Iiwic2lnbk91dCIsImp3dCIsInNjb3BlIiwiaW5kZXhPZiIsIkVycm9yIiwiam9pbiIsIm5vUmVzb2x2ZUpzb24iLCJkYXRhIiwiZXJyb3IiLCJpbnZpdGVVc2VyQnlFbWFpbCIsImVtYWlsIiwib3B0aW9ucyIsImJvZHkiLCJyZWRpcmVjdFRvIiwieGZvcm0iLCJ1c2VyIiwiZ2VuZXJhdGVMaW5rIiwicGFyYW1zIiwicmVzdCIsIk9iamVjdCIsImFzc2lnbiIsIm5ld19lbWFpbCIsIm5ld0VtYWlsIiwicHJvcGVydGllcyIsImNyZWF0ZVVzZXIiLCJhdHRyaWJ1dGVzIiwibGlzdFVzZXJzIiwiX2EiLCJfYiIsIl9jIiwiX2QiLCJfZSIsIl9mIiwiX2ciLCJwYWdpbmF0aW9uIiwibmV4dFBhZ2UiLCJsYXN0UGFnZSIsInRvdGFsIiwicmVzcG9uc2UiLCJxdWVyeSIsInBhZ2UiLCJ0b1N0cmluZyIsInBlcl9wYWdlIiwicGVyUGFnZSIsInVzZXJzIiwianNvbiIsImdldCIsImxpbmtzIiwic3BsaXQiLCJsZW5ndGgiLCJmb3JFYWNoIiwibGluayIsInBhcnNlSW50Iiwic3Vic3RyaW5nIiwicmVsIiwiSlNPTiIsInBhcnNlIiwiZ2V0VXNlckJ5SWQiLCJ1aWQiLCJ1cGRhdGVVc2VyQnlJZCIsImRlbGV0ZVVzZXIiLCJpZCIsInNob3VsZFNvZnREZWxldGUiLCJzaG91bGRfc29mdF9kZWxldGUiLCJ1c2VySWQiLCJmYWN0b3JzIiwiY2xpZW50cyIsImNsaWVudCIsImNsaWVudElkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js":
|
||
/*!**********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js ***!
|
||
\**********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ GoTrueAdminApi)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tslib */ \"(rsc)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _lib_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/fetch */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js\");\n/* harmony import */ var _lib_helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/helpers */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n/* harmony import */ var _lib_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/types */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/types.js\");\n/* harmony import */ var _lib_errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/errors */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n\n\n\n\n\nclass GoTrueAdminApi {\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 /**\n * Removes a logged-in session.\n * @param jwt A valid, logged-in JWT.\n * @param scope The logout sope.\n */ async signOut(jwt, scope = _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 ${_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\", `${this.url}/logout?scope=${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, options = {}) {\n try {\n return await (0,_lib_fetch__WEBPACK_IMPORTED_MODULE_0__._request)(this.fetch, \"POST\", `${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\", `${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\", `${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\", `${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[`${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\", `${this.url}/admin/users/${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\", `${this.url}/admin/users/${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, shouldSoftDelete = 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\", `${this.url}/admin/users/${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\", `${this.url}/admin/users/${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\", `${this.url}/admin/users/${params.userId}/factors/${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\", `${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[`${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\", `${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\", `${this.url}/admin/oauth/clients/${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\", `${this.url}/admin/oauth/clients/${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\", `${this.url}/admin/oauth/clients/${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\", `${this.url}/admin/oauth/clients/${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} //# sourceMappingURL=GoTrueAdminApi.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvR29UcnVlQWRtaW5BcGkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQStCO0FBQ3VFO0FBQzNDO0FBQ1o7QUFDSjtBQUM1QixNQUFNUztJQUNqQjs7Ozs7Ozs7Ozs7O0tBWUMsR0FDREMsWUFBWSxFQUFFQyxNQUFNLEVBQUUsRUFBRUMsVUFBVSxDQUFDLENBQUMsRUFBRUMsS0FBSyxFQUFHLENBQUU7UUFDNUMsSUFBSSxDQUFDRixHQUFHLEdBQUdBO1FBQ1gsSUFBSSxDQUFDQyxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDQyxLQUFLLEdBQUdSLDBEQUFZQSxDQUFDUTtRQUMxQixJQUFJLENBQUNDLEdBQUcsR0FBRztZQUNQQyxhQUFhLElBQUksQ0FBQ0MsWUFBWSxDQUFDQyxJQUFJLENBQUMsSUFBSTtZQUN4Q0MsY0FBYyxJQUFJLENBQUNDLGFBQWEsQ0FBQ0YsSUFBSSxDQUFDLElBQUk7UUFDOUM7UUFDQSxJQUFJLENBQUNHLEtBQUssR0FBRztZQUNUQyxhQUFhLElBQUksQ0FBQ0MsaUJBQWlCLENBQUNMLElBQUksQ0FBQyxJQUFJO1lBQzdDTSxjQUFjLElBQUksQ0FBQ0Msa0JBQWtCLENBQUNQLElBQUksQ0FBQyxJQUFJO1lBQy9DUSxXQUFXLElBQUksQ0FBQ0MsZUFBZSxDQUFDVCxJQUFJLENBQUMsSUFBSTtZQUN6Q1UsY0FBYyxJQUFJLENBQUNDLGtCQUFrQixDQUFDWCxJQUFJLENBQUMsSUFBSTtZQUMvQ1ksY0FBYyxJQUFJLENBQUNDLGtCQUFrQixDQUFDYixJQUFJLENBQUMsSUFBSTtZQUMvQ2Msd0JBQXdCLElBQUksQ0FBQ0MsNEJBQTRCLENBQUNmLElBQUksQ0FBQyxJQUFJO1FBQ3ZFO0lBQ0o7SUFDQTs7OztLQUlDLEdBQ0QsTUFBTWdCLFFBQVFDLEdBQUcsRUFBRUMsUUFBUTVCLHVEQUFlLENBQUMsRUFBRSxFQUFFO1FBQzNDLElBQUlBLHVEQUFlQSxDQUFDNkIsT0FBTyxDQUFDRCxTQUFTLEdBQUc7WUFDcEMsTUFBTSxJQUFJRSxNQUFNLENBQUMsa0RBQWtELEVBQUU5Qix1REFBZUEsQ0FBQytCLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckc7UUFDQSxJQUFJO1lBQ0EsTUFBTW5DLG9EQUFRQSxDQUFDLElBQUksQ0FBQ1UsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQ0YsR0FBRyxDQUFDLGNBQWMsRUFBRXdCLE1BQU0sQ0FBQyxFQUFFO2dCQUNwRXZCLFNBQVMsSUFBSSxDQUFDQSxPQUFPO2dCQUNyQnNCO2dCQUNBSyxlQUFlO1lBQ25CO1lBQ0EsT0FBTztnQkFBRUMsTUFBTTtnQkFBTUMsT0FBTztZQUFLO1FBQ3JDLEVBQ0EsT0FBT0EsT0FBTztZQUNWLElBQUlqQyx3REFBV0EsQ0FBQ2lDLFFBQVE7Z0JBQ3BCLE9BQU87b0JBQUVELE1BQU07b0JBQU1DO2dCQUFNO1lBQy9CO1lBQ0EsTUFBTUE7UUFDVjtJQUNKO0lBQ0E7Ozs7S0FJQyxHQUNELE1BQU1DLGtCQUFrQkMsS0FBSyxFQUFFQyxVQUFVLENBQUMsQ0FBQyxFQUFFO1FBQ3pDLElBQUk7WUFDQSxPQUFPLE1BQU16QyxvREFBUUEsQ0FBQyxJQUFJLENBQUNVLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUNGLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDNURrQyxNQUFNO29CQUFFRjtvQkFBT0gsTUFBTUksUUFBUUosSUFBSTtnQkFBQztnQkFDbEM1QixTQUFTLElBQUksQ0FBQ0EsT0FBTztnQkFDckJrQyxZQUFZRixRQUFRRSxVQUFVO2dCQUM5QkMsT0FBTzNDLHFEQUFhQTtZQUN4QjtRQUNKLEVBQ0EsT0FBT3FDLE9BQU87WUFDVixJQUFJakMsd0RBQVdBLENBQUNpQyxRQUFRO2dCQUNwQixPQUFPO29CQUFFRCxNQUFNO3dCQUFFUSxNQUFNO29CQUFLO29CQUFHUDtnQkFBTTtZQUN6QztZQUNBLE1BQU1BO1FBQ1Y7SUFDSjtJQUNBOzs7Ozs7S0FNQyxHQUNELE1BQU1RLGFBQWFDLE1BQU0sRUFBRTtRQUN2QixJQUFJO1lBQ0EsTUFBTSxFQUFFTixPQUFPLEVBQUUsR0FBR00sUUFBUUMsT0FBT25ELDZDQUFNQSxDQUFDa0QsUUFBUTtnQkFBQzthQUFVO1lBQzdELE1BQU1MLE9BQU9PLE9BQU9DLE1BQU0sQ0FBQ0QsT0FBT0MsTUFBTSxDQUFDLENBQUMsR0FBR0YsT0FBT1A7WUFDcEQsSUFBSSxjQUFjTyxNQUFNO2dCQUNwQixrREFBa0Q7Z0JBQ2xETixLQUFLUyxTQUFTLEdBQUdILFNBQVMsUUFBUUEsU0FBUyxLQUFLLElBQUksS0FBSyxJQUFJQSxLQUFLSSxRQUFRO2dCQUMxRSxPQUFPVixJQUFJLENBQUMsV0FBVztZQUMzQjtZQUNBLE9BQU8sTUFBTTFDLG9EQUFRQSxDQUFDLElBQUksQ0FBQ1UsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQ0YsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7Z0JBQ3pFa0MsTUFBTUE7Z0JBQ05qQyxTQUFTLElBQUksQ0FBQ0EsT0FBTztnQkFDckJtQyxPQUFPOUMsNkRBQXFCQTtnQkFDNUI2QyxZQUFZRixZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUUUsVUFBVTtZQUNwRjtRQUNKLEVBQ0EsT0FBT0wsT0FBTztZQUNWLElBQUlqQyx3REFBV0EsQ0FBQ2lDLFFBQVE7Z0JBQ3BCLE9BQU87b0JBQ0hELE1BQU07d0JBQ0ZnQixZQUFZO3dCQUNaUixNQUFNO29CQUNWO29CQUNBUDtnQkFDSjtZQUNKO1lBQ0EsTUFBTUE7UUFDVjtJQUNKO0lBQ0EsaUJBQWlCO0lBQ2pCOzs7S0FHQyxHQUNELE1BQU1nQixXQUFXQyxVQUFVLEVBQUU7UUFDekIsSUFBSTtZQUNBLE9BQU8sTUFBTXZELG9EQUFRQSxDQUFDLElBQUksQ0FBQ1UsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQ0YsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNqRWtDLE1BQU1hO2dCQUNOOUMsU0FBUyxJQUFJLENBQUNBLE9BQU87Z0JBQ3JCbUMsT0FBTzNDLHFEQUFhQTtZQUN4QjtRQUNKLEVBQ0EsT0FBT3FDLE9BQU87WUFDVixJQUFJakMsd0RBQVdBLENBQUNpQyxRQUFRO2dCQUNwQixPQUFPO29CQUFFRCxNQUFNO3dCQUFFUSxNQUFNO29CQUFLO29CQUFHUDtnQkFBTTtZQUN6QztZQUNBLE1BQU1BO1FBQ1Y7SUFDSjtJQUNBOzs7OztLQUtDLEdBQ0QsTUFBTWtCLFVBQVVULE1BQU0sRUFBRTtRQUNwQixJQUFJVSxJQUFJQyxJQUFJQyxJQUFJQyxJQUFJQyxJQUFJQyxJQUFJQztRQUM1QixJQUFJO1lBQ0EsTUFBTUMsYUFBYTtnQkFBRUMsVUFBVTtnQkFBTUMsVUFBVTtnQkFBR0MsT0FBTztZQUFFO1lBQzNELE1BQU1DLFdBQVcsTUFBTXBFLG9EQUFRQSxDQUFDLElBQUksQ0FBQ1UsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQ0YsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMxRUMsU0FBUyxJQUFJLENBQUNBLE9BQU87Z0JBQ3JCMkIsZUFBZTtnQkFDZmlDLE9BQU87b0JBQ0hDLE1BQU0sQ0FBQ1osS0FBSyxDQUFDRCxLQUFLVixXQUFXLFFBQVFBLFdBQVcsS0FBSyxJQUFJLEtBQUssSUFBSUEsT0FBT3VCLElBQUksTUFBTSxRQUFRYixPQUFPLEtBQUssSUFBSSxLQUFLLElBQUlBLEdBQUdjLFFBQVEsRUFBQyxNQUFPLFFBQVFiLE9BQU8sS0FBSyxJQUFJQSxLQUFLO29CQUNwS2MsVUFBVSxDQUFDWixLQUFLLENBQUNELEtBQUtaLFdBQVcsUUFBUUEsV0FBVyxLQUFLLElBQUksS0FBSyxJQUFJQSxPQUFPMEIsT0FBTyxNQUFNLFFBQVFkLE9BQU8sS0FBSyxJQUFJLEtBQUssSUFBSUEsR0FBR1ksUUFBUSxFQUFDLE1BQU8sUUFBUVgsT0FBTyxLQUFLLElBQUlBLEtBQUs7Z0JBQy9LO2dCQUNBaEIsT0FBTzdDLDhEQUFzQkE7WUFDakM7WUFDQSxJQUFJcUUsU0FBUzlCLEtBQUssRUFDZCxNQUFNOEIsU0FBUzlCLEtBQUs7WUFDeEIsTUFBTW9DLFFBQVEsTUFBTU4sU0FBU08sSUFBSTtZQUNqQyxNQUFNUixRQUFRLENBQUNOLEtBQUtPLFNBQVMzRCxPQUFPLENBQUNtRSxHQUFHLENBQUMsZ0JBQWUsTUFBTyxRQUFRZixPQUFPLEtBQUssSUFBSUEsS0FBSztZQUM1RixNQUFNZ0IsUUFBUSxDQUFDZCxLQUFLLENBQUNELEtBQUtNLFNBQVMzRCxPQUFPLENBQUNtRSxHQUFHLENBQUMsT0FBTSxNQUFPLFFBQVFkLE9BQU8sS0FBSyxJQUFJLEtBQUssSUFBSUEsR0FBR2dCLEtBQUssQ0FBQyxJQUFHLE1BQU8sUUFBUWYsT0FBTyxLQUFLLElBQUlBLEtBQUssRUFBRTtZQUMvSSxJQUFJYyxNQUFNRSxNQUFNLEdBQUcsR0FBRztnQkFDbEJGLE1BQU1HLE9BQU8sQ0FBQyxDQUFDQztvQkFDWCxNQUFNWCxPQUFPWSxTQUFTRCxLQUFLSCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQ0EsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUNLLFNBQVMsQ0FBQyxHQUFHO29CQUNwRSxNQUFNQyxNQUFNQyxLQUFLQyxLQUFLLENBQUNMLEtBQUtILEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDQSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3ZEZCxVQUFVLENBQUMsQ0FBQyxFQUFFb0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHZDtnQkFDL0I7Z0JBQ0FOLFdBQVdHLEtBQUssR0FBR2UsU0FBU2Y7WUFDaEM7WUFDQSxPQUFPO2dCQUFFOUIsTUFBTVksT0FBT0MsTUFBTSxDQUFDRCxPQUFPQyxNQUFNLENBQUMsQ0FBQyxHQUFHd0IsUUFBUVY7Z0JBQWExQixPQUFPO1lBQUs7UUFDcEYsRUFDQSxPQUFPQSxPQUFPO1lBQ1YsSUFBSWpDLHdEQUFXQSxDQUFDaUMsUUFBUTtnQkFDcEIsT0FBTztvQkFBRUQsTUFBTTt3QkFBRXFDLE9BQU8sRUFBRTtvQkFBQztvQkFBR3BDO2dCQUFNO1lBQ3hDO1lBQ0EsTUFBTUE7UUFDVjtJQUNKO0lBQ0E7Ozs7OztLQU1DLEdBQ0QsTUFBTWlELFlBQVlDLEdBQUcsRUFBRTtRQUNuQnJGLDBEQUFZQSxDQUFDcUY7UUFDYixJQUFJO1lBQ0EsT0FBTyxNQUFNeEYsb0RBQVFBLENBQUMsSUFBSSxDQUFDVSxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDRixHQUFHLENBQUMsYUFBYSxFQUFFZ0YsSUFBSSxDQUFDLEVBQUU7Z0JBQ3ZFL0UsU0FBUyxJQUFJLENBQUNBLE9BQU87Z0JBQ3JCbUMsT0FBTzNDLHFEQUFhQTtZQUN4QjtRQUNKLEVBQ0EsT0FBT3FDLE9BQU87WUFDVixJQUFJakMsd0RBQVdBLENBQUNpQyxRQUFRO2dCQUNwQixPQUFPO29CQUFFRCxNQUFNO3dCQUFFUSxNQUFNO29CQUFLO29CQUFHUDtnQkFBTTtZQUN6QztZQUNBLE1BQU1BO1FBQ1Y7SUFDSjtJQUNBOzs7Ozs7S0FNQyxHQUNELE1BQU1tRCxlQUFlRCxHQUFHLEVBQUVqQyxVQUFVLEVBQUU7UUFDbENwRCwwREFBWUEsQ0FBQ3FGO1FBQ2IsSUFBSTtZQUNBLE9BQU8sTUFBTXhGLG9EQUFRQSxDQUFDLElBQUksQ0FBQ1UsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQ0YsR0FBRyxDQUFDLGFBQWEsRUFBRWdGLElBQUksQ0FBQyxFQUFFO2dCQUN2RTlDLE1BQU1hO2dCQUNOOUMsU0FBUyxJQUFJLENBQUNBLE9BQU87Z0JBQ3JCbUMsT0FBTzNDLHFEQUFhQTtZQUN4QjtRQUNKLEVBQ0EsT0FBT3FDLE9BQU87WUFDVixJQUFJakMsd0RBQVdBLENBQUNpQyxRQUFRO2dCQUNwQixPQUFPO29CQUFFRCxNQUFNO3dCQUFFUSxNQUFNO29CQUFLO29CQUFHUDtnQkFBTTtZQUN6QztZQUNBLE1BQU1BO1FBQ1Y7SUFDSjtJQUNBOzs7Ozs7OztLQVFDLEdBQ0QsTUFBTW9ELFdBQVdDLEVBQUUsRUFBRUMsbUJBQW1CLEtBQUssRUFBRTtRQUMzQ3pGLDBEQUFZQSxDQUFDd0Y7UUFDYixJQUFJO1lBQ0EsT0FBTyxNQUFNM0Ysb0RBQVFBLENBQUMsSUFBSSxDQUFDVSxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFDRixHQUFHLENBQUMsYUFBYSxFQUFFbUYsR0FBRyxDQUFDLEVBQUU7Z0JBQ3pFbEYsU0FBUyxJQUFJLENBQUNBLE9BQU87Z0JBQ3JCaUMsTUFBTTtvQkFDRm1ELG9CQUFvQkQ7Z0JBQ3hCO2dCQUNBaEQsT0FBTzNDLHFEQUFhQTtZQUN4QjtRQUNKLEVBQ0EsT0FBT3FDLE9BQU87WUFDVixJQUFJakMsd0RBQVdBLENBQUNpQyxRQUFRO2dCQUNwQixPQUFPO29CQUFFRCxNQUFNO3dCQUFFUSxNQUFNO29CQUFLO29CQUFHUDtnQkFBTTtZQUN6QztZQUNBLE1BQU1BO1FBQ1Y7SUFDSjtJQUNBLE1BQU16QixhQUFha0MsTUFBTSxFQUFFO1FBQ3ZCNUMsMERBQVlBLENBQUM0QyxPQUFPK0MsTUFBTTtRQUMxQixJQUFJO1lBQ0EsTUFBTSxFQUFFekQsSUFBSSxFQUFFQyxLQUFLLEVBQUUsR0FBRyxNQUFNdEMsb0RBQVFBLENBQUMsSUFBSSxDQUFDVSxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDRixHQUFHLENBQUMsYUFBYSxFQUFFdUMsT0FBTytDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDMUdyRixTQUFTLElBQUksQ0FBQ0EsT0FBTztnQkFDckJtQyxPQUFPLENBQUNtRDtvQkFDSixPQUFPO3dCQUFFMUQsTUFBTTs0QkFBRTBEO3dCQUFRO3dCQUFHekQsT0FBTztvQkFBSztnQkFDNUM7WUFDSjtZQUNBLE9BQU87Z0JBQUVEO2dCQUFNQztZQUFNO1FBQ3pCLEVBQ0EsT0FBT0EsT0FBTztZQUNWLElBQUlqQyx3REFBV0EsQ0FBQ2lDLFFBQVE7Z0JBQ3BCLE9BQU87b0JBQUVELE1BQU07b0JBQU1DO2dCQUFNO1lBQy9CO1lBQ0EsTUFBTUE7UUFDVjtJQUNKO0lBQ0EsTUFBTXRCLGNBQWMrQixNQUFNLEVBQUU7UUFDeEI1QywwREFBWUEsQ0FBQzRDLE9BQU8rQyxNQUFNO1FBQzFCM0YsMERBQVlBLENBQUM0QyxPQUFPNEMsRUFBRTtRQUN0QixJQUFJO1lBQ0EsTUFBTXRELE9BQU8sTUFBTXJDLG9EQUFRQSxDQUFDLElBQUksQ0FBQ1UsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQ0YsR0FBRyxDQUFDLGFBQWEsRUFBRXVDLE9BQU8rQyxNQUFNLENBQUMsU0FBUyxFQUFFL0MsT0FBTzRDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQy9HbEYsU0FBUyxJQUFJLENBQUNBLE9BQU87WUFDekI7WUFDQSxPQUFPO2dCQUFFNEI7Z0JBQU1DLE9BQU87WUFBSztRQUMvQixFQUNBLE9BQU9BLE9BQU87WUFDVixJQUFJakMsd0RBQVdBLENBQUNpQyxRQUFRO2dCQUNwQixPQUFPO29CQUFFRCxNQUFNO29CQUFNQztnQkFBTTtZQUMvQjtZQUNBLE1BQU1BO1FBQ1Y7SUFDSjtJQUNBOzs7OztLQUtDLEdBQ0QsTUFBTW5CLGtCQUFrQjRCLE1BQU0sRUFBRTtRQUM1QixJQUFJVSxJQUFJQyxJQUFJQyxJQUFJQyxJQUFJQyxJQUFJQyxJQUFJQztRQUM1QixJQUFJO1lBQ0EsTUFBTUMsYUFBYTtnQkFBRUMsVUFBVTtnQkFBTUMsVUFBVTtnQkFBR0MsT0FBTztZQUFFO1lBQzNELE1BQU1DLFdBQVcsTUFBTXBFLG9EQUFRQSxDQUFDLElBQUksQ0FBQ1UsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQ0YsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7Z0JBQ2xGQyxTQUFTLElBQUksQ0FBQ0EsT0FBTztnQkFDckIyQixlQUFlO2dCQUNmaUMsT0FBTztvQkFDSEMsTUFBTSxDQUFDWixLQUFLLENBQUNELEtBQUtWLFdBQVcsUUFBUUEsV0FBVyxLQUFLLElBQUksS0FBSyxJQUFJQSxPQUFPdUIsSUFBSSxNQUFNLFFBQVFiLE9BQU8sS0FBSyxJQUFJLEtBQUssSUFBSUEsR0FBR2MsUUFBUSxFQUFDLE1BQU8sUUFBUWIsT0FBTyxLQUFLLElBQUlBLEtBQUs7b0JBQ3BLYyxVQUFVLENBQUNaLEtBQUssQ0FBQ0QsS0FBS1osV0FBVyxRQUFRQSxXQUFXLEtBQUssSUFBSSxLQUFLLElBQUlBLE9BQU8wQixPQUFPLE1BQU0sUUFBUWQsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHWSxRQUFRLEVBQUMsTUFBTyxRQUFRWCxPQUFPLEtBQUssSUFBSUEsS0FBSztnQkFDL0s7Z0JBQ0FoQixPQUFPN0MsOERBQXNCQTtZQUNqQztZQUNBLElBQUlxRSxTQUFTOUIsS0FBSyxFQUNkLE1BQU04QixTQUFTOUIsS0FBSztZQUN4QixNQUFNMEQsVUFBVSxNQUFNNUIsU0FBU08sSUFBSTtZQUNuQyxNQUFNUixRQUFRLENBQUNOLEtBQUtPLFNBQVMzRCxPQUFPLENBQUNtRSxHQUFHLENBQUMsZ0JBQWUsTUFBTyxRQUFRZixPQUFPLEtBQUssSUFBSUEsS0FBSztZQUM1RixNQUFNZ0IsUUFBUSxDQUFDZCxLQUFLLENBQUNELEtBQUtNLFNBQVMzRCxPQUFPLENBQUNtRSxHQUFHLENBQUMsT0FBTSxNQUFPLFFBQVFkLE9BQU8sS0FBSyxJQUFJLEtBQUssSUFBSUEsR0FBR2dCLEtBQUssQ0FBQyxJQUFHLE1BQU8sUUFBUWYsT0FBTyxLQUFLLElBQUlBLEtBQUssRUFBRTtZQUMvSSxJQUFJYyxNQUFNRSxNQUFNLEdBQUcsR0FBRztnQkFDbEJGLE1BQU1HLE9BQU8sQ0FBQyxDQUFDQztvQkFDWCxNQUFNWCxPQUFPWSxTQUFTRCxLQUFLSCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQ0EsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUNLLFNBQVMsQ0FBQyxHQUFHO29CQUNwRSxNQUFNQyxNQUFNQyxLQUFLQyxLQUFLLENBQUNMLEtBQUtILEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDQSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3ZEZCxVQUFVLENBQUMsQ0FBQyxFQUFFb0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHZDtnQkFDL0I7Z0JBQ0FOLFdBQVdHLEtBQUssR0FBR2UsU0FBU2Y7WUFDaEM7WUFDQSxPQUFPO2dCQUFFOUIsTUFBTVksT0FBT0MsTUFBTSxDQUFDRCxPQUFPQyxNQUFNLENBQUMsQ0FBQyxHQUFHOEMsVUFBVWhDO2dCQUFhMUIsT0FBTztZQUFLO1FBQ3RGLEVBQ0EsT0FBT0EsT0FBTztZQUNWLElBQUlqQyx3REFBV0EsQ0FBQ2lDLFFBQVE7Z0JBQ3BCLE9BQU87b0JBQUVELE1BQU07d0JBQUUyRCxTQUFTLEVBQUU7b0JBQUM7b0JBQUcxRDtnQkFBTTtZQUMxQztZQUNBLE1BQU1BO1FBQ1Y7SUFDSjtJQUNBOzs7OztLQUtDLEdBQ0QsTUFBTWpCLG1CQUFtQjBCLE1BQU0sRUFBRTtRQUM3QixJQUFJO1lBQ0EsT0FBTyxNQUFNL0Msb0RBQVFBLENBQUMsSUFBSSxDQUFDVSxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDRixHQUFHLENBQUMsb0JBQW9CLENBQUMsRUFBRTtnQkFDekVrQyxNQUFNSztnQkFDTnRDLFNBQVMsSUFBSSxDQUFDQSxPQUFPO2dCQUNyQm1DLE9BQU8sQ0FBQ3FEO29CQUNKLE9BQU87d0JBQUU1RCxNQUFNNEQ7d0JBQVEzRCxPQUFPO29CQUFLO2dCQUN2QztZQUNKO1FBQ0osRUFDQSxPQUFPQSxPQUFPO1lBQ1YsSUFBSWpDLHdEQUFXQSxDQUFDaUMsUUFBUTtnQkFDcEIsT0FBTztvQkFBRUQsTUFBTTtvQkFBTUM7Z0JBQU07WUFDL0I7WUFDQSxNQUFNQTtRQUNWO0lBQ0o7SUFDQTs7Ozs7S0FLQyxHQUNELE1BQU1mLGdCQUFnQjJFLFFBQVEsRUFBRTtRQUM1QixJQUFJO1lBQ0EsT0FBTyxNQUFNbEcsb0RBQVFBLENBQUMsSUFBSSxDQUFDVSxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDRixHQUFHLENBQUMscUJBQXFCLEVBQUUwRixTQUFTLENBQUMsRUFBRTtnQkFDcEZ6RixTQUFTLElBQUksQ0FBQ0EsT0FBTztnQkFDckJtQyxPQUFPLENBQUNxRDtvQkFDSixPQUFPO3dCQUFFNUQsTUFBTTREO3dCQUFRM0QsT0FBTztvQkFBSztnQkFDdkM7WUFDSjtRQUNKLEVBQ0EsT0FBT0EsT0FBTztZQUNWLElBQUlqQyx3REFBV0EsQ0FBQ2lDLFFBQVE7Z0JBQ3BCLE9BQU87b0JBQUVELE1BQU07b0JBQU1DO2dCQUFNO1lBQy9CO1lBQ0EsTUFBTUE7UUFDVjtJQUNKO0lBQ0E7Ozs7O0tBS0MsR0FDRCxNQUFNYixtQkFBbUJ5RSxRQUFRLEVBQUVuRCxNQUFNLEVBQUU7UUFDdkMsSUFBSTtZQUNBLE9BQU8sTUFBTS9DLG9EQUFRQSxDQUFDLElBQUksQ0FBQ1UsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQ0YsR0FBRyxDQUFDLHFCQUFxQixFQUFFMEYsU0FBUyxDQUFDLEVBQUU7Z0JBQ3BGeEQsTUFBTUs7Z0JBQ050QyxTQUFTLElBQUksQ0FBQ0EsT0FBTztnQkFDckJtQyxPQUFPLENBQUNxRDtvQkFDSixPQUFPO3dCQUFFNUQsTUFBTTREO3dCQUFRM0QsT0FBTztvQkFBSztnQkFDdkM7WUFDSjtRQUNKLEVBQ0EsT0FBT0EsT0FBTztZQUNWLElBQUlqQyx3REFBV0EsQ0FBQ2lDLFFBQVE7Z0JBQ3BCLE9BQU87b0JBQUVELE1BQU07b0JBQU1DO2dCQUFNO1lBQy9CO1lBQ0EsTUFBTUE7UUFDVjtJQUNKO0lBQ0E7Ozs7O0tBS0MsR0FDRCxNQUFNWCxtQkFBbUJ1RSxRQUFRLEVBQUU7UUFDL0IsSUFBSTtZQUNBLE1BQU1sRyxvREFBUUEsQ0FBQyxJQUFJLENBQUNVLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUNGLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRTBGLFNBQVMsQ0FBQyxFQUFFO2dCQUNoRnpGLFNBQVMsSUFBSSxDQUFDQSxPQUFPO2dCQUNyQjJCLGVBQWU7WUFDbkI7WUFDQSxPQUFPO2dCQUFFQyxNQUFNO2dCQUFNQyxPQUFPO1lBQUs7UUFDckMsRUFDQSxPQUFPQSxPQUFPO1lBQ1YsSUFBSWpDLHdEQUFXQSxDQUFDaUMsUUFBUTtnQkFDcEIsT0FBTztvQkFBRUQsTUFBTTtvQkFBTUM7Z0JBQU07WUFDL0I7WUFDQSxNQUFNQTtRQUNWO0lBQ0o7SUFDQTs7Ozs7S0FLQyxHQUNELE1BQU1ULDZCQUE2QnFFLFFBQVEsRUFBRTtRQUN6QyxJQUFJO1lBQ0EsT0FBTyxNQUFNbEcsb0RBQVFBLENBQUMsSUFBSSxDQUFDVSxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDRixHQUFHLENBQUMscUJBQXFCLEVBQUUwRixTQUFTLGtCQUFrQixDQUFDLEVBQUU7Z0JBQ3ZHekYsU0FBUyxJQUFJLENBQUNBLE9BQU87Z0JBQ3JCbUMsT0FBTyxDQUFDcUQ7b0JBQ0osT0FBTzt3QkFBRTVELE1BQU00RDt3QkFBUTNELE9BQU87b0JBQUs7Z0JBQ3ZDO1lBQ0o7UUFDSixFQUNBLE9BQU9BLE9BQU87WUFDVixJQUFJakMsd0RBQVdBLENBQUNpQyxRQUFRO2dCQUNwQixPQUFPO29CQUFFRCxNQUFNO29CQUFNQztnQkFBTTtZQUMvQjtZQUNBLE1BQU1BO1FBQ1Y7SUFDSjtBQUNKLEVBQ0EsMENBQTBDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL0dvVHJ1ZUFkbWluQXBpLmpzPzRhMDgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBfZ2VuZXJhdGVMaW5rUmVzcG9uc2UsIF9ub1Jlc29sdmVKc29uUmVzcG9uc2UsIF9yZXF1ZXN0LCBfdXNlclJlc3BvbnNlLCB9IGZyb20gJy4vbGliL2ZldGNoJztcbmltcG9ydCB7IHJlc29sdmVGZXRjaCwgdmFsaWRhdGVVVUlEIH0gZnJvbSAnLi9saWIvaGVscGVycyc7XG5pbXBvcnQgeyBTSUdOX09VVF9TQ09QRVMsIH0gZnJvbSAnLi9saWIvdHlwZXMnO1xuaW1wb3J0IHsgaXNBdXRoRXJyb3IgfSBmcm9tICcuL2xpYi9lcnJvcnMnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR29UcnVlQWRtaW5BcGkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYWRtaW4gQVBJIGNsaWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIG1hbmFnZSB1c2VycyBhbmQgT0F1dGggY2xpZW50cy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBHb1RydWVBZG1pbkFwaSB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICAgICAqXG4gICAgICogY29uc3QgYWRtaW4gPSBuZXcgR29UcnVlQWRtaW5BcGkoe1xuICAgICAqICAgdXJsOiAnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL2F1dGgvdjEnLFxuICAgICAqICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7cHJvY2Vzcy5lbnYuU1VQQUJBU0VfU0VSVklDRV9ST0xFX0tFWX1gIH0sXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih7IHVybCA9ICcnLCBoZWFkZXJzID0ge30sIGZldGNoLCB9KSB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB0aGlzLmZldGNoID0gcmVzb2x2ZUZldGNoKGZldGNoKTtcbiAgICAgICAgdGhpcy5tZmEgPSB7XG4gICAgICAgICAgICBsaXN0RmFjdG9yczogdGhpcy5fbGlzdEZhY3RvcnMuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGRlbGV0ZUZhY3RvcjogdGhpcy5fZGVsZXRlRmFjdG9yLmJpbmQodGhpcyksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub2F1dGggPSB7XG4gICAgICAgICAgICBsaXN0Q2xpZW50czogdGhpcy5fbGlzdE9BdXRoQ2xpZW50cy5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgY3JlYXRlQ2xpZW50OiB0aGlzLl9jcmVhdGVPQXV0aENsaWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZ2V0Q2xpZW50OiB0aGlzLl9nZXRPQXV0aENsaWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdXBkYXRlQ2xpZW50OiB0aGlzLl91cGRhdGVPQXV0aENsaWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZGVsZXRlQ2xpZW50OiB0aGlzLl9kZWxldGVPQXV0aENsaWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcmVnZW5lcmF0ZUNsaWVudFNlY3JldDogdGhpcy5fcmVnZW5lcmF0ZU9BdXRoQ2xpZW50U2VjcmV0LmJpbmQodGhpcyksXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBsb2dnZWQtaW4gc2Vzc2lvbi5cbiAgICAgKiBAcGFyYW0gand0IEEgdmFsaWQsIGxvZ2dlZC1pbiBKV1QuXG4gICAgICogQHBhcmFtIHNjb3BlIFRoZSBsb2dvdXQgc29wZS5cbiAgICAgKi9cbiAgICBhc3luYyBzaWduT3V0KGp3dCwgc2NvcGUgPSBTSUdOX09VVF9TQ09QRVNbMF0pIHtcbiAgICAgICAgaWYgKFNJR05fT1VUX1NDT1BFUy5pbmRleE9mKHNjb3BlKSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IFBhcmFtZXRlciBzY29wZSBtdXN0IGJlIG9uZSBvZiAke1NJR05fT1VUX1NDT1BFUy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9sb2dvdXQ/c2NvcGU9JHtzY29wZX1gLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIGp3dCxcbiAgICAgICAgICAgICAgICBub1Jlc29sdmVKc29uOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhbiBpbnZpdGUgbGluayB0byBhbiBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEBwYXJhbSBlbWFpbCBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnMgdG8gYmUgaW5jbHVkZWQgd2hlbiBpbnZpdGluZy5cbiAgICAgKi9cbiAgICBhc3luYyBpbnZpdGVVc2VyQnlFbWFpbChlbWFpbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vaW52aXRlYCwge1xuICAgICAgICAgICAgICAgIGJvZHk6IHsgZW1haWwsIGRhdGE6IG9wdGlvbnMuZGF0YSB9LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiBvcHRpb25zLnJlZGlyZWN0VG8sXG4gICAgICAgICAgICAgICAgeGZvcm06IF91c2VyUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IG51bGwgfSwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBlbWFpbCBsaW5rcyBhbmQgT1RQcyB0byBiZSBzZW50IHZpYSBhIGN1c3RvbSBlbWFpbCBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0gZW1haWwgVGhlIHVzZXIncyBlbWFpbC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5wYXNzd29yZCBVc2VyIHBhc3N3b3JkLiBGb3Igc2lnbnVwIG9ubHkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMuZGF0YSBPcHRpb25hbCB1c2VyIG1ldGFkYXRhLiBGb3Igc2lnbnVwIG9ubHkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMucmVkaXJlY3RUbyBUaGUgcmVkaXJlY3QgdXJsIHdoaWNoIHNob3VsZCBiZSBhcHBlbmRlZCB0byB0aGUgZ2VuZXJhdGVkIGxpbmtcbiAgICAgKi9cbiAgICBhc3luYyBnZW5lcmF0ZUxpbmsocGFyYW1zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcmFtcywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcIm9wdGlvbnNcIl0pO1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKCduZXdFbWFpbCcgaW4gcmVzdCkge1xuICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgbmV3RW1haWwgd2l0aCBuZXdfZW1haWwgaW4gcmVxdWVzdCBib2R5XG4gICAgICAgICAgICAgICAgYm9keS5uZXdfZW1haWwgPSByZXN0ID09PSBudWxsIHx8IHJlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3QubmV3RW1haWw7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGJvZHlbJ25ld0VtYWlsJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vYWRtaW4vZ2VuZXJhdGVfbGlua2AsIHtcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX2dlbmVyYXRlTGlua1Jlc3BvbnNlLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZWRpcmVjdFRvLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBVc2VyIEFkbWluIEFQSVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdXNlci5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVVzZXIoYXR0cmlidXRlcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L2FkbWluL3VzZXJzYCwge1xuICAgICAgICAgICAgICAgIGJvZHk6IGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfdXNlclJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBudWxsIH0sIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsaXN0IG9mIHVzZXJzLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKiBAcGFyYW0gcGFyYW1zIEFuIG9iamVjdCB3aGljaCBzdXBwb3J0cyBgcGFnZWAgYW5kIGBwZXJQYWdlYCBhcyBudW1iZXJzLCB0byBhbHRlciB0aGUgcGFnaW5hdGVkIHJlc3VsdHMuXG4gICAgICovXG4gICAgYXN5bmMgbGlzdFVzZXJzKHBhcmFtcykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYWdpbmF0aW9uID0geyBuZXh0UGFnZTogbnVsbCwgbGFzdFBhZ2U6IDAsIHRvdGFsOiAwIH07XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vYWRtaW4vdXNlcnNgLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIG5vUmVzb2x2ZUpzb246IHRydWUsXG4gICAgICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZTogKF9iID0gKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgcGVyX3BhZ2U6IChfZCA9IChfYyA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wZXJQYWdlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudG9TdHJpbmcoKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX25vUmVzb2x2ZUpzb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKVxuICAgICAgICAgICAgICAgIHRocm93IHJlc3BvbnNlLmVycm9yO1xuICAgICAgICAgICAgY29uc3QgdXNlcnMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbCA9IChfZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXRvdGFsLWNvdW50JykpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDA7XG4gICAgICAgICAgICBjb25zdCBsaW5rcyA9IChfZyA9IChfZiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdsaW5rJykpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5zcGxpdCgnLCcpKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBbXTtcbiAgICAgICAgICAgIGlmIChsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gcGFyc2VJbnQobGluay5zcGxpdCgnOycpWzBdLnNwbGl0KCc9JylbMV0uc3Vic3RyaW5nKDAsIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsID0gSlNPTi5wYXJzZShsaW5rLnNwbGl0KCc7JylbMV0uc3BsaXQoJz0nKVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2luYXRpb25bYCR7cmVsfVBhZ2VgXSA9IHBhZ2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcGFnaW5hdGlvbi50b3RhbCA9IHBhcnNlSW50KHRvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdXNlcnMpLCBwYWdpbmF0aW9uKSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXJzOiBbXSB9LCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHVzZXIgYnkgaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdWlkIFRoZSB1c2VyJ3MgdW5pcXVlIGlkZW50aWZpZXJcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0VXNlckJ5SWQodWlkKSB7XG4gICAgICAgIHZhbGlkYXRlVVVJRCh1aWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vYWRtaW4vdXNlcnMvJHt1aWR9YCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3VzZXJSZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgdXNlciBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGRhdGEgeW91IHdhbnQgdG8gdXBkYXRlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVVc2VyQnlJZCh1aWQsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdmFsaWRhdGVVVUlEKHVpZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BVVCcsIGAke3RoaXMudXJsfS9hZG1pbi91c2Vycy8ke3VpZH1gLCB7XG4gICAgICAgICAgICAgICAgYm9keTogYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IF91c2VyUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IG51bGwgfSwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIHVzZXIuIFJlcXVpcmVzIGEgYHNlcnZpY2Vfcm9sZWAga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIFRoZSB1c2VyIGlkIHlvdSB3YW50IHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0gc2hvdWxkU29mdERlbGV0ZSBJZiB0cnVlLCB0aGVuIHRoZSB1c2VyIHdpbGwgYmUgc29mdC1kZWxldGVkIGZyb20gdGhlIGF1dGggc2NoZW1hLiBTb2Z0IGRlbGV0aW9uIGFsbG93cyB1c2VyIGlkZW50aWZpY2F0aW9uIGZyb20gdGhlIGhhc2hlZCB1c2VyIElEIGJ1dCBpcyBub3QgcmV2ZXJzaWJsZS5cbiAgICAgKiBEZWZhdWx0cyB0byBmYWxzZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlVXNlcihpZCwgc2hvdWxkU29mdERlbGV0ZSA9IGZhbHNlKSB7XG4gICAgICAgIHZhbGlkYXRlVVVJRChpZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0RFTEVURScsIGAke3RoaXMudXJsfS9hZG1pbi91c2Vycy8ke2lkfWAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgICAgICBzaG91bGRfc29mdF9kZWxldGU6IHNob3VsZFNvZnREZWxldGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3VzZXJSZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX2xpc3RGYWN0b3JzKHBhcmFtcykge1xuICAgICAgICB2YWxpZGF0ZVVVSUQocGFyYW1zLnVzZXJJZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L2FkbWluL3VzZXJzLyR7cGFyYW1zLnVzZXJJZH0vZmFjdG9yc2AsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IChmYWN0b3JzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgZmFjdG9ycyB9LCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9kZWxldGVGYWN0b3IocGFyYW1zKSB7XG4gICAgICAgIHZhbGlkYXRlVVVJRChwYXJhbXMudXNlcklkKTtcbiAgICAgICAgdmFsaWRhdGVVVUlEKHBhcmFtcy5pZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0RFTEVURScsIGAke3RoaXMudXJsfS9hZG1pbi91c2Vycy8ke3BhcmFtcy51c2VySWR9L2ZhY3RvcnMvJHtwYXJhbXMuaWR9YCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdHMgYWxsIE9BdXRoIGNsaWVudHMgd2l0aCBvcHRpb25hbCBwYWdpbmF0aW9uLlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIF9saXN0T0F1dGhDbGllbnRzKHBhcmFtcykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYWdpbmF0aW9uID0geyBuZXh0UGFnZTogbnVsbCwgbGFzdFBhZ2U6IDAsIHRvdGFsOiAwIH07XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vYWRtaW4vb2F1dGgvY2xpZW50c2AsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgbm9SZXNvbHZlSnNvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgICAgICAgICBwYWdlOiAoX2IgPSAoX2EgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMucGFnZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBwZXJfcGFnZTogKF9kID0gKF9jID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBlclBhZ2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50b1N0cmluZygpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfbm9SZXNvbHZlSnNvblJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2UuZXJyb3I7XG4gICAgICAgICAgICBjb25zdCBjbGllbnRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgY29uc3QgdG90YWwgPSAoX2UgPSByZXNwb25zZS5oZWFkZXJzLmdldCgneC10b3RhbC1jb3VudCcpKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwO1xuICAgICAgICAgICAgY29uc3QgbGlua3MgPSAoX2cgPSAoX2YgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnbGluaycpKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Yuc3BsaXQoJywnKSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogW107XG4gICAgICAgICAgICBpZiAobGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxpbmtzLmZvckVhY2goKGxpbmspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IHBhcnNlSW50KGxpbmsuc3BsaXQoJzsnKVswXS5zcGxpdCgnPScpWzFdLnN1YnN0cmluZygwLCAxKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbCA9IEpTT04ucGFyc2UobGluay5zcGxpdCgnOycpWzFdLnNwbGl0KCc9JylbMV0pO1xuICAgICAgICAgICAgICAgICAgICBwYWdpbmF0aW9uW2Ake3JlbH1QYWdlYF0gPSBwYWdlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhZ2luYXRpb24udG90YWwgPSBwYXJzZUludCh0b3RhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNsaWVudHMpLCBwYWdpbmF0aW9uKSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IGNsaWVudHM6IFtdIH0sIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE9BdXRoIGNsaWVudC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBfY3JlYXRlT0F1dGhDbGllbnQocGFyYW1zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vYWRtaW4vb2F1dGgvY2xpZW50c2AsIHtcbiAgICAgICAgICAgICAgICBib2R5OiBwYXJhbXMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiAoY2xpZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGNsaWVudCwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgZGV0YWlscyBvZiBhIHNwZWNpZmljIE9BdXRoIGNsaWVudC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBfZ2V0T0F1dGhDbGllbnQoY2xpZW50SWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L2FkbWluL29hdXRoL2NsaWVudHMvJHtjbGllbnRJZH1gLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHhmb3JtOiAoY2xpZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IGNsaWVudCwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgT0F1dGggY2xpZW50LlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlcnZlci4gTmV2ZXIgZXhwb3NlIHlvdXIgYHNlcnZpY2Vfcm9sZWAga2V5IGluIHRoZSBicm93c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIF91cGRhdGVPQXV0aENsaWVudChjbGllbnRJZCwgcGFyYW1zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BVVCcsIGAke3RoaXMudXJsfS9hZG1pbi9vYXV0aC9jbGllbnRzLyR7Y2xpZW50SWR9YCwge1xuICAgICAgICAgICAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IChjbGllbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogY2xpZW50LCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhbiBPQXV0aCBjbGllbnQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHRoZSBPQXV0aCAyLjEgc2VydmVyIGlzIGVuYWJsZWQgaW4gU3VwYWJhc2UgQXV0aC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VydmVyLiBOZXZlciBleHBvc2UgeW91ciBgc2VydmljZV9yb2xlYCBrZXkgaW4gdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgYXN5bmMgX2RlbGV0ZU9BdXRoQ2xpZW50KGNsaWVudElkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnREVMRVRFJywgYCR7dGhpcy51cmx9L2FkbWluL29hdXRoL2NsaWVudHMvJHtjbGllbnRJZH1gLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIG5vUmVzb2x2ZUpzb246IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2VuZXJhdGVzIHRoZSBzZWNyZXQgZm9yIGFuIE9BdXRoIGNsaWVudC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzZXJ2ZXIuIE5ldmVyIGV4cG9zZSB5b3VyIGBzZXJ2aWNlX3JvbGVgIGtleSBpbiB0aGUgYnJvd3Nlci5cbiAgICAgKi9cbiAgICBhc3luYyBfcmVnZW5lcmF0ZU9BdXRoQ2xpZW50U2VjcmV0KGNsaWVudElkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vYWRtaW4vb2F1dGgvY2xpZW50cy8ke2NsaWVudElkfS9yZWdlbmVyYXRlX3NlY3JldGAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgeGZvcm06IChjbGllbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogY2xpZW50LCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Hb1RydWVBZG1pbkFwaS5qcy5tYXAiXSwibmFtZXMiOlsiX19yZXN0IiwiX2dlbmVyYXRlTGlua1Jlc3BvbnNlIiwiX25vUmVzb2x2ZUpzb25SZXNwb25zZSIsIl9yZXF1ZXN0IiwiX3VzZXJSZXNwb25zZSIsInJlc29sdmVGZXRjaCIsInZhbGlkYXRlVVVJRCIsIlNJR05fT1VUX1NDT1BFUyIsImlzQXV0aEVycm9yIiwiR29UcnVlQWRtaW5BcGkiLCJjb25zdHJ1Y3RvciIsInVybCIsImhlYWRlcnMiLCJmZXRjaCIsIm1mYSIsImxpc3RGYWN0b3JzIiwiX2xpc3RGYWN0b3JzIiwiYmluZCIsImRlbGV0ZUZhY3RvciIsIl9kZWxldGVGYWN0b3IiLCJvYXV0aCIsImxpc3RDbGllbnRzIiwiX2xpc3RPQXV0aENsaWVudHMiLCJjcmVhdGVDbGllbnQiLCJfY3JlYXRlT0F1dGhDbGllbnQiLCJnZXRDbGllbnQiLCJfZ2V0T0F1dGhDbGllbnQiLCJ1cGRhdGVDbGllbnQiLCJfdXBkYXRlT0F1dGhDbGllbnQiLCJkZWxldGVDbGllbnQiLCJfZGVsZXRlT0F1dGhDbGllbnQiLCJyZWdlbmVyYXRlQ2xpZW50U2VjcmV0IiwiX3JlZ2VuZXJhdGVPQXV0aENsaWVudFNlY3JldCIsInNpZ25PdXQiLCJqd3QiLCJzY29wZSIsImluZGV4T2YiLCJFcnJvciIsImpvaW4iLCJub1Jlc29sdmVKc29uIiwiZGF0YSIsImVycm9yIiwiaW52aXRlVXNlckJ5RW1haWwiLCJlbWFpbCIsIm9wdGlvbnMiLCJib2R5IiwicmVkaXJlY3RUbyIsInhmb3JtIiwidXNlciIsImdlbmVyYXRlTGluayIsInBhcmFtcyIsInJlc3QiLCJPYmplY3QiLCJhc3NpZ24iLCJuZXdfZW1haWwiLCJuZXdFbWFpbCIsInByb3BlcnRpZXMiLCJjcmVhdGVVc2VyIiwiYXR0cmlidXRlcyIsImxpc3RVc2VycyIsIl9hIiwiX2IiLCJfYyIsIl9kIiwiX2UiLCJfZiIsIl9nIiwicGFnaW5hdGlvbiIsIm5leHRQYWdlIiwibGFzdFBhZ2UiLCJ0b3RhbCIsInJlc3BvbnNlIiwicXVlcnkiLCJwYWdlIiwidG9TdHJpbmciLCJwZXJfcGFnZSIsInBlclBhZ2UiLCJ1c2VycyIsImpzb24iLCJnZXQiLCJsaW5rcyIsInNwbGl0IiwibGVuZ3RoIiwiZm9yRWFjaCIsImxpbmsiLCJwYXJzZUludCIsInN1YnN0cmluZyIsInJlbCIsIkpTT04iLCJwYXJzZSIsImdldFVzZXJCeUlkIiwidWlkIiwidXBkYXRlVXNlckJ5SWQiLCJkZWxldGVVc2VyIiwiaWQiLCJzaG91bGRTb2Z0RGVsZXRlIiwic2hvdWxkX3NvZnRfZGVsZXRlIiwidXNlcklkIiwiZmFjdG9ycyIsImNsaWVudHMiLCJjbGllbnQiLCJjbGllbnRJZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/constants */ \"(action-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 */ \"(action-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 */ \"(action-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 */ \"(action-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 */ \"(action-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 */ \"(action-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 */ \"(action-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 */ \"(action-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 */ \"(action-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 */ \"(action-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 */ \"(action-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 * 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 = `${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 /**\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@\" + `${this.storageKey}:${this.instanceID} (${_lib_version__WEBPACK_IMPORTED_MODULE_8__.version}) ${new Date().toISOString()}`;\n }\n _debug(...args) {\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\", `${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\", `${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\", `${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, `${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, `${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\", `${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\", `${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 \"${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\", `${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 `${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: ${url.href}`,\n `Issued At: ${(_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: ${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: ${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: ${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: ${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: ${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)=>`- ${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\", `${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, `${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\", `${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, `${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, `${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\", `${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\", `${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\", `${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, `${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\", `${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\", `${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, `${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\", `${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 = `${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:${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${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\", `${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\", `${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, `${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, options = {}) {\n await this.initializePromise;\n return await this._acquireLock(-1, async ()=>{\n return await this._updateUser(attributes, options);\n });\n }\n async _updateUser(attributes, options = {}) {\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\", `${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, `${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 ${actuallyExpiresIn}s, should have been closer to ${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, `${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(options = {\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({ scope } = {\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, `${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, options = {}) {\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\", `${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, `${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(`${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\", `${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, `${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\", `${this.url}/user/identities/${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(${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\", `${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(`${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${expiresWithMargin ? \"\" : \" not\"} expired with margin of ${_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(${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, broadcast = true) {\n const debugName = `#_notifyAllSubscribers(${event})`;\n this._debug(debugName, \"begin\", session, `broadcast = ${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, `${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 ${expiresInTicks} ticks, a tick lasts ${_lib_constants__WEBPACK_IMPORTED_MODULE_1__.AUTO_REFRESH_TICK_DURATION_MS}ms, refresh threshold is ${_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(${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=${encodeURIComponent(provider)}`\n ];\n if (options === null || options === void 0 ? void 0 : options.redirectTo) {\n urlParams.push(`redirect_to=${encodeURIComponent(options.redirectTo)}`);\n }\n if (options === null || options === void 0 ? void 0 : options.scopes) {\n urlParams.push(`scopes=${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: `${encodeURIComponent(codeChallenge)}`,\n code_challenge_method: `${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=${options.skipBrowserRedirect}`);\n }\n return `${url}?${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\", `${this.url}/factors/${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\", `${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,${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\", `${this.url}/factors/${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\", `${this.url}/factors/${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\", `${this.url}/oauth/authorizations/${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\", `${this.url}/oauth/authorizations/${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\", `${this.url}/oauth/authorizations/${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\", `${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\", `${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, jwks = {\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\", `${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, options = {}) {\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)(`${rawHeader}.${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}\nGoTrueClient.nextInstanceID = {};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (GoTrueClient); //# sourceMappingURL=GoTrueClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9Hb1RydWVDbGllbnQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUE4QztBQUNzSDtBQUM4TTtBQUNqUTtBQUNnTjtBQUNqUTtBQUNLO0FBQ2hCO0FBQ2I7QUFDK0I7QUFDYztBQUM2RztBQUNsTStDLGtFQUFrQkEsSUFBSSw4QkFBOEI7QUFDcEQsTUFBTWEsa0JBQWtCO0lBQ3BCQyxLQUFLeEQsc0RBQVVBO0lBQ2Z5RCxZQUFZdkQsdURBQVdBO0lBQ3ZCd0Qsa0JBQWtCO0lBQ2xCQyxnQkFBZ0I7SUFDaEJDLG9CQUFvQjtJQUNwQkMsU0FBUy9ELDJEQUFlQTtJQUN4QmdFLFVBQVU7SUFDVkMsT0FBTztJQUNQQyw4QkFBOEI7SUFDOUJDLGNBQWM7QUFDbEI7QUFDQSxlQUFlQyxTQUFTQyxJQUFJLEVBQUVDLGNBQWMsRUFBRUMsRUFBRTtJQUM1QyxPQUFPLE1BQU1BO0FBQ2pCO0FBQ0E7Ozs7Ozs7Q0FPQyxHQUNELE1BQU1DLGNBQWMsQ0FBQztBQUNyQixNQUFNQztJQUNGOztLQUVDLEdBQ0QsSUFBSUMsT0FBTztRQUNQLElBQUlDLElBQUlDO1FBQ1IsT0FBTyxDQUFDQSxLQUFLLENBQUNELEtBQUtILFdBQVcsQ0FBQyxJQUFJLENBQUNiLFVBQVUsQ0FBQyxNQUFNLFFBQVFnQixPQUFPLEtBQUssSUFBSSxLQUFLLElBQUlBLEdBQUdELElBQUksTUFBTSxRQUFRRSxPQUFPLEtBQUssSUFBSUEsS0FBSztZQUFFQyxNQUFNLEVBQUU7UUFBQztJQUMvSTtJQUNBLElBQUlILEtBQUtJLEtBQUssRUFBRTtRQUNaTixXQUFXLENBQUMsSUFBSSxDQUFDYixVQUFVLENBQUMsR0FBR29CLE9BQU9DLE1BQU0sQ0FBQ0QsT0FBT0MsTUFBTSxDQUFDLENBQUMsR0FBR1IsV0FBVyxDQUFDLElBQUksQ0FBQ2IsVUFBVSxDQUFDLEdBQUc7WUFBRWUsTUFBTUk7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LE1BQU0sSUFBSSxDQUFDa0wsT0FBTyxDQUFDOUM7Z0JBQ3JDLElBQUlwSSxPQUFPO29CQUNQLE1BQU1BO2dCQUNWO2dCQUNBLDJEQUEyRDtnQkFDM0QsT0FBTztvQkFDSEssTUFBTTt3QkFDRjhVLFFBQVF0Sjt3QkFDUjZJO3dCQUNBM1A7b0JBQ0o7b0JBQ0EvRSxPQUFPO2dCQUNYO1lBQ0o7WUFDQSxNQUFNb1YsWUFBWTljLDBEQUFZQSxDQUFDb2MsT0FBT00sR0FBRztZQUN6QywyQkFBMkI7WUFDM0IsTUFBTTFOLFlBQVksTUFBTTROLE9BQU9HLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDLE9BQU9QLFlBQVlLLFdBQVcsTUFBTTtnQkFDaEY7YUFDSDtZQUNELHVCQUF1QjtZQUN2QixNQUFNRyxVQUFVLE1BQU1MLE9BQU9HLE1BQU0sQ0FBQ3BYLE1BQU0sQ0FBQ21YLFdBQVc5TixXQUFXdkMsV0FBV3JMLGtFQUFrQkEsQ0FBQyxDQUFDLEVBQUVrYixVQUFVLENBQUMsRUFBRUMsV0FBVyxDQUFDO1lBQzNILElBQUksQ0FBQ1UsU0FBUztnQkFDVixNQUFNLElBQUlyZSw0REFBbUJBLENBQUM7WUFDbEM7WUFDQSxxREFBcUQ7WUFDckQsT0FBTztnQkFDSG1KLE1BQU07b0JBQ0Y4VSxRQUFRdEo7b0JBQ1I2STtvQkFDQTNQO2dCQUNKO2dCQUNBL0UsT0FBTztZQUNYO1FBQ0osRUFDQSxPQUFPQSxPQUFPO1lBQ1YsSUFBSXZJLHdEQUFXQSxDQUFDdUksUUFBUTtnQkFDcEIsT0FBTyxJQUFJLENBQUNTLGFBQWEsQ0FBQztvQkFBRUosTUFBTTtvQkFBTUw7Z0JBQU07WUFDbEQ7WUFDQSxNQUFNQTtRQUNWO0lBQ0o7QUFDSjtBQUNBNUUsYUFBYWdDLGNBQWMsR0FBRyxDQUFDO0FBQy9CLGlFQUFlaEMsWUFBWUEsRUFBQyxDQUM1Qix3Q0FBd0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvR29UcnVlQ2xpZW50LmpzP2Y2NzAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEdvVHJ1ZUFkbWluQXBpIGZyb20gJy4vR29UcnVlQWRtaW5BcGknO1xuaW1wb3J0IHsgQVVUT19SRUZSRVNIX1RJQ0tfRFVSQVRJT05fTVMsIEFVVE9fUkVGUkVTSF9USUNLX1RIUkVTSE9MRCwgREVGQVVMVF9IRUFERVJTLCBFWFBJUllfTUFSR0lOX01TLCBHT1RSVUVfVVJMLCBKV0tTX1RUTCwgU1RPUkFHRV9LRVksIH0gZnJvbSAnLi9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IEF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciwgQXV0aEludmFsaWRDcmVkZW50aWFsc0Vycm9yLCBBdXRoSW52YWxpZEp3dEVycm9yLCBBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvciwgQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3IsIEF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvciwgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IsIEF1dGhVbmtub3duRXJyb3IsIGlzQXV0aEFwaUVycm9yLCBpc0F1dGhFcnJvciwgaXNBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IsIGlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IsIGlzQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IsIH0gZnJvbSAnLi9saWIvZXJyb3JzJztcbmltcG9ydCB7IF9yZXF1ZXN0LCBfc2Vzc2lvblJlc3BvbnNlLCBfc2Vzc2lvblJlc3BvbnNlUGFzc3dvcmQsIF9zc29SZXNwb25zZSwgX3VzZXJSZXNwb25zZSwgfSBmcm9tICcuL2xpYi9mZXRjaCc7XG5pbXBvcnQgeyBkZWNvZGVKV1QsIGRlZXBDbG9uZSwgRGVmZXJyZWQsIGdlbmVyYXRlQ2FsbGJhY2tJZCwgZ2V0QWxnb3JpdGhtLCBnZXRDb2RlQ2hhbGxlbmdlQW5kTWV0aG9kLCBnZXRJdGVtQXN5bmMsIGluc2VjdXJlVXNlcldhcm5pbmdQcm94eSwgaXNCcm93c2VyLCBwYXJzZVBhcmFtZXRlcnNGcm9tVVJMLCByZW1vdmVJdGVtQXN5bmMsIHJlc29sdmVGZXRjaCwgcmV0cnlhYmxlLCBzZXRJdGVtQXN5bmMsIHNsZWVwLCBzdXBwb3J0c0xvY2FsU3RvcmFnZSwgdXNlck5vdEF2YWlsYWJsZVByb3h5LCB2YWxpZGF0ZUV4cCwgfSBmcm9tICcuL2xpYi9oZWxwZXJzJztcbmltcG9ydCB7IG1lbW9yeUxvY2FsU3RvcmFnZUFkYXB0ZXIgfSBmcm9tICcuL2xpYi9sb2NhbC1zdG9yYWdlJztcbmltcG9ydCB7IExvY2tBY3F1aXJlVGltZW91dEVycm9yLCBuYXZpZ2F0b3JMb2NrIH0gZnJvbSAnLi9saWIvbG9ja3MnO1xuaW1wb3J0IHsgcG9seWZpbGxHbG9iYWxUaGlzIH0gZnJvbSAnLi9saWIvcG9seWZpbGxzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL2xpYi92ZXJzaW9uJztcbmltcG9ydCB7IGJ5dGVzVG9CYXNlNjRVUkwsIHN0cmluZ1RvVWludDhBcnJheSB9IGZyb20gJy4vbGliL2Jhc2U2NHVybCc7XG5pbXBvcnQgeyBjcmVhdGVTaXdlTWVzc2FnZSwgZnJvbUhleCwgZ2V0QWRkcmVzcywgdG9IZXgsIH0gZnJvbSAnLi9saWIvd2ViMy9ldGhlcmV1bSc7XG5pbXBvcnQgeyBkZXNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMsIGRlc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zLCBzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25SZXNwb25zZSwgc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RSZXNwb25zZSwgV2ViQXV0aG5BcGksIH0gZnJvbSAnLi9saWIvd2ViYXV0aG4nO1xucG9seWZpbGxHbG9iYWxUaGlzKCk7IC8vIE1ha2UgXCJnbG9iYWxUaGlzXCIgYXZhaWxhYmxlXG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG4gICAgdXJsOiBHT1RSVUVfVVJMLFxuICAgIHN0b3JhZ2VLZXk6IFNUT1JBR0VfS0VZLFxuICAgIGF1dG9SZWZyZXNoVG9rZW46IHRydWUsXG4gICAgcGVyc2lzdFNlc3Npb246IHRydWUsXG4gICAgZGV0ZWN0U2Vzc2lvbkluVXJsOiB0cnVlLFxuICAgIGhlYWRlcnM6IERFRkFVTFRfSEVBREVSUyxcbiAgICBmbG93VHlwZTogJ2ltcGxpY2l0JyxcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgaGFzQ3VzdG9tQXV0aG9yaXphdGlvbkhlYWRlcjogZmFsc2UsXG4gICAgdGhyb3dPbkVycm9yOiBmYWxzZSxcbn07XG5hc3luYyBmdW5jdGlvbiBsb2NrTm9PcChuYW1lLCBhY3F1aXJlVGltZW91dCwgZm4pIHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbn1cbi8qKlxuICogQ2FjaGVzIEpXS1MgdmFsdWVzIGZvciBhbGwgY2xpZW50cyBjcmVhdGVkIGluIHRoZSBzYW1lIGVudmlyb25tZW50LiBUaGlzIGlzXG4gKiBlc3BlY2lhbGx5IHVzZWZ1bCBmb3Igc2hhcmVkLW1lbW9yeSBleGVjdXRpb24gZW52aXJvbm1lbnRzIHN1Y2ggYXMgVmVyY2VsJ3NcbiAqIEZsdWlkIENvbXB1dGUsIEFXUyBMYW1iZGEgb3IgU3VwYWJhc2UncyBFZGdlIEZ1bmN0aW9ucy4gUmVnYXJkbGVzcyBvZiBob3dcbiAqIG1hbnkgY2xpZW50cyBhcmUgY3JlYXRlZCwgaWYgdGhleSBzaGFyZSB0aGUgc2FtZSBzdG9yYWdlIGtleSB0aGV5IHdpbGwgdXNlXG4gKiB0aGUgc2FtZSBKV0tTIGNhY2hlLCBzaWduaWZpY2FudGx5IHNwZWVkaW5nIHVwIGdldENsYWltcygpIHdpdGggYXN5bW1ldHJpY1xuICogSldUcy5cbiAqL1xuY29uc3QgR0xPQkFMX0pXS1MgPSB7fTtcbmNsYXNzIEdvVHJ1ZUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIEpXS1MgdXNlZCBmb3IgdmVyaWZ5aW5nIGFzeW1tZXRyaWMgSldUc1xuICAgICAqL1xuICAgIGdldCBqd2tzKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gR0xPQkFMX0pXS1NbdGhpcy5zdG9yYWdlS2V5XSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/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/IHZvaWQgMCA6IG9wdGlvbnMua2V5cykgPyB7IGtleXM6IG9wdGlvbnMua2V5cyB9IDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmp3a3MpO1xuICAgICAgICAgICAgLy8gSWYgc3ltbWV0cmljIGFsZ29yaXRobSBvciBXZWJDcnlwdG8gQVBJIGlzIHVuYXZhaWxhYmxlLCBmYWxsYmFjayB0byBnZXRVc2VyKClcbiAgICAgICAgICAgIGlmICghc2lnbmluZ0tleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IGF3YWl0IHRoaXMuZ2V0VXNlcih0b2tlbik7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBnZXRVc2VyIHN1Y2NlZWRzIHNvIHRoZSBjbGFpbXMgaW4gdGhlIEpXVCBjYW4gYmUgdHJ1c3RlZFxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYWltczogcGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFsZ29yaXRobSA9IGdldEFsZ29yaXRobShoZWFkZXIuYWxnKTtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgSldLIHRvIENyeXB0b0tleVxuICAgICAgICAgICAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoJ2p3aycsIHNpZ25pbmdLZXksIGFsZ29yaXRobSwgdHJ1ZSwgW1xuICAgICAgICAgICAgICAgICd2ZXJpZnknLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBWZXJpZnkgdGhlIHNpZ25hdHVyZVxuICAgICAgICAgICAgY29uc3QgaXNWYWxpZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUudmVyaWZ5KGFsZ29yaXRobSwgcHVibGljS2V5LCBzaWduYXR1cmUsIHN0cmluZ1RvVWludDhBcnJheShgJHtyYXdIZWFkZXJ9LiR7cmF3UGF5bG9hZH1gKSk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aEludmFsaWRKd3RFcnJvcignSW52YWxpZCBKV1Qgc2lnbmF0dXJlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB2ZXJpZmljYXRpb24gc3VjY2VlZHMsIGRlY29kZSBhbmQgcmV0dXJuIGNsYWltc1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsYWltczogcGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyLFxuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG59XG5Hb1RydWVDbGllbnQubmV4dEluc3RhbmNlSUQgPSB7fTtcbmV4cG9ydCBkZWZhdWx0IEdvVHJ1ZUNsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdvVHJ1ZUNsaWVudC5qcy5tYXAiXSwibmFtZXMiOlsiR29UcnVlQWRtaW5BcGkiLCJBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyIsIkFVVE9fUkVGUkVTSF9USUNLX1RIUkVTSE9MRCIsIkRFRkFVTFRfSEVBREVSUyIsIkVYUElSWV9NQVJHSU5fTVMiLCJHT1RSVUVfVVJMIiwiSldLU19UVEwiLCJTVE9SQUdFX0tFWSIsIkF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciIsIkF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvciIsIkF1dGhJbnZhbGlkSnd0RXJyb3IiLCJBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvciIsIkF1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yIiwiQXV0aFBLQ0VHcmFudENvZGVFeGNoYW5nZUVycm9yIiwiQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IiLCJBdXRoVW5rbm93bkVycm9yIiwiaXNBdXRoQXBpRXJyb3IiLCJpc0F1dGhFcnJvciIsImlzQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yIiwiaXNBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvciIsImlzQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IiLCJfcmVxdWVzdCIsIl9zZXNzaW9uUmVzcG9uc2UiLCJfc2Vzc2lvblJlc3BvbnNlUGFzc3dvcmQiLCJfc3NvUmVzcG9uc2UiLCJfdXNlclJlc3BvbnNlIiwiZGVjb2RlSldUIiwiZGVlcENsb25lIiwiRGVmZXJyZWQiLCJnZW5lcmF0ZUNhbGxiYWNrSWQiLCJnZXRBbGdvcml0aG0iLCJnZXRDb2RlQ2hhbGxlbmdlQW5kTWV0aG9kIiwiZ2V0SXRlbUFzeW5jIiwiaW5zZWN1cmVVc2VyV2FybmluZ1Byb3h5IiwiaXNCcm93c2VyIiwicGFyc2VQYXJhbWV0ZXJzRnJvbVVSTCIsInJlbW92ZUl0ZW1Bc3luYyIsInJlc29sdmVGZXRjaCIsInJldHJ5YWJsZSIsInNldEl0ZW1Bc3luYyIsInNsZWVwIiwic3VwcG9ydHNMb2NhbFN0b3JhZ2UiLCJ1c2VyTm90QXZhaWxhYmxlUHJveHkiLCJ2YWxpZGF0ZUV4cCIsIm1lbW9yeUxvY2FsU3RvcmFnZUFkYXB0ZXIiLCJMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciIsIm5hdmlnYXRvckxvY2siLCJwb2x5ZmlsbEdsb2JhbFRoaXMiLCJ2ZXJzaW9uIiwiYnl0ZXNUb0Jhc2U2NFVSTCIsInN0cmluZ1RvVWludDhBcnJheSIsImNyZWF0ZVNpd2VNZXNzYWdlIiwiZnJvbUhleCIsImdldEFkZHJlc3MiLCJ0b0hleCIsImRlc2VyaWFsaXplQ3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyIsImRlc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zIiwic2VyaWFsaXplQ3JlZGVudGlhbENyZWF0aW9uUmVzcG9uc2UiLCJzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdFJlc3BvbnNlIiwiV2ViQXV0aG5BcGkiLCJERUZBVUxUX09QVElPTlMiLCJ1cmwiLCJzdG9yYWdlS2V5IiwiYXV0b1JlZnJlc2hUb2tlbiIsInBlcnNpc3RTZXNzaW9uIiwiZGV0ZWN0U2Vzc2lvbkluVXJsIiwiaGVhZGVycyIsImZsb3dUeXBlIiwiZGVidWciLCJoYXNDdXN0b21BdXRob3JpemF0aW9uSGVhZGVyIiwidGhyb3dPbkVycm9yIiwibG9ja05vT3AiLCJuYW1lIiwiYWNxdWlyZVRpbWVvdXQiLCJmbiIsIkdMT0JBTF9KV0tTIiwiR29UcnVlQ2xpZW50IiwiandrcyIsIl9hIiwiX2IiLCJrZXlzIiwidmFsdWUiLCJPYmplY3QiLCJhc3NpZ24iLCJqd2tzX2NhY2hlZF9hdCIsImNhY2hlZEF0IiwiTnVtYmVyIiwiTUlOX1NBRkVfSU5URUdFUiIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIl9jIiwidXNlclN0b3JhZ2UiLCJtZW1vcnlTdG9yYWdlIiwic3RhdGVDaGFuZ2VFbWl0dGVycyIsIk1hcCIsImF1dG9SZWZyZXNoVGlja2VyIiwidmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjayIsInJlZnJlc2hpbmdEZWZlcnJlZCIsImluaXRpYWxpemVQcm9taXNlIiwic3VwcHJlc3NHZXRTZXNzaW9uV2FybmluZyIsImxvY2tBY3F1aXJlZCIsInBlbmRpbmdJbkxvY2siLCJicm9hZGNhc3RDaGFubmVsIiwibG9nZ2VyIiwiY29uc29sZSIsImxvZyIsInNldHRpbmdzIiwiaW5zdGFuY2VJRCIsIm5leHRJbnN0YW5jZUlEIiwibG9nRGVidWdNZXNzYWdlcyIsIm1lc3NhZ2UiLCJfbG9nUHJlZml4Iiwid2FybiIsInRyYWNlIiwiYWRtaW4iLCJmZXRjaCIsImxvY2siLCJnbG9iYWxUaGlzIiwibmF2aWdhdG9yIiwibG9ja3MiLCJtZmEiLCJ2ZXJpZnkiLCJfdmVyaWZ5IiwiYmluZCIsImVucm9sbCIsIl9lbnJvbGwiLCJ1bmVucm9sbCIsIl91bmVucm9sbCIsImNoYWxsZW5nZSIsIl9jaGFsbGVuZ2UiLCJsaXN0RmFjdG9ycyIsIl9saXN0RmFjdG9ycyIsImNoYWxsZW5nZUFuZFZlcmlmeSIsIl9jaGFsbGVuZ2VBbmRWZXJpZnkiLCJnZXRBdXRoZW50aWNhdG9yQXNzdXJhbmNlTGV2ZWwiLCJfZ2V0QXV0aGVudGljYXRvckFzc3VyYW5jZUxldmVsIiwid2ViYXV0aG4iLCJvYXV0aCIsImdldEF1dGhvcml6YXRpb25EZXRhaWxzIiwiX2dldEF1dGhvcml6YXRpb25EZXRhaWxzIiwiYXBwcm92ZUF1dGhvcml6YXRpb24iLCJfYXBwcm92ZUF1dGhvcml6YXRpb24iLCJkZW55QXV0aG9yaXphdGlvbiIsIl9kZW55QXV0aG9yaXphdGlvbiIsImxpc3RHcmFudHMiLCJfbGlzdE9BdXRoR3JhbnRzIiwicmV2b2tlR3JhbnQiLCJfcmV2b2tlT0F1dGhHcmFudCIsInN0b3JhZ2UiLCJsb2NhbFN0b3JhZ2UiLCJCcm9hZGNhc3RDaGFubmVsIiwiZSIsImVycm9yIiwiYWRkRXZlbnRMaXN0ZW5lciIsImV2ZW50IiwiX2RlYnVnIiwiX25vdGlmeUFsbFN1YnNjcmliZXJzIiwiZGF0YSIsInNlc3Npb24iLCJpbml0aWFsaXplIiwiaXNUaHJvd09uRXJyb3JFbmFibGVkIiwiX3JldHVyblJlc3VsdCIsInJlc3VsdCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsImFyZ3MiLCJfYWNxdWlyZUxvY2siLCJfaW5pdGlhbGl6ZSIsInBhcmFtcyIsImNhbGxiYWNrVXJsVHlwZSIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsIl9pc0ltcGxpY2l0R3JhbnRDYWxsYmFjayIsIl9pc1BLQ0VDYWxsYmFjayIsIl9nZXRTZXNzaW9uRnJvbVVSTCIsImVycm9yQ29kZSIsImRldGFpbHMiLCJjb2RlIiwiX3JlbW92ZVNlc3Npb24iLCJyZWRpcmVjdFR5cGUiLCJfc2F2ZVNlc3Npb24iLCJzZXRUaW1lb3V0IiwiX3JlY292ZXJBbmRSZWZyZXNoIiwiX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UiLCJzaWduSW5Bbm9ueW1vdXNseSIsImNyZWRlbnRpYWxzIiwicmVzIiwiYm9keSIsImdvdHJ1ZV9tZXRhX3NlY3VyaXR5IiwiY2FwdGNoYV90b2tlbiIsImNhcHRjaGFUb2tlbiIsInhmb3JtIiwidXNlciIsInNpZ25VcCIsImVtYWlsIiwicGFzc3dvcmQiLCJjb2RlQ2hhbGxlbmdlIiwiY29kZUNoYWxsZW5nZU1ldGhvZCIsInJlZGlyZWN0VG8iLCJlbWFpbFJlZGlyZWN0VG8iLCJjb2RlX2NoYWxsZW5nZSIsImNvZGVfY2hhbGxlbmdlX21ldGhvZCIsInBob25lIiwiY2hhbm5lbCIsInNpZ25JbldpdGhQYXNzd29yZCIsImludmFsaWRUb2tlbkVycm9yIiwid2Vha19wYXNzd29yZCIsIndlYWtQYXNzd29yZCIsInNpZ25JbldpdGhPQXV0aCIsIl9kIiwiX2hhbmRsZVByb3ZpZGVyU2lnbkluIiwicHJvdmlkZXIiLCJzY29wZXMiLCJxdWVyeVBhcmFtcyIsInNraXBCcm93c2VyUmVkaXJlY3QiLCJleGNoYW5nZUNvZGVGb3JTZXNzaW9uIiwiYXV0aENvZGUiLCJfZXhjaGFuZ2VDb2RlRm9yU2Vzc2lvbiIsInNpZ25JbldpdGhXZWIzIiwiY2hhaW4iLCJzaWduSW5XaXRoRXRoZXJldW0iLCJzaWduSW5XaXRoU29sYW5hIiwiRXJyb3IiLCJfZSIsIl9mIiwiX2ciLCJfaCIsIl9qIiwiX2siLCJfbCIsInNpZ25hdHVyZSIsIndhbGxldCIsInN0YXRlbWVudCIsInJlc29sdmVkV2FsbGV0Iiwid2luZG93QW55IiwiZXRoZXJldW0iLCJyZXF1ZXN0IiwiVVJMIiwiYWNjb3VudHMiLCJtZXRob2QiLCJ0aGVuIiwiYWNjcyIsImNhdGNoIiwibGVuZ3RoIiwiYWRkcmVzcyIsImNoYWluSWQiLCJjaGFpbklkSGV4Iiwic2l3ZU1lc3NhZ2UiLCJkb21haW4iLCJob3N0IiwidXJpIiwibm9uY2UiLCJpc3N1ZWRBdCIsImV4cGlyYXRpb25UaW1lIiwibm90QmVmb3JlIiwicmVxdWVzdElkIiwicmVzb3VyY2VzIiwiX20iLCJzb2xhbmEiLCJzaWduSW4iLCJzaWduTWVzc2FnZSIsIm91dHB1dCIsIm91dHB1dFRvUHJvY2VzcyIsIkFycmF5IiwiaXNBcnJheSIsInNpZ25lZE1lc3NhZ2UiLCJVaW50OEFycmF5IiwiVGV4dERlY29kZXIiLCJkZWNvZGUiLCJwdWJsaWNLZXkiLCJ0b0Jhc2U1OCIsIm1hcCIsInJlc291cmNlIiwiam9pbiIsIm1heWJlU2lnbmF0dXJlIiwiVGV4dEVuY29kZXIiLCJlbmNvZGUiLCJzdG9yYWdlSXRlbSIsImNvZGVWZXJpZmllciIsInNwbGl0IiwiYXV0aF9jb2RlIiwiY29kZV92ZXJpZmllciIsInNpZ25JbldpdGhJZFRva2VuIiwidG9rZW4iLCJhY2Nlc3NfdG9rZW4iLCJpZF90b2tlbiIsInNpZ25JbldpdGhPdHAiLCJjcmVhdGVfdXNlciIsInNob3VsZENyZWF0ZVVzZXIiLCJtZXNzYWdlSWQiLCJtZXNzYWdlX2lkIiwidmVyaWZ5T3RwIiwidW5kZWZpbmVkIiwidG9rZW5WZXJpZmljYXRpb25FcnJvciIsInR5cGUiLCJzaWduSW5XaXRoU1NPIiwicHJvdmlkZXJfaWQiLCJwcm92aWRlcklkIiwicmVkaXJlY3RfdG8iLCJza2lwX2h0dHBfcmVkaXJlY3QiLCJyZWF1dGhlbnRpY2F0ZSIsIl9yZWF1dGhlbnRpY2F0ZSIsIl91c2VTZXNzaW9uIiwic2Vzc2lvbkVycm9yIiwiand0IiwicmVzZW5kIiwiZW5kcG9pbnQiLCJnZXRTZXNzaW9uIiwibGFzdCIsIlByb21pc2UiLCJyZXNvbHZlIiwicHVzaCIsIndhaXRPbiIsImFsbCIsInNwbGljZSIsIl9fbG9hZFNlc3Npb24iLCJzdGFjayIsImN1cnJlbnRTZXNzaW9uIiwibWF5YmVTZXNzaW9uIiwiX2lzVmFsaWRTZXNzaW9uIiwiaGFzRXhwaXJlZCIsImV4cGlyZXNfYXQiLCJub3ciLCJtYXliZVVzZXIiLCJpc1NlcnZlciIsIl9faXNVc2VyTm90QXZhaWxhYmxlUHJveHkiLCJzdXBwcmVzc1dhcm5pbmdSZWYiLCJfY2FsbFJlZnJlc2hUb2tlbiIsInJlZnJlc2hfdG9rZW4iLCJnZXRVc2VyIiwiX2dldFVzZXIiLCJ1cGRhdGVVc2VyIiwiYXR0cmlidXRlcyIsIl91cGRhdGVVc2VyIiwic2Vzc2lvbkRhdGEiLCJ1c2VyRXJyb3IiLCJzZXRTZXNzaW9uIiwiX3NldFNlc3Npb24iLCJ0aW1lTm93IiwiZXhwaXJlc0F0IiwicGF5bG9hZCIsImV4cCIsInJlZnJlc2hlZFNlc3Npb24iLCJ0b2tlbl90eXBlIiwiZXhwaXJlc19pbiIsInJlZnJlc2hTZXNzaW9uIiwiX3JlZnJlc2hTZXNzaW9uIiwiZXJyb3JfZGVzY3JpcHRpb24iLCJlcnJvcl9jb2RlIiwic2VhcmNoUGFyYW1zIiwiZGVsZXRlIiwiaGlzdG9yeSIsInJlcGxhY2VTdGF0ZSIsInN0YXRlIiwidG9TdHJpbmciLCJwcm92aWRlcl90b2tlbiIsInByb3ZpZGVyX3JlZnJlc2hfdG9rZW4iLCJNYXRoIiwicm91bmQiLCJleHBpcmVzSW4iLCJwYXJzZUludCIsImFjdHVhbGx5RXhwaXJlc0luIiwiaGFzaCIsIkJvb2xlYW4iLCJjdXJyZW50U3RvcmFnZUNvbnRlbnQiLCJzaWduT3V0Iiwic2NvcGUiLCJfc2lnbk91dCIsImFjY2Vzc1Rva2VuIiwic3RhdHVzIiwib25BdXRoU3RhdGVDaGFuZ2UiLCJjYWxsYmFjayIsImlkIiwic3Vic2NyaXB0aW9uIiwidW5zdWJzY3JpYmUiLCJzZXQiLCJfZW1pdEluaXRpYWxTZXNzaW9uIiwiZ2V0IiwiZXJyIiwicmVzZXRQYXNzd29yZEZvckVtYWlsIiwiZ2V0VXNlcklkZW50aXRpZXMiLCJpZGVudGl0aWVzIiwibGlua0lkZW50aXR5IiwibGlua0lkZW50aXR5SWRUb2tlbiIsImxpbmtJZGVudGl0eU9BdXRoIiwiX2dldFVybEZvclByb3ZpZGVyIiwibGlua19pZGVudGl0eSIsInVubGlua0lkZW50aXR5IiwiaWRlbnRpdHkiLCJpZGVudGl0eV9pZCIsIl9yZWZyZXNoQWNjZXNzVG9rZW4iLCJyZWZyZXNoVG9rZW4iLCJkZWJ1Z05hbWUiLCJzdWJzdHJpbmciLCJzdGFydGVkQXQiLCJhdHRlbXB0IiwicG93IiwibmV4dEJhY2tPZmZJbnRlcnZhbCIsImlzVmFsaWRTZXNzaW9uIiwiaXMiLCJzZXBhcmF0ZVVzZXIiLCJleHBpcmVzV2l0aE1hcmdpbiIsIkluZmluaXR5IiwiZ2V0VXNlckVycm9yIiwicHJvbWlzZSIsInJlamVjdCIsImJyb2FkY2FzdCIsInBvc3RNZXNzYWdlIiwiZXJyb3JzIiwicHJvbWlzZXMiLCJmcm9tIiwidmFsdWVzIiwieCIsImkiLCJzZXNzaW9uVG9Qcm9jZXNzIiwidXNlcklzUHJveHkiLCJtYWluU2Vzc2lvbkRhdGEiLCJjbG9uZWRNYWluU2Vzc2lvbkRhdGEiLCJjbG9uZWRTZXNzaW9uIiwiX3JlbW92ZVZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2siLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiX3N0YXJ0QXV0b1JlZnJlc2giLCJfc3RvcEF1dG9SZWZyZXNoIiwidGlja2VyIiwic2V0SW50ZXJ2YWwiLCJfYXV0b1JlZnJlc2hUb2tlblRpY2siLCJ1bnJlZiIsIkRlbm8iLCJ1bnJlZlRpbWVyIiwiY2xlYXJJbnRlcnZhbCIsInN0YXJ0QXV0b1JlZnJlc2giLCJzdG9wQXV0b1JlZnJlc2giLCJleHBpcmVzSW5UaWNrcyIsImZsb29yIiwiaXNBY3F1aXJlVGltZW91dCIsIl9vblZpc2liaWxpdHlDaGFuZ2VkIiwiY2FsbGVkRnJvbUluaXRpYWxpemUiLCJtZXRob2ROYW1lIiwiZG9jdW1lbnQiLCJ2aXNpYmlsaXR5U3RhdGUiLCJ1cmxQYXJhbXMiLCJlbmNvZGVVUklDb21wb25lbnQiLCJmbG93UGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwicXVlcnkiLCJmYWN0b3JJZCIsImZyaWVuZGx5X25hbWUiLCJmcmllbmRseU5hbWUiLCJmYWN0b3JfdHlwZSIsImZhY3RvclR5cGUiLCJpc3N1ZXIiLCJ0b3RwIiwicXJfY29kZSIsImNoYWxsZW5nZV9pZCIsImNoYWxsZW5nZUlkIiwiY3JlZGVudGlhbF9yZXNwb25zZSIsInJlc3BvbnNlIiwiY3JlZGVudGlhbF9vcHRpb25zIiwiY2hhbGxlbmdlRGF0YSIsImNoYWxsZW5nZUVycm9yIiwiZmFjdG9yIiwiZmFjdG9ycyIsImN1cnJlbnRMZXZlbCIsIm5leHRMZXZlbCIsImN1cnJlbnRBdXRoZW50aWNhdGlvbk1ldGhvZHMiLCJhYWwiLCJ2ZXJpZmllZEZhY3RvcnMiLCJmaWx0ZXIiLCJhbXIiLCJhdXRob3JpemF0aW9uSWQiLCJhY3Rpb24iLCJyZWRpcmVjdF91cmwiLCJjbGllbnRfaWQiLCJjbGllbnRJZCIsIm5vUmVzb2x2ZUpzb24iLCJmZXRjaEp3ayIsImtpZCIsImp3ayIsImZpbmQiLCJrZXkiLCJnZXRDbGFpbXMiLCJoZWFkZXIiLCJyYXciLCJyYXdIZWFkZXIiLCJyYXdQYXlsb2FkIiwiYWxsb3dFeHBpcmVkIiwic2lnbmluZ0tleSIsImFsZyIsInN0YXJ0c1dpdGgiLCJjcnlwdG8iLCJjbGFpbXMiLCJhbGdvcml0aG0iLCJzdWJ0bGUiLCJpbXBvcnRLZXkiLCJpc1ZhbGlkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/constants */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\");\n/* harmony import */ var _lib_errors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/errors */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _lib_fetch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/fetch */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js\");\n/* harmony import */ var _lib_helpers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/helpers */ \"(rsc)/./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 */ \"(rsc)/./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 */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js\");\n/* harmony import */ var _lib_polyfills__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lib/polyfills */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js\");\n/* harmony import */ var _lib_version__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./lib/version */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/version.js\");\n/* harmony import */ var _lib_base64url__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./lib/base64url */ \"(rsc)/./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 */ \"(rsc)/./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 */ \"(rsc)/./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 * 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 = `${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 /**\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@\" + `${this.storageKey}:${this.instanceID} (${_lib_version__WEBPACK_IMPORTED_MODULE_8__.version}) ${new Date().toISOString()}`;\n }\n _debug(...args) {\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\", `${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\", `${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\", `${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, `${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, `${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\", `${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\", `${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 \"${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\", `${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 `${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: ${url.href}`,\n `Issued At: ${(_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: ${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: ${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: ${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: ${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: ${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)=>`- ${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\", `${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, `${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\", `${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, `${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, `${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\", `${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\", `${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\", `${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, `${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\", `${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\", `${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, `${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\", `${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 = `${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:${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${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\", `${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\", `${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, `${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, options = {}) {\n await this.initializePromise;\n return await this._acquireLock(-1, async ()=>{\n return await this._updateUser(attributes, options);\n });\n }\n async _updateUser(attributes, options = {}) {\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\", `${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, `${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 ${actuallyExpiresIn}s, should have been closer to ${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, `${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(options = {\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({ scope } = {\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, `${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, options = {}) {\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\", `${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, `${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(`${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\", `${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, `${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\", `${this.url}/user/identities/${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(${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\", `${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(`${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${expiresWithMargin ? \"\" : \" not\"} expired with margin of ${_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(${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, broadcast = true) {\n const debugName = `#_notifyAllSubscribers(${event})`;\n this._debug(debugName, \"begin\", session, `broadcast = ${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, `${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 ${expiresInTicks} ticks, a tick lasts ${_lib_constants__WEBPACK_IMPORTED_MODULE_1__.AUTO_REFRESH_TICK_DURATION_MS}ms, refresh threshold is ${_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(${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=${encodeURIComponent(provider)}`\n ];\n if (options === null || options === void 0 ? void 0 : options.redirectTo) {\n urlParams.push(`redirect_to=${encodeURIComponent(options.redirectTo)}`);\n }\n if (options === null || options === void 0 ? void 0 : options.scopes) {\n urlParams.push(`scopes=${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: `${encodeURIComponent(codeChallenge)}`,\n code_challenge_method: `${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=${options.skipBrowserRedirect}`);\n }\n return `${url}?${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\", `${this.url}/factors/${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\", `${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,${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\", `${this.url}/factors/${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\", `${this.url}/factors/${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\", `${this.url}/oauth/authorizations/${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\", `${this.url}/oauth/authorizations/${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\", `${this.url}/oauth/authorizations/${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\", `${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\", `${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, jwks = {\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\", `${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, options = {}) {\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)(`${rawHeader}.${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}\nGoTrueClient.nextInstanceID = {};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (GoTrueClient); //# sourceMappingURL=GoTrueClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvR29UcnVlQ2xpZW50LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBOEM7QUFDc0g7QUFDOE07QUFDalE7QUFDZ047QUFDalE7QUFDSztBQUNoQjtBQUNiO0FBQytCO0FBQ2M7QUFDNkc7QUFDbE0rQyxrRUFBa0JBLElBQUksOEJBQThCO0FBQ3BELE1BQU1hLGtCQUFrQjtJQUNwQkMsS0FBS3hELHNEQUFVQTtJQUNmeUQsWUFBWXZELHVEQUFXQTtJQUN2QndELGtCQUFrQjtJQUNsQkMsZ0JBQWdCO0lBQ2hCQyxvQkFBb0I7SUFDcEJDLFNBQVMvRCwyREFBZUE7SUFDeEJnRSxVQUFVO0lBQ1ZDLE9BQU87SUFDUEMsOEJBQThCO0lBQzlCQyxjQUFjO0FBQ2xCO0FBQ0EsZUFBZUMsU0FBU0MsSUFBSSxFQUFFQyxjQUFjLEVBQUVDLEVBQUU7SUFDNUMsT0FBTyxNQUFNQTtBQUNqQjtBQUNBOzs7Ozs7O0NBT0MsR0FDRCxNQUFNQyxjQUFjLENBQUM7QUFDckIsTUFBTUM7SUFDRjs7S0FFQyxHQUNELElBQUlDLE9BQU87UUFDUCxJQUFJQyxJQUFJQztRQUNSLE9BQU8sQ0FBQ0EsS0FBSyxDQUFDRCxLQUFLSCxXQUFXLENBQUMsSUFBSSxDQUFDYixVQUFVLENBQUMsTUFBTSxRQUFRZ0IsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHRCxJQUFJLE1BQU0sUUFBUUUsT0FBTyxLQUFLLElBQUlBLEtBQUs7WUFBRUMsTUFBTSxFQUFFO1FBQUM7SUFDL0k7SUFDQSxJQUFJSCxLQUFLSSxLQUFLLEVBQUU7UUFDWk4sV0FBVyxDQUFDLElBQUksQ0FBQ2IsVUFBVSxDQUFDLEdBQUdvQixPQUFPQyxNQUFNLENBQUNELE9BQU9DLE1BQU0sQ0FBQyxDQUFDLEdBQUdSLFdBQVcsQ0FBQyxJQUFJLENBQUNiLFVBQVUsQ0FBQyxHQUFHO1lBQUVlLE1BQU1JO1FBQU07SUFDaEg7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Q0FBQ2tMLE9BQU8sQ0FBQzlDO2dCQUNyQyxJQUFJcEksT0FBTztvQkFDUCxNQUFNQTtnQkFDVjtnQkFDQSwyREFBMkQ7Z0JBQzNELE9BQU87b0JBQ0hLLE1BQU07d0JBQ0Y4VSxRQUFRdEo7d0JBQ1I2STt3QkFDQTNQO29CQUNKO29CQUNBL0UsT0FBTztnQkFDWDtZQUNKO1lBQ0EsTUFBTW9WLFlBQVk5YywwREFBWUEsQ0FBQ29jLE9BQU9NLEdBQUc7WUFDekMsMkJBQTJCO1lBQzNCLE1BQU0xTixZQUFZLE1BQU00TixPQUFPRyxNQUFNLENBQUNDLFNBQVMsQ0FBQyxPQUFPUCxZQUFZSyxXQUFXLE1BQU07Z0JBQ2hGO2FBQ0g7WUFDRCx1QkFBdUI7WUFDdkIsTUFBTUcsVUFBVSxNQUFNTCxPQUFPRyxNQUFNLENBQUNwWCxNQUFNLENBQUNtWCxXQUFXOU4sV0FBV3ZDLFdBQVdyTCxrRUFBa0JBLENBQUMsQ0FBQyxFQUFFa2IsVUFBVSxDQUFDLEVBQUVDLFdBQVcsQ0FBQztZQUMzSCxJQUFJLENBQUNVLFNBQVM7Z0JBQ1YsTUFBTSxJQUFJcmUsNERBQW1CQSxDQUFDO1lBQ2xDO1lBQ0EscURBQXFEO1lBQ3JELE9BQU87Z0JBQ0htSixNQUFNO29CQUNGOFUsUUFBUXRKO29CQUNSNkk7b0JBQ0EzUDtnQkFDSjtnQkFDQS9FLE9BQU87WUFDWDtRQUNKLEVBQ0EsT0FBT0EsT0FBTztZQUNWLElBQUl2SSx3REFBV0EsQ0FBQ3VJLFFBQVE7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDUyxhQUFhLENBQUM7b0JBQUVKLE1BQU07b0JBQU1MO2dCQUFNO1lBQ2xEO1lBQ0EsTUFBTUE7UUFDVjtJQUNKO0FBQ0o7QUFDQTVFLGFBQWFnQyxjQUFjLEdBQUcsQ0FBQztBQUMvQixpRUFBZWhDLFlBQVlBLEVBQUMsQ0FDNUIsd0NBQXdDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL0dvVHJ1ZUNsaWVudC5qcz9mNjcwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHb1RydWVBZG1pbkFwaSBmcm9tICcuL0dvVHJ1ZUFkbWluQXBpJztcbmltcG9ydCB7IEFVVE9fUkVGUkVTSF9USUNLX0RVUkFUSU9OX01TLCBBVVRPX1JFRlJFU0hfVElDS19USFJFU0hPTEQsIERFRkFVTFRfSEVBREVSUywgRVhQSVJZX01BUkdJTl9NUywgR09UUlVFX1VSTCwgSldLU19UVEwsIFNUT1JBR0VfS0VZLCB9IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IsIEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvciwgQXV0aEludmFsaWRKd3RFcnJvciwgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IsIEF1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yLCBBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3IsIEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yLCBBdXRoVW5rbm93bkVycm9yLCBpc0F1dGhBcGlFcnJvciwgaXNBdXRoRXJyb3IsIGlzQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yLCBpc0F1dGhSZXRyeWFibGVGZXRjaEVycm9yLCBpc0F1dGhTZXNzaW9uTWlzc2luZ0Vycm9yLCB9IGZyb20gJy4vbGliL2Vycm9ycyc7XG5pbXBvcnQgeyBfcmVxdWVzdCwgX3Nlc3Npb25SZXNwb25zZSwgX3Nlc3Npb25SZXNwb25zZVBhc3N3b3JkLCBfc3NvUmVzcG9uc2UsIF91c2VyUmVzcG9uc2UsIH0gZnJvbSAnLi9saWIvZmV0Y2gnO1xuaW1wb3J0IHsgZGVjb2RlSldULCBkZWVwQ2xvbmUsIERlZmVycmVkLCBnZW5lcmF0ZUNhbGxiYWNrSWQsIGdldEFsZ29yaXRobSwgZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZCwgZ2V0SXRlbUFzeW5jLCBpbnNlY3VyZVVzZXJXYXJuaW5nUHJveHksIGlzQnJvd3NlciwgcGFyc2VQYXJhbWV0ZXJzRnJvbVVSTCwgcmVtb3ZlSXRlbUFzeW5jLCByZXNvbHZlRmV0Y2gsIHJldHJ5YWJsZSwgc2V0SXRlbUFzeW5jLCBzbGVlcCwgc3VwcG9ydHNMb2NhbFN0b3JhZ2UsIHVzZXJOb3RBdmFpbGFibGVQcm94eSwgdmFsaWRhdGVFeHAsIH0gZnJvbSAnLi9saWIvaGVscGVycyc7XG5pbXBvcnQgeyBtZW1vcnlMb2NhbFN0b3JhZ2VBZGFwdGVyIH0gZnJvbSAnLi9saWIvbG9jYWwtc3RvcmFnZSc7XG5pbXBvcnQgeyBMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciwgbmF2aWdhdG9yTG9jayB9IGZyb20gJy4vbGliL2xvY2tzJztcbmltcG9ydCB7IHBvbHlmaWxsR2xvYmFsVGhpcyB9IGZyb20gJy4vbGliL3BvbHlmaWxscyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi9saWIvdmVyc2lvbic7XG5pbXBvcnQgeyBieXRlc1RvQmFzZTY0VVJMLCBzdHJpbmdUb1VpbnQ4QXJyYXkgfSBmcm9tICcuL2xpYi9iYXNlNjR1cmwnO1xuaW1wb3J0IHsgY3JlYXRlU2l3ZU1lc3NhZ2UsIGZyb21IZXgsIGdldEFkZHJlc3MsIHRvSGV4LCB9IGZyb20gJy4vbGliL3dlYjMvZXRoZXJldW0nO1xuaW1wb3J0IHsgZGVzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zLCBkZXNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucywgc2VyaWFsaXplQ3JlZGVudGlhbENyZWF0aW9uUmVzcG9uc2UsIHNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0UmVzcG9uc2UsIFdlYkF1dGhuQXBpLCB9IGZyb20gJy4vbGliL3dlYmF1dGhuJztcbnBvbHlmaWxsR2xvYmFsVGhpcygpOyAvLyBNYWtlIFwiZ2xvYmFsVGhpc1wiIGF2YWlsYWJsZVxuY29uc3QgREVGQVVMVF9PUFRJT05TID0ge1xuICAgIHVybDogR09UUlVFX1VSTCxcbiAgICBzdG9yYWdlS2V5OiBTVE9SQUdFX0tFWSxcbiAgICBhdXRvUmVmcmVzaFRva2VuOiB0cnVlLFxuICAgIHBlcnNpc3RTZXNzaW9uOiB0cnVlLFxuICAgIGRldGVjdFNlc3Npb25JblVybDogdHJ1ZSxcbiAgICBoZWFkZXJzOiBERUZBVUxUX0hFQURFUlMsXG4gICAgZmxvd1R5cGU6ICdpbXBsaWNpdCcsXG4gICAgZGVidWc6IGZhbHNlLFxuICAgIGhhc0N1c3RvbUF1dGhvcml6YXRpb25IZWFkZXI6IGZhbHNlLFxuICAgIHRocm93T25FcnJvcjogZmFsc2UsXG59O1xuYXN5bmMgZnVuY3Rpb24gbG9ja05vT3AobmFtZSwgYWNxdWlyZVRpbWVvdXQsIGZuKSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG59XG4vKipcbiAqIENhY2hlcyBKV0tTIHZhbHVlcyBmb3IgYWxsIGNsaWVudHMgY3JlYXRlZCBpbiB0aGUgc2FtZSBlbnZpcm9ubWVudC4gVGhpcyBpc1xuICogZXNwZWNpYWxseSB1c2VmdWwgZm9yIHNoYXJlZC1tZW1vcnkgZXhlY3V0aW9uIGVudmlyb25tZW50cyBzdWNoIGFzIFZlcmNlbCdzXG4gKiBGbHVpZCBDb21wdXRlLCBBV1MgTGFtYmRhIG9yIFN1cGFiYXNlJ3MgRWRnZSBGdW5jdGlvbnMuIFJlZ2FyZGxlc3Mgb2YgaG93XG4gKiBtYW55IGNsaWVudHMgYXJlIGNyZWF0ZWQsIGlmIHRoZXkgc2hhcmUgdGhlIHNhbWUgc3RvcmFnZSBrZXkgdGhleSB3aWxsIHVzZVxuICogdGhlIHNhbWUgSldLUyBjYWNoZSwgc2lnbmlmaWNhbnRseSBzcGVlZGluZyB1cCBnZXRDbGFpbXMoKSB3aXRoIGFzeW1tZXRyaWNcbiAqIEpXVHMuXG4gKi9cbmNvbnN0IEdMT0JBTF9KV0tTID0ge307XG5jbGFzcyBHb1RydWVDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBKV0tTIHVzZWQgZm9yIHZlcmlmeWluZyBhc3ltbWV0cmljIEpXVHNcbiAgICAgKi9cbiAgICBnZXQgandrcygpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IEdMT0JBTF9KV0tTW3RoaXMuc3RvcmFnZUtleV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5qd2tzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB7IGtleXM6IFtdIH07XG4gICAgfVxuICAgIHNldCBqd2tzKHZhbHVlKSB7XG4gICAgICAgIEdMT0JBTF9KV0tTW3RoaXMuc3RvcmFnZUtleV0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIEdMT0JBTF9KV0tTW3RoaXMuc3RvcmFnZUtleV0pLCB7IGp3a3M6IHZhbHVlIH0pO1xuICAgIH1cbiAgICBnZXQgandrc19jYWNoZWRfYXQoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSBHTE9CQUxfSldLU1t0aGlzLnN0b3JhZ2VLZXldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FjaGVkQXQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICAgIH1cbiAgICBzZXQgandrc19jYWNoZWRfYXQodmFsdWUpIHtcbiAgICAgICAgR0xPQkFMX0pXS1NbdGhpcy5zdG9yYWdlS2V5XSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgR0xPQkFMX0pXS1NbdGhpcy5zdG9yYWdlS2V5XSksIHsgY2FjaGVkQXQ6IHZhbHVlIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgY2xpZW50IGZvciB1c2UgaW4gdGhlIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgR29UcnVlQ2xpZW50IH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gICAgICpcbiAgICAgKiBjb25zdCBhdXRoID0gbmV3IEdvVHJ1ZUNsaWVudCh7XG4gICAgICogICB1cmw6ICdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vYXV0aC92MScsXG4gICAgICogICBoZWFkZXJzOiB7IGFwaWtleTogJ3B1YmxpYy1hbm9uLWtleScgfSxcbiAgICAgKiAgIHN0b3JhZ2VLZXk6ICdzdXBhYmFzZS1hdXRoJyxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVzZXJTdG9yYWdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZUVtaXR0ZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmF1dG9SZWZyZXNoVGlja2VyID0gbnVsbDtcbiAgICAgICAgdGhpcy52aXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWZyZXNoaW5nRGVmZXJyZWQgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogS2VlcHMgdHJhY2sgb2YgdGhlIGFzeW5jIGNsaWVudCBpbml0aWFsaXphdGlvbi5cbiAgICAgICAgICogV2hlbiBudWxsIG9yIG5vdCB5ZXQgcmVzb2x2ZWQgdGhlIGF1dGggc3RhdGUgaXMgYHVua25vd25gXG4gICAgICAgICAqIE9uY2UgcmVzb2x2ZWQgdGhlIGF1dGggc3RhdGUgaXMga25vd24gYW5kIGl0J3Mgc2FmZSB0byBjYWxsIGFueSBmdXJ0aGVyIGNsaWVudCBtZXRob2RzLlxuICAgICAgICAgKiBLZWVwIGV4dHJhIGNhcmUgdG8gbmV2ZXIgcmVqZWN0IG9yIHRocm93IHVuY2F1Z2h0IGVycm9yc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbml0aWFsaXplUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZGV0ZWN0U2Vzc2lvbkluVXJsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oYXNDdXN0b21BdXRob3JpemF0aW9uSGVhZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NHZXRTZXNzaW9uV2FybmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvY2tBY3F1aXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBlbmRpbmdJbkxvY2sgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gYnJvYWRjYXN0IHN0YXRlIGNoYW5nZSBldmVudHMgdG8gb3RoZXIgdGFicyBsaXN0ZW5pbmcuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwgPSBudWxsO1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGNvbnNvbGUubG9nO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TKSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc3RvcmFnZUtleSA9IHNldHRpbmdzLnN0b3JhZ2VLZXk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VJRCA9IChfYSA9IEdvVHJ1ZUNsaWVudC5uZXh0SW5zdGFuY2VJRFt0aGlzLnN0b3JhZ2VLZXldKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICBHb1RydWVDbGllbnQubmV4dEluc3RhbmNlSURbdGhpcy5zdG9yYWdlS2V5XSA9IHRoaXMuaW5zdGFuY2VJRCArIDE7XG4gICAgICAgIHRoaXMubG9nRGVidWdNZXNzYWdlcyA9ICEhc2V0dGluZ3MuZGVidWc7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuZGVidWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyID0gc2V0dGluZ3MuZGVidWc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VJRCA+IDAgJiYgaXNCcm93c2VyKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHt0aGlzLl9sb2dQcmVmaXgoKX0gTXVsdGlwbGUgR29UcnVlQ2xpZW50IGluc3RhbmNlcyBkZXRlY3RlZCBpbiB0aGUgc2FtZSBicm93c2VyIGNvbnRleHQuIEl0IGlzIG5vdCBhbiBlcnJvciwgYnV0IHRoaXMgc2hvdWxkIGJlIGF2b2lkZWQgYXMgaXQgbWF5IHByb2R1Y2UgdW5kZWZpbmVkIGJlaGF2aW9yIHdoZW4gdXNlZCBjb25jdXJyZW50bHkgdW5kZXIgdGhlIHNhbWUgc3RvcmFnZSBrZXkuYDtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvZ0RlYnVnTWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRyYWNlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVyc2lzdFNlc3Npb24gPSBzZXR0aW5ncy5wZXJzaXN0U2Vzc2lvbjtcbiAgICAgICAgdGhpcy5hdXRvUmVmcmVzaFRva2VuID0gc2V0dGluZ3MuYXV0b1JlZnJlc2hUb2tlbjtcbiAgICAgICAgdGhpcy5hZG1pbiA9IG5ldyBHb1RydWVBZG1pbkFwaSh7XG4gICAgICAgICAgICB1cmw6IHNldHRpbmdzLnVybCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHNldHRpbmdzLmhlYWRlcnMsXG4gICAgICAgICAgICBmZXRjaDogc2V0dGluZ3MuZmV0Y2gsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVybCA9IHNldHRpbmdzLnVybDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gc2V0dGluZ3MuaGVhZGVycztcbiAgICAgICAgdGhpcy5mZXRjaCA9IHJlc29sdmVGZXRjaChzZXR0aW5ncy5mZXRjaCk7XG4gICAgICAgIHRoaXMubG9jayA9IHNldHRpbmdzLmxvY2sgfHwgbG9ja05vT3A7XG4gICAgICAgIHRoaXMuZGV0ZWN0U2Vzc2lvbkluVXJsID0gc2V0dGluZ3MuZGV0ZWN0U2Vzc2lvbkluVXJsO1xuICAgICAgICB0aGlzLmZsb3dUeXBlID0gc2V0dGluZ3MuZmxvd1R5cGU7XG4gICAgICAgIHRoaXMuaGFzQ3VzdG9tQXV0aG9yaXphdGlvbkhlYWRlciA9IHNldHRpbmdzLmhhc0N1c3RvbUF1dGhvcml6YXRpb25IZWFkZXI7XG4gICAgICAgIHRoaXMudGhyb3dPbkVycm9yID0gc2V0dGluZ3MudGhyb3dPbkVycm9yO1xuICAgICAgICBpZiAoc2V0dGluZ3MubG9jaykge1xuICAgICAgICAgICAgdGhpcy5sb2NrID0gc2V0dGluZ3MubG9jaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnBlcnNpc3RTZXNzaW9uICYmIGlzQnJvd3NlcigpICYmICgoX2IgPSBnbG9iYWxUaGlzID09PSBudWxsIHx8IGdsb2JhbFRoaXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdsb2JhbFRoaXMubmF2aWdhdG9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubG9ja3MpKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2sgPSBuYXZpZ2F0b3JMb2NrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2NrID0gbG9ja05vT3A7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmp3a3MpIHtcbiAgICAgICAgICAgIHRoaXMuandrcyA9IHsga2V5czogW10gfTtcbiAgICAgICAgICAgIHRoaXMuandrc19jYWNoZWRfYXQgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1mYSA9IHtcbiAgICAgICAgICAgIHZlcmlmeTogdGhpcy5fdmVyaWZ5LmJpbmQodGhpcyksXG4gICAgICAgICAgICBlbnJvbGw6IHRoaXMuX2Vucm9sbC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdW5lbnJvbGw6IHRoaXMuX3VuZW5yb2xsLmJpbmQodGhpcyksXG4gICAgICAgICAgICBjaGFsbGVuZ2U6IHRoaXMuX2NoYWxsZW5nZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgbGlzdEZhY3RvcnM6IHRoaXMuX2xpc3RGYWN0b3JzLmJpbmQodGhpcyksXG4gICAgICAgICAgICBjaGFsbGVuZ2VBbmRWZXJpZnk6IHRoaXMuX2NoYWxsZW5nZUFuZFZlcmlmeS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZ2V0QXV0aGVudGljYXRvckFzc3VyYW5jZUxldmVsOiB0aGlzLl9nZXRBdXRoZW50aWNhdG9yQXNzdXJhbmNlTGV2ZWwuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHdlYmF1dGhuOiBuZXcgV2ViQXV0aG5BcGkodGhpcyksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub2F1dGggPSB7XG4gICAgICAgICAgICBnZXRBdXRob3JpemF0aW9uRGV0YWlsczogdGhpcy5fZ2V0QXV0aG9yaXphdGlvbkRldGFpbHMuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGFwcHJvdmVBdXRob3JpemF0aW9uOiB0aGlzLl9hcHByb3ZlQXV0aG9yaXphdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZGVueUF1dGhvcml6YXRpb246IHRoaXMuX2RlbnlBdXRob3JpemF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgICAgICBsaXN0R3JhbnRzOiB0aGlzLl9saXN0T0F1dGhHcmFudHMuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJldm9rZUdyYW50OiB0aGlzLl9yZXZva2VPQXV0aEdyYW50LmJpbmQodGhpcyksXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnBlcnNpc3RTZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc3RvcmFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZSA9IHNldHRpbmdzLnN0b3JhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UgPSBnbG9iYWxUaGlzLmxvY2FsU3RvcmFnZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVtb3J5U3RvcmFnZSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2UgPSBtZW1vcnlMb2NhbFN0b3JhZ2VBZGFwdGVyKHRoaXMubWVtb3J5U3RvcmFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLnVzZXJTdG9yYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyU3RvcmFnZSA9IHNldHRpbmdzLnVzZXJTdG9yYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tZW1vcnlTdG9yYWdlID0ge307XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2UgPSBtZW1vcnlMb2NhbFN0b3JhZ2VBZGFwdGVyKHRoaXMubWVtb3J5U3RvcmFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQnJvd3NlcigpICYmIGdsb2JhbFRoaXMuQnJvYWRjYXN0Q2hhbm5lbCAmJiB0aGlzLnBlcnNpc3RTZXNzaW9uICYmIHRoaXMuc3RvcmFnZUtleSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwgPSBuZXcgZ2xvYmFsVGhpcy5Ccm9hZGNhc3RDaGFubmVsKHRoaXMuc3RvcmFnZUtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYSBuZXcgQnJvYWRjYXN0Q2hhbm5lbCwgbXVsdGktdGFiIHN0YXRlIGNoYW5nZXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoX2MgPSB0aGlzLmJyb2FkY2FzdENoYW5uZWwpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJ3JlY2VpdmVkIGJyb2FkY2FzdCBub3RpZmljYXRpb24gZnJvbSBvdGhlciB0YWIgb3IgY2xpZW50JywgZXZlbnQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKGV2ZW50LmRhdGEuZXZlbnQsIGV2ZW50LmRhdGEuc2Vzc2lvbiwgZmFsc2UpOyAvLyBicm9hZGNhc3QgPSBmYWxzZSBzbyB3ZSBkb24ndCBnZXQgYW4gZW5kbGVzcyBsb29wIG9mIG1lc3NhZ2VzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIGVycm9yIHRocm93aW5nIG1vZGUgaXMgZW5hYmxlZCBmb3IgdGhpcyBjbGllbnQuXG4gICAgICovXG4gICAgaXNUaHJvd09uRXJyb3JFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHJvd09uRXJyb3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENlbnRyYWxpemVzIHJldHVybiBoYW5kbGluZyB3aXRoIG9wdGlvbmFsIGVycm9yIHRocm93aW5nLiBXaGVuIGB0aHJvd09uRXJyb3JgIGlzIGVuYWJsZWRcbiAgICAgKiBhbmQgdGhlIHByb3ZpZGVkIHJlc3VsdCBjb250YWlucyBhIG5vbi1udWxsaXNoIGVycm9yLCB0aGUgZXJyb3IgaXMgdGhyb3duIGluc3RlYWQgb2ZcbiAgICAgKiBiZWluZyByZXR1cm5lZC4gVGhpcyBlbnN1cmVzIGNvbnNpc3RlbnQgYmVoYXZpb3IgYWNyb3NzIGFsbCBwdWJsaWMgQVBJIG1ldGhvZHMuXG4gICAgICovXG4gICAgX3JldHVyblJlc3VsdChyZXN1bHQpIHtcbiAgICAgICAgaWYgKHRoaXMudGhyb3dPbkVycm9yICYmIHJlc3VsdCAmJiByZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBfbG9nUHJlZml4KCkge1xuICAgICAgICByZXR1cm4gKCdHb1RydWVDbGllbnRAJyArXG4gICAgICAgICAgICBgJHt0aGlzLnN0b3JhZ2VLZXl9OiR7dGhpcy5pbnN0YW5jZUlEfSAoJHt2ZXJzaW9ufSkgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgfVxuICAgIF9kZWJ1ZyguLi5hcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ0RlYnVnTWVzc2FnZXMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyKHRoaXMuX2xvZ1ByZWZpeCgpLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgdGhlIGNsaWVudCBzZXNzaW9uIGVpdGhlciBmcm9tIHRoZSB1cmwgb3IgZnJvbSBzdG9yYWdlLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgY2xpZW50LCBidXQgc2hvdWxkIGFsc28gYmUgY2FsbGVkXG4gICAgICogbWFudWFsbHkgd2hlbiBjaGVja2luZyBmb3IgYW4gZXJyb3IgZnJvbSBhbiBhdXRoIHJlZGlyZWN0IChvYXV0aCwgbWFnaWNsaW5rLCBwYXNzd29yZCByZWNvdmVyeSwgZXRjKS5cbiAgICAgKi9cbiAgICBhc3luYyBpbml0aWFsaXplKCkge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0aWFsaXplUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faW5pdGlhbGl6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJTVBPUlRBTlQ6XG4gICAgICogMS4gTmV2ZXIgdGhyb3cgaW4gdGhpcyBtZXRob2QsIGFzIGl0IGlzIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvclxuICAgICAqIDIuIE5ldmVyIHJldHVybiBhIHNlc3Npb24gZnJvbSB0aGlzIG1ldGhvZCBhcyBpdCB3b3VsZCBiZSBjYWNoZWQgb3ZlclxuICAgICAqICAgIHRoZSB3aG9sZSBsaWZldGltZSBvZiB0aGUgY2xpZW50XG4gICAgICovXG4gICAgYXN5bmMgX2luaXRpYWxpemUoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIGxldCBjYWxsYmFja1VybFR5cGUgPSAnbm9uZSc7XG4gICAgICAgICAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJzZVBhcmFtZXRlcnNGcm9tVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNJbXBsaWNpdEdyYW50Q2FsbGJhY2socGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1VybFR5cGUgPSAnaW1wbGljaXQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhd2FpdCB0aGlzLl9pc1BLQ0VDYWxsYmFjayhwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrVXJsVHlwZSA9ICdwa2NlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEF0dGVtcHQgdG8gZ2V0IHRoZSBzZXNzaW9uIGZyb20gdGhlIFVSTCBvbmx5IGlmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZFxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIE5vdGU6IElmIHRoZSBVUkwgaXNuJ3Qgb25lIG9mIHRoZSBjYWxsYmFjayB1cmwgdHlwZXMgKGltcGxpY2l0IG9yIHBrY2UpLFxuICAgICAgICAgICAgICogdGhlbiB0aGVyZSBjb3VsZCBiZSBhbiBleGlzdGluZyBzZXNzaW9uIHNvIHdlIGRvbid0IHdhbnQgdG8gcHJlbWF0dXJlbHkgcmVtb3ZlIGl0XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChpc0Jyb3dzZXIoKSAmJiB0aGlzLmRldGVjdFNlc3Npb25JblVybCAmJiBjYWxsYmFja1VybFR5cGUgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX2dldFNlc3Npb25Gcm9tVVJMKHBhcmFtcywgY2FsbGJhY2tVcmxUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfaW5pdGlhbGl6ZSgpJywgJ2Vycm9yIGRldGVjdGluZyBzZXNzaW9uIGZyb20gVVJMJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSAoX2EgPSBlcnJvci5kZXRhaWxzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdpZGVudGl0eV9hbHJlYWR5X2V4aXN0cycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPT09ICdpZGVudGl0eV9ub3RfZm91bmQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlID09PSAnc2luZ2xlX2lkZW50aXR5X25vdF9kZWxldGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3IgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgbG9naW4gYXR0ZW1wdCB2aWEgdXJsLFxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgb2xkIHNlc3Npb24gYXMgaW4gdmVyaWZ5T3RwLCBzaWduVXAgYW5kIHNpZ25JbldpdGgqXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlbW92ZVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3IgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzZXNzaW9uLCByZWRpcmVjdFR5cGUgfSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfaW5pdGlhbGl6ZSgpJywgJ2RldGVjdGVkIHNlc3Npb24gaW4gVVJMJywgc2Vzc2lvbiwgJ3JlZGlyZWN0IHR5cGUnLCByZWRpcmVjdFR5cGUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RUeXBlID09PSAncmVjb3ZlcnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnUEFTU1dPUkRfUkVDT1ZFUlknLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBubyBsb2dpbiBhdHRlbXB0IHZpYSBjYWxsYmFjayB1cmwgdHJ5IHRvIHJlY292ZXIgc2Vzc2lvbiBmcm9tIHN0b3JhZ2VcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlY292ZXJBbmRSZWZyZXNoKCk7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoe1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24nLCBlcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2luaXRpYWxpemUoKScsICdlbmQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGFub255bW91cyB1c2VyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBzZXNzaW9uIHdoZXJlIHRoZSBpc19hbm9ueW1vdXMgY2xhaW0gaW4gdGhlIGFjY2VzcyB0b2tlbiBKV1Qgc2V0IHRvIHRydWVcbiAgICAgKi9cbiAgICBhc3luYyBzaWduSW5Bbm9ueW1vdXNseShjcmVkZW50aWFscykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L3NpZ251cGAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiAoX2IgPSAoX2EgPSBjcmVkZW50aWFscyA9PT0gbnVsbCB8fCBjcmVkZW50aWFscyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRhdGEpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9LFxuICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiAoX2MgPSBjcmVkZW50aWFscyA9PT0gbnVsbCB8fCBjcmVkZW50aWFscyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeGZvcm06IF9zZXNzaW9uUmVzcG9uc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IHJlcztcbiAgICAgICAgICAgIGlmIChlcnJvciB8fCAhZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3I6IGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGRhdGEuc2Vzc2lvbjtcbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBkYXRhLnVzZXI7XG4gICAgICAgICAgICBpZiAoZGF0YS5zZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnU0lHTkVEX0lOJywgc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHVzZXIuXG4gICAgICpcbiAgICAgKiBCZSBhd2FyZSB0aGF0IGlmIGEgdXNlciBhY2NvdW50IGV4aXN0cyBpbiB0aGUgc3lzdGVtIHlvdSBtYXkgZ2V0IGJhY2sgYW5cbiAgICAgKiBlcnJvciBtZXNzYWdlIHRoYXQgYXR0ZW1wdHMgdG8gaGlkZSB0aGlzIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuXG4gICAgICogVGhpcyBtZXRob2QgaGFzIHN1cHBvcnQgZm9yIFBLQ0UgdmlhIGVtYWlsIHNpZ251cHMuIFRoZSBQS0NFIGZsb3cgY2Fubm90IGJlIHVzZWQgd2hlbiBhdXRvY29uZmlybSBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBsb2dnZWQtaW4gc2Vzc2lvbiBpZiB0aGUgc2VydmVyIGhhcyBcImF1dG9jb25maXJtXCIgT05cbiAgICAgKiBAcmV0dXJucyBBIHVzZXIgaWYgdGhlIHNlcnZlciBoYXMgXCJhdXRvY29uZmlybVwiIE9GRlxuICAgICAqL1xuICAgIGFzeW5jIHNpZ25VcChjcmVkZW50aWFscykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXM7XG4gICAgICAgICAgICBpZiAoJ2VtYWlsJyBpbiBjcmVkZW50aWFscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZW1haWwsIHBhc3N3b3JkLCBvcHRpb25zIH0gPSBjcmVkZW50aWFscztcbiAgICAgICAgICAgICAgICBsZXQgY29kZUNoYWxsZW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2VNZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgICAgICBbY29kZUNoYWxsZW5nZSwgY29kZUNoYWxsZW5nZU1ldGhvZF0gPSBhd2FpdCBnZXRDb2RlQ2hhbGxlbmdlQW5kTWV0aG9kKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vc2lnbnVwYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5lbWFpbFJlZGlyZWN0VG8sXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGF0YSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY2FwdGNoYVRva2VuIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2NoYWxsZW5nZTogY29kZUNoYWxsZW5nZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfY2hhbGxlbmdlX21ldGhvZDogY29kZUNoYWxsZW5nZU1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeGZvcm06IF9zZXNzaW9uUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgncGhvbmUnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwaG9uZSwgcGFzc3dvcmQsIG9wdGlvbnMgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L3NpZ251cGAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRhdGEpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogKF9jID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNoYW5uZWwpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6ICdzbXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlciBhbmQgYSBwYXNzd29yZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzO1xuICAgICAgICAgICAgaWYgKGVycm9yIHx8ICFkYXRhKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvcjogZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gZGF0YS5zZXNzaW9uO1xuICAgICAgICAgICAgY29uc3QgdXNlciA9IGRhdGEudXNlcjtcbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGluIGFuIGV4aXN0aW5nIHVzZXIgd2l0aCBhbiBlbWFpbCBhbmQgcGFzc3dvcmQgb3IgcGhvbmUgYW5kIHBhc3N3b3JkLlxuICAgICAqXG4gICAgICogQmUgYXdhcmUgdGhhdCB5b3UgbWF5IGdldCBiYWNrIGFuIGVycm9yIG1lc3NhZ2UgdGhhdCB3aWxsIG5vdCBkaXN0aW5ndWlzaFxuICAgICAqIGJldHdlZW4gdGhlIGNhc2VzIHdoZXJlIHRoZSBhY2NvdW50IGRvZXMgbm90IGV4aXN0IG9yIHRoYXQgdGhlXG4gICAgICogZW1haWwvcGhvbmUgYW5kIHBhc3N3b3JkIGNvbWJpbmF0aW9uIGlzIHdyb25nIG9yIHRoYXQgdGhlIGFjY291bnQgY2FuIG9ubHlcbiAgICAgKiBiZSBhY2Nlc3NlZCB2aWEgc29jaWFsIGxvZ2luLlxuICAgICAqL1xuICAgIGFzeW5jIHNpZ25JbldpdGhQYXNzd29yZChjcmVkZW50aWFscykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlcztcbiAgICAgICAgICAgIGlmICgnZW1haWwnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlbWFpbCwgcGFzc3dvcmQsIG9wdGlvbnMgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIHJlcyA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L3Rva2VuP2dyYW50X3R5cGU9cGFzc3dvcmRgLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeGZvcm06IF9zZXNzaW9uUmVzcG9uc2VQYXNzd29yZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCdwaG9uZScgaW4gY3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHBob25lLCBwYXNzd29yZCwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT1wYXNzd29yZGAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZVBhc3N3b3JkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvcignWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyIGFuZCBhIHBhc3N3b3JkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSByZXM7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWRhdGEgfHwgIWRhdGEuc2Vzc2lvbiB8fCAhZGF0YS51c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52YWxpZFRva2VuRXJyb3IgPSBuZXcgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBpbnZhbGlkVG9rZW5FcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7IHVzZXI6IGRhdGEudXNlciwgc2Vzc2lvbjogZGF0YS5zZXNzaW9uIH0sIChkYXRhLndlYWtfcGFzc3dvcmQgPyB7IHdlYWtQYXNzd29yZDogZGF0YS53ZWFrX3Bhc3N3b3JkIH0gOiBudWxsKSksXG4gICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGluIGFuIGV4aXN0aW5nIHVzZXIgdmlhIGEgdGhpcmQtcGFydHkgcHJvdmlkZXIuXG4gICAgICogVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIFBLQ0UgZmxvdy5cbiAgICAgKi9cbiAgICBhc3luYyBzaWduSW5XaXRoT0F1dGgoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faGFuZGxlUHJvdmlkZXJTaWduSW4oY3JlZGVudGlhbHMucHJvdmlkZXIsIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VG86IChfYSA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWRpcmVjdFRvLFxuICAgICAgICAgICAgc2NvcGVzOiAoX2IgPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc2NvcGVzLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IChfYyA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIHNraXBCcm93c2VyUmVkaXJlY3Q6IChfZCA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5za2lwQnJvd3NlclJlZGlyZWN0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGluIGFuIGV4aXN0aW5nIHVzZXIgYnkgZXhjaGFuZ2luZyBhbiBBdXRoIENvZGUgaXNzdWVkIGR1cmluZyB0aGUgUEtDRSBmbG93LlxuICAgICAqL1xuICAgIGFzeW5jIGV4Y2hhbmdlQ29kZUZvclNlc3Npb24oYXV0aENvZGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhjaGFuZ2VDb2RlRm9yU2Vzc2lvbihhdXRoQ29kZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaWducyBpbiBhIHVzZXIgYnkgdmVyaWZ5aW5nIGEgbWVzc2FnZSBzaWduZWQgYnkgdGhlIHVzZXIncyBwcml2YXRlIGtleS5cbiAgICAgKiBTdXBwb3J0cyBFdGhlcmV1bSAodmlhIFNpZ24tSW4tV2l0aC1FdGhlcmV1bSkgJiBTb2xhbmEgKFNpZ24tSW4tV2l0aC1Tb2xhbmEpIHN0YW5kYXJkcyxcbiAgICAgKiBib3RoIG9mIHdoaWNoIGRlcml2ZSBmcm9tIHRoZSBFSVAtNDM2MSBzdGFuZGFyZFxuICAgICAqIFdpdGggc2xpZ2h0IHZhcmlhdGlvbiBvbiBTb2xhbmEncyBzaWRlLlxuICAgICAqIEByZWZlcmVuY2UgaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBTL2VpcC00MzYxXG4gICAgICovXG4gICAgYXN5bmMgc2lnbkluV2l0aFdlYjMoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgY29uc3QgeyBjaGFpbiB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgIHN3aXRjaCAoY2hhaW4pIHtcbiAgICAgICAgICAgIGNhc2UgJ2V0aGVyZXVtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduSW5XaXRoRXRoZXJldW0oY3JlZGVudGlhbHMpO1xuICAgICAgICAgICAgY2FzZSAnc29sYW5hJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduSW5XaXRoU29sYW5hKGNyZWRlbnRpYWxzKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogVW5zdXBwb3J0ZWQgY2hhaW4gXCIke2NoYWlufVwiYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2lnbkluV2l0aEV0aGVyZXVtKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2w7XG4gICAgICAgIC8vIFRPRE86IGZsYXR0ZW4gdHlwZVxuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgbGV0IHNpZ25hdHVyZTtcbiAgICAgICAgaWYgKCdtZXNzYWdlJyBpbiBjcmVkZW50aWFscykge1xuICAgICAgICAgICAgbWVzc2FnZSA9IGNyZWRlbnRpYWxzLm1lc3NhZ2U7XG4gICAgICAgICAgICBzaWduYXR1cmUgPSBjcmVkZW50aWFscy5zaWduYXR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGNoYWluLCB3YWxsZXQsIHN0YXRlbWVudCwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICBsZXQgcmVzb2x2ZWRXYWxsZXQ7XG4gICAgICAgICAgICBpZiAoIWlzQnJvd3NlcigpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3YWxsZXQgIT09ICdvYmplY3QnIHx8ICEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc3VwYWJhc2UvYXV0aC1qczogQm90aCB3YWxsZXQgYW5kIHVybCBtdXN0IGJlIHNwZWNpZmllZCBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmVkV2FsbGV0ID0gd2FsbGV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHdhbGxldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlZFdhbGxldCA9IHdhbGxldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvd0FueSA9IHdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoJ2V0aGVyZXVtJyBpbiB3aW5kb3dBbnkgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHdpbmRvd0FueS5ldGhlcmV1bSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgJ3JlcXVlc3QnIGluIHdpbmRvd0FueS5ldGhlcmV1bSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygd2luZG93QW55LmV0aGVyZXVtLnJlcXVlc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRXYWxsZXQgPSB3aW5kb3dBbnkuZXRoZXJldW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBObyBjb21wYXRpYmxlIEV0aGVyZXVtIHdhbGxldCBpbnRlcmZhY2Ugb24gdGhlIHdpbmRvdyBvYmplY3QgKHdpbmRvdy5ldGhlcmV1bSkgZGV0ZWN0ZWQuIE1ha2Ugc3VyZSB0aGUgdXNlciBhbHJlYWR5IGhhcyBhIHdhbGxldCBpbnN0YWxsZWQgYW5kIGNvbm5lY3RlZCBmb3IgdGhpcyBhcHAuIFByZWZlciBwYXNzaW5nIHRoZSB3YWxsZXQgaW50ZXJmYWNlIG9iamVjdCBkaXJlY3RseSB0byBzaWduSW5XaXRoV2ViMyh7IGNoYWluOiAnZXRoZXJldW0nLCB3YWxsZXQ6IHJlc29sdmVkVXNlcldhbGxldCB9KSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnVybCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgICAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCByZXNvbHZlZFdhbGxldFxuICAgICAgICAgICAgICAgIC5yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdldGhfcmVxdWVzdEFjY291bnRzJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKGFjY3MpID0+IGFjY3MpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBXYWxsZXQgbWV0aG9kIGV0aF9yZXF1ZXN0QWNjb3VudHMgaXMgbWlzc2luZyBvciBpbnZhbGlkYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghYWNjb3VudHMgfHwgYWNjb3VudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogTm8gYWNjb3VudHMgYXZhaWxhYmxlLiBQbGVhc2UgZW5zdXJlIHRoZSB3YWxsZXQgaXMgY29ubmVjdGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9IGdldEFkZHJlc3MoYWNjb3VudHNbMF0pO1xuICAgICAgICAgICAgbGV0IGNoYWluSWQgPSAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aEV0aGVyZXVtKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2hhaW5JZDtcbiAgICAgICAgICAgIGlmICghY2hhaW5JZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYWluSWRIZXggPSBhd2FpdCByZXNvbHZlZFdhbGxldC5yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnZXRoX2NoYWluSWQnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNoYWluSWQgPSBmcm9tSGV4KGNoYWluSWRIZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2l3ZU1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAgZG9tYWluOiB1cmwuaG9zdCxcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDogc3RhdGVtZW50LFxuICAgICAgICAgICAgICAgIHVyaTogdXJsLmhyZWYsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogJzEnLFxuICAgICAgICAgICAgICAgIGNoYWluSWQ6IGNoYWluSWQsXG4gICAgICAgICAgICAgICAgbm9uY2U6IChfYyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoRXRoZXJldW0pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5ub25jZSxcbiAgICAgICAgICAgICAgICBpc3N1ZWRBdDogKF9lID0gKF9kID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhFdGhlcmV1bSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmlzc3VlZEF0KSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGV4cGlyYXRpb25UaW1lOiAoX2YgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aEV0aGVyZXVtKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YuZXhwaXJhdGlvblRpbWUsXG4gICAgICAgICAgICAgICAgbm90QmVmb3JlOiAoX2cgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aEV0aGVyZXVtKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cubm90QmVmb3JlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogKF9oID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhFdGhlcmV1bSkgPT09IG51bGwgfHwgX2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9oLnJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IChfaiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoRXRoZXJldW0pID09PSBudWxsIHx8IF9qID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfai5yZXNvdXJjZXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWVzc2FnZSA9IGNyZWF0ZVNpd2VNZXNzYWdlKHNpd2VNZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIFNpZ24gbWVzc2FnZVxuICAgICAgICAgICAgc2lnbmF0dXJlID0gKGF3YWl0IHJlc29sdmVkV2FsbGV0LnJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ3BlcnNvbmFsX3NpZ24nLFxuICAgICAgICAgICAgICAgIHBhcmFtczogW3RvSGV4KG1lc3NhZ2UpLCBhZGRyZXNzXSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT13ZWIzYCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiBPYmplY3QuYXNzaWduKHsgY2hhaW46ICdldGhlcmV1bScsIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSB9LCAoKChfayA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9rID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfay5jYXB0Y2hhVG9rZW4pXG4gICAgICAgICAgICAgICAgICAgID8geyBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiAoX2wgPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2wuY2FwdGNoYVRva2VuIH0gfVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwpKSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEuc2Vzc2lvbiB8fCAhZGF0YS51c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52YWxpZFRva2VuRXJyb3IgPSBuZXcgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBpbnZhbGlkVG9rZW5FcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpLCBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2lnbkluV2l0aFNvbGFuYShjcmVkZW50aWFscykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbTtcbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIGxldCBzaWduYXR1cmU7XG4gICAgICAgIGlmICgnbWVzc2FnZScgaW4gY3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBjcmVkZW50aWFscy5tZXNzYWdlO1xuICAgICAgICAgICAgc2lnbmF0dXJlID0gY3JlZGVudGlhbHMuc2lnbmF0dXJlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBjaGFpbiwgd2FsbGV0LCBzdGF0ZW1lbnQsIG9wdGlvbnMgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgbGV0IHJlc29sdmVkV2FsbGV0O1xuICAgICAgICAgICAgaWYgKCFpc0Jyb3dzZXIoKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2FsbGV0ICE9PSAnb2JqZWN0JyB8fCAhKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy51cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQHN1cGFiYXNlL2F1dGgtanM6IEJvdGggd2FsbGV0IGFuZCB1cmwgbXVzdCBiZSBzcGVjaWZpZWQgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlZFdhbGxldCA9IHdhbGxldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB3YWxsZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRXYWxsZXQgPSB3YWxsZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3dBbnkgPSB3aW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCdzb2xhbmEnIGluIHdpbmRvd0FueSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygd2luZG93QW55LnNvbGFuYSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgKCgnc2lnbkluJyBpbiB3aW5kb3dBbnkuc29sYW5hICYmIHR5cGVvZiB3aW5kb3dBbnkuc29sYW5hLnNpZ25JbiA9PT0gJ2Z1bmN0aW9uJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICgnc2lnbk1lc3NhZ2UnIGluIHdpbmRvd0FueS5zb2xhbmEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygd2luZG93QW55LnNvbGFuYS5zaWduTWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkV2FsbGV0ID0gd2luZG93QW55LnNvbGFuYTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IE5vIGNvbXBhdGlibGUgU29sYW5hIHdhbGxldCBpbnRlcmZhY2Ugb24gdGhlIHdpbmRvdyBvYmplY3QgKHdpbmRvdy5zb2xhbmEpIGRldGVjdGVkLiBNYWtlIHN1cmUgdGhlIHVzZXIgYWxyZWFkeSBoYXMgYSB3YWxsZXQgaW5zdGFsbGVkIGFuZCBjb25uZWN0ZWQgZm9yIHRoaXMgYXBwLiBQcmVmZXIgcGFzc2luZyB0aGUgd2FsbGV0IGludGVyZmFjZSBvYmplY3QgZGlyZWN0bHkgdG8gc2lnbkluV2l0aFdlYjMoeyBjaGFpbjogJ3NvbGFuYScsIHdhbGxldDogcmVzb2x2ZWRVc2VyV2FsbGV0IH0pIGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCgoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudXJsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgICBpZiAoJ3NpZ25JbicgaW4gcmVzb2x2ZWRXYWxsZXQgJiYgcmVzb2x2ZWRXYWxsZXQuc2lnbkluKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcmVzb2x2ZWRXYWxsZXQuc2lnbkluKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgaXNzdWVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9LCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aFNvbGFuYSksIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1vdmVycmlkYWJsZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICcxJywgZG9tYWluOiB1cmwuaG9zdCwgdXJpOiB1cmwuaHJlZiB9KSwgKHN0YXRlbWVudCA/IHsgc3RhdGVtZW50IH0gOiBudWxsKSkpO1xuICAgICAgICAgICAgICAgIGxldCBvdXRwdXRUb1Byb2Nlc3M7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3V0cHV0KSAmJiBvdXRwdXRbMF0gJiYgdHlwZW9mIG91dHB1dFswXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0VG9Qcm9jZXNzID0gb3V0cHV0WzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvdXRwdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG91dHB1dCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25lZE1lc3NhZ2UnIGluIG91dHB1dCAmJlxuICAgICAgICAgICAgICAgICAgICAnc2lnbmF0dXJlJyBpbiBvdXRwdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0VG9Qcm9jZXNzID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc3VwYWJhc2UvYXV0aC1qczogV2FsbGV0IG1ldGhvZCBzaWduSW4oKSByZXR1cm5lZCB1bnJlY29nbml6ZWQgdmFsdWUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCdzaWduZWRNZXNzYWdlJyBpbiBvdXRwdXRUb1Byb2Nlc3MgJiZcbiAgICAgICAgICAgICAgICAgICAgJ3NpZ25hdHVyZScgaW4gb3V0cHV0VG9Qcm9jZXNzICYmXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2Ygb3V0cHV0VG9Qcm9jZXNzLnNpZ25lZE1lc3NhZ2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUb1Byb2Nlc3Muc2lnbmVkTWVzc2FnZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpICYmXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFRvUHJvY2Vzcy5zaWduYXR1cmUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG91dHB1dFRvUHJvY2Vzcy5zaWduZWRNZXNzYWdlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3V0cHV0VG9Qcm9jZXNzLnNpZ25lZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShvdXRwdXRUb1Byb2Nlc3Muc2lnbmVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSA9IG91dHB1dFRvUHJvY2Vzcy5zaWduYXR1cmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BzdXBhYmFzZS9hdXRoLWpzOiBXYWxsZXQgbWV0aG9kIHNpZ25JbigpIEFQSSByZXR1cm5lZCBvYmplY3Qgd2l0aG91dCBzaWduZWRNZXNzYWdlIGFuZCBzaWduYXR1cmUgZmllbGRzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoJ3NpZ25NZXNzYWdlJyBpbiByZXNvbHZlZFdhbGxldCkgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc29sdmVkV2FsbGV0LnNpZ25NZXNzYWdlICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICAgICAgICAgICEoJ3B1YmxpY0tleScgaW4gcmVzb2x2ZWRXYWxsZXQpIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXNvbHZlZFdhbGxldCAhPT0gJ29iamVjdCcgfHxcbiAgICAgICAgICAgICAgICAgICAgIXJlc29sdmVkV2FsbGV0LnB1YmxpY0tleSB8fFxuICAgICAgICAgICAgICAgICAgICAhKCd0b0Jhc2U1OCcgaW4gcmVzb2x2ZWRXYWxsZXQucHVibGljS2V5KSB8fFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzb2x2ZWRXYWxsZXQucHVibGljS2V5LnRvQmFzZTU4ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQHN1cGFiYXNlL2F1dGgtanM6IFdhbGxldCBkb2VzIG5vdCBoYXZlIGEgY29tcGF0aWJsZSBzaWduTWVzc2FnZSgpIGFuZCBwdWJsaWNLZXkudG9CYXNlNTgoKSBBUEknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFtcbiAgICAgICAgICAgICAgICAgICAgYCR7dXJsLmhvc3R9IHdhbnRzIHlvdSB0byBzaWduIGluIHdpdGggeW91ciBTb2xhbmEgYWNjb3VudDpgLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFdhbGxldC5wdWJsaWNLZXkudG9CYXNlNTgoKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKHN0YXRlbWVudCA/IFsnJywgc3RhdGVtZW50LCAnJ10gOiBbJyddKSxcbiAgICAgICAgICAgICAgICAgICAgJ1ZlcnNpb246IDEnLFxuICAgICAgICAgICAgICAgICAgICBgVVJJOiAke3VybC5ocmVmfWAsXG4gICAgICAgICAgICAgICAgICAgIGBJc3N1ZWQgQXQ6ICR7KF9jID0gKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pc3N1ZWRBdCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpfWAsXG4gICAgICAgICAgICAgICAgICAgIC4uLigoKF9kID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5ub3RCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtgTm90IEJlZm9yZTogJHtvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEubm90QmVmb3JlfWBdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKCgoX2UgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aFNvbGFuYSkgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLmV4cGlyYXRpb25UaW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbYEV4cGlyYXRpb24gVGltZTogJHtvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEuZXhwaXJhdGlvblRpbWV9YF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oKChfZiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoU29sYW5hKSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YuY2hhaW5JZClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW2BDaGFpbiBJRDogJHtvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEuY2hhaW5JZH1gXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgICAgIC4uLigoKF9nID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNpZ25JbldpdGhTb2xhbmEpID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5ub25jZSkgPyBbYE5vbmNlOiAke29wdGlvbnMuc2lnbkluV2l0aFNvbGFuYS5ub25jZX1gXSA6IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKCgoX2ggPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2lnbkluV2l0aFNvbGFuYSkgPT09IG51bGwgfHwgX2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9oLnJlcXVlc3RJZClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW2BSZXF1ZXN0IElEOiAke29wdGlvbnMuc2lnbkluV2l0aFNvbGFuYS5yZXF1ZXN0SWR9YF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oKChfayA9IChfaiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaWduSW5XaXRoU29sYW5hKSA9PT0gbnVsbCB8fCBfaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2oucmVzb3VyY2VzKSA9PT0gbnVsbCB8fCBfayA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2subGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Jlc291cmNlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5zaWduSW5XaXRoU29sYW5hLnJlc291cmNlcy5tYXAoKHJlc291cmNlKSA9PiBgLSAke3Jlc291cmNlfWApLFxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXliZVNpZ25hdHVyZSA9IGF3YWl0IHJlc29sdmVkV2FsbGV0LnNpZ25NZXNzYWdlKG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShtZXNzYWdlKSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1heWJlU2lnbmF0dXJlIHx8ICEobWF5YmVTaWduYXR1cmUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BzdXBhYmFzZS9hdXRoLWpzOiBXYWxsZXQgc2lnbk1lc3NhZ2UoKSBBUEkgcmV0dXJuZWQgYW4gcmVjb2duaXplZCB2YWx1ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzaWduYXR1cmUgPSBtYXliZVNpZ25hdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT13ZWIzYCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiBPYmplY3QuYXNzaWduKHsgY2hhaW46ICdzb2xhbmEnLCBtZXNzYWdlLCBzaWduYXR1cmU6IGJ5dGVzVG9CYXNlNjRVUkwoc2lnbmF0dXJlKSB9LCAoKChfbCA9IGNyZWRlbnRpYWxzLm9wdGlvbnMpID09PSBudWxsIHx8IF9sID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbC5jYXB0Y2hhVG9rZW4pXG4gICAgICAgICAgICAgICAgICAgID8geyBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiAoX20gPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX20uY2FwdGNoYVRva2VuIH0gfVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwpKSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEuc2Vzc2lvbiB8fCAhZGF0YS51c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW52YWxpZFRva2VuRXJyb3IgPSBuZXcgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBpbnZhbGlkVG9rZW5FcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpLCBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX2V4Y2hhbmdlQ29kZUZvclNlc3Npb24oYXV0aENvZGUpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBhd2FpdCBnZXRJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgY29uc3QgW2NvZGVWZXJpZmllciwgcmVkaXJlY3RUeXBlXSA9IChzdG9yYWdlSXRlbSAhPT0gbnVsbCAmJiBzdG9yYWdlSXRlbSAhPT0gdm9pZCAwID8gc3RvcmFnZUl0ZW0gOiAnJykuc3BsaXQoJy8nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghY29kZVZlcmlmaWVyICYmIHRoaXMuZmxvd1R5cGUgPT09ICdwa2NlJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT1wa2NlYCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgIGF1dGhfY29kZTogYXV0aENvZGUsXG4gICAgICAgICAgICAgICAgICAgIGNvZGVfdmVyaWZpZXI6IGNvZGVWZXJpZmllcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHhmb3JtOiBfc2Vzc2lvblJlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLnNlc3Npb24gfHwgIWRhdGEudXNlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludmFsaWRUb2tlbkVycm9yID0gbmV3IEF1dGhJbnZhbGlkVG9rZW5SZXNwb25zZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCwgcmVkaXJlY3RUeXBlOiBudWxsIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBpbnZhbGlkVG9rZW5FcnJvcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBkYXRhLnNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0YSksIHsgcmVkaXJlY3RUeXBlOiByZWRpcmVjdFR5cGUgIT09IG51bGwgJiYgcmVkaXJlY3RUeXBlICE9PSB2b2lkIDAgPyByZWRpcmVjdFR5cGUgOiBudWxsIH0pLCBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwsIHJlZGlyZWN0VHlwZTogbnVsbCB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93cyBzaWduaW5nIGluIHdpdGggYW4gT0lEQyBJRCB0b2tlbi4gVGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIHVzZWRcbiAgICAgKiBzaG91bGQgYmUgZW5hYmxlZCBhbmQgY29uZmlndXJlZC5cbiAgICAgKi9cbiAgICBhc3luYyBzaWduSW5XaXRoSWRUb2tlbihjcmVkZW50aWFscykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBvcHRpb25zLCBwcm92aWRlciwgdG9rZW4sIGFjY2Vzc190b2tlbiwgbm9uY2UgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdG9rZW4/Z3JhbnRfdHlwZT1pZF90b2tlbmAsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlcixcbiAgICAgICAgICAgICAgICAgICAgaWRfdG9rZW46IHRva2VuLFxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIG5vbmNlLFxuICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY2FwdGNoYVRva2VuIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFkYXRhIHx8ICFkYXRhLnNlc3Npb24gfHwgIWRhdGEudXNlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludmFsaWRUb2tlbkVycm9yID0gbmV3IEF1dGhJbnZhbGlkVG9rZW5SZXNwb25zZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvcjogaW52YWxpZFRva2VuRXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS5zZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnU0lHTkVEX0lOJywgZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhLCBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGluIGEgdXNlciB1c2luZyBtYWdpY2xpbmsgb3IgYSBvbmUtdGltZSBwYXNzd29yZCAoT1RQKS5cbiAgICAgKlxuICAgICAqIElmIHRoZSBge3sgLkNvbmZpcm1hdGlvblVSTCB9fWAgdmFyaWFibGUgaXMgc3BlY2lmaWVkIGluIHRoZSBlbWFpbCB0ZW1wbGF0ZSwgYSBtYWdpY2xpbmsgd2lsbCBiZSBzZW50LlxuICAgICAqIElmIHRoZSBge3sgLlRva2VuIH19YCB2YXJpYWJsZSBpcyBzcGVjaWZpZWQgaW4gdGhlIGVtYWlsIHRlbXBsYXRlLCBhbiBPVFAgd2lsbCBiZSBzZW50LlxuICAgICAqIElmIHlvdSdyZSB1c2luZyBwaG9uZSBzaWduLWlucywgb25seSBhbiBPVFAgd2lsbCBiZSBzZW50LiBZb3Ugd29uJ3QgYmUgYWJsZSB0byBzZW5kIGEgbWFnaWNsaW5rIGZvciBwaG9uZSBzaWduLWlucy5cbiAgICAgKlxuICAgICAqIEJlIGF3YXJlIHRoYXQgeW91IG1heSBnZXQgYmFjayBhbiBlcnJvciBtZXNzYWdlIHRoYXQgd2lsbCBub3QgZGlzdGluZ3Vpc2hcbiAgICAgKiBiZXR3ZWVuIHRoZSBjYXNlcyB3aGVyZSB0aGUgYWNjb3VudCBkb2VzIG5vdCBleGlzdCBvciwgdGhhdCB0aGUgYWNjb3VudFxuICAgICAqIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIHZpYSBzb2NpYWwgbG9naW4uXG4gICAgICpcbiAgICAgKiBEbyBub3RlIHRoYXQgeW91IHdpbGwgbmVlZCB0byBjb25maWd1cmUgYSBXaGF0c2FwcCBzZW5kZXIgb24gVHdpbGlvXG4gICAgICogaWYgeW91IGFyZSB1c2luZyBwaG9uZSBzaWduIGluIHdpdGggdGhlICd3aGF0c2FwcCcgY2hhbm5lbC4gVGhlIHdoYXRzYXBwXG4gICAgICogY2hhbm5lbCBpcyBub3Qgc3VwcG9ydGVkIG9uIG90aGVyIHByb3ZpZGVyc1xuICAgICAqIGF0IHRoaXMgdGltZS5cbiAgICAgKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyBQS0NFIHdoZW4gYW4gZW1haWwgaXMgcGFzc2VkLlxuICAgICAqL1xuICAgIGFzeW5jIHNpZ25JbldpdGhPdHAoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICgnZW1haWwnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlbWFpbCwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBjb2RlQ2hhbGxlbmdlTWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mbG93VHlwZSA9PT0gJ3BrY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAgICAgW2NvZGVDaGFsbGVuZ2UsIGNvZGVDaGFsbGVuZ2VNZXRob2RdID0gYXdhaXQgZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZCh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L290cGAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kYXRhKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV91c2VyOiAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2hvdWxkQ3JlYXRlVXNlcikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfY2hhbGxlbmdlOiBjb2RlQ2hhbGxlbmdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9jaGFsbGVuZ2VfbWV0aG9kOiBjb2RlQ2hhbGxlbmdlTWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZW1haWxSZWRpcmVjdFRvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoJ3Bob25lJyBpbiBjcmVkZW50aWFscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgcGhvbmUsIG9wdGlvbnMgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L290cGAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IChfYyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kYXRhKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV91c2VyOiAoX2QgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2hvdWxkQ3JlYXRlVXNlcikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IChfZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jaGFubmVsKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAnc21zJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsLCBtZXNzYWdlSWQ6IGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS5tZXNzYWdlX2lkIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvcignWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyLicpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZyBpbiBhIHVzZXIgZ2l2ZW4gYSBVc2VyIHN1cHBsaWVkIE9UUCBvciBUb2tlbkhhc2ggcmVjZWl2ZWQgdGhyb3VnaCBtb2JpbGUgb3IgZW1haWwuXG4gICAgICovXG4gICAgYXN5bmMgdmVyaWZ5T3RwKHBhcmFtcykge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlZGlyZWN0VG8gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgY2FwdGNoYVRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCdvcHRpb25zJyBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFRvID0gKF9hID0gcGFyYW1zLm9wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWRpcmVjdFRvO1xuICAgICAgICAgICAgICAgIGNhcHRjaGFUb2tlbiA9IChfYiA9IHBhcmFtcy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FwdGNoYVRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vdmVyaWZ5YCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyksIHsgZ290cnVlX21ldGFfc2VjdXJpdHk6IHsgY2FwdGNoYV90b2tlbjogY2FwdGNoYVRva2VuIH0gfSksXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RUbyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlblZlcmlmaWNhdGlvbkVycm9yID0gbmV3IEVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCBvbiB0b2tlbiB2ZXJpZmljYXRpb24uJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgdG9rZW5WZXJpZmljYXRpb25FcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSBkYXRhLnNlc3Npb247XG4gICAgICAgICAgICBjb25zdCB1c2VyID0gZGF0YS51c2VyO1xuICAgICAgICAgICAgaWYgKHNlc3Npb24gPT09IG51bGwgfHwgc2Vzc2lvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycyhwYXJhbXMudHlwZSA9PSAncmVjb3ZlcnknID8gJ1BBU1NXT1JEX1JFQ09WRVJZJyA6ICdTSUdORURfSU4nLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIGEgc2luZ2xlLXNpZ24gb24gdXNpbmcgYW4gZW50ZXJwcmlzZSBJZGVudGl0eSBQcm92aWRlci4gQVxuICAgICAqIHN1Y2Nlc3NmdWwgU1NPIGF0dGVtcHQgd2lsbCByZWRpcmVjdCB0aGUgY3VycmVudCBwYWdlIHRvIHRoZSBpZGVudGl0eVxuICAgICAqIHByb3ZpZGVyIGF1dGhvcml6YXRpb24gcGFnZS4gVGhlIHJlZGlyZWN0IFVSTCBpcyBpbXBsZW1lbnRhdGlvbiBhbmQgU1NPXG4gICAgICogcHJvdG9jb2wgc3BlY2lmaWMuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHVzZSBpdCBieSBwcm92aWRpbmcgYSBTU08gZG9tYWluLiBUeXBpY2FsbHkgeW91IGNhbiBleHRyYWN0IHRoaXNcbiAgICAgKiBkb21haW4gYnkgYXNraW5nIHVzZXJzIGZvciB0aGVpciBlbWFpbCBhZGRyZXNzLiBJZiB0aGlzIGRvbWFpbiBpc1xuICAgICAqIHJlZ2lzdGVyZWQgb24gdGhlIEF1dGggaW5zdGFuY2UgdGhlIHJlZGlyZWN0IHdpbGwgdXNlIHRoYXQgb3JnYW5pemF0aW9uJ3NcbiAgICAgKiBjdXJyZW50bHkgYWN0aXZlIFNTTyBJZGVudGl0eSBQcm92aWRlciBmb3IgdGhlIGxvZ2luLlxuICAgICAqXG4gICAgICogSWYgeW91IGhhdmUgYnVpbHQgYW4gb3JnYW5pemF0aW9uLXNwZWNpZmljIGxvZ2luIHBhZ2UsIHlvdSBjYW4gdXNlIHRoZVxuICAgICAqIG9yZ2FuaXphdGlvbidzIFNTTyBJZGVudGl0eSBQcm92aWRlciBVVUlEIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgICovXG4gICAgYXN5bmMgc2lnbkluV2l0aFNTTyhwYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjb2RlQ2hhbGxlbmdlID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjb2RlQ2hhbGxlbmdlTWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgW2NvZGVDaGFsbGVuZ2UsIGNvZGVDaGFsbGVuZ2VNZXRob2RdID0gYXdhaXQgZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZCh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS9zc29gLCB7XG4gICAgICAgICAgICAgICAgYm9keTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoJ3Byb3ZpZGVySWQnIGluIHBhcmFtcyA/IHsgcHJvdmlkZXJfaWQ6IHBhcmFtcy5wcm92aWRlcklkIH0gOiBudWxsKSksICgnZG9tYWluJyBpbiBwYXJhbXMgPyB7IGRvbWFpbjogcGFyYW1zLmRvbWFpbiB9IDogbnVsbCkpLCB7IHJlZGlyZWN0X3RvOiAoX2IgPSAoX2EgPSBwYXJhbXMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlZGlyZWN0VG8pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHVuZGVmaW5lZCB9KSwgKCgoX2MgPSBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMub3B0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNhcHRjaGFUb2tlbilcbiAgICAgICAgICAgICAgICAgICAgPyB7IGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IHBhcmFtcy5vcHRpb25zLmNhcHRjaGFUb2tlbiB9IH1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsKSksIHsgc2tpcF9odHRwX3JlZGlyZWN0OiB0cnVlLCBjb2RlX2NoYWxsZW5nZTogY29kZUNoYWxsZW5nZSwgY29kZV9jaGFsbGVuZ2VfbWV0aG9kOiBjb2RlQ2hhbGxlbmdlTWV0aG9kIH0pLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICB4Zm9ybTogX3Nzb1Jlc3BvbnNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IHJlZGlyZWN0IGluIGJyb3dzZXIgdW5sZXNzIHNraXBCcm93c2VyUmVkaXJlY3QgaXMgdHJ1ZVxuICAgICAgICAgICAgaWYgKCgoX2QgPSByZXN1bHQuZGF0YSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLnVybCkgJiYgaXNCcm93c2VyKCkgJiYgISgoX2UgPSBwYXJhbXMub3B0aW9ucykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnNraXBCcm93c2VyUmVkaXJlY3QpKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihyZXN1bHQuZGF0YS51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSByZWF1dGhlbnRpY2F0aW9uIE9UUCB0byB0aGUgdXNlcidzIGVtYWlsIG9yIHBob25lIG51bWJlci5cbiAgICAgKiBSZXF1aXJlcyB0aGUgdXNlciB0byBiZSBzaWduZWQtaW4uXG4gICAgICovXG4gICAgYXN5bmMgcmVhdXRoZW50aWNhdGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hY3F1aXJlTG9jaygtMSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JlYXV0aGVudGljYXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBfcmVhdXRoZW50aWNhdGUoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSwgZXJyb3I6IHNlc3Npb25FcnJvciwgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVycm9yKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzZXNzaW9uRXJyb3I7XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVycm9yIH0gPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L3JlYXV0aGVudGljYXRlYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNlbmRzIGFuIGV4aXN0aW5nIHNpZ251cCBjb25maXJtYXRpb24gZW1haWwsIGVtYWlsIGNoYW5nZSBlbWFpbCwgU01TIE9UUCBvciBwaG9uZSBjaGFuZ2UgT1RQLlxuICAgICAqL1xuICAgIGFzeW5jIHJlc2VuZChjcmVkZW50aWFscykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLnVybH0vcmVzZW5kYDtcbiAgICAgICAgICAgIGlmICgnZW1haWwnIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlbWFpbCwgdHlwZSwgb3B0aW9ucyB9ID0gY3JlZGVudGlhbHM7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBlbmRwb2ludCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RUbzogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmVtYWlsUmVkaXJlY3RUbyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoJ3Bob25lJyBpbiBjcmVkZW50aWFscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgcGhvbmUsIHR5cGUsIG9wdGlvbnMgfSA9IGNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgZW5kcG9pbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY2FwdGNoYVRva2VuIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCwgbWVzc2FnZUlkOiBkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEubWVzc2FnZV9pZCB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlciBhbmQgYSB0eXBlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNlc3Npb24sIHJlZnJlc2hpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICAgICAqXG4gICAgICogVGhlIHNlc3Npb24gcmV0dXJuZWQgY2FuIGJlIG51bGwgaWYgdGhlIHNlc3Npb24gaXMgbm90IGRldGVjdGVkIHdoaWNoIGNhbiBoYXBwZW4gaW4gdGhlIGV2ZW50IGEgdXNlciBpcyBub3Qgc2lnbmVkLWluIG9yIGhhcyBsb2dnZWQgb3V0LlxuICAgICAqXG4gICAgICogKipJTVBPUlRBTlQ6KiogVGhpcyBtZXRob2QgbG9hZHMgdmFsdWVzIGRpcmVjdGx5IGZyb20gdGhlIHN0b3JhZ2UgYXR0YWNoZWRcbiAgICAgKiB0byB0aGUgY2xpZW50LiBJZiB0aGF0IHN0b3JhZ2UgaXMgYmFzZWQgb24gcmVxdWVzdCBjb29raWVzIGZvciBleGFtcGxlLFxuICAgICAqIHRoZSB2YWx1ZXMgaW4gaXQgbWF5IG5vdCBiZSBhdXRoZW50aWMgYW5kIHRoZXJlZm9yZSBpdCdzIHN0cm9uZ2x5IGFkdmlzZWRcbiAgICAgKiBhZ2FpbnN0IHVzaW5nIHRoaXMgbWV0aG9kIGFuZCBpdHMgcmVzdWx0cyBpbiBzdWNoIGNpcmN1bXN0YW5jZXMuIEEgd2FybmluZ1xuICAgICAqIHdpbGwgYmUgZW1pdHRlZCBpZiB0aGlzIGlzIGRldGVjdGVkLiBVc2Uge0BsaW5rICNnZXRVc2VyKCl9IGluc3RlYWQuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0U2Vzc2lvbigpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY3F1aXJlcyBhIGdsb2JhbCBsb2NrIGJhc2VkIG9uIHRoZSBzdG9yYWdlIGtleS5cbiAgICAgKi9cbiAgICBhc3luYyBfYWNxdWlyZUxvY2soYWNxdWlyZVRpbWVvdXQsIGZuKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX2FjcXVpcmVMb2NrJywgJ2JlZ2luJywgYWNxdWlyZVRpbWVvdXQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMubG9ja0FjcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMucGVuZGluZ0luTG9jay5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnBlbmRpbmdJbkxvY2tbdGhpcy5wZW5kaW5nSW5Mb2NrLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbGFzdDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdJbkxvY2sucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGNhcmUgaWYgaXQgZmluaXNoZWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2NrKGBsb2NrOiR7dGhpcy5zdG9yYWdlS2V5fWAsIGFjcXVpcmVUaW1lb3V0LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfYWNxdWlyZUxvY2snLCAnbG9jayBhY3F1aXJlZCBmb3Igc3RvcmFnZSBrZXknLCB0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9ja0FjcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nSW5Mb2NrLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGNhcmUgaWYgaXQgZmluaXNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkoKSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBkcmFpbmluZyB0aGUgcXVldWUgdW50aWwgdGhlcmUncyBub3RoaW5nIHRvIHdhaXQgb25cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMucGVuZGluZ0luTG9jay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRPbiA9IFsuLi50aGlzLnBlbmRpbmdJbkxvY2tdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdE9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0luTG9jay5zcGxpY2UoMCwgd2FpdE9uLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2FjcXVpcmVMb2NrJywgJ2xvY2sgcmVsZWFzZWQgZm9yIHN0b3JhZ2Uga2V5JywgdGhpcy5zdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NrQWNxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2FjcXVpcmVMb2NrJywgJ2VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZSBpbnN0ZWFkIG9mIHtAbGluayAjZ2V0U2Vzc2lvbn0gaW5zaWRlIHRoZSBsaWJyYXJ5LiBJdCBpc1xuICAgICAqIHNlbWFudGljYWxseSB1c3VhbGx5IHdoYXQgeW91IHdhbnQsIGFzIGdldHRpbmcgYSBzZXNzaW9uIGludm9sdmVzIHNvbWVcbiAgICAgKiBwcm9jZXNzaW5nIGFmdGVyd2FyZHMgdGhhdCByZXF1aXJlcyBvbmx5IG9uZSBjbGllbnQgb3BlcmF0aW5nIG9uIHRoZVxuICAgICAqIHNlc3Npb24gYXQgb25jZSBhY3Jvc3MgbXVsdGlwbGUgdGFicyBvciBwcm9jZXNzZXMuXG4gICAgICovXG4gICAgYXN5bmMgX3VzZVNlc3Npb24oZm4pIHtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfdXNlU2Vzc2lvbicsICdiZWdpbicpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gdGhlIHVzZSBvZiBfX2xvYWRTZXNzaW9uIGhlcmUgaXMgdGhlIG9ubHkgY29ycmVjdCB1c2Ugb2YgdGhlIGZ1bmN0aW9uIVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fX2xvYWRTZXNzaW9uKCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4ocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX3VzZVNlc3Npb24nLCAnZW5kJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTkVWRVIgVVNFIERJUkVDVExZIVxuICAgICAqXG4gICAgICogQWx3YXlzIHVzZSB7QGxpbmsgI191c2VTZXNzaW9ufS5cbiAgICAgKi9cbiAgICBhc3luYyBfX2xvYWRTZXNzaW9uKCkge1xuICAgICAgICB0aGlzLl9kZWJ1ZygnI19fbG9hZFNlc3Npb24oKScsICdiZWdpbicpO1xuICAgICAgICBpZiAoIXRoaXMubG9ja0FjcXVpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19fbG9hZFNlc3Npb24oKScsICd1c2VkIG91dHNpZGUgb2YgYW4gYWNxdWlyZWQgbG9jayEnLCBuZXcgRXJyb3IoKS5zdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50U2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBtYXliZVNlc3Npb24gPSBhd2FpdCBnZXRJdGVtQXN5bmModGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNnZXRTZXNzaW9uKCknLCAnc2Vzc2lvbiBmcm9tIHN0b3JhZ2UnLCBtYXliZVNlc3Npb24pO1xuICAgICAgICAgICAgaWYgKG1heWJlU2Vzc2lvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc1ZhbGlkU2Vzc2lvbihtYXliZVNlc3Npb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXNzaW9uID0gbWF5YmVTZXNzaW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNnZXRTZXNzaW9uKCknLCAnc2Vzc2lvbiBmcm9tIHN0b3JhZ2UgaXMgbm90IHZhbGlkJyk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlbW92ZVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRTZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBIHNlc3Npb24gaXMgY29uc2lkZXJlZCBleHBpcmVkIGJlZm9yZSB0aGUgYWNjZXNzIHRva2VuIF9hY3R1YWxseV9cbiAgICAgICAgICAgIC8vIGV4cGlyZXMuIFdoZW4gdGhlIGF1dG9SZWZyZXNoVG9rZW4gb3B0aW9uIGlzIG9mZiAob3Igd2hlbiB0aGUgdGFiIGlzXG4gICAgICAgICAgICAvLyBpbiB0aGUgYmFja2dyb3VuZCksIHZlcnkgZWFnZXIgdXNlcnMgb2YgZ2V0U2Vzc2lvbigpIC0tIGxpa2VcbiAgICAgICAgICAgIC8vIHJlYWx0aW1lLWpzIC0tIG1pZ2h0IHNlbmQgYSB2YWxpZCBKV1Qgd2hpY2ggd2lsbCBleHBpcmUgYnkgdGhlIHRpbWUgaXRcbiAgICAgICAgICAgIC8vIHJlYWNoZXMgdGhlIHNlcnZlci5cbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cGlyZWQgPSBjdXJyZW50U2Vzc2lvbi5leHBpcmVzX2F0XG4gICAgICAgICAgICAgICAgPyBjdXJyZW50U2Vzc2lvbi5leHBpcmVzX2F0ICogMTAwMCAtIERhdGUubm93KCkgPCBFWFBJUllfTUFSR0lOX01TXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX19sb2FkU2Vzc2lvbigpJywgYHNlc3Npb24gaGFzJHtoYXNFeHBpcmVkID8gJycgOiAnIG5vdCd9IGV4cGlyZWRgLCAnZXhwaXJlc19hdCcsIGN1cnJlbnRTZXNzaW9uLmV4cGlyZXNfYXQpO1xuICAgICAgICAgICAgaWYgKCFoYXNFeHBpcmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlclN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF5YmVVc2VyID0gKGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnVzZXJTdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkgKyAnLXVzZXInKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXliZVVzZXIgPT09IG51bGwgfHwgbWF5YmVVc2VyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtYXliZVVzZXIudXNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciA9IG1heWJlVXNlci51c2VyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciA9IHVzZXJOb3RBdmFpbGFibGVQcm94eSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdyYXAgdGhlIHVzZXIgb2JqZWN0IHdpdGggYSB3YXJuaW5nIHByb3h5IG9uIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHdhcm5zIHdoZW4gcHJvcGVydGllcyBvZiB0aGUgdXNlciBhcmUgYWNjZXNzZWQsIG5vdCB3aGVuIHNlc3Npb24udXNlciBpdHNlbGYgaXMgYWNjZXNzZWRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9yYWdlLmlzU2VydmVyICYmXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXNzaW9uLnVzZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgIWN1cnJlbnRTZXNzaW9uLnVzZXIuX19pc1VzZXJOb3RBdmFpbGFibGVQcm94eSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXBwcmVzc1dhcm5pbmdSZWYgPSB7IHZhbHVlOiB0aGlzLnN1cHByZXNzR2V0U2Vzc2lvbldhcm5pbmcgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciA9IGluc2VjdXJlVXNlcldhcm5pbmdQcm94eShjdXJyZW50U2Vzc2lvbi51c2VyLCBzdXBwcmVzc1dhcm5pbmdSZWYpO1xuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNsaWVudC1sZXZlbCBzdXBwcmVzc2lvbiBmbGFnIHdoZW4gdGhlIHByb3h5IHN1cHByZXNzZXMgdGhlIHdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHByZXNzV2FybmluZ1JlZi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBwcmVzc0dldFNlc3Npb25XYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHNlc3Npb246IGN1cnJlbnRTZXNzaW9uIH0sIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRhdGE6IHNlc3Npb24sIGVycm9yIH0gPSBhd2FpdCB0aGlzLl9jYWxsUmVmcmVzaFRva2VuKGN1cnJlbnRTZXNzaW9uLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19fbG9hZFNlc3Npb24oKScsICdlbmQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHVzZXIgZGV0YWlscyBpZiB0aGVyZSBpcyBhbiBleGlzdGluZyBzZXNzaW9uLiBUaGlzIG1ldGhvZFxuICAgICAqIHBlcmZvcm1zIGEgbmV0d29yayByZXF1ZXN0IHRvIHRoZSBTdXBhYmFzZSBBdXRoIHNlcnZlciwgc28gdGhlIHJldHVybmVkXG4gICAgICogdmFsdWUgaXMgYXV0aGVudGljIGFuZCBjYW4gYmUgdXNlZCB0byBiYXNlIGF1dGhvcml6YXRpb24gcnVsZXMgb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gand0IFRha2VzIGluIGFuIG9wdGlvbmFsIGFjY2VzcyB0b2tlbiBKV1QuIElmIG5vIEpXVCBpcyBwcm92aWRlZCwgdGhlIEpXVCBmcm9tIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgdXNlZC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRVc2VyKGp3dCkge1xuICAgICAgICBpZiAoand0KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0VXNlcihqd3QpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0VXNlcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5kYXRhLnVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3VwcHJlc3NHZXRTZXNzaW9uV2FybmluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgX2dldFVzZXIoand0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoand0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vdXNlcmAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IGp3dCxcbiAgICAgICAgICAgICAgICAgICAgeGZvcm06IF91c2VyUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJucyBhbiBlcnJvciBpZiB0aGVyZSBpcyBubyBhY2Nlc3NfdG9rZW4gb3IgY3VzdG9tIGF1dGhvcml6YXRpb24gaGVhZGVyXG4gICAgICAgICAgICAgICAgaWYgKCEoKF9hID0gZGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWNjZXNzX3Rva2VuKSAmJiAhdGhpcy5oYXNDdXN0b21BdXRob3JpemF0aW9uSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvcjogbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vdXNlcmAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IChfYyA9IChfYiA9IGRhdGEuc2Vzc2lvbikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmFjY2Vzc190b2tlbikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3VzZXJSZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc0F1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBKV1QgY29udGFpbnMgYSBgc2Vzc2lvbl9pZGAgd2hpY2ggZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbiBhY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgLy8gc2Vzc2lvbiBpbiB0aGUgZGF0YWJhc2UsIGluZGljYXRpbmcgdGhlIHVzZXIgaXMgc2lnbmVkIG91dC5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVtb3ZlU2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCBgJHt0aGlzLnN0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdXNlciBkYXRhIGZvciBhIGxvZ2dlZCBpbiB1c2VyLlxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVVzZXIoYXR0cmlidXRlcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hY3F1aXJlTG9jaygtMSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VwZGF0ZVVzZXIoYXR0cmlidXRlcywgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBfdXBkYXRlVXNlcihhdHRyaWJ1dGVzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHNlc3Npb25EYXRhLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzZXNzaW9uRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbkRhdGEuc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHNlc3Npb25EYXRhLnNlc3Npb247XG4gICAgICAgICAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBjb2RlQ2hhbGxlbmdlTWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mbG93VHlwZSA9PT0gJ3BrY2UnICYmIGF0dHJpYnV0ZXMuZW1haWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgICAgIFtjb2RlQ2hhbGxlbmdlLCBjb2RlQ2hhbGxlbmdlTWV0aG9kXSA9IGF3YWl0IGdldENvZGVDaGFsbGVuZ2VBbmRNZXRob2QodGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yOiB1c2VyRXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQVVQnLCBgJHt0aGlzLnVybH0vdXNlcmAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZW1haWxSZWRpcmVjdFRvLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGF0dHJpYnV0ZXMpLCB7IGNvZGVfY2hhbGxlbmdlOiBjb2RlQ2hhbGxlbmdlLCBjb2RlX2NoYWxsZW5nZV9tZXRob2Q6IGNvZGVDaGFsbGVuZ2VNZXRob2QgfSksXG4gICAgICAgICAgICAgICAgICAgIGp3dDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIHhmb3JtOiBfdXNlclJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh1c2VyRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgdXNlckVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXNzaW9uLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1VTRVJfVVBEQVRFRCcsIHNlc3Npb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciB9LCBlcnJvcjogbnVsbCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNlc3Npb24gZGF0YSBmcm9tIHRoZSBjdXJyZW50IHNlc3Npb24uIElmIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgZXhwaXJlZCwgc2V0U2Vzc2lvbiB3aWxsIHRha2UgY2FyZSBvZiByZWZyZXNoaW5nIGl0IHRvIG9idGFpbiBhIG5ldyBzZXNzaW9uLlxuICAgICAqIElmIHRoZSByZWZyZXNoIHRva2VuIG9yIGFjY2VzcyB0b2tlbiBpbiB0aGUgY3VycmVudCBzZXNzaW9uIGlzIGludmFsaWQsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgICAqIEBwYXJhbSBjdXJyZW50U2Vzc2lvbiBUaGUgY3VycmVudCBzZXNzaW9uIHRoYXQgbWluaW1hbGx5IGNvbnRhaW5zIGFuIGFjY2VzcyB0b2tlbiBhbmQgcmVmcmVzaCB0b2tlbi5cbiAgICAgKi9cbiAgICBhc3luYyBzZXRTZXNzaW9uKGN1cnJlbnRTZXNzaW9uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb21pc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hY3F1aXJlTG9jaygtMSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3NldFNlc3Npb24oY3VycmVudFNlc3Npb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3NldFNlc3Npb24oY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghY3VycmVudFNlc3Npb24uYWNjZXNzX3Rva2VuIHx8ICFjdXJyZW50U2Vzc2lvbi5yZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0aW1lTm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgICAgICAgICBsZXQgZXhwaXJlc0F0ID0gdGltZU5vdztcbiAgICAgICAgICAgIGxldCBoYXNFeHBpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBzZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gZGVjb2RlSldUKGN1cnJlbnRTZXNzaW9uLmFjY2Vzc190b2tlbik7XG4gICAgICAgICAgICBpZiAocGF5bG9hZC5leHApIHtcbiAgICAgICAgICAgICAgICBleHBpcmVzQXQgPSBwYXlsb2FkLmV4cDtcbiAgICAgICAgICAgICAgICBoYXNFeHBpcmVkID0gZXhwaXJlc0F0IDw9IHRpbWVOb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzRXhwaXJlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogcmVmcmVzaGVkU2Vzc2lvbiwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX2NhbGxSZWZyZXNoVG9rZW4oY3VycmVudFNlc3Npb24ucmVmcmVzaF90b2tlbik7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSwgZXJyb3I6IGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlZnJlc2hlZFNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBudWxsIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlc3Npb24gPSByZWZyZXNoZWRTZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fZ2V0VXNlcihjdXJyZW50U2Vzc2lvbi5hY2Nlc3NfdG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiBjdXJyZW50U2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46IGN1cnJlbnRTZXNzaW9uLnJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IGRhdGEudXNlcixcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5fdHlwZTogJ2JlYXJlcicsXG4gICAgICAgICAgICAgICAgICAgIGV4cGlyZXNfaW46IGV4cGlyZXNBdCAtIHRpbWVOb3csXG4gICAgICAgICAgICAgICAgICAgIGV4cGlyZXNfYXQ6IGV4cGlyZXNBdCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfSU4nLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyBzZXNzaW9uOiBudWxsLCB1c2VyOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBzZXNzaW9uLCByZWdhcmRsZXNzIG9mIGV4cGlyeSBzdGF0dXMuXG4gICAgICogVGFrZXMgaW4gYW4gb3B0aW9uYWwgY3VycmVudCBzZXNzaW9uLiBJZiBub3QgcGFzc2VkIGluLCB0aGVuIHJlZnJlc2hTZXNzaW9uKCkgd2lsbCBhdHRlbXB0IHRvIHJldHJpZXZlIGl0IGZyb20gZ2V0U2Vzc2lvbigpLlxuICAgICAqIElmIHRoZSBjdXJyZW50IHNlc3Npb24ncyByZWZyZXNoIHRva2VuIGlzIGludmFsaWQsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgICAqIEBwYXJhbSBjdXJyZW50U2Vzc2lvbiBUaGUgY3VycmVudCBzZXNzaW9uLiBJZiBwYXNzZWQgaW4sIGl0IG11c3QgY29udGFpbiBhIHJlZnJlc2ggdG9rZW4uXG4gICAgICovXG4gICAgYXN5bmMgcmVmcmVzaFNlc3Npb24oY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVmcmVzaFNlc3Npb24oY3VycmVudFNlc3Npb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3JlZnJlc2hTZXNzaW9uKGN1cnJlbnRTZXNzaW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudFNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXNzaW9uID0gKF9hID0gZGF0YS5zZXNzaW9uKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghKGN1cnJlbnRTZXNzaW9uID09PSBudWxsIHx8IGN1cnJlbnRTZXNzaW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjdXJyZW50U2Vzc2lvbi5yZWZyZXNoX3Rva2VuKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBzZXNzaW9uLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fY2FsbFJlZnJlc2hUb2tlbihjdXJyZW50U2Vzc2lvbi5yZWZyZXNoX3Rva2VuKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvcjogZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBudWxsIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2Vzc2lvbiBkYXRhIGZyb20gYSBVUkwgc3RyaW5nXG4gICAgICovXG4gICAgYXN5bmMgX2dldFNlc3Npb25Gcm9tVVJMKHBhcmFtcywgY2FsbGJhY2tVcmxUeXBlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzQnJvd3NlcigpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IoJ05vIGJyb3dzZXIgZGV0ZWN0ZWQuJyk7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGVycm9yIGluIHRoZSBVUkwsIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgZmxvdyBpdCBpcywgd2UganVzdCByZXR1cm4gdGhlIGVycm9yLlxuICAgICAgICAgICAgaWYgKHBhcmFtcy5lcnJvciB8fCBwYXJhbXMuZXJyb3JfZGVzY3JpcHRpb24gfHwgcGFyYW1zLmVycm9yX2NvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZXJyb3IgY2xhc3MgcmV0dXJuZWQgaW1wbGllcyB0aGF0IHRoZSByZWRpcmVjdCBpcyBmcm9tIGFuIGltcGxpY2l0IGdyYW50IGZsb3dcbiAgICAgICAgICAgICAgICAvLyBidXQgaXQgY291bGQgYWxzbyBiZSBmcm9tIGEgcmVkaXJlY3QgZXJyb3IgZnJvbSBhIFBLQ0UgZmxvdy5cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yKHBhcmFtcy5lcnJvcl9kZXNjcmlwdGlvbiB8fCAnRXJyb3IgaW4gVVJMIHdpdGggdW5zcGVjaWZpZWQgZXJyb3JfZGVzY3JpcHRpb24nLCB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBwYXJhbXMuZXJyb3IgfHwgJ3Vuc3BlY2lmaWVkX2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogcGFyYW1zLmVycm9yX2NvZGUgfHwgJ3Vuc3BlY2lmaWVkX2NvZGUnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2tzIGZvciBtaXNtYXRjaGVzIGJldHdlZW4gdGhlIGZsb3dUeXBlIGluaXRpYWxpc2VkIGluIHRoZSBjbGllbnQgYW5kIHRoZSBVUkwgcGFyYW1ldGVyc1xuICAgICAgICAgICAgc3dpdGNoIChjYWxsYmFja1VybFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdpbXBsaWNpdCc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3IoJ05vdCBhIHZhbGlkIFBLQ0UgZmxvdyB1cmwuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncGtjZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAnaW1wbGljaXQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yKCdOb3QgYSB2YWxpZCBpbXBsaWNpdCBncmFudCBmbG93IHVybC4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gbWlzbWF0Y2ggc28gd2UgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSByZWRpcmVjdCBmb3IgUEtDRSwgd2UgYXR0ZW1wdCB0byByZXRyaWV2ZSB0aGUgY29kZSBmcm9tIHRoZSBVUkwgZm9yIHRoZSBjb2RlIGV4Y2hhbmdlXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tVcmxUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19pbml0aWFsaXplKCknLCAnYmVnaW4nLCAnaXMgUEtDRSBmbG93JywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuY29kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvcignTm8gY29kZSBkZXRlY3RlZC4nKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCB0aGlzLl9leGNoYW5nZUNvZGVGb3JTZXNzaW9uKHBhcmFtcy5jb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdjb2RlJyk7XG4gICAgICAgICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHdpbmRvdy5oaXN0b3J5LnN0YXRlLCAnJywgdXJsLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgc2Vzc2lvbjogZGF0YS5zZXNzaW9uLCByZWRpcmVjdFR5cGU6IG51bGwgfSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgcHJvdmlkZXJfdG9rZW4sIHByb3ZpZGVyX3JlZnJlc2hfdG9rZW4sIGFjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbiwgZXhwaXJlc19pbiwgZXhwaXJlc19hdCwgdG9rZW5fdHlwZSwgfSA9IHBhcmFtcztcbiAgICAgICAgICAgIGlmICghYWNjZXNzX3Rva2VuIHx8ICFleHBpcmVzX2luIHx8ICFyZWZyZXNoX3Rva2VuIHx8ICF0b2tlbl90eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvcignTm8gc2Vzc2lvbiBkZWZpbmVkIGluIFVSTCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGltZU5vdyA9IE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICAgICAgY29uc3QgZXhwaXJlc0luID0gcGFyc2VJbnQoZXhwaXJlc19pbik7XG4gICAgICAgICAgICBsZXQgZXhwaXJlc0F0ID0gdGltZU5vdyArIGV4cGlyZXNJbjtcbiAgICAgICAgICAgIGlmIChleHBpcmVzX2F0KSB7XG4gICAgICAgICAgICAgICAgZXhwaXJlc0F0ID0gcGFyc2VJbnQoZXhwaXJlc19hdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhY3R1YWxseUV4cGlyZXNJbiA9IGV4cGlyZXNBdCAtIHRpbWVOb3c7XG4gICAgICAgICAgICBpZiAoYWN0dWFsbHlFeHBpcmVzSW4gKiAxMDAwIDw9IEFVVE9fUkVGUkVTSF9USUNLX0RVUkFUSU9OX01TKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBAc3VwYWJhc2UvZ290cnVlLWpzOiBTZXNzaW9uIGFzIHJldHJpZXZlZCBmcm9tIFVSTCBleHBpcmVzIGluICR7YWN0dWFsbHlFeHBpcmVzSW59cywgc2hvdWxkIGhhdmUgYmVlbiBjbG9zZXIgdG8gJHtleHBpcmVzSW59c2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXNzdWVkQXQgPSBleHBpcmVzQXQgLSBleHBpcmVzSW47XG4gICAgICAgICAgICBpZiAodGltZU5vdyAtIGlzc3VlZEF0ID49IDEyMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQHN1cGFiYXNlL2dvdHJ1ZS1qczogU2Vzc2lvbiBhcyByZXRyaWV2ZWQgZnJvbSBVUkwgd2FzIGlzc3VlZCBvdmVyIDEyMHMgYWdvLCBVUkwgY291bGQgYmUgc3RhbGUnLCBpc3N1ZWRBdCwgZXhwaXJlc0F0LCB0aW1lTm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVOb3cgLSBpc3N1ZWRBdCA8IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0BzdXBhYmFzZS9nb3RydWUtanM6IFNlc3Npb24gYXMgcmV0cmlldmVkIGZyb20gVVJMIHdhcyBpc3N1ZWQgaW4gdGhlIGZ1dHVyZT8gQ2hlY2sgdGhlIGRldmljZSBjbG9jayBmb3Igc2tldycsIGlzc3VlZEF0LCBleHBpcmVzQXQsIHRpbWVOb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fZ2V0VXNlcihhY2Nlc3NfdG9rZW4pO1xuICAgICAgICAgICAgaWYgKGVycm9yKVxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHtcbiAgICAgICAgICAgICAgICBwcm92aWRlcl90b2tlbixcbiAgICAgICAgICAgICAgICBwcm92aWRlcl9yZWZyZXNoX3Rva2VuLFxuICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICBleHBpcmVzX2luOiBleHBpcmVzSW4sXG4gICAgICAgICAgICAgICAgZXhwaXJlc19hdDogZXhwaXJlc0F0LFxuICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgICAgICAgdG9rZW5fdHlwZTogdG9rZW5fdHlwZSxcbiAgICAgICAgICAgICAgICB1c2VyOiBkYXRhLnVzZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRva2VucyBmcm9tIFVSTFxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnJztcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2dldFNlc3Npb25Gcm9tVVJMKCknLCAnY2xlYXJpbmcgd2luZG93LmxvY2F0aW9uLmhhc2gnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHNlc3Npb24sIHJlZGlyZWN0VHlwZTogcGFyYW1zLnR5cGUgfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgc2Vzc2lvbjogbnVsbCwgcmVkaXJlY3RUeXBlOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IFVSTCBjb250YWlucyBwYXJhbWV0ZXJzIGdpdmVuIGJ5IGFuIGltcGxpY2l0IG9hdXRoIGdyYW50IGZsb3cgKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2NzQ5Lmh0bWwjc2VjdGlvbi00LjIpXG4gICAgICpcbiAgICAgKiBJZiBgZGV0ZWN0U2Vzc2lvbkluVXJsYCBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBVUkwgYW5kIHBhcmFtcyB0byBkZXRlcm1pbmVcbiAgICAgKiBpZiB0aGUgVVJMIHNob3VsZCBiZSBwcm9jZXNzZWQgYXMgYSBTdXBhYmFzZSBhdXRoIGNhbGxiYWNrLiBUaGlzIGFsbG93cyB1c2VycyB0byBleGNsdWRlXG4gICAgICogVVJMcyBmcm9tIG90aGVyIE9BdXRoIHByb3ZpZGVycyAoZS5nLiwgRmFjZWJvb2sgTG9naW4pIHRoYXQgYWxzbyByZXR1cm4gYWNjZXNzX3Rva2VuIGluIHRoZSBmcmFnbWVudC5cbiAgICAgKi9cbiAgICBfaXNJbXBsaWNpdEdyYW50Q2FsbGJhY2socGFyYW1zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZXRlY3RTZXNzaW9uSW5VcmwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGVjdFNlc3Npb25JblVybChuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSwgcGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQm9vbGVhbihwYXJhbXMuYWNjZXNzX3Rva2VuIHx8IHBhcmFtcy5lcnJvcl9kZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBVUkwgYW5kIGJhY2tpbmcgc3RvcmFnZSBjb250YWluIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgYSBQS0NFIGZsb3dcbiAgICAgKi9cbiAgICBhc3luYyBfaXNQS0NFQ2FsbGJhY2socGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdG9yYWdlQ29udGVudCA9IGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICByZXR1cm4gISEocGFyYW1zLmNvZGUgJiYgY3VycmVudFN0b3JhZ2VDb250ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zaWRlIGEgYnJvd3NlciBjb250ZXh0LCBgc2lnbk91dCgpYCB3aWxsIHJlbW92ZSB0aGUgbG9nZ2VkIGluIHVzZXIgZnJvbSB0aGUgYnJvd3NlciBzZXNzaW9uIGFuZCBsb2cgdGhlbSBvdXQgLSByZW1vdmluZyBhbGwgaXRlbXMgZnJvbSBsb2NhbHN0b3JhZ2UgYW5kIHRoZW4gdHJpZ2dlciBhIGBcIlNJR05FRF9PVVRcImAgZXZlbnQuXG4gICAgICpcbiAgICAgKiBGb3Igc2VydmVyLXNpZGUgbWFuYWdlbWVudCwgeW91IGNhbiByZXZva2UgYWxsIHJlZnJlc2ggdG9rZW5zIGZvciBhIHVzZXIgYnkgcGFzc2luZyBhIHVzZXIncyBKV1QgdGhyb3VnaCB0byBgYXV0aC5hcGkuc2lnbk91dChKV1Q6IHN0cmluZylgLlxuICAgICAqIFRoZXJlIGlzIG5vIHdheSB0byByZXZva2UgYSB1c2VyJ3MgYWNjZXNzIHRva2VuIGp3dCB1bnRpbCBpdCBleHBpcmVzLiBJdCBpcyByZWNvbW1lbmRlZCB0byBzZXQgYSBzaG9ydGVyIGV4cGlyeSBvbiB0aGUgand0IGZvciB0aGlzIHJlYXNvbi5cbiAgICAgKlxuICAgICAqIElmIHVzaW5nIGBvdGhlcnNgIHNjb3BlLCBubyBgU0lHTkVEX09VVGAgZXZlbnQgaXMgZmlyZWQhXG4gICAgICovXG4gICAgYXN5bmMgc2lnbk91dChvcHRpb25zID0geyBzY29wZTogJ2dsb2JhbCcgfSkge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9zaWduT3V0KG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3NpZ25PdXQoeyBzY29wZSB9ID0geyBzY29wZTogJ2dsb2JhbCcgfSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gKF9hID0gZGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWNjZXNzX3Rva2VuO1xuICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gYXdhaXQgdGhpcy5hZG1pbi5zaWduT3V0KGFjY2Vzc1Rva2VuLCBzY29wZSk7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSA0MDRzIHNpbmNlIHVzZXIgbWlnaHQgbm90IGV4aXN0IGFueW1vcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIDQwMXMgc2luY2UgYW4gaW52YWxpZCBvciBleHBpcmVkIEpXVCBzaG91bGQgc2lnbiBvdXQgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAgICAgICAgICAgICAgICBpZiAoIShpc0F1dGhBcGlFcnJvcihlcnJvcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvci5zdGF0dXMgPT09IDQwNCB8fCBlcnJvci5zdGF0dXMgPT09IDQwMSB8fCBlcnJvci5zdGF0dXMgPT09IDQwMykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2NvcGUgIT09ICdvdGhlcnMnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVtb3ZlU2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGVycm9yOiBudWxsIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgb25BdXRoU3RhdGVDaGFuZ2UoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgaWQgPSBnZW5lcmF0ZUNhbGxiYWNrSWQoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyN1bnN1YnNjcmliZSgpJywgJ3N0YXRlIGNoYW5nZSBjYWxsYmFjayB3aXRoIGlkIHJlbW92ZWQnLCBpZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZUVtaXR0ZXJzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kZWJ1ZygnI29uQXV0aFN0YXRlQ2hhbmdlKCknLCAncmVnaXN0ZXJlZCBjYWxsYmFjayB3aXRoIGlkJywgaWQpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlRW1pdHRlcnMuc2V0KGlkLCBzdWJzY3JpcHRpb24pO1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvbWlzZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEluaXRpYWxTZXNzaW9uKGlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSgpO1xuICAgICAgICByZXR1cm4geyBkYXRhOiB7IHN1YnNjcmlwdGlvbiB9IH07XG4gICAgfVxuICAgIGFzeW5jIF9lbWl0SW5pdGlhbFNlc3Npb24oaWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSwgZXJyb3IsIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICBhd2FpdCAoKF9hID0gdGhpcy5zdGF0ZUNoYW5nZUVtaXR0ZXJzLmdldChpZCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsYmFjaygnSU5JVElBTF9TRVNTSU9OJywgc2Vzc2lvbikpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdJTklUSUFMX1NFU1NJT04nLCAnY2FsbGJhY2sgaWQnLCBpZCwgJ3Nlc3Npb24nLCBzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCAoKF9iID0gdGhpcy5zdGF0ZUNoYW5nZUVtaXR0ZXJzLmdldChpZCkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsYmFjaygnSU5JVElBTF9TRVNTSU9OJywgbnVsbCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdJTklUSUFMX1NFU1NJT04nLCAnY2FsbGJhY2sgaWQnLCBpZCwgJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIHBhc3N3b3JkIHJlc2V0IHJlcXVlc3QgdG8gYW4gZW1haWwgYWRkcmVzcy4gVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIFBLQ0UgZmxvdy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbWFpbCBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRpcmVjdFRvIFRoZSBVUkwgdG8gc2VuZCB0aGUgdXNlciB0byBhZnRlciB0aGV5IGNsaWNrIHRoZSBwYXNzd29yZCByZXNldCBsaW5rLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLmNhcHRjaGFUb2tlbiBWZXJpZmljYXRpb24gdG9rZW4gcmVjZWl2ZWQgd2hlbiB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIGNhcHRjaGEgb24gdGhlIHNpdGUuXG4gICAgICovXG4gICAgYXN5bmMgcmVzZXRQYXNzd29yZEZvckVtYWlsKGVtYWlsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IGNvZGVDaGFsbGVuZ2UgPSBudWxsO1xuICAgICAgICBsZXQgY29kZUNoYWxsZW5nZU1ldGhvZCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIFtjb2RlQ2hhbGxlbmdlLCBjb2RlQ2hhbGxlbmdlTWV0aG9kXSA9IGF3YWl0IGdldENvZGVDaGFsbGVuZ2VBbmRNZXRob2QodGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXksIHRydWUgLy8gaXNQYXNzd29yZFJlY292ZXJ5XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vcmVjb3ZlcmAsIHtcbiAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgICAgICAgICAgICBjb2RlX2NoYWxsZW5nZTogY29kZUNoYWxsZW5nZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZV9jaGFsbGVuZ2VfbWV0aG9kOiBjb2RlQ2hhbGxlbmdlTWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICBnb3RydWVfbWV0YV9zZWN1cml0eTogeyBjYXB0Y2hhX3Rva2VuOiBvcHRpb25zLmNhcHRjaGFUb2tlbiB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VG86IG9wdGlvbnMucmVkaXJlY3RUbyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgdGhlIGlkZW50aXRpZXMgbGlua2VkIHRvIGEgdXNlci5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRVc2VySWRlbnRpdGllcygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyKCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyBpZGVudGl0aWVzOiAoX2EgPSBkYXRhLnVzZXIuaWRlbnRpdGllcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10gfSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgbGlua0lkZW50aXR5KGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIGlmICgndG9rZW4nIGluIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saW5rSWRlbnRpdHlJZFRva2VuKGNyZWRlbnRpYWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5saW5rSWRlbnRpdHlPQXV0aChjcmVkZW50aWFscyk7XG4gICAgfVxuICAgIGFzeW5jIGxpbmtJZGVudGl0eU9BdXRoKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5fZ2V0VXJsRm9yUHJvdmlkZXIoYCR7dGhpcy51cmx9L3VzZXIvaWRlbnRpdGllcy9hdXRob3JpemVgLCBjcmVkZW50aWFscy5wcm92aWRlciwge1xuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFRvOiAoX2EgPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVkaXJlY3RUbyxcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVzOiAoX2IgPSBjcmVkZW50aWFscy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc2NvcGVzLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogKF9jID0gY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICBza2lwQnJvd3NlclJlZGlyZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgdXJsLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgand0OiAoX2UgPSAoX2QgPSBkYXRhLnNlc3Npb24pID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5hY2Nlc3NfdG9rZW4pICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGVycm9yKVxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgaWYgKGlzQnJvd3NlcigpICYmICEoKF9hID0gY3JlZGVudGlhbHMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNraXBCcm93c2VyUmVkaXJlY3QpKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEudXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHsgcHJvdmlkZXI6IGNyZWRlbnRpYWxzLnByb3ZpZGVyLCB1cmw6IGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YS51cmwgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHByb3ZpZGVyOiBjcmVkZW50aWFscy5wcm92aWRlciwgdXJsOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgbGlua0lkZW50aXR5SWRUb2tlbihjcmVkZW50aWFscykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3I6IHNlc3Npb25FcnJvciwgZGF0YTogeyBzZXNzaW9uIH0sIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc2Vzc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgb3B0aW9ucywgcHJvdmlkZXIsIHRva2VuLCBhY2Nlc3NfdG9rZW4sIG5vbmNlIH0gPSBjcmVkZW50aWFscztcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnUE9TVCcsIGAke3RoaXMudXJsfS90b2tlbj9ncmFudF90eXBlPWlkX3Rva2VuYCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogKF9hID0gc2Vzc2lvbiA9PT0gbnVsbCB8fCBzZXNzaW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXNzaW9uLmFjY2Vzc190b2tlbikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkX3Rva2VuOiB0b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua19pZGVudGl0eTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdHJ1ZV9tZXRhX3NlY3VyaXR5OiB7IGNhcHRjaGFfdG9rZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXB0Y2hhVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeGZvcm06IF9zZXNzaW9uUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogeyB1c2VyOiBudWxsLCBzZXNzaW9uOiBudWxsIH0sIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZGF0YSB8fCAhZGF0YS5zZXNzaW9uIHx8ICFkYXRhLnVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IHVzZXI6IG51bGwsIHNlc3Npb246IG51bGwgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IoKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ1VTRVJfVVBEQVRFRCcsIGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIGAke3RoaXMuc3RvcmFnZUtleX0tY29kZS12ZXJpZmllcmApO1xuICAgICAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IHsgdXNlcjogbnVsbCwgc2Vzc2lvbjogbnVsbCB9LCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbmxpbmtzIGFuIGlkZW50aXR5IGZyb20gYSB1c2VyIGJ5IGRlbGV0aW5nIGl0LiBUaGUgdXNlciB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHNpZ24gaW4gd2l0aCB0aGF0IGlkZW50aXR5IG9uY2UgaXQncyB1bmxpbmtlZC5cbiAgICAgKi9cbiAgICBhc3luYyB1bmxpbmtJZGVudGl0eShpZGVudGl0eSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdERUxFVEUnLCBgJHt0aGlzLnVybH0vdXNlci9pZGVudGl0aWVzLyR7aWRlbnRpdHkuaWRlbnRpdHlfaWR9YCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogKF9iID0gKF9hID0gZGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWNjZXNzX3Rva2VuKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBuZXcgSldULlxuICAgICAqIEBwYXJhbSByZWZyZXNoVG9rZW4gQSB2YWxpZCByZWZyZXNoIHRva2VuIHRoYXQgd2FzIHJldHVybmVkIG9uIGxvZ2luLlxuICAgICAqL1xuICAgIGFzeW5jIF9yZWZyZXNoQWNjZXNzVG9rZW4ocmVmcmVzaFRva2VuKSB7XG4gICAgICAgIGNvbnN0IGRlYnVnTmFtZSA9IGAjX3JlZnJlc2hBY2Nlc3NUb2tlbigke3JlZnJlc2hUb2tlbi5zdWJzdHJpbmcoMCwgNSl9Li4uKWA7XG4gICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2JlZ2luJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgLy8gd2lsbCBhdHRlbXB0IHRvIHJlZnJlc2ggdGhlIHRva2VuIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJldHJ5YWJsZShhc3luYyAoYXR0ZW1wdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcCgyMDAgKiBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSkpOyAvLyAyMDAsIDQwMCwgODAwLCAuLi5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAncmVmcmVzaGluZyBhdHRlbXB0JywgYXR0ZW1wdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L3Rva2VuP2dyYW50X3R5cGU9cmVmcmVzaF90b2tlbmAsIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keTogeyByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4gfSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogX3Nlc3Npb25SZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIChhdHRlbXB0LCBlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRCYWNrT2ZmSW50ZXJ2YWwgPSAyMDAgKiBNYXRoLnBvdygyLCBhdHRlbXB0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgIGlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoZXJyb3IpICYmXG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5YWJsZSBvbmx5IGlmIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50IGJlZm9yZSB0aGUgYmFja29mZiBvdmVyZmxvd3MgdGhlIHRpY2sgZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgRGF0ZS5ub3coKSArIG5leHRCYWNrT2ZmSW50ZXJ2YWwgLSBzdGFydGVkQXQgPCBBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiB7IHNlc3Npb246IG51bGwsIHVzZXI6IG51bGwgfSwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9pc1ZhbGlkU2Vzc2lvbihtYXliZVNlc3Npb24pIHtcbiAgICAgICAgY29uc3QgaXNWYWxpZFNlc3Npb24gPSB0eXBlb2YgbWF5YmVTZXNzaW9uID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgbWF5YmVTZXNzaW9uICE9PSBudWxsICYmXG4gICAgICAgICAgICAnYWNjZXNzX3Rva2VuJyBpbiBtYXliZVNlc3Npb24gJiZcbiAgICAgICAgICAgICdyZWZyZXNoX3Rva2VuJyBpbiBtYXliZVNlc3Npb24gJiZcbiAgICAgICAgICAgICdleHBpcmVzX2F0JyBpbiBtYXliZVNlc3Npb247XG4gICAgICAgIHJldHVybiBpc1ZhbGlkU2Vzc2lvbjtcbiAgICB9XG4gICAgYXN5bmMgX2hhbmRsZVByb3ZpZGVyU2lnbkluKHByb3ZpZGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuX2dldFVybEZvclByb3ZpZGVyKGAke3RoaXMudXJsfS9hdXRob3JpemVgLCBwcm92aWRlciwge1xuICAgICAgICAgICAgcmVkaXJlY3RUbzogb3B0aW9ucy5yZWRpcmVjdFRvLFxuICAgICAgICAgICAgc2NvcGVzOiBvcHRpb25zLnNjb3BlcyxcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBvcHRpb25zLnF1ZXJ5UGFyYW1zLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfaGFuZGxlUHJvdmlkZXJTaWduSW4oKScsICdwcm92aWRlcicsIHByb3ZpZGVyLCAnb3B0aW9ucycsIG9wdGlvbnMsICd1cmwnLCB1cmwpO1xuICAgICAgICAvLyB0cnkgdG8gb3BlbiBvbiB0aGUgYnJvd3NlclxuICAgICAgICBpZiAoaXNCcm93c2VyKCkgJiYgIW9wdGlvbnMuc2tpcEJyb3dzZXJSZWRpcmVjdCkge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHsgcHJvdmlkZXIsIHVybCB9LCBlcnJvcjogbnVsbCB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWNvdmVycyB0aGUgc2Vzc2lvbiBmcm9tIExvY2FsU3RvcmFnZSBhbmQgcmVmcmVzaGVzIHRoZSB0b2tlblxuICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIGFzeW5jIHRvIGFjY29tbW9kYXRlIGZvciBBc3luY1N0b3JhZ2UgZS5nLiBpbiBSZWFjdCBuYXRpdmUuXG4gICAgICovXG4gICAgYXN5bmMgX3JlY292ZXJBbmRSZWZyZXNoKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBkZWJ1Z05hbWUgPSAnI19yZWNvdmVyQW5kUmVmcmVzaCgpJztcbiAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnYmVnaW4nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZXNzaW9uID0gKGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSkpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRTZXNzaW9uICYmIHRoaXMudXNlclN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWF5YmVVc2VyID0gKGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnVzZXJTdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkgKyAnLXVzZXInKSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3JhZ2UuaXNTZXJ2ZXIgJiYgT2JqZWN0LmlzKHRoaXMuc3RvcmFnZSwgdGhpcy51c2VyU3RvcmFnZSkgJiYgIW1heWJlVXNlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBzdG9yYWdlIGFuZCB1c2VyU3RvcmFnZSBhcmUgdGhlIHNhbWUgc3RvcmFnZSBtZWRpdW0sIGZvciBleGFtcGxlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5sb2NhbFN0b3JhZ2UgaWYgdXNlclN0b3JhZ2UgZG9lcyBub3QgaGF2ZSB0aGUgdXNlciBmcm9tXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0b3JhZ2Ugc3RvcmVkLCBzdG9yZSBpdCBmaXJzdCB0aGVyZWJ5IG1pZ3JhdGluZyB0aGUgdXNlciBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBzdG9yYWdlIC0+IHVzZXJTdG9yYWdlXG4gICAgICAgICAgICAgICAgICAgIG1heWJlVXNlciA9IHsgdXNlcjogY3VycmVudFNlc3Npb24udXNlciB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXRJdGVtQXN5bmModGhpcy51c2VyU3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5ICsgJy11c2VyJywgbWF5YmVVc2VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciA9IChfYSA9IG1heWJlVXNlciA9PT0gbnVsbCB8fCBtYXliZVVzZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1heWJlVXNlci51c2VyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1c2VyTm90QXZhaWxhYmxlUHJveHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRTZXNzaW9uICYmICFjdXJyZW50U2Vzc2lvbi51c2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlciBzdG9yYWdlIGlzIG5vdCBzZXQsIGxldCdzIGNoZWNrIGlmIGl0IHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgc29cbiAgICAgICAgICAgICAgICAvLyB3ZSBicmluZyBiYWNrIHRoZSBzdG9yYWdlIGFzIGl0IHNob3VsZCBiZVxuICAgICAgICAgICAgICAgIGlmICghY3VycmVudFNlc3Npb24udXNlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0IGlmIHVzZXJTdG9yYWdlIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgYW5kIHRoZSBzdG9yYWdlIG1lZGl1bSB3YXMgdGhlIHNhbWUsIHRvIG1vdmUgdGhlIHVzZXIgYmFjayB1bmRlciB0aGUgc2FtZSBrZXlcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VwYXJhdGVVc2VyID0gKGF3YWl0IGdldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSArICctdXNlcicpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlcGFyYXRlVXNlciAmJiAoc2VwYXJhdGVVc2VyID09PSBudWxsIHx8IHNlcGFyYXRlVXNlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VwYXJhdGVVc2VyLnVzZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2Vzc2lvbi51c2VyID0gc2VwYXJhdGVVc2VyLnVzZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZW1vdmVJdGVtQXN5bmModGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkgKyAnLXVzZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSwgY3VycmVudFNlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlciA9IHVzZXJOb3RBdmFpbGFibGVQcm94eSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnc2Vzc2lvbiBmcm9tIHN0b3JhZ2UnLCBjdXJyZW50U2Vzc2lvbik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzVmFsaWRTZXNzaW9uKGN1cnJlbnRTZXNzaW9uKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ3Nlc3Npb24gaXMgbm90IHZhbGlkJyk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlbW92ZVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXhwaXJlc1dpdGhNYXJnaW4gPSAoKF9iID0gY3VycmVudFNlc3Npb24uZXhwaXJlc19hdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogSW5maW5pdHkpICogMTAwMCAtIERhdGUubm93KCkgPCBFWFBJUllfTUFSR0lOX01TO1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCBgc2Vzc2lvbiBoYXMke2V4cGlyZXNXaXRoTWFyZ2luID8gJycgOiAnIG5vdCd9IGV4cGlyZWQgd2l0aCBtYXJnaW4gb2YgJHtFWFBJUllfTUFSR0lOX01TfXNgKTtcbiAgICAgICAgICAgIGlmIChleHBpcmVzV2l0aE1hcmdpbikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dG9SZWZyZXNoVG9rZW4gJiYgY3VycmVudFNlc3Npb24ucmVmcmVzaF90b2tlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGVycm9yIH0gPSBhd2FpdCB0aGlzLl9jYWxsUmVmcmVzaFRva2VuKGN1cnJlbnRTZXNzaW9uLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0F1dGhSZXRyeWFibGVGZXRjaEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ3JlZnJlc2ggZmFpbGVkIHdpdGggYSBub24tcmV0cnlhYmxlIGVycm9yLCByZW1vdmluZyB0aGUgc2Vzc2lvbicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9yZW1vdmVTZXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50U2Vzc2lvbi51c2VyICYmXG4gICAgICAgICAgICAgICAgY3VycmVudFNlc3Npb24udXNlci5fX2lzVXNlck5vdEF2YWlsYWJsZVByb3h5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHByb3h5IHVzZXIsIHRyeSB0byBnZXQgdGhlIHJlYWwgdXNlciBkYXRhXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvcjogdXNlckVycm9yIH0gPSBhd2FpdCB0aGlzLl9nZXRVc2VyKGN1cnJlbnRTZXNzaW9uLmFjY2Vzc190b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdXNlckVycm9yICYmIChkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEudXNlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXNzaW9uLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zYXZlU2Vzc2lvbihjdXJyZW50U2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnU0lHTkVEX0lOJywgY3VycmVudFNlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnY291bGQgbm90IGdldCB1c2VyIGRhdGEsIHNraXBwaW5nIFNJR05FRF9JTiBub3RpZmljYXRpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZ2V0VXNlckVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdldHRpbmcgdXNlciBkYXRhOicsIGdldFVzZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2Vycm9yIGdldHRpbmcgdXNlciBkYXRhLCBza2lwcGluZyBTSUdORURfSU4gbm90aWZpY2F0aW9uJywgZ2V0VXNlckVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHBlcnNpc3QgY3VycmVudFNlc3Npb24gYWdhaW4sIGFzIHdlIGp1c3QgbG9hZGVkIGl0IGZyb21cbiAgICAgICAgICAgICAgICAvLyBsb2NhbCBzdG9yYWdlOyBwZXJzaXN0aW5nIGl0IGFnYWluIG1heSBvdmVyd3JpdGUgYSB2YWx1ZSBzYXZlZCBieVxuICAgICAgICAgICAgICAgIC8vIGFub3RoZXIgY2xpZW50IHdpdGggYWNjZXNzIHRvIHRoZSBzYW1lIGxvY2FsIHN0b3JhZ2VcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnU0lHTkVEX0lOJywgY3VycmVudFNlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9jYWxsUmVmcmVzaFRva2VuKHJlZnJlc2hUb2tlbikge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVmcmVzaGluZyBpcyBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgICAgIGlmICh0aGlzLnJlZnJlc2hpbmdEZWZlcnJlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaGluZ0RlZmVycmVkLnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVidWdOYW1lID0gYCNfY2FsbFJlZnJlc2hUb2tlbigke3JlZnJlc2hUb2tlbi5zdWJzdHJpbmcoMCwgNSl9Li4uKWA7XG4gICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2JlZ2luJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hpbmdEZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpO1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fcmVmcmVzaEFjY2Vzc1Rva2VuKHJlZnJlc2hUb2tlbik7XG4gICAgICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICBpZiAoIWRhdGEuc2Vzc2lvbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NhdmVTZXNzaW9uKGRhdGEuc2Vzc2lvbik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3RpZnlBbGxTdWJzY3JpYmVycygnVE9LRU5fUkVGUkVTSEVEJywgZGF0YS5zZXNzaW9uKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgZGF0YTogZGF0YS5zZXNzaW9uLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoaW5nRGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JlbW92ZVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKF9hID0gdGhpcy5yZWZyZXNoaW5nRGVmZXJyZWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChfYiA9IHRoaXMucmVmcmVzaGluZ0RlZmVycmVkKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoaW5nRGVmZXJyZWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fZGVidWcoZGVidWdOYW1lLCAnZW5kJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX25vdGlmeUFsbFN1YnNjcmliZXJzKGV2ZW50LCBzZXNzaW9uLCBicm9hZGNhc3QgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGRlYnVnTmFtZSA9IGAjX25vdGlmeUFsbFN1YnNjcmliZXJzKCR7ZXZlbnR9KWA7XG4gICAgICAgIHRoaXMuX2RlYnVnKGRlYnVnTmFtZSwgJ2JlZ2luJywgc2Vzc2lvbiwgYGJyb2FkY2FzdCA9ICR7YnJvYWRjYXN0fWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYnJvYWRjYXN0Q2hhbm5lbCAmJiBicm9hZGNhc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwucG9zdE1lc3NhZ2UoeyBldmVudCwgc2Vzc2lvbiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBBcnJheS5mcm9tKHRoaXMuc3RhdGVDaGFuZ2VFbWl0dGVycy52YWx1ZXMoKSkubWFwKGFzeW5jICh4KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgeC5jYWxsYmFjayhldmVudCwgc2Vzc2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlcnJvcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcnNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcnNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZyhkZWJ1Z05hbWUsICdlbmQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBzZXQgY3VycmVudFNlc3Npb24gYW5kIGN1cnJlbnRVc2VyXG4gICAgICogcHJvY2VzcyB0byBfc3RhcnRBdXRvUmVmcmVzaFRva2VuIGlmIHBvc3NpYmxlXG4gICAgICovXG4gICAgYXN5bmMgX3NhdmVTZXNzaW9uKHNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5fZGVidWcoJyNfc2F2ZVNlc3Npb24oKScsIHNlc3Npb24pO1xuICAgICAgICAvLyBfc2F2ZVNlc3Npb24gaXMgYWx3YXlzIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBzZXNzaW9uIGhhcyBiZWVuIGFjcXVpcmVkXG4gICAgICAgIC8vIHNvIHdlIGNhbiBzYWZlbHkgc3VwcHJlc3MgdGhlIHdhcm5pbmcgcmV0dXJuZWQgYnkgZnV0dXJlIGdldFNlc3Npb24gY2FsbHNcbiAgICAgICAgdGhpcy5zdXBwcmVzc0dldFNlc3Npb25XYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgYCR7dGhpcy5zdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCk7XG4gICAgICAgIC8vIENyZWF0ZSBhIHNoYWxsb3cgY29weSB0byB3b3JrIHdpdGgsIHRvIGF2b2lkIG11dGF0aW5nIHRoZSBvcmlnaW5hbCBzZXNzaW9uIG9iamVjdCBpZiBpdCdzIHVzZWQgZWxzZXdoZXJlXG4gICAgICAgIGNvbnN0IHNlc3Npb25Ub1Byb2Nlc3MgPSBPYmplY3QuYXNzaWduKHt9LCBzZXNzaW9uKTtcbiAgICAgICAgY29uc3QgdXNlcklzUHJveHkgPSBzZXNzaW9uVG9Qcm9jZXNzLnVzZXIgJiYgc2Vzc2lvblRvUHJvY2Vzcy51c2VyLl9faXNVc2VyTm90QXZhaWxhYmxlUHJveHkgPT09IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnVzZXJTdG9yYWdlKSB7XG4gICAgICAgICAgICBpZiAoIXVzZXJJc1Byb3h5ICYmIHNlc3Npb25Ub1Byb2Nlc3MudXNlcikge1xuICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgYSByZWFsIHVzZXIgb2JqZWN0LCBzYXZlIGl0IHRvIHVzZXJTdG9yYWdlLlxuICAgICAgICAgICAgICAgIGF3YWl0IHNldEl0ZW1Bc3luYyh0aGlzLnVzZXJTdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkgKyAnLXVzZXInLCB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IHNlc3Npb25Ub1Byb2Nlc3MudXNlcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHVzZXJJc1Byb3h5KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgaXQncyB0aGUgcHJveHksIGl0IG1lYW5zIHVzZXIgd2FzIG5vdCBmb3VuZCBpbiB1c2VyU3RvcmFnZS5cbiAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgZW5zdXJlIG5vIHN0YWxlIHVzZXIgZGF0YSBmb3IgdGhpcyBrZXkgZXhpc3RzIGluIHVzZXJTdG9yYWdlIGlmIHdlIHdlcmUgdG8gc2F2ZSBudWxsLFxuICAgICAgICAgICAgICAgIC8vIG9yIHNpbXBseSBub3Qgc2F2ZSB0aGUgcHJveHkuIEZvciBub3csIHdlIGRvbid0IHNhdmUgdGhlIHByb3h5IGhlcmUuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIG5lZWQgdG8gY2xlYXIgdXNlclN0b3JhZ2UgaWYgdXNlciBiZWNvbWVzIHByb3h5LCB0aGF0IGxvZ2ljIHdvdWxkIGdvIGhlcmUuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtYWluIHNlc3Npb24gZGF0YSBmb3IgcHJpbWFyeSBzdG9yYWdlOiByZW1vdmUgdGhlIHVzZXIgcHJvcGVydHkgYmVmb3JlIGNsb25pbmdcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIG9yaWdpbmFsIHNlc3Npb24udXNlciBtaWdodCBiZSB0aGUgcHJveHlcbiAgICAgICAgICAgIGNvbnN0IG1haW5TZXNzaW9uRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHNlc3Npb25Ub1Byb2Nlc3MpO1xuICAgICAgICAgICAgZGVsZXRlIG1haW5TZXNzaW9uRGF0YS51c2VyOyAvLyBSZW1vdmUgdXNlciAocmVhbCBvciBwcm94eSkgYmVmb3JlIGNsb25pbmcgZm9yIG1haW4gc3RvcmFnZVxuICAgICAgICAgICAgY29uc3QgY2xvbmVkTWFpblNlc3Npb25EYXRhID0gZGVlcENsb25lKG1haW5TZXNzaW9uRGF0YSk7XG4gICAgICAgICAgICBhd2FpdCBzZXRJdGVtQXN5bmModGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXksIGNsb25lZE1haW5TZXNzaW9uRGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBObyB1c2VyU3RvcmFnZSBpcyBjb25maWd1cmVkLlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBzZXNzaW9uLnVzZXIgc2hvdWxkIGlkZWFsbHkgbm90IGJlIGEgcHJveHkuXG4gICAgICAgICAgICAvLyBJZiBpdCB3ZXJlLCBzdHJ1Y3R1cmVkQ2xvbmUgd291bGQgZmFpbC4gVGhpcyBpbXBsaWVzIGFuIGlzc3VlIGVsc2V3aGVyZSBpZiB1c2VyIGlzIGEgcHJveHkgaGVyZVxuICAgICAgICAgICAgY29uc3QgY2xvbmVkU2Vzc2lvbiA9IGRlZXBDbG9uZShzZXNzaW9uVG9Qcm9jZXNzKTsgLy8gc2Vzc2lvblRvUHJvY2VzcyBzdGlsbCBoYXMgaXRzIG9yaWdpbmFsIHVzZXIgcHJvcGVydHlcbiAgICAgICAgICAgIGF3YWl0IHNldEl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSwgY2xvbmVkU2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX3JlbW92ZVNlc3Npb24oKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX3JlbW92ZVNlc3Npb24oKScpO1xuICAgICAgICB0aGlzLnN1cHByZXNzR2V0U2Vzc2lvbldhcm5pbmcgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5KTtcbiAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMuc3RvcmFnZSwgdGhpcy5zdG9yYWdlS2V5ICsgJy1jb2RlLXZlcmlmaWVyJyk7XG4gICAgICAgIGF3YWl0IHJlbW92ZUl0ZW1Bc3luYyh0aGlzLnN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSArICctdXNlcicpO1xuICAgICAgICBpZiAodGhpcy51c2VyU3RvcmFnZSkge1xuICAgICAgICAgICAgYXdhaXQgcmVtb3ZlSXRlbUFzeW5jKHRoaXMudXNlclN0b3JhZ2UsIHRoaXMuc3RvcmFnZUtleSArICctdXNlcicpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuX25vdGlmeUFsbFN1YnNjcmliZXJzKCdTSUdORURfT1VUJywgbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYW55IHJlZ2lzdGVyZWQgdmlzaWJpbGl0eWNoYW5nZSBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIHtAc2VlICNzdGFydEF1dG9SZWZyZXNofVxuICAgICAqIHtAc2VlICNzdG9wQXV0b1JlZnJlc2h9XG4gICAgICovXG4gICAgX3JlbW92ZVZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2soKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX3JlbW92ZVZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2soKScpO1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMudmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjaztcbiAgICAgICAgdGhpcy52aXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayAmJiBpc0Jyb3dzZXIoKSAmJiAod2luZG93ID09PSBudWxsIHx8IHdpbmRvdyA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIpKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3JlbW92aW5nIHZpc2liaWxpdHljaGFuZ2UgY2FsbGJhY2sgZmFpbGVkJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgI3N0YXJ0QXV0b1JlZnJlc2h9LiBVc2UgdGhpc1xuICAgICAqIHdpdGhpbiB0aGUgbGlicmFyeS5cbiAgICAgKi9cbiAgICBhc3luYyBfc3RhcnRBdXRvUmVmcmVzaCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RvcEF1dG9SZWZyZXNoKCk7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX3N0YXJ0QXV0b1JlZnJlc2goKScpO1xuICAgICAgICBjb25zdCB0aWNrZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLl9hdXRvUmVmcmVzaFRva2VuVGljaygpLCBBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyk7XG4gICAgICAgIHRoaXMuYXV0b1JlZnJlc2hUaWNrZXIgPSB0aWNrZXI7XG4gICAgICAgIGlmICh0aWNrZXIgJiYgdHlwZW9mIHRpY2tlciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRpY2tlci51bnJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gdGlja2VyIGlzIGEgTm9kZUpTIFRpbWVvdXQgb2JqZWN0IHRoYXQgaGFzIGFuIGB1bnJlZmAgbWV0aG9kXG4gICAgICAgICAgICAvLyBodHRwczovL25vZGVqcy5vcmcvYXBpL3RpbWVycy5odG1sI3RpbWVvdXR1bnJlZlxuICAgICAgICAgICAgLy8gV2hlbiBhdXRvIHJlZnJlc2ggaXMgdXNlZCBpbiBOb2RlSlMgKGxpa2UgZm9yIHRlc3RpbmcpIHRoZVxuICAgICAgICAgICAgLy8gYHNldEludGVydmFsYCBpcyBwcmV2ZW50aW5nIHRoZSBwcm9jZXNzIGZyb20gYmVpbmcgbWFya2VkIGFzXG4gICAgICAgICAgICAvLyBmaW5pc2hlZCBhbmQgdGVzdHMgcnVuIGVuZGxlc3NseS4gVGhpcyBjYW4gYmUgcHJldmVudGVkIGJ5IGNhbGxpbmdcbiAgICAgICAgICAgIC8vIGB1bnJlZigpYCBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0LlxuICAgICAgICAgICAgdGlja2VyLnVucmVmKCk7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRTIGhhcyBubyBjb250ZXh0IG9mIERlbm9cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgRGVubyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIERlbm8udW5yZWZUaW1lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gc2ltaWxhciBsaWtlIGZvciBOb2RlSlMsIGJ1dCB3aXRoIHRoZSBEZW5vIEFQSVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZW5vLmxhbmQvYXBpQGxhdGVzdD91bnN0YWJsZSZzPURlbm8udW5yZWZUaW1lclxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUUyBoYXMgbm8gY29udGV4dCBvZiBEZW5vXG4gICAgICAgICAgICBEZW5vLnVucmVmVGltZXIodGlja2VyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBydW4gdGhlIHRpY2sgaW1tZWRpYXRlbHksIGJ1dCBpbiB0aGUgbmV4dCBwYXNzIG9mIHRoZSBldmVudCBsb29wIHNvIHRoYXRcbiAgICAgICAgLy8gI19pbml0aWFsaXplIGNhbiBiZSBhbGxvd2VkIHRvIGNvbXBsZXRlIHdpdGhvdXQgcmVjdXJzaXZlbHkgd2FpdGluZyBvblxuICAgICAgICAvLyBpdHNlbGZcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fYXV0b1JlZnJlc2hUb2tlblRpY2soKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdGhlIHByaXZhdGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rICNzdG9wQXV0b1JlZnJlc2h9LiBVc2UgdGhpc1xuICAgICAqIHdpdGhpbiB0aGUgbGlicmFyeS5cbiAgICAgKi9cbiAgICBhc3luYyBfc3RvcEF1dG9SZWZyZXNoKCkge1xuICAgICAgICB0aGlzLl9kZWJ1ZygnI19zdG9wQXV0b1JlZnJlc2goKScpO1xuICAgICAgICBjb25zdCB0aWNrZXIgPSB0aGlzLmF1dG9SZWZyZXNoVGlja2VyO1xuICAgICAgICB0aGlzLmF1dG9SZWZyZXNoVGlja2VyID0gbnVsbDtcbiAgICAgICAgaWYgKHRpY2tlcikge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aWNrZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhbiBhdXRvLXJlZnJlc2ggcHJvY2VzcyBpbiB0aGUgYmFja2dyb3VuZC4gVGhlIHNlc3Npb24gaXMgY2hlY2tlZFxuICAgICAqIGV2ZXJ5IGZldyBzZWNvbmRzLiBDbG9zZSB0byB0aGUgdGltZSBvZiBleHBpcmF0aW9uIGEgcHJvY2VzcyBpcyBzdGFydGVkIHRvXG4gICAgICogcmVmcmVzaCB0aGUgc2Vzc2lvbi4gSWYgcmVmcmVzaGluZyBmYWlscyBpdCB3aWxsIGJlIHJldHJpZWQgZm9yIGFzIGxvbmcgYXNcbiAgICAgKiBuZWNlc3NhcnkuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugc2V0IHRoZSB7QGxpbmsgR29UcnVlQ2xpZW50T3B0aW9ucyNhdXRvUmVmcmVzaFRva2VufSB5b3UgZG9uJ3QgbmVlZFxuICAgICAqIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIE9uIGJyb3dzZXJzIHRoZSByZWZyZXNoIHByb2Nlc3Mgd29ya3Mgb25seSB3aGVuIHRoZSB0YWIvd2luZG93IGlzIGluIHRoZVxuICAgICAqIGZvcmVncm91bmQgdG8gY29uc2VydmUgcmVzb3VyY2VzIGFzIHdlbGwgYXMgcHJldmVudCByYWNlIGNvbmRpdGlvbnMgYW5kXG4gICAgICogZmxvb2RpbmcgYXV0aCB3aXRoIHJlcXVlc3RzLiBJZiB5b3UgY2FsbCB0aGlzIG1ldGhvZCBhbnkgbWFuYWdlZFxuICAgICAqIHZpc2liaWxpdHkgY2hhbmdlIGNhbGxiYWNrIHdpbGwgYmUgcmVtb3ZlZCBhbmQgeW91IG11c3QgbWFuYWdlIHZpc2liaWxpdHlcbiAgICAgKiBjaGFuZ2VzIG9uIHlvdXIgb3duLlxuICAgICAqXG4gICAgICogT24gbm9uLWJyb3dzZXIgcGxhdGZvcm1zIHRoZSByZWZyZXNoIHByb2Nlc3Mgd29ya3MgKmNvbnRpbnVvdXNseSogaW4gdGhlXG4gICAgICogYmFja2dyb3VuZCwgd2hpY2ggbWF5IG5vdCBiZSBkZXNpcmFibGUuIFlvdSBzaG91bGQgaG9vayBpbnRvIHlvdXJcbiAgICAgKiBwbGF0Zm9ybSdzIGZvcmVncm91bmQgaW5kaWNhdGlvbiBtZWNoYW5pc20gYW5kIGNhbGwgdGhlc2UgbWV0aG9kc1xuICAgICAqIGFwcHJvcHJpYXRlbHkgdG8gY29uc2VydmUgcmVzb3VyY2VzLlxuICAgICAqXG4gICAgICoge0BzZWUgI3N0b3BBdXRvUmVmcmVzaH1cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydEF1dG9SZWZyZXNoKCkge1xuICAgICAgICB0aGlzLl9yZW1vdmVWaXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3N0YXJ0QXV0b1JlZnJlc2goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RvcHMgYW4gYWN0aXZlIGF1dG8gcmVmcmVzaCBwcm9jZXNzIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQgKGlmIGFueSkuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgY2FsbCB0aGlzIG1ldGhvZCBhbnkgbWFuYWdlZCB2aXNpYmlsaXR5IGNoYW5nZSBjYWxsYmFjayB3aWxsIGJlXG4gICAgICogcmVtb3ZlZCBhbmQgeW91IG11c3QgbWFuYWdlIHZpc2liaWxpdHkgY2hhbmdlcyBvbiB5b3VyIG93bi5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgI3N0YXJ0QXV0b1JlZnJlc2h9IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgYXN5bmMgc3RvcEF1dG9SZWZyZXNoKCkge1xuICAgICAgICB0aGlzLl9yZW1vdmVWaXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3N0b3BBdXRvUmVmcmVzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW5zIHRoZSBhdXRvIHJlZnJlc2ggdG9rZW4gdGljay5cbiAgICAgKi9cbiAgICBhc3luYyBfYXV0b1JlZnJlc2hUb2tlblRpY2soKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX2F1dG9SZWZyZXNoVG9rZW5UaWNrKCknLCAnYmVnaW4nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0sIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uIHx8ICFzZXNzaW9uLnJlZnJlc2hfdG9rZW4gfHwgIXNlc3Npb24uZXhwaXJlc19hdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnI19hdXRvUmVmcmVzaFRva2VuVGljaygpJywgJ25vIHNlc3Npb24nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXNzaW9uIHdpbGwgZXhwaXJlIGluIHRoaXMgbWFueSB0aWNrcyAob3IgaGFzIGFscmVhZHkgZXhwaXJlZCBpZiA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGlyZXNJblRpY2tzID0gTWF0aC5mbG9vcigoc2Vzc2lvbi5leHBpcmVzX2F0ICogMTAwMCAtIG5vdykgLyBBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJyNfYXV0b1JlZnJlc2hUb2tlblRpY2soKScsIGBhY2Nlc3MgdG9rZW4gZXhwaXJlcyBpbiAke2V4cGlyZXNJblRpY2tzfSB0aWNrcywgYSB0aWNrIGxhc3RzICR7QVVUT19SRUZSRVNIX1RJQ0tfRFVSQVRJT05fTVN9bXMsIHJlZnJlc2ggdGhyZXNob2xkIGlzICR7QVVUT19SRUZSRVNIX1RJQ0tfVEhSRVNIT0xEfSB0aWNrc2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBpcmVzSW5UaWNrcyA8PSBBVVRPX1JFRlJFU0hfVElDS19USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2FsbFJlZnJlc2hUb2tlbihzZXNzaW9uLnJlZnJlc2hfdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBdXRvIHJlZnJlc2ggdGljayBmYWlsZWQgd2l0aCBlcnJvci4gVGhpcyBpcyBsaWtlbHkgYSB0cmFuc2llbnQgZXJyb3IuJywgZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCcjX2F1dG9SZWZyZXNoVG9rZW5UaWNrKCknLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmlzQWNxdWlyZVRpbWVvdXQgfHwgZSBpbnN0YW5jZW9mIExvY2tBY3F1aXJlVGltZW91dEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJ2F1dG8gcmVmcmVzaCB0b2tlbiB0aWNrIGxvY2sgbm90IGF2YWlsYWJsZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIG9uIHRoZSBicm93c2VyIC8gcGxhdGZvcm0sIHdoaWNoIGluLXR1cm4gcnVuXG4gICAgICogYWxnb3JpdGhtcyB3aGVuIHRoZSBicm93c2VyIHdpbmRvdy90YWIgYXJlIGluIGZvcmVncm91bmQuIE9uIG5vbi1icm93c2VyXG4gICAgICogcGxhdGZvcm1zIGl0IGFzc3VtZXMgYWx3YXlzIGZvcmVncm91bmQuXG4gICAgICovXG4gICAgYXN5bmMgX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKCcjX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UoKScpO1xuICAgICAgICBpZiAoIWlzQnJvd3NlcigpIHx8ICEod2luZG93ID09PSBudWxsIHx8IHdpbmRvdyA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvUmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICAgICAgLy8gaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzIHRoZSByZWZyZXNoIHRva2VuIHRpY2tlciBydW5zIGFsd2F5c1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvUmVmcmVzaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2sgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLl9vblZpc2liaWxpdHlDaGFuZ2VkKGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdyA9PT0gbnVsbCB8fCB3aW5kb3cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy52aXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrKTtcbiAgICAgICAgICAgIC8vIG5vdyBpbW1lZGlhdGVseSBjYWxsIHRoZSB2aXNiaWxpdHkgY2hhbmdlZCBjYWxsYmFjayB0byBzZXR1cCB3aXRoIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCB2aXNiaWxpdHkgc3RhdGVcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX29uVmlzaWJpbGl0eUNoYW5nZWQodHJ1ZSk7IC8vIGluaXRpYWwgY2FsbFxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UnLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIGB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScpYC5cbiAgICAgKi9cbiAgICBhc3luYyBfb25WaXNpYmlsaXR5Q2hhbmdlZChjYWxsZWRGcm9tSW5pdGlhbGl6ZSkge1xuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gYCNfb25WaXNpYmlsaXR5Q2hhbmdlZCgke2NhbGxlZEZyb21Jbml0aWFsaXplfSlgO1xuICAgICAgICB0aGlzLl9kZWJ1ZyhtZXRob2ROYW1lLCAndmlzaWJpbGl0eVN0YXRlJywgZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlKTtcbiAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvUmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICAgICAgLy8gaW4gYnJvd3NlciBlbnZpcm9ubWVudHMgdGhlIHJlZnJlc2ggdG9rZW4gdGlja2VyIHJ1bnMgb25seSBvbiBmb2N1c2VkIHRhYnNcbiAgICAgICAgICAgICAgICAvLyB3aGljaCBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbnNcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydEF1dG9SZWZyZXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNhbGxlZEZyb21Jbml0aWFsaXplKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FsbGVkIHdoZW4gdGhlIHZpc2liaWxpdHkgaGFzIGNoYW5nZWQsIGkuZS4gdGhlIGJyb3dzZXJcbiAgICAgICAgICAgICAgICAvLyB0cmFuc2l0aW9uZWQgZnJvbSBoaWRkZW4gLT4gdmlzaWJsZSBzbyB3ZSBuZWVkIHRvIHNlZSBpZiB0aGUgc2Vzc2lvblxuICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSByZWNvdmVyZWQgaW1tZWRpYXRlbHkuLi4gYnV0IHRvIGRvIHRoYXQgd2UgbmVlZCB0byBhY3F1aXJlXG4gICAgICAgICAgICAgICAgLy8gdGhlIGxvY2sgZmlyc3QgYXN5bmNocm9ub3VzbHlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQcm9taXNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgIT09ICd2aXNpYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcobWV0aG9kTmFtZSwgJ2FjcXVpcmVkIHRoZSBsb2NrIHRvIHJlY292ZXIgdGhlIHNlc3Npb24sIGJ1dCB0aGUgYnJvd3NlciB2aXNpYmlsaXR5U3RhdGUgaXMgbm8gbG9uZ2VyIHZpc2libGUsIGFib3J0aW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2aXNpYmlsaXR5IGhhcyBjaGFuZ2VkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBsb2NrLCBhYm9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgdGhlIHNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVjb3ZlckFuZFJlZnJlc2goKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvUmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcEF1dG9SZWZyZXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSByZWxldmFudCBsb2dpbiBVUkwgZm9yIGEgdGhpcmQtcGFydHkgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMucmVkaXJlY3RUbyBBIFVSTCBvciBtb2JpbGUgYWRkcmVzcyB0byBzZW5kIHRoZSB1c2VyIHRvIGFmdGVyIHRoZXkgYXJlIGNvbmZpcm1lZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5zY29wZXMgQSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBzY29wZXMgZ3JhbnRlZCB0byB0aGUgT0F1dGggYXBwbGljYXRpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMucXVlcnlQYXJhbXMgQW4gb2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyBjb250YWluaW5nIHF1ZXJ5IHBhcmFtZXRlcnMgZ3JhbnRlZCB0byB0aGUgT0F1dGggYXBwbGljYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgX2dldFVybEZvclByb3ZpZGVyKHVybCwgcHJvdmlkZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdXJsUGFyYW1zID0gW2Bwcm92aWRlcj0ke2VuY29kZVVSSUNvbXBvbmVudChwcm92aWRlcil9YF07XG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucmVkaXJlY3RUbykge1xuICAgICAgICAgICAgdXJsUGFyYW1zLnB1c2goYHJlZGlyZWN0X3RvPSR7ZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnMucmVkaXJlY3RUbyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY29wZXMpIHtcbiAgICAgICAgICAgIHVybFBhcmFtcy5wdXNoKGBzY29wZXM9JHtlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5zY29wZXMpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZsb3dUeXBlID09PSAncGtjZScpIHtcbiAgICAgICAgICAgIGNvbnN0IFtjb2RlQ2hhbGxlbmdlLCBjb2RlQ2hhbGxlbmdlTWV0aG9kXSA9IGF3YWl0IGdldENvZGVDaGFsbGVuZ2VBbmRNZXRob2QodGhpcy5zdG9yYWdlLCB0aGlzLnN0b3JhZ2VLZXkpO1xuICAgICAgICAgICAgY29uc3QgZmxvd1BhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgICAgIGNvZGVfY2hhbGxlbmdlOiBgJHtlbmNvZGVVUklDb21wb25lbnQoY29kZUNoYWxsZW5nZSl9YCxcbiAgICAgICAgICAgICAgICBjb2RlX2NoYWxsZW5nZV9tZXRob2Q6IGAke2VuY29kZVVSSUNvbXBvbmVudChjb2RlQ2hhbGxlbmdlTWV0aG9kKX1gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1cmxQYXJhbXMucHVzaChmbG93UGFyYW1zLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhvcHRpb25zLnF1ZXJ5UGFyYW1zKTtcbiAgICAgICAgICAgIHVybFBhcmFtcy5wdXNoKHF1ZXJ5LnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2tpcEJyb3dzZXJSZWRpcmVjdCkge1xuICAgICAgICAgICAgdXJsUGFyYW1zLnB1c2goYHNraXBfaHR0cF9yZWRpcmVjdD0ke29wdGlvbnMuc2tpcEJyb3dzZXJSZWRpcmVjdH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7dXJsfT8ke3VybFBhcmFtcy5qb2luKCcmJyl9YDtcbiAgICB9XG4gICAgYXN5bmMgX3VuZW5yb2xsKHBhcmFtcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHNlc3Npb25EYXRhLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdERUxFVEUnLCBgJHt0aGlzLnVybH0vZmFjdG9ycy8ke3BhcmFtcy5mYWN0b3JJZH1gLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgand0OiAoX2EgPSBzZXNzaW9uRGF0YSA9PT0gbnVsbCB8fCBzZXNzaW9uRGF0YSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2Vzc2lvbkRhdGEuc2Vzc2lvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9lbnJvbGwocGFyYW1zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHNlc3Npb25EYXRhLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IE9iamVjdC5hc3NpZ24oeyBmcmllbmRseV9uYW1lOiBwYXJhbXMuZnJpZW5kbHlOYW1lLCBmYWN0b3JfdHlwZTogcGFyYW1zLmZhY3RvclR5cGUgfSwgKHBhcmFtcy5mYWN0b3JUeXBlID09PSAncGhvbmUnXG4gICAgICAgICAgICAgICAgICAgID8geyBwaG9uZTogcGFyYW1zLnBob25lIH1cbiAgICAgICAgICAgICAgICAgICAgOiBwYXJhbXMuZmFjdG9yVHlwZSA9PT0gJ3RvdHAnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHsgaXNzdWVyOiBwYXJhbXMuaXNzdWVyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSAoYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vZmFjdG9yc2AsIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IChfYSA9IHNlc3Npb25EYXRhID09PSBudWxsIHx8IHNlc3Npb25EYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXNzaW9uRGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmZhY3RvclR5cGUgPT09ICd0b3RwJyAmJiBkYXRhLnR5cGUgPT09ICd0b3RwJyAmJiAoKF9iID0gZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYXRhLnRvdHApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5xcl9jb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnRvdHAucXJfY29kZSA9IGBkYXRhOmltYWdlL3N2Zyt4bWw7dXRmLTgsJHtkYXRhLnRvdHAucXJfY29kZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YSwgZXJyb3I6IG51bGwgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfdmVyaWZ5KHBhcmFtcykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWNxdWlyZUxvY2soLTEsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogc2Vzc2lvbkRhdGEsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IE9iamVjdC5hc3NpZ24oeyBjaGFsbGVuZ2VfaWQ6IHBhcmFtcy5jaGFsbGVuZ2VJZCB9LCAoJ3dlYmF1dGhuJyBpbiBwYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYmF1dGhuOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcy53ZWJhdXRobiksIHsgY3JlZGVudGlhbF9yZXNwb25zZTogcGFyYW1zLndlYmF1dGhuLnR5cGUgPT09ICdjcmVhdGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvblJlc3BvbnNlKHBhcmFtcy53ZWJhdXRobi5jcmVkZW50aWFsX3Jlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdFJlc3BvbnNlKHBhcmFtcy53ZWJhdXRobi5jcmVkZW50aWFsX3Jlc3BvbnNlKSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogeyBjb2RlOiBwYXJhbXMuY29kZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L2ZhY3RvcnMvJHtwYXJhbXMuZmFjdG9ySWR9L3ZlcmlmeWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBqd3Q6IChfYSA9IHNlc3Npb25EYXRhID09PSBudWxsIHx8IHNlc3Npb25EYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXNzaW9uRGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVNlc3Npb24oT2JqZWN0LmFzc2lnbih7IGV4cGlyZXNfYXQ6IE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApICsgZGF0YS5leHBpcmVzX2luIH0sIGRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbm90aWZ5QWxsU3Vic2NyaWJlcnMoJ01GQV9DSEFMTEVOR0VfVkVSSUZJRUQnLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGEsIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX2NoYWxsZW5nZShwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjcXVpcmVMb2NrKC0xLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHNlc3Npb25EYXRhLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L2ZhY3RvcnMvJHtwYXJhbXMuZmFjdG9ySWR9L2NoYWxsZW5nZWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGp3dDogKF9hID0gc2Vzc2lvbkRhdGEgPT09IG51bGwgfHwgc2Vzc2lvbkRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlc3Npb25EYXRhLnNlc3Npb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSAhPT0gJ3dlYmF1dGhuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRhdGEud2ViYXV0aG4udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY3JlYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGEpLCB7IHdlYmF1dGhuOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGEud2ViYXV0aG4pLCB7IGNyZWRlbnRpYWxfb3B0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkYXRhLndlYmF1dGhuLmNyZWRlbnRpYWxfb3B0aW9ucyksIHsgcHVibGljS2V5OiBkZXNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMoZGF0YS53ZWJhdXRobi5jcmVkZW50aWFsX29wdGlvbnMucHVibGljS2V5KSB9KSB9KSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlcXVlc3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0YSksIHsgd2ViYXV0aG46IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0YS53ZWJhdXRobiksIHsgY3JlZGVudGlhbF9vcHRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGEud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zKSwgeyBwdWJsaWNLZXk6IGRlc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zKGRhdGEud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zLnB1YmxpY0tleSkgfSkgfSkgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAc2VlIEdvVHJ1ZU1GQUFwaSNjaGFsbGVuZ2VBbmRWZXJpZnl9XG4gICAgICovXG4gICAgYXN5bmMgX2NoYWxsZW5nZUFuZFZlcmlmeShwYXJhbXMpIHtcbiAgICAgICAgLy8gYm90aCBfY2hhbGxlbmdlIGFuZCBfdmVyaWZ5IGluZGVwZW5kZW50bHkgYWNxdWlyZSB0aGUgbG9jaywgc28gbm8gbmVlZFxuICAgICAgICAvLyB0byBhY3F1aXJlIGl0IGhlcmVcbiAgICAgICAgY29uc3QgeyBkYXRhOiBjaGFsbGVuZ2VEYXRhLCBlcnJvcjogY2hhbGxlbmdlRXJyb3IgfSA9IGF3YWl0IHRoaXMuX2NoYWxsZW5nZSh7XG4gICAgICAgICAgICBmYWN0b3JJZDogcGFyYW1zLmZhY3RvcklkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNoYWxsZW5nZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IGNoYWxsZW5nZUVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl92ZXJpZnkoe1xuICAgICAgICAgICAgZmFjdG9ySWQ6IHBhcmFtcy5mYWN0b3JJZCxcbiAgICAgICAgICAgIGNoYWxsZW5nZUlkOiBjaGFsbGVuZ2VEYXRhLmlkLFxuICAgICAgICAgICAgY29kZTogcGFyYW1zLmNvZGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QHNlZSBHb1RydWVNRkFBcGkjbGlzdEZhY3RvcnN9XG4gICAgICovXG4gICAgYXN5bmMgX2xpc3RGYWN0b3JzKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIC8vIHVzZSAjZ2V0VXNlciBpbnN0ZWFkIG9mICNfZ2V0VXNlciBhcyB0aGUgZm9ybWVyIGFjcXVpcmVzIGEgbG9ja1xuICAgICAgICBjb25zdCB7IGRhdGE6IHsgdXNlciB9LCBlcnJvcjogdXNlckVycm9yLCB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyKCk7XG4gICAgICAgIGlmICh1c2VyRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiB1c2VyRXJyb3IgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgYWxsOiBbXSxcbiAgICAgICAgICAgIHBob25lOiBbXSxcbiAgICAgICAgICAgIHRvdHA6IFtdLFxuICAgICAgICAgICAgd2ViYXV0aG46IFtdLFxuICAgICAgICB9O1xuICAgICAgICAvLyBsb29wIG92ZXIgdGhlIGZhY3RvcnMgT05DRVxuICAgICAgICBmb3IgKGNvbnN0IGZhY3RvciBvZiAoX2EgPSB1c2VyID09PSBudWxsIHx8IHVzZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVzZXIuZmFjdG9ycykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10pIHtcbiAgICAgICAgICAgIGRhdGEuYWxsLnB1c2goZmFjdG9yKTtcbiAgICAgICAgICAgIGlmIChmYWN0b3Iuc3RhdHVzID09PSAndmVyaWZpZWQnKSB7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIGRhdGFbZmFjdG9yLmZhY3Rvcl90eXBlXS5wdXNoKGZhY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BzZWUgR29UcnVlTUZBQXBpI2dldEF1dGhlbnRpY2F0b3JBc3N1cmFuY2VMZXZlbH1cbiAgICAgKi9cbiAgICBhc3luYyBfZ2V0QXV0aGVudGljYXRvckFzc3VyYW5jZUxldmVsKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9LCBlcnJvcjogc2Vzc2lvbkVycm9yLCB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKCk7XG4gICAgICAgIGlmIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7IGN1cnJlbnRMZXZlbDogbnVsbCwgbmV4dExldmVsOiBudWxsLCBjdXJyZW50QXV0aGVudGljYXRpb25NZXRob2RzOiBbXSB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHBheWxvYWQgfSA9IGRlY29kZUpXVChzZXNzaW9uLmFjY2Vzc190b2tlbik7XG4gICAgICAgIGxldCBjdXJyZW50TGV2ZWwgPSBudWxsO1xuICAgICAgICBpZiAocGF5bG9hZC5hYWwpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMZXZlbCA9IHBheWxvYWQuYWFsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0TGV2ZWwgPSBjdXJyZW50TGV2ZWw7XG4gICAgICAgIGNvbnN0IHZlcmlmaWVkRmFjdG9ycyA9IChfYiA9IChfYSA9IHNlc3Npb24udXNlci5mYWN0b3JzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmlsdGVyKChmYWN0b3IpID0+IGZhY3Rvci5zdGF0dXMgPT09ICd2ZXJpZmllZCcpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXTtcbiAgICAgICAgaWYgKHZlcmlmaWVkRmFjdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuZXh0TGV2ZWwgPSAnYWFsMic7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudEF1dGhlbnRpY2F0aW9uTWV0aG9kcyA9IHBheWxvYWQuYW1yIHx8IFtdO1xuICAgICAgICByZXR1cm4geyBkYXRhOiB7IGN1cnJlbnRMZXZlbCwgbmV4dExldmVsLCBjdXJyZW50QXV0aGVudGljYXRpb25NZXRob2RzIH0sIGVycm9yOiBudWxsIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBkZXRhaWxzIGFib3V0IGFuIE9BdXRoIGF1dGhvcml6YXRpb24gcmVxdWVzdC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqXG4gICAgICogUmV0dXJucyBhdXRob3JpemF0aW9uIGRldGFpbHMgaW5jbHVkaW5nIGNsaWVudCBpbmZvLCBzY29wZXMsIGFuZCB1c2VyIGluZm9ybWF0aW9uLlxuICAgICAqIElmIHRoZSBBUEkgcmV0dXJucyBhIHJlZGlyZWN0X3VyaSwgaXQgbWVhbnMgY29uc2VudCB3YXMgYWxyZWFkeSBnaXZlbiAtIHRoZSBjYWxsZXJcbiAgICAgKiBzaG91bGQgaGFuZGxlIHRoZSByZWRpcmVjdCBtYW51YWxseSBpZiBuZWVkZWQuXG4gICAgICovXG4gICAgYXN5bmMgX2dldEF1dGhvcml6YXRpb25EZXRhaWxzKGF1dGhvcml6YXRpb25JZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0sIGVycm9yOiBzZXNzaW9uRXJyb3IsIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBfcmVxdWVzdCh0aGlzLmZldGNoLCAnR0VUJywgYCR7dGhpcy51cmx9L29hdXRoL2F1dGhvcml6YXRpb25zLyR7YXV0aG9yaXphdGlvbklkfWAsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IHNlc3Npb24uYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogKGRhdGEpID0+ICh7IGRhdGEsIGVycm9yOiBudWxsIH0pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXBwcm92ZXMgYW4gT0F1dGggYXV0aG9yaXphdGlvbiByZXF1ZXN0LlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICovXG4gICAgYXN5bmMgX2FwcHJvdmVBdXRob3JpemF0aW9uKGF1dGhvcml6YXRpb25JZCwgb3B0aW9ucykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VzZVNlc3Npb24oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0sIGVycm9yOiBzZXNzaW9uRXJyb3IsIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IHNlc3Npb25FcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogbmV3IEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ1BPU1QnLCBgJHt0aGlzLnVybH0vb2F1dGgvYXV0aG9yaXphdGlvbnMvJHthdXRob3JpemF0aW9uSWR9L2NvbnNlbnRgLCB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgand0OiBzZXNzaW9uLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICAgICAgYm9keTogeyBhY3Rpb246ICdhcHByb3ZlJyB9LFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogKGRhdGEpID0+ICh7IGRhdGEsIGVycm9yOiBudWxsIH0pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEucmVkaXJlY3RfdXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgcmVkaXJlY3QgaW4gYnJvd3NlciB1bmxlc3Mgc2tpcEJyb3dzZXJSZWRpcmVjdCBpcyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0Jyb3dzZXIoKSAmJiAhKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5za2lwQnJvd3NlclJlZGlyZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihyZXNwb25zZS5kYXRhLnJlZGlyZWN0X3VybCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVuaWVzIGFuIE9BdXRoIGF1dGhvcml6YXRpb24gcmVxdWVzdC5cbiAgICAgKiBPbmx5IHJlbGV2YW50IHdoZW4gdGhlIE9BdXRoIDIuMSBzZXJ2ZXIgaXMgZW5hYmxlZCBpbiBTdXBhYmFzZSBBdXRoLlxuICAgICAqL1xuICAgIGFzeW5jIF9kZW55QXV0aG9yaXphdGlvbihhdXRob3JpemF0aW9uSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9LCBlcnJvcjogc2Vzc2lvbkVycm9yLCB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdQT1NUJywgYCR7dGhpcy51cmx9L29hdXRoL2F1dGhvcml6YXRpb25zLyR7YXV0aG9yaXphdGlvbklkfS9jb25zZW50YCwge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGp3dDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHsgYWN0aW9uOiAnZGVueScgfSxcbiAgICAgICAgICAgICAgICAgICAgeGZvcm06IChkYXRhKSA9PiAoeyBkYXRhLCBlcnJvcjogbnVsbCB9KSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YSAmJiByZXNwb25zZS5kYXRhLnJlZGlyZWN0X3VybCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IHJlZGlyZWN0IGluIGJyb3dzZXIgdW5sZXNzIHNraXBCcm93c2VyUmVkaXJlY3QgaXMgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNCcm93c2VyKCkgJiYgIShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2tpcEJyb3dzZXJSZWRpcmVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24ocmVzcG9uc2UuZGF0YS5yZWRpcmVjdF91cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3RzIGFsbCBPQXV0aCBncmFudHMgdGhhdCB0aGUgYXV0aGVudGljYXRlZCB1c2VyIGhhcyBhdXRob3JpemVkLlxuICAgICAqIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGUgT0F1dGggMi4xIHNlcnZlciBpcyBlbmFibGVkIGluIFN1cGFiYXNlIEF1dGguXG4gICAgICovXG4gICAgYXN5bmMgX2xpc3RPQXV0aEdyYW50cygpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91c2VTZXNzaW9uKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9LCBlcnJvcjogc2Vzc2lvbkVycm9yLCB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBzZXNzaW9uRXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmV0dXJuUmVzdWx0KHsgZGF0YTogbnVsbCwgZXJyb3I6IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0dFVCcsIGAke3RoaXMudXJsfS91c2VyL29hdXRoL2dyYW50c2AsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IHNlc3Npb24uYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICB4Zm9ybTogKGRhdGEpID0+ICh7IGRhdGEsIGVycm9yOiBudWxsIH0pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV2b2tlcyBhIHVzZXIncyBPQXV0aCBncmFudCBmb3IgYSBzcGVjaWZpYyBjbGllbnQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHRoZSBPQXV0aCAyLjEgc2VydmVyIGlzIGVuYWJsZWQgaW4gU3VwYWJhc2UgQXV0aC5cbiAgICAgKi9cbiAgICBhc3luYyBfcmV2b2tlT0F1dGhHcmFudChvcHRpb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXNlU2Vzc2lvbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSwgZXJyb3I6IHNlc3Npb25FcnJvciwgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvcjogc2Vzc2lvbkVycm9yIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVyblJlc3VsdCh7IGRhdGE6IG51bGwsIGVycm9yOiBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgX3JlcXVlc3QodGhpcy5mZXRjaCwgJ0RFTEVURScsIGAke3RoaXMudXJsfS91c2VyL29hdXRoL2dyYW50c2AsIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBqd3Q6IHNlc3Npb24uYWNjZXNzX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeTogeyBjbGllbnRfaWQ6IG9wdGlvbnMuY2xpZW50SWQgfSxcbiAgICAgICAgICAgICAgICAgICAgbm9SZXNvbHZlSnNvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZldGNoSndrKGtpZCwgandrcyA9IHsga2V5czogW10gfSkge1xuICAgICAgICAvLyB0cnkgZmV0Y2hpbmcgZnJvbSB0aGUgc3VwcGxpZWQgandrc1xuICAgICAgICBsZXQgandrID0gandrcy5rZXlzLmZpbmQoKGtleSkgPT4ga2V5LmtpZCA9PT0ga2lkKTtcbiAgICAgICAgaWYgKGp3aykge1xuICAgICAgICAgICAgcmV0dXJuIGp3aztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAvLyB0cnkgZmV0Y2hpbmcgZnJvbSBjYWNoZVxuICAgICAgICBqd2sgPSB0aGlzLmp3a3Mua2V5cy5maW5kKChrZXkpID0+IGtleS5raWQgPT09IGtpZCk7XG4gICAgICAgIC8vIGp3ayBleGlzdHMgYW5kIGp3a3MgaXNuJ3Qgc3RhbGVcbiAgICAgICAgaWYgKGp3ayAmJiB0aGlzLmp3a3NfY2FjaGVkX2F0ICsgSldLU19UVEwgPiBub3cpIHtcbiAgICAgICAgICAgIHJldHVybiBqd2s7XG4gICAgICAgIH1cbiAgICAgICAgLy8gandrIGlzbid0IGNhY2hlZCBpbiBtZW1vcnkgc28gd2UgbmVlZCB0byBmZXRjaCBpdCBmcm9tIHRoZSB3ZWxsLWtub3duIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IF9yZXF1ZXN0KHRoaXMuZmV0Y2gsICdHRVQnLCBgJHt0aGlzLnVybH0vLndlbGwta25vd24vandrcy5qc29uYCwge1xuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRhdGEua2V5cyB8fCBkYXRhLmtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmp3a3MgPSBkYXRhO1xuICAgICAgICB0aGlzLmp3a3NfY2FjaGVkX2F0ID0gbm93O1xuICAgICAgICAvLyBGaW5kIHRoZSBzaWduaW5nIGtleVxuICAgICAgICBqd2sgPSBkYXRhLmtleXMuZmluZCgoa2V5KSA9PiBrZXkua2lkID09PSBraWQpO1xuICAgICAgICBpZiAoIWp3aykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGp3aztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgdGhlIEpXVCBjbGFpbXMgcHJlc2VudCBpbiB0aGUgYWNjZXNzIHRva2VuIGJ5IGZpcnN0IHZlcmlmeWluZyB0aGVcbiAgICAgKiBKV1QgYWdhaW5zdCB0aGUgc2VydmVyJ3MgSlNPTiBXZWIgS2V5IFNldCBlbmRwb2ludFxuICAgICAqIGAvLndlbGwta25vd24vandrcy5qc29uYCB3aGljaCBpcyBvZnRlbiBjYWNoZWQsIHJlc3VsdGluZyBpbiBzaWduaWZpY2FudGx5XG4gICAgICogZmFzdGVyIHJlc3BvbnNlcy4gUHJlZmVyIHRoaXMgbWV0aG9kIG92ZXIge0BsaW5rICNnZXRVc2VyfSB3aGljaCBhbHdheXNcbiAgICAgKiBzZW5kcyBhIHJlcXVlc3QgdG8gdGhlIEF1dGggc2VydmVyIGZvciBlYWNoIEpXVC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBwcm9qZWN0IGlzIG5vdCB1c2luZyBhbiBhc3ltbWV0cmljIEpXVCBzaWduaW5nIGtleSAobGlrZSBFQ0Mgb3JcbiAgICAgKiBSU0EpIGl0IGFsd2F5cyBzZW5kcyBhIHJlcXVlc3QgdG8gdGhlIEF1dGggc2VydmVyIChzaW1pbGFyIHRvIHtAbGlua1xuICAgICAqICNnZXRVc2VyfSkgdG8gdmVyaWZ5IHRoZSBKV1QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gand0IEFuIG9wdGlvbmFsIHNwZWNpZmljIEpXVCB5b3Ugd2lzaCB0byB2ZXJpZnksIG5vdCB0aGUgb25lIHlvdVxuICAgICAqICAgICAgICAgICAgY2FuIG9idGFpbiBmcm9tIHtAbGluayAjZ2V0U2Vzc2lvbn0uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVmFyaW91cyBhZGRpdGlvbmFsIG9wdGlvbnMgdGhhdCBhbGxvdyB5b3UgdG8gY3VzdG9taXplIHRoZVxuICAgICAqICAgICAgICAgICAgICAgIGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kLlxuICAgICAqL1xuICAgIGFzeW5jIGdldENsYWltcyhqd3QsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHRva2VuID0gand0O1xuICAgICAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvciB8fCAhZGF0YS5zZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdG9rZW4gPSBkYXRhLnNlc3Npb24uYWNjZXNzX3Rva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBoZWFkZXIsIHBheWxvYWQsIHNpZ25hdHVyZSwgcmF3OiB7IGhlYWRlcjogcmF3SGVhZGVyLCBwYXlsb2FkOiByYXdQYXlsb2FkIH0sIH0gPSBkZWNvZGVKV1QodG9rZW4pO1xuICAgICAgICAgICAgaWYgKCEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmFsbG93RXhwaXJlZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBSZWplY3QgZXhwaXJlZCBKV1RzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiBqd3QgYXJndW1lbnQgd2FzIHBhc3NlZFxuICAgICAgICAgICAgICAgIHZhbGlkYXRlRXhwKHBheWxvYWQuZXhwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNpZ25pbmdLZXkgPSAhaGVhZGVyLmFsZyB8fFxuICAgICAgICAgICAgICAgIGhlYWRlci5hbGcuc3RhcnRzV2l0aCgnSFMnKSB8fFxuICAgICAgICAgICAgICAgICFoZWFkZXIua2lkIHx8XG4gICAgICAgICAgICAgICAgISgnY3J5cHRvJyBpbiBnbG9iYWxUaGlzICYmICdzdWJ0bGUnIGluIGdsb2JhbFRoaXMuY3J5cHRvKVxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogYXdhaXQgdGhpcy5mZXRjaEp3ayhoZWFkZXIua2lkLCAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmtleXMpID8geyBrZXlzOiBvcHRpb25zLmtleXMgfSA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5qd2tzKTtcbiAgICAgICAgICAgIC8vIElmIHN5bW1ldHJpYyBhbGdvcml0aG0gb3IgV2ViQ3J5cHRvIEFQSSBpcyB1bmF2YWlsYWJsZSwgZmFsbGJhY2sgdG8gZ2V0VXNlcigpXG4gICAgICAgICAgICBpZiAoIXNpZ25pbmdLZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVycm9yIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIodG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZ2V0VXNlciBzdWNjZWVkcyBzbyB0aGUgY2xhaW1zIGluIHRoZSBKV1QgY2FuIGJlIHRydXN0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFpbXM6IHBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbGdvcml0aG0gPSBnZXRBbGdvcml0aG0oaGVhZGVyLmFsZyk7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IEpXSyB0byBDcnlwdG9LZXlcbiAgICAgICAgICAgIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCdqd2snLCBzaWduaW5nS2V5LCBhbGdvcml0aG0sIHRydWUsIFtcbiAgICAgICAgICAgICAgICAndmVyaWZ5JyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSBzaWduYXR1cmVcbiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLnZlcmlmeShhbGdvcml0aG0sIHB1YmxpY0tleSwgc2lnbmF0dXJlLCBzdHJpbmdUb1VpbnQ4QXJyYXkoYCR7cmF3SGVhZGVyfS4ke3Jhd1BheWxvYWR9YCkpO1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbnZhbGlkSnd0RXJyb3IoJ0ludmFsaWQgSldUIHNpZ25hdHVyZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdmVyaWZpY2F0aW9uIHN1Y2NlZWRzLCBkZWNvZGUgYW5kIHJldHVybiBjbGFpbXNcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjbGFpbXM6IHBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcixcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm5SZXN1bHQoeyBkYXRhOiBudWxsLCBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxufVxuR29UcnVlQ2xpZW50Lm5leHRJbnN0YW5jZUlEID0ge307XG5leHBvcnQgZGVmYXVsdCBHb1RydWVDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Hb1RydWVDbGllbnQuanMubWFwIl0sIm5hbWVzIjpbIkdvVHJ1ZUFkbWluQXBpIiwiQVVUT19SRUZSRVNIX1RJQ0tfRFVSQVRJT05fTVMiLCJBVVRPX1JFRlJFU0hfVElDS19USFJFU0hPTEQiLCJERUZBVUxUX0hFQURFUlMiLCJFWFBJUllfTUFSR0lOX01TIiwiR09UUlVFX1VSTCIsIkpXS1NfVFRMIiwiU1RPUkFHRV9LRVkiLCJBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IiLCJBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3IiLCJBdXRoSW52YWxpZEp3dEVycm9yIiwiQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IiLCJBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvciIsIkF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvciIsIkF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yIiwiQXV0aFVua25vd25FcnJvciIsImlzQXV0aEFwaUVycm9yIiwiaXNBdXRoRXJyb3IiLCJpc0F1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciIsImlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IiLCJpc0F1dGhTZXNzaW9uTWlzc2luZ0Vycm9yIiwiX3JlcXVlc3QiLCJfc2Vzc2lvblJlc3BvbnNlIiwiX3Nlc3Npb25SZXNwb25zZVBhc3N3b3JkIiwiX3Nzb1Jlc3BvbnNlIiwiX3VzZXJSZXNwb25zZSIsImRlY29kZUpXVCIsImRlZXBDbG9uZSIsIkRlZmVycmVkIiwiZ2VuZXJhdGVDYWxsYmFja0lkIiwiZ2V0QWxnb3JpdGhtIiwiZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZCIsImdldEl0ZW1Bc3luYyIsImluc2VjdXJlVXNlcldhcm5pbmdQcm94eSIsImlzQnJvd3NlciIsInBhcnNlUGFyYW1ldGVyc0Zyb21VUkwiLCJyZW1vdmVJdGVtQXN5bmMiLCJyZXNvbHZlRmV0Y2giLCJyZXRyeWFibGUiLCJzZXRJdGVtQXN5bmMiLCJzbGVlcCIsInN1cHBvcnRzTG9jYWxTdG9yYWdlIiwidXNlck5vdEF2YWlsYWJsZVByb3h5IiwidmFsaWRhdGVFeHAiLCJtZW1vcnlMb2NhbFN0b3JhZ2VBZGFwdGVyIiwiTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IiLCJuYXZpZ2F0b3JMb2NrIiwicG9seWZpbGxHbG9iYWxUaGlzIiwidmVyc2lvbiIsImJ5dGVzVG9CYXNlNjRVUkwiLCJzdHJpbmdUb1VpbnQ4QXJyYXkiLCJjcmVhdGVTaXdlTWVzc2FnZSIsImZyb21IZXgiLCJnZXRBZGRyZXNzIiwidG9IZXgiLCJkZXNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMiLCJkZXNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyIsInNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvblJlc3BvbnNlIiwic2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RSZXNwb25zZSIsIldlYkF1dGhuQXBpIiwiREVGQVVMVF9PUFRJT05TIiwidXJsIiwic3RvcmFnZUtleSIsImF1dG9SZWZyZXNoVG9rZW4iLCJwZXJzaXN0U2Vzc2lvbiIsImRldGVjdFNlc3Npb25JblVybCIsImhlYWRlcnMiLCJmbG93VHlwZSIsImRlYnVnIiwiaGFzQ3VzdG9tQXV0aG9yaXphdGlvbkhlYWRlciIsInRocm93T25FcnJvciIsImxvY2tOb09wIiwibmFtZSIsImFjcXVpcmVUaW1lb3V0IiwiZm4iLCJHTE9CQUxfSldLUyIsIkdvVHJ1ZUNsaWVudCIsImp3a3MiLCJfYSIsIl9iIiwia2V5cyIsInZhbHVlIiwiT2JqZWN0IiwiYXNzaWduIiwiandrc19jYWNoZWRfYXQiLCJjYWNoZWRBdCIsIk51bWJlciIsIk1JTl9TQUZFX0lOVEVHRVIiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJfYyIsInVzZXJTdG9yYWdlIiwibWVtb3J5U3RvcmFnZSIsInN0YXRlQ2hhbmdlRW1pdHRlcnMiLCJNYXAiLCJhdXRvUmVmcmVzaFRpY2tlciIsInZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2siLCJyZWZyZXNoaW5nRGVmZXJyZWQiLCJpbml0aWFsaXplUHJvbWlzZSIsInN1cHByZXNzR2V0U2Vzc2lvbldhcm5pbmciLCJsb2NrQWNxdWlyZWQiLCJwZW5kaW5nSW5Mb2NrIiwiYnJvYWRjYXN0Q2hhbm5lbCIsImxvZ2dlciIsImNvbnNvbGUiLCJsb2ciLCJzZXR0aW5ncyIsImluc3RhbmNlSUQiLCJuZXh0SW5zdGFuY2VJRCIsImxvZ0RlYnVnTWVzc2FnZXMiLCJtZXNzYWdlIiwiX2xvZ1ByZWZpeCIsIndhcm4iLCJ0cmFjZSIsImFkbWluIiwiZmV0Y2giLCJsb2NrIiwiZ2xvYmFsVGhpcyIsIm5hdmlnYXRvciIsImxvY2tzIiwibWZhIiwidmVyaWZ5IiwiX3ZlcmlmeSIsImJpbmQiLCJlbnJvbGwiLCJfZW5yb2xsIiwidW5lbnJvbGwiLCJfdW5lbnJvbGwiLCJjaGFsbGVuZ2UiLCJfY2hhbGxlbmdlIiwibGlzdEZhY3RvcnMiLCJfbGlzdEZhY3RvcnMiLCJjaGFsbGVuZ2VBbmRWZXJpZnkiLCJfY2hhbGxlbmdlQW5kVmVyaWZ5IiwiZ2V0QXV0aGVudGljYXRvckFzc3VyYW5jZUxldmVsIiwiX2dldEF1dGhlbnRpY2F0b3JBc3N1cmFuY2VMZXZlbCIsIndlYmF1dGhuIiwib2F1dGgiLCJnZXRBdXRob3JpemF0aW9uRGV0YWlscyIsIl9nZXRBdXRob3JpemF0aW9uRGV0YWlscyIsImFwcHJvdmVBdXRob3JpemF0aW9uIiwiX2FwcHJvdmVBdXRob3JpemF0aW9uIiwiZGVueUF1dGhvcml6YXRpb24iLCJfZGVueUF1dGhvcml6YXRpb24iLCJsaXN0R3JhbnRzIiwiX2xpc3RPQXV0aEdyYW50cyIsInJldm9rZUdyYW50IiwiX3Jldm9rZU9BdXRoR3JhbnQiLCJzdG9yYWdlIiwibG9jYWxTdG9yYWdlIiwiQnJvYWRjYXN0Q2hhbm5lbCIsImUiLCJlcnJvciIsImFkZEV2ZW50TGlzdGVuZXIiLCJldmVudCIsIl9kZWJ1ZyIsIl9ub3RpZnlBbGxTdWJzY3JpYmVycyIsImRhdGEiLCJzZXNzaW9uIiwiaW5pdGlhbGl6ZSIsImlzVGhyb3dPbkVycm9yRW5hYmxlZCIsIl9yZXR1cm5SZXN1bHQiLCJyZXN1bHQiLCJEYXRlIiwidG9JU09TdHJpbmciLCJhcmdzIiwiX2FjcXVpcmVMb2NrIiwiX2luaXRpYWxpemUiLCJwYXJhbXMiLCJjYWxsYmFja1VybFR5cGUiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhyZWYiLCJfaXNJbXBsaWNpdEdyYW50Q2FsbGJhY2siLCJfaXNQS0NFQ2FsbGJhY2siLCJfZ2V0U2Vzc2lvbkZyb21VUkwiLCJlcnJvckNvZGUiLCJkZXRhaWxzIiwiY29kZSIsIl9yZW1vdmVTZXNzaW9uIiwicmVkaXJlY3RUeXBlIiwiX3NhdmVTZXNzaW9uIiwic2V0VGltZW91dCIsIl9yZWNvdmVyQW5kUmVmcmVzaCIsIl9oYW5kbGVWaXNpYmlsaXR5Q2hhbmdlIiwic2lnbkluQW5vbnltb3VzbHkiLCJjcmVkZW50aWFscyIsInJlcyIsImJvZHkiLCJnb3RydWVfbWV0YV9zZWN1cml0eSIsImNhcHRjaGFfdG9rZW4iLCJjYXB0Y2hhVG9rZW4iLCJ4Zm9ybSIsInVzZXIiLCJzaWduVXAiLCJlbWFpbCIsInBhc3N3b3JkIiwiY29kZUNoYWxsZW5nZSIsImNvZGVDaGFsbGVuZ2VNZXRob2QiLCJyZWRpcmVjdFRvIiwiZW1haWxSZWRpcmVjdFRvIiwiY29kZV9jaGFsbGVuZ2UiLCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiLCJwaG9uZSIsImNoYW5uZWwiLCJzaWduSW5XaXRoUGFzc3dvcmQiLCJpbnZhbGlkVG9rZW5FcnJvciIsIndlYWtfcGFzc3dvcmQiLCJ3ZWFrUGFzc3dvcmQiLCJzaWduSW5XaXRoT0F1dGgiLCJfZCIsIl9oYW5kbGVQcm92aWRlclNpZ25JbiIsInByb3ZpZGVyIiwic2NvcGVzIiwicXVlcnlQYXJhbXMiLCJza2lwQnJvd3NlclJlZGlyZWN0IiwiZXhjaGFuZ2VDb2RlRm9yU2Vzc2lvbiIsImF1dGhDb2RlIiwiX2V4Y2hhbmdlQ29kZUZvclNlc3Npb24iLCJzaWduSW5XaXRoV2ViMyIsImNoYWluIiwic2lnbkluV2l0aEV0aGVyZXVtIiwic2lnbkluV2l0aFNvbGFuYSIsIkVycm9yIiwiX2UiLCJfZiIsIl9nIiwiX2giLCJfaiIsIl9rIiwiX2wiLCJzaWduYXR1cmUiLCJ3YWxsZXQiLCJzdGF0ZW1lbnQiLCJyZXNvbHZlZFdhbGxldCIsIndpbmRvd0FueSIsImV0aGVyZXVtIiwicmVxdWVzdCIsIlVSTCIsImFjY291bnRzIiwibWV0aG9kIiwidGhlbiIsImFjY3MiLCJjYXRjaCIsImxlbmd0aCIsImFkZHJlc3MiLCJjaGFpbklkIiwiY2hhaW5JZEhleCIsInNpd2VNZXNzYWdlIiwiZG9tYWluIiwiaG9zdCIsInVyaSIsIm5vbmNlIiwiaXNzdWVkQXQiLCJleHBpcmF0aW9uVGltZSIsIm5vdEJlZm9yZSIsInJlcXVlc3RJZCIsInJlc291cmNlcyIsIl9tIiwic29sYW5hIiwic2lnbkluIiwic2lnbk1lc3NhZ2UiLCJvdXRwdXQiLCJvdXRwdXRUb1Byb2Nlc3MiLCJBcnJheSIsImlzQXJyYXkiLCJzaWduZWRNZXNzYWdlIiwiVWludDhBcnJheSIsIlRleHREZWNvZGVyIiwiZGVjb2RlIiwicHVibGljS2V5IiwidG9CYXNlNTgiLCJtYXAiLCJyZXNvdXJjZSIsImpvaW4iLCJtYXliZVNpZ25hdHVyZSIsIlRleHRFbmNvZGVyIiwiZW5jb2RlIiwic3RvcmFnZUl0ZW0iLCJjb2RlVmVyaWZpZXIiLCJzcGxpdCIsImF1dGhfY29kZSIsImNvZGVfdmVyaWZpZXIiLCJzaWduSW5XaXRoSWRUb2tlbiIsInRva2VuIiwiYWNjZXNzX3Rva2VuIiwiaWRfdG9rZW4iLCJzaWduSW5XaXRoT3RwIiwiY3JlYXRlX3VzZXIiLCJzaG91bGRDcmVhdGVVc2VyIiwibWVzc2FnZUlkIiwibWVzc2FnZV9pZCIsInZlcmlmeU90cCIsInVuZGVmaW5lZCIsInRva2VuVmVyaWZpY2F0aW9uRXJyb3IiLCJ0eXBlIiwic2lnbkluV2l0aFNTTyIsInByb3ZpZGVyX2lkIiwicHJvdmlkZXJJZCIsInJlZGlyZWN0X3RvIiwic2tpcF9odHRwX3JlZGlyZWN0IiwicmVhdXRoZW50aWNhdGUiLCJfcmVhdXRoZW50aWNhdGUiLCJfdXNlU2Vzc2lvbiIsInNlc3Npb25FcnJvciIsImp3dCIsInJlc2VuZCIsImVuZHBvaW50IiwiZ2V0U2Vzc2lvbiIsImxhc3QiLCJQcm9taXNlIiwicmVzb2x2ZSIsInB1c2giLCJ3YWl0T24iLCJhbGwiLCJzcGxpY2UiLCJfX2xvYWRTZXNzaW9uIiwic3RhY2siLCJjdXJyZW50U2Vzc2lvbiIsIm1heWJlU2Vzc2lvbiIsIl9pc1ZhbGlkU2Vzc2lvbiIsImhhc0V4cGlyZWQiLCJleHBpcmVzX2F0Iiwibm93IiwibWF5YmVVc2VyIiwiaXNTZXJ2ZXIiLCJfX2lzVXNlck5vdEF2YWlsYWJsZVByb3h5Iiwic3VwcHJlc3NXYXJuaW5nUmVmIiwiX2NhbGxSZWZyZXNoVG9rZW4iLCJyZWZyZXNoX3Rva2VuIiwiZ2V0VXNlciIsIl9nZXRVc2VyIiwidXBkYXRlVXNlciIsImF0dHJpYnV0ZXMiLCJfdXBkYXRlVXNlciIsInNlc3Npb25EYXRhIiwidXNlckVycm9yIiwic2V0U2Vzc2lvbiIsIl9zZXRTZXNzaW9uIiwidGltZU5vdyIsImV4cGlyZXNBdCIsInBheWxvYWQiLCJleHAiLCJyZWZyZXNoZWRTZXNzaW9uIiwidG9rZW5fdHlwZSIsImV4cGlyZXNfaW4iLCJyZWZyZXNoU2Vzc2lvbiIsIl9yZWZyZXNoU2Vzc2lvbiIsImVycm9yX2Rlc2NyaXB0aW9uIiwiZXJyb3JfY29kZSIsInNlYXJjaFBhcmFtcyIsImRlbGV0ZSIsImhpc3RvcnkiLCJyZXBsYWNlU3RhdGUiLCJzdGF0ZSIsInRvU3RyaW5nIiwicHJvdmlkZXJfdG9rZW4iLCJwcm92aWRlcl9yZWZyZXNoX3Rva2VuIiwiTWF0aCIsInJvdW5kIiwiZXhwaXJlc0luIiwicGFyc2VJbnQiLCJhY3R1YWxseUV4cGlyZXNJbiIsImhhc2giLCJCb29sZWFuIiwiY3VycmVudFN0b3JhZ2VDb250ZW50Iiwic2lnbk91dCIsInNjb3BlIiwiX3NpZ25PdXQiLCJhY2Nlc3NUb2tlbiIsInN0YXR1cyIsIm9uQXV0aFN0YXRlQ2hhbmdlIiwiY2FsbGJhY2siLCJpZCIsInN1YnNjcmlwdGlvbiIsInVuc3Vic2NyaWJlIiwic2V0IiwiX2VtaXRJbml0aWFsU2Vzc2lvbiIsImdldCIsImVyciIsInJlc2V0UGFzc3dvcmRGb3JFbWFpbCIsImdldFVzZXJJZGVudGl0aWVzIiwiaWRlbnRpdGllcyIsImxpbmtJZGVudGl0eSIsImxpbmtJZGVudGl0eUlkVG9rZW4iLCJsaW5rSWRlbnRpdHlPQXV0aCIsIl9nZXRVcmxGb3JQcm92aWRlciIsImxpbmtfaWRlbnRpdHkiLCJ1bmxpbmtJZGVudGl0eSIsImlkZW50aXR5IiwiaWRlbnRpdHlfaWQiLCJfcmVmcmVzaEFjY2Vzc1Rva2VuIiwicmVmcmVzaFRva2VuIiwiZGVidWdOYW1lIiwic3Vic3RyaW5nIiwic3RhcnRlZEF0IiwiYXR0ZW1wdCIsInBvdyIsIm5leHRCYWNrT2ZmSW50ZXJ2YWwiLCJpc1ZhbGlkU2Vzc2lvbiIsImlzIiwic2VwYXJhdGVVc2VyIiwiZXhwaXJlc1dpdGhNYXJnaW4iLCJJbmZpbml0eSIsImdldFVzZXJFcnJvciIsInByb21pc2UiLCJyZWplY3QiLCJicm9hZGNhc3QiLCJwb3N0TWVzc2FnZSIsImVycm9ycyIsInByb21pc2VzIiwiZnJvbSIsInZhbHVlcyIsIngiLCJpIiwic2Vzc2lvblRvUHJvY2VzcyIsInVzZXJJc1Byb3h5IiwibWFpblNlc3Npb25EYXRhIiwiY2xvbmVkTWFpblNlc3Npb25EYXRhIiwiY2xvbmVkU2Vzc2lvbiIsIl9yZW1vdmVWaXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9zdGFydEF1dG9SZWZyZXNoIiwiX3N0b3BBdXRvUmVmcmVzaCIsInRpY2tlciIsInNldEludGVydmFsIiwiX2F1dG9SZWZyZXNoVG9rZW5UaWNrIiwidW5yZWYiLCJEZW5vIiwidW5yZWZUaW1lciIsImNsZWFySW50ZXJ2YWwiLCJzdGFydEF1dG9SZWZyZXNoIiwic3RvcEF1dG9SZWZyZXNoIiwiZXhwaXJlc0luVGlja3MiLCJmbG9vciIsImlzQWNxdWlyZVRpbWVvdXQiLCJfb25WaXNpYmlsaXR5Q2hhbmdlZCIsImNhbGxlZEZyb21Jbml0aWFsaXplIiwibWV0aG9kTmFtZSIsImRvY3VtZW50IiwidmlzaWJpbGl0eVN0YXRlIiwidXJsUGFyYW1zIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZmxvd1BhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInF1ZXJ5IiwiZmFjdG9ySWQiLCJmcmllbmRseV9uYW1lIiwiZnJpZW5kbHlOYW1lIiwiZmFjdG9yX3R5cGUiLCJmYWN0b3JUeXBlIiwiaXNzdWVyIiwidG90cCIsInFyX2NvZGUiLCJjaGFsbGVuZ2VfaWQiLCJjaGFsbGVuZ2VJZCIsImNyZWRlbnRpYWxfcmVzcG9uc2UiLCJyZXNwb25zZSIsImNyZWRlbnRpYWxfb3B0aW9ucyIsImNoYWxsZW5nZURhdGEiLCJjaGFsbGVuZ2VFcnJvciIsImZhY3RvciIsImZhY3RvcnMiLCJjdXJyZW50TGV2ZWwiLCJuZXh0TGV2ZWwiLCJjdXJyZW50QXV0aGVudGljYXRpb25NZXRob2RzIiwiYWFsIiwidmVyaWZpZWRGYWN0b3JzIiwiZmlsdGVyIiwiYW1yIiwiYXV0aG9yaXphdGlvbklkIiwiYWN0aW9uIiwicmVkaXJlY3RfdXJsIiwiY2xpZW50X2lkIiwiY2xpZW50SWQiLCJub1Jlc29sdmVKc29uIiwiZmV0Y2hKd2siLCJraWQiLCJqd2siLCJmaW5kIiwia2V5IiwiZ2V0Q2xhaW1zIiwiaGVhZGVyIiwicmF3IiwicmF3SGVhZGVyIiwicmF3UGF5bG9hZCIsImFsbG93RXhwaXJlZCIsInNpZ25pbmdLZXkiLCJhbGciLCJzdGFydHNXaXRoIiwiY3J5cHRvIiwiY2xhaW1zIiwiYWxnb3JpdGhtIiwic3VidGxlIiwiaW1wb3J0S2V5IiwiaXNWYWxpZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/index.js":
|
||
/*!*************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/index.js ***!
|
||
\*************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthAdminApi: () => (/* reexport safe */ _AuthAdminApi__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ AuthClient: () => (/* reexport safe */ _AuthClient__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ GoTrueAdminApi: () => (/* reexport safe */ _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ GoTrueClient: () => (/* reexport safe */ _GoTrueClient__WEBPACK_IMPORTED_MODULE_1__[\"default\"]),\n/* harmony export */ NavigatorLockAcquireTimeoutError: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.NavigatorLockAcquireTimeoutError),\n/* harmony export */ lockInternals: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.internals),\n/* harmony export */ navigatorLock: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.navigatorLock),\n/* harmony export */ processLock: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.processLock)\n/* harmony export */ });\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n/* harmony import */ var _GoTrueClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./GoTrueClient */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\");\n/* harmony import */ var _AuthAdminApi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AuthAdminApi */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js\");\n/* harmony import */ var _AuthClient__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AuthClient */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js\");\n/* harmony import */ var _lib_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/types */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/types.js\");\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _lib_types__WEBPACK_IMPORTED_MODULE_4__) if([\"default\",\"GoTrueAdminApi\",\"GoTrueClient\",\"AuthAdminApi\",\"AuthClient\",\"navigatorLock\",\"NavigatorLockAcquireTimeoutError\",\"lockInternals\",\"processLock\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _lib_types__WEBPACK_IMPORTED_MODULE_4__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n/* harmony import */ var _lib_errors__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib/errors */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _lib_errors__WEBPACK_IMPORTED_MODULE_5__) if([\"default\",\"GoTrueAdminApi\",\"GoTrueClient\",\"AuthAdminApi\",\"AuthClient\",\"navigatorLock\",\"NavigatorLockAcquireTimeoutError\",\"lockInternals\",\"processLock\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _lib_errors__WEBPACK_IMPORTED_MODULE_5__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n/* harmony import */ var _lib_locks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lib/locks */ \"(action-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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBOEM7QUFDSjtBQUNBO0FBQ0o7QUFDNEI7QUFDdEM7QUFDQztBQUMyRixDQUN4SCxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvaW5kZXguanM/NTUwOCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR29UcnVlQWRtaW5BcGkgZnJvbSAnLi9Hb1RydWVBZG1pbkFwaSc7XG5pbXBvcnQgR29UcnVlQ2xpZW50IGZyb20gJy4vR29UcnVlQ2xpZW50JztcbmltcG9ydCBBdXRoQWRtaW5BcGkgZnJvbSAnLi9BdXRoQWRtaW5BcGknO1xuaW1wb3J0IEF1dGhDbGllbnQgZnJvbSAnLi9BdXRoQ2xpZW50JztcbmV4cG9ydCB7IEdvVHJ1ZUFkbWluQXBpLCBHb1RydWVDbGllbnQsIEF1dGhBZG1pbkFwaSwgQXV0aENsaWVudCB9O1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZXJyb3JzJztcbmV4cG9ydCB7IG5hdmlnYXRvckxvY2ssIE5hdmlnYXRvckxvY2tBY3F1aXJlVGltZW91dEVycm9yLCBpbnRlcm5hbHMgYXMgbG9ja0ludGVybmFscywgcHJvY2Vzc0xvY2ssIH0gZnJvbSAnLi9saWIvbG9ja3MnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sIm5hbWVzIjpbIkdvVHJ1ZUFkbWluQXBpIiwiR29UcnVlQ2xpZW50IiwiQXV0aEFkbWluQXBpIiwiQXV0aENsaWVudCIsIm5hdmlnYXRvckxvY2siLCJOYXZpZ2F0b3JMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciIsImludGVybmFscyIsImxvY2tJbnRlcm5hbHMiLCJwcm9jZXNzTG9jayJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/index.js":
|
||
/*!*************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/index.js ***!
|
||
\*************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthAdminApi: () => (/* reexport safe */ _AuthAdminApi__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ AuthApiError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthApiError),\n/* harmony export */ AuthClient: () => (/* reexport safe */ _AuthClient__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ AuthError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthError),\n/* harmony export */ AuthImplicitGrantRedirectError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthImplicitGrantRedirectError),\n/* harmony export */ AuthInvalidCredentialsError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthInvalidCredentialsError),\n/* harmony export */ AuthInvalidJwtError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthInvalidJwtError),\n/* harmony export */ AuthInvalidTokenResponseError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthInvalidTokenResponseError),\n/* harmony export */ AuthPKCECodeVerifierMissingError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthPKCECodeVerifierMissingError),\n/* harmony export */ AuthPKCEGrantCodeExchangeError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthPKCEGrantCodeExchangeError),\n/* harmony export */ AuthRetryableFetchError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthRetryableFetchError),\n/* harmony export */ AuthSessionMissingError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthSessionMissingError),\n/* harmony export */ AuthUnknownError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthUnknownError),\n/* harmony export */ AuthWeakPasswordError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.AuthWeakPasswordError),\n/* harmony export */ CustomAuthError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.CustomAuthError),\n/* harmony export */ GoTrueAdminApi: () => (/* reexport safe */ _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ GoTrueClient: () => (/* reexport safe */ _GoTrueClient__WEBPACK_IMPORTED_MODULE_1__[\"default\"]),\n/* harmony export */ NavigatorLockAcquireTimeoutError: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.NavigatorLockAcquireTimeoutError),\n/* harmony export */ SIGN_OUT_SCOPES: () => (/* reexport safe */ _lib_types__WEBPACK_IMPORTED_MODULE_4__.SIGN_OUT_SCOPES),\n/* harmony export */ isAuthApiError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthApiError),\n/* harmony export */ isAuthError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthError),\n/* harmony export */ isAuthImplicitGrantRedirectError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthImplicitGrantRedirectError),\n/* harmony export */ isAuthPKCECodeVerifierMissingError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthPKCECodeVerifierMissingError),\n/* harmony export */ isAuthRetryableFetchError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthRetryableFetchError),\n/* harmony export */ isAuthSessionMissingError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthSessionMissingError),\n/* harmony export */ isAuthWeakPasswordError: () => (/* reexport safe */ _lib_errors__WEBPACK_IMPORTED_MODULE_5__.isAuthWeakPasswordError),\n/* harmony export */ lockInternals: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.internals),\n/* harmony export */ navigatorLock: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.navigatorLock),\n/* harmony export */ processLock: () => (/* reexport safe */ _lib_locks__WEBPACK_IMPORTED_MODULE_6__.processLock)\n/* harmony export */ });\n/* harmony import */ var _GoTrueAdminApi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./GoTrueAdminApi */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/GoTrueAdminApi.js\");\n/* harmony import */ var _GoTrueClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./GoTrueClient */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/GoTrueClient.js\");\n/* harmony import */ var _AuthAdminApi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AuthAdminApi */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/AuthAdminApi.js\");\n/* harmony import */ var _AuthClient__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./AuthClient */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/AuthClient.js\");\n/* harmony import */ var _lib_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/types */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/types.js\");\n/* harmony import */ var _lib_errors__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib/errors */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _lib_locks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lib/locks */ \"(rsc)/./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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQThDO0FBQ0o7QUFDQTtBQUNKO0FBQzRCO0FBQ3RDO0FBQ0M7QUFDMkYsQ0FDeEgsaUNBQWlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2luZGV4LmpzPzU1MDgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEdvVHJ1ZUFkbWluQXBpIGZyb20gJy4vR29UcnVlQWRtaW5BcGknO1xuaW1wb3J0IEdvVHJ1ZUNsaWVudCBmcm9tICcuL0dvVHJ1ZUNsaWVudCc7XG5pbXBvcnQgQXV0aEFkbWluQXBpIGZyb20gJy4vQXV0aEFkbWluQXBpJztcbmltcG9ydCBBdXRoQ2xpZW50IGZyb20gJy4vQXV0aENsaWVudCc7XG5leHBvcnQgeyBHb1RydWVBZG1pbkFwaSwgR29UcnVlQ2xpZW50LCBBdXRoQWRtaW5BcGksIEF1dGhDbGllbnQgfTtcbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Vycm9ycyc7XG5leHBvcnQgeyBuYXZpZ2F0b3JMb2NrLCBOYXZpZ2F0b3JMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciwgaW50ZXJuYWxzIGFzIGxvY2tJbnRlcm5hbHMsIHByb2Nlc3NMb2NrLCB9IGZyb20gJy4vbGliL2xvY2tzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJuYW1lcyI6WyJHb1RydWVBZG1pbkFwaSIsIkdvVHJ1ZUNsaWVudCIsIkF1dGhBZG1pbkFwaSIsIkF1dGhDbGllbnQiLCJuYXZpZ2F0b3JMb2NrIiwiTmF2aWdhdG9yTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IiLCJpbnRlcm5hbHMiLCJsb2NrSW50ZXJuYWxzIiwicHJvY2Vzc0xvY2siXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/base64url.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ base64UrlToUint8Array: () => (/* binding */ base64UrlToUint8Array),\n/* harmony export */ byteFromBase64URL: () => (/* binding */ byteFromBase64URL),\n/* harmony export */ byteToBase64URL: () => (/* binding */ byteToBase64URL),\n/* harmony export */ bytesToBase64URL: () => (/* binding */ bytesToBase64URL),\n/* harmony export */ codepointToUTF8: () => (/* binding */ codepointToUTF8),\n/* harmony export */ stringFromBase64URL: () => (/* binding */ stringFromBase64URL),\n/* harmony export */ stringFromUTF8: () => (/* binding */ stringFromUTF8),\n/* harmony export */ stringToBase64URL: () => (/* binding */ stringToBase64URL),\n/* harmony export */ stringToUTF8: () => (/* binding */ stringToUTF8),\n/* harmony export */ stringToUint8Array: () => (/* 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 \"${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: ${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvYmFzZTY0dXJsLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztDQUlDLEdBQ0Q7OztDQUdDLEdBQ0QsTUFBTUEsZUFBZSxtRUFBbUVDLEtBQUssQ0FBQztBQUM5Rjs7O0NBR0MsR0FDRCxNQUFNQyxtQkFBbUIsVUFBV0QsS0FBSyxDQUFDO0FBQzFDOzs7Q0FHQyxHQUNELE1BQU1FLGlCQUFpQixDQUFDO0lBQ3BCLE1BQU1DLFVBQVUsSUFBSUMsTUFBTTtJQUMxQixJQUFLLElBQUlDLElBQUksR0FBR0EsSUFBSUYsUUFBUUcsTUFBTSxFQUFFRCxLQUFLLEVBQUc7UUFDeENGLE9BQU8sQ0FBQ0UsRUFBRSxHQUFHLENBQUM7SUFDbEI7SUFDQSxJQUFLLElBQUlBLElBQUksR0FBR0EsSUFBSUosaUJBQWlCSyxNQUFNLEVBQUVELEtBQUssRUFBRztRQUNqREYsT0FBTyxDQUFDRixnQkFBZ0IsQ0FBQ0ksRUFBRSxDQUFDRSxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDbEQ7SUFDQSxJQUFLLElBQUlGLElBQUksR0FBR0EsSUFBSU4sYUFBYU8sTUFBTSxFQUFFRCxLQUFLLEVBQUc7UUFDN0NGLE9BQU8sQ0FBQ0osWUFBWSxDQUFDTSxFQUFFLENBQUNFLFVBQVUsQ0FBQyxHQUFHLEdBQUdGO0lBQzdDO0lBQ0EsT0FBT0Y7QUFDWDtBQUNBOzs7Ozs7Q0FNQyxHQUNNLFNBQVNLLGdCQUFnQkMsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLElBQUk7SUFDN0MsSUFBSUYsU0FBUyxNQUFNO1FBQ2ZDLE1BQU1FLEtBQUssR0FBRyxNQUFPQSxLQUFLLElBQUksSUFBS0g7UUFDbkNDLE1BQU1HLFVBQVUsSUFBSTtRQUNwQixNQUFPSCxNQUFNRyxVQUFVLElBQUksRUFBRztZQUMxQixNQUFNQyxNQUFNLE1BQU9GLEtBQUssSUFBS0YsTUFBTUcsVUFBVSxHQUFHLElBQU07WUFDdERGLEtBQUtaLFlBQVksQ0FBQ2UsSUFBSTtZQUN0QkosTUFBTUcsVUFBVSxJQUFJO1FBQ3hCO0lBQ0osT0FDSyxJQUFJSCxNQUFNRyxVQUFVLEdBQUcsR0FBRztRQUMzQkgsTUFBTUUsS0FBSyxHQUFHRixNQUFNRSxLQUFLLElBQUssSUFBSUYsTUFBTUcsVUFBVTtRQUNsREgsTUFBTUcsVUFBVSxHQUFHO1FBQ25CLE1BQU9ILE1BQU1HLFVBQVUsSUFBSSxFQUFHO1lBQzFCLE1BQU1DLE1BQU0sTUFBT0YsS0FBSyxJQUFLRixNQUFNRyxVQUFVLEdBQUcsSUFBTTtZQUN0REYsS0FBS1osWUFBWSxDQUFDZSxJQUFJO1lBQ3RCSixNQUFNRyxVQUFVLElBQUk7UUFDeEI7SUFDSjtBQUNKO0FBQ0E7Ozs7OztDQU1DLEdBQ00sU0FBU0Usa0JBQWtCQyxRQUFRLEVBQUVOLEtBQUssRUFBRUMsSUFBSTtJQUNuRCxNQUFNTSxPQUFPZixjQUFjLENBQUNjLFNBQVM7SUFDckMsSUFBSUMsT0FBTyxDQUFDLEdBQUc7UUFDWCw2QkFBNkI7UUFDN0JQLE1BQU1FLEtBQUssR0FBRyxNQUFPQSxLQUFLLElBQUksSUFBS0s7UUFDbkNQLE1BQU1HLFVBQVUsSUFBSTtRQUNwQixNQUFPSCxNQUFNRyxVQUFVLElBQUksRUFBRztZQUMxQkYsS0FBSyxNQUFPQyxLQUFLLElBQUtGLE1BQU1HLFVBQVUsR0FBRyxJQUFNO1lBQy9DSCxNQUFNRyxVQUFVLElBQUk7UUFDeEI7SUFDSixPQUNLLElBQUlJLFNBQVMsQ0FBQyxHQUFHO1FBQ2xCLG1DQUFtQztRQUNuQztJQUNKLE9BQ0s7UUFDRCxNQUFNLElBQUlDLE1BQU0sQ0FBQyw4QkFBOEIsRUFBRUMsT0FBT0MsWUFBWSxDQUFDSixVQUFVLENBQUMsQ0FBQztJQUNyRjtBQUNKO0FBQ0E7Ozs7OztDQU1DLEdBQ00sU0FBU0ssa0JBQWtCQyxHQUFHO0lBQ2pDLE1BQU1DLFNBQVMsRUFBRTtJQUNqQixNQUFNQyxVQUFVLENBQUNDO1FBQ2JGLE9BQU9HLElBQUksQ0FBQ0Q7SUFDaEI7SUFDQSxNQUFNZixRQUFRO1FBQUVFLE9BQU87UUFBR0MsWUFBWTtJQUFFO0lBQ3hDYyxhQUFhTCxLQUFLLENBQUNiO1FBQ2ZELGdCQUFnQkMsTUFBTUMsT0FBT2M7SUFDakM7SUFDQWhCLGdCQUFnQixNQUFNRSxPQUFPYztJQUM3QixPQUFPRCxPQUFPSyxJQUFJLENBQUM7QUFDdkI7QUFDQTs7Ozs7Q0FLQyxHQUNNLFNBQVNDLG9CQUFvQlAsR0FBRztJQUNuQyxNQUFNUSxPQUFPLEVBQUU7SUFDZixNQUFNQyxXQUFXLENBQUNDO1FBQ2RGLEtBQUtKLElBQUksQ0FBQ1AsT0FBT2MsYUFBYSxDQUFDRDtJQUNuQztJQUNBLE1BQU1FLFlBQVk7UUFDZEMsU0FBUztRQUNUSCxXQUFXO0lBQ2Y7SUFDQSxNQUFNSSxXQUFXO1FBQUV4QixPQUFPO1FBQUdDLFlBQVk7SUFBRTtJQUMzQyxNQUFNd0IsV0FBVyxDQUFDNUI7UUFDZDZCLGVBQWU3QixNQUFNeUIsV0FBV0g7SUFDcEM7SUFDQSxJQUFLLElBQUkxQixJQUFJLEdBQUdBLElBQUlpQixJQUFJaEIsTUFBTSxFQUFFRCxLQUFLLEVBQUc7UUFDcENVLGtCQUFrQk8sSUFBSWYsVUFBVSxDQUFDRixJQUFJK0IsVUFBVUM7SUFDbkQ7SUFDQSxPQUFPUCxLQUFLRixJQUFJLENBQUM7QUFDckI7QUFDQTs7Ozs7Q0FLQyxHQUNNLFNBQVNXLGdCQUFnQlAsU0FBUyxFQUFFckIsSUFBSTtJQUMzQyxJQUFJcUIsYUFBYSxNQUFNO1FBQ25CckIsS0FBS3FCO1FBQ0w7SUFDSixPQUNLLElBQUlBLGFBQWEsT0FBTztRQUN6QnJCLEtBQUssT0FBUXFCLGFBQWE7UUFDMUJyQixLQUFLLE9BQVFxQixZQUFZO1FBQ3pCO0lBQ0osT0FDSyxJQUFJQSxhQUFhLFFBQVE7UUFDMUJyQixLQUFLLE9BQVFxQixhQUFhO1FBQzFCckIsS0FBSyxPQUFRLGFBQWMsSUFBSztRQUNoQ0EsS0FBSyxPQUFRcUIsWUFBWTtRQUN6QjtJQUNKLE9BQ0ssSUFBSUEsYUFBYSxVQUFVO1FBQzVCckIsS0FBSyxPQUFRcUIsYUFBYTtRQUMxQnJCLEtBQUssT0FBUSxhQUFjLEtBQU07UUFDakNBLEtBQUssT0FBUSxhQUFjLElBQUs7UUFDaENBLEtBQUssT0FBUXFCLFlBQVk7UUFDekI7SUFDSjtJQUNBLE1BQU0sSUFBSWQsTUFBTSxDQUFDLGdDQUFnQyxFQUFFYyxVQUFVUSxRQUFRLENBQUMsSUFBSSxDQUFDO0FBQy9FO0FBQ0E7Ozs7O0NBS0MsR0FDTSxTQUFTYixhQUFhTCxHQUFHLEVBQUVYLElBQUk7SUFDbEMsSUFBSyxJQUFJTixJQUFJLEdBQUdBLElBQUlpQixJQUFJaEIsTUFBTSxFQUFFRCxLQUFLLEVBQUc7UUFDcEMsSUFBSTJCLFlBQVlWLElBQUlmLFVBQVUsQ0FBQ0Y7UUFDL0IsSUFBSTJCLFlBQVksVUFBVUEsYUFBYSxRQUFRO1lBQzNDLHVFQUF1RTtZQUN2RSxzRUFBc0U7WUFDdEUsMkNBQTJDO1lBQzNDLE1BQU1TLGdCQUFnQixDQUFFVCxZQUFZLE1BQUssSUFBSyxRQUFTO1lBQ3ZELE1BQU1VLGVBQWUsSUFBS25DLFVBQVUsQ0FBQ0YsSUFBSSxLQUFLLFNBQVU7WUFDeEQyQixZQUFZLENBQUNVLGVBQWVELGFBQVksSUFBSztZQUM3Q3BDLEtBQUs7UUFDVDtRQUNBa0MsZ0JBQWdCUCxXQUFXckI7SUFDL0I7QUFDSjtBQUNBOzs7Ozs7O0NBT0MsR0FDTSxTQUFTMkIsZUFBZTdCLElBQUksRUFBRUMsS0FBSyxFQUFFQyxJQUFJO0lBQzVDLElBQUlELE1BQU15QixPQUFPLEtBQUssR0FBRztRQUNyQixJQUFJMUIsUUFBUSxNQUFNO1lBQ2RFLEtBQUtGO1lBQ0w7UUFDSjtRQUNBLHVEQUF1RDtRQUN2RCxJQUFLLElBQUlrQyxhQUFhLEdBQUdBLGFBQWEsR0FBR0EsY0FBYyxFQUFHO1lBQ3RELElBQUksQ0FBQyxRQUFVLElBQUlBLGFBQWUsT0FBTyxHQUFHO2dCQUN4Q2pDLE1BQU15QixPQUFPLEdBQUdRO2dCQUNoQjtZQUNKO1FBQ0o7UUFDQSxJQUFJakMsTUFBTXlCLE9BQU8sS0FBSyxHQUFHO1lBQ3JCekIsTUFBTXNCLFNBQVMsR0FBR3ZCLE9BQU87UUFDN0IsT0FDSyxJQUFJQyxNQUFNeUIsT0FBTyxLQUFLLEdBQUc7WUFDMUJ6QixNQUFNc0IsU0FBUyxHQUFHdkIsT0FBTztRQUM3QixPQUNLLElBQUlDLE1BQU15QixPQUFPLEtBQUssR0FBRztZQUMxQnpCLE1BQU1zQixTQUFTLEdBQUd2QixPQUFPO1FBQzdCLE9BQ0s7WUFDRCxNQUFNLElBQUlTLE1BQU07UUFDcEI7UUFDQVIsTUFBTXlCLE9BQU8sSUFBSTtJQUNyQixPQUNLLElBQUl6QixNQUFNeUIsT0FBTyxHQUFHLEdBQUc7UUFDeEIsSUFBSTFCLFFBQVEsTUFBTTtZQUNkLE1BQU0sSUFBSVMsTUFBTTtRQUNwQjtRQUNBUixNQUFNc0IsU0FBUyxHQUFHLE1BQU9BLFNBQVMsSUFBSSxJQUFNdkIsT0FBTztRQUNuREMsTUFBTXlCLE9BQU8sSUFBSTtRQUNqQixJQUFJekIsTUFBTXlCLE9BQU8sS0FBSyxHQUFHO1lBQ3JCeEIsS0FBS0QsTUFBTXNCLFNBQVM7UUFDeEI7SUFDSjtBQUNKO0FBQ0E7O0NBRUMsR0FDTSxTQUFTWSxzQkFBc0J0QixHQUFHO0lBQ3JDLE1BQU11QixTQUFTLEVBQUU7SUFDakIsTUFBTW5DLFFBQVE7UUFBRUUsT0FBTztRQUFHQyxZQUFZO0lBQUU7SUFDeEMsTUFBTWlDLFNBQVMsQ0FBQ3JDO1FBQ1pvQyxPQUFPbkIsSUFBSSxDQUFDakI7SUFDaEI7SUFDQSxJQUFLLElBQUlKLElBQUksR0FBR0EsSUFBSWlCLElBQUloQixNQUFNLEVBQUVELEtBQUssRUFBRztRQUNwQ1Usa0JBQWtCTyxJQUFJZixVQUFVLENBQUNGLElBQUlLLE9BQU9vQztJQUNoRDtJQUNBLE9BQU8sSUFBSUMsV0FBV0Y7QUFDMUI7QUFDTyxTQUFTRyxtQkFBbUIxQixHQUFHO0lBQ2xDLE1BQU11QixTQUFTLEVBQUU7SUFDakJsQixhQUFhTCxLQUFLLENBQUNiLE9BQVNvQyxPQUFPbkIsSUFBSSxDQUFDakI7SUFDeEMsT0FBTyxJQUFJc0MsV0FBV0Y7QUFDMUI7QUFDTyxTQUFTSSxpQkFBaUJDLEtBQUs7SUFDbEMsTUFBTUwsU0FBUyxFQUFFO0lBQ2pCLE1BQU1uQyxRQUFRO1FBQUVFLE9BQU87UUFBR0MsWUFBWTtJQUFFO0lBQ3hDLE1BQU1zQyxTQUFTLENBQUMxQjtRQUNab0IsT0FBT25CLElBQUksQ0FBQ0Q7SUFDaEI7SUFDQXlCLE1BQU1FLE9BQU8sQ0FBQyxDQUFDM0MsT0FBU0QsZ0JBQWdCQyxNQUFNQyxPQUFPeUM7SUFDckQscURBQXFEO0lBQ3JEM0MsZ0JBQWdCLE1BQU1FLE9BQU95QztJQUM3QixPQUFPTixPQUFPakIsSUFBSSxDQUFDO0FBQ3ZCLEVBQ0EscUNBQXFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi9iYXNlNjR1cmwuanM/MTVkZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF2b2lkIG1vZGlmeWluZyB0aGlzIGZpbGUuIEl0J3MgcGFydCBvZlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N1cGFiYXNlLWNvbW11bml0eS9iYXNlNjR1cmwtanMuICBTdWJtaXQgYWxsIGZpeGVzIG9uXG4gKiB0aGF0IHJlcG8hXG4gKi9cbi8qKlxuICogQW4gYXJyYXkgb2YgY2hhcmFjdGVycyB0aGF0IGVuY29kZSA2IGJpdHMgaW50byBhIEJhc2U2NC1VUkwgYWxwaGFiZXRcbiAqIGNoYXJhY3Rlci5cbiAqL1xuY29uc3QgVE9fQkFTRTY0VVJMID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV8nLnNwbGl0KCcnKTtcbi8qKlxuICogQW4gYXJyYXkgb2YgY2hhcmFjdGVycyB0aGF0IGNhbiBhcHBlYXIgaW4gYSBCYXNlNjQtVVJMIGVuY29kZWQgc3RyaW5nIGJ1dFxuICogc2hvdWxkIGJlIGlnbm9yZWQuXG4gKi9cbmNvbnN0IElHTk9SRV9CQVNFNjRVUkwgPSAnIFxcdFxcblxccj0nLnNwbGl0KCcnKTtcbi8qKlxuICogQW4gYXJyYXkgb2YgMTI4IG51bWJlcnMgdGhhdCBtYXAgYSBCYXNlNjQtVVJMIGNoYXJhY3RlciB0byA2IGJpdHMsIG9yIGlmIC0yXG4gKiB1c2VkIHRvIHNraXAgdGhlIGNoYXJhY3Rlciwgb3IgaWYgLTEgdXNlZCB0byBlcnJvciBvdXQuXG4gKi9cbmNvbnN0IEZST01fQkFTRTY0VVJMID0gKCgpID0+IHtcbiAgICBjb25zdCBjaGFyTWFwID0gbmV3IEFycmF5KDEyOCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyTWFwLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNoYXJNYXBbaV0gPSAtMTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBJR05PUkVfQkFTRTY0VVJMLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNoYXJNYXBbSUdOT1JFX0JBU0U2NFVSTFtpXS5jaGFyQ29kZUF0KDApXSA9IC0yO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRPX0JBU0U2NFVSTC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjaGFyTWFwW1RPX0JBU0U2NFVSTFtpXS5jaGFyQ29kZUF0KDApXSA9IGk7XG4gICAgfVxuICAgIHJldHVybiBjaGFyTWFwO1xufSkoKTtcbi8qKlxuICogQ29udmVydHMgYSBieXRlIHRvIGEgQmFzZTY0LVVSTCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGJ5dGUgVGhlIGJ5dGUgdG8gY29udmVydCwgb3IgbnVsbCB0byBmbHVzaCBhdCB0aGUgZW5kIG9mIHRoZSBieXRlIHNlcXVlbmNlLlxuICogQHBhcmFtIHN0YXRlIFRoZSBCYXNlNjQgY29udmVyc2lvbiBzdGF0ZS4gUGFzcyBhbiBpbml0aWFsIHZhbHVlIG9mIGB7IHF1ZXVlOiAwLCBxdWV1ZWRCaXRzOiAwIH1gLlxuICogQHBhcmFtIGVtaXQgQSBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgbmV4dCBCYXNlNjQgY2hhcmFjdGVyIHdoZW4gcmVhZHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlVG9CYXNlNjRVUkwoYnl0ZSwgc3RhdGUsIGVtaXQpIHtcbiAgICBpZiAoYnl0ZSAhPT0gbnVsbCkge1xuICAgICAgICBzdGF0ZS5xdWV1ZSA9IChzdGF0ZS5xdWV1ZSA8PCA4KSB8IGJ5dGU7XG4gICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgKz0gODtcbiAgICAgICAgd2hpbGUgKHN0YXRlLnF1ZXVlZEJpdHMgPj0gNikge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gKHN0YXRlLnF1ZXVlID4+IChzdGF0ZS5xdWV1ZWRCaXRzIC0gNikpICYgNjM7XG4gICAgICAgICAgICBlbWl0KFRPX0JBU0U2NFVSTFtwb3NdKTtcbiAgICAgICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgLT0gNjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzdGF0ZS5xdWV1ZWRCaXRzID4gMCkge1xuICAgICAgICBzdGF0ZS5xdWV1ZSA9IHN0YXRlLnF1ZXVlIDw8ICg2IC0gc3RhdGUucXVldWVkQml0cyk7XG4gICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgPSA2O1xuICAgICAgICB3aGlsZSAoc3RhdGUucXVldWVkQml0cyA+PSA2KSB7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSAoc3RhdGUucXVldWUgPj4gKHN0YXRlLnF1ZXVlZEJpdHMgLSA2KSkgJiA2MztcbiAgICAgICAgICAgIGVtaXQoVE9fQkFTRTY0VVJMW3Bvc10pO1xuICAgICAgICAgICAgc3RhdGUucXVldWVkQml0cyAtPSA2O1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBDb252ZXJ0cyBhIFN0cmluZyBjaGFyIGNvZGUgKGV4dHJhY3RlZCB1c2luZyBgc3RyaW5nLmNoYXJDb2RlQXQocG9zaXRpb24pYCkgdG8gYSBzZXF1ZW5jZSBvZiBCYXNlNjQtVVJMIGNoYXJhY3RlcnMuXG4gKlxuICogQHBhcmFtIGNoYXJDb2RlIFRoZSBjaGFyIGNvZGUgb2YgdGhlIEphdmFTY3JpcHQgc3RyaW5nLlxuICogQHBhcmFtIHN0YXRlIFRoZSBCYXNlNjQgc3RhdGUuIFBhc3MgYW4gaW5pdGlhbCB2YWx1ZSBvZiBgeyBxdWV1ZTogMCwgcXVldWVkQml0czogMCB9YC5cbiAqIEBwYXJhbSBlbWl0IEEgZnVuY3Rpb24gY2FsbGVkIHdpdGggdGhlIG5leHQgYnl0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVGcm9tQmFzZTY0VVJMKGNoYXJDb2RlLCBzdGF0ZSwgZW1pdCkge1xuICAgIGNvbnN0IGJpdHMgPSBGUk9NX0JBU0U2NFVSTFtjaGFyQ29kZV07XG4gICAgaWYgKGJpdHMgPiAtMSkge1xuICAgICAgICAvLyB2YWxpZCBCYXNlNjQtVVJMIGNoYXJhY3RlclxuICAgICAgICBzdGF0ZS5xdWV1ZSA9IChzdGF0ZS5xdWV1ZSA8PCA2KSB8IGJpdHM7XG4gICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgKz0gNjtcbiAgICAgICAgd2hpbGUgKHN0YXRlLnF1ZXVlZEJpdHMgPj0gOCkge1xuICAgICAgICAgICAgZW1pdCgoc3RhdGUucXVldWUgPj4gKHN0YXRlLnF1ZXVlZEJpdHMgLSA4KSkgJiAweGZmKTtcbiAgICAgICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgLT0gODtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChiaXRzID09PSAtMikge1xuICAgICAgICAvLyBpZ25vcmUgc3BhY2VzLCB0YWJzLCBuZXdsaW5lcywgPVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgQmFzZTY0LVVSTCBjaGFyYWN0ZXIgXCIke1N0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpfVwiYCk7XG4gICAgfVxufVxuLyoqXG4gKiBDb252ZXJ0cyBhIEphdmFTY3JpcHQgc3RyaW5nICh3aGljaCBtYXkgaW5jbHVkZSBhbnkgdmFsaWQgY2hhcmFjdGVyKSBpbnRvIGFcbiAqIEJhc2U2NC1VUkwgZW5jb2RlZCBzdHJpbmcuIFRoZSBzdHJpbmcgaXMgZmlyc3QgZW5jb2RlZCBpbiBVVEYtOCB3aGljaCBpc1xuICogdGhlbiBlbmNvZGVkIGFzIEJhc2U2NC1VUkwuXG4gKlxuICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb0Jhc2U2NFVSTChzdHIpIHtcbiAgICBjb25zdCBiYXNlNjQgPSBbXTtcbiAgICBjb25zdCBlbWl0dGVyID0gKGNoYXIpID0+IHtcbiAgICAgICAgYmFzZTY0LnB1c2goY2hhcik7XG4gICAgfTtcbiAgICBjb25zdCBzdGF0ZSA9IHsgcXVldWU6IDAsIHF1ZXVlZEJpdHM6IDAgfTtcbiAgICBzdHJpbmdUb1VURjgoc3RyLCAoYnl0ZSkgPT4ge1xuICAgICAgICBieXRlVG9CYXNlNjRVUkwoYnl0ZSwgc3RhdGUsIGVtaXR0ZXIpO1xuICAgIH0pO1xuICAgIGJ5dGVUb0Jhc2U2NFVSTChudWxsLCBzdGF0ZSwgZW1pdHRlcik7XG4gICAgcmV0dXJuIGJhc2U2NC5qb2luKCcnKTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBCYXNlNjQtVVJMIGVuY29kZWQgc3RyaW5nIGludG8gYSBKYXZhU2NyaXB0IHN0cmluZy4gSXQgaXMgYXNzdW1lZFxuICogdGhhdCB0aGUgdW5kZXJseWluZyBzdHJpbmcgaGFzIGJlZW4gZW5jb2RlZCBhcyBVVEYtOC5cbiAqXG4gKiBAcGFyYW0gc3RyIFRoZSBCYXNlNjQtVVJMIGVuY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRnJvbUJhc2U2NFVSTChzdHIpIHtcbiAgICBjb25zdCBjb252ID0gW107XG4gICAgY29uc3QgdXRmOEVtaXQgPSAoY29kZXBvaW50KSA9PiB7XG4gICAgICAgIGNvbnYucHVzaChTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlcG9pbnQpKTtcbiAgICB9O1xuICAgIGNvbnN0IHV0ZjhTdGF0ZSA9IHtcbiAgICAgICAgdXRmOHNlcTogMCxcbiAgICAgICAgY29kZXBvaW50OiAwLFxuICAgIH07XG4gICAgY29uc3QgYjY0U3RhdGUgPSB7IHF1ZXVlOiAwLCBxdWV1ZWRCaXRzOiAwIH07XG4gICAgY29uc3QgYnl0ZUVtaXQgPSAoYnl0ZSkgPT4ge1xuICAgICAgICBzdHJpbmdGcm9tVVRGOChieXRlLCB1dGY4U3RhdGUsIHV0ZjhFbWl0KTtcbiAgICB9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGJ5dGVGcm9tQmFzZTY0VVJMKHN0ci5jaGFyQ29kZUF0KGkpLCBiNjRTdGF0ZSwgYnl0ZUVtaXQpO1xuICAgIH1cbiAgICByZXR1cm4gY29udi5qb2luKCcnKTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBVbmljb2RlIGNvZGVwb2ludCB0byBhIG11bHRpLWJ5dGUgVVRGLTggc2VxdWVuY2UuXG4gKlxuICogQHBhcmFtIGNvZGVwb2ludCBUaGUgVW5pY29kZSBjb2RlcG9pbnQuXG4gKiBAcGFyYW0gZW1pdCAgICAgIEZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIFVURi04IGJ5dGUgdGhhdCByZXByZXNlbnRzIHRoZSBjb2RlcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2RlcG9pbnRUb1VURjgoY29kZXBvaW50LCBlbWl0KSB7XG4gICAgaWYgKGNvZGVwb2ludCA8PSAweDdmKSB7XG4gICAgICAgIGVtaXQoY29kZXBvaW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHg3ZmYpIHtcbiAgICAgICAgZW1pdCgweGMwIHwgKGNvZGVwb2ludCA+PiA2KSk7XG4gICAgICAgIGVtaXQoMHg4MCB8IChjb2RlcG9pbnQgJiAweDNmKSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4ZmZmZikge1xuICAgICAgICBlbWl0KDB4ZTAgfCAoY29kZXBvaW50ID4+IDEyKSk7XG4gICAgICAgIGVtaXQoMHg4MCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHgzZikpO1xuICAgICAgICBlbWl0KDB4ODAgfCAoY29kZXBvaW50ICYgMHgzZikpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweDEwZmZmZikge1xuICAgICAgICBlbWl0KDB4ZjAgfCAoY29kZXBvaW50ID4+IDE4KSk7XG4gICAgICAgIGVtaXQoMHg4MCB8ICgoY29kZXBvaW50ID4+IDEyKSAmIDB4M2YpKTtcbiAgICAgICAgZW1pdCgweDgwIHwgKChjb2RlcG9pbnQgPj4gNikgJiAweDNmKSk7XG4gICAgICAgIGVtaXQoMHg4MCB8IChjb2RlcG9pbnQgJiAweDNmKSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgVW5pY29kZSBjb2RlcG9pbnQ6ICR7Y29kZXBvaW50LnRvU3RyaW5nKDE2KX1gKTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBKYXZhU2NyaXB0IHN0cmluZyB0byBhIHNlcXVlbmNlIG9mIFVURi04IGJ5dGVzLlxuICpcbiAqIEBwYXJhbSBzdHIgIFRoZSBzdHJpbmcgdG8gY29udmVydCB0byBVVEYtOC5cbiAqIEBwYXJhbSBlbWl0IEZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIFVURi04IGJ5dGUgb2YgdGhlIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvVVRGOChzdHIsIGVtaXQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBsZXQgY29kZXBvaW50ID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjb2RlcG9pbnQgPiAweGQ3ZmYgJiYgY29kZXBvaW50IDw9IDB4ZGJmZikge1xuICAgICAgICAgICAgLy8gbW9zdCBVVEYtMTYgY29kZXBvaW50cyBhcmUgVW5pY29kZSBjb2RlcG9pbnRzLCBleGNlcHQgdmFsdWVzIGluIHRoaXNcbiAgICAgICAgICAgIC8vIHJhbmdlIHdoZXJlIHRoZSBuZXh0IFVURi0xNiBjb2RlcG9pbnQgbmVlZHMgdG8gYmUgY29tYmluZWQgd2l0aCB0aGVcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgb25lIHRvIGdldCB0aGUgVW5pY29kZSBjb2RlcG9pbnRcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hTdXJyb2dhdGUgPSAoKGNvZGVwb2ludCAtIDB4ZDgwMCkgKiAweDQwMCkgJiAweGZmZmY7XG4gICAgICAgICAgICBjb25zdCBsb3dTdXJyb2dhdGUgPSAoc3RyLmNoYXJDb2RlQXQoaSArIDEpIC0gMHhkYzAwKSAmIDB4ZmZmZjtcbiAgICAgICAgICAgIGNvZGVwb2ludCA9IChsb3dTdXJyb2dhdGUgfCBoaWdoU3Vycm9nYXRlKSArIDB4MTAwMDA7XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgY29kZXBvaW50VG9VVEY4KGNvZGVwb2ludCwgZW1pdCk7XG4gICAgfVxufVxuLyoqXG4gKiBDb252ZXJ0cyBhIFVURi04IGJ5dGUgdG8gYSBVbmljb2RlIGNvZGVwb2ludC5cbiAqXG4gKiBAcGFyYW0gYnl0ZSAgVGhlIFVURi04IGJ5dGUgbmV4dCBpbiB0aGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0gc3RhdGUgVGhlIHNoYXJlZCBzdGF0ZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIFVURi04IGJ5dGVzIGluIHRoZVxuICogICAgICAgICAgICAgIHNlcXVlbmNlLCBhbiBvYmplY3Qgd2l0aCB0aGUgc2hhcGUgYHsgdXRmOHNlcTogMCwgY29kZXBvaW50OiAwIH1gLlxuICogQHBhcmFtIGVtaXQgIEZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGNvZGVwb2ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0Zyb21VVEY4KGJ5dGUsIHN0YXRlLCBlbWl0KSB7XG4gICAgaWYgKHN0YXRlLnV0ZjhzZXEgPT09IDApIHtcbiAgICAgICAgaWYgKGJ5dGUgPD0gMHg3Zikge1xuICAgICAgICAgICAgZW1pdChieXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb3VudCB0aGUgbnVtYmVyIG9mIDEgbGVhZGluZyBiaXRzIHVudGlsIHlvdSByZWFjaCAwXG4gICAgICAgIGZvciAobGV0IGxlYWRpbmdCaXQgPSAxOyBsZWFkaW5nQml0IDwgNjsgbGVhZGluZ0JpdCArPSAxKSB7XG4gICAgICAgICAgICBpZiAoKChieXRlID4+ICg3IC0gbGVhZGluZ0JpdCkpICYgMSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS51dGY4c2VxID0gbGVhZGluZ0JpdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUudXRmOHNlcSA9PT0gMikge1xuICAgICAgICAgICAgc3RhdGUuY29kZXBvaW50ID0gYnl0ZSAmIDMxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLnV0ZjhzZXEgPT09IDMpIHtcbiAgICAgICAgICAgIHN0YXRlLmNvZGVwb2ludCA9IGJ5dGUgJiAxNTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS51dGY4c2VxID09PSA0KSB7XG4gICAgICAgICAgICBzdGF0ZS5jb2RlcG9pbnQgPSBieXRlICYgNztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBVVEYtOCBzZXF1ZW5jZScpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnV0ZjhzZXEgLT0gMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc3RhdGUudXRmOHNlcSA+IDApIHtcbiAgICAgICAgaWYgKGJ5dGUgPD0gMHg3Zikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFVURi04IHNlcXVlbmNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuY29kZXBvaW50ID0gKHN0YXRlLmNvZGVwb2ludCA8PCA2KSB8IChieXRlICYgNjMpO1xuICAgICAgICBzdGF0ZS51dGY4c2VxIC09IDE7XG4gICAgICAgIGlmIChzdGF0ZS51dGY4c2VxID09PSAwKSB7XG4gICAgICAgICAgICBlbWl0KHN0YXRlLmNvZGVwb2ludCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgdG8gY29udmVydCBkaWZmZXJlbnQgdHlwZXMgb2Ygc3RyaW5ncyB0byBVaW50OEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRVcmxUb1VpbnQ4QXJyYXkoc3RyKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3Qgc3RhdGUgPSB7IHF1ZXVlOiAwLCBxdWV1ZWRCaXRzOiAwIH07XG4gICAgY29uc3Qgb25CeXRlID0gKGJ5dGUpID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2goYnl0ZSk7XG4gICAgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBieXRlRnJvbUJhc2U2NFVSTChzdHIuY2hhckNvZGVBdChpKSwgc3RhdGUsIG9uQnl0ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZXN1bHQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvVWludDhBcnJheShzdHIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBzdHJpbmdUb1VURjgoc3RyLCAoYnl0ZSkgPT4gcmVzdWx0LnB1c2goYnl0ZSkpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZXN1bHQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9CYXNlNjRVUkwoYnl0ZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBzdGF0ZSA9IHsgcXVldWU6IDAsIHF1ZXVlZEJpdHM6IDAgfTtcbiAgICBjb25zdCBvbkNoYXIgPSAoY2hhcikgPT4ge1xuICAgICAgICByZXN1bHQucHVzaChjaGFyKTtcbiAgICB9O1xuICAgIGJ5dGVzLmZvckVhY2goKGJ5dGUpID0+IGJ5dGVUb0Jhc2U2NFVSTChieXRlLCBzdGF0ZSwgb25DaGFyKSk7XG4gICAgLy8gYWx3YXlzIGNhbGwgd2l0aCBgbnVsbGAgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgYnl0ZXNcbiAgICBieXRlVG9CYXNlNjRVUkwobnVsbCwgc3RhdGUsIG9uQ2hhcik7XG4gICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2U2NHVybC5qcy5tYXAiXSwibmFtZXMiOlsiVE9fQkFTRTY0VVJMIiwic3BsaXQiLCJJR05PUkVfQkFTRTY0VVJMIiwiRlJPTV9CQVNFNjRVUkwiLCJjaGFyTWFwIiwiQXJyYXkiLCJpIiwibGVuZ3RoIiwiY2hhckNvZGVBdCIsImJ5dGVUb0Jhc2U2NFVSTCIsImJ5dGUiLCJzdGF0ZSIsImVtaXQiLCJxdWV1ZSIsInF1ZXVlZEJpdHMiLCJwb3MiLCJieXRlRnJvbUJhc2U2NFVSTCIsImNoYXJDb2RlIiwiYml0cyIsIkVycm9yIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwic3RyaW5nVG9CYXNlNjRVUkwiLCJzdHIiLCJiYXNlNjQiLCJlbWl0dGVyIiwiY2hhciIsInB1c2giLCJzdHJpbmdUb1VURjgiLCJqb2luIiwic3RyaW5nRnJvbUJhc2U2NFVSTCIsImNvbnYiLCJ1dGY4RW1pdCIsImNvZGVwb2ludCIsImZyb21Db2RlUG9pbnQiLCJ1dGY4U3RhdGUiLCJ1dGY4c2VxIiwiYjY0U3RhdGUiLCJieXRlRW1pdCIsInN0cmluZ0Zyb21VVEY4IiwiY29kZXBvaW50VG9VVEY4IiwidG9TdHJpbmciLCJoaWdoU3Vycm9nYXRlIiwibG93U3Vycm9nYXRlIiwibGVhZGluZ0JpdCIsImJhc2U2NFVybFRvVWludDhBcnJheSIsInJlc3VsdCIsIm9uQnl0ZSIsIlVpbnQ4QXJyYXkiLCJzdHJpbmdUb1VpbnQ4QXJyYXkiLCJieXRlc1RvQmFzZTY0VVJMIiwiYnl0ZXMiLCJvbkNoYXIiLCJmb3JFYWNoIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/base64url.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ base64UrlToUint8Array: () => (/* binding */ base64UrlToUint8Array),\n/* harmony export */ byteFromBase64URL: () => (/* binding */ byteFromBase64URL),\n/* harmony export */ byteToBase64URL: () => (/* binding */ byteToBase64URL),\n/* harmony export */ bytesToBase64URL: () => (/* binding */ bytesToBase64URL),\n/* harmony export */ codepointToUTF8: () => (/* binding */ codepointToUTF8),\n/* harmony export */ stringFromBase64URL: () => (/* binding */ stringFromBase64URL),\n/* harmony export */ stringFromUTF8: () => (/* binding */ stringFromUTF8),\n/* harmony export */ stringToBase64URL: () => (/* binding */ stringToBase64URL),\n/* harmony export */ stringToUTF8: () => (/* binding */ stringToUTF8),\n/* harmony export */ stringToUint8Array: () => (/* 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 \"${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: ${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2Jhc2U2NHVybC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Q0FJQyxHQUNEOzs7Q0FHQyxHQUNELE1BQU1BLGVBQWUsbUVBQW1FQyxLQUFLLENBQUM7QUFDOUY7OztDQUdDLEdBQ0QsTUFBTUMsbUJBQW1CLFVBQVdELEtBQUssQ0FBQztBQUMxQzs7O0NBR0MsR0FDRCxNQUFNRSxpQkFBaUIsQ0FBQztJQUNwQixNQUFNQyxVQUFVLElBQUlDLE1BQU07SUFDMUIsSUFBSyxJQUFJQyxJQUFJLEdBQUdBLElBQUlGLFFBQVFHLE1BQU0sRUFBRUQsS0FBSyxFQUFHO1FBQ3hDRixPQUFPLENBQUNFLEVBQUUsR0FBRyxDQUFDO0lBQ2xCO0lBQ0EsSUFBSyxJQUFJQSxJQUFJLEdBQUdBLElBQUlKLGlCQUFpQkssTUFBTSxFQUFFRCxLQUFLLEVBQUc7UUFDakRGLE9BQU8sQ0FBQ0YsZ0JBQWdCLENBQUNJLEVBQUUsQ0FBQ0UsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2xEO0lBQ0EsSUFBSyxJQUFJRixJQUFJLEdBQUdBLElBQUlOLGFBQWFPLE1BQU0sRUFBRUQsS0FBSyxFQUFHO1FBQzdDRixPQUFPLENBQUNKLFlBQVksQ0FBQ00sRUFBRSxDQUFDRSxVQUFVLENBQUMsR0FBRyxHQUFHRjtJQUM3QztJQUNBLE9BQU9GO0FBQ1g7QUFDQTs7Ozs7O0NBTUMsR0FDTSxTQUFTSyxnQkFBZ0JDLElBQUksRUFBRUMsS0FBSyxFQUFFQyxJQUFJO0lBQzdDLElBQUlGLFNBQVMsTUFBTTtRQUNmQyxNQUFNRSxLQUFLLEdBQUcsTUFBT0EsS0FBSyxJQUFJLElBQUtIO1FBQ25DQyxNQUFNRyxVQUFVLElBQUk7UUFDcEIsTUFBT0gsTUFBTUcsVUFBVSxJQUFJLEVBQUc7WUFDMUIsTUFBTUMsTUFBTSxNQUFPRixLQUFLLElBQUtGLE1BQU1HLFVBQVUsR0FBRyxJQUFN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O0FBQzFCO0FBQ08sU0FBU0ksaUJBQWlCQyxLQUFLO0lBQ2xDLE1BQU1MLFNBQVMsRUFBRTtJQUNqQixNQUFNbkMsUUFBUTtRQUFFRSxPQUFPO1FBQUdDLFlBQVk7SUFBRTtJQUN4QyxNQUFNc0MsU0FBUyxDQUFDMUI7UUFDWm9CLE9BQU9uQixJQUFJLENBQUNEO0lBQ2hCO0lBQ0F5QixNQUFNRSxPQUFPLENBQUMsQ0FBQzNDLE9BQVNELGdCQUFnQkMsTUFBTUMsT0FBT3lDO0lBQ3JELHFEQUFxRDtJQUNyRDNDLGdCQUFnQixNQUFNRSxPQUFPeUM7SUFDN0IsT0FBT04sT0FBT2pCLElBQUksQ0FBQztBQUN2QixFQUNBLHFDQUFxQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvYmFzZTY0dXJsLmpzPzE1ZGUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBdm9pZCBtb2RpZnlpbmcgdGhpcyBmaWxlLiBJdCdzIHBhcnQgb2ZcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBhYmFzZS1jb21tdW5pdHkvYmFzZTY0dXJsLWpzLiAgU3VibWl0IGFsbCBmaXhlcyBvblxuICogdGhhdCByZXBvIVxuICovXG4vKipcbiAqIEFuIGFycmF5IG9mIGNoYXJhY3RlcnMgdGhhdCBlbmNvZGUgNiBiaXRzIGludG8gYSBCYXNlNjQtVVJMIGFscGhhYmV0XG4gKiBjaGFyYWN0ZXIuXG4gKi9cbmNvbnN0IFRPX0JBU0U2NFVSTCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fJy5zcGxpdCgnJyk7XG4vKipcbiAqIEFuIGFycmF5IG9mIGNoYXJhY3RlcnMgdGhhdCBjYW4gYXBwZWFyIGluIGEgQmFzZTY0LVVSTCBlbmNvZGVkIHN0cmluZyBidXRcbiAqIHNob3VsZCBiZSBpZ25vcmVkLlxuICovXG5jb25zdCBJR05PUkVfQkFTRTY0VVJMID0gJyBcXHRcXG5cXHI9Jy5zcGxpdCgnJyk7XG4vKipcbiAqIEFuIGFycmF5IG9mIDEyOCBudW1iZXJzIHRoYXQgbWFwIGEgQmFzZTY0LVVSTCBjaGFyYWN0ZXIgdG8gNiBiaXRzLCBvciBpZiAtMlxuICogdXNlZCB0byBza2lwIHRoZSBjaGFyYWN0ZXIsIG9yIGlmIC0xIHVzZWQgdG8gZXJyb3Igb3V0LlxuICovXG5jb25zdCBGUk9NX0JBU0U2NFVSTCA9ICgoKSA9PiB7XG4gICAgY29uc3QgY2hhck1hcCA9IG5ldyBBcnJheSgxMjgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhck1hcC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjaGFyTWFwW2ldID0gLTE7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgSUdOT1JFX0JBU0U2NFVSTC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjaGFyTWFwW0lHTk9SRV9CQVNFNjRVUkxbaV0uY2hhckNvZGVBdCgwKV0gPSAtMjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBUT19CQVNFNjRVUkwubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY2hhck1hcFtUT19CQVNFNjRVUkxbaV0uY2hhckNvZGVBdCgwKV0gPSBpO1xuICAgIH1cbiAgICByZXR1cm4gY2hhck1hcDtcbn0pKCk7XG4vKipcbiAqIENvbnZlcnRzIGEgYnl0ZSB0byBhIEJhc2U2NC1VUkwgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBieXRlIFRoZSBieXRlIHRvIGNvbnZlcnQsIG9yIG51bGwgdG8gZmx1c2ggYXQgdGhlIGVuZCBvZiB0aGUgYnl0ZSBzZXF1ZW5jZS5cbiAqIEBwYXJhbSBzdGF0ZSBUaGUgQmFzZTY0IGNvbnZlcnNpb24gc3RhdGUuIFBhc3MgYW4gaW5pdGlhbCB2YWx1ZSBvZiBgeyBxdWV1ZTogMCwgcXVldWVkQml0czogMCB9YC5cbiAqIEBwYXJhbSBlbWl0IEEgZnVuY3Rpb24gY2FsbGVkIHdpdGggdGhlIG5leHQgQmFzZTY0IGNoYXJhY3RlciB3aGVuIHJlYWR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZVRvQmFzZTY0VVJMKGJ5dGUsIHN0YXRlLCBlbWl0KSB7XG4gICAgaWYgKGJ5dGUgIT09IG51bGwpIHtcbiAgICAgICAgc3RhdGUucXVldWUgPSAoc3RhdGUucXVldWUgPDwgOCkgfCBieXRlO1xuICAgICAgICBzdGF0ZS5xdWV1ZWRCaXRzICs9IDg7XG4gICAgICAgIHdoaWxlIChzdGF0ZS5xdWV1ZWRCaXRzID49IDYpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IChzdGF0ZS5xdWV1ZSA+PiAoc3RhdGUucXVldWVkQml0cyAtIDYpKSAmIDYzO1xuICAgICAgICAgICAgZW1pdChUT19CQVNFNjRVUkxbcG9zXSk7XG4gICAgICAgICAgICBzdGF0ZS5xdWV1ZWRCaXRzIC09IDY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoc3RhdGUucXVldWVkQml0cyA+IDApIHtcbiAgICAgICAgc3RhdGUucXVldWUgPSBzdGF0ZS5xdWV1ZSA8PCAoNiAtIHN0YXRlLnF1ZXVlZEJpdHMpO1xuICAgICAgICBzdGF0ZS5xdWV1ZWRCaXRzID0gNjtcbiAgICAgICAgd2hpbGUgKHN0YXRlLnF1ZXVlZEJpdHMgPj0gNikge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gKHN0YXRlLnF1ZXVlID4+IChzdGF0ZS5xdWV1ZWRCaXRzIC0gNikpICYgNjM7XG4gICAgICAgICAgICBlbWl0KFRPX0JBU0U2NFVSTFtwb3NdKTtcbiAgICAgICAgICAgIHN0YXRlLnF1ZXVlZEJpdHMgLT0gNjtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQ29udmVydHMgYSBTdHJpbmcgY2hhciBjb2RlIChleHRyYWN0ZWQgdXNpbmcgYHN0cmluZy5jaGFyQ29kZUF0KHBvc2l0aW9uKWApIHRvIGEgc2VxdWVuY2Ugb2YgQmFzZTY0LVVSTCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwYXJhbSBjaGFyQ29kZSBUaGUgY2hhciBjb2RlIG9mIHRoZSBKYXZhU2NyaXB0IHN0cmluZy5cbiAqIEBwYXJhbSBzdGF0ZSBUaGUgQmFzZTY0IHN0YXRlLiBQYXNzIGFuIGluaXRpYWwgdmFsdWUgb2YgYHsgcXVldWU6IDAsIHF1ZXVlZEJpdHM6IDAgfWAuXG4gKiBAcGFyYW0gZW1pdCBBIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIHRoZSBuZXh0IGJ5dGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlRnJvbUJhc2U2NFVSTChjaGFyQ29kZSwgc3RhdGUsIGVtaXQpIHtcbiAgICBjb25zdCBiaXRzID0gRlJPTV9CQVNFNjRVUkxbY2hhckNvZGVdO1xuICAgIGlmIChiaXRzID4gLTEpIHtcbiAgICAgICAgLy8gdmFsaWQgQmFzZTY0LVVSTCBjaGFyYWN0ZXJcbiAgICAgICAgc3RhdGUucXVldWUgPSAoc3RhdGUucXVldWUgPDwgNikgfCBiaXRzO1xuICAgICAgICBzdGF0ZS5xdWV1ZWRCaXRzICs9IDY7XG4gICAgICAgIHdoaWxlIChzdGF0ZS5xdWV1ZWRCaXRzID49IDgpIHtcbiAgICAgICAgICAgIGVtaXQoKHN0YXRlLnF1ZXVlID4+IChzdGF0ZS5xdWV1ZWRCaXRzIC0gOCkpICYgMHhmZik7XG4gICAgICAgICAgICBzdGF0ZS5xdWV1ZWRCaXRzIC09IDg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYml0cyA9PT0gLTIpIHtcbiAgICAgICAgLy8gaWdub3JlIHNwYWNlcywgdGFicywgbmV3bGluZXMsID1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEJhc2U2NC1VUkwgY2hhcmFjdGVyIFwiJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKX1cImApO1xuICAgIH1cbn1cbi8qKlxuICogQ29udmVydHMgYSBKYXZhU2NyaXB0IHN0cmluZyAod2hpY2ggbWF5IGluY2x1ZGUgYW55IHZhbGlkIGNoYXJhY3RlcikgaW50byBhXG4gKiBCYXNlNjQtVVJMIGVuY29kZWQgc3RyaW5nLiBUaGUgc3RyaW5nIGlzIGZpcnN0IGVuY29kZWQgaW4gVVRGLTggd2hpY2ggaXNcbiAqIHRoZW4gZW5jb2RlZCBhcyBCYXNlNjQtVVJMLlxuICpcbiAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9CYXNlNjRVUkwoc3RyKSB7XG4gICAgY29uc3QgYmFzZTY0ID0gW107XG4gICAgY29uc3QgZW1pdHRlciA9IChjaGFyKSA9PiB7XG4gICAgICAgIGJhc2U2NC5wdXNoKGNoYXIpO1xuICAgIH07XG4gICAgY29uc3Qgc3RhdGUgPSB7IHF1ZXVlOiAwLCBxdWV1ZWRCaXRzOiAwIH07XG4gICAgc3RyaW5nVG9VVEY4KHN0ciwgKGJ5dGUpID0+IHtcbiAgICAgICAgYnl0ZVRvQmFzZTY0VVJMKGJ5dGUsIHN0YXRlLCBlbWl0dGVyKTtcbiAgICB9KTtcbiAgICBieXRlVG9CYXNlNjRVUkwobnVsbCwgc3RhdGUsIGVtaXR0ZXIpO1xuICAgIHJldHVybiBiYXNlNjQuam9pbignJyk7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgQmFzZTY0LVVSTCBlbmNvZGVkIHN0cmluZyBpbnRvIGEgSmF2YVNjcmlwdCBzdHJpbmcuIEl0IGlzIGFzc3VtZWRcbiAqIHRoYXQgdGhlIHVuZGVybHlpbmcgc3RyaW5nIGhhcyBiZWVuIGVuY29kZWQgYXMgVVRGLTguXG4gKlxuICogQHBhcmFtIHN0ciBUaGUgQmFzZTY0LVVSTCBlbmNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0Zyb21CYXNlNjRVUkwoc3RyKSB7XG4gICAgY29uc3QgY29udiA9IFtdO1xuICAgIGNvbnN0IHV0ZjhFbWl0ID0gKGNvZGVwb2ludCkgPT4ge1xuICAgICAgICBjb252LnB1c2goU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZXBvaW50KSk7XG4gICAgfTtcbiAgICBjb25zdCB1dGY4U3RhdGUgPSB7XG4gICAgICAgIHV0ZjhzZXE6IDAsXG4gICAgICAgIGNvZGVwb2ludDogMCxcbiAgICB9O1xuICAgIGNvbnN0IGI2NFN0YXRlID0geyBxdWV1ZTogMCwgcXVldWVkQml0czogMCB9O1xuICAgIGNvbnN0IGJ5dGVFbWl0ID0gKGJ5dGUpID0+IHtcbiAgICAgICAgc3RyaW5nRnJvbVVURjgoYnl0ZSwgdXRmOFN0YXRlLCB1dGY4RW1pdCk7XG4gICAgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBieXRlRnJvbUJhc2U2NFVSTChzdHIuY2hhckNvZGVBdChpKSwgYjY0U3RhdGUsIGJ5dGVFbWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnYuam9pbignJyk7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgVW5pY29kZSBjb2RlcG9pbnQgdG8gYSBtdWx0aS1ieXRlIFVURi04IHNlcXVlbmNlLlxuICpcbiAqIEBwYXJhbSBjb2RlcG9pbnQgVGhlIFVuaWNvZGUgY29kZXBvaW50LlxuICogQHBhcmFtIGVtaXQgICAgICBGdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBVVEYtOCBieXRlIHRoYXQgcmVwcmVzZW50cyB0aGUgY29kZXBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXBvaW50VG9VVEY4KGNvZGVwb2ludCwgZW1pdCkge1xuICAgIGlmIChjb2RlcG9pbnQgPD0gMHg3Zikge1xuICAgICAgICBlbWl0KGNvZGVwb2ludCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4N2ZmKSB7XG4gICAgICAgIGVtaXQoMHhjMCB8IChjb2RlcG9pbnQgPj4gNikpO1xuICAgICAgICBlbWl0KDB4ODAgfCAoY29kZXBvaW50ICYgMHgzZikpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweGZmZmYpIHtcbiAgICAgICAgZW1pdCgweGUwIHwgKGNvZGVwb2ludCA+PiAxMikpO1xuICAgICAgICBlbWl0KDB4ODAgfCAoKGNvZGVwb2ludCA+PiA2KSAmIDB4M2YpKTtcbiAgICAgICAgZW1pdCgweDgwIHwgKGNvZGVwb2ludCAmIDB4M2YpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHgxMGZmZmYpIHtcbiAgICAgICAgZW1pdCgweGYwIHwgKGNvZGVwb2ludCA+PiAxOCkpO1xuICAgICAgICBlbWl0KDB4ODAgfCAoKGNvZGVwb2ludCA+PiAxMikgJiAweDNmKSk7XG4gICAgICAgIGVtaXQoMHg4MCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHgzZikpO1xuICAgICAgICBlbWl0KDB4ODAgfCAoY29kZXBvaW50ICYgMHgzZikpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIFVuaWNvZGUgY29kZXBvaW50OiAke2NvZGVwb2ludC50b1N0cmluZygxNil9YCk7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgSmF2YVNjcmlwdCBzdHJpbmcgdG8gYSBzZXF1ZW5jZSBvZiBVVEYtOCBieXRlcy5cbiAqXG4gKiBAcGFyYW0gc3RyICBUaGUgc3RyaW5nIHRvIGNvbnZlcnQgdG8gVVRGLTguXG4gKiBAcGFyYW0gZW1pdCBGdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBVVEYtOCBieXRlIG9mIHRoZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb1VURjgoc3RyLCBlbWl0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgbGV0IGNvZGVwb2ludCA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoY29kZXBvaW50ID4gMHhkN2ZmICYmIGNvZGVwb2ludCA8PSAweGRiZmYpIHtcbiAgICAgICAgICAgIC8vIG1vc3QgVVRGLTE2IGNvZGVwb2ludHMgYXJlIFVuaWNvZGUgY29kZXBvaW50cywgZXhjZXB0IHZhbHVlcyBpbiB0aGlzXG4gICAgICAgICAgICAvLyByYW5nZSB3aGVyZSB0aGUgbmV4dCBVVEYtMTYgY29kZXBvaW50IG5lZWRzIHRvIGJlIGNvbWJpbmVkIHdpdGggdGhlXG4gICAgICAgICAgICAvLyBjdXJyZW50IG9uZSB0byBnZXQgdGhlIFVuaWNvZGUgY29kZXBvaW50XG4gICAgICAgICAgICBjb25zdCBoaWdoU3Vycm9nYXRlID0gKChjb2RlcG9pbnQgLSAweGQ4MDApICogMHg0MDApICYgMHhmZmZmO1xuICAgICAgICAgICAgY29uc3QgbG93U3Vycm9nYXRlID0gKHN0ci5jaGFyQ29kZUF0KGkgKyAxKSAtIDB4ZGMwMCkgJiAweGZmZmY7XG4gICAgICAgICAgICBjb2RlcG9pbnQgPSAobG93U3Vycm9nYXRlIHwgaGlnaFN1cnJvZ2F0ZSkgKyAweDEwMDAwO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludFRvVVRGOChjb2RlcG9pbnQsIGVtaXQpO1xuICAgIH1cbn1cbi8qKlxuICogQ29udmVydHMgYSBVVEYtOCBieXRlIHRvIGEgVW5pY29kZSBjb2RlcG9pbnQuXG4gKlxuICogQHBhcmFtIGJ5dGUgIFRoZSBVVEYtOCBieXRlIG5leHQgaW4gdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHN0YXRlIFRoZSBzaGFyZWQgc3RhdGUgYmV0d2VlbiBjb25zZWN1dGl2ZSBVVEYtOCBieXRlcyBpbiB0aGVcbiAqICAgICAgICAgICAgICBzZXF1ZW5jZSwgYW4gb2JqZWN0IHdpdGggdGhlIHNoYXBlIGB7IHV0ZjhzZXE6IDAsIGNvZGVwb2ludDogMCB9YC5cbiAqIEBwYXJhbSBlbWl0ICBGdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBjb2RlcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGcm9tVVRGOChieXRlLCBzdGF0ZSwgZW1pdCkge1xuICAgIGlmIChzdGF0ZS51dGY4c2VxID09PSAwKSB7XG4gICAgICAgIGlmIChieXRlIDw9IDB4N2YpIHtcbiAgICAgICAgICAgIGVtaXQoYnl0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiAxIGxlYWRpbmcgYml0cyB1bnRpbCB5b3UgcmVhY2ggMFxuICAgICAgICBmb3IgKGxldCBsZWFkaW5nQml0ID0gMTsgbGVhZGluZ0JpdCA8IDY7IGxlYWRpbmdCaXQgKz0gMSkge1xuICAgICAgICAgICAgaWYgKCgoYnl0ZSA+PiAoNyAtIGxlYWRpbmdCaXQpKSAmIDEpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudXRmOHNlcSA9IGxlYWRpbmdCaXQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLnV0ZjhzZXEgPT09IDIpIHtcbiAgICAgICAgICAgIHN0YXRlLmNvZGVwb2ludCA9IGJ5dGUgJiAzMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS51dGY4c2VxID09PSAzKSB7XG4gICAgICAgICAgICBzdGF0ZS5jb2RlcG9pbnQgPSBieXRlICYgMTU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUudXRmOHNlcSA9PT0gNCkge1xuICAgICAgICAgICAgc3RhdGUuY29kZXBvaW50ID0gYnl0ZSAmIDc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgVVRGLTggc2VxdWVuY2UnKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS51dGY4c2VxIC09IDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKHN0YXRlLnV0ZjhzZXEgPiAwKSB7XG4gICAgICAgIGlmIChieXRlIDw9IDB4N2YpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBVVEYtOCBzZXF1ZW5jZScpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmNvZGVwb2ludCA9IChzdGF0ZS5jb2RlcG9pbnQgPDwgNikgfCAoYnl0ZSAmIDYzKTtcbiAgICAgICAgc3RhdGUudXRmOHNlcSAtPSAxO1xuICAgICAgICBpZiAoc3RhdGUudXRmOHNlcSA9PT0gMCkge1xuICAgICAgICAgICAgZW1pdChzdGF0ZS5jb2RlcG9pbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHRvIGNvbnZlcnQgZGlmZmVyZW50IHR5cGVzIG9mIHN0cmluZ3MgdG8gVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0VXJsVG9VaW50OEFycmF5KHN0cikge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IHN0YXRlID0geyBxdWV1ZTogMCwgcXVldWVkQml0czogMCB9O1xuICAgIGNvbnN0IG9uQnl0ZSA9IChieXRlKSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGJ5dGUpO1xuICAgIH07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYnl0ZUZyb21CYXNlNjRVUkwoc3RyLmNoYXJDb2RlQXQoaSksIHN0YXRlLCBvbkJ5dGUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVzdWx0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb1VpbnQ4QXJyYXkoc3RyKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgc3RyaW5nVG9VVEY4KHN0ciwgKGJ5dGUpID0+IHJlc3VsdC5wdXNoKGJ5dGUpKTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocmVzdWx0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBieXRlc1RvQmFzZTY0VVJMKGJ5dGVzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3Qgc3RhdGUgPSB7IHF1ZXVlOiAwLCBxdWV1ZWRCaXRzOiAwIH07XG4gICAgY29uc3Qgb25DaGFyID0gKGNoYXIpID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2goY2hhcik7XG4gICAgfTtcbiAgICBieXRlcy5mb3JFYWNoKChieXRlKSA9PiBieXRlVG9CYXNlNjRVUkwoYnl0ZSwgc3RhdGUsIG9uQ2hhcikpO1xuICAgIC8vIGFsd2F5cyBjYWxsIHdpdGggYG51bGxgIGFmdGVyIHByb2Nlc3NpbmcgYWxsIGJ5dGVzXG4gICAgYnl0ZVRvQmFzZTY0VVJMKG51bGwsIHN0YXRlLCBvbkNoYXIpO1xuICAgIHJldHVybiByZXN1bHQuam9pbignJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlNjR1cmwuanMubWFwIl0sIm5hbWVzIjpbIlRPX0JBU0U2NFVSTCIsInNwbGl0IiwiSUdOT1JFX0JBU0U2NFVSTCIsIkZST01fQkFTRTY0VVJMIiwiY2hhck1hcCIsIkFycmF5IiwiaSIsImxlbmd0aCIsImNoYXJDb2RlQXQiLCJieXRlVG9CYXNlNjRVUkwiLCJieXRlIiwic3RhdGUiLCJlbWl0IiwicXVldWUiLCJxdWV1ZWRCaXRzIiwicG9zIiwiYnl0ZUZyb21CYXNlNjRVUkwiLCJjaGFyQ29kZSIsImJpdHMiLCJFcnJvciIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsInN0cmluZ1RvQmFzZTY0VVJMIiwic3RyIiwiYmFzZTY0IiwiZW1pdHRlciIsImNoYXIiLCJwdXNoIiwic3RyaW5nVG9VVEY4Iiwiam9pbiIsInN0cmluZ0Zyb21CYXNlNjRVUkwiLCJjb252IiwidXRmOEVtaXQiLCJjb2RlcG9pbnQiLCJmcm9tQ29kZVBvaW50IiwidXRmOFN0YXRlIiwidXRmOHNlcSIsImI2NFN0YXRlIiwiYnl0ZUVtaXQiLCJzdHJpbmdGcm9tVVRGOCIsImNvZGVwb2ludFRvVVRGOCIsInRvU3RyaW5nIiwiaGlnaFN1cnJvZ2F0ZSIsImxvd1N1cnJvZ2F0ZSIsImxlYWRpbmdCaXQiLCJiYXNlNjRVcmxUb1VpbnQ4QXJyYXkiLCJyZXN1bHQiLCJvbkJ5dGUiLCJVaW50OEFycmF5Iiwic3RyaW5nVG9VaW50OEFycmF5IiwiYnl0ZXNUb0Jhc2U2NFVSTCIsImJ5dGVzIiwib25DaGFyIiwiZm9yRWFjaCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/constants.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ API_VERSIONS: () => (/* binding */ API_VERSIONS),\n/* harmony export */ API_VERSION_HEADER_NAME: () => (/* binding */ API_VERSION_HEADER_NAME),\n/* harmony export */ AUDIENCE: () => (/* binding */ AUDIENCE),\n/* harmony export */ AUTO_REFRESH_TICK_DURATION_MS: () => (/* binding */ AUTO_REFRESH_TICK_DURATION_MS),\n/* harmony export */ AUTO_REFRESH_TICK_THRESHOLD: () => (/* binding */ AUTO_REFRESH_TICK_THRESHOLD),\n/* harmony export */ BASE64URL_REGEX: () => (/* binding */ BASE64URL_REGEX),\n/* harmony export */ DEFAULT_HEADERS: () => (/* binding */ DEFAULT_HEADERS),\n/* harmony export */ EXPIRY_MARGIN_MS: () => (/* binding */ EXPIRY_MARGIN_MS),\n/* harmony export */ GOTRUE_URL: () => (/* binding */ GOTRUE_URL),\n/* harmony export */ JWKS_TTL: () => (/* binding */ JWKS_TTL),\n/* harmony export */ NETWORK_FAILURE: () => (/* binding */ NETWORK_FAILURE),\n/* harmony export */ STORAGE_KEY: () => (/* binding */ STORAGE_KEY)\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./version */ \"(action-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/${_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvY29uc3RhbnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBb0M7QUFDcEMsa0VBQWtFLEdBQzNELE1BQU1DLGdDQUFnQyxLQUFLLEtBQUs7QUFDdkQ7eUZBQ3lGLEdBQ2xGLE1BQU1DLDhCQUE4QixFQUFFO0FBQzdDOztDQUVDLEdBQ00sTUFBTUMsbUJBQW1CRCw4QkFBOEJELDhCQUE4QjtBQUNyRixNQUFNRyxhQUFhLHdCQUF3QjtBQUMzQyxNQUFNQyxjQUFjLHNCQUFzQjtBQUMxQyxNQUFNQyxXQUFXLEdBQUc7QUFDcEIsTUFBTUMsa0JBQWtCO0lBQUUsaUJBQWlCLENBQUMsVUFBVSxFQUFFUCw2Q0FBT0EsQ0FBQyxDQUFDO0FBQUMsRUFBRTtBQUNwRSxNQUFNUSxrQkFBa0I7SUFDM0JDLGFBQWE7SUFDYkMsZ0JBQWdCO0FBQ3BCLEVBQUU7QUFDSyxNQUFNQywwQkFBMEIseUJBQXlCO0FBQ3pELE1BQU1DLGVBQWU7SUFDeEIsY0FBYztRQUNWQyxXQUFXQyxLQUFLQyxLQUFLLENBQUM7UUFDdEJDLE1BQU07SUFDVjtBQUNKLEVBQUU7QUFDSyxNQUFNQyxrQkFBa0IsdURBQXVEO0FBQy9FLE1BQU1DLFdBQVcsS0FBSyxLQUFLLEtBQUssQ0FBQyxhQUFhO0NBQ3JELHFDQUFxQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvY29uc3RhbnRzLmpzP2YwNDgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG4vKiogQ3VycmVudCBzZXNzaW9uIHdpbGwgYmUgY2hlY2tlZCBmb3IgcmVmcmVzaCBhdCB0aGlzIGludGVydmFsLiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9fUkVGUkVTSF9USUNLX0RVUkFUSU9OX01TID0gMzAgKiAxMDAwO1xuLyoqXG4gKiBBIHRva2VuIHJlZnJlc2ggd2lsbCBiZSBhdHRlbXB0ZWQgdGhpcyBtYW55IHRpY2tzIGJlZm9yZSB0aGUgY3VycmVudCBzZXNzaW9uIGV4cGlyZXMuICovXG5leHBvcnQgY29uc3QgQVVUT19SRUZSRVNIX1RJQ0tfVEhSRVNIT0xEID0gMztcbi8qXG4gKiBFYXJsaWVzdCB0aW1lIGJlZm9yZSBhbiBhY2Nlc3MgdG9rZW4gZXhwaXJlcyB0aGF0IHRoZSBzZXNzaW9uIHNob3VsZCBiZSByZWZyZXNoZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBFWFBJUllfTUFSR0lOX01TID0gQVVUT19SRUZSRVNIX1RJQ0tfVEhSRVNIT0xEICogQVVUT19SRUZSRVNIX1RJQ0tfRFVSQVRJT05fTVM7XG5leHBvcnQgY29uc3QgR09UUlVFX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0Ojk5OTknO1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfS0VZID0gJ3N1cGFiYXNlLmF1dGgudG9rZW4nO1xuZXhwb3J0IGNvbnN0IEFVRElFTkNFID0gJyc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9IRUFERVJTID0geyAnWC1DbGllbnQtSW5mbyc6IGBnb3RydWUtanMvJHt2ZXJzaW9ufWAgfTtcbmV4cG9ydCBjb25zdCBORVRXT1JLX0ZBSUxVUkUgPSB7XG4gICAgTUFYX1JFVFJJRVM6IDEwLFxuICAgIFJFVFJZX0lOVEVSVkFMOiAyLCAvLyBpbiBkZWNpc2Vjb25kc1xufTtcbmV4cG9ydCBjb25zdCBBUElfVkVSU0lPTl9IRUFERVJfTkFNRSA9ICdYLVN1cGFiYXNlLUFwaS1WZXJzaW9uJztcbmV4cG9ydCBjb25zdCBBUElfVkVSU0lPTlMgPSB7XG4gICAgJzIwMjQtMDEtMDEnOiB7XG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5wYXJzZSgnMjAyNC0wMS0wMVQwMDowMDowMC4wWicpLFxuICAgICAgICBuYW1lOiAnMjAyNC0wMS0wMScsXG4gICAgfSxcbn07XG5leHBvcnQgY29uc3QgQkFTRTY0VVJMX1JFR0VYID0gL14oW2EtejAtOV8tXXs0fSkqKCR8W2EtejAtOV8tXXszfSR8W2EtejAtOV8tXXsyfSQpJC9pO1xuZXhwb3J0IGNvbnN0IEpXS1NfVFRMID0gMTAgKiA2MCAqIDEwMDA7IC8vIDEwIG1pbnV0ZXNcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50cy5qcy5tYXAiXSwibmFtZXMiOlsidmVyc2lvbiIsIkFVVE9fUkVGUkVTSF9USUNLX0RVUkFUSU9OX01TIiwiQVVUT19SRUZSRVNIX1RJQ0tfVEhSRVNIT0xEIiwiRVhQSVJZX01BUkdJTl9NUyIsIkdPVFJVRV9VUkwiLCJTVE9SQUdFX0tFWSIsIkFVRElFTkNFIiwiREVGQVVMVF9IRUFERVJTIiwiTkVUV09SS19GQUlMVVJFIiwiTUFYX1JFVFJJRVMiLCJSRVRSWV9JTlRFUlZBTCIsIkFQSV9WRVJTSU9OX0hFQURFUl9OQU1FIiwiQVBJX1ZFUlNJT05TIiwidGltZXN0YW1wIiwiRGF0ZSIsInBhcnNlIiwibmFtZSIsIkJBU0U2NFVSTF9SRUdFWCIsIkpXS1NfVFRMIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/constants.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ API_VERSIONS: () => (/* binding */ API_VERSIONS),\n/* harmony export */ API_VERSION_HEADER_NAME: () => (/* binding */ API_VERSION_HEADER_NAME),\n/* harmony export */ AUDIENCE: () => (/* binding */ AUDIENCE),\n/* harmony export */ AUTO_REFRESH_TICK_DURATION_MS: () => (/* binding */ AUTO_REFRESH_TICK_DURATION_MS),\n/* harmony export */ AUTO_REFRESH_TICK_THRESHOLD: () => (/* binding */ AUTO_REFRESH_TICK_THRESHOLD),\n/* harmony export */ BASE64URL_REGEX: () => (/* binding */ BASE64URL_REGEX),\n/* harmony export */ DEFAULT_HEADERS: () => (/* binding */ DEFAULT_HEADERS),\n/* harmony export */ EXPIRY_MARGIN_MS: () => (/* binding */ EXPIRY_MARGIN_MS),\n/* harmony export */ GOTRUE_URL: () => (/* binding */ GOTRUE_URL),\n/* harmony export */ JWKS_TTL: () => (/* binding */ JWKS_TTL),\n/* harmony export */ NETWORK_FAILURE: () => (/* binding */ NETWORK_FAILURE),\n/* harmony export */ STORAGE_KEY: () => (/* binding */ STORAGE_KEY)\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./version */ \"(rsc)/./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/${_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2NvbnN0YW50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQW9DO0FBQ3BDLGtFQUFrRSxHQUMzRCxNQUFNQyxnQ0FBZ0MsS0FBSyxLQUFLO0FBQ3ZEO3lGQUN5RixHQUNsRixNQUFNQyw4QkFBOEIsRUFBRTtBQUM3Qzs7Q0FFQyxHQUNNLE1BQU1DLG1CQUFtQkQsOEJBQThCRCw4QkFBOEI7QUFDckYsTUFBTUcsYUFBYSx3QkFBd0I7QUFDM0MsTUFBTUMsY0FBYyxzQkFBc0I7QUFDMUMsTUFBTUMsV0FBVyxHQUFHO0FBQ3BCLE1BQU1DLGtCQUFrQjtJQUFFLGlCQUFpQixDQUFDLFVBQVUsRUFBRVAsNkNBQU9BLENBQUMsQ0FBQztBQUFDLEVBQUU7QUFDcEUsTUFBTVEsa0JBQWtCO0lBQzNCQyxhQUFhO0lBQ2JDLGdCQUFnQjtBQUNwQixFQUFFO0FBQ0ssTUFBTUMsMEJBQTBCLHlCQUF5QjtBQUN6RCxNQUFNQyxlQUFlO0lBQ3hCLGNBQWM7UUFDVkMsV0FBV0MsS0FBS0MsS0FBSyxDQUFDO1FBQ3RCQyxNQUFNO0lBQ1Y7QUFDSixFQUFFO0FBQ0ssTUFBTUMsa0JBQWtCLHVEQUF1RDtBQUMvRSxNQUFNQyxXQUFXLEtBQUssS0FBSyxLQUFLLENBQUMsYUFBYTtDQUNyRCxxQ0FBcUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2NvbnN0YW50cy5qcz9mMDQ4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24nO1xuLyoqIEN1cnJlbnQgc2Vzc2lvbiB3aWxsIGJlIGNoZWNrZWQgZm9yIHJlZnJlc2ggYXQgdGhpcyBpbnRlcnZhbC4gKi9cbmV4cG9ydCBjb25zdCBBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyA9IDMwICogMTAwMDtcbi8qKlxuICogQSB0b2tlbiByZWZyZXNoIHdpbGwgYmUgYXR0ZW1wdGVkIHRoaXMgbWFueSB0aWNrcyBiZWZvcmUgdGhlIGN1cnJlbnQgc2Vzc2lvbiBleHBpcmVzLiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9fUkVGUkVTSF9USUNLX1RIUkVTSE9MRCA9IDM7XG4vKlxuICogRWFybGllc3QgdGltZSBiZWZvcmUgYW4gYWNjZXNzIHRva2VuIGV4cGlyZXMgdGhhdCB0aGUgc2Vzc2lvbiBzaG91bGQgYmUgcmVmcmVzaGVkLlxuICovXG5leHBvcnQgY29uc3QgRVhQSVJZX01BUkdJTl9NUyA9IEFVVE9fUkVGUkVTSF9USUNLX1RIUkVTSE9MRCAqIEFVVE9fUkVGUkVTSF9USUNLX0RVUkFUSU9OX01TO1xuZXhwb3J0IGNvbnN0IEdPVFJVRV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdDo5OTk5JztcbmV4cG9ydCBjb25zdCBTVE9SQUdFX0tFWSA9ICdzdXBhYmFzZS5hdXRoLnRva2VuJztcbmV4cG9ydCBjb25zdCBBVURJRU5DRSA9ICcnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSEVBREVSUyA9IHsgJ1gtQ2xpZW50LUluZm8nOiBgZ290cnVlLWpzLyR7dmVyc2lvbn1gIH07XG5leHBvcnQgY29uc3QgTkVUV09SS19GQUlMVVJFID0ge1xuICAgIE1BWF9SRVRSSUVTOiAxMCxcbiAgICBSRVRSWV9JTlRFUlZBTDogMiwgLy8gaW4gZGVjaXNlY29uZHNcbn07XG5leHBvcnQgY29uc3QgQVBJX1ZFUlNJT05fSEVBREVSX05BTUUgPSAnWC1TdXBhYmFzZS1BcGktVmVyc2lvbic7XG5leHBvcnQgY29uc3QgQVBJX1ZFUlNJT05TID0ge1xuICAgICcyMDI0LTAxLTAxJzoge1xuICAgICAgICB0aW1lc3RhbXA6IERhdGUucGFyc2UoJzIwMjQtMDEtMDFUMDA6MDA6MDAuMFonKSxcbiAgICAgICAgbmFtZTogJzIwMjQtMDEtMDEnLFxuICAgIH0sXG59O1xuZXhwb3J0IGNvbnN0IEJBU0U2NFVSTF9SRUdFWCA9IC9eKFthLXowLTlfLV17NH0pKigkfFthLXowLTlfLV17M30kfFthLXowLTlfLV17Mn0kKSQvaTtcbmV4cG9ydCBjb25zdCBKV0tTX1RUTCA9IDEwICogNjAgKiAxMDAwOyAvLyAxMCBtaW51dGVzXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIl0sIm5hbWVzIjpbInZlcnNpb24iLCJBVVRPX1JFRlJFU0hfVElDS19EVVJBVElPTl9NUyIsIkFVVE9fUkVGUkVTSF9USUNLX1RIUkVTSE9MRCIsIkVYUElSWV9NQVJHSU5fTVMiLCJHT1RSVUVfVVJMIiwiU1RPUkFHRV9LRVkiLCJBVURJRU5DRSIsIkRFRkFVTFRfSEVBREVSUyIsIk5FVFdPUktfRkFJTFVSRSIsIk1BWF9SRVRSSUVTIiwiUkVUUllfSU5URVJWQUwiLCJBUElfVkVSU0lPTl9IRUFERVJfTkFNRSIsIkFQSV9WRVJTSU9OUyIsInRpbWVzdGFtcCIsIkRhdGUiLCJwYXJzZSIsIm5hbWUiLCJCQVNFNjRVUkxfUkVHRVgiLCJKV0tTX1RUTCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/errors.js ***!
|
||
\******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthApiError: () => (/* binding */ AuthApiError),\n/* harmony export */ AuthError: () => (/* binding */ AuthError),\n/* harmony export */ AuthImplicitGrantRedirectError: () => (/* binding */ AuthImplicitGrantRedirectError),\n/* harmony export */ AuthInvalidCredentialsError: () => (/* binding */ AuthInvalidCredentialsError),\n/* harmony export */ AuthInvalidJwtError: () => (/* binding */ AuthInvalidJwtError),\n/* harmony export */ AuthInvalidTokenResponseError: () => (/* binding */ AuthInvalidTokenResponseError),\n/* harmony export */ AuthPKCECodeVerifierMissingError: () => (/* binding */ AuthPKCECodeVerifierMissingError),\n/* harmony export */ AuthPKCEGrantCodeExchangeError: () => (/* binding */ AuthPKCEGrantCodeExchangeError),\n/* harmony export */ AuthRetryableFetchError: () => (/* binding */ AuthRetryableFetchError),\n/* harmony export */ AuthSessionMissingError: () => (/* binding */ AuthSessionMissingError),\n/* harmony export */ AuthUnknownError: () => (/* binding */ AuthUnknownError),\n/* harmony export */ AuthWeakPasswordError: () => (/* binding */ AuthWeakPasswordError),\n/* harmony export */ CustomAuthError: () => (/* binding */ CustomAuthError),\n/* harmony export */ isAuthApiError: () => (/* binding */ isAuthApiError),\n/* harmony export */ isAuthError: () => (/* binding */ isAuthError),\n/* harmony export */ isAuthImplicitGrantRedirectError: () => (/* binding */ isAuthImplicitGrantRedirectError),\n/* harmony export */ isAuthPKCECodeVerifierMissingError: () => (/* binding */ isAuthPKCECodeVerifierMissingError),\n/* harmony export */ isAuthRetryableFetchError: () => (/* binding */ isAuthRetryableFetchError),\n/* harmony export */ isAuthSessionMissingError: () => (/* binding */ isAuthSessionMissingError),\n/* harmony export */ isAuthWeakPasswordError: () => (/* 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 constructor(message, details = null){\n super(message, \"AuthImplicitGrantRedirectError\", 500, undefined);\n this.details = null;\n this.details = details;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n details: this.details\n };\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 constructor(message, details = null){\n super(message, \"AuthPKCEGrantCodeExchangeError\", 500, undefined);\n this.details = null;\n this.details = details;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n details: this.details\n };\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvZXJyb3JzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTUEsa0JBQWtCQztJQUMzQkMsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksQ0FBRTtRQUMvQixLQUFLLENBQUNGO1FBQ04sSUFBSSxDQUFDRyxhQUFhLEdBQUc7UUFDckIsSUFBSSxDQUFDQyxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNILE1BQU0sR0FBR0E7UUFDZCxJQUFJLENBQUNDLElBQUksR0FBR0E7SUFDaEI7QUFDSjtBQUNPLFNBQVNHLFlBQVlDLEtBQUs7SUFDN0IsT0FBTyxPQUFPQSxVQUFVLFlBQVlBLFVBQVUsUUFBUSxtQkFBbUJBO0FBQzdFO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTUMscUJBQXFCVjtJQUM5QkUsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksQ0FBRTtRQUMvQixLQUFLLENBQUNGLFNBQVNDLFFBQVFDO1FBQ3ZCLElBQUksQ0FBQ0UsSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDSCxNQUFNLEdBQUdBO1FBQ2QsSUFBSSxDQUFDQyxJQUFJLEdBQUdBO0lBQ2hCO0FBQ0o7QUFDTyxTQUFTTSxlQUFlRixLQUFLO0lBQ2hDLE9BQU9ELFlBQVlDLFVBQVVBLE1BQU1GLElBQUksS0FBSztBQUNoRDtBQUNBOzs7Ozs7Ozs7Ozs7O0NBYUMsR0FDTSxNQUFNSyx5QkFBeUJaO0lBQ2xDRSxZQUFZQyxPQUFPLEVBQUVVLGFBQWEsQ0FBRTtRQUNoQyxLQUFLLENBQUNWO1FBQ04sSUFBSSxDQUFDSSxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNNLGFBQWEsR0FBR0E7SUFDekI7QUFDSjtBQUNBOzs7Ozs7Ozs7Q0FTQyxHQUNNLE1BQU1DLHdCQUF3QmQ7SUFDakNFLFlBQVlD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LE9BQU9ELFlBQVlDLFVBQVVBLE1BQU1GLElBQUksS0FBSztBQUNoRDtBQUNBOzs7Ozs7Ozs7Q0FTQyxHQUNNLE1BQU15Qiw0QkFBNEJsQjtJQUNyQ1osWUFBWUMsT0FBTyxDQUFFO1FBQ2pCLEtBQUssQ0FBQ0EsU0FBUyx1QkFBdUIsS0FBSztJQUMvQztBQUNKLEVBQ0Esa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi9lcnJvcnMuanM/ZGRlZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJhc2UgZXJyb3IgdGhyb3duIGJ5IFN1cGFiYXNlIEF1dGggaGVscGVycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoRXJyb3IoJ1VuZXhwZWN0ZWQgYXV0aCBlcnJvcicsIDUwMCwgJ3VuZXhwZWN0ZWQnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCBjb2RlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLl9faXNBdXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICB0aGlzLm5hbWUgPSAnQXV0aEVycm9yJztcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aEVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ19faXNBdXRoRXJyb3InIGluIGVycm9yO1xufVxuLyoqXG4gKiBFcnJvciByZXR1cm5lZCBkaXJlY3RseSBmcm9tIHRoZSBHb1RydWUgUkVTVCBBUEkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoQXBpRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aEFwaUVycm9yKCdJbnZhbGlkIGNyZWRlbnRpYWxzJywgNDAwLCAnaW52YWxpZF9jcmVkZW50aWFscycpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhBcGlFcnJvciBleHRlbmRzIEF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCBjb2RlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIHN0YXR1cywgY29kZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdBdXRoQXBpRXJyb3InO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoQXBpRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gaXNBdXRoRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBdXRoQXBpRXJyb3InO1xufVxuLyoqXG4gKiBXcmFwcyBub24tc3RhbmRhcmQgZXJyb3JzIHNvIGNhbGxlcnMgY2FuIGluc3BlY3QgdGhlIHJvb3QgY2F1c2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoVW5rbm93bkVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdHJ5IHtcbiAqICAgYXdhaXQgc29tZUF1dGhDYWxsKClcbiAqIH0gY2F0Y2ggKGVycikge1xuICogICB0aHJvdyBuZXcgQXV0aFVua25vd25FcnJvcignQXV0aCBmYWlsZWQnLCBlcnIpXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhVbmtub3duRXJyb3IgZXh0ZW5kcyBBdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIG9yaWdpbmFsRXJyb3IpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdBdXRoVW5rbm93bkVycm9yJztcbiAgICAgICAgdGhpcy5vcmlnaW5hbEVycm9yID0gb3JpZ2luYWxFcnJvcjtcbiAgICB9XG59XG4vKipcbiAqIEZsZXhpYmxlIGVycm9yIGNsYXNzIHVzZWQgdG8gY3JlYXRlIG5hbWVkIGF1dGggZXJyb3JzIGF0IHJ1bnRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBDdXN0b21BdXRoRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQ3VzdG9tQXV0aEVycm9yKCdNeSBjdXN0b20gYXV0aCBlcnJvcicsICdNeUF1dGhFcnJvcicsIDQwMCwgJ2N1c3RvbV9jb2RlJylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ3VzdG9tQXV0aEVycm9yIGV4dGVuZHMgQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBuYW1lLCBzdGF0dXMsIGNvZGUpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgc3RhdHVzLCBjb2RlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gcmVxdWlyZXMgYSBzZXNzaW9uIGJ1dCBub25lIGlzIHByZXNlbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yIGV4dGVuZHMgQ3VzdG9tQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ0F1dGggc2Vzc2lvbiBtaXNzaW5nIScsICdBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcicsIDQwMCwgdW5kZWZpbmVkKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcihlcnJvcikge1xuICAgIHJldHVybiBpc0F1dGhFcnJvcihlcnJvcikgJiYgZXJyb3IubmFtZSA9PT0gJ0F1dGhTZXNzaW9uTWlzc2luZ0Vycm9yJztcbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIHRva2VuIHJlc3BvbnNlIGlzIG1hbGZvcm1lZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhJbnZhbGlkVG9rZW5SZXNwb25zZUVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhJbnZhbGlkVG9rZW5SZXNwb25zZUVycm9yKClcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignQXV0aCBzZXNzaW9uIG9yIHVzZXIgbWlzc2luZycsICdBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvcicsIDUwMCwgdW5kZWZpbmVkKTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGVtYWlsL3Bhc3N3b3JkIGNyZWRlbnRpYWxzIGFyZSBpbnZhbGlkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aEludmFsaWRDcmVkZW50aWFsc0Vycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvcignRW1haWwgb3IgcGFzc3dvcmQgaXMgaW5jb3JyZWN0JylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aEludmFsaWRDcmVkZW50aWFsc0Vycm9yIGV4dGVuZHMgQ3VzdG9tQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsICdBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3InLCA0MDAsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBpbXBsaWNpdCBncmFudCByZWRpcmVjdHMgY29udGFpbiBhbiBlcnJvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IoJ09BdXRoIHJlZGlyZWN0IGZhaWxlZCcsIHtcbiAqICAgZXJyb3I6ICdhY2Nlc3NfZGVuaWVkJyxcbiAqICAgY29kZTogJ29hdXRoX2Vycm9yJyxcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgZGV0YWlscyA9IG51bGwpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgJ0F1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvcicsIDUwMCwgdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZGV0YWlscyxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gaXNBdXRoRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3InO1xufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gZHVyaW5nIFBLQ0UgY29kZSBleGNoYW5nZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aFBLQ0VHcmFudENvZGVFeGNoYW5nZUVycm9yKCdQS0NFIGV4Y2hhbmdlIGZhaWxlZCcpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgZGV0YWlscyA9IG51bGwpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgJ0F1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvcicsIDUwMCwgdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZGV0YWlscyxcbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSBQS0NFIGNvZGUgdmVyaWZpZXIgaXMgbm90IGZvdW5kIGluIHN0b3JhZ2UuXG4gKiBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gdGhlIGF1dGggZmxvdyB3YXMgaW5pdGlhdGVkIGluIGEgZGlmZmVyZW50XG4gKiBicm93c2VyLCBkZXZpY2UsIG9yIHRoZSBzdG9yYWdlIHdhcyBjbGVhcmVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3IoKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdQS0NFIGNvZGUgdmVyaWZpZXIgbm90IGZvdW5kIGluIHN0b3JhZ2UuICcgK1xuICAgICAgICAgICAgJ1RoaXMgY2FuIGhhcHBlbiBpZiB0aGUgYXV0aCBmbG93IHdhcyBpbml0aWF0ZWQgaW4gYSBkaWZmZXJlbnQgYnJvd3NlciBvciBkZXZpY2UsICcgK1xuICAgICAgICAgICAgJ29yIGlmIHRoZSBzdG9yYWdlIHdhcyBjbGVhcmVkLiBGb3IgU1NSIGZyYW1ld29ya3MgKE5leHQuanMsIFN2ZWx0ZUtpdCwgZXRjLiksICcgK1xuICAgICAgICAgICAgJ3VzZSBAc3VwYWJhc2Uvc3NyIG9uIGJvdGggdGhlIHNlcnZlciBhbmQgY2xpZW50IHRvIHN0b3JlIHRoZSBjb2RlIHZlcmlmaWVyIGluIGNvb2tpZXMuJywgJ0F1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yJywgNDAwLCAncGtjZV9jb2RlX3ZlcmlmaWVyX25vdF9mb3VuZCcpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGlzQXV0aEVycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3InO1xufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhIHRyYW5zaWVudCBmZXRjaCBpc3N1ZSBvY2N1cnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvcignU2VydmljZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZScsIDUwMylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCAnQXV0aFJldHJ5YWJsZUZldGNoRXJyb3InLCBzdGF0dXMsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gaXNBdXRoRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvcic7XG59XG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIG9uIGNlcnRhaW4gbWV0aG9kcyB3aGVuIHRoZSBwYXNzd29yZCB1c2VkIGlzIGRlZW1lZFxuICogd2Vhay4gSW5zcGVjdCB0aGUgcmVhc29ucyB0byBpZGVudGlmeSB3aGF0IHBhc3N3b3JkIHN0cmVuZ3RoIHJ1bGVzIGFyZVxuICogaW5hZGVxdWF0ZS5cbiAqL1xuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhIHN1cHBsaWVkIHBhc3N3b3JkIGlzIGNvbnNpZGVyZWQgd2Vhay5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhXZWFrUGFzc3dvcmRFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoV2Vha1Bhc3N3b3JkRXJyb3IoJ1Bhc3N3b3JkIHRvbyBzaG9ydCcsIDQwMCwgWydtaW5fbGVuZ3RoJ10pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhXZWFrUGFzc3dvcmRFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCByZWFzb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsICdBdXRoV2Vha1Bhc3N3b3JkRXJyb3InLCBzdGF0dXMsICd3ZWFrX3Bhc3N3b3JkJyk7XG4gICAgICAgIHRoaXMucmVhc29ucyA9IHJlYXNvbnM7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aFdlYWtQYXNzd29yZEVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGlzQXV0aEVycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQXV0aFdlYWtQYXNzd29yZEVycm9yJztcbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSBKV1QgY2Fubm90IGJlIHZlcmlmaWVkIG9yIHBhcnNlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhJbnZhbGlkSnd0RXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aEludmFsaWRKd3RFcnJvcignVG9rZW4gc2lnbmF0dXJlIGlzIGludmFsaWQnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoSW52YWxpZEp3dEVycm9yIGV4dGVuZHMgQ3VzdG9tQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsICdBdXRoSW52YWxpZEp3dEVycm9yJywgNDAwLCAnaW52YWxpZF9qd3QnKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIl0sIm5hbWVzIjpbIkF1dGhFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJtZXNzYWdlIiwic3RhdHVzIiwiY29kZSIsIl9faXNBdXRoRXJyb3IiLCJuYW1lIiwiaXNBdXRoRXJyb3IiLCJlcnJvciIsIkF1dGhBcGlFcnJvciIsImlzQXV0aEFwaUVycm9yIiwiQXV0aFVua25vd25FcnJvciIsIm9yaWdpbmFsRXJyb3IiLCJDdXN0b21BdXRoRXJyb3IiLCJBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvciIsInVuZGVmaW5lZCIsImlzQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IiLCJBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvciIsIkF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvciIsIkF1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciIsImRldGFpbHMiLCJ0b0pTT04iLCJpc0F1dGhJbXBsaWNpdEdyYW50UmVkaXJlY3RFcnJvciIsIkF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvciIsIkF1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yIiwiaXNBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvciIsIkF1dGhSZXRyeWFibGVGZXRjaEVycm9yIiwiaXNBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvciIsIkF1dGhXZWFrUGFzc3dvcmRFcnJvciIsInJlYXNvbnMiLCJpc0F1dGhXZWFrUGFzc3dvcmRFcnJvciIsIkF1dGhJbnZhbGlkSnd0RXJyb3IiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/errors.js ***!
|
||
\******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthApiError: () => (/* binding */ AuthApiError),\n/* harmony export */ AuthError: () => (/* binding */ AuthError),\n/* harmony export */ AuthImplicitGrantRedirectError: () => (/* binding */ AuthImplicitGrantRedirectError),\n/* harmony export */ AuthInvalidCredentialsError: () => (/* binding */ AuthInvalidCredentialsError),\n/* harmony export */ AuthInvalidJwtError: () => (/* binding */ AuthInvalidJwtError),\n/* harmony export */ AuthInvalidTokenResponseError: () => (/* binding */ AuthInvalidTokenResponseError),\n/* harmony export */ AuthPKCECodeVerifierMissingError: () => (/* binding */ AuthPKCECodeVerifierMissingError),\n/* harmony export */ AuthPKCEGrantCodeExchangeError: () => (/* binding */ AuthPKCEGrantCodeExchangeError),\n/* harmony export */ AuthRetryableFetchError: () => (/* binding */ AuthRetryableFetchError),\n/* harmony export */ AuthSessionMissingError: () => (/* binding */ AuthSessionMissingError),\n/* harmony export */ AuthUnknownError: () => (/* binding */ AuthUnknownError),\n/* harmony export */ AuthWeakPasswordError: () => (/* binding */ AuthWeakPasswordError),\n/* harmony export */ CustomAuthError: () => (/* binding */ CustomAuthError),\n/* harmony export */ isAuthApiError: () => (/* binding */ isAuthApiError),\n/* harmony export */ isAuthError: () => (/* binding */ isAuthError),\n/* harmony export */ isAuthImplicitGrantRedirectError: () => (/* binding */ isAuthImplicitGrantRedirectError),\n/* harmony export */ isAuthPKCECodeVerifierMissingError: () => (/* binding */ isAuthPKCECodeVerifierMissingError),\n/* harmony export */ isAuthRetryableFetchError: () => (/* binding */ isAuthRetryableFetchError),\n/* harmony export */ isAuthSessionMissingError: () => (/* binding */ isAuthSessionMissingError),\n/* harmony export */ isAuthWeakPasswordError: () => (/* 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 constructor(message, details = null){\n super(message, \"AuthImplicitGrantRedirectError\", 500, undefined);\n this.details = null;\n this.details = details;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n details: this.details\n };\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 constructor(message, details = null){\n super(message, \"AuthPKCEGrantCodeExchangeError\", 500, undefined);\n this.details = null;\n this.details = details;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n details: this.details\n };\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2Vycm9ycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Q0FTQyxHQUNNLE1BQU1BLGtCQUFrQkM7SUFDM0JDLFlBQVlDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLENBQUU7UUFDL0IsS0FBSyxDQUFDRjtRQUNOLElBQUksQ0FBQ0csYUFBYSxHQUFHO1FBQ3JCLElBQUksQ0FBQ0MsSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDSCxNQUFNLEdBQUdBO1FBQ2QsSUFBSSxDQUFDQyxJQUFJLEdBQUdBO0lBQ2hCO0FBQ0o7QUFDTyxTQUFTRyxZQUFZQyxLQUFLO0lBQzdCLE9BQU8sT0FBT0EsVUFBVSxZQUFZQSxVQUFVLFFBQVEsbUJBQW1CQTtBQUM3RTtBQUNBOzs7Ozs7Ozs7Q0FTQyxHQUNNLE1BQU1DLHFCQUFxQlY7SUFDOUJFLFlBQVlDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLENBQUU7UUFDL0IsS0FBSyxDQUFDRixTQUFTQyxRQUFRQztRQUN2QixJQUFJLENBQUNFLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ0gsTUFBTSxHQUFHQTtRQUNkLElBQUksQ0FBQ0MsSUFBSSxHQUFHQTtJQUNoQjtBQUNKO0FBQ08sU0FBU00sZUFBZUYsS0FBSztJQUNoQyxPQUFPRCxZQUFZQyxVQUFVQSxNQUFNRixJQUFJLEtBQUs7QUFDaEQ7QUFDQTs7Ozs7Ozs7Ozs7OztDQWFDLEdBQ00sTUFBTUsseUJBQXlCWjtJQUNsQ0UsWUFBWUMsT0FBTyxFQUFFVSxhQUFhLENBQUU7UUFDaEMsS0FBSyxDQUFDVjtRQUNOLElBQUksQ0FBQ0ksSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDTSxhQUFhLEdBQUdBO0lBQ3pCO0FBQ0o7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNQyx3QkFBd0JkO0lBQ2pDRSxZQUFZQyxPQUFPLEVBQUVJ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QyxVQUFVQSxNQUFNRixJQUFJLEtBQUs7QUFDaEQ7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNeUIsNEJBQTRCbEI7SUFDckNaLFlBQVlDLE9BQU8sQ0FBRTtRQUNqQixLQUFLLENBQUNBLFNBQVMsdUJBQXVCLEtBQUs7SUFDL0M7QUFDSixFQUNBLGtDQUFrQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvZXJyb3JzLmpzP2RkZWQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXNlIGVycm9yIHRocm93biBieSBTdXBhYmFzZSBBdXRoIGhlbHBlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aEVycm9yKCdVbmV4cGVjdGVkIGF1dGggZXJyb3InLCA1MDAsICd1bmV4cGVjdGVkJylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cywgY29kZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5fX2lzQXV0aEVycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0F1dGhFcnJvcic7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dGhFcnJvcihlcnJvcikge1xuICAgIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdfX2lzQXV0aEVycm9yJyBpbiBlcnJvcjtcbn1cbi8qKlxuICogRXJyb3IgcmV0dXJuZWQgZGlyZWN0bHkgZnJvbSB0aGUgR29UcnVlIFJFU1QgQVBJLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aEFwaUVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhBcGlFcnJvcignSW52YWxpZCBjcmVkZW50aWFscycsIDQwMCwgJ2ludmFsaWRfY3JlZGVudGlhbHMnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoQXBpRXJyb3IgZXh0ZW5kcyBBdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cywgY29kZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBzdGF0dXMsIGNvZGUpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnQXV0aEFwaUVycm9yJztcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aEFwaUVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGlzQXV0aEVycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQXV0aEFwaUVycm9yJztcbn1cbi8qKlxuICogV3JhcHMgbm9uLXN0YW5kYXJkIGVycm9ycyBzbyBjYWxsZXJzIGNhbiBpbnNwZWN0IHRoZSByb290IGNhdXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aFVua25vd25FcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IHNvbWVBdXRoQ2FsbCgpXG4gKiB9IGNhdGNoIChlcnIpIHtcbiAqICAgdGhyb3cgbmV3IEF1dGhVbmtub3duRXJyb3IoJ0F1dGggZmFpbGVkJywgZXJyKVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoVW5rbm93bkVycm9yIGV4dGVuZHMgQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcmlnaW5hbEVycm9yKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnQXV0aFVua25vd25FcnJvcic7XG4gICAgICAgIHRoaXMub3JpZ2luYWxFcnJvciA9IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxufVxuLyoqXG4gKiBGbGV4aWJsZSBlcnJvciBjbGFzcyB1c2VkIHRvIGNyZWF0ZSBuYW1lZCBhdXRoIGVycm9ycyBhdCBydW50aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQ3VzdG9tQXV0aEVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEN1c3RvbUF1dGhFcnJvcignTXkgY3VzdG9tIGF1dGggZXJyb3InLCAnTXlBdXRoRXJyb3InLCA0MDAsICdjdXN0b21fY29kZScpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEN1c3RvbUF1dGhFcnJvciBleHRlbmRzIEF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgbmFtZSwgc3RhdHVzLCBjb2RlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIHN0YXR1cywgY29kZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIHJlcXVpcmVzIGEgc2Vzc2lvbiBidXQgbm9uZSBpcyBwcmVzZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdBdXRoIHNlc3Npb24gbWlzc2luZyEnLCAnQXV0aFNlc3Npb25NaXNzaW5nRXJyb3InLCA0MDAsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gaXNBdXRoRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcic7XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSB0b2tlbiByZXNwb25zZSBpcyBtYWxmb3JtZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoSW52YWxpZFRva2VuUmVzcG9uc2VFcnJvcigpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhJbnZhbGlkVG9rZW5SZXNwb25zZUVycm9yIGV4dGVuZHMgQ3VzdG9tQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ0F1dGggc2Vzc2lvbiBvciB1c2VyIG1pc3NpbmcnLCAnQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3InLCA1MDAsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBlbWFpbC9wYXNzd29yZCBjcmVkZW50aWFscyBhcmUgaW52YWxpZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3IoJ0VtYWlsIG9yIHBhc3N3b3JkIGlzIGluY29ycmVjdCcpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhJbnZhbGlkQ3JlZGVudGlhbHNFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCAnQXV0aEludmFsaWRDcmVkZW50aWFsc0Vycm9yJywgNDAwLCB1bmRlZmluZWQpO1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gaW1wbGljaXQgZ3JhbnQgcmVkaXJlY3RzIGNvbnRhaW4gYW4gZXJyb3IuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yKCdPQXV0aCByZWRpcmVjdCBmYWlsZWQnLCB7XG4gKiAgIGVycm9yOiAnYWNjZXNzX2RlbmllZCcsXG4gKiAgIGNvZGU6ICdvYXV0aF9lcnJvcicsXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGRldGFpbHMgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsICdBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3InLCA1MDAsIHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuZGV0YWlscyA9IG51bGw7XG4gICAgICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmRldGFpbHMsXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGlzQXV0aEVycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQXV0aEltcGxpY2l0R3JhbnRSZWRpcmVjdEVycm9yJztcbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIGR1cmluZyBQS0NFIGNvZGUgZXhjaGFuZ2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aFBLQ0VHcmFudENvZGVFeGNoYW5nZUVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhQS0NFR3JhbnRDb2RlRXhjaGFuZ2VFcnJvcignUEtDRSBleGNoYW5nZSBmYWlsZWQnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGRldGFpbHMgPSBudWxsKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsICdBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3InLCA1MDAsIHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuZGV0YWlscyA9IG51bGw7XG4gICAgICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgICAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmRldGFpbHMsXG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGUgUEtDRSBjb2RlIHZlcmlmaWVyIGlzIG5vdCBmb3VuZCBpbiBzdG9yYWdlLlxuICogVGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuIHRoZSBhdXRoIGZsb3cgd2FzIGluaXRpYXRlZCBpbiBhIGRpZmZlcmVudFxuICogYnJvd3NlciwgZGV2aWNlLCBvciB0aGUgc3RvcmFnZSB3YXMgY2xlYXJlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEF1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yKClcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignUEtDRSBjb2RlIHZlcmlmaWVyIG5vdCBmb3VuZCBpbiBzdG9yYWdlLiAnICtcbiAgICAgICAgICAgICdUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGF1dGggZmxvdyB3YXMgaW5pdGlhdGVkIGluIGEgZGlmZmVyZW50IGJyb3dzZXIgb3IgZGV2aWNlLCAnICtcbiAgICAgICAgICAgICdvciBpZiB0aGUgc3RvcmFnZSB3YXMgY2xlYXJlZC4gRm9yIFNTUiBmcmFtZXdvcmtzIChOZXh0LmpzLCBTdmVsdGVLaXQsIGV0Yy4pLCAnICtcbiAgICAgICAgICAgICd1c2UgQHN1cGFiYXNlL3NzciBvbiBib3RoIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCB0byBzdG9yZSB0aGUgY29kZSB2ZXJpZmllciBpbiBjb29raWVzLicsICdBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvcicsIDQwMCwgJ3BrY2VfY29kZV92ZXJpZmllcl9ub3RfZm91bmQnKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvcihlcnJvcikge1xuICAgIHJldHVybiBpc0F1dGhFcnJvcihlcnJvcikgJiYgZXJyb3IubmFtZSA9PT0gJ0F1dGhQS0NFQ29kZVZlcmlmaWVyTWlzc2luZ0Vycm9yJztcbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSB0cmFuc2llbnQgZmV0Y2ggaXNzdWUgb2NjdXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoJ1NlcnZpY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUnLCA1MDMpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhSZXRyeWFibGVGZXRjaEVycm9yIGV4dGVuZHMgQ3VzdG9tQXV0aEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBzdGF0dXMpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgJ0F1dGhSZXRyeWFibGVGZXRjaEVycm9yJywgc3RhdHVzLCB1bmRlZmluZWQpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dGhSZXRyeWFibGVGZXRjaEVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGlzQXV0aEVycm9yKGVycm9yKSAmJiBlcnJvci5uYW1lID09PSAnQXV0aFJldHJ5YWJsZUZldGNoRXJyb3InO1xufVxuLyoqXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biBvbiBjZXJ0YWluIG1ldGhvZHMgd2hlbiB0aGUgcGFzc3dvcmQgdXNlZCBpcyBkZWVtZWRcbiAqIHdlYWsuIEluc3BlY3QgdGhlIHJlYXNvbnMgdG8gaWRlbnRpZnkgd2hhdCBwYXNzd29yZCBzdHJlbmd0aCBydWxlcyBhcmVcbiAqIGluYWRlcXVhdGUuXG4gKi9cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSBzdXBwbGllZCBwYXNzd29yZCBpcyBjb25zaWRlcmVkIHdlYWsuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoV2Vha1Bhc3N3b3JkRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgQXV0aFdlYWtQYXNzd29yZEVycm9yKCdQYXNzd29yZCB0b28gc2hvcnQnLCA0MDAsIFsnbWluX2xlbmd0aCddKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoV2Vha1Bhc3N3b3JkRXJyb3IgZXh0ZW5kcyBDdXN0b21BdXRoRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cywgcmVhc29ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCAnQXV0aFdlYWtQYXNzd29yZEVycm9yJywgc3RhdHVzLCAnd2Vha19wYXNzd29yZCcpO1xuICAgICAgICB0aGlzLnJlYXNvbnMgPSByZWFzb25zO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dGhXZWFrUGFzc3dvcmRFcnJvcihlcnJvcikge1xuICAgIHJldHVybiBpc0F1dGhFcnJvcihlcnJvcikgJiYgZXJyb3IubmFtZSA9PT0gJ0F1dGhXZWFrUGFzc3dvcmRFcnJvcic7XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgSldUIGNhbm5vdCBiZSB2ZXJpZmllZCBvciBwYXJzZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBBdXRoSW52YWxpZEp3dEVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IEF1dGhJbnZhbGlkSnd0RXJyb3IoJ1Rva2VuIHNpZ25hdHVyZSBpcyBpbnZhbGlkJylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQXV0aEludmFsaWRKd3RFcnJvciBleHRlbmRzIEN1c3RvbUF1dGhFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCAnQXV0aEludmFsaWRKd3RFcnJvcicsIDQwMCwgJ2ludmFsaWRfand0Jyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCJdLCJuYW1lcyI6WyJBdXRoRXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwibWVzc2FnZSIsInN0YXR1cyIsImNvZGUiLCJfX2lzQXV0aEVycm9yIiwibmFtZSIsImlzQXV0aEVycm9yIiwiZXJyb3IiLCJBdXRoQXBpRXJyb3IiLCJpc0F1dGhBcGlFcnJvciIsIkF1dGhVbmtub3duRXJyb3IiLCJvcmlnaW5hbEVycm9yIiwiQ3VzdG9tQXV0aEVycm9yIiwiQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IiLCJ1bmRlZmluZWQiLCJpc0F1dGhTZXNzaW9uTWlzc2luZ0Vycm9yIiwiQXV0aEludmFsaWRUb2tlblJlc3BvbnNlRXJyb3IiLCJBdXRoSW52YWxpZENyZWRlbnRpYWxzRXJyb3IiLCJBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IiLCJkZXRhaWxzIiwidG9KU09OIiwiaXNBdXRoSW1wbGljaXRHcmFudFJlZGlyZWN0RXJyb3IiLCJBdXRoUEtDRUdyYW50Q29kZUV4Y2hhbmdlRXJyb3IiLCJBdXRoUEtDRUNvZGVWZXJpZmllck1pc3NpbmdFcnJvciIsImlzQXV0aFBLQ0VDb2RlVmVyaWZpZXJNaXNzaW5nRXJyb3IiLCJBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvciIsImlzQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IiLCJBdXRoV2Vha1Bhc3N3b3JkRXJyb3IiLCJyZWFzb25zIiwiaXNBdXRoV2Vha1Bhc3N3b3JkRXJyb3IiLCJBdXRoSW52YWxpZEp3dEVycm9yIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/fetch.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ _generateLinkResponse: () => (/* binding */ _generateLinkResponse),\n/* harmony export */ _noResolveJsonResponse: () => (/* binding */ _noResolveJsonResponse),\n/* harmony export */ _request: () => (/* binding */ _request),\n/* harmony export */ _sessionResponse: () => (/* binding */ _sessionResponse),\n/* harmony export */ _sessionResponsePassword: () => (/* binding */ _sessionResponsePassword),\n/* harmony export */ _ssoResponse: () => (/* binding */ _ssoResponse),\n/* harmony export */ _userResponse: () => (/* binding */ _userResponse),\n/* harmony export */ handleError: () => (/* binding */ handleError)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tslib */ \"(action-browser)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./errors */ \"(action-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 ${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvZmV0Y2guanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQStCO0FBQ3FDO0FBQ21CO0FBQzZDO0FBQ3BJLE1BQU1XLG1CQUFtQixDQUFDQyxNQUFRQSxJQUFJQyxHQUFHLElBQUlELElBQUlFLE9BQU8sSUFBSUYsSUFBSUcsaUJBQWlCLElBQUlILElBQUlJLEtBQUssSUFBSUMsS0FBS0MsU0FBUyxDQUFDTjtBQUNqSCxNQUFNTyxzQkFBc0I7SUFBQztJQUFLO0lBQUs7Q0FBSTtBQUNwQyxlQUFlQyxZQUFZSixLQUFLO0lBQ25DLElBQUlLO0lBQ0osSUFBSSxDQUFDakIsZ0VBQXNCQSxDQUFDWSxRQUFRO1FBQ2hDLE1BQU0sSUFBSVQsNERBQXVCQSxDQUFDSSxpQkFBaUJLLFFBQVE7SUFDL0Q7SUFDQSxJQUFJRyxvQkFBb0JHLFFBQVEsQ0FBQ04sTUFBTU8sTUFBTSxHQUFHO1FBQzVDLDZFQUE2RTtRQUM3RSxNQUFNLElBQUloQiw0REFBdUJBLENBQUNJLGlCQUFpQkssUUFBUUEsTUFBTU8sTUFBTTtJQUMzRTtJQUNBLElBQUlDO0lBQ0osSUFBSTtRQUNBQSxPQUFPLE1BQU1SLE1BQU1TLElBQUk7SUFDM0IsRUFDQSxPQUFPQyxHQUFHO1FBQ04sTUFBTSxJQUFJakIscURBQWdCQSxDQUFDRSxpQkFBaUJlLElBQUlBO0lBQ3BEO0lBQ0EsSUFBSUMsWUFBWUM7SUFDaEIsTUFBTUMscUJBQXFCeEIsaUVBQXVCQSxDQUFDVztJQUNuRCxJQUFJYSxzQkFDQUEsbUJBQW1CQyxPQUFPLE1BQU03QixvREFBWSxDQUFDLGFBQWEsQ0FBQzhCLFNBQVMsSUFDcEUsT0FBT1AsU0FBUyxZQUNoQkEsUUFDQSxPQUFPQSxLQUFLUSxJQUFJLEtBQUssVUFBVTtRQUMvQkwsWUFBWUgsS0FBS1EsSUFBSTtJQUN6QixPQUNLLElBQUksT0FBT1IsU0FBUyxZQUFZ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U3JELElBQUksQ0FBQ1UsYUFBYSxHQUFHVixLQUFLVSxhQUFhO0lBQ3BEO0lBQ0EsT0FBTzJDO0FBQ1g7QUFDTyxTQUFTQyxjQUFjdEQsSUFBSTtJQUM5QixJQUFJSDtJQUNKLE1BQU1zRCxPQUFPLENBQUN0RCxLQUFLRyxLQUFLbUQsSUFBSSxNQUFNLFFBQVF0RCxPQUFPLEtBQUssSUFBSUEsS0FBS0c7SUFDL0QsT0FBTztRQUFFQSxNQUFNO1lBQUVtRDtRQUFLO1FBQUczRCxPQUFPO0lBQUs7QUFDekM7QUFDTyxTQUFTK0QsYUFBYXZELElBQUk7SUFDN0IsT0FBTztRQUFFQTtRQUFNUixPQUFPO0lBQUs7QUFDL0I7QUFDTyxTQUFTZ0Usc0JBQXNCeEQsSUFBSTtJQUN0QyxNQUFNLEVBQUV5RCxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsWUFBWSxFQUFFQyxXQUFXLEVBQUVDLGlCQUFpQixFQUFFLEdBQUc3RCxNQUFNOEQsT0FBT3RGLDZDQUFNQSxDQUFDd0IsTUFBTTtRQUFDO1FBQWU7UUFBYTtRQUFnQjtRQUFlO0tBQW9CO0lBQzNMLE1BQU0rRCxhQUFhO1FBQ2ZOO1FBQ0FDO1FBQ0FDO1FBQ0FDO1FBQ0FDO0lBQ0o7SUFDQSxNQUFNVixPQUFPMUIsT0FBT0MsTUFBTSxDQUFDLENBQUMsR0FBR29DO0lBQy9CLE9BQU87UUFDSDlELE1BQU07WUFDRitEO1lBQ0FaO1FBQ0o7UUFDQTNELE9BQU87SUFDWDtBQUNKO0FBQ08sU0FBU3dFLHVCQUF1QmhFLElBQUk7SUFDdkMsT0FBT0E7QUFDWDtBQUNBOzs7O0NBSUMsR0FDRCxTQUFTZ0QsV0FBV2hELElBQUk7SUFDcEIsT0FBT0EsS0FBS2lFLFlBQVksSUFBSWpFLEtBQUtrRSxhQUFhLElBQUlsRSxLQUFLa0QsVUFBVTtBQUNyRSxFQUNBLGlDQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvZmV0Y2guanM/MDIzMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEFQSV9WRVJTSU9OUywgQVBJX1ZFUlNJT05fSEVBREVSX05BTUUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBleHBpcmVzQXQsIGxvb2tzTGlrZUZldGNoUmVzcG9uc2UsIHBhcnNlUmVzcG9uc2VBUElWZXJzaW9uIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IEF1dGhBcGlFcnJvciwgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IsIEF1dGhXZWFrUGFzc3dvcmRFcnJvciwgQXV0aFVua25vd25FcnJvciwgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IsIH0gZnJvbSAnLi9lcnJvcnMnO1xuY29uc3QgX2dldEVycm9yTWVzc2FnZSA9IChlcnIpID0+IGVyci5tc2cgfHwgZXJyLm1lc3NhZ2UgfHwgZXJyLmVycm9yX2Rlc2NyaXB0aW9uIHx8IGVyci5lcnJvciB8fCBKU09OLnN0cmluZ2lmeShlcnIpO1xuY29uc3QgTkVUV09SS19FUlJPUl9DT0RFUyA9IFs1MDIsIDUwMywgNTA0XTtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvcikge1xuICAgIHZhciBfYTtcbiAgICBpZiAoIWxvb2tzTGlrZUZldGNoUmVzcG9uc2UoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvcihfZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSwgMCk7XG4gICAgfVxuICAgIGlmIChORVRXT1JLX0VSUk9SX0NPREVTLmluY2x1ZGVzKGVycm9yLnN0YXR1cykpIHtcbiAgICAgICAgLy8gc3RhdHVzIGluIDUwMC4uLjU5OSByYW5nZSAtIHNlcnZlciBoYWQgYW4gZXJyb3IsIHJlcXVlc3QgbWlnaHQgYmUgcmV0cnllZC5cbiAgICAgICAgdGhyb3cgbmV3IEF1dGhSZXRyeWFibGVGZXRjaEVycm9yKF9nZXRFcnJvck1lc3NhZ2UoZXJyb3IpLCBlcnJvci5zdGF0dXMpO1xuICAgIH1cbiAgICBsZXQgZGF0YTtcbiAgICB0cnkge1xuICAgICAgICBkYXRhID0gYXdhaXQgZXJyb3IuanNvbigpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aFVua25vd25FcnJvcihfZ2V0RXJyb3JNZXNzYWdlKGUpLCBlKTtcbiAgICB9XG4gICAgbGV0IGVycm9yQ29kZSA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXNwb25zZUFQSVZlcnNpb24gPSBwYXJzZVJlc3BvbnNlQVBJVmVyc2lvbihlcnJvcik7XG4gICAgaWYgKHJlc3BvbnNlQVBJVmVyc2lvbiAmJlxuICAgICAgICByZXNwb25zZUFQSVZlcnNpb24uZ2V0VGltZSgpID49IEFQSV9WRVJTSU9OU1snMjAyNC0wMS0wMSddLnRpbWVzdGFtcCAmJlxuICAgICAgICB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgZGF0YSAmJlxuICAgICAgICB0eXBlb2YgZGF0YS5jb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgICBlcnJvckNvZGUgPSBkYXRhLmNvZGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICYmIHR5cGVvZiBkYXRhLmVycm9yX2NvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGVycm9yQ29kZSA9IGRhdGEuZXJyb3JfY29kZTtcbiAgICB9XG4gICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgLy8gTGVnYWN5IHN1cHBvcnQgZm9yIHdlYWsgcGFzc3dvcmQgZXJyb3JzLCB3aGVuIHRoZXJlIHdlcmUgbm8gZXJyb3IgY29kZXNcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgZGF0YSAmJlxuICAgICAgICAgICAgdHlwZW9mIGRhdGEud2Vha19wYXNzd29yZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGRhdGEud2Vha19wYXNzd29yZCAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShkYXRhLndlYWtfcGFzc3dvcmQucmVhc29ucykgJiZcbiAgICAgICAgICAgIGRhdGEud2Vha19wYXNzd29yZC5yZWFzb25zLmxlbmd0aCAmJlxuICAgICAgICAgICAgZGF0YS53ZWFrX3Bhc3N3b3JkLnJlYXNvbnMucmVkdWNlKChhLCBpKSA9PiBhICYmIHR5cGVvZiBpID09PSAnc3RyaW5nJywgdHJ1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBdXRoV2Vha1Bhc3N3b3JkRXJyb3IoX2dldEVycm9yTWVzc2FnZShkYXRhKSwgZXJyb3Iuc3RhdHVzLCBkYXRhLndlYWtfcGFzc3dvcmQucmVhc29ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3JDb2RlID09PSAnd2Vha19wYXNzd29yZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhXZWFrUGFzc3dvcmRFcnJvcihfZ2V0RXJyb3JNZXNzYWdlKGRhdGEpLCBlcnJvci5zdGF0dXMsICgoX2EgPSBkYXRhLndlYWtfcGFzc3dvcmQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWFzb25zKSB8fCBbXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yQ29kZSA9PT0gJ3Nlc3Npb25fbm90X2ZvdW5kJykge1xuICAgICAgICAvLyBUaGUgYHNlc3Npb25faWRgIGluc2lkZSB0aGUgSldUIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSByb3cgaW4gdGhlXG4gICAgICAgIC8vIGBzZXNzaW9uc2AgdGFibGUuIFRoaXMgdXN1YWxseSBtZWFucyB0aGUgdXNlciBoYXMgc2lnbmVkIG91dCwgaGFzIGJlZW5cbiAgICAgICAgLy8gZGVsZXRlZCwgb3IgdGhlaXIgc2Vzc2lvbiBoYXMgc29tZWhvdyBiZWVuIHRlcm1pbmF0ZWQuXG4gICAgICAgIHRocm93IG5ldyBBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvcigpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgQXV0aEFwaUVycm9yKF9nZXRFcnJvck1lc3NhZ2UoZGF0YSksIGVycm9yLnN0YXR1cyB8fCA1MDAsIGVycm9yQ29kZSk7XG59XG5jb25zdCBfZ2V0UmVxdWVzdFBhcmFtcyA9IChtZXRob2QsIG9wdGlvbnMsIHBhcmFtZXRlcnMsIGJvZHkpID0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSB7IG1ldGhvZCwgaGVhZGVyczogKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oZWFkZXJzKSB8fCB7fSB9O1xuICAgIGlmIChtZXRob2QgPT09ICdHRVQnKSB7XG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfVxuICAgIHBhcmFtcy5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyB9LCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhZGVycyk7XG4gICAgcGFyYW1zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMpLCBwYXJhbWV0ZXJzKTtcbn07XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3JlcXVlc3QoZmV0Y2hlciwgbWV0aG9kLCB1cmwsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oZWFkZXJzKTtcbiAgICBpZiAoIWhlYWRlcnNbQVBJX1ZFUlNJT05fSEVBREVSX05BTUVdKSB7XG4gICAgICAgIGhlYWRlcnNbQVBJX1ZFUlNJT05fSEVBREVSX05BTUVdID0gQVBJX1ZFUlNJT05TWycyMDI0LTAxLTAxJ10ubmFtZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5qd3QpIHtcbiAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke29wdGlvbnMuand0fWA7XG4gICAgfVxuICAgIGNvbnN0IHFzID0gKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnF1ZXJ5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fTtcbiAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJlZGlyZWN0VG8pIHtcbiAgICAgICAgcXNbJ3JlZGlyZWN0X3RvJ10gPSBvcHRpb25zLnJlZGlyZWN0VG87XG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmtleXMocXMpLmxlbmd0aCA/ICc/JyArIG5ldyBVUkxTZWFyY2hQYXJhbXMocXMpLnRvU3RyaW5nKCkgOiAnJztcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgX2hhbmRsZVJlcXVlc3QoZmV0Y2hlciwgbWV0aG9kLCB1cmwgKyBxdWVyeVN0cmluZywge1xuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBub1Jlc29sdmVKc29uOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubm9SZXNvbHZlSnNvbixcbiAgICB9LCB7fSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvZHkpO1xuICAgIHJldHVybiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnhmb3JtKSA/IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy54Zm9ybShkYXRhKSA6IHsgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZGF0YSksIGVycm9yOiBudWxsIH07XG59XG5hc3luYyBmdW5jdGlvbiBfaGFuZGxlUmVxdWVzdChmZXRjaGVyLCBtZXRob2QsIHVybCwgb3B0aW9ucywgcGFyYW1ldGVycywgYm9keSkge1xuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSBfZ2V0UmVxdWVzdFBhcmFtcyhtZXRob2QsIG9wdGlvbnMsIHBhcmFtZXRlcnMsIGJvZHkpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmV0Y2hlcih1cmwsIE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3RQYXJhbXMpKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgLy8gZmV0Y2ggZmFpbGVkLCBsaWtlbHkgZHVlIHRvIGEgbmV0d29yayBvciBDT1JTIGVycm9yXG4gICAgICAgIHRocm93IG5ldyBBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvcihfZ2V0RXJyb3JNZXNzYWdlKGUpLCAwKTtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgYXdhaXQgaGFuZGxlRXJyb3IocmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ub1Jlc29sdmVKc29uKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN1bHQuanNvbigpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBhd2FpdCBoYW5kbGVFcnJvcihlKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gX3Nlc3Npb25SZXNwb25zZShkYXRhKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBzZXNzaW9uID0gbnVsbDtcbiAgICBpZiAoaGFzU2Vzc2lvbihkYXRhKSkge1xuICAgICAgICBzZXNzaW9uID0gT2JqZWN0LmFzc2lnbih7fSwgZGF0YSk7XG4gICAgICAgIGlmICghZGF0YS5leHBpcmVzX2F0KSB7XG4gICAgICAgICAgICBzZXNzaW9uLmV4cGlyZXNfYXQgPSBleHBpcmVzQXQoZGF0YS5leHBpcmVzX2luKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB1c2VyID0gKF9hID0gZGF0YS51c2VyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBkYXRhO1xuICAgIHJldHVybiB7IGRhdGE6IHsgc2Vzc2lvbiwgdXNlciB9LCBlcnJvcjogbnVsbCB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zZXNzaW9uUmVzcG9uc2VQYXNzd29yZChkYXRhKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBfc2Vzc2lvblJlc3BvbnNlKGRhdGEpO1xuICAgIGlmICghcmVzcG9uc2UuZXJyb3IgJiZcbiAgICAgICAgZGF0YS53ZWFrX3Bhc3N3b3JkICYmXG4gICAgICAgIHR5cGVvZiBkYXRhLndlYWtfcGFzc3dvcmQgPT09ICdvYmplY3QnICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoZGF0YS53ZWFrX3Bhc3N3b3JkLnJlYXNvbnMpICYmXG4gICAgICAgIGRhdGEud2Vha19wYXNzd29yZC5yZWFzb25zLmxlbmd0aCAmJlxuICAgICAgICBkYXRhLndlYWtfcGFzc3dvcmQubWVzc2FnZSAmJlxuICAgICAgICB0eXBlb2YgZGF0YS53ZWFrX3Bhc3N3b3JkLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIGRhdGEud2Vha19wYXNzd29yZC5yZWFzb25zLnJlZHVjZSgoYSwgaSkgPT4gYSAmJiB0eXBlb2YgaSA9PT0gJ3N0cmluZycsIHRydWUpKSB7XG4gICAgICAgIHJlc3BvbnNlLmRhdGEud2Vha19wYXNzd29yZCA9IGRhdGEud2Vha19wYXNzd29yZDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF91c2VyUmVzcG9uc2UoZGF0YSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCB1c2VyID0gKF9hID0gZGF0YS51c2VyKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBkYXRhO1xuICAgIHJldHVybiB7IGRhdGE6IHsgdXNlciB9LCBlcnJvcjogbnVsbCB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9zc29SZXNwb25zZShkYXRhKSB7XG4gICAgcmV0dXJuIHsgZGF0YSwgZXJyb3I6IG51bGwgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfZ2VuZXJhdGVMaW5rUmVzcG9uc2UoZGF0YSkge1xuICAgIGNvbnN0IHsgYWN0aW9uX2xpbmssIGVtYWlsX290cCwgaGFzaGVkX3Rva2VuLCByZWRpcmVjdF90bywgdmVyaWZpY2F0aW9uX3R5cGUgfSA9IGRhdGEsIHJlc3QgPSBfX3Jlc3QoZGF0YSwgW1wiYWN0aW9uX2xpbmtcIiwgXCJlbWFpbF9vdHBcIiwgXCJoYXNoZWRfdG9rZW5cIiwgXCJyZWRpcmVjdF90b1wiLCBcInZlcmlmaWNhdGlvbl90eXBlXCJdKTtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgICBhY3Rpb25fbGluayxcbiAgICAgICAgZW1haWxfb3RwLFxuICAgICAgICBoYXNoZWRfdG9rZW4sXG4gICAgICAgIHJlZGlyZWN0X3RvLFxuICAgICAgICB2ZXJpZmljYXRpb25fdHlwZSxcbiAgICB9O1xuICAgIGNvbnN0IHVzZXIgPSBPYmplY3QuYXNzaWduKHt9LCByZXN0KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgdXNlcixcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbm9SZXNvbHZlSnNvblJlc3BvbnNlKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YTtcbn1cbi8qKlxuICogaGFzU2Vzc2lvbiBjaGVja3MgaWYgdGhlIHJlc3BvbnNlIG9iamVjdCBjb250YWlucyBhIHZhbGlkIHNlc3Npb25cbiAqIEBwYXJhbSBkYXRhIEEgcmVzcG9uc2Ugb2JqZWN0XG4gKiBAcmV0dXJucyB0cnVlIGlmIGEgc2Vzc2lvbiBpcyBpbiB0aGUgcmVzcG9uc2VcbiAqL1xuZnVuY3Rpb24gaGFzU2Vzc2lvbihkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEuYWNjZXNzX3Rva2VuICYmIGRhdGEucmVmcmVzaF90b2tlbiAmJiBkYXRhLmV4cGlyZXNfaW47XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZXRjaC5qcy5tYXAiXSwibmFtZXMiOlsiX19yZXN0IiwiQVBJX1ZFUlNJT05TIiwiQVBJX1ZFUlNJT05fSEVBREVSX05BTUUiLCJleHBpcmVzQXQiLCJsb29rc0xpa2VGZXRjaFJlc3BvbnNlIiwicGFyc2VSZXNwb25zZUFQSVZlcnNpb24iLCJBdXRoQXBpRXJyb3IiLCJBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvciIsIkF1dGhXZWFrUGFzc3dvcmRFcnJvciIsIkF1dGhVbmtub3duRXJyb3IiLCJBdXRoU2Vzc2lvbk1pc3NpbmdFcnJvciIsIl9nZXRFcnJvck1lc3NhZ2UiLCJlcnIiLCJtc2ciLCJtZXNzYWdlIiwiZXJyb3JfZGVzY3JpcHRpb24iLCJlcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJORVRXT1JLX0VSUk9SX0NPREVTIiwiaGFuZGxlRXJyb3IiLCJfYSIsImluY2x1ZGVzIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJlIiwiZXJyb3JDb2RlIiwidW5kZWZpbmVkIiwicmVzcG9uc2VBUElWZXJzaW9uIiwiZ2V0VGltZSIsInRpbWVzdGFtcCIsImNvZGUiLCJlcnJvcl9jb2RlIiwid2Vha19wYXNzd29yZCIsIkFycmF5IiwiaXNBcnJheSIsInJlYXNvbnMiLCJsZW5ndGgiLCJyZWR1Y2UiLCJhIiwiaSIsIl9nZXRSZXF1ZXN0UGFyYW1zIiwibWV0aG9kIiwib3B0aW9ucyIsInBhcmFtZXRlcnMiLCJib2R5IiwicGFyYW1zIiwiaGVhZGVycyIsIk9iamVjdCIsImFzc2lnbiIsIl9yZXF1ZXN0IiwiZmV0Y2hlciIsInVybCIsIm5hbWUiLCJqd3QiLCJxcyIsInF1ZXJ5IiwicmVkaXJlY3RUbyIsInF1ZXJ5U3RyaW5nIiwia2V5cyIsIlVSTFNlYXJjaFBhcmFtcyIsInRvU3RyaW5nIiwiX2hhbmRsZVJlcXVlc3QiLCJub1Jlc29sdmVKc29uIiwieGZvcm0iLCJyZXF1ZXN0UGFyYW1zIiwicmVzdWx0IiwiY29uc29sZSIsIm9rIiwiX3Nlc3Npb25SZXNwb25zZSIsInNlc3Npb24iLCJoYXNTZXNzaW9uIiwiZXhwaXJlc19hdCIsImV4cGlyZXNfaW4iLCJ1c2VyIiwiX3Nlc3Npb25SZXNwb25zZVBhc3N3b3JkIiwicmVzcG9uc2UiLCJfdXNlclJlc3BvbnNlIiwiX3Nzb1Jlc3BvbnNlIiwiX2dlbmVyYXRlTGlua1Jlc3BvbnNlIiwiYWN0aW9uX2xpbmsiLCJlbWFpbF9vdHAiLCJoYXNoZWRfdG9rZW4iLCJyZWRpcmVjdF90byIsInZlcmlmaWNhdGlvbl90eXBlIiwicmVzdCIsInByb3BlcnRpZXMiLCJfbm9SZXNvbHZlSnNvblJlc3BvbnNlIiwiYWNjZXNzX3Rva2VuIiwicmVmcmVzaF90b2tlbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/fetch.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ _generateLinkResponse: () => (/* binding */ _generateLinkResponse),\n/* harmony export */ _noResolveJsonResponse: () => (/* binding */ _noResolveJsonResponse),\n/* harmony export */ _request: () => (/* binding */ _request),\n/* harmony export */ _sessionResponse: () => (/* binding */ _sessionResponse),\n/* harmony export */ _sessionResponsePassword: () => (/* binding */ _sessionResponsePassword),\n/* harmony export */ _ssoResponse: () => (/* binding */ _ssoResponse),\n/* harmony export */ _userResponse: () => (/* binding */ _userResponse),\n/* harmony export */ handleError: () => (/* binding */ handleError)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! tslib */ \"(rsc)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./errors */ \"(rsc)/./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 ${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2ZldGNoLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUErQjtBQUNxQztBQUNtQjtBQUM2QztBQUNwSSxNQUFNVyxtQkFBbUIsQ0FBQ0MsTUFBUUEsSUFBSUMsR0FBRyxJQUFJRCxJQUFJRSxPQUFPLElBQUlGLElBQUlHLGlCQUFpQixJQUFJSCxJQUFJSSxLQUFLLElBQUlDLEtBQUtDLFNBQVMsQ0FBQ047QUFDakgsTUFBTU8sc0JBQXNCO0lBQUM7SUFBSztJQUFLO0NBQUk7QUFDcEMsZUFBZUMsWUFBWUosS0FBSztJQUNuQyxJQUFJSztJQUNKLElBQUksQ0FBQ2pCLGdFQUFzQkEsQ0FBQ1ksUUFBUTtRQUNoQyxNQUFNLElBQUlULDREQUF1QkEsQ0FBQ0ksaUJBQWlCSyxRQUFRO0lBQy9EO0lBQ0EsSUFBSUcsb0JBQW9CRyxRQUFRLENBQUNOLE1BQU1PLE1BQU0sR0FBRztRQUM1Qyw2RUFBNkU7UUFDN0UsTUFBTSxJQUFJaEIsNERBQXVCQSxDQUFDSSxpQkFBaUJLLFFBQVFBLE1BQU1PLE1BQU07SUFDM0U7SUFDQSxJQUFJQztJQUNKLElBQUk7UUFDQUEsT0FBTyxNQUFNUixNQUFNUyxJQUFJO0lBQzNCLEVBQ0EsT0FBT0MsR0FBRztRQUNOLE1BQU0sSUFBSWpCLHFEQUFnQkEsQ0FBQ0UsaUJBQWlCZSxJQUFJQTtJQUNwRDtJQUNBLElBQUlDLFlBQVlDO0lBQ2hCLE1BQU1DLHFCQUFxQnhCLGlFQUF1QkEsQ0FBQ1c7SUFDbkQsSUFBSWEsc0JBQ0FBLG1CQUFtQkMsT0FBTyxNQUFNN0Isb0RBQVksQ0FBQyxhQUFhLENBQUM4QixTQUFTLElBQ3BFLE9BQU9QLFNBQVMsWUFDaEJBLFFBQ0EsT0FBT0EsS0FBS1EsSUFBSSxLQUFLLFVBQVU7UUFDL0JMLFlBQVlILEtBQUtRLElBQUk7SUFDekIsT0FDSyxJQUFJLE9BQU9SLFNBQVMsWUFBWUEsUUFBUSxPQUFP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QUNVLGFBQWEsR0FBR1YsS0FBS1UsYUFBYTtJQUNwRDtJQUNBLE9BQU8yQztBQUNYO0FBQ08sU0FBU0MsY0FBY3RELElBQUk7SUFDOUIsSUFBSUg7SUFDSixNQUFNc0QsT0FBTyxDQUFDdEQsS0FBS0csS0FBS21ELElBQUksTUFBTSxRQUFRdEQsT0FBTyxLQUFLLElBQUlBLEtBQUtHO0lBQy9ELE9BQU87UUFBRUEsTUFBTTtZQUFFbUQ7UUFBSztRQUFHM0QsT0FBTztJQUFLO0FBQ3pDO0FBQ08sU0FBUytELGFBQWF2RCxJQUFJO0lBQzdCLE9BQU87UUFBRUE7UUFBTVIsT0FBTztJQUFLO0FBQy9CO0FBQ08sU0FBU2dFLHNCQUFzQnhELElBQUk7SUFDdEMsTUFBTSxFQUFFeUQsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLFlBQVksRUFBRUMsV0FBVyxFQUFFQyxpQkFBaUIsRUFBRSxHQUFHN0QsTUFBTThELE9BQU90Riw2Q0FBTUEsQ0FBQ3dCLE1BQU07UUFBQztRQUFlO1FBQWE7UUFBZ0I7UUFBZTtLQUFvQjtJQUMzTCxNQUFNK0QsYUFBYTtRQUNmTjtRQUNBQztRQUNBQztRQUNBQztRQUNBQztJQUNKO0lBQ0EsTUFBTVYsT0FBTzFCLE9BQU9DLE1BQU0sQ0FBQyxDQUFDLEdBQUdvQztJQUMvQixPQUFPO1FBQ0g5RCxNQUFNO1lBQ0YrRDtZQUNBWjtRQUNKO1FBQ0EzRCxPQUFPO0lBQ1g7QUFDSjtBQUNPLFNBQVN3RSx1QkFBdUJoRSxJQUFJO0lBQ3ZDLE9BQU9BO0FBQ1g7QUFDQTs7OztDQUlDLEdBQ0QsU0FBU2dELFdBQVdoRCxJQUFJO0lBQ3BCLE9BQU9BLEtBQUtpRSxZQUFZLElBQUlqRSxLQUFLa0UsYUFBYSxJQUFJbEUsS0FBS2tELFVBQVU7QUFDckUsRUFDQSxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2ZldGNoLmpzPzAyMzAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBUElfVkVSU0lPTlMsIEFQSV9WRVJTSU9OX0hFQURFUl9OQU1FIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZXhwaXJlc0F0LCBsb29rc0xpa2VGZXRjaFJlc3BvbnNlLCBwYXJzZVJlc3BvbnNlQVBJVmVyc2lvbiB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBBdXRoQXBpRXJyb3IsIEF1dGhSZXRyeWFibGVGZXRjaEVycm9yLCBBdXRoV2Vha1Bhc3N3b3JkRXJyb3IsIEF1dGhVbmtub3duRXJyb3IsIEF1dGhTZXNzaW9uTWlzc2luZ0Vycm9yLCB9IGZyb20gJy4vZXJyb3JzJztcbmNvbnN0IF9nZXRFcnJvck1lc3NhZ2UgPSAoZXJyKSA9PiBlcnIubXNnIHx8IGVyci5tZXNzYWdlIHx8IGVyci5lcnJvcl9kZXNjcmlwdGlvbiB8fCBlcnIuZXJyb3IgfHwgSlNPTi5zdHJpbmdpZnkoZXJyKTtcbmNvbnN0IE5FVFdPUktfRVJST1JfQ09ERVMgPSBbNTAyLCA1MDMsIDUwNF07XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3IpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCFsb29rc0xpa2VGZXRjaFJlc3BvbnNlKGVycm9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoX2dldEVycm9yTWVzc2FnZShlcnJvciksIDApO1xuICAgIH1cbiAgICBpZiAoTkVUV09SS19FUlJPUl9DT0RFUy5pbmNsdWRlcyhlcnJvci5zdGF0dXMpKSB7XG4gICAgICAgIC8vIHN0YXR1cyBpbiA1MDAuLi41OTkgcmFuZ2UgLSBzZXJ2ZXIgaGFkIGFuIGVycm9yLCByZXF1ZXN0IG1pZ2h0IGJlIHJldHJ5ZWQuXG4gICAgICAgIHRocm93IG5ldyBBdXRoUmV0cnlhYmxlRmV0Y2hFcnJvcihfZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSwgZXJyb3Iuc3RhdHVzKTtcbiAgICB9XG4gICAgbGV0IGRhdGE7XG4gICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IGF3YWl0IGVycm9yLmpzb24oKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhVbmtub3duRXJyb3IoX2dldEVycm9yTWVzc2FnZShlKSwgZSk7XG4gICAgfVxuICAgIGxldCBlcnJvckNvZGUgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzcG9uc2VBUElWZXJzaW9uID0gcGFyc2VSZXNwb25zZUFQSVZlcnNpb24oZXJyb3IpO1xuICAgIGlmIChyZXNwb25zZUFQSVZlcnNpb24gJiZcbiAgICAgICAgcmVzcG9uc2VBUElWZXJzaW9uLmdldFRpbWUoKSA+PSBBUElfVkVSU0lPTlNbJzIwMjQtMDEtMDEnXS50aW1lc3RhbXAgJiZcbiAgICAgICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAgIGRhdGEgJiZcbiAgICAgICAgdHlwZW9mIGRhdGEuY29kZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgZXJyb3JDb2RlID0gZGF0YS5jb2RlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAmJiB0eXBlb2YgZGF0YS5lcnJvcl9jb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgICBlcnJvckNvZGUgPSBkYXRhLmVycm9yX2NvZGU7XG4gICAgfVxuICAgIGlmICghZXJyb3JDb2RlKSB7XG4gICAgICAgIC8vIExlZ2FjeSBzdXBwb3J0IGZvciB3ZWFrIHBhc3N3b3JkIGVycm9ycywgd2hlbiB0aGVyZSB3ZXJlIG5vIGVycm9yIGNvZGVzXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGRhdGEgJiZcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLndlYWtfcGFzc3dvcmQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICBkYXRhLndlYWtfcGFzc3dvcmQgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZGF0YS53ZWFrX3Bhc3N3b3JkLnJlYXNvbnMpICYmXG4gICAgICAgICAgICBkYXRhLndlYWtfcGFzc3dvcmQucmVhc29ucy5sZW5ndGggJiZcbiAgICAgICAgICAgIGRhdGEud2Vha19wYXNzd29yZC5yZWFzb25zLnJlZHVjZSgoYSwgaSkgPT4gYSAmJiB0eXBlb2YgaSA9PT0gJ3N0cmluZycsIHRydWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXV0aFdlYWtQYXNzd29yZEVycm9yKF9nZXRFcnJvck1lc3NhZ2UoZGF0YSksIGVycm9yLnN0YXR1cywgZGF0YS53ZWFrX3Bhc3N3b3JkLnJlYXNvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yQ29kZSA9PT0gJ3dlYWtfcGFzc3dvcmQnKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoV2Vha1Bhc3N3b3JkRXJyb3IoX2dldEVycm9yTWVzc2FnZShkYXRhKSwgZXJyb3Iuc3RhdHVzLCAoKF9hID0gZGF0YS53ZWFrX3Bhc3N3b3JkKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVhc29ucykgfHwgW10pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvckNvZGUgPT09ICdzZXNzaW9uX25vdF9mb3VuZCcpIHtcbiAgICAgICAgLy8gVGhlIGBzZXNzaW9uX2lkYCBpbnNpZGUgdGhlIEpXVCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcm93IGluIHRoZVxuICAgICAgICAvLyBgc2Vzc2lvbnNgIHRhYmxlLiBUaGlzIHVzdWFsbHkgbWVhbnMgdGhlIHVzZXIgaGFzIHNpZ25lZCBvdXQsIGhhcyBiZWVuXG4gICAgICAgIC8vIGRlbGV0ZWQsIG9yIHRoZWlyIHNlc3Npb24gaGFzIHNvbWVob3cgYmVlbiB0ZXJtaW5hdGVkLlxuICAgICAgICB0aHJvdyBuZXcgQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEF1dGhBcGlFcnJvcihfZ2V0RXJyb3JNZXNzYWdlKGRhdGEpLCBlcnJvci5zdGF0dXMgfHwgNTAwLCBlcnJvckNvZGUpO1xufVxuY29uc3QgX2dldFJlcXVlc3RQYXJhbXMgPSAobWV0aG9kLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KSA9PiB7XG4gICAgY29uc3QgcGFyYW1zID0geyBtZXRob2QsIGhlYWRlcnM6IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhZGVycykgfHwge30gfTtcbiAgICBpZiAobWV0aG9kID09PSAnR0VUJykge1xuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICBwYXJhbXMuaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcgfSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlYWRlcnMpO1xuICAgIHBhcmFtcy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKSwgcGFyYW1ldGVycyk7XG59O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9yZXF1ZXN0KGZldGNoZXIsIG1ldGhvZCwgdXJsLCBvcHRpb25zKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhZGVycyk7XG4gICAgaWYgKCFoZWFkZXJzW0FQSV9WRVJTSU9OX0hFQURFUl9OQU1FXSkge1xuICAgICAgICBoZWFkZXJzW0FQSV9WRVJTSU9OX0hFQURFUl9OQU1FXSA9IEFQSV9WRVJTSU9OU1snMjAyNC0wMS0wMSddLm5hbWU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuand0KSB7XG4gICAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHtvcHRpb25zLmp3dH1gO1xuICAgIH1cbiAgICBjb25zdCBxcyA9IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5xdWVyeSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge307XG4gICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZWRpcmVjdFRvKSB7XG4gICAgICAgIHFzWydyZWRpcmVjdF90byddID0gb3B0aW9ucy5yZWRpcmVjdFRvO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IE9iamVjdC5rZXlzKHFzKS5sZW5ndGggPyAnPycgKyBuZXcgVVJMU2VhcmNoUGFyYW1zKHFzKS50b1N0cmluZygpIDogJyc7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IF9oYW5kbGVSZXF1ZXN0KGZldGNoZXIsIG1ldGhvZCwgdXJsICsgcXVlcnlTdHJpbmcsIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgbm9SZXNvbHZlSnNvbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm5vUmVzb2x2ZUpzb24sXG4gICAgfSwge30sIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib2R5KTtcbiAgICByZXR1cm4gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy54Zm9ybSkgPyBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueGZvcm0oZGF0YSkgOiB7IGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpLCBlcnJvcjogbnVsbCB9O1xufVxuYXN5bmMgZnVuY3Rpb24gX2hhbmRsZVJlcXVlc3QoZmV0Y2hlciwgbWV0aG9kLCB1cmwsIG9wdGlvbnMsIHBhcmFtZXRlcnMsIGJvZHkpIHtcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0gX2dldFJlcXVlc3RQYXJhbXMobWV0aG9kLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZldGNoZXIodXJsLCBPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0UGFyYW1zKSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIC8vIGZldGNoIGZhaWxlZCwgbGlrZWx5IGR1ZSB0byBhIG5ldHdvcmsgb3IgQ09SUyBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IoX2dldEVycm9yTWVzc2FnZShlKSwgMCk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZUVycm9yKHJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubm9SZXNvbHZlSnNvbikge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdWx0Lmpzb24oKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgYXdhaXQgaGFuZGxlRXJyb3IoZSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIF9zZXNzaW9uUmVzcG9uc2UoZGF0YSkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgc2Vzc2lvbiA9IG51bGw7XG4gICAgaWYgKGhhc1Nlc3Npb24oZGF0YSkpIHtcbiAgICAgICAgc2Vzc2lvbiA9IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpO1xuICAgICAgICBpZiAoIWRhdGEuZXhwaXJlc19hdCkge1xuICAgICAgICAgICAgc2Vzc2lvbi5leHBpcmVzX2F0ID0gZXhwaXJlc0F0KGRhdGEuZXhwaXJlc19pbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdXNlciA9IChfYSA9IGRhdGEudXNlcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZGF0YTtcbiAgICByZXR1cm4geyBkYXRhOiB7IHNlc3Npb24sIHVzZXIgfSwgZXJyb3I6IG51bGwgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc2Vzc2lvblJlc3BvbnNlUGFzc3dvcmQoZGF0YSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gX3Nlc3Npb25SZXNwb25zZShkYXRhKTtcbiAgICBpZiAoIXJlc3BvbnNlLmVycm9yICYmXG4gICAgICAgIGRhdGEud2Vha19wYXNzd29yZCAmJlxuICAgICAgICB0eXBlb2YgZGF0YS53ZWFrX3Bhc3N3b3JkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGRhdGEud2Vha19wYXNzd29yZC5yZWFzb25zKSAmJlxuICAgICAgICBkYXRhLndlYWtfcGFzc3dvcmQucmVhc29ucy5sZW5ndGggJiZcbiAgICAgICAgZGF0YS53ZWFrX3Bhc3N3b3JkLm1lc3NhZ2UgJiZcbiAgICAgICAgdHlwZW9mIGRhdGEud2Vha19wYXNzd29yZC5tZXNzYWdlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICBkYXRhLndlYWtfcGFzc3dvcmQucmVhc29ucy5yZWR1Y2UoKGEsIGkpID0+IGEgJiYgdHlwZW9mIGkgPT09ICdzdHJpbmcnLCB0cnVlKSkge1xuICAgICAgICByZXNwb25zZS5kYXRhLndlYWtfcGFzc3dvcmQgPSBkYXRhLndlYWtfcGFzc3dvcmQ7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfdXNlclJlc3BvbnNlKGRhdGEpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgdXNlciA9IChfYSA9IGRhdGEudXNlcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZGF0YTtcbiAgICByZXR1cm4geyBkYXRhOiB7IHVzZXIgfSwgZXJyb3I6IG51bGwgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfc3NvUmVzcG9uc2UoZGF0YSkge1xuICAgIHJldHVybiB7IGRhdGEsIGVycm9yOiBudWxsIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX2dlbmVyYXRlTGlua1Jlc3BvbnNlKGRhdGEpIHtcbiAgICBjb25zdCB7IGFjdGlvbl9saW5rLCBlbWFpbF9vdHAsIGhhc2hlZF90b2tlbiwgcmVkaXJlY3RfdG8sIHZlcmlmaWNhdGlvbl90eXBlIH0gPSBkYXRhLCByZXN0ID0gX19yZXN0KGRhdGEsIFtcImFjdGlvbl9saW5rXCIsIFwiZW1haWxfb3RwXCIsIFwiaGFzaGVkX3Rva2VuXCIsIFwicmVkaXJlY3RfdG9cIiwgXCJ2ZXJpZmljYXRpb25fdHlwZVwiXSk7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgICAgYWN0aW9uX2xpbmssXG4gICAgICAgIGVtYWlsX290cCxcbiAgICAgICAgaGFzaGVkX3Rva2VuLFxuICAgICAgICByZWRpcmVjdF90byxcbiAgICAgICAgdmVyaWZpY2F0aW9uX3R5cGUsXG4gICAgfTtcbiAgICBjb25zdCB1c2VyID0gT2JqZWN0LmFzc2lnbih7fSwgcmVzdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgIHVzZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX25vUmVzb2x2ZUpzb25SZXNwb25zZShkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGE7XG59XG4vKipcbiAqIGhhc1Nlc3Npb24gY2hlY2tzIGlmIHRoZSByZXNwb25zZSBvYmplY3QgY29udGFpbnMgYSB2YWxpZCBzZXNzaW9uXG4gKiBAcGFyYW0gZGF0YSBBIHJlc3BvbnNlIG9iamVjdFxuICogQHJldHVybnMgdHJ1ZSBpZiBhIHNlc3Npb24gaXMgaW4gdGhlIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGhhc1Nlc3Npb24oZGF0YSkge1xuICAgIHJldHVybiBkYXRhLmFjY2Vzc190b2tlbiAmJiBkYXRhLnJlZnJlc2hfdG9rZW4gJiYgZGF0YS5leHBpcmVzX2luO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmV0Y2guanMubWFwIl0sIm5hbWVzIjpbIl9fcmVzdCIsIkFQSV9WRVJTSU9OUyIsIkFQSV9WRVJTSU9OX0hFQURFUl9OQU1FIiwiZXhwaXJlc0F0IiwibG9va3NMaWtlRmV0Y2hSZXNwb25zZSIsInBhcnNlUmVzcG9uc2VBUElWZXJzaW9uIiwiQXV0aEFwaUVycm9yIiwiQXV0aFJldHJ5YWJsZUZldGNoRXJyb3IiLCJBdXRoV2Vha1Bhc3N3b3JkRXJyb3IiLCJBdXRoVW5rbm93bkVycm9yIiwiQXV0aFNlc3Npb25NaXNzaW5nRXJyb3IiLCJfZ2V0RXJyb3JNZXNzYWdlIiwiZXJyIiwibXNnIiwibWVzc2FnZSIsImVycm9yX2Rlc2NyaXB0aW9uIiwiZXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiTkVUV09SS19FUlJPUl9DT0RFUyIsImhhbmRsZUVycm9yIiwiX2EiLCJpbmNsdWRlcyIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwiZSIsImVycm9yQ29kZSIsInVuZGVmaW5lZCIsInJlc3BvbnNlQVBJVmVyc2lvbiIsImdldFRpbWUiLCJ0aW1lc3RhbXAiLCJjb2RlIiwiZXJyb3JfY29kZSIsIndlYWtfcGFzc3dvcmQiLCJBcnJheSIsImlzQXJyYXkiLCJyZWFzb25zIiwibGVuZ3RoIiwicmVkdWNlIiwiYSIsImkiLCJfZ2V0UmVxdWVzdFBhcmFtcyIsIm1ldGhvZCIsIm9wdGlvbnMiLCJwYXJhbWV0ZXJzIiwiYm9keSIsInBhcmFtcyIsImhlYWRlcnMiLCJPYmplY3QiLCJhc3NpZ24iLCJfcmVxdWVzdCIsImZldGNoZXIiLCJ1cmwiLCJuYW1lIiwiand0IiwicXMiLCJxdWVyeSIsInJlZGlyZWN0VG8iLCJxdWVyeVN0cmluZyIsImtleXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJ0b1N0cmluZyIsIl9oYW5kbGVSZXF1ZXN0Iiwibm9SZXNvbHZlSnNvbiIsInhmb3JtIiwicmVxdWVzdFBhcmFtcyIsInJlc3VsdCIsImNvbnNvbGUiLCJvayIsIl9zZXNzaW9uUmVzcG9uc2UiLCJzZXNzaW9uIiwiaGFzU2Vzc2lvbiIsImV4cGlyZXNfYXQiLCJleHBpcmVzX2luIiwidXNlciIsIl9zZXNzaW9uUmVzcG9uc2VQYXNzd29yZCIsInJlc3BvbnNlIiwiX3VzZXJSZXNwb25zZSIsIl9zc29SZXNwb25zZSIsIl9nZW5lcmF0ZUxpbmtSZXNwb25zZSIsImFjdGlvbl9saW5rIiwiZW1haWxfb3RwIiwiaGFzaGVkX3Rva2VuIiwicmVkaXJlY3RfdG8iLCJ2ZXJpZmljYXRpb25fdHlwZSIsInJlc3QiLCJwcm9wZXJ0aWVzIiwiX25vUmVzb2x2ZUpzb25SZXNwb25zZSIsImFjY2Vzc190b2tlbiIsInJlZnJlc2hfdG9rZW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/fetch.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/helpers.js ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Deferred: () => (/* binding */ Deferred),\n/* harmony export */ decodeJWT: () => (/* binding */ decodeJWT),\n/* harmony export */ deepClone: () => (/* binding */ deepClone),\n/* harmony export */ expiresAt: () => (/* binding */ expiresAt),\n/* harmony export */ generateCallbackId: () => (/* binding */ generateCallbackId),\n/* harmony export */ generatePKCEChallenge: () => (/* binding */ generatePKCEChallenge),\n/* harmony export */ generatePKCEVerifier: () => (/* binding */ generatePKCEVerifier),\n/* harmony export */ getAlgorithm: () => (/* binding */ getAlgorithm),\n/* harmony export */ getCodeChallengeAndMethod: () => (/* binding */ getCodeChallengeAndMethod),\n/* harmony export */ getItemAsync: () => (/* binding */ getItemAsync),\n/* harmony export */ insecureUserWarningProxy: () => (/* binding */ insecureUserWarningProxy),\n/* harmony export */ isBrowser: () => (/* binding */ isBrowser),\n/* harmony export */ looksLikeFetchResponse: () => (/* binding */ looksLikeFetchResponse),\n/* harmony export */ parseParametersFromURL: () => (/* binding */ parseParametersFromURL),\n/* harmony export */ parseResponseAPIVersion: () => (/* binding */ parseResponseAPIVersion),\n/* harmony export */ removeItemAsync: () => (/* binding */ removeItemAsync),\n/* harmony export */ resolveFetch: () => (/* binding */ resolveFetch),\n/* harmony export */ retryable: () => (/* binding */ retryable),\n/* harmony export */ setItemAsync: () => (/* binding */ setItemAsync),\n/* harmony export */ sleep: () => (/* binding */ sleep),\n/* harmony export */ supportsLocalStorage: () => (/* binding */ supportsLocalStorage),\n/* harmony export */ userNotAvailableProxy: () => (/* binding */ userNotAvailableProxy),\n/* harmony export */ validateExp: () => (/* binding */ validateExp),\n/* harmony export */ validateUUID: () => (/* binding */ validateUUID)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./errors */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _base64url__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base64url */ \"(action-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 = ()=> false && 0;\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-${Math.random()}${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 (...args)=>customFetch(...args);\n }\n return (...args)=>fetch(...args);\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, isPasswordRecovery = false) {\n const codeVerifier = generatePKCEVerifier();\n let storedCodeVerifier = codeVerifier;\n if (isPasswordRecovery) {\n storedCodeVerifier += \"/PASSWORD_RECOVERY\";\n }\n await setItemAsync(storage, `${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(`${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 \"${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 \"${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 \"${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvaGVscGVycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBdUU7QUFDeEI7QUFDMEI7QUFDbEUsU0FBU0ssVUFBVUMsU0FBUztJQUMvQixNQUFNQyxVQUFVQyxLQUFLQyxLQUFLLENBQUNDLEtBQUtDLEdBQUcsS0FBSztJQUN4QyxPQUFPSixVQUFVRDtBQUNyQjtBQUNBOzs7Ozs7Ozs7Ozs7Q0FZQyxHQUNNLFNBQVNNO0lBQ1osT0FBT0MsT0FBTztBQUNsQjtBQUNPLE1BQU1DLFlBQVksSUFBTSxNQUFrQixJQUFlLENBQW9CLENBQVk7QUFDaEcsTUFBTUUseUJBQXlCO0lBQzNCQyxRQUFRO0lBQ1JDLFVBQVU7QUFDZDtBQUNBOztDQUVDLEdBQ00sTUFBTUMsdUJBQXVCO0lBQ2hDLElBQUksQ0FBQ0wsYUFBYTtRQUNkLE9BQU87SUFDWDtJQUNBLElBQUk7UUFDQSxJQUFJLE9BQU9NLFdBQVdDLFlBQVksS0FBSyxVQUFVO1lBQzdDLE9BQU87UUFDWDtJQUNKLEVBQ0EsT0FBT0MsR0FBRztRQUNOLDhDQUE4QztRQUM5QyxPQUFPO0lBQ1g7SUFDQSxJQUFJTix1QkFBdUJDLE1BQU0sRUFBRTtRQUMvQixPQUFPRCx1QkFBdUJFLFFBQVE7SUFDMUM7SUFDQSxNQUFNSyxZQUFZLENBQUMsS0FBSyxFQUFFZixLQUFLZ0IsTUFBTSxHQUFHLEVBQUVoQixLQUFLZ0IsTUFBTSxHQUFHLENBQUM7SUFDekQsSUFBSTtRQUNBSixXQUFXQyxZQUFZLENBQUNJLE9BQU8sQ0FBQ0YsV0FBV0E7UUFDM0NILFdBQVdDLFlBQVksQ0FBQ0ssVUFBVSxDQUFDSDtRQUNuQ1AsdUJBQXVCQyxNQUFNLEdBQUc7UUFDaENELHVCQUF1QkUsUUFBUSxHQUFHO0lBQ3RDLEVBQ0EsT0FBT0ksR0FBRztRQUNOLG1DQUFtQztRQUNuQywrS0FBK0s7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QSxTQUFTLFVBQVU7Z0JBQzFCLE1BQU1DLFFBQVFELEtBQUtsRSxRQUFRO2dCQUMzQixJQUFJbUUsVUFBVSxnQ0FDVkEsVUFBVSxnQ0FDVkEsVUFBVSxpQ0FDVkEsVUFBVSxzQ0FBc0M7b0JBQ2hELHVFQUF1RTtvQkFDdkUsT0FBT1MsUUFBUTNCLEdBQUcsQ0FBQ2dCLFFBQVFDLE1BQU1TO2dCQUNyQztZQUNKO1lBQ0Esd0NBQXdDO1lBQ3hDLElBQUksQ0FBQ0QsbUJBQW1CN0gsS0FBSyxJQUFJLE9BQU9xSCxTQUFTLFVBQVU7Z0JBQ3ZEbEMsUUFBUUMsSUFBSSxDQUFDO2dCQUNieUMsbUJBQW1CN0gsS0FBSyxHQUFHO1lBQy9CO1lBQ0EsT0FBTytILFFBQVEzQixHQUFHLENBQUNnQixRQUFRQyxNQUFNUztRQUNyQztJQUNKO0FBQ0o7QUFDQTs7O0NBR0MsR0FDTSxTQUFTRSxVQUFVQyxHQUFHO0lBQ3pCLE9BQU9wSCxLQUFLSSxLQUFLLENBQUNKLEtBQUtDLFNBQVMsQ0FBQ21IO0FBQ3JDLEVBQ0EsbUNBQW1DIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi9oZWxwZXJzLmpzPzVhNjgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVBJX1ZFUlNJT05fSEVBREVSX05BTUUsIEJBU0U2NFVSTF9SRUdFWCB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEF1dGhJbnZhbGlkSnd0RXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBiYXNlNjRVcmxUb1VpbnQ4QXJyYXksIHN0cmluZ0Zyb21CYXNlNjRVUkwgfSBmcm9tICcuL2Jhc2U2NHVybCc7XG5leHBvcnQgZnVuY3Rpb24gZXhwaXJlc0F0KGV4cGlyZXNJbikge1xuICAgIGNvbnN0IHRpbWVOb3cgPSBNYXRoLnJvdW5kKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICByZXR1cm4gdGltZU5vdyArIGV4cGlyZXNJbjtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGludGVybmFsIGNhbGxiYWNrIHN1YnNjcmlwdGlvbnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiB1c2VzIEphdmFTY3JpcHQgU3ltYm9scyB0byBjcmVhdGUgZ3VhcmFudGVlZC11bmlxdWUgaWRlbnRpZmllcnNcbiAqIGZvciBhdXRoIHN0YXRlIGNoYW5nZSBjYWxsYmFja3MuIFN5bWJvbHMgYXJlIGlkZWFsIGZvciB0aGlzIHVzZSBjYXNlIGJlY2F1c2U6XG4gKiAtIFRoZXkgYXJlIGd1YXJhbnRlZWQgdW5pcXVlIGJ5IHRoZSBKYXZhU2NyaXB0IHJ1bnRpbWVcbiAqIC0gVGhleSB3b3JrIGluIGFsbCBlbnZpcm9ubWVudHMgKGJyb3dzZXIsIFNTUiwgTm9kZS5qcylcbiAqIC0gVGhleSBhdm9pZCBpc3N1ZXMgd2l0aCBOZXh0LmpzIDE2IGRldGVybWluaXN0aWMgcmVuZGVyaW5nIHJlcXVpcmVtZW50c1xuICogLSBUaGV5IGFyZSBwZXJmZWN0IGZvciBpbnRlcm5hbCwgbm9uLXNlcmlhbGl6YWJsZSBpZGVudGlmaWVyc1xuICpcbiAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGZvciBpbnRlcm5hbCBzdWJzY3JpcHRpb24gbWFuYWdlbWVudCxcbiAqIG5vdCBmb3Igc2VjdXJpdHktY3JpdGljYWwgb3BlcmF0aW9ucyBsaWtlIHNlc3Npb24gdG9rZW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDYWxsYmFja0lkKCkge1xuICAgIHJldHVybiBTeW1ib2woJ2F1dGgtY2FsbGJhY2snKTtcbn1cbmV4cG9ydCBjb25zdCBpc0Jyb3dzZXIgPSAoKSA9PiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuY29uc3QgbG9jYWxTdG9yYWdlV3JpdGVUZXN0cyA9IHtcbiAgICB0ZXN0ZWQ6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbn07XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGxvY2FsU3RvcmFnZSBpcyBzdXBwb3J0ZWQgb24gdGhpcyBicm93c2VyLlxuICovXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNMb2NhbFN0b3JhZ2UgPSAoKSA9PiB7XG4gICAgaWYgKCFpc0Jyb3dzZXIoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcy5sb2NhbFN0b3JhZ2UgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gRE9NIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZyBgbG9jYWxTdG9yYWdlYFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChsb2NhbFN0b3JhZ2VXcml0ZVRlc3RzLnRlc3RlZCkge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlV3JpdGVUZXN0cy53cml0YWJsZTtcbiAgICB9XG4gICAgY29uc3QgcmFuZG9tS2V5ID0gYGxzd3QtJHtNYXRoLnJhbmRvbSgpfSR7TWF0aC5yYW5kb20oKX1gO1xuICAgIHRyeSB7XG4gICAgICAgIGdsb2JhbFRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0ocmFuZG9tS2V5LCByYW5kb21LZXkpO1xuICAgICAgICBnbG9iYWxUaGlzLmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHJhbmRvbUtleSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMudGVzdGVkID0gdHJ1ZTtcbiAgICAgICAgbG9jYWxTdG9yYWdlV3JpdGVUZXN0cy53cml0YWJsZSA9IHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGxvY2FsU3RvcmFnZSBjYW4ndCBiZSB3cml0dGVuIHRvXG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LmNocm9taXVtLm9yZy9mb3ItdGVzdGVycy9idWctcmVwb3J0aW5nLWd1aWRlbGluZXMvdW5jYXVnaHQtc2VjdXJpdHllcnJvci1mYWlsZWQtdG8tcmVhZC10aGUtbG9jYWxzdG9yYWdlLXByb3BlcnR5LWZyb20td2luZG93LWFjY2Vzcy1pcy1kZW5pZWQtZm9yLXRoaXMtZG9jdW1lbnRcbiAgICAgICAgbG9jYWxTdG9yYWdlV3JpdGVUZXN0cy50ZXN0ZWQgPSB0cnVlO1xuICAgICAgICBsb2NhbFN0b3JhZ2VXcml0ZVRlc3RzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbFN0b3JhZ2VXcml0ZVRlc3RzLndyaXRhYmxlO1xufTtcbi8qKlxuICogRXh0cmFjdHMgcGFyYW1ldGVycyBlbmNvZGVkIGluIHRoZSBVUkwgYm90aCBpbiB0aGUgcXVlcnkgYW5kIGZyYWdtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXJhbWV0ZXJzRnJvbVVSTChocmVmKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChocmVmKTtcbiAgICBpZiAodXJsLmhhc2ggJiYgdXJsLmhhc2hbMF0gPT09ICcjJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaGFzaFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLmhhc2guc3Vic3RyaW5nKDEpKTtcbiAgICAgICAgICAgIGhhc2hTZWFyY2hQYXJhbXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gaGFzaCBpcyBub3QgYSBxdWVyeSBzdHJpbmdcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBzZWFyY2ggcGFyYW1ldGVycyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBoYXNoIHBhcmFtZXRlcnNcbiAgICB1cmwuc2VhcmNoUGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGNvbnN0IHJlc29sdmVGZXRjaCA9IChjdXN0b21GZXRjaCkgPT4ge1xuICAgIGlmIChjdXN0b21GZXRjaCkge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IGN1c3RvbUZldGNoKC4uLmFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gKC4uLmFyZ3MpID0+IGZldGNoKC4uLmFyZ3MpO1xufTtcbmV4cG9ydCBjb25zdCBsb29rc0xpa2VGZXRjaFJlc3BvbnNlID0gKG1heWJlUmVzcG9uc2UpID0+IHtcbiAgICByZXR1cm4gKHR5cGVvZiBtYXliZVJlc3BvbnNlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBtYXliZVJlc3BvbnNlICE9PSBudWxsICYmXG4gICAgICAgICdzdGF0dXMnIGluIG1heWJlUmVzcG9uc2UgJiZcbiAgICAgICAgJ29rJyBpbiBtYXliZVJlc3BvbnNlICYmXG4gICAgICAgICdqc29uJyBpbiBtYXliZVJlc3BvbnNlICYmXG4gICAgICAgIHR5cGVvZiBtYXliZVJlc3BvbnNlLmpzb24gPT09ICdmdW5jdGlvbicpO1xufTtcbi8vIFN0b3JhZ2UgaGVscGVyc1xuZXhwb3J0IGNvbnN0IHNldEl0ZW1Bc3luYyA9IGFzeW5jIChzdG9yYWdlLCBrZXksIGRhdGEpID0+IHtcbiAgICBhd2FpdCBzdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59O1xuZXhwb3J0IGNvbnN0IGdldEl0ZW1Bc3luYyA9IGFzeW5jIChzdG9yYWdlLCBrZXkpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHJlbW92ZUl0ZW1Bc3luYyA9IGFzeW5jIChzdG9yYWdlLCBrZXkpID0+IHtcbiAgICBhd2FpdCBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbn07XG4vKipcbiAqIEEgZGVmZXJyZWQgcmVwcmVzZW50cyBzb21lIGFzeW5jaHJvbm91cyB3b3JrIHRoYXQgaXMgbm90IHlldCBmaW5pc2hlZCwgd2hpY2hcbiAqIG1heSBvciBtYXkgbm90IGN1bG1pbmF0ZSBpbiBhIHZhbHVlLlxuICogVGFrZW4gZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL21pa2Utbm9ydGgvdHlwZXMvYmxvYi9tYXN0ZXIvc3JjL2FzeW5jLnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXh0cmEtc2VtaVxuICAgICAgICA7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBEZWZlcnJlZC5wcm9taXNlQ29uc3RydWN0b3IoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4dHJhLXNlbWlcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZSA9IHJlcztcbiAgICAgICAgICAgIHRoaXMucmVqZWN0ID0gcmVqO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5EZWZlcnJlZC5wcm9taXNlQ29uc3RydWN0b3IgPSBQcm9taXNlO1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUpXVCh0b2tlbikge1xuICAgIGNvbnN0IHBhcnRzID0gdG9rZW4uc3BsaXQoJy4nKTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgIHRocm93IG5ldyBBdXRoSW52YWxpZEp3dEVycm9yKCdJbnZhbGlkIEpXVCBzdHJ1Y3R1cmUnKTtcbiAgICB9XG4gICAgLy8gUmVnZXggY2hlY2tzIGZvciBiYXNlNjR1cmwgZm9ybWF0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIUJBU0U2NFVSTF9SRUdFWC50ZXN0KHBhcnRzW2ldKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhJbnZhbGlkSnd0RXJyb3IoJ0pXVCBub3QgaW4gYmFzZTY0dXJsIGZvcm1hdCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgIC8vIHVzaW5nIGJhc2U2NHVybCBsaWJcbiAgICAgICAgaGVhZGVyOiBKU09OLnBhcnNlKHN0cmluZ0Zyb21CYXNlNjRVUkwocGFydHNbMF0pKSxcbiAgICAgICAgcGF5bG9hZDogSlNPTi5wYXJzZShzdHJpbmdGcm9tQmFzZTY0VVJMKHBhcnRzWzFdKSksXG4gICAgICAgIHNpZ25hdHVyZTogYmFzZTY0VXJsVG9VaW50OEFycmF5KHBhcnRzWzJdKSxcbiAgICAgICAgcmF3OiB7XG4gICAgICAgICAgICBoZWFkZXI6IHBhcnRzWzBdLFxuICAgICAgICAgICAgcGF5bG9hZDogcGFydHNbMV0sXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gZGF0YTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBudWxsIGFmdGVyIHNvbWUgdGltZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKGFjY2VwdCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGFjY2VwdChudWxsKSwgdGltZSk7XG4gICAgfSk7XG59XG4vKipcbiAqIENvbnZlcnRzIHRoZSBwcm92aWRlZCBhc3luYyBmdW5jdGlvbiBpbnRvIGEgcmV0cnlhYmxlIGZ1bmN0aW9uLiBFYWNoIHJlc3VsdFxuICogb3IgdGhyb3duIGVycm9yIGlzIHNlbnQgdG8gdGhlIGlzUmV0cnlhYmxlIGZ1bmN0aW9uIHdoaWNoIHNob3VsZCByZXR1cm4gdHJ1ZVxuICogaWYgdGhlIGZ1bmN0aW9uIHNob3VsZCBydW4gYWdhaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXRyeWFibGUoZm4sIGlzUmV0cnlhYmxlKSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChhY2NlcHQsIHJlamVjdCkgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4dHJhLXNlbWlcbiAgICAgICAgO1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCBJbmZpbml0eTsgYXR0ZW1wdCsrKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oYXR0ZW1wdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNSZXRyeWFibGUoYXR0ZW1wdCwgbnVsbCwgcmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1JldHJ5YWJsZShhdHRlbXB0LCBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gZGVjMmhleChkZWMpIHtcbiAgICByZXR1cm4gKCcwJyArIGRlYy50b1N0cmluZygxNikpLnN1YnN0cigtMik7XG59XG4vLyBGdW5jdGlvbnMgYmVsb3cgdGFrZW4gZnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjMzMDk0MDkvY3JlYXRpbmctYS1jb2RlLXZlcmlmaWVyLWFuZC1jaGFsbGVuZ2UtZm9yLXBrY2UtYXV0aC1vbi1zcG90aWZ5LWFwaS1pbi1yZWFjdGpzXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQS0NFVmVyaWZpZXIoKSB7XG4gICAgY29uc3QgdmVyaWZpZXJMZW5ndGggPSA1NjtcbiAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50MzJBcnJheSh2ZXJpZmllckxlbmd0aCk7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IGNoYXJTZXQgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktLl9+JztcbiAgICAgICAgY29uc3QgY2hhclNldExlbiA9IGNoYXJTZXQubGVuZ3RoO1xuICAgICAgICBsZXQgdmVyaWZpZXIgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJpZmllckxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2ZXJpZmllciArPSBjaGFyU2V0LmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyU2V0TGVuKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZlcmlmaWVyO1xuICAgIH1cbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhcnJheSwgZGVjMmhleCkuam9pbignJyk7XG59XG5hc3luYyBmdW5jdGlvbiBzaGEyNTYocmFuZG9tU3RyaW5nKSB7XG4gICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IGVuY29kZWREYXRhID0gZW5jb2Rlci5lbmNvZGUocmFuZG9tU3RyaW5nKTtcbiAgICBjb25zdCBoYXNoID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBlbmNvZGVkRGF0YSk7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShoYXNoKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShieXRlcylcbiAgICAgICAgLm1hcCgoYykgPT4gU3RyaW5nLmZyb21DaGFyQ29kZShjKSlcbiAgICAgICAgLmpvaW4oJycpO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUEtDRUNoYWxsZW5nZSh2ZXJpZmllcikge1xuICAgIGNvbnN0IGhhc0NyeXB0b1N1cHBvcnQgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICB0eXBlb2YgY3J5cHRvLnN1YnRsZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIFRleHRFbmNvZGVyICE9PSAndW5kZWZpbmVkJztcbiAgICBpZiAoIWhhc0NyeXB0b1N1cHBvcnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdXZWJDcnlwdG8gQVBJIGlzIG5vdCBzdXBwb3J0ZWQuIENvZGUgY2hhbGxlbmdlIG1ldGhvZCB3aWxsIGRlZmF1bHQgdG8gdXNlIHBsYWluIGluc3RlYWQgb2Ygc2hhMjU2LicpO1xuICAgICAgICByZXR1cm4gdmVyaWZpZXI7XG4gICAgfVxuICAgIGNvbnN0IGhhc2hlZCA9IGF3YWl0IHNoYTI1Nih2ZXJpZmllcik7XG4gICAgcmV0dXJuIGJ0b2EoaGFzaGVkKS5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29kZUNoYWxsZW5nZUFuZE1ldGhvZChzdG9yYWdlLCBzdG9yYWdlS2V5LCBpc1Bhc3N3b3JkUmVjb3ZlcnkgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNvZGVWZXJpZmllciA9IGdlbmVyYXRlUEtDRVZlcmlmaWVyKCk7XG4gICAgbGV0IHN0b3JlZENvZGVWZXJpZmllciA9IGNvZGVWZXJpZmllcjtcbiAgICBpZiAoaXNQYXNzd29yZFJlY292ZXJ5KSB7XG4gICAgICAgIHN0b3JlZENvZGVWZXJpZmllciArPSAnL1BBU1NXT1JEX1JFQ09WRVJZJztcbiAgICB9XG4gICAgYXdhaXQgc2V0SXRlbUFzeW5jKHN0b3JhZ2UsIGAke3N0b3JhZ2VLZXl9LWNvZGUtdmVyaWZpZXJgLCBzdG9yZWRDb2RlVmVyaWZpZXIpO1xuICAgIGNvbnN0IGNvZGVDaGFsbGVuZ2UgPSBhd2FpdCBnZW5lcmF0ZVBLQ0VDaGFsbGVuZ2UoY29kZVZlcmlmaWVyKTtcbiAgICBjb25zdCBjb2RlQ2hhbGxlbmdlTWV0aG9kID0gY29kZVZlcmlmaWVyID09PSBjb2RlQ2hhbGxlbmdlID8gJ3BsYWluJyA6ICdzMjU2JztcbiAgICByZXR1cm4gW2NvZGVDaGFsbGVuZ2UsIGNvZGVDaGFsbGVuZ2VNZXRob2RdO1xufVxuLyoqIFBhcnNlcyB0aGUgQVBJIHZlcnNpb24gd2hpY2ggaXMgMllZWS1NTS1ERC4gKi9cbmNvbnN0IEFQSV9WRVJTSU9OX1JFR0VYID0gL14yWzAtOV17M30tKDBbMS05XXwxWzAtMl0pLSgwWzEtOV18MVswLTldfDJbMC05XXwzWzAtMV0pJC9pO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVzcG9uc2VBUElWZXJzaW9uKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgYXBpVmVyc2lvbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KEFQSV9WRVJTSU9OX0hFQURFUl9OQU1FKTtcbiAgICBpZiAoIWFwaVZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICghYXBpVmVyc2lvbi5tYXRjaChBUElfVkVSU0lPTl9SRUdFWCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShgJHthcGlWZXJzaW9ufVQwMDowMDowMC4wWmApO1xuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRXhwKGV4cCkge1xuICAgIGlmICghZXhwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBleHAgY2xhaW0nKTtcbiAgICB9XG4gICAgY29uc3QgdGltZU5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgIGlmIChleHAgPD0gdGltZU5vdykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pXVCBoYXMgZXhwaXJlZCcpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGdvcml0aG0oYWxnKSB7XG4gICAgc3dpdGNoIChhbGcpIHtcbiAgICAgICAgY2FzZSAnUlMyNTYnOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUlNBU1NBLVBLQ1MxLXYxXzUnLFxuICAgICAgICAgICAgICAgIGhhc2g6IHsgbmFtZTogJ1NIQS0yNTYnIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdFUzI1Nic6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdFQ0RTQScsXG4gICAgICAgICAgICAgICAgbmFtZWRDdXJ2ZTogJ1AtMjU2JyxcbiAgICAgICAgICAgICAgICBoYXNoOiB7IG5hbWU6ICdTSEEtMjU2JyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhbGcgY2xhaW0nKTtcbiAgICB9XG59XG5jb25zdCBVVUlEX1JFR0VYID0gL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kLztcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVVVSUQoc3RyKSB7XG4gICAgaWYgKCFVVUlEX1JFR0VYLnRlc3Qoc3RyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BzdXBhYmFzZS9hdXRoLWpzOiBFeHBlY3RlZCBwYXJhbWV0ZXIgdG8gYmUgVVVJRCBidXQgaXMgbm90Jyk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZXJOb3RBdmFpbGFibGVQcm94eSgpIHtcbiAgICBjb25zdCBwcm94eVRhcmdldCA9IHt9O1xuICAgIHJldHVybiBuZXcgUHJveHkocHJveHlUYXJnZXQsIHtcbiAgICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ19faXNVc2VyTm90QXZhaWxhYmxlUHJveHknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQcmV2ZW50YXRpdmUgY2hlY2sgZm9yIGNvbW1vbiBwcm9ibGVtYXRpYyBzeW1ib2xzIGR1cmluZyBjbG9uaW5nL2luc3BlY3Rpb25cbiAgICAgICAgICAgIC8vIFRoZXNlIHN5bWJvbHMgbWlnaHQgYmUgYWNjZXNzZWQgYnkgc3RydWN0dXJlZENsb25lIG9yIG90aGVyIGludGVybmFsIG1lY2hhbmlzbXMuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc1Byb3AgPSBwcm9wLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKHNQcm9wID09PSAnU3ltYm9sKFN5bWJvbC50b1ByaW1pdGl2ZSknIHx8XG4gICAgICAgICAgICAgICAgICAgIHNQcm9wID09PSAnU3ltYm9sKFN5bWJvbC50b1N0cmluZ1RhZyknIHx8XG4gICAgICAgICAgICAgICAgICAgIHNQcm9wID09PSAnU3ltYm9sKHV0aWwuaW5zcGVjdC5jdXN0b20pJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb2RlLmpzIHV0aWwuaW5zcGVjdFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IGNsaWVudCB3YXMgY3JlYXRlZCB3aXRoIHVzZXJTdG9yYWdlIG9wdGlvbiBhbmQgdGhlcmUgd2FzIG5vIHVzZXIgc3RvcmVkIGluIHRoZSB1c2VyIHN0b3JhZ2UuIEFjY2Vzc2luZyB0aGUgXCIke3Byb3B9XCIgcHJvcGVydHkgb2YgdGhlIHNlc3Npb24gb2JqZWN0IGlzIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgZ2V0VXNlcigpIGluc3RlYWQuYCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IGNsaWVudCB3YXMgY3JlYXRlZCB3aXRoIHVzZXJTdG9yYWdlIG9wdGlvbiBhbmQgdGhlcmUgd2FzIG5vIHVzZXIgc3RvcmVkIGluIHRoZSB1c2VyIHN0b3JhZ2UuIFNldHRpbmcgdGhlIFwiJHtwcm9wfVwiIHByb3BlcnR5IG9mIHRoZSBzZXNzaW9uIG9iamVjdCBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIGdldFVzZXIoKSB0byBmZXRjaCBhIHVzZXIgb2JqZWN0IHlvdSBjYW4gbWFuaXB1bGF0ZS5gKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsZXRlUHJvcGVydHk6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBjbGllbnQgd2FzIGNyZWF0ZWQgd2l0aCB1c2VyU3RvcmFnZSBvcHRpb24gYW5kIHRoZXJlIHdhcyBubyB1c2VyIHN0b3JlZCBpbiB0aGUgdXNlciBzdG9yYWdlLiBEZWxldGluZyB0aGUgXCIke3Byb3B9XCIgcHJvcGVydHkgb2YgdGhlIHNlc3Npb24gb2JqZWN0IGlzIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgZ2V0VXNlcigpIHRvIGZldGNoIGEgdXNlciBvYmplY3QgeW91IGNhbiBtYW5pcHVsYXRlLmApO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgcHJveHkgYXJvdW5kIGEgdXNlciBvYmplY3QgdGhhdCB3YXJucyB3aGVuIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkIG9uIHRoZSBzZXJ2ZXIuXG4gKiBUaGlzIGlzIHVzZWQgdG8gYWxlcnQgZGV2ZWxvcGVycyB0aGF0IHVzaW5nIHVzZXIgZGF0YSBmcm9tIGdldFNlc3Npb24oKSBvbiB0aGUgc2VydmVyIGlzIGluc2VjdXJlLlxuICpcbiAqIEBwYXJhbSB1c2VyIFRoZSBhY3R1YWwgdXNlciBvYmplY3QgdG8gd3JhcFxuICogQHBhcmFtIHN1cHByZXNzV2FybmluZ1JlZiBBbiBvYmplY3Qgd2l0aCBhICd2YWx1ZScgcHJvcGVydHkgdGhhdCBjb250cm9scyB3YXJuaW5nIHN1cHByZXNzaW9uXG4gKiBAcmV0dXJucyBBIHByb3hpZWQgdXNlciBvYmplY3QgdGhhdCB3YXJucyBvbiBwcm9wZXJ0eSBhY2Nlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VjdXJlVXNlcldhcm5pbmdQcm94eSh1c2VyLCBzdXBwcmVzc1dhcm5pbmdSZWYpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHVzZXIsIHtcbiAgICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgPT4ge1xuICAgICAgICAgICAgLy8gQWxsb3cgaW50ZXJuYWwgY2hlY2tzIHdpdGhvdXQgd2FybmluZ1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdfX2lzSW5zZWN1cmVVc2VyV2FybmluZ1Byb3h5Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUHJldmVudGF0aXZlIGNoZWNrIGZvciBjb21tb24gcHJvYmxlbWF0aWMgc3ltYm9scyBkdXJpbmcgY2xvbmluZy9pbnNwZWN0aW9uXG4gICAgICAgICAgICAvLyBUaGVzZSBzeW1ib2xzIG1pZ2h0IGJlIGFjY2Vzc2VkIGJ5IHN0cnVjdHVyZWRDbG9uZSBvciBvdGhlciBpbnRlcm5hbCBtZWNoYW5pc21zXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc1Byb3AgPSBwcm9wLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKHNQcm9wID09PSAnU3ltYm9sKFN5bWJvbC50b1ByaW1pdGl2ZSknIHx8XG4gICAgICAgICAgICAgICAgICAgIHNQcm9wID09PSAnU3ltYm9sKFN5bWJvbC50b1N0cmluZ1RhZyknIHx8XG4gICAgICAgICAgICAgICAgICAgIHNQcm9wID09PSAnU3ltYm9sKHV0aWwuaW5zcGVjdC5jdXN0b20pJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbChub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSknKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgYWN0dWFsIHZhbHVlIGZvciB0aGVzZSBzeW1ib2xzIHRvIGFsbG93IHByb3BlciBpbnNwZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFbWl0IHdhcm5pbmcgb24gZmlyc3QgcHJvcGVydHkgYWNjZXNzXG4gICAgICAgICAgICBpZiAoIXN1cHByZXNzV2FybmluZ1JlZi52YWx1ZSAmJiB0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1VzaW5nIHRoZSB1c2VyIG9iamVjdCBhcyByZXR1cm5lZCBmcm9tIHN1cGFiYXNlLmF1dGguZ2V0U2Vzc2lvbigpIG9yIGZyb20gc29tZSBzdXBhYmFzZS5hdXRoLm9uQXV0aFN0YXRlQ2hhbmdlKCkgZXZlbnRzIGNvdWxkIGJlIGluc2VjdXJlISBUaGlzIHZhbHVlIGNvbWVzIGRpcmVjdGx5IGZyb20gdGhlIHN0b3JhZ2UgbWVkaXVtICh1c3VhbGx5IGNvb2tpZXMgb24gdGhlIHNlcnZlcikgYW5kIG1heSBub3QgYmUgYXV0aGVudGljLiBVc2Ugc3VwYWJhc2UuYXV0aC5nZXRVc2VyKCkgaW5zdGVhZCB3aGljaCBhdXRoZW50aWNhdGVzIHRoZSBkYXRhIGJ5IGNvbnRhY3RpbmcgdGhlIFN1cGFiYXNlIEF1dGggc2VydmVyLicpO1xuICAgICAgICAgICAgICAgIHN1cHByZXNzV2FybmluZ1JlZi52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4vKipcbiAqIERlZXAgY2xvbmVzIGEgSlNPTi1zZXJpYWxpemFibGUgb2JqZWN0IHVzaW5nIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSkuXG4gKiBOb3RlOiBPbmx5IHdvcmtzIGZvciBKU09OLXNhZmUgZGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDbG9uZShvYmopIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhlbHBlcnMuanMubWFwIl0sIm5hbWVzIjpbIkFQSV9WRVJTSU9OX0hFQURFUl9OQU1FIiwiQkFTRTY0VVJMX1JFR0VYIiwiQXV0aEludmFsaWRKd3RFcnJvciIsImJhc2U2NFVybFRvVWludDhBcnJheSIsInN0cmluZ0Zyb21CYXNlNjRVUkwiLCJleHBpcmVzQXQiLCJleHBpcmVzSW4iLCJ0aW1lTm93IiwiTWF0aCIsInJvdW5kIiwiRGF0ZSIsIm5vdyIsImdlbmVyYXRlQ2FsbGJhY2tJZCIsIlN5bWJvbCIsImlzQnJvd3NlciIsImRvY3VtZW50IiwibG9jYWxTdG9yYWdlV3JpdGVUZXN0cyIsInRlc3RlZCIsIndyaXRhYmxlIiwic3VwcG9ydHNMb2NhbFN0b3JhZ2UiLCJnbG9iYWxUaGlzIiwibG9jYWxTdG9yYWdlIiwiZSIsInJhbmRvbUtleSIsInJhbmRvbSIsInNldEl0ZW0iLCJyZW1vdmVJdGVtIiwicGFyc2VQYXJhbWV0ZXJzRnJvbVVSTCIsImhyZWYiLCJyZXN1bHQiLCJ1cmwiLCJVUkwiLCJoYXNoIiwiaGFzaFNlYXJjaFBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInN1YnN0cmluZyIsImZvckVhY2giLCJ2YWx1ZSIsImtleSIsInNlYXJjaFBhcmFtcyIsInJlc29sdmVGZXRjaCIsImN1c3RvbUZldGNoIiwiYXJncyIsImZldGNoIiwibG9va3NMaWtlRmV0Y2hSZXNwb25zZSIsIm1heWJlUmVzcG9uc2UiLCJqc29uIiwic2V0SXRlbUFzeW5jIiwic3RvcmFnZSIsImRhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0SXRlbUFzeW5jIiwiZ2V0SXRlbSIsInBhcnNlIiwiX2EiLCJyZW1vdmVJdGVtQXN5bmMiLCJEZWZlcnJlZCIsImNvbnN0cnVjdG9yIiwicHJvbWlzZSIsInByb21pc2VDb25zdHJ1Y3RvciIsInJlcyIsInJlaiIsInJlc29sdmUiLCJyZWplY3QiLCJQcm9taXNlIiwiZGVjb2RlSldUIiwidG9rZW4iLCJwYXJ0cyIsInNwbGl0IiwibGVuZ3RoIiwiaSIsInRlc3QiLCJoZWFkZXIiLCJwYXlsb2FkIiwic2lnbmF0dXJlIiwicmF3Iiwic2xlZXAiLCJ0aW1lIiwiYWNjZXB0Iiwic2V0VGltZW91dCIsInJldHJ5YWJsZSIsImZuIiwiaXNSZXRyeWFibGUiLCJhdHRlbXB0IiwiSW5maW5pdHkiLCJkZWMyaGV4IiwiZGVjIiwidG9TdHJpbmciLCJzdWJzdHIiLCJnZW5lcmF0ZVBLQ0VWZXJpZmllciIsInZlcmlmaWVyTGVuZ3RoIiwiYXJyYXkiLCJVaW50MzJBcnJheSIsImNyeXB0byIsImNoYXJTZXQiLCJjaGFyU2V0TGVuIiwidmVyaWZpZXIiLCJjaGFyQXQiLCJmbG9vciIsImdldFJhbmRvbVZhbHVlcyIsIkFycmF5IiwiZnJvbSIsImpvaW4iLCJzaGEyNTYiLCJyYW5kb21TdHJpbmciLCJlbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJlbmNvZGVkRGF0YSIsImVuY29kZSIsInN1YnRsZSIsImRpZ2VzdCIsImJ5dGVzIiwiVWludDhBcnJheSIsIm1hcCIsImMiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJnZW5lcmF0ZVBLQ0VDaGFsbGVuZ2UiLCJoYXNDcnlwdG9TdXBwb3J0IiwiY29uc29sZSIsIndhcm4iLCJoYXNoZWQiLCJidG9hIiwicmVwbGFjZSIsImdldENvZGVDaGFsbGVuZ2VBbmRNZXRob2QiLCJzdG9yYWdlS2V5IiwiaXNQYXNzd29yZFJlY292ZXJ5IiwiY29kZVZlcmlmaWVyIiwic3RvcmVkQ29kZVZlcmlmaWVyIiwiY29kZUNoYWxsZW5nZSIsImNvZGVDaGFsbGVuZ2VNZXRob2QiLCJBUElfVkVSU0lPTl9SRUdFWCIsInBhcnNlUmVzcG9uc2VBUElWZXJzaW9uIiwicmVzcG9uc2UiLCJhcGlWZXJzaW9uIiwiaGVhZGVycyIsImdldCIsIm1hdGNoIiwiZGF0ZSIsInZhbGlkYXRlRXhwIiwiZXhwIiwiRXJyb3IiLCJnZXRBbGdvcml0aG0iLCJhbGciLCJuYW1lIiwibmFtZWRDdXJ2ZSIsIlVVSURfUkVHRVgiLCJ2YWxpZGF0ZVVVSUQiLCJzdHIiLCJ1c2VyTm90QXZhaWxhYmxlUHJveHkiLCJwcm94eVRhcmdldCIsIlByb3h5IiwidGFyZ2V0IiwicHJvcCIsInNQcm9wIiwidW5kZWZpbmVkIiwic2V0IiwiX3RhcmdldCIsImRlbGV0ZVByb3BlcnR5IiwiaW5zZWN1cmVVc2VyV2FybmluZ1Byb3h5IiwidXNlciIsInN1cHByZXNzV2FybmluZ1JlZiIsInJlY2VpdmVyIiwiUmVmbGVjdCIsImRlZXBDbG9uZSIsIm9iaiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/helpers.js ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Deferred: () => (/* binding */ Deferred),\n/* harmony export */ decodeJWT: () => (/* binding */ decodeJWT),\n/* harmony export */ deepClone: () => (/* binding */ deepClone),\n/* harmony export */ expiresAt: () => (/* binding */ expiresAt),\n/* harmony export */ generateCallbackId: () => (/* binding */ generateCallbackId),\n/* harmony export */ generatePKCEChallenge: () => (/* binding */ generatePKCEChallenge),\n/* harmony export */ generatePKCEVerifier: () => (/* binding */ generatePKCEVerifier),\n/* harmony export */ getAlgorithm: () => (/* binding */ getAlgorithm),\n/* harmony export */ getCodeChallengeAndMethod: () => (/* binding */ getCodeChallengeAndMethod),\n/* harmony export */ getItemAsync: () => (/* binding */ getItemAsync),\n/* harmony export */ insecureUserWarningProxy: () => (/* binding */ insecureUserWarningProxy),\n/* harmony export */ isBrowser: () => (/* binding */ isBrowser),\n/* harmony export */ looksLikeFetchResponse: () => (/* binding */ looksLikeFetchResponse),\n/* harmony export */ parseParametersFromURL: () => (/* binding */ parseParametersFromURL),\n/* harmony export */ parseResponseAPIVersion: () => (/* binding */ parseResponseAPIVersion),\n/* harmony export */ removeItemAsync: () => (/* binding */ removeItemAsync),\n/* harmony export */ resolveFetch: () => (/* binding */ resolveFetch),\n/* harmony export */ retryable: () => (/* binding */ retryable),\n/* harmony export */ setItemAsync: () => (/* binding */ setItemAsync),\n/* harmony export */ sleep: () => (/* binding */ sleep),\n/* harmony export */ supportsLocalStorage: () => (/* binding */ supportsLocalStorage),\n/* harmony export */ userNotAvailableProxy: () => (/* binding */ userNotAvailableProxy),\n/* harmony export */ validateExp: () => (/* binding */ validateExp),\n/* harmony export */ validateUUID: () => (/* binding */ validateUUID)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/constants.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./errors */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _base64url__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base64url */ \"(rsc)/./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 = ()=> false && 0;\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-${Math.random()}${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 (...args)=>customFetch(...args);\n }\n return (...args)=>fetch(...args);\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, isPasswordRecovery = false) {\n const codeVerifier = generatePKCEVerifier();\n let storedCodeVerifier = codeVerifier;\n if (isPasswordRecovery) {\n storedCodeVerifier += \"/PASSWORD_RECOVERY\";\n }\n await setItemAsync(storage, `${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(`${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 \"${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 \"${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 \"${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2hlbHBlcnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXVFO0FBQ3hCO0FBQzBCO0FBQ2xFLFNBQVNLLFVBQVVDLFNBQVM7SUFDL0IsTUFBTUMsVUFBVUMsS0FBS0MsS0FBSyxDQUFDQyxLQUFLQyxHQUFHLEtBQUs7SUFDeEMsT0FBT0osVUFBVUQ7QUFDckI7QUFDQTs7Ozs7Ozs7Ozs7O0NBWUMsR0FDTSxTQUFTTTtJQUNaLE9BQU9DLE9BQU87QUFDbEI7QUFDTyxNQUFNQyxZQUFZLElBQU0sTUFBa0IsSUFBZSxDQUFvQixDQUFZO0FBQ2hHLE1BQU1FLHlCQUF5QjtJQUMzQkMsUUFBUTtJQUNSQyxVQUFVO0FBQ2Q7QUFDQTs7Q0FFQyxHQUNNLE1BQU1DLHVCQUF1QjtJQUNoQyxJQUFJLENBQUNMLGFBQWE7UUFDZCxPQUFPO0lBQ1g7SUFDQSxJQUFJO1FBQ0EsSUFBSSxPQUFPTSxXQUFXQyxZQUFZLEtBQUssVUFBVTtZQUM3QyxPQUFPO1FBQ1g7SUFDSixFQUNBLE9BQU9DLEdBQUc7UUFDTiw4Q0FBOEM7UUFDOUMsT0FBTztJQUNYO0lBQ0EsSUFBSU4sdUJBQXVCQyxNQUFNLEVBQUU7UUFDL0IsT0FBT0QsdUJBQXVCRSxRQUFRO0lBQzFDO0lBQ0EsTUFBTUssWUFBWSxDQUFDLEtBQUssRUFBRWYsS0FBS2dCLE1BQU0sR0FBRyxFQUFFaEIsS0FBS2dCLE1BQU0sR0FBRyxDQUFDO0lBQ3pELElBQUk7UUFDQUosV0FBV0MsWUFBWSxDQUFDSSxPQUFPLENBQUNGLFdBQVdBO1FBQzNDSCxXQUFXQyxZQUFZLENBQUNLLFVBQVUsQ0FBQ0g7UUFDbkNQLHVCQUF1QkMsTUFBTSxHQUFHO1FBQ2hDRCx1QkFBdUJFLFFBQVEsR0FBRztJQUN0QyxFQUNBLE9BQU9JLEdBQUc7UUFDTixtQ0FBbUM7UUFDbkMsK0tBQStLO1FBQy9LTix1QkFBdUJDLE1BQU0sR0FBRztRQUNoQ0QsdUJBQXVCRSxRQUFRLEdBQUc7SUFDdEM7SUFDQSxPQUFPRix1QkFBdUJFLFFBQVE7QUFDMUMsRUFBRTtBQUNGOztDQUVDLEdBQ00sU0FBU1MsdUJBQXVCQyxJQUFJO0lBQ3ZDLE1BQU1DLFNBQVMsQ0FBQztJQUNoQixNQUFNQyxNQUFNLElBQUlDLElBQUlIO0lBQ3BCLElBQUlFLElBQUlFLElBQUksSUFBSUYsSUFBSUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxLQUFLO1FBQ2pDLElBQUk7WUFDQSxNQUFNQyxtQkFBbUIsSUFBSUMsZ0JBQWdCSixJQUFJRSxJQUFJLENBQUNHLFNBQVMsQ0FBQztZQUNoRUYsaUJBQWlCRyxPQUFPLENBQUMsQ0FBQ0MsT0FBT0M7Z0JBQzdCVCxNQUFNLENBQUNTLElBQUksR0FBR0Q7WUFDbEI7UUFDSixFQUNBLE9BQU9mLEdBQUc7UUFDTiw2QkFBNkI7UUFDakM7SUFDSjtJQUNBLHlEQUF5RDtJQUN6RFEsSUFBSVMsWUFBWSxDQUFDSCxPQUFPLENBQUMsQ0FBQ0MsT0FBT0M7UUFDN0JULE1BQU0sQ0FBQ1MsSUFBSSxHQUFHRDtJQUNsQjtJQUNBLE9BQU9SO0FBQ1g7QUFDTyxNQUFNVyxlQUFlLENBQUNDO0lBQ3pCLElBQUlBLGFBQWE7UUFDYixPQUFPLENBQUMsR0FBR0MsT0FBU0QsZUFBZUM7SUFDdkM7SUFDQSxPQUFPLENBQUMsR0FBR0EsT0FBU0MsU0FBU0Q7QUFDakMsRUFBRTtBQUNLLE1BQU1FLHlCQUF5QixDQUFDQztJQUNuQyxPQUFRLE9BQU9BLGtCQUFrQixZQUM3QkEsa0JBQWtCLFFBQ2xCLFlBQVlBLGlCQUNaLFFBQVFBLGlCQUNSLFVBQVVBLGlCQUNWLE9BQU9BLGNBQWNDLElBQUksS0FBSztBQUN0QyxFQUFFO0FBQ0Ysa0JBQWtCO0FBQ1gsTUFBTUMsZUFBZSxPQUFPQyxTQUFTVixLQUFLVztJQUM3QyxNQUFNRCxRQUFRdkIsT0FBTyxDQUFDYSxLQUFLWSxLQUFLQyxTQUFTLENBQUNGO0FBQzlDLEVBQUU7QUFDSyxNQUFNRyxlQUFlLE9BQU9KLFNBQVNWO0lBQ3hDLE1BQU1ELFFBQVEsTUFBTVcsUUFBUUssT0FBTyxDQUFDZjtJQUNwQyxJQUFJLENBQUNELE9BQU87UUFDUixPQUFPO0lBQ1g7SUFDQSxJQUFJO1FBQ0EsT0FBT2EsS0FBS0ksS0FBSyxDQUFDakI7SUFDdEIsRUFDQSxPQUFPa0IsSUFBSTtRQUNQLE9BQU9sQjtJQUNYO0FBQ0osRUFBRTtBQUNLLE1BQU1tQixrQkFBa0IsT0FBT1IsU0FBU1Y7SUFDM0MsTUFBTVUsUUFBUXRCLFVBQVUsQ0FBQ1k7QUFDN0IsRUFBRTtBQUNGOzs7O0NBSUMsR0FDTSxNQUFNbUI7SUFDVEMsYUFBYztRQUNWLDREQUE0RDs7UUFFNUQsSUFBSSxDQUFDQyxPQUFPLEdBQUcsSUFBSUYsU0FBU0csa0JBQWtCLENBQUMsQ0FBQ0MsS0FBS0M7WUFDakQsNERBQTREOztZQUU1RCxJQUFJLENBQUNDLE9BQU8sR0FBR0Y7WUFDZixJQUFJLENBQUNHLE1BQU0sR0FBR0Y7UUFDbEI7SUFDSjtBQUNKO0FBQ0FMLFNBQVNHLGtCQUFrQixHQUFHSztBQUN2QixTQUFTQyxVQUFVQyxLQUFLO0lBQzNCLE1BQU1DLFFBQVFELE1BQU1FLEtBQUssQ0FBQztJQUMxQixJQUFJRCxNQUFNRSxNQUFNLEtBQUssR0FBRztRQUNwQixNQUFNLElBQUlwRSx3REFBbUJBLENBQUM7SUFDbEM7SUFDQSxvQ0FBb0M7SUFDcEMsSUFBSyxJQUFJcUUsSUFBSSxHQUFHQSxJQUFJSCxNQUFNRSxNQUFNLEVBQUVDLElBQUs7UUFDbkMsSUFBSSxDQUFDdEUsdURBQWVBLENBQUN1RSxJQUFJLENBQUNKLEtBQUssQ0FBQ0csRUFBRSxHQUFHO1lBQ2pDLE1BQU0sSUFBSXJFLHdEQUFtQkEsQ0FBQztRQUNsQztJQUNKO0lBQ0EsTUFBTStDLE9BQU87UUFDVCxzQkFBc0I7UUFDdEJ3QixRQUFRdkIsS0FBS0ksS0FBSyxDQUFDbEQsK0RBQW1CQSxDQUFDZ0UsS0FBSyxDQUFDLEVBQUU7UUFDL0NNLFNBQVN4QixLQUFLSSxLQUFLLENBQUNsRCwrREFBbUJBLENBQUNnRSxLQUFLLENBQUMsRUFBRTtRQUNoRE8sV0FBV3hFLGlFQUFxQkEsQ0FBQ2lFLEtBQUssQ0FBQyxFQUFFO1FBQ3pDUSxLQUFLO1lBQ0RILFFBQVFMLEtBQUssQ0FBQyxFQUFFO1lBQ2hCTSxTQUFTTixLQUFLLENBQUMsRUFBRTtRQUNyQjtJQUNKO0lBQ0EsT0FBT25CO0FBQ1g7QUFDQTs7Q0FFQyxHQUNNLGVBQWU0QixNQUFNQyxJQUFJO0lBQzVCLE9BQU8sTUFBTSxJQUFJYixRQUFRLENBQUNjO1FBQ3RCQyxXQUFXLElBQU1ELE9BQU8sT0FBT0Q7SUFDbkM7QUFDSjtBQUNBOzs7O0NBSUMsR0FDTSxTQUFTRyxVQUFVQyxFQUFFLEVBQUVDLFdBQVc7SUFDckMsTUFBTXhCLFVBQVUsSUFBSU0sUUFBUSxDQUFDYyxRQUFRZjtRQUNqQyw0REFBNEQ7O1FBRTNEO1lBQ0csSUFBSyxJQUFJb0IsVUFBVSxHQUFHQSxVQUFVQyxVQUFVRCxVQUFXO2dCQUNqRCxJQUFJO29CQUNBLE1BQU12RCxTQUFTLE1BQU1xRCxHQUFHRTtvQkFDeEIsSUFBSSxDQUFDRCxZQUFZQyxTQUFTLE1BQU12RCxTQUFTO3dCQUNyQ2tELE9BQU9sRDt3QkFDUDtvQkFDSjtnQkFDSixFQUNBLE9BQU9QLEdBQUc7b0JBQ04sSUFBSSxDQUFDNkQsWUFBWUMsU0FBUzlELElBQUk7d0JBQzFCMEMsT0FBTzFDO3dCQUNQO29CQUNKO2dCQUNKO1lBQ0o7UUFDSjtJQUNKO0lBQ0EsT0FBT3FDO0FBQ1g7QUFDQSxTQUFTMkIsUUFBUUMsR0FBRztJQUNoQixPQUFPLENBQUMsTUFBTUEsSUFBSUMsUUFBUSxDQUFDLEdBQUUsRUFBR0MsTUFBTSxDQUFDLENBQUM7QUFDNUM7QUFDQSwwSkFBMEo7QUFDbkosU0FBU0M7SUFDWixNQUFNQyxpQkFBaUI7SUFDdkIsTUFBTUMsUUFBUSxJQUFJQyxZQUFZRjtJQUM5QixJQUFJLE9BQU9HLFdBQVcsYUFBYTtRQUMvQixNQUFNQyxVQUFVO1FBQ2hCLE1BQU1DLGFBQWFELFFBQVF6QixNQUFNO1FBQ2pDLElBQUkyQixXQUFXO1FBQ2YsSUFBSyxJQUFJMUIsSUFBSSxHQUFHQSxJQUFJb0IsZ0JBQWdCcEIsSUFBSztZQUNyQzBCLFlBQVlGLFFBQVFHLE1BQU0sQ0FBQzFGLEtBQUsyRixLQUFLLENBQUMzRixLQUFLZ0IsTUFBTSxLQUFLd0U7UUFDMUQ7UUFDQSxPQUFPQztJQUNYO0lBQ0FILE9BQU9NLGVBQWUsQ0FBQ1I7SUFDdkIsT0FBT1MsTUFBTUMsSUFBSSxDQUFDVixPQUFPTixTQUFTaUIsSUFBSSxDQUFDO0FBQzNDO0FBQ0EsZUFBZUMsT0FBT0MsWUFBWTtJQUM5QixNQUFNQyxVQUFVLElBQUlDO0lBQ3BCLE1BQU1DLGNBQWNGLFFBQVFHLE1BQU0sQ0FBQ0o7SUFDbkMsTUFBTXpFLE9BQU8sTUFBTThELE9BQU9nQixNQUFNLENBQUNDLE1BQU0sQ0FBQyxXQUFXSDtJQUNuRCxNQUFNSSxRQUFRLElBQUlDLFdBQVdqRjtJQUM3QixPQUFPcUUsTUFBTUMsSUFBSSxDQUFDVSxPQUNiRSxHQUFHLENBQUMsQ0FBQ0MsSUFBTUMsT0FBT0MsWUFBWSxDQUFDRixJQUMvQlosSUFBSSxDQUFDO0FBQ2Q7QUFDTyxlQUFlZSxzQkFBc0JyQixRQUFRO0lBQ2hELE1BQU1zQixtQkFBbUIsT0FBT3pCLFdBQVcsZUFDdkMsT0FBT0EsT0FBT2dCLE1BQU0sS0FBSyxlQUN6QixPQUFPSCxnQkFBZ0I7SUFDM0IsSUFBSSxDQUFDWSxrQkFBa0I7UUFDbkJDLFFBQVFDLElBQUksQ0FBQztRQUNiLE9BQU94QjtJQUNYO0lBQ0EsTUFBTXlCLFNBQVMsTUFBTWxCLE9BQU9QO0lBQzVCLE9BQU8wQixLQUFLRCxRQUFRRSxPQUFPLENBQUMsT0FBTyxLQUFLQSxPQUFPLENBQUMsT0FBTyxLQUFLQSxPQUFPLENBQUMsT0FBTztBQUMvRTtBQUNPLGVBQWVDLDBCQUEwQjdFLE9BQU8sRUFBRThFLFVBQVUsRUFBRUMscUJBQXFCLEtBQUs7SUFDM0YsTUFBTUMsZUFBZXRDO0lBQ3JCLElBQUl1QyxxQkFBcUJEO0lBQ3pCLElBQUlELG9CQUFvQjtRQUNwQkUsc0JBQXNCO0lBQzFCO0lBQ0EsTUFBTWxGLGFBQWFDLFNBQVMsQ0FBQyxFQUFFOEUsV0FBVyxjQUFjLENBQUMsRUFBRUc7SUFDM0QsTUFBTUMsZ0JBQWdCLE1BQU1aLHNCQUFzQlU7SUFDbEQsTUFBTUcsc0JBQXNCSCxpQkFBaUJFLGdCQUFnQixVQUFVO0lBQ3ZFLE9BQU87UUFBQ0E7UUFBZUM7S0FBb0I7QUFDL0M7QUFDQSxnREFBZ0QsR0FDaEQsTUFBTUMsb0JBQW9CO0FBQ25CLFNBQVNDLHdCQUF3QkMsUUFBUTtJQUM1QyxNQUFNQyxhQUFhRCxTQUFTRSxPQUFPLENBQUNDLEdBQUcsQ0FBQ3pJLCtEQUF1QkE7SUFDL0QsSUFBSSxDQUFDdUksWUFBWTtRQUNiLE9BQU87SUFDWDtJQUNBLElBQUksQ0FBQ0EsV0FBV0csS0FBSyxDQUFDTixvQkFBb0I7UUFDdEMsT0FBTztJQUNYO0lBQ0EsSUFBSTtRQUNBLE1BQU1PLE9BQU8sSUFBSWpJLEtBQUssQ0FBQyxFQUFFNkgsV0FBVyxZQUFZLENBQUM7UUFDakQsT0FBT0k7SUFDWCxFQUNBLE9BQU9ySCxHQUFHO1FBQ04sT0FBTztJQUNYO0FBQ0o7QUFDTyxTQUFTc0gsWUFBWUMsR0FBRztJQUMzQixJQUFJLENBQUNBLEtBQUs7UUFDTixNQUFNLElBQUlDLE1BQU07SUFDcEI7SUFDQSxNQUFNdkksVUFBVUMsS0FBSzJGLEtBQUssQ0FBQ3pGLEtBQUtDLEdBQUcsS0FBSztJQUN4QyxJQUFJa0ksT0FBT3RJLFNBQVM7UUFDaEIsTUFBTSxJQUFJdUksTUFBTTtJQUNwQjtBQUNKO0FBQ08sU0FBU0MsYUFBYUMsR0FBRztJQUM1QixPQUFRQTtRQUNKLEtBQUs7WUFDRCxPQUFPO2dCQUNIQyxNQUFNO2dCQUNOakgsTUFBTTtvQkFBRWlILE1BQU07Z0JBQVU7WUFDNUI7UUFDSixLQUFLO1lBQ0QsT0FBTztnQkFDSEEsTUFBTTtnQkFDTkMsWUFBWTtnQkFDWmxILE1BQU07b0JBQUVpSCxNQUFNO2dCQUFVO1lBQzVCO1FBQ0o7WUFDSSxNQUFNLElBQUlILE1BQU07SUFDeEI7QUFDSjtBQUNBLE1BQU1LLGFBQWE7QUFDWixTQUFTQyxhQUFhQyxHQUFHO0lBQzVCLElBQUksQ0FBQ0YsV0FBVzNFLElBQUksQ0FBQzZFLE1BQU07UUFDdkIsTUFBTSxJQUFJUCxNQUFNO0lBQ3BCO0FBQ0o7QUFDTyxTQUFTUTtJQUNaLE1BQU1DLGNBQWMsQ0FBQztJQUNyQixPQUFPLElBQUlDLE1BQU1ELGFBQWE7UUFDMUJkLEtBQUssQ0FBQ2dCLFFBQVFDO1lBQ1YsSUFBSUEsU0FBUyw2QkFBNkI7Z0JBQ3RDLE9BQU87WUFDWDtZQUNBLDhFQUE4RTtZQUM5RSxtRkFBbUY7WUFDbkYsSUFBSSxPQUFPQSxTQUFTLFVBQVU7Z0JBQzFCLE1BQU1DLFFBQVFELEtBQUtsRSxRQUFRO2dCQUMzQixJQUFJbUUsVUFBVSxnQ0FDVkEsVUFBVSxnQ0FDVkEsVUFBVSwrQkFBK0I7b0JBQ3pDLHVCQUF1QjtvQkFDdkIsT0FBT0M7Z0JBQ1g7WUFDSjtZQUNBLE1BQU0sSUFBSWQsTUFBTSxDQUFDLCtIQUErSCxFQUFFWSxLQUFLLGdGQUFnRixDQUFDO1FBQzVPO1FBQ0FHLEtBQUssQ0FBQ0MsU0FBU0o7WUFDWCxNQUFNLElBQUlaLE1BQU0sQ0FBQyw2SEFBNkgsRUFBRVksS0FBSyxrSEFBa0gsQ0FBQztRQUM1UTtRQUNBSyxnQkFBZ0IsQ0FBQ0QsU0FBU0o7WUFDdEIsTUFBTSxJQUFJWixNQUFNLENBQUMsOEhBQThILEVBQUVZLEtBQUssa0hBQWtILENBQUM7UUFDN1E7SUFDSjtBQUNKO0FBQ0E7Ozs7Ozs7Q0FPQyxHQUNNLFNBQVNNLHlCQUF5QkMsSUFBSSxFQUFFQyxrQkFBa0I7SUFDN0QsT0FBTyxJQUFJVixNQUFNUyxNQUFNO1FBQ25CeEIsS0FBSyxDQUFDZ0IsUUFBUUMsTUFBTVM7WUFDaEIsd0NBQXdDO1lBQ3hDLElBQUlULFNBQVMsZ0NBQWdDO2dCQUN6QyxPQUFPO1lBQ1g7WUFDQSw4RUFBOEU7WUFDOUUsa0ZBQWtGO1lBQ2xGLElBQUksT0FBT0EsU0FBUyxVQUFVO2dCQUMxQixNQUFNQyxRQUFRRCxLQUFLbEUsUUFBUTtnQkFDM0IsSUFBSW1FLFVBQVUsZ0NBQ1ZBLFVBQVUsZ0NBQ1ZBLFVBQVUsaUNBQ1ZBLFVBQVUsc0NBQXNDO29CQUNoRCx1RUFBdUU7b0JBQ3ZFLE9BQU9TLFFBQVEzQixHQUFHLENBQUNnQixRQUFRQyxNQUFNUztnQkFDckM7WUFDSjtZQUNBLHdDQUF3QztZQUN4QyxJQUFJLENBQUNELG1CQUFtQjdILEtBQUssSUFBSSxPQUFPcUgsU0FBUyxVQUFVO2dCQUN2RGxDLFFBQVFDLElBQUksQ0FBQztnQkFDYnlDLG1CQUFtQjdILEtBQUssR0FBRztZQUMvQjtZQUNBLE9BQU8rSCxRQUFRM0IsR0FBRyxDQUFDZ0IsUUFBUUMsTUFBTVM7UUFDckM7SUFDSjtBQUNKO0FBQ0E7OztDQUdDLEdBQ00sU0FBU0UsVUFBVUMsR0FBRztJQUN6QixPQUFPcEgsS0FBS0ksS0FBSyxDQUFDSixLQUFLQyxTQUFTLENBQUNtSDtBQUNyQyxFQUNBLG1DQUFtQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvaGVscGVycy5qcz81YTY4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQSV9WRVJTSU9OX0hFQURFUl9OQU1FLCBCQVNFNjRVUkxfUkVHRVggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBdXRoSW52YWxpZEp3dEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgYmFzZTY0VXJsVG9VaW50OEFycmF5LCBzdHJpbmdGcm9tQmFzZTY0VVJMIH0gZnJvbSAnLi9iYXNlNjR1cmwnO1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGlyZXNBdChleHBpcmVzSW4pIHtcbiAgICBjb25zdCB0aW1lTm93ID0gTWF0aC5yb3VuZChEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgcmV0dXJuIHRpbWVOb3cgKyBleHBpcmVzSW47XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBpbnRlcm5hbCBjYWxsYmFjayBzdWJzY3JpcHRpb25zLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBKYXZhU2NyaXB0IFN5bWJvbHMgdG8gY3JlYXRlIGd1YXJhbnRlZWQtdW5pcXVlIGlkZW50aWZpZXJzXG4gKiBmb3IgYXV0aCBzdGF0ZSBjaGFuZ2UgY2FsbGJhY2tzLiBTeW1ib2xzIGFyZSBpZGVhbCBmb3IgdGhpcyB1c2UgY2FzZSBiZWNhdXNlOlxuICogLSBUaGV5IGFyZSBndWFyYW50ZWVkIHVuaXF1ZSBieSB0aGUgSmF2YVNjcmlwdCBydW50aW1lXG4gKiAtIFRoZXkgd29yayBpbiBhbGwgZW52aXJvbm1lbnRzIChicm93c2VyLCBTU1IsIE5vZGUuanMpXG4gKiAtIFRoZXkgYXZvaWQgaXNzdWVzIHdpdGggTmV4dC5qcyAxNiBkZXRlcm1pbmlzdGljIHJlbmRlcmluZyByZXF1aXJlbWVudHNcbiAqIC0gVGhleSBhcmUgcGVyZmVjdCBmb3IgaW50ZXJuYWwsIG5vbi1zZXJpYWxpemFibGUgaWRlbnRpZmllcnNcbiAqXG4gKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3IgaW50ZXJuYWwgc3Vic2NyaXB0aW9uIG1hbmFnZW1lbnQsXG4gKiBub3QgZm9yIHNlY3VyaXR5LWNyaXRpY2FsIG9wZXJhdGlvbnMgbGlrZSBzZXNzaW9uIHRva2Vucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ2FsbGJhY2tJZCgpIHtcbiAgICByZXR1cm4gU3ltYm9sKCdhdXRoLWNhbGxiYWNrJyk7XG59XG5leHBvcnQgY29uc3QgaXNCcm93c2VyID0gKCkgPT4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbmNvbnN0IGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMgPSB7XG4gICAgdGVzdGVkOiBmYWxzZSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG59O1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBsb2NhbFN0b3JhZ2UgaXMgc3VwcG9ydGVkIG9uIHRoaXMgYnJvd3Nlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHN1cHBvcnRzTG9jYWxTdG9yYWdlID0gKCkgPT4ge1xuICAgIGlmICghaXNCcm93c2VyKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMubG9jYWxTdG9yYWdlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIERPTSBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcgYGxvY2FsU3RvcmFnZWBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobG9jYWxTdG9yYWdlV3JpdGVUZXN0cy50ZXN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMud3JpdGFibGU7XG4gICAgfVxuICAgIGNvbnN0IHJhbmRvbUtleSA9IGBsc3d0LSR7TWF0aC5yYW5kb20oKX0ke01hdGgucmFuZG9tKCl9YDtcbiAgICB0cnkge1xuICAgICAgICBnbG9iYWxUaGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHJhbmRvbUtleSwgcmFuZG9tS2V5KTtcbiAgICAgICAgZ2xvYmFsVGhpcy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShyYW5kb21LZXkpO1xuICAgICAgICBsb2NhbFN0b3JhZ2VXcml0ZVRlc3RzLnRlc3RlZCA9IHRydWU7XG4gICAgICAgIGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMud3JpdGFibGUgPSB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAvLyBsb2NhbFN0b3JhZ2UgY2FuJ3QgYmUgd3JpdHRlbiB0b1xuICAgICAgICAvLyBodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvZm9yLXRlc3RlcnMvYnVnLXJlcG9ydGluZy1ndWlkZWxpbmVzL3VuY2F1Z2h0LXNlY3VyaXR5ZXJyb3ItZmFpbGVkLXRvLXJlYWQtdGhlLWxvY2Fsc3RvcmFnZS1wcm9wZXJ0eS1mcm9tLXdpbmRvdy1hY2Nlc3MtaXMtZGVuaWVkLWZvci10aGlzLWRvY3VtZW50XG4gICAgICAgIGxvY2FsU3RvcmFnZVdyaXRlVGVzdHMudGVzdGVkID0gdHJ1ZTtcbiAgICAgICAgbG9jYWxTdG9yYWdlV3JpdGVUZXN0cy53cml0YWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlV3JpdGVUZXN0cy53cml0YWJsZTtcbn07XG4vKipcbiAqIEV4dHJhY3RzIHBhcmFtZXRlcnMgZW5jb2RlZCBpbiB0aGUgVVJMIGJvdGggaW4gdGhlIHF1ZXJ5IGFuZCBmcmFnbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGFyYW1ldGVyc0Zyb21VUkwoaHJlZikge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoaHJlZik7XG4gICAgaWYgKHVybC5oYXNoICYmIHVybC5oYXNoWzBdID09PSAnIycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhhc2hTZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5oYXNoLnN1YnN0cmluZygxKSk7XG4gICAgICAgICAgICBoYXNoU2VhcmNoUGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGhhc2ggaXMgbm90IGEgcXVlcnkgc3RyaW5nXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gc2VhcmNoIHBhcmFtZXRlcnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgaGFzaCBwYXJhbWV0ZXJzXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjb25zdCByZXNvbHZlRmV0Y2ggPSAoY3VzdG9tRmV0Y2gpID0+IHtcbiAgICBpZiAoY3VzdG9tRmV0Y2gpIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiBjdXN0b21GZXRjaCguLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiBmZXRjaCguLi5hcmdzKTtcbn07XG5leHBvcnQgY29uc3QgbG9va3NMaWtlRmV0Y2hSZXNwb25zZSA9IChtYXliZVJlc3BvbnNlKSA9PiB7XG4gICAgcmV0dXJuICh0eXBlb2YgbWF5YmVSZXNwb25zZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgbWF5YmVSZXNwb25zZSAhPT0gbnVsbCAmJlxuICAgICAgICAnc3RhdHVzJyBpbiBtYXliZVJlc3BvbnNlICYmXG4gICAgICAgICdvaycgaW4gbWF5YmVSZXNwb25zZSAmJlxuICAgICAgICAnanNvbicgaW4gbWF5YmVSZXNwb25zZSAmJlxuICAgICAgICB0eXBlb2YgbWF5YmVSZXNwb25zZS5qc29uID09PSAnZnVuY3Rpb24nKTtcbn07XG4vLyBTdG9yYWdlIGhlbHBlcnNcbmV4cG9ydCBjb25zdCBzZXRJdGVtQXN5bmMgPSBhc3luYyAoc3RvcmFnZSwga2V5LCBkYXRhKSA9PiB7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRJdGVtQXN5bmMgPSBhc3luYyAoc3RvcmFnZSwga2V5KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBzdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCByZW1vdmVJdGVtQXN5bmMgPSBhc3luYyAoc3RvcmFnZSwga2V5KSA9PiB7XG4gICAgYXdhaXQgc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG59O1xuLyoqXG4gKiBBIGRlZmVycmVkIHJlcHJlc2VudHMgc29tZSBhc3luY2hyb25vdXMgd29yayB0aGF0IGlzIG5vdCB5ZXQgZmluaXNoZWQsIHdoaWNoXG4gKiBtYXkgb3IgbWF5IG5vdCBjdWxtaW5hdGUgaW4gYSB2YWx1ZS5cbiAqIFRha2VuIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9taWtlLW5vcnRoL3R5cGVzL2Jsb2IvbWFzdGVyL3NyYy9hc3luYy50c1xuICovXG5leHBvcnQgY2xhc3MgRGVmZXJyZWQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4dHJhLXNlbWlcbiAgICAgICAgO1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgRGVmZXJyZWQucHJvbWlzZUNvbnN0cnVjdG9yKChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHRyYS1zZW1pXG4gICAgICAgICAgICA7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXM7XG4gICAgICAgICAgICB0aGlzLnJlamVjdCA9IHJlajtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuRGVmZXJyZWQucHJvbWlzZUNvbnN0cnVjdG9yID0gUHJvbWlzZTtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVKV1QodG9rZW4pIHtcbiAgICBjb25zdCBwYXJ0cyA9IHRva2VuLnNwbGl0KCcuJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEludmFsaWRKd3RFcnJvcignSW52YWxpZCBKV1Qgc3RydWN0dXJlJyk7XG4gICAgfVxuICAgIC8vIFJlZ2V4IGNoZWNrcyBmb3IgYmFzZTY0dXJsIGZvcm1hdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFCQVNFNjRVUkxfUkVHRVgudGVzdChwYXJ0c1tpXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBdXRoSW52YWxpZEp3dEVycm9yKCdKV1Qgbm90IGluIGJhc2U2NHVybCBmb3JtYXQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAvLyB1c2luZyBiYXNlNjR1cmwgbGliXG4gICAgICAgIGhlYWRlcjogSlNPTi5wYXJzZShzdHJpbmdGcm9tQmFzZTY0VVJMKHBhcnRzWzBdKSksXG4gICAgICAgIHBheWxvYWQ6IEpTT04ucGFyc2Uoc3RyaW5nRnJvbUJhc2U2NFVSTChwYXJ0c1sxXSkpLFxuICAgICAgICBzaWduYXR1cmU6IGJhc2U2NFVybFRvVWludDhBcnJheShwYXJ0c1syXSksXG4gICAgICAgIHJhdzoge1xuICAgICAgICAgICAgaGVhZGVyOiBwYXJ0c1swXSxcbiAgICAgICAgICAgIHBheWxvYWQ6IHBhcnRzWzFdLFxuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIGRhdGE7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gbnVsbCBhZnRlciBzb21lIHRpbWUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcCh0aW1lKSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChhY2NlcHQpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBhY2NlcHQobnVsbCksIHRpbWUpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgcHJvdmlkZWQgYXN5bmMgZnVuY3Rpb24gaW50byBhIHJldHJ5YWJsZSBmdW5jdGlvbi4gRWFjaCByZXN1bHRcbiAqIG9yIHRocm93biBlcnJvciBpcyBzZW50IHRvIHRoZSBpc1JldHJ5YWJsZSBmdW5jdGlvbiB3aGljaCBzaG91bGQgcmV0dXJuIHRydWVcbiAqIGlmIHRoZSBmdW5jdGlvbiBzaG91bGQgcnVuIGFnYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV0cnlhYmxlKGZuLCBpc1JldHJ5YWJsZSkge1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoYWNjZXB0LCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHRyYS1zZW1pXG4gICAgICAgIDtcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgSW5maW5pdHk7IGF0dGVtcHQrKykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGF0dGVtcHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUmV0cnlhYmxlKGF0dGVtcHQsIG51bGwsIHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNSZXRyeWFibGUoYXR0ZW1wdCwgZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGRlYzJoZXgoZGVjKSB7XG4gICAgcmV0dXJuICgnMCcgKyBkZWMudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTIpO1xufVxuLy8gRnVuY3Rpb25zIGJlbG93IHRha2VuIGZyb206IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYzMzA5NDA5L2NyZWF0aW5nLWEtY29kZS12ZXJpZmllci1hbmQtY2hhbGxlbmdlLWZvci1wa2NlLWF1dGgtb24tc3BvdGlmeS1hcGktaW4tcmVhY3Rqc1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUEtDRVZlcmlmaWVyKCkge1xuICAgIGNvbnN0IHZlcmlmaWVyTGVuZ3RoID0gNTY7XG4gICAgY29uc3QgYXJyYXkgPSBuZXcgVWludDMyQXJyYXkodmVyaWZpZXJMZW5ndGgpO1xuICAgIGlmICh0eXBlb2YgY3J5cHRvID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCBjaGFyU2V0ID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LS5ffic7XG4gICAgICAgIGNvbnN0IGNoYXJTZXRMZW4gPSBjaGFyU2V0Lmxlbmd0aDtcbiAgICAgICAgbGV0IHZlcmlmaWVyID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVyaWZpZXJMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmVyaWZpZXIgKz0gY2hhclNldC5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhclNldExlbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2ZXJpZmllcjtcbiAgICB9XG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oYXJyYXksIGRlYzJoZXgpLmpvaW4oJycpO1xufVxuYXN5bmMgZnVuY3Rpb24gc2hhMjU2KHJhbmRvbVN0cmluZykge1xuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICBjb25zdCBlbmNvZGVkRGF0YSA9IGVuY29kZXIuZW5jb2RlKHJhbmRvbVN0cmluZyk7XG4gICAgY29uc3QgaGFzaCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgZW5jb2RlZERhdGEpO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoaGFzaCk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMpXG4gICAgICAgIC5tYXAoKGMpID0+IFN0cmluZy5mcm9tQ2hhckNvZGUoYykpXG4gICAgICAgIC5qb2luKCcnKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBLQ0VDaGFsbGVuZ2UodmVyaWZpZXIpIHtcbiAgICBjb25zdCBoYXNDcnlwdG9TdXBwb3J0ID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIGNyeXB0by5zdWJ0bGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgaWYgKCFoYXNDcnlwdG9TdXBwb3J0KSB7XG4gICAgICAgIGNvbnNvbGUud2FybignV2ViQ3J5cHRvIEFQSSBpcyBub3Qgc3VwcG9ydGVkLiBDb2RlIGNoYWxsZW5nZSBtZXRob2Qgd2lsbCBkZWZhdWx0IHRvIHVzZSBwbGFpbiBpbnN0ZWFkIG9mIHNoYTI1Ni4nKTtcbiAgICAgICAgcmV0dXJuIHZlcmlmaWVyO1xuICAgIH1cbiAgICBjb25zdCBoYXNoZWQgPSBhd2FpdCBzaGEyNTYodmVyaWZpZXIpO1xuICAgIHJldHVybiBidG9hKGhhc2hlZCkucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvZGVDaGFsbGVuZ2VBbmRNZXRob2Qoc3RvcmFnZSwgc3RvcmFnZUtleSwgaXNQYXNzd29yZFJlY292ZXJ5ID0gZmFsc2UpIHtcbiAgICBjb25zdCBjb2RlVmVyaWZpZXIgPSBnZW5lcmF0ZVBLQ0VWZXJpZmllcigpO1xuICAgIGxldCBzdG9yZWRDb2RlVmVyaWZpZXIgPSBjb2RlVmVyaWZpZXI7XG4gICAgaWYgKGlzUGFzc3dvcmRSZWNvdmVyeSkge1xuICAgICAgICBzdG9yZWRDb2RlVmVyaWZpZXIgKz0gJy9QQVNTV09SRF9SRUNPVkVSWSc7XG4gICAgfVxuICAgIGF3YWl0IHNldEl0ZW1Bc3luYyhzdG9yYWdlLCBgJHtzdG9yYWdlS2V5fS1jb2RlLXZlcmlmaWVyYCwgc3RvcmVkQ29kZVZlcmlmaWVyKTtcbiAgICBjb25zdCBjb2RlQ2hhbGxlbmdlID0gYXdhaXQgZ2VuZXJhdGVQS0NFQ2hhbGxlbmdlKGNvZGVWZXJpZmllcik7XG4gICAgY29uc3QgY29kZUNoYWxsZW5nZU1ldGhvZCA9IGNvZGVWZXJpZmllciA9PT0gY29kZUNoYWxsZW5nZSA/ICdwbGFpbicgOiAnczI1Nic7XG4gICAgcmV0dXJuIFtjb2RlQ2hhbGxlbmdlLCBjb2RlQ2hhbGxlbmdlTWV0aG9kXTtcbn1cbi8qKiBQYXJzZXMgdGhlIEFQSSB2ZXJzaW9uIHdoaWNoIGlzIDJZWVktTU0tREQuICovXG5jb25zdCBBUElfVkVSU0lPTl9SRUdFWCA9IC9eMlswLTldezN9LSgwWzEtOV18MVswLTJdKS0oMFsxLTldfDFbMC05XXwyWzAtOV18M1swLTFdKSQvaTtcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlc3BvbnNlQVBJVmVyc2lvbihyZXNwb25zZSkge1xuICAgIGNvbnN0IGFwaVZlcnNpb24gPSByZXNwb25zZS5oZWFkZXJzLmdldChBUElfVkVSU0lPTl9IRUFERVJfTkFNRSk7XG4gICAgaWYgKCFhcGlWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoIWFwaVZlcnNpb24ubWF0Y2goQVBJX1ZFUlNJT05fUkVHRVgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoYCR7YXBpVmVyc2lvbn1UMDA6MDA6MDAuMFpgKTtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUV4cChleHApIHtcbiAgICBpZiAoIWV4cCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZXhwIGNsYWltJyk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVOb3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICBpZiAoZXhwIDw9IHRpbWVOb3cpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdKV1QgaGFzIGV4cGlyZWQnKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxnb3JpdGhtKGFsZykge1xuICAgIHN3aXRjaCAoYWxnKSB7XG4gICAgICAgIGNhc2UgJ1JTMjU2JzpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQVNTQS1QS0NTMS12MV81JyxcbiAgICAgICAgICAgICAgICBoYXNoOiB7IG5hbWU6ICdTSEEtMjU2JyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnRVMyNTYnOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnRUNEU0EnLFxuICAgICAgICAgICAgICAgIG5hbWVkQ3VydmU6ICdQLTI1NicsXG4gICAgICAgICAgICAgICAgaGFzaDogeyBuYW1lOiAnU0hBLTI1NicgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYWxnIGNsYWltJyk7XG4gICAgfVxufVxuY29uc3QgVVVJRF9SRUdFWCA9IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC87XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVVVUlEKHN0cikge1xuICAgIGlmICghVVVJRF9SRUdFWC50ZXN0KHN0cikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc3VwYWJhc2UvYXV0aC1qczogRXhwZWN0ZWQgcGFyYW1ldGVyIHRvIGJlIFVVSUQgYnV0IGlzIG5vdCcpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VyTm90QXZhaWxhYmxlUHJveHkoKSB7XG4gICAgY29uc3QgcHJveHlUYXJnZXQgPSB7fTtcbiAgICByZXR1cm4gbmV3IFByb3h5KHByb3h5VGFyZ2V0LCB7XG4gICAgICAgIGdldDogKHRhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdfX2lzVXNlck5vdEF2YWlsYWJsZVByb3h5Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUHJldmVudGF0aXZlIGNoZWNrIGZvciBjb21tb24gcHJvYmxlbWF0aWMgc3ltYm9scyBkdXJpbmcgY2xvbmluZy9pbnNwZWN0aW9uXG4gICAgICAgICAgICAvLyBUaGVzZSBzeW1ib2xzIG1pZ2h0IGJlIGFjY2Vzc2VkIGJ5IHN0cnVjdHVyZWRDbG9uZSBvciBvdGhlciBpbnRlcm5hbCBtZWNoYW5pc21zLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNQcm9wID0gcHJvcC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmIChzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9QcmltaXRpdmUpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9TdHJpbmdUYWcpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbCh1dGlsLmluc3BlY3QuY3VzdG9tKScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm9kZS5qcyB1dGlsLmluc3BlY3RcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBjbGllbnQgd2FzIGNyZWF0ZWQgd2l0aCB1c2VyU3RvcmFnZSBvcHRpb24gYW5kIHRoZXJlIHdhcyBubyB1c2VyIHN0b3JlZCBpbiB0aGUgdXNlciBzdG9yYWdlLiBBY2Nlc3NpbmcgdGhlIFwiJHtwcm9wfVwiIHByb3BlcnR5IG9mIHRoZSBzZXNzaW9uIG9iamVjdCBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIGdldFVzZXIoKSBpbnN0ZWFkLmApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBjbGllbnQgd2FzIGNyZWF0ZWQgd2l0aCB1c2VyU3RvcmFnZSBvcHRpb24gYW5kIHRoZXJlIHdhcyBubyB1c2VyIHN0b3JlZCBpbiB0aGUgdXNlciBzdG9yYWdlLiBTZXR0aW5nIHRoZSBcIiR7cHJvcH1cIiBwcm9wZXJ0eSBvZiB0aGUgc2Vzc2lvbiBvYmplY3QgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBnZXRVc2VyKCkgdG8gZmV0Y2ggYSB1c2VyIG9iamVjdCB5b3UgY2FuIG1hbmlwdWxhdGUuYCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZVByb3BlcnR5OiAoX3RhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogY2xpZW50IHdhcyBjcmVhdGVkIHdpdGggdXNlclN0b3JhZ2Ugb3B0aW9uIGFuZCB0aGVyZSB3YXMgbm8gdXNlciBzdG9yZWQgaW4gdGhlIHVzZXIgc3RvcmFnZS4gRGVsZXRpbmcgdGhlIFwiJHtwcm9wfVwiIHByb3BlcnR5IG9mIHRoZSBzZXNzaW9uIG9iamVjdCBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIGdldFVzZXIoKSB0byBmZXRjaCBhIHVzZXIgb2JqZWN0IHlvdSBjYW4gbWFuaXB1bGF0ZS5gKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHByb3h5IGFyb3VuZCBhIHVzZXIgb2JqZWN0IHRoYXQgd2FybnMgd2hlbiBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZCBvbiB0aGUgc2VydmVyLlxuICogVGhpcyBpcyB1c2VkIHRvIGFsZXJ0IGRldmVsb3BlcnMgdGhhdCB1c2luZyB1c2VyIGRhdGEgZnJvbSBnZXRTZXNzaW9uKCkgb24gdGhlIHNlcnZlciBpcyBpbnNlY3VyZS5cbiAqXG4gKiBAcGFyYW0gdXNlciBUaGUgYWN0dWFsIHVzZXIgb2JqZWN0IHRvIHdyYXBcbiAqIEBwYXJhbSBzdXBwcmVzc1dhcm5pbmdSZWYgQW4gb2JqZWN0IHdpdGggYSAndmFsdWUnIHByb3BlcnR5IHRoYXQgY29udHJvbHMgd2FybmluZyBzdXBwcmVzc2lvblxuICogQHJldHVybnMgQSBwcm94aWVkIHVzZXIgb2JqZWN0IHRoYXQgd2FybnMgb24gcHJvcGVydHkgYWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlY3VyZVVzZXJXYXJuaW5nUHJveHkodXNlciwgc3VwcHJlc3NXYXJuaW5nUmVmKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh1c2VyLCB7XG4gICAgICAgIGdldDogKHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgICAgIC8vIEFsbG93IGludGVybmFsIGNoZWNrcyB3aXRob3V0IHdhcm5pbmdcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnX19pc0luc2VjdXJlVXNlcldhcm5pbmdQcm94eScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFByZXZlbnRhdGl2ZSBjaGVjayBmb3IgY29tbW9uIHByb2JsZW1hdGljIHN5bWJvbHMgZHVyaW5nIGNsb25pbmcvaW5zcGVjdGlvblxuICAgICAgICAgICAgLy8gVGhlc2Ugc3ltYm9scyBtaWdodCBiZSBhY2Nlc3NlZCBieSBzdHJ1Y3R1cmVkQ2xvbmUgb3Igb3RoZXIgaW50ZXJuYWwgbWVjaGFuaXNtc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNQcm9wID0gcHJvcC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmIChzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9QcmltaXRpdmUpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbChTeW1ib2wudG9TdHJpbmdUYWcpJyB8fFxuICAgICAgICAgICAgICAgICAgICBzUHJvcCA9PT0gJ1N5bWJvbCh1dGlsLmluc3BlY3QuY3VzdG9tKScgfHxcbiAgICAgICAgICAgICAgICAgICAgc1Byb3AgPT09ICdTeW1ib2wobm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20pJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGFjdHVhbCB2YWx1ZSBmb3IgdGhlc2Ugc3ltYm9scyB0byBhbGxvdyBwcm9wZXIgaW5zcGVjdGlvblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW1pdCB3YXJuaW5nIG9uIGZpcnN0IHByb3BlcnR5IGFjY2Vzc1xuICAgICAgICAgICAgaWYgKCFzdXBwcmVzc1dhcm5pbmdSZWYudmFsdWUgJiYgdHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdVc2luZyB0aGUgdXNlciBvYmplY3QgYXMgcmV0dXJuZWQgZnJvbSBzdXBhYmFzZS5hdXRoLmdldFNlc3Npb24oKSBvciBmcm9tIHNvbWUgc3VwYWJhc2UuYXV0aC5vbkF1dGhTdGF0ZUNoYW5nZSgpIGV2ZW50cyBjb3VsZCBiZSBpbnNlY3VyZSEgVGhpcyB2YWx1ZSBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBzdG9yYWdlIG1lZGl1bSAodXN1YWxseSBjb29raWVzIG9uIHRoZSBzZXJ2ZXIpIGFuZCBtYXkgbm90IGJlIGF1dGhlbnRpYy4gVXNlIHN1cGFiYXNlLmF1dGguZ2V0VXNlcigpIGluc3RlYWQgd2hpY2ggYXV0aGVudGljYXRlcyB0aGUgZGF0YSBieSBjb250YWN0aW5nIHRoZSBTdXBhYmFzZSBBdXRoIHNlcnZlci4nKTtcbiAgICAgICAgICAgICAgICBzdXBwcmVzc1dhcm5pbmdSZWYudmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuLyoqXG4gKiBEZWVwIGNsb25lcyBhIEpTT04tc2VyaWFsaXphYmxlIG9iamVjdCB1c2luZyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpLlxuICogTm90ZTogT25seSB3b3JrcyBmb3IgSlNPTi1zYWZlIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmUob2JqKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXJzLmpzLm1hcCJdLCJuYW1lcyI6WyJBUElfVkVSU0lPTl9IRUFERVJfTkFNRSIsIkJBU0U2NFVSTF9SRUdFWCIsIkF1dGhJbnZhbGlkSnd0RXJyb3IiLCJiYXNlNjRVcmxUb1VpbnQ4QXJyYXkiLCJzdHJpbmdGcm9tQmFzZTY0VVJMIiwiZXhwaXJlc0F0IiwiZXhwaXJlc0luIiwidGltZU5vdyIsIk1hdGgiLCJyb3VuZCIsIkRhdGUiLCJub3ciLCJnZW5lcmF0ZUNhbGxiYWNrSWQiLCJTeW1ib2wiLCJpc0Jyb3dzZXIiLCJkb2N1bWVudCIsImxvY2FsU3RvcmFnZVdyaXRlVGVzdHMiLCJ0ZXN0ZWQiLCJ3cml0YWJsZSIsInN1cHBvcnRzTG9jYWxTdG9yYWdlIiwiZ2xvYmFsVGhpcyIsImxvY2FsU3RvcmFnZSIsImUiLCJyYW5kb21LZXkiLCJyYW5kb20iLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsInBhcnNlUGFyYW1ldGVyc0Zyb21VUkwiLCJocmVmIiwicmVzdWx0IiwidXJsIiwiVVJMIiwiaGFzaCIsImhhc2hTZWFyY2hQYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJzdWJzdHJpbmciLCJmb3JFYWNoIiwidmFsdWUiLCJrZXkiLCJzZWFyY2hQYXJhbXMiLCJyZXNvbHZlRmV0Y2giLCJjdXN0b21GZXRjaCIsImFyZ3MiLCJmZXRjaCIsImxvb2tzTGlrZUZldGNoUmVzcG9uc2UiLCJtYXliZVJlc3BvbnNlIiwianNvbiIsInNldEl0ZW1Bc3luYyIsInN0b3JhZ2UiLCJkYXRhIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldEl0ZW1Bc3luYyIsImdldEl0ZW0iLCJwYXJzZSIsIl9hIiwicmVtb3ZlSXRlbUFzeW5jIiwiRGVmZXJyZWQiLCJjb25zdHJ1Y3RvciIsInByb21pc2UiLCJwcm9taXNlQ29uc3RydWN0b3IiLCJyZXMiLCJyZWoiLCJyZXNvbHZlIiwicmVqZWN0IiwiUHJvbWlzZSIsImRlY29kZUpXVCIsInRva2VuIiwicGFydHMiLCJzcGxpdCIsImxlbmd0aCIsImkiLCJ0ZXN0IiwiaGVhZGVyIiwicGF5bG9hZCIsInNpZ25hdHVyZSIsInJhdyIsInNsZWVwIiwidGltZSIsImFjY2VwdCIsInNldFRpbWVvdXQiLCJyZXRyeWFibGUiLCJmbiIsImlzUmV0cnlhYmxlIiwiYXR0ZW1wdCIsIkluZmluaXR5IiwiZGVjMmhleCIsImRlYyIsInRvU3RyaW5nIiwic3Vic3RyIiwiZ2VuZXJhdGVQS0NFVmVyaWZpZXIiLCJ2ZXJpZmllckxlbmd0aCIsImFycmF5IiwiVWludDMyQXJyYXkiLCJjcnlwdG8iLCJjaGFyU2V0IiwiY2hhclNldExlbiIsInZlcmlmaWVyIiwiY2hhckF0IiwiZmxvb3IiLCJnZXRSYW5kb21WYWx1ZXMiLCJBcnJheSIsImZyb20iLCJqb2luIiwic2hhMjU2IiwicmFuZG9tU3RyaW5nIiwiZW5jb2RlciIsIlRleHRFbmNvZGVyIiwiZW5jb2RlZERhdGEiLCJlbmNvZGUiLCJzdWJ0bGUiLCJkaWdlc3QiLCJieXRlcyIsIlVpbnQ4QXJyYXkiLCJtYXAiLCJjIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiZ2VuZXJhdGVQS0NFQ2hhbGxlbmdlIiwiaGFzQ3J5cHRvU3VwcG9ydCIsImNvbnNvbGUiLCJ3YXJuIiwiaGFzaGVkIiwiYnRvYSIsInJlcGxhY2UiLCJnZXRDb2RlQ2hhbGxlbmdlQW5kTWV0aG9kIiwic3RvcmFnZUtleSIsImlzUGFzc3dvcmRSZWNvdmVyeSIsImNvZGVWZXJpZmllciIsInN0b3JlZENvZGVWZXJpZmllciIsImNvZGVDaGFsbGVuZ2UiLCJjb2RlQ2hhbGxlbmdlTWV0aG9kIiwiQVBJX1ZFUlNJT05fUkVHRVgiLCJwYXJzZVJlc3BvbnNlQVBJVmVyc2lvbiIsInJlc3BvbnNlIiwiYXBpVmVyc2lvbiIsImhlYWRlcnMiLCJnZXQiLCJtYXRjaCIsImRhdGUiLCJ2YWxpZGF0ZUV4cCIsImV4cCIsIkVycm9yIiwiZ2V0QWxnb3JpdGhtIiwiYWxnIiwibmFtZSIsIm5hbWVkQ3VydmUiLCJVVUlEX1JFR0VYIiwidmFsaWRhdGVVVUlEIiwic3RyIiwidXNlck5vdEF2YWlsYWJsZVByb3h5IiwicHJveHlUYXJnZXQiLCJQcm94eSIsInRhcmdldCIsInByb3AiLCJzUHJvcCIsInVuZGVmaW5lZCIsInNldCIsIl90YXJnZXQiLCJkZWxldGVQcm9wZXJ0eSIsImluc2VjdXJlVXNlcldhcm5pbmdQcm94eSIsInVzZXIiLCJzdXBwcmVzc1dhcm5pbmdSZWYiLCJyZWNlaXZlciIsIlJlZmxlY3QiLCJkZWVwQ2xvbmUiLCJvYmoiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js":
|
||
/*!*************************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js ***!
|
||
\*************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ memoryLocalStorageAdapter: () => (/* binding */ memoryLocalStorageAdapter)\n/* harmony export */ });\n/**\n * Returns a localStorage-like object that stores the key-value pairs in\n * memory.\n */ function memoryLocalStorageAdapter(store = {}) {\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvbG9jYWwtc3RvcmFnZS5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7OztDQUdDLEdBQ00sU0FBU0EsMEJBQTBCQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxPQUFPO1FBQ0hDLFNBQVMsQ0FBQ0M7WUFDTixPQUFPRixLQUFLLENBQUNFLElBQUksSUFBSTtRQUN6QjtRQUNBQyxTQUFTLENBQUNELEtBQUtFO1lBQ1hKLEtBQUssQ0FBQ0UsSUFBSSxHQUFHRTtRQUNqQjtRQUNBQyxZQUFZLENBQUNIO1lBQ1QsT0FBT0YsS0FBSyxDQUFDRSxJQUFJO1FBQ3JCO0lBQ0o7QUFDSixFQUNBLHlDQUF5QyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvbG9jYWwtc3RvcmFnZS5qcz8yM2MyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmV0dXJucyBhIGxvY2FsU3RvcmFnZS1saWtlIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUga2V5LXZhbHVlIHBhaXJzIGluXG4gKiBtZW1vcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vcnlMb2NhbFN0b3JhZ2VBZGFwdGVyKHN0b3JlID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXRJdGVtOiAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmVba2V5XSB8fCBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBzZXRJdGVtOiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgc3RvcmVba2V5XSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVJdGVtOiAoa2V5KSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgc3RvcmVba2V5XTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9jYWwtc3RvcmFnZS5qcy5tYXAiXSwibmFtZXMiOlsibWVtb3J5TG9jYWxTdG9yYWdlQWRhcHRlciIsInN0b3JlIiwiZ2V0SXRlbSIsImtleSIsInNldEl0ZW0iLCJ2YWx1ZSIsInJlbW92ZUl0ZW0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js":
|
||
/*!*************************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js ***!
|
||
\*************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ memoryLocalStorageAdapter: () => (/* binding */ memoryLocalStorageAdapter)\n/* harmony export */ });\n/**\n * Returns a localStorage-like object that stores the key-value pairs in\n * memory.\n */ function memoryLocalStorageAdapter(store = {}) {\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2xvY2FsLXN0b3JhZ2UuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7Q0FHQyxHQUNNLFNBQVNBLDBCQUEwQkMsUUFBUSxDQUFDLENBQUM7SUFDaEQsT0FBTztRQUNIQyxTQUFTLENBQUNDO1lBQ04sT0FBT0YsS0FBSyxDQUFDRSxJQUFJLElBQUk7UUFDekI7UUFDQUMsU0FBUyxDQUFDRCxLQUFLRTtZQUNYSixLQUFLLENBQUNFLElBQUksR0FBR0U7UUFDakI7UUFDQUMsWUFBWSxDQUFDSDtZQUNULE9BQU9GLEtBQUssQ0FBQ0UsSUFBSTtRQUNyQjtJQUNKO0FBQ0osRUFDQSx5Q0FBeUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2xvY2FsLXN0b3JhZ2UuanM/MjNjMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJldHVybnMgYSBsb2NhbFN0b3JhZ2UtbGlrZSBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIGtleS12YWx1ZSBwYWlycyBpblxuICogbWVtb3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtb3J5TG9jYWxTdG9yYWdlQWRhcHRlcihzdG9yZSA9IHt9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0SXRlbTogKGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlW2tleV0gfHwgbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0SXRlbTogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIHN0b3JlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlSXRlbTogKGtleSkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHN0b3JlW2tleV07XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvY2FsLXN0b3JhZ2UuanMubWFwIl0sIm5hbWVzIjpbIm1lbW9yeUxvY2FsU3RvcmFnZUFkYXB0ZXIiLCJzdG9yZSIsImdldEl0ZW0iLCJrZXkiLCJzZXRJdGVtIiwidmFsdWUiLCJyZW1vdmVJdGVtIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/local-storage.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/locks.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LockAcquireTimeoutError: () => (/* binding */ LockAcquireTimeoutError),\n/* harmony export */ NavigatorLockAcquireTimeoutError: () => (/* binding */ NavigatorLockAcquireTimeoutError),\n/* harmony export */ ProcessLockAcquireTimeoutError: () => (/* binding */ ProcessLockAcquireTimeoutError),\n/* harmony export */ internals: () => (/* binding */ internals),\n/* harmony export */ navigatorLock: () => (/* binding */ navigatorLock),\n/* harmony export */ processLock: () => (/* binding */ processLock)\n/* harmony export */ });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"(action-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 \"${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 \"${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvbG9ja3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFpRDtBQUNqRDs7Q0FFQyxHQUNNLE1BQU1DLFlBQVk7SUFDckI7O0tBRUMsR0FDREMsT0FBTyxDQUFDLENBQUVDLENBQUFBLGNBQ05ILDhEQUFvQkEsTUFDcEJHLFdBQVdDLFlBQVksSUFDdkJELFdBQVdDLFlBQVksQ0FBQ0MsT0FBTyxDQUFDLHNDQUFzQyxNQUFLO0FBQ25GLEVBQUU7QUFDRjs7Ozs7Ozs7Ozs7Ozs7O0NBZUMsR0FDTSxNQUFNQyxnQ0FBZ0NDO0lBQ3pDQyxZQUFZQyxPQUFPLENBQUU7UUFDakIsS0FBSyxDQUFDQTtRQUNOLElBQUksQ0FBQ0MsZ0JBQWdCLEdBQUc7SUFDNUI7QUFDSjtBQUNBOzs7Ozs7Ozs7Q0FTQyxHQUNNLE1BQU1DLHlDQUF5Q0w7QUFDdEQ7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNTSx1Q0FBdUNOO0FBQ3BEO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThCQyxHQUNNLGVBQWVPLGNBQWNDLElBQUksRUFBRUMsY0FBYyxFQUFFQyxFQUFFO0lBQ3hELElBQUlmLFVBQVVDLEtBQUssRUFBRTtRQUNqQmUsUUFBUUMsR0FBRyxDQUFDLG9EQUFvREosTUFBTUM7SUFDMUU7SUFDQSxNQUFNSSxrQkFBa0IsSUFBSWhCLFdBQVdpQixlQUFlO0lBQ3RELElBQUlMLGlCQUFpQixHQUFHO1FBQ3BCTSxXQUFXO1lBQ1BGLGdCQUFnQkcsS0FBSztZQUNyQixJQUFJckIsVUFBVUMsS0FBSyxFQUFFO2dCQUNqQmUsUUFBUUMsR0FBRyxDQUFDLHdEQUF3REo7WUFDeEU7UUFDSixHQUFHQztJQUNQO0lBQ0Esb0ZBQW9GO0lBQ3BGLDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFD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TTtBQUNqQixFQUNBLGlDQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvbG9ja3MuanM/MDM4NyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzdXBwb3J0c0xvY2FsU3RvcmFnZSB9IGZyb20gJy4vaGVscGVycyc7XG4vKipcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNvbnN0IGludGVybmFscyA9IHtcbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICovXG4gICAgZGVidWc6ICEhKGdsb2JhbFRoaXMgJiZcbiAgICAgICAgc3VwcG9ydHNMb2NhbFN0b3JhZ2UoKSAmJlxuICAgICAgICBnbG9iYWxUaGlzLmxvY2FsU3RvcmFnZSAmJlxuICAgICAgICBnbG9iYWxUaGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzdXBhYmFzZS5nb3RydWUtanMubG9ja3MuZGVidWcnKSA9PT0gJ3RydWUnKSxcbn07XG4vKipcbiAqIEFuIGVycm9yIHRocm93biB3aGVuIGEgbG9jayBjYW5ub3QgYmUgYWNxdWlyZWQgYWZ0ZXIgc29tZSBhbW91bnQgb2YgdGltZS5cbiAqXG4gKiBVc2UgdGhlIHtAbGluayAjaXNBY3F1aXJlVGltZW91dH0gcHJvcGVydHkgaW5zdGVhZCBvZiBjaGVja2luZyB3aXRoIGBpbnN0YW5jZW9mYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IExvY2tBY3F1aXJlVGltZW91dEVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogY2xhc3MgQ3VzdG9tTG9ja0Vycm9yIGV4dGVuZHMgTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3Ige1xuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcignTG9jayB0aW1lZCBvdXQnKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIExvY2tBY3F1aXJlVGltZW91dEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuaXNBY3F1aXJlVGltZW91dCA9IHRydWU7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGUgYnJvd3NlciBOYXZpZ2F0b3IgTG9jayBBUEkgZmFpbHMgdG8gYWNxdWlyZSBhIGxvY2suXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBOYXZpZ2F0b3JMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBOYXZpZ2F0b3JMb2NrQWNxdWlyZVRpbWVvdXRFcnJvcignTG9jayB0aW1lZCBvdXQnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXZpZ2F0b3JMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciBleHRlbmRzIExvY2tBY3F1aXJlVGltZW91dEVycm9yIHtcbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIHByb2Nlc3MtbGV2ZWwgbG9jayBoZWxwZXIgY2Fubm90IGFjcXVpcmUgYSBsb2NrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgUHJvY2Vzc0xvY2tBY3F1aXJlVGltZW91dEVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2F1dGgtanMnXG4gKlxuICogdGhyb3cgbmV3IFByb2Nlc3NMb2NrQWNxdWlyZVRpbWVvdXRFcnJvcignTG9jayB0aW1lZCBvdXQnKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9jZXNzTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IgZXh0ZW5kcyBMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciB7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYSBnbG9iYWwgZXhjbHVzaXZlIGxvY2sgdXNpbmcgdGhlIE5hdmlnYXRvciBMb2NrTWFuYWdlciBBUEkuIEl0XG4gKiBpcyBhdmFpbGFibGUgb24gYWxsIGJyb3dzZXJzIHJlbGVhc2VkIGFmdGVyIDIwMjItMDMtMTUgd2l0aCBTYWZhcmkgYmVpbmcgdGhlXG4gKiBsYXN0IG9uZSB0byByZWxlYXNlIHN1cHBvcnQuIElmIHRoZSBBUEkgaXMgbm90IGF2YWlsYWJsZSwgdGhpcyBmdW5jdGlvbiB3aWxsXG4gKiB0aHJvdy4gTWFrZSBzdXJlIHlvdSBjaGVjayBhdmFpbGFibGlsaXR5IGJlZm9yZSBjb25maWd1cmluZyB7QGxpbmtcbiAqIEdvVHJ1ZUNsaWVudH0uXG4gKlxuICogWW91IGNhbiB0dXJuIG9uIGRlYnVnZ2luZyBieSBzZXR0aW5nIHRoZSBgc3VwYWJhc2UuZ290cnVlLWpzLmxvY2tzLmRlYnVnYFxuICogbG9jYWwgc3RvcmFnZSBpdGVtIHRvIGB0cnVlYC5cbiAqXG4gKiBJbnRlcm5hbHM6XG4gKlxuICogU2luY2UgdGhlIExvY2tNYW5hZ2VyIEFQSSBkb2VzIG5vdCBwcmVzZXJ2ZSBzdGFjayB0cmFjZXMgZm9yIHRoZSBhc3luY1xuICogZnVuY3Rpb24gcGFzc2VkIGluIHRoZSBgcmVxdWVzdGAgbWV0aG9kLCBhIHRyaWNrIGlzIHVzZWQgd2hlcmUgYWNxdWlyaW5nIHRoZVxuICogbG9jayByZWxlYXNlcyBhIHByZXZpb3VzbHkgc3RhcnRlZCBwcm9taXNlIHRvIHJ1biB0aGUgb3BlcmF0aW9uIGluIHRoZSBgZm5gXG4gKiBmdW5jdGlvbi4gVGhlIGxvY2sgd2FpdHMgZm9yIHRoYXQgcHJvbWlzZSB0byBmaW5pc2ggKHdpdGggb3Igd2l0aG91dCBlcnJvciksXG4gKiB3aGlsZSB0aGUgZnVuY3Rpb24gd2lsbCBmaW5hbGx5IHdhaXQgZm9yIHRoZSByZXN1bHQgYW55d2F5LlxuICpcbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGxvY2sgdG8gYmUgYWNxdWlyZWQuXG4gKiBAcGFyYW0gYWNxdWlyZVRpbWVvdXQgSWYgbmVnYXRpdmUsIG5vIHRpbWVvdXQuIElmIDAgYW4gZXJyb3IgaXMgdGhyb3duIGlmXG4gKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxvY2sgY2FuJ3QgYmUgYWNxdWlyZWQgd2l0aG91dCB3YWl0aW5nLiBJZiBwb3NpdGl2ZSwgdGhlIGxvY2sgYWNxdWlyZVxuICogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgdGltZSBvdXQgYWZ0ZXIgc28gbWFueSBtaWxsaXNlY29uZHMuIEFuIGVycm9yIGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgYSB0aW1lb3V0IGlmIGl0IGhhcyBgaXNBY3F1aXJlVGltZW91dGAgc2V0IHRvIHRydWUuXG4gKiBAcGFyYW0gZm4gVGhlIG9wZXJhdGlvbiB0byBydW4gb25jZSB0aGUgbG9jayBpcyBhY3F1aXJlZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogYXdhaXQgbmF2aWdhdG9yTG9jaygnc3luYy11c2VyJywgMTAwMCwgYXN5bmMgKCkgPT4ge1xuICogICBhd2FpdCByZWZyZXNoU2Vzc2lvbigpXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuYXZpZ2F0b3JMb2NrKG5hbWUsIGFjcXVpcmVUaW1lb3V0LCBmbikge1xuICAgIGlmIChpbnRlcm5hbHMuZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0BzdXBhYmFzZS9nb3RydWUtanM6IG5hdmlnYXRvckxvY2s6IGFjcXVpcmUgbG9jaycsIG5hbWUsIGFjcXVpcmVUaW1lb3V0KTtcbiAgICB9XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IGdsb2JhbFRoaXMuQWJvcnRDb250cm9sbGVyKCk7XG4gICAgaWYgKGFjcXVpcmVUaW1lb3V0ID4gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgaWYgKGludGVybmFscy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdAc3VwYWJhc2UvZ290cnVlLWpzOiBuYXZpZ2F0b3JMb2NrIGFjcXVpcmUgdGltZWQgb3V0JywgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGFjcXVpcmVUaW1lb3V0KTtcbiAgICB9XG4gICAgLy8gTUROIGFydGljbGU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Mb2NrTWFuYWdlci9yZXF1ZXN0XG4gICAgLy8gV3JhcHBpbmcgbmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QoKSB3aXRoIGEgcGxhaW4gUHJvbWlzZSBpcyBkb25lIGFzIHNvbWVcbiAgICAvLyBsaWJyYXJpZXMgbGlrZSB6b25lLmpzIHBhdGNoIHRoZSBQcm9taXNlIG9iamVjdCB0byB0cmFjayB0aGUgZXhlY3V0aW9uXG4gICAgLy8gY29udGV4dC4gSG93ZXZlciwgaXQgYXBwZWFycyB0aGF0IG1vc3QgYnJvd3NlcnMgdXNlIGFuIGludGVybmFsIHByb21pc2VcbiAgICAvLyBpbXBsZW1lbnRhdGlvbiB3aGVuIHVzaW5nIHRoZSBuYXZpZ2F0b3IubG9ja3MucmVxdWVzdCgpIEFQSSBjYXVzaW5nIHRoZW1cbiAgICAvLyB0byBsb3NlIGNvbnRleHQgYW5kIGVtaXQgY29uZnVzaW5nIGxvZyBtZXNzYWdlcyBvciBicmVhayBjZXJ0YWluIGZlYXR1cmVzLlxuICAgIC8vIFRoaXMgd3JhcHBpbmcgaXMgYmVsaWV2ZWQgdG8gaGVscCB6b25lLmpzIHRyYWNrIHRoZSBleGVjdXRpb24gY29udGV4dFxuICAgIC8vIGJldHRlci5cbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBnbG9iYWxUaGlzLm5hdmlnYXRvci5sb2Nrcy5yZXF1ZXN0KG5hbWUsIGFjcXVpcmVUaW1lb3V0ID09PSAwXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbW9kZTogJ2V4Y2x1c2l2ZScsXG4gICAgICAgICAgICBpZkF2YWlsYWJsZTogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIG1vZGU6ICdleGNsdXNpdmUnLFxuICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICB9LCBhc3luYyAobG9jaykgPT4ge1xuICAgICAgICBpZiAobG9jaykge1xuICAgICAgICAgICAgaWYgKGludGVybmFscy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdAc3VwYWJhc2UvZ290cnVlLWpzOiBuYXZpZ2F0b3JMb2NrOiBhY3F1aXJlZCcsIG5hbWUsIGxvY2submFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKGludGVybmFscy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQHN1cGFiYXNlL2dvdHJ1ZS1qczogbmF2aWdhdG9yTG9jazogcmVsZWFzZWQnLCBuYW1lLCBsb2NrLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhY3F1aXJlVGltZW91dCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbHMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0BzdXBhYmFzZS9nb3RydWUtanM6IG5hdmlnYXRvckxvY2s6IG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUnLCBuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hdmlnYXRvckxvY2tBY3F1aXJlVGltZW91dEVycm9yKGBBY3F1aXJpbmcgYW4gZXhjbHVzaXZlIE5hdmlnYXRvciBMb2NrTWFuYWdlciBsb2NrIFwiJHtuYW1lfVwiIGltbWVkaWF0ZWx5IGZhaWxlZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGludGVybmFscy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2xvYmFsVGhpcy5uYXZpZ2F0b3IubG9ja3MucXVlcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdAc3VwYWJhc2UvZ290cnVlLWpzOiBOYXZpZ2F0b3IgTG9ja01hbmFnZXIgc3RhdGUnLCBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsICcgICcpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdAc3VwYWJhc2UvZ290cnVlLWpzOiBFcnJvciB3aGVuIHF1ZXJ5aW5nIE5hdmlnYXRvciBMb2NrTWFuYWdlciBzdGF0ZScsIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEJyb3dzZXIgaXMgbm90IGZvbGxvd2luZyB0aGUgTmF2aWdhdG9yIExvY2tNYW5hZ2VyIHNwZWMsIGl0XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYSBudWxsIGxvY2sgd2hlbiB3ZSBkaWRuJ3QgdXNlIGlmQXZhaWxhYmxlLiBTbyB3ZSBjYW5cbiAgICAgICAgICAgICAgICAvLyBwcmV0ZW5kIHRoZSBsb2NrIGlzIGFjcXVpcmVkIGluIHRoZSBuYW1lIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICAvLyBhbmQgdXNlciBleHBlcmllbmNlIGFuZCBqdXN0IHJ1biB0aGUgZnVuY3Rpb24uXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdAc3VwYWJhc2UvZ290cnVlLWpzOiBOYXZpZ2F0b3IgTG9ja01hbmFnZXIgcmV0dXJuZWQgYSBudWxsIGxvY2sgd2hlbiB1c2luZyAjcmVxdWVzdCB3aXRob3V0IGlmQXZhaWxhYmxlIHNldCB0byB0cnVlLCBpdCBhcHBlYXJzIHRoaXMgYnJvd3NlciBpcyBub3QgZm9sbG93aW5nIHRoZSBMb2NrTWFuYWdlciBzcGVjIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Mb2NrTWFuYWdlci9yZXF1ZXN0Jyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KSk7XG59XG5jb25zdCBQUk9DRVNTX0xPQ0tTID0ge307XG4vKipcbiAqIEltcGxlbWVudHMgYSBnbG9iYWwgZXhjbHVzaXZlIGxvY2sgdGhhdCB3b3JrcyBvbmx5IGluIHRoZSBjdXJyZW50IHByb2Nlc3MuXG4gKiBVc2VmdWwgZm9yIGVudmlyb25tZW50cyBsaWtlIFJlYWN0IE5hdGl2ZSBvciBvdGhlciBub24tYnJvd3NlclxuICogc2luZ2xlLXByb2Nlc3MgKGkuZS4gbm8gY29uY2VwdCBvZiBcInRhYnNcIikgZW52aXJvbm1lbnRzLlxuICpcbiAqIFVzZSB7QGxpbmsgI25hdmlnYXRvckxvY2t9IGluIGJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGxvY2sgdG8gYmUgYWNxdWlyZWQuXG4gKiBAcGFyYW0gYWNxdWlyZVRpbWVvdXQgSWYgbmVnYXRpdmUsIG5vIHRpbWVvdXQuIElmIDAgYW4gZXJyb3IgaXMgdGhyb3duIGlmXG4gKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxvY2sgY2FuJ3QgYmUgYWNxdWlyZWQgd2l0aG91dCB3YWl0aW5nLiBJZiBwb3NpdGl2ZSwgdGhlIGxvY2sgYWNxdWlyZVxuICogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgdGltZSBvdXQgYWZ0ZXIgc28gbWFueSBtaWxsaXNlY29uZHMuIEFuIGVycm9yIGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgYSB0aW1lb3V0IGlmIGl0IGhhcyBgaXNBY3F1aXJlVGltZW91dGAgc2V0IHRvIHRydWUuXG4gKiBAcGFyYW0gZm4gVGhlIG9wZXJhdGlvbiB0byBydW4gb25jZSB0aGUgbG9jayBpcyBhY3F1aXJlZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogYXdhaXQgcHJvY2Vzc0xvY2soJ21pZ3JhdGUnLCA1MDAwLCBhc3luYyAoKSA9PiB7XG4gKiAgIGF3YWl0IHJ1bk1pZ3JhdGlvbigpXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzTG9jayhuYW1lLCBhY3F1aXJlVGltZW91dCwgZm4pIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgcHJldmlvdXNPcGVyYXRpb24gPSAoX2EgPSBQUk9DRVNTX0xPQ0tTW25hbWVdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBjb25zdCBjdXJyZW50T3BlcmF0aW9uID0gUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgcHJldmlvdXNPcGVyYXRpb24uY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yIG9mIHByZXZpb3VzIG9wZXJhdGlvbiB0aGF0IHdlJ3JlIHdhaXRpbmcgdG8gZmluaXNoXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSksXG4gICAgICAgIGFjcXVpcmVUaW1lb3V0ID49IDBcbiAgICAgICAgICAgID8gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IFByb2Nlc3NMb2NrQWNxdWlyZVRpbWVvdXRFcnJvcihgQWNxdWlyaW5nIHByb2Nlc3MgbG9jayB3aXRoIG5hbWUgXCIke25hbWV9XCIgdGltZWQgb3V0YCkpO1xuICAgICAgICAgICAgICAgIH0sIGFjcXVpcmVUaW1lb3V0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgXS5maWx0ZXIoKHgpID0+IHgpKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgaWYgKGUgJiYgZS5pc0FjcXVpcmVUaW1lb3V0KSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0pXG4gICAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gcHJldmlvdXMgb3BlcmF0aW9ucyBmaW5pc2hlZCBhbmQgd2UgZGlkbid0IGdldCBhIHJhY2Ugb24gdGhlIGFjcXVpcmVcbiAgICAgICAgLy8gdGltZW91dCwgc28gdGhlIGN1cnJlbnQgb3BlcmF0aW9uIGNhbiBmaW5hbGx5IHN0YXJ0XG4gICAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0pO1xuICAgIFBST0NFU1NfTE9DS1NbbmFtZV0gPSBjdXJyZW50T3BlcmF0aW9uLmNhdGNoKGFzeW5jIChlKSA9PiB7XG4gICAgICAgIGlmIChlICYmIGUuaXNBY3F1aXJlVGltZW91dCkge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIHRpbWVkIG91dCwgaXQgZG9lc24ndCBtZWFuIHRoYXQgdGhlIHByZXZpb3VzXG4gICAgICAgICAgICAvLyBvcGVyYXRpb24gZmluaXNoZWQsIHNvIHdlIG5lZWQgY29udG51ZSB3YWl0aW5nIGZvciBpdCB0byBmaW5pc2hcbiAgICAgICAgICAgIGF3YWl0IHByZXZpb3VzT3BlcmF0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgICAvLyBmaW5hbGx5IHdhaXQgZm9yIHRoZSBjdXJyZW50IG9wZXJhdGlvbiB0byBmaW5pc2ggc3VjY2Vzc2Z1bGx5LCB3aXRoIGFuXG4gICAgLy8gZXJyb3Igb3Igd2l0aCBhbiBhY3F1aXJlIHRpbWVvdXQgZXJyb3JcbiAgICByZXR1cm4gYXdhaXQgY3VycmVudE9wZXJhdGlvbjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvY2tzLmpzLm1hcCJdLCJuYW1lcyI6WyJzdXBwb3J0c0xvY2FsU3RvcmFnZSIsImludGVybmFscyIsImRlYnVnIiwiZ2xvYmFsVGhpcyIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJtZXNzYWdlIiwiaXNBY3F1aXJlVGltZW91dCIsIk5hdmlnYXRvckxvY2tBY3F1aXJlVGltZW91dEVycm9yIiwiUHJvY2Vzc0xvY2tBY3F1aXJlVGltZW91dEVycm9yIiwibmF2aWdhdG9yTG9jayIsIm5hbWUiLCJhY3F1aXJlVGltZW91dCIsImZuIiwiY29uc29sZSIsImxvZyIsImFib3J0Q29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsInNldFRpbWVvdXQiLCJhYm9ydCIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIm5hdmlnYXRvciIsImxvY2tzIiwicmVxdWVzdCIsIm1vZGUiLCJpZkF2YWlsYWJsZSIsInNpZ25hbCIsImxvY2siLCJyZXN1bHQiLCJxdWVyeSIsIkpTT04iLCJzdHJpbmdpZnkiLCJlIiwid2FybiIsIlBST0NFU1NfTE9DS1MiLCJwcm9jZXNzTG9jayIsIl9hIiwicHJldmlvdXNPcGVyYXRpb24iLCJjdXJyZW50T3BlcmF0aW9uIiwicmFjZSIsImNhdGNoIiwiXyIsInJlamVjdCIsImZpbHRlciIsIngiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/locks.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LockAcquireTimeoutError: () => (/* binding */ LockAcquireTimeoutError),\n/* harmony export */ NavigatorLockAcquireTimeoutError: () => (/* binding */ NavigatorLockAcquireTimeoutError),\n/* harmony export */ ProcessLockAcquireTimeoutError: () => (/* binding */ ProcessLockAcquireTimeoutError),\n/* harmony export */ internals: () => (/* binding */ internals),\n/* harmony export */ navigatorLock: () => (/* binding */ navigatorLock),\n/* harmony export */ processLock: () => (/* binding */ processLock)\n/* harmony export */ });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"(rsc)/./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 \"${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 \"${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2xvY2tzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBaUQ7QUFDakQ7O0NBRUMsR0FDTSxNQUFNQyxZQUFZO0lBQ3JCOztLQUVDLEdBQ0RDLE9BQU8sQ0FBQyxDQUFFQyxDQUFBQSxjQUNOSCw4REFBb0JBLE1BQ3BCRyxXQUFXQyxZQUFZLElBQ3ZCRCxXQUFXQyxZQUFZLENBQUNDLE9BQU8sQ0FBQyxzQ0FBc0MsTUFBSztBQUNuRixFQUFFO0FBQ0Y7Ozs7Ozs7Ozs7Ozs7OztDQWVDLEdBQ00sTUFBTUMsZ0NBQWdDQztJQUN6Q0MsWUFBWUMsT0FBTyxDQUFFO1FBQ2pCLEtBQUssQ0FBQ0E7UUFDTixJQUFJLENBQUNDLGdCQUFnQixHQUFHO0lBQzVCO0FBQ0o7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNQyx5Q0FBeUNMO0FBQ3REO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTU0sdUNBQXVDTjtBQUNwRDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4QkMsR0FDTSxlQUFlTyxjQUFjQyxJQUFJLEVBQUVDLGNBQWMsRUFBRUMsRUFBRTtJQUN4RCxJQUFJZixVQUFVQyxLQUFLLEVBQUU7UUFDakJlLFFBQVFDLEdBQUcsQ0FBQyxvREFBb0RKLE1BQU1DO0lBQzFFO0lBQ0EsTUFBTUksa0JBQWtCLElBQUloQixXQUFXaUIsZUFBZTtJQUN0RCxJQUFJTCxpQkFBaUIsR0FBRztRQUNwQk0sV0FBVztZQUNQRixnQkFBZ0JHLEtBQUs7WUFDckIsSUFBSXJCLFVBQVVDLEtBQUssRUFBRTtnQkFDakJlLFFBQVFDLEdBQUcsQ0FBQyx3REFBd0RKO1lBQ3hFO1FBQ0osR0FBR0M7SUFDUDtJQUNBLG9GQUFvRjtJQUNwRiwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsNkVBQTZFO0lBQzdFLHdFQUF3RTtJQUN4RSxVQUFVO0lBQ1YsT0FBTyxNQUFNUSxRQUFRQyxPQUFPLEdBQUdDLElBQUksQ0FBQyxJQUFNdEIsV0FBV3VCLFNBQVMsQ0FBQ0MsS0FBSyxDQUFDQyxPQUFPLENBQUNkLE1BQU1DLG1CQUFtQixJQUNoRztZQUNFYyxNQUFNO1lBQ05DLGFBQWE7UUFDakIsSUFDRTtZQUNFRCxNQUFNO1lBQ05FLFFBQVFaLGdCQUFnQlksTUFBTTtRQUNsQyxHQUFHLE9BQU9DO1lBQ1YsSUFBSUEsTUFBTTtnQkFDTixJQUFJL0IsVUFBVUMsS0FBSyxFQUFFO29CQUNqQmUsUUFBUUMsR0FBRyxDQUFDLGdEQUFnREosTUFBTWtCLEtBQUtsQixJQUFJO2dCQUMvRTtnQkFDQSxJQUFJO29CQUNBLE9BQU8sTUFBTUU7Z0JBQ2pCLFNBQ1E7b0JBQ0osSUFBSWYsVUFBVUMsS0FBSyxFQUFFO3dCQUNqQmUsUUFBUUMsR0FBRyxDQUFDLGdEQUFnREosTUFBTWtCLEtBQUtsQixJQUFJO29CQUMvRTtnQkFDSjtZQUNKLE9BQ0s7Z0JBQ0QsSUFBSUMsbUJBQW1CLEdBQUc7b0JBQ3RCLElBQUlkLFVBQVVDLEtBQUssRUFBRTt3QkFDakJlLFFBQVFDLEdBQUcsQ0FBQyxpRUFBaUVKO29CQUNqRjtvQkFDQSxNQUFNLElBQUlILGlDQUFpQyxDQUFDLG1EQUFtRCxFQUFFRyxLQUFLLG9CQUFvQixDQUFDO2dCQUMvSCxPQUNLO29CQUNELElBQUliLFVBQVVDLEtBQUssRUFBRTt3QkFDakIsSUFBSTs0QkFDQSxNQUFNK0IsU0FBUyxNQUFNOUIsV0FBV3VCLFNBQVMsQ0FBQ0MsS0FBSyxDQUFDTyxLQUFLOzRCQUNyRGpCLFFBQVFDLEdBQUcsQ0FBQyxvREFBb0RpQixLQUFLQyxTQUFTLENBQUNILFFBQVEsTUFBTTt3QkFDakcsRUFDQSxPQUFPSSxHQUFHOzRCQUNOcEIsUUFBUXFCLElBQUksQ0FBQyx3RUFBd0VEO3dCQUN6RjtvQkFDSjtvQkFDQSw4REFBOEQ7b0JBQzlELGlFQUFpRTtvQkFDakUscUVBQXFFO29CQUNyRSxpREFBaUQ7b0JBQ2pEcEIsUUFBUXFCLElBQUksQ0FBQztvQkFDYixPQUFPLE1BQU10QjtnQkFDakI7WUFDSjtRQUNKO0FBQ0o7QUFDQSxNQUFNdUIsZ0JBQWdCLENBQUM7QUFDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FtQkMsR0FDTSxlQUFlQyxZQUFZMUIsSUFBSSxFQUFFQyxjQUFjLEVBQUVDLEVBQUU7SUFDdEQsSUFBSXlCO0lBQ0osTUFBTUMsb0JBQW9CLENBQUNELEtBQUtGLGFBQWEsQ0FBQ3pCLEtBQUssTUFBTSxRQUFRMkIsT0FBTyxLQUFLLElBQUlBLEtBQUtsQixRQUFRQyxPQUFPO0lBQ3JHLE1BQU1tQixtQkFBbUJwQixRQUFRcUIsSUFBSSxDQUFDO1FBQ2xDRixrQkFBa0JHLEtBQUssQ0FBQztZQUNwQixrRUFBa0U7WUFDbEUsT0FBTztRQUNYO1FBQ0E5QixrQkFBa0IsSUFDWixJQUFJUSxRQUFRLENBQUN1QixHQUFHQztZQUNkMUIsV0FBVztnQkFDUDBCLE9BQU8sSUFBSW5DLCtCQUErQixDQUFDLGtDQUFrQyxFQUFFRSxLQUFLLFdBQVcsQ0FBQztZQUNwRyxHQUFHQztRQUNQLEtBQ0U7S0FDVCxDQUFDaUMsTUFBTSxDQUFDLENBQUNDLElBQU1BLElBQ1hKLEtBQUssQ0FBQyxDQUFDUjtRQUNSLElBQUlBLEtBQUtBLEVBQUUzQixnQkFBZ0IsRUFBRTtZQUN6QixNQUFNMkI7UUFDVjtRQUNBLE9BQU87SUFDWCxHQUNLWixJQUFJLENBQUM7UUFDTix1RUFBdUU7UUFDdkUsc0RBQXNEO1FBQ3RELE9BQU8sTUFBTVQ7SUFDakI7SUFDQXVCLGFBQWEsQ0FBQ3pCLEtBQUssR0FBRzZCLGlCQUFpQkUsS0FBSyxDQUFDLE9BQU9SO1FBQ2hELElBQUlBLEtBQUtBLEVBQUUzQixnQkFBZ0IsRUFBRTtZQUN6Qix3RUFBd0U7WUFDeEUsa0VBQWtFO1lBQ2xFLE1BQU1nQztZQUNOLE9BQU87UUFDWDtRQUNBLE1BQU1MO0lBQ1Y7SUFDQSx5RUFBeUU7SUFDekUseUNBQXlDO0lBQ3pDLE9BQU8sTUFBTU07QUFDakIsRUFDQSxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL2xvY2tzLmpzPzAzODciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3VwcG9ydHNMb2NhbFN0b3JhZ2UgfSBmcm9tICcuL2hlbHBlcnMnO1xuLyoqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjb25zdCBpbnRlcm5hbHMgPSB7XG4gICAgLyoqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqL1xuICAgIGRlYnVnOiAhIShnbG9iYWxUaGlzICYmXG4gICAgICAgIHN1cHBvcnRzTG9jYWxTdG9yYWdlKCkgJiZcbiAgICAgICAgZ2xvYmFsVGhpcy5sb2NhbFN0b3JhZ2UgJiZcbiAgICAgICAgZ2xvYmFsVGhpcy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3VwYWJhc2UuZ290cnVlLWpzLmxvY2tzLmRlYnVnJykgPT09ICd0cnVlJyksXG59O1xuLyoqXG4gKiBBbiBlcnJvciB0aHJvd24gd2hlbiBhIGxvY2sgY2Fubm90IGJlIGFjcXVpcmVkIGFmdGVyIHNvbWUgYW1vdW50IG9mIHRpbWUuXG4gKlxuICogVXNlIHRoZSB7QGxpbmsgI2lzQWNxdWlyZVRpbWVvdXR9IHByb3BlcnR5IGluc3RlYWQgb2YgY2hlY2tpbmcgd2l0aCBgaW5zdGFuY2VvZmAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIGNsYXNzIEN1c3RvbUxvY2tFcnJvciBleHRlbmRzIExvY2tBY3F1aXJlVGltZW91dEVycm9yIHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoJ0xvY2sgdGltZWQgb3V0JylcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmlzQWNxdWlyZVRpbWVvdXQgPSB0cnVlO1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIGJyb3dzZXIgTmF2aWdhdG9yIExvY2sgQVBJIGZhaWxzIHRvIGFjcXVpcmUgYSBsb2NrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgTmF2aWdhdG9yTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvYXV0aC1qcydcbiAqXG4gKiB0aHJvdyBuZXcgTmF2aWdhdG9yTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IoJ0xvY2sgdGltZWQgb3V0JylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTmF2aWdhdG9yTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IgZXh0ZW5kcyBMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciB7XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSBwcm9jZXNzLWxldmVsIGxvY2sgaGVscGVyIGNhbm5vdCBhY3F1aXJlIGEgbG9jay5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IFByb2Nlc3NMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9hdXRoLWpzJ1xuICpcbiAqIHRocm93IG5ldyBQcm9jZXNzTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IoJ0xvY2sgdGltZWQgb3V0JylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUHJvY2Vzc0xvY2tBY3F1aXJlVGltZW91dEVycm9yIGV4dGVuZHMgTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3Ige1xufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgZ2xvYmFsIGV4Y2x1c2l2ZSBsb2NrIHVzaW5nIHRoZSBOYXZpZ2F0b3IgTG9ja01hbmFnZXIgQVBJLiBJdFxuICogaXMgYXZhaWxhYmxlIG9uIGFsbCBicm93c2VycyByZWxlYXNlZCBhZnRlciAyMDIyLTAzLTE1IHdpdGggU2FmYXJpIGJlaW5nIHRoZVxuICogbGFzdCBvbmUgdG8gcmVsZWFzZSBzdXBwb3J0LiBJZiB0aGUgQVBJIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgZnVuY3Rpb24gd2lsbFxuICogdGhyb3cuIE1ha2Ugc3VyZSB5b3UgY2hlY2sgYXZhaWxhYmxpbGl0eSBiZWZvcmUgY29uZmlndXJpbmcge0BsaW5rXG4gKiBHb1RydWVDbGllbnR9LlxuICpcbiAqIFlvdSBjYW4gdHVybiBvbiBkZWJ1Z2dpbmcgYnkgc2V0dGluZyB0aGUgYHN1cGFiYXNlLmdvdHJ1ZS1qcy5sb2Nrcy5kZWJ1Z2BcbiAqIGxvY2FsIHN0b3JhZ2UgaXRlbSB0byBgdHJ1ZWAuXG4gKlxuICogSW50ZXJuYWxzOlxuICpcbiAqIFNpbmNlIHRoZSBMb2NrTWFuYWdlciBBUEkgZG9lcyBub3QgcHJlc2VydmUgc3RhY2sgdHJhY2VzIGZvciB0aGUgYXN5bmNcbiAqIGZ1bmN0aW9uIHBhc3NlZCBpbiB0aGUgYHJlcXVlc3RgIG1ldGhvZCwgYSB0cmljayBpcyB1c2VkIHdoZXJlIGFjcXVpcmluZyB0aGVcbiAqIGxvY2sgcmVsZWFzZXMgYSBwcmV2aW91c2x5IHN0YXJ0ZWQgcHJvbWlzZSB0byBydW4gdGhlIG9wZXJhdGlvbiBpbiB0aGUgYGZuYFxuICogZnVuY3Rpb24uIFRoZSBsb2NrIHdhaXRzIGZvciB0aGF0IHByb21pc2UgdG8gZmluaXNoICh3aXRoIG9yIHdpdGhvdXQgZXJyb3IpLFxuICogd2hpbGUgdGhlIGZ1bmN0aW9uIHdpbGwgZmluYWxseSB3YWl0IGZvciB0aGUgcmVzdWx0IGFueXdheS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBsb2NrIHRvIGJlIGFjcXVpcmVkLlxuICogQHBhcmFtIGFjcXVpcmVUaW1lb3V0IElmIG5lZ2F0aXZlLCBubyB0aW1lb3V0LiBJZiAwIGFuIGVycm9yIGlzIHRocm93biBpZlxuICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBsb2NrIGNhbid0IGJlIGFjcXVpcmVkIHdpdGhvdXQgd2FpdGluZy4gSWYgcG9zaXRpdmUsIHRoZSBsb2NrIGFjcXVpcmVcbiAqICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHRpbWUgb3V0IGFmdGVyIHNvIG1hbnkgbWlsbGlzZWNvbmRzLiBBbiBlcnJvciBpc1xuICogICAgICAgICAgICAgICAgICAgICAgIGEgdGltZW91dCBpZiBpdCBoYXMgYGlzQWNxdWlyZVRpbWVvdXRgIHNldCB0byB0cnVlLlxuICogQHBhcmFtIGZuIFRoZSBvcGVyYXRpb24gdG8gcnVuIG9uY2UgdGhlIGxvY2sgaXMgYWNxdWlyZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGF3YWl0IG5hdmlnYXRvckxvY2soJ3N5bmMtdXNlcicsIDEwMDAsIGFzeW5jICgpID0+IHtcbiAqICAgYXdhaXQgcmVmcmVzaFNlc3Npb24oKVxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmF2aWdhdG9yTG9jayhuYW1lLCBhY3F1aXJlVGltZW91dCwgZm4pIHtcbiAgICBpZiAoaW50ZXJuYWxzLmRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdAc3VwYWJhc2UvZ290cnVlLWpzOiBuYXZpZ2F0b3JMb2NrOiBhY3F1aXJlIGxvY2snLCBuYW1lLCBhY3F1aXJlVGltZW91dCk7XG4gICAgfVxuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlcigpO1xuICAgIGlmIChhY3F1aXJlVGltZW91dCA+IDApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIGlmIChpbnRlcm5hbHMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQHN1cGFiYXNlL2dvdHJ1ZS1qczogbmF2aWdhdG9yTG9jayBhY3F1aXJlIHRpbWVkIG91dCcsIG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBhY3F1aXJlVGltZW91dCk7XG4gICAgfVxuICAgIC8vIE1ETiBhcnRpY2xlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTG9ja01hbmFnZXIvcmVxdWVzdFxuICAgIC8vIFdyYXBwaW5nIG5hdmlnYXRvci5sb2Nrcy5yZXF1ZXN0KCkgd2l0aCBhIHBsYWluIFByb21pc2UgaXMgZG9uZSBhcyBzb21lXG4gICAgLy8gbGlicmFyaWVzIGxpa2Ugem9uZS5qcyBwYXRjaCB0aGUgUHJvbWlzZSBvYmplY3QgdG8gdHJhY2sgdGhlIGV4ZWN1dGlvblxuICAgIC8vIGNvbnRleHQuIEhvd2V2ZXIsIGl0IGFwcGVhcnMgdGhhdCBtb3N0IGJyb3dzZXJzIHVzZSBhbiBpbnRlcm5hbCBwcm9taXNlXG4gICAgLy8gaW1wbGVtZW50YXRpb24gd2hlbiB1c2luZyB0aGUgbmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QoKSBBUEkgY2F1c2luZyB0aGVtXG4gICAgLy8gdG8gbG9zZSBjb250ZXh0IGFuZCBlbWl0IGNvbmZ1c2luZyBsb2cgbWVzc2FnZXMgb3IgYnJlYWsgY2VydGFpbiBmZWF0dXJlcy5cbiAgICAvLyBUaGlzIHdyYXBwaW5nIGlzIGJlbGlldmVkIHRvIGhlbHAgem9uZS5qcyB0cmFjayB0aGUgZXhlY3V0aW9uIGNvbnRleHRcbiAgICAvLyBiZXR0ZXIuXG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gZ2xvYmFsVGhpcy5uYXZpZ2F0b3IubG9ja3MucmVxdWVzdChuYW1lLCBhY3F1aXJlVGltZW91dCA9PT0gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIG1vZGU6ICdleGNsdXNpdmUnLFxuICAgICAgICAgICAgaWZBdmFpbGFibGU6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBtb2RlOiAnZXhjbHVzaXZlJyxcbiAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgfSwgYXN5bmMgKGxvY2spID0+IHtcbiAgICAgICAgaWYgKGxvY2spIHtcbiAgICAgICAgICAgIGlmIChpbnRlcm5hbHMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQHN1cGFiYXNlL2dvdHJ1ZS1qczogbmF2aWdhdG9yTG9jazogYWNxdWlyZWQnLCBuYW1lLCBsb2NrLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbHMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0BzdXBhYmFzZS9nb3RydWUtanM6IG5hdmlnYXRvckxvY2s6IHJlbGVhc2VkJywgbmFtZSwgbG9jay5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoYWNxdWlyZVRpbWVvdXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdAc3VwYWJhc2UvZ290cnVlLWpzOiBuYXZpZ2F0b3JMb2NrOiBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlJywgbmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYXZpZ2F0b3JMb2NrQWNxdWlyZVRpbWVvdXRFcnJvcihgQWNxdWlyaW5nIGFuIGV4Y2x1c2l2ZSBOYXZpZ2F0b3IgTG9ja01hbmFnZXIgbG9jayBcIiR7bmFtZX1cIiBpbW1lZGlhdGVseSBmYWlsZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbHMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdsb2JhbFRoaXMubmF2aWdhdG9yLmxvY2tzLnF1ZXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQHN1cGFiYXNlL2dvdHJ1ZS1qczogTmF2aWdhdG9yIExvY2tNYW5hZ2VyIHN0YXRlJywgSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAnICAnKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQHN1cGFiYXNlL2dvdHJ1ZS1qczogRXJyb3Igd2hlbiBxdWVyeWluZyBOYXZpZ2F0b3IgTG9ja01hbmFnZXIgc3RhdGUnLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBCcm93c2VyIGlzIG5vdCBmb2xsb3dpbmcgdGhlIE5hdmlnYXRvciBMb2NrTWFuYWdlciBzcGVjLCBpdFxuICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGEgbnVsbCBsb2NrIHdoZW4gd2UgZGlkbid0IHVzZSBpZkF2YWlsYWJsZS4gU28gd2UgY2FuXG4gICAgICAgICAgICAgICAgLy8gcHJldGVuZCB0aGUgbG9jayBpcyBhY3F1aXJlZCBpbiB0aGUgbmFtZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICAgICAgLy8gYW5kIHVzZXIgZXhwZXJpZW5jZSBhbmQganVzdCBydW4gdGhlIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQHN1cGFiYXNlL2dvdHJ1ZS1qczogTmF2aWdhdG9yIExvY2tNYW5hZ2VyIHJldHVybmVkIGEgbnVsbCBsb2NrIHdoZW4gdXNpbmcgI3JlcXVlc3Qgd2l0aG91dCBpZkF2YWlsYWJsZSBzZXQgdG8gdHJ1ZSwgaXQgYXBwZWFycyB0aGlzIGJyb3dzZXIgaXMgbm90IGZvbGxvd2luZyB0aGUgTG9ja01hbmFnZXIgc3BlYyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTG9ja01hbmFnZXIvcmVxdWVzdCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSkpO1xufVxuY29uc3QgUFJPQ0VTU19MT0NLUyA9IHt9O1xuLyoqXG4gKiBJbXBsZW1lbnRzIGEgZ2xvYmFsIGV4Y2x1c2l2ZSBsb2NrIHRoYXQgd29ya3Mgb25seSBpbiB0aGUgY3VycmVudCBwcm9jZXNzLlxuICogVXNlZnVsIGZvciBlbnZpcm9ubWVudHMgbGlrZSBSZWFjdCBOYXRpdmUgb3Igb3RoZXIgbm9uLWJyb3dzZXJcbiAqIHNpbmdsZS1wcm9jZXNzIChpLmUuIG5vIGNvbmNlcHQgb2YgXCJ0YWJzXCIpIGVudmlyb25tZW50cy5cbiAqXG4gKiBVc2Uge0BsaW5rICNuYXZpZ2F0b3JMb2NrfSBpbiBicm93c2VyIGVudmlyb25tZW50cy5cbiAqXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBsb2NrIHRvIGJlIGFjcXVpcmVkLlxuICogQHBhcmFtIGFjcXVpcmVUaW1lb3V0IElmIG5lZ2F0aXZlLCBubyB0aW1lb3V0LiBJZiAwIGFuIGVycm9yIGlzIHRocm93biBpZlxuICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBsb2NrIGNhbid0IGJlIGFjcXVpcmVkIHdpdGhvdXQgd2FpdGluZy4gSWYgcG9zaXRpdmUsIHRoZSBsb2NrIGFjcXVpcmVcbiAqICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHRpbWUgb3V0IGFmdGVyIHNvIG1hbnkgbWlsbGlzZWNvbmRzLiBBbiBlcnJvciBpc1xuICogICAgICAgICAgICAgICAgICAgICAgIGEgdGltZW91dCBpZiBpdCBoYXMgYGlzQWNxdWlyZVRpbWVvdXRgIHNldCB0byB0cnVlLlxuICogQHBhcmFtIGZuIFRoZSBvcGVyYXRpb24gdG8gcnVuIG9uY2UgdGhlIGxvY2sgaXMgYWNxdWlyZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGF3YWl0IHByb2Nlc3NMb2NrKCdtaWdyYXRlJywgNTAwMCwgYXN5bmMgKCkgPT4ge1xuICogICBhd2FpdCBydW5NaWdyYXRpb24oKVxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0xvY2sobmFtZSwgYWNxdWlyZVRpbWVvdXQsIGZuKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHByZXZpb3VzT3BlcmF0aW9uID0gKF9hID0gUFJPQ0VTU19MT0NLU1tuYW1lXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgY3VycmVudE9wZXJhdGlvbiA9IFByb21pc2UucmFjZShbXG4gICAgICAgIHByZXZpb3VzT3BlcmF0aW9uLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvciBvZiBwcmV2aW91cyBvcGVyYXRpb24gdGhhdCB3ZSdyZSB3YWl0aW5nIHRvIGZpbmlzaFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pLFxuICAgICAgICBhY3F1aXJlVGltZW91dCA+PSAwXG4gICAgICAgICAgICA/IG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBQcm9jZXNzTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IoYEFjcXVpcmluZyBwcm9jZXNzIGxvY2sgd2l0aCBuYW1lIFwiJHtuYW1lfVwiIHRpbWVkIG91dGApKTtcbiAgICAgICAgICAgICAgICB9LCBhY3F1aXJlVGltZW91dCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBudWxsLFxuICAgIF0uZmlsdGVyKCh4KSA9PiB4KSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGlmIChlICYmIGUuaXNBY3F1aXJlVGltZW91dCkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9KVxuICAgICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIHByZXZpb3VzIG9wZXJhdGlvbnMgZmluaXNoZWQgYW5kIHdlIGRpZG4ndCBnZXQgYSByYWNlIG9uIHRoZSBhY3F1aXJlXG4gICAgICAgIC8vIHRpbWVvdXQsIHNvIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBjYW4gZmluYWxseSBzdGFydFxuICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9KTtcbiAgICBQUk9DRVNTX0xPQ0tTW25hbWVdID0gY3VycmVudE9wZXJhdGlvbi5jYXRjaChhc3luYyAoZSkgPT4ge1xuICAgICAgICBpZiAoZSAmJiBlLmlzQWNxdWlyZVRpbWVvdXQpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IG9wZXJhdGlvbiB0aW1lZCBvdXQsIGl0IGRvZXNuJ3QgbWVhbiB0aGF0IHRoZSBwcmV2aW91c1xuICAgICAgICAgICAgLy8gb3BlcmF0aW9uIGZpbmlzaGVkLCBzbyB3ZSBuZWVkIGNvbnRudWUgd2FpdGluZyBmb3IgaXQgdG8gZmluaXNoXG4gICAgICAgICAgICBhd2FpdCBwcmV2aW91c09wZXJhdGlvbjtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gICAgLy8gZmluYWxseSB3YWl0IGZvciB0aGUgY3VycmVudCBvcGVyYXRpb24gdG8gZmluaXNoIHN1Y2Nlc3NmdWxseSwgd2l0aCBhblxuICAgIC8vIGVycm9yIG9yIHdpdGggYW4gYWNxdWlyZSB0aW1lb3V0IGVycm9yXG4gICAgcmV0dXJuIGF3YWl0IGN1cnJlbnRPcGVyYXRpb247XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2Nrcy5qcy5tYXAiXSwibmFtZXMiOlsic3VwcG9ydHNMb2NhbFN0b3JhZ2UiLCJpbnRlcm5hbHMiLCJkZWJ1ZyIsImdsb2JhbFRoaXMiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiTG9ja0FjcXVpcmVUaW1lb3V0RXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwibWVzc2FnZSIsImlzQWNxdWlyZVRpbWVvdXQiLCJOYXZpZ2F0b3JMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciIsIlByb2Nlc3NMb2NrQWNxdWlyZVRpbWVvdXRFcnJvciIsIm5hdmlnYXRvckxvY2siLCJuYW1lIiwiYWNxdWlyZVRpbWVvdXQiLCJmbiIsImNvbnNvbGUiLCJsb2ciLCJhYm9ydENvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJzZXRUaW1lb3V0IiwiYWJvcnQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJuYXZpZ2F0b3IiLCJsb2NrcyIsInJlcXVlc3QiLCJtb2RlIiwiaWZBdmFpbGFibGUiLCJzaWduYWwiLCJsb2NrIiwicmVzdWx0IiwicXVlcnkiLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsIndhcm4iLCJQUk9DRVNTX0xPQ0tTIiwicHJvY2Vzc0xvY2siLCJfYSIsInByZXZpb3VzT3BlcmF0aW9uIiwiY3VycmVudE9wZXJhdGlvbiIsInJhY2UiLCJjYXRjaCIsIl8iLCJyZWplY3QiLCJmaWx0ZXIiLCJ4Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/locks.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ polyfillGlobalThis: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvcG9seWZpbGxzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7Q0FFQyxHQUNNLFNBQVNBO0lBQ1osSUFBSSxPQUFPQyxlQUFlLFVBQ3RCO0lBQ0osSUFBSTtRQUNBQyxPQUFPQyxjQUFjLENBQUNELE9BQU9FLFNBQVMsRUFBRSxhQUFhO1lBQ2pEQyxLQUFLO2dCQUNELE9BQU8sSUFBSTtZQUNmO1lBQ0FDLGNBQWM7UUFDbEI7UUFDQSwyQ0FBMkM7UUFDM0NDLFVBQVVOLFVBQVUsR0FBR007UUFDdkIsMkNBQTJDO1FBQzNDLE9BQU9MLE9BQU9FLFNBQVMsQ0FBQ0csU0FBUztJQUNyQyxFQUNBLE9BQU9DLEdBQUc7UUFDTixJQUFJLE9BQU9DLFNBQVMsYUFBYTtZQUM3Qiw2Q0FBNkM7WUFDN0NBLEtBQUtSLFVBQVUsR0FBR1E7UUFDdEI7SUFDSjtBQUNKLEVBQ0EscUNBQXFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi9wb2x5ZmlsbHMuanM/NjNlNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9nbG9iYWx0aGlzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2x5ZmlsbEdsb2JhbFRoaXMoKSB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JylcbiAgICAgICAgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QucHJvdG90eXBlLCAnX19tYWdpY19fJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAnQWxsb3cgYWNjZXNzIHRvIG1hZ2ljJ1xuICAgICAgICBfX21hZ2ljX18uZ2xvYmFsVGhpcyA9IF9fbWFnaWNfXztcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAnQWxsb3cgYWNjZXNzIHRvIG1hZ2ljJ1xuICAgICAgICBkZWxldGUgT2JqZWN0LnByb3RvdHlwZS5fX21hZ2ljX187XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgJ0FsbG93IGFjY2VzcyB0byBnbG9iYWxzJ1xuICAgICAgICAgICAgc2VsZi5nbG9iYWxUaGlzID0gc2VsZjtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbHlmaWxscy5qcy5tYXAiXSwibmFtZXMiOlsicG9seWZpbGxHbG9iYWxUaGlzIiwiZ2xvYmFsVGhpcyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwicHJvdG90eXBlIiwiZ2V0IiwiY29uZmlndXJhYmxlIiwiX19tYWdpY19fIiwiZSIsInNlbGYiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ polyfillGlobalThis: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3BvbHlmaWxscy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7O0NBRUMsR0FDTSxTQUFTQTtJQUNaLElBQUksT0FBT0MsZUFBZSxVQUN0QjtJQUNKLElBQUk7UUFDQUMsT0FBT0MsY0FBYyxDQUFDRCxPQUFPRSxTQUFTLEVBQUUsYUFBYTtZQUNqREMsS0FBSztnQkFDRCxPQUFPLElBQUk7WUFDZjtZQUNBQyxjQUFjO1FBQ2xCO1FBQ0EsMkNBQTJDO1FBQzNDQyxVQUFVTixVQUFVLEdBQUdNO1FBQ3ZCLDJDQUEyQztRQUMzQyxPQUFPTCxPQUFPRSxTQUFTLENBQUNHLFNBQVM7SUFDckMsRUFDQSxPQUFPQyxHQUFHO1FBQ04sSUFBSSxPQUFPQyxTQUFTLGFBQWE7WUFDN0IsNkNBQTZDO1lBQzdDQSxLQUFLUixVQUFVLEdBQUdRO1FBQ3RCO0lBQ0o7QUFDSixFQUNBLHFDQUFxQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvcG9seWZpbGxzLmpzPzYzZTUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvZ2xvYmFsdGhpc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcG9seWZpbGxHbG9iYWxUaGlzKCkge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgJ19fbWFnaWNfXycsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgJ0FsbG93IGFjY2VzcyB0byBtYWdpYydcbiAgICAgICAgX19tYWdpY19fLmdsb2JhbFRoaXMgPSBfX21hZ2ljX187XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgJ0FsbG93IGFjY2VzcyB0byBtYWdpYydcbiAgICAgICAgZGVsZXRlIE9iamVjdC5wcm90b3R5cGUuX19tYWdpY19fO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yICdBbGxvdyBhY2Nlc3MgdG8gZ2xvYmFscydcbiAgICAgICAgICAgIHNlbGYuZ2xvYmFsVGhpcyA9IHNlbGY7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2x5ZmlsbHMuanMubWFwIl0sIm5hbWVzIjpbInBvbHlmaWxsR2xvYmFsVGhpcyIsImdsb2JhbFRoaXMiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInByb3RvdHlwZSIsImdldCIsImNvbmZpZ3VyYWJsZSIsIl9fbWFnaWNfXyIsImUiLCJzZWxmIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/polyfills.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/types.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/types.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SIGN_OUT_SCOPES: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvdHlwZXMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE1BQU1BLHNCQUFzQjtJQUFDO0lBQVU7SUFBYztDQUFRO0FBQzdELE1BQU1DLGFBQWE7SUFDZjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0NBQ0g7QUFDRCxNQUFNQyxjQUFjO0lBQUM7SUFBUTtJQUFTO0NBQVc7QUFDakQsTUFBTUMsNkJBQTZCO0lBQUM7SUFBWTtDQUFhO0FBQzdELE1BQU1DLGtCQUFrQjtJQUFDO0lBQU87Q0FBVztBQUNwQyxNQUFNQyxrQkFBa0I7SUFBQztJQUFVO0lBQVM7Q0FBUyxDQUFDLENBQzdELGlDQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvdHlwZXMuanM/MWY2MSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBXZWFrUGFzc3dvcmRSZWFzb25zID0gWydsZW5ndGgnLCAnY2hhcmFjdGVycycsICdwd25lZCddO1xuY29uc3QgQU1STWV0aG9kcyA9IFtcbiAgICAncGFzc3dvcmQnLFxuICAgICdvdHAnLFxuICAgICdvYXV0aCcsXG4gICAgJ3RvdHAnLFxuICAgICdtZmEvdG90cCcsXG4gICAgJ21mYS9waG9uZScsXG4gICAgJ21mYS93ZWJhdXRobicsXG4gICAgJ2Fub255bW91cycsXG4gICAgJ3Nzby9zYW1sJyxcbiAgICAnbWFnaWNsaW5rJyxcbiAgICAnd2ViMycsXG5dO1xuY29uc3QgRmFjdG9yVHlwZXMgPSBbJ3RvdHAnLCAncGhvbmUnLCAnd2ViYXV0aG4nXTtcbmNvbnN0IEZhY3RvclZlcmlmaWNhdGlvblN0YXR1c2VzID0gWyd2ZXJpZmllZCcsICd1bnZlcmlmaWVkJ107XG5jb25zdCBNRkFUT1RQQ2hhbm5lbHMgPSBbJ3NtcycsICd3aGF0c2FwcCddO1xuZXhwb3J0IGNvbnN0IFNJR05fT1VUX1NDT1BFUyA9IFsnZ2xvYmFsJywgJ2xvY2FsJywgJ290aGVycyddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIl0sIm5hbWVzIjpbIldlYWtQYXNzd29yZFJlYXNvbnMiLCJBTVJNZXRob2RzIiwiRmFjdG9yVHlwZXMiLCJGYWN0b3JWZXJpZmljYXRpb25TdGF0dXNlcyIsIk1GQVRPVFBDaGFubmVscyIsIlNJR05fT1VUX1NDT1BFUyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/types.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/types.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/types.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SIGN_OUT_SCOPES: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3R5cGVzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSxNQUFNQSxzQkFBc0I7SUFBQztJQUFVO0lBQWM7Q0FBUTtBQUM3RCxNQUFNQyxhQUFhO0lBQ2Y7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtDQUNIO0FBQ0QsTUFBTUMsY0FBYztJQUFDO0lBQVE7SUFBUztDQUFXO0FBQ2pELE1BQU1DLDZCQUE2QjtJQUFDO0lBQVk7Q0FBYTtBQUM3RCxNQUFNQyxrQkFBa0I7SUFBQztJQUFPO0NBQVc7QUFDcEMsTUFBTUMsa0JBQWtCO0lBQUM7SUFBVTtJQUFTO0NBQVMsQ0FBQyxDQUM3RCxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3R5cGVzLmpzPzFmNjEiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgV2Vha1Bhc3N3b3JkUmVhc29ucyA9IFsnbGVuZ3RoJywgJ2NoYXJhY3RlcnMnLCAncHduZWQnXTtcbmNvbnN0IEFNUk1ldGhvZHMgPSBbXG4gICAgJ3Bhc3N3b3JkJyxcbiAgICAnb3RwJyxcbiAgICAnb2F1dGgnLFxuICAgICd0b3RwJyxcbiAgICAnbWZhL3RvdHAnLFxuICAgICdtZmEvcGhvbmUnLFxuICAgICdtZmEvd2ViYXV0aG4nLFxuICAgICdhbm9ueW1vdXMnLFxuICAgICdzc28vc2FtbCcsXG4gICAgJ21hZ2ljbGluaycsXG4gICAgJ3dlYjMnLFxuXTtcbmNvbnN0IEZhY3RvclR5cGVzID0gWyd0b3RwJywgJ3Bob25lJywgJ3dlYmF1dGhuJ107XG5jb25zdCBGYWN0b3JWZXJpZmljYXRpb25TdGF0dXNlcyA9IFsndmVyaWZpZWQnLCAndW52ZXJpZmllZCddO1xuY29uc3QgTUZBVE9UUENoYW5uZWxzID0gWydzbXMnLCAnd2hhdHNhcHAnXTtcbmV4cG9ydCBjb25zdCBTSUdOX09VVF9TQ09QRVMgPSBbJ2dsb2JhbCcsICdsb2NhbCcsICdvdGhlcnMnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCJdLCJuYW1lcyI6WyJXZWFrUGFzc3dvcmRSZWFzb25zIiwiQU1STWV0aG9kcyIsIkZhY3RvclR5cGVzIiwiRmFjdG9yVmVyaWZpY2F0aW9uU3RhdHVzZXMiLCJNRkFUT1RQQ2hhbm5lbHMiLCJTSUdOX09VVF9TQ09QRVMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/types.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/version.js":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/version.js ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ version: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvdmVyc2lvbi5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUEsNkVBQTZFO0FBQzdFLGdFQUFnRTtBQUNoRSx1RUFBdUU7QUFDdkUsaUVBQWlFO0FBQ2pFLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDMUQsTUFBTUEsVUFBVSxTQUFTLENBQ2hDLG1DQUFtQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvdmVyc2lvbi5qcz85NzdjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGR1cmluZyByZWxlYXNlcyBieSBzY3JpcHRzL3VwZGF0ZS12ZXJzaW9uLWZpbGVzLnRzXG4vLyBUaGlzIGZpbGUgcHJvdmlkZXMgcnVudGltZSBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgdmVyc2lvbiBmb3I6XG4vLyAtIEhUVFAgcmVxdWVzdCBoZWFkZXJzIChlLmcuLCBYLUNsaWVudC1JbmZvIGhlYWRlciBmb3IgQVBJIHJlcXVlc3RzKVxuLy8gLSBEZWJ1Z2dpbmcgYW5kIHN1cHBvcnQgKGlkZW50aWZ5aW5nIHdoaWNoIHZlcnNpb24gaXMgcnVubmluZylcbi8vIC0gVGVsZW1ldHJ5IGFuZCBsb2dnaW5nICh2ZXJzaW9uIHJlcG9ydGluZyBpbiBlcnJvcnMvYW5hbHl0aWNzKVxuLy8gLSBFbnN1cmluZyBidWlsZCBhcnRpZmFjdHMgbWF0Y2ggdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIHZlcnNpb25cbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0gJzIuODguMCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZXJzaW9uLmpzLm1hcCJdLCJuYW1lcyI6WyJ2ZXJzaW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/version.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/version.js":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/version.js ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ version: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3ZlcnNpb24uanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZFQUE2RTtBQUM3RSxnRUFBZ0U7QUFDaEUsdUVBQXVFO0FBQ3ZFLGlFQUFpRTtBQUNqRSxrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQzFELE1BQU1BLFVBQVUsU0FBUyxDQUNoQyxtQ0FBbUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3ZlcnNpb24uanM/OTc3YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgcmVsZWFzZXMgYnkgc2NyaXB0cy91cGRhdGUtdmVyc2lvbi1maWxlcy50c1xuLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHJ1bnRpbWUgYWNjZXNzIHRvIHRoZSBwYWNrYWdlIHZlcnNpb24gZm9yOlxuLy8gLSBIVFRQIHJlcXVlc3QgaGVhZGVycyAoZS5nLiwgWC1DbGllbnQtSW5mbyBoZWFkZXIgZm9yIEFQSSByZXF1ZXN0cylcbi8vIC0gRGVidWdnaW5nIGFuZCBzdXBwb3J0IChpZGVudGlmeWluZyB3aGljaCB2ZXJzaW9uIGlzIHJ1bm5pbmcpXG4vLyAtIFRlbGVtZXRyeSBhbmQgbG9nZ2luZyAodmVyc2lvbiByZXBvcnRpbmcgaW4gZXJyb3JzL2FuYWx5dGljcylcbi8vIC0gRW5zdXJpbmcgYnVpbGQgYXJ0aWZhY3RzIG1hdGNoIHRoZSBwdWJsaXNoZWQgcGFja2FnZSB2ZXJzaW9uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICcyLjg4LjAnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmVyc2lvbi5qcy5tYXAiXSwibmFtZXMiOlsidmVyc2lvbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/version.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js":
|
||
/*!*************************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js ***!
|
||
\*************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createSiweMessage: () => (/* binding */ createSiweMessage),\n/* harmony export */ fromHex: () => (/* binding */ fromHex),\n/* harmony export */ getAddress: () => (/* binding */ getAddress),\n/* harmony export */ toHex: () => (/* 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 \"${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: ${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: ${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: ${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: ${parameters.statement}`);\n }\n // Construct message\n const address = getAddress(parameters.address);\n const origin = scheme ? `${scheme}://${domain}` : domain;\n const statement = parameters.statement ? `${parameters.statement}\\n` : \"\";\n const prefix = `${origin} wants you to sign in with your Ethereum account:\\n${address}\\n\\n${statement}`;\n let suffix = `URI: ${uri}\\nVersion: ${version}\\nChain ID: ${chainId}${nonce ? `\\nNonce: ${nonce}` : \"\"}\\nIssued At: ${issuedAt.toISOString()}`;\n if (expirationTime) suffix += `\\nExpiration Time: ${expirationTime.toISOString()}`;\n if (notBefore) suffix += `\\nNot Before: ${notBefore.toISOString()}`;\n if (requestId) suffix += `\\nRequest ID: ${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: ${resource}`);\n content += `\\n- ${resource}`;\n }\n suffix += content;\n }\n return `${prefix}\\n${suffix}`;\n} //# sourceMappingURL=ethereum.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvd2ViMy9ldGhlcmV1bS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsaUZBQWlGO0FBQzFFLFNBQVNBLFdBQVdDLE9BQU87SUFDOUIsSUFBSSxDQUFDLHNCQUFzQkMsSUFBSSxDQUFDRCxVQUFVO1FBQ3RDLE1BQU0sSUFBSUUsTUFBTSxDQUFDLDRCQUE0QixFQUFFRixRQUFRLGFBQWEsQ0FBQztJQUN6RTtJQUNBLE9BQU9BLFFBQVFHLFdBQVc7QUFDOUI7QUFDTyxTQUFTQyxRQUFRQyxHQUFHO0lBQ3ZCLE9BQU9DLFNBQVNELEtBQUs7QUFDekI7QUFDTyxTQUFTRSxNQUFNQyxLQUFLO0lBQ3ZCLE1BQU1DLFFBQVEsSUFBSUMsY0FBY0MsTUFBTSxDQUFDSDtJQUN2QyxNQUFNSCxNQUFNTyxNQUFNQyxJQUFJLENBQUNKLE9BQU8sQ0FBQ0ssT0FBU0EsS0FBS0MsUUFBUSxDQUFDLElBQUlDLFFBQVEsQ0FBQyxHQUFHLE1BQU1DLElBQUksQ0FBQztJQUNqRixPQUFRLE9BQU9aO0FBQ25CO0FBQ0E7O0NBRUMsR0FDTSxTQUFTYSxrQkFBa0JDLFVBQVU7SUFDeEMsSUFBSUM7SUFDSixNQUFNLEVBQUVDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxjQUFjLEVBQUVDLFdBQVcsSUFBSUMsTUFBTSxFQUFFQyxLQUFLLEVBQUVDLFNBQVMsRUFBRUMsU0FBUyxFQUFFQyxTQUFTLEVBQUVDLE1BQU0sRUFBRUMsR0FBRyxFQUFFQyxPQUFPLEVBQUcsR0FBR2I7SUFDbEksa0JBQWtCO0lBQ2xCO1FBQ0ksSUFBSSxDQUFDYyxPQUFPQyxTQUFTLENBQUNiLFVBQ2xCLE1BQU0sSUFBSW5CLE1BQU0sQ0FBQyw4R0FBOEcsRUFBRW1CLFFBQVEsQ0FBQztRQUM5SSxJQUFJLENBQUNDLFFBQ0QsTUFBTSxJQUFJcEIsTUFBTSxDQUFDLGdGQUFnRixDQUFDO1FBQ3RHLElBQUl3QixTQUFTQSxNQUFNUyxNQUFNLEdBQUcsR0FDeEIsTUFBTSxJQUFJakMsTUFBTSxDQUFDLDRHQUE0RyxFQUFFd0IsTUFBTSxDQUFDO1FBQzFJLElBQUksQ0FBQ0ssS0FDRCxNQUFNLElBQUk3QixNQUFNLENBQUMsMEVBQTBFLENBQUM7UUFDaEcsSUFBSThCLFlBQVksS0FDWixNQUFNLElBQUk5QixNQUFNLENBQUMsOEZBQThGLEVBQUU4QixRQUFRLENBQUM7UUFDOUgsSUFBSSxDQUFDWixLQUFLRCxXQUFXaUIsU0FBUyxNQUFNLFFBQVFoQixPQUFPLEtBQUssSUFBSSxLQUFLLElBQUlBLEdBQUdpQixRQUFRLENBQUMsT0FDN0UsTUFBTSxJQUFJbkMsTUFBTSxDQUFDLDZHQUE2RyxFQUFFaUIsV0FBV2lCLFNBQVMsQ0FBQyxDQUFDO0lBQzlKO0lBQ0Esb0JBQW9CO0lBQ3BCLE1BQU1wQyxVQUFVRCxXQUFXb0IsV0FBV25CLE9BQU87SUFDN0MsTUFBTXNDLFNBQVNSLFNBQVMsQ0FBQyxFQUFFQSxPQUFPLEdBQUcsRUFBRVIsT0FBTyxDQUFDLEdBQUdBO0lBQ2xELE1BQU1jLFlBQVlqQixXQUFXaUIsU0FBUyxHQUFHLENBQUMsRUFBRWpCLFdBQVdpQixTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUc7SUFDdkUsTUFBTUcsU0FBUyxDQUFDLEVBQUVELE9BQU8sbURBQW1ELEVBQUV0QyxRQUFRLElBQUksRUFBRW9DLFVBQVUsQ0FBQztJQUN2RyxJQUFJSSxTQUFTLENBQUMsS0FBSyxFQUFFVCxJQUFJLFdBQVcsRUFBRUMsUUFBUSxZQUFZLEVBQUVYLFFBQVEsRUFBRUssUUFBUSxDQUFDLFNBQVMsRUFBRUEsTUFBTSxDQUFDLEdBQUcsR0FBRyxhQUFhLEVBQUVGLFNBQVNpQixXQUFXLEdBQUcsQ0FBQztJQUM5SSxJQUFJbEIsZ0JBQ0FpQixVQUFVLENBQUMsbUJBQW1CLEVBQUVqQixlQUFla0IsV0FBVyxHQUFHLENBQUM7SUFDbEUsSUFBSWQsV0FDQWEsVUFBVSxDQUFDLGNBQWMsRUFBRWIsVUFBVWMsV0FBVyxHQUFHLENBQUM7SUFDeEQsSUFBSWIsV0FDQVksVUFBVSxDQUFDLGNBQWMsRUFBRVosVUFBVSxDQUFDO0lBQzFDLElBQUlDLFdBQVc7UUFDWCxJQUFJYSxVQUFVO1FBQ2QsS0FBSyxNQUFNQyxZQUFZZCxVQUFXO1lBQzlCLElBQUksQ0FBQ2MsWUFBWSxPQUFPQSxhQUFhLFVBQ2pDLE1BQU0sSUFBSXpDLE1BQU0sQ0FBQyxrSEFBa0gsRUFBRXlDLFNBQVMsQ0FBQztZQUNuSkQsV0FBVyxDQUFDLElBQUksRUFBRUMsU0FBUyxDQUFDO1FBQ2hDO1FBQ0FILFVBQVVFO0lBQ2Q7SUFDQSxPQUFPLENBQUMsRUFBRUgsT0FBTyxFQUFFLEVBQUVDLE9BQU8sQ0FBQztBQUNqQyxFQUNBLG9DQUFvQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvd2ViMy9ldGhlcmV1bS5qcz8yMGQ1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIHR5cGVzIGFuZCBmdW5jdGlvbnMgY29waWVkIG92ZXIgZnJvbSB2aWVtIHNvIHRoaXMgbGlicmFyeSBkb2Vzbid0IGRlcGVuZCBvbiBpdFxuZXhwb3J0IGZ1bmN0aW9uIGdldEFkZHJlc3MoYWRkcmVzcykge1xuICAgIGlmICghL14weFthLWZBLUYwLTldezQwfSQvLnRlc3QoYWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogQWRkcmVzcyBcIiR7YWRkcmVzc31cIiBpcyBpbnZhbGlkLmApO1xuICAgIH1cbiAgICByZXR1cm4gYWRkcmVzcy50b0xvd2VyQ2FzZSgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZyb21IZXgoaGV4KSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KGhleCwgMTYpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvSGV4KHZhbHVlKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodmFsdWUpO1xuICAgIGNvbnN0IGhleCA9IEFycmF5LmZyb20oYnl0ZXMsIChieXRlKSA9PiBieXRlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gKCcweCcgKyBoZXgpO1xufVxuLyoqXG4gKiBDcmVhdGVzIEVJUC00MzYxIGZvcm1hdHRlZCBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2l3ZU1lc3NhZ2UocGFyYW1ldGVycykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCB7IGNoYWluSWQsIGRvbWFpbiwgZXhwaXJhdGlvblRpbWUsIGlzc3VlZEF0ID0gbmV3IERhdGUoKSwgbm9uY2UsIG5vdEJlZm9yZSwgcmVxdWVzdElkLCByZXNvdXJjZXMsIHNjaGVtZSwgdXJpLCB2ZXJzaW9uLCB9ID0gcGFyYW1ldGVycztcbiAgICAvLyBWYWxpZGF0ZSBmaWVsZHNcbiAgICB7XG4gICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihjaGFpbklkKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IEludmFsaWQgU0lXRSBtZXNzYWdlIGZpZWxkIFwiY2hhaW5JZFwiLiBDaGFpbiBJRCBtdXN0IGJlIGEgRUlQLTE1NSBjaGFpbiBJRC4gUHJvdmlkZWQgdmFsdWU6ICR7Y2hhaW5JZH1gKTtcbiAgICAgICAgaWYgKCFkb21haW4pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBJbnZhbGlkIFNJV0UgbWVzc2FnZSBmaWVsZCBcImRvbWFpblwiLiBEb21haW4gbXVzdCBiZSBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKG5vbmNlICYmIG5vbmNlLmxlbmd0aCA8IDgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBJbnZhbGlkIFNJV0UgbWVzc2FnZSBmaWVsZCBcIm5vbmNlXCIuIE5vbmNlIG11c3QgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzLiBQcm92aWRlZCB2YWx1ZTogJHtub25jZX1gKTtcbiAgICAgICAgaWYgKCF1cmkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBJbnZhbGlkIFNJV0UgbWVzc2FnZSBmaWVsZCBcInVyaVwiLiBVUkkgbXVzdCBiZSBwcm92aWRlZC5gKTtcbiAgICAgICAgaWYgKHZlcnNpb24gIT09ICcxJylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IEludmFsaWQgU0lXRSBtZXNzYWdlIGZpZWxkIFwidmVyc2lvblwiLiBWZXJzaW9uIG11c3QgYmUgJzEnLiBQcm92aWRlZCB2YWx1ZTogJHt2ZXJzaW9ufWApO1xuICAgICAgICBpZiAoKF9hID0gcGFyYW1ldGVycy5zdGF0ZW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbmNsdWRlcygnXFxuJykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBJbnZhbGlkIFNJV0UgbWVzc2FnZSBmaWVsZCBcInN0YXRlbWVudFwiLiBTdGF0ZW1lbnQgbXVzdCBub3QgaW5jbHVkZSAnXFxcXG4nLiBQcm92aWRlZCB2YWx1ZTogJHtwYXJhbWV0ZXJzLnN0YXRlbWVudH1gKTtcbiAgICB9XG4gICAgLy8gQ29uc3RydWN0IG1lc3NhZ2VcbiAgICBjb25zdCBhZGRyZXNzID0gZ2V0QWRkcmVzcyhwYXJhbWV0ZXJzLmFkZHJlc3MpO1xuICAgIGNvbnN0IG9yaWdpbiA9IHNjaGVtZSA/IGAke3NjaGVtZX06Ly8ke2RvbWFpbn1gIDogZG9tYWluO1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IHBhcmFtZXRlcnMuc3RhdGVtZW50ID8gYCR7cGFyYW1ldGVycy5zdGF0ZW1lbnR9XFxuYCA6ICcnO1xuICAgIGNvbnN0IHByZWZpeCA9IGAke29yaWdpbn0gd2FudHMgeW91IHRvIHNpZ24gaW4gd2l0aCB5b3VyIEV0aGVyZXVtIGFjY291bnQ6XFxuJHthZGRyZXNzfVxcblxcbiR7c3RhdGVtZW50fWA7XG4gICAgbGV0IHN1ZmZpeCA9IGBVUkk6ICR7dXJpfVxcblZlcnNpb246ICR7dmVyc2lvbn1cXG5DaGFpbiBJRDogJHtjaGFpbklkfSR7bm9uY2UgPyBgXFxuTm9uY2U6ICR7bm9uY2V9YCA6ICcnfVxcbklzc3VlZCBBdDogJHtpc3N1ZWRBdC50b0lTT1N0cmluZygpfWA7XG4gICAgaWYgKGV4cGlyYXRpb25UaW1lKVxuICAgICAgICBzdWZmaXggKz0gYFxcbkV4cGlyYXRpb24gVGltZTogJHtleHBpcmF0aW9uVGltZS50b0lTT1N0cmluZygpfWA7XG4gICAgaWYgKG5vdEJlZm9yZSlcbiAgICAgICAgc3VmZml4ICs9IGBcXG5Ob3QgQmVmb3JlOiAke25vdEJlZm9yZS50b0lTT1N0cmluZygpfWA7XG4gICAgaWYgKHJlcXVlc3RJZClcbiAgICAgICAgc3VmZml4ICs9IGBcXG5SZXF1ZXN0IElEOiAke3JlcXVlc3RJZH1gO1xuICAgIGlmIChyZXNvdXJjZXMpIHtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSAnXFxuUmVzb3VyY2VzOic7XG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG4gICAgICAgICAgICBpZiAoIXJlc291cmNlIHx8IHR5cGVvZiByZXNvdXJjZSAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJyZXNvdXJjZXNcIi4gRXZlcnkgcmVzb3VyY2UgbXVzdCBiZSBhIHZhbGlkIHN0cmluZy4gUHJvdmlkZWQgdmFsdWU6ICR7cmVzb3VyY2V9YCk7XG4gICAgICAgICAgICBjb250ZW50ICs9IGBcXG4tICR7cmVzb3VyY2V9YDtcbiAgICAgICAgfVxuICAgICAgICBzdWZmaXggKz0gY29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1cXG4ke3N1ZmZpeH1gO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXRoZXJldW0uanMubWFwIl0sIm5hbWVzIjpbImdldEFkZHJlc3MiLCJhZGRyZXNzIiwidGVzdCIsIkVycm9yIiwidG9Mb3dlckNhc2UiLCJmcm9tSGV4IiwiaGV4IiwicGFyc2VJbnQiLCJ0b0hleCIsInZhbHVlIiwiYnl0ZXMiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsIkFycmF5IiwiZnJvbSIsImJ5dGUiLCJ0b1N0cmluZyIsInBhZFN0YXJ0Iiwiam9pbiIsImNyZWF0ZVNpd2VNZXNzYWdlIiwicGFyYW1ldGVycyIsIl9hIiwiY2hhaW5JZCIsImRvbWFpbiIsImV4cGlyYXRpb25UaW1lIiwiaXNzdWVkQXQiLCJEYXRlIiwibm9uY2UiLCJub3RCZWZvcmUiLCJyZXF1ZXN0SWQiLCJyZXNvdXJjZXMiLCJzY2hlbWUiLCJ1cmkiLCJ2ZXJzaW9uIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwibGVuZ3RoIiwic3RhdGVtZW50IiwiaW5jbHVkZXMiLCJvcmlnaW4iLCJwcmVmaXgiLCJzdWZmaXgiLCJ0b0lTT1N0cmluZyIsImNvbnRlbnQiLCJyZXNvdXJjZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js":
|
||
/*!*************************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js ***!
|
||
\*************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createSiweMessage: () => (/* binding */ createSiweMessage),\n/* harmony export */ fromHex: () => (/* binding */ fromHex),\n/* harmony export */ getAddress: () => (/* binding */ getAddress),\n/* harmony export */ toHex: () => (/* 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 \"${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: ${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: ${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: ${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: ${parameters.statement}`);\n }\n // Construct message\n const address = getAddress(parameters.address);\n const origin = scheme ? `${scheme}://${domain}` : domain;\n const statement = parameters.statement ? `${parameters.statement}\\n` : \"\";\n const prefix = `${origin} wants you to sign in with your Ethereum account:\\n${address}\\n\\n${statement}`;\n let suffix = `URI: ${uri}\\nVersion: ${version}\\nChain ID: ${chainId}${nonce ? `\\nNonce: ${nonce}` : \"\"}\\nIssued At: ${issuedAt.toISOString()}`;\n if (expirationTime) suffix += `\\nExpiration Time: ${expirationTime.toISOString()}`;\n if (notBefore) suffix += `\\nNot Before: ${notBefore.toISOString()}`;\n if (requestId) suffix += `\\nRequest ID: ${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: ${resource}`);\n content += `\\n- ${resource}`;\n }\n suffix += content;\n }\n return `${prefix}\\n${suffix}`;\n} //# sourceMappingURL=ethereum.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3dlYjMvZXRoZXJldW0uanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLGlGQUFpRjtBQUMxRSxTQUFTQSxXQUFXQyxPQUFPO0lBQzlCLElBQUksQ0FBQyxzQkFBc0JDLElBQUksQ0FBQ0QsVUFBVTtRQUN0QyxNQUFNLElBQUlFLE1BQU0sQ0FBQyw0QkFBNEIsRUFBRUYsUUFBUSxhQUFhLENBQUM7SUFDekU7SUFDQSxPQUFPQSxRQUFRRyxXQUFXO0FBQzlCO0FBQ08sU0FBU0MsUUFBUUMsR0FBRztJQUN2QixPQUFPQyxTQUFTRCxLQUFLO0FBQ3pCO0FBQ08sU0FBU0UsTUFBTUMsS0FBSztJQUN2QixNQUFNQyxRQUFRLElBQUlDLGNBQWNDLE1BQU0sQ0FBQ0g7SUFDdkMsTUFBTUgsTUFBTU8sTUFBTUMsSUFBSSxDQUFDSixPQUFPLENBQUNLLE9BQVNBLEtBQUtDLFFBQVEsQ0FBQyxJQUFJQyxRQUFRLENBQUMsR0FBRyxNQUFNQyxJQUFJLENBQUM7SUFDakYsT0FBUSxPQUFPWjtBQUNuQjtBQUNBOztDQUVDLEdBQ00sU0FBU2Esa0JBQWtCQyxVQUFVO0lBQ3hDLElBQUlDO0lBQ0osTUFBTSxFQUFFQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsY0FBYyxFQUFFQyxXQUFXLElBQUlDLE1BQU0sRUFBRUMsS0FBSyxFQUFFQyxTQUFTLEVBQUVDLFNBQVMsRUFBRUMsU0FBUyxFQUFFQyxNQUFNLEVBQUVDLEdBQUcsRUFBRUMsT0FBTyxFQUFHLEdBQUdiO0lBQ2xJLGtCQUFrQjtJQUNsQjtRQUNJLElBQUksQ0FBQ2MsT0FBT0MsU0FBUyxDQUFDYixVQUNsQixNQUFNLElBQUluQixNQUFNLENBQUMsOEdBQThHLEVBQUVtQixRQUFRLENBQUM7UUFDOUksSUFBSSxDQUFDQyxRQUNELE1BQU0sSUFBSXBCLE1BQU0sQ0FBQyxnRkFBZ0YsQ0FBQztRQUN0RyxJQUFJd0IsU0FBU0EsTUFBTVMsTUFBTSxHQUFHLEdBQ3hCLE1BQU0sSUFBSWpDLE1BQU0sQ0FBQyw0R0FBNEcsRUFBRXdCLE1BQU0sQ0FBQztRQUMxSSxJQUFJLENBQUNLLEtBQ0QsTUFBTSxJQUFJN0IsTUFBTSxDQUFDLDBFQUEwRSxDQUFDO1FBQ2hHLElBQUk4QixZQUFZLEtBQ1osTUFBTSxJQUFJOUIsTUFBTSxDQUFDLDhGQUE4RixFQUFFOEIsUUFBUSxDQUFDO1FBQzlILElBQUksQ0FBQ1osS0FBS0QsV0FBV2lCLFNBQVMsTUFBTSxRQUFRaEIsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHaUIsUUFBUSxDQUFDLE9BQzdFLE1BQU0sSUFBSW5DLE1BQU0sQ0FBQyw2R0FBNkcsRUFBRWlCLFdBQVdpQixTQUFTLENBQUMsQ0FBQztJQUM5SjtJQUNBLG9CQUFvQjtJQUNwQixNQUFNcEMsVUFBVUQsV0FBV29CLFdBQVduQixPQUFPO0lBQzdDLE1BQU1zQyxTQUFTUixTQUFTLENBQUMsRUFBRUEsT0FBTyxHQUFHLEVBQUVSLE9BQU8sQ0FBQyxHQUFHQTtJQUNsRCxNQUFNYyxZQUFZakIsV0FBV2lCLFNBQVMsR0FBRyxDQUFDLEVBQUVqQixXQUFXaUIsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHO0lBQ3ZFLE1BQU1HLFNBQVMsQ0FBQyxFQUFFRCxPQUFPLG1EQUFtRCxFQUFFdEMsUUFBUSxJQUFJLEVBQUVvQyxVQUFVLENBQUM7SUFDdkcsSUFBSUksU0FBUyxDQUFDLEtBQUssRUFBRVQsSUFBSSxXQUFXLEVBQUVDLFFBQVEsWUFBWSxFQUFFWCxRQUFRLEVBQUVLLFFBQVEsQ0FBQyxTQUFTLEVBQUVBLE1BQU0sQ0FBQyxHQUFHLEdBQUcsYUFBYSxFQUFFRixTQUFTaUIsV0FBVyxHQUFHLENBQUM7SUFDOUksSUFBSWxCLGdCQUNBaUIsVUFBVSxDQUFDLG1CQUFtQixFQUFFakIsZUFBZWtCLFdBQVcsR0FBRyxDQUFDO0lBQ2xFLElBQUlkLFdBQ0FhLFVBQVUsQ0FBQyxjQUFjLEVBQUViLFVBQVVjLFdBQVcsR0FBRyxDQUFDO0lBQ3hELElBQUliLFdBQ0FZLFVBQVUsQ0FBQyxjQUFjLEVBQUVaLFVBQVUsQ0FBQztJQUMxQyxJQUFJQyxXQUFXO1FBQ1gsSUFBSWEsVUFBVTtRQUNkLEtBQUssTUFBTUMsWUFBWWQsVUFBVztZQUM5QixJQUFJLENBQUNjLFlBQVksT0FBT0EsYUFBYSxVQUNqQyxNQUFNLElBQUl6QyxNQUFNLENBQUMsa0hBQWtILEVBQUV5QyxTQUFTLENBQUM7WUFDbkpELFdBQVcsQ0FBQyxJQUFJLEVBQUVDLFNBQVMsQ0FBQztRQUNoQztRQUNBSCxVQUFVRTtJQUNkO0lBQ0EsT0FBTyxDQUFDLEVBQUVILE9BQU8sRUFBRSxFQUFFQyxPQUFPLENBQUM7QUFDakMsRUFDQSxvQ0FBb0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3dlYjMvZXRoZXJldW0uanM/MjBkNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0eXBlcyBhbmQgZnVuY3Rpb25zIGNvcGllZCBvdmVyIGZyb20gdmllbSBzbyB0aGlzIGxpYnJhcnkgZG9lc24ndCBkZXBlbmQgb24gaXRcbmV4cG9ydCBmdW5jdGlvbiBnZXRBZGRyZXNzKGFkZHJlc3MpIHtcbiAgICBpZiAoIS9eMHhbYS1mQS1GMC05XXs0MH0kLy50ZXN0KGFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IEFkZHJlc3MgXCIke2FkZHJlc3N9XCIgaXMgaW52YWxpZC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmcm9tSGV4KGhleCkge1xuICAgIHJldHVybiBwYXJzZUludChoZXgsIDE2KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b0hleCh2YWx1ZSkge1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKTtcbiAgICBjb25zdCBoZXggPSBBcnJheS5mcm9tKGJ5dGVzLCAoYnl0ZSkgPT4gYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuICgnMHgnICsgaGV4KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBFSVAtNDM2MSBmb3JtYXR0ZWQgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNpd2VNZXNzYWdlKHBhcmFtZXRlcnMpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgeyBjaGFpbklkLCBkb21haW4sIGV4cGlyYXRpb25UaW1lLCBpc3N1ZWRBdCA9IG5ldyBEYXRlKCksIG5vbmNlLCBub3RCZWZvcmUsIHJlcXVlc3RJZCwgcmVzb3VyY2VzLCBzY2hlbWUsIHVyaSwgdmVyc2lvbiwgfSA9IHBhcmFtZXRlcnM7XG4gICAgLy8gVmFsaWRhdGUgZmllbGRzXG4gICAge1xuICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoY2hhaW5JZCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBJbnZhbGlkIFNJV0UgbWVzc2FnZSBmaWVsZCBcImNoYWluSWRcIi4gQ2hhaW4gSUQgbXVzdCBiZSBhIEVJUC0xNTUgY2hhaW4gSUQuIFByb3ZpZGVkIHZhbHVlOiAke2NoYWluSWR9YCk7XG4gICAgICAgIGlmICghZG9tYWluKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJkb21haW5cIi4gRG9tYWluIG11c3QgYmUgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlmIChub25jZSAmJiBub25jZS5sZW5ndGggPCA4KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJub25jZVwiLiBOb25jZSBtdXN0IGJlIGF0IGxlYXN0IDggY2hhcmFjdGVycy4gUHJvdmlkZWQgdmFsdWU6ICR7bm9uY2V9YCk7XG4gICAgICAgIGlmICghdXJpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJ1cmlcIi4gVVJJIG11c3QgYmUgcHJvdmlkZWQuYCk7XG4gICAgICAgIGlmICh2ZXJzaW9uICE9PSAnMScpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBzdXBhYmFzZS9hdXRoLWpzOiBJbnZhbGlkIFNJV0UgbWVzc2FnZSBmaWVsZCBcInZlcnNpb25cIi4gVmVyc2lvbiBtdXN0IGJlICcxJy4gUHJvdmlkZWQgdmFsdWU6ICR7dmVyc2lvbn1gKTtcbiAgICAgICAgaWYgKChfYSA9IHBhcmFtZXRlcnMuc3RhdGVtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5jbHVkZXMoJ1xcbicpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2UvYXV0aC1qczogSW52YWxpZCBTSVdFIG1lc3NhZ2UgZmllbGQgXCJzdGF0ZW1lbnRcIi4gU3RhdGVtZW50IG11c3Qgbm90IGluY2x1ZGUgJ1xcXFxuJy4gUHJvdmlkZWQgdmFsdWU6ICR7cGFyYW1ldGVycy5zdGF0ZW1lbnR9YCk7XG4gICAgfVxuICAgIC8vIENvbnN0cnVjdCBtZXNzYWdlXG4gICAgY29uc3QgYWRkcmVzcyA9IGdldEFkZHJlc3MocGFyYW1ldGVycy5hZGRyZXNzKTtcbiAgICBjb25zdCBvcmlnaW4gPSBzY2hlbWUgPyBgJHtzY2hlbWV9Oi8vJHtkb21haW59YCA6IGRvbWFpbjtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBwYXJhbWV0ZXJzLnN0YXRlbWVudCA/IGAke3BhcmFtZXRlcnMuc3RhdGVtZW50fVxcbmAgOiAnJztcbiAgICBjb25zdCBwcmVmaXggPSBgJHtvcmlnaW59IHdhbnRzIHlvdSB0byBzaWduIGluIHdpdGggeW91ciBFdGhlcmV1bSBhY2NvdW50OlxcbiR7YWRkcmVzc31cXG5cXG4ke3N0YXRlbWVudH1gO1xuICAgIGxldCBzdWZmaXggPSBgVVJJOiAke3VyaX1cXG5WZXJzaW9uOiAke3ZlcnNpb259XFxuQ2hhaW4gSUQ6ICR7Y2hhaW5JZH0ke25vbmNlID8gYFxcbk5vbmNlOiAke25vbmNlfWAgOiAnJ31cXG5Jc3N1ZWQgQXQ6ICR7aXNzdWVkQXQudG9JU09TdHJpbmcoKX1gO1xuICAgIGlmIChleHBpcmF0aW9uVGltZSlcbiAgICAgICAgc3VmZml4ICs9IGBcXG5FeHBpcmF0aW9uIFRpbWU6ICR7ZXhwaXJhdGlvblRpbWUudG9JU09TdHJpbmcoKX1gO1xuICAgIGlmIChub3RCZWZvcmUpXG4gICAgICAgIHN1ZmZpeCArPSBgXFxuTm90IEJlZm9yZTogJHtub3RCZWZvcmUudG9JU09TdHJpbmcoKX1gO1xuICAgIGlmIChyZXF1ZXN0SWQpXG4gICAgICAgIHN1ZmZpeCArPSBgXFxuUmVxdWVzdCBJRDogJHtyZXF1ZXN0SWR9YDtcbiAgICBpZiAocmVzb3VyY2VzKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gJ1xcblJlc291cmNlczonO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuICAgICAgICAgICAgaWYgKCFyZXNvdXJjZSB8fCB0eXBlb2YgcmVzb3VyY2UgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL2F1dGgtanM6IEludmFsaWQgU0lXRSBtZXNzYWdlIGZpZWxkIFwicmVzb3VyY2VzXCIuIEV2ZXJ5IHJlc291cmNlIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcuIFByb3ZpZGVkIHZhbHVlOiAke3Jlc291cmNlfWApO1xuICAgICAgICAgICAgY29udGVudCArPSBgXFxuLSAke3Jlc291cmNlfWA7XG4gICAgICAgIH1cbiAgICAgICAgc3VmZml4ICs9IGNvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9XFxuJHtzdWZmaXh9YDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV0aGVyZXVtLmpzLm1hcCJdLCJuYW1lcyI6WyJnZXRBZGRyZXNzIiwiYWRkcmVzcyIsInRlc3QiLCJFcnJvciIsInRvTG93ZXJDYXNlIiwiZnJvbUhleCIsImhleCIsInBhcnNlSW50IiwidG9IZXgiLCJ2YWx1ZSIsImJ5dGVzIiwiVGV4dEVuY29kZXIiLCJlbmNvZGUiLCJBcnJheSIsImZyb20iLCJieXRlIiwidG9TdHJpbmciLCJwYWRTdGFydCIsImpvaW4iLCJjcmVhdGVTaXdlTWVzc2FnZSIsInBhcmFtZXRlcnMiLCJfYSIsImNoYWluSWQiLCJkb21haW4iLCJleHBpcmF0aW9uVGltZSIsImlzc3VlZEF0IiwiRGF0ZSIsIm5vbmNlIiwibm90QmVmb3JlIiwicmVxdWVzdElkIiwicmVzb3VyY2VzIiwic2NoZW1lIiwidXJpIiwidmVyc2lvbiIsIk51bWJlciIsImlzSW50ZWdlciIsImxlbmd0aCIsInN0YXRlbWVudCIsImluY2x1ZGVzIiwib3JpZ2luIiwicHJlZml4Iiwic3VmZml4IiwidG9JU09TdHJpbmciLCJjb250ZW50IiwicmVzb3VyY2UiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js":
|
||
/*!***************************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js ***!
|
||
\***************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAuthnError: () => (/* binding */ WebAuthnError),\n/* harmony export */ WebAuthnUnknownError: () => (/* binding */ WebAuthnUnknownError),\n/* harmony export */ identifyAuthenticationError: () => (/* binding */ identifyAuthenticationError),\n/* harmony export */ identifyRegistrationError: () => (/* binding */ identifyRegistrationError),\n/* harmony export */ isWebAuthnError: () => (/* binding */ isWebAuthnError)\n/* harmony export */ });\n/* harmony import */ var _webauthn__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webauthn */ \"(action-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({ error, options }) {\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: `${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 \"${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({ error, options }) {\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: `${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 \"${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvd2ViYXV0aG4uZXJyb3JzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLG9EQUFvRCxHQUNUO0FBQzNDOzs7Ozs7Ozs7Ozs7Ozs7O0NBZ0JDLEdBQ00sTUFBTUMsc0JBQXNCQztJQUMvQkMsWUFBWSxFQUFFQyxPQUFPLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFFQyxJQUFJLEVBQUcsQ0FBRTtRQUN6QyxJQUFJQztRQUNKLGlFQUFpRTtRQUNqRSxLQUFLLENBQUNKLFNBQVM7WUFBRUU7UUFBTTtRQUN2QixJQUFJLENBQUNHLGlCQUFpQixHQUFHO1FBQ3pCLElBQUksQ0FBQ0YsSUFBSSxHQUFHLENBQUNDLEtBQUtELFNBQVMsUUFBUUEsU0FBUyxLQUFLLElBQUlBLE9BQVFELGlCQUFpQkosUUFBUUksTUFBTUMsSUFBSSxHQUFHRyxTQUFTLE1BQU8sUUFBUUYsT0FBTyxLQUFLLElBQUlBLEtBQUs7UUFDaEosSUFBSSxDQUFDSCxJQUFJLEdBQUdBO0lBQ2hCO0FBQ0o7QUFDQTs7O0NBR0MsR0FDTSxNQUFNTSw2QkFBNkJWO0lBQ3RDRSxZQUFZQyxPQUFPLEVBQUVRLGFBQWEsQ0FBRTtRQUNoQyxLQUFLLENBQUM7WUFDRlAsTUFBTTtZQUNOQyxPQUFPTTtZQUNQUjtRQUNKO1FBQ0EsSUFBSSxDQUFDRyxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNLLGFBQWEsR0FBR0E7SUFDekI7QUFDSjtBQUNBOzs7O0NBSUMsR0FDTSxTQUFTQyxnQkFBZ0JDLEtBQUs7SUFDakMsT0FBTyxPQUFPQSxVQUFVLFlBQVlBLFVBQVUsUUFBUSx1QkFBdUJBO0FBQ2pGO0FBQ0E7Ozs7Ozs7O0NBUUMsR0FDTSxTQUFTQywwQkFBMEIsRUFBRUQsS0FBSyxFQUFFRSxPQUFPLEVBQUc7SUFDekQsSUFBSVIsSUFBSVMsSUFBSUM7SUFDWixNQUFNLEVBQUVDLFNBQVMsRUFBRSxHQUFHSDtJQUN0QixJQUFJLENBQUNHLFdBQVc7UUFDWixNQUFNakIsTUFBTTtJQUNoQjtJQUNBLElBQUlZLE1BQU1QLElBQUksS0FBSyxjQUFjO1FBQzdCLElBQUlTLFFBQVFJLE1BQU0sWUFBWUMsYUFBYTtZQUN2QyxvRUFBb0U7WUFDcEUsT0FBTyxJQUFJcEIsY0FBYztnQkFDckJHLFNBQVM7Z0JBQ1RDLE1BQU07Z0JBQ05DLE9BQU9RO1lBQ1g7UUFDSjtJQUNKLE9BQ0ssSUFBSUEsTUFBTVAsSUFBSSxLQUFLLG1CQUFtQjtRQUN2QyxJQUFJLENBQUMsQ0FBQ0MsS0FBS1csVUFBVUcsc0JBQXNCLE1BQU0sUUFBUWQsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHZSxrQkFBa0IsTUFBTSxNQUFNO1lBQy9HLCtEQUErRDtZQUMvRCxPQUFPLElBQUl0QixjQUFjO2dCQUNyQkcsU0FBUztnQkFDVEMsTUFBTTtnQkFDTkMsT0FBT1E7WUFDWDtRQUNKLE9BQ0ssSUFDTCwyR0FBMkc7UUFDM0dFLFFBQVFRLFNBQVMsS0FBSyxpQkFDbEIsQ0FBQyxDQUFDUCxLQUFLRSxVQUFVRyxzQkFBc0IsTUFBTSxRQUFRTCxPQUFPLEtBQUssSUFBSSxLQUFLLElBQUlBLEdBQUdRLGdCQUFnQixNQUFNLFlBQVk7WUFDbkgsb0VBQW9FO1lBQ3BFLE9BQU8sSUFBSXhCLGNBQWM7Z0JBQ3JCRyxTQUFTO2dCQUNUQyxNQUFNO2dCQUNOQyxPQUFPUTtZQUNYO1FBQ0osT0FDSyxJQUFJLENBQUMsQ0FBQ0ksS0FBS0MsVUFBVUcsc0JBQXNCLE1BQU0sUUFBUUosT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHTyxnQkFBZ0IsTUFBTSxZQUFZO1lBQ3hILCtEQUErRDtZQUMvRCxPQUFPLElBQUl4QixjQUFjO2dCQUNyQkcsU0FBUztnQkFDVEMsTUFBTTtnQkFDTkMsT0FBT1E7WUFDWDtRQUNKO0lBQ0osT0FDSyxJQUFJQSxNQUFNUCxJQUFJLEtBQUsscUJBQXFCO1FBQ3pDLG9FQUFvRTtRQUNwRSwrREFBK0Q7UUFDL0QsT0FBTyxJQUFJTixjQUFjO1lBQ3JCRyxTQUFTO1lBQ1RDLE1BQU07WUFDTkMsT0FBT1E7UUFDWDtJQUNKLE9BQ0ssSUFBSUEsTUFBTVAsSUFBSSxLQUFLLG1CQUFtQjtRQUN2Qzs7O1NBR0MsR0FDRCxPQUFPLElBQUlOLGNBQWM7WUFDckJHLFNBQVNVLE1BQU1WLE9BQU87WUFDdEJDLE1BQU07WUFDTkMsT0FBT1E7UUFDWDtJQUNKLE9BQ0ssSUFBSUEsTUFBTVAsSUFBSSxLQUFLLHFCQUFxQjtRQUN6QyxNQUFNbUIsd0JBQXdCUCxVQUFVUSxnQkFBZ0IsQ0FBQ0MsTUFBTSxDQUFDLENBQUNDLFFBQVVBLE1BQU1DLElBQUksS0FBSztRQUMxRixJQUFJSixzQkFBc0JLLE1BQU0sS0FBSyxHQUFHO1lBQ3BDLG9FQUFvRTtZQUNwRSxPQUFPLElBQUk5QixjQUFjO2dCQUNyQkcsU0FBUztnQkFDVEMsTUFBTTtnQkFDTkMsT0FBT1E7WUFDWDtRQUNKO1FBQ0EsK0RBQStEO1FBQy9ELE9BQU8sSUFBSWIsY0FBYztZQUNyQkcsU0FBUztZQUNUQyxNQUFNO1lBQ05DLE9BQU9RO1FBQ1g7SUFDSixPQUNLLElBQUlBLE1BQU1QLElBQUksS0FBSyxpQkFBaUI7UUFDckMsTUFBTXlCLGtCQUFrQkMsT0FBT0MsUUFBUSxDQUFDQyxRQUFRO1FBQ2hELElBQUksQ0FBQ25DLHdEQUFhQSxDQUFDZ0Msa0JBQWtCO1lBQ2pDLG1FQUFtRTtZQUNuRSxPQUFPLElBQUkvQixjQUFjO2dCQUNyQkcsU0FBUyxDQUFDLEVBQUU2QixPQUFPQyxRQUFRLENBQUNDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDM0Q5QixNQUFNO2dCQUNOQyxPQUFPUTtZQUNYO1FBQ0osT0FDSyxJQUFJSyxVQUFVaUIsRUFBRSxDQUFDQyxFQUFFLEtBQUtMLGlCQUFpQjtZQUMxQyxtRUFBbUU7WUFDbkUsT0FBTyxJQUFJL0IsY0FBYztnQkFDckJHLFNBQVMsQ0FBQyxXQUFXLEVBQUVlLFVBQVVpQixFQUFFLENBQUNDLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztnQkFDcEVoQyxNQUFNO2dCQUNOQyxPQUFPUTtZQUNYO1FBQ0o7SUFDSixPQUNLLElBQUlBLE1BQU1QLElBQUksS0FBSyxhQUFhO1FBQ2pDLElBQUlZLFVBQVVtQixJQUFJLENBQUNELEVBQUUsQ0FBQ0UsVUFBVSxHQUFHLEtBQUtwQixVQUFVbUIsSUFBSSxDQUFDRCxFQUFFLENBQUNFLFVBQVUsR0FBRyxJQUFJO1lBQ3ZFLG1FQUFtRTtZQUNuRSxPQUFPLElBQUl0QyxjQUFjO2dCQUNyQkcsU0FBUztnQkFDVEMsTUFBTTtnQkFDTkMsT0FBT1E7WUFDWDtRQUNKO0lBQ0osT0FDSyxJQUFJQSxNQUFNUCxJQUFJLEtBQUssZ0JBQWdCO1FBQ3BDLCtEQUErRDtRQUMvRCwrREFBK0Q7UUFDL0QsT0FBTyxJQUFJTixjQUFjO1lBQ3JCRyxTQUFTO1lBQ1RDLE1BQU07WUFDTkMsT0FBT1E7UUFDWDtJQUNKO0lBQ0EsT0FBTyxJQUFJYixjQUFjO1FBQ3JCRyxTQUFTO1FBQ1RDLE1BQU07UUFDTkMsT0FBT1E7SUFDWDtBQUNKO0FBQ0E7Ozs7Ozs7O0NBUUMsR0FDTSxTQUFTMEIsNEJBQTRCLEVBQUUxQixLQUFLLEVBQUVFLE9BQU8sRUFBRztJQUMzRCxNQUFNLEVBQUVHLFNBQVMsRUFBRSxHQUFHSDtJQUN0QixJQUFJLENBQUNHLFdBQVc7UUFDWixNQUFNakIsTUFBTTtJQUNoQjtJQUNBLElBQUlZLE1BQU1QLElBQUksS0FBSyxjQUFjO1FBQzdCLElBQUlTLFFBQVFJLE1BQU0sWUFBWUMsYUFBYTtZQUN2QyxvRUFBb0U7WUFDcEUsT0FBTyxJQUFJcEIsY0FBYztnQkFDckJHLFNBQVM7Z0JBQ1RDLE1BQU07Z0JBQ05DLE9BQU9RO1lBQ1g7UUFDSjtJQUNKLE9BQ0ssSUFBSUEsTUFBTVAsSUFBSSxLQUFLLG1CQUFtQjtRQUN2Qzs7O1NBR0MsR0FDRCxPQUFPLElBQUlOLGNBQWM7WUFDckJHLFNBQVNVLE1BQU1WLE9BQU87WUFDdEJDLE1BQU07WUFDTkMsT0FBT1E7UUFDWDtJQUNKLE9BQ0ssSUFBSUEsTUFBTVAsSUFBSSxLQUFLLGlCQUFpQjtRQUNyQyxNQUFNeUIsa0JBQWtCQyxPQUFPQyxRQUFRLENBQUNDLFFBQVE7UUFDaEQsSUFBSSxDQUFDbkMsd0RBQWFBLENBQUNnQyxrQkFBa0I7WUFDakMsZ0ZBQWdGO1lBQ2hGLE9BQU8sSUFBSS9CLGNBQWM7Z0JBQ3JCRyxTQUFTLENBQUMsRUFBRTZCLE9BQU9DLFFBQVEsQ0FBQ0MsUUFBUSxDQUFDLHFCQUFxQixDQUFDO2dCQUMzRDlCLE1BQU07Z0JBQ05DLE9BQU9RO1lBQ1g7UUFDSixPQUNLLElBQUlLLFVBQVVzQixJQUFJLEtBQUtULGlCQUFpQjtZQUN6QyxnRkFBZ0Y7WUFDaEYsT0FBTyxJQUFJL0IsY0FBYztnQkFDckJHLFNBQVMsQ0FBQyxXQUFXLEVBQUVlLFVBQVVzQixJQUFJLENBQUMsNEJBQTRCLENBQUM7Z0JBQ25FcEMsTUFBTTtnQkFDTkMsT0FBT1E7WUFDWDtRQUNKO0lBQ0osT0FDSyxJQUFJQSxNQUFNUCxJQUFJLEtBQUssZ0JBQWdCO1FBQ3BDLG1FQUFtRTtRQUNuRSxvRUFBb0U7UUFDcEUsT0FBTyxJQUFJTixjQUFjO1lBQ3JCRyxTQUFTO1lBQ1RDLE1BQU07WUFDTkMsT0FBT1E7UUFDWDtJQUNKO0lBQ0EsT0FBTyxJQUFJYixjQUFjO1FBQ3JCRyxTQUFTO1FBQ1RDLE1BQU07UUFDTkMsT0FBT1E7SUFDWDtBQUNKLEVBQ0EsMkNBQTJDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi93ZWJhdXRobi5lcnJvcnMuanM/Yjk1YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbmltcG9ydCB7IGlzVmFsaWREb21haW4gfSBmcm9tICcuL3dlYmF1dGhuJztcbi8qKlxuICogQSBjdXN0b20gRXJyb3IgdXNlZCB0byByZXR1cm4gYSBtb3JlIG51YW5jZWQgZXJyb3IgZGV0YWlsaW5nIF93aHlfIG9uZSBvZiB0aGUgZWlnaHQgZG9jdW1lbnRlZFxuICogZXJyb3JzIGluIHRoZSBzcGVjIHdhcyByYWlzZWQgYWZ0ZXIgY2FsbGluZyBgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpYCBvclxuICogYG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoKWA6XG4gKlxuICogLSBgQWJvcnRFcnJvcmBcbiAqIC0gYENvbnN0cmFpbnRFcnJvcmBcbiAqIC0gYEludmFsaWRTdGF0ZUVycm9yYFxuICogLSBgTm90QWxsb3dlZEVycm9yYFxuICogLSBgTm90U3VwcG9ydGVkRXJyb3JgXG4gKiAtIGBTZWN1cml0eUVycm9yYFxuICogLSBgVHlwZUVycm9yYFxuICogLSBgVW5rbm93bkVycm9yYFxuICpcbiAqIEVycm9yIG1lc3NhZ2VzIHdlcmUgZGV0ZXJtaW5lZCB0aHJvdWdoIGludmVzdGlnYXRpb24gb2YgdGhlIHNwZWMgdG8gZGV0ZXJtaW5lIHVuZGVyIHdoaWNoXG4gKiBzY2VuYXJpb3MgYSBnaXZlbiBlcnJvciB3b3VsZCBiZSByYWlzZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJBdXRobkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHsgbWVzc2FnZSwgY29kZSwgY2F1c2UsIG5hbWUsIH0pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBoZWxwIFJvbGx1cCB1bmRlcnN0YW5kIHRoYXQgYGNhdXNlYCBpcyBva2F5IHRvIHNldFxuICAgICAgICBzdXBlcihtZXNzYWdlLCB7IGNhdXNlIH0pO1xuICAgICAgICB0aGlzLl9faXNXZWJBdXRobkVycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5uYW1lID0gKF9hID0gbmFtZSAhPT0gbnVsbCAmJiBuYW1lICE9PSB2b2lkIDAgPyBuYW1lIDogKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZS5uYW1lIDogdW5kZWZpbmVkKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJ1Vua25vd24gRXJyb3InO1xuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgY2xhc3MgZm9yIHVua25vd24gV2ViQXV0aG4gZXJyb3JzLlxuICogV3JhcHMgdW5leHBlY3RlZCBlcnJvcnMgdGhhdCBkb24ndCBtYXRjaCBrbm93biBXZWJBdXRobiBlcnJvciBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgV2ViQXV0aG5Vbmtub3duRXJyb3IgZXh0ZW5kcyBXZWJBdXRobkVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcmlnaW5hbEVycm9yKSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9QQVNTVEhST1VHSF9TRUVfQ0FVU0VfUFJPUEVSVFknLFxuICAgICAgICAgICAgY2F1c2U6IG9yaWdpbmFsRXJyb3IsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ1dlYkF1dGhuVW5rbm93bkVycm9yJztcbiAgICAgICAgdGhpcy5vcmlnaW5hbEVycm9yID0gb3JpZ2luYWxFcnJvcjtcbiAgICB9XG59XG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gZXJyb3IgaXMgYSBXZWJBdXRobkVycm9yLlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIFRoZSBlcnJvciB0byBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGVycm9yIGlzIGEgV2ViQXV0aG5FcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXZWJBdXRobkVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ19faXNXZWJBdXRobkVycm9yJyBpbiBlcnJvcjtcbn1cbi8qKlxuICogQXR0ZW1wdCB0byBpbnR1aXQgX3doeV8gYW4gZXJyb3Igd2FzIHJhaXNlZCBhZnRlciBjYWxsaW5nIGBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKClgLlxuICogTWFwcyBicm93c2VyIGVycm9ycyB0byBzcGVjaWZpYyBXZWJBdXRobiBlcnJvciBjb2RlcyBmb3IgYmV0dGVyIGRlYnVnZ2luZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBFcnJvciBpZGVudGlmaWNhdGlvbiBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0Vycm9yfSBwYXJhbXMuZXJyb3IgLSBUaGUgZXJyb3IgdGhyb3duIGJ5IHRoZSBicm93c2VyXG4gKiBAcGFyYW0ge0NyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnN9IHBhcmFtcy5vcHRpb25zIC0gVGhlIG9wdGlvbnMgcGFzc2VkIHRvIGNyZWRlbnRpYWxzLmNyZWF0ZSgpXG4gKiBAcmV0dXJucyB7V2ViQXV0aG5FcnJvcn0gQSBXZWJBdXRobkVycm9yIHdpdGggYSBzcGVjaWZpYyBlcnJvciBjb2RlXG4gKiBAc2VlIHtAbGluayBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXV0aG4vI3NjdG4tY3JlYXRlQ3JlZGVudGlhbCBXM0MgV2ViQXV0aG4gU3BlYyAtIENyZWF0ZSBDcmVkZW50aWFsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZnlSZWdpc3RyYXRpb25FcnJvcih7IGVycm9yLCBvcHRpb25zLCB9KSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgY29uc3QgeyBwdWJsaWNLZXkgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFwdWJsaWNLZXkpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ29wdGlvbnMgd2FzIG1pc3NpbmcgcmVxdWlyZWQgcHVibGljS2V5IHByb3BlcnR5Jyk7XG4gICAgfVxuICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc2lnbmFsIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgKFN0ZXAgMTYpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdSZWdpc3RyYXRpb24gY2VyZW1vbnkgd2FzIHNlbnQgYW4gYWJvcnQgc2lnbmFsJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfQ0VSRU1PTllfQUJPUlRFRCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ0NvbnN0cmFpbnRFcnJvcicpIHtcbiAgICAgICAgaWYgKCgoX2EgPSBwdWJsaWNLZXkuYXV0aGVudGljYXRvclNlbGVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlcXVpcmVSZXNpZGVudEtleSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLW9wLW1ha2UtY3JlZCAoU3RlcCA0KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRGlzY292ZXJhYmxlIGNyZWRlbnRpYWxzIHdlcmUgcmVxdWlyZWQgYnV0IG5vIGF2YWlsYWJsZSBhdXRoZW50aWNhdG9yIHN1cHBvcnRlZCBpdCcsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0FVVEhFTlRJQ0FUT1JfTUlTU0lOR19ESVNDT1ZFUkFCTEVfQ1JFREVOVElBTF9TVVBQT1JUJyxcbiAgICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYG1lZGlhdGlvbmAgZG9lc24ndCB5ZXQgZXhpc3Qgb24gQ3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyBidXQgaXQncyBwb3NzaWJsZSBhcyBvZiBTZXB0IDIwMjRcbiAgICAgICAgb3B0aW9ucy5tZWRpYXRpb24gPT09ICdjb25kaXRpb25hbCcgJiZcbiAgICAgICAgICAgICgoX2IgPSBwdWJsaWNLZXkuYXV0aGVudGljYXRvclNlbGVjdGlvbikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnVzZXJWZXJpZmljYXRpb24pID09PSAncmVxdWlyZWQnKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXV0aG4vI3NjdG4tY3JlYXRlQ3JlZGVudGlhbCAoU3RlcCAyMi40KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVXNlciB2ZXJpZmljYXRpb24gd2FzIHJlcXVpcmVkIGR1cmluZyBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIGJ1dCBpdCBjb3VsZCBub3QgYmUgcGVyZm9ybWVkJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfQVVUT19SRUdJU1RFUl9VU0VSX1ZFUklGSUNBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoKF9jID0gcHVibGljS2V5LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy51c2VyVmVyaWZpY2F0aW9uKSA9PT0gJ3JlcXVpcmVkJykge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tb3AtbWFrZS1jcmVkIChTdGVwIDUpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2VyIHZlcmlmaWNhdGlvbiB3YXMgcmVxdWlyZWQgYnV0IG5vIGF2YWlsYWJsZSBhdXRoZW50aWNhdG9yIHN1cHBvcnRlZCBpdCcsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0FVVEhFTlRJQ0FUT1JfTUlTU0lOR19VU0VSX1ZFUklGSUNBVElPTl9TVVBQT1JUJyxcbiAgICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnSW52YWxpZFN0YXRlRXJyb3InKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgKFN0ZXAgMjApXG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLW9wLW1ha2UtY3JlZCAoU3RlcCAzKVxuICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgbWVzc2FnZTogJ1RoZSBhdXRoZW50aWNhdG9yIHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQnLFxuICAgICAgICAgICAgY29kZTogJ0VSUk9SX0FVVEhFTlRJQ0FUT1JfUFJFVklPVVNMWV9SRUdJU1RFUkVEJyxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdOb3RBbGxvd2VkRXJyb3InKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXNzIHRoZSBlcnJvciBkaXJlY3RseSB0aHJvdWdoLiBQbGF0Zm9ybXMgYXJlIG92ZXJsb2FkaW5nIHRoaXMgZXJyb3IgYmV5b25kIHdoYXQgdGhlIHNwZWNcbiAgICAgICAgICogZGVmaW5lcyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgcG90ZW50aWFsbHkgdXNlZnVsIGVycm9yIG1lc3NhZ2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICBjb2RlOiAnRVJST1JfUEFTU1RIUk9VR0hfU0VFX0NBVVNFX1BST1BFUlRZJyxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdOb3RTdXBwb3J0ZWRFcnJvcicpIHtcbiAgICAgICAgY29uc3QgdmFsaWRQdWJLZXlDcmVkUGFyYW1zID0gcHVibGljS2V5LnB1YktleUNyZWRQYXJhbXMuZmlsdGVyKChwYXJhbSkgPT4gcGFyYW0udHlwZSA9PT0gJ3B1YmxpYy1rZXknKTtcbiAgICAgICAgaWYgKHZhbGlkUHViS2V5Q3JlZFBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgKFN0ZXAgMTApXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdObyBlbnRyeSBpbiBwdWJLZXlDcmVkUGFyYW1zIHdhcyBvZiB0eXBlIFwicHVibGljLWtleVwiJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfTUFMRk9STUVEX1BVQktFWUNSRURQQVJBTVMnLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLW9wLW1ha2UtY3JlZCAoU3RlcCAyKVxuICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgbWVzc2FnZTogJ05vIGF2YWlsYWJsZSBhdXRoZW50aWNhdG9yIHN1cHBvcnRlZCBhbnkgb2YgdGhlIHNwZWNpZmllZCBwdWJLZXlDcmVkUGFyYW1zIGFsZ29yaXRobXMnLFxuICAgICAgICAgICAgY29kZTogJ0VSUk9SX0FVVEhFTlRJQ0FUT1JfTk9fU1VQUE9SVEVEX1BVQktFWUNSRURQQVJBTVNfQUxHJyxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdTZWN1cml0eUVycm9yJykge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVEb21haW4gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XG4gICAgICAgIGlmICghaXNWYWxpZERvbWFpbihlZmZlY3RpdmVEb21haW4pKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDcpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3dpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZX0gaXMgYW4gaW52YWxpZCBkb21haW5gLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9JTlZBTElEX0RPTUFJTicsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHVibGljS2V5LnJwLmlkICE9PSBlZmZlY3RpdmVEb21haW4pIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgKFN0ZXAgOClcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYFRoZSBSUCBJRCBcIiR7cHVibGljS2V5LnJwLmlkfVwiIGlzIGludmFsaWQgZm9yIHRoaXMgZG9tYWluYCxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfSU5WQUxJRF9SUF9JRCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ1R5cGVFcnJvcicpIHtcbiAgICAgICAgaWYgKHB1YmxpY0tleS51c2VyLmlkLmJ5dGVMZW5ndGggPCAxIHx8IHB1YmxpY0tleS51c2VyLmlkLmJ5dGVMZW5ndGggPiA2NCkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tY3JlYXRlQ3JlZGVudGlhbCAoU3RlcCA1KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVXNlciBJRCB3YXMgbm90IGJldHdlZW4gMSBhbmQgNjQgY2hhcmFjdGVycycsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0lOVkFMSURfVVNFUl9JRF9MRU5HVEgnLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdVbmtub3duRXJyb3InKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLW9wLW1ha2UtY3JlZCAoU3RlcCAxKVxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgOClcbiAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGUgYXV0aGVudGljYXRvciB3YXMgdW5hYmxlIHRvIHByb2Nlc3MgdGhlIHNwZWNpZmllZCBvcHRpb25zLCBvciBjb3VsZCBub3QgY3JlYXRlIGEgbmV3IGNyZWRlbnRpYWwnLFxuICAgICAgICAgICAgY29kZTogJ0VSUk9SX0FVVEhFTlRJQ0FUT1JfR0VORVJBTF9FUlJPUicsXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICBtZXNzYWdlOiAnYSBOb24tV2ViYXV0aG4gcmVsYXRlZCBlcnJvciBoYXMgb2NjdXJyZWQnLFxuICAgICAgICBjb2RlOiAnRVJST1JfUEFTU1RIUk9VR0hfU0VFX0NBVVNFX1BST1BFUlRZJyxcbiAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgIH0pO1xufVxuLyoqXG4gKiBBdHRlbXB0IHRvIGludHVpdCBfd2h5XyBhbiBlcnJvciB3YXMgcmFpc2VkIGFmdGVyIGNhbGxpbmcgYG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoKWAuXG4gKiBNYXBzIGJyb3dzZXIgZXJyb3JzIHRvIHNwZWNpZmljIFdlYkF1dGhuIGVycm9yIGNvZGVzIGZvciBiZXR0ZXIgZGVidWdnaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIEVycm9yIGlkZW50aWZpY2F0aW9uIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7RXJyb3J9IHBhcmFtcy5lcnJvciAtIFRoZSBlcnJvciB0aHJvd24gYnkgdGhlIGJyb3dzZXJcbiAqIEBwYXJhbSB7Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zfSBwYXJhbXMub3B0aW9ucyAtIFRoZSBvcHRpb25zIHBhc3NlZCB0byBjcmVkZW50aWFscy5nZXQoKVxuICogQHJldHVybnMge1dlYkF1dGhuRXJyb3J9IEEgV2ViQXV0aG5FcnJvciB3aXRoIGEgc3BlY2lmaWMgZXJyb3IgY29kZVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWdldEFzc2VydGlvbiBXM0MgV2ViQXV0aG4gU3BlYyAtIEdldCBBc3NlcnRpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeUF1dGhlbnRpY2F0aW9uRXJyb3IoeyBlcnJvciwgb3B0aW9ucywgfSkge1xuICAgIGNvbnN0IHsgcHVibGljS2V5IH0gPSBvcHRpb25zO1xuICAgIGlmICghcHVibGljS2V5KSB7XG4gICAgICAgIHRocm93IEVycm9yKCdvcHRpb25zIHdhcyBtaXNzaW5nIHJlcXVpcmVkIHB1YmxpY0tleSBwcm9wZXJ0eScpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnNpZ25hbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDE2KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQXV0aGVudGljYXRpb24gY2VyZW1vbnkgd2FzIHNlbnQgYW4gYWJvcnQgc2lnbmFsJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfQ0VSRU1PTllfQUJPUlRFRCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ05vdEFsbG93ZWRFcnJvcicpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhc3MgdGhlIGVycm9yIGRpcmVjdGx5IHRocm91Z2guIFBsYXRmb3JtcyBhcmUgb3ZlcmxvYWRpbmcgdGhpcyBlcnJvciBiZXlvbmQgd2hhdCB0aGUgc3BlY1xuICAgICAgICAgKiBkZWZpbmVzIGFuZCB3ZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSBwb3RlbnRpYWxseSB1c2VmdWwgZXJyb3IgbWVzc2FnZXMuXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9QQVNTVEhST1VHSF9TRUVfQ0FVU0VfUFJPUEVSVFknLFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ1NlY3VyaXR5RXJyb3InKSB7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZURvbWFpbiA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtcbiAgICAgICAgaWYgKCFpc1ZhbGlkRG9tYWluKGVmZmVjdGl2ZURvbWFpbikpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLWRpc2NvdmVyLWZyb20tZXh0ZXJuYWwtc291cmNlIChTdGVwIDUpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3dpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZX0gaXMgYW4gaW52YWxpZCBkb21haW5gLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9JTlZBTElEX0RPTUFJTicsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHVibGljS2V5LnJwSWQgIT09IGVmZmVjdGl2ZURvbWFpbikge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tZGlzY292ZXItZnJvbS1leHRlcm5hbC1zb3VyY2UgKFN0ZXAgNilcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYFRoZSBSUCBJRCBcIiR7cHVibGljS2V5LnJwSWR9XCIgaXMgaW52YWxpZCBmb3IgdGhpcyBkb21haW5gLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9JTlZBTElEX1JQX0lEJyxcbiAgICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnVW5rbm93bkVycm9yJykge1xuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1nZXQtYXNzZXJ0aW9uIChTdGVwIDEpXG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLW9wLWdldC1hc3NlcnRpb24gKFN0ZXAgMTIpXG4gICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICBtZXNzYWdlOiAnVGhlIGF1dGhlbnRpY2F0b3Igd2FzIHVuYWJsZSB0byBwcm9jZXNzIHRoZSBzcGVjaWZpZWQgb3B0aW9ucywgb3IgY291bGQgbm90IGNyZWF0ZSBhIG5ldyBhc3NlcnRpb24gc2lnbmF0dXJlJyxcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX0dFTkVSQUxfRVJST1InLFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgbWVzc2FnZTogJ2EgTm9uLVdlYmF1dGhuIHJlbGF0ZWQgZXJyb3IgaGFzIG9jY3VycmVkJyxcbiAgICAgICAgY29kZTogJ0VSUk9SX1BBU1NUSFJPVUdIX1NFRV9DQVVTRV9QUk9QRVJUWScsXG4gICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYmF1dGhuLmVycm9ycy5qcy5tYXAiXSwibmFtZXMiOlsiaXNWYWxpZERvbWFpbiIsIldlYkF1dGhuRXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwibWVzc2FnZSIsImNvZGUiLCJjYXVzZSIsIm5hbWUiLCJfYSIsIl9faXNXZWJBdXRobkVycm9yIiwidW5kZWZpbmVkIiwiV2ViQXV0aG5Vbmtub3duRXJyb3IiLCJvcmlnaW5hbEVycm9yIiwiaXNXZWJBdXRobkVycm9yIiwiZXJyb3IiLCJpZGVudGlmeVJlZ2lzdHJhdGlvbkVycm9yIiwib3B0aW9ucyIsIl9iIiwiX2MiLCJwdWJsaWNLZXkiLCJzaWduYWwiLCJBYm9ydFNpZ25hbCIsImF1dGhlbnRpY2F0b3JTZWxlY3Rpb24iLCJyZXF1aXJlUmVzaWRlbnRLZXkiLCJtZWRpYXRpb24iLCJ1c2VyVmVyaWZpY2F0aW9uIiwidmFsaWRQdWJLZXlDcmVkUGFyYW1zIiwicHViS2V5Q3JlZFBhcmFtcyIsImZpbHRlciIsInBhcmFtIiwidHlwZSIsImxlbmd0aCIsImVmZmVjdGl2ZURvbWFpbiIsIndpbmRvdyIsImxvY2F0aW9uIiwiaG9zdG5hbWUiLCJycCIsImlkIiwidXNlciIsImJ5dGVMZW5ndGgiLCJpZGVudGlmeUF1dGhlbnRpY2F0aW9uRXJyb3IiLCJycElkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js":
|
||
/*!***************************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js ***!
|
||
\***************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebAuthnError: () => (/* binding */ WebAuthnError),\n/* harmony export */ WebAuthnUnknownError: () => (/* binding */ WebAuthnUnknownError),\n/* harmony export */ identifyAuthenticationError: () => (/* binding */ identifyAuthenticationError),\n/* harmony export */ identifyRegistrationError: () => (/* binding */ identifyRegistrationError),\n/* harmony export */ isWebAuthnError: () => (/* binding */ isWebAuthnError)\n/* harmony export */ });\n/* harmony import */ var _webauthn__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webauthn */ \"(rsc)/./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({ error, options }) {\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: `${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 \"${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({ error, options }) {\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: `${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 \"${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3dlYmF1dGhuLmVycm9ycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxvREFBb0QsR0FDVDtBQUMzQzs7Ozs7Ozs7Ozs7Ozs7OztDQWdCQyxHQUNNLE1BQU1DLHNCQUFzQkM7SUFDL0JDLFlBQVksRUFBRUMsT0FBTyxFQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxFQUFHLENBQUU7UUFDekMsSUFBSUM7UUFDSixpRUFBaUU7UUFDakUsS0FBSyxDQUFDSixTQUFTO1lBQUVFO1FBQU07UUFDdkIsSUFBSSxDQUFDRyxpQkFBaUIsR0FBRztRQUN6QixJQUFJLENBQUNGLElBQUksR0FBRyxDQUFDQyxLQUFLRCxTQUFTLFFBQVFBLFNBQVMsS0FBSyxJQUFJQSxPQUFRRCxpQkFBaUJKLFFBQVFJLE1BQU1DLElBQUksR0FBR0csU0FBUyxNQUFPLFFBQVFGLE9BQU8sS0FBSyxJQUFJQSxLQUFLO1FBQ2hKLElBQUksQ0FBQ0gsSUFBSSxHQUFHQTtJQUNoQjtBQUNKO0FBQ0E7OztDQUdDLEdBQ00sTUFBTU0sNkJBQTZCVjtJQUN0Q0UsWUFBWUMsT0FBTyxFQUFFUSxhQUFhLENBQUU7UUFDaEMsS0FBSyxDQUFDO1lBQ0ZQLE1BQU07WUFDTkMsT0FBT007WUFDUFI7UUFDSjtRQUNBLElBQUksQ0FBQ0csSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDSyxhQUFhLEdBQUdBO0lBQ3pCO0FBQ0o7QUFDQTs7OztDQUlDLEdBQ00sU0FBU0MsZ0JBQWdCQyxLQUFLO0lBQ2pDLE9BQU8sT0FBT0EsVUFBVSxZQUFZQSxVQUFVLFFBQVEsdUJBQXVCQTtBQUNqRjtBQUNBOzs7Ozs7OztDQVFDLEdBQ00sU0FBU0MsMEJBQTBCLEVBQUVELEtBQUssRUFBRUUsT0FBTyxFQUFHO0lBQ3pELElBQUlSLElBQUlTLElBQUlDO0lBQ1osTUFBTSxFQUFFQyxTQUFTLEVBQUUsR0FBR0g7SUFD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SyxpQkFBaUI7UUFDckMsTUFBTXlCLGtCQUFrQkMsT0FBT0MsUUFBUSxDQUFDQyxRQUFRO1FBQ2hELElBQUksQ0FBQ25DLHdEQUFhQSxDQUFDZ0Msa0JBQWtCO1lBQ2pDLGdGQUFnRjtZQUNoRixPQUFPLElBQUkvQixjQUFjO2dCQUNyQkcsU0FBUyxDQUFDLEVBQUU2QixPQUFPQyxRQUFRLENBQUNDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDM0Q5QixNQUFNO2dCQUNOQyxPQUFPUTtZQUNYO1FBQ0osT0FDSyxJQUFJSyxVQUFVc0IsSUFBSSxLQUFLVCxpQkFBaUI7WUFDekMsZ0ZBQWdGO1lBQ2hGLE9BQU8sSUFBSS9CLGNBQWM7Z0JBQ3JCRyxTQUFTLENBQUMsV0FBVyxFQUFFZSxVQUFVc0IsSUFBSSxDQUFDLDRCQUE0QixDQUFDO2dCQUNuRXBDLE1BQU07Z0JBQ05DLE9BQU9RO1lBQ1g7UUFDSjtJQUNKLE9BQ0ssSUFBSUEsTUFBTVAsSUFBSSxLQUFLLGdCQUFnQjtRQUNwQyxtRUFBbUU7UUFDbkUsb0VBQW9FO1FBQ3BFLE9BQU8sSUFBSU4sY0FBYztZQUNyQkcsU0FBUztZQUNUQyxNQUFNO1lBQ05DLE9BQU9RO1FBQ1g7SUFDSjtJQUNBLE9BQU8sSUFBSWIsY0FBYztRQUNyQkcsU0FBUztRQUNUQyxNQUFNO1FBQ05DLE9BQU9RO0lBQ1g7QUFDSixFQUNBLDJDQUEyQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvd2ViYXV0aG4uZXJyb3JzLmpzP2I5NWMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG5pbXBvcnQgeyBpc1ZhbGlkRG9tYWluIH0gZnJvbSAnLi93ZWJhdXRobic7XG4vKipcbiAqIEEgY3VzdG9tIEVycm9yIHVzZWQgdG8gcmV0dXJuIGEgbW9yZSBudWFuY2VkIGVycm9yIGRldGFpbGluZyBfd2h5XyBvbmUgb2YgdGhlIGVpZ2h0IGRvY3VtZW50ZWRcbiAqIGVycm9ycyBpbiB0aGUgc3BlYyB3YXMgcmFpc2VkIGFmdGVyIGNhbGxpbmcgYG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKWAgb3JcbiAqIGBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClgOlxuICpcbiAqIC0gYEFib3J0RXJyb3JgXG4gKiAtIGBDb25zdHJhaW50RXJyb3JgXG4gKiAtIGBJbnZhbGlkU3RhdGVFcnJvcmBcbiAqIC0gYE5vdEFsbG93ZWRFcnJvcmBcbiAqIC0gYE5vdFN1cHBvcnRlZEVycm9yYFxuICogLSBgU2VjdXJpdHlFcnJvcmBcbiAqIC0gYFR5cGVFcnJvcmBcbiAqIC0gYFVua25vd25FcnJvcmBcbiAqXG4gKiBFcnJvciBtZXNzYWdlcyB3ZXJlIGRldGVybWluZWQgdGhyb3VnaCBpbnZlc3RpZ2F0aW9uIG9mIHRoZSBzcGVjIHRvIGRldGVybWluZSB1bmRlciB3aGljaFxuICogc2NlbmFyaW9zIGEgZ2l2ZW4gZXJyb3Igd291bGQgYmUgcmFpc2VkLlxuICovXG5leHBvcnQgY2xhc3MgV2ViQXV0aG5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UsIGNvZGUsIGNhdXNlLCBuYW1lLCB9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogaGVscCBSb2xsdXAgdW5kZXJzdGFuZCB0aGF0IGBjYXVzZWAgaXMgb2theSB0byBzZXRcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgeyBjYXVzZSB9KTtcbiAgICAgICAgdGhpcy5fX2lzV2ViQXV0aG5FcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMubmFtZSA9IChfYSA9IG5hbWUgIT09IG51bGwgJiYgbmFtZSAhPT0gdm9pZCAwID8gbmFtZSA6IChjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubmFtZSA6IHVuZGVmaW5lZCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdVbmtub3duIEVycm9yJztcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIGNsYXNzIGZvciB1bmtub3duIFdlYkF1dGhuIGVycm9ycy5cbiAqIFdyYXBzIHVuZXhwZWN0ZWQgZXJyb3JzIHRoYXQgZG9uJ3QgbWF0Y2gga25vd24gV2ViQXV0aG4gZXJyb3IgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkF1dGhuVW5rbm93bkVycm9yIGV4dGVuZHMgV2ViQXV0aG5FcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgb3JpZ2luYWxFcnJvcikge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBjb2RlOiAnRVJST1JfUEFTU1RIUk9VR0hfU0VFX0NBVVNFX1BST1BFUlRZJyxcbiAgICAgICAgICAgIGNhdXNlOiBvcmlnaW5hbEVycm9yLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdXZWJBdXRoblVua25vd25FcnJvcic7XG4gICAgICAgIHRoaXMub3JpZ2luYWxFcnJvciA9IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxufVxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIGVycm9yIGlzIGEgV2ViQXV0aG5FcnJvci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBlcnJvciBpcyBhIFdlYkF1dGhuRXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViQXV0aG5FcnJvcihlcnJvcikge1xuICAgIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdfX2lzV2ViQXV0aG5FcnJvcicgaW4gZXJyb3I7XG59XG4vKipcbiAqIEF0dGVtcHQgdG8gaW50dWl0IF93aHlfIGFuIGVycm9yIHdhcyByYWlzZWQgYWZ0ZXIgY2FsbGluZyBgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpYC5cbiAqIE1hcHMgYnJvd3NlciBlcnJvcnMgdG8gc3BlY2lmaWMgV2ViQXV0aG4gZXJyb3IgY29kZXMgZm9yIGJldHRlciBkZWJ1Z2dpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gRXJyb3IgaWRlbnRpZmljYXRpb24gcGFyYW1ldGVyc1xuICogQHBhcmFtIHtFcnJvcn0gcGFyYW1zLmVycm9yIC0gVGhlIGVycm9yIHRocm93biBieSB0aGUgYnJvd3NlclxuICogQHBhcmFtIHtDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zfSBwYXJhbXMub3B0aW9ucyAtIFRoZSBvcHRpb25zIHBhc3NlZCB0byBjcmVkZW50aWFscy5jcmVhdGUoKVxuICogQHJldHVybnMge1dlYkF1dGhuRXJyb3J9IEEgV2ViQXV0aG5FcnJvciB3aXRoIGEgc3BlY2lmaWMgZXJyb3IgY29kZVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgVzNDIFdlYkF1dGhuIFNwZWMgLSBDcmVhdGUgQ3JlZGVudGlhbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aWZ5UmVnaXN0cmF0aW9uRXJyb3IoeyBlcnJvciwgb3B0aW9ucywgfSkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIGNvbnN0IHsgcHVibGljS2V5IH0gPSBvcHRpb25zO1xuICAgIGlmICghcHVibGljS2V5KSB7XG4gICAgICAgIHRocm93IEVycm9yKCdvcHRpb25zIHdhcyBtaXNzaW5nIHJlcXVpcmVkIHB1YmxpY0tleSBwcm9wZXJ0eScpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnNpZ25hbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDE2KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUmVnaXN0cmF0aW9uIGNlcmVtb255IHdhcyBzZW50IGFuIGFib3J0IHNpZ25hbCcsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0NFUkVNT05ZX0FCT1JURUQnLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdDb25zdHJhaW50RXJyb3InKSB7XG4gICAgICAgIGlmICgoKF9hID0gcHVibGljS2V5LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXF1aXJlUmVzaWRlbnRLZXkpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgNClcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Rpc2NvdmVyYWJsZSBjcmVkZW50aWFscyB3ZXJlIHJlcXVpcmVkIGJ1dCBubyBhdmFpbGFibGUgYXV0aGVudGljYXRvciBzdXBwb3J0ZWQgaXQnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX01JU1NJTkdfRElTQ09WRVJBQkxFX0NSRURFTlRJQUxfU1VQUE9SVCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGBtZWRpYXRpb25gIGRvZXNuJ3QgeWV0IGV4aXN0IG9uIENyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMgYnV0IGl0J3MgcG9zc2libGUgYXMgb2YgU2VwdCAyMDI0XG4gICAgICAgIG9wdGlvbnMubWVkaWF0aW9uID09PSAnY29uZGl0aW9uYWwnICYmXG4gICAgICAgICAgICAoKF9iID0gcHVibGljS2V5LmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi51c2VyVmVyaWZpY2F0aW9uKSA9PT0gJ3JlcXVpcmVkJykge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgKFN0ZXAgMjIuNClcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZXIgdmVyaWZpY2F0aW9uIHdhcyByZXF1aXJlZCBkdXJpbmcgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBidXQgaXQgY291bGQgbm90IGJlIHBlcmZvcm1lZCcsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0FVVE9fUkVHSVNURVJfVVNFUl9WRVJJRklDQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKChfYyA9IHB1YmxpY0tleS5hdXRoZW50aWNhdG9yU2VsZWN0aW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudXNlclZlcmlmaWNhdGlvbikgPT09ICdyZXF1aXJlZCcpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLW9wLW1ha2UtY3JlZCAoU3RlcCA1KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVXNlciB2ZXJpZmljYXRpb24gd2FzIHJlcXVpcmVkIGJ1dCBubyBhdmFpbGFibGUgYXV0aGVudGljYXRvciBzdXBwb3J0ZWQgaXQnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX01JU1NJTkdfVVNFUl9WRVJJRklDQVRJT05fU1VQUE9SVCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ0ludmFsaWRTdGF0ZUVycm9yJykge1xuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDIwKVxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgMylcbiAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGUgYXV0aGVudGljYXRvciB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkJyxcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX1BSRVZJT1VTTFlfUkVHSVNURVJFRCcsXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnTm90QWxsb3dlZEVycm9yJykge1xuICAgICAgICAvKipcbiAgICAgICAgICogUGFzcyB0aGUgZXJyb3IgZGlyZWN0bHkgdGhyb3VnaC4gUGxhdGZvcm1zIGFyZSBvdmVybG9hZGluZyB0aGlzIGVycm9yIGJleW9uZCB3aGF0IHRoZSBzcGVjXG4gICAgICAgICAqIGRlZmluZXMgYW5kIHdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHBvdGVudGlhbGx5IHVzZWZ1bCBlcnJvciBtZXNzYWdlcy5cbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgY29kZTogJ0VSUk9SX1BBU1NUSFJPVUdIX1NFRV9DQVVTRV9QUk9QRVJUWScsXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnTm90U3VwcG9ydGVkRXJyb3InKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkUHViS2V5Q3JlZFBhcmFtcyA9IHB1YmxpY0tleS5wdWJLZXlDcmVkUGFyYW1zLmZpbHRlcigocGFyYW0pID0+IHBhcmFtLnR5cGUgPT09ICdwdWJsaWMta2V5Jyk7XG4gICAgICAgIGlmICh2YWxpZFB1YktleUNyZWRQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDEwKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTm8gZW50cnkgaW4gcHViS2V5Q3JlZFBhcmFtcyB3YXMgb2YgdHlwZSBcInB1YmxpYy1rZXlcIicsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX01BTEZPUk1FRF9QVUJLRVlDUkVEUEFSQU1TJyxcbiAgICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgMilcbiAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdObyBhdmFpbGFibGUgYXV0aGVudGljYXRvciBzdXBwb3J0ZWQgYW55IG9mIHRoZSBzcGVjaWZpZWQgcHViS2V5Q3JlZFBhcmFtcyBhbGdvcml0aG1zJyxcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX05PX1NVUFBPUlRFRF9QVUJLRVlDUkVEUEFSQU1TX0FMRycsXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnU2VjdXJpdHlFcnJvcicpIHtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlRG9tYWluID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO1xuICAgICAgICBpZiAoIWlzVmFsaWREb21haW4oZWZmZWN0aXZlRG9tYWluKSkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tY3JlYXRlQ3JlZGVudGlhbCAoU3RlcCA3KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJHt3aW5kb3cubG9jYXRpb24uaG9zdG5hbWV9IGlzIGFuIGludmFsaWQgZG9tYWluYCxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfSU5WQUxJRF9ET01BSU4nLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHB1YmxpY0tleS5ycC5pZCAhPT0gZWZmZWN0aXZlRG9tYWluKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIChTdGVwIDgpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgUlAgSUQgXCIke3B1YmxpY0tleS5ycC5pZH1cIiBpcyBpbnZhbGlkIGZvciB0aGlzIGRvbWFpbmAsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0lOVkFMSURfUlBfSUQnLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdUeXBlRXJyb3InKSB7XG4gICAgICAgIGlmIChwdWJsaWNLZXkudXNlci5pZC5ieXRlTGVuZ3RoIDwgMSB8fCBwdWJsaWNLZXkudXNlci5pZC5ieXRlTGVuZ3RoID4gNjQpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgKFN0ZXAgNSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZXIgSUQgd2FzIG5vdCBiZXR3ZWVuIDEgYW5kIDY0IGNoYXJhY3RlcnMnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9JTlZBTElEX1VTRVJfSURfTEVOR1RIJyxcbiAgICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnVW5rbm93bkVycm9yJykge1xuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1tYWtlLWNyZWQgKFN0ZXAgMSlcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tb3AtbWFrZS1jcmVkIChTdGVwIDgpXG4gICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICBtZXNzYWdlOiAnVGhlIGF1dGhlbnRpY2F0b3Igd2FzIHVuYWJsZSB0byBwcm9jZXNzIHRoZSBzcGVjaWZpZWQgb3B0aW9ucywgb3IgY291bGQgbm90IGNyZWF0ZSBhIG5ldyBjcmVkZW50aWFsJyxcbiAgICAgICAgICAgIGNvZGU6ICdFUlJPUl9BVVRIRU5USUNBVE9SX0dFTkVSQUxfRVJST1InLFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgbWVzc2FnZTogJ2EgTm9uLVdlYmF1dGhuIHJlbGF0ZWQgZXJyb3IgaGFzIG9jY3VycmVkJyxcbiAgICAgICAgY29kZTogJ0VSUk9SX1BBU1NUSFJPVUdIX1NFRV9DQVVTRV9QUk9QRVJUWScsXG4gICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbn1cbi8qKlxuICogQXR0ZW1wdCB0byBpbnR1aXQgX3doeV8gYW4gZXJyb3Igd2FzIHJhaXNlZCBhZnRlciBjYWxsaW5nIGBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClgLlxuICogTWFwcyBicm93c2VyIGVycm9ycyB0byBzcGVjaWZpYyBXZWJBdXRobiBlcnJvciBjb2RlcyBmb3IgYmV0dGVyIGRlYnVnZ2luZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBFcnJvciBpZGVudGlmaWNhdGlvbiBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0Vycm9yfSBwYXJhbXMuZXJyb3IgLSBUaGUgZXJyb3IgdGhyb3duIGJ5IHRoZSBicm93c2VyXG4gKiBAcGFyYW0ge0NyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc30gcGFyYW1zLm9wdGlvbnMgLSBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gY3JlZGVudGlhbHMuZ2V0KClcbiAqIEByZXR1cm5zIHtXZWJBdXRobkVycm9yfSBBIFdlYkF1dGhuRXJyb3Igd2l0aCBhIHNwZWNpZmljIGVycm9yIGNvZGVcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1nZXRBc3NlcnRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBHZXQgQXNzZXJ0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZnlBdXRoZW50aWNhdGlvbkVycm9yKHsgZXJyb3IsIG9wdGlvbnMsIH0pIHtcbiAgICBjb25zdCB7IHB1YmxpY0tleSB9ID0gb3B0aW9ucztcbiAgICBpZiAoIXB1YmxpY0tleSkge1xuICAgICAgICB0aHJvdyBFcnJvcignb3B0aW9ucyB3YXMgbWlzc2luZyByZXF1aXJlZCBwdWJsaWNLZXkgcHJvcGVydHknKTtcbiAgICB9XG4gICAgaWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICBpZiAob3B0aW9ucy5zaWduYWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tY3JlYXRlQ3JlZGVudGlhbCAoU3RlcCAxNilcbiAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0F1dGhlbnRpY2F0aW9uIGNlcmVtb255IHdhcyBzZW50IGFuIGFib3J0IHNpZ25hbCcsXG4gICAgICAgICAgICAgICAgY29kZTogJ0VSUk9SX0NFUkVNT05ZX0FCT1JURUQnLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdOb3RBbGxvd2VkRXJyb3InKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXNzIHRoZSBlcnJvciBkaXJlY3RseSB0aHJvdWdoLiBQbGF0Zm9ybXMgYXJlIG92ZXJsb2FkaW5nIHRoaXMgZXJyb3IgYmV5b25kIHdoYXQgdGhlIHNwZWNcbiAgICAgICAgICogZGVmaW5lcyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgcG90ZW50aWFsbHkgdXNlZnVsIGVycm9yIG1lc3NhZ2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICBjb2RlOiAnRVJST1JfUEFTU1RIUk9VR0hfU0VFX0NBVVNFX1BST1BFUlRZJyxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdTZWN1cml0eUVycm9yJykge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVEb21haW4gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XG4gICAgICAgIGlmICghaXNWYWxpZERvbWFpbihlZmZlY3RpdmVEb21haW4pKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1kaXNjb3Zlci1mcm9tLWV4dGVybmFsLXNvdXJjZSAoU3RlcCA1KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBdXRobkVycm9yKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJHt3aW5kb3cubG9jYXRpb24uaG9zdG5hbWV9IGlzIGFuIGludmFsaWQgZG9tYWluYCxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfSU5WQUxJRF9ET01BSU4nLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHB1YmxpY0tleS5ycElkICE9PSBlZmZlY3RpdmVEb21haW4pIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdXRobi0yLyNzY3RuLWRpc2NvdmVyLWZyb20tZXh0ZXJuYWwtc291cmNlIChTdGVwIDYpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgUlAgSUQgXCIke3B1YmxpY0tleS5ycElkfVwiIGlzIGludmFsaWQgZm9yIHRoaXMgZG9tYWluYCxcbiAgICAgICAgICAgICAgICBjb2RlOiAnRVJST1JfSU5WQUxJRF9SUF9JRCcsXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ1Vua25vd25FcnJvcicpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1dGhuLTIvI3NjdG4tb3AtZ2V0LWFzc2VydGlvbiAoU3RlcCAxKVxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXV0aG4tMi8jc2N0bi1vcC1nZXQtYXNzZXJ0aW9uIChTdGVwIDEyKVxuICAgICAgICByZXR1cm4gbmV3IFdlYkF1dGhuRXJyb3Ioe1xuICAgICAgICAgICAgbWVzc2FnZTogJ1RoZSBhdXRoZW50aWNhdG9yIHdhcyB1bmFibGUgdG8gcHJvY2VzcyB0aGUgc3BlY2lmaWVkIG9wdGlvbnMsIG9yIGNvdWxkIG5vdCBjcmVhdGUgYSBuZXcgYXNzZXJ0aW9uIHNpZ25hdHVyZScsXG4gICAgICAgICAgICBjb2RlOiAnRVJST1JfQVVUSEVOVElDQVRPUl9HRU5FUkFMX0VSUk9SJyxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgV2ViQXV0aG5FcnJvcih7XG4gICAgICAgIG1lc3NhZ2U6ICdhIE5vbi1XZWJhdXRobiByZWxhdGVkIGVycm9yIGhhcyBvY2N1cnJlZCcsXG4gICAgICAgIGNvZGU6ICdFUlJPUl9QQVNTVEhST1VHSF9TRUVfQ0FVU0VfUFJPUEVSVFknLFxuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJhdXRobi5lcnJvcnMuanMubWFwIl0sIm5hbWVzIjpbImlzVmFsaWREb21haW4iLCJXZWJBdXRobkVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm1lc3NhZ2UiLCJjb2RlIiwiY2F1c2UiLCJuYW1lIiwiX2EiLCJfX2lzV2ViQXV0aG5FcnJvciIsInVuZGVmaW5lZCIsIldlYkF1dGhuVW5rbm93bkVycm9yIiwib3JpZ2luYWxFcnJvciIsImlzV2ViQXV0aG5FcnJvciIsImVycm9yIiwiaWRlbnRpZnlSZWdpc3RyYXRpb25FcnJvciIsIm9wdGlvbnMiLCJfYiIsIl9jIiwicHVibGljS2V5Iiwic2lnbmFsIiwiQWJvcnRTaWduYWwiLCJhdXRoZW50aWNhdG9yU2VsZWN0aW9uIiwicmVxdWlyZVJlc2lkZW50S2V5IiwibWVkaWF0aW9uIiwidXNlclZlcmlmaWNhdGlvbiIsInZhbGlkUHViS2V5Q3JlZFBhcmFtcyIsInB1YktleUNyZWRQYXJhbXMiLCJmaWx0ZXIiLCJwYXJhbSIsInR5cGUiLCJsZW5ndGgiLCJlZmZlY3RpdmVEb21haW4iLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhvc3RuYW1lIiwicnAiLCJpZCIsInVzZXIiLCJieXRlTGVuZ3RoIiwiaWRlbnRpZnlBdXRoZW50aWNhdGlvbkVycm9yIiwicnBJZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DEFAULT_CREATION_OPTIONS: () => (/* binding */ DEFAULT_CREATION_OPTIONS),\n/* harmony export */ DEFAULT_REQUEST_OPTIONS: () => (/* binding */ DEFAULT_REQUEST_OPTIONS),\n/* harmony export */ WebAuthnAbortService: () => (/* binding */ WebAuthnAbortService),\n/* harmony export */ WebAuthnApi: () => (/* binding */ WebAuthnApi),\n/* harmony export */ WebAuthnError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.WebAuthnError),\n/* harmony export */ createCredential: () => (/* binding */ createCredential),\n/* harmony export */ deserializeCredentialCreationOptions: () => (/* binding */ deserializeCredentialCreationOptions),\n/* harmony export */ deserializeCredentialRequestOptions: () => (/* binding */ deserializeCredentialRequestOptions),\n/* harmony export */ getCredential: () => (/* binding */ getCredential),\n/* harmony export */ identifyAuthenticationError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.identifyAuthenticationError),\n/* harmony export */ identifyRegistrationError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.identifyRegistrationError),\n/* harmony export */ isValidDomain: () => (/* binding */ isValidDomain),\n/* harmony export */ isWebAuthnError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.isWebAuthnError),\n/* harmony export */ mergeCredentialCreationOptions: () => (/* binding */ mergeCredentialCreationOptions),\n/* harmony export */ mergeCredentialRequestOptions: () => (/* binding */ mergeCredentialRequestOptions),\n/* harmony export */ serializeCredentialCreationResponse: () => (/* binding */ serializeCredentialCreationResponse),\n/* harmony export */ serializeCredentialRequestResponse: () => (/* binding */ serializeCredentialRequestResponse),\n/* harmony export */ webAuthnAbortService: () => (/* binding */ webAuthnAbortService)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tslib */ \"(action-browser)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _base64url__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base64url */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./errors */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"(action-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 */ \"(action-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(...sources) {\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 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 /**\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({ factorId, webauthn, friendlyName, signal }, overrides) {\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 = `${user.id}:${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({ challengeId, factorId, webauthn }) {\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({ factorId, webauthn: { rpId = false ? 0 : undefined, rpOrigins = false ? 0 : undefined, signal } = {} }, overrides) {\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({ friendlyName, webauthn: { rpId = false ? 0 : undefined, rpOrigins = false ? 0 : undefined, signal } = {} }, overrides) {\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} //# sourceMappingURL=webauthn.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1qcy9kaXN0L21vZHVsZS9saWIvd2ViYXV0aG4uanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBK0I7QUFDdUM7QUFDRjtBQUM5QjtBQUM0RztBQUNoRDtBQUNsRzs7Ozs7O0NBTUMsR0FDTSxNQUFNWTtJQUNUOzs7Ozs7S0FNQyxHQUNEQyx1QkFBdUI7UUFDbkIsNEZBQTRGO1FBQzVGLElBQUksSUFBSSxDQUFDQyxVQUFVLEVBQUU7WUFDakIsTUFBTUMsYUFBYSxJQUFJQyxNQUFNO1lBQzdCRCxXQUFXRSxJQUFJLEdBQUc7WUFDbEIsSUFBSSxDQUFDSCxVQUFVLENBQUNJLEtBQUssQ0FBQ0g7UUFDMUI7UUFDQSxNQUFNSSxnQkFBZ0IsSUFBSUM7UUFDMUIsSUFBSSxDQUFDTixVQUFVLEdBQUdLO1FBQ2xCLE9BQU9BLGNBQWNFLE1BQU07SUFDL0I7SUFDQTs7Ozs7S0FLQyxHQUNEQyxpQkFBaUI7UUFDYixJQUFJLElBQUksQ0FBQ1IsVUFBVSxFQUFFO1lBQ2pCLE1BQU1DLGFBQWEsSUFBSUMsTUFBTTtZQUM3QkQsV0FBV0UsSUFBSSxHQUFHO1lBQ2xCLElBQUksQ0FBQ0gsVUFBVSxDQUFDSSxLQUFLLENBQUNIO1lBQ3RCLElBQUksQ0FBQ0QsVUFBVSxHQUFHUztRQUN0QjtJQUNKO0FBQ0o7QUFDQTs7Ozs7Q0FLQyxHQUNNLE1BQU1DLHVCQUF1QixJQUFJWix1QkFBdUI7QUFDL0Q7Ozs7Ozs7O0NBUUMsR0FDTSxTQUFTYSxxQ0FBcUNDLE9BQU87SUFDeEQsSUFBSSxDQUFDQSxTQUFTO1FBQ1YsTUFBTSxJQUFJVixNQUFNO0lBQ3BCO0lBQ0EsdUVBQXVFO0lBQ3ZFLElBQUksT0FBT1csd0JBQXdCLGVBQy9CLGtDQUFrQ0EsdUJBQ2xDLE9BQU9BLG9CQUNGQyw0QkFBNEIsS0FBSyxZQUFZO1FBQ2xELHlDQUF5QztRQUN6QyxPQUFPRCxvQkFBb0JDLDRC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SUFBSSxDQUFDWixPQUFPLENBQUM7Z0JBQ2hCUSxVQUFVZ0IsT0FBT3BHLEVBQUU7Z0JBQ25CNkYsYUFBYU4sa0JBQWtCTSxXQUFXO2dCQUMxQ1IsVUFBVTtvQkFDTlc7b0JBQ0FFO29CQUNBNUYsTUFBTWlGLGtCQUFrQkYsUUFBUSxDQUFDL0UsSUFBSTtvQkFDckN3RixxQkFBcUJQLGtCQUFrQkYsUUFBUSxDQUFDUyxtQkFBbUI7Z0JBQ3ZFO1lBQ0o7UUFDSixFQUNBLE9BQU9yRCxPQUFPO1lBQ1YsSUFBSTFFLG9EQUFXQSxDQUFDMEUsUUFBUTtnQkFDcEIsT0FBTztvQkFBRUQsTUFBTTtvQkFBTUM7Z0JBQU07WUFDL0I7WUFDQSxPQUFPO2dCQUNIRCxNQUFNO2dCQUNOQyxPQUFPLElBQUkzRSxxREFBZ0JBLENBQUMsZ0NBQWdDMkU7WUFDaEU7UUFDSjtJQUNKO0FBQ0osRUFDQSxvQ0FBb0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3dlYmF1dGhuLmpzPzg4Y2MiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBiYXNlNjRVcmxUb1VpbnQ4QXJyYXksIGJ5dGVzVG9CYXNlNjRVUkwgfSBmcm9tICcuL2Jhc2U2NHVybCc7XG5pbXBvcnQgeyBBdXRoRXJyb3IsIEF1dGhVbmtub3duRXJyb3IsIGlzQXV0aEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgaXNCcm93c2VyIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGlkZW50aWZ5QXV0aGVudGljYXRpb25FcnJvciwgaWRlbnRpZnlSZWdpc3RyYXRpb25FcnJvciwgaXNXZWJBdXRobkVycm9yLCBXZWJBdXRobkVycm9yLCBXZWJBdXRoblVua25vd25FcnJvciwgfSBmcm9tICcuL3dlYmF1dGhuLmVycm9ycyc7XG5leHBvcnQgeyBXZWJBdXRobkVycm9yLCBpc1dlYkF1dGhuRXJyb3IsIGlkZW50aWZ5UmVnaXN0cmF0aW9uRXJyb3IsIGlkZW50aWZ5QXV0aGVudGljYXRpb25FcnJvciB9O1xuLyoqXG4gKiBXZWJBdXRobiBhYm9ydCBzZXJ2aWNlIHRvIG1hbmFnZSBjZXJlbW9ueSBjYW5jZWxsYXRpb24uXG4gKiBFbnN1cmVzIG9ubHkgb25lIFdlYkF1dGhuIGNlcmVtb255IGlzIGFjdGl2ZSBhdCBhIHRpbWUgdG8gcHJldmVudCBcIm9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzXCIgZXJyb3JzLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBjbGFzcyBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzXG4gKiBAc2VlIHtAbGluayBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXV0aG4vI3NjdG4tYXV0b21hdGlvbi13ZWJkcml2ZXItY2FwYWJpbGl0eSBXM0MgV2ViQXV0aG4gU3BlYyAtIEFib3J0aW5nIENlcmVtb25pZXN9XG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJBdXRobkFib3J0U2VydmljZSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIGFib3J0IHNpZ25hbCBmb3IgYSBuZXcgV2ViQXV0aG4gb3BlcmF0aW9uLlxuICAgICAqIEF1dG9tYXRpY2FsbHkgY2FuY2VscyBhbnkgZXhpc3Rpbmcgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0Fib3J0U2lnbmFsfSBTaWduYWwgdG8gcGFzcyB0byBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKCkgb3IgLmdldCgpXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0U2lnbmFsIE1ETiAtIEFib3J0U2lnbmFsfVxuICAgICAqL1xuICAgIGNyZWF0ZU5ld0Fib3J0U2lnbmFsKCkge1xuICAgICAgICAvLyBBYm9ydCBhbnkgZXhpc3RpbmcgY2FsbHMgdG8gbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpIG9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoKVxuICAgICAgICBpZiAodGhpcy5jb250cm9sbGVyKSB7XG4gICAgICAgICAgICBjb25zdCBhYm9ydEVycm9yID0gbmV3IEVycm9yKCdDYW5jZWxsaW5nIGV4aXN0aW5nIFdlYkF1dGhuIEFQSSBjYWxsIGZvciBuZXcgb25lJyk7XG4gICAgICAgICAgICBhYm9ydEVycm9yLm5hbWUgPSAnQWJvcnRFcnJvcic7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoYWJvcnRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3Q29udHJvbGxlcjtcbiAgICAgICAgcmV0dXJuIG5ld0NvbnRyb2xsZXIuc2lnbmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYW51YWxseSBjYW5jZWwgdGhlIGN1cnJlbnQgV2ViQXV0aG4gb3BlcmF0aW9uLlxuICAgICAqIFVzZWZ1bCBmb3IgY2xlYW5pbmcgdXAgd2hlbiB1c2VyIGNhbmNlbHMgb3IgbmF2aWdhdGVzIGF3YXkuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyL2Fib3J0IE1ETiAtIEFib3J0Q29udHJvbGxlci5hYm9ydH1cbiAgICAgKi9cbiAgICBjYW5jZWxDZXJlbW9ueSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlcikge1xuICAgICAgICAgICAgY29uc3QgYWJvcnRFcnJvciA9IG5ldyBFcnJvcignTWFudWFsbHkgY2FuY2VsbGluZyBleGlzdGluZyBXZWJBdXRobiBBUEkgY2FsbCcpO1xuICAgICAgICAgICAgYWJvcnRFcnJvci5uYW1lID0gJ0Fib3J0RXJyb3InO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KGFib3J0RXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBTaW5nbGV0b24gaW5zdGFuY2UgdG8gZW5zdXJlIG9ubHkgb25lIFdlYkF1dGhuIGNlcmVtb255IGlzIGFjdGl2ZSBhdCBhIHRpbWUuXG4gKiBUaGlzIHByZXZlbnRzIFwib3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3NcIiBlcnJvcnMgd2hlbiByZXRyeWluZyBXZWJBdXRobiBvcGVyYXRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBpbnN0YW5jZSBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzXG4gKi9cbmV4cG9ydCBjb25zdCB3ZWJBdXRobkFib3J0U2VydmljZSA9IG5ldyBXZWJBdXRobkFib3J0U2VydmljZSgpO1xuLyoqXG4gKiBDb252ZXJ0IGJhc2U2NHVybCBlbmNvZGVkIHN0cmluZ3MgaW4gV2ViQXV0aG4gY3JlZGVudGlhbCBjcmVhdGlvbiBvcHRpb25zIHRvIEFycmF5QnVmZmVyc1xuICogYXMgcmVxdWlyZWQgYnkgdGhlIFdlYkF1dGhuIGJyb3dzZXIgQVBJLlxuICogU3VwcG9ydHMgYm90aCBuYXRpdmUgV2ViQXV0aG4gTGV2ZWwgMyBwYXJzZUNyZWF0aW9uT3B0aW9uc0Zyb21KU09OIGFuZCBtYW51YWwgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIHtTZXJ2ZXJDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zfSBvcHRpb25zIC0gSlNPTiBvcHRpb25zIGZyb20gc2VydmVyIHdpdGggYmFzZTY0dXJsIGVuY29kZWQgZmllbGRzXG4gKiBAcmV0dXJucyB7UHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc0Z1dHVyZX0gT3B0aW9ucyByZWFkeSBmb3IgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpXG4gKiBAc2VlIHtAbGluayBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXV0aG4vI3NjdG4tcGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTiBXM0MgV2ViQXV0aG4gU3BlYyAtIHBhcnNlQ3JlYXRpb25PcHRpb25zRnJvbUpTT059XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NyZWRlbnRpYWwgY3JlYXRpb24gb3B0aW9ucyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgdGhlIG5hdGl2ZSBwYXJzZUNyZWF0aW9uT3B0aW9uc0Zyb21KU09OIG1ldGhvZCBpcyBhdmFpbGFibGVcbiAgICBpZiAodHlwZW9mIFB1YmxpY0tleUNyZWRlbnRpYWwgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICdwYXJzZUNyZWF0aW9uT3B0aW9uc0Zyb21KU09OJyBpbiBQdWJsaWNLZXlDcmVkZW50aWFsICYmXG4gICAgICAgIHR5cGVvZiBQdWJsaWNLZXlDcmVkZW50aWFsXG4gICAgICAgICAgICAucGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBXZWJBdXRobiBMZXZlbCAzIG1ldGhvZFxuICAgICAgICByZXR1cm4gUHVibGljS2V5Q3JlZGVudGlhbC5wYXJzZUNyZWF0aW9uT3B0aW9uc0Zyb21KU09OKFxuICAgICAgICAvKiogd2UgYXNzZXJ0IHRoZSBvcHRpb25zIGhlcmUgYXMgdHlwZXNjcmlwdCBzdGlsbCBkb2Vzbid0IGtub3cgYWJvdXQgZnV0dXJlIHdlYmF1dGhuIHR5cGVzICovXG4gICAgICAgIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBtYW51YWwgcGFyc2luZyBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBuYXRpdmUgbWV0aG9kXG4gICAgLy8gRGVzdHJ1Y3R1cmUgdG8gc2VwYXJhdGUgZmllbGRzIHRoYXQgbmVlZCB0cmFuc2Zvcm1hdGlvblxuICAgIGNvbnN0IHsgY2hhbGxlbmdlOiBjaGFsbGVuZ2VTdHIsIHVzZXI6IHVzZXJPcHRzLCBleGNsdWRlQ3JlZGVudGlhbHMgfSA9IG9wdGlvbnMsIHJlc3RPcHRpb25zID0gX19yZXN0KG9wdGlvbnNcbiAgICAvLyBDb252ZXJ0IGNoYWxsZW5nZSBmcm9tIGJhc2U2NHVybCB0byBBcnJheUJ1ZmZlclxuICAgICwgW1wiY2hhbGxlbmdlXCIsIFwidXNlclwiLCBcImV4Y2x1ZGVDcmVkZW50aWFsc1wiXSk7XG4gICAgLy8gQ29udmVydCBjaGFsbGVuZ2UgZnJvbSBiYXNlNjR1cmwgdG8gQXJyYXlCdWZmZXJcbiAgICBjb25zdCBjaGFsbGVuZ2UgPSBiYXNlNjRVcmxUb1VpbnQ4QXJyYXkoY2hhbGxlbmdlU3RyKS5idWZmZXI7XG4gICAgLy8gQ29udmVydCB1c2VyLmlkIGZyb20gYmFzZTY0dXJsIHRvIEFycmF5QnVmZmVyXG4gICAgY29uc3QgdXNlciA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdXNlck9wdHMpLCB7IGlkOiBiYXNlNjRVcmxUb1VpbnQ4QXJyYXkodXNlck9wdHMuaWQpLmJ1ZmZlciB9KTtcbiAgICAvLyBCdWlsZCB0aGUgcmVzdWx0IG9iamVjdFxuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdE9wdGlvbnMpLCB7IGNoYWxsZW5nZSxcbiAgICAgICAgdXNlciB9KTtcbiAgICAvLyBPbmx5IGFkZCBleGNsdWRlQ3JlZGVudGlhbHMgaWYgaXQgZXhpc3RzXG4gICAgaWYgKGV4Y2x1ZGVDcmVkZW50aWFscyAmJiBleGNsdWRlQ3JlZGVudGlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuZXhjbHVkZUNyZWRlbnRpYWxzID0gbmV3IEFycmF5KGV4Y2x1ZGVDcmVkZW50aWFscy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4Y2x1ZGVDcmVkZW50aWFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY3JlZCA9IGV4Y2x1ZGVDcmVkZW50aWFsc1tpXTtcbiAgICAgICAgICAgIHJlc3VsdC5leGNsdWRlQ3JlZGVudGlhbHNbaV0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNyZWQpLCB7IGlkOiBiYXNlNjRVcmxUb1VpbnQ4QXJyYXkoY3JlZC5pZCkuYnVmZmVyLCB0eXBlOiBjcmVkLnR5cGUgfHwgJ3B1YmxpYy1rZXknLCBcbiAgICAgICAgICAgICAgICAvLyBDYXN0IHRyYW5zcG9ydHMgdG8gaGFuZGxlIGZ1dHVyZSB0cmFuc3BvcnQgdHlwZXMgbGlrZSBcImNhYmxlXCJcbiAgICAgICAgICAgICAgICB0cmFuc3BvcnRzOiBjcmVkLnRyYW5zcG9ydHMgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ29udmVydCBiYXNlNjR1cmwgZW5jb2RlZCBzdHJpbmdzIGluIFdlYkF1dGhuIGNyZWRlbnRpYWwgcmVxdWVzdCBvcHRpb25zIHRvIEFycmF5QnVmZmVyc1xuICogYXMgcmVxdWlyZWQgYnkgdGhlIFdlYkF1dGhuIGJyb3dzZXIgQVBJLlxuICogU3VwcG9ydHMgYm90aCBuYXRpdmUgV2ViQXV0aG4gTGV2ZWwgMyBwYXJzZVJlcXVlc3RPcHRpb25zRnJvbUpTT04gYW5kIG1hbnVhbCBmYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge1NlcnZlckNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc30gb3B0aW9ucyAtIEpTT04gb3B0aW9ucyBmcm9tIHNlcnZlciB3aXRoIGJhc2U2NHVybCBlbmNvZGVkIGZpZWxkc1xuICogQHJldHVybnMge1B1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc0Z1dHVyZX0gT3B0aW9ucyByZWFkeSBmb3IgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCgpXG4gKiBAc2VlIHtAbGluayBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXV0aG4vI3NjdG4tcGFyc2VSZXF1ZXN0T3B0aW9uc0Zyb21KU09OIFczQyBXZWJBdXRobiBTcGVjIC0gcGFyc2VSZXF1ZXN0T3B0aW9uc0Zyb21KU09OfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NyZWRlbnRpYWwgcmVxdWVzdCBvcHRpb25zIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cbiAgICAvLyBDaGVjayBpZiB0aGUgbmF0aXZlIHBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTiBtZXRob2QgaXMgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBQdWJsaWNLZXlDcmVkZW50aWFsICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAncGFyc2VSZXF1ZXN0T3B0aW9uc0Zyb21KU09OJyBpbiBQdWJsaWNLZXlDcmVkZW50aWFsICYmXG4gICAgICAgIHR5cGVvZiBQdWJsaWNLZXlDcmVkZW50aWFsXG4gICAgICAgICAgICAucGFyc2VSZXF1ZXN0T3B0aW9uc0Zyb21KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgbWV0aG9kXG4gICAgICAgIHJldHVybiBQdWJsaWNLZXlDcmVkZW50aWFsLnBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTihvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gbWFudWFsIHBhcnNpbmcgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgbmF0aXZlIG1ldGhvZFxuICAgIC8vIERlc3RydWN0dXJlIHRvIHNlcGFyYXRlIGZpZWxkcyB0aGF0IG5lZWQgdHJhbnNmb3JtYXRpb25cbiAgICBjb25zdCB7IGNoYWxsZW5nZTogY2hhbGxlbmdlU3RyLCBhbGxvd0NyZWRlbnRpYWxzIH0gPSBvcHRpb25zLCByZXN0T3B0aW9ucyA9IF9fcmVzdChvcHRpb25zXG4gICAgLy8gQ29udmVydCBjaGFsbGVuZ2UgZnJvbSBiYXNlNjR1cmwgdG8gQXJyYXlCdWZmZXJcbiAgICAsIFtcImNoYWxsZW5nZVwiLCBcImFsbG93Q3JlZGVudGlhbHNcIl0pO1xuICAgIC8vIENvbnZlcnQgY2hhbGxlbmdlIGZyb20gYmFzZTY0dXJsIHRvIEFycmF5QnVmZmVyXG4gICAgY29uc3QgY2hhbGxlbmdlID0gYmFzZTY0VXJsVG9VaW50OEFycmF5KGNoYWxsZW5nZVN0cikuYnVmZmVyO1xuICAgIC8vIEJ1aWxkIHRoZSByZXN1bHQgb2JqZWN0XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXN0T3B0aW9ucyksIHsgY2hhbGxlbmdlIH0pO1xuICAgIC8vIE9ubHkgYWRkIGFsbG93Q3JlZGVudGlhbHMgaWYgaXQgZXhpc3RzXG4gICAgaWYgKGFsbG93Q3JlZGVudGlhbHMgJiYgYWxsb3dDcmVkZW50aWFscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5hbGxvd0NyZWRlbnRpYWxzID0gbmV3IEFycmF5KGFsbG93Q3JlZGVudGlhbHMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxvd0NyZWRlbnRpYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjcmVkID0gYWxsb3dDcmVkZW50aWFsc1tpXTtcbiAgICAgICAgICAgIHJlc3VsdC5hbGxvd0NyZWRlbnRpYWxzW2ldID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjcmVkKSwgeyBpZDogYmFzZTY0VXJsVG9VaW50OEFycmF5KGNyZWQuaWQpLmJ1ZmZlciwgdHlwZTogY3JlZC50eXBlIHx8ICdwdWJsaWMta2V5JywgXG4gICAgICAgICAgICAgICAgLy8gQ2FzdCB0cmFuc3BvcnRzIHRvIGhhbmRsZSBmdXR1cmUgdHJhbnNwb3J0IHR5cGVzIGxpa2UgXCJjYWJsZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNwb3J0czogY3JlZC50cmFuc3BvcnRzIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvbnZlcnQgYSByZWdpc3RyYXRpb24vZW5yb2xsbWVudCBjcmVkZW50aWFsIHJlc3BvbnNlIHRvIHNlcnZlciBmb3JtYXQuXG4gKiBTZXJpYWxpemVzIGJpbmFyeSBmaWVsZHMgdG8gYmFzZTY0dXJsIGZvciBKU09OIHRyYW5zbWlzc2lvbi5cbiAqIFN1cHBvcnRzIGJvdGggbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgdG9KU09OIGFuZCBtYW51YWwgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIHtSZWdpc3RyYXRpb25DcmVkZW50aWFsfSBjcmVkZW50aWFsIC0gQ3JlZGVudGlhbCBmcm9tIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKVxuICogQHJldHVybnMge1JlZ2lzdHJhdGlvblJlc3BvbnNlSlNPTn0gSlNPTi1zZXJpYWxpemFibGUgY3JlZGVudGlhbCBmb3Igc2VydmVyXG4gKiBAc2VlIHtAbGluayBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXV0aG4vI2RvbS1wdWJsaWNrZXljcmVkZW50aWFsLXRvanNvbiBXM0MgV2ViQXV0aG4gU3BlYyAtIHRvSlNPTn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvblJlc3BvbnNlKGNyZWRlbnRpYWwpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNyZWRlbnRpYWwgaW5zdGFuY2UgaGFzIHRoZSB0b0pTT04gbWV0aG9kXG4gICAgaWYgKCd0b0pTT04nIGluIGNyZWRlbnRpYWwgJiYgdHlwZW9mIGNyZWRlbnRpYWwudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgbWV0aG9kXG4gICAgICAgIHJldHVybiBjcmVkZW50aWFsLnRvSlNPTigpO1xuICAgIH1cbiAgICBjb25zdCBjcmVkZW50aWFsV2l0aEF0dGFjaG1lbnQgPSBjcmVkZW50aWFsO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBjcmVkZW50aWFsLmlkLFxuICAgICAgICByYXdJZDogY3JlZGVudGlhbC5pZCxcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICAgIGF0dGVzdGF0aW9uT2JqZWN0OiBieXRlc1RvQmFzZTY0VVJMKG5ldyBVaW50OEFycmF5KGNyZWRlbnRpYWwucmVzcG9uc2UuYXR0ZXN0YXRpb25PYmplY3QpKSxcbiAgICAgICAgICAgIGNsaWVudERhdGFKU09OOiBieXRlc1RvQmFzZTY0VVJMKG5ldyBVaW50OEFycmF5KGNyZWRlbnRpYWwucmVzcG9uc2UuY2xpZW50RGF0YUpTT04pKSxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogJ3B1YmxpYy1rZXknLFxuICAgICAgICBjbGllbnRFeHRlbnNpb25SZXN1bHRzOiBjcmVkZW50aWFsLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMoKSxcbiAgICAgICAgLy8gQ29udmVydCBudWxsIHRvIHVuZGVmaW5lZCBhbmQgY2FzdCB0byBBdXRoZW50aWNhdG9yQXR0YWNobWVudCB0eXBlXG4gICAgICAgIGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OiAoKF9hID0gY3JlZGVudGlhbFdpdGhBdHRhY2htZW50LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQpLFxuICAgIH07XG59XG4vKipcbiAqIENvbnZlcnQgYW4gYXV0aGVudGljYXRpb24vdmVyaWZpY2F0aW9uIGNyZWRlbnRpYWwgcmVzcG9uc2UgdG8gc2VydmVyIGZvcm1hdC5cbiAqIFNlcmlhbGl6ZXMgYmluYXJ5IGZpZWxkcyB0byBiYXNlNjR1cmwgZm9yIEpTT04gdHJhbnNtaXNzaW9uLlxuICogU3VwcG9ydHMgYm90aCBuYXRpdmUgV2ViQXV0aG4gTGV2ZWwgMyB0b0pTT04gYW5kIG1hbnVhbCBmYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge0F1dGhlbnRpY2F0aW9uQ3JlZGVudGlhbH0gY3JlZGVudGlhbCAtIENyZWRlbnRpYWwgZnJvbSBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClcbiAqIEByZXR1cm5zIHtBdXRoZW50aWNhdGlvblJlc3BvbnNlSlNPTn0gSlNPTi1zZXJpYWxpemFibGUgY3JlZGVudGlhbCBmb3Igc2VydmVyXG4gKiBAc2VlIHtAbGluayBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXV0aG4vI2RvbS1wdWJsaWNrZXljcmVkZW50aWFsLXRvanNvbiBXM0MgV2ViQXV0aG4gU3BlYyAtIHRvSlNPTn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0UmVzcG9uc2UoY3JlZGVudGlhbCkge1xuICAgIHZhciBfYTtcbiAgICAvLyBDaGVjayBpZiB0aGUgY3JlZGVudGlhbCBpbnN0YW5jZSBoYXMgdGhlIHRvSlNPTiBtZXRob2RcbiAgICBpZiAoJ3RvSlNPTicgaW4gY3JlZGVudGlhbCAmJiB0eXBlb2YgY3JlZGVudGlhbC50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgV2ViQXV0aG4gTGV2ZWwgMyBtZXRob2RcbiAgICAgICAgcmV0dXJuIGNyZWRlbnRpYWwudG9KU09OKCk7XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG1hbnVhbCBjb252ZXJzaW9uIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgdG9KU09OXG4gICAgLy8gQWNjZXNzIGF1dGhlbnRpY2F0b3JBdHRhY2htZW50IHZpYSB0eXBlIGFzc2VydGlvbiB0byBoYW5kbGUgVHlwZVNjcmlwdCB2ZXJzaW9uIGRpZmZlcmVuY2VzXG4gICAgLy8gQHNpbXBsZXdlYmF1dGhuL3R5cGVzIGluY2x1ZGVzIHRoaXMgcHJvcGVydHkgYnV0IGJhc2UgVHlwZVNjcmlwdCA0LjcuNCBkb2Vzbid0XG4gICAgY29uc3QgY3JlZGVudGlhbFdpdGhBdHRhY2htZW50ID0gY3JlZGVudGlhbDtcbiAgICBjb25zdCBjbGllbnRFeHRlbnNpb25SZXN1bHRzID0gY3JlZGVudGlhbC5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCk7XG4gICAgY29uc3QgYXNzZXJ0aW9uUmVzcG9uc2UgPSBjcmVkZW50aWFsLnJlc3BvbnNlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBjcmVkZW50aWFsLmlkLFxuICAgICAgICByYXdJZDogY3JlZGVudGlhbC5pZCwgLy8gVzNDIHNwZWMgZXhwZWN0cyByYXdJZCB0byBtYXRjaCBpZCBmb3IgSlNPTiBmb3JtYXRcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICAgIGF1dGhlbnRpY2F0b3JEYXRhOiBieXRlc1RvQmFzZTY0VVJMKG5ldyBVaW50OEFycmF5KGFzc2VydGlvblJlc3BvbnNlLmF1dGhlbnRpY2F0b3JEYXRhKSksXG4gICAgICAgICAgICBjbGllbnREYXRhSlNPTjogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShhc3NlcnRpb25SZXNwb25zZS5jbGllbnREYXRhSlNPTikpLFxuICAgICAgICAgICAgc2lnbmF0dXJlOiBieXRlc1RvQmFzZTY0VVJMKG5ldyBVaW50OEFycmF5KGFzc2VydGlvblJlc3BvbnNlLnNpZ25hdHVyZSkpLFxuICAgICAgICAgICAgdXNlckhhbmRsZTogYXNzZXJ0aW9uUmVzcG9uc2UudXNlckhhbmRsZVxuICAgICAgICAgICAgICAgID8gYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShhc3NlcnRpb25SZXNwb25zZS51c2VySGFuZGxlKSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogJ3B1YmxpYy1rZXknLFxuICAgICAgICBjbGllbnRFeHRlbnNpb25SZXN1bHRzLFxuICAgICAgICAvLyBDb252ZXJ0IG51bGwgdG8gdW5kZWZpbmVkIGFuZCBjYXN0IHRvIEF1dGhlbnRpY2F0b3JBdHRhY2htZW50IHR5cGVcbiAgICAgICAgYXV0aGVudGljYXRvckF0dGFjaG1lbnQ6ICgoX2EgPSBjcmVkZW50aWFsV2l0aEF0dGFjaG1lbnQuYXV0aGVudGljYXRvckF0dGFjaG1lbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHVuZGVmaW5lZCksXG4gICAgfTtcbn1cbi8qKlxuICogQSBzaW1wbGUgdGVzdCB0byBkZXRlcm1pbmUgaWYgYSBob3N0bmFtZSBpcyBhIHByb3Blcmx5LWZvcm1hdHRlZCBkb21haW4gbmFtZS5cbiAqIENvbnNpZGVycyBsb2NhbGhvc3QgdmFsaWQgZm9yIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAqXG4gKiBBIFwidmFsaWQgZG9tYWluXCIgaXMgZGVmaW5lZCBoZXJlOiBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3ZhbGlkLWRvbWFpblxuICpcbiAqIFJlZ2V4IHNvdXJjZWQgZnJvbSBoZXJlOlxuICogaHR0cHM6Ly93d3cub3JlaWxseS5jb20vbGlicmFyeS92aWV3L3JlZ3VsYXItZXhwcmVzc2lvbnMtY29va2Jvb2svOTc4MTQ0OTMyNzQ1My9jaDA4czE1Lmh0bWxcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaG9zdG5hbWUgLSBUaGUgaG9zdG5hbWUgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbGlkIGRvbWFpbiBvciBsb2NhbGhvc3RcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdmFsaWQtZG9tYWluIFdIQVRXRyBVUkwgU3BlYyAtIFZhbGlkIERvbWFpbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREb21haW4oaG9zdG5hbWUpIHtcbiAgICByZXR1cm4gKFxuICAgIC8vIENvbnNpZGVyIGxvY2FsaG9zdCB2YWxpZCBhcyB3ZWxsIHNpbmNlIGl0J3Mgb2theSB3cnQgU2VjdXJlIENvbnRleHRzXG4gICAgaG9zdG5hbWUgPT09ICdsb2NhbGhvc3QnIHx8IC9eKFthLXowLTldKygtW2EtejAtOV0rKSpcXC4pK1thLXpdezIsfSQvaS50ZXN0KGhvc3RuYW1lKSk7XG59XG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYnJvd3NlciBpcyBjYXBhYmxlIG9mIFdlYkF1dGhuLlxuICogQ2hlY2tzIGZvciBuZWNlc3NhcnkgV2ViIEFQSXM6IFB1YmxpY0tleUNyZWRlbnRpYWwgYW5kIENyZWRlbnRpYWwgTWFuYWdlbWVudC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBicm93c2VyIHN1cHBvcnRzIFdlYkF1dGhuXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUHVibGljS2V5Q3JlZGVudGlhbCNicm93c2VyX2NvbXBhdGliaWxpdHkgTUROIC0gUHVibGljS2V5Q3JlZGVudGlhbCBCcm93c2VyIENvbXBhdGliaWxpdHl9XG4gKi9cbmZ1bmN0aW9uIGJyb3dzZXJTdXBwb3J0c1dlYkF1dGhuKCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuICEhKGlzQnJvd3NlcigpICYmXG4gICAgICAgICdQdWJsaWNLZXlDcmVkZW50aWFsJyBpbiB3aW5kb3cgJiZcbiAgICAgICAgd2luZG93LlB1YmxpY0tleUNyZWRlbnRpYWwgJiZcbiAgICAgICAgJ2NyZWRlbnRpYWxzJyBpbiBuYXZpZ2F0b3IgJiZcbiAgICAgICAgdHlwZW9mICgoX2EgPSBuYXZpZ2F0b3IgPT09IG51bGwgfHwgbmF2aWdhdG9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3IuY3JlZGVudGlhbHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jcmVhdGUpID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiAoKF9iID0gbmF2aWdhdG9yID09PSBudWxsIHx8IG5hdmlnYXRvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yLmNyZWRlbnRpYWxzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZ2V0KSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG4vKipcbiAqIENyZWF0ZSBhIFdlYkF1dGhuIGNyZWRlbnRpYWwgdXNpbmcgdGhlIGJyb3dzZXIncyBjcmVkZW50aWFscyBBUEkuXG4gKiBXcmFwcyBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKCkgd2l0aCBlcnJvciBoYW5kbGluZy5cbiAqXG4gKiBAcGFyYW0ge0NyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGluY2x1ZGluZyBwdWJsaWNLZXkgcGFyYW1ldGVyc1xuICogQHJldHVybnMge1Byb21pc2U8UmVxdWVzdFJlc3VsdDxSZWdpc3RyYXRpb25DcmVkZW50aWFsLCBXZWJBdXRobkVycm9yPj59IENyZWF0ZWQgY3JlZGVudGlhbCBvciBlcnJvclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWNyZWF0ZUNyZWRlbnRpYWwgVzNDIFdlYkF1dGhuIFNwZWMgLSBDcmVhdGUgQ3JlZGVudGlhbH1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DcmVkZW50aWFsc0NvbnRhaW5lci9jcmVhdGUgTUROIC0gY3JlZGVudGlhbHMuY3JlYXRlfVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ3JlZGVudGlhbChvcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKFxuICAgICAgICAvKiogd2UgYXNzZXJ0IHRoZSB0eXBlIGhlcmUgdW50aWwgdHlwZXNjcmlwdCB0eXBlcyBhcmUgdXBkYXRlZCAqL1xuICAgICAgICBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgV2ViQXV0aG5Vbmtub3duRXJyb3IoJ0VtcHR5IGNyZWRlbnRpYWwgcmVzcG9uc2UnLCByZXNwb25zZSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHJlc3BvbnNlIGluc3RhbmNlb2YgUHVibGljS2V5Q3JlZGVudGlhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IFdlYkF1dGhuVW5rbm93bkVycm9yKCdCcm93c2VyIHJldHVybmVkIHVuZXhwZWN0ZWQgY3JlZGVudGlhbCB0eXBlJywgcmVzcG9uc2UpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkYXRhOiByZXNwb25zZSwgZXJyb3I6IG51bGwgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgIGVycm9yOiBpZGVudGlmeVJlZ2lzdHJhdGlvbkVycm9yKHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcbiAqIEdldCBhIFdlYkF1dGhuIGNyZWRlbnRpYWwgdXNpbmcgdGhlIGJyb3dzZXIncyBjcmVkZW50aWFscyBBUEkuXG4gKiBXcmFwcyBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KCkgd2l0aCBlcnJvciBoYW5kbGluZy5cbiAqXG4gKiBAcGFyYW0ge0NyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbnMgaW5jbHVkaW5nIHB1YmxpY0tleSBwYXJhbWV0ZXJzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZXF1ZXN0UmVzdWx0PEF1dGhlbnRpY2F0aW9uQ3JlZGVudGlhbCwgV2ViQXV0aG5FcnJvcj4+fSBSZXRyaWV2ZWQgY3JlZGVudGlhbCBvciBlcnJvclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWdldEFzc2VydGlvbiBXM0MgV2ViQXV0aG4gU3BlYyAtIEdldCBBc3NlcnRpb259XG4gKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3JlZGVudGlhbHNDb250YWluZXIvZ2V0IE1ETiAtIGNyZWRlbnRpYWxzLmdldH1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENyZWRlbnRpYWwob3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldChcbiAgICAgICAgLyoqIHdlIGFzc2VydCB0aGUgdHlwZSBoZXJlIHVudGlsIHR5cGVzY3JpcHQgdHlwZXMgYXJlIHVwZGF0ZWQgKi9cbiAgICAgICAgb3B0aW9ucyk7XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IFdlYkF1dGhuVW5rbm93bkVycm9yKCdFbXB0eSBjcmVkZW50aWFsIHJlc3BvbnNlJywgcmVzcG9uc2UpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShyZXNwb25zZSBpbnN0YW5jZW9mIFB1YmxpY0tleUNyZWRlbnRpYWwpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBXZWJBdXRoblVua25vd25FcnJvcignQnJvd3NlciByZXR1cm5lZCB1bmV4cGVjdGVkIGNyZWRlbnRpYWwgdHlwZScsIHJlc3BvbnNlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzcG9uc2UsIGVycm9yOiBudWxsIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICBlcnJvcjogaWRlbnRpZnlBdXRoZW50aWNhdGlvbkVycm9yKHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgREVGQVVMVF9DUkVBVElPTl9PUFRJT05TID0ge1xuICAgIGhpbnRzOiBbJ3NlY3VyaXR5LWtleSddLFxuICAgIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246IHtcbiAgICAgICAgYXV0aGVudGljYXRvckF0dGFjaG1lbnQ6ICdjcm9zcy1wbGF0Zm9ybScsXG4gICAgICAgIHJlcXVpcmVSZXNpZGVudEtleTogZmFsc2UsXG4gICAgICAgIC8qKiBzZXQgdG8gcHJlZmVycmVkIGJlY2F1c2Ugb2xkZXIgeXViaWtleXMgZG9uJ3QgaGF2ZSBQSU4vQmlvbWV0cmljICovXG4gICAgICAgIHVzZXJWZXJpZmljYXRpb246ICdwcmVmZXJyZWQnLFxuICAgICAgICByZXNpZGVudEtleTogJ2Rpc2NvdXJhZ2VkJyxcbiAgICB9LFxuICAgIGF0dGVzdGF0aW9uOiAnZGlyZWN0Jyxcbn07XG5leHBvcnQgY29uc3QgREVGQVVMVF9SRVFVRVNUX09QVElPTlMgPSB7XG4gICAgLyoqIHNldCB0byBwcmVmZXJyZWQgYmVjYXVzZSBvbGRlciB5dWJpa2V5cyBkb24ndCBoYXZlIFBJTi9CaW9tZXRyaWMgKi9cbiAgICB1c2VyVmVyaWZpY2F0aW9uOiAncHJlZmVycmVkJyxcbiAgICBoaW50czogWydzZWN1cml0eS1rZXknXSxcbiAgICBhdHRlc3RhdGlvbjogJ2RpcmVjdCcsXG59O1xuZnVuY3Rpb24gZGVlcE1lcmdlKC4uLnNvdXJjZXMpIHtcbiAgICBjb25zdCBpc09iamVjdCA9ICh2YWwpID0+IHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuICAgIGNvbnN0IGlzQXJyYXlCdWZmZXJMaWtlID0gKHZhbCkgPT4gdmFsIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICBpZiAoIXNvdXJjZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIC8vIHByZXNlcnZlIGFycmF5IHJlZmVyZW5jZSwgaW5jbHVkaW5nIHVuaW9ucyBsaWtlIEF1dGhlbnRpY2F0b3JUcmFuc3BvcnRbXVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0FycmF5QnVmZmVyTGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZXN1bHRba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gZGVlcE1lcmdlKGV4aXN0aW5nLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGRlZXBNZXJnZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBNZXJnZXMgV2ViQXV0aG4gY3JlZGVudGlhbCBjcmVhdGlvbiBvcHRpb25zIHdpdGggb3ZlcnJpZGVzLlxuICogU2V0cyBzZW5zaWJsZSBkZWZhdWx0cyBmb3IgYXV0aGVudGljYXRvciBzZWxlY3Rpb24gYW5kIGV4dGVuc2lvbnMuXG4gKlxuICogQHBhcmFtIHtQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zRnV0dXJlfSBiYXNlT3B0aW9ucyAtIFRoZSBiYXNlIG9wdGlvbnMgZnJvbSB0aGUgc2VydmVyXG4gKiBAcGFyYW0ge1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNGdXR1cmV9IG92ZXJyaWRlcyAtIE9wdGlvbmFsIG92ZXJyaWRlcyB0byBhcHBseVxuICogQHBhcmFtIHtzdHJpbmd9IGZyaWVuZGx5TmFtZSAtIE9wdGlvbmFsIGZyaWVuZGx5IG5hbWUgZm9yIHRoZSBjcmVkZW50aWFsXG4gKiBAcmV0dXJucyB7UHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc0Z1dHVyZX0gTWVyZ2VkIGNyZWRlbnRpYWwgY3JlYXRpb24gb3B0aW9uc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNkaWN0ZGVmLWF1dGhlbnRpY2F0b3JzZWxlY3Rpb25jcml0ZXJpYSBXM0MgV2ViQXV0aG4gU3BlYyAtIEF1dGhlbnRpY2F0b3JTZWxlY3Rpb25Dcml0ZXJpYX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyhiYXNlT3B0aW9ucywgb3ZlcnJpZGVzKSB7XG4gICAgcmV0dXJuIGRlZXBNZXJnZShERUZBVUxUX0NSRUFUSU9OX09QVElPTlMsIGJhc2VPcHRpb25zLCBvdmVycmlkZXMgfHwge30pO1xufVxuLyoqXG4gKiBNZXJnZXMgV2ViQXV0aG4gY3JlZGVudGlhbCByZXF1ZXN0IG9wdGlvbnMgd2l0aCBvdmVycmlkZXMuXG4gKiBTZXRzIHNlbnNpYmxlIGRlZmF1bHRzIGZvciB1c2VyIHZlcmlmaWNhdGlvbiBhbmQgaGludHMuXG4gKlxuICogQHBhcmFtIHtQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNGdXR1cmV9IGJhc2VPcHRpb25zIC0gVGhlIGJhc2Ugb3B0aW9ucyBmcm9tIHRoZSBzZXJ2ZXJcbiAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBvdmVycmlkZXMgLSBPcHRpb25hbCBvdmVycmlkZXMgdG8gYXBwbHlcbiAqIEByZXR1cm5zIHtQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNGdXR1cmV9IE1lcmdlZCBjcmVkZW50aWFsIHJlcXVlc3Qgb3B0aW9uc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNkaWN0ZGVmLXB1YmxpY2tleWNyZWRlbnRpYWxyZXF1ZXN0b3B0aW9ucyBXM0MgV2ViQXV0aG4gU3BlYyAtIFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zKGJhc2VPcHRpb25zLCBvdmVycmlkZXMpIHtcbiAgICByZXR1cm4gZGVlcE1lcmdlKERFRkFVTFRfUkVRVUVTVF9PUFRJT05TLCBiYXNlT3B0aW9ucywgb3ZlcnJpZGVzIHx8IHt9KTtcbn1cbi8qKlxuICogV2ViQXV0aG4gQVBJIHdyYXBwZXIgZm9yIFN1cGFiYXNlIEF1dGguXG4gKiBQcm92aWRlcyBtZXRob2RzIGZvciBlbnJvbGxpbmcsIGNoYWxsZW5naW5nLCB2ZXJpZnlpbmcsIGF1dGhlbnRpY2F0aW5nLCBhbmQgcmVnaXN0ZXJpbmcgV2ViQXV0aG4gY3JlZGVudGlhbHMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIEFQSSBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzXG4gKiBAc2VlIHtAbGluayBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXV0aG4vIFczQyBXZWJBdXRobiBTcGVjaWZpY2F0aW9ufVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYl9BdXRoZW50aWNhdGlvbl9BUEkgTUROIC0gV2ViIEF1dGhlbnRpY2F0aW9uIEFQSX1cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkF1dGhuQXBpIHtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIC8vIEJpbmQgYWxsIG1ldGhvZHMgc28gdGhleSBjYW4gYmUgZGVzdHJ1Y3R1cmVkXG4gICAgICAgIHRoaXMuZW5yb2xsID0gdGhpcy5fZW5yb2xsLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY2hhbGxlbmdlID0gdGhpcy5fY2hhbGxlbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudmVyaWZ5ID0gdGhpcy5fdmVyaWZ5LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYXV0aGVudGljYXRlID0gdGhpcy5fYXV0aGVudGljYXRlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIgPSB0aGlzLl9yZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbnJvbGwgYSBuZXcgV2ViQXV0aG4gZmFjdG9yLlxuICAgICAqIENyZWF0ZXMgYW4gdW52ZXJpZmllZCBXZWJBdXRobiBmYWN0b3IgdGhhdCBtdXN0IGJlIHZlcmlmaWVkIHdpdGggYSBjcmVkZW50aWFsLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbCBUaGlzIG1ldGhvZCBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzXG4gICAgICogQHBhcmFtIHtPbWl0PE1GQUVucm9sbFdlYmF1dGhuUGFyYW1zLCAnZmFjdG9yVHlwZSc+fSBwYXJhbXMgLSBFbnJvbGxtZW50IHBhcmFtZXRlcnMgKGZyaWVuZGx5TmFtZSByZXF1aXJlZClcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBdXRoTUZBRW5yb2xsV2ViYXV0aG5SZXNwb25zZT59IEVucm9sbGVkIGZhY3RvciBkZXRhaWxzIG9yIGVycm9yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXJlZ2lzdGVyaW5nLWEtbmV3LWNyZWRlbnRpYWwgVzNDIFdlYkF1dGhuIFNwZWMgLSBSZWdpc3RlcmluZyBhIE5ldyBDcmVkZW50aWFsfVxuICAgICAqL1xuICAgIGFzeW5jIF9lbnJvbGwocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5tZmEuZW5yb2xsKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKSwgeyBmYWN0b3JUeXBlOiAnd2ViYXV0aG4nIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbGxlbmdlIGZvciBXZWJBdXRobiBjcmVkZW50aWFsIGNyZWF0aW9uIG9yIGF1dGhlbnRpY2F0aW9uLlxuICAgICAqIENvbWJpbmVzIHNlcnZlciBjaGFsbGVuZ2Ugd2l0aCBicm93c2VyIGNyZWRlbnRpYWwgb3BlcmF0aW9ucy5cbiAgICAgKiBIYW5kbGVzIGJvdGggcmVnaXN0cmF0aW9uIChjcmVhdGUpIGFuZCBhdXRoZW50aWNhdGlvbiAocmVxdWVzdCkgZmxvd3MuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsIFRoaXMgbWV0aG9kIGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXNcbiAgICAgKiBAcGFyYW0ge01GQUNoYWxsZW5nZVdlYmF1dGhuUGFyYW1zICYgeyBmcmllbmRseU5hbWU/OiBzdHJpbmc7IHNpZ25hbD86IEFib3J0U2lnbmFsIH19IHBhcmFtcyAtIENoYWxsZW5nZSBwYXJhbWV0ZXJzIGluY2x1ZGluZyBmYWN0b3JJZFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdmVycmlkZXMgLSBBbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBuYXZpZ2F0b3IuY3JlZGVudGlhbHNcbiAgICAgKiBAcGFyYW0ge1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNGdXR1cmV9IG92ZXJyaWRlcy5jcmVhdGUgLSBPdmVycmlkZSBvcHRpb25zIGZvciBjcmVkZW50aWFsIGNyZWF0aW9uXG4gICAgICogQHBhcmFtIHtQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNGdXR1cmV9IG92ZXJyaWRlcy5yZXF1ZXN0IC0gT3ZlcnJpZGUgb3B0aW9ucyBmb3IgY3JlZGVudGlhbCByZXF1ZXN0XG4gICAgICogQHJldHVybnMge1Byb21pc2U8UmVxdWVzdFJlc3VsdD59IENoYWxsZW5nZSByZXNwb25zZSB3aXRoIGNyZWRlbnRpYWwgb3IgZXJyb3JcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXV0aG4vI3NjdG4tY3JlZGVudGlhbC1jcmVhdGlvbiBXM0MgV2ViQXV0aG4gU3BlYyAtIENyZWRlbnRpYWwgQ3JlYXRpb259XG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXZlcmlmeWluZy1hc3NlcnRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBWZXJpZnlpbmcgQXNzZXJ0aW9ufVxuICAgICAqL1xuICAgIGFzeW5jIF9jaGFsbGVuZ2UoeyBmYWN0b3JJZCwgd2ViYXV0aG4sIGZyaWVuZGx5TmFtZSwgc2lnbmFsLCB9LCBvdmVycmlkZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEdldCBjaGFsbGVuZ2UgZnJvbSBzZXJ2ZXIgdXNpbmcgdGhlIGNsaWVudCdzIE1GQSBtZXRob2RzXG4gICAgICAgICAgICBjb25zdCB7IGRhdGE6IGNoYWxsZW5nZVJlc3BvbnNlLCBlcnJvcjogY2hhbGxlbmdlRXJyb3IgfSA9IGF3YWl0IHRoaXMuY2xpZW50Lm1mYS5jaGFsbGVuZ2Uoe1xuICAgICAgICAgICAgICAgIGZhY3RvcklkLFxuICAgICAgICAgICAgICAgIHdlYmF1dGhuLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWNoYWxsZW5nZVJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3I6IGNoYWxsZW5nZUVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhYm9ydFNpZ25hbCA9IHNpZ25hbCAhPT0gbnVsbCAmJiBzaWduYWwgIT09IHZvaWQgMCA/IHNpZ25hbCA6IHdlYkF1dGhuQWJvcnRTZXJ2aWNlLmNyZWF0ZU5ld0Fib3J0U2lnbmFsKCk7XG4gICAgICAgICAgICAvKiogd2ViYXV0aG4gd2lsbCBmYWlsIGlmIGVpdGhlciBvZiB0aGUgbmFtZS9kaXNwbGF5bmFtZSBhcmUgYmxhbmsgKi9cbiAgICAgICAgICAgIGlmIChjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi50eXBlID09PSAnY3JlYXRlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdXNlciB9ID0gY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zLnB1YmxpY0tleTtcbiAgICAgICAgICAgICAgICBpZiAoIXVzZXIubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB1c2VyLm5hbWUgPSBgJHt1c2VyLmlkfToke2ZyaWVuZGx5TmFtZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXVzZXIuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlci5kaXNwbGF5TmFtZSA9IHVzZXIubmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2ggKGNoYWxsZW5nZVJlc3BvbnNlLndlYmF1dGhuLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjcmVhdGUnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBtZXJnZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMoY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zLnB1YmxpY0tleSwgb3ZlcnJpZGVzID09PSBudWxsIHx8IG92ZXJyaWRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3ZlcnJpZGVzLmNyZWF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IGNyZWF0ZUNyZWRlbnRpYWwoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljS2V5OiBvcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBhYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9ySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWxsZW5nZUlkOiBjaGFsbGVuZ2VSZXNwb25zZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViYXV0aG46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGNoYWxsZW5nZVJlc3BvbnNlLndlYmF1dGhuLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsX3Jlc3BvbnNlOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ3JlcXVlc3QnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBtZXJnZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyhjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi5jcmVkZW50aWFsX29wdGlvbnMucHVibGljS2V5LCBvdmVycmlkZXMgPT09IG51bGwgfHwgb3ZlcnJpZGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdmVycmlkZXMucmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IGdldENyZWRlbnRpYWwoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi5jcmVkZW50aWFsX29wdGlvbnMpLCB7IHB1YmxpY0tleTogb3B0aW9ucywgc2lnbmFsOiBhYm9ydFNpZ25hbCB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9ySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWxsZW5nZUlkOiBjaGFsbGVuZ2VSZXNwb25zZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViYXV0aG46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGNoYWxsZW5nZVJlc3BvbnNlLndlYmF1dGhuLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsX3Jlc3BvbnNlOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzQXV0aEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBBdXRoVW5rbm93bkVycm9yKCdVbmV4cGVjdGVkIGVycm9yIGluIGNoYWxsZW5nZScsIGVycm9yKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVmVyaWZ5IGEgV2ViQXV0aG4gY3JlZGVudGlhbCB3aXRoIHRoZSBzZXJ2ZXIuXG4gICAgICogQ29tcGxldGVzIHRoZSBXZWJBdXRobiBjZXJlbW9ueSBieSBzZW5kaW5nIHRoZSBjcmVkZW50aWFsIHRvIHRoZSBzZXJ2ZXIgZm9yIHZlcmlmaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWwgVGhpcyBtZXRob2QgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBWZXJpZmljYXRpb24gcGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuY2hhbGxlbmdlSWQgLSBJRCBvZiB0aGUgY2hhbGxlbmdlIGJlaW5nIHZlcmlmaWVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5mYWN0b3JJZCAtIElEIG9mIHRoZSBXZWJBdXRobiBmYWN0b3JcbiAgICAgKiBAcGFyYW0ge01GQVZlcmlmeVdlYmF1dGhuUGFyYW1zPFQ+Wyd3ZWJhdXRobiddfSBwYXJhbXMud2ViYXV0aG4gLSBXZWJBdXRobiBjcmVkZW50aWFsIHJlc3BvbnNlXG4gICAgICogQHJldHVybnMge1Byb21pc2U8QXV0aE1GQVZlcmlmeVJlc3BvbnNlPn0gVmVyaWZpY2F0aW9uIHJlc3VsdCB3aXRoIHNlc3Npb24gb3IgZXJyb3JcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXV0aG4vI3NjdG4tdmVyaWZ5aW5nLWFzc2VydGlvbiBXM0MgV2ViQXV0aG4gU3BlYyAtIFZlcmlmeWluZyBhbiBBdXRoZW50aWNhdGlvbiBBc3NlcnRpb259XG4gICAgICogKi9cbiAgICBhc3luYyBfdmVyaWZ5KHsgY2hhbGxlbmdlSWQsIGZhY3RvcklkLCB3ZWJhdXRobiwgfSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQubWZhLnZlcmlmeSh7XG4gICAgICAgICAgICBmYWN0b3JJZCxcbiAgICAgICAgICAgIGNoYWxsZW5nZUlkLFxuICAgICAgICAgICAgd2ViYXV0aG46IHdlYmF1dGhuLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcGxldGUgV2ViQXV0aG4gYXV0aGVudGljYXRpb24gZmxvdy5cbiAgICAgKiBQZXJmb3JtcyBjaGFsbGVuZ2UgYW5kIHZlcmlmaWNhdGlvbiBpbiBhIHNpbmdsZSBvcGVyYXRpb24gZm9yIGV4aXN0aW5nIGNyZWRlbnRpYWxzLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbCBUaGlzIG1ldGhvZCBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIEF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmZhY3RvcklkIC0gSUQgb2YgdGhlIFdlYkF1dGhuIGZhY3RvciB0byBhdXRoZW50aWNhdGUgd2l0aFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMud2ViYXV0aG4gLSBXZWJBdXRobiBjb25maWd1cmF0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy53ZWJhdXRobi5ycElkIC0gUmVseWluZyBQYXJ0eSBJRCAoZGVmYXVsdHMgdG8gY3VycmVudCBob3N0bmFtZSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXJhbXMud2ViYXV0aG4ucnBPcmlnaW5zIC0gQWxsb3dlZCBvcmlnaW5zIChkZWZhdWx0cyB0byBjdXJyZW50IG9yaWdpbilcbiAgICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBwYXJhbXMud2ViYXV0aG4uc2lnbmFsIC0gT3B0aW9uYWwgYWJvcnQgc2lnbmFsXG4gICAgICogQHBhcmFtIHtQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNGdXR1cmV9IG92ZXJyaWRlcyAtIE92ZXJyaWRlIG9wdGlvbnMgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXF1ZXN0UmVzdWx0PEF1dGhNRkFWZXJpZnlSZXNwb25zZURhdGEsIFdlYkF1dGhuRXJyb3IgfCBBdXRoRXJyb3I+Pn0gQXV0aGVudGljYXRpb24gcmVzdWx0XG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWF1dGhlbnRpY2F0aW9uIFczQyBXZWJBdXRobiBTcGVjIC0gQXV0aGVudGljYXRpb24gQ2VyZW1vbnl9XG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1B1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyBNRE4gLSBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnN9XG4gICAgICovXG4gICAgYXN5bmMgX2F1dGhlbnRpY2F0ZSh7IGZhY3RvcklkLCB3ZWJhdXRobjogeyBycElkID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgOiB1bmRlZmluZWQsIHJwT3JpZ2lucyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gW3dpbmRvdy5sb2NhdGlvbi5vcmlnaW5dIDogdW5kZWZpbmVkLCBzaWduYWwsIH0gPSB7fSwgfSwgb3ZlcnJpZGVzKSB7XG4gICAgICAgIGlmICghcnBJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aEVycm9yKCdycElkIGlzIHJlcXVpcmVkIGZvciBXZWJBdXRobiBhdXRoZW50aWNhdGlvbicpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFicm93c2VyU3VwcG9ydHNXZWJBdXRobigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBBdXRoVW5rbm93bkVycm9yKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgV2ViQXV0aG4nLCBudWxsKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGNoYWxsZW5nZSBhbmQgY3JlZGVudGlhbFxuICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBjaGFsbGVuZ2VSZXNwb25zZSwgZXJyb3I6IGNoYWxsZW5nZUVycm9yIH0gPSBhd2FpdCB0aGlzLmNoYWxsZW5nZSh7XG4gICAgICAgICAgICAgICAgZmFjdG9ySWQsXG4gICAgICAgICAgICAgICAgd2ViYXV0aG46IHsgcnBJZCwgcnBPcmlnaW5zIH0sXG4gICAgICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgfSwgeyByZXF1ZXN0OiBvdmVycmlkZXMgfSk7XG4gICAgICAgICAgICBpZiAoIWNoYWxsZW5nZVJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3I6IGNoYWxsZW5nZUVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IHdlYmF1dGhuIH0gPSBjaGFsbGVuZ2VSZXNwb25zZTtcbiAgICAgICAgICAgIC8vIFZlcmlmeSBjcmVkZW50aWFsXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5KHtcbiAgICAgICAgICAgICAgICBmYWN0b3JJZCxcbiAgICAgICAgICAgICAgICBjaGFsbGVuZ2VJZDogY2hhbGxlbmdlUmVzcG9uc2UuY2hhbGxlbmdlSWQsXG4gICAgICAgICAgICAgICAgd2ViYXV0aG46IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogd2ViYXV0aG4udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcnBJZCxcbiAgICAgICAgICAgICAgICAgICAgcnBPcmlnaW5zLFxuICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsX3Jlc3BvbnNlOiB3ZWJhdXRobi5jcmVkZW50aWFsX3Jlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignVW5leHBlY3RlZCBlcnJvciBpbiBhdXRoZW50aWNhdGUnLCBlcnJvciksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXBsZXRlIFdlYkF1dGhuIHJlZ2lzdHJhdGlvbiBmbG93LlxuICAgICAqIFBlcmZvcm1zIGVucm9sbG1lbnQsIGNoYWxsZW5nZSwgYW5kIHZlcmlmaWNhdGlvbiBpbiBhIHNpbmdsZSBvcGVyYXRpb24gZm9yIG5ldyBjcmVkZW50aWFscy5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWwgVGhpcyBtZXRob2QgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBSZWdpc3RyYXRpb24gcGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuZnJpZW5kbHlOYW1lIC0gVXNlci1mcmllbmRseSBuYW1lIGZvciB0aGUgY3JlZGVudGlhbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucnBJZCAtIFJlbHlpbmcgUGFydHkgSUQgKGRlZmF1bHRzIHRvIGN1cnJlbnQgaG9zdG5hbWUpXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGFyYW1zLnJwT3JpZ2lucyAtIEFsbG93ZWQgb3JpZ2lucyAoZGVmYXVsdHMgdG8gY3VycmVudCBvcmlnaW4pXG4gICAgICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gcGFyYW1zLnNpZ25hbCAtIE9wdGlvbmFsIGFib3J0IHNpZ25hbFxuICAgICAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc0Z1dHVyZX0gb3ZlcnJpZGVzIC0gT3ZlcnJpZGUgb3B0aW9ucyBmb3IgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFJlcXVlc3RSZXN1bHQ8QXV0aE1GQVZlcmlmeVJlc3BvbnNlRGF0YSwgV2ViQXV0aG5FcnJvciB8IEF1dGhFcnJvcj4+fSBSZWdpc3RyYXRpb24gcmVzdWx0XG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXJlZ2lzdGVyaW5nLWEtbmV3LWNyZWRlbnRpYWwgVzNDIFdlYkF1dGhuIFNwZWMgLSBSZWdpc3RyYXRpb24gQ2VyZW1vbnl9XG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMgTUROIC0gUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc31cbiAgICAgKi9cbiAgICBhc3luYyBfcmVnaXN0ZXIoeyBmcmllbmRseU5hbWUsIHdlYmF1dGhuOiB7IHJwSWQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSA6IHVuZGVmaW5lZCwgcnBPcmlnaW5zID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyBbd2luZG93LmxvY2F0aW9uLm9yaWdpbl0gOiB1bmRlZmluZWQsIHNpZ25hbCwgfSA9IHt9LCB9LCBvdmVycmlkZXMpIHtcbiAgICAgICAgaWYgKCFycElkKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBBdXRoRXJyb3IoJ3JwSWQgaXMgcmVxdWlyZWQgZm9yIFdlYkF1dGhuIHJlZ2lzdHJhdGlvbicpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFicm93c2VyU3VwcG9ydHNXZWJBdXRobigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBBdXRoVW5rbm93bkVycm9yKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgV2ViQXV0aG4nLCBudWxsKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW5yb2xsIGZhY3RvclxuICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBmYWN0b3IsIGVycm9yOiBlbnJvbGxFcnJvciB9ID0gYXdhaXQgdGhpcy5fZW5yb2xsKHtcbiAgICAgICAgICAgICAgICBmcmllbmRseU5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghZmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQubWZhXG4gICAgICAgICAgICAgICAgICAgIC5saXN0RmFjdG9ycygpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChmYWN0b3JzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfYSA9IGZhY3RvcnMuZGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFsbC5maW5kKCh2KSA9PiB2LmZhY3Rvcl90eXBlID09PSAnd2ViYXV0aG4nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB2LmZyaWVuZGx5X25hbWUgPT09IGZyaWVuZGx5TmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdi5zdGF0dXMgIT09ICd1bnZlcmlmaWVkJyk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGZhY3RvcikgPT4gKGZhY3RvciA/IHRoaXMuY2xpZW50Lm1mYS51bmVucm9sbCh7IGZhY3RvcklkOiBmYWN0b3IgPT09IG51bGwgfHwgZmFjdG9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmYWN0b3IuaWQgfSkgOiB2b2lkIDApKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvcjogZW5yb2xsRXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdldCBjaGFsbGVuZ2UgYW5kIGNyZWF0ZSBjcmVkZW50aWFsXG4gICAgICAgICAgICBjb25zdCB7IGRhdGE6IGNoYWxsZW5nZVJlc3BvbnNlLCBlcnJvcjogY2hhbGxlbmdlRXJyb3IgfSA9IGF3YWl0IHRoaXMuX2NoYWxsZW5nZSh7XG4gICAgICAgICAgICAgICAgZmFjdG9ySWQ6IGZhY3Rvci5pZCxcbiAgICAgICAgICAgICAgICBmcmllbmRseU5hbWU6IGZhY3Rvci5mcmllbmRseV9uYW1lLFxuICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7IHJwSWQsIHJwT3JpZ2lucyB9LFxuICAgICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBjcmVhdGU6IG92ZXJyaWRlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFsbGVuZ2VSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiBjaGFsbGVuZ2VFcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeSh7XG4gICAgICAgICAgICAgICAgZmFjdG9ySWQ6IGZhY3Rvci5pZCxcbiAgICAgICAgICAgICAgICBjaGFsbGVuZ2VJZDogY2hhbGxlbmdlUmVzcG9uc2UuY2hhbGxlbmdlSWQsXG4gICAgICAgICAgICAgICAgd2ViYXV0aG46IHtcbiAgICAgICAgICAgICAgICAgICAgcnBJZCxcbiAgICAgICAgICAgICAgICAgICAgcnBPcmlnaW5zLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi50eXBlLFxuICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsX3Jlc3BvbnNlOiBjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi5jcmVkZW50aWFsX3Jlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignVW5leHBlY3RlZCBlcnJvciBpbiByZWdpc3RlcicsIGVycm9yKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJhdXRobi5qcy5tYXAiXSwibmFtZXMiOlsiX19yZXN0IiwiYmFzZTY0VXJsVG9VaW50OEFycmF5IiwiYnl0ZXNUb0Jhc2U2NFVSTCIsIkF1dGhFcnJvciIsIkF1dGhVbmtub3duRXJyb3IiLCJpc0F1dGhFcnJvciIsImlzQnJvd3NlciIsImlkZW50aWZ5QXV0aGVudGljYXRpb25FcnJvciIsImlkZW50aWZ5UmVnaXN0cmF0aW9uRXJyb3IiLCJpc1dlYkF1dGhuRXJyb3IiLCJXZWJBdXRobkVycm9yIiwiV2ViQXV0aG5Vbmtub3duRXJyb3IiLCJXZWJBdXRobkFib3J0U2VydmljZSIsImNyZWF0ZU5ld0Fib3J0U2lnbmFsIiwiY29udHJvbGxlciIsImFib3J0RXJyb3IiLCJFcnJvciIsIm5hbWUiLCJhYm9ydCIsIm5ld0NvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJzaWduYWwiLCJjYW5jZWxDZXJlbW9ueSIsInVuZGVmaW5lZCIsIndlYkF1dGhuQWJvcnRTZXJ2aWNlIiwiZGVzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zIiwib3B0aW9ucyIsIlB1YmxpY0tleUNyZWRlbnRpYWwiLCJwYXJzZUNyZWF0aW9uT3B0aW9uc0Zyb21KU09OIiwiY2hhbGxlbmdlIiwiY2hhbGxlbmdlU3RyIiwidXNlciIsInVzZXJPcHRzIiwiZXhjbHVkZUNyZWRlbnRpYWxzIiwicmVzdE9wdGlvbnMiLCJidWZmZXIiLCJPYmplY3QiLCJhc3NpZ24iLCJpZCIsInJlc3VsdCIsImxlbmd0aCIsIkFycmF5IiwiaSIsImNyZWQiLCJ0eXBlIiwidHJhbnNwb3J0cyIsImRlc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zIiwicGFyc2VSZXF1ZXN0T3B0aW9uc0Zyb21KU09OIiwiYWxsb3dDcmVkZW50aWFscyIsInNlcmlhbGl6ZUNyZWRlbnRpYWxDcmVhdGlvblJlc3BvbnNlIiwiY3JlZGVudGlhbCIsIl9hIiwidG9KU09OIiwiY3JlZGVudGlhbFdpdGhBdHRhY2htZW50IiwicmF3SWQiLCJyZXNwb25zZSIsImF0dGVzdGF0aW9uT2JqZWN0IiwiVWludDhBcnJheSIsImNsaWVudERhdGFKU09OIiwiY2xpZW50RXh0ZW5zaW9uUmVzdWx0cyIsImdldENsaWVudEV4dGVuc2lvblJlc3VsdHMiLCJhdXRoZW50aWNhdG9yQXR0YWNobWVudCIsInNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0UmVzcG9uc2UiLCJhc3NlcnRpb25SZXNwb25zZSIsImF1dGhlbnRpY2F0b3JEYXRhIiwic2lnbmF0dXJlIiwidXNlckhhbmRsZSIsImlzVmFsaWREb21haW4iLCJob3N0bmFtZSIsInRlc3QiLCJicm93c2VyU3VwcG9ydHNXZWJBdXRobiIsIl9iIiwid2luZG93IiwibmF2aWdhdG9yIiwiY3JlZGVudGlhbHMiLCJjcmVhdGUiLCJnZXQiLCJjcmVhdGVDcmVkZW50aWFsIiwiZGF0YSIsImVycm9yIiwiZXJyIiwiZ2V0Q3JlZGVudGlhbCIsIkRFRkFVTFRfQ1JFQVRJT05fT1BUSU9OUyIsImhpbnRzIiwiYXV0aGVudGljYXRvclNlbGVjdGlvbiIsInJlcXVpcmVSZXNpZGVudEtleSIsInVzZXJWZXJpZmljYXRpb24iLCJyZXNpZGVudEtleSIsImF0dGVzdGF0aW9uIiwiREVGQVVMVF9SRVFVRVNUX09QVElPTlMiLCJkZWVwTWVyZ2UiLCJzb3VyY2VzIiwiaXNPYmplY3QiLCJ2YWwiLCJpc0FycmF5IiwiaXNBcnJheUJ1ZmZlckxpa2UiLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsInNvdXJjZSIsImtleSIsInZhbHVlIiwiZXhpc3RpbmciLCJtZXJnZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMiLCJiYXNlT3B0aW9ucyIsIm92ZXJyaWRlcyIsIm1lcmdlQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zIiwiV2ViQXV0aG5BcGkiLCJjb25zdHJ1Y3RvciIsImNsaWVudCIsImVucm9sbCIsIl9lbnJvbGwiLCJiaW5kIiwiX2NoYWxsZW5nZSIsInZlcmlmeSIsIl92ZXJpZnkiLCJhdXRoZW50aWNhdGUiLCJfYXV0aGVudGljYXRlIiwicmVnaXN0ZXIiLCJfcmVnaXN0ZXIiLCJwYXJhbXMiLCJtZmEiLCJmYWN0b3JUeXBlIiwiZmFjdG9ySWQiLCJ3ZWJhdXRobiIsImZyaWVuZGx5TmFtZSIsImNoYWxsZW5nZVJlc3BvbnNlIiwiY2hhbGxlbmdlRXJyb3IiLCJhYm9ydFNpZ25hbCIsImNyZWRlbnRpYWxfb3B0aW9ucyIsInB1YmxpY0tleSIsImRpc3BsYXlOYW1lIiwiY2hhbGxlbmdlSWQiLCJjcmVkZW50aWFsX3Jlc3BvbnNlIiwicmVxdWVzdCIsInJwSWQiLCJsb2NhdGlvbiIsInJwT3JpZ2lucyIsIm9yaWdpbiIsImZhY3RvciIsImVucm9sbEVycm9yIiwibGlzdEZhY3RvcnMiLCJ0aGVuIiwiZmFjdG9ycyIsImFsbCIsImZpbmQiLCJ2IiwiZmFjdG9yX3R5cGUiLCJmcmllbmRseV9uYW1lIiwic3RhdHVzIiwidW5lbnJvbGwiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DEFAULT_CREATION_OPTIONS: () => (/* binding */ DEFAULT_CREATION_OPTIONS),\n/* harmony export */ DEFAULT_REQUEST_OPTIONS: () => (/* binding */ DEFAULT_REQUEST_OPTIONS),\n/* harmony export */ WebAuthnAbortService: () => (/* binding */ WebAuthnAbortService),\n/* harmony export */ WebAuthnApi: () => (/* binding */ WebAuthnApi),\n/* harmony export */ WebAuthnError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.WebAuthnError),\n/* harmony export */ createCredential: () => (/* binding */ createCredential),\n/* harmony export */ deserializeCredentialCreationOptions: () => (/* binding */ deserializeCredentialCreationOptions),\n/* harmony export */ deserializeCredentialRequestOptions: () => (/* binding */ deserializeCredentialRequestOptions),\n/* harmony export */ getCredential: () => (/* binding */ getCredential),\n/* harmony export */ identifyAuthenticationError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.identifyAuthenticationError),\n/* harmony export */ identifyRegistrationError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.identifyRegistrationError),\n/* harmony export */ isValidDomain: () => (/* binding */ isValidDomain),\n/* harmony export */ isWebAuthnError: () => (/* reexport safe */ _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__.isWebAuthnError),\n/* harmony export */ mergeCredentialCreationOptions: () => (/* binding */ mergeCredentialCreationOptions),\n/* harmony export */ mergeCredentialRequestOptions: () => (/* binding */ mergeCredentialRequestOptions),\n/* harmony export */ serializeCredentialCreationResponse: () => (/* binding */ serializeCredentialCreationResponse),\n/* harmony export */ serializeCredentialRequestResponse: () => (/* binding */ serializeCredentialRequestResponse),\n/* harmony export */ webAuthnAbortService: () => (/* binding */ webAuthnAbortService)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! tslib */ \"(rsc)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _base64url__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base64url */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/base64url.js\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./errors */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/errors.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/helpers.js\");\n/* harmony import */ var _webauthn_errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./webauthn.errors */ \"(rsc)/./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(...sources) {\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 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 /**\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({ factorId, webauthn, friendlyName, signal }, overrides) {\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 = `${user.id}:${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({ challengeId, factorId, webauthn }) {\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({ factorId, webauthn: { rpId = false ? 0 : undefined, rpOrigins = false ? 0 : undefined, signal } = {} }, overrides) {\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({ friendlyName, webauthn: { rpId = false ? 0 : undefined, rpOrigins = false ? 0 : undefined, signal } = {} }, overrides) {\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} //# sourceMappingURL=webauthn.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtanMvZGlzdC9tb2R1bGUvbGliL3dlYmF1dGhuLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQStCO0FBQ3VDO0FBQ0Y7QUFDOUI7QUFDNEc7QUFDaEQ7QUFDbEc7Ozs7OztDQU1DLEdBQ00sTUFBTVk7SUFDVDs7Ozs7O0tBTUMsR0FDREMsdUJBQXVCO1FBQ25CLDRGQUE0RjtRQUM1RixJQUFJLElBQUksQ0FBQ0MsVUFBVSxFQUFFO1lBQ2pCLE1BQU1DLGFBQWEsSUFBSUMsTUFBTTtZQUM3QkQsV0FBV0UsSUFBSSxHQUFHO1lBQ2xCLElBQUksQ0FBQ0gsVUFBVSxDQUFDSSxLQUFLLENBQUNIO1FBQzFCO1FBQ0EsTUFBTUksZ0JBQWdCLElBQUlDO1FBQzFCLElBQUksQ0FBQ04sVUFBVSxHQUFHSztRQUNsQixPQUFPQSxjQUFjRSxNQUFNO0lBQy9CO0lBQ0E7Ozs7O0tBS0MsR0FDREMsaUJBQWlCO1FBQ2IsSUFBSSxJQUFJLENBQUNSLFVBQVUsRUFBRTtZQUNqQixNQUFNQyxhQUFhLElBQUlDLE1BQU07WUFDN0JELFdBQVdFLElBQUksR0FBRztZQUNsQixJQUFJLENBQUNILFVBQVUsQ0FBQ0ksS0FBSyxDQUFDSDtZQUN0QixJQUFJLENBQUNELFVBQVUsR0FBR1M7UUFDdEI7SUFDSjtBQUNKO0FBQ0E7Ozs7O0NBS0MsR0FDTSxNQUFNQyx1QkFBdUIsSUFBSVosdUJBQXVCO0FBQy9EOzs7Ozs7OztDQVFDLEdBQ00sU0FBU2EscUNBQXFDQyxPQUFPO0lBQ3hELElBQUksQ0FBQ0EsU0FBUztRQUNWLE1BQU0sSUFBSVYsTUFBTTtJQUNwQjtJQUNBLHVFQUF1RTtJQUN2RSxJQUFJLE9BQU9XLHdCQUF3QixlQUMvQixrQ0FBa0NBLHVCQUNsQyxPQUFPQSxvQkFDRkMsNEJBQTRCLEtBQUssWUFBWTtRQUNsRCx5Q0FBeUM7UUFDekMsT0FBT0Qsb0JBQW9CQyw0QkFBNEIsQ0FDdkQs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T0FBTyxDQUFDO2dCQUNoQlEsVUFBVWdCLE9BQU9wRyxFQUFFO2dCQUNuQjZGLGFBQWFOLGtCQUFrQk0sV0FBVztnQkFDMUNSLFVBQVU7b0JBQ05XO29CQUNBRTtvQkFDQTVGLE1BQU1pRixrQkFBa0JGLFFBQVEsQ0FBQy9FLElBQUk7b0JBQ3JDd0YscUJBQXFCUCxrQkFBa0JGLFFBQVEsQ0FBQ1MsbUJBQW1CO2dCQUN2RTtZQUNKO1FBQ0osRUFDQSxPQUFPckQsT0FBTztZQUNWLElBQUkxRSxvREFBV0EsQ0FBQzBFLFFBQVE7Z0JBQ3BCLE9BQU87b0JBQUVELE1BQU07b0JBQU1DO2dCQUFNO1lBQy9CO1lBQ0EsT0FBTztnQkFDSEQsTUFBTTtnQkFDTkMsT0FBTyxJQUFJM0UscURBQWdCQSxDQUFDLGdDQUFnQzJFO1lBQ2hFO1FBQ0o7SUFDSjtBQUNKLEVBQ0Esb0NBQW9DIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWpzL2Rpc3QvbW9kdWxlL2xpYi93ZWJhdXRobi5qcz84OGNjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYmFzZTY0VXJsVG9VaW50OEFycmF5LCBieXRlc1RvQmFzZTY0VVJMIH0gZnJvbSAnLi9iYXNlNjR1cmwnO1xuaW1wb3J0IHsgQXV0aEVycm9yLCBBdXRoVW5rbm93bkVycm9yLCBpc0F1dGhFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGlzQnJvd3NlciB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBpZGVudGlmeUF1dGhlbnRpY2F0aW9uRXJyb3IsIGlkZW50aWZ5UmVnaXN0cmF0aW9uRXJyb3IsIGlzV2ViQXV0aG5FcnJvciwgV2ViQXV0aG5FcnJvciwgV2ViQXV0aG5Vbmtub3duRXJyb3IsIH0gZnJvbSAnLi93ZWJhdXRobi5lcnJvcnMnO1xuZXhwb3J0IHsgV2ViQXV0aG5FcnJvciwgaXNXZWJBdXRobkVycm9yLCBpZGVudGlmeVJlZ2lzdHJhdGlvbkVycm9yLCBpZGVudGlmeUF1dGhlbnRpY2F0aW9uRXJyb3IgfTtcbi8qKlxuICogV2ViQXV0aG4gYWJvcnQgc2VydmljZSB0byBtYW5hZ2UgY2VyZW1vbnkgY2FuY2VsbGF0aW9uLlxuICogRW5zdXJlcyBvbmx5IG9uZSBXZWJBdXRobiBjZXJlbW9ueSBpcyBhY3RpdmUgYXQgYSB0aW1lIHRvIHByZXZlbnQgXCJvcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzc1wiIGVycm9ycy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgY2xhc3MgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWF1dG9tYXRpb24td2ViZHJpdmVyLWNhcGFiaWxpdHkgVzNDIFdlYkF1dGhuIFNwZWMgLSBBYm9ydGluZyBDZXJlbW9uaWVzfVxuICovXG5leHBvcnQgY2xhc3MgV2ViQXV0aG5BYm9ydFNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBhYm9ydCBzaWduYWwgZm9yIGEgbmV3IFdlYkF1dGhuIG9wZXJhdGlvbi5cbiAgICAgKiBBdXRvbWF0aWNhbGx5IGNhbmNlbHMgYW55IGV4aXN0aW5nIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBYm9ydFNpZ25hbH0gU2lnbmFsIHRvIHBhc3MgdG8gbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpIG9yIC5nZXQoKVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BYm9ydFNpZ25hbCBNRE4gLSBBYm9ydFNpZ25hbH1cbiAgICAgKi9cbiAgICBjcmVhdGVOZXdBYm9ydFNpZ25hbCgpIHtcbiAgICAgICAgLy8gQWJvcnQgYW55IGV4aXN0aW5nIGNhbGxzIHRvIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKSBvciBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlcikge1xuICAgICAgICAgICAgY29uc3QgYWJvcnRFcnJvciA9IG5ldyBFcnJvcignQ2FuY2VsbGluZyBleGlzdGluZyBXZWJBdXRobiBBUEkgY2FsbCBmb3IgbmV3IG9uZScpO1xuICAgICAgICAgICAgYWJvcnRFcnJvci5uYW1lID0gJ0Fib3J0RXJyb3InO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KGFib3J0RXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IG5ld0NvbnRyb2xsZXI7XG4gICAgICAgIHJldHVybiBuZXdDb250cm9sbGVyLnNpZ25hbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgY2FuY2VsIHRoZSBjdXJyZW50IFdlYkF1dGhuIG9wZXJhdGlvbi5cbiAgICAgKiBVc2VmdWwgZm9yIGNsZWFuaW5nIHVwIHdoZW4gdXNlciBjYW5jZWxzIG9yIG5hdmlnYXRlcyBhd2F5LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlci9hYm9ydCBNRE4gLSBBYm9ydENvbnRyb2xsZXIuYWJvcnR9XG4gICAgICovXG4gICAgY2FuY2VsQ2VyZW1vbnkoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGFib3J0RXJyb3IgPSBuZXcgRXJyb3IoJ01hbnVhbGx5IGNhbmNlbGxpbmcgZXhpc3RpbmcgV2ViQXV0aG4gQVBJIGNhbGwnKTtcbiAgICAgICAgICAgIGFib3J0RXJyb3IubmFtZSA9ICdBYm9ydEVycm9yJztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5hYm9ydChhYm9ydEVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogU2luZ2xldG9uIGluc3RhbmNlIHRvIGVuc3VyZSBvbmx5IG9uZSBXZWJBdXRobiBjZXJlbW9ueSBpcyBhY3RpdmUgYXQgYSB0aW1lLlxuICogVGhpcyBwcmV2ZW50cyBcIm9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzXCIgZXJyb3JzIHdoZW4gcmV0cnlpbmcgV2ViQXV0aG4gb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgaW5zdGFuY2UgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICovXG5leHBvcnQgY29uc3Qgd2ViQXV0aG5BYm9ydFNlcnZpY2UgPSBuZXcgV2ViQXV0aG5BYm9ydFNlcnZpY2UoKTtcbi8qKlxuICogQ29udmVydCBiYXNlNjR1cmwgZW5jb2RlZCBzdHJpbmdzIGluIFdlYkF1dGhuIGNyZWRlbnRpYWwgY3JlYXRpb24gb3B0aW9ucyB0byBBcnJheUJ1ZmZlcnNcbiAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBXZWJBdXRobiBicm93c2VyIEFQSS5cbiAqIFN1cHBvcnRzIGJvdGggbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgcGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTiBhbmQgbWFudWFsIGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7U2VydmVyQ3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc30gb3B0aW9ucyAtIEpTT04gb3B0aW9ucyBmcm9tIHNlcnZlciB3aXRoIGJhc2U2NHVybCBlbmNvZGVkIGZpZWxkc1xuICogQHJldHVybnMge1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNGdXR1cmV9IE9wdGlvbnMgcmVhZHkgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoKVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXBhcnNlQ3JlYXRpb25PcHRpb25zRnJvbUpTT04gVzNDIFdlYkF1dGhuIFNwZWMgLSBwYXJzZUNyZWF0aW9uT3B0aW9uc0Zyb21KU09OfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDcmVkZW50aWFsIGNyZWF0aW9uIG9wdGlvbnMgYXJlIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIHRoZSBuYXRpdmUgcGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTiBtZXRob2QgaXMgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBQdWJsaWNLZXlDcmVkZW50aWFsICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAncGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTicgaW4gUHVibGljS2V5Q3JlZGVudGlhbCAmJlxuICAgICAgICB0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbFxuICAgICAgICAgICAgLnBhcnNlQ3JlYXRpb25PcHRpb25zRnJvbUpTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBuYXRpdmUgV2ViQXV0aG4gTGV2ZWwgMyBtZXRob2RcbiAgICAgICAgcmV0dXJuIFB1YmxpY0tleUNyZWRlbnRpYWwucGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTihcbiAgICAgICAgLyoqIHdlIGFzc2VydCB0aGUgb3B0aW9ucyBoZXJlIGFzIHR5cGVzY3JpcHQgc3RpbGwgZG9lc24ndCBrbm93IGFib3V0IGZ1dHVyZSB3ZWJhdXRobiB0eXBlcyAqL1xuICAgICAgICBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gbWFudWFsIHBhcnNpbmcgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgbmF0aXZlIG1ldGhvZFxuICAgIC8vIERlc3RydWN0dXJlIHRvIHNlcGFyYXRlIGZpZWxkcyB0aGF0IG5lZWQgdHJhbnNmb3JtYXRpb25cbiAgICBjb25zdCB7IGNoYWxsZW5nZTogY2hhbGxlbmdlU3RyLCB1c2VyOiB1c2VyT3B0cywgZXhjbHVkZUNyZWRlbnRpYWxzIH0gPSBvcHRpb25zLCByZXN0T3B0aW9ucyA9IF9fcmVzdChvcHRpb25zXG4gICAgLy8gQ29udmVydCBjaGFsbGVuZ2UgZnJvbSBiYXNlNjR1cmwgdG8gQXJyYXlCdWZmZXJcbiAgICAsIFtcImNoYWxsZW5nZVwiLCBcInVzZXJcIiwgXCJleGNsdWRlQ3JlZGVudGlhbHNcIl0pO1xuICAgIC8vIENvbnZlcnQgY2hhbGxlbmdlIGZyb20gYmFzZTY0dXJsIHRvIEFycmF5QnVmZmVyXG4gICAgY29uc3QgY2hhbGxlbmdlID0gYmFzZTY0VXJsVG9VaW50OEFycmF5KGNoYWxsZW5nZVN0cikuYnVmZmVyO1xuICAgIC8vIENvbnZlcnQgdXNlci5pZCBmcm9tIGJhc2U2NHVybCB0byBBcnJheUJ1ZmZlclxuICAgIGNvbnN0IHVzZXIgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHVzZXJPcHRzKSwgeyBpZDogYmFzZTY0VXJsVG9VaW50OEFycmF5KHVzZXJPcHRzLmlkKS5idWZmZXIgfSk7XG4gICAgLy8gQnVpbGQgdGhlIHJlc3VsdCBvYmplY3RcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3RPcHRpb25zKSwgeyBjaGFsbGVuZ2UsXG4gICAgICAgIHVzZXIgfSk7XG4gICAgLy8gT25seSBhZGQgZXhjbHVkZUNyZWRlbnRpYWxzIGlmIGl0IGV4aXN0c1xuICAgIGlmIChleGNsdWRlQ3JlZGVudGlhbHMgJiYgZXhjbHVkZUNyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LmV4Y2x1ZGVDcmVkZW50aWFscyA9IG5ldyBBcnJheShleGNsdWRlQ3JlZGVudGlhbHMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGNsdWRlQ3JlZGVudGlhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNyZWQgPSBleGNsdWRlQ3JlZGVudGlhbHNbaV07XG4gICAgICAgICAgICByZXN1bHQuZXhjbHVkZUNyZWRlbnRpYWxzW2ldID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjcmVkKSwgeyBpZDogYmFzZTY0VXJsVG9VaW50OEFycmF5KGNyZWQuaWQpLmJ1ZmZlciwgdHlwZTogY3JlZC50eXBlIHx8ICdwdWJsaWMta2V5JywgXG4gICAgICAgICAgICAgICAgLy8gQ2FzdCB0cmFuc3BvcnRzIHRvIGhhbmRsZSBmdXR1cmUgdHJhbnNwb3J0IHR5cGVzIGxpa2UgXCJjYWJsZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNwb3J0czogY3JlZC50cmFuc3BvcnRzIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvbnZlcnQgYmFzZTY0dXJsIGVuY29kZWQgc3RyaW5ncyBpbiBXZWJBdXRobiBjcmVkZW50aWFsIHJlcXVlc3Qgb3B0aW9ucyB0byBBcnJheUJ1ZmZlcnNcbiAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBXZWJBdXRobiBicm93c2VyIEFQSS5cbiAqIFN1cHBvcnRzIGJvdGggbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgcGFyc2VSZXF1ZXN0T3B0aW9uc0Zyb21KU09OIGFuZCBtYW51YWwgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIHtTZXJ2ZXJDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnN9IG9wdGlvbnMgLSBKU09OIG9wdGlvbnMgZnJvbSBzZXJ2ZXIgd2l0aCBiYXNlNjR1cmwgZW5jb2RlZCBmaWVsZHNcbiAqIEByZXR1cm5zIHtQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnNGdXR1cmV9IE9wdGlvbnMgcmVhZHkgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoKVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTiBXM0MgV2ViQXV0aG4gU3BlYyAtIHBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplQ3JlZGVudGlhbFJlcXVlc3RPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDcmVkZW50aWFsIHJlcXVlc3Qgb3B0aW9ucyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgdGhlIG5hdGl2ZSBwYXJzZVJlcXVlc3RPcHRpb25zRnJvbUpTT04gbWV0aG9kIGlzIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgJ3BhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTicgaW4gUHVibGljS2V5Q3JlZGVudGlhbCAmJlxuICAgICAgICB0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbFxuICAgICAgICAgICAgLnBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBXZWJBdXRobiBMZXZlbCAzIG1ldGhvZFxuICAgICAgICByZXR1cm4gUHVibGljS2V5Q3JlZGVudGlhbC5wYXJzZVJlcXVlc3RPcHRpb25zRnJvbUpTT04ob3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG1hbnVhbCBwYXJzaW5nIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlIG5hdGl2ZSBtZXRob2RcbiAgICAvLyBEZXN0cnVjdHVyZSB0byBzZXBhcmF0ZSBmaWVsZHMgdGhhdCBuZWVkIHRyYW5zZm9ybWF0aW9uXG4gICAgY29uc3QgeyBjaGFsbGVuZ2U6IGNoYWxsZW5nZVN0ciwgYWxsb3dDcmVkZW50aWFscyB9ID0gb3B0aW9ucywgcmVzdE9wdGlvbnMgPSBfX3Jlc3Qob3B0aW9uc1xuICAgIC8vIENvbnZlcnQgY2hhbGxlbmdlIGZyb20gYmFzZTY0dXJsIHRvIEFycmF5QnVmZmVyXG4gICAgLCBbXCJjaGFsbGVuZ2VcIiwgXCJhbGxvd0NyZWRlbnRpYWxzXCJdKTtcbiAgICAvLyBDb252ZXJ0IGNoYWxsZW5nZSBmcm9tIGJhc2U2NHVybCB0byBBcnJheUJ1ZmZlclxuICAgIGNvbnN0IGNoYWxsZW5nZSA9IGJhc2U2NFVybFRvVWludDhBcnJheShjaGFsbGVuZ2VTdHIpLmJ1ZmZlcjtcbiAgICAvLyBCdWlsZCB0aGUgcmVzdWx0IG9iamVjdFxuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdE9wdGlvbnMpLCB7IGNoYWxsZW5nZSB9KTtcbiAgICAvLyBPbmx5IGFkZCBhbGxvd0NyZWRlbnRpYWxzIGlmIGl0IGV4aXN0c1xuICAgIGlmIChhbGxvd0NyZWRlbnRpYWxzICYmIGFsbG93Q3JlZGVudGlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuYWxsb3dDcmVkZW50aWFscyA9IG5ldyBBcnJheShhbGxvd0NyZWRlbnRpYWxzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsb3dDcmVkZW50aWFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY3JlZCA9IGFsbG93Q3JlZGVudGlhbHNbaV07XG4gICAgICAgICAgICByZXN1bHQuYWxsb3dDcmVkZW50aWFsc1tpXSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY3JlZCksIHsgaWQ6IGJhc2U2NFVybFRvVWludDhBcnJheShjcmVkLmlkKS5idWZmZXIsIHR5cGU6IGNyZWQudHlwZSB8fCAncHVibGljLWtleScsIFxuICAgICAgICAgICAgICAgIC8vIENhc3QgdHJhbnNwb3J0cyB0byBoYW5kbGUgZnV0dXJlIHRyYW5zcG9ydCB0eXBlcyBsaWtlIFwiY2FibGVcIlxuICAgICAgICAgICAgICAgIHRyYW5zcG9ydHM6IGNyZWQudHJhbnNwb3J0cyB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgcmVnaXN0cmF0aW9uL2Vucm9sbG1lbnQgY3JlZGVudGlhbCByZXNwb25zZSB0byBzZXJ2ZXIgZm9ybWF0LlxuICogU2VyaWFsaXplcyBiaW5hcnkgZmllbGRzIHRvIGJhc2U2NHVybCBmb3IgSlNPTiB0cmFuc21pc3Npb24uXG4gKiBTdXBwb3J0cyBib3RoIG5hdGl2ZSBXZWJBdXRobiBMZXZlbCAzIHRvSlNPTiBhbmQgbWFudWFsIGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7UmVnaXN0cmF0aW9uQ3JlZGVudGlhbH0gY3JlZGVudGlhbCAtIENyZWRlbnRpYWwgZnJvbSBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKClcbiAqIEByZXR1cm5zIHtSZWdpc3RyYXRpb25SZXNwb25zZUpTT059IEpTT04tc2VyaWFsaXphYmxlIGNyZWRlbnRpYWwgZm9yIHNlcnZlclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNkb20tcHVibGlja2V5Y3JlZGVudGlhbC10b2pzb24gVzNDIFdlYkF1dGhuIFNwZWMgLSB0b0pTT059XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25SZXNwb25zZShjcmVkZW50aWFsKSB7XG4gICAgdmFyIF9hO1xuICAgIC8vIENoZWNrIGlmIHRoZSBjcmVkZW50aWFsIGluc3RhbmNlIGhhcyB0aGUgdG9KU09OIG1ldGhvZFxuICAgIGlmICgndG9KU09OJyBpbiBjcmVkZW50aWFsICYmIHR5cGVvZiBjcmVkZW50aWFsLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBXZWJBdXRobiBMZXZlbCAzIG1ldGhvZFxuICAgICAgICByZXR1cm4gY3JlZGVudGlhbC50b0pTT04oKTtcbiAgICB9XG4gICAgY29uc3QgY3JlZGVudGlhbFdpdGhBdHRhY2htZW50ID0gY3JlZGVudGlhbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogY3JlZGVudGlhbC5pZCxcbiAgICAgICAgcmF3SWQ6IGNyZWRlbnRpYWwuaWQsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICBhdHRlc3RhdGlvbk9iamVjdDogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShjcmVkZW50aWFsLnJlc3BvbnNlLmF0dGVzdGF0aW9uT2JqZWN0KSksXG4gICAgICAgICAgICBjbGllbnREYXRhSlNPTjogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShjcmVkZW50aWFsLnJlc3BvbnNlLmNsaWVudERhdGFKU09OKSksXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdwdWJsaWMta2V5JyxcbiAgICAgICAgY2xpZW50RXh0ZW5zaW9uUmVzdWx0czogY3JlZGVudGlhbC5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCksXG4gICAgICAgIC8vIENvbnZlcnQgbnVsbCB0byB1bmRlZmluZWQgYW5kIGNhc3QgdG8gQXV0aGVudGljYXRvckF0dGFjaG1lbnQgdHlwZVxuICAgICAgICBhdXRoZW50aWNhdG9yQXR0YWNobWVudDogKChfYSA9IGNyZWRlbnRpYWxXaXRoQXR0YWNobWVudC5hdXRoZW50aWNhdG9yQXR0YWNobWVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdW5kZWZpbmVkKSxcbiAgICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0IGFuIGF1dGhlbnRpY2F0aW9uL3ZlcmlmaWNhdGlvbiBjcmVkZW50aWFsIHJlc3BvbnNlIHRvIHNlcnZlciBmb3JtYXQuXG4gKiBTZXJpYWxpemVzIGJpbmFyeSBmaWVsZHMgdG8gYmFzZTY0dXJsIGZvciBKU09OIHRyYW5zbWlzc2lvbi5cbiAqIFN1cHBvcnRzIGJvdGggbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgdG9KU09OIGFuZCBtYW51YWwgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIHtBdXRoZW50aWNhdGlvbkNyZWRlbnRpYWx9IGNyZWRlbnRpYWwgLSBDcmVkZW50aWFsIGZyb20gbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCgpXG4gKiBAcmV0dXJucyB7QXV0aGVudGljYXRpb25SZXNwb25zZUpTT059IEpTT04tc2VyaWFsaXphYmxlIGNyZWRlbnRpYWwgZm9yIHNlcnZlclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNkb20tcHVibGlja2V5Y3JlZGVudGlhbC10b2pzb24gVzNDIFdlYkF1dGhuIFNwZWMgLSB0b0pTT059XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdFJlc3BvbnNlKGNyZWRlbnRpYWwpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNyZWRlbnRpYWwgaW5zdGFuY2UgaGFzIHRoZSB0b0pTT04gbWV0aG9kXG4gICAgaWYgKCd0b0pTT04nIGluIGNyZWRlbnRpYWwgJiYgdHlwZW9mIGNyZWRlbnRpYWwudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIFdlYkF1dGhuIExldmVsIDMgbWV0aG9kXG4gICAgICAgIHJldHVybiBjcmVkZW50aWFsLnRvSlNPTigpO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBtYW51YWwgY29udmVyc2lvbiBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRvSlNPTlxuICAgIC8vIEFjY2VzcyBhdXRoZW50aWNhdG9yQXR0YWNobWVudCB2aWEgdHlwZSBhc3NlcnRpb24gdG8gaGFuZGxlIFR5cGVTY3JpcHQgdmVyc2lvbiBkaWZmZXJlbmNlc1xuICAgIC8vIEBzaW1wbGV3ZWJhdXRobi90eXBlcyBpbmNsdWRlcyB0aGlzIHByb3BlcnR5IGJ1dCBiYXNlIFR5cGVTY3JpcHQgNC43LjQgZG9lc24ndFxuICAgIGNvbnN0IGNyZWRlbnRpYWxXaXRoQXR0YWNobWVudCA9IGNyZWRlbnRpYWw7XG4gICAgY29uc3QgY2xpZW50RXh0ZW5zaW9uUmVzdWx0cyA9IGNyZWRlbnRpYWwuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpO1xuICAgIGNvbnN0IGFzc2VydGlvblJlc3BvbnNlID0gY3JlZGVudGlhbC5yZXNwb25zZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogY3JlZGVudGlhbC5pZCxcbiAgICAgICAgcmF3SWQ6IGNyZWRlbnRpYWwuaWQsIC8vIFczQyBzcGVjIGV4cGVjdHMgcmF3SWQgdG8gbWF0Y2ggaWQgZm9yIEpTT04gZm9ybWF0XG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICBhdXRoZW50aWNhdG9yRGF0YTogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShhc3NlcnRpb25SZXNwb25zZS5hdXRoZW50aWNhdG9yRGF0YSkpLFxuICAgICAgICAgICAgY2xpZW50RGF0YUpTT046IGJ5dGVzVG9CYXNlNjRVUkwobmV3IFVpbnQ4QXJyYXkoYXNzZXJ0aW9uUmVzcG9uc2UuY2xpZW50RGF0YUpTT04pKSxcbiAgICAgICAgICAgIHNpZ25hdHVyZTogYnl0ZXNUb0Jhc2U2NFVSTChuZXcgVWludDhBcnJheShhc3NlcnRpb25SZXNwb25zZS5zaWduYXR1cmUpKSxcbiAgICAgICAgICAgIHVzZXJIYW5kbGU6IGFzc2VydGlvblJlc3BvbnNlLnVzZXJIYW5kbGVcbiAgICAgICAgICAgICAgICA/IGJ5dGVzVG9CYXNlNjRVUkwobmV3IFVpbnQ4QXJyYXkoYXNzZXJ0aW9uUmVzcG9uc2UudXNlckhhbmRsZSkpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdwdWJsaWMta2V5JyxcbiAgICAgICAgY2xpZW50RXh0ZW5zaW9uUmVzdWx0cyxcbiAgICAgICAgLy8gQ29udmVydCBudWxsIHRvIHVuZGVmaW5lZCBhbmQgY2FzdCB0byBBdXRoZW50aWNhdG9yQXR0YWNobWVudCB0eXBlXG4gICAgICAgIGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OiAoKF9hID0gY3JlZGVudGlhbFdpdGhBdHRhY2htZW50LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQpLFxuICAgIH07XG59XG4vKipcbiAqIEEgc2ltcGxlIHRlc3QgdG8gZGV0ZXJtaW5lIGlmIGEgaG9zdG5hbWUgaXMgYSBwcm9wZXJseS1mb3JtYXR0ZWQgZG9tYWluIG5hbWUuXG4gKiBDb25zaWRlcnMgbG9jYWxob3N0IHZhbGlkIGZvciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gKlxuICogQSBcInZhbGlkIGRvbWFpblwiIGlzIGRlZmluZWQgaGVyZTogaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN2YWxpZC1kb21haW5cbiAqXG4gKiBSZWdleCBzb3VyY2VkIGZyb20gaGVyZTpcbiAqIGh0dHBzOi8vd3d3Lm9yZWlsbHkuY29tL2xpYnJhcnkvdmlldy9yZWd1bGFyLWV4cHJlc3Npb25zLWNvb2tib29rLzk3ODE0NDkzMjc0NTMvY2gwOHMxNS5odG1sXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhvc3RuYW1lIC0gVGhlIGhvc3RuYW1lIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWxpZCBkb21haW4gb3IgbG9jYWxob3N0XG4gKiBAc2VlIHtAbGluayBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3ZhbGlkLWRvbWFpbiBXSEFUV0cgVVJMIFNwZWMgLSBWYWxpZCBEb21haW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRG9tYWluKGhvc3RuYW1lKSB7XG4gICAgcmV0dXJuIChcbiAgICAvLyBDb25zaWRlciBsb2NhbGhvc3QgdmFsaWQgYXMgd2VsbCBzaW5jZSBpdCdzIG9rYXkgd3J0IFNlY3VyZSBDb250ZXh0c1xuICAgIGhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fCAvXihbYS16MC05XSsoLVthLXowLTldKykqXFwuKStbYS16XXsyLH0kL2kudGVzdChob3N0bmFtZSkpO1xufVxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGJyb3dzZXIgaXMgY2FwYWJsZSBvZiBXZWJBdXRobi5cbiAqIENoZWNrcyBmb3IgbmVjZXNzYXJ5IFdlYiBBUElzOiBQdWJsaWNLZXlDcmVkZW50aWFsIGFuZCBDcmVkZW50aWFsIE1hbmFnZW1lbnQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYnJvd3NlciBzdXBwb3J0cyBXZWJBdXRoblxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1B1YmxpY0tleUNyZWRlbnRpYWwjYnJvd3Nlcl9jb21wYXRpYmlsaXR5IE1ETiAtIFB1YmxpY0tleUNyZWRlbnRpYWwgQnJvd3NlciBDb21wYXRpYmlsaXR5fVxuICovXG5mdW5jdGlvbiBicm93c2VyU3VwcG9ydHNXZWJBdXRobigpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiAhIShpc0Jyb3dzZXIoKSAmJlxuICAgICAgICAnUHVibGljS2V5Q3JlZGVudGlhbCcgaW4gd2luZG93ICYmXG4gICAgICAgIHdpbmRvdy5QdWJsaWNLZXlDcmVkZW50aWFsICYmXG4gICAgICAgICdjcmVkZW50aWFscycgaW4gbmF2aWdhdG9yICYmXG4gICAgICAgIHR5cGVvZiAoKF9hID0gbmF2aWdhdG9yID09PSBudWxsIHx8IG5hdmlnYXRvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yLmNyZWRlbnRpYWxzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY3JlYXRlKSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgKChfYiA9IG5hdmlnYXRvciA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5hdmlnYXRvci5jcmVkZW50aWFscykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmdldCkgPT09ICdmdW5jdGlvbicpO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBXZWJBdXRobiBjcmVkZW50aWFsIHVzaW5nIHRoZSBicm93c2VyJ3MgY3JlZGVudGlhbHMgQVBJLlxuICogV3JhcHMgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZSgpIHdpdGggZXJyb3IgaGFuZGxpbmcuXG4gKlxuICogQHBhcmFtIHtDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBpbmNsdWRpbmcgcHVibGljS2V5IHBhcmFtZXRlcnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlcXVlc3RSZXN1bHQ8UmVnaXN0cmF0aW9uQ3JlZGVudGlhbCwgV2ViQXV0aG5FcnJvcj4+fSBDcmVhdGVkIGNyZWRlbnRpYWwgb3IgZXJyb3JcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1jcmVhdGVDcmVkZW50aWFsIFczQyBXZWJBdXRobiBTcGVjIC0gQ3JlYXRlIENyZWRlbnRpYWx9XG4gKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3JlZGVudGlhbHNDb250YWluZXIvY3JlYXRlIE1ETiAtIGNyZWRlbnRpYWxzLmNyZWF0ZX1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNyZWRlbnRpYWwob3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZShcbiAgICAgICAgLyoqIHdlIGFzc2VydCB0aGUgdHlwZSBoZXJlIHVudGlsIHR5cGVzY3JpcHQgdHlwZXMgYXJlIHVwZGF0ZWQgKi9cbiAgICAgICAgb3B0aW9ucyk7XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IFdlYkF1dGhuVW5rbm93bkVycm9yKCdFbXB0eSBjcmVkZW50aWFsIHJlc3BvbnNlJywgcmVzcG9uc2UpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShyZXNwb25zZSBpbnN0YW5jZW9mIFB1YmxpY0tleUNyZWRlbnRpYWwpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBXZWJBdXRoblVua25vd25FcnJvcignQnJvd3NlciByZXR1cm5lZCB1bmV4cGVjdGVkIGNyZWRlbnRpYWwgdHlwZScsIHJlc3BvbnNlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzcG9uc2UsIGVycm9yOiBudWxsIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICBlcnJvcjogaWRlbnRpZnlSZWdpc3RyYXRpb25FcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG4gKiBHZXQgYSBXZWJBdXRobiBjcmVkZW50aWFsIHVzaW5nIHRoZSBicm93c2VyJ3MgY3JlZGVudGlhbHMgQVBJLlxuICogV3JhcHMgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCgpIHdpdGggZXJyb3IgaGFuZGxpbmcuXG4gKlxuICogQHBhcmFtIHtDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGluY2x1ZGluZyBwdWJsaWNLZXkgcGFyYW1ldGVyc1xuICogQHJldHVybnMge1Byb21pc2U8UmVxdWVzdFJlc3VsdDxBdXRoZW50aWNhdGlvbkNyZWRlbnRpYWwsIFdlYkF1dGhuRXJyb3I+Pn0gUmV0cmlldmVkIGNyZWRlbnRpYWwgb3IgZXJyb3JcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1nZXRBc3NlcnRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBHZXQgQXNzZXJ0aW9ufVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NyZWRlbnRpYWxzQ29udGFpbmVyL2dldCBNRE4gLSBjcmVkZW50aWFscy5nZXR9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDcmVkZW50aWFsKG9wdGlvbnMpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoXG4gICAgICAgIC8qKiB3ZSBhc3NlcnQgdGhlIHR5cGUgaGVyZSB1bnRpbCB0eXBlc2NyaXB0IHR5cGVzIGFyZSB1cGRhdGVkICovXG4gICAgICAgIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBXZWJBdXRoblVua25vd25FcnJvcignRW1wdHkgY3JlZGVudGlhbCByZXNwb25zZScsIHJlc3BvbnNlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocmVzcG9uc2UgaW5zdGFuY2VvZiBQdWJsaWNLZXlDcmVkZW50aWFsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgV2ViQXV0aG5Vbmtub3duRXJyb3IoJ0Jyb3dzZXIgcmV0dXJuZWQgdW5leHBlY3RlZCBjcmVkZW50aWFsIHR5cGUnLCByZXNwb25zZSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3BvbnNlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgZXJyb3I6IGlkZW50aWZ5QXV0aGVudGljYXRpb25FcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ1JFQVRJT05fT1BUSU9OUyA9IHtcbiAgICBoaW50czogWydzZWN1cml0eS1rZXknXSxcbiAgICBhdXRoZW50aWNhdG9yU2VsZWN0aW9uOiB7XG4gICAgICAgIGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OiAnY3Jvc3MtcGxhdGZvcm0nLFxuICAgICAgICByZXF1aXJlUmVzaWRlbnRLZXk6IGZhbHNlLFxuICAgICAgICAvKiogc2V0IHRvIHByZWZlcnJlZCBiZWNhdXNlIG9sZGVyIHl1YmlrZXlzIGRvbid0IGhhdmUgUElOL0Jpb21ldHJpYyAqL1xuICAgICAgICB1c2VyVmVyaWZpY2F0aW9uOiAncHJlZmVycmVkJyxcbiAgICAgICAgcmVzaWRlbnRLZXk6ICdkaXNjb3VyYWdlZCcsXG4gICAgfSxcbiAgICBhdHRlc3RhdGlvbjogJ2RpcmVjdCcsXG59O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVRVUVTVF9PUFRJT05TID0ge1xuICAgIC8qKiBzZXQgdG8gcHJlZmVycmVkIGJlY2F1c2Ugb2xkZXIgeXViaWtleXMgZG9uJ3QgaGF2ZSBQSU4vQmlvbWV0cmljICovXG4gICAgdXNlclZlcmlmaWNhdGlvbjogJ3ByZWZlcnJlZCcsXG4gICAgaGludHM6IFsnc2VjdXJpdHkta2V5J10sXG4gICAgYXR0ZXN0YXRpb246ICdkaXJlY3QnLFxufTtcbmZ1bmN0aW9uIGRlZXBNZXJnZSguLi5zb3VyY2VzKSB7XG4gICAgY29uc3QgaXNPYmplY3QgPSAodmFsKSA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcbiAgICBjb25zdCBpc0FycmF5QnVmZmVyTGlrZSA9ICh2YWwpID0+IHZhbCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgaWYgKCFzb3VyY2UpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZSBhcnJheSByZWZlcmVuY2UsIGluY2x1ZGluZyB1bmlvbnMgbGlrZSBBdXRoZW50aWNhdG9yVHJhbnNwb3J0W11cbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUJ1ZmZlckxpa2UodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gcmVzdWx0W2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGV4aXN0aW5nKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGRlZXBNZXJnZShleGlzdGluZywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBkZWVwTWVyZ2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogTWVyZ2VzIFdlYkF1dGhuIGNyZWRlbnRpYWwgY3JlYXRpb24gb3B0aW9ucyB3aXRoIG92ZXJyaWRlcy5cbiAqIFNldHMgc2Vuc2libGUgZGVmYXVsdHMgZm9yIGF1dGhlbnRpY2F0b3Igc2VsZWN0aW9uIGFuZCBleHRlbnNpb25zLlxuICpcbiAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9uc0Z1dHVyZX0gYmFzZU9wdGlvbnMgLSBUaGUgYmFzZSBvcHRpb25zIGZyb20gdGhlIHNlcnZlclxuICogQHBhcmFtIHtQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zRnV0dXJlfSBvdmVycmlkZXMgLSBPcHRpb25hbCBvdmVycmlkZXMgdG8gYXBwbHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBmcmllbmRseU5hbWUgLSBPcHRpb25hbCBmcmllbmRseSBuYW1lIGZvciB0aGUgY3JlZGVudGlhbFxuICogQHJldHVybnMge1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNGdXR1cmV9IE1lcmdlZCBjcmVkZW50aWFsIGNyZWF0aW9uIG9wdGlvbnNcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jZGljdGRlZi1hdXRoZW50aWNhdG9yc2VsZWN0aW9uY3JpdGVyaWEgVzNDIFdlYkF1dGhuIFNwZWMgLSBBdXRoZW50aWNhdG9yU2VsZWN0aW9uQ3JpdGVyaWF9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnMoYmFzZU9wdGlvbnMsIG92ZXJyaWRlcykge1xuICAgIHJldHVybiBkZWVwTWVyZ2UoREVGQVVMVF9DUkVBVElPTl9PUFRJT05TLCBiYXNlT3B0aW9ucywgb3ZlcnJpZGVzIHx8IHt9KTtcbn1cbi8qKlxuICogTWVyZ2VzIFdlYkF1dGhuIGNyZWRlbnRpYWwgcmVxdWVzdCBvcHRpb25zIHdpdGggb3ZlcnJpZGVzLlxuICogU2V0cyBzZW5zaWJsZSBkZWZhdWx0cyBmb3IgdXNlciB2ZXJpZmljYXRpb24gYW5kIGhpbnRzLlxuICpcbiAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBiYXNlT3B0aW9ucyAtIFRoZSBiYXNlIG9wdGlvbnMgZnJvbSB0aGUgc2VydmVyXG4gKiBAcGFyYW0ge1B1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9uc0Z1dHVyZX0gb3ZlcnJpZGVzIC0gT3B0aW9uYWwgb3ZlcnJpZGVzIHRvIGFwcGx5XG4gKiBAcmV0dXJucyB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBNZXJnZWQgY3JlZGVudGlhbCByZXF1ZXN0IG9wdGlvbnNcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jZGljdGRlZi1wdWJsaWNrZXljcmVkZW50aWFscmVxdWVzdG9wdGlvbnMgVzNDIFdlYkF1dGhuIFNwZWMgLSBQdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyhiYXNlT3B0aW9ucywgb3ZlcnJpZGVzKSB7XG4gICAgcmV0dXJuIGRlZXBNZXJnZShERUZBVUxUX1JFUVVFU1RfT1BUSU9OUywgYmFzZU9wdGlvbnMsIG92ZXJyaWRlcyB8fCB7fSk7XG59XG4vKipcbiAqIFdlYkF1dGhuIEFQSSB3cmFwcGVyIGZvciBTdXBhYmFzZSBBdXRoLlxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgZW5yb2xsaW5nLCBjaGFsbGVuZ2luZywgdmVyaWZ5aW5nLCBhdXRoZW50aWNhdGluZywgYW5kIHJlZ2lzdGVyaW5nIFdlYkF1dGhuIGNyZWRlbnRpYWxzLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBBUEkgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyBXM0MgV2ViQXV0aG4gU3BlY2lmaWNhdGlvbn1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfQXV0aGVudGljYXRpb25fQVBJIE1ETiAtIFdlYiBBdXRoZW50aWNhdGlvbiBBUEl9XG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJBdXRobkFwaSB7XG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgICAgICAvLyBCaW5kIGFsbCBtZXRob2RzIHNvIHRoZXkgY2FuIGJlIGRlc3RydWN0dXJlZFxuICAgICAgICB0aGlzLmVucm9sbCA9IHRoaXMuX2Vucm9sbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNoYWxsZW5nZSA9IHRoaXMuX2NoYWxsZW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnZlcmlmeSA9IHRoaXMuX3ZlcmlmeS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZSA9IHRoaXMuX2F1dGhlbnRpY2F0ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5fcmVnaXN0ZXIuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5yb2xsIGEgbmV3IFdlYkF1dGhuIGZhY3Rvci5cbiAgICAgKiBDcmVhdGVzIGFuIHVudmVyaWZpZWQgV2ViQXV0aG4gZmFjdG9yIHRoYXQgbXVzdCBiZSB2ZXJpZmllZCB3aXRoIGEgY3JlZGVudGlhbC5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWwgVGhpcyBtZXRob2QgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICAgICAqIEBwYXJhbSB7T21pdDxNRkFFbnJvbGxXZWJhdXRoblBhcmFtcywgJ2ZhY3RvclR5cGUnPn0gcGFyYW1zIC0gRW5yb2xsbWVudCBwYXJhbWV0ZXJzIChmcmllbmRseU5hbWUgcmVxdWlyZWQpXG4gICAgICogQHJldHVybnMge1Byb21pc2U8QXV0aE1GQUVucm9sbFdlYmF1dGhuUmVzcG9uc2U+fSBFbnJvbGxlZCBmYWN0b3IgZGV0YWlscyBvciBlcnJvclxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1yZWdpc3RlcmluZy1hLW5ldy1jcmVkZW50aWFsIFczQyBXZWJBdXRobiBTcGVjIC0gUmVnaXN0ZXJpbmcgYSBOZXcgQ3JlZGVudGlhbH1cbiAgICAgKi9cbiAgICBhc3luYyBfZW5yb2xsKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQubWZhLmVucm9sbChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyksIHsgZmFjdG9yVHlwZTogJ3dlYmF1dGhuJyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYWxsZW5nZSBmb3IgV2ViQXV0aG4gY3JlZGVudGlhbCBjcmVhdGlvbiBvciBhdXRoZW50aWNhdGlvbi5cbiAgICAgKiBDb21iaW5lcyBzZXJ2ZXIgY2hhbGxlbmdlIHdpdGggYnJvd3NlciBjcmVkZW50aWFsIG9wZXJhdGlvbnMuXG4gICAgICogSGFuZGxlcyBib3RoIHJlZ2lzdHJhdGlvbiAoY3JlYXRlKSBhbmQgYXV0aGVudGljYXRpb24gKHJlcXVlc3QpIGZsb3dzLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbCBUaGlzIG1ldGhvZCBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHJlbGVhc2VzXG4gICAgICogQHBhcmFtIHtNRkFDaGFsbGVuZ2VXZWJhdXRoblBhcmFtcyAmIHsgZnJpZW5kbHlOYW1lPzogc3RyaW5nOyBzaWduYWw/OiBBYm9ydFNpZ25hbCB9fSBwYXJhbXMgLSBDaGFsbGVuZ2UgcGFyYW1ldGVycyBpbmNsdWRpbmcgZmFjdG9ySWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3ZlcnJpZGVzIC0gQWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gbmF2aWdhdG9yLmNyZWRlbnRpYWxzXG4gICAgICogQHBhcmFtIHtQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zRnV0dXJlfSBvdmVycmlkZXMuY3JlYXRlIC0gT3ZlcnJpZGUgb3B0aW9ucyBmb3IgY3JlZGVudGlhbCBjcmVhdGlvblxuICAgICAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBvdmVycmlkZXMucmVxdWVzdCAtIE92ZXJyaWRlIG9wdGlvbnMgZm9yIGNyZWRlbnRpYWwgcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFJlcXVlc3RSZXN1bHQ+fSBDaGFsbGVuZ2UgcmVzcG9uc2Ugd2l0aCBjcmVkZW50aWFsIG9yIGVycm9yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLWNyZWRlbnRpYWwtY3JlYXRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBDcmVkZW50aWFsIENyZWF0aW9ufVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi12ZXJpZnlpbmctYXNzZXJ0aW9uIFczQyBXZWJBdXRobiBTcGVjIC0gVmVyaWZ5aW5nIEFzc2VydGlvbn1cbiAgICAgKi9cbiAgICBhc3luYyBfY2hhbGxlbmdlKHsgZmFjdG9ySWQsIHdlYmF1dGhuLCBmcmllbmRseU5hbWUsIHNpZ25hbCwgfSwgb3ZlcnJpZGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBHZXQgY2hhbGxlbmdlIGZyb20gc2VydmVyIHVzaW5nIHRoZSBjbGllbnQncyBNRkEgbWV0aG9kc1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBjaGFsbGVuZ2VSZXNwb25zZSwgZXJyb3I6IGNoYWxsZW5nZUVycm9yIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5tZmEuY2hhbGxlbmdlKHtcbiAgICAgICAgICAgICAgICBmYWN0b3JJZCxcbiAgICAgICAgICAgICAgICB3ZWJhdXRobixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFsbGVuZ2VSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiBjaGFsbGVuZ2VFcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWJvcnRTaWduYWwgPSBzaWduYWwgIT09IG51bGwgJiYgc2lnbmFsICE9PSB2b2lkIDAgPyBzaWduYWwgOiB3ZWJBdXRobkFib3J0U2VydmljZS5jcmVhdGVOZXdBYm9ydFNpZ25hbCgpO1xuICAgICAgICAgICAgLyoqIHdlYmF1dGhuIHdpbGwgZmFpbCBpZiBlaXRoZXIgb2YgdGhlIG5hbWUvZGlzcGxheW5hbWUgYXJlIGJsYW5rICovXG4gICAgICAgICAgICBpZiAoY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4udHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHVzZXIgfSA9IGNoYWxsZW5nZVJlc3BvbnNlLndlYmF1dGhuLmNyZWRlbnRpYWxfb3B0aW9ucy5wdWJsaWNLZXk7XG4gICAgICAgICAgICAgICAgaWYgKCF1c2VyLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lID0gYCR7dXNlci5pZH06JHtmcmllbmRseU5hbWV9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF1c2VyLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXIuZGlzcGxheU5hbWUgPSB1c2VyLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY3JlYXRlJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gbWVyZ2VDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zKGNoYWxsZW5nZVJlc3BvbnNlLndlYmF1dGhuLmNyZWRlbnRpYWxfb3B0aW9ucy5wdWJsaWNLZXksIG92ZXJyaWRlcyA9PT0gbnVsbCB8fCBvdmVycmlkZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG92ZXJyaWRlcy5jcmVhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBjcmVhdGVDcmVkZW50aWFsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0tleTogb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VJZDogY2hhbGxlbmdlUmVzcG9uc2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdyZXF1ZXN0Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gbWVyZ2VDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMoY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zLnB1YmxpY0tleSwgb3ZlcnJpZGVzID09PSBudWxsIHx8IG92ZXJyaWRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3ZlcnJpZGVzLnJlcXVlc3QpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBnZXRDcmVkZW50aWFsKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4uY3JlZGVudGlhbF9vcHRpb25zKSwgeyBwdWJsaWNLZXk6IG9wdGlvbnMsIHNpZ25hbDogYWJvcnRTaWduYWwgfSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VJZDogY2hhbGxlbmdlUmVzcG9uc2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjaGFsbGVuZ2VSZXNwb25zZS53ZWJhdXRobi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0F1dGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignVW5leHBlY3RlZCBlcnJvciBpbiBjaGFsbGVuZ2UnLCBlcnJvciksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFZlcmlmeSBhIFdlYkF1dGhuIGNyZWRlbnRpYWwgd2l0aCB0aGUgc2VydmVyLlxuICAgICAqIENvbXBsZXRlcyB0aGUgV2ViQXV0aG4gY2VyZW1vbnkgYnkgc2VuZGluZyB0aGUgY3JlZGVudGlhbCB0byB0aGUgc2VydmVyIGZvciB2ZXJpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsIFRoaXMgbWV0aG9kIGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmNoYWxsZW5nZUlkIC0gSUQgb2YgdGhlIGNoYWxsZW5nZSBiZWluZyB2ZXJpZmllZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuZmFjdG9ySWQgLSBJRCBvZiB0aGUgV2ViQXV0aG4gZmFjdG9yXG4gICAgICogQHBhcmFtIHtNRkFWZXJpZnlXZWJhdXRoblBhcmFtczxUPlsnd2ViYXV0aG4nXX0gcGFyYW1zLndlYmF1dGhuIC0gV2ViQXV0aG4gY3JlZGVudGlhbCByZXNwb25zZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEF1dGhNRkFWZXJpZnlSZXNwb25zZT59IFZlcmlmaWNhdGlvbiByZXN1bHQgd2l0aCBzZXNzaW9uIG9yIGVycm9yXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmF1dGhuLyNzY3RuLXZlcmlmeWluZy1hc3NlcnRpb24gVzNDIFdlYkF1dGhuIFNwZWMgLSBWZXJpZnlpbmcgYW4gQXV0aGVudGljYXRpb24gQXNzZXJ0aW9ufVxuICAgICAqICovXG4gICAgYXN5bmMgX3ZlcmlmeSh7IGNoYWxsZW5nZUlkLCBmYWN0b3JJZCwgd2ViYXV0aG4sIH0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50Lm1mYS52ZXJpZnkoe1xuICAgICAgICAgICAgZmFjdG9ySWQsXG4gICAgICAgICAgICBjaGFsbGVuZ2VJZCxcbiAgICAgICAgICAgIHdlYmF1dGhuOiB3ZWJhdXRobixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXBsZXRlIFdlYkF1dGhuIGF1dGhlbnRpY2F0aW9uIGZsb3cuXG4gICAgICogUGVyZm9ybXMgY2hhbGxlbmdlIGFuZCB2ZXJpZmljYXRpb24gaW4gYSBzaW5nbGUgb3BlcmF0aW9uIGZvciBleGlzdGluZyBjcmVkZW50aWFscy5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWwgVGhpcyBtZXRob2QgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBBdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5mYWN0b3JJZCAtIElEIG9mIHRoZSBXZWJBdXRobiBmYWN0b3IgdG8gYXV0aGVudGljYXRlIHdpdGhcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLndlYmF1dGhuIC0gV2ViQXV0aG4gY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMud2ViYXV0aG4ucnBJZCAtIFJlbHlpbmcgUGFydHkgSUQgKGRlZmF1bHRzIHRvIGN1cnJlbnQgaG9zdG5hbWUpXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGFyYW1zLndlYmF1dGhuLnJwT3JpZ2lucyAtIEFsbG93ZWQgb3JpZ2lucyAoZGVmYXVsdHMgdG8gY3VycmVudCBvcmlnaW4pXG4gICAgICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gcGFyYW1zLndlYmF1dGhuLnNpZ25hbCAtIE9wdGlvbmFsIGFib3J0IHNpZ25hbFxuICAgICAqIEBwYXJhbSB7UHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zRnV0dXJlfSBvdmVycmlkZXMgLSBPdmVycmlkZSBvcHRpb25zIGZvciBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0XG4gICAgICogQHJldHVybnMge1Byb21pc2U8UmVxdWVzdFJlc3VsdDxBdXRoTUZBVmVyaWZ5UmVzcG9uc2VEYXRhLCBXZWJBdXRobkVycm9yIHwgQXV0aEVycm9yPj59IEF1dGhlbnRpY2F0aW9uIHJlc3VsdFxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1hdXRoZW50aWNhdGlvbiBXM0MgV2ViQXV0aG4gU3BlYyAtIEF1dGhlbnRpY2F0aW9uIENlcmVtb255fVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QdWJsaWNLZXlDcmVkZW50aWFsUmVxdWVzdE9wdGlvbnMgTUROIC0gUHVibGljS2V5Q3JlZGVudGlhbFJlcXVlc3RPcHRpb25zfVxuICAgICAqL1xuICAgIGFzeW5jIF9hdXRoZW50aWNhdGUoeyBmYWN0b3JJZCwgd2ViYXV0aG46IHsgcnBJZCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lIDogdW5kZWZpbmVkLCBycE9yaWdpbnMgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IFt3aW5kb3cubG9jYXRpb24ub3JpZ2luXSA6IHVuZGVmaW5lZCwgc2lnbmFsLCB9ID0ge30sIH0sIG92ZXJyaWRlcykge1xuICAgICAgICBpZiAoIXJwSWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEF1dGhFcnJvcigncnBJZCBpcyByZXF1aXJlZCBmb3IgV2ViQXV0aG4gYXV0aGVudGljYXRpb24nKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghYnJvd3NlclN1cHBvcnRzV2ViQXV0aG4oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFdlYkF1dGhuJywgbnVsbCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdldCBjaGFsbGVuZ2UgYW5kIGNyZWRlbnRpYWxcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogY2hhbGxlbmdlUmVzcG9uc2UsIGVycm9yOiBjaGFsbGVuZ2VFcnJvciB9ID0gYXdhaXQgdGhpcy5jaGFsbGVuZ2Uoe1xuICAgICAgICAgICAgICAgIGZhY3RvcklkLFxuICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7IHJwSWQsIHJwT3JpZ2lucyB9LFxuICAgICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgIH0sIHsgcmVxdWVzdDogb3ZlcnJpZGVzIH0pO1xuICAgICAgICAgICAgaWYgKCFjaGFsbGVuZ2VSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiBjaGFsbGVuZ2VFcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyB3ZWJhdXRobiB9ID0gY2hhbGxlbmdlUmVzcG9uc2U7XG4gICAgICAgICAgICAvLyBWZXJpZnkgY3JlZGVudGlhbFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeSh7XG4gICAgICAgICAgICAgICAgZmFjdG9ySWQsXG4gICAgICAgICAgICAgICAgY2hhbGxlbmdlSWQ6IGNoYWxsZW5nZVJlc3BvbnNlLmNoYWxsZW5nZUlkLFxuICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHdlYmF1dGhuLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJwSWQsXG4gICAgICAgICAgICAgICAgICAgIHJwT3JpZ2lucyxcbiAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogd2ViYXV0aG4uY3JlZGVudGlhbF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEF1dGhVbmtub3duRXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IgaW4gYXV0aGVudGljYXRlJywgZXJyb3IpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wbGV0ZSBXZWJBdXRobiByZWdpc3RyYXRpb24gZmxvdy5cbiAgICAgKiBQZXJmb3JtcyBlbnJvbGxtZW50LCBjaGFsbGVuZ2UsIGFuZCB2ZXJpZmljYXRpb24gaW4gYSBzaW5nbGUgb3BlcmF0aW9uIGZvciBuZXcgY3JlZGVudGlhbHMuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsIFRoaXMgbWV0aG9kIGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gUmVnaXN0cmF0aW9uIHBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmZyaWVuZGx5TmFtZSAtIFVzZXItZnJpZW5kbHkgbmFtZSBmb3IgdGhlIGNyZWRlbnRpYWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJwSWQgLSBSZWx5aW5nIFBhcnR5IElEIChkZWZhdWx0cyB0byBjdXJyZW50IGhvc3RuYW1lKVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhcmFtcy5ycE9yaWdpbnMgLSBBbGxvd2VkIG9yaWdpbnMgKGRlZmF1bHRzIHRvIGN1cnJlbnQgb3JpZ2luKVxuICAgICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IHBhcmFtcy5zaWduYWwgLSBPcHRpb25hbCBhYm9ydCBzaWduYWxcbiAgICAgKiBAcGFyYW0ge1B1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnNGdXR1cmV9IG92ZXJyaWRlcyAtIE92ZXJyaWRlIG9wdGlvbnMgZm9yIG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXF1ZXN0UmVzdWx0PEF1dGhNRkFWZXJpZnlSZXNwb25zZURhdGEsIFdlYkF1dGhuRXJyb3IgfCBBdXRoRXJyb3I+Pn0gUmVnaXN0cmF0aW9uIHJlc3VsdFxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhdXRobi8jc2N0bi1yZWdpc3RlcmluZy1hLW5ldy1jcmVkZW50aWFsIFczQyBXZWJBdXRobiBTcGVjIC0gUmVnaXN0cmF0aW9uIENlcmVtb255fVxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zIE1ETiAtIFB1YmxpY0tleUNyZWRlbnRpYWxDcmVhdGlvbk9wdGlvbnN9XG4gICAgICovXG4gICAgYXN5bmMgX3JlZ2lzdGVyKHsgZnJpZW5kbHlOYW1lLCB3ZWJhdXRobjogeyBycElkID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgOiB1bmRlZmluZWQsIHJwT3JpZ2lucyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gW3dpbmRvdy5sb2NhdGlvbi5vcmlnaW5dIDogdW5kZWZpbmVkLCBzaWduYWwsIH0gPSB7fSwgfSwgb3ZlcnJpZGVzKSB7XG4gICAgICAgIGlmICghcnBJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aEVycm9yKCdycElkIGlzIHJlcXVpcmVkIGZvciBXZWJBdXRobiByZWdpc3RyYXRpb24nKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghYnJvd3NlclN1cHBvcnRzV2ViQXV0aG4oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgQXV0aFVua25vd25FcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFdlYkF1dGhuJywgbnVsbCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVucm9sbCBmYWN0b3JcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogZmFjdG9yLCBlcnJvcjogZW5yb2xsRXJyb3IgfSA9IGF3YWl0IHRoaXMuX2Vucm9sbCh7XG4gICAgICAgICAgICAgICAgZnJpZW5kbHlOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWZhY3Rvcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpZW50Lm1mYVxuICAgICAgICAgICAgICAgICAgICAubGlzdEZhY3RvcnMoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoZmFjdG9ycykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2EgPSBmYWN0b3JzLmRhdGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hbGwuZmluZCgodikgPT4gdi5mYWN0b3JfdHlwZSA9PT0gJ3dlYmF1dGhuJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdi5mcmllbmRseV9uYW1lID09PSBmcmllbmRseU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHYuc3RhdHVzICE9PSAndW52ZXJpZmllZCcpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChmYWN0b3IpID0+IChmYWN0b3IgPyB0aGlzLmNsaWVudC5tZmEudW5lbnJvbGwoeyBmYWN0b3JJZDogZmFjdG9yID09PSBudWxsIHx8IGZhY3RvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmFjdG9yLmlkIH0pIDogdm9pZCAwKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3I6IGVucm9sbEVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgY2hhbGxlbmdlIGFuZCBjcmVhdGUgY3JlZGVudGlhbFxuICAgICAgICAgICAgY29uc3QgeyBkYXRhOiBjaGFsbGVuZ2VSZXNwb25zZSwgZXJyb3I6IGNoYWxsZW5nZUVycm9yIH0gPSBhd2FpdCB0aGlzLl9jaGFsbGVuZ2Uoe1xuICAgICAgICAgICAgICAgIGZhY3RvcklkOiBmYWN0b3IuaWQsXG4gICAgICAgICAgICAgICAgZnJpZW5kbHlOYW1lOiBmYWN0b3IuZnJpZW5kbHlfbmFtZSxcbiAgICAgICAgICAgICAgICB3ZWJhdXRobjogeyBycElkLCBycE9yaWdpbnMgfSxcbiAgICAgICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgY3JlYXRlOiBvdmVycmlkZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghY2hhbGxlbmdlUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBudWxsLCBlcnJvcjogY2hhbGxlbmdlRXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnkoe1xuICAgICAgICAgICAgICAgIGZhY3RvcklkOiBmYWN0b3IuaWQsXG4gICAgICAgICAgICAgICAgY2hhbGxlbmdlSWQ6IGNoYWxsZW5nZVJlc3BvbnNlLmNoYWxsZW5nZUlkLFxuICAgICAgICAgICAgICAgIHdlYmF1dGhuOiB7XG4gICAgICAgICAgICAgICAgICAgIHJwSWQsXG4gICAgICAgICAgICAgICAgICAgIHJwT3JpZ2lucyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbF9yZXNwb25zZTogY2hhbGxlbmdlUmVzcG9uc2Uud2ViYXV0aG4uY3JlZGVudGlhbF9yZXNwb25zZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNBdXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEF1dGhVbmtub3duRXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IgaW4gcmVnaXN0ZXInLCBlcnJvciksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViYXV0aG4uanMubWFwIl0sIm5hbWVzIjpbIl9fcmVzdCIsImJhc2U2NFVybFRvVWludDhBcnJheSIsImJ5dGVzVG9CYXNlNjRVUkwiLCJBdXRoRXJyb3IiLCJBdXRoVW5rbm93bkVycm9yIiwiaXNBdXRoRXJyb3IiLCJpc0Jyb3dzZXIiLCJpZGVudGlmeUF1dGhlbnRpY2F0aW9uRXJyb3IiLCJpZGVudGlmeVJlZ2lzdHJhdGlvbkVycm9yIiwiaXNXZWJBdXRobkVycm9yIiwiV2ViQXV0aG5FcnJvciIsIldlYkF1dGhuVW5rbm93bkVycm9yIiwiV2ViQXV0aG5BYm9ydFNlcnZpY2UiLCJjcmVhdGVOZXdBYm9ydFNpZ25hbCIsImNvbnRyb2xsZXIiLCJhYm9ydEVycm9yIiwiRXJyb3IiLCJuYW1lIiwiYWJvcnQiLCJuZXdDb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwic2lnbmFsIiwiY2FuY2VsQ2VyZW1vbnkiLCJ1bmRlZmluZWQiLCJ3ZWJBdXRobkFib3J0U2VydmljZSIsImRlc2VyaWFsaXplQ3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyIsIm9wdGlvbnMiLCJQdWJsaWNLZXlDcmVkZW50aWFsIiwicGFyc2VDcmVhdGlvbk9wdGlvbnNGcm9tSlNPTiIsImNoYWxsZW5nZSIsImNoYWxsZW5nZVN0ciIsInVzZXIiLCJ1c2VyT3B0cyIsImV4Y2x1ZGVDcmVkZW50aWFscyIsInJlc3RPcHRpb25zIiwiYnVmZmVyIiwiT2JqZWN0IiwiYXNzaWduIiwiaWQiLCJyZXN1bHQiLCJsZW5ndGgiLCJBcnJheSIsImkiLCJjcmVkIiwidHlwZSIsInRyYW5zcG9ydHMiLCJkZXNlcmlhbGl6ZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyIsInBhcnNlUmVxdWVzdE9wdGlvbnNGcm9tSlNPTiIsImFsbG93Q3JlZGVudGlhbHMiLCJzZXJpYWxpemVDcmVkZW50aWFsQ3JlYXRpb25SZXNwb25zZSIsImNyZWRlbnRpYWwiLCJfYSIsInRvSlNPTiIsImNyZWRlbnRpYWxXaXRoQXR0YWNobWVudCIsInJhd0lkIiwicmVzcG9uc2UiLCJhdHRlc3RhdGlvbk9iamVjdCIsIlVpbnQ4QXJyYXkiLCJjbGllbnREYXRhSlNPTiIsImNsaWVudEV4dGVuc2lvblJlc3VsdHMiLCJnZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzIiwiYXV0aGVudGljYXRvckF0dGFjaG1lbnQiLCJzZXJpYWxpemVDcmVkZW50aWFsUmVxdWVzdFJlc3BvbnNlIiwiYXNzZXJ0aW9uUmVzcG9uc2UiLCJhdXRoZW50aWNhdG9yRGF0YSIsInNpZ25hdHVyZSIsInVzZXJIYW5kbGUiLCJpc1ZhbGlkRG9tYWluIiwiaG9zdG5hbWUiLCJ0ZXN0IiwiYnJvd3NlclN1cHBvcnRzV2ViQXV0aG4iLCJfYiIsIndpbmRvdyIsIm5hdmlnYXRvciIsImNyZWRlbnRpYWxzIiwiY3JlYXRlIiwiZ2V0IiwiY3JlYXRlQ3JlZGVudGlhbCIsImRhdGEiLCJlcnJvciIsImVyciIsImdldENyZWRlbnRpYWwiLCJERUZBVUxUX0NSRUFUSU9OX09QVElPTlMiLCJoaW50cyIsImF1dGhlbnRpY2F0b3JTZWxlY3Rpb24iLCJyZXF1aXJlUmVzaWRlbnRLZXkiLCJ1c2VyVmVyaWZpY2F0aW9uIiwicmVzaWRlbnRLZXkiLCJhdHRlc3RhdGlvbiIsIkRFRkFVTFRfUkVRVUVTVF9PUFRJT05TIiwiZGVlcE1lcmdlIiwic291cmNlcyIsImlzT2JqZWN0IiwidmFsIiwiaXNBcnJheSIsImlzQXJyYXlCdWZmZXJMaWtlIiwiQXJyYXlCdWZmZXIiLCJpc1ZpZXciLCJzb3VyY2UiLCJrZXkiLCJ2YWx1ZSIsImV4aXN0aW5nIiwibWVyZ2VDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zIiwiYmFzZU9wdGlvbnMiLCJvdmVycmlkZXMiLCJtZXJnZUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucyIsIldlYkF1dGhuQXBpIiwiY29uc3RydWN0b3IiLCJjbGllbnQiLCJlbnJvbGwiLCJfZW5yb2xsIiwiYmluZCIsIl9jaGFsbGVuZ2UiLCJ2ZXJpZnkiLCJfdmVyaWZ5IiwiYXV0aGVudGljYXRlIiwiX2F1dGhlbnRpY2F0ZSIsInJlZ2lzdGVyIiwiX3JlZ2lzdGVyIiwicGFyYW1zIiwibWZhIiwiZmFjdG9yVHlwZSIsImZhY3RvcklkIiwid2ViYXV0aG4iLCJmcmllbmRseU5hbWUiLCJjaGFsbGVuZ2VSZXNwb25zZSIsImNoYWxsZW5nZUVycm9yIiwiYWJvcnRTaWduYWwiLCJjcmVkZW50aWFsX29wdGlvbnMiLCJwdWJsaWNLZXkiLCJkaXNwbGF5TmFtZSIsImNoYWxsZW5nZUlkIiwiY3JlZGVudGlhbF9yZXNwb25zZSIsInJlcXVlc3QiLCJycElkIiwibG9jYXRpb24iLCJycE9yaWdpbnMiLCJvcmlnaW4iLCJmYWN0b3IiLCJlbnJvbGxFcnJvciIsImxpc3RGYWN0b3JzIiwidGhlbiIsImZhY3RvcnMiLCJhbGwiLCJmaW5kIiwidiIsImZhY3Rvcl90eXBlIiwiZnJpZW5kbHlfbmFtZSIsInN0YXR1cyIsInVuZW5yb2xsIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-js/dist/module/lib/webauthn.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js":
|
||
/*!****************************************************************************!*\
|
||
!*** ./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js ***!
|
||
\****************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FunctionsClient: () => (/* binding */ FunctionsClient)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ \"(action-browser)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helper */ \"(action-browser)/./node_modules/@supabase/functions-js/dist/module/helper.js\");\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types */ \"(action-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 * 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_0__.FunctionRegion.Any } = {}){\n this.url = url;\n this.headers = headers;\n this.region = region;\n this.fetch = (0,_helper__WEBPACK_IMPORTED_MODULE_1__.resolveFetch)(customFetch);\n }\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 ${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_2__.__awaiter)(this, arguments, void 0, function*(functionName, options = {}) {\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(`${this.url}/${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_0__.FunctionsFetchError(fetchError);\n });\n const isRelayError = response.headers.get(\"x-relay-error\");\n if (isRelayError && isRelayError === \"true\") {\n throw new _types__WEBPACK_IMPORTED_MODULE_0__.FunctionsRelayError(response);\n }\n if (!response.ok) {\n throw new _types__WEBPACK_IMPORTED_MODULE_0__.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_0__.FunctionsHttpError || error instanceof _types__WEBPACK_IMPORTED_MODULE_0__.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} //# sourceMappingURL=FunctionsClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL0Z1bmN0aW9uc0NsaWVudC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQWtDO0FBQ007QUFDZ0U7QUFDeEc7O0NBRUMsR0FDTSxNQUFNTTtJQUNUOzs7Ozs7Ozs7Ozs7S0FZQyxHQUNEQyxZQUFZQyxHQUFHLEVBQUUsRUFBRUMsVUFBVSxDQUFDLENBQUMsRUFBRUMsV0FBVyxFQUFFQyxTQUFTVCxrREFBY0EsQ0FBQ1UsR0FBRyxFQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUU7UUFDL0UsSUFBSSxDQUFDSixHQUFHLEdBQUdBO1FBQ1gsSUFBSSxDQUFDQyxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDRSxNQUFNLEdBQUdBO1FBQ2QsSUFBSSxDQUFDRSxLQUFLLEdBQUdaLHFEQUFZQSxDQUFDUztJQUM5QjtJQUNBOzs7Ozs7O0tBT0MsR0FDREksUUFBUUMsS0FBSyxFQUFFO1FBQ1gsSUFBSSxDQUFDTixPQUFPLENBQUNPLGFBQWEsR0FBRyxDQUFDLE9BQU8sRUFBRUQsTUFBTSxDQUFDO0lBQ2xEO0lBQ0E7Ozs7Ozs7Ozs7S0FVQyxHQUNERSxPQUFPQyxjQUFjLEVBQUU7UUFDbkIsT0FBT2xCLGdEQUFTQSxDQUFDLElBQUksRUFBRW1CLFdBQVcsS0FBSyxHQUFHLFVBQVdDLFlBQVksRUFBRUMsVUFBVSxDQUFDLENBQUM7WUFDM0UsSUFBSUM7WUFDSixJQUFJQztZQUNKLElBQUlDO1lBQ0osSUFBSTtnQkFDQSxNQUFNLEVBQUVmLE9BQU8sRUFBRWdCLE1BQU0sRUFBRUMsTUFBTUMsWUFBWSxFQUFFQyxNQUFNLEVBQUVDLE9BQU8sRUFBRSxHQUFHUjtnQkFDakUsSUFBSVMsV0FBVyxDQUFDO2dCQUNoQixJQUFJLEVBQUVuQixNQUFNLEVBQUUsR0FBR1U7Z0JBQ2pCLElBQUksQ0FBQ1YsUUFBUTtvQkFDVEEsU0FBUyxJQUFJLENBQUNBLE1BQU07Z0JBQ3hC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TVgsU0FBU1ksSUFBSTtnQkFDOUIsT0FDSyxJQUFJSixpQkFBaUIsOEJBQ3RCQSxpQkFBaUIsbUJBQW1CO29CQUNwQ0csT0FBTyxNQUFNWCxTQUFTYSxJQUFJO2dCQUM5QixPQUNLLElBQUlMLGlCQUFpQixxQkFBcUI7b0JBQzNDRyxPQUFPWDtnQkFDWCxPQUNLLElBQUlRLGlCQUFpQix1QkFBdUI7b0JBQzdDRyxPQUFPLE1BQU1YLFNBQVNjLFFBQVE7Z0JBQ2xDLE9BQ0s7b0JBQ0Qsa0JBQWtCO29CQUNsQkgsT0FBTyxNQUFNWCxTQUFTZSxJQUFJO2dCQUM5QjtnQkFDQSxPQUFPO29CQUFFSjtvQkFBTUssT0FBTztvQkFBTWhCO2dCQUFTO1lBQ3pDLEVBQ0EsT0FBT2dCLE9BQU87Z0JBQ1YsT0FBTztvQkFDSEwsTUFBTTtvQkFDTks7b0JBQ0FoQixVQUFVZ0IsaUJBQWlCNUQsc0RBQWtCQSxJQUFJNEQsaUJBQWlCM0QsdURBQW1CQSxHQUMvRTJELE1BQU1DLE9BQU8sR0FDYkM7Z0JBQ1Y7WUFDSixTQUNRO2dCQUNKLGtDQUFrQztnQkFDbEMsSUFBSTNDLFdBQVc7b0JBQ1g0QyxhQUFhNUM7Z0JBQ2pCO1lBQ0o7UUFDSjtJQUNKO0FBQ0osRUFDQSwyQ0FBMkMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcy9kaXN0L21vZHVsZS9GdW5jdGlvbnNDbGllbnQuanM/NWMzOCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfX2F3YWl0ZXIgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHJlc29sdmVGZXRjaCB9IGZyb20gJy4vaGVscGVyJztcbmltcG9ydCB7IEZ1bmN0aW9uUmVnaW9uLCBGdW5jdGlvbnNGZXRjaEVycm9yLCBGdW5jdGlvbnNIdHRwRXJyb3IsIEZ1bmN0aW9uc1JlbGF5RXJyb3IsIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIENsaWVudCBmb3IgaW52b2tpbmcgU3VwYWJhc2UgRWRnZSBGdW5jdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbnNDbGllbnQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRnVuY3Rpb25zIGNsaWVudCBib3VuZCB0byBhbiBFZGdlIEZ1bmN0aW9ucyBVUkwuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgRnVuY3Rpb25zQ2xpZW50LCBGdW5jdGlvblJlZ2lvbiB9IGZyb20gJ0BzdXBhYmFzZS9mdW5jdGlvbnMtanMnXG4gICAgICpcbiAgICAgKiBjb25zdCBmdW5jdGlvbnMgPSBuZXcgRnVuY3Rpb25zQ2xpZW50KCdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vZnVuY3Rpb25zL3YxJywge1xuICAgICAqICAgaGVhZGVyczogeyBhcGlrZXk6ICdwdWJsaWMtYW5vbi1rZXknIH0sXG4gICAgICogICByZWdpb246IEZ1bmN0aW9uUmVnaW9uLlVzRWFzdDEsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHsgaGVhZGVycyA9IHt9LCBjdXN0b21GZXRjaCwgcmVnaW9uID0gRnVuY3Rpb25SZWdpb24uQW55LCB9ID0ge30pIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHRoaXMucmVnaW9uID0gcmVnaW9uO1xuICAgICAgICB0aGlzLmZldGNoID0gcmVzb2x2ZUZldGNoKGN1c3RvbUZldGNoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgYXV0aG9yaXphdGlvbiBoZWFkZXJcbiAgICAgKiBAcGFyYW0gdG9rZW4gLSB0aGUgbmV3IGp3dCB0b2tlbiBzZW50IGluIHRoZSBhdXRob3Jpc2F0aW9uIGhlYWRlclxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBmdW5jdGlvbnMuc2V0QXV0aChzZXNzaW9uLmFjY2Vzc190b2tlbilcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzZXRBdXRoKHRva2VuKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5BdXRob3JpemF0aW9uID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZXMgYSBmdW5jdGlvblxuICAgICAqIEBwYXJhbSBmdW5jdGlvbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgRnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgaW52b2tpbmcgdGhlIEZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBmdW5jdGlvbnMuaW52b2tlKCdoZWxsby13b3JsZCcsIHtcbiAgICAgKiAgIGJvZHk6IHsgbmFtZTogJ0FkYScgfSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGludm9rZShmdW5jdGlvbk5hbWVfMSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKGZ1bmN0aW9uTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBsZXQgdGltZW91dElkO1xuICAgICAgICAgICAgbGV0IHRpbWVvdXRDb250cm9sbGVyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGhlYWRlcnMsIG1ldGhvZCwgYm9keTogZnVuY3Rpb25BcmdzLCBzaWduYWwsIHRpbWVvdXQgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgbGV0IF9oZWFkZXJzID0ge307XG4gICAgICAgICAgICAgICAgbGV0IHsgcmVnaW9uIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmICghcmVnaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9IHRoaXMucmVnaW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBZGQgcmVnaW9uIGFzIHF1ZXJ5IHBhcmFtZXRlciB1c2luZyBVUkwgQVBJXG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChgJHt0aGlzLnVybH0vJHtmdW5jdGlvbk5hbWV9YCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lvbiAmJiByZWdpb24gIT09ICdhbnknKSB7XG4gICAgICAgICAgICAgICAgICAgIF9oZWFkZXJzWyd4LXJlZ2lvbiddID0gcmVnaW9uO1xuICAgICAgICAgICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnZm9yY2VGdW5jdGlvblJlZ2lvbicsIHJlZ2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBib2R5O1xuICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbkFyZ3MgJiZcbiAgICAgICAgICAgICAgICAgICAgKChoZWFkZXJzICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaGVhZGVycywgJ0NvbnRlbnQtVHlwZScpKSB8fCAhaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgZnVuY3Rpb25BcmdzIGluc3RhbmNlb2YgQmxvYikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJncyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHdvcmsgZm9yIEZpbGUgYXMgRmlsZSBpbmhlcml0cyBCbG9iXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIHdvcmtzIGZvciBBcnJheUJ1ZmZlciBhcyBpdCBpcyB0aGUgc2FtZSB1bmRlcmx5aW5nIHN0cnVjdHVyZSBhcyBhIEJsb2JcbiAgICAgICAgICAgICAgICAgICAgICAgIF9oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IGZ1bmN0aW9uQXJncztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZnVuY3Rpb25BcmdzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGxhaW4gc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBfaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAndGV4dC9wbGFpbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gZnVuY3Rpb25BcmdzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgZnVuY3Rpb25BcmdzIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHNldCBjb250ZW50LXR5cGUgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVxdWVzdCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSByaWdodCBib3VuZGFyeSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IGZ1bmN0aW9uQXJncztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQsIGFzc3VtZSB0aGlzIGlzIEpTT05cbiAgICAgICAgICAgICAgICAgICAgICAgIF9oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShmdW5jdGlvbkFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgQ29udGVudC1UeXBlIHdhcyBzdXBwbGllZCwgc2ltcGx5IHNldCB0aGUgYm9keVxuICAgICAgICAgICAgICAgICAgICBib2R5ID0gZnVuY3Rpb25BcmdzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGltZW91dCBieSBjcmVhdGluZyBhbiBBYm9ydENvbnRyb2xsZXJcbiAgICAgICAgICAgICAgICBsZXQgZWZmZWN0aXZlU2lnbmFsID0gc2lnbmFsO1xuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHRpbWVvdXRDb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB1c2VyIHByb3ZpZGVkIHRoZWlyIG93biBzaWduYWwsIHdlIG5lZWQgdG8gcmVzcGVjdCBib3RoXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVNpZ25hbCA9IHRpbWVvdXRDb250cm9sbGVyLnNpZ25hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyJ3Mgc2lnbmFsIGlzIGFib3J0ZWQsIGFib3J0IG91ciB0aW1lb3V0IGNvbnRyb2xsZXIgdG9vXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aW1lb3V0Q29udHJvbGxlci5hYm9ydCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVNpZ25hbCA9IHRpbWVvdXRDb250cm9sbGVyLnNpZ25hbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIHRoaXMuZmV0Y2godXJsLnRvU3RyaW5nKCksIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QgfHwgJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXJzIHByaW9yaXR5IGlzIChoaWdoIHRvIGxvdyk6XG4gICAgICAgICAgICAgICAgICAgIC8vIDEuIGludm9rZS1sZXZlbCBoZWFkZXJzXG4gICAgICAgICAgICAgICAgICAgIC8vIDIuIGNsaWVudC1sZXZlbCBoZWFkZXJzXG4gICAgICAgICAgICAgICAgICAgIC8vIDMuIGRlZmF1bHQgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgX2hlYWRlcnMpLCB0aGlzLmhlYWRlcnMpLCBoZWFkZXJzKSxcbiAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBlZmZlY3RpdmVTaWduYWwsXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGZldGNoRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZ1bmN0aW9uc0ZldGNoRXJyb3IoZmV0Y2hFcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNSZWxheUVycm9yID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtcmVsYXktZXJyb3InKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWxheUVycm9yICYmIGlzUmVsYXlFcnJvciA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGdW5jdGlvbnNSZWxheUVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRnVuY3Rpb25zSHR0cEVycm9yKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlVHlwZSA9ICgoX2EgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICd0ZXh0L3BsYWluJykuc3BsaXQoJzsnKVswXS50cmltKCk7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSB5aWVsZCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfHxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0geWllbGQgcmVzcG9uc2UuYmxvYigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZVR5cGUgPT09ICd0ZXh0L2V2ZW50LXN0cmVhbScpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZVR5cGUgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0geWllbGQgcmVzcG9uc2UuZm9ybURhdGEoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gdGV4dFxuICAgICAgICAgICAgICAgICAgICBkYXRhID0geWllbGQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCBlcnJvcjogbnVsbCwgcmVzcG9uc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogZXJyb3IgaW5zdGFuY2VvZiBGdW5jdGlvbnNIdHRwRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBGdW5jdGlvbnNSZWxheUVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGVycm9yLmNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgdGltZW91dCBpZiBpdCB3YXMgc2V0XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZ1bmN0aW9uc0NsaWVudC5qcy5tYXAiXSwibmFtZXMiOlsiX19hd2FpdGVyIiwicmVzb2x2ZUZldGNoIiwiRnVuY3Rpb25SZWdpb24iLCJGdW5jdGlvbnNGZXRjaEVycm9yIiwiRnVuY3Rpb25zSHR0cEVycm9yIiwiRnVuY3Rpb25zUmVsYXlFcnJvciIsIkZ1bmN0aW9uc0NsaWVudCIsImNvbnN0cnVjdG9yIiwidXJsIiwiaGVhZGVycyIsImN1c3RvbUZldGNoIiwicmVnaW9uIiwiQW55IiwiZmV0Y2giLCJzZXRBdXRoIiwidG9rZW4iLCJBdXRob3JpemF0aW9uIiwiaW52b2tlIiwiZnVuY3Rpb25OYW1lXzEiLCJhcmd1bWVudHMiLCJmdW5jdGlvbk5hbWUiLCJvcHRpb25zIiwiX2EiLCJ0aW1lb3V0SWQiLCJ0aW1lb3V0Q29udHJvbGxlciIsIm1ldGhvZCIsImJvZHkiLCJmdW5jdGlvbkFyZ3MiLCJzaWduYWwiLCJ0aW1lb3V0IiwiX2hlYWRlcnMiLCJVUkwiLCJzZWFyY2hQYXJhbXMiLCJzZXQiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJCbG9iIiwiQXJyYXlCdWZmZXIiLCJGb3JtRGF0YSIsIkpTT04iLCJzdHJpbmdpZnkiLCJlZmZlY3RpdmVTaWduYWwiLCJBYm9ydENvbnRyb2xsZXIiLCJzZXRUaW1lb3V0IiwiYWJvcnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVzcG9uc2UiLCJ0b1N0cmluZyIsImFzc2lnbiIsImNhdGNoIiwiZmV0Y2hFcnJvciIsImlzUmVsYXlFcnJvciIsImdldCIsIm9rIiwicmVzcG9uc2VUeXBlIiwic3BsaXQiLCJ0cmltIiwiZGF0YSIsImpzb24iLCJibG9iIiwiZm9ybURhdGEiLCJ0ZXh0IiwiZXJyb3IiLCJjb250ZXh0IiwidW5kZWZpbmVkIiwiY2xlYXJUaW1lb3V0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js":
|
||
/*!****************************************************************************!*\
|
||
!*** ./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js ***!
|
||
\****************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FunctionsClient: () => (/* binding */ FunctionsClient)\n/* harmony export */ });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ \"(rsc)/./node_modules/tslib/tslib.es6.mjs\");\n/* harmony import */ var _helper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helper */ \"(rsc)/./node_modules/@supabase/functions-js/dist/module/helper.js\");\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types */ \"(rsc)/./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 * 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_0__.FunctionRegion.Any } = {}){\n this.url = url;\n this.headers = headers;\n this.region = region;\n this.fetch = (0,_helper__WEBPACK_IMPORTED_MODULE_1__.resolveFetch)(customFetch);\n }\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 ${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_2__.__awaiter)(this, arguments, void 0, function*(functionName, options = {}) {\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(`${this.url}/${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_0__.FunctionsFetchError(fetchError);\n });\n const isRelayError = response.headers.get(\"x-relay-error\");\n if (isRelayError && isRelayError === \"true\") {\n throw new _types__WEBPACK_IMPORTED_MODULE_0__.FunctionsRelayError(response);\n }\n if (!response.ok) {\n throw new _types__WEBPACK_IMPORTED_MODULE_0__.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_0__.FunctionsHttpError || error instanceof _types__WEBPACK_IMPORTED_MODULE_0__.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} //# sourceMappingURL=FunctionsClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcy9kaXN0L21vZHVsZS9GdW5jdGlvbnNDbGllbnQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFrQztBQUNNO0FBQ2dFO0FBQ3hHOztDQUVDLEdBQ00sTUFBTU07SUFDVDs7Ozs7Ozs7Ozs7O0tBWUMsR0FDREMsWUFBWUMsR0FBRyxFQUFFLEVBQUVDLFVBQVUsQ0FBQyxDQUFDLEVBQUVDLFdBQVcsRUFBRUMsU0FBU1Qsa0RBQWNBLENBQUNVLEdBQUcsRUFBRyxHQUFHLENBQUMsQ0FBQyxDQUFFO1FBQy9FLElBQUksQ0FBQ0osR0FBRyxHQUFHQTtRQUNYLElBQUksQ0FBQ0MsT0FBTyxHQUFHQTtRQUNmLElBQUksQ0FBQ0UsTUFBTSxHQUFHQTtRQUNkLElBQUksQ0FBQ0UsS0FBSyxHQUFHWixxREFBWUEsQ0FBQ1M7SUFDOUI7SUFDQTs7Ozs7OztLQU9DLEdBQ0RJLFFBQVFDLEtBQUssRUFBRTtRQUNYLElBQUksQ0FBQ04sT0FBTyxDQUFDTyxhQUFhLEdBQUcsQ0FBQyxPQUFPLEVBQUVELE1BQU0sQ0FBQztJQUNsRDtJQUNBOzs7Ozs7Ozs7O0tBVUMsR0FDREUsT0FBT0MsY0FBYyxFQUFFO1FBQ25CLE9BQU9sQixnREFBU0EsQ0FBQyxJQUFJLEVBQUVtQixXQUFXLEtBQUssR0FBRyxVQUFXQyxZQUFZLEVBQUVDLFVBQVUsQ0FBQyxDQUFDO1lBQzNFLElBQUlDO1lBQ0osSUFBSUM7WUFDSixJQUFJQztZQUNKLElBQUk7Z0JBQ0EsTUFBTSxFQUFFZixPQUFPLEVBQUVnQixNQUFNLEVBQUVDLE1BQU1DLFlBQVksRUFBRUMsTUFBTSxFQUFFQyxPQUFPLEVBQUUsR0FBR1I7Z0JBQ2pFLElBQUlTLFdBQVcsQ0FBQztnQkFDaEIsSUFBSSxFQUFFbkIsTUFBTSxFQUFFLEdBQUdVO2dCQUNqQixJQUFJLENBQUNWLFFBQVE7b0JBQ1RBLFNBQVMsSUFBSSxDQUFDQSxNQUFNO2dCQUN4QjtnQkFDQSw4Q0FB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QUk7Z0JBQzlCLE9BQ0ssSUFBSUosaUJBQWlCLDhCQUN0QkEsaUJBQWlCLG1CQUFtQjtvQkFDcENHLE9BQU8sTUFBTVgsU0FBU2EsSUFBSTtnQkFDOUIsT0FDSyxJQUFJTCxpQkFBaUIscUJBQXFCO29CQUMzQ0csT0FBT1g7Z0JBQ1gsT0FDSyxJQUFJUSxpQkFBaUIsdUJBQXVCO29CQUM3Q0csT0FBTyxNQUFNWCxTQUFTYyxRQUFRO2dCQUNsQyxPQUNLO29CQUNELGtCQUFrQjtvQkFDbEJILE9BQU8sTUFBTVgsU0FBU2UsSUFBSTtnQkFDOUI7Z0JBQ0EsT0FBTztvQkFBRUo7b0JBQU1LLE9BQU87b0JBQU1oQjtnQkFBUztZQUN6QyxFQUNBLE9BQU9nQixPQUFPO2dCQUNWLE9BQU87b0JBQ0hMLE1BQU07b0JBQ05LO29CQUNBaEIsVUFBVWdCLGlCQUFpQjVELHNEQUFrQkEsSUFBSTRELGlCQUFpQjNELHVEQUFtQkEsR0FDL0UyRCxNQUFNQyxPQUFPLEdBQ2JDO2dCQUNWO1lBQ0osU0FDUTtnQkFDSixrQ0FBa0M7Z0JBQ2xDLElBQUkzQyxXQUFXO29CQUNYNEMsYUFBYTVDO2dCQUNqQjtZQUNKO1FBQ0o7SUFDSjtBQUNKLEVBQ0EsMkNBQTJDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9mdW5jdGlvbnMtanMvZGlzdC9tb2R1bGUvRnVuY3Rpb25zQ2xpZW50LmpzPzVjMzgiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyByZXNvbHZlRmV0Y2ggfSBmcm9tICcuL2hlbHBlcic7XG5pbXBvcnQgeyBGdW5jdGlvblJlZ2lvbiwgRnVuY3Rpb25zRmV0Y2hFcnJvciwgRnVuY3Rpb25zSHR0cEVycm9yLCBGdW5jdGlvbnNSZWxheUVycm9yLCB9IGZyb20gJy4vdHlwZXMnO1xuLyoqXG4gKiBDbGllbnQgZm9yIGludm9raW5nIFN1cGFiYXNlIEVkZ2UgRnVuY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25zQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZ1bmN0aW9ucyBjbGllbnQgYm91bmQgdG8gYW4gRWRnZSBGdW5jdGlvbnMgVVJMLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IEZ1bmN0aW9uc0NsaWVudCwgRnVuY3Rpb25SZWdpb24gfSBmcm9tICdAc3VwYWJhc2UvZnVuY3Rpb25zLWpzJ1xuICAgICAqXG4gICAgICogY29uc3QgZnVuY3Rpb25zID0gbmV3IEZ1bmN0aW9uc0NsaWVudCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL2Z1bmN0aW9ucy92MScsIHtcbiAgICAgKiAgIGhlYWRlcnM6IHsgYXBpa2V5OiAncHVibGljLWFub24ta2V5JyB9LFxuICAgICAqICAgcmVnaW9uOiBGdW5jdGlvblJlZ2lvbi5Vc0Vhc3QxLFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJsLCB7IGhlYWRlcnMgPSB7fSwgY3VzdG9tRmV0Y2gsIHJlZ2lvbiA9IEZ1bmN0aW9uUmVnaW9uLkFueSwgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB0aGlzLnJlZ2lvbiA9IHJlZ2lvbjtcbiAgICAgICAgdGhpcy5mZXRjaCA9IHJlc29sdmVGZXRjaChjdXN0b21GZXRjaCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGF1dGhvcml6YXRpb24gaGVhZGVyXG4gICAgICogQHBhcmFtIHRva2VuIC0gdGhlIG5ldyBqd3QgdG9rZW4gc2VudCBpbiB0aGUgYXV0aG9yaXNhdGlvbiBoZWFkZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogZnVuY3Rpb25zLnNldEF1dGgoc2Vzc2lvbi5hY2Nlc3NfdG9rZW4pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0QXV0aCh0b2tlbikge1xuICAgICAgICB0aGlzLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIGEgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gZnVuY3Rpb25OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIEZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGludm9raW5nIHRoZSBGdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgZnVuY3Rpb25zLmludm9rZSgnaGVsbG8td29ybGQnLCB7XG4gICAgICogICBib2R5OiB7IG5hbWU6ICdBZGEnIH0sXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBpbnZva2UoZnVuY3Rpb25OYW1lXzEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qIChmdW5jdGlvbk5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgbGV0IHRpbWVvdXRJZDtcbiAgICAgICAgICAgIGxldCB0aW1lb3V0Q29udHJvbGxlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBoZWFkZXJzLCBtZXRob2QsIGJvZHk6IGZ1bmN0aW9uQXJncywgc2lnbmFsLCB0aW1lb3V0IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIGxldCBfaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgICAgIGxldCB7IHJlZ2lvbiB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZWdpb24gPSB0aGlzLnJlZ2lvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkIHJlZ2lvbiBhcyBxdWVyeSBwYXJhbWV0ZXIgdXNpbmcgVVJMIEFQSVxuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYCR7dGhpcy51cmx9LyR7ZnVuY3Rpb25OYW1lfWApO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpb24gJiYgcmVnaW9uICE9PSAnYW55Jykge1xuICAgICAgICAgICAgICAgICAgICBfaGVhZGVyc1sneC1yZWdpb24nXSA9IHJlZ2lvbjtcbiAgICAgICAgICAgICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2ZvcmNlRnVuY3Rpb25SZWdpb24nLCByZWdpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgYm9keTtcbiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25BcmdzICYmXG4gICAgICAgICAgICAgICAgICAgICgoaGVhZGVycyAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhlYWRlcnMsICdDb250ZW50LVR5cGUnKSkgfHwgIWhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIGZ1bmN0aW9uQXJncyBpbnN0YW5jZW9mIEJsb2IpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3MgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCB3b3JrIGZvciBGaWxlIGFzIEZpbGUgaW5oZXJpdHMgQmxvYlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyB3b3JrcyBmb3IgQXJyYXlCdWZmZXIgYXMgaXQgaXMgdGhlIHNhbWUgdW5kZXJseWluZyBzdHJ1Y3R1cmUgYXMgYSBCbG9iXG4gICAgICAgICAgICAgICAgICAgICAgICBfaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBmdW5jdGlvbkFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGZ1bmN0aW9uQXJncyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYWluIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgX2hlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IGZ1bmN0aW9uQXJncztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGZ1bmN0aW9uQXJncyBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZXQgY29udGVudC10eXBlIGhlYWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVlc3Qgd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgcmlnaHQgYm91bmRhcnkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBmdW5jdGlvbkFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0LCBhc3N1bWUgdGhpcyBpcyBKU09OXG4gICAgICAgICAgICAgICAgICAgICAgICBfaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZnVuY3Rpb25BcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIENvbnRlbnQtVHlwZSB3YXMgc3VwcGxpZWQsIHNpbXBseSBzZXQgdGhlIGJvZHlcbiAgICAgICAgICAgICAgICAgICAgYm9keSA9IGZ1bmN0aW9uQXJncztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRpbWVvdXQgYnkgY3JlYXRpbmcgYW4gQWJvcnRDb250cm9sbGVyXG4gICAgICAgICAgICAgICAgbGV0IGVmZmVjdGl2ZVNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB0aW1lb3V0Q29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdXNlciBwcm92aWRlZCB0aGVpciBvd24gc2lnbmFsLCB3ZSBuZWVkIHRvIHJlc3BlY3QgYm90aFxuICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVTaWduYWwgPSB0aW1lb3V0Q29udHJvbGxlci5zaWduYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlcidzIHNpZ25hbCBpcyBhYm9ydGVkLCBhYm9ydCBvdXIgdGltZW91dCBjb250cm9sbGVyIHRvb1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGltZW91dENvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVTaWduYWwgPSB0aW1lb3V0Q29udHJvbGxlci5zaWduYWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCB0aGlzLmZldGNoKHVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kIHx8ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVycyBwcmlvcml0eSBpcyAoaGlnaCB0byBsb3cpOlxuICAgICAgICAgICAgICAgICAgICAvLyAxLiBpbnZva2UtbGV2ZWwgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAvLyAyLiBjbGllbnQtbGV2ZWwgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAvLyAzLiBkZWZhdWx0IENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIF9oZWFkZXJzKSwgdGhpcy5oZWFkZXJzKSwgaGVhZGVycyksXG4gICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hbDogZWZmZWN0aXZlU2lnbmFsLFxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChmZXRjaEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGdW5jdGlvbnNGZXRjaEVycm9yKGZldGNoRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVsYXlFcnJvciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJlbGF5LWVycm9yJyk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVsYXlFcnJvciAmJiBpc1JlbGF5RXJyb3IgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRnVuY3Rpb25zUmVsYXlFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZ1bmN0aW9uc0h0dHBFcnJvcihyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZVR5cGUgPSAoKF9hID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAndGV4dC9wbGFpbicpLnNwbGl0KCc7JylbMF0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZicpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHlpZWxkIHJlc3BvbnNlLmJsb2IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2VUeXBlID09PSAndGV4dC9ldmVudC1zdHJlYW0nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2VUeXBlID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHlpZWxkIHJlc3BvbnNlLmZvcm1EYXRhKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIHRleHRcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHlpZWxkIHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgZXJyb3I6IG51bGwsIHJlc3BvbnNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGVycm9yIGluc3RhbmNlb2YgRnVuY3Rpb25zSHR0cEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRnVuY3Rpb25zUmVsYXlFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnJvci5jb250ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHRpbWVvdXQgaWYgaXQgd2FzIHNldFxuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdW5jdGlvbnNDbGllbnQuanMubWFwIl0sIm5hbWVzIjpbIl9fYXdhaXRlciIsInJlc29sdmVGZXRjaCIsIkZ1bmN0aW9uUmVnaW9uIiwiRnVuY3Rpb25zRmV0Y2hFcnJvciIsIkZ1bmN0aW9uc0h0dHBFcnJvciIsIkZ1bmN0aW9uc1JlbGF5RXJyb3IiLCJGdW5jdGlvbnNDbGllbnQiLCJjb25zdHJ1Y3RvciIsInVybCIsImhlYWRlcnMiLCJjdXN0b21GZXRjaCIsInJlZ2lvbiIsIkFueSIsImZldGNoIiwic2V0QXV0aCIsInRva2VuIiwiQXV0aG9yaXphdGlvbiIsImludm9rZSIsImZ1bmN0aW9uTmFtZV8xIiwiYXJndW1lbnRzIiwiZnVuY3Rpb25OYW1lIiwib3B0aW9ucyIsIl9hIiwidGltZW91dElkIiwidGltZW91dENvbnRyb2xsZXIiLCJtZXRob2QiLCJib2R5IiwiZnVuY3Rpb25BcmdzIiwic2lnbmFsIiwidGltZW91dCIsIl9oZWFkZXJzIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiQmxvYiIsIkFycmF5QnVmZmVyIiwiRm9ybURhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiZWZmZWN0aXZlU2lnbmFsIiwiQWJvcnRDb250cm9sbGVyIiwic2V0VGltZW91dCIsImFib3J0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlc3BvbnNlIiwidG9TdHJpbmciLCJhc3NpZ24iLCJjYXRjaCIsImZldGNoRXJyb3IiLCJpc1JlbGF5RXJyb3IiLCJnZXQiLCJvayIsInJlc3BvbnNlVHlwZSIsInNwbGl0IiwidHJpbSIsImRhdGEiLCJqc29uIiwiYmxvYiIsImZvcm1EYXRhIiwidGV4dCIsImVycm9yIiwiY29udGV4dCIsInVuZGVmaW5lZCIsImNsZWFyVGltZW91dCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/functions-js/dist/module/helper.js":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/functions-js/dist/module/helper.js ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ resolveFetch: () => (/* binding */ resolveFetch)\n/* harmony export */ });\nconst resolveFetch = (customFetch)=>{\n if (customFetch) {\n return (...args)=>customFetch(...args);\n }\n return (...args)=>fetch(...args);\n}; //# sourceMappingURL=helper.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL2hlbHBlci5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQU8sTUFBTUEsZUFBZSxDQUFDQztJQUN6QixJQUFJQSxhQUFhO1FBQ2IsT0FBTyxDQUFDLEdBQUdDLE9BQVNELGVBQWVDO0lBQ3ZDO0lBQ0EsT0FBTyxDQUFDLEdBQUdBLE9BQVNDLFNBQVNEO0FBQ2pDLEVBQUUsQ0FDRixrQ0FBa0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcy9kaXN0L21vZHVsZS9oZWxwZXIuanM/YjY5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgcmVzb2x2ZUZldGNoID0gKGN1c3RvbUZldGNoKSA9PiB7XG4gICAgaWYgKGN1c3RvbUZldGNoKSB7XG4gICAgICAgIHJldHVybiAoLi4uYXJncykgPT4gY3VzdG9tRmV0Y2goLi4uYXJncyk7XG4gICAgfVxuICAgIHJldHVybiAoLi4uYXJncykgPT4gZmV0Y2goLi4uYXJncyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVyLmpzLm1hcCJdLCJuYW1lcyI6WyJyZXNvbHZlRmV0Y2giLCJjdXN0b21GZXRjaCIsImFyZ3MiLCJmZXRjaCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/functions-js/dist/module/helper.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/functions-js/dist/module/helper.js":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/functions-js/dist/module/helper.js ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ resolveFetch: () => (/* binding */ resolveFetch)\n/* harmony export */ });\nconst resolveFetch = (customFetch)=>{\n if (customFetch) {\n return (...args)=>customFetch(...args);\n }\n return (...args)=>fetch(...args);\n}; //# sourceMappingURL=helper.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcy9kaXN0L21vZHVsZS9oZWxwZXIuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFPLE1BQU1BLGVBQWUsQ0FBQ0M7SUFDekIsSUFBSUEsYUFBYTtRQUNiLE9BQU8sQ0FBQyxHQUFHQyxPQUFTRCxlQUFlQztJQUN2QztJQUNBLE9BQU8sQ0FBQyxHQUFHQSxPQUFTQyxTQUFTRDtBQUNqQyxFQUFFLENBQ0Ysa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9mdW5jdGlvbnMtanMvZGlzdC9tb2R1bGUvaGVscGVyLmpzP2I2OTUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHJlc29sdmVGZXRjaCA9IChjdXN0b21GZXRjaCkgPT4ge1xuICAgIGlmIChjdXN0b21GZXRjaCkge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IGN1c3RvbUZldGNoKC4uLmFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gKC4uLmFyZ3MpID0+IGZldGNoKC4uLmFyZ3MpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhlbHBlci5qcy5tYXAiXSwibmFtZXMiOlsicmVzb2x2ZUZldGNoIiwiY3VzdG9tRmV0Y2giLCJhcmdzIiwiZmV0Y2giXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/functions-js/dist/module/helper.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/functions-js/dist/module/index.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/functions-js/dist/module/index.js ***!
|
||
\******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FunctionRegion: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_1__.FunctionRegion),\n/* harmony export */ FunctionsClient: () => (/* reexport safe */ _FunctionsClient__WEBPACK_IMPORTED_MODULE_0__.FunctionsClient),\n/* harmony export */ FunctionsError: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_1__.FunctionsError),\n/* harmony export */ FunctionsFetchError: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_1__.FunctionsFetchError),\n/* harmony export */ FunctionsHttpError: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_1__.FunctionsHttpError),\n/* harmony export */ FunctionsRelayError: () => (/* reexport safe */ _types__WEBPACK_IMPORTED_MODULE_1__.FunctionsRelayError)\n/* harmony export */ });\n/* harmony import */ var _FunctionsClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FunctionsClient */ \"(action-browser)/./node_modules/@supabase/functions-js/dist/module/FunctionsClient.js\");\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./types */ \"(action-browser)/./node_modules/@supabase/functions-js/dist/module/types.js\");\n\n //# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL2luZGV4LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQW9EO0FBQ29FLENBQ3hILGlDQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL2luZGV4LmpzPzUyN2UiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgRnVuY3Rpb25zQ2xpZW50IH0gZnJvbSAnLi9GdW5jdGlvbnNDbGllbnQnO1xuZXhwb3J0IHsgRnVuY3Rpb25zRXJyb3IsIEZ1bmN0aW9uc0ZldGNoRXJyb3IsIEZ1bmN0aW9uc0h0dHBFcnJvciwgRnVuY3Rpb25zUmVsYXlFcnJvciwgRnVuY3Rpb25SZWdpb24sIH0gZnJvbSAnLi90eXBlcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOlsiRnVuY3Rpb25zQ2xpZW50IiwiRnVuY3Rpb25zRXJyb3IiLCJGdW5jdGlvbnNGZXRjaEVycm9yIiwiRnVuY3Rpb25zSHR0cEVycm9yIiwiRnVuY3Rpb25zUmVsYXlFcnJvciIsIkZ1bmN0aW9uUmVnaW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/functions-js/dist/module/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/functions-js/dist/module/types.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/functions-js/dist/module/types.js ***!
|
||
\******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FunctionRegion: () => (/* binding */ FunctionRegion),\n/* harmony export */ FunctionsError: () => (/* binding */ FunctionsError),\n/* harmony export */ FunctionsFetchError: () => (/* binding */ FunctionsFetchError),\n/* harmony export */ FunctionsHttpError: () => (/* binding */ FunctionsHttpError),\n/* harmony export */ FunctionsRelayError: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL3R5cGVzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7O0NBV0MsR0FDTSxNQUFNQSx1QkFBdUJDO0lBQ2hDQyxZQUFZQyxPQUFPLEVBQUVDLE9BQU8sZ0JBQWdCLEVBQUVDLE9BQU8sQ0FBRTtRQUNuRCxLQUFLLENBQUNGO1FBQ04sSUFBSSxDQUFDQyxJQUFJLEdBQUdBO1FBQ1osSUFBSSxDQUFDQyxPQUFPLEdBQUdBO0lBQ25CO0FBQ0o7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNQyw0QkFBNEJOO0lBQ3JDRSxZQUFZRyxPQUFPLENBQUU7UUFDakIsS0FBSyxDQUFDLGlEQUFpRCx1QkFBdUJBO0lBQ2xGO0FBQ0o7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNRSw0QkFBNEJQO0lBQ3JDRSxZQUFZRyxPQUFPLENBQUU7UUFDakIsS0FBSyxDQUFDLDBDQUEwQyx1QkFBdUJBO0lBQzNFO0FBQ0o7QUFDQTs7Ozs7Ozs7O0NBU0MsR0FDTSxNQUFNRywyQkFBMkJSO0lBQ3BDRSxZQUFZRyxPQUFPLENBQUU7UUFDakIsS0FBSyxDQUFDLGdEQUFnRCxzQkFBc0JBO0lBQ2hGO0FBQ0o7QUFDQSw0Q0FBNEM7QUFDckMsSUFBSUksZUFBZTtBQUN6QixVQUFVQSxjQUFjO0lBQ3JCQSxjQUFjLENBQUMsTUFBTSxHQUFHO0lBQ3hCQSxjQUFjLENBQUMsZUFBZSxHQUFHO0lBQ2pDQSxjQUFjLENBQUMsZUFBZSxHQUFHO0lBQ2pDQSxjQUFjLENBQUMsV0FBVyxHQUFHO0lBQzdCQSxjQUFjLENBQUMsZUFBZSxHQUFHO0lBQ2pDQSxjQUFjLENBQUMsZUFBZSxHQUFHO0lBQ2pDQSxjQUFjLENBQUMsYUFBYSxHQUFHO0lBQy9CQSxjQUFjLENBQUMsYUFBYSxHQUFHO0lBQy9CQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0FBQ2hDLEdBQUdBLGtCQUFtQkEsQ0FBQUEsaUJBQWlCLENBQUMsS0FDeEMsaUNBQWlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9mdW5jdGlvbnMtanMvZGlzdC9tb2R1bGUvdHlwZXMuanM/Njg4ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJhc2UgZXJyb3IgZm9yIFN1cGFiYXNlIEVkZ2UgRnVuY3Rpb24gaW52b2NhdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBGdW5jdGlvbnNFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9mdW5jdGlvbnMtanMnXG4gKlxuICogdGhyb3cgbmV3IEZ1bmN0aW9uc0Vycm9yKCdVbmV4cGVjdGVkIGVycm9yIGludm9raW5nIGZ1bmN0aW9uJywgJ0Z1bmN0aW9uc0Vycm9yJywge1xuICogICByZXF1ZXN0SWQ6ICdhYmMxMjMnLFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25zRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgbmFtZSA9ICdGdW5jdGlvbnNFcnJvcicsIGNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGUgbmV0d29yayByZXF1ZXN0IHRvIGFuIEVkZ2UgRnVuY3Rpb24gZmFpbHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBGdW5jdGlvbnNGZXRjaEVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcydcbiAqXG4gKiB0aHJvdyBuZXcgRnVuY3Rpb25zRmV0Y2hFcnJvcih7IHJlcXVlc3RJZDogJ2FiYzEyMycgfSlcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25zRmV0Y2hFcnJvciBleHRlbmRzIEZ1bmN0aW9uc0Vycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKCdGYWlsZWQgdG8gc2VuZCBhIHJlcXVlc3QgdG8gdGhlIEVkZ2UgRnVuY3Rpb24nLCAnRnVuY3Rpb25zRmV0Y2hFcnJvcicsIGNvbnRleHQpO1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIFN1cGFiYXNlIHJlbGF5IGNhbm5vdCByZWFjaCB0aGUgRWRnZSBGdW5jdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEZ1bmN0aW9uc1JlbGF5RXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvZnVuY3Rpb25zLWpzJ1xuICpcbiAqIHRocm93IG5ldyBGdW5jdGlvbnNSZWxheUVycm9yKHsgcmVnaW9uOiAndXMtZWFzdC0xJyB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbnNSZWxheUVycm9yIGV4dGVuZHMgRnVuY3Rpb25zRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoJ1JlbGF5IEVycm9yIGludm9raW5nIHRoZSBFZGdlIEZ1bmN0aW9uJywgJ0Z1bmN0aW9uc1JlbGF5RXJyb3InLCBjb250ZXh0KTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSBFZGdlIEZ1bmN0aW9uIHJldHVybnMgYSBub24tMnh4IHN0YXR1cyBjb2RlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgRnVuY3Rpb25zSHR0cEVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcydcbiAqXG4gKiB0aHJvdyBuZXcgRnVuY3Rpb25zSHR0cEVycm9yKHsgc3RhdHVzOiA1MDAgfSlcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25zSHR0cEVycm9yIGV4dGVuZHMgRnVuY3Rpb25zRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoJ0VkZ2UgRnVuY3Rpb24gcmV0dXJuZWQgYSBub24tMnh4IHN0YXR1cyBjb2RlJywgJ0Z1bmN0aW9uc0h0dHBFcnJvcicsIGNvbnRleHQpO1xuICAgIH1cbn1cbi8vIERlZmluZSB0aGUgZW51bSBmb3IgdGhlICdyZWdpb24nIHByb3BlcnR5XG5leHBvcnQgdmFyIEZ1bmN0aW9uUmVnaW9uO1xuKGZ1bmN0aW9uIChGdW5jdGlvblJlZ2lvbikge1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiQW55XCJdID0gXCJhbnlcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIkFwTm9ydGhlYXN0MVwiXSA9IFwiYXAtbm9ydGhlYXN0LTFcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIkFwTm9ydGhlYXN0MlwiXSA9IFwiYXAtbm9ydGhlYXN0LTJcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIkFwU291dGgxXCJdID0gXCJhcC1zb3V0aC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJBcFNvdXRoZWFzdDFcIl0gPSBcImFwLXNvdXRoZWFzdC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJBcFNvdXRoZWFzdDJcIl0gPSBcImFwLXNvdXRoZWFzdC0yXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJDYUNlbnRyYWwxXCJdID0gXCJjYS1jZW50cmFsLTFcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIkV1Q2VudHJhbDFcIl0gPSBcImV1LWNlbnRyYWwtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiRXVXZXN0MVwiXSA9IFwiZXUtd2VzdC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJFdVdlc3QyXCJdID0gXCJldS13ZXN0LTJcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIkV1V2VzdDNcIl0gPSBcImV1LXdlc3QtM1wiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiU2FFYXN0MVwiXSA9IFwic2EtZWFzdC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJVc0Vhc3QxXCJdID0gXCJ1cy1lYXN0LTFcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIlVzV2VzdDFcIl0gPSBcInVzLXdlc3QtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiVXNXZXN0MlwiXSA9IFwidXMtd2VzdC0yXCI7XG59KShGdW5jdGlvblJlZ2lvbiB8fCAoRnVuY3Rpb25SZWdpb24gPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIl0sIm5hbWVzIjpbIkZ1bmN0aW9uc0Vycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm1lc3NhZ2UiLCJuYW1lIiwiY29udGV4dCIsIkZ1bmN0aW9uc0ZldGNoRXJyb3IiLCJGdW5jdGlvbnNSZWxheUVycm9yIiwiRnVuY3Rpb25zSHR0cEVycm9yIiwiRnVuY3Rpb25SZWdpb24iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/functions-js/dist/module/types.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/functions-js/dist/module/types.js":
|
||
/*!******************************************************************!*\
|
||
!*** ./node_modules/@supabase/functions-js/dist/module/types.js ***!
|
||
\******************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FunctionRegion: () => (/* binding */ FunctionRegion),\n/* harmony export */ FunctionsError: () => (/* binding */ FunctionsError),\n/* harmony export */ FunctionsFetchError: () => (/* binding */ FunctionsFetchError),\n/* harmony export */ FunctionsHttpError: () => (/* binding */ FunctionsHttpError),\n/* harmony export */ FunctionsRelayError: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcy9kaXN0L21vZHVsZS90eXBlcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOzs7Ozs7Ozs7OztDQVdDLEdBQ00sTUFBTUEsdUJBQXVCQztJQUNoQ0MsWUFBWUMsT0FBTyxFQUFFQyxPQUFPLGdCQUFnQixFQUFFQyxPQUFPLENBQUU7UUFDbkQsS0FBSyxDQUFDRjtRQUNOLElBQUksQ0FBQ0MsSUFBSSxHQUFHQTtRQUNaLElBQUksQ0FBQ0MsT0FBTyxHQUFHQTtJQUNuQjtBQUNKO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTUMsNEJBQTRCTjtJQUNyQ0UsWUFBWUcsT0FBTyxDQUFFO1FBQ2pCLEtBQUssQ0FBQyxpREFBaUQsdUJBQXVCQTtJQUNsRjtBQUNKO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTUUsNEJBQTRCUDtJQUNyQ0UsWUFBWUcsT0FBTyxDQUFFO1FBQ2pCLEtBQUssQ0FBQywwQ0FBMEMsdUJBQXVCQTtJQUMzRTtBQUNKO0FBQ0E7Ozs7Ozs7OztDQVNDLEdBQ00sTUFBTUcsMkJBQTJCUjtJQUNwQ0UsWUFBWUcsT0FBTyxDQUFFO1FBQ2pCLEtBQUssQ0FBQyxnREFBZ0Qsc0JBQXNCQTtJQUNoRjtBQUNKO0FBQ0EsNENBQTRDO0FBQ3JDLElBQUlJLGVBQWU7QUFDekIsVUFBVUEsY0FBYztJQUNyQkEsY0FBYyxDQUFDLE1BQU0sR0FBRztJQUN4QkEsY0FBYyxDQUFDLGVBQWUsR0FBRztJQUNqQ0EsY0FBYyxDQUFDLGVBQWUsR0FBRztJQUNqQ0EsY0FBYyxDQUFDLFdBQVcsR0FBRztJQUM3QkEsY0FBYyxDQUFDLGVBQWUsR0FBRztJQUNqQ0EsY0FBYyxDQUFDLGVBQWUsR0FBRztJQUNqQ0EsY0FBYyxDQUFDLGFBQWEsR0FBRztJQUMvQkEsY0FBYyxDQUFDLGFBQWEsR0FBRztJQUMvQkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztBQUNoQyxHQUFHQSxrQkFBbUJBLENBQUFBLGlCQUFpQixDQUFDLEtBQ3hDLGlDQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvZnVuY3Rpb25zLWpzL2Rpc3QvbW9kdWxlL3R5cGVzLmpzPzY4OGUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXNlIGVycm9yIGZvciBTdXBhYmFzZSBFZGdlIEZ1bmN0aW9uIGludm9jYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgRnVuY3Rpb25zRXJyb3IgfSBmcm9tICdAc3VwYWJhc2UvZnVuY3Rpb25zLWpzJ1xuICpcbiAqIHRocm93IG5ldyBGdW5jdGlvbnNFcnJvcignVW5leHBlY3RlZCBlcnJvciBpbnZva2luZyBmdW5jdGlvbicsICdGdW5jdGlvbnNFcnJvcicsIHtcbiAqICAgcmVxdWVzdElkOiAnYWJjMTIzJyxcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIG5hbWUgPSAnRnVuY3Rpb25zRXJyb3InLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cbn1cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIG5ldHdvcmsgcmVxdWVzdCB0byBhbiBFZGdlIEZ1bmN0aW9uIGZhaWxzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgRnVuY3Rpb25zRmV0Y2hFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9mdW5jdGlvbnMtanMnXG4gKlxuICogdGhyb3cgbmV3IEZ1bmN0aW9uc0ZldGNoRXJyb3IoeyByZXF1ZXN0SWQ6ICdhYmMxMjMnIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uc0ZldGNoRXJyb3IgZXh0ZW5kcyBGdW5jdGlvbnNFcnJvciB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dCkge1xuICAgICAgICBzdXBlcignRmFpbGVkIHRvIHNlbmQgYSByZXF1ZXN0IHRvIHRoZSBFZGdlIEZ1bmN0aW9uJywgJ0Z1bmN0aW9uc0ZldGNoRXJyb3InLCBjb250ZXh0KTtcbiAgICB9XG59XG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIHRoZSBTdXBhYmFzZSByZWxheSBjYW5ub3QgcmVhY2ggdGhlIEVkZ2UgRnVuY3Rpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBGdW5jdGlvbnNSZWxheUVycm9yIH0gZnJvbSAnQHN1cGFiYXNlL2Z1bmN0aW9ucy1qcydcbiAqXG4gKiB0aHJvdyBuZXcgRnVuY3Rpb25zUmVsYXlFcnJvcih7IHJlZ2lvbjogJ3VzLWVhc3QtMScgfSlcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25zUmVsYXlFcnJvciBleHRlbmRzIEZ1bmN0aW9uc0Vycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKCdSZWxheSBFcnJvciBpbnZva2luZyB0aGUgRWRnZSBGdW5jdGlvbicsICdGdW5jdGlvbnNSZWxheUVycm9yJywgY29udGV4dCk7XG4gICAgfVxufVxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGUgRWRnZSBGdW5jdGlvbiByZXR1cm5zIGEgbm9uLTJ4eCBzdGF0dXMgY29kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEZ1bmN0aW9uc0h0dHBFcnJvciB9IGZyb20gJ0BzdXBhYmFzZS9mdW5jdGlvbnMtanMnXG4gKlxuICogdGhyb3cgbmV3IEZ1bmN0aW9uc0h0dHBFcnJvcih7IHN0YXR1czogNTAwIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uc0h0dHBFcnJvciBleHRlbmRzIEZ1bmN0aW9uc0Vycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKCdFZGdlIEZ1bmN0aW9uIHJldHVybmVkIGEgbm9uLTJ4eCBzdGF0dXMgY29kZScsICdGdW5jdGlvbnNIdHRwRXJyb3InLCBjb250ZXh0KTtcbiAgICB9XG59XG4vLyBEZWZpbmUgdGhlIGVudW0gZm9yIHRoZSAncmVnaW9uJyBwcm9wZXJ0eVxuZXhwb3J0IHZhciBGdW5jdGlvblJlZ2lvbjtcbihmdW5jdGlvbiAoRnVuY3Rpb25SZWdpb24pIHtcbiAgICBGdW5jdGlvblJlZ2lvbltcIkFueVwiXSA9IFwiYW55XCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJBcE5vcnRoZWFzdDFcIl0gPSBcImFwLW5vcnRoZWFzdC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJBcE5vcnRoZWFzdDJcIl0gPSBcImFwLW5vcnRoZWFzdC0yXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJBcFNvdXRoMVwiXSA9IFwiYXAtc291dGgtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiQXBTb3V0aGVhc3QxXCJdID0gXCJhcC1zb3V0aGVhc3QtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiQXBTb3V0aGVhc3QyXCJdID0gXCJhcC1zb3V0aGVhc3QtMlwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiQ2FDZW50cmFsMVwiXSA9IFwiY2EtY2VudHJhbC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJFdUNlbnRyYWwxXCJdID0gXCJldS1jZW50cmFsLTFcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIkV1V2VzdDFcIl0gPSBcImV1LXdlc3QtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiRXVXZXN0MlwiXSA9IFwiZXUtd2VzdC0yXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJFdVdlc3QzXCJdID0gXCJldS13ZXN0LTNcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIlNhRWFzdDFcIl0gPSBcInNhLWVhc3QtMVwiO1xuICAgIEZ1bmN0aW9uUmVnaW9uW1wiVXNFYXN0MVwiXSA9IFwidXMtZWFzdC0xXCI7XG4gICAgRnVuY3Rpb25SZWdpb25bXCJVc1dlc3QxXCJdID0gXCJ1cy13ZXN0LTFcIjtcbiAgICBGdW5jdGlvblJlZ2lvbltcIlVzV2VzdDJcIl0gPSBcInVzLXdlc3QtMlwiO1xufSkoRnVuY3Rpb25SZWdpb24gfHwgKEZ1bmN0aW9uUmVnaW9uID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCJdLCJuYW1lcyI6WyJGdW5jdGlvbnNFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJtZXNzYWdlIiwibmFtZSIsImNvbnRleHQiLCJGdW5jdGlvbnNGZXRjaEVycm9yIiwiRnVuY3Rpb25zUmVsYXlFcnJvciIsIkZ1bmN0aW9uc0h0dHBFcnJvciIsIkZ1bmN0aW9uUmVnaW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/functions-js/dist/module/types.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js":
|
||
/*!***************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js ***!
|
||
\***************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_CHANNEL_STATES: () => (/* binding */ REALTIME_CHANNEL_STATES),\n/* harmony export */ REALTIME_LISTEN_TYPES: () => (/* binding */ REALTIME_LISTEN_TYPES),\n/* harmony export */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT: () => (/* binding */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT),\n/* harmony export */ REALTIME_SUBSCRIBE_STATES: () => (/* binding */ REALTIME_SUBSCRIBE_STATES),\n/* harmony export */ \"default\": () => (/* binding */ RealtimeChannel)\n/* harmony export */ });\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/constants */ \"(action-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 */ \"(action-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 */ \"(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js\");\n/* harmony import */ var _RealtimePresence__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./RealtimePresence */ \"(action-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js\");\n/* harmony import */ var _lib_transformers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/transformers */ \"(action-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;\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 */ class RealtimeChannel {\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 ${this.topic} ${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 ${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 ${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 ${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 '${this.topic}'. It must be a private channel.`;\n }\n }\n /** Subscribe registers your client with the server */ subscribe(callback, timeout = 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 ({ postgres_changes })=>{\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, opts = {}) {\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(opts = {}) {\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 ${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, opts = {}) {\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 ${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, opts = {}) {\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 ${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(timeout = this.timeout) {\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.leaving;\n const onClose = ()=>{\n this.socket.log(\"channel\", `leave ${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, timeout = this.timeout) {\n if (!this.joinedOnce) {\n throw `tried to push '${event}' to '${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: ${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_${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(timeout = 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} //# sourceMappingURL=RealtimeChannel.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvUmVhbHRpbWVDaGFubmVsLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBdUY7QUFDekQ7QUFDRTtBQUNrQjtBQUNDO0FBQ0U7QUFDOUMsSUFBSVEsdUNBQXVDO0FBQ2pELFVBQVVBLHNDQUFzQztJQUM3Q0Esc0NBQXNDLENBQUMsTUFBTSxHQUFHO0lBQ2hEQSxzQ0FBc0MsQ0FBQyxTQUFTLEdBQUc7SUFDbkRBLHNDQUFzQyxDQUFDLFNBQVMsR0FBRztJQUNuREEsc0NBQXNDLENBQUMsU0FBUyxHQUFHO0FBQ3ZELEdBQUdBLDBDQUEyQ0EsQ0FBQUEseUNBQXlDLENBQUM7QUFDakYsSUFBSUMsc0JBQXNCO0FBQ2hDLFVBQVVBLHFCQUFxQjtJQUM1QkEscUJBQXFCLENBQUMsWUFBWSxHQUFHO0lBQ3JDQSxxQkFBcUIsQ0FBQyxXQUFXLEdBQUc7SUFDcENBLHFCQUFxQixDQUFDLG1CQUFtQixHQUFHO0lBQzVDQSxxQkFBcUIsQ0FBQyxTQUFTLEdBQUc7QUFDdEMsR0FBR0EseUJBQTBCQSxDQUFBQSx3QkFBd0IsQ0FBQztBQUMvQyxJQUFJQywwQkFBMEI7QUFDcEMsVUFBVUEseUJBQXlCO0lBQ2hDQSx5QkFBeUIsQ0FBQyxhQUFhLEdBQUc7SUFDMUNBLHlCQUF5QixDQUFDLFlBQVksR0FBRztJQUN6Q0EseUJBQXlCLENBQUMsU0FBUyxHQUFHO0lBQ3RDQSx5QkFBeUIsQ0FBQyxnQkFBZ0IsR0FBRztBQUNqRCxHQUFHQSw2QkFBOEJBLENBQUFBLDRCQUE0QixDQUFDO0FBQ3ZELE1BQU1DLDBCQUEwQlYsMERBQWNBLENBQUM7QUFDdEQ7Ozs7Q0FJQyxHQUNjLE1BQU1XO0lBQ2pCOzs7Ozs7Ozs7Ozs7Ozs7S0FlQyxHQUNEQyxZQUNBLGtDQUFrQyxHQUNsQ0MsS0FBSyxFQUFFQyxTQUFTO1FBQUVDLFFBQVEsQ0FBQztJQUFFLENBQUMsRUFBRUMs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QUU7UUFDNUIsSUFBSSxJQUFJLENBQUNrQixVQUFVLElBQUk7WUFDbkI7UUFDSjtRQUNBLElBQUksQ0FBQ3JDLE1BQU0sQ0FBQ2dNLGVBQWUsQ0FBQyxJQUFJLENBQUNuTSxLQUFLO1FBQ3RDLElBQUksQ0FBQ08sS0FBSyxHQUFHcEIsMERBQWNBLENBQUNvTSxPQUFPO1FBQ25DLElBQUksQ0FBQ2hLLFFBQVEsQ0FBQzZLLE1BQU0sQ0FBQzlLO0lBQ3pCO0lBQ0EsY0FBYyxHQUNkK0osbUJBQW1CdEksT0FBTyxFQUFFO1FBQ3hCLE1BQU1zSixVQUFVO1lBQ1psQixLQUFLLENBQUM7WUFDTkMsS0FBSyxDQUFDO1FBQ1Y7UUFDQSxJQUFJckksUUFBUXNELElBQUksS0FBSyxZQUFZdEQsUUFBUXNELElBQUksS0FBSyxVQUFVO1lBQ3hEZ0csUUFBUWxCLEdBQUcsR0FBRzNMLGdFQUE4QixDQUFDdUQsUUFBUXdKLE9BQU8sRUFBRXhKLFFBQVF5SixNQUFNO1FBQ2hGO1FBQ0EsSUFBSXpKLFFBQVFzRCxJQUFJLEtBQUssWUFBWXRELFFBQVFzRCxJQUFJLEtBQUssVUFBVTtZQUN4RGdHLFFBQVFqQixHQUFHLEdBQUc1TCxnRUFBOEIsQ0FBQ3VELFFBQVF3SixPQUFPLEVBQUV4SixRQUFRMEosVUFBVTtRQUNwRjtRQUNBLE9BQU9KO0lBQ1g7QUFDSixFQUNBLDJDQUEyQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvUmVhbHRpbWVDaGFubmVsLmpzP2VjNGMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0hBTk5FTF9FVkVOVFMsIENIQU5ORUxfU1RBVEVTLCBNQVhfUFVTSF9CVUZGRVJfU0laRSB9IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgUHVzaCBmcm9tICcuL2xpYi9wdXNoJztcbmltcG9ydCBUaW1lciBmcm9tICcuL2xpYi90aW1lcic7XG5pbXBvcnQgUmVhbHRpbWVQcmVzZW5jZSBmcm9tICcuL1JlYWx0aW1lUHJlc2VuY2UnO1xuaW1wb3J0ICogYXMgVHJhbnNmb3JtZXJzIGZyb20gJy4vbGliL3RyYW5zZm9ybWVycyc7XG5pbXBvcnQgeyBodHRwRW5kcG9pbnRVUkwgfSBmcm9tICcuL2xpYi90cmFuc2Zvcm1lcnMnO1xuZXhwb3J0IHZhciBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVDtcbihmdW5jdGlvbiAoUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlQpIHtcbiAgICBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVFtcIkFMTFwiXSA9IFwiKlwiO1xuICAgIFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UW1wiSU5TRVJUXCJdID0gXCJJTlNFUlRcIjtcbiAgICBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVFtcIlVQREFURVwiXSA9IFwiVVBEQVRFXCI7XG4gICAgUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlRbXCJERUxFVEVcIl0gPSBcIkRFTEVURVwiO1xufSkoUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlQgfHwgKFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UID0ge30pKTtcbmV4cG9ydCB2YXIgUkVBTFRJTUVfTElTVEVOX1RZUEVTO1xuKGZ1bmN0aW9uIChSRUFMVElNRV9MSVNURU5fVFlQRVMpIHtcbiAgICBSRUFMVElNRV9MSVNURU5fVFlQRVNbXCJCUk9BRENBU1RcIl0gPSBcImJyb2FkY2FzdFwiO1xuICAgIFJFQUxUSU1FX0xJU1RFTl9UWVBFU1tcIlBSRVNFTkNFXCJdID0gXCJwcmVzZW5jZVwiO1xuICAgIFJFQUxUSU1FX0xJU1RFTl9UWVBFU1tcIlBPU1RHUkVTX0NIQU5HRVNcIl0gPSBcInBvc3RncmVzX2NoYW5nZXNcIjtcbiAgICBSRUFMVElNRV9MSVNURU5fVFlQRVNbXCJTWVNURU1cIl0gPSBcInN5c3RlbVwiO1xufSkoUkVBTFRJTUVfTElTVEVOX1RZUEVTIHx8IChSRUFMVElNRV9MSVNURU5fVFlQRVMgPSB7fSkpO1xuZXhwb3J0IHZhciBSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTO1xuKGZ1bmN0aW9uIChSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTKSB7XG4gICAgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFU1tcIlNVQlNDUklCRURcIl0gPSBcIlNVQlNDUklCRURcIjtcbiAgICBSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTW1wiVElNRURfT1VUXCJdID0gXCJUSU1FRF9PVVRcIjtcbiAgICBSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTW1wiQ0xPU0VEXCJdID0gXCJDTE9TRURcIjtcbiAgICBSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTW1wiQ0hBTk5FTF9FUlJPUlwiXSA9IFwiQ0hBTk5FTF9FUlJPUlwiO1xufSkoUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUyB8fCAoUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUyA9IHt9KSk7XG5leHBvcnQgY29uc3QgUkVBTFRJTUVfQ0hBTk5FTF9TVEFURVMgPSBDSEFOTkVMX1NUQVRFUztcbi8qKiBBIGNoYW5uZWwgaXMgdGhlIGJhc2ljIGJ1aWxkaW5nIGJsb2NrIG9mIFJlYWx0aW1lXG4gKiBhbmQgbmFycm93cyB0aGUgc2NvcGUgb2YgZGF0YSBmbG93IHRvIHN1YnNjcmliZWQgY2xpZW50cy5cbiAqIFlvdSBjYW4gdGhpbmsgb2YgYSBjaGFubmVsIGFzIGEgY2hhdHJvb20gd2hlcmUgcGFydGljaXBhbnRzIGFyZSBhYmxlIHRvIHNlZSB3aG8ncyBvbmxpbmVcbiAqIGFuZCBzZW5kIGFuZCByZWNlaXZlIG1lc3NhZ2VzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWFsdGltZUNoYW5uZWwge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjaGFubmVsIHRoYXQgY2FuIGJyb2FkY2FzdCBtZXNzYWdlcywgc3luYyBwcmVzZW5jZSwgYW5kIGxpc3RlbiB0byBQb3N0Z3JlcyBjaGFuZ2VzLlxuICAgICAqXG4gICAgICogVGhlIHRvcGljIGRldGVybWluZXMgd2hpY2ggcmVhbHRpbWUgc3RyZWFtIHlvdSBhcmUgc3Vic2NyaWJpbmcgdG8uIENvbmZpZyBvcHRpb25zIGxldCB5b3VcbiAgICAgKiBlbmFibGUgYWNrbm93bGVkZ2VtZW50IGZvciBicm9hZGNhc3RzLCBwcmVzZW5jZSB0cmFja2luZywgb3IgcHJpdmF0ZSBjaGFubmVscy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgUmVhbHRpbWVDbGllbnQgZnJvbSAnQHN1cGFiYXNlL3JlYWx0aW1lLWpzJ1xuICAgICAqXG4gICAgICogY29uc3QgY2xpZW50ID0gbmV3IFJlYWx0aW1lQ2xpZW50KCdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vcmVhbHRpbWUvdjEnLCB7XG4gICAgICogICBwYXJhbXM6IHsgYXBpa2V5OiAncHVibGljLWFub24ta2V5JyB9LFxuICAgICAqIH0pXG4gICAgICogY29uc3QgY2hhbm5lbCA9IG5ldyBSZWFsdGltZUNoYW5uZWwoJ3JlYWx0aW1lOnB1YmxpYzptZXNzYWdlcycsIHsgY29uZmlnOiB7fSB9LCBjbGllbnQpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqIFRvcGljIG5hbWUgY2FuIGJlIGFueSBzdHJpbmcuICovXG4gICAgdG9waWMsIHBhcmFtcyA9IHsgY29uZmlnOiB7fSB9LCBzb2NrZXQpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdGhpcy50b3BpYyA9IHRvcGljO1xuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgIHRoaXMuYmluZGluZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmNsb3NlZDtcbiAgICAgICAgdGhpcy5qb2luZWRPbmNlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLnN1YlRvcGljID0gdG9waWMucmVwbGFjZSgvXnJlYWx0aW1lOi9pLCAnJyk7XG4gICAgICAgIHRoaXMucGFyYW1zLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgYnJvYWRjYXN0OiB7IGFjazogZmFsc2UsIHNlbGY6IGZhbHNlIH0sXG4gICAgICAgICAgICBwcmVzZW5jZTogeyBrZXk6ICcnLCBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgcHJpdmF0ZTogZmFsc2UsXG4gICAgICAgIH0sIHBhcmFtcy5jb25maWcpO1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aGlzLnNvY2tldC50aW1lb3V0O1xuICAgICAgICB0aGlzLmpvaW5QdXNoID0gbmV3IFB1c2godGhpcywgQ0hBTk5FTF9FVkVOVFMuam9pbiwgdGhpcy5wYXJhbXMsIHRoaXMudGltZW91dCk7XG4gICAgICAgIHRoaXMucmVqb2luVGltZXIgPSBuZXcgVGltZXIoKCkgPT4gdGhpcy5fcmVqb2luVW50aWxDb25uZWN0ZWQoKSwgdGhpcy5zb2NrZXQucmVjb25uZWN0QWZ0ZXJNcyk7XG4gICAgICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZSgnb2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuam9pbmVkO1xuICAgICAgICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5wdXNoQnVmZmVyLmZvckVhY2goKHB1c2hFdmVudCkgPT4gcHVzaEV2ZW50LnNlbmQoKSk7XG4gICAgICAgICAgICB0aGlzLnB1c2hCdWZmZXIgPSBbXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX29uQ2xvc2UoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQubG9nKCdjaGFubmVsJywgYGNsb3NlICR7dGhpcy50b3BpY30gJHt0aGlzLl9qb2luUmVmKCl9YCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuX3JlbW92ZSh0aGlzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX29uRXJyb3IoKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzTGVhdmluZygpIHx8IHRoaXMuX2lzQ2xvc2VkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5sb2coJ2NoYW5uZWwnLCBgZXJyb3IgJHt0aGlzLnRvcGljfWAsIHJlYXNvbik7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZDtcbiAgICAgICAgICAgIHRoaXMucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzSm9pbmluZygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zb2NrZXQubG9nKCdjaGFubmVsJywgYHRpbWVvdXQgJHt0aGlzLnRvcGljfWAsIHRoaXMuam9pblB1c2gudGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZDtcbiAgICAgICAgICAgIHRoaXMucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoJ2Vycm9yJywgKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzTGVhdmluZygpIHx8IHRoaXMuX2lzQ2xvc2VkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5sb2coJ2NoYW5uZWwnLCBgZXJyb3IgJHt0aGlzLnRvcGljfWAsIHJlYXNvbik7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZDtcbiAgICAgICAgICAgIHRoaXMucmVqb2luVGltZXIuc2NoZWR1bGVUaW1lb3V0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9vbihDSEFOTkVMX0VWRU5UUy5yZXBseSwge30sIChwYXlsb2FkLCByZWYpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIodGhpcy5fcmVwbHlFdmVudE5hbWUocmVmKSwgcGF5bG9hZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByZXNlbmNlID0gbmV3IFJlYWx0aW1lUHJlc2VuY2UodGhpcyk7XG4gICAgICAgIHRoaXMuYnJvYWRjYXN0RW5kcG9pbnRVUkwgPSBodHRwRW5kcG9pbnRVUkwodGhpcy5zb2NrZXQuZW5kUG9pbnQpO1xuICAgICAgICB0aGlzLnByaXZhdGUgPSB0aGlzLnBhcmFtcy5jb25maWcucHJpdmF0ZSB8fCBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLnByaXZhdGUgJiYgKChfYiA9IChfYSA9IHRoaXMucGFyYW1zLmNvbmZpZykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmJyb2FkY2FzdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnJlcGxheSkpIHtcbiAgICAgICAgICAgIHRocm93IGB0cmllZCB0byB1c2UgcmVwbGF5IG9uIHB1YmxpYyBjaGFubmVsICcke3RoaXMudG9waWN9Jy4gSXQgbXVzdCBiZSBhIHByaXZhdGUgY2hhbm5lbC5gO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBTdWJzY3JpYmUgcmVnaXN0ZXJzIHlvdXIgY2xpZW50IHdpdGggdGhlIHNlcnZlciAqL1xuICAgIHN1YnNjcmliZShjYWxsYmFjaywgdGltZW91dCA9IHRoaXMudGltZW91dCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgaWYgKCF0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkKSB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbmZpZzogeyBicm9hZGNhc3QsIHByZXNlbmNlLCBwcml2YXRlOiBpc1ByaXZhdGUgfSwgfSA9IHRoaXMucGFyYW1zO1xuICAgICAgICAgICAgY29uc3QgcG9zdGdyZXNfY2hhbmdlcyA9IChfYiA9IChfYSA9IHRoaXMuYmluZGluZ3MucG9zdGdyZXNfY2hhbmdlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcCgocikgPT4gci5maWx0ZXIpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXTtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbmNlX2VuYWJsZWQgPSAoISF0aGlzLmJpbmRpbmdzW1JFQUxUSU1FX0xJU1RFTl9UWVBFUy5QUkVTRU5DRV0gJiZcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRpbmdzW1JFQUxUSU1FX0xJU1RFTl9UWVBFUy5QUkVTRU5DRV0ubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAoKF9jID0gdGhpcy5wYXJhbXMuY29uZmlnLnByZXNlbmNlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZW5hYmxlZCkgPT09IHRydWU7XG4gICAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblBheWxvYWQgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBicm9hZGNhc3QsXG4gICAgICAgICAgICAgICAgcHJlc2VuY2U6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJlc2VuY2UpLCB7IGVuYWJsZWQ6IHByZXNlbmNlX2VuYWJsZWQgfSksXG4gICAgICAgICAgICAgICAgcG9zdGdyZXNfY2hhbmdlcyxcbiAgICAgICAgICAgICAgICBwcml2YXRlOiBpc1ByaXZhdGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0LmFjY2Vzc1Rva2VuVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlblBheWxvYWQuYWNjZXNzX3Rva2VuID0gdGhpcy5zb2NrZXQuYWNjZXNzVG9rZW5WYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoKGUpID0+IGNhbGxiYWNrID09PSBudWxsIHx8IGNhbGxiYWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWxsYmFjayhSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTLkNIQU5ORUxfRVJST1IsIGUpKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoKCkgPT4gY2FsbGJhY2sgPT09IG51bGwgfHwgY2FsbGJhY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhbGxiYWNrKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMuQ0xPU0VEKSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUpvaW5QYXlsb2FkKE9iamVjdC5hc3NpZ24oeyBjb25maWcgfSwgYWNjZXNzVG9rZW5QYXlsb2FkKSk7XG4gICAgICAgICAgICB0aGlzLmpvaW5lZE9uY2UgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fcmVqb2luKHRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5qb2luUHVzaFxuICAgICAgICAgICAgICAgIC5yZWNlaXZlKCdvaycsIGFzeW5jICh7IHBvc3RncmVzX2NoYW5nZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHJlZnJlc2ggYXV0aCBpZiB1c2luZyBjYWxsYmFjay1iYXNlZCB0b2tlbnNcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc29ja2V0Ll9pc01hbnVhbFRva2VuKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2V0QXV0aCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocG9zdGdyZXNfY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID09PSBudWxsIHx8IGNhbGxiYWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWxsYmFjayhSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTLlNVQlNDUklCRUQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRQb3N0Z3Jlc0JpbmRpbmdzID0gdGhpcy5iaW5kaW5ncy5wb3N0Z3Jlc19jaGFuZ2VzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiaW5kaW5nc0xlbiA9IChfYSA9IGNsaWVudFBvc3RncmVzQmluZGluZ3MgPT09IG51bGwgfHwgY2xpZW50UG9zdGdyZXNCaW5kaW5ncyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xpZW50UG9zdGdyZXNCaW5kaW5ncy5sZW5ndGgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1Bvc3RncmVzQmluZGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5kaW5nc0xlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRQb3N0Z3Jlc0JpbmRpbmcgPSBjbGllbnRQb3N0Z3Jlc0JpbmRpbmdzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBmaWx0ZXI6IHsgZXZlbnQsIHNjaGVtYSwgdGFibGUsIGZpbHRlciB9LCB9ID0gY2xpZW50UG9zdGdyZXNCaW5kaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVyUG9zdGdyZXNGaWx0ZXIgPSBwb3N0Z3Jlc19jaGFuZ2VzICYmIHBvc3RncmVzX2NoYW5nZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyUG9zdGdyZXNGaWx0ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJQb3N0Z3Jlc0ZpbHRlci5ldmVudCA9PT0gZXZlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsdGltZUNoYW5uZWwuaXNGaWx0ZXJWYWx1ZUVxdWFsKHNlcnZlclBvc3RncmVzRmlsdGVyLnNjaGVtYSwgc2NoZW1hKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWx0aW1lQ2hhbm5lbC5pc0ZpbHRlclZhbHVlRXF1YWwoc2VydmVyUG9zdGdyZXNGaWx0ZXIudGFibGUsIHRhYmxlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWx0aW1lQ2hhbm5lbC5pc0ZpbHRlclZhbHVlRXF1YWwoc2VydmVyUG9zdGdyZXNGaWx0ZXIuZmlsdGVyLCBmaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9zdGdyZXNCaW5kaW5ncy5wdXNoKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2xpZW50UG9zdGdyZXNCaW5kaW5nKSwgeyBpZDogc2VydmVyUG9zdGdyZXNGaWx0ZXIuaWQgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID09PSBudWxsIHx8IGNhbGxiYWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWxsYmFjayhSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTLkNIQU5ORUxfRVJST1IsIG5ldyBFcnJvcignbWlzbWF0Y2ggYmV0d2VlbiBzZXJ2ZXIgYW5kIGNsaWVudCBiaW5kaW5ncyBmb3IgcG9zdGdyZXMgY2hhbmdlcycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5ncy5wb3N0Z3Jlc19jaGFuZ2VzID0gbmV3UG9zdGdyZXNCaW5kaW5ncztcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUy5TVUJTQ1JJQkVEKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlY2VpdmUoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWQ7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPT09IG51bGwgfHwgY2FsbGJhY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhbGxiYWNrKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMuQ0hBTk5FTF9FUlJPUiwgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KE9iamVjdC52YWx1ZXMoZXJyb3IpLmpvaW4oJywgJykgfHwgJ2Vycm9yJykpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZWNlaXZlKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID09PSBudWxsIHx8IGNhbGxiYWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWxsYmFjayhSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTLlRJTUVEX09VVCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcHJlc2VuY2Ugc3RhdGUgZm9yIHRoaXMgY2hhbm5lbC5cbiAgICAgKlxuICAgICAqIFRoZSBzaGFwZSBpcyBhIG1hcCBrZXllZCBieSBwcmVzZW5jZSBrZXkgKGZvciBleGFtcGxlIGEgdXNlciBpZCkgd2hlcmUgZWFjaCBlbnRyeSBjb250YWlucyB0aGVcbiAgICAgKiB0cmFja2VkIG1ldGFkYXRhIGZvciB0aGF0IHVzZXIuXG4gICAgICovXG4gICAgcHJlc2VuY2VTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlc2VuY2Uuc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIHRoZSBzdXBwbGllZCBwYXlsb2FkIHRvIHRoZSBwcmVzZW5jZSB0cmFja2VyIHNvIG90aGVyIHN1YnNjcmliZXJzIGNhbiBzZWUgdGhhdCB0aGlzXG4gICAgICogY2xpZW50IGlzIG9ubGluZS4gVXNlIGB1bnRyYWNrYCB0byBzdG9wIGJyb2FkY2FzdGluZyBwcmVzZW5jZSBmb3IgdGhlIHNhbWUga2V5LlxuICAgICAqL1xuICAgIGFzeW5jIHRyYWNrKHBheWxvYWQsIG9wdHMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgICAgICAgIHR5cGU6ICdwcmVzZW5jZScsXG4gICAgICAgICAgICBldmVudDogJ3RyYWNrJyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgIH0sIG9wdHMudGltZW91dCB8fCB0aGlzLnRpbWVvdXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBjdXJyZW50IHByZXNlbmNlIHN0YXRlIGZvciB0aGlzIGNsaWVudC5cbiAgICAgKi9cbiAgICBhc3luYyB1bnRyYWNrKG9wdHMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgICAgICAgIHR5cGU6ICdwcmVzZW5jZScsXG4gICAgICAgICAgICBldmVudDogJ3VudHJhY2snLFxuICAgICAgICB9LCBvcHRzKTtcbiAgICB9XG4gICAgb24odHlwZSwgZmlsdGVyLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkICYmIHR5cGUgPT09IFJFQUxUSU1FX0xJU1RFTl9UWVBFUy5QUkVTRU5DRSkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQubG9nKCdjaGFubmVsJywgYHJlc3Vic2NyaWJlIHRvICR7dGhpcy50b3BpY30gZHVlIHRvIGNoYW5nZSBpbiBwcmVzZW5jZSBjYWxsYmFja3Mgb24gam9pbmVkIGNoYW5uZWxgKTtcbiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKS50aGVuKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuc3Vic2NyaWJlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9vbih0eXBlLCBmaWx0ZXIsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBicm9hZGNhc3QgbWVzc2FnZSBleHBsaWNpdGx5IHZpYSBSRVNUIEFQSS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGFsd2F5cyB1c2VzIHRoZSBSRVNUIEFQSSBlbmRwb2ludCByZWdhcmRsZXNzIG9mIFdlYlNvY2tldCBjb25uZWN0aW9uIHN0YXRlLlxuICAgICAqIFVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGd1YXJhbnRlZSBSRVNUIGRlbGl2ZXJ5IG9yIHdoZW4gZ3JhZHVhbGx5IG1pZ3JhdGluZyBmcm9tIGltcGxpY2l0IFJFU1QgZmFsbGJhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIG5hbWUgb2YgdGhlIGJyb2FkY2FzdCBldmVudFxuICAgICAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgdG8gYmUgc2VudCAocmVxdWlyZWQpXG4gICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBpbmNsdWRpbmcgdGltZW91dFxuICAgICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG9iamVjdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzLCBhbmQgZXJyb3IgZGV0YWlscyBpZiBmYWlsZWRcbiAgICAgKi9cbiAgICBhc3luYyBodHRwU2VuZChldmVudCwgcGF5bG9hZCwgb3B0cyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHBheWxvYWQgPT09IHVuZGVmaW5lZCB8fCBwYXlsb2FkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1BheWxvYWQgaXMgcmVxdWlyZWQgZm9yIGh0dHBTZW5kKCknKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgYXBpa2V5OiB0aGlzLnNvY2tldC5hcGlLZXkgPyB0aGlzLnNvY2tldC5hcGlLZXkgOiAnJyxcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnNvY2tldC5hY2Nlc3NUb2tlblZhbHVlKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dGhpcy5zb2NrZXQuYWNjZXNzVG9rZW5WYWx1ZX1gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9waWM6IHRoaXMuc3ViVG9waWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlOiB0aGlzLnByaXZhdGUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX2ZldGNoV2l0aFRpbWVvdXQodGhpcy5icm9hZGNhc3RFbmRwb2ludFVSTCwgb3B0aW9ucywgKF9hID0gb3B0cy50aW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLnRpbWVvdXQpO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yQm9keSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9yQm9keS5lcnJvciB8fCBlcnJvckJvZHkubWVzc2FnZSB8fCBlcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9iKSB7IH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBtZXNzYWdlIGludG8gdGhlIGNoYW5uZWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gc2VuZCB0byBjaGFubmVsXG4gICAgICogQHBhcmFtIGFyZ3MudHlwZSBUaGUgdHlwZSBvZiBldmVudCB0byBzZW5kXG4gICAgICogQHBhcmFtIGFyZ3MuZXZlbnQgVGhlIG5hbWUgb2YgdGhlIGV2ZW50IGJlaW5nIHNlbnRcbiAgICAgKiBAcGFyYW0gYXJncy5wYXlsb2FkIFBheWxvYWQgdG8gYmUgc2VudFxuICAgICAqIEBwYXJhbSBvcHRzIE9wdGlvbnMgdG8gYmUgdXNlZCBkdXJpbmcgdGhlIHNlbmQgcHJvY2Vzc1xuICAgICAqL1xuICAgIGFzeW5jIHNlbmQoYXJncywgb3B0cyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICghdGhpcy5fY2FuUHVzaCgpICYmIGFyZ3MudHlwZSA9PT0gJ2Jyb2FkY2FzdCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVhbHRpbWUgc2VuZCgpIGlzIGF1dG9tYXRpY2FsbHkgZmFsbGluZyBiYWNrIHRvIFJFU1QgQVBJLiAnICtcbiAgICAgICAgICAgICAgICAnVGhpcyBiZWhhdmlvciB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4gJyArXG4gICAgICAgICAgICAgICAgJ1BsZWFzZSB1c2UgaHR0cFNlbmQoKSBleHBsaWNpdGx5IGZvciBSRVNUIGRlbGl2ZXJ5LicpO1xuICAgICAgICAgICAgY29uc3QgeyBldmVudCwgcGF5bG9hZDogZW5kcG9pbnRfcGF5bG9hZCB9ID0gYXJncztcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICAgYXBpa2V5OiB0aGlzLnNvY2tldC5hcGlLZXkgPyB0aGlzLnNvY2tldC5hcGlLZXkgOiAnJyxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldC5hY2Nlc3NUb2tlblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3RoaXMuc29ja2V0LmFjY2Vzc1Rva2VuVmFsdWV9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9waWM6IHRoaXMuc3ViVG9waWMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogZW5kcG9pbnRfcGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlOiB0aGlzLnByaXZhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9mZXRjaFdpdGhUaW1lb3V0KHRoaXMuYnJvYWRjYXN0RW5kcG9pbnRVUkwsIG9wdGlvbnMsIChfYSA9IG9wdHMudGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy50aW1lb3V0KTtcbiAgICAgICAgICAgICAgICBhd2FpdCAoKF9iID0gcmVzcG9uc2UuYm9keSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbmNlbCgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2Uub2sgPyAnb2snIDogJ2Vycm9yJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0aW1lZCBvdXQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdlcnJvcic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgICAgICAgY29uc3QgcHVzaCA9IHRoaXMuX3B1c2goYXJncy50eXBlLCBhcmdzLCBvcHRzLnRpbWVvdXQgfHwgdGhpcy50aW1lb3V0KTtcbiAgICAgICAgICAgICAgICBpZiAoYXJncy50eXBlID09PSAnYnJvYWRjYXN0JyAmJiAhKChfYyA9IChfYiA9IChfYSA9IHRoaXMucGFyYW1zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29uZmlnKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuYnJvYWRjYXN0KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuYWNrKSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCdvaycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwdXNoLnJlY2VpdmUoJ29rJywgKCkgPT4gcmVzb2x2ZSgnb2snKSk7XG4gICAgICAgICAgICAgICAgcHVzaC5yZWNlaXZlKCdlcnJvcicsICgpID0+IHJlc29sdmUoJ2Vycm9yJykpO1xuICAgICAgICAgICAgICAgIHB1c2gucmVjZWl2ZSgndGltZW91dCcsICgpID0+IHJlc29sdmUoJ3RpbWVkIG91dCcpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHBheWxvYWQgdGhhdCB3aWxsIGJlIHNlbnQgdGhlIG5leHQgdGltZSB0aGUgY2hhbm5lbCBqb2lucyAocmVjb25uZWN0cykuXG4gICAgICogVXNlZnVsIGZvciByb3RhdGluZyBhY2Nlc3MgdG9rZW5zIG9yIHVwZGF0aW5nIGNvbmZpZyB3aXRob3V0IHJlLWNyZWF0aW5nIHRoZSBjaGFubmVsLlxuICAgICAqL1xuICAgIHVwZGF0ZUpvaW5QYXlsb2FkKHBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5qb2luUHVzaC51cGRhdGVQYXlsb2FkKHBheWxvYWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMZWF2ZXMgdGhlIGNoYW5uZWwuXG4gICAgICpcbiAgICAgKiBVbnN1YnNjcmliZXMgZnJvbSBzZXJ2ZXIgZXZlbnRzLCBhbmQgaW5zdHJ1Y3RzIGNoYW5uZWwgdG8gdGVybWluYXRlIG9uIHNlcnZlci5cbiAgICAgKiBUcmlnZ2VycyBvbkNsb3NlKCkgaG9va3MuXG4gICAgICpcbiAgICAgKiBUbyByZWNlaXZlIGxlYXZlIGFja25vd2xlZGdlbWVudHMsIHVzZSB0aGUgYSBgcmVjZWl2ZWAgaG9vayB0byBiaW5kIHRvIHRoZSBzZXJ2ZXIgYWNrLCBpZTpcbiAgICAgKiBjaGFubmVsLnVuc3Vic2NyaWJlKCkucmVjZWl2ZShcIm9rXCIsICgpID0+IGFsZXJ0KFwibGVmdCFcIikgKVxuICAgICAqL1xuICAgIHVuc3Vic2NyaWJlKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmxlYXZpbmc7XG4gICAgICAgIGNvbnN0IG9uQ2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5sb2coJ2NoYW5uZWwnLCBgbGVhdmUgJHt0aGlzLnRvcGljfWApO1xuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcihDSEFOTkVMX0VWRU5UUy5jbG9zZSwgJ2xlYXZlJywgdGhpcy5fam9pblJlZigpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5qb2luUHVzaC5kZXN0cm95KCk7XG4gICAgICAgIGxldCBsZWF2ZVB1c2ggPSBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGxlYXZlUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmxlYXZlLCB7fSwgdGltZW91dCk7XG4gICAgICAgICAgICBsZWF2ZVB1c2hcbiAgICAgICAgICAgICAgICAucmVjZWl2ZSgnb2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgb25DbG9zZSgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoJ29rJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZWNlaXZlKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG9uQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCd0aW1lZCBvdXQnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlY2VpdmUoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoJ2Vycm9yJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxlYXZlUHVzaC5zZW5kKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NhblB1c2goKSkge1xuICAgICAgICAgICAgICAgIGxlYXZlUHVzaC50cmlnZ2VyKCdvaycsIHt9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICBsZWF2ZVB1c2ggPT09IG51bGwgfHwgbGVhdmVQdXNoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsZWF2ZVB1c2guZGVzdHJveSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVhcmRvd24gdGhlIGNoYW5uZWwuXG4gICAgICpcbiAgICAgKiBEZXN0cm95cyBhbmQgc3RvcHMgcmVsYXRlZCB0aW1lcnMuXG4gICAgICovXG4gICAgdGVhcmRvd24oKSB7XG4gICAgICAgIHRoaXMucHVzaEJ1ZmZlci5mb3JFYWNoKChwdXNoKSA9PiBwdXNoLmRlc3Ryb3koKSk7XG4gICAgICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuam9pblB1c2guZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0ge307XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBhc3luYyBfZmV0Y2hXaXRoVGltZW91dCh1cmwsIG9wdGlvbnMsIHRpbWVvdXQpIHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgY29uc3QgaWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zb2NrZXQuZmV0Y2godXJsLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSkpO1xuICAgICAgICBjbGVhclRpbWVvdXQoaWQpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfcHVzaChldmVudCwgcGF5bG9hZCwgdGltZW91dCA9IHRoaXMudGltZW91dCkge1xuICAgICAgICBpZiAoIXRoaXMuam9pbmVkT25jZSkge1xuICAgICAgICAgICAgdGhyb3cgYHRyaWVkIHRvIHB1c2ggJyR7ZXZlbnR9JyB0byAnJHt0aGlzLnRvcGljfScgYmVmb3JlIGpvaW5pbmcuIFVzZSBjaGFubmVsLnN1YnNjcmliZSgpIGJlZm9yZSBwdXNoaW5nIGV2ZW50c2A7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHB1c2hFdmVudCA9IG5ldyBQdXNoKHRoaXMsIGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuX2NhblB1c2goKSkge1xuICAgICAgICAgICAgcHVzaEV2ZW50LnNlbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRvUHVzaEJ1ZmZlcihwdXNoRXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwdXNoRXZlbnQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYWRkVG9QdXNoQnVmZmVyKHB1c2hFdmVudCkge1xuICAgICAgICBwdXNoRXZlbnQuc3RhcnRUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMucHVzaEJ1ZmZlci5wdXNoKHB1c2hFdmVudCk7XG4gICAgICAgIC8vIEVuZm9yY2UgYnVmZmVyIHNpemUgbGltaXRcbiAgICAgICAgaWYgKHRoaXMucHVzaEJ1ZmZlci5sZW5ndGggPiBNQVhfUFVTSF9CVUZGRVJfU0laRSkge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZFB1c2ggPSB0aGlzLnB1c2hCdWZmZXIuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkUHVzaCkge1xuICAgICAgICAgICAgICAgIHJlbW92ZWRQdXNoLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5sb2coJ2NoYW5uZWwnLCBgZGlzY2FyZGVkIHB1c2ggZHVlIHRvIGJ1ZmZlciBvdmVyZmxvdzogJHtyZW1vdmVkUHVzaC5ldmVudH1gLCByZW1vdmVkUHVzaC5wYXlsb2FkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVycmlkYWJsZSBtZXNzYWdlIGhvb2tcbiAgICAgKlxuICAgICAqIFJlY2VpdmVzIGFsbCBldmVudHMgZm9yIHNwZWNpYWxpemVkIG1lc3NhZ2UgaGFuZGxpbmcgYmVmb3JlIGRpc3BhdGNoaW5nIHRvIHRoZSBjaGFubmVsIGNhbGxiYWNrcy5cbiAgICAgKiBNdXN0IHJldHVybiB0aGUgcGF5bG9hZCwgbW9kaWZpZWQgb3IgdW5tb2RpZmllZC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbk1lc3NhZ2UoX2V2ZW50LCBwYXlsb2FkLCBfcmVmKSB7XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2lzTWVtYmVyKHRvcGljKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvcGljID09PSB0b3BpYztcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9qb2luUmVmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5qb2luUHVzaC5yZWY7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfdHJpZ2dlcih0eXBlLCBwYXlsb2FkLCByZWYpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgdHlwZUxvd2VyID0gdHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCB7IGNsb3NlLCBlcnJvciwgbGVhdmUsIGpvaW4gfSA9IENIQU5ORUxfRVZFTlRTO1xuICAgICAgICBjb25zdCBldmVudHMgPSBbY2xvc2UsIGVycm9yLCBsZWF2ZSwgam9pbl07XG4gICAgICAgIGlmIChyZWYgJiYgZXZlbnRzLmluZGV4T2YodHlwZUxvd2VyKSA+PSAwICYmIHJlZiAhPT0gdGhpcy5fam9pblJlZigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhhbmRsZWRQYXlsb2FkID0gdGhpcy5fb25NZXNzYWdlKHR5cGVMb3dlciwgcGF5bG9hZCwgcmVmKTtcbiAgICAgICAgaWYgKHBheWxvYWQgJiYgIWhhbmRsZWRQYXlsb2FkKSB7XG4gICAgICAgICAgICB0aHJvdyAnY2hhbm5lbCBvbk1lc3NhZ2UgY2FsbGJhY2tzIG11c3QgcmV0dXJuIHRoZSBwYXlsb2FkLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoWydpbnNlcnQnLCAndXBkYXRlJywgJ2RlbGV0ZSddLmluY2x1ZGVzKHR5cGVMb3dlcikpIHtcbiAgICAgICAgICAgIChfYSA9IHRoaXMuYmluZGluZ3MucG9zdGdyZXNfY2hhbmdlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICAgICAgICAgIHJldHVybiAoKF9hID0gYmluZC5maWx0ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ldmVudCkgPT09ICcqJyB8fCAoKF9jID0gKF9iID0gYmluZC5maWx0ZXIpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5ldmVudCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnRvTG9jYWxlTG93ZXJDYXNlKCkpID09PSB0eXBlTG93ZXI7XG4gICAgICAgICAgICB9KS5tYXAoKGJpbmQpID0+IGJpbmQuY2FsbGJhY2soaGFuZGxlZFBheWxvYWQsIHJlZikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgKF9iID0gdGhpcy5iaW5kaW5nc1t0eXBlTG93ZXJdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZmlsdGVyKChiaW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2Y7XG4gICAgICAgICAgICAgICAgaWYgKFsnYnJvYWRjYXN0JywgJ3ByZXNlbmNlJywgJ3Bvc3RncmVzX2NoYW5nZXMnXS5pbmNsdWRlcyh0eXBlTG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgnaWQnIGluIGJpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbmRJZCA9IGJpbmQuaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaW5kRXZlbnQgPSAoX2EgPSBiaW5kLmZpbHRlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChiaW5kSWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9iID0gcGF5bG9hZC5pZHMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pbmNsdWRlcyhiaW5kSWQpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaW5kRXZlbnQgPT09ICcqJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmluZEV2ZW50ID09PSBudWxsIHx8IGJpbmRFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYmluZEV2ZW50LnRvTG9jYWxlTG93ZXJDYXNlKCkpID09PSAoKF9jID0gcGF5bG9hZC5kYXRhKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmluZEV2ZW50ID0gKF9lID0gKF9kID0gYmluZCA9PT0gbnVsbCB8fCBiaW5kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBiaW5kLmZpbHRlcikgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmV2ZW50KSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaW5kRXZlbnQgPT09ICcqJyB8fCBiaW5kRXZlbnQgPT09ICgoX2YgPSBwYXlsb2FkID09PSBudWxsIHx8IHBheWxvYWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBheWxvYWQuZXZlbnQpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmQudHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSB0eXBlTG93ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkubWFwKChiaW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVkUGF5bG9hZCA9PT0gJ29iamVjdCcgJiYgJ2lkcycgaW4gaGFuZGxlZFBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zdGdyZXNDaGFuZ2VzID0gaGFuZGxlZFBheWxvYWQuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBzY2hlbWEsIHRhYmxlLCBjb21taXRfdGltZXN0YW1wLCB0eXBlLCBlcnJvcnMgfSA9IHBvc3RncmVzQ2hhbmdlcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5yaWNoZWRQYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21taXRfdGltZXN0YW1wOiBjb21taXRfdGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZDoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IGVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlZFBheWxvYWQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGVucmljaGVkUGF5bG9hZCksIHRoaXMuX2dldFBheWxvYWRSZWNvcmRzKHBvc3RncmVzQ2hhbmdlcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9pc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmNsb3NlZDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9pc0pvaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmpvaW5lZDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9pc0pvaW5pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5qb2luaW5nO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2lzTGVhdmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmxlYXZpbmc7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfcmVwbHlFdmVudE5hbWUocmVmKSB7XG4gICAgICAgIHJldHVybiBgY2hhbl9yZXBseV8ke3JlZn1gO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX29uKHR5cGUsIGZpbHRlciwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgdHlwZUxvd2VyID0gdHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBiaW5kaW5nID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZUxvd2VyLFxuICAgICAgICAgICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmJpbmRpbmdzW3R5cGVMb3dlcl0pIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NbdHlwZUxvd2VyXS5wdXNoKGJpbmRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1t0eXBlTG93ZXJdID0gW2JpbmRpbmddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX29mZih0eXBlLCBmaWx0ZXIpIHtcbiAgICAgICAgY29uc3QgdHlwZUxvd2VyID0gdHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodGhpcy5iaW5kaW5nc1t0eXBlTG93ZXJdKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzW3R5cGVMb3dlcl0gPSB0aGlzLmJpbmRpbmdzW3R5cGVMb3dlcl0uZmlsdGVyKChiaW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIHJldHVybiAhKCgoX2EgPSBiaW5kLnR5cGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b0xvY2FsZUxvd2VyQ2FzZSgpKSA9PT0gdHlwZUxvd2VyICYmXG4gICAgICAgICAgICAgICAgICAgIFJlYWx0aW1lQ2hhbm5lbC5pc0VxdWFsKGJpbmQuZmlsdGVyLCBmaWx0ZXIpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgc3RhdGljIGlzRXF1YWwob2JqMSwgb2JqMikge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMob2JqMSkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhvYmoyKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGsgaW4gb2JqMSkge1xuICAgICAgICAgICAgaWYgKG9iajFba10gIT09IG9iajJba10pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXBhcmVzIHR3byBvcHRpb25hbCBmaWx0ZXIgdmFsdWVzIGZvciBlcXVhbGl0eS5cbiAgICAgKiBUcmVhdHMgdW5kZWZpbmVkLCBudWxsLCBhbmQgZW1wdHkgc3RyaW5nIGFzIGVxdWl2YWxlbnQgZW1wdHkgdmFsdWVzLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBpc0ZpbHRlclZhbHVlRXF1YWwoc2VydmVyVmFsdWUsIGNsaWVudFZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZXJ2ZXIgPSBzZXJ2ZXJWYWx1ZSAhPT0gbnVsbCAmJiBzZXJ2ZXJWYWx1ZSAhPT0gdm9pZCAwID8gc2VydmVyVmFsdWUgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDbGllbnQgPSBjbGllbnRWYWx1ZSAhPT0gbnVsbCAmJiBjbGllbnRWYWx1ZSAhPT0gdm9pZCAwID8gY2xpZW50VmFsdWUgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkU2VydmVyID09PSBub3JtYWxpemVkQ2xpZW50O1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3Jlam9pblVudGlsQ29ubmVjdGVkKCkge1xuICAgICAgICB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICBpZiAodGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fcmVqb2luKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNoYW5uZWwgY2xvc2VzLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX29uQ2xvc2UoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb24oQ0hBTk5FTF9FVkVOVFMuY2xvc2UsIHt9LCBjYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjaGFubmVsIGVuY291bnRlcmVzIGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX29uRXJyb3IoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb24oQ0hBTk5FTF9FVkVOVFMuZXJyb3IsIHt9LCAocmVhc29uKSA9PiBjYWxsYmFjayhyZWFzb24pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgYW5kIHRoZSBjaGFubmVsIGhhcyBiZWVuIGpvaW5lZC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9jYW5QdXNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLl9pc0pvaW5lZCgpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3Jlam9pbih0aW1lb3V0ID0gdGhpcy50aW1lb3V0KSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0xlYXZpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc29ja2V0Ll9sZWF2ZU9wZW5Ub3BpYyh0aGlzLnRvcGljKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5pbmc7XG4gICAgICAgIHRoaXMuam9pblB1c2gucmVzZW5kKHRpbWVvdXQpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2dldFBheWxvYWRSZWNvcmRzKHBheWxvYWQpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkcyA9IHtcbiAgICAgICAgICAgIG5ldzoge30sXG4gICAgICAgICAgICBvbGQ6IHt9LFxuICAgICAgICB9O1xuICAgICAgICBpZiAocGF5bG9hZC50eXBlID09PSAnSU5TRVJUJyB8fCBwYXlsb2FkLnR5cGUgPT09ICdVUERBVEUnKSB7XG4gICAgICAgICAgICByZWNvcmRzLm5ldyA9IFRyYW5zZm9ybWVycy5jb252ZXJ0Q2hhbmdlRGF0YShwYXlsb2FkLmNvbHVtbnMsIHBheWxvYWQucmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF5bG9hZC50eXBlID09PSAnVVBEQVRFJyB8fCBwYXlsb2FkLnR5cGUgPT09ICdERUxFVEUnKSB7XG4gICAgICAgICAgICByZWNvcmRzLm9sZCA9IFRyYW5zZm9ybWVycy5jb252ZXJ0Q2hhbmdlRGF0YShwYXlsb2FkLmNvbHVtbnMsIHBheWxvYWQub2xkX3JlY29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY29yZHM7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVhbHRpbWVDaGFubmVsLmpzLm1hcCJdLCJuYW1lcyI6WyJDSEFOTkVMX0VWRU5UUyIsIkNIQU5ORUxfU1RBVEVTIiwiTUFYX1BVU0hfQlVGRkVSX1NJWkUiLCJQdXNoIiwiVGltZXIiLCJSZWFsdGltZVByZXNlbmNlIiwiVHJhbnNmb3JtZXJzIiwiaHR0cEVuZHBvaW50VVJMIiwiUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlQiLCJSRUFMVElNRV9MSVNURU5fVFlQRVMiLCJSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTIiwiUkVBTFRJTUVfQ0hBTk5FTF9TVEFURVMiLCJSZWFsdGltZUNoYW5uZWwiLCJjb25zdHJ1Y3RvciIsInRvcGljIiwicGFyYW1zIiwiY29uZmlnIiwic29ja2V0IiwiX2EiLCJfYiIsImJpbmRpbmdzIiwic3RhdGUiLCJjbG9zZWQiLCJqb2luZWRPbmNlIiwicHVzaEJ1ZmZlciIsInN1YlRvcGljIiwicmVwbGFjZSIsIk9iamVjdCIsImFzc2lnbiIsImJyb2FkY2FzdCIsImFjayIsInNlbGYiLCJwcmVzZW5jZSIsImtleSIsImVuYWJsZWQiLCJwcml2YXRlIiwidGltZW91dCIsImpvaW5QdXNoIiwiam9pbiIsInJlam9pblRpbWVyIiwiX3Jlam9pblVudGlsQ29ubmVjdGVkIiwicmVjb25uZWN0QWZ0ZXJNcyIsInJlY2VpdmUiLCJqb2luZWQiLCJyZXNldCIsImZvckVhY2giLCJwdXNoRXZlbnQiLCJzZW5kIiwiX29uQ2xvc2UiLCJsb2ciLCJfam9pblJlZiIsIl9yZW1vdmUiLCJfb25FcnJvciIsInJlYXNvbiIsIl9pc0xlYXZpbmciLCJfaXNDbG9zZWQiLCJlcnJvcmVkIiwic2NoZWR1bGVUaW1lb3V0IiwiX2lzSm9pbmluZyIsIl9vbiIsInJlcGx5IiwicGF5bG9hZCIsInJlZiIsIl90cmlnZ2VyIiwiX3JlcGx5RXZlbnROYW1lIiwiYnJvYWRjYXN0RW5kcG9pbnRVUkwiLCJlbmRQb2ludCIsInJlcGxheSIsInN1YnNjcmliZSIsImNhbGxiYWNrIiwiX2MiLCJpc0Nvbm5lY3RlZCIsImNvbm5lY3QiLCJpc1ByaXZhdGUiLCJwb3N0Z3Jlc19jaGFuZ2VzIiwibWFwIiwiciIsImZpbHRlciIsInByZXNlbmNlX2VuYWJsZWQiLCJQUkVTRU5DRSIsImxlbmd0aCIsImFjY2Vzc1Rva2VuUGF5bG9hZCIsImFjY2Vzc1Rva2VuVmFsdWUiLCJhY2Nlc3NfdG9rZW4iLCJlIiwiQ0hBTk5FTF9FUlJPUiIsIkNMT1NFRCIsInVwZGF0ZUpvaW5QYXlsb2FkIiwiX3Jlam9pbiIsIl9pc01hbnVhbFRva2VuIiwic2V0QXV0aCIsInVuZGVmaW5lZCIsIlNVQlNDUklCRUQiLCJjbGllbnRQb3N0Z3Jlc0JpbmRpbmdzIiwiYmluZGluZ3NMZW4iLCJuZXdQb3N0Z3Jlc0JpbmRpbmdzIiwiaSIsImNsaWVudFBvc3RncmVzQmluZGluZyIsImV2ZW50Iiwic2NoZW1hIiwidGFibGUiLCJzZXJ2ZXJQb3N0Z3Jlc0ZpbHRlciIsImlzRmlsdGVyVmFsdWVFcXVhbCIsInB1c2giLCJpZCIsInVuc3Vic2NyaWJlIiwiRXJyb3IiLCJlcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2YWx1ZXMiLCJUSU1FRF9PVVQiLCJwcmVzZW5jZVN0YXRlIiwidHJhY2siLCJvcHRzIiwidHlwZSIsInVudHJhY2siLCJvbiIsInRoZW4iLCJodHRwU2VuZCIsIlByb21pc2UiLCJyZWplY3QiLCJoZWFkZXJzIiwiYXBpa2V5IiwiYXBpS2V5Iiwib3B0aW9ucyIsIm1ldGhvZCIsImJvZHkiLCJtZXNzYWdlcyIsInJlc3BvbnNlIiwiX2ZldGNoV2l0aFRpbWVvdXQiLCJzdGF0dXMiLCJzdWNjZXNzIiwiZXJyb3JNZXNzYWdlIiwic3RhdHVzVGV4dCIsImVycm9yQm9keSIsImpzb24iLCJtZXNzYWdlIiwiYXJncyIsIl9jYW5QdXNoIiwiY29uc29sZSIsIndhcm4iLCJlbmRwb2ludF9wYXlsb2FkIiwiY2FuY2VsIiwib2siLCJuYW1lIiwicmVzb2x2ZSIsIl9wdXNoIiwidXBkYXRlUGF5bG9hZCIsImxlYXZpbmciLCJvbkNsb3NlIiwiY2xvc2UiLCJkZXN0cm95IiwibGVhdmVQdXNoIiwibGVhdmUiLCJ0cmlnZ2VyIiwiZmluYWxseSIsInRlYXJkb3duIiwidXJsIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsInNldFRpbWVvdXQiLCJhYm9ydCIsImZldGNoIiwic2lnbmFsIiwiY2xlYXJUaW1lb3V0IiwiX2FkZFRvUHVzaEJ1ZmZlciIsInN0YXJ0VGltZW91dCIsInJlbW92ZWRQdXNoIiwic2hpZnQiLCJfb25NZXNzYWdlIiwiX2V2ZW50IiwiX3JlZiIsIl9pc01lbWJlciIsInR5cGVMb3dlciIsInRvTG9jYWxlTG93ZXJDYXNlIiwiZXZlbnRzIiwiaW5kZXhPZiIsImhhbmRsZWRQYXlsb2FkIiwiaW5jbHVkZXMiLCJiaW5kIiwiX2QiLCJfZSIsIl9mIiwiYmluZElkIiwiYmluZEV2ZW50IiwiaWRzIiwiZGF0YSIsInBvc3RncmVzQ2hhbmdlcyIsImNvbW1pdF90aW1lc3RhbXAiLCJlcnJvcnMiLCJlbnJpY2hlZFBheWxvYWQiLCJldmVudFR5cGUiLCJuZXciLCJvbGQiLCJfZ2V0UGF5bG9hZFJlY29yZHMiLCJfaXNKb2luZWQiLCJqb2luaW5nIiwiYmluZGluZyIsIl9vZmYiLCJpc0VxdWFsIiwib2JqMSIsIm9iajIiLCJrZXlzIiwiayIsInNlcnZlclZhbHVlIiwiY2xpZW50VmFsdWUiLCJub3JtYWxpemVkU2VydmVyIiwibm9ybWFsaXplZENsaWVudCIsIl9sZWF2ZU9wZW5Ub3BpYyIsInJlc2VuZCIsInJlY29yZHMiLCJjb252ZXJ0Q2hhbmdlRGF0YSIsImNvbHVtbnMiLCJyZWNvcmQiLCJvbGRfcmVjb3JkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js":
|
||
/*!***************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js ***!
|
||
\***************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_CHANNEL_STATES: () => (/* binding */ REALTIME_CHANNEL_STATES),\n/* harmony export */ REALTIME_LISTEN_TYPES: () => (/* binding */ REALTIME_LISTEN_TYPES),\n/* harmony export */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT: () => (/* binding */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT),\n/* harmony export */ REALTIME_SUBSCRIBE_STATES: () => (/* binding */ REALTIME_SUBSCRIBE_STATES),\n/* harmony export */ \"default\": () => (/* binding */ RealtimeChannel)\n/* harmony export */ });\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/constants */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\");\n/* harmony import */ var _lib_push__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/push */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/push.js\");\n/* harmony import */ var _lib_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/timer */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js\");\n/* harmony import */ var _RealtimePresence__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./RealtimePresence */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js\");\n/* harmony import */ var _lib_transformers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/transformers */ \"(rsc)/./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;\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 */ class RealtimeChannel {\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 ${this.topic} ${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 ${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 ${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 ${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 '${this.topic}'. It must be a private channel.`;\n }\n }\n /** Subscribe registers your client with the server */ subscribe(callback, timeout = 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 ({ postgres_changes })=>{\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, opts = {}) {\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(opts = {}) {\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 ${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, opts = {}) {\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 ${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, opts = {}) {\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 ${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(timeout = this.timeout) {\n this.state = _lib_constants__WEBPACK_IMPORTED_MODULE_0__.CHANNEL_STATES.leaving;\n const onClose = ()=>{\n this.socket.log(\"channel\", `leave ${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, timeout = this.timeout) {\n if (!this.joinedOnce) {\n throw `tried to push '${event}' to '${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: ${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_${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(timeout = 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} //# sourceMappingURL=RealtimeChannel.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lQ2hhbm5lbC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQXVGO0FBQ3pEO0FBQ0U7QUFDa0I7QUFDQztBQUNFO0FBQzlDLElBQUlRLHVDQUF1QztBQUNqRCxVQUFVQSxzQ0FBc0M7SUFDN0NBLHNDQUFzQyxDQUFDLE1BQU0sR0FBRztJQUNoREEsc0NBQXNDLENBQUMsU0FBUyxHQUFHO0lBQ25EQSxzQ0FBc0MsQ0FBQyxTQUFTLEdBQUc7SUFDbkRBLHNDQUFzQyxDQUFDLFNBQVMsR0FBRztBQUN2RCxHQUFHQSwwQ0FBMkNBLENBQUFBLHlDQUF5QyxDQUFDO0FBQ2pGLElBQUlDLHNCQUFzQjtBQUNoQyxVQUFVQSxxQkFBcUI7SUFDNUJBLHFCQUFxQixDQUFDLFlBQVksR0FBRztJQUNyQ0EscUJBQXFCLENBQUMsV0FBVyxHQUFHO0lBQ3BDQSxxQkFBcUIsQ0FBQyxtQkFBbUIsR0FBRztJQUM1Q0EscUJBQXFCLENBQUMsU0FBUyxHQUFHO0FBQ3RDLEdBQUdBLHlCQUEwQkEsQ0FBQUEsd0JBQXdCLENBQUM7QUFDL0MsSUFBSUMsMEJBQTBCO0FBQ3BDLFVBQVVBLHlCQUF5QjtJQUNoQ0EseUJBQXlCLENBQUMsYUFBYSxHQUFHO0lBQzFDQSx5QkFBeUIsQ0FBQyxZQUFZLEdBQUc7SUFDekNBLHlCQUF5QixDQUFDLFNBQVMsR0FBRztJQUN0Q0EseUJBQXlCLENBQUMsZ0JBQWdCLEdBQUc7QUFDakQsR0FBR0EsNkJBQThCQSxDQUFBQSw0QkFBNEIsQ0FBQztBQUN2RCxNQUFNQywwQkFBMEJWLDBEQUFjQSxDQUFDO0FBQ3REOzs7O0NBSUMsR0FDYyxNQUFNVztJQUNqQjs7Ozs7Ozs7Ozs7Ozs7O0tBZUMsR0FDREMsWUFDQSxrQ0FBa0MsR0FDbENDLEtBQUssRUFBRUMsU0FBUztRQUFFQyxRQUFRLENBQUM7SUFBRSxDQUFDLEVBQUVDLE1BQU0sQ0FBRTtR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QUksSUFBSSxDQUFDa0IsVUFBVSxJQUFJO1lBQ25CO1FBQ0o7UUFDQSxJQUFJLENBQUNyQyxNQUFNLENBQUNnTSxlQUFlLENBQUMsSUFBSSxDQUFDbk0sS0FBSztRQUN0QyxJQUFJLENBQUNPLEtBQUssR0FBR3BCLDBEQUFjQSxDQUFDb00sT0FBTztRQUNuQyxJQUFJLENBQUNoSyxRQUFRLENBQUM2SyxNQUFNLENBQUM5SztJQUN6QjtJQUNBLGNBQWMsR0FDZCtKLG1CQUFtQnRJLE9BQU8sRUFBRTtRQUN4QixNQUFNc0osVUFBVTtZQUNabEIsS0FBSyxDQUFDO1lBQ05DLEtBQUssQ0FBQztRQUNWO1FBQ0EsSUFBSXJJLFFBQVFzRCxJQUFJLEtBQUssWUFBWXRELFFBQVFzRCxJQUFJLEtBQUssVUFBVTtZQUN4RGdHLFFBQVFsQixHQUFHLEdBQUczTCxnRUFBOEIsQ0FBQ3VELFFBQVF3SixPQUFPLEVBQUV4SixRQUFReUosTUFBTTtRQUNoRjtRQUNBLElBQUl6SixRQUFRc0QsSUFBSSxLQUFLLFlBQVl0RCxRQUFRc0QsSUFBSSxLQUFLLFVBQVU7WUFDeERnRyxRQUFRakIsR0FBRyxHQUFHNUwsZ0VBQThCLENBQUN1RCxRQUFRd0osT0FBTyxFQUFFeEosUUFBUTBKLFVBQVU7UUFDcEY7UUFDQSxPQUFPSjtJQUNYO0FBQ0osRUFDQSwyQ0FBMkMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lQ2hhbm5lbC5qcz9lYzRjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENIQU5ORUxfRVZFTlRTLCBDSEFOTkVMX1NUQVRFUywgTUFYX1BVU0hfQlVGRkVSX1NJWkUgfSBmcm9tICcuL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IFB1c2ggZnJvbSAnLi9saWIvcHVzaCc7XG5pbXBvcnQgVGltZXIgZnJvbSAnLi9saWIvdGltZXInO1xuaW1wb3J0IFJlYWx0aW1lUHJlc2VuY2UgZnJvbSAnLi9SZWFsdGltZVByZXNlbmNlJztcbmltcG9ydCAqIGFzIFRyYW5zZm9ybWVycyBmcm9tICcuL2xpYi90cmFuc2Zvcm1lcnMnO1xuaW1wb3J0IHsgaHR0cEVuZHBvaW50VVJMIH0gZnJvbSAnLi9saWIvdHJhbnNmb3JtZXJzJztcbmV4cG9ydCB2YXIgUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlQ7XG4oZnVuY3Rpb24gKFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UKSB7XG4gICAgUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlRbXCJBTExcIl0gPSBcIipcIjtcbiAgICBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVFtcIklOU0VSVFwiXSA9IFwiSU5TRVJUXCI7XG4gICAgUkVBTFRJTUVfUE9TVEdSRVNfQ0hBTkdFU19MSVNURU5fRVZFTlRbXCJVUERBVEVcIl0gPSBcIlVQREFURVwiO1xuICAgIFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UW1wiREVMRVRFXCJdID0gXCJERUxFVEVcIjtcbn0pKFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UIHx8IChSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCA9IHt9KSk7XG5leHBvcnQgdmFyIFJFQUxUSU1FX0xJU1RFTl9UWVBFUztcbihmdW5jdGlvbiAoUkVBTFRJTUVfTElTVEVOX1RZUEVTKSB7XG4gICAgUkVBTFRJTUVfTElTVEVOX1RZUEVTW1wiQlJPQURDQVNUXCJdID0gXCJicm9hZGNhc3RcIjtcbiAgICBSRUFMVElNRV9MSVNURU5fVFlQRVNbXCJQUkVTRU5DRVwiXSA9IFwicHJlc2VuY2VcIjtcbiAgICBSRUFMVElNRV9MSVNURU5fVFlQRVNbXCJQT1NUR1JFU19DSEFOR0VTXCJdID0gXCJwb3N0Z3Jlc19jaGFuZ2VzXCI7XG4gICAgUkVBTFRJTUVfTElTVEVOX1RZUEVTW1wiU1lTVEVNXCJdID0gXCJzeXN0ZW1cIjtcbn0pKFJFQUxUSU1FX0xJU1RFTl9UWVBFUyB8fCAoUkVBTFRJTUVfTElTVEVOX1RZUEVTID0ge30pKTtcbmV4cG9ydCB2YXIgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUztcbihmdW5jdGlvbiAoUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUykge1xuICAgIFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVNbXCJTVUJTQ1JJQkVEXCJdID0gXCJTVUJTQ1JJQkVEXCI7XG4gICAgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFU1tcIlRJTUVEX09VVFwiXSA9IFwiVElNRURfT1VUXCI7XG4gICAgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFU1tcIkNMT1NFRFwiXSA9IFwiQ0xPU0VEXCI7XG4gICAgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFU1tcIkNIQU5ORUxfRVJST1JcIl0gPSBcIkNIQU5ORUxfRVJST1JcIjtcbn0pKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMgfHwgKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IFJFQUxUSU1FX0NIQU5ORUxfU1RBVEVTID0gQ0hBTk5FTF9TVEFURVM7XG4vKiogQSBjaGFubmVsIGlzIHRoZSBiYXNpYyBidWlsZGluZyBibG9jayBvZiBSZWFsdGltZVxuICogYW5kIG5hcnJvd3MgdGhlIHNjb3BlIG9mIGRhdGEgZmxvdyB0byBzdWJzY3JpYmVkIGNsaWVudHMuXG4gKiBZb3UgY2FuIHRoaW5rIG9mIGEgY2hhbm5lbCBhcyBhIGNoYXRyb29tIHdoZXJlIHBhcnRpY2lwYW50cyBhcmUgYWJsZSB0byBzZWUgd2hvJ3Mgb25saW5lXG4gKiBhbmQgc2VuZCBhbmQgcmVjZWl2ZSBtZXNzYWdlcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVhbHRpbWVDaGFubmVsIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2hhbm5lbCB0aGF0IGNhbiBicm9hZGNhc3QgbWVzc2FnZXMsIHN5bmMgcHJlc2VuY2UsIGFuZCBsaXN0ZW4gdG8gUG9zdGdyZXMgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIFRoZSB0b3BpYyBkZXRlcm1pbmVzIHdoaWNoIHJlYWx0aW1lIHN0cmVhbSB5b3UgYXJlIHN1YnNjcmliaW5nIHRvLiBDb25maWcgb3B0aW9ucyBsZXQgeW91XG4gICAgICogZW5hYmxlIGFja25vd2xlZGdlbWVudCBmb3IgYnJvYWRjYXN0cywgcHJlc2VuY2UgdHJhY2tpbmcsIG9yIHByaXZhdGUgY2hhbm5lbHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IFJlYWx0aW1lQ2xpZW50IGZyb20gJ0BzdXBhYmFzZS9yZWFsdGltZS1qcydcbiAgICAgKlxuICAgICAqIGNvbnN0IGNsaWVudCA9IG5ldyBSZWFsdGltZUNsaWVudCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL3JlYWx0aW1lL3YxJywge1xuICAgICAqICAgcGFyYW1zOiB7IGFwaWtleTogJ3B1YmxpYy1hbm9uLWtleScgfSxcbiAgICAgKiB9KVxuICAgICAqIGNvbnN0IGNoYW5uZWwgPSBuZXcgUmVhbHRpbWVDaGFubmVsKCdyZWFsdGltZTpwdWJsaWM6bWVzc2FnZXMnLCB7IGNvbmZpZzoge30gfSwgY2xpZW50KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUb3BpYyBuYW1lIGNhbiBiZSBhbnkgc3RyaW5nLiAqL1xuICAgIHRvcGljLCBwYXJhbXMgPSB7IGNvbmZpZzoge30gfSwgc29ja2V0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMudG9waWMgPSB0b3BpYztcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0ge307XG4gICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWQ7XG4gICAgICAgIHRoaXMuam9pbmVkT25jZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnB1c2hCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5zdWJUb3BpYyA9IHRvcGljLnJlcGxhY2UoL15yZWFsdGltZTovaSwgJycpO1xuICAgICAgICB0aGlzLnBhcmFtcy5jb25maWcgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGJyb2FkY2FzdDogeyBhY2s6IGZhbHNlLCBzZWxmOiBmYWxzZSB9LFxuICAgICAgICAgICAgcHJlc2VuY2U6IHsga2V5OiAnJywgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHByaXZhdGU6IGZhbHNlLFxuICAgICAgICB9LCBwYXJhbXMuY29uZmlnKTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gdGhpcy5zb2NrZXQudGltZW91dDtcbiAgICAgICAgdGhpcy5qb2luUHVzaCA9IG5ldyBQdXNoKHRoaXMsIENIQU5ORUxfRVZFTlRTLmpvaW4sIHRoaXMucGFyYW1zLCB0aGlzLnRpbWVvdXQpO1xuICAgICAgICB0aGlzLnJlam9pblRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHRoaXMuX3Jlam9pblVudGlsQ29ubmVjdGVkKCksIHRoaXMuc29ja2V0LnJlY29ubmVjdEFmdGVyTXMpO1xuICAgICAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoJ29rJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5lZDtcbiAgICAgICAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMucHVzaEJ1ZmZlci5mb3JFYWNoKChwdXNoRXZlbnQpID0+IHB1c2hFdmVudC5zZW5kKCkpO1xuICAgICAgICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW107XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9vbkNsb3NlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmxvZygnY2hhbm5lbCcsIGBjbG9zZSAke3RoaXMudG9waWN9ICR7dGhpcy5fam9pblJlZigpfWApO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmNsb3NlZDtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Ll9yZW1vdmUodGhpcyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9vbkVycm9yKChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0xlYXZpbmcoKSB8fCB0aGlzLl9pc0Nsb3NlZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zb2NrZXQubG9nKCdjaGFubmVsJywgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWQ7XG4gICAgICAgICAgICB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5qb2luUHVzaC5yZWNlaXZlKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0pvaW5pbmcoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmxvZygnY2hhbm5lbCcsIGB0aW1lb3V0ICR7dGhpcy50b3BpY31gLCB0aGlzLmpvaW5QdXNoLnRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWQ7XG4gICAgICAgICAgICB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5qb2luUHVzaC5yZWNlaXZlKCdlcnJvcicsIChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0xlYXZpbmcoKSB8fCB0aGlzLl9pc0Nsb3NlZCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zb2NrZXQubG9nKCdjaGFubmVsJywgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmVycm9yZWQ7XG4gICAgICAgICAgICB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fb24oQ0hBTk5FTF9FVkVOVFMucmVwbHksIHt9LCAocGF5bG9hZCwgcmVmKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyKHRoaXMuX3JlcGx5RXZlbnROYW1lKHJlZiksIHBheWxvYWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcmVzZW5jZSA9IG5ldyBSZWFsdGltZVByZXNlbmNlKHRoaXMpO1xuICAgICAgICB0aGlzLmJyb2FkY2FzdEVuZHBvaW50VVJMID0gaHR0cEVuZHBvaW50VVJMKHRoaXMuc29ja2V0LmVuZFBvaW50KTtcbiAgICAgICAgdGhpcy5wcml2YXRlID0gdGhpcy5wYXJhbXMuY29uZmlnLnByaXZhdGUgfHwgZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5wcml2YXRlICYmICgoX2IgPSAoX2EgPSB0aGlzLnBhcmFtcy5jb25maWcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5icm9hZGNhc3QpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5yZXBsYXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBgdHJpZWQgdG8gdXNlIHJlcGxheSBvbiBwdWJsaWMgY2hhbm5lbCAnJHt0aGlzLnRvcGljfScuIEl0IG11c3QgYmUgYSBwcml2YXRlIGNoYW5uZWwuYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogU3Vic2NyaWJlIHJlZ2lzdGVycyB5b3VyIGNsaWVudCB3aXRoIHRoZSBzZXJ2ZXIgKi9cbiAgICBzdWJzY3JpYmUoY2FsbGJhY2ssIHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGlmICghdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09IENIQU5ORUxfU1RBVEVTLmNsb3NlZCkge1xuICAgICAgICAgICAgY29uc3QgeyBjb25maWc6IHsgYnJvYWRjYXN0LCBwcmVzZW5jZSwgcHJpdmF0ZTogaXNQcml2YXRlIH0sIH0gPSB0aGlzLnBhcmFtcztcbiAgICAgICAgICAgIGNvbnN0IHBvc3RncmVzX2NoYW5nZXMgPSAoX2IgPSAoX2EgPSB0aGlzLmJpbmRpbmdzLnBvc3RncmVzX2NoYW5nZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoKHIpID0+IHIuZmlsdGVyKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW107XG4gICAgICAgICAgICBjb25zdCBwcmVzZW5jZV9lbmFibGVkID0gKCEhdGhpcy5iaW5kaW5nc1tSRUFMVElNRV9MSVNURU5fVFlQRVMuUFJFU0VOQ0VdICYmXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1tSRUFMVElNRV9MSVNURU5fVFlQRVMuUFJFU0VOQ0VdLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgKChfYyA9IHRoaXMucGFyYW1zLmNvbmZpZy5wcmVzZW5jZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmVuYWJsZWQpID09PSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgYWNjZXNzVG9rZW5QYXlsb2FkID0ge307XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICAgICAgYnJvYWRjYXN0LFxuICAgICAgICAgICAgICAgIHByZXNlbmNlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXNlbmNlKSwgeyBlbmFibGVkOiBwcmVzZW5jZV9lbmFibGVkIH0pLFxuICAgICAgICAgICAgICAgIHBvc3RncmVzX2NoYW5nZXMsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZTogaXNQcml2YXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldC5hY2Nlc3NUb2tlblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWNjZXNzVG9rZW5QYXlsb2FkLmFjY2Vzc190b2tlbiA9IHRoaXMuc29ja2V0LmFjY2Vzc1Rva2VuVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKChlKSA9PiBjYWxsYmFjayA9PT0gbnVsbCB8fCBjYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FsbGJhY2soUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUy5DSEFOTkVMX0VSUk9SLCBlKSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNsb3NlKCgpID0+IGNhbGxiYWNrID09PSBudWxsIHx8IGNhbGxiYWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWxsYmFjayhSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTLkNMT1NFRCkpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVKb2luUGF5bG9hZChPYmplY3QuYXNzaWduKHsgY29uZmlnIH0sIGFjY2Vzc1Rva2VuUGF5bG9hZCkpO1xuICAgICAgICAgICAgdGhpcy5qb2luZWRPbmNlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3Jlam9pbih0aW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMuam9pblB1c2hcbiAgICAgICAgICAgICAgICAucmVjZWl2ZSgnb2snLCBhc3luYyAoeyBwb3N0Z3Jlc19jaGFuZ2VzIH0pID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgLy8gT25seSByZWZyZXNoIGF1dGggaWYgdXNpbmcgY2FsbGJhY2stYmFzZWQgdG9rZW5zXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNvY2tldC5faXNNYW51YWxUb2tlbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNldEF1dGgoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBvc3RncmVzX2NoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9PT0gbnVsbCB8fCBjYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FsbGJhY2soUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUy5TVUJTQ1JJQkVEKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50UG9zdGdyZXNCaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MucG9zdGdyZXNfY2hhbmdlcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmluZGluZ3NMZW4gPSAoX2EgPSBjbGllbnRQb3N0Z3Jlc0JpbmRpbmdzID09PSBudWxsIHx8IGNsaWVudFBvc3RncmVzQmluZGluZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsaWVudFBvc3RncmVzQmluZGluZ3MubGVuZ3RoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQb3N0Z3Jlc0JpbmRpbmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluZGluZ3NMZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpZW50UG9zdGdyZXNCaW5kaW5nID0gY2xpZW50UG9zdGdyZXNCaW5kaW5nc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZmlsdGVyOiB7IGV2ZW50LCBzY2hlbWEsIHRhYmxlLCBmaWx0ZXIgfSwgfSA9IGNsaWVudFBvc3RncmVzQmluZGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZlclBvc3RncmVzRmlsdGVyID0gcG9zdGdyZXNfY2hhbmdlcyAmJiBwb3N0Z3Jlc19jaGFuZ2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlclBvc3RncmVzRmlsdGVyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUG9zdGdyZXNGaWx0ZXIuZXZlbnQgPT09IGV2ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhbHRpbWVDaGFubmVsLmlzRmlsdGVyVmFsdWVFcXVhbChzZXJ2ZXJQb3N0Z3Jlc0ZpbHRlci5zY2hlbWEsIHNjaGVtYSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsdGltZUNoYW5uZWwuaXNGaWx0ZXJWYWx1ZUVxdWFsKHNlcnZlclBvc3RncmVzRmlsdGVyLnRhYmxlLCB0YWJsZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsdGltZUNoYW5uZWwuaXNGaWx0ZXJWYWx1ZUVxdWFsKHNlcnZlclBvc3RncmVzRmlsdGVyLmZpbHRlciwgZmlsdGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Bvc3RncmVzQmluZGluZ3MucHVzaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNsaWVudFBvc3RncmVzQmluZGluZyksIHsgaWQ6IHNlcnZlclBvc3RncmVzRmlsdGVyLmlkIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9PT0gbnVsbCB8fCBjYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FsbGJhY2soUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUy5DSEFOTkVMX0VSUk9SLCBuZXcgRXJyb3IoJ21pc21hdGNoIGJldHdlZW4gc2VydmVyIGFuZCBjbGllbnQgYmluZGluZ3MgZm9yIHBvc3RncmVzIGNoYW5nZXMnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZGluZ3MucG9zdGdyZXNfY2hhbmdlcyA9IG5ld1Bvc3RncmVzQmluZGluZ3M7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKFJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMuU1VCU0NSSUJFRCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZWNlaXZlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID09PSBudWxsIHx8IGNhbGxiYWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWxsYmFjayhSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTLkNIQU5ORUxfRVJST1IsIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShPYmplY3QudmFsdWVzKGVycm9yKS5qb2luKCcsICcpIHx8ICdlcnJvcicpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVjZWl2ZSgndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9PT0gbnVsbCB8fCBjYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FsbGJhY2soUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUy5USU1FRF9PVVQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByZXNlbmNlIHN0YXRlIGZvciB0aGlzIGNoYW5uZWwuXG4gICAgICpcbiAgICAgKiBUaGUgc2hhcGUgaXMgYSBtYXAga2V5ZWQgYnkgcHJlc2VuY2Uga2V5IChmb3IgZXhhbXBsZSBhIHVzZXIgaWQpIHdoZXJlIGVhY2ggZW50cnkgY29udGFpbnMgdGhlXG4gICAgICogdHJhY2tlZCBtZXRhZGF0YSBmb3IgdGhhdCB1c2VyLlxuICAgICAqL1xuICAgIHByZXNlbmNlU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXNlbmNlLnN0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyB0aGUgc3VwcGxpZWQgcGF5bG9hZCB0byB0aGUgcHJlc2VuY2UgdHJhY2tlciBzbyBvdGhlciBzdWJzY3JpYmVycyBjYW4gc2VlIHRoYXQgdGhpc1xuICAgICAqIGNsaWVudCBpcyBvbmxpbmUuIFVzZSBgdW50cmFja2AgdG8gc3RvcCBicm9hZGNhc3RpbmcgcHJlc2VuY2UgZm9yIHRoZSBzYW1lIGtleS5cbiAgICAgKi9cbiAgICBhc3luYyB0cmFjayhwYXlsb2FkLCBvcHRzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICAgICAgICB0eXBlOiAncHJlc2VuY2UnLFxuICAgICAgICAgICAgZXZlbnQ6ICd0cmFjaycsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICB9LCBvcHRzLnRpbWVvdXQgfHwgdGhpcy50aW1lb3V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY3VycmVudCBwcmVzZW5jZSBzdGF0ZSBmb3IgdGhpcyBjbGllbnQuXG4gICAgICovXG4gICAgYXN5bmMgdW50cmFjayhvcHRzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICAgICAgICB0eXBlOiAncHJlc2VuY2UnLFxuICAgICAgICAgICAgZXZlbnQ6ICd1bnRyYWNrJyxcbiAgICAgICAgfSwgb3B0cyk7XG4gICAgfVxuICAgIG9uKHR5cGUsIGZpbHRlciwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmpvaW5lZCAmJiB0eXBlID09PSBSRUFMVElNRV9MSVNURU5fVFlQRVMuUFJFU0VOQ0UpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmxvZygnY2hhbm5lbCcsIGByZXN1YnNjcmliZSB0byAke3RoaXMudG9waWN9IGR1ZSB0byBjaGFuZ2UgaW4gcHJlc2VuY2UgY2FsbGJhY2tzIG9uIGpvaW5lZCBjaGFubmVsYCk7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCkudGhlbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnN1YnNjcmliZSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fb24odHlwZSwgZmlsdGVyLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgYnJvYWRjYXN0IG1lc3NhZ2UgZXhwbGljaXRseSB2aWEgUkVTVCBBUEkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBhbHdheXMgdXNlcyB0aGUgUkVTVCBBUEkgZW5kcG9pbnQgcmVnYXJkbGVzcyBvZiBXZWJTb2NrZXQgY29ubmVjdGlvbiBzdGF0ZS5cbiAgICAgKiBVc2VmdWwgd2hlbiB5b3Ugd2FudCB0byBndWFyYW50ZWUgUkVTVCBkZWxpdmVyeSBvciB3aGVuIGdyYWR1YWxseSBtaWdyYXRpbmcgZnJvbSBpbXBsaWNpdCBSRVNUIGZhbGxiYWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBuYW1lIG9mIHRoZSBicm9hZGNhc3QgZXZlbnRcbiAgICAgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIHRvIGJlIHNlbnQgKHJlcXVpcmVkKVxuICAgICAqIEBwYXJhbSBvcHRzIE9wdGlvbnMgaW5jbHVkaW5nIHRpbWVvdXRcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBvYmplY3Qgd2l0aCBzdWNjZXNzIHN0YXR1cywgYW5kIGVycm9yIGRldGFpbHMgaWYgZmFpbGVkXG4gICAgICovXG4gICAgYXN5bmMgaHR0cFNlbmQoZXZlbnQsIHBheWxvYWQsIG9wdHMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChwYXlsb2FkID09PSB1bmRlZmluZWQgfHwgcGF5bG9hZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdQYXlsb2FkIGlzIHJlcXVpcmVkIGZvciBodHRwU2VuZCgpJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgIGFwaWtleTogdGhpcy5zb2NrZXQuYXBpS2V5ID8gdGhpcy5zb2NrZXQuYXBpS2V5IDogJycsXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5zb2NrZXQuYWNjZXNzVG9rZW5WYWx1ZSkge1xuICAgICAgICAgICAgaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3RoaXMuc29ja2V0LmFjY2Vzc1Rva2VuVmFsdWV9YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljOiB0aGlzLnN1YlRvcGljLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZTogdGhpcy5wcml2YXRlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9mZXRjaFdpdGhUaW1lb3V0KHRoaXMuYnJvYWRjYXN0RW5kcG9pbnRVUkwsIG9wdGlvbnMsIChfYSA9IG9wdHMudGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy50aW1lb3V0KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAyKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvckJvZHkgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvckJvZHkuZXJyb3IgfHwgZXJyb3JCb2R5Lm1lc3NhZ2UgfHwgZXJyb3JNZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYikgeyB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZSBpbnRvIHRoZSBjaGFubmVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFyZ3MgQXJndW1lbnRzIHRvIHNlbmQgdG8gY2hhbm5lbFxuICAgICAqIEBwYXJhbSBhcmdzLnR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gc2VuZFxuICAgICAqIEBwYXJhbSBhcmdzLmV2ZW50IFRoZSBuYW1lIG9mIHRoZSBldmVudCBiZWluZyBzZW50XG4gICAgICogQHBhcmFtIGFyZ3MucGF5bG9hZCBQYXlsb2FkIHRvIGJlIHNlbnRcbiAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIHRvIGJlIHVzZWQgZHVyaW5nIHRoZSBzZW5kIHByb2Nlc3NcbiAgICAgKi9cbiAgICBhc3luYyBzZW5kKGFyZ3MsIG9wdHMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBpZiAoIXRoaXMuX2NhblB1c2goKSAmJiBhcmdzLnR5cGUgPT09ICdicm9hZGNhc3QnKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlYWx0aW1lIHNlbmQoKSBpcyBhdXRvbWF0aWNhbGx5IGZhbGxpbmcgYmFjayB0byBSRVNUIEFQSS4gJyArXG4gICAgICAgICAgICAgICAgJ1RoaXMgYmVoYXZpb3Igd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuICcgK1xuICAgICAgICAgICAgICAgICdQbGVhc2UgdXNlIGh0dHBTZW5kKCkgZXhwbGljaXRseSBmb3IgUkVTVCBkZWxpdmVyeS4nKTtcbiAgICAgICAgICAgIGNvbnN0IHsgZXZlbnQsIHBheWxvYWQ6IGVuZHBvaW50X3BheWxvYWQgfSA9IGFyZ3M7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgIGFwaWtleTogdGhpcy5zb2NrZXQuYXBpS2V5ID8gdGhpcy5zb2NrZXQuYXBpS2V5IDogJycsXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5zb2NrZXQuYWNjZXNzVG9rZW5WYWx1ZSkge1xuICAgICAgICAgICAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0aGlzLnNvY2tldC5hY2Nlc3NUb2tlblZhbHVlfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljOiB0aGlzLnN1YlRvcGljLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGVuZHBvaW50X3BheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZTogdGhpcy5wcml2YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fZmV0Y2hXaXRoVGltZW91dCh0aGlzLmJyb2FkY2FzdEVuZHBvaW50VVJMLCBvcHRpb25zLCAoX2EgPSBvcHRzLnRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMudGltZW91dCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgKChfYiA9IHJlc3BvbnNlLmJvZHkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYW5jZWwoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLm9rID8gJ29rJyA6ICdlcnJvcic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndGltZWQgb3V0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZXJyb3InO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICAgICAgICAgIGNvbnN0IHB1c2ggPSB0aGlzLl9wdXNoKGFyZ3MudHlwZSwgYXJncywgb3B0cy50aW1lb3V0IHx8IHRoaXMudGltZW91dCk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MudHlwZSA9PT0gJ2Jyb2FkY2FzdCcgJiYgISgoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLnBhcmFtcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbmZpZykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmJyb2FkY2FzdCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmFjaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgnb2snKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHVzaC5yZWNlaXZlKCdvaycsICgpID0+IHJlc29sdmUoJ29rJykpO1xuICAgICAgICAgICAgICAgIHB1c2gucmVjZWl2ZSgnZXJyb3InLCAoKSA9PiByZXNvbHZlKCdlcnJvcicpKTtcbiAgICAgICAgICAgICAgICBwdXNoLnJlY2VpdmUoJ3RpbWVvdXQnLCAoKSA9PiByZXNvbHZlKCd0aW1lZCBvdXQnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBwYXlsb2FkIHRoYXQgd2lsbCBiZSBzZW50IHRoZSBuZXh0IHRpbWUgdGhlIGNoYW5uZWwgam9pbnMgKHJlY29ubmVjdHMpLlxuICAgICAqIFVzZWZ1bCBmb3Igcm90YXRpbmcgYWNjZXNzIHRva2VucyBvciB1cGRhdGluZyBjb25maWcgd2l0aG91dCByZS1jcmVhdGluZyB0aGUgY2hhbm5lbC5cbiAgICAgKi9cbiAgICB1cGRhdGVKb2luUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgIHRoaXMuam9pblB1c2gudXBkYXRlUGF5bG9hZChwYXlsb2FkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGVhdmVzIHRoZSBjaGFubmVsLlxuICAgICAqXG4gICAgICogVW5zdWJzY3JpYmVzIGZyb20gc2VydmVyIGV2ZW50cywgYW5kIGluc3RydWN0cyBjaGFubmVsIHRvIHRlcm1pbmF0ZSBvbiBzZXJ2ZXIuXG4gICAgICogVHJpZ2dlcnMgb25DbG9zZSgpIGhvb2tzLlxuICAgICAqXG4gICAgICogVG8gcmVjZWl2ZSBsZWF2ZSBhY2tub3dsZWRnZW1lbnRzLCB1c2UgdGhlIGEgYHJlY2VpdmVgIGhvb2sgdG8gYmluZCB0byB0aGUgc2VydmVyIGFjaywgaWU6XG4gICAgICogY2hhbm5lbC51bnN1YnNjcmliZSgpLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBhbGVydChcImxlZnQhXCIpIClcbiAgICAgKi9cbiAgICB1bnN1YnNjcmliZSh0aW1lb3V0ID0gdGhpcy50aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5sZWF2aW5nO1xuICAgICAgICBjb25zdCBvbkNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQubG9nKCdjaGFubmVsJywgYGxlYXZlICR7dGhpcy50b3BpY31gKTtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoQ0hBTk5FTF9FVkVOVFMuY2xvc2UsICdsZWF2ZScsIHRoaXMuX2pvaW5SZWYoKSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuam9pblB1c2guZGVzdHJveSgpO1xuICAgICAgICBsZXQgbGVhdmVQdXNoID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwge30sIHRpbWVvdXQpO1xuICAgICAgICAgICAgbGVhdmVQdXNoXG4gICAgICAgICAgICAgICAgLnJlY2VpdmUoJ29rJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG9uQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCdvaycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVjZWl2ZSgndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBvbkNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgndGltZWQgb3V0Jyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZWNlaXZlKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCdlcnJvcicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZWF2ZVB1c2guc2VuZCgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9jYW5QdXNoKCkpIHtcbiAgICAgICAgICAgICAgICBsZWF2ZVB1c2gudHJpZ2dlcignb2snLCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgbGVhdmVQdXNoID09PSBudWxsIHx8IGxlYXZlUHVzaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGVhdmVQdXNoLmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlYXJkb3duIHRoZSBjaGFubmVsLlxuICAgICAqXG4gICAgICogRGVzdHJveXMgYW5kIHN0b3BzIHJlbGF0ZWQgdGltZXJzLlxuICAgICAqL1xuICAgIHRlYXJkb3duKCkge1xuICAgICAgICB0aGlzLnB1c2hCdWZmZXIuZm9yRWFjaCgocHVzaCkgPT4gcHVzaC5kZXN0cm95KCkpO1xuICAgICAgICB0aGlzLnB1c2hCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpO1xuICAgICAgICB0aGlzLmpvaW5QdXNoLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmNsb3NlZDtcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IHt9O1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgYXN5bmMgX2ZldGNoV2l0aFRpbWVvdXQodXJsLCBvcHRpb25zLCB0aW1lb3V0KSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGNvbnN0IGlkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXQpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc29ja2V0LmZldGNoKHVybCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3B1c2goZXZlbnQsIHBheWxvYWQsIHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmpvaW5lZE9uY2UpIHtcbiAgICAgICAgICAgIHRocm93IGB0cmllZCB0byBwdXNoICcke2V2ZW50fScgdG8gJyR7dGhpcy50b3BpY30nIGJlZm9yZSBqb2luaW5nLiBVc2UgY2hhbm5lbC5zdWJzY3JpYmUoKSBiZWZvcmUgcHVzaGluZyBldmVudHNgO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwdXNoRXZlbnQgPSBuZXcgUHVzaCh0aGlzLCBldmVudCwgcGF5bG9hZCwgdGltZW91dCk7XG4gICAgICAgIGlmICh0aGlzLl9jYW5QdXNoKCkpIHtcbiAgICAgICAgICAgIHB1c2hFdmVudC5zZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9hZGRUb1B1c2hCdWZmZXIocHVzaEV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHVzaEV2ZW50O1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2FkZFRvUHVzaEJ1ZmZlcihwdXNoRXZlbnQpIHtcbiAgICAgICAgcHVzaEV2ZW50LnN0YXJ0VGltZW91dCgpO1xuICAgICAgICB0aGlzLnB1c2hCdWZmZXIucHVzaChwdXNoRXZlbnQpO1xuICAgICAgICAvLyBFbmZvcmNlIGJ1ZmZlciBzaXplIGxpbWl0XG4gICAgICAgIGlmICh0aGlzLnB1c2hCdWZmZXIubGVuZ3RoID4gTUFYX1BVU0hfQlVGRkVSX1NJWkUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRQdXNoID0gdGhpcy5wdXNoQnVmZmVyLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZFB1c2gpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVkUHVzaC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQubG9nKCdjaGFubmVsJywgYGRpc2NhcmRlZCBwdXNoIGR1ZSB0byBidWZmZXIgb3ZlcmZsb3c6ICR7cmVtb3ZlZFB1c2guZXZlbnR9YCwgcmVtb3ZlZFB1c2gucGF5bG9hZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGFibGUgbWVzc2FnZSBob29rXG4gICAgICpcbiAgICAgKiBSZWNlaXZlcyBhbGwgZXZlbnRzIGZvciBzcGVjaWFsaXplZCBtZXNzYWdlIGhhbmRsaW5nIGJlZm9yZSBkaXNwYXRjaGluZyB0byB0aGUgY2hhbm5lbCBjYWxsYmFja3MuXG4gICAgICogTXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfb25NZXNzYWdlKF9ldmVudCwgcGF5bG9hZCwgX3JlZikge1xuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9pc01lbWJlcih0b3BpYykge1xuICAgICAgICByZXR1cm4gdGhpcy50b3BpYyA9PT0gdG9waWM7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfam9pblJlZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuam9pblB1c2gucmVmO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3RyaWdnZXIodHlwZSwgcGF5bG9hZCwgcmVmKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IHR5cGVMb3dlciA9IHR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgeyBjbG9zZSwgZXJyb3IsIGxlYXZlLCBqb2luIH0gPSBDSEFOTkVMX0VWRU5UUztcbiAgICAgICAgY29uc3QgZXZlbnRzID0gW2Nsb3NlLCBlcnJvciwgbGVhdmUsIGpvaW5dO1xuICAgICAgICBpZiAocmVmICYmIGV2ZW50cy5pbmRleE9mKHR5cGVMb3dlcikgPj0gMCAmJiByZWYgIT09IHRoaXMuX2pvaW5SZWYoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMuX29uTWVzc2FnZSh0eXBlTG93ZXIsIHBheWxvYWQsIHJlZik7XG4gICAgICAgIGlmIChwYXlsb2FkICYmICFoYW5kbGVkUGF5bG9hZCkge1xuICAgICAgICAgICAgdGhyb3cgJ2NoYW5uZWwgb25NZXNzYWdlIGNhbGxiYWNrcyBtdXN0IHJldHVybiB0aGUgcGF5bG9hZCwgbW9kaWZpZWQgb3IgdW5tb2RpZmllZCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFsnaW5zZXJ0JywgJ3VwZGF0ZScsICdkZWxldGUnXS5pbmNsdWRlcyh0eXBlTG93ZXIpKSB7XG4gICAgICAgICAgICAoX2EgPSB0aGlzLmJpbmRpbmdzLnBvc3RncmVzX2NoYW5nZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5maWx0ZXIoKGJpbmQpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgICAgICByZXR1cm4gKChfYSA9IGJpbmQuZmlsdGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXZlbnQpID09PSAnKicgfHwgKChfYyA9IChfYiA9IGJpbmQuZmlsdGVyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZXZlbnQpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50b0xvY2FsZUxvd2VyQ2FzZSgpKSA9PT0gdHlwZUxvd2VyO1xuICAgICAgICAgICAgfSkubWFwKChiaW5kKSA9PiBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIChfYiA9IHRoaXMuYmluZGluZ3NbdHlwZUxvd2VyXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICAgICAgICAgIGlmIChbJ2Jyb2FkY2FzdCcsICdwcmVzZW5jZScsICdwb3N0Z3Jlc19jaGFuZ2VzJ10uaW5jbHVkZXModHlwZUxvd2VyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJ2lkJyBpbiBiaW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaW5kSWQgPSBiaW5kLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmluZEV2ZW50ID0gKF9hID0gYmluZC5maWx0ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYmluZElkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfYiA9IHBheWxvYWQuaWRzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaW5jbHVkZXMoYmluZElkKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmluZEV2ZW50ID09PSAnKicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpbmRFdmVudCA9PT0gbnVsbCB8fCBiaW5kRXZlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJpbmRFdmVudC50b0xvY2FsZUxvd2VyQ2FzZSgpKSA9PT0gKChfYyA9IHBheWxvYWQuZGF0YSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbmRFdmVudCA9IChfZSA9IChfZCA9IGJpbmQgPT09IG51bGwgfHwgYmluZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYmluZC5maWx0ZXIpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5ldmVudCkgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZEV2ZW50ID09PSAnKicgfHwgYmluZEV2ZW50ID09PSAoKF9mID0gcGF5bG9hZCA9PT0gbnVsbCB8fCBwYXlsb2FkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXlsb2FkLmV2ZW50KSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiaW5kLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gdHlwZUxvd2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLm1hcCgoYmluZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlZFBheWxvYWQgPT09ICdvYmplY3QnICYmICdpZHMnIGluIGhhbmRsZWRQYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc3RncmVzQ2hhbmdlcyA9IGhhbmRsZWRQYXlsb2FkLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgc2NoZW1hLCB0YWJsZSwgY29tbWl0X3RpbWVzdGFtcCwgdHlwZSwgZXJyb3JzIH0gPSBwb3N0Z3Jlc0NoYW5nZXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVucmljaGVkUGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0X3RpbWVzdGFtcDogY29tbWl0X3RpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldzoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBvbGQ6IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBlcnJvcnMsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZWRQYXlsb2FkID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBlbnJpY2hlZFBheWxvYWQpLCB0aGlzLl9nZXRQYXlsb2FkUmVjb3Jkcyhwb3N0Z3Jlc0NoYW5nZXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmluZC5jYWxsYmFjayhoYW5kbGVkUGF5bG9hZCwgcmVmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaXNDbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5jbG9zZWQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaXNKb2luZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5qb2luZWQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfaXNKb2luaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZztcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9pc0xlYXZpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBDSEFOTkVMX1NUQVRFUy5sZWF2aW5nO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3JlcGx5RXZlbnROYW1lKHJlZikge1xuICAgICAgICByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbih0eXBlLCBmaWx0ZXIsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHR5cGVMb3dlciA9IHR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgYmluZGluZyA9IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGVMb3dlcixcbiAgICAgICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5iaW5kaW5nc1t0eXBlTG93ZXJdKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzW3R5cGVMb3dlcl0ucHVzaChiaW5kaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NbdHlwZUxvd2VyXSA9IFtiaW5kaW5nXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vZmYodHlwZSwgZmlsdGVyKSB7XG4gICAgICAgIGNvbnN0IHR5cGVMb3dlciA9IHR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRoaXMuYmluZGluZ3NbdHlwZUxvd2VyXSkge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1t0eXBlTG93ZXJdID0gdGhpcy5iaW5kaW5nc1t0eXBlTG93ZXJdLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gISgoKF9hID0gYmluZC50eXBlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudG9Mb2NhbGVMb3dlckNhc2UoKSkgPT09IHR5cGVMb3dlciAmJlxuICAgICAgICAgICAgICAgICAgICBSZWFsdGltZUNoYW5uZWwuaXNFcXVhbChiaW5kLmZpbHRlciwgZmlsdGVyKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBpc0VxdWFsKG9iajEsIG9iajIpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9iajEpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMob2JqMikubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBrIGluIG9iajEpIHtcbiAgICAgICAgICAgIGlmIChvYmoxW2tdICE9PSBvYmoyW2tdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0d28gb3B0aW9uYWwgZmlsdGVyIHZhbHVlcyBmb3IgZXF1YWxpdHkuXG4gICAgICogVHJlYXRzIHVuZGVmaW5lZCwgbnVsbCwgYW5kIGVtcHR5IHN0cmluZyBhcyBlcXVpdmFsZW50IGVtcHR5IHZhbHVlcy5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNGaWx0ZXJWYWx1ZUVxdWFsKHNlcnZlclZhbHVlLCBjbGllbnRWYWx1ZSkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU2VydmVyID0gc2VydmVyVmFsdWUgIT09IG51bGwgJiYgc2VydmVyVmFsdWUgIT09IHZvaWQgMCA/IHNlcnZlclZhbHVlIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50ID0gY2xpZW50VmFsdWUgIT09IG51bGwgJiYgY2xpZW50VmFsdWUgIT09IHZvaWQgMCA/IGNsaWVudFZhbHVlIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZFNlcnZlciA9PT0gbm9ybWFsaXplZENsaWVudDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9yZWpvaW5VbnRpbENvbm5lY3RlZCgpIHtcbiAgICAgICAgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKTtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlam9pbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjaGFubmVsIGNsb3Nlcy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbkNsb3NlKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uKENIQU5ORUxfRVZFTlRTLmNsb3NlLCB7fSwgY2FsbGJhY2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2hhbm5lbCBlbmNvdW50ZXJlcyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbkVycm9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uKENIQU5ORUxfRVZFTlRTLmVycm9yLCB7fSwgKHJlYXNvbikgPT4gY2FsbGJhY2socmVhc29uKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIGFuZCB0aGUgY2hhbm5lbCBoYXMgYmVlbiBqb2luZWQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfY2FuUHVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkgJiYgdGhpcy5faXNKb2luZWQoKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9yZWpvaW4odGltZW91dCA9IHRoaXMudGltZW91dCkge1xuICAgICAgICBpZiAodGhpcy5faXNMZWF2aW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNvY2tldC5fbGVhdmVPcGVuVG9waWModGhpcy50b3BpYyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5qb2luaW5nO1xuICAgICAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9nZXRQYXlsb2FkUmVjb3JkcyhwYXlsb2FkKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZHMgPSB7XG4gICAgICAgICAgICBuZXc6IHt9LFxuICAgICAgICAgICAgb2xkOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHBheWxvYWQudHlwZSA9PT0gJ0lOU0VSVCcgfHwgcGF5bG9hZC50eXBlID09PSAnVVBEQVRFJykge1xuICAgICAgICAgICAgcmVjb3Jkcy5uZXcgPSBUcmFuc2Zvcm1lcnMuY29udmVydENoYW5nZURhdGEocGF5bG9hZC5jb2x1bW5zLCBwYXlsb2FkLnJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBheWxvYWQudHlwZSA9PT0gJ1VQREFURScgfHwgcGF5bG9hZC50eXBlID09PSAnREVMRVRFJykge1xuICAgICAgICAgICAgcmVjb3Jkcy5vbGQgPSBUcmFuc2Zvcm1lcnMuY29udmVydENoYW5nZURhdGEocGF5bG9hZC5jb2x1bW5zLCBwYXlsb2FkLm9sZF9yZWNvcmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvcmRzO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWx0aW1lQ2hhbm5lbC5qcy5tYXAiXSwibmFtZXMiOlsiQ0hBTk5FTF9FVkVOVFMiLCJDSEFOTkVMX1NUQVRFUyIsIk1BWF9QVVNIX0JVRkZFUl9TSVpFIiwiUHVzaCIsIlRpbWVyIiwiUmVhbHRpbWVQcmVzZW5jZSIsIlRyYW5zZm9ybWVycyIsImh0dHBFbmRwb2ludFVSTCIsIlJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UIiwiUkVBTFRJTUVfTElTVEVOX1RZUEVTIiwiUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUyIsIlJFQUxUSU1FX0NIQU5ORUxfU1RBVEVTIiwiUmVhbHRpbWVDaGFubmVsIiwiY29uc3RydWN0b3IiLCJ0b3BpYyIsInBhcmFtcyIsImNvbmZpZyIsInNvY2tldCIsIl9hIiwiX2IiLCJiaW5kaW5ncyIsInN0YXRlIiwiY2xvc2VkIiwiam9pbmVkT25jZSIsInB1c2hCdWZmZXIiLCJzdWJUb3BpYyIsInJlcGxhY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJicm9hZGNhc3QiLCJhY2siLCJzZWxmIiwicHJlc2VuY2UiLCJrZXkiLCJlbmFibGVkIiwicHJpdmF0ZSIsInRpbWVvdXQiLCJqb2luUHVzaCIsImpvaW4iLCJyZWpvaW5UaW1lciIsIl9yZWpvaW5VbnRpbENvbm5lY3RlZCIsInJlY29ubmVjdEFmdGVyTXMiLCJyZWNlaXZlIiwiam9pbmVkIiwicmVzZXQiLCJmb3JFYWNoIiwicHVzaEV2ZW50Iiwic2VuZCIsIl9vbkNsb3NlIiwibG9nIiwiX2pvaW5SZWYiLCJfcmVtb3ZlIiwiX29uRXJyb3IiLCJyZWFzb24iLCJfaXNMZWF2aW5nIiwiX2lzQ2xvc2VkIiwiZXJyb3JlZCIsInNjaGVkdWxlVGltZW91dCIsIl9pc0pvaW5pbmciLCJfb24iLCJyZXBseSIsInBheWxvYWQiLCJyZWYiLCJfdHJpZ2dlciIsIl9yZXBseUV2ZW50TmFtZSIsImJyb2FkY2FzdEVuZHBvaW50VVJMIiwiZW5kUG9pbnQiLCJyZXBsYXkiLCJzdWJzY3JpYmUiLCJjYWxsYmFjayIsIl9jIiwiaXNDb25uZWN0ZWQiLCJjb25uZWN0IiwiaXNQcml2YXRlIiwicG9zdGdyZXNfY2hhbmdlcyIsIm1hcCIsInIiLCJmaWx0ZXIiLCJwcmVzZW5jZV9lbmFibGVkIiwiUFJFU0VOQ0UiLCJsZW5ndGgiLCJhY2Nlc3NUb2tlblBheWxvYWQiLCJhY2Nlc3NUb2tlblZhbHVlIiwiYWNjZXNzX3Rva2VuIiwiZSIsIkNIQU5ORUxfRVJST1IiLCJDTE9TRUQiLCJ1cGRhdGVKb2luUGF5bG9hZCIsIl9yZWpvaW4iLCJfaXNNYW51YWxUb2tlbiIsInNldEF1dGgiLCJ1bmRlZmluZWQiLCJTVUJTQ1JJQkVEIiwiY2xpZW50UG9zdGdyZXNCaW5kaW5ncyIsImJpbmRpbmdzTGVuIiwibmV3UG9zdGdyZXNCaW5kaW5ncyIsImkiLCJjbGllbnRQb3N0Z3Jlc0JpbmRpbmciLCJldmVudCIsInNjaGVtYSIsInRhYmxlIiwic2VydmVyUG9zdGdyZXNGaWx0ZXIiLCJpc0ZpbHRlclZhbHVlRXF1YWwiLCJwdXNoIiwiaWQiLCJ1bnN1YnNjcmliZSIsIkVycm9yIiwiZXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsdWVzIiwiVElNRURfT1VUIiwicHJlc2VuY2VTdGF0ZSIsInRyYWNrIiwib3B0cyIsInR5cGUiLCJ1bnRyYWNrIiwib24iLCJ0aGVuIiwiaHR0cFNlbmQiLCJQcm9taXNlIiwicmVqZWN0IiwiaGVhZGVycyIsImFwaWtleSIsImFwaUtleSIsIm9wdGlvbnMiLCJtZXRob2QiLCJib2R5IiwibWVzc2FnZXMiLCJyZXNwb25zZSIsIl9mZXRjaFdpdGhUaW1lb3V0Iiwic3RhdHVzIiwic3VjY2VzcyIsImVycm9yTWVzc2FnZSIsInN0YXR1c1RleHQiLCJlcnJvckJvZHkiLCJqc29uIiwibWVzc2FnZSIsImFyZ3MiLCJfY2FuUHVzaCIsImNvbnNvbGUiLCJ3YXJuIiwiZW5kcG9pbnRfcGF5bG9hZCIsImNhbmNlbCIsIm9rIiwibmFtZSIsInJlc29sdmUiLCJfcHVzaCIsInVwZGF0ZVBheWxvYWQiLCJsZWF2aW5nIiwib25DbG9zZSIsImNsb3NlIiwiZGVzdHJveSIsImxlYXZlUHVzaCIsImxlYXZlIiwidHJpZ2dlciIsImZpbmFsbHkiLCJ0ZWFyZG93biIsInVybCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJzZXRUaW1lb3V0IiwiYWJvcnQiLCJmZXRjaCIsInNpZ25hbCIsImNsZWFyVGltZW91dCIsIl9hZGRUb1B1c2hCdWZmZXIiLCJzdGFydFRpbWVvdXQiLCJyZW1vdmVkUHVzaCIsInNoaWZ0IiwiX29uTWVzc2FnZSIsIl9ldmVudCIsIl9yZWYiLCJfaXNNZW1iZXIiLCJ0eXBlTG93ZXIiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsImV2ZW50cyIsImluZGV4T2YiLCJoYW5kbGVkUGF5bG9hZCIsImluY2x1ZGVzIiwiYmluZCIsIl9kIiwiX2UiLCJfZiIsImJpbmRJZCIsImJpbmRFdmVudCIsImlkcyIsImRhdGEiLCJwb3N0Z3Jlc0NoYW5nZXMiLCJjb21taXRfdGltZXN0YW1wIiwiZXJyb3JzIiwiZW5yaWNoZWRQYXlsb2FkIiwiZXZlbnRUeXBlIiwibmV3Iiwib2xkIiwiX2dldFBheWxvYWRSZWNvcmRzIiwiX2lzSm9pbmVkIiwiam9pbmluZyIsImJpbmRpbmciLCJfb2ZmIiwiaXNFcXVhbCIsIm9iajEiLCJvYmoyIiwia2V5cyIsImsiLCJzZXJ2ZXJWYWx1ZSIsImNsaWVudFZhbHVlIiwibm9ybWFsaXplZFNlcnZlciIsIm5vcm1hbGl6ZWRDbGllbnQiLCJfbGVhdmVPcGVuVG9waWMiLCJyZXNlbmQiLCJyZWNvcmRzIiwiY29udmVydENoYW5nZURhdGEiLCJjb2x1bW5zIiwicmVjb3JkIiwib2xkX3JlY29yZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js":
|
||
/*!**************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js ***!
|
||
\**************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ RealtimeClient)\n/* harmony export */ });\n/* harmony import */ var _lib_websocket_factory__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/websocket-factory */ \"(action-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 */ \"(action-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 */ \"(action-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 */ \"(action-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 */ \"(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js\");\n/* harmony import */ var _RealtimeChannel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./RealtimeChannel */ \"(action-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 * 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 (...args)=>customFetch(...args);\n }\n return (...args)=>fetch(...args);\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 = `${endPoint}/${_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 /**\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(`${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: ${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, params = {\n config: {}\n }) {\n const realtimeTopic = `realtime:${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:${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\", `${topic} ${event} (${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(token = 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 \"${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 ? `(${ref})` : \"\";\n const status = payload.status || \"\";\n this.log(\"receive\", `${status} ${topic} ${event} ${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 ${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 ${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\", `${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 `${url}${prefix}${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, manual = 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(token = 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(context = \"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 ${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 ${event} callback`, e);\n }\n });\n } catch (e) {\n this.log(\"error\", `error triggering ${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: ${this.vsn}`);\n }\n // Handle worker setup\n if (this.worker) {\n if (false) {}\n this.workerUrl = options === null || options === void 0 ? void 0 : options.workerUrl;\n }\n }\n} //# sourceMappingURL=RealtimeClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvUmVhbHRpbWVDbGllbnQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUF1RDtBQUM4SDtBQUMzSTtBQUNWO0FBQ3FCO0FBQ0w7QUFDaEQsTUFBTWUsT0FBTyxLQUFRO0FBQ3JCLCtCQUErQjtBQUMvQixNQUFNQyxzQkFBc0I7SUFDeEJDLG9CQUFvQjtJQUNwQkMsaUJBQWlCO0lBQ2pCQyw0QkFBNEI7QUFDaEM7QUFDQSxNQUFNQyxzQkFBc0I7SUFBQztJQUFNO0lBQU07SUFBTTtDQUFNO0FBQ3JELE1BQU1DLDZCQUE2QjtBQUNuQyxNQUFNQyxnQkFBZ0IsQ0FBQzs7Ozs7S0FLbEIsQ0FBQztBQUNTLE1BQU1DO0lBQ2pCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0EyQkMsR0FDREMsWUFBWUMsUUFBUSxFQUFFQyxPQUFPLENBQUU7UUFDM0IsSUFBSUM7UUFDSixJQUFJLENBQUNDLGdCQUFnQixHQUFHO1FBQ3hCLElBQUksQ0FBQ0MsTUFBTSxHQUFHO1FBQ2QsSUFBSSxDQUFDQyxpQkFBaUIsR0FBRztRQUN6QixJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJQztRQUNwQixJQUFJLENBQUNQLFFBQVEsR0FBRztRQUNoQixJQUFJLENBQUNRLFlBQVksR0FBRztRQUNwQiwrREFBK0QsR0FDL0QsSUFBSSxDQUFDQyxPQUFPLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUNDLE1BQU0sR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDQyxPQUFPLEdBQUdoQywyREFBZUE7UUFDOUIsSUFBSSxDQUFDaUMsU0FBUyxHQUFHO1FBQ2pCLElBQUksQ0FBQ0MsbUJBQW1CLEdBQUd0QixvQkFBb0JDLGtCQUFrQjtRQUNqRSxJQUFJLENBQUNzQixjQUFjLEdBQUdDO1FBQ3RCLElBQUksQ0FBQ0MsbUJBQW1CLEdBQUc7UUFDM0IsSUFBSSxDQUFDQyxpQkFBaUIsR0FB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QUFJLEtBQUssSUFBSUEsUUFBUTBILE1BQU0sTUFBTSxRQUFRcUUsT0FBTyxLQUFLLElBQUlBLEtBQU0sQ0FBQy9GLFNBQVNDO29CQUNoSCxPQUFPQSxTQUFTb0csS0FBS0UsS0FBSyxDQUFDdkc7Z0JBQy9CO2dCQUNKO1lBQ0osS0FBS2pILHFEQUFTQTtnQkFDVixJQUFJLENBQUNtSCxNQUFNLEdBQUcsQ0FBQzhGLEtBQUtoTSxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUWtHLE1BQU0sTUFBTSxRQUFROEYsT0FBTyxLQUFLLElBQUlBLEtBQUssSUFBSSxDQUFDekssVUFBVSxDQUFDMkUsTUFBTSxDQUFDc0csSUFBSSxDQUFDLElBQUksQ0FBQ2pMLFVBQVU7Z0JBQ2xLLElBQUksQ0FBQ21HLE1BQU0sR0FBRyxDQUFDdUUsS0FBS2pNLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRMEgsTUFBTSxNQUFNLFFBQVF1RSxPQUFPLEtBQUssSUFBSUEsS0FBSyxJQUFJLENBQUMxSyxVQUFVLENBQUNtRyxNQUFNLENBQUM4RSxJQUFJLENBQUMsSUFBSSxDQUFDakwsVUFBVTtnQkFDbEs7WUFDSjtnQkFDSSxNQUFNLElBQUllLE1BQU0sQ0FBQyxnQ0FBZ0MsRUFBRSxJQUFJLENBQUNuQixHQUFHLENBQUMsQ0FBQztRQUNyRTtRQUNBLHNCQUFzQjtRQUN0QixJQUFJLElBQUksQ0FBQytILE1BQU0sRUFBRTtZQUNiLElBQUksS0FBK0MsRUFBRSxFQUVwRDtZQUNELElBQUksQ0FBQ0ssU0FBUyxHQUFHdkosWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVF1SixTQUFTO1FBQ3hGO0lBQ0o7QUFDSixFQUNBLDBDQUEwQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvUmVhbHRpbWVDbGllbnQuanM/NmI2ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgV2ViU29ja2V0RmFjdG9yeSBmcm9tICcuL2xpYi93ZWJzb2NrZXQtZmFjdG9yeSc7XG5pbXBvcnQgeyBDSEFOTkVMX0VWRU5UUywgQ09OTkVDVElPTl9TVEFURSwgREVGQVVMVF9WRVJTSU9OLCBERUZBVUxUX1RJTUVPVVQsIFNPQ0tFVF9TVEFURVMsIFRSQU5TUE9SVFMsIERFRkFVTFRfVlNOLCBWU05fMV8wXzAsIFZTTl8yXzBfMCwgV1NfQ0xPU0VfTk9STUFMLCB9IGZyb20gJy4vbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgU2VyaWFsaXplciBmcm9tICcuL2xpYi9zZXJpYWxpemVyJztcbmltcG9ydCBUaW1lciBmcm9tICcuL2xpYi90aW1lcic7XG5pbXBvcnQgeyBodHRwRW5kcG9pbnRVUkwgfSBmcm9tICcuL2xpYi90cmFuc2Zvcm1lcnMnO1xuaW1wb3J0IFJlYWx0aW1lQ2hhbm5lbCBmcm9tICcuL1JlYWx0aW1lQ2hhbm5lbCc7XG5jb25zdCBub29wID0gKCkgPT4geyB9O1xuLy8gQ29ubmVjdGlvbi1yZWxhdGVkIGNvbnN0YW50c1xuY29uc3QgQ09OTkVDVElPTl9USU1FT1VUUyA9IHtcbiAgICBIRUFSVEJFQVRfSU5URVJWQUw6IDI1MDAwLFxuICAgIFJFQ09OTkVDVF9ERUxBWTogMTAsXG4gICAgSEVBUlRCRUFUX1RJTUVPVVRfRkFMTEJBQ0s6IDEwMCxcbn07XG5jb25zdCBSRUNPTk5FQ1RfSU5URVJWQUxTID0gWzEwMDAsIDIwMDAsIDUwMDAsIDEwMDAwXTtcbmNvbnN0IERFRkFVTFRfUkVDT05ORUNUX0ZBTExCQUNLID0gMTAwMDA7XG5jb25zdCBXT1JLRVJfU0NSSVBUID0gYFxuICBhZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZSkgPT4ge1xuICAgIGlmIChlLmRhdGEuZXZlbnQgPT09IFwic3RhcnRcIikge1xuICAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gcG9zdE1lc3NhZ2UoeyBldmVudDogXCJrZWVwQWxpdmVcIiB9KSwgZS5kYXRhLmludGVydmFsKTtcbiAgICB9XG4gIH0pO2A7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWFsdGltZUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgdGhlIFNvY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbmRQb2ludCBUaGUgc3RyaW5nIFdlYlNvY2tldCBlbmRwb2ludCwgaWUsIFwid3M6Ly9leGFtcGxlLmNvbS9zb2NrZXRcIiwgXCJ3c3M6Ly9leGFtcGxlLmNvbVwiLCBcIi9zb2NrZXRcIiAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAgICAgKiBAcGFyYW0gaHR0cEVuZHBvaW50IFRoZSBzdHJpbmcgSFRUUCBlbmRwb2ludCwgaWUsIFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiLCBcIi9cIiAoaW5oZXJpdGVkIGhvc3QgJiBwcm90b2NvbClcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy50cmFuc3BvcnQgVGhlIFdlYnNvY2tldCBUcmFuc3BvcnQsIGZvciBleGFtcGxlIFdlYlNvY2tldC4gVGhpcyBjYW4gYmUgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy50aW1lb3V0IFRoZSBkZWZhdWx0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHRyaWdnZXIgcHVzaCB0aW1lb3V0cy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5wYXJhbXMgVGhlIG9wdGlvbmFsIHBhcmFtcyB0byBwYXNzIHdoZW4gY29ubmVjdGluZy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5oZWFkZXJzIERlcHJlY2F0ZWQ6IGhlYWRlcnMgY2Fubm90IGJlIHNldCBvbiB3ZWJzb2NrZXQgY29ubmVjdGlvbnMgYW5kIHRoaXMgb3B0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLmhlYXJ0YmVhdEludGVydmFsTXMgVGhlIG1pbGxpc2VjIGludGVydmFsIHRvIHNlbmQgYSBoZWFydGJlYXQgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5oZWFydGJlYXRDYWxsYmFjayBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gdG8gaGFuZGxlIGhlYXJ0YmVhdCBzdGF0dXMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMubG9nZ2VyIFRoZSBvcHRpb25hbCBmdW5jdGlvbiBmb3Igc3BlY2lhbGl6ZWQgbG9nZ2luZywgaWU6IGxvZ2dlcjogKGtpbmQsIG1zZywgZGF0YSkgPT4geyBjb25zb2xlLmxvZyhgJHtraW5kfTogJHttc2d9YCwgZGF0YSkgfVxuICAgICAqIEBwYXJhbSBvcHRpb25zLmxvZ0xldmVsIFNldHMgdGhlIGxvZyBsZXZlbCBmb3IgUmVhbHRpbWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5lbmNvZGUgVGhlIGZ1bmN0aW9uIHRvIGVuY29kZSBvdXRnb2luZyBtZXNzYWdlcy4gRGVmYXVsdHMgdG8gSlNPTjogKHBheWxvYWQsIGNhbGxiYWNrKSA9PiBjYWxsYmFjayhKU09OLnN0cmluZ2lmeShwYXlsb2FkKSlcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5kZWNvZGUgVGhlIGZ1bmN0aW9uIHRvIGRlY29kZSBpbmNvbWluZyBtZXNzYWdlcy4gRGVmYXVsdHMgdG8gU2VyaWFsaXplcidzIGRlY29kZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yZWNvbm5lY3RBZnRlck1zIGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWlsbHNlYyByZWNvbm5lY3QgaW50ZXJ2YWwuIERlZmF1bHRzIHRvIHN0ZXBwZWQgYmFja29mZiBvZmYuXG4gICAgICogQHBhcmFtIG9wdGlvbnMud29ya2VyIFVzZSBXZWIgV29ya2VyIHRvIHNldCBhIHNpZGUgZmxvdy4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMud29ya2VyVXJsIFRoZSBVUkwgb2YgdGhlIHdvcmtlciBzY3JpcHQuIERlZmF1bHRzIHRvIGh0dHBzOi8vcmVhbHRpbWUuc3VwYWJhc2UuY29tL3dvcmtlci5qcyB0aGF0IGluY2x1ZGVzIGEgaGVhcnRiZWF0IGV2ZW50IGNhbGwgdG8ga2VlcCB0aGUgY29ubmVjdGlvbiBhbGl2ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IFJlYWx0aW1lQ2xpZW50IGZyb20gJ0BzdXBhYmFzZS9yZWFsdGltZS1qcydcbiAgICAgKlxuICAgICAqIGNvbnN0IGNsaWVudCA9IG5ldyBSZWFsdGltZUNsaWVudCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL3JlYWx0aW1lL3YxJywge1xuICAgICAqICAgcGFyYW1zOiB7IGFwaWtleTogJ3B1YmxpYy1hbm9uLWtleScgfSxcbiAgICAgKiB9KVxuICAgICAqIGNsaWVudC5jb25uZWN0KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlbmRQb2ludCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW5WYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYXBpS2V5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWFudWFsbHlTZXRUb2tlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5uZWxzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHRoaXMuZW5kUG9pbnQgPSAnJztcbiAgICAgICAgdGhpcy5odHRwRW5kcG9pbnQgPSAnJztcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIGhlYWRlcnMgY2Fubm90IGJlIHNldCBvbiB3ZWJzb2NrZXQgY29ubmVjdGlvbnMgKi9cbiAgICAgICAgdGhpcy5oZWFkZXJzID0ge307XG4gICAgICAgIHRoaXMucGFyYW1zID0ge307XG4gICAgICAgIHRoaXMudGltZW91dCA9IERFRkFVTFRfVElNRU9VVDtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMgPSBDT05ORUNUSU9OX1RJTUVPVVRTLkhFQVJUQkVBVF9JTlRFUlZBTDtcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbDtcbiAgICAgICAgdGhpcy5oZWFydGJlYXRDYWxsYmFjayA9IG5vb3A7XG4gICAgICAgIHRoaXMucmVmID0gMDtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGw7XG4gICAgICAgIHRoaXMudnNuID0gREVGQVVMVF9WU047XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbm9vcDtcbiAgICAgICAgdGhpcy5jb25uID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZW5kQnVmZmVyID0gW107XG4gICAgICAgIHRoaXMuc2VyaWFsaXplciA9IG5ldyBTZXJpYWxpemVyKCk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MgPSB7XG4gICAgICAgICAgICBvcGVuOiBbXSxcbiAgICAgICAgICAgIGNsb3NlOiBbXSxcbiAgICAgICAgICAgIGVycm9yOiBbXSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IFtdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY29ubmVjdGlvblN0YXRlID0gJ2Rpc2Nvbm5lY3RlZCc7XG4gICAgICAgIHRoaXMuX3dhc01hbnVhbERpc2Nvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYXV0aFByb21pc2UgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGVpdGhlciBjdXN0b20gZmV0Y2gsIGlmIHByb3ZpZGVkLCBvciBkZWZhdWx0IGZldGNoIHRvIG1ha2UgSFRUUCByZXF1ZXN0c1xuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3Jlc29sdmVGZXRjaCA9IChjdXN0b21GZXRjaCkgPT4ge1xuICAgICAgICAgICAgaWYgKGN1c3RvbUZldGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiBjdXN0b21GZXRjaCguLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoLi4uYXJncykgPT4gZmV0Y2goLi4uYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgICAgICAgaWYgKCEoKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnBhcmFtcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFwaWtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQVBJIGtleSBpcyByZXF1aXJlZCB0byBjb25uZWN0IHRvIFJlYWx0aW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcGlLZXkgPSBvcHRpb25zLnBhcmFtcy5hcGlrZXk7XG4gICAgICAgIC8vIEluaXRpYWxpemUgZW5kcG9pbnQgVVJMc1xuICAgICAgICB0aGlzLmVuZFBvaW50ID0gYCR7ZW5kUG9pbnR9LyR7VFJBTlNQT1JUUy53ZWJzb2NrZXR9YDtcbiAgICAgICAgdGhpcy5odHRwRW5kcG9pbnQgPSBodHRwRW5kcG9pbnRVUkwoZW5kUG9pbnQpO1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fc2V0dXBSZWNvbm5lY3Rpb25UaW1lcigpO1xuICAgICAgICB0aGlzLmZldGNoID0gdGhpcy5fcmVzb2x2ZUZldGNoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5mZXRjaCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQsIHVubGVzcyBhbHJlYWR5IGNvbm5lY3RlZC5cbiAgICAgKi9cbiAgICBjb25uZWN0KCkge1xuICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgY29ubmVjdGluZywgZGlzY29ubmVjdGluZywgb3IgY29ubmVjdGVkXG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGluZygpIHx8XG4gICAgICAgICAgICB0aGlzLmlzRGlzY29ubmVjdGluZygpIHx8XG4gICAgICAgICAgICAodGhpcy5jb25uICE9PSBudWxsICYmIHRoaXMuaXNDb25uZWN0ZWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXRDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RpbmcnKTtcbiAgICAgICAgLy8gVHJpZ2dlciBhdXRoIGlmIG5lZWRlZCBhbmQgbm90IGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGF1dGggaXMgY2FsbGVkIGZvciBzdGFuZGFsb25lIFJlYWx0aW1lQ2xpZW50IHVzYWdlXG4gICAgICAgIC8vIHdoaWxlIGF2b2lkaW5nIHJhY2UgY29uZGl0aW9ucyB3aXRoIFN1cGFiYXNlQ2xpZW50J3MgaW1tZWRpYXRlIHNldEF1dGggY2FsbFxuICAgICAgICBpZiAodGhpcy5hY2Nlc3NUb2tlbiAmJiAhdGhpcy5fYXV0aFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEF1dGhTYWZlbHkoJ2Nvbm5lY3QnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFc3RhYmxpc2ggV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICAvLyBVc2UgY3VzdG9tIHRyYW5zcG9ydCBpZiBwcm92aWRlZFxuICAgICAgICAgICAgdGhpcy5jb25uID0gbmV3IHRoaXMudHJhbnNwb3J0KHRoaXMuZW5kcG9pbnRVUkwoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gdXNlIG5hdGl2ZSBXZWJTb2NrZXRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uID0gV2ViU29ja2V0RmFjdG9yeS5jcmVhdGVXZWJTb2NrZXQodGhpcy5lbmRwb2ludFVSTCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAvLyBQcm92aWRlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSBiYXNlZCBvbiBlbnZpcm9ubWVudFxuICAgICAgICAgICAgICAgIGlmIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ05vZGUuanMnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3JNZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1RvIHVzZSBSZWFsdGltZSBpbiBOb2RlLmpzLCB5b3UgbmVlZCB0byBwcm92aWRlIGEgV2ViU29ja2V0IGltcGxlbWVudGF0aW9uOlxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ09wdGlvbiAxOiBVc2UgTm9kZS5qcyAyMisgd2hpY2ggaGFzIG5hdGl2ZSBXZWJTb2NrZXQgc3VwcG9ydFxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ09wdGlvbiAyOiBJbnN0YWxsIGFuZCBwcm92aWRlIHRoZSBcIndzXCIgcGFja2FnZTpcXG5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgIG5wbSBpbnN0YWxsIHdzXFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICBpbXBvcnQgd3MgZnJvbSBcIndzXCJcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgIGNvbnN0IGNsaWVudCA9IG5ldyBSZWFsdGltZUNsaWVudCh1cmwsIHtcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICAgLi4ub3B0aW9ucyxcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgICAgdHJhbnNwb3J0OiB3c1xcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgfSknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXZWJTb2NrZXQgbm90IGF2YWlsYWJsZTogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0dXBDb25uZWN0aW9uSGFuZGxlcnMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgVVJMIG9mIHRoZSB3ZWJzb2NrZXQuXG4gICAgICogQHJldHVybnMgc3RyaW5nIFRoZSBVUkwgb2YgdGhlIHdlYnNvY2tldC5cbiAgICAgKi9cbiAgICBlbmRwb2ludFVSTCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGVuZFBhcmFtcyh0aGlzLmVuZFBvaW50LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnBhcmFtcywgeyB2c246IHRoaXMudnNuIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdHMgdGhlIHNvY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb2RlIEEgbnVtZXJpYyBzdGF0dXMgY29kZSB0byBzZW5kIG9uIGRpc2Nvbm5lY3QuXG4gICAgICogQHBhcmFtIHJlYXNvbiBBIGN1c3RvbSByZWFzb24gZm9yIHRoZSBkaXNjb25uZWN0LlxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzY29ubmVjdGluZygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0aW5nJywgdHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmNvbm4pIHtcbiAgICAgICAgICAgIC8vIFNldHVwIGZhbGxiYWNrIHRpbWVyIHRvIHByZXZlbnQgaGFuZ2luZyBpbiBkaXNjb25uZWN0aW5nIHN0YXRlXG4gICAgICAgICAgICBjb25zdCBmYWxsYmFja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICB0aGlzLmNvbm4ub25jbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZmFsbGJhY2tUaW1lcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBDbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaWYgY2xvc2UgbWV0aG9kIGV4aXN0c1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbm4uY2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm4uY2xvc2UoY29kZSwgcmVhc29uICE9PSBudWxsICYmIHJlYXNvbiAhPT0gdm9pZCAwID8gcmVhc29uIDogJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGVhcmRvd25Db25uZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGNyZWF0ZWQgY2hhbm5lbHNcbiAgICAgKi9cbiAgICBnZXRDaGFubmVscygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVuc3Vic2NyaWJlcyBhbmQgcmVtb3ZlcyBhIHNpbmdsZSBjaGFubmVsXG4gICAgICogQHBhcmFtIGNoYW5uZWwgQSBSZWFsdGltZUNoYW5uZWwgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhc3luYyByZW1vdmVDaGFubmVsKGNoYW5uZWwpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgY2hhbm5lbC51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAodGhpcy5jaGFubmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVuc3Vic2NyaWJlcyBhbmQgcmVtb3ZlcyBhbGwgY2hhbm5lbHNcbiAgICAgKi9cbiAgICBhc3luYyByZW1vdmVBbGxDaGFubmVscygpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzXzEgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmNoYW5uZWxzLm1hcCgoY2hhbm5lbCkgPT4gY2hhbm5lbC51bnN1YnNjcmliZSgpKSk7XG4gICAgICAgIHRoaXMuY2hhbm5lbHMgPSBbXTtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICAgIHJldHVybiB2YWx1ZXNfMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9ncyB0aGUgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEZvciBjdXN0b21pemVkIGxvZ2dpbmcsIGB0aGlzLmxvZ2dlcmAgY2FuIGJlIG92ZXJyaWRkZW4uXG4gICAgICovXG4gICAgbG9nKGtpbmQsIG1zZywgZGF0YSkge1xuICAgICAgICB0aGlzLmxvZ2dlcihraW5kLCBtc2csIGRhdGEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzb2NrZXQuXG4gICAgICovXG4gICAgY29ubmVjdGlvblN0YXRlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY29ubiAmJiB0aGlzLmNvbm4ucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSBTT0NLRVRfU1RBVEVTLmNvbm5lY3Rpbmc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIENPTk5FQ1RJT05fU1RBVEUuQ29ubmVjdGluZztcbiAgICAgICAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5vcGVuOlxuICAgICAgICAgICAgICAgIHJldHVybiBDT05ORUNUSU9OX1NUQVRFLk9wZW47XG4gICAgICAgICAgICBjYXNlIFNPQ0tFVF9TVEFURVMuY2xvc2luZzpcbiAgICAgICAgICAgICAgICByZXR1cm4gQ09OTkVDVElPTl9TVEFURS5DbG9zaW5nO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gQ09OTkVDVElPTl9TVEFURS5DbG9zZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaXMgdGhlIGNvbm5lY3Rpb24gaXMgb3Blbi5cbiAgICAgKi9cbiAgICBpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXRlKCkgPT09IENPTk5FQ1RJT05fU1RBVEUuT3BlbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY3VycmVudGx5IGNvbm5lY3RpbmcuXG4gICAgICovXG4gICAgaXNDb25uZWN0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvblN0YXRlID09PSAnY29ubmVjdGluZyc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBjb25uZWN0aW9uIGlzIGN1cnJlbnRseSBkaXNjb25uZWN0aW5nLlxuICAgICAqL1xuICAgIGlzRGlzY29ubmVjdGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25TdGF0ZSA9PT0gJ2Rpc2Nvbm5lY3RpbmcnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIChvciByZXVzZXMpIGEge0BsaW5rIFJlYWx0aW1lQ2hhbm5lbH0gZm9yIHRoZSBwcm92aWRlZCB0b3BpYy5cbiAgICAgKlxuICAgICAqIFRvcGljcyBhcmUgYXV0b21hdGljYWxseSBwcmVmaXhlZCB3aXRoIGByZWFsdGltZTpgIHRvIG1hdGNoIHRoZSBSZWFsdGltZSBzZXJ2aWNlLlxuICAgICAqIElmIGEgY2hhbm5lbCB3aXRoIHRoZSBzYW1lIHRvcGljIGFscmVhZHkgZXhpc3RzIGl0IHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBjcmVhdGluZ1xuICAgICAqIGEgZHVwbGljYXRlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgY2hhbm5lbCh0b3BpYywgcGFyYW1zID0geyBjb25maWc6IHt9IH0pIHtcbiAgICAgICAgY29uc3QgcmVhbHRpbWVUb3BpYyA9IGByZWFsdGltZToke3RvcGljfWA7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuZ2V0Q2hhbm5lbHMoKS5maW5kKChjKSA9PiBjLnRvcGljID09PSByZWFsdGltZVRvcGljKTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW4gPSBuZXcgUmVhbHRpbWVDaGFubmVsKGByZWFsdGltZToke3RvcGljfWAsIHBhcmFtcywgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxzLnB1c2goY2hhbik7XG4gICAgICAgICAgICByZXR1cm4gY2hhbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBleGlzdHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVzaCBvdXQgYSBtZXNzYWdlIGlmIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkLlxuICAgICAqXG4gICAgICogSWYgdGhlIHNvY2tldCBpcyBub3QgY29ubmVjdGVkLCB0aGUgbWVzc2FnZSBnZXRzIGVucXVldWVkIHdpdGhpbiBhIGxvY2FsIGJ1ZmZlciwgYW5kIHNlbnQgb3V0IHdoZW4gYSBjb25uZWN0aW9uIGlzIG5leHQgZXN0YWJsaXNoZWQuXG4gICAgICovXG4gICAgcHVzaChkYXRhKSB7XG4gICAgICAgIGNvbnN0IHsgdG9waWMsIGV2ZW50LCBwYXlsb2FkLCByZWYgfSA9IGRhdGE7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbmNvZGUoZGF0YSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLmNvbm4pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZW5kKHJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sb2coJ3B1c2gnLCBgJHt0b3BpY30gJHtldmVudH0gKCR7cmVmfSlgLCBwYXlsb2FkKTtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEJ1ZmZlci5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBKV1QgYWNjZXNzIHRva2VuIHVzZWQgZm9yIGNoYW5uZWwgc3Vic2NyaXB0aW9uIGF1dGhvcml6YXRpb24gYW5kIFJlYWx0aW1lIFJMUy5cbiAgICAgKlxuICAgICAqIElmIHBhcmFtIGlzIG51bGwgaXQgd2lsbCB1c2UgdGhlIGBhY2Nlc3NUb2tlbmAgY2FsbGJhY2sgZnVuY3Rpb24gb3IgdGhlIHRva2VuIHNldCBvbiB0aGUgY2xpZW50LlxuICAgICAqXG4gICAgICogT24gY2FsbGJhY2sgdXNlZCwgaXQgd2lsbCBzZXQgdGhlIHZhbHVlIG9mIHRoZSB0b2tlbiBpbnRlcm5hbCB0byB0aGUgY2xpZW50LlxuICAgICAqXG4gICAgICogV2hlbiBhIHRva2VuIGlzIGV4cGxpY2l0bHkgcHJvdmlkZWQsIGl0IHdpbGwgYmUgcHJlc2VydmVkIGFjcm9zcyBjaGFubmVsIG9wZXJhdGlvbnNcbiAgICAgKiAoaW5jbHVkaW5nIHJlbW92ZUNoYW5uZWwgYW5kIHJlc3Vic2NyaWJlKS4gVGhlIGBhY2Nlc3NUb2tlbmAgY2FsbGJhY2sgd2lsbCBub3QgYmVcbiAgICAgKiBpbnZva2VkIHVudGlsIGBzZXRBdXRoKClgIGlzIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b2tlbiBBIEpXVCBzdHJpbmcgdG8gb3ZlcnJpZGUgdGhlIHRva2VuIHNldCBvbiB0aGUgY2xpZW50LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBVc2UgYSBtYW51YWwgdG9rZW4gKHByZXNlcnZlZCBhY3Jvc3MgcmVzdWJzY3JpYmVzLCBpZ25vcmVzIGFjY2Vzc1Rva2VuIGNhbGxiYWNrKVxuICAgICAqIGNsaWVudC5yZWFsdGltZS5zZXRBdXRoKCdteS1jdXN0b20tand0JylcbiAgICAgKlxuICAgICAqIC8vIFN3aXRjaCBiYWNrIHRvIHVzaW5nIHRoZSBhY2Nlc3NUb2tlbiBjYWxsYmFja1xuICAgICAqIGNsaWVudC5yZWFsdGltZS5zZXRBdXRoKClcbiAgICAgKi9cbiAgICBhc3luYyBzZXRBdXRoKHRva2VuID0gbnVsbCkge1xuICAgICAgICB0aGlzLl9hdXRoUHJvbWlzZSA9IHRoaXMuX3BlcmZvcm1BdXRoKHRva2VuKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2F1dGhQcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fYXV0aFByb21pc2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBhY2Nlc3MgdG9rZW4gd2FzIGV4cGxpY2l0bHkgc2V0IHZpYSBzZXRBdXRoKHRva2VuKSxcbiAgICAgKiBmYWxzZSBpZiBpdCB3YXMgb2J0YWluZWQgdmlhIHRoZSBhY2Nlc3NUb2tlbiBjYWxsYmFjay5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfaXNNYW51YWxUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hbnVhbGx5U2V0VG9rZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgaGVhcnRiZWF0IG1lc3NhZ2UgaWYgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuXG4gICAgICovXG4gICAgYXN5bmMgc2VuZEhlYXJ0YmVhdCgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdENhbGxiYWNrKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgJ2Vycm9yIGluIGhlYXJ0YmVhdCBjYWxsYmFjaycsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBoZWFydGJlYXQgdGltZW91dCBhbmQgZm9yY2UgcmVjb25uZWN0aW9uIGlmIG5lZWRlZFxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5sb2coJ3RyYW5zcG9ydCcsICdoZWFydGJlYXQgdGltZW91dC4gQXR0ZW1wdGluZyB0byByZS1lc3RhYmxpc2ggY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdENhbGxiYWNrKCd0aW1lb3V0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsICdlcnJvciBpbiBoZWFydGJlYXQgY2FsbGJhY2snLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvcmNlIHJlY29ubmVjdGlvbiBhZnRlciBoZWFydGJlYXQgdGltZW91dFxuICAgICAgICAgICAgdGhpcy5fd2FzTWFudWFsRGlzY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgKF9hID0gdGhpcy5jb25uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xvc2UoV1NfQ0xPU0VfTk9STUFMLCAnaGVhcnRiZWF0IHRpbWVvdXQnKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLnJlY29ubmVjdFRpbWVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2NoZWR1bGVUaW1lb3V0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgQ09OTkVDVElPTl9USU1FT1VUUy5IRUFSVEJFQVRfVElNRU9VVF9GQUxMQkFDSyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VuZCBoZWFydGJlYXQgbWVzc2FnZSB0byBzZXJ2ZXJcbiAgICAgICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gdGhpcy5fbWFrZVJlZigpO1xuICAgICAgICB0aGlzLnB1c2goe1xuICAgICAgICAgICAgdG9waWM6ICdwaG9lbml4JyxcbiAgICAgICAgICAgIGV2ZW50OiAnaGVhcnRiZWF0JyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHt9LFxuICAgICAgICAgICAgcmVmOiB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5oZWFydGJlYXRDYWxsYmFjaygnc2VudCcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnZXJyb3IgaW4gaGVhcnRiZWF0IGNhbGxiYWNrJywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0QXV0aFNhZmVseSgnaGVhcnRiZWF0Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHJlY2VpdmVzIGxpZmVjeWNsZSBldmVudHMgZm9yIGludGVybmFsIGhlYXJ0YmVhdCBtZXNzYWdlcy5cbiAgICAgKiBVc2VmdWwgZm9yIGluc3RydW1lbnRpbmcgY29ubmVjdGlvbiBoZWFsdGggKGUuZy4gc2VudC9vay90aW1lb3V0L2Rpc2Nvbm5lY3RlZCkuXG4gICAgICovXG4gICAgb25IZWFydGJlYXQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5oZWFydGJlYXRDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGbHVzaGVzIHNlbmQgYnVmZmVyXG4gICAgICovXG4gICAgZmx1c2hTZW5kQnVmZmVyKCkge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpICYmIHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRCdWZmZXIuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKCkpO1xuICAgICAgICAgICAgdGhpcy5zZW5kQnVmZmVyID0gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBuZXh0IG1lc3NhZ2UgcmVmLCBhY2NvdW50aW5nIGZvciBvdmVyZmxvd3NcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9tYWtlUmVmKCkge1xuICAgICAgICBsZXQgbmV3UmVmID0gdGhpcy5yZWYgKyAxO1xuICAgICAgICBpZiAobmV3UmVmID09PSB0aGlzLnJlZikge1xuICAgICAgICAgICAgdGhpcy5yZWYgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZWYgPSBuZXdSZWY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVmLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVuc3Vic2NyaWJlIGZyb20gY2hhbm5lbHMgd2l0aCB0aGUgc3BlY2lmaWVkIHRvcGljLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2xlYXZlT3BlblRvcGljKHRvcGljKSB7XG4gICAgICAgIGxldCBkdXBDaGFubmVsID0gdGhpcy5jaGFubmVscy5maW5kKChjKSA9PiBjLnRvcGljID09PSB0b3BpYyAmJiAoYy5faXNKb2luZWQoKSB8fCBjLl9pc0pvaW5pbmcoKSkpO1xuICAgICAgICBpZiAoZHVwQ2hhbm5lbCkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ3RyYW5zcG9ydCcsIGBsZWF2aW5nIGR1cGxpY2F0ZSB0b3BpYyBcIiR7dG9waWN9XCJgKTtcbiAgICAgICAgICAgIGR1cENoYW5uZWwudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgc3Vic2NyaXB0aW9uIGZyb20gdGhlIHNvY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFubmVsIEFuIG9wZW4gc3Vic2NyaXB0aW9uLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3JlbW92ZShjaGFubmVsKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcigoYykgPT4gYy50b3BpYyAhPT0gY2hhbm5lbC50b3BpYyk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb25Db25uTWVzc2FnZShyYXdNZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuZGVjb2RlKHJhd01lc3NhZ2UuZGF0YSwgKG1zZykgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGhlYXJ0YmVhdCByZXNwb25zZXNcbiAgICAgICAgICAgIGlmIChtc2cudG9waWMgPT09ICdwaG9lbml4JyAmJiBtc2cuZXZlbnQgPT09ICdwaHhfcmVwbHknKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFydGJlYXRDYWxsYmFjayhtc2cucGF5bG9hZC5zdGF0dXMgPT09ICdvaycgPyAnb2snIDogJ2Vycm9yJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsICdlcnJvciBpbiBoZWFydGJlYXQgY2FsbGJhY2snLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIYW5kbGUgcGVuZGluZyBoZWFydGJlYXQgcmVmZXJlbmNlIGNsZWFudXBcbiAgICAgICAgICAgIGlmIChtc2cucmVmICYmIG1zZy5yZWYgPT09IHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMb2cgaW5jb21pbmcgbWVzc2FnZVxuICAgICAgICAgICAgY29uc3QgeyB0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiB9ID0gbXNnO1xuICAgICAgICAgICAgY29uc3QgcmVmU3RyaW5nID0gcmVmID8gYCgke3JlZn0pYCA6ICcnO1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gcGF5bG9hZC5zdGF0dXMgfHwgJyc7XG4gICAgICAgICAgICB0aGlzLmxvZygncmVjZWl2ZScsIGAke3N0YXR1c30gJHt0b3BpY30gJHtldmVudH0gJHtyZWZTdHJpbmd9YC50cmltKCksIHBheWxvYWQpO1xuICAgICAgICAgICAgLy8gUm91dGUgbWVzc2FnZSB0byBhcHByb3ByaWF0ZSBjaGFubmVsc1xuICAgICAgICAgICAgdGhpcy5jaGFubmVsc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNoYW5uZWwpID0+IGNoYW5uZWwuX2lzTWVtYmVyKHRvcGljKSlcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoY2hhbm5lbCkgPT4gY2hhbm5lbC5fdHJpZ2dlcihldmVudCwgcGF5bG9hZCwgcmVmKSk7XG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyU3RhdGVDYWxsYmFja3MoJ21lc3NhZ2UnLCBtc2cpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXIgc3BlY2lmaWMgdGltZXJcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfY2xlYXJUaW1lcih0aW1lcikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aW1lciA9PT0gJ2hlYXJ0YmVhdCcgJiYgdGhpcy5oZWFydGJlYXRUaW1lcikge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0YmVhdFRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGltZXIgPT09ICdyZWNvbm5lY3QnKSB7XG4gICAgICAgICAgICAoX2EgPSB0aGlzLnJlY29ubmVjdFRpbWVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhciBhbGwgdGltZXJzXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2NsZWFyQWxsVGltZXJzKCkge1xuICAgICAgICB0aGlzLl9jbGVhclRpbWVyKCdoZWFydGJlYXQnKTtcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lcigncmVjb25uZWN0Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHVwIGNvbm5lY3Rpb24gaGFuZGxlcnMgZm9yIFdlYlNvY2tldCBldmVudHNcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfc2V0dXBDb25uZWN0aW9uSGFuZGxlcnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25uKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBTZXQgYmluYXJ5IHR5cGUgaWYgc3VwcG9ydGVkIChicm93c2VycyBhbmQgbW9zdCBXZWJTb2NrZXQgaW1wbGVtZW50YXRpb25zKVxuICAgICAgICBpZiAoJ2JpbmFyeVR5cGUnIGluIHRoaXMuY29ubikge1xuICAgICAgICAgICAgO1xuICAgICAgICAgICAgdGhpcy5jb25uLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ubi5vbm9wZW4gPSAoKSA9PiB0aGlzLl9vbkNvbm5PcGVuKCk7XG4gICAgICAgIHRoaXMuY29ubi5vbmVycm9yID0gKGVycm9yKSA9PiB0aGlzLl9vbkNvbm5FcnJvcihlcnJvcik7XG4gICAgICAgIHRoaXMuY29ubi5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHRoaXMuX29uQ29ubk1lc3NhZ2UoZXZlbnQpO1xuICAgICAgICB0aGlzLmNvbm4ub25jbG9zZSA9IChldmVudCkgPT4gdGhpcy5fb25Db25uQ2xvc2UoZXZlbnQpO1xuICAgICAgICBpZiAodGhpcy5jb25uLnJlYWR5U3RhdGUgPT09IFNPQ0tFVF9TVEFURVMub3Blbikge1xuICAgICAgICAgICAgdGhpcy5fb25Db25uT3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlYXJkb3duIGNvbm5lY3Rpb24gYW5kIGNsZWFudXAgcmVzb3VyY2VzXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3RlYXJkb3duQ29ubmVjdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubikge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubi5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4gfHxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm4ucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsICdFcnJvciBjbG9zaW5nIGNvbm5lY3Rpb24nLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbm4ub25vcGVuID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29ubi5vbmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29ubi5vbm1lc3NhZ2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jb25uLm9uY2xvc2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jb25uID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jbGVhckFsbFRpbWVycygpO1xuICAgICAgICB0aGlzLl90ZXJtaW5hdGVXb3JrZXIoKTtcbiAgICAgICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKChjaGFubmVsKSA9PiBjaGFubmVsLnRlYXJkb3duKCkpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX29uQ29ubk9wZW4oKSB7XG4gICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnY29ubmVjdGVkJyk7XG4gICAgICAgIHRoaXMubG9nKCd0cmFuc3BvcnQnLCBgY29ubmVjdGVkIHRvICR7dGhpcy5lbmRwb2ludFVSTCgpfWApO1xuICAgICAgICAvLyBXYWl0IGZvciBhbnkgcGVuZGluZyBhdXRoIG9wZXJhdGlvbnMgYmVmb3JlIGZsdXNoaW5nIHNlbmQgYnVmZmVyXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBjaGFubmVsIGpvaW4gbWVzc2FnZXMgaW5jbHVkZSB0aGUgY29ycmVjdCBhY2Nlc3MgdG9rZW5cbiAgICAgICAgY29uc3QgYXV0aFByb21pc2UgPSB0aGlzLl9hdXRoUHJvbWlzZSB8fFxuICAgICAgICAgICAgKHRoaXMuYWNjZXNzVG9rZW4gJiYgIXRoaXMuYWNjZXNzVG9rZW5WYWx1ZSA/IHRoaXMuc2V0QXV0aCgpIDogUHJvbWlzZS5yZXNvbHZlKCkpO1xuICAgICAgICBhdXRoUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mbHVzaFNlbmRCdWZmZXIoKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgJ2Vycm9yIHdhaXRpbmcgZm9yIGF1dGggb24gY29ubmVjdCcsIGUpO1xuICAgICAgICAgICAgLy8gUHJvY2VlZCBhbnl3YXkgdG8gYXZvaWQgaGFuZ2luZyBjb25uZWN0aW9uc1xuICAgICAgICAgICAgdGhpcy5mbHVzaFNlbmRCdWZmZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2NsZWFyVGltZXIoJ3JlY29ubmVjdCcpO1xuICAgICAgICBpZiAoIXRoaXMud29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGFydEhlYXJ0YmVhdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLndvcmtlclJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0V29ya2VySGVhcnRiZWF0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJpZ2dlclN0YXRlQ2FsbGJhY2tzKCdvcGVuJyk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfc3RhcnRIZWFydGJlYXQoKSB7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgJiYgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0YmVhdFRpbWVyKTtcbiAgICAgICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldEludGVydmFsKCgpID0+IHRoaXMuc2VuZEhlYXJ0YmVhdCgpLCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3N0YXJ0V29ya2VySGVhcnRiZWF0KCkge1xuICAgICAgICBpZiAodGhpcy53b3JrZXJVcmwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKCd3b3JrZXInLCBgc3RhcnRpbmcgd29ya2VyIGZvciBmcm9tICR7dGhpcy53b3JrZXJVcmx9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZygnd29ya2VyJywgYHN0YXJ0aW5nIGRlZmF1bHQgd29ya2VyYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JqZWN0VXJsID0gdGhpcy5fd29ya2VyT2JqZWN0VXJsKHRoaXMud29ya2VyVXJsKTtcbiAgICAgICAgdGhpcy53b3JrZXJSZWYgPSBuZXcgV29ya2VyKG9iamVjdFVybCk7XG4gICAgICAgIHRoaXMud29ya2VyUmVmLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nKCd3b3JrZXInLCAnd29ya2VyIGVycm9yJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hdGVXb3JrZXIoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53b3JrZXJSZWYub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5ldmVudCA9PT0gJ2tlZXBBbGl2ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRIZWFydGJlYXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53b3JrZXJSZWYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgZXZlbnQ6ICdzdGFydCcsXG4gICAgICAgICAgICBpbnRlcnZhbDogdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGVybWluYXRlIHRoZSBXZWIgV29ya2VyIGFuZCBjbGVhciB0aGUgcmVmZXJlbmNlXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3Rlcm1pbmF0ZVdvcmtlcigpIHtcbiAgICAgICAgaWYgKHRoaXMud29ya2VyUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmxvZygnd29ya2VyJywgJ3Rlcm1pbmF0aW5nIHdvcmtlcicpO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJSZWYudGVybWluYXRlKCk7XG4gICAgICAgICAgICB0aGlzLndvcmtlclJlZiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX29uQ29ubkNsb3NlKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5sb2coJ3RyYW5zcG9ydCcsICdjbG9zZScsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckNoYW5FcnJvcigpO1xuICAgICAgICB0aGlzLl9jbGVhclRpbWVyKCdoZWFydGJlYXQnKTtcbiAgICAgICAgLy8gT25seSBzY2hlZHVsZSByZWNvbm5lY3Rpb24gaWYgaXQgd2Fzbid0IGEgbWFudWFsIGRpc2Nvbm5lY3RcbiAgICAgICAgaWYgKCF0aGlzLl93YXNNYW51YWxEaXNjb25uZWN0KSB7XG4gICAgICAgICAgICAoX2EgPSB0aGlzLnJlY29ubmVjdFRpbWVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2NoZWR1bGVUaW1lb3V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJpZ2dlclN0YXRlQ2FsbGJhY2tzKCdjbG9zZScsIGV2ZW50KTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbkNvbm5FcnJvcihlcnJvcikge1xuICAgICAgICB0aGlzLl9zZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICB0aGlzLmxvZygndHJhbnNwb3J0JywgYCR7ZXJyb3J9YCk7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJDaGFuRXJyb3IoKTtcbiAgICAgICAgdGhpcy5fdHJpZ2dlclN0YXRlQ2FsbGJhY2tzKCdlcnJvcicsIGVycm9yKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF90cmlnZ2VyQ2hhbkVycm9yKCkge1xuICAgICAgICB0aGlzLmNoYW5uZWxzLmZvckVhY2goKGNoYW5uZWwpID0+IGNoYW5uZWwuX3RyaWdnZXIoQ0hBTk5FTF9FVkVOVFMuZXJyb3IpKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9hcHBlbmRQYXJhbXModXJsLCBwYXJhbXMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHVybC5tYXRjaCgvXFw/LykgPyAnJicgOiAnPyc7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpO1xuICAgICAgICByZXR1cm4gYCR7dXJsfSR7cHJlZml4fSR7cXVlcnl9YDtcbiAgICB9XG4gICAgX3dvcmtlck9iamVjdFVybCh1cmwpIHtcbiAgICAgICAgbGV0IHJlc3VsdF91cmw7XG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICAgIHJlc3VsdF91cmwgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW1dPUktFUl9TQ1JJUFRdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JyB9KTtcbiAgICAgICAgICAgIHJlc3VsdF91cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRfdXJsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgY29ubmVjdGlvbiBzdGF0ZSB3aXRoIHByb3BlciBzdGF0ZSBtYW5hZ2VtZW50XG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3NldENvbm5lY3Rpb25TdGF0ZShzdGF0ZSwgbWFudWFsID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fY29ubmVjdGlvblN0YXRlID0gc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2Nvbm5lY3RpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl93YXNNYW51YWxEaXNjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdkaXNjb25uZWN0aW5nJykge1xuICAgICAgICAgICAgdGhpcy5fd2FzTWFudWFsRGlzY29ubmVjdCA9IG1hbnVhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgYXV0aCBvcGVyYXRpb25cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBfcGVyZm9ybUF1dGgodG9rZW4gPSBudWxsKSB7XG4gICAgICAgIGxldCB0b2tlblRvU2VuZDtcbiAgICAgICAgbGV0IGlzTWFudWFsVG9rZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICB0b2tlblRvU2VuZCA9IHRva2VuO1xuICAgICAgICAgICAgLy8gVHJhY2sgaWYgdGhpcyBpcyBhIG1hbnVhbGx5LXByb3ZpZGVkIHRva2VuXG4gICAgICAgICAgICBpc01hbnVhbFRva2VuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICAvLyBDYWxsIHRoZSBhY2Nlc3NUb2tlbiBjYWxsYmFjayB0byBnZXQgZnJlc2ggdG9rZW5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdG9rZW5Ub1NlbmQgPSBhd2FpdCB0aGlzLmFjY2Vzc1Rva2VuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsICdFcnJvciBmZXRjaGluZyBhY2Nlc3MgdG9rZW4gZnJvbSBjYWxsYmFjaycsIGUpO1xuICAgICAgICAgICAgICAgIC8vIEZhbGwgYmFjayB0byBjYWNoZWQgdmFsdWUgaWYgY2FsbGJhY2sgZmFpbHNcbiAgICAgICAgICAgICAgICB0b2tlblRvU2VuZCA9IHRoaXMuYWNjZXNzVG9rZW5WYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRva2VuVG9TZW5kID0gdGhpcy5hY2Nlc3NUb2tlblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhpcyB0b2tlbiB3YXMgbWFudWFsbHkgc2V0IG9yIGZldGNoZWQgdmlhIGNhbGxiYWNrXG4gICAgICAgIGlmIChpc01hbnVhbFRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLl9tYW51YWxseVNldFRva2VuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSB1c2VkIHRoZSBjYWxsYmFjaywgY2xlYXIgdGhlIG1hbnVhbCBmbGFnXG4gICAgICAgICAgICB0aGlzLl9tYW51YWxseVNldFRva2VuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWNjZXNzVG9rZW5WYWx1ZSAhPSB0b2tlblRvU2VuZCkge1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlblZhbHVlID0gdG9rZW5Ub1NlbmQ7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxzLmZvckVhY2goKGNoYW5uZWwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46IHRva2VuVG9TZW5kLFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBERUZBVUxUX1ZFUlNJT04sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0b2tlblRvU2VuZCAmJiBjaGFubmVsLnVwZGF0ZUpvaW5QYXlsb2FkKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIGlmIChjaGFubmVsLmpvaW5lZE9uY2UgJiYgY2hhbm5lbC5faXNKb2luZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFubmVsLl9wdXNoKENIQU5ORUxfRVZFTlRTLmFjY2Vzc190b2tlbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiB0b2tlblRvU2VuZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdCBmb3IgYW55IGluLWZsaWdodCBhdXRoIG9wZXJhdGlvbnMgdG8gY29tcGxldGVcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBfd2FpdEZvckF1dGhJZk5lZWRlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2F1dGhQcm9taXNlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9hdXRoUHJvbWlzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTYWZlbHkgY2FsbCBzZXRBdXRoIHdpdGggc3RhbmRhcmRpemVkIGVycm9yIGhhbmRsaW5nXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3NldEF1dGhTYWZlbHkoY29udGV4dCA9ICdnZW5lcmFsJykge1xuICAgICAgICAvLyBPbmx5IHJlZnJlc2ggYXV0aCBpZiB1c2luZyBjYWxsYmFjay1iYXNlZCB0b2tlbnNcbiAgICAgICAgaWYgKCF0aGlzLl9pc01hbnVhbFRva2VuKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QXV0aCgpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgYEVycm9yIHNldHRpbmcgYXV0aCBpbiAke2NvbnRleHR9YCwgZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyIHN0YXRlIGNoYW5nZSBjYWxsYmFja3Mgd2l0aCBwcm9wZXIgZXJyb3IgaGFuZGxpbmdcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfdHJpZ2dlclN0YXRlQ2FsbGJhY2tzKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzW2V2ZW50XS5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCBgZXJyb3IgaW4gJHtldmVudH0gY2FsbGJhY2tgLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgYGVycm9yIHRyaWdnZXJpbmcgJHtldmVudH0gY2FsbGJhY2tzYCwgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0dXAgcmVjb25uZWN0aW9uIHRpbWVyIHdpdGggcHJvcGVyIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfc2V0dXBSZWNvbm5lY3Rpb25UaW1lcigpIHtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93YWl0Rm9yQXV0aElmTmVlZGVkKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgQ09OTkVDVElPTl9USU1FT1VUUy5SRUNPTk5FQ1RfREVMQVkpO1xuICAgICAgICB9LCB0aGlzLnJlY29ubmVjdEFmdGVyTXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGNsaWVudCBvcHRpb25zIHdpdGggZGVmYXVsdHNcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfaW5pdGlhbGl6ZU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbTtcbiAgICAgICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnRyYW5zcG9ydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbnVsbDtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnRpbWVvdXQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IERFRkFVTFRfVElNRU9VVDtcbiAgICAgICAgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zID1cbiAgICAgICAgICAgIChfYyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oZWFydGJlYXRJbnRlcnZhbE1zKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBDT05ORUNUSU9OX1RJTUVPVVRTLkhFQVJUQkVBVF9JTlRFUlZBTDtcbiAgICAgICAgdGhpcy53b3JrZXIgPSAoX2QgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud29ya2VyKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IChfZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5hY2Nlc3NUb2tlbikgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogbnVsbDtcbiAgICAgICAgdGhpcy5oZWFydGJlYXRDYWxsYmFjayA9IChfZiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oZWFydGJlYXRDYWxsYmFjaykgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogbm9vcDtcbiAgICAgICAgdGhpcy52c24gPSAoX2cgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudnNuKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBERUZBVUxUX1ZTTjtcbiAgICAgICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wYXJhbXMpXG4gICAgICAgICAgICB0aGlzLnBhcmFtcyA9IG9wdGlvbnMucGFyYW1zO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxvZ2dlcilcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXI7XG4gICAgICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxvZ0xldmVsKSB8fCAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxvZ19sZXZlbCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nTGV2ZWwgPSBvcHRpb25zLmxvZ0xldmVsIHx8IG9wdGlvbnMubG9nX2xldmVsO1xuICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucGFyYW1zKSwgeyBsb2dfbGV2ZWw6IHRoaXMubG9nTGV2ZWwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHVwIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHRzXG4gICAgICAgIHRoaXMucmVjb25uZWN0QWZ0ZXJNcyA9XG4gICAgICAgICAgICAoX2ggPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucmVjb25uZWN0QWZ0ZXJNcykgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogKCh0cmllcykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBSRUNPTk5FQ1RfSU5URVJWQUxTW3RyaWVzIC0gMV0gfHwgREVGQVVMVF9SRUNPTk5FQ1RfRkFMTEJBQ0s7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnZzbikge1xuICAgICAgICAgICAgY2FzZSBWU05fMV8wXzA6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmNvZGUgPVxuICAgICAgICAgICAgICAgICAgICAoX2ogPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZW5jb2RlKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiAoKHBheWxvYWQsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29kZSA9XG4gICAgICAgICAgICAgICAgICAgIChfayA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZWNvZGUpICE9PSBudWxsICYmIF9rICE9PSB2b2lkIDAgPyBfayA6ICgocGF5bG9hZCwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhKU09OLnBhcnNlKHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZTTl8yXzBfMDpcbiAgICAgICAgICAgICAgICB0aGlzLmVuY29kZSA9IChfbCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5lbmNvZGUpICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IHRoaXMuc2VyaWFsaXplci5lbmNvZGUuYmluZCh0aGlzLnNlcmlhbGl6ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb2RlID0gKF9tID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRlY29kZSkgIT09IG51bGwgJiYgX20gIT09IHZvaWQgMCA/IF9tIDogdGhpcy5zZXJpYWxpemVyLmRlY29kZS5iaW5kKHRoaXMuc2VyaWFsaXplcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2VyaWFsaXplciB2ZXJzaW9uOiAke3RoaXMudnNufWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSB3b3JrZXIgc2V0dXBcbiAgICAgICAgaWYgKHRoaXMud29ya2VyKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgIXdpbmRvdy5Xb3JrZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYiBXb3JrZXIgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy53b3JrZXJVcmwgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud29ya2VyVXJsO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVhbHRpbWVDbGllbnQuanMubWFwIl0sIm5hbWVzIjpbIldlYlNvY2tldEZhY3RvcnkiLCJDSEFOTkVMX0VWRU5UUyIsIkNPTk5FQ1RJT05fU1RBVEUiLCJERUZBVUxUX1ZFUlNJT04iLCJERUZBVUxUX1RJTUVPVVQiLCJTT0NLRVRfU1RBVEVTIiwiVFJBTlNQT1JUUyIsIkRFRkFVTFRfVlNOIiwiVlNOXzFfMF8wIiwiVlNOXzJfMF8wIiwiV1NfQ0xPU0VfTk9STUFMIiwiU2VyaWFsaXplciIsIlRpbWVyIiwiaHR0cEVuZHBvaW50VVJMIiwiUmVhbHRpbWVDaGFubmVsIiwibm9vcCIsIkNPTk5FQ1RJT05fVElNRU9VVFMiLCJIRUFSVEJFQVRfSU5URVJWQUwiLCJSRUNPTk5FQ1RfREVMQVkiLCJIRUFSVEJFQVRfVElNRU9VVF9GQUxMQkFDSyIsIlJFQ09OTkVDVF9JTlRFUlZBTFMiLCJERUZBVUxUX1JFQ09OTkVDVF9GQUxMQkFDSyIsIldPUktFUl9TQ1JJUFQiLCJSZWFsdGltZUNsaWVudCIsImNvbnN0cnVjdG9yIiwiZW5kUG9pbnQiLCJvcHRpb25zIiwiX2EiLCJhY2Nlc3NUb2tlblZhbHVlIiwiYXBpS2V5IiwiX21hbnVhbGx5U2V0VG9rZW4iLCJjaGFubmVscyIsIkFycmF5IiwiaHR0cEVuZHBvaW50IiwiaGVhZGVycyIsInBhcmFtcyIsInRpbWVvdXQiLCJ0cmFuc3BvcnQiLCJoZWFydGJlYXRJbnRlcnZhbE1zIiwiaGVhcnRiZWF0VGltZXIiLCJ1bmRlZmluZWQiLCJwZW5kaW5nSGVhcnRiZWF0UmVmIiwiaGVhcnRiZWF0Q2FsbGJhY2siLCJyZWYiLCJyZWNvbm5lY3RUaW1lciIsInZzbiIsImxvZ2dlciIsImNvbm4iLCJzZW5kQnVmZmVyIiwic2VyaWFsaXplciIsInN0YXRlQ2hhbmdlQ2FsbGJhY2tzIiwib3BlbiIsImNsb3NlIiwiZXJyb3IiLCJtZXNzYWdlIiwiYWNjZXNzVG9rZW4iLCJfY29ubmVjdGlvblN0YXRlIiwiX3dhc01hbnVhbERpc2Nvbm5lY3QiLCJfYXV0aFByb21pc2UiLCJfcmVzb2x2ZUZldGNoIiwiY3VzdG9tRmV0Y2giLCJhcmdzIiwiZmV0Y2giLCJhcGlrZXkiLCJFcnJvciIsIndlYnNvY2tldCIsIl9pbml0aWFsaXplT3B0aW9ucyIsIl9zZXR1cFJlY29ubmVjdGlvblRpbWVyIiwiY29ubmVjdCIsImlzQ29ubmVjdGluZyIsImlzRGlzY29ubmVjdGluZyIsImlzQ29ubmVjdGVkIiwiX3NldENvbm5lY3Rpb25TdGF0ZSIsIl9zZXRBdXRoU2FmZWx5IiwiZW5kcG9pbnRVUkwiLCJjcmVhdGVXZWJTb2NrZXQiLCJlcnJvck1lc3NhZ2UiLCJpbmNsdWRlcyIsIl9zZXR1cENvbm5lY3Rpb25IYW5kbGVycyIsIl9hcHBlbmRQYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJkaXNjb25uZWN0IiwiY29kZSIsInJlYXNvbiIsImZhbGxiYWNrVGltZXIiLCJzZXRUaW1lb3V0Iiwib25jbG9zZSIsImNsZWFyVGltZW91dCIsIl90ZWFyZG93bkNvbm5lY3Rpb24iLCJnZXRDaGFubmVscyIsInJlbW92ZUNoYW5uZWwiLCJjaGFubmVsIiwic3RhdHVzIiwidW5zdWJzY3JpYmUiLCJsZW5ndGgiLCJyZW1vdmVBbGxDaGFubmVscyIsInZhbHVlc18xIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsImxvZyIsImtpbmQiLCJtc2ciLCJkYXRhIiwiY29ubmVjdGlvblN0YXRlIiwicmVhZHlTdGF0ZSIsImNvbm5lY3RpbmciLCJDb25uZWN0aW5nIiwiT3BlbiIsImNsb3NpbmciLCJDbG9zaW5nIiwiQ2xvc2VkIiwidG9waWMiLCJjb25maWciLCJyZWFsdGltZVRvcGljIiwiZXhpc3RzIiwiZmluZCIsImMiLCJjaGFuIiwicHVzaCIsImV2ZW50IiwicGF5bG9hZCIsImNhbGxiYWNrIiwiZW5jb2RlIiwicmVzdWx0Iiwic2VuZCIsInNldEF1dGgiLCJ0b2tlbiIsIl9wZXJmb3JtQXV0aCIsIl9pc01hbnVhbFRva2VuIiwic2VuZEhlYXJ0YmVhdCIsImUiLCJzY2hlZHVsZVRpbWVvdXQiLCJfbWFrZVJlZiIsIm9uSGVhcnRiZWF0IiwiZmx1c2hTZW5kQnVmZmVyIiwiZm9yRWFjaCIsIm5ld1JlZiIsInRvU3RyaW5nIiwiX2xlYXZlT3BlblRvcGljIiwiZHVwQ2hhbm5lbCIsIl9pc0pvaW5lZCIsIl9pc0pvaW5pbmciLCJfcmVtb3ZlIiwiZmlsdGVyIiwiX29uQ29ubk1lc3NhZ2UiLCJyYXdNZXNzYWdlIiwiZGVjb2RlIiwicmVmU3RyaW5nIiwidHJpbSIsIl9pc01lbWJlciIsIl90cmlnZ2VyIiwiX3RyaWdnZXJTdGF0ZUNhbGxiYWNrcyIsIl9jbGVhclRpbWVyIiwidGltZXIiLCJjbGVhckludGVydmFsIiwicmVzZXQiLCJfY2xlYXJBbGxUaW1lcnMiLCJiaW5hcnlUeXBlIiwib25vcGVuIiwiX29uQ29ubk9wZW4iLCJvbmVycm9yIiwiX29uQ29ubkVycm9yIiwib25tZXNzYWdlIiwiX29uQ29ubkNsb3NlIiwiX3Rlcm1pbmF0ZVdvcmtlciIsInRlYXJkb3duIiwiYXV0aFByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsImNhdGNoIiwid29ya2VyIiwiX3N0YXJ0SGVhcnRiZWF0Iiwid29ya2VyUmVmIiwiX3N0YXJ0V29ya2VySGVhcnRiZWF0Iiwic2V0SW50ZXJ2YWwiLCJ3b3JrZXJVcmwiLCJvYmplY3RVcmwiLCJfd29ya2VyT2JqZWN0VXJsIiwiV29ya2VyIiwicG9zdE1lc3NhZ2UiLCJpbnRlcnZhbCIsInRlcm1pbmF0ZSIsIl90cmlnZ2VyQ2hhbkVycm9yIiwidXJsIiwia2V5cyIsInByZWZpeCIsIm1hdGNoIiwicXVlcnkiLCJVUkxTZWFyY2hQYXJhbXMiLCJyZXN1bHRfdXJsIiwiYmxvYiIsIkJsb2IiLCJ0eXBlIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwic3RhdGUiLCJtYW51YWwiLCJ0b2tlblRvU2VuZCIsImlzTWFudWFsVG9rZW4iLCJhY2Nlc3NfdG9rZW4iLCJ2ZXJzaW9uIiwidXBkYXRlSm9pblBheWxvYWQiLCJqb2luZWRPbmNlIiwiX3B1c2giLCJfd2FpdEZvckF1dGhJZk5lZWRlZCIsImNvbnRleHQiLCJyZWNvbm5lY3RBZnRlck1zIiwiX2IiLCJfYyIsIl9kIiwiX2UiLCJfZiIsIl9nIiwiX2giLCJfaiIsIl9rIiwiX2wiLCJfbSIsImxvZ0xldmVsIiwibG9nX2xldmVsIiwidHJpZXMiLCJKU09OIiwic3RyaW5naWZ5IiwicGFyc2UiLCJiaW5kIiwid2luZG93Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js":
|
||
/*!**************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js ***!
|
||
\**************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ RealtimeClient)\n/* harmony export */ });\n/* harmony import */ var _lib_websocket_factory__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/websocket-factory */ \"(rsc)/./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 */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\");\n/* harmony import */ var _lib_serializer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/serializer */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js\");\n/* harmony import */ var _lib_timer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/timer */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js\");\n/* harmony import */ var _lib_transformers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/transformers */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js\");\n/* harmony import */ var _RealtimeChannel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./RealtimeChannel */ \"(rsc)/./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 * 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 (...args)=>customFetch(...args);\n }\n return (...args)=>fetch(...args);\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 = `${endPoint}/${_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 /**\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(`${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: ${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, params = {\n config: {}\n }) {\n const realtimeTopic = `realtime:${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:${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\", `${topic} ${event} (${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(token = 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 \"${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 ? `(${ref})` : \"\";\n const status = payload.status || \"\";\n this.log(\"receive\", `${status} ${topic} ${event} ${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 ${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 ${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\", `${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 `${url}${prefix}${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, manual = 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(token = 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(context = \"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 ${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 ${event} callback`, e);\n }\n });\n } catch (e) {\n this.log(\"error\", `error triggering ${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: ${this.vsn}`);\n }\n // Handle worker setup\n if (this.worker) {\n if (false) {}\n this.workerUrl = options === null || options === void 0 ? void 0 : options.workerUrl;\n }\n }\n} //# sourceMappingURL=RealtimeClient.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lQ2xpZW50LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBdUQ7QUFDOEg7QUFDM0k7QUFDVjtBQUNxQjtBQUNMO0FBQ2hELE1BQU1lLE9BQU8sS0FBUTtBQUNyQiwrQkFBK0I7QUFDL0IsTUFBTUMsc0JBQXNCO0lBQ3hCQyxvQkFBb0I7SUFDcEJDLGlCQUFpQjtJQUNqQkMsNEJBQTRCO0FBQ2hDO0FBQ0EsTUFBTUMsc0JBQXNCO0lBQUM7SUFBTTtJQUFNO0lBQU07Q0FBTTtBQUNyRCxNQUFNQyw2QkFBNkI7QUFDbkMsTUFBTUMsZ0JBQWdCLENBQUM7Ozs7O0tBS2xCLENBQUM7QUFDUyxNQUFNQztJQUNqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBMkJDLEdBQ0RDLFlBQVlDLFFBQVEsRUFBRUMsT0FBTyxDQUFFO1FBQzNCLElBQUlDO1FBQ0osSUFBSSxDQUFDQyxnQkFBZ0IsR0FBRztRQUN4QixJQUFJLENBQUNDLE1BQU0sR0FBRztRQUNkLElBQUksQ0FBQ0MsaUJBQWlCLEdBQUc7UUFDekIsSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSUM7UUFDcEIsSUFBSSxDQUFDUCxRQUFRLEdBQUc7UUFDaEIsSUFBSSxDQUFDUSxZQUFZLEdBQUc7UUFDcEIsK0RBQStELEdBQy9ELElBQUksQ0FBQ0MsT0FBTyxHQUFHLENBQUM7UUFDaEIsSUFBSSxDQUFDQyxNQUFNLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQ0MsT0FBTyxHQUFHaEMsMkRBQWVBO1FBQzlCLElBQUksQ0FBQ2lDLFNBQVMsR0FBRztRQUNqQixJQUFJLENBQUNDLG1CQUFtQixHQUFHdEIsb0JBQW9CQyxrQkFBa0I7UUFDakUsSUFBSSxDQUFDc0IsY0FBYyxHQUFHQztRQUN0QixJQUFJLENBQUNDLG1CQUFtQixHQUFHO1FBQzNCLElBQUksQ0FBQ0MsaUJBQWlCLEdBQUczQjtRQUN6QixJ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SUFBSSxLQUFLLElBQUlBLFFBQVEwSCxNQUFNLE1BQU0sUUFBUXFFLE9BQU8sS0FBSyxJQUFJQSxLQUFNLENBQUMvRixTQUFTQztvQkFDaEgsT0FBT0EsU0FBU29HLEtBQUtFLEtBQUssQ0FBQ3ZHO2dCQUMvQjtnQkFDSjtZQUNKLEtBQUtqSCxxREFBU0E7Z0JBQ1YsSUFBSSxDQUFDbUgsTUFBTSxHQUFHLENBQUM4RixLQUFLaE0sWUFBWSxRQUFRQSxZQUFZLEtBQUssSUFBSSxLQUFLLElBQUlBLFFBQVFrRyxNQUFNLE1BQU0sUUFBUThGLE9BQU8sS0FBSyxJQUFJQSxLQUFLLElBQUksQ0FBQ3pLLFVBQVUsQ0FBQzJFLE1BQU0sQ0FBQ3NHLElBQUksQ0FBQyxJQUFJLENBQUNqTCxVQUFVO2dCQUNsSyxJQUFJLENBQUNtRyxNQUFNLEdBQUcsQ0FBQ3VFLEtBQUtqTSxZQUFZLFFBQVFBLFlBQVksS0FBSyxJQUFJLEtBQUssSUFBSUEsUUFBUTBILE1BQU0sTUFBTSxRQUFRdUUsT0FBTyxLQUFLLElBQUlBLEtBQUssSUFBSSxDQUFDMUssVUFBVSxDQUFDbUcsTUFBTSxDQUFDOEUsSUFBSSxDQUFDLElBQUksQ0FBQ2pMLFVBQVU7Z0JBQ2xLO1lBQ0o7Z0JBQ0ksTUFBTSxJQUFJZSxNQUFNLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxDQUFDbkIsR0FBRyxDQUFDLENBQUM7UUFDckU7UUFDQSxzQkFBc0I7UUFDdEIsSUFBSSxJQUFJLENBQUMrSCxNQUFNLEVBQUU7WUFDYixJQUFJLEtBQStDLEVBQUUsRUFFcEQ7WUFDRCxJQUFJLENBQUNLLFNBQVMsR0FBR3ZKLFlBQVksUUFBUUEsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJQSxRQUFRdUosU0FBUztRQUN4RjtJQUNKO0FBQ0osRUFDQSwwQ0FBMEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lQ2xpZW50LmpzPzZiNmQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdlYlNvY2tldEZhY3RvcnkgZnJvbSAnLi9saWIvd2Vic29ja2V0LWZhY3RvcnknO1xuaW1wb3J0IHsgQ0hBTk5FTF9FVkVOVFMsIENPTk5FQ1RJT05fU1RBVEUsIERFRkFVTFRfVkVSU0lPTiwgREVGQVVMVF9USU1FT1VULCBTT0NLRVRfU1RBVEVTLCBUUkFOU1BPUlRTLCBERUZBVUxUX1ZTTiwgVlNOXzFfMF8wLCBWU05fMl8wXzAsIFdTX0NMT1NFX05PUk1BTCwgfSBmcm9tICcuL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IFNlcmlhbGl6ZXIgZnJvbSAnLi9saWIvc2VyaWFsaXplcic7XG5pbXBvcnQgVGltZXIgZnJvbSAnLi9saWIvdGltZXInO1xuaW1wb3J0IHsgaHR0cEVuZHBvaW50VVJMIH0gZnJvbSAnLi9saWIvdHJhbnNmb3JtZXJzJztcbmltcG9ydCBSZWFsdGltZUNoYW5uZWwgZnJvbSAnLi9SZWFsdGltZUNoYW5uZWwnO1xuY29uc3Qgbm9vcCA9ICgpID0+IHsgfTtcbi8vIENvbm5lY3Rpb24tcmVsYXRlZCBjb25zdGFudHNcbmNvbnN0IENPTk5FQ1RJT05fVElNRU9VVFMgPSB7XG4gICAgSEVBUlRCRUFUX0lOVEVSVkFMOiAyNTAwMCxcbiAgICBSRUNPTk5FQ1RfREVMQVk6IDEwLFxuICAgIEhFQVJUQkVBVF9USU1FT1VUX0ZBTExCQUNLOiAxMDAsXG59O1xuY29uc3QgUkVDT05ORUNUX0lOVEVSVkFMUyA9IFsxMDAwLCAyMDAwLCA1MDAwLCAxMDAwMF07XG5jb25zdCBERUZBVUxUX1JFQ09OTkVDVF9GQUxMQkFDSyA9IDEwMDAwO1xuY29uc3QgV09SS0VSX1NDUklQVCA9IGBcbiAgYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKGUpID0+IHtcbiAgICBpZiAoZS5kYXRhLmV2ZW50ID09PSBcInN0YXJ0XCIpIHtcbiAgICAgIHNldEludGVydmFsKCgpID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFwia2VlcEFsaXZlXCIgfSksIGUuZGF0YS5pbnRlcnZhbCk7XG4gICAgfVxuICB9KTtgO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVhbHRpbWVDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRoZSBTb2NrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW5kUG9pbnQgVGhlIHN0cmluZyBXZWJTb2NrZXQgZW5kcG9pbnQsIGllLCBcIndzOi8vZXhhbXBsZS5jb20vc29ja2V0XCIsIFwid3NzOi8vZXhhbXBsZS5jb21cIiwgXCIvc29ja2V0XCIgKGluaGVyaXRlZCBob3N0ICYgcHJvdG9jb2wpXG4gICAgICogQHBhcmFtIGh0dHBFbmRwb2ludCBUaGUgc3RyaW5nIEhUVFAgZW5kcG9pbnQsIGllLCBcImh0dHBzOi8vZXhhbXBsZS5jb21cIiwgXCIvXCIgKGluaGVyaXRlZCBob3N0ICYgcHJvdG9jb2wpXG4gICAgICogQHBhcmFtIG9wdGlvbnMudHJhbnNwb3J0IFRoZSBXZWJzb2NrZXQgVHJhbnNwb3J0LCBmb3IgZXhhbXBsZSBXZWJTb2NrZXQuIFRoaXMgY2FuIGJlIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnMudGltZW91dCBUaGUgZGVmYXVsdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byB0cmlnZ2VyIHB1c2ggdGltZW91dHMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMucGFyYW1zIFRoZSBvcHRpb25hbCBwYXJhbXMgdG8gcGFzcyB3aGVuIGNvbm5lY3RpbmcuXG4gICAgICogQHBhcmFtIG9wdGlvbnMuaGVhZGVycyBEZXByZWNhdGVkOiBoZWFkZXJzIGNhbm5vdCBiZSBzZXQgb24gd2Vic29ja2V0IGNvbm5lY3Rpb25zIGFuZCB0aGlzIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5oZWFydGJlYXRJbnRlcnZhbE1zIFRoZSBtaWxsaXNlYyBpbnRlcnZhbCB0byBzZW5kIGEgaGVhcnRiZWF0IG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMuaGVhcnRiZWF0Q2FsbGJhY2sgVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGhhbmRsZSBoZWFydGJlYXQgc3RhdHVzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLmxvZ2dlciBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gZm9yIHNwZWNpYWxpemVkIGxvZ2dpbmcsIGllOiBsb2dnZXI6IChraW5kLCBtc2csIGRhdGEpID0+IHsgY29uc29sZS5sb2coYCR7a2luZH06ICR7bXNnfWAsIGRhdGEpIH1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5sb2dMZXZlbCBTZXRzIHRoZSBsb2cgbGV2ZWwgZm9yIFJlYWx0aW1lXG4gICAgICogQHBhcmFtIG9wdGlvbnMuZW5jb2RlIFRoZSBmdW5jdGlvbiB0byBlbmNvZGUgb3V0Z29pbmcgbWVzc2FnZXMuIERlZmF1bHRzIHRvIEpTT046IChwYXlsb2FkLCBjYWxsYmFjaykgPT4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgICogQHBhcmFtIG9wdGlvbnMuZGVjb2RlIFRoZSBmdW5jdGlvbiB0byBkZWNvZGUgaW5jb21pbmcgbWVzc2FnZXMuIERlZmF1bHRzIHRvIFNlcmlhbGl6ZXIncyBkZWNvZGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMucmVjb25uZWN0QWZ0ZXJNcyBoZSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1pbGxzZWMgcmVjb25uZWN0IGludGVydmFsLiBEZWZhdWx0cyB0byBzdGVwcGVkIGJhY2tvZmYgb2ZmLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLndvcmtlciBVc2UgV2ViIFdvcmtlciB0byBzZXQgYSBzaWRlIGZsb3cuIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLndvcmtlclVybCBUaGUgVVJMIG9mIHRoZSB3b3JrZXIgc2NyaXB0LiBEZWZhdWx0cyB0byBodHRwczovL3JlYWx0aW1lLnN1cGFiYXNlLmNvbS93b3JrZXIuanMgdGhhdCBpbmNsdWRlcyBhIGhlYXJ0YmVhdCBldmVudCBjYWxsIHRvIGtlZXAgdGhlIGNvbm5lY3Rpb24gYWxpdmUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCBSZWFsdGltZUNsaWVudCBmcm9tICdAc3VwYWJhc2UvcmVhbHRpbWUtanMnXG4gICAgICpcbiAgICAgKiBjb25zdCBjbGllbnQgPSBuZXcgUmVhbHRpbWVDbGllbnQoJ2h0dHBzOi8veHl6Y29tcGFueS5zdXBhYmFzZS5jby9yZWFsdGltZS92MScsIHtcbiAgICAgKiAgIHBhcmFtczogeyBhcGlrZXk6ICdwdWJsaWMtYW5vbi1rZXknIH0sXG4gICAgICogfSlcbiAgICAgKiBjbGllbnQuY29ubmVjdCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZW5kUG9pbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmFwaUtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuX21hbnVhbGx5U2V0VG9rZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFubmVscyA9IG5ldyBBcnJheSgpO1xuICAgICAgICB0aGlzLmVuZFBvaW50ID0gJyc7XG4gICAgICAgIHRoaXMuaHR0cEVuZHBvaW50ID0gJyc7XG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCBoZWFkZXJzIGNhbm5vdCBiZSBzZXQgb24gd2Vic29ja2V0IGNvbm5lY3Rpb25zICovXG4gICAgICAgIHRoaXMuaGVhZGVycyA9IHt9O1xuICAgICAgICB0aGlzLnBhcmFtcyA9IHt9O1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQ7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zID0gQ09OTkVDVElPTl9USU1FT1VUUy5IRUFSVEJFQVRfSU5URVJWQUw7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGw7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2sgPSBub29wO1xuICAgICAgICB0aGlzLnJlZiA9IDA7XG4gICAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnZzbiA9IERFRkFVTFRfVlNOO1xuICAgICAgICB0aGlzLmxvZ2dlciA9IG5vb3A7XG4gICAgICAgIHRoaXMuY29ubiA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplcigpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzID0ge1xuICAgICAgICAgICAgb3BlbjogW10sXG4gICAgICAgICAgICBjbG9zZTogW10sXG4gICAgICAgICAgICBlcnJvcjogW10sXG4gICAgICAgICAgICBtZXNzYWdlOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25TdGF0ZSA9ICdkaXNjb25uZWN0ZWQnO1xuICAgICAgICB0aGlzLl93YXNNYW51YWxEaXNjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2F1dGhQcm9taXNlID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBlaXRoZXIgY3VzdG9tIGZldGNoLCBpZiBwcm92aWRlZCwgb3IgZGVmYXVsdCBmZXRjaCB0byBtYWtlIEhUVFAgcmVxdWVzdHNcbiAgICAgICAgICpcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9yZXNvbHZlRmV0Y2ggPSAoY3VzdG9tRmV0Y2gpID0+IHtcbiAgICAgICAgICAgIGlmIChjdXN0b21GZXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoLi4uYXJncykgPT4gY3VzdG9tRmV0Y2goLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IGZldGNoKC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBwYXJhbWV0ZXJzXG4gICAgICAgIGlmICghKChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wYXJhbXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hcGlrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FQSSBrZXkgaXMgcmVxdWlyZWQgdG8gY29ubmVjdCB0byBSZWFsdGltZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBpS2V5ID0gb3B0aW9ucy5wYXJhbXMuYXBpa2V5O1xuICAgICAgICAvLyBJbml0aWFsaXplIGVuZHBvaW50IFVSTHNcbiAgICAgICAgdGhpcy5lbmRQb2ludCA9IGAke2VuZFBvaW50fS8ke1RSQU5TUE9SVFMud2Vic29ja2V0fWA7XG4gICAgICAgIHRoaXMuaHR0cEVuZHBvaW50ID0gaHR0cEVuZHBvaW50VVJMKGVuZFBvaW50KTtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3NldHVwUmVjb25uZWN0aW9uVGltZXIoKTtcbiAgICAgICAgdGhpcy5mZXRjaCA9IHRoaXMuX3Jlc29sdmVGZXRjaChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmV0Y2gpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25uZWN0cyB0aGUgc29ja2V0LCB1bmxlc3MgYWxyZWFkeSBjb25uZWN0ZWQuXG4gICAgICovXG4gICAgY29ubmVjdCgpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGNvbm5lY3RpbmcsIGRpc2Nvbm5lY3RpbmcsIG9yIGNvbm5lY3RlZFxuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RpbmcoKSB8fFxuICAgICAgICAgICAgdGhpcy5pc0Rpc2Nvbm5lY3RpbmcoKSB8fFxuICAgICAgICAgICAgKHRoaXMuY29ubiAhPT0gbnVsbCAmJiB0aGlzLmlzQ29ubmVjdGVkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdjb25uZWN0aW5nJyk7XG4gICAgICAgIC8vIFRyaWdnZXIgYXV0aCBpZiBuZWVkZWQgYW5kIG5vdCBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBhdXRoIGlzIGNhbGxlZCBmb3Igc3RhbmRhbG9uZSBSZWFsdGltZUNsaWVudCB1c2FnZVxuICAgICAgICAvLyB3aGlsZSBhdm9pZGluZyByYWNlIGNvbmRpdGlvbnMgd2l0aCBTdXBhYmFzZUNsaWVudCdzIGltbWVkaWF0ZSBzZXRBdXRoIGNhbGxcbiAgICAgICAgaWYgKHRoaXMuYWNjZXNzVG9rZW4gJiYgIXRoaXMuX2F1dGhQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRBdXRoU2FmZWx5KCdjb25uZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXN0YWJsaXNoIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLnRyYW5zcG9ydCkge1xuICAgICAgICAgICAgLy8gVXNlIGN1c3RvbSB0cmFuc3BvcnQgaWYgcHJvdmlkZWRcbiAgICAgICAgICAgIHRoaXMuY29ubiA9IG5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZHBvaW50VVJMKCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIHVzZSBuYXRpdmUgV2ViU29ja2V0XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubiA9IFdlYlNvY2tldEZhY3RvcnkuY3JlYXRlV2ViU29ja2V0KHRoaXMuZW5kcG9pbnRVUkwoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgLy8gUHJvdmlkZSBoZWxwZnVsIGVycm9yIG1lc3NhZ2UgYmFzZWQgb24gZW52aXJvbm1lbnRcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdOb2RlLmpzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yTWVzc2FnZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdUbyB1c2UgUmVhbHRpbWUgaW4gTm9kZS5qcywgeW91IG5lZWQgdG8gcHJvdmlkZSBhIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbjpcXG5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdPcHRpb24gMTogVXNlIE5vZGUuanMgMjIrIHdoaWNoIGhhcyBuYXRpdmUgV2ViU29ja2V0IHN1cHBvcnRcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdPcHRpb24gMjogSW5zdGFsbCBhbmQgcHJvdmlkZSB0aGUgXCJ3c1wiIHBhY2thZ2U6XFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICBucG0gaW5zdGFsbCB3c1xcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAgaW1wb3J0IHdzIGZyb20gXCJ3c1wiXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICBjb25zdCBjbGllbnQgPSBuZXcgUmVhbHRpbWVDbGllbnQodXJsLCB7XFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgIC4uLm9wdGlvbnMsXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnICAgIHRyYW5zcG9ydDogd3NcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgIH0pJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2ViU29ja2V0IG5vdCBhdmFpbGFibGU6ICR7ZXJyb3JNZXNzYWdlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldHVwQ29ubmVjdGlvbkhhbmRsZXJzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIFVSTCBvZiB0aGUgd2Vic29ja2V0LlxuICAgICAqIEByZXR1cm5zIHN0cmluZyBUaGUgVVJMIG9mIHRoZSB3ZWJzb2NrZXQuXG4gICAgICovXG4gICAgZW5kcG9pbnRVUkwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBlbmRQYXJhbXModGhpcy5lbmRQb2ludCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXJhbXMsIHsgdnNuOiB0aGlzLnZzbiB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29kZSBBIG51bWVyaWMgc3RhdHVzIGNvZGUgdG8gc2VuZCBvbiBkaXNjb25uZWN0LlxuICAgICAqIEBwYXJhbSByZWFzb24gQSBjdXN0b20gcmVhc29uIGZvciB0aGUgZGlzY29ubmVjdC5cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KGNvZGUsIHJlYXNvbikge1xuICAgICAgICBpZiAodGhpcy5pc0Rpc2Nvbm5lY3RpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGluZycsIHRydWUpO1xuICAgICAgICBpZiAodGhpcy5jb25uKSB7XG4gICAgICAgICAgICAvLyBTZXR1cCBmYWxsYmFjayB0aW1lciB0byBwcmV2ZW50IGhhbmdpbmcgaW4gZGlzY29ubmVjdGluZyBzdGF0ZVxuICAgICAgICAgICAgY29uc3QgZmFsbGJhY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgdGhpcy5jb25uLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGZhbGxiYWNrVGltZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlmIGNsb3NlIG1ldGhvZCBleGlzdHNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25uLmNsb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uLmNsb3NlKGNvZGUsIHJlYXNvbiAhPT0gbnVsbCAmJiByZWFzb24gIT09IHZvaWQgMCA/IHJlYXNvbiA6ICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3RlYXJkb3duQ29ubmVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCBjcmVhdGVkIGNoYW5uZWxzXG4gICAgICovXG4gICAgZ2V0Q2hhbm5lbHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWxzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbnN1YnNjcmliZXMgYW5kIHJlbW92ZXMgYSBzaW5nbGUgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBjaGFubmVsIEEgUmVhbHRpbWVDaGFubmVsIGluc3RhbmNlXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGNoYW5uZWwudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKHRoaXMuY2hhbm5lbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbnN1YnNjcmliZXMgYW5kIHJlbW92ZXMgYWxsIGNoYW5uZWxzXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlQWxsQ2hhbm5lbHMoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlc18xID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5jaGFubmVscy5tYXAoKGNoYW5uZWwpID0+IGNoYW5uZWwudW5zdWJzY3JpYmUoKSkpO1xuICAgICAgICB0aGlzLmNoYW5uZWxzID0gW107XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgICByZXR1cm4gdmFsdWVzXzE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZ3MgdGhlIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBGb3IgY3VzdG9taXplZCBsb2dnaW5nLCBgdGhpcy5sb2dnZXJgIGNhbiBiZSBvdmVycmlkZGVuLlxuICAgICAqL1xuICAgIGxvZyhraW5kLCBtc2csIGRhdGEpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIoa2luZCwgbXNnLCBkYXRhKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc29ja2V0LlxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25TdGF0ZSgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmNvbm4gJiYgdGhpcy5jb25uLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nOlxuICAgICAgICAgICAgICAgIHJldHVybiBDT05ORUNUSU9OX1NUQVRFLkNvbm5lY3Rpbmc7XG4gICAgICAgICAgICBjYXNlIFNPQ0tFVF9TVEFURVMub3BlbjpcbiAgICAgICAgICAgICAgICByZXR1cm4gQ09OTkVDVElPTl9TVEFURS5PcGVuO1xuICAgICAgICAgICAgY2FzZSBTT0NLRVRfU1RBVEVTLmNsb3Npbmc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIENPTk5FQ1RJT05fU1RBVEUuQ2xvc2luZztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIENPTk5FQ1RJT05fU1RBVEUuQ2xvc2VkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlzIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4uXG4gICAgICovXG4gICAgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25TdGF0ZSgpID09PSBDT05ORUNUSU9OX1NUQVRFLk9wZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBjb25uZWN0aW9uIGlzIGN1cnJlbnRseSBjb25uZWN0aW5nLlxuICAgICAqL1xuICAgIGlzQ29ubmVjdGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25TdGF0ZSA9PT0gJ2Nvbm5lY3RpbmcnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkgZGlzY29ubmVjdGluZy5cbiAgICAgKi9cbiAgICBpc0Rpc2Nvbm5lY3RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uU3RhdGUgPT09ICdkaXNjb25uZWN0aW5nJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyAob3IgcmV1c2VzKSBhIHtAbGluayBSZWFsdGltZUNoYW5uZWx9IGZvciB0aGUgcHJvdmlkZWQgdG9waWMuXG4gICAgICpcbiAgICAgKiBUb3BpY3MgYXJlIGF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aCBgcmVhbHRpbWU6YCB0byBtYXRjaCB0aGUgUmVhbHRpbWUgc2VydmljZS5cbiAgICAgKiBJZiBhIGNoYW5uZWwgd2l0aCB0aGUgc2FtZSB0b3BpYyBhbHJlYWR5IGV4aXN0cyBpdCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQgb2YgY3JlYXRpbmdcbiAgICAgKiBhIGR1cGxpY2F0ZSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIGNoYW5uZWwodG9waWMsIHBhcmFtcyA9IHsgY29uZmlnOiB7fSB9KSB7XG4gICAgICAgIGNvbnN0IHJlYWx0aW1lVG9waWMgPSBgcmVhbHRpbWU6JHt0b3BpY31gO1xuICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmdldENoYW5uZWxzKCkuZmluZCgoYykgPT4gYy50b3BpYyA9PT0gcmVhbHRpbWVUb3BpYyk7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFuID0gbmV3IFJlYWx0aW1lQ2hhbm5lbChgcmVhbHRpbWU6JHt0b3BpY31gLCBwYXJhbXMsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5jaGFubmVscy5wdXNoKGNoYW4pO1xuICAgICAgICAgICAgcmV0dXJuIGNoYW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RzO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1c2ggb3V0IGEgbWVzc2FnZSBpZiB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBzb2NrZXQgaXMgbm90IGNvbm5lY3RlZCwgdGhlIG1lc3NhZ2UgZ2V0cyBlbnF1ZXVlZCB3aXRoaW4gYSBsb2NhbCBidWZmZXIsIGFuZCBzZW50IG91dCB3aGVuIGEgY29ubmVjdGlvbiBpcyBuZXh0IGVzdGFibGlzaGVkLlxuICAgICAqL1xuICAgIHB1c2goZGF0YSkge1xuICAgICAgICBjb25zdCB7IHRvcGljLCBldmVudCwgcGF5bG9hZCwgcmVmIH0gPSBkYXRhO1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW5jb2RlKGRhdGEsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgKF9hID0gdGhpcy5jb25uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2VuZChyZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubG9nKCdwdXNoJywgYCR7dG9waWN9ICR7ZXZlbnR9ICgke3JlZn0pYCwgcGF5bG9hZCk7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRCdWZmZXIucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgSldUIGFjY2VzcyB0b2tlbiB1c2VkIGZvciBjaGFubmVsIHN1YnNjcmlwdGlvbiBhdXRob3JpemF0aW9uIGFuZCBSZWFsdGltZSBSTFMuXG4gICAgICpcbiAgICAgKiBJZiBwYXJhbSBpcyBudWxsIGl0IHdpbGwgdXNlIHRoZSBgYWNjZXNzVG9rZW5gIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIHRoZSB0b2tlbiBzZXQgb24gdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIE9uIGNhbGxiYWNrIHVzZWQsIGl0IHdpbGwgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgdG9rZW4gaW50ZXJuYWwgdG8gdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIFdoZW4gYSB0b2tlbiBpcyBleHBsaWNpdGx5IHByb3ZpZGVkLCBpdCB3aWxsIGJlIHByZXNlcnZlZCBhY3Jvc3MgY2hhbm5lbCBvcGVyYXRpb25zXG4gICAgICogKGluY2x1ZGluZyByZW1vdmVDaGFubmVsIGFuZCByZXN1YnNjcmliZSkuIFRoZSBgYWNjZXNzVG9rZW5gIGNhbGxiYWNrIHdpbGwgbm90IGJlXG4gICAgICogaW52b2tlZCB1bnRpbCBgc2V0QXV0aCgpYCBpcyBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9rZW4gQSBKV1Qgc3RyaW5nIHRvIG92ZXJyaWRlIHRoZSB0b2tlbiBzZXQgb24gdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gVXNlIGEgbWFudWFsIHRva2VuIChwcmVzZXJ2ZWQgYWNyb3NzIHJlc3Vic2NyaWJlcywgaWdub3JlcyBhY2Nlc3NUb2tlbiBjYWxsYmFjaylcbiAgICAgKiBjbGllbnQucmVhbHRpbWUuc2V0QXV0aCgnbXktY3VzdG9tLWp3dCcpXG4gICAgICpcbiAgICAgKiAvLyBTd2l0Y2ggYmFjayB0byB1c2luZyB0aGUgYWNjZXNzVG9rZW4gY2FsbGJhY2tcbiAgICAgKiBjbGllbnQucmVhbHRpbWUuc2V0QXV0aCgpXG4gICAgICovXG4gICAgYXN5bmMgc2V0QXV0aCh0b2tlbiA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fYXV0aFByb21pc2UgPSB0aGlzLl9wZXJmb3JtQXV0aCh0b2tlbik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9hdXRoUHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2F1dGhQcm9taXNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgYWNjZXNzIHRva2VuIHdhcyBleHBsaWNpdGx5IHNldCB2aWEgc2V0QXV0aCh0b2tlbiksXG4gICAgICogZmFsc2UgaWYgaXQgd2FzIG9idGFpbmVkIHZpYSB0aGUgYWNjZXNzVG9rZW4gY2FsbGJhY2suXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2lzTWFudWFsVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYW51YWxseVNldFRva2VuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIGhlYXJ0YmVhdCBtZXNzYWdlIGlmIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkLlxuICAgICAqL1xuICAgIGFzeW5jIHNlbmRIZWFydGJlYXQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFydGJlYXRDYWxsYmFjaygnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsICdlcnJvciBpbiBoZWFydGJlYXQgY2FsbGJhY2snLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGUgaGVhcnRiZWF0IHRpbWVvdXQgYW5kIGZvcmNlIHJlY29ubmVjdGlvbiBpZiBuZWVkZWRcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZikge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMubG9nKCd0cmFuc3BvcnQnLCAnaGVhcnRiZWF0IHRpbWVvdXQuIEF0dGVtcHRpbmcgdG8gcmUtZXN0YWJsaXNoIGNvbm5lY3Rpb24nKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFydGJlYXRDYWxsYmFjaygndGltZW91dCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnZXJyb3IgaW4gaGVhcnRiZWF0IGNhbGxiYWNrJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb3JjZSByZWNvbm5lY3Rpb24gYWZ0ZXIgaGVhcnRiZWF0IHRpbWVvdXRcbiAgICAgICAgICAgIHRoaXMuX3dhc01hbnVhbERpc2Nvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIChfYSA9IHRoaXMuY29ubikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsb3NlKFdTX0NMT1NFX05PUk1BTCwgJ2hlYXJ0YmVhdCB0aW1lb3V0Jyk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgKF9hID0gdGhpcy5yZWNvbm5lY3RUaW1lcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIENPTk5FQ1RJT05fVElNRU9VVFMuSEVBUlRCRUFUX1RJTUVPVVRfRkFMTEJBQ0spO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlbmQgaGVhcnRiZWF0IG1lc3NhZ2UgdG8gc2VydmVyXG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IHRoaXMuX21ha2VSZWYoKTtcbiAgICAgICAgdGhpcy5wdXNoKHtcbiAgICAgICAgICAgIHRvcGljOiAncGhvZW5peCcsXG4gICAgICAgICAgICBldmVudDogJ2hlYXJ0YmVhdCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7fSxcbiAgICAgICAgICAgIHJlZjogdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmLFxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2soJ3NlbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgJ2Vycm9yIGluIGhlYXJ0YmVhdCBjYWxsYmFjaycsIGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldEF1dGhTYWZlbHkoJ2hlYXJ0YmVhdCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdGhhdCByZWNlaXZlcyBsaWZlY3ljbGUgZXZlbnRzIGZvciBpbnRlcm5hbCBoZWFydGJlYXQgbWVzc2FnZXMuXG4gICAgICogVXNlZnVsIGZvciBpbnN0cnVtZW50aW5nIGNvbm5lY3Rpb24gaGVhbHRoIChlLmcuIHNlbnQvb2svdGltZW91dC9kaXNjb25uZWN0ZWQpLlxuICAgICAqL1xuICAgIG9uSGVhcnRiZWF0KGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmx1c2hlcyBzZW5kIGJ1ZmZlclxuICAgICAqL1xuICAgIGZsdXNoU2VuZEJ1ZmZlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLnNlbmRCdWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zZW5kQnVmZmVyLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjaygpKTtcbiAgICAgICAgICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbmV4dCBtZXNzYWdlIHJlZiwgYWNjb3VudGluZyBmb3Igb3ZlcmZsb3dzXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfbWFrZVJlZigpIHtcbiAgICAgICAgbGV0IG5ld1JlZiA9IHRoaXMucmVmICsgMTtcbiAgICAgICAgaWYgKG5ld1JlZiA9PT0gdGhpcy5yZWYpIHtcbiAgICAgICAgICAgIHRoaXMucmVmID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVmID0gbmV3UmVmO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZi50b1N0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbnN1YnNjcmliZSBmcm9tIGNoYW5uZWxzIHdpdGggdGhlIHNwZWNpZmllZCB0b3BpYy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9sZWF2ZU9wZW5Ub3BpYyh0b3BpYykge1xuICAgICAgICBsZXQgZHVwQ2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZmluZCgoYykgPT4gYy50b3BpYyA9PT0gdG9waWMgJiYgKGMuX2lzSm9pbmVkKCkgfHwgYy5faXNKb2luaW5nKCkpKTtcbiAgICAgICAgaWYgKGR1cENoYW5uZWwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKCd0cmFuc3BvcnQnLCBgbGVhdmluZyBkdXBsaWNhdGUgdG9waWMgXCIke3RvcGljfVwiYCk7XG4gICAgICAgICAgICBkdXBDaGFubmVsLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHN1YnNjcmlwdGlvbiBmcm9tIHRoZSBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBBbiBvcGVuIHN1YnNjcmlwdGlvbi5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9yZW1vdmUoY2hhbm5lbCkge1xuICAgICAgICB0aGlzLmNoYW5uZWxzID0gdGhpcy5jaGFubmVscy5maWx0ZXIoKGMpID0+IGMudG9waWMgIT09IGNoYW5uZWwudG9waWMpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX29uQ29ubk1lc3NhZ2UocmF3TWVzc2FnZSkge1xuICAgICAgICB0aGlzLmRlY29kZShyYXdNZXNzYWdlLmRhdGEsIChtc2cpID0+IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBoZWFydGJlYXQgcmVzcG9uc2VzXG4gICAgICAgICAgICBpZiAobXNnLnRvcGljID09PSAncGhvZW5peCcgJiYgbXNnLmV2ZW50ID09PSAncGh4X3JlcGx5Jykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2sobXNnLnBheWxvYWQuc3RhdHVzID09PSAnb2snID8gJ29rJyA6ICdlcnJvcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnZXJyb3IgaW4gaGVhcnRiZWF0IGNhbGxiYWNrJywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFuZGxlIHBlbmRpbmcgaGVhcnRiZWF0IHJlZmVyZW5jZSBjbGVhbnVwXG4gICAgICAgICAgICBpZiAobXNnLnJlZiAmJiBtc2cucmVmID09PSB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTG9nIGluY29taW5nIG1lc3NhZ2VcbiAgICAgICAgICAgIGNvbnN0IHsgdG9waWMsIGV2ZW50LCBwYXlsb2FkLCByZWYgfSA9IG1zZztcbiAgICAgICAgICAgIGNvbnN0IHJlZlN0cmluZyA9IHJlZiA/IGAoJHtyZWZ9KWAgOiAnJztcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHBheWxvYWQuc3RhdHVzIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5sb2coJ3JlY2VpdmUnLCBgJHtzdGF0dXN9ICR7dG9waWN9ICR7ZXZlbnR9ICR7cmVmU3RyaW5nfWAudHJpbSgpLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIC8vIFJvdXRlIG1lc3NhZ2UgdG8gYXBwcm9wcmlhdGUgY2hhbm5lbHNcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChjaGFubmVsKSA9PiBjaGFubmVsLl9pc01lbWJlcih0b3BpYykpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKGNoYW5uZWwpID0+IGNoYW5uZWwuX3RyaWdnZXIoZXZlbnQsIHBheWxvYWQsIHJlZikpO1xuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlclN0YXRlQ2FsbGJhY2tzKCdtZXNzYWdlJywgbXNnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFyIHNwZWNpZmljIHRpbWVyXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2NsZWFyVGltZXIodGltZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGltZXIgPT09ICdoZWFydGJlYXQnICYmIHRoaXMuaGVhcnRiZWF0VGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRUaW1lcik7XG4gICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRpbWVyID09PSAncmVjb25uZWN0Jykge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5yZWNvbm5lY3RUaW1lcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHRpbWVyc1xuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9jbGVhckFsbFRpbWVycygpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lcignaGVhcnRiZWF0Jyk7XG4gICAgICAgIHRoaXMuX2NsZWFyVGltZXIoJ3JlY29ubmVjdCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXR1cCBjb25uZWN0aW9uIGhhbmRsZXJzIGZvciBXZWJTb2NrZXQgZXZlbnRzXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3NldHVwQ29ubmVjdGlvbkhhbmRsZXJzKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29ubilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gU2V0IGJpbmFyeSB0eXBlIGlmIHN1cHBvcnRlZCAoYnJvd3NlcnMgYW5kIG1vc3QgV2ViU29ja2V0IGltcGxlbWVudGF0aW9ucylcbiAgICAgICAgaWYgKCdiaW5hcnlUeXBlJyBpbiB0aGlzLmNvbm4pIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIHRoaXMuY29ubi5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm4ub25vcGVuID0gKCkgPT4gdGhpcy5fb25Db25uT3BlbigpO1xuICAgICAgICB0aGlzLmNvbm4ub25lcnJvciA9IChlcnJvcikgPT4gdGhpcy5fb25Db25uRXJyb3IoZXJyb3IpO1xuICAgICAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gKGV2ZW50KSA9PiB0aGlzLl9vbkNvbm5NZXNzYWdlKGV2ZW50KTtcbiAgICAgICAgdGhpcy5jb25uLm9uY2xvc2UgPSAoZXZlbnQpID0+IHRoaXMuX29uQ29ubkNsb3NlKGV2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMuY29ubi5yZWFkeVN0YXRlID09PSBTT0NLRVRfU1RBVEVTLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ29ubk9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZWFyZG93biBjb25uZWN0aW9uIGFuZCBjbGVhbnVwIHJlc291cmNlc1xuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF90ZWFyZG93bkNvbm5lY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbm4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm4ucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5vcGVuIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uLnJlYWR5U3RhdGUgPT09IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnRXJyb3IgY2xvc2luZyBjb25uZWN0aW9uJywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb25uLm9ub3BlbiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNvbm4ub25lcnJvciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNvbm4ub25tZXNzYWdlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29ubi5vbmNsb3NlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29ubiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2xlYXJBbGxUaW1lcnMoKTtcbiAgICAgICAgdGhpcy5fdGVybWluYXRlV29ya2VyKCk7XG4gICAgICAgIHRoaXMuY2hhbm5lbHMuZm9yRWFjaCgoY2hhbm5lbCkgPT4gY2hhbm5lbC50ZWFyZG93bigpKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbkNvbm5PcGVuKCkge1xuICAgICAgICB0aGlzLl9zZXRDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICB0aGlzLmxvZygndHJhbnNwb3J0JywgYGNvbm5lY3RlZCB0byAke3RoaXMuZW5kcG9pbnRVUkwoKX1gKTtcbiAgICAgICAgLy8gV2FpdCBmb3IgYW55IHBlbmRpbmcgYXV0aCBvcGVyYXRpb25zIGJlZm9yZSBmbHVzaGluZyBzZW5kIGJ1ZmZlclxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY2hhbm5lbCBqb2luIG1lc3NhZ2VzIGluY2x1ZGUgdGhlIGNvcnJlY3QgYWNjZXNzIHRva2VuXG4gICAgICAgIGNvbnN0IGF1dGhQcm9taXNlID0gdGhpcy5fYXV0aFByb21pc2UgfHxcbiAgICAgICAgICAgICh0aGlzLmFjY2Vzc1Rva2VuICYmICF0aGlzLmFjY2Vzc1Rva2VuVmFsdWUgPyB0aGlzLnNldEF1dGgoKSA6IFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICAgICAgYXV0aFByb21pc2VcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hTZW5kQnVmZmVyKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsICdlcnJvciB3YWl0aW5nIGZvciBhdXRoIG9uIGNvbm5lY3QnLCBlKTtcbiAgICAgICAgICAgIC8vIFByb2NlZWQgYW55d2F5IHRvIGF2b2lkIGhhbmdpbmcgY29ubmVjdGlvbnNcbiAgICAgICAgICAgIHRoaXMuZmx1c2hTZW5kQnVmZmVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jbGVhclRpbWVyKCdyZWNvbm5lY3QnKTtcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRIZWFydGJlYXQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy53b3JrZXJSZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFdvcmtlckhlYXJ0YmVhdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RyaWdnZXJTdGF0ZUNhbGxiYWNrcygnb3BlbicpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX3N0YXJ0SGVhcnRiZWF0KCkge1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdFRpbWVyICYmIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRUaW1lcik7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnNlbmRIZWFydGJlYXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9zdGFydFdvcmtlckhlYXJ0YmVhdCgpIHtcbiAgICAgICAgaWYgKHRoaXMud29ya2VyVXJsKSB7XG4gICAgICAgICAgICB0aGlzLmxvZygnd29ya2VyJywgYHN0YXJ0aW5nIHdvcmtlciBmb3IgZnJvbSAke3RoaXMud29ya2VyVXJsfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2coJ3dvcmtlcicsIGBzdGFydGluZyBkZWZhdWx0IHdvcmtlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9iamVjdFVybCA9IHRoaXMuX3dvcmtlck9iamVjdFVybCh0aGlzLndvcmtlclVybCk7XG4gICAgICAgIHRoaXMud29ya2VyUmVmID0gbmV3IFdvcmtlcihvYmplY3RVcmwpO1xuICAgICAgICB0aGlzLndvcmtlclJlZi5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZygnd29ya2VyJywgJ3dvcmtlciBlcnJvcicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYXRlV29ya2VyKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud29ya2VyUmVmLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZXZlbnQgPT09ICdrZWVwQWxpdmUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kSGVhcnRiZWF0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud29ya2VyUmVmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIGV2ZW50OiAnc3RhcnQnLFxuICAgICAgICAgICAgaW50ZXJ2YWw6IHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRlcm1pbmF0ZSB0aGUgV2ViIFdvcmtlciBhbmQgY2xlYXIgdGhlIHJlZmVyZW5jZVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF90ZXJtaW5hdGVXb3JrZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtlclJlZikge1xuICAgICAgICAgICAgdGhpcy5sb2coJ3dvcmtlcicsICd0ZXJtaW5hdGluZyB3b3JrZXInKTtcbiAgICAgICAgICAgIHRoaXMud29ya2VyUmVmLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJSZWYgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9vbkNvbm5DbG9zZShldmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX3NldENvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgIHRoaXMubG9nKCd0cmFuc3BvcnQnLCAnY2xvc2UnLCBldmVudCk7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJDaGFuRXJyb3IoKTtcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lcignaGVhcnRiZWF0Jyk7XG4gICAgICAgIC8vIE9ubHkgc2NoZWR1bGUgcmVjb25uZWN0aW9uIGlmIGl0IHdhc24ndCBhIG1hbnVhbCBkaXNjb25uZWN0XG4gICAgICAgIGlmICghdGhpcy5fd2FzTWFudWFsRGlzY29ubmVjdCkge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5yZWNvbm5lY3RUaW1lcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RyaWdnZXJTdGF0ZUNhbGxiYWNrcygnY2xvc2UnLCBldmVudCk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfb25Db25uRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fc2V0Q29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5sb2coJ3RyYW5zcG9ydCcsIGAke2Vycm9yfWApO1xuICAgICAgICB0aGlzLl90cmlnZ2VyQ2hhbkVycm9yKCk7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJTdGF0ZUNhbGxiYWNrcygnZXJyb3InLCBlcnJvcik7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfdHJpZ2dlckNoYW5FcnJvcigpIHtcbiAgICAgICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKChjaGFubmVsKSA9PiBjaGFubmVsLl90cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmVycm9yKSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmVmaXggPSB1cmwubWF0Y2goL1xcPy8pID8gJyYnIDogJz8nO1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3F1ZXJ5fWA7XG4gICAgfVxuICAgIF93b3JrZXJPYmplY3RVcmwodXJsKSB7XG4gICAgICAgIGxldCByZXN1bHRfdXJsO1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICByZXN1bHRfdXJsID0gdXJsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtXT1JLRVJfU0NSSVBUXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSk7XG4gICAgICAgICAgICByZXN1bHRfdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0X3VybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IGNvbm5lY3Rpb24gc3RhdGUgd2l0aCBwcm9wZXIgc3RhdGUgbWFuYWdlbWVudFxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9zZXRDb25uZWN0aW9uU3RhdGUoc3RhdGUsIG1hbnVhbCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgPT09ICdjb25uZWN0aW5nJykge1xuICAgICAgICAgICAgdGhpcy5fd2FzTWFudWFsRGlzY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlID09PSAnZGlzY29ubmVjdGluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX3dhc01hbnVhbERpc2Nvbm5lY3QgPSBtYW51YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybSB0aGUgYWN0dWFsIGF1dGggb3BlcmF0aW9uXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgX3BlcmZvcm1BdXRoKHRva2VuID0gbnVsbCkge1xuICAgICAgICBsZXQgdG9rZW5Ub1NlbmQ7XG4gICAgICAgIGxldCBpc01hbnVhbFRva2VuID0gZmFsc2U7XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgdG9rZW5Ub1NlbmQgPSB0b2tlbjtcbiAgICAgICAgICAgIC8vIFRyYWNrIGlmIHRoaXMgaXMgYSBtYW51YWxseS1wcm92aWRlZCB0b2tlblxuICAgICAgICAgICAgaXNNYW51YWxUb2tlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgYWNjZXNzVG9rZW4gY2FsbGJhY2sgdG8gZ2V0IGZyZXNoIHRva2VuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRva2VuVG9TZW5kID0gYXdhaXQgdGhpcy5hY2Nlc3NUb2tlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZygnZXJyb3InLCAnRXJyb3IgZmV0Y2hpbmcgYWNjZXNzIHRva2VuIGZyb20gY2FsbGJhY2snLCBlKTtcbiAgICAgICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gY2FjaGVkIHZhbHVlIGlmIGNhbGxiYWNrIGZhaWxzXG4gICAgICAgICAgICAgICAgdG9rZW5Ub1NlbmQgPSB0aGlzLmFjY2Vzc1Rva2VuVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0b2tlblRvU2VuZCA9IHRoaXMuYWNjZXNzVG9rZW5WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUcmFjayB3aGV0aGVyIHRoaXMgdG9rZW4gd2FzIG1hbnVhbGx5IHNldCBvciBmZXRjaGVkIHZpYSBjYWxsYmFja1xuICAgICAgICBpZiAoaXNNYW51YWxUb2tlbikge1xuICAgICAgICAgICAgdGhpcy5fbWFudWFsbHlTZXRUb2tlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgLy8gSWYgd2UgdXNlZCB0aGUgY2FsbGJhY2ssIGNsZWFyIHRoZSBtYW51YWwgZmxhZ1xuICAgICAgICAgICAgdGhpcy5fbWFudWFsbHlTZXRUb2tlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuVmFsdWUgIT0gdG9rZW5Ub1NlbmQpIHtcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW5WYWx1ZSA9IHRva2VuVG9TZW5kO1xuICAgICAgICAgICAgdGhpcy5jaGFubmVscy5mb3JFYWNoKChjaGFubmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiB0b2tlblRvU2VuZCxcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogREVGQVVMVF9WRVJTSU9OLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdG9rZW5Ub1NlbmQgJiYgY2hhbm5lbC51cGRhdGVKb2luUGF5bG9hZChwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbC5qb2luZWRPbmNlICYmIGNoYW5uZWwuX2lzSm9pbmVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5fcHVzaChDSEFOTkVMX0VWRU5UUy5hY2Nlc3NfdG9rZW4sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbjogdG9rZW5Ub1NlbmQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdhaXQgZm9yIGFueSBpbi1mbGlnaHQgYXV0aCBvcGVyYXRpb25zIHRvIGNvbXBsZXRlXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgX3dhaXRGb3JBdXRoSWZOZWVkZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hdXRoUHJvbWlzZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fYXV0aFByb21pc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2FmZWx5IGNhbGwgc2V0QXV0aCB3aXRoIHN0YW5kYXJkaXplZCBlcnJvciBoYW5kbGluZ1xuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9zZXRBdXRoU2FmZWx5KGNvbnRleHQgPSAnZ2VuZXJhbCcpIHtcbiAgICAgICAgLy8gT25seSByZWZyZXNoIGF1dGggaWYgdXNpbmcgY2FsbGJhY2stYmFzZWQgdG9rZW5zXG4gICAgICAgIGlmICghdGhpcy5faXNNYW51YWxUb2tlbigpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEF1dGgoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsIGBFcnJvciBzZXR0aW5nIGF1dGggaW4gJHtjb250ZXh0fWAsIGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJpZ2dlciBzdGF0ZSBjaGFuZ2UgY2FsbGJhY2tzIHdpdGggcHJvcGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3RyaWdnZXJTdGF0ZUNhbGxiYWNrcyhldmVudCwgZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1tldmVudF0uZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coJ2Vycm9yJywgYGVycm9yIGluICR7ZXZlbnR9IGNhbGxiYWNrYCwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKCdlcnJvcicsIGBlcnJvciB0cmlnZ2VyaW5nICR7ZXZlbnR9IGNhbGxiYWNrc2AsIGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHVwIHJlY29ubmVjdGlvbiB0aW1lciB3aXRoIHByb3BlciBjb25maWd1cmF0aW9uXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3NldHVwUmVjb25uZWN0aW9uVGltZXIoKSB7XG4gICAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBuZXcgVGltZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd2FpdEZvckF1dGhJZk5lZWRlZCgpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIENPTk5FQ1RJT05fVElNRU9VVFMuUkVDT05ORUNUX0RFTEFZKTtcbiAgICAgICAgfSwgdGhpcy5yZWNvbm5lY3RBZnRlck1zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBjbGllbnQgb3B0aW9ucyB3aXRoIGRlZmF1bHRzXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2luaXRpYWxpemVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX207XG4gICAgICAgIC8vIFNldCBkZWZhdWx0c1xuICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50cmFuc3BvcnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG51bGw7XG4gICAgICAgIHRoaXMudGltZW91dCA9IChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50aW1lb3V0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBERUZBVUxUX1RJTUVPVVQ7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0SW50ZXJ2YWxNcyA9XG4gICAgICAgICAgICAoX2MgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhcnRiZWF0SW50ZXJ2YWxNcykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogQ09OTkVDVElPTl9USU1FT1VUUy5IRUFSVEJFQVRfSU5URVJWQUw7XG4gICAgICAgIHRoaXMud29ya2VyID0gKF9kID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndvcmtlcikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZmFsc2U7XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSAoX2UgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYWNjZXNzVG9rZW4pICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IG51bGw7XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0Q2FsbGJhY2sgPSAoX2YgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhcnRiZWF0Q2FsbGJhY2spICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IG5vb3A7XG4gICAgICAgIHRoaXMudnNuID0gKF9nID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnZzbikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogREVGQVVMVF9WU047XG4gICAgICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2VzXG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucGFyYW1zKVxuICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBvcHRpb25zLnBhcmFtcztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5sb2dnZXIpXG4gICAgICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyO1xuICAgICAgICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5sb2dMZXZlbCkgfHwgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5sb2dfbGV2ZWwpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0xldmVsID0gb3B0aW9ucy5sb2dMZXZlbCB8fCBvcHRpb25zLmxvZ19sZXZlbDtcbiAgICAgICAgICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLnBhcmFtcyksIHsgbG9nX2xldmVsOiB0aGlzLmxvZ0xldmVsIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCB1cCBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0c1xuICAgICAgICB0aGlzLnJlY29ubmVjdEFmdGVyTXMgPVxuICAgICAgICAgICAgKF9oID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJlY29ubmVjdEFmdGVyTXMpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6ICgodHJpZXMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUkVDT05ORUNUX0lOVEVSVkFMU1t0cmllcyAtIDFdIHx8IERFRkFVTFRfUkVDT05ORUNUX0ZBTExCQUNLO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHN3aXRjaCAodGhpcy52c24pIHtcbiAgICAgICAgICAgIGNhc2UgVlNOXzFfMF8wOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5jb2RlID1cbiAgICAgICAgICAgICAgICAgICAgKF9qID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmVuY29kZSkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogKChwYXlsb2FkLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvZGUgPVxuICAgICAgICAgICAgICAgICAgICAoX2sgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVjb2RlKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiAoKHBheWxvYWQsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5wYXJzZShwYXlsb2FkKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWU05fMl8wXzA6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmNvZGUgPSAoX2wgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZW5jb2RlKSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiB0aGlzLnNlcmlhbGl6ZXIuZW5jb2RlLmJpbmQodGhpcy5zZXJpYWxpemVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29kZSA9IChfbSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZWNvZGUpICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6IHRoaXMuc2VyaWFsaXplci5kZWNvZGUuYmluZCh0aGlzLnNlcmlhbGl6ZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6ZXIgdmVyc2lvbjogJHt0aGlzLnZzbn1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGUgd29ya2VyIHNldHVwXG4gICAgICAgIGlmICh0aGlzLndvcmtlcikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICF3aW5kb3cuV29ya2VyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWIgV29ya2VyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMud29ya2VyVXJsID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndvcmtlclVybDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWx0aW1lQ2xpZW50LmpzLm1hcCJdLCJuYW1lcyI6WyJXZWJTb2NrZXRGYWN0b3J5IiwiQ0hBTk5FTF9FVkVOVFMiLCJDT05ORUNUSU9OX1NUQVRFIiwiREVGQVVMVF9WRVJTSU9OIiwiREVGQVVMVF9USU1FT1VUIiwiU09DS0VUX1NUQVRFUyIsIlRSQU5TUE9SVFMiLCJERUZBVUxUX1ZTTiIsIlZTTl8xXzBfMCIsIlZTTl8yXzBfMCIsIldTX0NMT1NFX05PUk1BTCIsIlNlcmlhbGl6ZXIiLCJUaW1lciIsImh0dHBFbmRwb2ludFVSTCIsIlJlYWx0aW1lQ2hhbm5lbCIsIm5vb3AiLCJDT05ORUNUSU9OX1RJTUVPVVRTIiwiSEVBUlRCRUFUX0lOVEVSVkFMIiwiUkVDT05ORUNUX0RFTEFZIiwiSEVBUlRCRUFUX1RJTUVPVVRfRkFMTEJBQ0siLCJSRUNPTk5FQ1RfSU5URVJWQUxTIiwiREVGQVVMVF9SRUNPTk5FQ1RfRkFMTEJBQ0siLCJXT1JLRVJfU0NSSVBUIiwiUmVhbHRpbWVDbGllbnQiLCJjb25zdHJ1Y3RvciIsImVuZFBvaW50Iiwib3B0aW9ucyIsIl9hIiwiYWNjZXNzVG9rZW5WYWx1ZSIsImFwaUtleSIsIl9tYW51YWxseVNldFRva2VuIiwiY2hhbm5lbHMiLCJBcnJheSIsImh0dHBFbmRwb2ludCIsImhlYWRlcnMiLCJwYXJhbXMiLCJ0aW1lb3V0IiwidHJhbnNwb3J0IiwiaGVhcnRiZWF0SW50ZXJ2YWxNcyIsImhlYXJ0YmVhdFRpbWVyIiwidW5kZWZpbmVkIiwicGVuZGluZ0hlYXJ0YmVhdFJlZiIsImhlYXJ0YmVhdENhbGxiYWNrIiwicmVmIiwicmVjb25uZWN0VGltZXIiLCJ2c24iLCJsb2dnZXIiLCJjb25uIiwic2VuZEJ1ZmZlciIsInNlcmlhbGl6ZXIiLCJzdGF0ZUNoYW5nZUNhbGxiYWNrcyIsIm9wZW4iLCJjbG9zZSIsImVycm9yIiwibWVzc2FnZSIsImFjY2Vzc1Rva2VuIiwiX2Nvbm5lY3Rpb25TdGF0ZSIsIl93YXNNYW51YWxEaXNjb25uZWN0IiwiX2F1dGhQcm9taXNlIiwiX3Jlc29sdmVGZXRjaCIsImN1c3RvbUZldGNoIiwiYXJncyIsImZldGNoIiwiYXBpa2V5IiwiRXJyb3IiLCJ3ZWJzb2NrZXQiLCJfaW5pdGlhbGl6ZU9wdGlvbnMiLCJfc2V0dXBSZWNvbm5lY3Rpb25UaW1lciIsImNvbm5lY3QiLCJpc0Nvbm5lY3RpbmciLCJpc0Rpc2Nvbm5lY3RpbmciLCJpc0Nvbm5lY3RlZCIsIl9zZXRDb25uZWN0aW9uU3RhdGUiLCJfc2V0QXV0aFNhZmVseSIsImVuZHBvaW50VVJMIiwiY3JlYXRlV2ViU29ja2V0IiwiZXJyb3JNZXNzYWdlIiwiaW5jbHVkZXMiLCJfc2V0dXBDb25uZWN0aW9uSGFuZGxlcnMiLCJfYXBwZW5kUGFyYW1zIiwiT2JqZWN0IiwiYXNzaWduIiwiZGlzY29ubmVjdCIsImNvZGUiLCJyZWFzb24iLCJmYWxsYmFja1RpbWVyIiwic2V0VGltZW91dCIsIm9uY2xvc2UiLCJjbGVhclRpbWVvdXQiLCJfdGVhcmRvd25Db25uZWN0aW9uIiwiZ2V0Q2hhbm5lbHMiLCJyZW1vdmVDaGFubmVsIiwiY2hhbm5lbCIsInN0YXR1cyIsInVuc3Vic2NyaWJlIiwibGVuZ3RoIiwicmVtb3ZlQWxsQ2hhbm5lbHMiLCJ2YWx1ZXNfMSIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJsb2ciLCJraW5kIiwibXNnIiwiZGF0YSIsImNvbm5lY3Rpb25TdGF0ZSIsInJlYWR5U3RhdGUiLCJjb25uZWN0aW5nIiwiQ29ubmVjdGluZyIsIk9wZW4iLCJjbG9zaW5nIiwiQ2xvc2luZyIsIkNsb3NlZCIsInRvcGljIiwiY29uZmlnIiwicmVhbHRpbWVUb3BpYyIsImV4aXN0cyIsImZpbmQiLCJjIiwiY2hhbiIsInB1c2giLCJldmVudCIsInBheWxvYWQiLCJjYWxsYmFjayIsImVuY29kZSIsInJlc3VsdCIsInNlbmQiLCJzZXRBdXRoIiwidG9rZW4iLCJfcGVyZm9ybUF1dGgiLCJfaXNNYW51YWxUb2tlbiIsInNlbmRIZWFydGJlYXQiLCJlIiwic2NoZWR1bGVUaW1lb3V0IiwiX21ha2VSZWYiLCJvbkhlYXJ0YmVhdCIsImZsdXNoU2VuZEJ1ZmZlciIsImZvckVhY2giLCJuZXdSZWYiLCJ0b1N0cmluZyIsIl9sZWF2ZU9wZW5Ub3BpYyIsImR1cENoYW5uZWwiLCJfaXNKb2luZWQiLCJfaXNKb2luaW5nIiwiX3JlbW92ZSIsImZpbHRlciIsIl9vbkNvbm5NZXNzYWdlIiwicmF3TWVzc2FnZSIsImRlY29kZSIsInJlZlN0cmluZyIsInRyaW0iLCJfaXNNZW1iZXIiLCJfdHJpZ2dlciIsIl90cmlnZ2VyU3RhdGVDYWxsYmFja3MiLCJfY2xlYXJUaW1lciIsInRpbWVyIiwiY2xlYXJJbnRlcnZhbCIsInJlc2V0IiwiX2NsZWFyQWxsVGltZXJzIiwiYmluYXJ5VHlwZSIsIm9ub3BlbiIsIl9vbkNvbm5PcGVuIiwib25lcnJvciIsIl9vbkNvbm5FcnJvciIsIm9ubWVzc2FnZSIsIl9vbkNvbm5DbG9zZSIsIl90ZXJtaW5hdGVXb3JrZXIiLCJ0ZWFyZG93biIsImF1dGhQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJjYXRjaCIsIndvcmtlciIsIl9zdGFydEhlYXJ0YmVhdCIsIndvcmtlclJlZiIsIl9zdGFydFdvcmtlckhlYXJ0YmVhdCIsInNldEludGVydmFsIiwid29ya2VyVXJsIiwib2JqZWN0VXJsIiwiX3dvcmtlck9iamVjdFVybCIsIldvcmtlciIsInBvc3RNZXNzYWdlIiwiaW50ZXJ2YWwiLCJ0ZXJtaW5hdGUiLCJfdHJpZ2dlckNoYW5FcnJvciIsInVybCIsImtleXMiLCJwcmVmaXgiLCJtYXRjaCIsInF1ZXJ5IiwiVVJMU2VhcmNoUGFyYW1zIiwicmVzdWx0X3VybCIsImJsb2IiLCJCbG9iIiwidHlwZSIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsInN0YXRlIiwibWFudWFsIiwidG9rZW5Ub1NlbmQiLCJpc01hbnVhbFRva2VuIiwiYWNjZXNzX3Rva2VuIiwidmVyc2lvbiIsInVwZGF0ZUpvaW5QYXlsb2FkIiwiam9pbmVkT25jZSIsIl9wdXNoIiwiX3dhaXRGb3JBdXRoSWZOZWVkZWQiLCJjb250ZXh0IiwicmVjb25uZWN0QWZ0ZXJNcyIsIl9iIiwiX2MiLCJfZCIsIl9lIiwiX2YiLCJfZyIsIl9oIiwiX2oiLCJfayIsIl9sIiwiX20iLCJsb2dMZXZlbCIsImxvZ19sZXZlbCIsInRyaWVzIiwiSlNPTiIsInN0cmluZ2lmeSIsInBhcnNlIiwiYmluZCIsIndpbmRvdyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js":
|
||
/*!****************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js ***!
|
||
\****************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_PRESENCE_LISTEN_EVENTS: () => (/* binding */ REALTIME_PRESENCE_LISTEN_EVENTS),\n/* harmony export */ \"default\": () => (/* 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 * 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 /**\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} //# sourceMappingURL=RealtimePresence.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvUmVhbHRpbWVQcmVzZW5jZS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7QUFHQSxHQUNPLElBQUlBLGdDQUFnQztBQUMxQyxVQUFVQSwrQkFBK0I7SUFDdENBLCtCQUErQixDQUFDLE9BQU8sR0FBRztJQUMxQ0EsK0JBQStCLENBQUMsT0FBTyxHQUFHO0lBQzFDQSwrQkFBK0IsQ0FBQyxRQUFRLEdBQUc7QUFDL0MsR0FBR0EsbUNBQW9DQSxDQUFBQSxrQ0FBa0MsQ0FBQztBQUMzRCxNQUFNQztJQUNqQjs7Ozs7Ozs7Ozs7Ozs7S0FjQyxHQUNEQyxZQUFZQyxPQUFPLEVBQUVDLElBQUksQ0FBRTtRQUN2QixJQUFJLENBQUNELE9BQU8sR0FBR0E7UUFDZixJQUFJLENBQUNFLEtBQUssR0FBRyxDQUFDO1FBQ2QsSUFBSSxDQUFDQyxZQUFZLEdBQUcsRUFBRTtRQUN0QixJQUFJLENBQUNDLE9BQU8sR0FBRztRQUNmLElBQUksQ0FBQ0MsT0FBTyxHQUFHO1FBQ2YsSUFBSSxDQUFDQyxNQUFNLEdBQUc7WUFDVkMsUUFBUSxLQUFRO1lBQ2hCQyxTQUFTLEtBQVE7WUFDakJDLFFBQVEsS0FBUTtRQUNwQjtRQUNBLE1BQU1DLFNBQVMsQ0FBQ1QsU0FBUyxRQUFRQSxTQUFTLEtBQUssSUFBSSxLQUFLLElBQUlBLEtBQUtTLE1BQU0sS0FBSztZQUN4RVIsT0FBTztZQUNQUyxNQUFNO1FBQ1Y7UUFDQSxJQUFJLENBQUNYLE9BQU8sQ0FBQ1ksR0FBRyxDQUFDRixPQUFPUixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUNXO1lBQ2hDLE1BQU0sRUFBRU4sTUFBTSxFQUFFQyxPQUFPLEVBQUVDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQ0gsTUFBTTtZQUMvQyxJQUFJLENBQUNGLE9BQU8sR0FBRyxJQUFJLENBQUNKLE9BQU8sQ0FBQ2MsUUFBUTtZQUNwQyxJQUFJ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T0EsUUFBUSxDQUFDLFVBQVU7b0JBQzFCLE9BQU9BLFFBQVEsQ0FBQyxlQUFlO29CQUMvQixPQUFPQTtnQkFDWDtZQUNKLE9BQ0s7Z0JBQ0R4QyxRQUFRLENBQUNPLElBQUksR0FBR2E7WUFDcEI7WUFDQSxPQUFPcEI7UUFDWCxHQUFHLENBQUM7SUFDUjtJQUNBLGNBQWMsR0FDZCxPQUFPYyxVQUFVb0IsR0FBRyxFQUFFO1FBQ2xCLE9BQU9PLEtBQUtDLEtBQUssQ0FBQ0QsS0FBS0UsU0FBUyxDQUFDVDtJQUNyQztJQUNBLGNBQWMsR0FDZHhDLE9BQU9rRCxRQUFRLEVBQUU7UUFDYixJQUFJLENBQUNuRCxNQUFNLENBQUNDLE1BQU0sR0FBR2tEO0lBQ3pCO0lBQ0EsY0FBYyxHQUNkakQsUUFBUWlELFFBQVEsRUFBRTtRQUNkLElBQUksQ0FBQ25ELE1BQU0sQ0FBQ0UsT0FBTyxHQUFHaUQ7SUFDMUI7SUFDQSxjQUFjLEdBQ2RoRCxPQUFPZ0QsUUFBUSxFQUFFO1FBQ2IsSUFBSSxDQUFDbkQsTUFBTSxDQUFDRyxNQUFNLEdBQUdnRDtJQUN6QjtJQUNBLGNBQWMsR0FDZHZDLHFCQUFxQjtRQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDZCxPQUFPLElBQUksSUFBSSxDQUFDQSxPQUFPLEtBQUssSUFBSSxDQUFDSixPQUFPLENBQUNjLFFBQVE7SUFDbEU7QUFDSixFQUNBLDRDQUE0QyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvUmVhbHRpbWVQcmVzZW5jZS5qcz9jZWMzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFRoaXMgZmlsZSBkcmF3cyBoZWF2aWx5IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peC9ibG9iL2QzNDRlYzBhNzMyYWI0ZWUyMDQyMTViMzFkZTY5Y2Y0YmU3MmUzYmYvYXNzZXRzL2pzL3Bob2VuaXgvcHJlc2VuY2UuanNcbiAgTGljZW5zZTogaHR0cHM6Ly9naXRodWIuY29tL3Bob2VuaXhmcmFtZXdvcmsvcGhvZW5peC9ibG9iL2QzNDRlYzBhNzMyYWI0ZWUyMDQyMTViMzFkZTY5Y2Y0YmU3MmUzYmYvTElDRU5TRS5tZFxuKi9cbmV4cG9ydCB2YXIgUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUztcbihmdW5jdGlvbiAoUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUykge1xuICAgIFJFQUxUSU1FX1BSRVNFTkNFX0xJU1RFTl9FVkVOVFNbXCJTWU5DXCJdID0gXCJzeW5jXCI7XG4gICAgUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UU1tcIkpPSU5cIl0gPSBcImpvaW5cIjtcbiAgICBSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTW1wiTEVBVkVcIl0gPSBcImxlYXZlXCI7XG59KShSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTIHx8IChSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTID0ge30pKTtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlYWx0aW1lUHJlc2VuY2Uge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBQcmVzZW5jZSBoZWxwZXIgdGhhdCBrZWVwcyB0aGUgbG9jYWwgcHJlc2VuY2Ugc3RhdGUgaW4gc3luYyB3aXRoIHRoZSBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbm5lbCAtIFRoZSByZWFsdGltZSBjaGFubmVsIHRvIGJpbmQgdG8uXG4gICAgICogQHBhcmFtIG9wdHMgLSBPcHRpb25hbCBjdXN0b20gZXZlbnQgbmFtZXMsIGUuZy4gYHsgZXZlbnRzOiB7IHN0YXRlOiAnc3RhdGUnLCBkaWZmOiAnZGlmZicgfSB9YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwcmVzZW5jZSA9IG5ldyBSZWFsdGltZVByZXNlbmNlKGNoYW5uZWwpXG4gICAgICpcbiAgICAgKiBjaGFubmVsLm9uKCdwcmVzZW5jZScsICh7IGV2ZW50LCBrZXkgfSkgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coYFByZXNlbmNlICR7ZXZlbnR9IG9uICR7a2V5fWApXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjaGFubmVsLCBvcHRzKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7fTtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXTtcbiAgICAgICAgdGhpcy5qb2luUmVmID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FsbGVyID0ge1xuICAgICAgICAgICAgb25Kb2luOiAoKSA9PiB7IH0sXG4gICAgICAgICAgICBvbkxlYXZlOiAoKSA9PiB7IH0sXG4gICAgICAgICAgICBvblN5bmM6ICgpID0+IHsgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXZlbnRzID0gKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5ldmVudHMpIHx8IHtcbiAgICAgICAgICAgIHN0YXRlOiAncHJlc2VuY2Vfc3RhdGUnLFxuICAgICAgICAgICAgZGlmZjogJ3ByZXNlbmNlX2RpZmYnLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNoYW5uZWwuX29uKGV2ZW50cy5zdGF0ZSwge30sIChuZXdTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBvbkpvaW4sIG9uTGVhdmUsIG9uU3luYyB9ID0gdGhpcy5jYWxsZXI7XG4gICAgICAgICAgICB0aGlzLmpvaW5SZWYgPSB0aGlzLmNoYW5uZWwuX2pvaW5SZWYoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBSZWFsdGltZVByZXNlbmNlLnN5bmNTdGF0ZSh0aGlzLnN0YXRlLCBuZXdTdGF0ZSwgb25Kb2luLCBvbkxlYXZlKTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0RpZmZzLmZvckVhY2goKGRpZmYpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gUmVhbHRpbWVQcmVzZW5jZS5zeW5jRGlmZih0aGlzLnN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdO1xuICAgICAgICAgICAgb25TeW5jKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoYW5uZWwuX29uKGV2ZW50cy5kaWZmLCB7fSwgKGRpZmYpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgb25Kb2luLCBvbkxlYXZlLCBvblN5bmMgfSA9IHRoaXMuY2FsbGVyO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5QZW5kaW5nU3luY1N0YXRlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdEaWZmcy5wdXNoKGRpZmYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFJlYWx0aW1lUHJlc2VuY2Uuc3luY0RpZmYodGhpcy5zdGF0ZSwgZGlmZiwgb25Kb2luLCBvbkxlYXZlKTtcbiAgICAgICAgICAgICAgICBvblN5bmMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25Kb2luKChrZXksIGN1cnJlbnRQcmVzZW5jZXMsIG5ld1ByZXNlbmNlcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGFubmVsLl90cmlnZ2VyKCdwcmVzZW5jZScsIHtcbiAgICAgICAgICAgICAgICBldmVudDogJ2pvaW4nLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBjdXJyZW50UHJlc2VuY2VzLFxuICAgICAgICAgICAgICAgIG5ld1ByZXNlbmNlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbkxlYXZlKChrZXksIGN1cnJlbnRQcmVzZW5jZXMsIGxlZnRQcmVzZW5jZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5fdHJpZ2dlcigncHJlc2VuY2UnLCB7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdsZWF2ZScsXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIGN1cnJlbnRQcmVzZW5jZXMsXG4gICAgICAgICAgICAgICAgbGVmdFByZXNlbmNlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vblN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGFubmVsLl90cmlnZ2VyKCdwcmVzZW5jZScsIHsgZXZlbnQ6ICdzeW5jJyB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gc3luYyB0aGUgbGlzdCBvZiBwcmVzZW5jZXMgb24gdGhlIHNlcnZlciB3aXRoIHRoZVxuICAgICAqIGNsaWVudCdzIHN0YXRlLlxuICAgICAqXG4gICAgICogQW4gb3B0aW9uYWwgYG9uSm9pbmAgYW5kIGBvbkxlYXZlYCBjYWxsYmFjayBjYW4gYmUgcHJvdmlkZWQgdG9cbiAgICAgKiByZWFjdCB0byBjaGFuZ2VzIGluIHRoZSBjbGllbnQncyBsb2NhbCBwcmVzZW5jZXMgYWNyb3NzXG4gICAgICogZGlzY29ubmVjdHMgYW5kIHJlY29ubmVjdHMgd2l0aCB0aGUgc2VydmVyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIHN5bmNTdGF0ZShjdXJyZW50U3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmNsb25lRGVlcChjdXJyZW50U3RhdGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFN0YXRlID0gdGhpcy50cmFuc2Zvcm1TdGF0ZShuZXdTdGF0ZSk7XG4gICAgICAgIGNvbnN0IGpvaW5zID0ge307XG4gICAgICAgIGNvbnN0IGxlYXZlcyA9IHt9O1xuICAgICAgICB0aGlzLm1hcChzdGF0ZSwgKGtleSwgcHJlc2VuY2VzKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRyYW5zZm9ybWVkU3RhdGVba2V5XSkge1xuICAgICAgICAgICAgICAgIGxlYXZlc1trZXldID0gcHJlc2VuY2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tYXAodHJhbnNmb3JtZWRTdGF0ZSwgKGtleSwgbmV3UHJlc2VuY2VzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UHJlc2VuY2VzID0gc3RhdGVba2V5XTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UHJlc2VuY2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UHJlc2VuY2VSZWZzID0gbmV3UHJlc2VuY2VzLm1hcCgobSkgPT4gbS5wcmVzZW5jZV9yZWYpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1clByZXNlbmNlUmVmcyA9IGN1cnJlbnRQcmVzZW5jZXMubWFwKChtKSA9PiBtLnByZXNlbmNlX3JlZik7XG4gICAgICAgICAgICAgICAgY29uc3Qgam9pbmVkUHJlc2VuY2VzID0gbmV3UHJlc2VuY2VzLmZpbHRlcigobSkgPT4gY3VyUHJlc2VuY2VSZWZzLmluZGV4T2YobS5wcmVzZW5jZV9yZWYpIDwgMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdFByZXNlbmNlcyA9IGN1cnJlbnRQcmVzZW5jZXMuZmlsdGVyKChtKSA9PiBuZXdQcmVzZW5jZVJlZnMuaW5kZXhPZihtLnByZXNlbmNlX3JlZikgPCAwKTtcbiAgICAgICAgICAgICAgICBpZiAoam9pbmVkUHJlc2VuY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgam9pbnNba2V5XSA9IGpvaW5lZFByZXNlbmNlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxlZnRQcmVzZW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZWF2ZXNba2V5XSA9IGxlZnRQcmVzZW5jZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNEaWZmKHN0YXRlLCB7IGpvaW5zLCBsZWF2ZXMgfSwgb25Kb2luLCBvbkxlYXZlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlZCB0byBzeW5jIGEgZGlmZiBvZiBwcmVzZW5jZSBqb2luIGFuZCBsZWF2ZSBldmVudHMgZnJvbSB0aGVcbiAgICAgKiBzZXJ2ZXIsIGFzIHRoZXkgaGFwcGVuLlxuICAgICAqXG4gICAgICogTGlrZSBgc3luY1N0YXRlYCwgYHN5bmNEaWZmYCBhY2NlcHRzIG9wdGlvbmFsIGBvbkpvaW5gIGFuZFxuICAgICAqIGBvbkxlYXZlYCBjYWxsYmFja3MgdG8gcmVhY3QgdG8gYSB1c2VyIGpvaW5pbmcgb3IgbGVhdmluZyBmcm9tIGFcbiAgICAgKiBkZXZpY2UuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgc3luY0RpZmYoc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSkge1xuICAgICAgICBjb25zdCB7IGpvaW5zLCBsZWF2ZXMgfSA9IHtcbiAgICAgICAgICAgIGpvaW5zOiB0aGlzLnRyYW5zZm9ybVN0YXRlKGRpZmYuam9pbnMpLFxuICAgICAgICAgICAgbGVhdmVzOiB0aGlzLnRyYW5zZm9ybVN0YXRlKGRpZmYubGVhdmVzKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFvbkpvaW4pIHtcbiAgICAgICAgICAgIG9uSm9pbiA9ICgpID0+IHsgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9uTGVhdmUpIHtcbiAgICAgICAgICAgIG9uTGVhdmUgPSAoKSA9PiB7IH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXAoam9pbnMsIChrZXksIG5ld1ByZXNlbmNlcykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFByZXNlbmNlcyA9IChfYSA9IHN0YXRlW2tleV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICAgICAgc3RhdGVba2V5XSA9IHRoaXMuY2xvbmVEZWVwKG5ld1ByZXNlbmNlcyk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFByZXNlbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgam9pbmVkUHJlc2VuY2VSZWZzID0gc3RhdGVba2V5XS5tYXAoKG0pID0+IG0ucHJlc2VuY2VfcmVmKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJQcmVzZW5jZXMgPSBjdXJyZW50UHJlc2VuY2VzLmZpbHRlcigobSkgPT4gam9pbmVkUHJlc2VuY2VSZWZzLmluZGV4T2YobS5wcmVzZW5jZV9yZWYpIDwgMCk7XG4gICAgICAgICAgICAgICAgc3RhdGVba2V5XS51bnNoaWZ0KC4uLmN1clByZXNlbmNlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvbkpvaW4oa2V5LCBjdXJyZW50UHJlc2VuY2VzLCBuZXdQcmVzZW5jZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tYXAobGVhdmVzLCAoa2V5LCBsZWZ0UHJlc2VuY2VzKSA9PiB7XG4gICAgICAgICAgICBsZXQgY3VycmVudFByZXNlbmNlcyA9IHN0YXRlW2tleV07XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRQcmVzZW5jZXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcHJlc2VuY2VSZWZzVG9SZW1vdmUgPSBsZWZ0UHJlc2VuY2VzLm1hcCgobSkgPT4gbS5wcmVzZW5jZV9yZWYpO1xuICAgICAgICAgICAgY3VycmVudFByZXNlbmNlcyA9IGN1cnJlbnRQcmVzZW5jZXMuZmlsdGVyKChtKSA9PiBwcmVzZW5jZVJlZnNUb1JlbW92ZS5pbmRleE9mKG0ucHJlc2VuY2VfcmVmKSA8IDApO1xuICAgICAgICAgICAgc3RhdGVba2V5XSA9IGN1cnJlbnRQcmVzZW5jZXM7XG4gICAgICAgICAgICBvbkxlYXZlKGtleSwgY3VycmVudFByZXNlbmNlcywgbGVmdFByZXNlbmNlcyk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFByZXNlbmNlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgZGVsZXRlIHN0YXRlW2tleV07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBzdGF0aWMgbWFwKG9iaiwgZnVuYykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5tYXAoKGtleSkgPT4gZnVuYyhrZXksIG9ialtrZXldKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSAnbWV0YXMnIGtleVxuICAgICAqIENoYW5nZSAncGh4X3JlZicgdG8gJ3ByZXNlbmNlX3JlZidcbiAgICAgKiBSZW1vdmUgJ3BoeF9yZWYnIGFuZCAncGh4X3JlZl9wcmV2J1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyByZXR1cm5zIHtcbiAgICAgKiAgYWJjMTIzOiBbXG4gICAgICogICAgeyBwcmVzZW5jZV9yZWY6ICcyJywgdXNlcl9pZDogMSB9LFxuICAgICAqICAgIHsgcHJlc2VuY2VfcmVmOiAnMycsIHVzZXJfaWQ6IDIgfVxuICAgICAqICBdXG4gICAgICogfVxuICAgICAqIFJlYWx0aW1lUHJlc2VuY2UudHJhbnNmb3JtU3RhdGUoe1xuICAgICAqICBhYmMxMjM6IHtcbiAgICAgKiAgICBtZXRhczogW1xuICAgICAqICAgICAgeyBwaHhfcmVmOiAnMicsIHBoeF9yZWZfcHJldjogJzEnIHVzZXJfaWQ6IDEgfSxcbiAgICAgKiAgICAgIHsgcGh4X3JlZjogJzMnLCB1c2VyX2lkOiAyIH1cbiAgICAgKiAgICBdXG4gICAgICogIH1cbiAgICAgKiB9KVxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIHRyYW5zZm9ybVN0YXRlKHN0YXRlKSB7XG4gICAgICAgIHN0YXRlID0gdGhpcy5jbG9uZURlZXAoc3RhdGUpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc3RhdGUpLnJlZHVjZSgobmV3U3RhdGUsIGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlc2VuY2VzID0gc3RhdGVba2V5XTtcbiAgICAgICAgICAgIGlmICgnbWV0YXMnIGluIHByZXNlbmNlcykge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlW2tleV0gPSBwcmVzZW5jZXMubWV0YXMubWFwKChwcmVzZW5jZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcmVzZW5jZVsncHJlc2VuY2VfcmVmJ10gPSBwcmVzZW5jZVsncGh4X3JlZiddO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHJlc2VuY2VbJ3BoeF9yZWYnXTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHByZXNlbmNlWydwaHhfcmVmX3ByZXYnXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXNlbmNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhdGVba2V5XSA9IHByZXNlbmNlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgICAgfSwge30pO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgc3RhdGljIGNsb25lRGVlcChvYmopIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBvbkpvaW4oY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5jYWxsZXIub25Kb2luID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBvbkxlYXZlKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLm9uTGVhdmUgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIG9uU3luYyhjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmNhbGxlci5vblN5bmMgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGluUGVuZGluZ1N5bmNTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmpvaW5SZWYgfHwgdGhpcy5qb2luUmVmICE9PSB0aGlzLmNoYW5uZWwuX2pvaW5SZWYoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWFsdGltZVByZXNlbmNlLmpzLm1hcCJdLCJuYW1lcyI6WyJSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTIiwiUmVhbHRpbWVQcmVzZW5jZSIsImNvbnN0cnVjdG9yIiwiY2hhbm5lbCIsIm9wdHMiLCJzdGF0ZSIsInBlbmRpbmdEaWZmcyIsImpvaW5SZWYiLCJlbmFibGVkIiwiY2FsbGVyIiwib25Kb2luIiwib25MZWF2ZSIsIm9uU3luYyIsImV2ZW50cyIsImRpZmYiLCJfb24iLCJuZXdTdGF0ZSIsIl9qb2luUmVmIiwic3luY1N0YXRlIiwiZm9yRWFjaCIsInN5bmNEaWZmIiwiaW5QZW5kaW5nU3luY1N0YXRlIiwicHVzaCIsImtleSIsImN1cnJlbnRQcmVzZW5jZXMiLCJuZXdQcmVzZW5jZXMiLCJfdHJpZ2dlciIsImV2ZW50IiwibGVmdFByZXNlbmNlcyIsImN1cnJlbnRTdGF0ZSIsImNsb25lRGVlcCIsInRyYW5zZm9ybWVkU3RhdGUiLCJ0cmFuc2Zvcm1TdGF0ZSIsImpvaW5zIiwibGVhdmVzIiwibWFwIiwicHJlc2VuY2VzIiwibmV3UHJlc2VuY2VSZWZzIiwibSIsInByZXNlbmNlX3JlZiIsImN1clByZXNlbmNlUmVmcyIsImpvaW5lZFByZXNlbmNlcyIsImZpbHRlciIsImluZGV4T2YiLCJsZW5ndGgiLCJfYSIsImpvaW5lZFByZXNlbmNlUmVmcyIsImN1clByZXNlbmNlcyIsInVuc2hpZnQiLCJwcmVzZW5jZVJlZnNUb1JlbW92ZSIsIm9iaiIsImZ1bmMiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicmVkdWNlIiwibWV0YXMiLCJwcmVzZW5jZSIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsImNhbGxiYWNrIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js":
|
||
/*!****************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js ***!
|
||
\****************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_PRESENCE_LISTEN_EVENTS: () => (/* binding */ REALTIME_PRESENCE_LISTEN_EVENTS),\n/* harmony export */ \"default\": () => (/* 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 * 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 /**\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} //# sourceMappingURL=RealtimePresence.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lUHJlc2VuY2UuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7O0FBR0EsR0FDTyxJQUFJQSxnQ0FBZ0M7QUFDMUMsVUFBVUEsK0JBQStCO0lBQ3RDQSwrQkFBK0IsQ0FBQyxPQUFPLEdBQUc7SUFDMUNBLCtCQUErQixDQUFDLE9BQU8sR0FBRztJQUMxQ0EsK0JBQStCLENBQUMsUUFBUSxHQUFHO0FBQy9DLEdBQUdBLG1DQUFvQ0EsQ0FBQUEsa0NBQWtDLENBQUM7QUFDM0QsTUFBTUM7SUFDakI7Ozs7Ozs7Ozs7Ozs7O0tBY0MsR0FDREMsWUFBWUMsT0FBTyxFQUFFQyxJQUFJLENBQUU7UUFDdkIsSUFBSSxDQUFDRCxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDRSxLQUFLLEdBQUcsQ0FBQztRQUNkLElBQUksQ0FBQ0MsWUFBWSxHQUFHLEVBQUU7UUFDdEIsSUFBSSxDQUFDQyxPQUFPLEdBQUc7UUFDZixJQUFJLENBQUNDLE9BQU8sR0FBRztRQUNmLElBQUksQ0FBQ0MsTUFBTSxHQUFHO1lBQ1ZDLFFBQVEsS0FBUTtZQUNoQkMsU0FBUyxLQUFRO1lBQ2pCQyxRQUFRLEtBQVE7UUFDcEI7UUFDQSxNQUFNQyxTQUFTLENBQUNULFNBQVMsUUFBUUEsU0FBUyxLQUFLLElBQUksS0FBSyxJQUFJQSxLQUFLUyxNQUFNLEtBQUs7WUFDeEVSLE9BQU87WUFDUFMsTUFBTTtRQUNWO1FBQ0EsSUFBSSxDQUFDWCxPQUFPLENBQUNZLEdBQUcsQ0FBQ0YsT0FBT1IsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDVztZQUNoQyxNQUFNLEVBQUVOLE1BQU0sRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUNILE1BQU07WUFDL0MsSUFBSSxDQUFDRixPQUFPLEdBQUcsSUFBSSxDQUFDSixPQUFPLENBQUNjLFFBQVE7WUFDcEMsSUFBSSxDQUFDWixLQUFL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QyxVQUFVO29CQUMxQixPQUFPQSxRQUFRLENBQUMsZUFBZTtvQkFDL0IsT0FBT0E7Z0JBQ1g7WUFDSixPQUNLO2dCQUNEeEMsUUFBUSxDQUFDTyxJQUFJLEdBQUdhO1lBQ3BCO1lBQ0EsT0FBT3BCO1FBQ1gsR0FBRyxDQUFDO0lBQ1I7SUFDQSxjQUFjLEdBQ2QsT0FBT2MsVUFBVW9CLEdBQUcsRUFBRTtRQUNsQixPQUFPTyxLQUFLQyxLQUFLLENBQUNELEtBQUtFLFNBQVMsQ0FBQ1Q7SUFDckM7SUFDQSxjQUFjLEdBQ2R4QyxPQUFPa0QsUUFBUSxFQUFFO1FBQ2IsSUFBSSxDQUFDbkQsTUFBTSxDQUFDQyxNQUFNLEdBQUdrRDtJQUN6QjtJQUNBLGNBQWMsR0FDZGpELFFBQVFpRCxRQUFRLEVBQUU7UUFDZCxJQUFJLENBQUNuRCxNQUFNLENBQUNFLE9BQU8sR0FBR2lEO0lBQzFCO0lBQ0EsY0FBYyxHQUNkaEQsT0FBT2dELFFBQVEsRUFBRTtRQUNiLElBQUksQ0FBQ25ELE1BQU0sQ0FBQ0csTUFBTSxHQUFHZ0Q7SUFDekI7SUFDQSxjQUFjLEdBQ2R2QyxxQkFBcUI7UUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQ2QsT0FBTyxJQUFJLElBQUksQ0FBQ0EsT0FBTyxLQUFLLElBQUksQ0FBQ0osT0FBTyxDQUFDYyxRQUFRO0lBQ2xFO0FBQ0osRUFDQSw0Q0FBNEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL1JlYWx0aW1lUHJlc2VuY2UuanM/Y2VjMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBUaGlzIGZpbGUgZHJhd3MgaGVhdmlseSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXgvYmxvYi9kMzQ0ZWMwYTczMmFiNGVlMjA0MjE1YjMxZGU2OWNmNGJlNzJlM2JmL2Fzc2V0cy9qcy9waG9lbml4L3ByZXNlbmNlLmpzXG4gIExpY2Vuc2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9waG9lbml4ZnJhbWV3b3JrL3Bob2VuaXgvYmxvYi9kMzQ0ZWMwYTczMmFiNGVlMjA0MjE1YjMxZGU2OWNmNGJlNzJlM2JmL0xJQ0VOU0UubWRcbiovXG5leHBvcnQgdmFyIFJFQUxUSU1FX1BSRVNFTkNFX0xJU1RFTl9FVkVOVFM7XG4oZnVuY3Rpb24gKFJFQUxUSU1FX1BSRVNFTkNFX0xJU1RFTl9FVkVOVFMpIHtcbiAgICBSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTW1wiU1lOQ1wiXSA9IFwic3luY1wiO1xuICAgIFJFQUxUSU1FX1BSRVNFTkNFX0xJU1RFTl9FVkVOVFNbXCJKT0lOXCJdID0gXCJqb2luXCI7XG4gICAgUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UU1tcIkxFQVZFXCJdID0gXCJsZWF2ZVwiO1xufSkoUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUyB8fCAoUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUyA9IHt9KSk7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWFsdGltZVByZXNlbmNlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUHJlc2VuY2UgaGVscGVyIHRoYXQga2VlcHMgdGhlIGxvY2FsIHByZXNlbmNlIHN0YXRlIGluIHN5bmMgd2l0aCB0aGUgc2VydmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5uZWwgLSBUaGUgcmVhbHRpbWUgY2hhbm5lbCB0byBiaW5kIHRvLlxuICAgICAqIEBwYXJhbSBvcHRzIC0gT3B0aW9uYWwgY3VzdG9tIGV2ZW50IG5hbWVzLCBlLmcuIGB7IGV2ZW50czogeyBzdGF0ZTogJ3N0YXRlJywgZGlmZjogJ2RpZmYnIH0gfWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcHJlc2VuY2UgPSBuZXcgUmVhbHRpbWVQcmVzZW5jZShjaGFubmVsKVxuICAgICAqXG4gICAgICogY2hhbm5lbC5vbigncHJlc2VuY2UnLCAoeyBldmVudCwga2V5IH0pID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQcmVzZW5jZSAke2V2ZW50fSBvbiAke2tleX1gKVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2hhbm5lbCwgb3B0cykge1xuICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuICAgICAgICB0aGlzLnN0YXRlID0ge307XG4gICAgICAgIHRoaXMucGVuZGluZ0RpZmZzID0gW107XG4gICAgICAgIHRoaXMuam9pblJlZiA9IG51bGw7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgICAgICAgIG9uSm9pbjogKCkgPT4geyB9LFxuICAgICAgICAgICAgb25MZWF2ZTogKCkgPT4geyB9LFxuICAgICAgICAgICAgb25TeW5jOiAoKSA9PiB7IH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMuZXZlbnRzKSB8fCB7XG4gICAgICAgICAgICBzdGF0ZTogJ3ByZXNlbmNlX3N0YXRlJyxcbiAgICAgICAgICAgIGRpZmY6ICdwcmVzZW5jZV9kaWZmJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jaGFubmVsLl9vbihldmVudHMuc3RhdGUsIHt9LCAobmV3U3RhdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgb25Kb2luLCBvbkxlYXZlLCBvblN5bmMgfSA9IHRoaXMuY2FsbGVyO1xuICAgICAgICAgICAgdGhpcy5qb2luUmVmID0gdGhpcy5jaGFubmVsLl9qb2luUmVmKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gUmVhbHRpbWVQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdEaWZmcy5mb3JFYWNoKChkaWZmKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFJlYWx0aW1lUHJlc2VuY2Uuc3luY0RpZmYodGhpcy5zdGF0ZSwgZGlmZiwgb25Kb2luLCBvbkxlYXZlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXTtcbiAgICAgICAgICAgIG9uU3luYygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGFubmVsLl9vbihldmVudHMuZGlmZiwge30sIChkaWZmKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG9uSm9pbiwgb25MZWF2ZSwgb25TeW5jIH0gPSB0aGlzLmNhbGxlcjtcbiAgICAgICAgICAgIGlmICh0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBSZWFsdGltZVByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSk7XG4gICAgICAgICAgICAgICAgb25TeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uSm9pbigoa2V5LCBjdXJyZW50UHJlc2VuY2VzLCBuZXdQcmVzZW5jZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5fdHJpZ2dlcigncHJlc2VuY2UnLCB7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdqb2luJyxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgY3VycmVudFByZXNlbmNlcyxcbiAgICAgICAgICAgICAgICBuZXdQcmVzZW5jZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25MZWF2ZSgoa2V5LCBjdXJyZW50UHJlc2VuY2VzLCBsZWZ0UHJlc2VuY2VzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWwuX3RyaWdnZXIoJ3ByZXNlbmNlJywge1xuICAgICAgICAgICAgICAgIGV2ZW50OiAnbGVhdmUnLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBjdXJyZW50UHJlc2VuY2VzLFxuICAgICAgICAgICAgICAgIGxlZnRQcmVzZW5jZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25TeW5jKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5fdHJpZ2dlcigncHJlc2VuY2UnLCB7IGV2ZW50OiAnc3luYycgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHN5bmMgdGhlIGxpc3Qgb2YgcHJlc2VuY2VzIG9uIHRoZSBzZXJ2ZXIgd2l0aCB0aGVcbiAgICAgKiBjbGllbnQncyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEFuIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2sgY2FuIGJlIHByb3ZpZGVkIHRvXG4gICAgICogcmVhY3QgdG8gY2hhbmdlcyBpbiB0aGUgY2xpZW50J3MgbG9jYWwgcHJlc2VuY2VzIGFjcm9zc1xuICAgICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBzeW5jU3RhdGUoY3VycmVudFN0YXRlLCBuZXdTdGF0ZSwgb25Kb2luLCBvbkxlYXZlKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jbG9uZURlZXAoY3VycmVudFN0YXRlKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRTdGF0ZSA9IHRoaXMudHJhbnNmb3JtU3RhdGUobmV3U3RhdGUpO1xuICAgICAgICBjb25zdCBqb2lucyA9IHt9O1xuICAgICAgICBjb25zdCBsZWF2ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5tYXAoc3RhdGUsIChrZXksIHByZXNlbmNlcykgPT4ge1xuICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1lZFN0YXRlW2tleV0pIHtcbiAgICAgICAgICAgICAgICBsZWF2ZXNba2V5XSA9IHByZXNlbmNlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFwKHRyYW5zZm9ybWVkU3RhdGUsIChrZXksIG5ld1ByZXNlbmNlcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFByZXNlbmNlcyA9IHN0YXRlW2tleV07XG4gICAgICAgICAgICBpZiAoY3VycmVudFByZXNlbmNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ByZXNlbmNlUmVmcyA9IG5ld1ByZXNlbmNlcy5tYXAoKG0pID0+IG0ucHJlc2VuY2VfcmVmKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJQcmVzZW5jZVJlZnMgPSBjdXJyZW50UHJlc2VuY2VzLm1hcCgobSkgPT4gbS5wcmVzZW5jZV9yZWYpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvaW5lZFByZXNlbmNlcyA9IG5ld1ByZXNlbmNlcy5maWx0ZXIoKG0pID0+IGN1clByZXNlbmNlUmVmcy5pbmRleE9mKG0ucHJlc2VuY2VfcmVmKSA8IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnRQcmVzZW5jZXMgPSBjdXJyZW50UHJlc2VuY2VzLmZpbHRlcigobSkgPT4gbmV3UHJlc2VuY2VSZWZzLmluZGV4T2YobS5wcmVzZW5jZV9yZWYpIDwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKGpvaW5lZFByZXNlbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGpvaW5zW2tleV0gPSBqb2luZWRQcmVzZW5jZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsZWZ0UHJlc2VuY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhdmVzW2tleV0gPSBsZWZ0UHJlc2VuY2VzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGpvaW5zW2tleV0gPSBuZXdQcmVzZW5jZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwgeyBqb2lucywgbGVhdmVzIH0sIG9uSm9pbiwgb25MZWF2ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gc3luYyBhIGRpZmYgb2YgcHJlc2VuY2Ugam9pbiBhbmQgbGVhdmUgZXZlbnRzIGZyb20gdGhlXG4gICAgICogc2VydmVyLCBhcyB0aGV5IGhhcHBlbi5cbiAgICAgKlxuICAgICAqIExpa2UgYHN5bmNTdGF0ZWAsIGBzeW5jRGlmZmAgYWNjZXB0cyBvcHRpb25hbCBgb25Kb2luYCBhbmRcbiAgICAgKiBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlciBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhXG4gICAgICogZGV2aWNlLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpIHtcbiAgICAgICAgY29uc3QgeyBqb2lucywgbGVhdmVzIH0gPSB7XG4gICAgICAgICAgICBqb2luczogdGhpcy50cmFuc2Zvcm1TdGF0ZShkaWZmLmpvaW5zKSxcbiAgICAgICAgICAgIGxlYXZlczogdGhpcy50cmFuc2Zvcm1TdGF0ZShkaWZmLmxlYXZlcyksXG4gICAgICAgIH07XG4gICAgICAgIGlmICghb25Kb2luKSB7XG4gICAgICAgICAgICBvbkpvaW4gPSAoKSA9PiB7IH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvbkxlYXZlKSB7XG4gICAgICAgICAgICBvbkxlYXZlID0gKCkgPT4geyB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFwKGpvaW5zLCAoa2V5LCBuZXdQcmVzZW5jZXMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcmVzZW5jZXMgPSAoX2EgPSBzdGF0ZVtrZXldKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgICAgIHN0YXRlW2tleV0gPSB0aGlzLmNsb25lRGVlcChuZXdQcmVzZW5jZXMpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQcmVzZW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvaW5lZFByZXNlbmNlUmVmcyA9IHN0YXRlW2tleV0ubWFwKChtKSA9PiBtLnByZXNlbmNlX3JlZik7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VyUHJlc2VuY2VzID0gY3VycmVudFByZXNlbmNlcy5maWx0ZXIoKG0pID0+IGpvaW5lZFByZXNlbmNlUmVmcy5pbmRleE9mKG0ucHJlc2VuY2VfcmVmKSA8IDApO1xuICAgICAgICAgICAgICAgIHN0YXRlW2tleV0udW5zaGlmdCguLi5jdXJQcmVzZW5jZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25Kb2luKGtleSwgY3VycmVudFByZXNlbmNlcywgbmV3UHJlc2VuY2VzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFwKGxlYXZlcywgKGtleSwgbGVmdFByZXNlbmNlcykgPT4ge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZXMgPSBzdGF0ZVtrZXldO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50UHJlc2VuY2VzKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbmNlUmVmc1RvUmVtb3ZlID0gbGVmdFByZXNlbmNlcy5tYXAoKG0pID0+IG0ucHJlc2VuY2VfcmVmKTtcbiAgICAgICAgICAgIGN1cnJlbnRQcmVzZW5jZXMgPSBjdXJyZW50UHJlc2VuY2VzLmZpbHRlcigobSkgPT4gcHJlc2VuY2VSZWZzVG9SZW1vdmUuaW5kZXhPZihtLnByZXNlbmNlX3JlZikgPCAwKTtcbiAgICAgICAgICAgIHN0YXRlW2tleV0gPSBjdXJyZW50UHJlc2VuY2VzO1xuICAgICAgICAgICAgb25MZWF2ZShrZXksIGN1cnJlbnRQcmVzZW5jZXMsIGxlZnRQcmVzZW5jZXMpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQcmVzZW5jZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBzdGF0ZVtrZXldO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgc3RhdGljIG1hcChvYmosIGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKChrZXkpID0+IGZ1bmMoa2V5LCBvYmpba2V5XSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgJ21ldGFzJyBrZXlcbiAgICAgKiBDaGFuZ2UgJ3BoeF9yZWYnIHRvICdwcmVzZW5jZV9yZWYnXG4gICAgICogUmVtb3ZlICdwaHhfcmVmJyBhbmQgJ3BoeF9yZWZfcHJldidcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gcmV0dXJucyB7XG4gICAgICogIGFiYzEyMzogW1xuICAgICAqICAgIHsgcHJlc2VuY2VfcmVmOiAnMicsIHVzZXJfaWQ6IDEgfSxcbiAgICAgKiAgICB7IHByZXNlbmNlX3JlZjogJzMnLCB1c2VyX2lkOiAyIH1cbiAgICAgKiAgXVxuICAgICAqIH1cbiAgICAgKiBSZWFsdGltZVByZXNlbmNlLnRyYW5zZm9ybVN0YXRlKHtcbiAgICAgKiAgYWJjMTIzOiB7XG4gICAgICogICAgbWV0YXM6IFtcbiAgICAgKiAgICAgIHsgcGh4X3JlZjogJzInLCBwaHhfcmVmX3ByZXY6ICcxJyB1c2VyX2lkOiAxIH0sXG4gICAgICogICAgICB7IHBoeF9yZWY6ICczJywgdXNlcl9pZDogMiB9XG4gICAgICogICAgXVxuICAgICAqICB9XG4gICAgICogfSlcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyB0cmFuc2Zvcm1TdGF0ZShzdGF0ZSkge1xuICAgICAgICBzdGF0ZSA9IHRoaXMuY2xvbmVEZWVwKHN0YXRlKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHN0YXRlKS5yZWR1Y2UoKG5ld1N0YXRlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbmNlcyA9IHN0YXRlW2tleV07XG4gICAgICAgICAgICBpZiAoJ21ldGFzJyBpbiBwcmVzZW5jZXMpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZVtrZXldID0gcHJlc2VuY2VzLm1ldGFzLm1hcCgocHJlc2VuY2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcHJlc2VuY2VbJ3ByZXNlbmNlX3JlZiddID0gcHJlc2VuY2VbJ3BoeF9yZWYnXTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHByZXNlbmNlWydwaHhfcmVmJ107XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwcmVzZW5jZVsncGh4X3JlZl9wcmV2J107XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmVzZW5jZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlW2tleV0gPSBwcmVzZW5jZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHN0YXRpYyBjbG9uZURlZXAob2JqKSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgb25Kb2luKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLm9uSm9pbiA9IGNhbGxiYWNrO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgb25MZWF2ZShjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBvblN5bmMoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5jYWxsZXIub25TeW5jID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBpblBlbmRpbmdTeW5jU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5qb2luUmVmIHx8IHRoaXMuam9pblJlZiAhPT0gdGhpcy5jaGFubmVsLl9qb2luUmVmKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVhbHRpbWVQcmVzZW5jZS5qcy5tYXAiXSwibmFtZXMiOlsiUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUyIsIlJlYWx0aW1lUHJlc2VuY2UiLCJjb25zdHJ1Y3RvciIsImNoYW5uZWwiLCJvcHRzIiwic3RhdGUiLCJwZW5kaW5nRGlmZnMiLCJqb2luUmVmIiwiZW5hYmxlZCIsImNhbGxlciIsIm9uSm9pbiIsIm9uTGVhdmUiLCJvblN5bmMiLCJldmVudHMiLCJkaWZmIiwiX29uIiwibmV3U3RhdGUiLCJfam9pblJlZiIsInN5bmNTdGF0ZSIsImZvckVhY2giLCJzeW5jRGlmZiIsImluUGVuZGluZ1N5bmNTdGF0ZSIsInB1c2giLCJrZXkiLCJjdXJyZW50UHJlc2VuY2VzIiwibmV3UHJlc2VuY2VzIiwiX3RyaWdnZXIiLCJldmVudCIsImxlZnRQcmVzZW5jZXMiLCJjdXJyZW50U3RhdGUiLCJjbG9uZURlZXAiLCJ0cmFuc2Zvcm1lZFN0YXRlIiwidHJhbnNmb3JtU3RhdGUiLCJqb2lucyIsImxlYXZlcyIsIm1hcCIsInByZXNlbmNlcyIsIm5ld1ByZXNlbmNlUmVmcyIsIm0iLCJwcmVzZW5jZV9yZWYiLCJjdXJQcmVzZW5jZVJlZnMiLCJqb2luZWRQcmVzZW5jZXMiLCJmaWx0ZXIiLCJpbmRleE9mIiwibGVuZ3RoIiwiX2EiLCJqb2luZWRQcmVzZW5jZVJlZnMiLCJjdXJQcmVzZW5jZXMiLCJ1bnNoaWZ0IiwicHJlc2VuY2VSZWZzVG9SZW1vdmUiLCJvYmoiLCJmdW5jIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInJlZHVjZSIsIm1ldGFzIiwicHJlc2VuY2UiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJjYWxsYmFjayJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/realtime-js/dist/module/RealtimePresence.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/realtime-js/dist/module/index.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/index.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_CHANNEL_STATES: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_CHANNEL_STATES),\n/* harmony export */ REALTIME_LISTEN_TYPES: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_LISTEN_TYPES),\n/* harmony export */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_POSTGRES_CHANGES_LISTEN_EVENT),\n/* harmony export */ REALTIME_PRESENCE_LISTEN_EVENTS: () => (/* reexport safe */ _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__.REALTIME_PRESENCE_LISTEN_EVENTS),\n/* harmony export */ REALTIME_SUBSCRIBE_STATES: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_SUBSCRIBE_STATES),\n/* harmony export */ RealtimeChannel: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__[\"default\"]),\n/* harmony export */ RealtimeClient: () => (/* reexport safe */ _RealtimeClient__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ RealtimePresence: () => (/* reexport safe */ _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ WebSocketFactory: () => (/* 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 */ \"(action-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js\");\n/* harmony import */ var _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RealtimeChannel */ \"(action-browser)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js\");\n/* harmony import */ var _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RealtimePresence */ \"(action-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 */ \"(action-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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUE4QztBQUMwSDtBQUNoRjtBQUNqQztBQUM2SyxDQUNwTyxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2luZGV4LmpzPzU1NWQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWx0aW1lQ2xpZW50IGZyb20gJy4vUmVhbHRpbWVDbGllbnQnO1xuaW1wb3J0IFJlYWx0aW1lQ2hhbm5lbCwgeyBSRUFMVElNRV9MSVNURU5fVFlQRVMsIFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5ULCBSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTLCBSRUFMVElNRV9DSEFOTkVMX1NUQVRFUywgfSBmcm9tICcuL1JlYWx0aW1lQ2hhbm5lbCc7XG5pbXBvcnQgUmVhbHRpbWVQcmVzZW5jZSwgeyBSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTLCB9IGZyb20gJy4vUmVhbHRpbWVQcmVzZW5jZSc7XG5pbXBvcnQgV2ViU29ja2V0RmFjdG9yeSBmcm9tICcuL2xpYi93ZWJzb2NrZXQtZmFjdG9yeSc7XG5leHBvcnQgeyBSZWFsdGltZVByZXNlbmNlLCBSZWFsdGltZUNoYW5uZWwsIFJlYWx0aW1lQ2xpZW50LCBSRUFMVElNRV9MSVNURU5fVFlQRVMsIFJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5ULCBSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTLCBSRUFMVElNRV9TVUJTQ1JJQkVfU1RBVEVTLCBSRUFMVElNRV9DSEFOTkVMX1NUQVRFUywgV2ViU29ja2V0RmFjdG9yeSwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJuYW1lcyI6WyJSZWFsdGltZUNsaWVudCIsIlJlYWx0aW1lQ2hhbm5lbCIsIlJFQUxUSU1FX0xJU1RFTl9UWVBFUyIsIlJFQUxUSU1FX1BPU1RHUkVTX0NIQU5HRVNfTElTVEVOX0VWRU5UIiwiUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUyIsIlJFQUxUSU1FX0NIQU5ORUxfU1RBVEVTIiwiUmVhbHRpbWVQcmVzZW5jZSIsIlJFQUxUSU1FX1BSRVNFTkNFX0xJU1RFTl9FVkVOVFMiLCJXZWJTb2NrZXRGYWN0b3J5Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/realtime-js/dist/module/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/realtime-js/dist/module/index.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/index.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ REALTIME_CHANNEL_STATES: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_CHANNEL_STATES),\n/* harmony export */ REALTIME_LISTEN_TYPES: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_LISTEN_TYPES),\n/* harmony export */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_POSTGRES_CHANGES_LISTEN_EVENT),\n/* harmony export */ REALTIME_PRESENCE_LISTEN_EVENTS: () => (/* reexport safe */ _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__.REALTIME_PRESENCE_LISTEN_EVENTS),\n/* harmony export */ REALTIME_SUBSCRIBE_STATES: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__.REALTIME_SUBSCRIBE_STATES),\n/* harmony export */ RealtimeChannel: () => (/* reexport safe */ _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__[\"default\"]),\n/* harmony export */ RealtimeClient: () => (/* reexport safe */ _RealtimeClient__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ RealtimePresence: () => (/* reexport safe */ _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ WebSocketFactory: () => (/* 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 */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/RealtimeClient.js\");\n/* harmony import */ var _RealtimeChannel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RealtimeChannel */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/RealtimeChannel.js\");\n/* harmony import */ var _RealtimePresence__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RealtimePresence */ \"(rsc)/./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 */ \"(rsc)/./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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2luZGV4LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBOEM7QUFDMEg7QUFDaEY7QUFDakM7QUFDNkssQ0FDcE8saUNBQWlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9pbmRleC5qcz81NTVkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFsdGltZUNsaWVudCBmcm9tICcuL1JlYWx0aW1lQ2xpZW50JztcbmltcG9ydCBSZWFsdGltZUNoYW5uZWwsIHsgUkVBTFRJTUVfTElTVEVOX1RZUEVTLCBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCwgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUywgUkVBTFRJTUVfQ0hBTk5FTF9TVEFURVMsIH0gZnJvbSAnLi9SZWFsdGltZUNoYW5uZWwnO1xuaW1wb3J0IFJlYWx0aW1lUHJlc2VuY2UsIHsgUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUywgfSBmcm9tICcuL1JlYWx0aW1lUHJlc2VuY2UnO1xuaW1wb3J0IFdlYlNvY2tldEZhY3RvcnkgZnJvbSAnLi9saWIvd2Vic29ja2V0LWZhY3RvcnknO1xuZXhwb3J0IHsgUmVhbHRpbWVQcmVzZW5jZSwgUmVhbHRpbWVDaGFubmVsLCBSZWFsdGltZUNsaWVudCwgUkVBTFRJTUVfTElTVEVOX1RZUEVTLCBSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCwgUkVBTFRJTUVfUFJFU0VOQ0VfTElTVEVOX0VWRU5UUywgUkVBTFRJTUVfU1VCU0NSSUJFX1NUQVRFUywgUkVBTFRJTUVfQ0hBTk5FTF9TVEFURVMsIFdlYlNvY2tldEZhY3RvcnksIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwibmFtZXMiOlsiUmVhbHRpbWVDbGllbnQiLCJSZWFsdGltZUNoYW5uZWwiLCJSRUFMVElNRV9MSVNURU5fVFlQRVMiLCJSRUFMVElNRV9QT1NUR1JFU19DSEFOR0VTX0xJU1RFTl9FVkVOVCIsIlJFQUxUSU1FX1NVQlNDUklCRV9TVEFURVMiLCJSRUFMVElNRV9DSEFOTkVMX1NUQVRFUyIsIlJlYWx0aW1lUHJlc2VuY2UiLCJSRUFMVElNRV9QUkVTRU5DRV9MSVNURU5fRVZFTlRTIiwiV2ViU29ja2V0RmFjdG9yeSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/realtime-js/dist/module/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js":
|
||
/*!*************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/constants.js ***!
|
||
\*************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CHANNEL_EVENTS: () => (/* binding */ CHANNEL_EVENTS),\n/* harmony export */ CHANNEL_STATES: () => (/* binding */ CHANNEL_STATES),\n/* harmony export */ CONNECTION_STATE: () => (/* binding */ CONNECTION_STATE),\n/* harmony export */ DEFAULT_TIMEOUT: () => (/* binding */ DEFAULT_TIMEOUT),\n/* harmony export */ DEFAULT_VERSION: () => (/* binding */ DEFAULT_VERSION),\n/* harmony export */ DEFAULT_VSN: () => (/* binding */ DEFAULT_VSN),\n/* harmony export */ MAX_PUSH_BUFFER_SIZE: () => (/* binding */ MAX_PUSH_BUFFER_SIZE),\n/* harmony export */ SOCKET_STATES: () => (/* binding */ SOCKET_STATES),\n/* harmony export */ TRANSPORTS: () => (/* binding */ TRANSPORTS),\n/* harmony export */ VERSION: () => (/* binding */ VERSION),\n/* harmony export */ VSN_1_0_0: () => (/* binding */ VSN_1_0_0),\n/* harmony export */ VSN_2_0_0: () => (/* binding */ VSN_2_0_0),\n/* harmony export */ WS_CLOSE_NORMAL: () => (/* binding */ WS_CLOSE_NORMAL)\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./version */ \"(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js\");\n\nconst DEFAULT_VERSION = `realtime-js/${_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL2NvbnN0YW50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFvQztBQUM3QixNQUFNQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUVELDZDQUFPQSxDQUFDLENBQUMsQ0FBQztBQUNqRCxNQUFNRSxZQUFZLFFBQVE7QUFDMUIsTUFBTUMsWUFBWSxRQUFRO0FBQzFCLE1BQU1DLGNBQWNGLFVBQVU7QUFDOUIsTUFBTUcsVUFBVUwsNkNBQU9BLENBQUM7QUFDeEIsTUFBTU0sa0JBQWtCLE1BQU07QUFDOUIsTUFBTUMsa0JBQWtCLEtBQUs7QUFDN0IsTUFBTUMsdUJBQXVCLElBQUk7QUFDakMsSUFBSUMsY0FBYztBQUN4QixVQUFVQSxhQUFhO0lBQ3BCQSxhQUFhLENBQUNBLGFBQWEsQ0FBQyxhQUFhLEdBQUcsRUFBRSxHQUFHO0lBQ2pEQSxhQUFhLENBQUNBLGFBQWEsQ0FBQyxPQUFPLEdBQUcsRUFBRSxHQUFHO0lBQzNDQSxhQUFhLENBQUNBLGFBQWEsQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHO0lBQzlDQSxhQUFhLENBQUNBLGFBQWEsQ0FBQyxTQUFTLEdBQUcsRUFBRSxHQUFHO0FBQ2pELEdBQUdBLGlCQUFrQkEsQ0FBQUEsZ0JBQWdCLENBQUM7QUFDL0IsSUFBSUMsZUFBZTtBQUN6QixVQUFVQSxjQUFjO0lBQ3JCQSxjQUFjLENBQUMsU0FBUyxHQUFHO0lBQzNCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsU0FBUyxHQUFHO0lBQzNCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0lBQzVCQSxjQUFjLENBQUMsVUFBVSxHQUFHO0FBQ2hDLEdBQUdBLGtCQUFtQkEsQ0FBQUEsaUJBQWlCLENBQUM7QUFDakMsSUFBSUMsZUFBZTtBQUN6QixVQUFVQSxjQUFjO0lBQ3JCQSxjQUFjLENBQUMsUUFBUSxHQUFHO0lBQzFCQSxjQUFjLENBQUMsUUFBUSxHQUFHO0lBQzFCQSxjQUFjLENBQUMsT0FBTyxHQUFHO0lBQ3pCQSxjQUFjLENBQUMsUUFBUSxHQUFHO0lBQzFCQSxjQUFjLENBQUMsUUFBUSxHQUFHO0lBQzFCQSxjQUFjLENBQUMsZUFBZSxHQUFHO0FBQ3JDLEdBQUdBLGtCQUFtQkEsQ0FBQUEsaUJBQWlCLENBQUM7QUFDakMsSUFBSUMsV0FBVztBQUNyQixVQUFVQSxVQUFVO0lBQ2pCQSxVQUFVLENBQUMsWUFBWSxHQUFHO0FBQzlCLEdBQUdBLGNBQWVBLENBQUFBLGFBQWEsQ0FBQztBQUN6QixJQUFJQyxpQkFBaUI7QUFDM0IsVUFBVUEsZ0JBQWdCO0lBQ3ZCQSxnQkFBZ0IsQ0FBQyxhQUFhLEdBQUc7SUFDakNBLGdCQUFnQixDQUFDLE9BQU8sR0FBRztJQUMzQkEsZ0JBQWdCLENBQUMsVUFBVSxHQUFHO0lBQzlCQSxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUc7QUFDakMsR0FBR0Esb0JBQXFCQSxDQUFBQSxtQkFBbUIsQ0FBQyxLQUM1QyxxQ0FBcUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi9jb25zdGFudHMuanM/YWMxMyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX1ZFUlNJT04gPSBgcmVhbHRpbWUtanMvJHt2ZXJzaW9ufWA7XG5leHBvcnQgY29uc3QgVlNOXzFfMF8wID0gJzEuMC4wJztcbmV4cG9ydCBjb25zdCBWU05fMl8wXzAgPSAnMi4wLjAnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVlNOID0gVlNOXzFfMF8wO1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSB2ZXJzaW9uO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDEwMDAwO1xuZXhwb3J0IGNvbnN0IFdTX0NMT1NFX05PUk1BTCA9IDEwMDA7XG5leHBvcnQgY29uc3QgTUFYX1BVU0hfQlVGRkVSX1NJWkUgPSAxMDA7XG5leHBvcnQgdmFyIFNPQ0tFVF9TVEFURVM7XG4oZnVuY3Rpb24gKFNPQ0tFVF9TVEFURVMpIHtcbiAgICBTT0NLRVRfU1RBVEVTW1NPQ0tFVF9TVEFURVNbXCJjb25uZWN0aW5nXCJdID0gMF0gPSBcImNvbm5lY3RpbmdcIjtcbiAgICBTT0NLRVRfU1RBVEVTW1NPQ0tFVF9TVEFURVNbXCJvcGVuXCJdID0gMV0gPSBcIm9wZW5cIjtcbiAgICBTT0NLRVRfU1RBVEVTW1NPQ0tFVF9TVEFURVNbXCJjbG9zaW5nXCJdID0gMl0gPSBcImNsb3NpbmdcIjtcbiAgICBTT0NLRVRfU1RBVEVTW1NPQ0tFVF9TVEFURVNbXCJjbG9zZWRcIl0gPSAzXSA9IFwiY2xvc2VkXCI7XG59KShTT0NLRVRfU1RBVEVTIHx8IChTT0NLRVRfU1RBVEVTID0ge30pKTtcbmV4cG9ydCB2YXIgQ0hBTk5FTF9TVEFURVM7XG4oZnVuY3Rpb24gKENIQU5ORUxfU1RBVEVTKSB7XG4gICAgQ0hBTk5FTF9TVEFURVNbXCJjbG9zZWRcIl0gPSBcImNsb3NlZFwiO1xuICAgIENIQU5ORUxfU1RBVEVTW1wiZXJyb3JlZFwiXSA9IFwiZXJyb3JlZFwiO1xuICAgIENIQU5ORUxfU1RBVEVTW1wiam9pbmVkXCJdID0gXCJqb2luZWRcIjtcbiAgICBDSEFOTkVMX1NUQVRFU1tcImpvaW5pbmdcIl0gPSBcImpvaW5pbmdcIjtcbiAgICBDSEFOTkVMX1NUQVRFU1tcImxlYXZpbmdcIl0gPSBcImxlYXZpbmdcIjtcbn0pKENIQU5ORUxfU1RBVEVTIHx8IChDSEFOTkVMX1NUQVRFUyA9IHt9KSk7XG5leHBvcnQgdmFyIENIQU5ORUxfRVZFTlRTO1xuKGZ1bmN0aW9uIChDSEFOTkVMX0VWRU5UUykge1xuICAgIENIQU5ORUxfRVZFTlRTW1wiY2xvc2VcIl0gPSBcInBoeF9jbG9zZVwiO1xuICAgIENIQU5ORUxfRVZFTlRTW1wiZXJyb3JcIl0gPSBcInBoeF9lcnJvclwiO1xuICAgIENIQU5ORUxfRVZFTlRTW1wiam9pblwiXSA9IFwicGh4X2pvaW5cIjtcbiAgICBDSEFOTkVMX0VWRU5UU1tcInJlcGx5XCJdID0gXCJwaHhfcmVwbHlcIjtcbiAgICBDSEFOTkVMX0VWRU5UU1tcImxlYXZlXCJdID0gXCJwaHhfbGVhdmVcIjtcbiAgICBDSEFOTkVMX0VWRU5UU1tcImFjY2Vzc190b2tlblwiXSA9IFwiYWNjZXNzX3Rva2VuXCI7XG59KShDSEFOTkVMX0VWRU5UUyB8fCAoQ0hBTk5FTF9FVkVOVFMgPSB7fSkpO1xuZXhwb3J0IHZhciBUUkFOU1BPUlRTO1xuKGZ1bmN0aW9uIChUUkFOU1BPUlRTKSB7XG4gICAgVFJBTlNQT1JUU1tcIndlYnNvY2tldFwiXSA9IFwid2Vic29ja2V0XCI7XG59KShUUkFOU1BPUlRTIHx8IChUUkFOU1BPUlRTID0ge30pKTtcbmV4cG9ydCB2YXIgQ09OTkVDVElPTl9TVEFURTtcbihmdW5jdGlvbiAoQ09OTkVDVElPTl9TVEFURSkge1xuICAgIENPTk5FQ1RJT05fU1RBVEVbXCJDb25uZWN0aW5nXCJdID0gXCJjb25uZWN0aW5nXCI7XG4gICAgQ09OTkVDVElPTl9TVEFURVtcIk9wZW5cIl0gPSBcIm9wZW5cIjtcbiAgICBDT05ORUNUSU9OX1NUQVRFW1wiQ2xvc2luZ1wiXSA9IFwiY2xvc2luZ1wiO1xuICAgIENPTk5FQ1RJT05fU1RBVEVbXCJDbG9zZWRcIl0gPSBcImNsb3NlZFwiO1xufSkoQ09OTkVDVElPTl9TVEFURSB8fCAoQ09OTkVDVElPTl9TVEFURSA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIl0sIm5hbWVzIjpbInZlcnNpb24iLCJERUZBVUxUX1ZFUlNJT04iLCJWU05fMV8wXzAiLCJWU05fMl8wXzAiLCJERUZBVUxUX1ZTTiIsIlZFUlNJT04iLCJERUZBVUxUX1RJTUVPVVQiLCJXU19DTE9TRV9OT1JNQUwiLCJNQVhfUFVTSF9CVUZGRVJfU0laRSIsIlNPQ0tFVF9TVEFURVMiLCJDSEFOTkVMX1NUQVRFUyIsIkNIQU5ORUxfRVZFTlRTIiwiVFJBTlNQT1JUUyIsIkNPTk5FQ1RJT05fU1RBVEUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js":
|
||
/*!*************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/constants.js ***!
|
||
\*************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CHANNEL_EVENTS: () => (/* binding */ CHANNEL_EVENTS),\n/* harmony export */ CHANNEL_STATES: () => (/* binding */ CHANNEL_STATES),\n/* harmony export */ CONNECTION_STATE: () => (/* binding */ CONNECTION_STATE),\n/* harmony export */ DEFAULT_TIMEOUT: () => (/* binding */ DEFAULT_TIMEOUT),\n/* harmony export */ DEFAULT_VERSION: () => (/* binding */ DEFAULT_VERSION),\n/* harmony export */ DEFAULT_VSN: () => (/* binding */ DEFAULT_VSN),\n/* harmony export */ MAX_PUSH_BUFFER_SIZE: () => (/* binding */ MAX_PUSH_BUFFER_SIZE),\n/* harmony export */ SOCKET_STATES: () => (/* binding */ SOCKET_STATES),\n/* harmony export */ TRANSPORTS: () => (/* binding */ TRANSPORTS),\n/* harmony export */ VERSION: () => (/* binding */ VERSION),\n/* harmony export */ VSN_1_0_0: () => (/* binding */ VSN_1_0_0),\n/* harmony export */ VSN_2_0_0: () => (/* binding */ VSN_2_0_0),\n/* harmony export */ WS_CLOSE_NORMAL: () => (/* binding */ WS_CLOSE_NORMAL)\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./version */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js\");\n\nconst DEFAULT_VERSION = `realtime-js/${_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi9jb25zdGFudHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBb0M7QUFDN0IsTUFBTUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFRCw2Q0FBT0EsQ0FBQyxDQUFDLENBQUM7QUFDakQsTUFBTUUsWUFBWSxRQUFRO0FBQzFCLE1BQU1DLFlBQVksUUFBUTtBQUMxQixNQUFNQyxjQUFjRixVQUFVO0FBQzlCLE1BQU1HLFVBQVVMLDZDQUFPQSxDQUFDO0FBQ3hCLE1BQU1NLGtCQUFrQixNQUFNO0FBQzlCLE1BQU1DLGtCQUFrQixLQUFLO0FBQzdCLE1BQU1DLHVCQUF1QixJQUFJO0FBQ2pDLElBQUlDLGNBQWM7QUFDeEIsVUFBVUEsYUFBYTtJQUNwQkEsYUFBYSxDQUFDQSxhQUFhLENBQUMsYUFBYSxHQUFHLEVBQUUsR0FBRztJQUNqREEsYUFBYSxDQUFDQSxhQUFhLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRztJQUMzQ0EsYUFBYSxDQUFDQSxhQUFhLENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRztJQUM5Q0EsYUFBYSxDQUFDQSxhQUFhLENBQUMsU0FBUyxHQUFHLEVBQUUsR0FBRztBQUNqRCxHQUFHQSxpQkFBa0JBLENBQUFBLGdCQUFnQixDQUFDO0FBQy9CLElBQUlDLGVBQWU7QUFDekIsVUFBVUEsY0FBYztJQUNyQkEsY0FBYyxDQUFDLFNBQVMsR0FBRztJQUMzQkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFNBQVMsR0FBRztJQUMzQkEsY0FBYyxDQUFDLFVBQVUsR0FBRztJQUM1QkEsY0FBYyxDQUFDLFVBQVUsR0FBRztBQUNoQyxHQUFHQSxrQkFBbUJBLENBQUFBLGlCQUFpQixDQUFDO0FBQ2pDLElBQUlDLGVBQWU7QUFDekIsVUFBVUEsY0FBYztJQUNyQkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLE9BQU8sR0FBRztJQUN6QkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLFFBQVEsR0FBRztJQUMxQkEsY0FBYyxDQUFDLGVBQWUsR0FBRztBQUNyQyxHQUFHQSxrQkFBbUJBLENBQUFBLGlCQUFpQixDQUFDO0FBQ2pDLElBQUlDLFdBQVc7QUFDckIsVUFBVUEsVUFBVTtJQUNqQkEsVUFBVSxDQUFDLFlBQVksR0FBRztBQUM5QixHQUFHQSxjQUFlQSxDQUFBQSxhQUFhLENBQUM7QUFDekIsSUFBSUMsaUJBQWlCO0FBQzNCLFVBQVVBLGdCQUFnQjtJQUN2QkEsZ0JBQWdCLENBQUMsYUFBYSxHQUFHO0lBQ2pDQSxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUc7SUFDM0JBLGdCQUFnQixDQUFDLFVBQVUsR0FBRztJQUM5QkEsZ0JBQWdCLENBQUMsU0FBUyxHQUFHO0FBQ2pDLEdBQUdBLG9CQUFxQkEsQ0FBQUEsbUJBQW1CLENBQUMsS0FDNUMscUNBQXFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9saWIvY29uc3RhbnRzLmpzP2FjMTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG5leHBvcnQgY29uc3QgREVGQVVMVF9WRVJTSU9OID0gYHJlYWx0aW1lLWpzLyR7dmVyc2lvbn1gO1xuZXhwb3J0IGNvbnN0IFZTTl8xXzBfMCA9ICcxLjAuMCc7XG5leHBvcnQgY29uc3QgVlNOXzJfMF8wID0gJzIuMC4wJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX1ZTTiA9IFZTTl8xXzBfMDtcbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gdmVyc2lvbjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMDtcbmV4cG9ydCBjb25zdCBXU19DTE9TRV9OT1JNQUwgPSAxMDAwO1xuZXhwb3J0IGNvbnN0IE1BWF9QVVNIX0JVRkZFUl9TSVpFID0gMTAwO1xuZXhwb3J0IHZhciBTT0NLRVRfU1RBVEVTO1xuKGZ1bmN0aW9uIChTT0NLRVRfU1RBVEVTKSB7XG4gICAgU09DS0VUX1NUQVRFU1tTT0NLRVRfU1RBVEVTW1wiY29ubmVjdGluZ1wiXSA9IDBdID0gXCJjb25uZWN0aW5nXCI7XG4gICAgU09DS0VUX1NUQVRFU1tTT0NLRVRfU1RBVEVTW1wib3BlblwiXSA9IDFdID0gXCJvcGVuXCI7XG4gICAgU09DS0VUX1NUQVRFU1tTT0NLRVRfU1RBVEVTW1wiY2xvc2luZ1wiXSA9IDJdID0gXCJjbG9zaW5nXCI7XG4gICAgU09DS0VUX1NUQVRFU1tTT0NLRVRfU1RBVEVTW1wiY2xvc2VkXCJdID0gM10gPSBcImNsb3NlZFwiO1xufSkoU09DS0VUX1NUQVRFUyB8fCAoU09DS0VUX1NUQVRFUyA9IHt9KSk7XG5leHBvcnQgdmFyIENIQU5ORUxfU1RBVEVTO1xuKGZ1bmN0aW9uIChDSEFOTkVMX1NUQVRFUykge1xuICAgIENIQU5ORUxfU1RBVEVTW1wiY2xvc2VkXCJdID0gXCJjbG9zZWRcIjtcbiAgICBDSEFOTkVMX1NUQVRFU1tcImVycm9yZWRcIl0gPSBcImVycm9yZWRcIjtcbiAgICBDSEFOTkVMX1NUQVRFU1tcImpvaW5lZFwiXSA9IFwiam9pbmVkXCI7XG4gICAgQ0hBTk5FTF9TVEFURVNbXCJqb2luaW5nXCJdID0gXCJqb2luaW5nXCI7XG4gICAgQ0hBTk5FTF9TVEFURVNbXCJsZWF2aW5nXCJdID0gXCJsZWF2aW5nXCI7XG59KShDSEFOTkVMX1NUQVRFUyB8fCAoQ0hBTk5FTF9TVEFURVMgPSB7fSkpO1xuZXhwb3J0IHZhciBDSEFOTkVMX0VWRU5UUztcbihmdW5jdGlvbiAoQ0hBTk5FTF9FVkVOVFMpIHtcbiAgICBDSEFOTkVMX0VWRU5UU1tcImNsb3NlXCJdID0gXCJwaHhfY2xvc2VcIjtcbiAgICBDSEFOTkVMX0VWRU5UU1tcImVycm9yXCJdID0gXCJwaHhfZXJyb3JcIjtcbiAgICBDSEFOTkVMX0VWRU5UU1tcImpvaW5cIl0gPSBcInBoeF9qb2luXCI7XG4gICAgQ0hBTk5FTF9FVkVOVFNbXCJyZXBseVwiXSA9IFwicGh4X3JlcGx5XCI7XG4gICAgQ0hBTk5FTF9FVkVOVFNbXCJsZWF2ZVwiXSA9IFwicGh4X2xlYXZlXCI7XG4gICAgQ0hBTk5FTF9FVkVOVFNbXCJhY2Nlc3NfdG9rZW5cIl0gPSBcImFjY2Vzc190b2tlblwiO1xufSkoQ0hBTk5FTF9FVkVOVFMgfHwgKENIQU5ORUxfRVZFTlRTID0ge30pKTtcbmV4cG9ydCB2YXIgVFJBTlNQT1JUUztcbihmdW5jdGlvbiAoVFJBTlNQT1JUUykge1xuICAgIFRSQU5TUE9SVFNbXCJ3ZWJzb2NrZXRcIl0gPSBcIndlYnNvY2tldFwiO1xufSkoVFJBTlNQT1JUUyB8fCAoVFJBTlNQT1JUUyA9IHt9KSk7XG5leHBvcnQgdmFyIENPTk5FQ1RJT05fU1RBVEU7XG4oZnVuY3Rpb24gKENPTk5FQ1RJT05fU1RBVEUpIHtcbiAgICBDT05ORUNUSU9OX1NUQVRFW1wiQ29ubmVjdGluZ1wiXSA9IFwiY29ubmVjdGluZ1wiO1xuICAgIENPTk5FQ1RJT05fU1RBVEVbXCJPcGVuXCJdID0gXCJvcGVuXCI7XG4gICAgQ09OTkVDVElPTl9TVEFURVtcIkNsb3NpbmdcIl0gPSBcImNsb3NpbmdcIjtcbiAgICBDT05ORUNUSU9OX1NUQVRFW1wiQ2xvc2VkXCJdID0gXCJjbG9zZWRcIjtcbn0pKENPTk5FQ1RJT05fU1RBVEUgfHwgKENPTk5FQ1RJT05fU1RBVEUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCJdLCJuYW1lcyI6WyJ2ZXJzaW9uIiwiREVGQVVMVF9WRVJTSU9OIiwiVlNOXzFfMF8wIiwiVlNOXzJfMF8wIiwiREVGQVVMVF9WU04iLCJWRVJTSU9OIiwiREVGQVVMVF9USU1FT1VUIiwiV1NfQ0xPU0VfTk9STUFMIiwiTUFYX1BVU0hfQlVGRkVSX1NJWkUiLCJTT0NLRVRfU1RBVEVTIiwiQ0hBTk5FTF9TVEFURVMiLCJDSEFOTkVMX0VWRU5UUyIsIlRSQU5TUE9SVFMiLCJDT05ORUNUSU9OX1NUQVRFIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/push.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/push.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Push)\n/* harmony export */ });\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/constants */ \"(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\");\n\nclass Push {\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 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({ status, response }) {\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} //# sourceMappingURL=push.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3B1c2guanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBbUQ7QUFDcEMsTUFBTUM7SUFDakI7Ozs7Ozs7S0FPQyxHQUNEQyxZQUFZQyxPQUFPLEVBQUVDLEtBQUssRUFBRUMsVUFBVSxDQUFDLENBQUMsRUFBRUMsVUFBVU4sMkRBQWUsQ0FBRTtRQUNqRSxJQUFJLENBQUNHLE9BQU8sR0FBR0E7UUFDZixJQUFJLENBQUNDLEtBQUssR0FBR0E7UUFDYixJQUFJLENBQUNDLE9BQU8sR0FBR0E7UUFDZixJQUFJLENBQUNDLE9BQU8sR0FBR0E7UUFDZixJQUFJLENBQUNDLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ0MsWUFBWSxHQUFHQztRQUNwQixJQUFJLENBQUNDLEdBQUcsR0FBRztRQUNYLElBQUksQ0FBQ0MsWUFBWSxHQUFHO1FBQ3BCLElBQUksQ0FBQ0MsUUFBUSxHQUFHLEVBQUU7UUFDbEIsSUFBSSxDQUFDQyxRQUFRLEdBQUc7SUFDcEI7SUFDQUMsT0FBT1IsT0FBTyxFQUFFO1FBQ1osSUFBSSxDQUFDQSxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDUyxlQUFlO1FBQ3BCLElBQUksQ0FBQ0wsR0FBRyxHQUFHO1FBQ1gsSUFBSSxDQUFDRyxRQUFRLEdBQUc7UUFDaEIsSUFBSSxDQUFDRixZQUFZLEdBQUc7UUFDcEIsSUFBSSxDQUFDSixJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNTLElBQUk7SUFDYjtJQUNBQSxPQUFPO1FBQ0gsSUFBSSxJQUFJLENBQUNDLFlBQVksQ0FBQyxZQUFZO1lBQzlCO1FBQ0o7UUFDQSxJQUFJLENBQUNDLFlBQVk7UUFDakIsSUFBSSxDQUFDWCxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNKLE9BQU8sQ0FBQ2dCLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDO1lBQ3JCQyxPQUFPLElBQUksQ0FBQ2xCLE9BQU8sQ0FBQ2tCLEtBQUs7WUFDekJqQixPQUFPLElBQUksQ0FBQ0EsS0FBSztZQUNqQkMsU0FBUyxJQUFJLENBQUNBLE9BQU87WUFDckJLLEtBQUssSUFBSSxDQUFDQSxHQUFHO1lBQ2JZLFVBQVUsSUFBSSxDQUFDbkIsT0FBTyxDQUFDb0IsUUFBUTtRQUNuQztJQUNKO0lBQ0FDLGNBQWNuQixPQUFPLEVBQUU7UUFDbkIsSUFBSSxDQUFDQSxPQUFPLEdBQUdvQixPQUFPQyxNQUFNLENBQUNELE9BQU9DLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDckIsT0FBTyxHQUFHQTtJQUNsRTtJQUNBc0IsUUFBUUMsTUFBTSxFQUFFQyxRQUFRLEVBQUU7UUFDdEIsSUFBSUM7UUFDSixJQUFJLElBQUksQ0FBQ2IsWUFBWSxDQUFDVyxTQUFTO1lBQzNCQyxTQUFTLENBQUNDLEtBQUssSUFBSSxDQUFDbkIsWUFBWSxNQUFNLFFBQVFtQixPQUFPLEtBQUssSUFBSSxLQUFLLElBQUlBLEdBQUdDLFFBQVE7UUFDdEY7UUFDQSxJQUFJLENBQUNuQixRQUFRLENBQUNRLElBQUksQ0FBQztZQUFFUTtZQUFRQztRQUFTO1FBQ3RDLE9BQU8sSUFBSTtJQUNmO0lBQ0FYLGVBQWU7UUFDWCxJQUFJLElBQUksQ0FBQ1YsWUFBWSxFQUFFO1lBQ25CO1FBQ0o7UUFDQSxJQUFJLENBQUNFLEdBQUcsR0FBRyxJQUFJLENBQUNQLE9BQU8sQ0FBQ2dCLE1BQU0sQ0FBQ2EsUUFBUTtRQUN2QyxJQUFJLENBQUNuQixRQUFRLEdBQUcsSUFBSSxDQUFDVixPQUFPLENBQUM4QixlQUFlLENBQUMsSUFBSSxDQUFDdkIsR0FBRztRQUNyRCxNQUFNbUIsV0FBVyxDQUFDeEI7WUFDZCxJQUFJLENBQUNVLGVBQWU7WUFDcEIsSUFBSSxDQUFDbUIsY0FBYztZQUNuQixJQUFJLENBQUN2QixZQUFZLEdBQUdOO1lBQ3BCLElBQUksQ0FBQzhCLGFBQWEsQ0FBQzlCO1FBQ3ZCO1FBQ0EsSUFBSSxDQUFDRixPQUFPLENBQUNpQyxHQUFHLENBQUMsSUFBSSxDQUFDdkIsUUFBUSxFQUFFLENBQUMsR0FBR2dCO1FBQ3BDLElBQUksQ0FBQ3JCLFlBQVksR0FBRzZCLFdBQVc7WUFDM0IsSUFBSSxDQUFDQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzdCLEdBQUcsSUFBSSxDQUFDaEMsT0FBTztJQUNuQjtJQUNBZ0MsUUFBUVYsTUFBTSxFQUFFRyxRQUFRLEVBQUU7UUFDdEIsSUFBSSxJQUFJLENBQUNsQixRQUFRLEVBQ2IsSUFBSSxDQUFDVixPQUFPLENBQUNvQyxRQUFRLENBQUMsSUFBSSxDQUFDMUIsUUFBUSxFQUFFO1lBQUVlO1lBQVFHO1FBQVM7SUFDaEU7SUFDQVMsVUFBVTtRQUNOLElBQUksQ0FBQ3pCLGVBQWU7UUFDcEIsSUFBSSxDQUFDbUIsY0FBYztJQUN2QjtJQUNBbkIsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQ0YsUUFBUSxFQUFFO1lBQ2hCO1FBQ0o7UUFDQSxJQUFJLENBQUNWLE9BQU8sQ0FBQ3NDLElBQUksQ0FBQyxJQUFJLENBQUM1QixRQUFRLEVBQUUsQ0FBQztJQUN0QztJQUNBcUIsaUJBQWlCO1FBQ2JRLGFBQWEsSUFBSSxDQUFDbEMsWUFBWTtRQUM5QixJQUFJLENBQUNBLFlBQVksR0FBR0M7SUFDeEI7SUFDQTBCLGNBQWMsRUFBRVAsTUFBTSxFQUFFRyxRQUFRLEVBQUUsRUFBRTtRQUNoQyxJQUFJLENBQUNuQixRQUFRLENBQUMrQixNQUFNLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRWhCLE1BQU0sS0FBS0EsUUFBUWlCLE9BQU8sQ0FBQyxDQUFDRCxJQUFNQSxFQUFFZixRQUFRLENBQUNFO0lBQy9FO0lBQ0FkLGFBQWFXLE1BQU0sRUFBRTtRQUNqQixPQUFPLElBQUksQ0FBQ2pCLFlBQVksSUFBSSxJQUFJLENBQUNBLFlBQVksQ0FBQ2lCLE1BQU0sS0FBS0E7SUFDN0Q7QUFDSixFQUNBLGdDQUFnQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3B1c2guanM/NDQ4ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUZBVUxUX1RJTUVPVVQgfSBmcm9tICcuLi9saWIvY29uc3RhbnRzJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFB1c2gge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRoZSBQdXNoXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgQ2hhbm5lbFxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQsIGZvciBleGFtcGxlIGBcInBoeF9qb2luXCJgXG4gICAgICogQHBhcmFtIHBheWxvYWQgVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAgICAgKiBAcGFyYW0gdGltZW91dCBUaGUgcHVzaCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkID0ge30sIHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQpIHtcbiAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcbiAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50O1xuICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICB0aGlzLnNlbnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50aW1lb3V0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmVmID0gJyc7XG4gICAgICAgIHRoaXMucmVjZWl2ZWRSZXNwID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWNIb29rcyA9IFtdO1xuICAgICAgICB0aGlzLnJlZkV2ZW50ID0gbnVsbDtcbiAgICB9XG4gICAgcmVzZW5kKHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgdGhpcy5fY2FuY2VsUmVmRXZlbnQoKTtcbiAgICAgICAgdGhpcy5yZWYgPSAnJztcbiAgICAgICAgdGhpcy5yZWZFdmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMucmVjZWl2ZWRSZXNwID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VuZCgpO1xuICAgIH1cbiAgICBzZW5kKCkge1xuICAgICAgICBpZiAodGhpcy5faGFzUmVjZWl2ZWQoJ3RpbWVvdXQnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuc2VudCA9IHRydWU7XG4gICAgICAgIHRoaXMuY2hhbm5lbC5zb2NrZXQucHVzaCh7XG4gICAgICAgICAgICB0b3BpYzogdGhpcy5jaGFubmVsLnRvcGljLFxuICAgICAgICAgICAgZXZlbnQ6IHRoaXMuZXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkOiB0aGlzLnBheWxvYWQsXG4gICAgICAgICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgICAgICAgam9pbl9yZWY6IHRoaXMuY2hhbm5lbC5fam9pblJlZigpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXBkYXRlUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgIHRoaXMucGF5bG9hZCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXlsb2FkKSwgcGF5bG9hZCk7XG4gICAgfVxuICAgIHJlY2VpdmUoc3RhdHVzLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLl9oYXNSZWNlaXZlZChzdGF0dXMpKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygoX2EgPSB0aGlzLnJlY2VpdmVkUmVzcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlY0hvb2tzLnB1c2goeyBzdGF0dXMsIGNhbGxiYWNrIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc3RhcnRUaW1lb3V0KCkge1xuICAgICAgICBpZiAodGhpcy50aW1lb3V0VGltZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZiA9IHRoaXMuY2hhbm5lbC5zb2NrZXQuX21ha2VSZWYoKTtcbiAgICAgICAgdGhpcy5yZWZFdmVudCA9IHRoaXMuY2hhbm5lbC5fcmVwbHlFdmVudE5hbWUodGhpcy5yZWYpO1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxSZWZFdmVudCgpO1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGltZW91dCgpO1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkO1xuICAgICAgICAgICAgdGhpcy5fbWF0Y2hSZWNlaXZlKHBheWxvYWQpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNoYW5uZWwuX29uKHRoaXMucmVmRXZlbnQsIHt9LCBjYWxsYmFjayk7XG4gICAgICAgIHRoaXMudGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3RpbWVvdXQnLCB7fSk7XG4gICAgICAgIH0sIHRoaXMudGltZW91dCk7XG4gICAgfVxuICAgIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5yZWZFdmVudClcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbC5fdHJpZ2dlcih0aGlzLnJlZkV2ZW50LCB7IHN0YXR1cywgcmVzcG9uc2UgfSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX2NhbmNlbFJlZkV2ZW50KCk7XG4gICAgICAgIHRoaXMuX2NhbmNlbFRpbWVvdXQoKTtcbiAgICB9XG4gICAgX2NhbmNlbFJlZkV2ZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMucmVmRXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5uZWwuX29mZih0aGlzLnJlZkV2ZW50LCB7fSk7XG4gICAgfVxuICAgIF9jYW5jZWxUaW1lb3V0KCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpO1xuICAgICAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgX21hdGNoUmVjZWl2ZSh7IHN0YXR1cywgcmVzcG9uc2UgfSkge1xuICAgICAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcigoaCkgPT4gaC5zdGF0dXMgPT09IHN0YXR1cykuZm9yRWFjaCgoaCkgPT4gaC5jYWxsYmFjayhyZXNwb25zZSkpO1xuICAgIH1cbiAgICBfaGFzUmVjZWl2ZWQoc3RhdHVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlY2VpdmVkUmVzcCAmJiB0aGlzLnJlY2VpdmVkUmVzcC5zdGF0dXMgPT09IHN0YXR1cztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdXNoLmpzLm1hcCJdLCJuYW1lcyI6WyJERUZBVUxUX1RJTUVPVVQiLCJQdXNoIiwiY29uc3RydWN0b3IiLCJjaGFubmVsIiwiZXZlbnQiLCJwYXlsb2FkIiwidGltZW91dCIsInNlbnQiLCJ0aW1lb3V0VGltZXIiLCJ1bmRlZmluZWQiLCJyZWYiLCJyZWNlaXZlZFJlc3AiLCJyZWNIb29rcyIsInJlZkV2ZW50IiwicmVzZW5kIiwiX2NhbmNlbFJlZkV2ZW50Iiwic2VuZCIsIl9oYXNSZWNlaXZlZCIsInN0YXJ0VGltZW91dCIsInNvY2tldCIsInB1c2giLCJ0b3BpYyIsImpvaW5fcmVmIiwiX2pvaW5SZWYiLCJ1cGRhdGVQYXlsb2FkIiwiT2JqZWN0IiwiYXNzaWduIiwicmVjZWl2ZSIsInN0YXR1cyIsImNhbGxiYWNrIiwiX2EiLCJyZXNwb25zZSIsIl9tYWtlUmVmIiwiX3JlcGx5RXZlbnROYW1lIiwiX2NhbmNlbFRpbWVvdXQiLCJfbWF0Y2hSZWNlaXZlIiwiX29uIiwic2V0VGltZW91dCIsInRyaWdnZXIiLCJfdHJpZ2dlciIsImRlc3Ryb3kiLCJfb2ZmIiwiY2xlYXJUaW1lb3V0IiwiZmlsdGVyIiwiaCIsImZvckVhY2giXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/push.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/push.js":
|
||
/*!********************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/push.js ***!
|
||
\********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Push)\n/* harmony export */ });\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/constants */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/constants.js\");\n\nclass Push {\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 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({ status, response }) {\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} //# sourceMappingURL=push.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi9wdXNoLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQW1EO0FBQ3BDLE1BQU1DO0lBQ2pCOzs7Ozs7O0tBT0MsR0FDREMsWUFBWUMsT0FBTyxFQUFFQyxLQUFLLEVBQUVDLFVBQVUsQ0FBQyxDQUFDLEVBQUVDLFVBQVVOLDJEQUFlLENBQUU7UUFDakUsSUFBSSxDQUFDRyxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDQyxLQUFLLEdBQUdBO1FBQ2IsSUFBSSxDQUFDQyxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDQyxPQUFPLEdBQUdBO1FBQ2YsSUFBSSxDQUFDQyxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNDLFlBQVksR0FBR0M7UUFDcEIsSUFBSSxDQUFDQyxHQUFHLEdBQUc7UUFDWCxJQUFJLENBQUNDLFlBQVksR0FBRztRQUNwQixJQUFJLENBQUNDLFFBQVEsR0FBRyxFQUFFO1FBQ2xCLElBQUksQ0FBQ0MsUUFBUSxHQUFHO0lBQ3BCO0lBQ0FDLE9BQU9SLE9BQU8sRUFBRTtRQUNaLElBQUksQ0FBQ0EsT0FBTyxHQUFHQTtRQUNmLElBQUksQ0FBQ1MsZUFBZTtRQUNwQixJQUFJLENBQUNMLEdBQUcsR0FBRztRQUNYLElBQUksQ0FBQ0csUUFBUSxHQUFHO1FBQ2hCLElBQUksQ0FBQ0YsWUFBWSxHQUFHO1FBQ3BCLElBQUksQ0FBQ0osSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDUyxJQUFJO0lBQ2I7SUFDQUEsT0FBTztRQUNILElBQUksSUFBSSxDQUFDQyxZQUFZLENBQUMsWUFBWTtZQUM5QjtRQUNKO1FBQ0EsSUFBSSxDQUFDQyxZQUFZO1FBQ2pCLElBQUksQ0FBQ1gsSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDSixPQUFPLENBQUNnQixNQUFNLENBQUNDLElBQUksQ0FBQztZQUNyQkMsT0FBTyxJQUFJLENBQUNsQixPQUFPLENBQUNrQixLQUFLO1lBQ3pCakIsT0FBTyxJQUFJLENBQUNBLEtBQUs7WUFDakJDLFNBQVMsSUFBSSxDQUFDQSxPQUFPO1lBQ3JCSyxLQUFLLElBQUksQ0FBQ0EsR0FBRztZQUNiWSxVQUFVLElBQUksQ0FBQ25CLE9BQU8sQ0FBQ29CLFFBQVE7UUFDbkM7SUFDSjtJQUNBQyxjQUFjbkIsT0FBTyxFQUFFO1FBQ25CLElBQUksQ0FBQ0EsT0FBTyxHQUFHb0IsT0FBT0MsTUFBTSxDQUFDRCxPQUFPQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQ3JCLE9BQU8sR0FBR0E7SUFDbEU7SUFDQXNCLFFBQVFDLE1BQU0sRUFBRUMsUUFBUSxFQUFFO1FBQ3RCLElBQUlDO1FBQ0osSUFBSSxJQUFJLENBQUNiLFlBQVksQ0FBQ1csU0FBUztZQUMzQkMsU0FBUyxDQUFDQyxLQUFLLElBQUksQ0FBQ25CLFlBQVksTUFBTSxRQUFRbUIsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHQyxRQUFRO1FBQ3RGO1FBQ0EsSUFBSSxDQUFDbkIsUUFBUSxDQUFDUSxJQUFJLENBQUM7WUFBRVE7WUFBUUM7UUFBUztRQUN0QyxPQUFPLElBQUk7SUFDZjtJQUNBWCxlQUFlO1FBQ1gsSUFBSSxJQUFJLENBQUNWLFlBQVksRUFBRTtZQUNuQjtRQUNKO1FBQ0EsSUFBSSxDQUFDRSxHQUFHLEdBQUcsSUFBSSxDQUFDUCxPQUFPLENBQUNnQixNQUFNLENBQUNhLFFBQVE7UUFDdkMsSUFBSSxDQUFDbkIsUUFBUSxHQUFHLElBQUksQ0FBQ1YsT0FBTyxDQUFDOEIsZUFBZSxDQUFDLElBQUksQ0FBQ3ZCLEdBQUc7UUFDckQsTUFBTW1CLFdBQVcsQ0FBQ3hCO1lBQ2QsSUFBSSxDQUFDVSxlQUFlO1lBQ3BCLElBQUksQ0FBQ21CLGNBQWM7WUFDbkIsSUFBSSxDQUFDdkIsWUFBWSxHQUFHTjtZQUNwQixJQUFJLENBQUM4QixhQUFhLENBQUM5QjtRQUN2QjtRQUNBLElBQUksQ0FBQ0YsT0FBTyxDQUFDaUMsR0FBRyxDQUFDLElBQUksQ0FBQ3ZCLFFBQVEsRUFBRSxDQUFDLEdBQUdnQjtRQUNwQyxJQUFJLENBQUNyQixZQUFZLEdBQUc2QixXQUFXO1lBQzNCLElBQUksQ0FBQ0MsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUM3QixHQUFHLElBQUksQ0FBQ2hDLE9BQU87SUFDbkI7SUFDQWdDLFFBQVFWLE1BQU0sRUFBRUcsUUFBUSxFQUFFO1FBQ3RCLElBQUksSUFBSSxDQUFDbEIsUUFBUSxFQUNiLElBQUksQ0FBQ1YsT0FBTyxDQUFDb0MsUUFBUSxDQUFDLElBQUksQ0FBQzFCLFFBQVEsRUFBRTtZQUFFZTtZQUFRRztRQUFTO0lBQ2hFO0lBQ0FTLFVBQVU7UUFDTixJQUFJLENBQUN6QixlQUFlO1FBQ3BCLElBQUksQ0FBQ21CLGNBQWM7SUFDdkI7SUFDQW5CLGtCQUFrQjtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUNGLFFBQVEsRUFBRTtZQUNoQjtRQUNKO1FBQ0EsSUFBSSxDQUFDVixPQUFPLENBQUNzQyxJQUFJLENBQUMsSUFBSSxDQUFDNUIsUUFBUSxFQUFFLENBQUM7SUFDdEM7SUFDQXFCLGlCQUFpQjtRQUNiUSxhQUFhLElBQUksQ0FBQ2xDLFlBQVk7UUFDOUIsSUFBSSxDQUFDQSxZQUFZLEdBQUdDO0lBQ3hCO0lBQ0EwQixjQUFjLEVBQUVQLE1BQU0sRUFBRUcsUUFBUSxFQUFFLEVBQUU7UUFDaEMsSUFBSSxDQUFDbkIsUUFBUSxDQUFDK0IsTUFBTSxDQUFDLENBQUNDLElBQU1BLEVBQUVoQixNQUFNLEtBQUtBLFFBQVFpQixPQUFPLENBQUMsQ0FBQ0QsSUFBTUEsRUFBRWYsUUFBUSxDQUFDRTtJQUMvRTtJQUNBZCxhQUFhVyxNQUFNLEVBQUU7UUFDakIsT0FBTyxJQUFJLENBQUNqQixZQUFZLElBQUksSUFBSSxDQUFDQSxZQUFZLENBQUNpQixNQUFNLEtBQUtBO0lBQzdEO0FBQ0osRUFDQSxnQ0FBZ0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi9wdXNoLmpzPzQ0OGYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREVGQVVMVF9USU1FT1VUIH0gZnJvbSAnLi4vbGliL2NvbnN0YW50cyc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQdXNoIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5uZWwgVGhlIENoYW5uZWxcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50LCBmb3IgZXhhbXBsZSBgXCJwaHhfam9pblwiYFxuICAgICAqIEBwYXJhbSBwYXlsb2FkIFRoZSBwYXlsb2FkLCBmb3IgZXhhbXBsZSBge3VzZXJfaWQ6IDEyM31gXG4gICAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjaGFubmVsLCBldmVudCwgcGF5bG9hZCA9IHt9LCB0aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgdGhpcy5zZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGltZW91dFRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnJlZiA9ICcnO1xuICAgICAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGw7XG4gICAgICAgIHRoaXMucmVjSG9va3MgPSBbXTtcbiAgICAgICAgdGhpcy5yZWZFdmVudCA9IG51bGw7XG4gICAgfVxuICAgIHJlc2VuZCh0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgIHRoaXMuX2NhbmNlbFJlZkV2ZW50KCk7XG4gICAgICAgIHRoaXMucmVmID0gJyc7XG4gICAgICAgIHRoaXMucmVmRXZlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VudCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbmQoKTtcbiAgICB9XG4gICAgc2VuZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc1JlY2VpdmVkKCd0aW1lb3V0JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXJ0VGltZW91dCgpO1xuICAgICAgICB0aGlzLnNlbnQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoYW5uZWwuc29ja2V0LnB1c2goe1xuICAgICAgICAgICAgdG9waWM6IHRoaXMuY2hhbm5lbC50b3BpYyxcbiAgICAgICAgICAgIGV2ZW50OiB0aGlzLmV2ZW50LFxuICAgICAgICAgICAgcGF5bG9hZDogdGhpcy5wYXlsb2FkLFxuICAgICAgICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgICAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuX2pvaW5SZWYoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVwZGF0ZVBheWxvYWQocGF5bG9hZCkge1xuICAgICAgICB0aGlzLnBheWxvYWQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucGF5bG9hZCksIHBheWxvYWQpO1xuICAgIH1cbiAgICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5faGFzUmVjZWl2ZWQoc3RhdHVzKSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKF9hID0gdGhpcy5yZWNlaXZlZFJlc3ApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWNIb29rcy5wdXNoKHsgc3RhdHVzLCBjYWxsYmFjayB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN0YXJ0VGltZW91dCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZW91dFRpbWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWYgPSB0aGlzLmNoYW5uZWwuc29ja2V0Ll9tYWtlUmVmKCk7XG4gICAgICAgIHRoaXMucmVmRXZlbnQgPSB0aGlzLmNoYW5uZWwuX3JlcGx5RXZlbnROYW1lKHRoaXMucmVmKTtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsUmVmRXZlbnQoKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRpbWVvdXQoKTtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZWRSZXNwID0gcGF5bG9hZDtcbiAgICAgICAgICAgIHRoaXMuX21hdGNoUmVjZWl2ZShwYXlsb2FkKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jaGFubmVsLl9vbih0aGlzLnJlZkV2ZW50LCB7fSwgY2FsbGJhY2spO1xuICAgICAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCd0aW1lb3V0Jywge30pO1xuICAgICAgICB9LCB0aGlzLnRpbWVvdXQpO1xuICAgIH1cbiAgICB0cmlnZ2VyKHN0YXR1cywgcmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHRoaXMucmVmRXZlbnQpXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWwuX3RyaWdnZXIodGhpcy5yZWZFdmVudCwgeyBzdGF0dXMsIHJlc3BvbnNlIH0pO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9jYW5jZWxSZWZFdmVudCgpO1xuICAgICAgICB0aGlzLl9jYW5jZWxUaW1lb3V0KCk7XG4gICAgfVxuICAgIF9jYW5jZWxSZWZFdmVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZkV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFubmVsLl9vZmYodGhpcy5yZWZFdmVudCwge30pO1xuICAgIH1cbiAgICBfY2FuY2VsVGltZW91dCgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFRpbWVyKTtcbiAgICAgICAgdGhpcy50aW1lb3V0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIF9tYXRjaFJlY2VpdmUoeyBzdGF0dXMsIHJlc3BvbnNlIH0pIHtcbiAgICAgICAgdGhpcy5yZWNIb29rcy5maWx0ZXIoKGgpID0+IGguc3RhdHVzID09PSBzdGF0dXMpLmZvckVhY2goKGgpID0+IGguY2FsbGJhY2socmVzcG9uc2UpKTtcbiAgICB9XG4gICAgX2hhc1JlY2VpdmVkKHN0YXR1cykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWNlaXZlZFJlc3AgJiYgdGhpcy5yZWNlaXZlZFJlc3Auc3RhdHVzID09PSBzdGF0dXM7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVzaC5qcy5tYXAiXSwibmFtZXMiOlsiREVGQVVMVF9USU1FT1VUIiwiUHVzaCIsImNvbnN0cnVjdG9yIiwiY2hhbm5lbCIsImV2ZW50IiwicGF5bG9hZCIsInRpbWVvdXQiLCJzZW50IiwidGltZW91dFRpbWVyIiwidW5kZWZpbmVkIiwicmVmIiwicmVjZWl2ZWRSZXNwIiwicmVjSG9va3MiLCJyZWZFdmVudCIsInJlc2VuZCIsIl9jYW5jZWxSZWZFdmVudCIsInNlbmQiLCJfaGFzUmVjZWl2ZWQiLCJzdGFydFRpbWVvdXQiLCJzb2NrZXQiLCJwdXNoIiwidG9waWMiLCJqb2luX3JlZiIsIl9qb2luUmVmIiwidXBkYXRlUGF5bG9hZCIsIk9iamVjdCIsImFzc2lnbiIsInJlY2VpdmUiLCJzdGF0dXMiLCJjYWxsYmFjayIsIl9hIiwicmVzcG9uc2UiLCJfbWFrZVJlZiIsIl9yZXBseUV2ZW50TmFtZSIsIl9jYW5jZWxUaW1lb3V0IiwiX21hdGNoUmVjZWl2ZSIsIl9vbiIsInNldFRpbWVvdXQiLCJ0cmlnZ2VyIiwiX3RyaWdnZXIiLCJkZXN0cm95IiwiX29mZiIsImNsZWFyVGltZW91dCIsImZpbHRlciIsImgiLCJmb3JFYWNoIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/push.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js":
|
||
/*!**************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js ***!
|
||
\**************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Serializer)\n/* harmony export */ });\nclass Serializer {\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 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 ${joinRef.length} exceeds maximum of 255`);\n }\n if (ref.length > 255) {\n throw new Error(`ref length ${ref.length} exceeds maximum of 255`);\n }\n if (topic.length > 255) {\n throw new Error(`topic length ${topic.length} exceeds maximum of 255`);\n }\n if (userEvent.length > 255) {\n throw new Error(`userEvent length ${userEvent.length} exceeds maximum of 255`);\n }\n if (metadata.length > 255) {\n throw new Error(`metadata length ${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(([key])=>keys.includes(key)));\n }\n} //# sourceMappingURL=serializer.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3NlcmlhbGl6ZXIuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFlLE1BQU1BO0lBQ2pCQyxZQUFZQyxtQkFBbUIsQ0FBRTtRQUM3QixJQUFJLENBQUNDLGFBQWEsR0FBRztRQUNyQixJQUFJLENBQUNDLCtCQUErQixHQUFHO1FBQ3ZDLElBQUksQ0FBQ0MsS0FBSyxHQUFHO1lBQUVDLG1CQUFtQjtZQUFHQyxlQUFlO1FBQUU7UUFDdEQsSUFBSSxDQUFDQyxlQUFlLEdBQUc7UUFDdkIsSUFBSSxDQUFDQyxhQUFhLEdBQUc7UUFDckIsSUFBSSxDQUFDQyxlQUFlLEdBQUc7UUFDdkIsSUFBSSxDQUFDUixtQkFBbUIsR0FBRyxFQUFFO1FBQzdCLElBQUksQ0FBQ0EsbUJBQW1CLEdBQUdBLHdCQUF3QixRQUFRQSx3QkFBd0IsS0FBSyxJQUFJQSxzQkFBc0IsRUFBRTtJQUN4SDtJQUNBUyxPQUFPQyxHQUFHLEVBQUVDLFFBQVEsRUFBRTtRQUNsQixJQUFJRCxJQUFJRSxLQUFLLEtBQUssSUFBSSxDQUFDSixlQUFlLElBQ2xDLENBQUVFLENBQUFBLElBQUlHLE9BQU8sWUFBWUMsV0FBVSxLQUNuQyxPQUFPSixJQUFJRyxPQUFPLENBQUNELEtBQUssS0FBSyxVQUFVO1lBQ3ZDLE9BQU9ELFNBQVMsSUFBSSxDQUFDSSw4QkFBOEIsQ0FBQ0w7UUFDeEQ7UUFDQSxJQUFJRyxVQUFVO1lBQUNILElBQUlNLFFBQVE7WUFBRU4sSUFBSU8sR0FBRztZQUFFUCxJQUFJUSxLQUFLO1lBQUVSLElBQUlFLEtBQUs7WUFBRUYsSUFBSUcsT0FBTztTQUFDO1FBQ3hFLE9BQU9GLFNBQVNRLEtBQUtDLFNBQVMsQ0FBQ1A7SUFDbkM7SUFDQUUsK0JBQStCTSxPQUFPLEVBQUU7UUFDcEMsSUFBSUM7UUFDSixJQUFJLElBQUksQ0FBQ0MsY0FBYyxDQUFDLENBQUNELEtBQUtELFFB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QSxPQUFPakMsV0FBVyxNQUFNLFFBQVF1QixPQUFPLEtBQUssSUFBSSxLQUFLLElBQUlBLEdBQUd1RCxJQUFJLE1BQU07SUFDeks7SUFDQXZDLE1BQU13QyxHQUFHLEVBQUVyQyxJQUFJLEVBQUU7UUFDYixJQUFJLENBQUNxQyxPQUFPLE9BQU9BLFFBQVEsVUFBVTtZQUNqQyxPQUFPLENBQUM7UUFDWjtRQUNBLE9BQU90QyxPQUFPdUMsV0FBVyxDQUFDdkMsT0FBT3dDLE9BQU8sQ0FBQ0YsS0FBS0csTUFBTSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxHQUFLekMsS0FBSzBDLFFBQVEsQ0FBQ0Q7SUFDbEY7QUFDSixFQUNBLHNDQUFzQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3NlcmlhbGl6ZXIuanM/ODFkYiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJpYWxpemVyIHtcbiAgICBjb25zdHJ1Y3RvcihhbGxvd2VkTWV0YWRhdGFLZXlzKSB7XG4gICAgICAgIHRoaXMuSEVBREVSX0xFTkdUSCA9IDE7XG4gICAgICAgIHRoaXMuVVNFUl9CUk9BRENBU1RfUFVTSF9NRVRBX0xFTkdUSCA9IDY7XG4gICAgICAgIHRoaXMuS0lORFMgPSB7IHVzZXJCcm9hZGNhc3RQdXNoOiAzLCB1c2VyQnJvYWRjYXN0OiA0IH07XG4gICAgICAgIHRoaXMuQklOQVJZX0VOQ09ESU5HID0gMDtcbiAgICAgICAgdGhpcy5KU09OX0VOQ09ESU5HID0gMTtcbiAgICAgICAgdGhpcy5CUk9BRENBU1RfRVZFTlQgPSAnYnJvYWRjYXN0JztcbiAgICAgICAgdGhpcy5hbGxvd2VkTWV0YWRhdGFLZXlzID0gW107XG4gICAgICAgIHRoaXMuYWxsb3dlZE1ldGFkYXRhS2V5cyA9IGFsbG93ZWRNZXRhZGF0YUtleXMgIT09IG51bGwgJiYgYWxsb3dlZE1ldGFkYXRhS2V5cyAhPT0gdm9pZCAwID8gYWxsb3dlZE1ldGFkYXRhS2V5cyA6IFtdO1xuICAgIH1cbiAgICBlbmNvZGUobXNnLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAobXNnLmV2ZW50ID09PSB0aGlzLkJST0FEQ0FTVF9FVkVOVCAmJlxuICAgICAgICAgICAgIShtc2cucGF5bG9hZCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSAmJlxuICAgICAgICAgICAgdHlwZW9mIG1zZy5wYXlsb2FkLmV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX2JpbmFyeUVuY29kZVVzZXJCcm9hZGNhc3RQdXNoKG1zZykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXlsb2FkID0gW21zZy5qb2luX3JlZiwgbXNnLnJlZiwgbXNnLnRvcGljLCBtc2cuZXZlbnQsIG1zZy5wYXlsb2FkXTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgICB9XG4gICAgX2JpbmFyeUVuY29kZVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5faXNBcnJheUJ1ZmZlcigoX2EgPSBtZXNzYWdlLnBheWxvYWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXlsb2FkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZUJpbmFyeVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZUpzb25Vc2VyQnJvYWRjYXN0UHVzaChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZW5jb2RlQmluYXJ5VXNlckJyb2FkY2FzdFB1c2gobWVzc2FnZSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB1c2VyUGF5bG9hZCA9IChfYiA9IChfYSA9IG1lc3NhZ2UucGF5bG9hZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBheWxvYWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UsIHRoaXMuQklOQVJZX0VOQ09ESU5HLCB1c2VyUGF5bG9hZCk7XG4gICAgfVxuICAgIF9lbmNvZGVKc29uVXNlckJyb2FkY2FzdFB1c2gobWVzc2FnZSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB1c2VyUGF5bG9hZCA9IChfYiA9IChfYSA9IG1lc3NhZ2UucGF5bG9hZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBheWxvYWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHt9O1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGVuY29kZWRVc2VyUGF5bG9hZCA9IGVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHVzZXJQYXlsb2FkKSkuYnVmZmVyO1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2RlVXNlckJyb2FkY2FzdFB1c2gobWVzc2FnZSwgdGhpcy5KU09OX0VOQ09ESU5HLCBlbmNvZGVkVXNlclBheWxvYWQpO1xuICAgIH1cbiAgICBfZW5jb2RlVXNlckJyb2FkY2FzdFB1c2gobWVzc2FnZSwgZW5jb2RpbmdUeXBlLCBlbmNvZGVkUGF5bG9hZCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB0b3BpYyA9IG1lc3NhZ2UudG9waWM7XG4gICAgICAgIGNvbnN0IHJlZiA9IChfYSA9IG1lc3NhZ2UucmVmKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICAgICAgY29uc3Qgam9pblJlZiA9IChfYiA9IG1lc3NhZ2Uuam9pbl9yZWYpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xuICAgICAgICBjb25zdCB1c2VyRXZlbnQgPSBtZXNzYWdlLnBheWxvYWQuZXZlbnQ7XG4gICAgICAgIC8vIEZpbHRlciBtZXRhZGF0YSBiYXNlZCBvbiBhbGxvd2VkIGtleXNcbiAgICAgICAgY29uc3QgcmVzdCA9IHRoaXMuYWxsb3dlZE1ldGFkYXRhS2V5c1xuICAgICAgICAgICAgPyB0aGlzLl9waWNrKG1lc3NhZ2UucGF5bG9hZCwgdGhpcy5hbGxvd2VkTWV0YWRhdGFLZXlzKVxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBPYmplY3Qua2V5cyhyZXN0KS5sZW5ndGggPT09IDAgPyAnJyA6IEpTT04uc3RyaW5naWZ5KHJlc3QpO1xuICAgICAgICAvLyBWYWxpZGF0ZSBsZW5ndGhzIGRvbid0IGV4Y2VlZCB1aW50OCBtYXggdmFsdWUgKDI1NSlcbiAgICAgICAgaWYgKGpvaW5SZWYubGVuZ3RoID4gMjU1KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGpvaW5SZWYgbGVuZ3RoICR7am9pblJlZi5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAyNTVgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmLmxlbmd0aCA+IDI1NSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGByZWYgbGVuZ3RoICR7cmVmLmxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtIG9mIDI1NWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b3BpYy5sZW5ndGggPiAyNTUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9waWMgbGVuZ3RoICR7dG9waWMubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgMjU1YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZXJFdmVudC5sZW5ndGggPiAyNTUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdXNlckV2ZW50IGxlbmd0aCAke3VzZXJFdmVudC5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAyNTVgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YWRhdGEubGVuZ3RoID4gMjU1KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1ldGFkYXRhIGxlbmd0aCAke21ldGFkYXRhLmxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtIG9mIDI1NWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFMZW5ndGggPSB0aGlzLlVTRVJfQlJPQURDQVNUX1BVU0hfTUVUQV9MRU5HVEggK1xuICAgICAgICAgICAgam9pblJlZi5sZW5ndGggK1xuICAgICAgICAgICAgcmVmLmxlbmd0aCArXG4gICAgICAgICAgICB0b3BpYy5sZW5ndGggK1xuICAgICAgICAgICAgdXNlckV2ZW50Lmxlbmd0aCArXG4gICAgICAgICAgICBtZXRhZGF0YS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLkhFQURFUl9MRU5HVEggKyBtZXRhTGVuZ3RoKTtcbiAgICAgICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKTtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIHRoaXMuS0lORFMudXNlckJyb2FkY2FzdFB1c2gpOyAvLyBraW5kXG4gICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGpvaW5SZWYubGVuZ3RoKTtcbiAgICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aCk7XG4gICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIHRvcGljLmxlbmd0aCk7XG4gICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIHVzZXJFdmVudC5sZW5ndGgpO1xuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBtZXRhZGF0YS5sZW5ndGgpO1xuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBlbmNvZGluZ1R5cGUpO1xuICAgICAgICBBcnJheS5mcm9tKGpvaW5SZWYsIChjaGFyKSA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbiAgICAgICAgQXJyYXkuZnJvbShyZWYsIChjaGFyKSA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbiAgICAgICAgQXJyYXkuZnJvbSh0b3BpYywgKGNoYXIpID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpO1xuICAgICAgICBBcnJheS5mcm9tKHVzZXJFdmVudCwgKGNoYXIpID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpO1xuICAgICAgICBBcnJheS5mcm9tKG1ldGFkYXRhLCAoY2hhcikgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSk7XG4gICAgICAgIHZhciBjb21iaW5lZCA9IG5ldyBVaW50OEFycmF5KGhlYWRlci5ieXRlTGVuZ3RoICsgZW5jb2RlZFBheWxvYWQuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbWJpbmVkLnNldChuZXcgVWludDhBcnJheShoZWFkZXIpLCAwKTtcbiAgICAgICAgY29tYmluZWQuc2V0KG5ldyBVaW50OEFycmF5KGVuY29kZWRQYXlsb2FkKSwgaGVhZGVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gY29tYmluZWQuYnVmZmVyO1xuICAgIH1cbiAgICBkZWNvZGUocmF3UGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQXJyYXlCdWZmZXIocmF3UGF5bG9hZCkpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9iaW5hcnlEZWNvZGUocmF3UGF5bG9hZCk7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJhd1BheWxvYWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBqc29uUGF5bG9hZCA9IEpTT04ucGFyc2UocmF3UGF5bG9hZCk7XG4gICAgICAgICAgICBjb25zdCBbam9pbl9yZWYsIHJlZiwgdG9waWMsIGV2ZW50LCBwYXlsb2FkXSA9IGpzb25QYXlsb2FkO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHsgam9pbl9yZWYsIHJlZiwgdG9waWMsIGV2ZW50LCBwYXlsb2FkIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh7fSk7XG4gICAgfVxuICAgIF9iaW5hcnlEZWNvZGUoYnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcbiAgICAgICAgY29uc3Qga2luZCA9IHZpZXcuZ2V0VWludDgoMCk7XG4gICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlIHRoaXMuS0lORFMudXNlckJyb2FkY2FzdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlVXNlckJyb2FkY2FzdChidWZmZXIsIHZpZXcsIGRlY29kZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9kZWNvZGVVc2VyQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcikge1xuICAgICAgICBjb25zdCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDEpO1xuICAgICAgICBjb25zdCB1c2VyRXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFTaXplID0gdmlldy5nZXRVaW50OCgzKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZEVuY29kaW5nID0gdmlldy5nZXRVaW50OCg0KTtcbiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuSEVBREVSX0xFTkdUSCArIDQ7XG4gICAgICAgIGNvbnN0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSk7XG4gICAgICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZTtcbiAgICAgICAgY29uc3QgdXNlckV2ZW50ID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdXNlckV2ZW50U2l6ZSkpO1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyB1c2VyRXZlbnRTaXplO1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIG1ldGFkYXRhU2l6ZSkpO1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyBtZXRhZGF0YVNpemU7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHBhcnNlZFBheWxvYWQgPSBwYXlsb2FkRW5jb2RpbmcgPT09IHRoaXMuSlNPTl9FTkNPRElORyA/IEpTT04ucGFyc2UoZGVjb2Rlci5kZWNvZGUocGF5bG9hZCkpIDogcGF5bG9hZDtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuQlJPQURDQVNUX0VWRU5ULFxuICAgICAgICAgICAgZXZlbnQ6IHVzZXJFdmVudCxcbiAgICAgICAgICAgIHBheWxvYWQ6IHBhcnNlZFBheWxvYWQsXG4gICAgICAgIH07XG4gICAgICAgIC8vIE1ldGFkYXRhIGlzIG9wdGlvbmFsIGFuZCBhbHdheXMgSlNPTiBlbmNvZGVkXG4gICAgICAgIGlmIChtZXRhZGF0YVNpemUgPiAwKSB7XG4gICAgICAgICAgICBkYXRhWydtZXRhJ10gPSBKU09OLnBhcnNlKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBqb2luX3JlZjogbnVsbCwgcmVmOiBudWxsLCB0b3BpYzogdG9waWMsIGV2ZW50OiB0aGlzLkJST0FEQ0FTVF9FVkVOVCwgcGF5bG9hZDogZGF0YSB9O1xuICAgIH1cbiAgICBfaXNBcnJheUJ1ZmZlcihidWZmZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgKChfYSA9IGJ1ZmZlciA9PT0gbnVsbCB8fCBidWZmZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ1ZmZlci5jb25zdHJ1Y3RvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5hbWUpID09PSAnQXJyYXlCdWZmZXInO1xuICAgIH1cbiAgICBfcGljayhvYmosIGtleXMpIHtcbiAgICAgICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChba2V5XSkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VyaWFsaXplci5qcy5tYXAiXSwibmFtZXMiOlsiU2VyaWFsaXplciIsImNvbnN0cnVjdG9yIiwiYWxsb3dlZE1ldGFkYXRhS2V5cyIsIkhFQURFUl9MRU5HVEgiLCJVU0VSX0JST0FEQ0FTVF9QVVNIX01FVEFfTEVOR1RIIiwiS0lORFMiLCJ1c2VyQnJvYWRjYXN0UHVzaCIsInVzZXJCcm9hZGNhc3QiLCJCSU5BUllfRU5DT0RJTkciLCJKU09OX0VOQ09ESU5HIiwiQlJPQURDQVNUX0VWRU5UIiwiZW5jb2RlIiwibXNnIiwiY2FsbGJhY2siLCJldmVudCIsInBheWxvYWQiLCJBcnJheUJ1ZmZlciIsIl9iaW5hcnlFbmNvZGVVc2VyQnJvYWRjYXN0UHVzaCIsImpvaW5fcmVmIiwicmVmIiwidG9waWMiLCJKU09OIiwic3RyaW5naWZ5IiwibWVzc2FnZSIsIl9hIiwiX2lzQXJyYXlCdWZmZXIiLCJfZW5jb2RlQmluYXJ5VXNlckJyb2FkY2FzdFB1c2giLCJfZW5jb2RlSnNvblVzZXJCcm9hZGNhc3RQdXNoIiwiX2IiLCJ1c2VyUGF5bG9hZCIsIl9lbmNvZGVVc2VyQnJvYWRjYXN0UHVzaCIsImVuY29kZXIiLCJUZXh0RW5jb2RlciIsImVuY29kZWRVc2VyUGF5bG9hZCIsImJ1ZmZlciIsImVuY29kaW5nVHlwZSIsImVuY29kZWRQYXlsb2FkIiwiam9pblJlZiIsInVzZXJFdmVudCIsInJlc3QiLCJfcGljayIsIm1ldGFkYXRhIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsIkVycm9yIiwibWV0YUxlbmd0aCIsImhlYWRlciIsInZpZXciLCJEYXRhVmlldyIsIm9mZnNldCIsInNldFVpbnQ4IiwiQXJyYXkiLCJmcm9tIiwiY2hhciIsImNoYXJDb2RlQXQiLCJjb21iaW5lZCIsIlVpbnQ4QXJyYXkiLCJieXRlTGVuZ3RoIiwic2V0IiwiZGVjb2RlIiwicmF3UGF5bG9hZCIsInJlc3VsdCIsIl9iaW5hcnlEZWNvZGUiLCJqc29uUGF5bG9hZCIsInBhcnNlIiwia2luZCIsImdldFVpbnQ4IiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwiX2RlY29kZVVzZXJCcm9hZGNhc3QiLCJ0b3BpY1NpemUiLCJ1c2VyRXZlbnRTaXplIiwibWV0YWRhdGFTaXplIiwicGF5bG9hZEVuY29kaW5nIiwic2xpY2UiLCJwYXJzZWRQYXlsb2FkIiwiZGF0YSIsInR5cGUiLCJuYW1lIiwib2JqIiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwiZmlsdGVyIiwia2V5IiwiaW5jbHVkZXMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js":
|
||
/*!**************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js ***!
|
||
\**************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Serializer)\n/* harmony export */ });\nclass Serializer {\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 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 ${joinRef.length} exceeds maximum of 255`);\n }\n if (ref.length > 255) {\n throw new Error(`ref length ${ref.length} exceeds maximum of 255`);\n }\n if (topic.length > 255) {\n throw new Error(`topic length ${topic.length} exceeds maximum of 255`);\n }\n if (userEvent.length > 255) {\n throw new Error(`userEvent length ${userEvent.length} exceeds maximum of 255`);\n }\n if (metadata.length > 255) {\n throw new Error(`metadata length ${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(([key])=>keys.includes(key)));\n }\n} //# sourceMappingURL=serializer.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi9zZXJpYWxpemVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBZSxNQUFNQTtJQUNqQkMsWUFBWUMsbUJBQW1CLENBQUU7UUFDN0IsSUFBSSxDQUFDQyxhQUFhLEdBQUc7UUFDckIsSUFBSSxDQUFDQywrQkFBK0IsR0FBRztRQUN2QyxJQUFJLENBQUNDLEtBQUssR0FBRztZQUFFQyxtQkFBbUI7WUFBR0MsZUFBZTtRQUFFO1FBQ3RELElBQUksQ0FBQ0MsZUFBZSxHQUFHO1FBQ3ZCLElBQUksQ0FBQ0MsYUFBYSxHQUFHO1FBQ3JCLElBQUksQ0FBQ0MsZUFBZSxHQUFHO1FBQ3ZCLElBQUksQ0FBQ1IsbUJBQW1CLEdBQUcsRUFBRTtRQUM3QixJQUFJLENBQUNBLG1CQUFtQixHQUFHQSx3QkFBd0IsUUFBUUEsd0JBQXdCLEtBQUssSUFBSUEsc0JBQXNCLEVBQUU7SUFDeEg7SUFDQVMsT0FBT0MsR0FBRyxFQUFFQyxRQUFRLEVBQUU7UUFDbEIsSUFBSUQsSUFBSUUsS0FBSyxLQUFLLElBQUksQ0FBQ0osZUFBZSxJQUNsQyxDQUFFRSxDQUFBQSxJQUFJRyxPQUFPLFlBQVlDLFdBQVUsS0FDbkMsT0FBT0osSUFBSUcsT0FBTyxDQUFDRCxLQUFLLEtBQUssVUFBVTtZQUN2QyxPQUFPRCxTQUFTLElBQUksQ0FBQ0ksOEJBQThCLENBQUNMO1FBQ3hEO1FBQ0EsSUFBSUcsVUFBVTtZQUFDSCxJQUFJTSxRQUFRO1lBQUVOLElBQUlPLEdBQUc7WUFBRVAsSUFBSVEsS0FBSztZQUFFUixJQUFJRSxLQUFLO1lBQUVGLElBQUlHLE9BQU87U0FBQztRQUN4RSxPQUFPRixTQUFTUSxLQUFLQyxTQUFTLENBQUNQO0lBQ25DO0lBQ0FFLCtCQUErQk0sT0FBTyxFQUFFO1FBQ3BDLElBQUlDO1FBQ0osSUFBSSxJQUFJLENBQUNDLGNBQWMsQ0FBQyxDQUFDRCxLQUFLRCxRQUFRUixPQUFPLE1B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QVcsTUFBTSxRQUFRdUIsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHdUQsSUFBSSxNQUFNO0lBQ3pLO0lBQ0F2QyxNQUFNd0MsR0FBRyxFQUFFckMsSUFBSSxFQUFFO1FBQ2IsSUFBSSxDQUFDcUMsT0FBTyxPQUFPQSxRQUFRLFVBQVU7WUFDakMsT0FBTyxDQUFDO1FBQ1o7UUFDQSxPQUFPdEMsT0FBT3VDLFdBQVcsQ0FBQ3ZDLE9BQU93QyxPQUFPLENBQUNGLEtBQUtHLE1BQU0sQ0FBQyxDQUFDLENBQUNDLElBQUksR0FBS3pDLEtBQUswQyxRQUFRLENBQUNEO0lBQ2xGO0FBQ0osRUFDQSxzQ0FBc0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi9zZXJpYWxpemVyLmpzPzgxZGIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VyaWFsaXplciB7XG4gICAgY29uc3RydWN0b3IoYWxsb3dlZE1ldGFkYXRhS2V5cykge1xuICAgICAgICB0aGlzLkhFQURFUl9MRU5HVEggPSAxO1xuICAgICAgICB0aGlzLlVTRVJfQlJPQURDQVNUX1BVU0hfTUVUQV9MRU5HVEggPSA2O1xuICAgICAgICB0aGlzLktJTkRTID0geyB1c2VyQnJvYWRjYXN0UHVzaDogMywgdXNlckJyb2FkY2FzdDogNCB9O1xuICAgICAgICB0aGlzLkJJTkFSWV9FTkNPRElORyA9IDA7XG4gICAgICAgIHRoaXMuSlNPTl9FTkNPRElORyA9IDE7XG4gICAgICAgIHRoaXMuQlJPQURDQVNUX0VWRU5UID0gJ2Jyb2FkY2FzdCc7XG4gICAgICAgIHRoaXMuYWxsb3dlZE1ldGFkYXRhS2V5cyA9IFtdO1xuICAgICAgICB0aGlzLmFsbG93ZWRNZXRhZGF0YUtleXMgPSBhbGxvd2VkTWV0YWRhdGFLZXlzICE9PSBudWxsICYmIGFsbG93ZWRNZXRhZGF0YUtleXMgIT09IHZvaWQgMCA/IGFsbG93ZWRNZXRhZGF0YUtleXMgOiBbXTtcbiAgICB9XG4gICAgZW5jb2RlKG1zZywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKG1zZy5ldmVudCA9PT0gdGhpcy5CUk9BRENBU1RfRVZFTlQgJiZcbiAgICAgICAgICAgICEobXNnLnBheWxvYWQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgJiZcbiAgICAgICAgICAgIHR5cGVvZiBtc2cucGF5bG9hZC5ldmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh0aGlzLl9iaW5hcnlFbmNvZGVVc2VyQnJvYWRjYXN0UHVzaChtc2cpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF5bG9hZCA9IFttc2cuam9pbl9yZWYsIG1zZy5yZWYsIG1zZy50b3BpYywgbXNnLmV2ZW50LCBtc2cucGF5bG9hZF07XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG4gICAgfVxuICAgIF9iaW5hcnlFbmNvZGVVc2VyQnJvYWRjYXN0UHVzaChtZXNzYWdlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQXJyYXlCdWZmZXIoKF9hID0gbWVzc2FnZS5wYXlsb2FkKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF5bG9hZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVCaW5hcnlVc2VyQnJvYWRjYXN0UHVzaChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVKc29uVXNlckJyb2FkY2FzdFB1c2gobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2VuY29kZUJpbmFyeVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgdXNlclBheWxvYWQgPSAoX2IgPSAoX2EgPSBtZXNzYWdlLnBheWxvYWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXlsb2FkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVVc2VyQnJvYWRjYXN0UHVzaChtZXNzYWdlLCB0aGlzLkJJTkFSWV9FTkNPRElORywgdXNlclBheWxvYWQpO1xuICAgIH1cbiAgICBfZW5jb2RlSnNvblVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgdXNlclBheWxvYWQgPSAoX2IgPSAoX2EgPSBtZXNzYWdlLnBheWxvYWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXlsb2FkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB7fTtcbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgICBjb25zdCBlbmNvZGVkVXNlclBheWxvYWQgPSBlbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh1c2VyUGF5bG9hZCkpLmJ1ZmZlcjtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UsIHRoaXMuSlNPTl9FTkNPRElORywgZW5jb2RlZFVzZXJQYXlsb2FkKTtcbiAgICB9XG4gICAgX2VuY29kZVVzZXJCcm9hZGNhc3RQdXNoKG1lc3NhZ2UsIGVuY29kaW5nVHlwZSwgZW5jb2RlZFBheWxvYWQpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgdG9waWMgPSBtZXNzYWdlLnRvcGljO1xuICAgICAgICBjb25zdCByZWYgPSAoX2EgPSBtZXNzYWdlLnJlZikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgICAgIGNvbnN0IGpvaW5SZWYgPSAoX2IgPSBtZXNzYWdlLmpvaW5fcmVmKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcbiAgICAgICAgY29uc3QgdXNlckV2ZW50ID0gbWVzc2FnZS5wYXlsb2FkLmV2ZW50O1xuICAgICAgICAvLyBGaWx0ZXIgbWV0YWRhdGEgYmFzZWQgb24gYWxsb3dlZCBrZXlzXG4gICAgICAgIGNvbnN0IHJlc3QgPSB0aGlzLmFsbG93ZWRNZXRhZGF0YUtleXNcbiAgICAgICAgICAgID8gdGhpcy5fcGljayhtZXNzYWdlLnBheWxvYWQsIHRoaXMuYWxsb3dlZE1ldGFkYXRhS2V5cylcbiAgICAgICAgICAgIDoge307XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gT2JqZWN0LmtleXMocmVzdCkubGVuZ3RoID09PSAwID8gJycgOiBKU09OLnN0cmluZ2lmeShyZXN0KTtcbiAgICAgICAgLy8gVmFsaWRhdGUgbGVuZ3RocyBkb24ndCBleGNlZWQgdWludDggbWF4IHZhbHVlICgyNTUpXG4gICAgICAgIGlmIChqb2luUmVmLmxlbmd0aCA+IDI1NSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBqb2luUmVmIGxlbmd0aCAke2pvaW5SZWYubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgMjU1YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZi5sZW5ndGggPiAyNTUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVmIGxlbmd0aCAke3JlZi5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAyNTVgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9waWMubGVuZ3RoID4gMjU1KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRvcGljIGxlbmd0aCAke3RvcGljLmxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtIG9mIDI1NWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VyRXZlbnQubGVuZ3RoID4gMjU1KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVzZXJFdmVudCBsZW5ndGggJHt1c2VyRXZlbnQubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgMjU1YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLmxlbmd0aCA+IDI1NSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtZXRhZGF0YSBsZW5ndGggJHttZXRhZGF0YS5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAyNTVgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhTGVuZ3RoID0gdGhpcy5VU0VSX0JST0FEQ0FTVF9QVVNIX01FVEFfTEVOR1RIICtcbiAgICAgICAgICAgIGpvaW5SZWYubGVuZ3RoICtcbiAgICAgICAgICAgIHJlZi5sZW5ndGggK1xuICAgICAgICAgICAgdG9waWMubGVuZ3RoICtcbiAgICAgICAgICAgIHVzZXJFdmVudC5sZW5ndGggK1xuICAgICAgICAgICAgbWV0YWRhdGEubGVuZ3RoO1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5IRUFERVJfTEVOR1RIICsgbWV0YUxlbmd0aCk7XG4gICAgICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGhlYWRlcik7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnVzZXJCcm9hZGNhc3RQdXNoKTsgLy8ga2luZFxuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luUmVmLmxlbmd0aCk7XG4gICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0KyssIHJlZi5sZW5ndGgpO1xuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpO1xuICAgICAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB1c2VyRXZlbnQubGVuZ3RoKTtcbiAgICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgbWV0YWRhdGEubGVuZ3RoKTtcbiAgICAgICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZW5jb2RpbmdUeXBlKTtcbiAgICAgICAgQXJyYXkuZnJvbShqb2luUmVmLCAoY2hhcikgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSk7XG4gICAgICAgIEFycmF5LmZyb20ocmVmLCAoY2hhcikgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSk7XG4gICAgICAgIEFycmF5LmZyb20odG9waWMsIChjaGFyKSA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbiAgICAgICAgQXJyYXkuZnJvbSh1c2VyRXZlbnQsIChjaGFyKSA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbiAgICAgICAgQXJyYXkuZnJvbShtZXRhZGF0YSwgKGNoYXIpID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpO1xuICAgICAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIGVuY29kZWRQYXlsb2FkLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMCk7XG4gICAgICAgIGNvbWJpbmVkLnNldChuZXcgVWludDhBcnJheShlbmNvZGVkUGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlcjtcbiAgICB9XG4gICAgZGVjb2RlKHJhd1BheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0FycmF5QnVmZmVyKHJhd1BheWxvYWQpKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByYXdQYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QganNvblBheWxvYWQgPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpO1xuICAgICAgICAgICAgY29uc3QgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBqc29uUGF5bG9hZDtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh7IGpvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2soe30pO1xuICAgIH1cbiAgICBfYmluYXJ5RGVjb2RlKGJ1ZmZlcikge1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IGtpbmQgPSB2aWV3LmdldFVpbnQ4KDApO1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSB0aGlzLktJTkRTLnVzZXJCcm9hZGNhc3Q6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29kZVVzZXJCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZGVjb2RlVXNlckJyb2FkY2FzdChidWZmZXIsIHZpZXcsIGRlY29kZXIpIHtcbiAgICAgICAgY29uc3QgdG9waWNTaXplID0gdmlldy5nZXRVaW50OCgxKTtcbiAgICAgICAgY29uc3QgdXNlckV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMik7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhU2l6ZSA9IHZpZXcuZ2V0VWludDgoMyk7XG4gICAgICAgIGNvbnN0IHBheWxvYWRFbmNvZGluZyA9IHZpZXcuZ2V0VWludDgoNCk7XG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyA0O1xuICAgICAgICBjb25zdCB0b3BpYyA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHRvcGljU2l6ZSkpO1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemU7XG4gICAgICAgIGNvbnN0IHVzZXJFdmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHVzZXJFdmVudFNpemUpKTtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgdXNlckV2ZW50U2l6ZTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBtZXRhZGF0YVNpemUpKTtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgbWV0YWRhdGFTaXplO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCBwYXJzZWRQYXlsb2FkID0gcGF5bG9hZEVuY29kaW5nID09PSB0aGlzLkpTT05fRU5DT0RJTkcgPyBKU09OLnBhcnNlKGRlY29kZXIuZGVjb2RlKHBheWxvYWQpKSA6IHBheWxvYWQ7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLkJST0FEQ0FTVF9FVkVOVCxcbiAgICAgICAgICAgIGV2ZW50OiB1c2VyRXZlbnQsXG4gICAgICAgICAgICBwYXlsb2FkOiBwYXJzZWRQYXlsb2FkLFxuICAgICAgICB9O1xuICAgICAgICAvLyBNZXRhZGF0YSBpcyBvcHRpb25hbCBhbmQgYWx3YXlzIEpTT04gZW5jb2RlZFxuICAgICAgICBpZiAobWV0YWRhdGFTaXplID4gMCkge1xuICAgICAgICAgICAgZGF0YVsnbWV0YSddID0gSlNPTi5wYXJzZShtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgam9pbl9yZWY6IG51bGwsIHJlZjogbnVsbCwgdG9waWM6IHRvcGljLCBldmVudDogdGhpcy5CUk9BRENBU1RfRVZFTlQsIHBheWxvYWQ6IGRhdGEgfTtcbiAgICB9XG4gICAgX2lzQXJyYXlCdWZmZXIoYnVmZmVyKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8ICgoX2EgPSBidWZmZXIgPT09IG51bGwgfHwgYnVmZmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBidWZmZXIuY29uc3RydWN0b3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uYW1lKSA9PT0gJ0FycmF5QnVmZmVyJztcbiAgICB9XG4gICAgX3BpY2sob2JqLCBrZXlzKSB7XG4gICAgICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhvYmopLmZpbHRlcigoW2tleV0pID0+IGtleXMuaW5jbHVkZXMoa2V5KSkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcmlhbGl6ZXIuanMubWFwIl0sIm5hbWVzIjpbIlNlcmlhbGl6ZXIiLCJjb25zdHJ1Y3RvciIsImFsbG93ZWRNZXRhZGF0YUtleXMiLCJIRUFERVJfTEVOR1RIIiwiVVNFUl9CUk9BRENBU1RfUFVTSF9NRVRBX0xFTkdUSCIsIktJTkRTIiwidXNlckJyb2FkY2FzdFB1c2giLCJ1c2VyQnJvYWRjYXN0IiwiQklOQVJZX0VOQ09ESU5HIiwiSlNPTl9FTkNPRElORyIsIkJST0FEQ0FTVF9FVkVOVCIsImVuY29kZSIsIm1zZyIsImNhbGxiYWNrIiwiZXZlbnQiLCJwYXlsb2FkIiwiQXJyYXlCdWZmZXIiLCJfYmluYXJ5RW5jb2RlVXNlckJyb2FkY2FzdFB1c2giLCJqb2luX3JlZiIsInJlZiIsInRvcGljIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1lc3NhZ2UiLCJfYSIsIl9pc0FycmF5QnVmZmVyIiwiX2VuY29kZUJpbmFyeVVzZXJCcm9hZGNhc3RQdXNoIiwiX2VuY29kZUpzb25Vc2VyQnJvYWRjYXN0UHVzaCIsIl9iIiwidXNlclBheWxvYWQiLCJfZW5jb2RlVXNlckJyb2FkY2FzdFB1c2giLCJlbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJlbmNvZGVkVXNlclBheWxvYWQiLCJidWZmZXIiLCJlbmNvZGluZ1R5cGUiLCJlbmNvZGVkUGF5bG9hZCIsImpvaW5SZWYiLCJ1c2VyRXZlbnQiLCJyZXN0IiwiX3BpY2siLCJtZXRhZGF0YSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJFcnJvciIsIm1ldGFMZW5ndGgiLCJoZWFkZXIiLCJ2aWV3IiwiRGF0YVZpZXciLCJvZmZzZXQiLCJzZXRVaW50OCIsIkFycmF5IiwiZnJvbSIsImNoYXIiLCJjaGFyQ29kZUF0IiwiY29tYmluZWQiLCJVaW50OEFycmF5IiwiYnl0ZUxlbmd0aCIsInNldCIsImRlY29kZSIsInJhd1BheWxvYWQiLCJyZXN1bHQiLCJfYmluYXJ5RGVjb2RlIiwianNvblBheWxvYWQiLCJwYXJzZSIsImtpbmQiLCJnZXRVaW50OCIsImRlY29kZXIiLCJUZXh0RGVjb2RlciIsIl9kZWNvZGVVc2VyQnJvYWRjYXN0IiwidG9waWNTaXplIiwidXNlckV2ZW50U2l6ZSIsIm1ldGFkYXRhU2l6ZSIsInBheWxvYWRFbmNvZGluZyIsInNsaWNlIiwicGFyc2VkUGF5bG9hZCIsImRhdGEiLCJ0eXBlIiwibmFtZSIsIm9iaiIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsImZpbHRlciIsImtleSIsImluY2x1ZGVzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/serializer.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/timer.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* 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 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 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} //# sourceMappingURL=timer.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3RpbWVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Q0FXQyxHQUNjLE1BQU1BO0lBQ2pCQyxZQUFZQyxRQUFRLEVBQUVDLFNBQVMsQ0FBRTtRQUM3QixJQUFJLENBQUNELFFBQVEsR0FBR0E7UUFDaEIsSUFBSSxDQUFDQyxTQUFTLEdBQUdBO1FBQ2pCLElBQUksQ0FBQ0MsS0FBSyxHQUFHQztRQUNiLElBQUksQ0FBQ0MsS0FBSyxHQUFHO1FBQ2IsSUFBSSxDQUFDSixRQUFRLEdBQUdBO1FBQ2hCLElBQUksQ0FBQ0MsU0FBUyxHQUFHQTtJQUNyQjtJQUNBSSxRQUFRO1FBQ0osSUFBSSxDQUFDRCxLQUFLLEdBQUc7UUFDYkUsYUFBYSxJQUFJLENBQUNKLEtBQUs7UUFDdkIsSUFBSSxDQUFDQSxLQUFLLEdBQUdDO0lBQ2pCO0lBQ0EsOERBQThEO0lBQzlESSxrQkFBa0I7UUFDZEQsYUFBYSxJQUFJLENBQUNKLEtBQUs7UUFDdkIsSUFBSSxDQUFDQSxLQUFLLEdBQUdNLFdBQVc7WUFDcEIsSUFBSSxDQUFDSixLQUFLLEdBQUcsSUFBSSxDQUFDQSxLQUFLLEdBQUc7WUFDMUIsSUFBSSxDQUFDSixRQUFRO1FBQ2pCLEdBQUcsSUFBSSxDQUFDQyxTQUFTLENBQUMsSUFBSSxDQUFDRyxLQUFLLEdBQUc7SUFDbkM7QUFDSixFQUNBLGlDQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3RpbWVyLmpzPzExNWUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVzIGEgdGltZXIgdGhhdCBhY2NlcHRzIGEgYHRpbWVyQ2FsY2AgZnVuY3Rpb24gdG8gcGVyZm9ybSBjYWxjdWxhdGVkIHRpbWVvdXQgcmV0cmllcywgc3VjaCBhcyBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgICBsZXQgcmVjb25uZWN0VGltZXIgPSBuZXcgVGltZXIoKCkgPT4gdGhpcy5jb25uZWN0KCksIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgICAgcmV0dXJuIFsxMDAwLCA1MDAwLCAxMDAwMF1bdHJpZXMgLSAxXSB8fCAxMDAwMFxuICogICAgfSlcbiAqICAgIHJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpIC8vIGZpcmVzIGFmdGVyIDEwMDBcbiAqICAgIHJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpIC8vIGZpcmVzIGFmdGVyIDUwMDBcbiAqICAgIHJlY29ubmVjdFRpbWVyLnJlc2V0KClcbiAqICAgIHJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpIC8vIGZpcmVzIGFmdGVyIDEwMDBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrLCB0aW1lckNhbGMpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsYztcbiAgICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy50cmllcyA9IDA7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgdGhpcy50aW1lckNhbGMgPSB0aW1lckNhbGM7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnRyaWVzID0gMDtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgICB0aGlzLnRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBDYW5jZWxzIGFueSBwcmV2aW91cyBzY2hlZHVsZVRpbWVvdXQgYW5kIHNjaGVkdWxlcyBjYWxsYmFja1xuICAgIHNjaGVkdWxlVGltZW91dCgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyaWVzID0gdGhpcy50cmllcyArIDE7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrKCk7XG4gICAgICAgIH0sIHRoaXMudGltZXJDYWxjKHRoaXMudHJpZXMgKyAxKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZXIuanMubWFwIl0sIm5hbWVzIjpbIlRpbWVyIiwiY29uc3RydWN0b3IiLCJjYWxsYmFjayIsInRpbWVyQ2FsYyIsInRpbWVyIiwidW5kZWZpbmVkIiwidHJpZXMiLCJyZXNldCIsImNsZWFyVGltZW91dCIsInNjaGVkdWxlVGltZW91dCIsInNldFRpbWVvdXQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js":
|
||
/*!*********************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/timer.js ***!
|
||
\*********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* 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 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 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} //# sourceMappingURL=timer.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi90aW1lci5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7Ozs7Ozs7Ozs7O0NBV0MsR0FDYyxNQUFNQTtJQUNqQkMsWUFBWUMsUUFBUSxFQUFFQyxTQUFTLENBQUU7UUFDN0IsSUFBSSxDQUFDRCxRQUFRLEdBQUdBO1FBQ2hCLElBQUksQ0FBQ0MsU0FBUyxHQUFHQTtRQUNqQixJQUFJLENBQUNDLEtBQUssR0FBR0M7UUFDYixJQUFJLENBQUNDLEtBQUssR0FBRztRQUNiLElBQUksQ0FBQ0osUUFBUSxHQUFHQTtRQUNoQixJQUFJLENBQUNDLFNBQVMsR0FBR0E7SUFDckI7SUFDQUksUUFBUTtRQUNKLElBQUksQ0FBQ0QsS0FBSyxHQUFHO1FBQ2JFLGFBQWEsSUFBSSxDQUFDSixLQUFLO1FBQ3ZCLElBQUksQ0FBQ0EsS0FBSyxHQUFHQztJQUNqQjtJQUNBLDhEQUE4RDtJQUM5REksa0JBQWtCO1FBQ2RELGFBQWEsSUFBSSxDQUFDSixLQUFLO1FBQ3ZCLElBQUksQ0FBQ0EsS0FBSyxHQUFHTSxXQUFXO1lBQ3BCLElBQUksQ0FBQ0osS0FBSyxHQUFHLElBQUksQ0FBQ0EsS0FBSyxHQUFHO1lBQzFCLElBQUksQ0FBQ0osUUFBUTtRQUNqQixHQUFHLElBQUksQ0FBQ0MsU0FBUyxDQUFDLElBQUksQ0FBQ0csS0FBSyxHQUFHO0lBQ25DO0FBQ0osRUFDQSxpQ0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi90aW1lci5qcz8xMTVlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm0gY2FsY3VsYXRlZCB0aW1lb3V0IHJldHJpZXMsIHN1Y2ggYXMgZXhwb25lbnRpYWwgYmFja29mZi5cbiAqXG4gKiBAZXhhbXBsZVxuICogICAgbGV0IHJlY29ubmVjdFRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHRoaXMuY29ubmVjdCgpLCBmdW5jdGlvbih0cmllcyl7XG4gKiAgICAgIHJldHVybiBbMTAwMCwgNTAwMCwgMTAwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAqICAgIH0pXG4gKiAgICByZWNvbm5lY3RUaW1lci5zY2hlZHVsZVRpbWVvdXQoKSAvLyBmaXJlcyBhZnRlciAxMDAwXG4gKiAgICByZWNvbm5lY3RUaW1lci5zY2hlZHVsZVRpbWVvdXQoKSAvLyBmaXJlcyBhZnRlciA1MDAwXG4gKiAgICByZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gKiAgICByZWNvbm5lY3RUaW1lci5zY2hlZHVsZVRpbWVvdXQoKSAvLyBmaXJlcyBhZnRlciAxMDAwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbWVyIHtcbiAgICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgdGhpcy50aW1lckNhbGMgPSB0aW1lckNhbGM7XG4gICAgICAgIHRoaXMudGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudHJpZXMgPSAwO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMudGltZXJDYWxjID0gdGltZXJDYWxjO1xuICAgIH1cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy50cmllcyA9IDA7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gQ2FuY2VscyBhbnkgcHJldmlvdXMgc2NoZWR1bGVUaW1lb3V0IGFuZCBzY2hlZHVsZXMgY2FsbGJhY2tcbiAgICBzY2hlZHVsZVRpbWVvdXQoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmllcyA9IHRoaXMudHJpZXMgKyAxO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjaygpO1xuICAgICAgICB9LCB0aGlzLnRpbWVyQ2FsYyh0aGlzLnRyaWVzICsgMSkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWVyLmpzLm1hcCJdLCJuYW1lcyI6WyJUaW1lciIsImNvbnN0cnVjdG9yIiwiY2FsbGJhY2siLCJ0aW1lckNhbGMiLCJ0aW1lciIsInVuZGVmaW5lZCIsInRyaWVzIiwicmVzZXQiLCJjbGVhclRpbWVvdXQiLCJzY2hlZHVsZVRpbWVvdXQiLCJzZXRUaW1lb3V0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/timer.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js":
|
||
/*!****************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js ***!
|
||
\****************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PostgresTypes: () => (/* binding */ PostgresTypes),\n/* harmony export */ convertCell: () => (/* binding */ convertCell),\n/* harmony export */ convertChangeData: () => (/* binding */ convertChangeData),\n/* harmony export */ convertColumn: () => (/* binding */ convertColumn),\n/* harmony export */ httpEndpointURL: () => (/* binding */ httpEndpointURL),\n/* harmony export */ toArray: () => (/* binding */ toArray),\n/* harmony export */ toBoolean: () => (/* binding */ toBoolean),\n/* harmony export */ toJson: () => (/* binding */ toJson),\n/* harmony export */ toNumber: () => (/* binding */ toNumber),\n/* harmony export */ toTimestampString: () => (/* 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 = (columns, record, options = {})=>{\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3RyYW5zZm9ybWVycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0NBRUMsR0FDRCwwRUFBMEU7QUFDMUUseUZBQXlGO0FBQ2xGLElBQUlBLGNBQWM7QUFDeEIsVUFBVUEsYUFBYTtJQUNwQkEsYUFBYSxDQUFDLFVBQVUsR0FBRztJQUMzQkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLFlBQVksR0FBRztJQUM3QkEsYUFBYSxDQUFDLFNBQVMsR0FBRztJQUMxQkEsYUFBYSxDQUFDLFNBQVMsR0FBRztJQUMxQkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLFlBQVksR0FBRztJQUM3QkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLFlBQVksR0FBRztJQUM3QkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLFFBQVEsR0FBRztJQUN6QkEsYUFBYSxDQUFDLFFBQVEsR0FBRztJQUN6QkEsYUFBYSxDQUFDLFVBQVUsR0FBRztJQUMzQkEsYUFBYSxDQUFDLE1BQU0sR0FBRztJQUN2QkEsYUFBYSxDQUFDLFVBQVUsR0FBRztJQUMzQkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLE9BQU8sR0FBRztJQUN4QkEsYUFBYSxDQUFDLFlBQVksR0FBRztJQUM3QkEsYUFBYSxDQUFDLGNBQWMsR0FBRztJQUMvQkEsYUFBYSxDQUFDLFNBQVMsR0FBRztJQUMxQkEsYUFBYSxDQUFDLFVBQVUsR0FBRztJQUMzQkEsYUFBYSxDQUFDLFlBQVksR0FBRztBQUNqQyxHQUFHQSxpQkFBa0JBLENBQUFBLGdCQUFnQixDQUFDO0FBQ3RDOzs7Ozs7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TW9ELE9BQU8sQ0FBQyxLQUFLO0lBQzlCO0lBQ0EsT0FBT3BEO0FBQ1gsRUFBRTtBQUNLLE1BQU1xRCxrQkFBa0IsQ0FBQ0M7SUFDNUIsTUFBTUMsUUFBUSxJQUFJQyxJQUFJRjtJQUN0QkMsTUFBTUUsUUFBUSxHQUFHRixNQUFNRSxRQUFRLENBQUNMLE9BQU8sQ0FBQyxRQUFRO0lBQ2hERyxNQUFNRyxRQUFRLEdBQUdILE1BQU1HLFFBQVEsQ0FDMUJOLE9BQU8sQ0FBQyxRQUFRLElBQUksOEJBQThCO0tBQ2xEQSxPQUFPLENBQUMseUJBQXlCLElBQUksbUNBQW1DO0tBQ3hFQSxPQUFPLENBQUMsY0FBYyxJQUFJLHlCQUF5QjtLQUNuREEsT0FBTyxDQUFDLGlCQUFpQixLQUFLLDRCQUE0QjtJQUMvRCxJQUFJRyxNQUFNRyxRQUFRLEtBQUssTUFBTUgsTUFBTUcsUUFBUSxLQUFLLEtBQUs7UUFDakRILE1BQU1HLFFBQVEsR0FBRztJQUNyQixPQUNLO1FBQ0RILE1BQU1HLFFBQVEsR0FBR0gsTUFBTUcsUUFBUSxHQUFHO0lBQ3RDO0lBQ0EsT0FBT0gsTUFBTUksSUFBSTtBQUNyQixFQUFFLENBQ0Ysd0NBQXdDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9saWIvdHJhbnNmb3JtZXJzLmpzPzNmYzAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIZWxwZXJzIHRvIGNvbnZlcnQgdGhlIGNoYW5nZSBQYXlsb2FkIGludG8gbmF0aXZlIEpTIHR5cGVzLlxuICovXG4vLyBBZGFwdGVkIGZyb20gZXBnc3FsIChzcmMvZXBnc3FsX2JpbmFyeS5lcmwpLCB0aGlzIG1vZHVsZSBsaWNlbnNlZCB1bmRlclxuLy8gMy1jbGF1c2UgQlNEIGZvdW5kIGhlcmU6IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lcGdzcWwvZXBnc3FsL2RldmVsL0xJQ0VOU0VcbmV4cG9ydCB2YXIgUG9zdGdyZXNUeXBlcztcbihmdW5jdGlvbiAoUG9zdGdyZXNUeXBlcykge1xuICAgIFBvc3RncmVzVHlwZXNbXCJhYnN0aW1lXCJdID0gXCJhYnN0aW1lXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImJvb2xcIl0gPSBcImJvb2xcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiZGF0ZVwiXSA9IFwiZGF0ZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJkYXRlcmFuZ2VcIl0gPSBcImRhdGVyYW5nZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJmbG9hdDRcIl0gPSBcImZsb2F0NFwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJmbG9hdDhcIl0gPSBcImZsb2F0OFwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJpbnQyXCJdID0gXCJpbnQyXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImludDRcIl0gPSBcImludDRcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiaW50NHJhbmdlXCJdID0gXCJpbnQ0cmFuZ2VcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiaW50OFwiXSA9IFwiaW50OFwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJpbnQ4cmFuZ2VcIl0gPSBcImludDhyYW5nZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJqc29uXCJdID0gXCJqc29uXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImpzb25iXCJdID0gXCJqc29uYlwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJtb25leVwiXSA9IFwibW9uZXlcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wibnVtZXJpY1wiXSA9IFwibnVtZXJpY1wiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJvaWRcIl0gPSBcIm9pZFwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJyZWx0aW1lXCJdID0gXCJyZWx0aW1lXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcInRleHRcIl0gPSBcInRleHRcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widGltZVwiXSA9IFwidGltZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJ0aW1lc3RhbXBcIl0gPSBcInRpbWVzdGFtcFwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJ0aW1lc3RhbXB0elwiXSA9IFwidGltZXN0YW1wdHpcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widGltZXR6XCJdID0gXCJ0aW1ldHpcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widHNyYW5nZVwiXSA9IFwidHNyYW5nZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJ0c3R6cmFuZ2VcIl0gPSBcInRzdHpyYW5nZVwiO1xufSkoUG9zdGdyZXNUeXBlcyB8fCAoUG9zdGdyZXNUeXBlcyA9IHt9KSk7XG4vKipcbiAqIFRha2VzIGFuIGFycmF5IG9mIGNvbHVtbnMgYW5kIGFuIG9iamVjdCBvZiBzdHJpbmcgdmFsdWVzIHRoZW4gY29udmVydHMgZWFjaCBzdHJpbmcgdmFsdWVcbiAqIHRvIGl0cyBtYXBwZWQgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge3tuYW1lOiBTdHJpbmcsIHR5cGU6IFN0cmluZ31bXX0gY29sdW1uc1xuICogQHBhcmFtIHtPYmplY3R9IHJlY29yZFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhlIG1hcCBvZiB2YXJpb3VzIG9wdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB0aGUgbWFwcGVyXG4gKiBAcGFyYW0ge0FycmF5fSBvcHRpb25zLnNraXBUeXBlcyBUaGUgYXJyYXkgb2YgdHlwZXMgdGhhdCBzaG91bGQgbm90IGJlIGNvbnZlcnRlZFxuICpcbiAqIEBleGFtcGxlIGNvbnZlcnRDaGFuZ2VEYXRhKFt7bmFtZTogJ2ZpcnN0X25hbWUnLCB0eXBlOiAndGV4dCd9LCB7bmFtZTogJ2FnZScsIHR5cGU6ICdpbnQ0J31dLCB7Zmlyc3RfbmFtZTogJ1BhdWwnLCBhZ2U6JzMzJ30sIHt9KVxuICogLy89PnsgZmlyc3RfbmFtZTogJ1BhdWwnLCBhZ2U6IDMzIH1cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRDaGFuZ2VEYXRhID0gKGNvbHVtbnMsIHJlY29yZCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHNraXBUeXBlcyA9IChfYSA9IG9wdGlvbnMuc2tpcFR5cGVzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICBpZiAoIXJlY29yZCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZWNvcmQpLnJlZHVjZSgoYWNjLCByZWNfa2V5KSA9PiB7XG4gICAgICAgIGFjY1tyZWNfa2V5XSA9IGNvbnZlcnRDb2x1bW4ocmVjX2tleSwgY29sdW1ucywgcmVjb3JkLCBza2lwVHlwZXMpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn07XG4vKipcbiAqIENvbnZlcnRzIHRoZSB2YWx1ZSBvZiBhbiBpbmRpdmlkdWFsIGNvbHVtbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gY29sdW1uTmFtZSBUaGUgY29sdW1uIHRoYXQgeW91IHdhbnQgdG8gY29udmVydFxuICogQHBhcmFtIHt7bmFtZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9W119IGNvbHVtbnMgQWxsIG9mIHRoZSBjb2x1bW5zXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjb3JkIFRoZSBtYXAgb2Ygc3RyaW5nIHZhbHVlc1xuICogQHBhcmFtIHtBcnJheX0gc2tpcFR5cGVzIEFuIGFycmF5IG9mIHR5cGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBjb252ZXJ0ZWRcbiAqIEByZXR1cm4ge29iamVjdH0gVXNlbGVzcyBpbmZvcm1hdGlvblxuICpcbiAqIEBleGFtcGxlIGNvbnZlcnRDb2x1bW4oJ2FnZScsIFt7bmFtZTogJ2ZpcnN0X25hbWUnLCB0eXBlOiAndGV4dCd9LCB7bmFtZTogJ2FnZScsIHR5cGU6ICdpbnQ0J31dLCB7Zmlyc3RfbmFtZTogJ1BhdWwnLCBhZ2U6ICczMyd9LCBbXSlcbiAqIC8vPT4gMzNcbiAqIEBleGFtcGxlIGNvbnZlcnRDb2x1bW4oJ2FnZScsIFt7bmFtZTogJ2ZpcnN0X25hbWUnLCB0eXBlOiAndGV4dCd9LCB7bmFtZTogJ2FnZScsIHR5cGU6ICdpbnQ0J31dLCB7Zmlyc3RfbmFtZTogJ1BhdWwnLCBhZ2U6ICczMyd9LCBbJ2ludDQnXSlcbiAqIC8vPT4gXCIzM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0Q29sdW1uID0gKGNvbHVtbk5hbWUsIGNvbHVtbnMsIHJlY29yZCwgc2tpcFR5cGVzKSA9PiB7XG4gICAgY29uc3QgY29sdW1uID0gY29sdW1ucy5maW5kKCh4KSA9PiB4Lm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIGNvbnN0IGNvbFR5cGUgPSBjb2x1bW4gPT09IG51bGwgfHwgY29sdW1uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb2x1bW4udHlwZTtcbiAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFtjb2x1bW5OYW1lXTtcbiAgICBpZiAoY29sVHlwZSAmJiAhc2tpcFR5cGVzLmluY2x1ZGVzKGNvbFR5cGUpKSB7XG4gICAgICAgIHJldHVybiBjb252ZXJ0Q2VsbChjb2xUeXBlLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBub29wKHZhbHVlKTtcbn07XG4vKipcbiAqIElmIHRoZSB2YWx1ZSBvZiB0aGUgY2VsbCBpcyBgbnVsbGAsIHJldHVybnMgbnVsbC5cbiAqIE90aGVyd2lzZSBjb252ZXJ0cyB0aGUgc3RyaW5nIHZhbHVlIHRvIHRoZSBjb3JyZWN0IHR5cGUuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBBIHBvc3RncmVzIGNvbHVtbiB0eXBlXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgVGhlIGNlbGwgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZSBjb252ZXJ0Q2VsbCgnYm9vbCcsICd0JylcbiAqIC8vPT4gdHJ1ZVxuICogQGV4YW1wbGUgY29udmVydENlbGwoJ2ludDgnLCAnMTAnKVxuICogLy89PiAxMFxuICogQGV4YW1wbGUgY29udmVydENlbGwoJ19pbnQ0JywgJ3sxLDIsMyw0fScpXG4gKiAvLz0+IFsxLDIsMyw0XVxuICovXG5leHBvcnQgY29uc3QgY29udmVydENlbGwgPSAodHlwZSwgdmFsdWUpID0+IHtcbiAgICAvLyBpZiBkYXRhIHR5cGUgaXMgYW4gYXJyYXlcbiAgICBpZiAodHlwZS5jaGFyQXQoMCkgPT09ICdfJykge1xuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IHR5cGUuc2xpY2UoMSwgdHlwZS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gdG9BcnJheSh2YWx1ZSwgZGF0YVR5cGUpO1xuICAgIH1cbiAgICAvLyBJZiBub3QgbnVsbCwgY29udmVydCB0byBjb3JyZWN0IHR5cGUuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5ib29sOlxuICAgICAgICAgICAgcmV0dXJuIHRvQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5mbG9hdDQ6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5mbG9hdDg6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5pbnQyOlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuaW50NDpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmludDg6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5udW1lcmljOlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMub2lkOlxuICAgICAgICAgICAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmpzb246XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5qc29uYjpcbiAgICAgICAgICAgIHJldHVybiB0b0pzb24odmFsdWUpO1xuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMudGltZXN0YW1wOlxuICAgICAgICAgICAgcmV0dXJuIHRvVGltZXN0YW1wU3RyaW5nKHZhbHVlKTsgLy8gRm9ybWF0IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBQb3N0Z1JFU1RcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmFic3RpbWU6IC8vIFRvIGFsbG93IHVzZXJzIHRvIGNhc3QgaXQgYmFzZWQgb24gVGltZXpvbmVcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmRhdGU6IC8vIFRvIGFsbG93IHVzZXJzIHRvIGNhc3QgaXQgYmFzZWQgb24gVGltZXpvbmVcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmRhdGVyYW5nZTpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmludDRyYW5nZTpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmludDhyYW5nZTpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLm1vbmV5OlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMucmVsdGltZTogLy8gVG8gYWxsb3cgdXNlcnMgdG8gY2FzdCBpdCBiYXNlZCBvbiBUaW1lem9uZVxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMudGV4dDpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnRpbWU6IC8vIFRvIGFsbG93IHVzZXJzIHRvIGNhc3QgaXQgYmFzZWQgb24gVGltZXpvbmVcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnRpbWVzdGFtcHR6OiAvLyBUbyBhbGxvdyB1c2VycyB0byBjYXN0IGl0IGJhc2VkIG9uIFRpbWV6b25lXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy50aW1ldHo6IC8vIFRvIGFsbG93IHVzZXJzIHRvIGNhc3QgaXQgYmFzZWQgb24gVGltZXpvbmVcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnRzcmFuZ2U6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy50c3R6cmFuZ2U6XG4gICAgICAgICAgICByZXR1cm4gbm9vcCh2YWx1ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGZvciByZW1haW5pbmcgdHlwZXNcbiAgICAgICAgICAgIHJldHVybiBub29wKHZhbHVlKTtcbiAgICB9XG59O1xuY29uc3Qgbm9vcCA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZTtcbn07XG5leHBvcnQgY29uc3QgdG9Cb29sZWFuID0gKHZhbHVlKSA9PiB7XG4gICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICBjYXNlICd0JzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdmJzpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IHRvTnVtYmVyID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbmV4cG9ydCBjb25zdCB0b0pzb24gPSAodmFsdWUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG4vKipcbiAqIENvbnZlcnRzIGEgUG9zdGdyZXMgQXJyYXkgaW50byBhIG5hdGl2ZSBKUyBhcnJheVxuICpcbiAqIEBleGFtcGxlIHRvQXJyYXkoJ3t9JywgJ2ludDQnKVxuICogLy89PiBbXVxuICogQGV4YW1wbGUgdG9BcnJheSgne1wiWzIwMjEtMDEtMDEsMjAyMS0xMi0zMSlcIixcIigyMDIxLTAxLTAxLDIwMjEtMTItMzJdXCJ9JywgJ2RhdGVyYW5nZScpXG4gKiAvLz0+IFsnWzIwMjEtMDEtMDEsMjAyMS0xMi0zMSknLCAnKDIwMjEtMDEtMDEsMjAyMS0xMi0zMl0nXVxuICogQGV4YW1wbGUgdG9BcnJheShbMSwyLDMsNF0sICdpbnQ0JylcbiAqIC8vPT4gWzEsMiwzLDRdXG4gKi9cbmV4cG9ydCBjb25zdCB0b0FycmF5ID0gKHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBsYXN0SWR4ID0gdmFsdWUubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBjbG9zZUJyYWNlID0gdmFsdWVbbGFzdElkeF07XG4gICAgY29uc3Qgb3BlbkJyYWNlID0gdmFsdWVbMF07XG4gICAgLy8gQ29uZmlybSB2YWx1ZSBpcyBhIFBvc3RncmVzIGFycmF5IGJ5IGNoZWNraW5nIGN1cmx5IGJyYWNrZXRzXG4gICAgaWYgKG9wZW5CcmFjZSA9PT0gJ3snICYmIGNsb3NlQnJhY2UgPT09ICd9Jykge1xuICAgICAgICBsZXQgYXJyO1xuICAgICAgICBjb25zdCB2YWxUcmltID0gdmFsdWUuc2xpY2UoMSwgbGFzdElkeCk7XG4gICAgICAgIC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgc29sdXRpb24gdG8gc2VwYXJhdGUgUG9zdGdyZXMgYXJyYXkgZGF0YVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXJyID0gSlNPTi5wYXJzZSgnWycgKyB2YWxUcmltICsgJ10nKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgLy8gV0FSTklORzogc3BsaXR0aW5nIG9uIGNvbW1hIGRvZXMgbm90IGNvdmVyIGFsbCBlZGdlIGNhc2VzXG4gICAgICAgICAgICBhcnIgPSB2YWxUcmltID8gdmFsVHJpbS5zcGxpdCgnLCcpIDogW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyci5tYXAoKHZhbCkgPT4gY29udmVydENlbGwodHlwZSwgdmFsKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG4vKipcbiAqIEZpeGVzIHRpbWVzdGFtcCB0byBiZSBJU08tODYwMS4gU3dhcHMgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGRhdGUgYW5kIHRpbWUgZm9yIGEgJ1QnXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3N1cGFiYXNlL3N1cGFiYXNlL2lzc3Vlcy8xOFxuICpcbiAqIEBleGFtcGxlIHRvVGltZXN0YW1wU3RyaW5nKCcyMDE5LTA5LTEwIDAwOjAwOjAwJylcbiAqIC8vPT4gJzIwMTktMDktMTBUMDA6MDA6MDAnXG4gKi9cbmV4cG9ydCBjb25zdCB0b1RpbWVzdGFtcFN0cmluZyA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCcgJywgJ1QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbmV4cG9ydCBjb25zdCBodHRwRW5kcG9pbnRVUkwgPSAoc29ja2V0VXJsKSA9PiB7XG4gICAgY29uc3Qgd3NVcmwgPSBuZXcgVVJMKHNvY2tldFVybCk7XG4gICAgd3NVcmwucHJvdG9jb2wgPSB3c1VybC5wcm90b2NvbC5yZXBsYWNlKC9ed3MvaSwgJ2h0dHAnKTtcbiAgICB3c1VybC5wYXRobmFtZSA9IHdzVXJsLnBhdGhuYW1lXG4gICAgICAgIC5yZXBsYWNlKC9cXC8rJC8sICcnKSAvLyByZW1vdmUgYWxsIHRyYWlsaW5nIHNsYXNoZXNcbiAgICAgICAgLnJlcGxhY2UoL1xcL3NvY2tldFxcL3dlYnNvY2tldCQvaSwgJycpIC8vIHJlbW92ZSB0aGUgc29ja2V0L3dlYnNvY2tldCBwYXRoXG4gICAgICAgIC5yZXBsYWNlKC9cXC9zb2NrZXQkL2ksICcnKSAvLyByZW1vdmUgdGhlIHNvY2tldCBwYXRoXG4gICAgICAgIC5yZXBsYWNlKC9cXC93ZWJzb2NrZXQkL2ksICcnKTsgLy8gcmVtb3ZlIHRoZSB3ZWJzb2NrZXQgcGF0aFxuICAgIGlmICh3c1VybC5wYXRobmFtZSA9PT0gJycgfHwgd3NVcmwucGF0aG5hbWUgPT09ICcvJykge1xuICAgICAgICB3c1VybC5wYXRobmFtZSA9ICcvYXBpL2Jyb2FkY2FzdCc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB3c1VybC5wYXRobmFtZSA9IHdzVXJsLnBhdGhuYW1lICsgJy9hcGkvYnJvYWRjYXN0JztcbiAgICB9XG4gICAgcmV0dXJuIHdzVXJsLmhyZWY7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNmb3JtZXJzLmpzLm1hcCJdLCJuYW1lcyI6WyJQb3N0Z3Jlc1R5cGVzIiwiY29udmVydENoYW5nZURhdGEiLCJjb2x1bW5zIiwicmVjb3JkIiwib3B0aW9ucyIsIl9hIiwic2tpcFR5cGVzIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImFjYyIsInJlY19rZXkiLCJjb252ZXJ0Q29sdW1uIiwiY29sdW1uTmFtZSIsImNvbHVtbiIsImZpbmQiLCJ4IiwibmFtZSIsImNvbFR5cGUiLCJ0eXBlIiwidmFsdWUiLCJpbmNsdWRlcyIsImNvbnZlcnRDZWxsIiwibm9vcCIsImNoYXJBdCIsImRhdGFUeXBlIiwic2xpY2UiLCJsZW5ndGgiLCJ0b0FycmF5IiwiYm9vbCIsInRvQm9vbGVhbiIsImZsb2F0NCIsImZsb2F0OCIsImludDIiLCJpbnQ0IiwiaW50OCIsIm51bWVyaWMiLCJvaWQiLCJ0b051bWJlciIsImpzb24iLCJqc29uYiIsInRvSnNvbiIsInRpbWVzdGFtcCIsInRvVGltZXN0YW1wU3RyaW5nIiwiYWJzdGltZSIsImRhdGUiLCJkYXRlcmFuZ2UiLCJpbnQ0cmFuZ2UiLCJpbnQ4cmFuZ2UiLCJtb25leSIsInJlbHRpbWUiLCJ0ZXh0IiwidGltZSIsInRpbWVzdGFtcHR6IiwidGltZXR6IiwidHNyYW5nZSIsInRzdHpyYW5nZSIsInBhcnNlZFZhbHVlIiwicGFyc2VGbG9hdCIsIk51bWJlciIsImlzTmFOIiwiSlNPTiIsInBhcnNlIiwibGFzdElkeCIsImNsb3NlQnJhY2UiLCJvcGVuQnJhY2UiLCJhcnIiLCJ2YWxUcmltIiwiXyIsInNwbGl0IiwibWFwIiwidmFsIiwicmVwbGFjZSIsImh0dHBFbmRwb2ludFVSTCIsInNvY2tldFVybCIsIndzVXJsIiwiVVJMIiwicHJvdG9jb2wiLCJwYXRobmFtZSIsImhyZWYiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js":
|
||
/*!****************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js ***!
|
||
\****************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PostgresTypes: () => (/* binding */ PostgresTypes),\n/* harmony export */ convertCell: () => (/* binding */ convertCell),\n/* harmony export */ convertChangeData: () => (/* binding */ convertChangeData),\n/* harmony export */ convertColumn: () => (/* binding */ convertColumn),\n/* harmony export */ httpEndpointURL: () => (/* binding */ httpEndpointURL),\n/* harmony export */ toArray: () => (/* binding */ toArray),\n/* harmony export */ toBoolean: () => (/* binding */ toBoolean),\n/* harmony export */ toJson: () => (/* binding */ toJson),\n/* harmony export */ toNumber: () => (/* binding */ toNumber),\n/* harmony export */ toTimestampString: () => (/* 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 = (columns, record, options = {})=>{\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi90cmFuc2Zvcm1lcnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztDQUVDLEdBQ0QsMEVBQTBFO0FBQzFFLHlGQUF5RjtBQUNsRixJQUFJQSxjQUFjO0FBQ3hCLFVBQVVBLGFBQWE7SUFDcEJBLGFBQWEsQ0FBQyxVQUFVLEdBQUc7SUFDM0JBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxZQUFZLEdBQUc7SUFDN0JBLGFBQWEsQ0FBQyxTQUFTLEdBQUc7SUFDMUJBLGFBQWEsQ0FBQyxTQUFTLEdBQUc7SUFDMUJBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxZQUFZLEdBQUc7SUFDN0JBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxZQUFZLEdBQUc7SUFDN0JBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxRQUFRLEdBQUc7SUFDekJBLGFBQWEsQ0FBQyxRQUFRLEdBQUc7SUFDekJBLGFBQWEsQ0FBQyxVQUFVLEdBQUc7SUFDM0JBLGFBQWEsQ0FBQyxNQUFNLEdBQUc7SUFDdkJBLGFBQWEsQ0FBQyxVQUFVLEdBQUc7SUFDM0JBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxPQUFPLEdBQUc7SUFDeEJBLGFBQWEsQ0FBQyxZQUFZLEdBQUc7SUFDN0JBLGFBQWEsQ0FBQyxjQUFjLEdBQUc7SUFDL0JBLGFBQWEsQ0FBQyxTQUFTLEdBQUc7SUFDMUJBLGFBQWEsQ0FBQyxVQUFVLEdBQUc7SUFDM0JBLGFBQWEsQ0FBQyxZQUFZLEdBQUc7QUFDakMsR0FBR0EsaUJBQWtCQSxDQUFBQSxnQkFBZ0IsQ0FBQztBQUN0Qzs7Ozs7Ozs7Ozs7Q0FXQyxH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QUMsS0FBSztJQUM5QjtJQUNBLE9BQU9wRDtBQUNYLEVBQUU7QUFDSyxNQUFNcUQsa0JBQWtCLENBQUNDO0lBQzVCLE1BQU1DLFFBQVEsSUFBSUMsSUFBSUY7SUFDdEJDLE1BQU1FLFFBQVEsR0FBR0YsTUFBTUUsUUFBUSxDQUFDTCxPQUFPLENBQUMsUUFBUTtJQUNoREcsTUFBTUcsUUFBUSxHQUFHSCxNQUFNRyxRQUFRLENBQzFCTixPQUFPLENBQUMsUUFBUSxJQUFJLDhCQUE4QjtLQUNsREEsT0FBTyxDQUFDLHlCQUF5QixJQUFJLG1DQUFtQztLQUN4RUEsT0FBTyxDQUFDLGNBQWMsSUFBSSx5QkFBeUI7S0FDbkRBLE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyw0QkFBNEI7SUFDL0QsSUFBSUcsTUFBTUcsUUFBUSxLQUFLLE1BQU1ILE1BQU1HLFFBQVEsS0FBSyxLQUFLO1FBQ2pESCxNQUFNRyxRQUFRLEdBQUc7SUFDckIsT0FDSztRQUNESCxNQUFNRyxRQUFRLEdBQUdILE1BQU1HLFFBQVEsR0FBRztJQUN0QztJQUNBLE9BQU9ILE1BQU1JLElBQUk7QUFDckIsRUFBRSxDQUNGLHdDQUF3QyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3RyYW5zZm9ybWVycy5qcz8zZmMwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGVscGVycyB0byBjb252ZXJ0IHRoZSBjaGFuZ2UgUGF5bG9hZCBpbnRvIG5hdGl2ZSBKUyB0eXBlcy5cbiAqL1xuLy8gQWRhcHRlZCBmcm9tIGVwZ3NxbCAoc3JjL2VwZ3NxbF9iaW5hcnkuZXJsKSwgdGhpcyBtb2R1bGUgbGljZW5zZWQgdW5kZXJcbi8vIDMtY2xhdXNlIEJTRCBmb3VuZCBoZXJlOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZXBnc3FsL2VwZ3NxbC9kZXZlbC9MSUNFTlNFXG5leHBvcnQgdmFyIFBvc3RncmVzVHlwZXM7XG4oZnVuY3Rpb24gKFBvc3RncmVzVHlwZXMpIHtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiYWJzdGltZVwiXSA9IFwiYWJzdGltZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJib29sXCJdID0gXCJib29sXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImRhdGVcIl0gPSBcImRhdGVcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiZGF0ZXJhbmdlXCJdID0gXCJkYXRlcmFuZ2VcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiZmxvYXQ0XCJdID0gXCJmbG9hdDRcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiZmxvYXQ4XCJdID0gXCJmbG9hdDhcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiaW50MlwiXSA9IFwiaW50MlwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJpbnQ0XCJdID0gXCJpbnQ0XCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImludDRyYW5nZVwiXSA9IFwiaW50NHJhbmdlXCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcImludDhcIl0gPSBcImludDhcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wiaW50OHJhbmdlXCJdID0gXCJpbnQ4cmFuZ2VcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wianNvblwiXSA9IFwianNvblwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJqc29uYlwiXSA9IFwianNvbmJcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wibW9uZXlcIl0gPSBcIm1vbmV5XCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcIm51bWVyaWNcIl0gPSBcIm51bWVyaWNcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wib2lkXCJdID0gXCJvaWRcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1wicmVsdGltZVwiXSA9IFwicmVsdGltZVwiO1xuICAgIFBvc3RncmVzVHlwZXNbXCJ0ZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcInRpbWVcIl0gPSBcInRpbWVcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widGltZXN0YW1wXCJdID0gXCJ0aW1lc3RhbXBcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widGltZXN0YW1wdHpcIl0gPSBcInRpbWVzdGFtcHR6XCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcInRpbWV0elwiXSA9IFwidGltZXR6XCI7XG4gICAgUG9zdGdyZXNUeXBlc1tcInRzcmFuZ2VcIl0gPSBcInRzcmFuZ2VcIjtcbiAgICBQb3N0Z3Jlc1R5cGVzW1widHN0enJhbmdlXCJdID0gXCJ0c3R6cmFuZ2VcIjtcbn0pKFBvc3RncmVzVHlwZXMgfHwgKFBvc3RncmVzVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBjb2x1bW5zIGFuZCBhbiBvYmplY3Qgb2Ygc3RyaW5nIHZhbHVlcyB0aGVuIGNvbnZlcnRzIGVhY2ggc3RyaW5nIHZhbHVlXG4gKiB0byBpdHMgbWFwcGVkIHR5cGUuXG4gKlxuICogQHBhcmFtIHt7bmFtZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9W119IGNvbHVtbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWNvcmRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBtYXAgb2YgdmFyaW91cyBvcHRpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIG1hcHBlclxuICogQHBhcmFtIHtBcnJheX0gb3B0aW9ucy5za2lwVHlwZXMgVGhlIGFycmF5IG9mIHR5cGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBjb252ZXJ0ZWRcbiAqXG4gKiBAZXhhbXBsZSBjb252ZXJ0Q2hhbmdlRGF0YShbe25hbWU6ICdmaXJzdF9uYW1lJywgdHlwZTogJ3RleHQnfSwge25hbWU6ICdhZ2UnLCB0eXBlOiAnaW50NCd9XSwge2ZpcnN0X25hbWU6ICdQYXVsJywgYWdlOiczMyd9LCB7fSlcbiAqIC8vPT57IGZpcnN0X25hbWU6ICdQYXVsJywgYWdlOiAzMyB9XG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0Q2hhbmdlRGF0YSA9IChjb2x1bW5zLCByZWNvcmQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBza2lwVHlwZXMgPSAoX2EgPSBvcHRpb25zLnNraXBUeXBlcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW107XG4gICAgaWYgKCFyZWNvcmQpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVjb3JkKS5yZWR1Y2UoKGFjYywgcmVjX2tleSkgPT4ge1xuICAgICAgICBhY2NbcmVjX2tleV0gPSBjb252ZXJ0Q29sdW1uKHJlY19rZXksIGNvbHVtbnMsIHJlY29yZCwgc2tpcFR5cGVzKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59O1xuLyoqXG4gKiBDb252ZXJ0cyB0aGUgdmFsdWUgb2YgYW4gaW5kaXZpZHVhbCBjb2x1bW4uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGNvbHVtbk5hbWUgVGhlIGNvbHVtbiB0aGF0IHlvdSB3YW50IHRvIGNvbnZlcnRcbiAqIEBwYXJhbSB7e25hbWU6IFN0cmluZywgdHlwZTogU3RyaW5nfVtdfSBjb2x1bW5zIEFsbCBvZiB0aGUgY29sdW1uc1xuICogQHBhcmFtIHtPYmplY3R9IHJlY29yZCBUaGUgbWFwIG9mIHN0cmluZyB2YWx1ZXNcbiAqIEBwYXJhbSB7QXJyYXl9IHNraXBUeXBlcyBBbiBhcnJheSBvZiB0eXBlcyB0aGF0IHNob3VsZCBub3QgYmUgY29udmVydGVkXG4gKiBAcmV0dXJuIHtvYmplY3R9IFVzZWxlc3MgaW5mb3JtYXRpb25cbiAqXG4gKiBAZXhhbXBsZSBjb252ZXJ0Q29sdW1uKCdhZ2UnLCBbe25hbWU6ICdmaXJzdF9uYW1lJywgdHlwZTogJ3RleHQnfSwge25hbWU6ICdhZ2UnLCB0eXBlOiAnaW50NCd9XSwge2ZpcnN0X25hbWU6ICdQYXVsJywgYWdlOiAnMzMnfSwgW10pXG4gKiAvLz0+IDMzXG4gKiBAZXhhbXBsZSBjb252ZXJ0Q29sdW1uKCdhZ2UnLCBbe25hbWU6ICdmaXJzdF9uYW1lJywgdHlwZTogJ3RleHQnfSwge25hbWU6ICdhZ2UnLCB0eXBlOiAnaW50NCd9XSwge2ZpcnN0X25hbWU6ICdQYXVsJywgYWdlOiAnMzMnfSwgWydpbnQ0J10pXG4gKiAvLz0+IFwiMzNcIlxuICovXG5leHBvcnQgY29uc3QgY29udmVydENvbHVtbiA9IChjb2x1bW5OYW1lLCBjb2x1bW5zLCByZWNvcmQsIHNraXBUeXBlcykgPT4ge1xuICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnMuZmluZCgoeCkgPT4geC5uYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICBjb25zdCBjb2xUeXBlID0gY29sdW1uID09PSBudWxsIHx8IGNvbHVtbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29sdW1uLnR5cGU7XG4gICAgY29uc3QgdmFsdWUgPSByZWNvcmRbY29sdW1uTmFtZV07XG4gICAgaWYgKGNvbFR5cGUgJiYgIXNraXBUeXBlcy5pbmNsdWRlcyhjb2xUeXBlKSkge1xuICAgICAgICByZXR1cm4gY29udmVydENlbGwoY29sVHlwZSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gbm9vcCh2YWx1ZSk7XG59O1xuLyoqXG4gKiBJZiB0aGUgdmFsdWUgb2YgdGhlIGNlbGwgaXMgYG51bGxgLCByZXR1cm5zIG51bGwuXG4gKiBPdGhlcndpc2UgY29udmVydHMgdGhlIHN0cmluZyB2YWx1ZSB0byB0aGUgY29ycmVjdCB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQSBwb3N0Z3JlcyBjb2x1bW4gdHlwZVxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIFRoZSBjZWxsIHZhbHVlXG4gKlxuICogQGV4YW1wbGUgY29udmVydENlbGwoJ2Jvb2wnLCAndCcpXG4gKiAvLz0+IHRydWVcbiAqIEBleGFtcGxlIGNvbnZlcnRDZWxsKCdpbnQ4JywgJzEwJylcbiAqIC8vPT4gMTBcbiAqIEBleGFtcGxlIGNvbnZlcnRDZWxsKCdfaW50NCcsICd7MSwyLDMsNH0nKVxuICogLy89PiBbMSwyLDMsNF1cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRDZWxsID0gKHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgLy8gaWYgZGF0YSB0eXBlIGlzIGFuIGFycmF5XG4gICAgaWYgKHR5cGUuY2hhckF0KDApID09PSAnXycpIHtcbiAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB0eXBlLnNsaWNlKDEsIHR5cGUubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRvQXJyYXkodmFsdWUsIGRhdGFUeXBlKTtcbiAgICB9XG4gICAgLy8gSWYgbm90IG51bGwsIGNvbnZlcnQgdG8gY29ycmVjdCB0eXBlLlxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuYm9vbDpcbiAgICAgICAgICAgIHJldHVybiB0b0Jvb2xlYW4odmFsdWUpO1xuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuZmxvYXQ0OlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuZmxvYXQ4OlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuaW50MjpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLmludDQ6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5pbnQ4OlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMubnVtZXJpYzpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLm9pZDpcbiAgICAgICAgICAgIHJldHVybiB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5qc29uOlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMuanNvbmI6XG4gICAgICAgICAgICByZXR1cm4gdG9Kc29uKHZhbHVlKTtcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnRpbWVzdGFtcDpcbiAgICAgICAgICAgIHJldHVybiB0b1RpbWVzdGFtcFN0cmluZyh2YWx1ZSk7IC8vIEZvcm1hdCB0byBiZSBjb25zaXN0ZW50IHdpdGggUG9zdGdSRVNUXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5hYnN0aW1lOiAvLyBUbyBhbGxvdyB1c2VycyB0byBjYXN0IGl0IGJhc2VkIG9uIFRpbWV6b25lXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5kYXRlOiAvLyBUbyBhbGxvdyB1c2VycyB0byBjYXN0IGl0IGJhc2VkIG9uIFRpbWV6b25lXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5kYXRlcmFuZ2U6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5pbnQ0cmFuZ2U6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5pbnQ4cmFuZ2U6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy5tb25leTpcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnJlbHRpbWU6IC8vIFRvIGFsbG93IHVzZXJzIHRvIGNhc3QgaXQgYmFzZWQgb24gVGltZXpvbmVcbiAgICAgICAgY2FzZSBQb3N0Z3Jlc1R5cGVzLnRleHQ6XG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy50aW1lOiAvLyBUbyBhbGxvdyB1c2VycyB0byBjYXN0IGl0IGJhc2VkIG9uIFRpbWV6b25lXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy50aW1lc3RhbXB0ejogLy8gVG8gYWxsb3cgdXNlcnMgdG8gY2FzdCBpdCBiYXNlZCBvbiBUaW1lem9uZVxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMudGltZXR6OiAvLyBUbyBhbGxvdyB1c2VycyB0byBjYXN0IGl0IGJhc2VkIG9uIFRpbWV6b25lXG4gICAgICAgIGNhc2UgUG9zdGdyZXNUeXBlcy50c3JhbmdlOlxuICAgICAgICBjYXNlIFBvc3RncmVzVHlwZXMudHN0enJhbmdlOlxuICAgICAgICAgICAgcmV0dXJuIG5vb3AodmFsdWUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBmb3IgcmVtYWluaW5nIHR5cGVzXG4gICAgICAgICAgICByZXR1cm4gbm9vcCh2YWx1ZSk7XG4gICAgfVxufTtcbmNvbnN0IG5vb3AgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWU7XG59O1xuZXhwb3J0IGNvbnN0IHRvQm9vbGVhbiA9ICh2YWx1ZSkgPT4ge1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSAndCc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnZic6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCB0b051bWJlciA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZFZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlZFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5leHBvcnQgY29uc3QgdG9Kc29uID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuLyoqXG4gKiBDb252ZXJ0cyBhIFBvc3RncmVzIEFycmF5IGludG8gYSBuYXRpdmUgSlMgYXJyYXlcbiAqXG4gKiBAZXhhbXBsZSB0b0FycmF5KCd7fScsICdpbnQ0JylcbiAqIC8vPT4gW11cbiAqIEBleGFtcGxlIHRvQXJyYXkoJ3tcIlsyMDIxLTAxLTAxLDIwMjEtMTItMzEpXCIsXCIoMjAyMS0wMS0wMSwyMDIxLTEyLTMyXVwifScsICdkYXRlcmFuZ2UnKVxuICogLy89PiBbJ1syMDIxLTAxLTAxLDIwMjEtMTItMzEpJywgJygyMDIxLTAxLTAxLDIwMjEtMTItMzJdJ11cbiAqIEBleGFtcGxlIHRvQXJyYXkoWzEsMiwzLDRdLCAnaW50NCcpXG4gKiAvLz0+IFsxLDIsMyw0XVxuICovXG5leHBvcnQgY29uc3QgdG9BcnJheSA9ICh2YWx1ZSwgdHlwZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgbGFzdElkeCA9IHZhbHVlLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgY2xvc2VCcmFjZSA9IHZhbHVlW2xhc3RJZHhdO1xuICAgIGNvbnN0IG9wZW5CcmFjZSA9IHZhbHVlWzBdO1xuICAgIC8vIENvbmZpcm0gdmFsdWUgaXMgYSBQb3N0Z3JlcyBhcnJheSBieSBjaGVja2luZyBjdXJseSBicmFja2V0c1xuICAgIGlmIChvcGVuQnJhY2UgPT09ICd7JyAmJiBjbG9zZUJyYWNlID09PSAnfScpIHtcbiAgICAgICAgbGV0IGFycjtcbiAgICAgICAgY29uc3QgdmFsVHJpbSA9IHZhbHVlLnNsaWNlKDEsIGxhc3RJZHgpO1xuICAgICAgICAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHNvbHV0aW9uIHRvIHNlcGFyYXRlIFBvc3RncmVzIGFycmF5IGRhdGFcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFyciA9IEpTT04ucGFyc2UoJ1snICsgdmFsVHJpbSArICddJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIC8vIFdBUk5JTkc6IHNwbGl0dGluZyBvbiBjb21tYSBkb2VzIG5vdCBjb3ZlciBhbGwgZWRnZSBjYXNlc1xuICAgICAgICAgICAgYXJyID0gdmFsVHJpbSA/IHZhbFRyaW0uc3BsaXQoJywnKSA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnIubWFwKCh2YWwpID0+IGNvbnZlcnRDZWxsKHR5cGUsIHZhbCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuLyoqXG4gKiBGaXhlcyB0aW1lc3RhbXAgdG8gYmUgSVNPLTg2MDEuIFN3YXBzIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBkYXRlIGFuZCB0aW1lIGZvciBhICdUJ1xuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBhYmFzZS9zdXBhYmFzZS9pc3N1ZXMvMThcbiAqXG4gKiBAZXhhbXBsZSB0b1RpbWVzdGFtcFN0cmluZygnMjAxOS0wOS0xMCAwMDowMDowMCcpXG4gKiAvLz0+ICcyMDE5LTA5LTEwVDAwOjAwOjAwJ1xuICovXG5leHBvcnQgY29uc3QgdG9UaW1lc3RhbXBTdHJpbmcgPSAodmFsdWUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgnICcsICdUJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5leHBvcnQgY29uc3QgaHR0cEVuZHBvaW50VVJMID0gKHNvY2tldFVybCkgPT4ge1xuICAgIGNvbnN0IHdzVXJsID0gbmV3IFVSTChzb2NrZXRVcmwpO1xuICAgIHdzVXJsLnByb3RvY29sID0gd3NVcmwucHJvdG9jb2wucmVwbGFjZSgvXndzL2ksICdodHRwJyk7XG4gICAgd3NVcmwucGF0aG5hbWUgPSB3c1VybC5wYXRobmFtZVxuICAgICAgICAucmVwbGFjZSgvXFwvKyQvLCAnJykgLy8gcmVtb3ZlIGFsbCB0cmFpbGluZyBzbGFzaGVzXG4gICAgICAgIC5yZXBsYWNlKC9cXC9zb2NrZXRcXC93ZWJzb2NrZXQkL2ksICcnKSAvLyByZW1vdmUgdGhlIHNvY2tldC93ZWJzb2NrZXQgcGF0aFxuICAgICAgICAucmVwbGFjZSgvXFwvc29ja2V0JC9pLCAnJykgLy8gcmVtb3ZlIHRoZSBzb2NrZXQgcGF0aFxuICAgICAgICAucmVwbGFjZSgvXFwvd2Vic29ja2V0JC9pLCAnJyk7IC8vIHJlbW92ZSB0aGUgd2Vic29ja2V0IHBhdGhcbiAgICBpZiAod3NVcmwucGF0aG5hbWUgPT09ICcnIHx8IHdzVXJsLnBhdGhuYW1lID09PSAnLycpIHtcbiAgICAgICAgd3NVcmwucGF0aG5hbWUgPSAnL2FwaS9icm9hZGNhc3QnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgd3NVcmwucGF0aG5hbWUgPSB3c1VybC5wYXRobmFtZSArICcvYXBpL2Jyb2FkY2FzdCc7XG4gICAgfVxuICAgIHJldHVybiB3c1VybC5ocmVmO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYW5zZm9ybWVycy5qcy5tYXAiXSwibmFtZXMiOlsiUG9zdGdyZXNUeXBlcyIsImNvbnZlcnRDaGFuZ2VEYXRhIiwiY29sdW1ucyIsInJlY29yZCIsIm9wdGlvbnMiLCJfYSIsInNraXBUeXBlcyIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJhY2MiLCJyZWNfa2V5IiwiY29udmVydENvbHVtbiIsImNvbHVtbk5hbWUiLCJjb2x1bW4iLCJmaW5kIiwieCIsIm5hbWUiLCJjb2xUeXBlIiwidHlwZSIsInZhbHVlIiwiaW5jbHVkZXMiLCJjb252ZXJ0Q2VsbCIsIm5vb3AiLCJjaGFyQXQiLCJkYXRhVHlwZSIsInNsaWNlIiwibGVuZ3RoIiwidG9BcnJheSIsImJvb2wiLCJ0b0Jvb2xlYW4iLCJmbG9hdDQiLCJmbG9hdDgiLCJpbnQyIiwiaW50NCIsImludDgiLCJudW1lcmljIiwib2lkIiwidG9OdW1iZXIiLCJqc29uIiwianNvbmIiLCJ0b0pzb24iLCJ0aW1lc3RhbXAiLCJ0b1RpbWVzdGFtcFN0cmluZyIsImFic3RpbWUiLCJkYXRlIiwiZGF0ZXJhbmdlIiwiaW50NHJhbmdlIiwiaW50OHJhbmdlIiwibW9uZXkiLCJyZWx0aW1lIiwidGV4dCIsInRpbWUiLCJ0aW1lc3RhbXB0eiIsInRpbWV0eiIsInRzcmFuZ2UiLCJ0c3R6cmFuZ2UiLCJwYXJzZWRWYWx1ZSIsInBhcnNlRmxvYXQiLCJOdW1iZXIiLCJpc05hTiIsIkpTT04iLCJwYXJzZSIsImxhc3RJZHgiLCJjbG9zZUJyYWNlIiwib3BlbkJyYWNlIiwiYXJyIiwidmFsVHJpbSIsIl8iLCJzcGxpdCIsIm1hcCIsInZhbCIsInJlcGxhY2UiLCJodHRwRW5kcG9pbnRVUkwiLCJzb2NrZXRVcmwiLCJ3c1VybCIsIlVSTCIsInByb3RvY29sIiwicGF0aG5hbWUiLCJocmVmIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/transformers.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js":
|
||
/*!***********************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/version.js ***!
|
||
\***********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ version: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3ZlcnNpb24uanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZFQUE2RTtBQUM3RSxnRUFBZ0U7QUFDaEUsdUVBQXVFO0FBQ3ZFLGlFQUFpRTtBQUNqRSxrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQzFELE1BQU1BLFVBQVUsU0FBUyxDQUNoQyxtQ0FBbUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi92ZXJzaW9uLmpzPzFmZDUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHJlbGVhc2VzIGJ5IHNjcmlwdHMvdXBkYXRlLXZlcnNpb24tZmlsZXMudHNcbi8vIFRoaXMgZmlsZSBwcm92aWRlcyBydW50aW1lIGFjY2VzcyB0byB0aGUgcGFja2FnZSB2ZXJzaW9uIGZvcjpcbi8vIC0gSFRUUCByZXF1ZXN0IGhlYWRlcnMgKGUuZy4sIFgtQ2xpZW50LUluZm8gaGVhZGVyIGZvciBBUEkgcmVxdWVzdHMpXG4vLyAtIERlYnVnZ2luZyBhbmQgc3VwcG9ydCAoaWRlbnRpZnlpbmcgd2hpY2ggdmVyc2lvbiBpcyBydW5uaW5nKVxuLy8gLSBUZWxlbWV0cnkgYW5kIGxvZ2dpbmcgKHZlcnNpb24gcmVwb3J0aW5nIGluIGVycm9ycy9hbmFseXRpY3MpXG4vLyAtIEVuc3VyaW5nIGJ1aWxkIGFydGlmYWN0cyBtYXRjaCB0aGUgcHVibGlzaGVkIHBhY2thZ2UgdmVyc2lvblxuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSAnMi44OC4wJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIl0sIm5hbWVzIjpbInZlcnNpb24iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js":
|
||
/*!***********************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/version.js ***!
|
||
\***********************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ version: () => (/* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi92ZXJzaW9uLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2RUFBNkU7QUFDN0UsZ0VBQWdFO0FBQ2hFLHVFQUF1RTtBQUN2RSxpRUFBaUU7QUFDakUsa0VBQWtFO0FBQ2xFLGlFQUFpRTtBQUMxRCxNQUFNQSxVQUFVLFNBQVMsQ0FDaEMsbUNBQW1DIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9saWIvdmVyc2lvbi5qcz8xZmQ1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGR1cmluZyByZWxlYXNlcyBieSBzY3JpcHRzL3VwZGF0ZS12ZXJzaW9uLWZpbGVzLnRzXG4vLyBUaGlzIGZpbGUgcHJvdmlkZXMgcnVudGltZSBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgdmVyc2lvbiBmb3I6XG4vLyAtIEhUVFAgcmVxdWVzdCBoZWFkZXJzIChlLmcuLCBYLUNsaWVudC1JbmZvIGhlYWRlciBmb3IgQVBJIHJlcXVlc3RzKVxuLy8gLSBEZWJ1Z2dpbmcgYW5kIHN1cHBvcnQgKGlkZW50aWZ5aW5nIHdoaWNoIHZlcnNpb24gaXMgcnVubmluZylcbi8vIC0gVGVsZW1ldHJ5IGFuZCBsb2dnaW5nICh2ZXJzaW9uIHJlcG9ydGluZyBpbiBlcnJvcnMvYW5hbHl0aWNzKVxuLy8gLSBFbnN1cmluZyBidWlsZCBhcnRpZmFjdHMgbWF0Y2ggdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIHZlcnNpb25cbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0gJzIuODguMCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZXJzaW9uLmpzLm1hcCJdLCJuYW1lcyI6WyJ2ZXJzaW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/version.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js":
|
||
/*!*********************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js ***!
|
||
\*********************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebSocketFactory: () => (/* binding */ WebSocketFactory),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**\n * Utilities for creating WebSocket instances across runtimes.\n */ class WebSocketFactory {\n /**\n * Static-only utility – prevent instantiation.\n */ constructor(){}\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 global !== \"undefined\" && typeof global.WebSocket !== \"undefined\") {\n return {\n type: \"native\",\n constructor: global.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 ${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 ${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: ${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/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WebSocketFactory); //# sourceMappingURL=websocket-factory.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3dlYnNvY2tldC1mYWN0b3J5LmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7O0NBRUMsR0FDTSxNQUFNQTtJQUNUOztLQUVDLEdBQ0RDLGFBQWMsQ0FBRTtJQUNoQixPQUFPQyxvQkFBb0I7UUFDdkIsSUFBSUM7UUFDSixJQUFJLE9BQU9DLGNBQWMsYUFBYTtZQUNsQyxPQUFPO2dCQUFFQyxNQUFNO2dCQUFVSixhQUFhRztZQUFVO1FBQ3BEO1FBQ0EsSUFBSSxPQUFPRSxlQUFlLGVBQWUsT0FBT0EsV0FBV0YsU0FBUyxLQUFLLGFBQWE7WUFDbEYsT0FBTztnQkFBRUMsTUFBTTtnQkFBVUosYUFBYUssV0FBV0YsU0FBUztZQUFDO1FBQy9EO1FBQ0EsSUFBSSxPQUFPRyxXQUFXLGVBQWUsT0FBT0EsT0FBT0gsU0FBUyxLQUFLLGFBQWE7WUFDMUUsT0FBTztnQkFBRUMsTUFBTTtnQkFBVUosYUFBYU0sT0FBT0gsU0FBUztZQUFDO1FBQzNEO1FBQ0EsSUFBSSxPQUFPRSxlQUFlLGVBQ3RCLE9BQU9BLFdBQVdFLGFBQWEsS0FBSyxlQUNwQyxPQUFPRixXQUFXRixTQUFTLEtBQUssYUFBYTtZQUM3QyxPQUFPO2dCQUNIQyxNQUFNO2dCQUNOSSxPQUFPO2dCQUNQQyxZQUFZO1lBQ2hCO1FBQ0o7UUFDQSxJQUFJLE9BQVFKLGVBQWUsZUFBZUEsV0FBV0ssV0FBVyxJQUMzRCxPQUFPQyxjQUFjLGVBQWdCLEVBQUNULEtBQUtTLFVBQVVDLFNBQVMsTUFBTSxRQUFRVixPQUFPLEtBQUssSUFBSSxLQUFLLElBQUlBLEdBQUdXLFFBQVEsQ0FBQyxjQUFhLEdBQUs7WUFDcEksT0FBTztnQkFDSFQsTUFBTTtnQkFDTkksT0FBTztnQkFDUEMsWUFBWTtZQUNoQjtRQUNKO1FBQ0EsSUFBSSxPQUFPSyxZQUFZLGFBQWE7WUFDaEMscUZBQXFGO1lBQ3JGLE1BQU1DLGtCQUFrQkQsT0FBTyxDQUFDLFdBQVc7WUFDM0MsSUFBSUMsbUJBQW1CQSxlQUFlLENBQUMsT0FBTyxFQUFFO2dCQUM1QywyREFBMkQ7Z0JBQzNELE1BQU1DLGdCQUFnQkQsZUFBZSxDQUFDLE9BQU87Z0JBQzdDLE1BQU1FLGNBQWNDLFNBQVNGLGNBQWNHLE9BQU8sQ0FBQyxNQUFNLElBQUlDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUUsMkNBQTJDO2dCQUMzQyxJQUFJSCxlQUFlLElBQUk7b0JBQ25CLG9FQUFvRTtvQkFDcEUsSUFBSSxPQUFPWixXQUFXRixTQUFTLEtBQUssYUFBYTt3QkFDN0MsT0FBTzs0QkFBRUMsTUFBTTs0QkFBVUosYUFBYUssV0FBV0YsU0FBUzt3QkFBQztvQkFDL0Q7b0JBQ0EsNkNBQTZDO29CQUM3QyxPQUFPO3dCQUNIQyxNQUFNO3dCQUNOSSxPQUFPLENBQUMsUUFBUSxFQUFFUyxZQUFZLHlDQUF5QyxDQUFDO3dCQUN4RVIsWUFBWTtvQkFDaEI7Z0JBQ0o7Z0JBQ0EsNkNBQTZDO2dCQUM3QyxPQUFPO29CQUNITCxNQUFNO29CQUNOSSxPQUFPLENBQUMsUUFBUSxFQUFFUyxZQUFZLDJDQUEyQyxDQUFDO29CQUMxRVIsWUFBWSxzRkFDUiwwQkFDQTtnQkFDUjtZQUNKO1FBQ0o7UUFDQSxPQUFPO1lBQ0hMLE1BQU07WUFDTkksT0FBTztZQUNQQyxZQUFZO1FBQ2hCO0lBQ0o7SUFDQTs7Ozs7Ozs7S0FRQyxHQUNELE9BQU9ZLDBCQUEwQjtRQUM3QixNQUFNQyxNQUFNLElBQUksQ0FBQ3JCLGlCQUFpQjtRQUNsQyxJQUFJcUIsSUFBSXRCLFdBQVcsRUFBRTtZQUNqQixPQUFPc0IsSUFBSXRCLFdBQVc7UUFDMUI7UUFDQSxJQUFJdUIsZUFBZUQsSUFBSWQsS0FBSyxJQUFJO1FBQ2hDLElBQUljLElBQUliLFVBQVUsRUFBRTtZQUNoQmMsZ0JBQWdCLENBQUMsd0JBQXdCLEVBQUVELElBQUliLFVBQVUsQ0FBQyxDQUFDO1FBQy9EO1FBQ0EsTUFBTSxJQUFJZSxNQUFNRDtJQUNwQjtJQUNBOzs7Ozs7O0tBT0MsR0FDRCxPQUFPRSxnQkFBZ0JDLEdBQUcsRUFBRUMsU0FBUyxFQUFFO1FBQ25DLE1BQU1DLEtBQUssSUFBSSxDQUFDUCx1QkFBdUI7UUFDdkMsT0FBTyxJQUFJTyxHQUFHRixLQUFLQztJQUN2QjtJQUNBOzs7Ozs7Ozs7S0FTQyxHQUNELE9BQU9FLHVCQUF1QjtRQUMxQixJQUFJO1lBQ0EsTUFBTVAsTUFBTSxJQUFJLENBQUNyQixpQkFBaUI7WUFDbEMsT0FBT3FCLElBQUlsQixJQUFJLEtBQUssWUFBWWtCLElBQUlsQixJQUFJLEtBQUs7UUFDakQsRUFDQSxPQUFPRixJQUFJO1lBQ1AsT0FBTztRQUNYO0lBQ0o7QUFDSjtBQUNBLGlFQUFlSCxnQkFBZ0JBLEVBQUMsQ0FDaEMsNkNBQTZDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9yZWFsdGltZS1qcy9kaXN0L21vZHVsZS9saWIvd2Vic29ja2V0LWZhY3RvcnkuanM/YTVhYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxpdGllcyBmb3IgY3JlYXRpbmcgV2ViU29ja2V0IGluc3RhbmNlcyBhY3Jvc3MgcnVudGltZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRGYWN0b3J5IHtcbiAgICAvKipcbiAgICAgKiBTdGF0aWMtb25seSB1dGlsaXR5IOKAkyBwcmV2ZW50IGluc3RhbnRpYXRpb24uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICBzdGF0aWMgZGV0ZWN0RW52aXJvbm1lbnQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHR5cGVvZiBXZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnbmF0aXZlJywgY29uc3RydWN0b3I6IFdlYlNvY2tldCB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGdsb2JhbFRoaXMuV2ViU29ja2V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ25hdGl2ZScsIGNvbnN0cnVjdG9yOiBnbG9iYWxUaGlzLldlYlNvY2tldCB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ2xvYmFsLldlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICduYXRpdmUnLCBjb25zdHJ1Y3RvcjogZ2xvYmFsLldlYlNvY2tldCB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWxUaGlzLldlYlNvY2tldFBhaXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgZ2xvYmFsVGhpcy5XZWJTb2NrZXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjbG91ZGZsYXJlJyxcbiAgICAgICAgICAgICAgICBlcnJvcjogJ0Nsb3VkZmxhcmUgV29ya2VycyBkZXRlY3RlZC4gV2ViU29ja2V0IGNsaWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ2xvdWRmbGFyZSBXb3JrZXJzLicsXG4gICAgICAgICAgICAgICAgd29ya2Fyb3VuZDogJ1VzZSBDbG91ZGZsYXJlIFdvcmtlcnMgV2ViU29ja2V0IEFQSSBmb3Igc2VydmVyLXNpZGUgV2ViU29ja2V0IGhhbmRsaW5nLCBvciBkZXBsb3kgdG8gYSBkaWZmZXJlbnQgcnVudGltZS4nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzLkVkZ2VSdW50aW1lKSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmICgoX2EgPSBuYXZpZ2F0b3IudXNlckFnZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5jbHVkZXMoJ1ZlcmNlbC1FZGdlJykpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndW5zdXBwb3J0ZWQnLFxuICAgICAgICAgICAgICAgIGVycm9yOiAnRWRnZSBydW50aW1lIGRldGVjdGVkIChWZXJjZWwgRWRnZS9OZXRsaWZ5IEVkZ2UpLiBXZWJTb2NrZXRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGVkZ2UgZnVuY3Rpb25zLicsXG4gICAgICAgICAgICAgICAgd29ya2Fyb3VuZDogJ1VzZSBzZXJ2ZXJsZXNzIGZ1bmN0aW9ucyBvciBhIGRpZmZlcmVudCBkZXBsb3ltZW50IHRhcmdldCBmb3IgV2ViU29ja2V0IGZ1bmN0aW9uYWxpdHkuJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gVXNlIGR5bmFtaWMgcHJvcGVydHkgYWNjZXNzIHRvIGF2b2lkIE5leHQuanMgRWRnZSBSdW50aW1lIHN0YXRpYyBhbmFseXNpcyB3YXJuaW5nc1xuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc1ZlcnNpb25zID0gcHJvY2Vzc1sndmVyc2lvbnMnXTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzVmVyc2lvbnMgJiYgcHJvY2Vzc1ZlcnNpb25zWydub2RlJ10pIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgJ3YnIHByZWZpeCBpZiBwcmVzZW50IGFuZCBwYXJzZSB0aGUgbWFqb3IgdmVyc2lvblxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb25TdHJpbmcgPSBwcm9jZXNzVmVyc2lvbnNbJ25vZGUnXTtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlVmVyc2lvbiA9IHBhcnNlSW50KHZlcnNpb25TdHJpbmcucmVwbGFjZSgvXnYvLCAnJykuc3BsaXQoJy4nKVswXSk7XG4gICAgICAgICAgICAgICAgLy8gTm9kZS5qcyAyMisgc2hvdWxkIGhhdmUgbmF0aXZlIFdlYlNvY2tldFxuICAgICAgICAgICAgICAgIGlmIChub2RlVmVyc2lvbiA+PSAyMikge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBuYXRpdmUgV2ViU29ja2V0IGlzIGF2YWlsYWJsZSAoc2hvdWxkIGJlIGluIE5vZGUuanMgMjIrKVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuV2ViU29ja2V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ25hdGl2ZScsIGNvbnN0cnVjdG9yOiBnbG9iYWxUaGlzLldlYlNvY2tldCB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCBhdmFpbGFibGUsIHVzZXIgbmVlZHMgdG8gcHJvdmlkZSBpdFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3Vuc3VwcG9ydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBgTm9kZS5qcyAke25vZGVWZXJzaW9ufSBkZXRlY3RlZCBidXQgbmF0aXZlIFdlYlNvY2tldCBub3QgZm91bmQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmthcm91bmQ6ICdQcm92aWRlIGEgV2ViU29ja2V0IGltcGxlbWVudGF0aW9uIHZpYSB0aGUgdHJhbnNwb3J0IG9wdGlvbi4nLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBOb2RlLmpzIDwgMjIgZG9lc24ndCBoYXZlIG5hdGl2ZSBXZWJTb2NrZXRcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAndW5zdXBwb3J0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogYE5vZGUuanMgJHtub2RlVmVyc2lvbn0gZGV0ZWN0ZWQgd2l0aG91dCBuYXRpdmUgV2ViU29ja2V0IHN1cHBvcnQuYCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Fyb3VuZDogJ0ZvciBOb2RlLmpzIDwgMjIsIGluc3RhbGwgXCJ3c1wiIHBhY2thZ2UgYW5kIHByb3ZpZGUgaXQgdmlhIHRoZSB0cmFuc3BvcnQgb3B0aW9uOlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCB3cyBmcm9tIFwid3NcIlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ25ldyBSZWFsdGltZUNsaWVudCh1cmwsIHsgdHJhbnNwb3J0OiB3cyB9KScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ3Vuc3VwcG9ydGVkJyxcbiAgICAgICAgICAgIGVycm9yOiAnVW5rbm93biBKYXZhU2NyaXB0IHJ1bnRpbWUgd2l0aG91dCBXZWJTb2NrZXQgc3VwcG9ydC4nLFxuICAgICAgICAgICAgd29ya2Fyb3VuZDogXCJFbnN1cmUgeW91J3JlIHJ1bm5pbmcgaW4gYSBzdXBwb3J0ZWQgZW52aXJvbm1lbnQgKGJyb3dzZXIsIE5vZGUuanMsIERlbm8pIG9yIHByb3ZpZGUgYSBjdXN0b20gV2ViU29ja2V0IGltcGxlbWVudGF0aW9uLlwiLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiZXN0IGF2YWlsYWJsZSBXZWJTb2NrZXQgY29uc3RydWN0b3IgZm9yIHRoZSBjdXJyZW50IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgV1MgPSBXZWJTb2NrZXRGYWN0b3J5LmdldFdlYlNvY2tldENvbnN0cnVjdG9yKClcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBuZXcgV1MoJ3dzczovL3JlYWx0aW1lLnN1cGFiYXNlLmNvL3NvY2tldCcpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgc3RhdGljIGdldFdlYlNvY2tldENvbnN0cnVjdG9yKCkge1xuICAgICAgICBjb25zdCBlbnYgPSB0aGlzLmRldGVjdEVudmlyb25tZW50KCk7XG4gICAgICAgIGlmIChlbnYuY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnYuY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGVudi5lcnJvciB8fCAnV2ViU29ja2V0IG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudC4nO1xuICAgICAgICBpZiAoZW52Lndvcmthcm91bmQpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgXFxuXFxuU3VnZ2VzdGVkIHNvbHV0aW9uOiAke2Vudi53b3JrYXJvdW5kfWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBXZWJTb2NrZXQgdXNpbmcgdGhlIGRldGVjdGVkIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHNvY2tldCA9IFdlYlNvY2tldEZhY3RvcnkuY3JlYXRlV2ViU29ja2V0KCd3c3M6Ly9yZWFsdGltZS5zdXBhYmFzZS5jby9zb2NrZXQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVXZWJTb2NrZXQodXJsLCBwcm90b2NvbHMpIHtcbiAgICAgICAgY29uc3QgV1MgPSB0aGlzLmdldFdlYlNvY2tldENvbnN0cnVjdG9yKCk7XG4gICAgICAgIHJldHVybiBuZXcgV1ModXJsLCBwcm90b2NvbHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRlY3RzIHdoZXRoZXIgdGhlIHJ1bnRpbWUgY2FuIGVzdGFibGlzaCBXZWJTb2NrZXQgY29ubmVjdGlvbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogaWYgKCFXZWJTb2NrZXRGYWN0b3J5LmlzV2ViU29ja2V0U3VwcG9ydGVkKCkpIHtcbiAgICAgKiAgIGNvbnNvbGUud2FybignRmFsbGluZyBiYWNrIHRvIGxvbmcgcG9sbGluZycpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHN0YXRpYyBpc1dlYlNvY2tldFN1cHBvcnRlZCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVudiA9IHRoaXMuZGV0ZWN0RW52aXJvbm1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiBlbnYudHlwZSA9PT0gJ25hdGl2ZScgfHwgZW52LnR5cGUgPT09ICd3cyc7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBXZWJTb2NrZXRGYWN0b3J5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2Vic29ja2V0LWZhY3RvcnkuanMubWFwIl0sIm5hbWVzIjpbIldlYlNvY2tldEZhY3RvcnkiLCJjb25zdHJ1Y3RvciIsImRldGVjdEVudmlyb25tZW50IiwiX2EiLCJXZWJTb2NrZXQiLCJ0eXBlIiwiZ2xvYmFsVGhpcyIsImdsb2JhbCIsIldlYlNvY2tldFBhaXIiLCJlcnJvciIsIndvcmthcm91bmQiLCJFZGdlUnVudGltZSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImluY2x1ZGVzIiwicHJvY2VzcyIsInByb2Nlc3NWZXJzaW9ucyIsInZlcnNpb25TdHJpbmciLCJub2RlVmVyc2lvbiIsInBhcnNlSW50IiwicmVwbGFjZSIsInNwbGl0IiwiZ2V0V2ViU29ja2V0Q29uc3RydWN0b3IiLCJlbnYiLCJlcnJvck1lc3NhZ2UiLCJFcnJvciIsImNyZWF0ZVdlYlNvY2tldCIsInVybCIsInByb3RvY29scyIsIldTIiwiaXNXZWJTb2NrZXRTdXBwb3J0ZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js":
|
||
/*!*********************************************************************************!*\
|
||
!*** ./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js ***!
|
||
\*********************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WebSocketFactory: () => (/* binding */ WebSocketFactory),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**\n * Utilities for creating WebSocket instances across runtimes.\n */ class WebSocketFactory {\n /**\n * Static-only utility – prevent instantiation.\n */ constructor(){}\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 global !== \"undefined\" && typeof global.WebSocket !== \"undefined\") {\n return {\n type: \"native\",\n constructor: global.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 ${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 ${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: ${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/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WebSocketFactory); //# sourceMappingURL=websocket-factory.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3JlYWx0aW1lLWpzL2Rpc3QvbW9kdWxlL2xpYi93ZWJzb2NrZXQtZmFjdG9yeS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBOztDQUVDLEdBQ00sTUFBTUE7SUFDVDs7S0FFQyxHQUNEQyxhQUFjLENBQUU7SUFDaEIsT0FBT0Msb0JBQW9CO1FBQ3ZCLElBQUlDO1FBQ0osSUFBSSxPQUFPQyxjQUFjLGFBQWE7WUFDbEMsT0FBTztnQkFBRUMsTUFBTTtnQkFBVUosYUFBYUc7WUFBVTtRQUNwRDtRQUNBLElBQUksT0FBT0UsZUFBZSxlQUFlLE9BQU9BLFdBQVdGLFNBQVMsS0FBSyxhQUFhO1lBQ2xGLE9BQU87Z0JBQUVDLE1BQU07Z0JBQVVKLGFBQWFLLFdBQVdGLFNBQVM7WUFBQztRQUMvRDtRQUNBLElBQUksT0FBT0csV0FBVyxlQUFlLE9BQU9BLE9BQU9ILFNBQVMsS0FBSyxhQUFhO1lBQzFFLE9BQU87Z0JBQUVDLE1BQU07Z0JBQVVKLGFBQWFNLE9BQU9ILFNBQVM7WUFBQztRQUMzRDtRQUNBLElBQUksT0FBT0UsZUFBZSxlQUN0QixPQUFPQSxXQUFXRSxhQUFhLEtBQUssZUFDcEMsT0FBT0YsV0FBV0YsU0FBUyxLQUFLLGFBQWE7WUFDN0MsT0FBTztnQkFDSEMsTUFBTTtnQkFDTkksT0FBTztnQkFDUEMsWUFBWTtZQUNoQjtRQUNKO1FBQ0EsSUFBSSxPQUFRSixlQUFlLGVBQWVBLFdBQVdLLFdBQVcsSUFDM0QsT0FBT0MsY0FBYyxlQUFnQixFQUFDVCxLQUFLUyxVQUFVQyxTQUFTLE1BQU0sUUFBUVYsT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJQSxHQUFHVyxRQUFRLENBQUMsY0FBYSxHQUFLO1lBQ3BJLE9BQU87Z0JBQ0hULE1BQU07Z0JBQ05JLE9BQU87Z0JBQ1BDLFlBQVk7WUFDaEI7UUFDSjtRQUNBLElBQUksT0FBT0ssWUFBWSxhQUFhO1lBQ2hDLHFGQUFxRjtZQUNyRixNQUFNQyxrQkFBa0JELE9BQU8sQ0FBQyxXQUFXO1lBQzNDLElBQUlDLG1CQUFtQkEsZUFBZSxDQUFDLE9BQU8sRUFBRTtnQkFDNUMsMkRBQTJEO2dCQUMzRCxNQUFNQyxnQkFBZ0JELGVBQWUsQ0FBQyxPQUFPO2dCQUM3QyxNQUFNRSxjQUFjQyxTQUFTRixjQUFjRyxPQUFPLENBQUMsTUFBTSxJQUFJQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFFLDJDQUEyQztnQkFDM0MsSUFBSUgsZUFBZSxJQUFJO29CQUNuQixvRUFBb0U7b0JBQ3BFLElBQUksT0FBT1osV0FBV0YsU0FBUyxLQUFLLGFBQWE7d0JBQzdDLE9BQU87NEJBQUVDLE1BQU07NEJBQVVKLGFBQWFLLFdBQVdGLFNBQVM7d0JBQUM7b0JBQy9EO29CQUNBLDZDQUE2QztvQkFDN0MsT0FBTzt3QkFDSEMsTUFBTTt3QkFDTkksT0FBTyxDQUFDLFFBQVEsRUFBRVMsWUFBWSx5Q0FBeUMsQ0FBQzt3QkFDeEVSLFlBQVk7b0JBQ2hCO2dCQUNKO2dCQUNBLDZDQUE2QztnQkFDN0MsT0FBTztvQkFDSEwsTUFBTTtvQkFDTkksT0FBTyxDQUFDLFFBQVEsRUFBRVMsWUFBWSwyQ0FBMkMsQ0FBQztvQkFDMUVSLFlBQVksc0ZBQ1IsMEJBQ0E7Z0JBQ1I7WUFDSjtRQUNKO1FBQ0EsT0FBTztZQUNITCxNQUFNO1lBQ05JLE9BQU87WUFDUEMsWUFBWTtRQUNoQjtJQUNKO0lBQ0E7Ozs7Ozs7O0tBUUMsR0FDRCxPQUFPWSwwQkFBMEI7UUFDN0IsTUFBTUMsTUFBTSxJQUFJLENBQUNyQixpQkFBaUI7UUFDbEMsSUFBSXFCLElBQUl0QixXQUFXLEVBQUU7WUFDakIsT0FBT3NCLElBQUl0QixXQUFXO1FBQzFCO1FBQ0EsSUFBSXVCLGVBQWVELElBQUlkLEtBQUssSUFBSTtRQUNoQyxJQUFJYyxJQUFJYixVQUFVLEVBQUU7WUFDaEJjLGdCQUFnQixDQUFDLHdCQUF3QixFQUFFRCxJQUFJYixVQUFVLENBQUMsQ0FBQztRQUMvRDtRQUNBLE1BQU0sSUFBSWUsTUFBTUQ7SUFDcEI7SUFDQTs7Ozs7OztLQU9DLEdBQ0QsT0FBT0UsZ0JBQWdCQyxHQUFHLEVBQUVDLFNBQVMsRUFBRTtRQUNuQyxNQUFNQyxLQUFLLElBQUksQ0FBQ1AsdUJBQXVCO1FBQ3ZDLE9BQU8sSUFBSU8sR0FBR0YsS0FBS0M7SUFDdkI7SUFDQTs7Ozs7Ozs7O0tBU0MsR0FDRCxPQUFPRSx1QkFBdUI7UUFDMUIsSUFBSTtZQUNBLE1BQU1QLE1BQU0sSUFBSSxDQUFDckIsaUJBQWlCO1lBQ2xDLE9BQU9xQixJQUFJbEIsSUFBSSxLQUFLLFlBQVlrQixJQUFJbEIsSUFBSSxLQUFLO1FBQ2pELEVBQ0EsT0FBT0YsSUFBSTtZQUNQLE9BQU87UUFDWDtJQUNKO0FBQ0o7QUFDQSxpRUFBZUgsZ0JBQWdCQSxFQUFDLENBQ2hDLDZDQUE2QyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcmVhbHRpbWUtanMvZGlzdC9tb2R1bGUvbGliL3dlYnNvY2tldC1mYWN0b3J5LmpzP2E1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlsaXRpZXMgZm9yIGNyZWF0aW5nIFdlYlNvY2tldCBpbnN0YW5jZXMgYWNyb3NzIHJ1bnRpbWVzLlxuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0RmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICogU3RhdGljLW9ubHkgdXRpbGl0eSDigJMgcHJldmVudCBpbnN0YW50aWF0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgc3RhdGljIGRldGVjdEVudmlyb25tZW50KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0eXBlb2YgV2ViU29ja2V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ25hdGl2ZScsIGNvbnN0cnVjdG9yOiBXZWJTb2NrZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWxUaGlzLldlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICduYXRpdmUnLCBjb25zdHJ1Y3RvcjogZ2xvYmFsVGhpcy5XZWJTb2NrZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGdsb2JhbC5XZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnbmF0aXZlJywgY29uc3RydWN0b3I6IGdsb2JhbC5XZWJTb2NrZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgZ2xvYmFsVGhpcy5XZWJTb2NrZXRQYWlyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIGdsb2JhbFRoaXMuV2ViU29ja2V0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY2xvdWRmbGFyZScsXG4gICAgICAgICAgICAgICAgZXJyb3I6ICdDbG91ZGZsYXJlIFdvcmtlcnMgZGV0ZWN0ZWQuIFdlYlNvY2tldCBjbGllbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIENsb3VkZmxhcmUgV29ya2Vycy4nLFxuICAgICAgICAgICAgICAgIHdvcmthcm91bmQ6ICdVc2UgQ2xvdWRmbGFyZSBXb3JrZXJzIFdlYlNvY2tldCBBUEkgZm9yIHNlcnZlci1zaWRlIFdlYlNvY2tldCBoYW5kbGluZywgb3IgZGVwbG95IHRvIGEgZGlmZmVyZW50IHJ1bnRpbWUuJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcy5FZGdlUnVudGltZSkgfHxcbiAgICAgICAgICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiAoKF9hID0gbmF2aWdhdG9yLnVzZXJBZ2VudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmluY2x1ZGVzKCdWZXJjZWwtRWRnZScpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3Vuc3VwcG9ydGVkJyxcbiAgICAgICAgICAgICAgICBlcnJvcjogJ0VkZ2UgcnVudGltZSBkZXRlY3RlZCAoVmVyY2VsIEVkZ2UvTmV0bGlmeSBFZGdlKS4gV2ViU29ja2V0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiBlZGdlIGZ1bmN0aW9ucy4nLFxuICAgICAgICAgICAgICAgIHdvcmthcm91bmQ6ICdVc2Ugc2VydmVybGVzcyBmdW5jdGlvbnMgb3IgYSBkaWZmZXJlbnQgZGVwbG95bWVudCB0YXJnZXQgZm9yIFdlYlNvY2tldCBmdW5jdGlvbmFsaXR5LicsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFVzZSBkeW5hbWljIHByb3BlcnR5IGFjY2VzcyB0byBhdm9pZCBOZXh0LmpzIEVkZ2UgUnVudGltZSBzdGF0aWMgYW5hbHlzaXMgd2FybmluZ3NcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NWZXJzaW9ucyA9IHByb2Nlc3NbJ3ZlcnNpb25zJ107XG4gICAgICAgICAgICBpZiAocHJvY2Vzc1ZlcnNpb25zICYmIHByb2Nlc3NWZXJzaW9uc1snbm9kZSddKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlICd2JyBwcmVmaXggaWYgcHJlc2VudCBhbmQgcGFyc2UgdGhlIG1ham9yIHZlcnNpb25cbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uU3RyaW5nID0gcHJvY2Vzc1ZlcnNpb25zWydub2RlJ107XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZVZlcnNpb24gPSBwYXJzZUludCh2ZXJzaW9uU3RyaW5nLnJlcGxhY2UoL152LywgJycpLnNwbGl0KCcuJylbMF0pO1xuICAgICAgICAgICAgICAgIC8vIE5vZGUuanMgMjIrIHNob3VsZCBoYXZlIG5hdGl2ZSBXZWJTb2NrZXRcbiAgICAgICAgICAgICAgICBpZiAobm9kZVZlcnNpb24gPj0gMjIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbmF0aXZlIFdlYlNvY2tldCBpcyBhdmFpbGFibGUgKHNob3VsZCBiZSBpbiBOb2RlLmpzIDIyKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLldlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICduYXRpdmUnLCBjb25zdHJ1Y3RvcjogZ2xvYmFsVGhpcy5XZWJTb2NrZXQgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QgYXZhaWxhYmxlLCB1c2VyIG5lZWRzIHRvIHByb3ZpZGUgaXRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd1bnN1cHBvcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYE5vZGUuanMgJHtub2RlVmVyc2lvbn0gZGV0ZWN0ZWQgYnV0IG5hdGl2ZSBXZWJTb2NrZXQgbm90IGZvdW5kLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrYXJvdW5kOiAnUHJvdmlkZSBhIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbiB2aWEgdGhlIHRyYW5zcG9ydCBvcHRpb24uJyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTm9kZS5qcyA8IDIyIGRvZXNuJ3QgaGF2ZSBuYXRpdmUgV2ViU29ja2V0XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3Vuc3VwcG9ydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGBOb2RlLmpzICR7bm9kZVZlcnNpb259IGRldGVjdGVkIHdpdGhvdXQgbmF0aXZlIFdlYlNvY2tldCBzdXBwb3J0LmAsXG4gICAgICAgICAgICAgICAgICAgIHdvcmthcm91bmQ6ICdGb3IgTm9kZS5qcyA8IDIyLCBpbnN0YWxsIFwid3NcIiBwYWNrYWdlIGFuZCBwcm92aWRlIGl0IHZpYSB0aGUgdHJhbnNwb3J0IG9wdGlvbjpcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgd3MgZnJvbSBcIndzXCJcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICduZXcgUmVhbHRpbWVDbGllbnQodXJsLCB7IHRyYW5zcG9ydDogd3MgfSknLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICd1bnN1cHBvcnRlZCcsXG4gICAgICAgICAgICBlcnJvcjogJ1Vua25vd24gSmF2YVNjcmlwdCBydW50aW1lIHdpdGhvdXQgV2ViU29ja2V0IHN1cHBvcnQuJyxcbiAgICAgICAgICAgIHdvcmthcm91bmQ6IFwiRW5zdXJlIHlvdSdyZSBydW5uaW5nIGluIGEgc3VwcG9ydGVkIGVudmlyb25tZW50IChicm93c2VyLCBOb2RlLmpzLCBEZW5vKSBvciBwcm92aWRlIGEgY3VzdG9tIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbi5cIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYmVzdCBhdmFpbGFibGUgV2ViU29ja2V0IGNvbnN0cnVjdG9yIGZvciB0aGUgY3VycmVudCBydW50aW1lLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IFdTID0gV2ViU29ja2V0RmFjdG9yeS5nZXRXZWJTb2NrZXRDb25zdHJ1Y3RvcigpXG4gICAgICogY29uc3Qgc29ja2V0ID0gbmV3IFdTKCd3c3M6Ly9yZWFsdGltZS5zdXBhYmFzZS5jby9zb2NrZXQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXZWJTb2NrZXRDb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgZW52ID0gdGhpcy5kZXRlY3RFbnZpcm9ubWVudCgpO1xuICAgICAgICBpZiAoZW52LmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZW52LmNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlbnYuZXJyb3IgfHwgJ1dlYlNvY2tldCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQuJztcbiAgICAgICAgaWYgKGVudi53b3JrYXJvdW5kKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcblxcblN1Z2dlc3RlZCBzb2x1dGlvbjogJHtlbnYud29ya2Fyb3VuZH1gO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgV2ViU29ja2V0IHVzaW5nIHRoZSBkZXRlY3RlZCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBXZWJTb2NrZXRGYWN0b3J5LmNyZWF0ZVdlYlNvY2tldCgnd3NzOi8vcmVhbHRpbWUuc3VwYWJhc2UuY28vc29ja2V0JylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlV2ViU29ja2V0KHVybCwgcHJvdG9jb2xzKSB7XG4gICAgICAgIGNvbnN0IFdTID0gdGhpcy5nZXRXZWJTb2NrZXRDb25zdHJ1Y3RvcigpO1xuICAgICAgICByZXR1cm4gbmV3IFdTKHVybCwgcHJvdG9jb2xzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZWN0cyB3aGV0aGVyIHRoZSBydW50aW1lIGNhbiBlc3RhYmxpc2ggV2ViU29ja2V0IGNvbm5lY3Rpb25zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0c1xuICAgICAqIGlmICghV2ViU29ja2V0RmFjdG9yeS5pc1dlYlNvY2tldFN1cHBvcnRlZCgpKSB7XG4gICAgICogICBjb25zb2xlLndhcm4oJ0ZhbGxpbmcgYmFjayB0byBsb25nIHBvbGxpbmcnKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNXZWJTb2NrZXRTdXBwb3J0ZWQoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbnYgPSB0aGlzLmRldGVjdEVudmlyb25tZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gZW52LnR5cGUgPT09ICduYXRpdmUnIHx8IGVudi50eXBlID09PSAnd3MnO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgV2ViU29ja2V0RmFjdG9yeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYnNvY2tldC1mYWN0b3J5LmpzLm1hcCJdLCJuYW1lcyI6WyJXZWJTb2NrZXRGYWN0b3J5IiwiY29uc3RydWN0b3IiLCJkZXRlY3RFbnZpcm9ubWVudCIsIl9hIiwiV2ViU29ja2V0IiwidHlwZSIsImdsb2JhbFRoaXMiLCJnbG9iYWwiLCJXZWJTb2NrZXRQYWlyIiwiZXJyb3IiLCJ3b3JrYXJvdW5kIiwiRWRnZVJ1bnRpbWUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJpbmNsdWRlcyIsInByb2Nlc3MiLCJwcm9jZXNzVmVyc2lvbnMiLCJ2ZXJzaW9uU3RyaW5nIiwibm9kZVZlcnNpb24iLCJwYXJzZUludCIsInJlcGxhY2UiLCJzcGxpdCIsImdldFdlYlNvY2tldENvbnN0cnVjdG9yIiwiZW52IiwiZXJyb3JNZXNzYWdlIiwiRXJyb3IiLCJjcmVhdGVXZWJTb2NrZXQiLCJ1cmwiLCJwcm90b2NvbHMiLCJXUyIsImlzV2ViU29ja2V0U3VwcG9ydGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-helpers-shared/dist/index.mjs ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BrowserCookieAuthStorageAdapter: () => (/* binding */ BrowserCookieAuthStorageAdapter),\n/* harmony export */ CookieAuthStorageAdapter: () => (/* binding */ CookieAuthStorageAdapter),\n/* harmony export */ DEFAULT_COOKIE_OPTIONS: () => (/* binding */ DEFAULT_COOKIE_OPTIONS),\n/* harmony export */ createSupabaseClient: () => (/* binding */ createSupabaseClient),\n/* harmony export */ isBrowser: () => (/* binding */ isBrowser),\n/* harmony export */ parseCookies: () => (/* binding */ export_parseCookies),\n/* harmony export */ parseSupabaseCookie: () => (/* binding */ parseSupabaseCookie),\n/* harmony export */ serializeCookie: () => (/* binding */ export_serializeCookie),\n/* harmony export */ stringifySupabaseSession: () => (/* binding */ stringifySupabaseSession)\n/* harmony export */ });\n/* harmony import */ var jose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jose */ \"(ssr)/./node_modules/jose/dist/node/esm/util/base64url.js\");\n/* harmony import */ var _supabase_supabase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @supabase/supabase-js */ \"(ssr)/./node_modules/@supabase/supabase-js/dist/index.mjs\");\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJS = (cb, mod)=>function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = {\n exports: {}\n }).exports, mod), mod.exports;\n };\nvar __copyProps = (to, from, except, desc)=>{\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n get: ()=>from[key],\n enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target)=>(target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(// If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n value: mod,\n enumerable: true\n }) : target, mod));\n// ../../node_modules/.pnpm/cookie@0.5.0/node_modules/cookie/index.js\nvar require_cookie = __commonJS({\n \"../../node_modules/.pnpm/cookie@0.5.0/node_modules/cookie/index.js\" (exports) {\n \"use strict\";\n exports.parse = parse3;\n exports.serialize = serialize3;\n var __toString = Object.prototype.toString;\n var fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n function parse3(str, options) {\n if (typeof str !== \"string\") {\n throw new TypeError(\"argument str must be a string\");\n }\n var obj = {};\n var opt = options || {};\n var dec = opt.decode || decode;\n var index = 0;\n while(index < str.length){\n var eqIdx = str.indexOf(\"=\", index);\n if (eqIdx === -1) {\n break;\n }\n var endIdx = str.indexOf(\";\", index);\n if (endIdx === -1) {\n endIdx = str.length;\n } else if (endIdx < eqIdx) {\n index = str.lastIndexOf(\";\", eqIdx - 1) + 1;\n continue;\n }\n var key = str.slice(index, eqIdx).trim();\n if (void 0 === obj[key]) {\n var val = str.slice(eqIdx + 1, endIdx).trim();\n if (val.charCodeAt(0) === 34) {\n val = val.slice(1, -1);\n }\n obj[key] = tryDecode(val, dec);\n }\n index = endIdx + 1;\n }\n return obj;\n }\n function serialize3(name, val, options) {\n var opt = options || {};\n var enc = opt.encode || encode;\n if (typeof enc !== \"function\") {\n throw new TypeError(\"option encode is invalid\");\n }\n if (!fieldContentRegExp.test(name)) {\n throw new TypeError(\"argument name is invalid\");\n }\n var value = enc(val);\n if (value && !fieldContentRegExp.test(value)) {\n throw new TypeError(\"argument val is invalid\");\n }\n var str = name + \"=\" + value;\n if (null != opt.maxAge) {\n var maxAge = opt.maxAge - 0;\n if (isNaN(maxAge) || !isFinite(maxAge)) {\n throw new TypeError(\"option maxAge is invalid\");\n }\n str += \"; Max-Age=\" + Math.floor(maxAge);\n }\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) {\n throw new TypeError(\"option domain is invalid\");\n }\n str += \"; Domain=\" + opt.domain;\n }\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) {\n throw new TypeError(\"option path is invalid\");\n }\n str += \"; Path=\" + opt.path;\n }\n if (opt.expires) {\n var expires = opt.expires;\n if (!isDate(expires) || isNaN(expires.valueOf())) {\n throw new TypeError(\"option expires is invalid\");\n }\n str += \"; Expires=\" + expires.toUTCString();\n }\n if (opt.httpOnly) {\n str += \"; HttpOnly\";\n }\n if (opt.secure) {\n str += \"; Secure\";\n }\n if (opt.priority) {\n var priority = typeof opt.priority === \"string\" ? opt.priority.toLowerCase() : opt.priority;\n switch(priority){\n case \"low\":\n str += \"; Priority=Low\";\n break;\n case \"medium\":\n str += \"; Priority=Medium\";\n break;\n case \"high\":\n str += \"; Priority=High\";\n break;\n default:\n throw new TypeError(\"option priority is invalid\");\n }\n }\n if (opt.sameSite) {\n var sameSite = typeof opt.sameSite === \"string\" ? opt.sameSite.toLowerCase() : opt.sameSite;\n switch(sameSite){\n case true:\n str += \"; SameSite=Strict\";\n break;\n case \"lax\":\n str += \"; SameSite=Lax\";\n break;\n case \"strict\":\n str += \"; SameSite=Strict\";\n break;\n case \"none\":\n str += \"; SameSite=None\";\n break;\n default:\n throw new TypeError(\"option sameSite is invalid\");\n }\n }\n return str;\n }\n function decode(str) {\n return str.indexOf(\"%\") !== -1 ? decodeURIComponent(str) : str;\n }\n function encode(val) {\n return encodeURIComponent(val);\n }\n function isDate(val) {\n return __toString.call(val) === \"[object Date]\" || val instanceof Date;\n }\n function tryDecode(str, decode2) {\n try {\n return decode2(str);\n } catch (e) {\n return str;\n }\n }\n }\n});\n// src/browserCookieStorage.ts\nvar import_cookie2 = __toESM(require_cookie());\n// src/utils/cookies.ts\nvar import_cookie = __toESM(require_cookie());\n\nfunction parseSupabaseCookie(str) {\n if (!str) {\n return null;\n }\n try {\n const session = JSON.parse(str);\n if (!session) {\n return null;\n }\n if (session.constructor.name === \"Object\") {\n return session;\n }\n if (session.constructor.name !== \"Array\") {\n throw new Error(`Unexpected format: ${session.constructor.name}`);\n }\n const [_header, payloadStr, _signature] = session[0].split(\".\");\n const payload = jose__WEBPACK_IMPORTED_MODULE_0__.decode(payloadStr);\n const decoder = new TextDecoder();\n const { exp, sub, ...user } = JSON.parse(decoder.decode(payload));\n return {\n expires_at: exp,\n expires_in: exp - Math.round(Date.now() / 1e3),\n token_type: \"bearer\",\n access_token: session[0],\n refresh_token: session[1],\n provider_token: session[2],\n provider_refresh_token: session[3],\n user: {\n id: sub,\n factors: session[4],\n ...user\n }\n };\n } catch (err) {\n console.warn(\"Failed to parse cookie string:\", err);\n return null;\n }\n}\nfunction stringifySupabaseSession(session) {\n var _a;\n return JSON.stringify([\n session.access_token,\n session.refresh_token,\n session.provider_token,\n session.provider_refresh_token,\n ((_a = session.user) == null ? void 0 : _a.factors) ?? null\n ]);\n}\n// src/utils/helpers.ts\nfunction isBrowser() {\n return false && 0;\n}\n// src/utils/constants.ts\nvar DEFAULT_COOKIE_OPTIONS = {\n path: \"/\",\n sameSite: \"lax\",\n maxAge: 60 * 60 * 24 * 365 * 1e3\n};\n// src/chunker.ts\nfunction createChunkRegExp(chunkSize) {\n return new RegExp(\".{1,\" + chunkSize + \"}\", \"g\");\n}\nvar MAX_CHUNK_SIZE = 3180;\nvar MAX_CHUNK_REGEXP = createChunkRegExp(MAX_CHUNK_SIZE);\nfunction createChunks(key, value, chunkSize) {\n const re = chunkSize !== void 0 ? createChunkRegExp(chunkSize) : MAX_CHUNK_REGEXP;\n const chunkCount = Math.ceil(value.length / (chunkSize ?? MAX_CHUNK_SIZE));\n if (chunkCount === 1) {\n return [\n {\n name: key,\n value\n }\n ];\n }\n const chunks = [];\n const values = value.match(re);\n values == null ? void 0 : values.forEach((value2, i)=>{\n const name = `${key}.${i}`;\n chunks.push({\n name,\n value: value2\n });\n });\n return chunks;\n}\nfunction combineChunks(key, retrieveChunk = ()=>{\n return null;\n}) {\n let values = [];\n for(let i = 0;; i++){\n const chunkName = `${key}.${i}`;\n const chunk = retrieveChunk(chunkName);\n if (!chunk) {\n break;\n }\n values.push(chunk);\n }\n return values.length ? values.join(\"\") : null;\n}\n// src/cookieAuthStorageAdapter.ts\nvar CookieAuthStorageAdapter = class {\n constructor(cookieOptions){\n this.cookieOptions = {\n ...DEFAULT_COOKIE_OPTIONS,\n ...cookieOptions,\n maxAge: DEFAULT_COOKIE_OPTIONS.maxAge\n };\n }\n getItem(key) {\n const value = this.getCookie(key);\n if (key.endsWith(\"-code-verifier\") && value) {\n return value;\n }\n if (value) {\n return JSON.stringify(parseSupabaseCookie(value));\n }\n const chunks = combineChunks(key, (chunkName)=>{\n return this.getCookie(chunkName);\n });\n return chunks !== null ? JSON.stringify(parseSupabaseCookie(chunks)) : null;\n }\n setItem(key, value) {\n if (key.endsWith(\"-code-verifier\")) {\n this.setCookie(key, value);\n return;\n }\n let session = JSON.parse(value);\n const sessionStr = stringifySupabaseSession(session);\n const sessionChunks = createChunks(key, sessionStr);\n sessionChunks.forEach((sess)=>{\n this.setCookie(sess.name, sess.value);\n });\n }\n removeItem(key) {\n this._deleteSingleCookie(key);\n this._deleteChunkedCookies(key);\n }\n _deleteSingleCookie(key) {\n if (this.getCookie(key)) {\n this.deleteCookie(key);\n }\n }\n _deleteChunkedCookies(key, from = 0) {\n for(let i = from;; i++){\n const cookieName = `${key}.${i}`;\n const value = this.getCookie(cookieName);\n if (value === void 0) {\n break;\n }\n this.deleteCookie(cookieName);\n }\n }\n};\n// src/browserCookieStorage.ts\nvar BrowserCookieAuthStorageAdapter = class extends CookieAuthStorageAdapter {\n constructor(cookieOptions){\n super(cookieOptions);\n }\n getCookie(name) {\n if (!isBrowser()) return null;\n const cookies = (0, import_cookie2.parse)(document.cookie);\n return cookies[name];\n }\n setCookie(name, value) {\n if (!isBrowser()) return null;\n document.cookie = (0, import_cookie2.serialize)(name, value, {\n ...this.cookieOptions,\n httpOnly: false\n });\n }\n deleteCookie(name) {\n if (!isBrowser()) return null;\n document.cookie = (0, import_cookie2.serialize)(name, \"\", {\n ...this.cookieOptions,\n maxAge: 0,\n httpOnly: false\n });\n }\n};\n// src/createClient.ts\n\nfunction createSupabaseClient(supabaseUrl, supabaseKey, options) {\n var _a;\n const browser = isBrowser();\n return (0,_supabase_supabase_js__WEBPACK_IMPORTED_MODULE_1__.createClient)(supabaseUrl, supabaseKey, {\n ...options,\n auth: {\n flowType: \"pkce\",\n autoRefreshToken: browser,\n detectSessionInUrl: browser,\n persistSession: true,\n storage: options.auth.storage,\n // fix this in supabase-js\n ...((_a = options.auth) == null ? void 0 : _a.storageKey) ? {\n storageKey: options.auth.storageKey\n } : {}\n }\n });\n}\nvar export_parseCookies = import_cookie.parse;\nvar export_serializeCookie = import_cookie.serialize;\n /*! Bundled license information:\n\ncookie/index.js:\n (*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n *)\n*/ //# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtaGVscGVycy1zaGFyZWQvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFJQSxXQUFXQyxPQUFPQyxNQUFNO0FBQzVCLElBQUlDLFlBQVlGLE9BQU9HLGNBQWM7QUFDckMsSUFBSUMsbUJBQW1CSixPQUFPSyx3QkFBd0I7QUFDdEQsSUFBSUMsb0JBQW9CTixPQUFPTyxtQkFBbUI7QUFDbEQsSUFBSUMsZUFBZVIsT0FBT1MsY0FBYztBQUN4QyxJQUFJQyxlQUFlVixPQUFPVyxTQUFTLENBQUNDLGNBQWM7QUFDbEQsSUFBSUMsYUFBYSxDQUFDQyxJQUFJQyxNQUFRLFNBQVNDO1FBQ3JDLE9BQU9ELE9BQU8sQ0FBQyxHQUFHRCxFQUFFLENBQUNSLGtCQUFrQlEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUNDLE1BQU07WUFBRUUsU0FBUyxDQUFDO1FBQUUsR0FBR0EsT0FBTyxFQUFFRixNQUFNQSxJQUFJRSxPQUFPO0lBQ3BHO0FBQ0EsSUFBSUMsY0FBYyxDQUFDQyxJQUFJQyxNQUFNQyxRQUFRQztJQUNuQyxJQUFJRixRQUFRLE9BQU9BLFNBQVMsWUFBWSxPQUFPQSxTQUFTLFlBQVk7UUFDbEUsS0FBSyxJQUFJRyxPQUFPakIsa0JBQWtCYyxNQUNoQyxJQUFJLENBQUNWLGFBQWFjLElBQUksQ0FBQ0wsSUFBSUksUUFBUUEsUUFBUUYsUUFDekNuQixVQUFVaUIsSUFBSUksS0FBSztZQUFFRSxLQUFLLElBQU1MLElBQUksQ0FBQ0csSUFBSTtZQUFFRyxZQUFZLENBQUVKLENBQUFBLE9BQU9sQixpQkFBaUJnQixNQUFNRyxJQUFHLEtBQU1ELEtBQUtJLFVBQVU7UUFBQztJQUN0SDtJQUNBLE9BQU9QO0FBQ1Q7QUFDQSxJQUFJUSxVQUFVLENBQUNaLEtBQUthLFlBQVlDLFNBQVlBLENBQUFBLFNBQVNkLE9BQU8sT0FBT2hCLFNBQVNTLGFBQWFPLFFBQVEsQ0FB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QUksRUFBRTtRQUNqQixJQUFJLENBQUM0RCxhQUNILE9BQU87UUFDVEUsU0FBU3dDLE1BQU0sR0FBRyxDQUFDLEdBQUc3RSxlQUFlaEQsU0FBUyxFQUFFdUIsTUFBTSxJQUFJO1lBQ3hELEdBQUcsSUFBSSxDQUFDc0YsYUFBYTtZQUNyQmxGLFFBQVE7WUFDUlcsVUFBVTtRQUNaO0lBQ0Y7QUFDRjtBQUVBLHNCQUFzQjtBQUMrQjtBQUNyRCxTQUFTeUYscUJBQXFCQyxXQUFXLEVBQUVDLFdBQVcsRUFBRTNILE9BQU87SUFDN0QsSUFBSTJFO0lBQ0osTUFBTWlELFVBQVUvQztJQUNoQixPQUFPMkMsbUVBQVlBLENBQUNFLGFBQWFDLGFBQWE7UUFDNUMsR0FBRzNILE9BQU87UUFDVjZILE1BQU07WUFDSkMsVUFBVTtZQUNWQyxrQkFBa0JIO1lBQ2xCSSxvQkFBb0JKO1lBQ3BCSyxnQkFBZ0I7WUFDaEJDLFNBQVNsSSxRQUFRNkgsSUFBSSxDQUFDSyxPQUFPO1lBQzdCLDBCQUEwQjtZQUMxQixHQUFHLENBQUMsQ0FBQ3ZELEtBQUszRSxRQUFRNkgsSUFBSSxLQUFLLE9BQU8sS0FBSyxJQUFJbEQsR0FBR3dELFVBQVUsSUFBSTtnQkFDMURBLFlBQVluSSxRQUFRNkgsSUFBSSxDQUFDTSxVQUFVO1lBQ3JDLElBQUksQ0FBQyxDQUFDO1FBQ1I7SUFDRjtBQUNGO0FBQ0EsSUFBSUMsc0JBQXNCekYsY0FBY25ELEtBQUs7QUFDN0MsSUFBSTZJLHlCQUF5QjFGLGNBQWNqRCxTQUFTO0FBV2xELENBQ0Y7Ozs7Ozs7OztBQVNBLElBQ0Esa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWhlbHBlcnMtc2hhcmVkL2Rpc3QvaW5kZXgubWpzPzM2YjMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2dldFByb3RvT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX2NvbW1vbkpTID0gKGNiLCBtb2QpID0+IGZ1bmN0aW9uIF9fcmVxdWlyZSgpIHtcbiAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9FU00gPSAobW9kLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+ICh0YXJnZXQgPSBtb2QgIT0gbnVsbCA/IF9fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKSA6IHt9LCBfX2NvcHlQcm9wcyhcbiAgLy8gSWYgdGhlIGltcG9ydGVyIGlzIGluIG5vZGUgY29tcGF0aWJpbGl0eSBtb2RlIG9yIHRoaXMgaXMgbm90IGFuIEVTTVxuICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLVxuICAvLyBjb21wYXRpYmxlIHRyYW5zZm9ybSAoaS5lLiBcIl9fZXNNb2R1bGVcIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXRcbiAgLy8gXCJkZWZhdWx0XCIgdG8gdGhlIENvbW1vbkpTIFwibW9kdWxlLmV4cG9ydHNcIiBmb3Igbm9kZSBjb21wYXRpYmlsaXR5LlxuICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgXCJkZWZhdWx0XCIsIHsgdmFsdWU6IG1vZCwgZW51bWVyYWJsZTogdHJ1ZSB9KSA6IHRhcmdldCxcbiAgbW9kXG4pKTtcblxuLy8gLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Nvb2tpZUAwLjUuMC9ub2RlX21vZHVsZXMvY29va2llL2luZGV4LmpzXG52YXIgcmVxdWlyZV9jb29raWUgPSBfX2NvbW1vbkpTKHtcbiAgXCIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29va2llQDAuNS4wL25vZGVfbW9kdWxlcy9jb29raWUvaW5kZXguanNcIihleHBvcnRzKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgZXhwb3J0cy5wYXJzZSA9IHBhcnNlMztcbiAgICBleHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTM7XG4gICAgdmFyIF9fdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIHZhciBmaWVsZENvbnRlbnRSZWdFeHAgPSAvXltcXHUwMDA5XFx1MDAyMC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXSskLztcbiAgICBmdW5jdGlvbiBwYXJzZTMoc3RyLCBvcHRpb25zKSB7XG4gICAgICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgc3RyIG11c3QgYmUgYSBzdHJpbmdcIik7XG4gICAgICB9XG4gICAgICB2YXIgb2JqID0ge307XG4gICAgICB2YXIgb3B0ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIHZhciBkZWMgPSBvcHQuZGVjb2RlIHx8IGRlY29kZTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB3aGlsZSAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgIHZhciBlcUlkeCA9IHN0ci5pbmRleE9mKFwiPVwiLCBpbmRleCk7XG4gICAgICAgIGlmIChlcUlkeCA9PT0gLTEpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW5kSWR4ID0gc3RyLmluZGV4T2YoXCI7XCIsIGluZGV4KTtcbiAgICAgICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgICAgICBlbmRJZHggPSBzdHIubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKGVuZElkeCA8IGVxSWR4KSB7XG4gICAgICAgICAgaW5kZXggPSBzdHIubGFzdEluZGV4T2YoXCI7XCIsIGVxSWR4IC0gMSkgKyAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrZXkgPSBzdHIuc2xpY2UoaW5kZXgsIGVxSWR4KS50cmltKCk7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IG9ialtrZXldKSB7XG4gICAgICAgICAgdmFyIHZhbCA9IHN0ci5zbGljZShlcUlkeCArIDEsIGVuZElkeCkudHJpbSgpO1xuICAgICAgICAgIGlmICh2YWwuY2hhckNvZGVBdCgwKSA9PT0gMzQpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ialtrZXldID0gdHJ5RGVjb2RlKHZhbCwgZGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IGVuZElkeCArIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXJpYWxpemUzKG5hbWUsIHZhbCwgb3B0aW9ucykge1xuICAgICAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG4gICAgICB2YXIgZW5jID0gb3B0LmVuY29kZSB8fCBlbmNvZGU7XG4gICAgICBpZiAodHlwZW9mIGVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gZW5jb2RlIGlzIGludmFsaWRcIik7XG4gICAgICB9XG4gICAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBuYW1lIGlzIGludmFsaWRcIik7XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBlbmModmFsKTtcbiAgICAgIGlmICh2YWx1ZSAmJiAhZmllbGRDb250ZW50UmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCB2YWwgaXMgaW52YWxpZFwiKTtcbiAgICAgIH1cbiAgICAgIHZhciBzdHIgPSBuYW1lICsgXCI9XCIgKyB2YWx1ZTtcbiAgICAgIGlmIChudWxsICE9IG9wdC5tYXhBZ2UpIHtcbiAgICAgICAgdmFyIG1heEFnZSA9IG9wdC5tYXhBZ2UgLSAwO1xuICAgICAgICBpZiAoaXNOYU4obWF4QWdlKSB8fCAhaXNGaW5pdGUobWF4QWdlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gbWF4QWdlIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBNYXgtQWdlPVwiICsgTWF0aC5mbG9vcihtYXhBZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5kb21haW4pIHtcbiAgICAgICAgaWYgKCFmaWVsZENvbnRlbnRSZWdFeHAudGVzdChvcHQuZG9tYWluKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gZG9tYWluIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBEb21haW49XCIgKyBvcHQuZG9tYWluO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5wYXRoKSB7XG4gICAgICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LnBhdGgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbiBwYXRoIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBQYXRoPVwiICsgb3B0LnBhdGg7XG4gICAgICB9XG4gICAgICBpZiAob3B0LmV4cGlyZXMpIHtcbiAgICAgICAgdmFyIGV4cGlyZXMgPSBvcHQuZXhwaXJlcztcbiAgICAgICAgaWYgKCFpc0RhdGUoZXhwaXJlcykgfHwgaXNOYU4oZXhwaXJlcy52YWx1ZU9mKCkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbiBleHBpcmVzIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBFeHBpcmVzPVwiICsgZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5odHRwT25seSkge1xuICAgICAgICBzdHIgKz0gXCI7IEh0dHBPbmx5XCI7XG4gICAgICB9XG4gICAgICBpZiAob3B0LnNlY3VyZSkge1xuICAgICAgICBzdHIgKz0gXCI7IFNlY3VyZVwiO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5wcmlvcml0eSkge1xuICAgICAgICB2YXIgcHJpb3JpdHkgPSB0eXBlb2Ygb3B0LnByaW9yaXR5ID09PSBcInN0cmluZ1wiID8gb3B0LnByaW9yaXR5LnRvTG93ZXJDYXNlKCkgOiBvcHQucHJpb3JpdHk7XG4gICAgICAgIHN3aXRjaCAocHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIFwibG93XCI6XG4gICAgICAgICAgICBzdHIgKz0gXCI7IFByaW9yaXR5PUxvd1wiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm1lZGl1bVwiOlxuICAgICAgICAgICAgc3RyICs9IFwiOyBQcmlvcml0eT1NZWRpdW1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJoaWdoXCI6XG4gICAgICAgICAgICBzdHIgKz0gXCI7IFByaW9yaXR5PUhpZ2hcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwib3B0aW9uIHByaW9yaXR5IGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcHQuc2FtZVNpdGUpIHtcbiAgICAgICAgdmFyIHNhbWVTaXRlID0gdHlwZW9mIG9wdC5zYW1lU2l0ZSA9PT0gXCJzdHJpbmdcIiA/IG9wdC5zYW1lU2l0ZS50b0xvd2VyQ2FzZSgpIDogb3B0LnNhbWVTaXRlO1xuICAgICAgICBzd2l0Y2ggKHNhbWVTaXRlKSB7XG4gICAgICAgICAgY2FzZSB0cnVlOlxuICAgICAgICAgICAgc3RyICs9IFwiOyBTYW1lU2l0ZT1TdHJpY3RcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJsYXhcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIjsgU2FtZVNpdGU9TGF4XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic3RyaWN0XCI6XG4gICAgICAgICAgICBzdHIgKz0gXCI7IFNhbWVTaXRlPVN0cmljdFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm5vbmVcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIjsgU2FtZVNpdGU9Tm9uZVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gc2FtZVNpdGUgaXMgaW52YWxpZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVjb2RlKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci5pbmRleE9mKFwiJVwiKSAhPT0gLTEgPyBkZWNvZGVVUklDb21wb25lbnQoc3RyKSA6IHN0cjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gICAgICByZXR1cm4gX190b1N0cmluZy5jYWxsKHZhbCkgPT09IFwiW29iamVjdCBEYXRlXVwiIHx8IHZhbCBpbnN0YW5jZW9mIERhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyeURlY29kZShzdHIsIGRlY29kZTIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGUyKHN0cik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcblxuLy8gc3JjL2Jyb3dzZXJDb29raWVTdG9yYWdlLnRzXG52YXIgaW1wb3J0X2Nvb2tpZTIgPSBfX3RvRVNNKHJlcXVpcmVfY29va2llKCkpO1xuXG4vLyBzcmMvdXRpbHMvY29va2llcy50c1xudmFyIGltcG9ydF9jb29raWUgPSBfX3RvRVNNKHJlcXVpcmVfY29va2llKCkpO1xuaW1wb3J0IHsgYmFzZTY0dXJsIH0gZnJvbSBcImpvc2VcIjtcbmZ1bmN0aW9uIHBhcnNlU3VwYWJhc2VDb29raWUoc3RyKSB7XG4gIGlmICghc3RyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBzZXNzaW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChzZXNzaW9uLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH1cbiAgICBpZiAoc2Vzc2lvbi5jb25zdHJ1Y3Rvci5uYW1lICE9PSBcIkFycmF5XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmb3JtYXQ6ICR7c2Vzc2lvbi5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIH1cbiAgICBjb25zdCBbX2hlYWRlciwgcGF5bG9hZFN0ciwgX3NpZ25hdHVyZV0gPSBzZXNzaW9uWzBdLnNwbGl0KFwiLlwiKTtcbiAgICBjb25zdCBwYXlsb2FkID0gYmFzZTY0dXJsLmRlY29kZShwYXlsb2FkU3RyKTtcbiAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgeyBleHAsIHN1YiwgLi4udXNlciB9ID0gSlNPTi5wYXJzZShkZWNvZGVyLmRlY29kZShwYXlsb2FkKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGlyZXNfYXQ6IGV4cCxcbiAgICAgIGV4cGlyZXNfaW46IGV4cCAtIE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDFlMyksXG4gICAgICB0b2tlbl90eXBlOiBcImJlYXJlclwiLFxuICAgICAgYWNjZXNzX3Rva2VuOiBzZXNzaW9uWzBdLFxuICAgICAgcmVmcmVzaF90b2tlbjogc2Vzc2lvblsxXSxcbiAgICAgIHByb3ZpZGVyX3Rva2VuOiBzZXNzaW9uWzJdLFxuICAgICAgcHJvdmlkZXJfcmVmcmVzaF90b2tlbjogc2Vzc2lvblszXSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgaWQ6IHN1YixcbiAgICAgICAgZmFjdG9yczogc2Vzc2lvbls0XSxcbiAgICAgICAgLi4udXNlclxuICAgICAgfVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSBjb29raWUgc3RyaW5nOlwiLCBlcnIpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlTdXBhYmFzZVNlc3Npb24oc2Vzc2lvbikge1xuICB2YXIgX2E7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgc2Vzc2lvbi5yZWZyZXNoX3Rva2VuLFxuICAgIHNlc3Npb24ucHJvdmlkZXJfdG9rZW4sXG4gICAgc2Vzc2lvbi5wcm92aWRlcl9yZWZyZXNoX3Rva2VuLFxuICAgICgoX2EgPSBzZXNzaW9uLnVzZXIpID09IG51bGwgPyB2b2lkIDAgOiBfYS5mYWN0b3JzKSA/PyBudWxsXG4gIF0pO1xufVxuXG4vLyBzcmMvdXRpbHMvaGVscGVycy50c1xuZnVuY3Rpb24gaXNCcm93c2VyKCkge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xufVxuXG4vLyBzcmMvdXRpbHMvY29uc3RhbnRzLnRzXG52YXIgREVGQVVMVF9DT09LSUVfT1BUSU9OUyA9IHtcbiAgcGF0aDogXCIvXCIsXG4gIHNhbWVTaXRlOiBcImxheFwiLFxuICBtYXhBZ2U6IDYwICogNjAgKiAyNCAqIDM2NSAqIDFlM1xufTtcblxuLy8gc3JjL2NodW5rZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZUNodW5rUmVnRXhwKGNodW5rU2l6ZSkge1xuICByZXR1cm4gbmV3IFJlZ0V4cChcIi57MSxcIiArIGNodW5rU2l6ZSArIFwifVwiLCBcImdcIik7XG59XG52YXIgTUFYX0NIVU5LX1NJWkUgPSAzMTgwO1xudmFyIE1BWF9DSFVOS19SRUdFWFAgPSBjcmVhdGVDaHVua1JlZ0V4cChNQVhfQ0hVTktfU0laRSk7XG5mdW5jdGlvbiBjcmVhdGVDaHVua3Moa2V5LCB2YWx1ZSwgY2h1bmtTaXplKSB7XG4gIGNvbnN0IHJlID0gY2h1bmtTaXplICE9PSB2b2lkIDAgPyBjcmVhdGVDaHVua1JlZ0V4cChjaHVua1NpemUpIDogTUFYX0NIVU5LX1JFR0VYUDtcbiAgY29uc3QgY2h1bmtDb3VudCA9IE1hdGguY2VpbCh2YWx1ZS5sZW5ndGggLyAoY2h1bmtTaXplID8/IE1BWF9DSFVOS19TSVpFKSk7XG4gIGlmIChjaHVua0NvdW50ID09PSAxKSB7XG4gICAgcmV0dXJuIFt7IG5hbWU6IGtleSwgdmFsdWUgfV07XG4gIH1cbiAgY29uc3QgY2h1bmtzID0gW107XG4gIGNvbnN0IHZhbHVlcyA9IHZhbHVlLm1hdGNoKHJlKTtcbiAgdmFsdWVzID09IG51bGwgPyB2b2lkIDAgOiB2YWx1ZXMuZm9yRWFjaCgodmFsdWUyLCBpKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGAke2tleX0uJHtpfWA7XG4gICAgY2h1bmtzLnB1c2goeyBuYW1lLCB2YWx1ZTogdmFsdWUyIH0pO1xuICB9KTtcbiAgcmV0dXJuIGNodW5rcztcbn1cbmZ1bmN0aW9uIGNvbWJpbmVDaHVua3Moa2V5LCByZXRyaWV2ZUNodW5rID0gKCkgPT4ge1xuICByZXR1cm4gbnVsbDtcbn0pIHtcbiAgbGV0IHZhbHVlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgOyBpKyspIHtcbiAgICBjb25zdCBjaHVua05hbWUgPSBgJHtrZXl9LiR7aX1gO1xuICAgIGNvbnN0IGNodW5rID0gcmV0cmlldmVDaHVuayhjaHVua05hbWUpO1xuICAgIGlmICghY2h1bmspIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YWx1ZXMucHVzaChjaHVuayk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyB2YWx1ZXMuam9pbihcIlwiKSA6IG51bGw7XG59XG5cbi8vIHNyYy9jb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIudHNcbnZhciBDb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvb2tpZU9wdGlvbnMpIHtcbiAgICB0aGlzLmNvb2tpZU9wdGlvbnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0NPT0tJRV9PUFRJT05TLFxuICAgICAgLi4uY29va2llT3B0aW9ucyxcbiAgICAgIG1heEFnZTogREVGQVVMVF9DT09LSUVfT1BUSU9OUy5tYXhBZ2VcbiAgICB9O1xuICB9XG4gIGdldEl0ZW0oa2V5KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldENvb2tpZShrZXkpO1xuICAgIGlmIChrZXkuZW5kc1dpdGgoXCItY29kZS12ZXJpZmllclwiKSAmJiB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXJzZVN1cGFiYXNlQ29va2llKHZhbHVlKSk7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rcyA9IGNvbWJpbmVDaHVua3Moa2V5LCAoY2h1bmtOYW1lKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb29raWUoY2h1bmtOYW1lKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2h1bmtzICE9PSBudWxsID8gSlNPTi5zdHJpbmdpZnkocGFyc2VTdXBhYmFzZUNvb2tpZShjaHVua3MpKSA6IG51bGw7XG4gIH1cbiAgc2V0SXRlbShrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleS5lbmRzV2l0aChcIi1jb2RlLXZlcmlmaWVyXCIpKSB7XG4gICAgICB0aGlzLnNldENvb2tpZShrZXksIHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNlc3Npb24gPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICBjb25zdCBzZXNzaW9uU3RyID0gc3RyaW5naWZ5U3VwYWJhc2VTZXNzaW9uKHNlc3Npb24pO1xuICAgIGNvbnN0IHNlc3Npb25DaHVua3MgPSBjcmVhdGVDaHVua3Moa2V5LCBzZXNzaW9uU3RyKTtcbiAgICBzZXNzaW9uQ2h1bmtzLmZvckVhY2goKHNlc3MpID0+IHtcbiAgICAgIHRoaXMuc2V0Q29va2llKHNlc3MubmFtZSwgc2Vzcy52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbiAgcmVtb3ZlSXRlbShrZXkpIHtcbiAgICB0aGlzLl9kZWxldGVTaW5nbGVDb29raWUoa2V5KTtcbiAgICB0aGlzLl9kZWxldGVDaHVua2VkQ29va2llcyhrZXkpO1xuICB9XG4gIF9kZWxldGVTaW5nbGVDb29raWUoa2V5KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29va2llKGtleSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlQ29va2llKGtleSk7XG4gICAgfVxuICB9XG4gIF9kZWxldGVDaHVua2VkQ29va2llcyhrZXksIGZyb20gPSAwKSB7XG4gICAgZm9yIChsZXQgaSA9IGZyb207IDsgaSsrKSB7XG4gICAgICBjb25zdCBjb29raWVOYW1lID0gYCR7a2V5fS4ke2l9YDtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDb29raWUoY29va2llTmFtZSk7XG4gICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVsZXRlQ29va2llKGNvb2tpZU5hbWUpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gc3JjL2Jyb3dzZXJDb29raWVTdG9yYWdlLnRzXG52YXIgQnJvd3NlckNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlciA9IGNsYXNzIGV4dGVuZHMgQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IoY29va2llT3B0aW9ucykge1xuICAgIHN1cGVyKGNvb2tpZU9wdGlvbnMpO1xuICB9XG4gIGdldENvb2tpZShuYW1lKSB7XG4gICAgaWYgKCFpc0Jyb3dzZXIoKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvb2tpZXMgPSAoMCwgaW1wb3J0X2Nvb2tpZTIucGFyc2UpKGRvY3VtZW50LmNvb2tpZSk7XG4gICAgcmV0dXJuIGNvb2tpZXNbbmFtZV07XG4gIH1cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKCFpc0Jyb3dzZXIoKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9ICgwLCBpbXBvcnRfY29va2llMi5zZXJpYWxpemUpKG5hbWUsIHZhbHVlLCB7XG4gICAgICAuLi50aGlzLmNvb2tpZU9wdGlvbnMsXG4gICAgICBodHRwT25seTogZmFsc2VcbiAgICB9KTtcbiAgfVxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIGlmICghaXNCcm93c2VyKCkpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBkb2N1bWVudC5jb29raWUgPSAoMCwgaW1wb3J0X2Nvb2tpZTIuc2VyaWFsaXplKShuYW1lLCBcIlwiLCB7XG4gICAgICAuLi50aGlzLmNvb2tpZU9wdGlvbnMsXG4gICAgICBtYXhBZ2U6IDAsXG4gICAgICBodHRwT25seTogZmFsc2VcbiAgICB9KTtcbiAgfVxufTtcblxuLy8gc3JjL2NyZWF0ZUNsaWVudC50c1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50IH0gZnJvbSBcIkBzdXBhYmFzZS9zdXBhYmFzZS1qc1wiO1xuZnVuY3Rpb24gY3JlYXRlU3VwYWJhc2VDbGllbnQoc3VwYWJhc2VVcmwsIHN1cGFiYXNlS2V5LCBvcHRpb25zKSB7XG4gIHZhciBfYTtcbiAgY29uc3QgYnJvd3NlciA9IGlzQnJvd3NlcigpO1xuICByZXR1cm4gY3JlYXRlQ2xpZW50KHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgYXV0aDoge1xuICAgICAgZmxvd1R5cGU6IFwicGtjZVwiLFxuICAgICAgYXV0b1JlZnJlc2hUb2tlbjogYnJvd3NlcixcbiAgICAgIGRldGVjdFNlc3Npb25JblVybDogYnJvd3NlcixcbiAgICAgIHBlcnNpc3RTZXNzaW9uOiB0cnVlLFxuICAgICAgc3RvcmFnZTogb3B0aW9ucy5hdXRoLnN0b3JhZ2UsXG4gICAgICAvLyBmaXggdGhpcyBpbiBzdXBhYmFzZS1qc1xuICAgICAgLi4uKChfYSA9IG9wdGlvbnMuYXV0aCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnN0b3JhZ2VLZXkpID8ge1xuICAgICAgICBzdG9yYWdlS2V5OiBvcHRpb25zLmF1dGguc3RvcmFnZUtleVxuICAgICAgfSA6IHt9XG4gICAgfVxuICB9KTtcbn1cbnZhciBleHBvcnRfcGFyc2VDb29raWVzID0gaW1wb3J0X2Nvb2tpZS5wYXJzZTtcbnZhciBleHBvcnRfc2VyaWFsaXplQ29va2llID0gaW1wb3J0X2Nvb2tpZS5zZXJpYWxpemU7XG5leHBvcnQge1xuICBCcm93c2VyQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyLFxuICBDb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIsXG4gIERFRkFVTFRfQ09PS0lFX09QVElPTlMsXG4gIGNyZWF0ZVN1cGFiYXNlQ2xpZW50LFxuICBpc0Jyb3dzZXIsXG4gIGV4cG9ydF9wYXJzZUNvb2tpZXMgYXMgcGFyc2VDb29raWVzLFxuICBwYXJzZVN1cGFiYXNlQ29va2llLFxuICBleHBvcnRfc2VyaWFsaXplQ29va2llIGFzIHNlcmlhbGl6ZUNvb2tpZSxcbiAgc3RyaW5naWZ5U3VwYWJhc2VTZXNzaW9uXG59O1xuLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjpcblxuY29va2llL2luZGV4LmpzOlxuICAoKiFcbiAgICogY29va2llXG4gICAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgUm9tYW4gU2h0eWxtYW5cbiAgICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAgICogTUlUIExpY2Vuc2VkXG4gICAqKVxuKi9cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXAiXSwibmFtZXMiOlsiX19jcmVhdGUiLCJPYmplY3QiLCJjcmVhdGUiLCJfX2RlZlByb3AiLCJkZWZpbmVQcm9wZXJ0eSIsIl9fZ2V0T3duUHJvcERlc2MiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfX2dldE93blByb3BOYW1lcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJfX2dldFByb3RvT2YiLCJnZXRQcm90b3R5cGVPZiIsIl9faGFzT3duUHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiX19jb21tb25KUyIsImNiIiwibW9kIiwiX19yZXF1aXJlIiwiZXhwb3J0cyIsIl9fY29weVByb3BzIiwidG8iLCJmcm9tIiwiZXhjZXB0IiwiZGVzYyIsImtleSIsImNhbGwiLCJnZXQiLCJlbnVtZXJhYmxlIiwiX190b0VTTSIsImlzTm9kZU1vZGUiLCJ0YXJnZXQiLCJfX2VzTW9kdWxlIiwidmFsdWUiLCJyZXF1aXJlX2Nvb2tpZSIsInBhcnNlIiwicGFyc2UzIiwic2VyaWFsaXplIiwic2VyaWFsaXplMyIsIl9fdG9TdHJpbmciLCJ0b1N0cmluZyIsImZpZWxkQ29udGVudFJlZ0V4cCIsInN0ciIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJvYmoiLCJvcHQiLCJkZWMiLCJkZWNvZGUiLCJpbmRleCIsImxlbmd0aCIsImVxSWR4IiwiaW5kZXhPZiIsImVuZElkeCIsImxhc3RJbmRleE9mIiwic2xpY2UiLCJ0cmltIiwidmFsIiwiY2hhckNvZGVBdCIsInRyeURlY29kZSIsIm5hbWUiLCJlbmMiLCJlbmNvZGUiLCJ0ZXN0IiwibWF4QWdlIiwiaXNOYU4iLCJpc0Zpbml0ZSIsIk1hdGgiLCJmbG9vciIsImRvbWFpbiIsInBhdGgiLCJleHBpcmVzIiwiaXNEYXRlIiwidmFsdWVPZiIsInRvVVRDU3RyaW5nIiwiaHR0cE9ubHkiLCJzZWN1cmUiLCJwcmlvcml0eSIsInRvTG93ZXJDYXNlIiwic2FtZVNpdGUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlbmNvZGVVUklDb21wb25lbnQiLCJEYXRlIiwiZGVjb2RlMiIsImUiLCJpbXBvcnRfY29va2llMiIsImltcG9ydF9jb29raWUiLCJiYXNlNjR1cmwiLCJwYXJzZVN1cGFiYXNlQ29va2llIiwic2Vzc2lvbiIsIkpTT04iLCJjb25zdHJ1Y3RvciIsIkVycm9yIiwiX2hlYWRlciIsInBheWxvYWRTdHIiLCJfc2lnbmF0dXJlIiwic3BsaXQiLCJwYXlsb2FkIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwiZXhwIiwic3ViIiwidXNlciIsImV4cGlyZXNfYXQiLCJleHBpcmVzX2luIiwicm91bmQiLCJub3ciLCJ0b2tlbl90eXBlIiwiYWNjZXNzX3Rva2VuIiwicmVmcmVzaF90b2tlbiIsInByb3ZpZGVyX3Rva2VuIiwicHJvdmlkZXJfcmVmcmVzaF90b2tlbiIsImlkIiwiZmFjdG9ycyIsImVyciIsImNvbnNvbGUiLCJ3YXJuIiwic3RyaW5naWZ5U3VwYWJhc2VTZXNzaW9uIiwiX2EiLCJzdHJpbmdpZnkiLCJpc0Jyb3dzZXIiLCJ3aW5kb3ciLCJkb2N1bWVudCIsIkRFRkFVTFRfQ09PS0lFX09QVElPTlMiLCJjcmVhdGVDaHVua1JlZ0V4cCIsImNodW5rU2l6ZSIsIlJlZ0V4cCIsIk1BWF9DSFVOS19TSVpFIiwiTUFYX0NIVU5LX1JFR0VYUCIsImNyZWF0ZUNodW5rcyIsInJlIiwiY2h1bmtDb3VudCIsImNlaWwiLCJjaHVua3MiLCJ2YWx1ZXMiLCJtYXRjaCIsImZvckVhY2giLCJ2YWx1ZTIiLCJpIiwicHVzaCIsImNvbWJpbmVDaHVua3MiLCJyZXRyaWV2ZUNodW5rIiwiY2h1bmtOYW1lIiwiY2h1bmsiLCJqb2luIiwiQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIiwiY29va2llT3B0aW9ucyIsImdldEl0ZW0iLCJnZXRDb29raWUiLCJlbmRzV2l0aCIsInNldEl0ZW0iLCJzZXRDb29raWUiLCJzZXNzaW9uU3RyIiwic2Vzc2lvbkNodW5rcyIsInNlc3MiLCJyZW1vdmVJdGVtIiwiX2RlbGV0ZVNpbmdsZUNvb2tpZSIsIl9kZWxldGVDaHVua2VkQ29va2llcyIsImRlbGV0ZUNvb2tpZSIsImNvb2tpZU5hbWUiLCJCcm93c2VyQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIiwiY29va2llcyIsImNvb2tpZSIsImNyZWF0ZUNsaWVudCIsImNyZWF0ZVN1cGFiYXNlQ2xpZW50Iiwic3VwYWJhc2VVcmwiLCJzdXBhYmFzZUtleSIsImJyb3dzZXIiLCJhdXRoIiwiZmxvd1R5cGUiLCJhdXRvUmVmcmVzaFRva2VuIiwiZGV0ZWN0U2Vzc2lvbkluVXJsIiwicGVyc2lzdFNlc3Npb24iLCJzdG9yYWdlIiwic3RvcmFnZUtleSIsImV4cG9ydF9wYXJzZUNvb2tpZXMiLCJleHBvcnRfc2VyaWFsaXplQ29va2llIiwicGFyc2VDb29raWVzIiwic2VyaWFsaXplQ29va2llIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/postgrest-js/dist/index.mjs":
|
||
/*!************************************************************!*\
|
||
!*** ./node_modules/@supabase/postgrest-js/dist/index.mjs ***!
|
||
\************************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PostgrestBuilder: () => (/* binding */ PostgrestBuilder),\n/* harmony export */ PostgrestClient: () => (/* binding */ PostgrestClient),\n/* harmony export */ PostgrestError: () => (/* binding */ PostgrestError),\n/* harmony export */ PostgrestFilterBuilder: () => (/* binding */ PostgrestFilterBuilder),\n/* harmony export */ PostgrestQueryBuilder: () => (/* binding */ PostgrestQueryBuilder),\n/* harmony export */ PostgrestTransformBuilder: () => (/* binding */ PostgrestTransformBuilder),\n/* harmony export */ \"default\": () => (/* 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* 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\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 ${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 = `${(_fetchError$name = fetchError === null || fetchError === void 0 ? void 0 : fetchError.name) !== null && _fetchError$name !== void 0 ? _fetchError$name : \"FetchError\"}: ${fetchError === null || fetchError === void 0 ? void 0 : fetchError.message}`;\n errorDetails += `\\n\\nCaused by: ${(_cause$name = cause === null || cause === void 0 ? void 0 : cause.name) !== null && _cause$name !== void 0 ? _cause$name : \"Error\"}: ${causeMessage}`;\n if (causeCode) errorDetails += ` (${causeCode})`;\n if (cause === null || cause === void 0 ? void 0 : cause.stack) errorDetails += `\\n${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: `${(_fetchError$name2 = fetchError === null || fetchError === void 0 ? void 0 : fetchError.name) !== null && _fetchError$name2 !== void 0 ? _fetchError$name2 : \"FetchError\"}: ${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//#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, { ascending = true, nullsFirst, foreignTable, referencedTable = foreignTable } = {}) {\n const key = referencedTable ? `${referencedTable}.order` : \"order\";\n const existingOrder = this.url.searchParams.get(key);\n this.url.searchParams.set(key, `${existingOrder ? `${existingOrder},` : \"\"}${column}.${ascending ? \"asc\" : \"desc\"}${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, { foreignTable, referencedTable = foreignTable } = {}) {\n const key = typeof referencedTable === \"undefined\" ? \"limit\" : `${referencedTable}.limit`;\n this.url.searchParams.set(key, `${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, { foreignTable, referencedTable = foreignTable } = {}) {\n const keyOffset = typeof referencedTable === \"undefined\" ? \"offset\" : `${referencedTable}.offset`;\n const keyLimit = typeof referencedTable === \"undefined\" ? \"limit\" : `${referencedTable}.limit`;\n this.url.searchParams.set(keyOffset, `${from}`);\n this.url.searchParams.set(keyLimit, `${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({ analyze = false, verbose = false, settings = false, buffers = false, wal = false, format = \"text\" } = {}) {\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+${format}; for=\"${forMediatype}\"; options=${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=${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.${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.${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.${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.${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.${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.${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.${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).{${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).{${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.${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).{${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).{${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.${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.${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.${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.${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 `\"${s}\"`;\n else return `${s}`;\n }).join(\",\");\n this.url.searchParams.append(column, `in.(${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 `\"${s}\"`;\n else return `${s}`;\n }).join(\",\");\n this.url.searchParams.append(column, `not.in.(${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.${value}`);\n else if (Array.isArray(value)) this.url.searchParams.append(column, `cs.{${value.join(\",\")}}`);\n else this.url.searchParams.append(column, `cs.${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.${value}`);\n else if (Array.isArray(value)) this.url.searchParams.append(column, `cd.{${value.join(\",\")}}`);\n else this.url.searchParams.append(column, `cd.${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.${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.${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.${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.${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.${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.${value}`);\n else this.url.searchParams.append(column, `ov.{${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, { config, type } = {}) {\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 ? \"\" : `(${config})`;\n this.url.searchParams.append(column, `${typePart}fts${configPart}.${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(([column, value])=>{\n this.url.searchParams.append(column, `eq.${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.${operator}.${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, { foreignTable, referencedTable = foreignTable } = {}) {\n const key = referencedTable ? `${referencedTable}.or` : \"or\";\n this.url.searchParams.append(key, `(${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, `${operator}.${value}`);\n return this;\n }\n};\n//#endregion\n//#region src/PostgrestQueryBuilder.ts\nvar PostgrestQueryBuilder = class {\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\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=${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, { count, defaultToNull = true } = {}) {\n var _this$fetch;\n const method = \"POST\";\n if (count) this.headers.append(\"Prefer\", `count=${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)=>`\"${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, { onConflict, ignoreDuplicates = false, count, defaultToNull = true } = {}) {\n var _this$fetch2;\n const method = \"POST\";\n this.headers.append(\"Prefer\", `resolution=${ignoreDuplicates ? \"ignore\" : \"merge\"}-duplicates`);\n if (onConflict !== void 0) this.url.searchParams.set(\"on_conflict\", onConflict);\n if (count) this.headers.append(\"Prefer\", `count=${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)=>`\"${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, { count } = {}) {\n var _this$fetch3;\n const method = \"PATCH\";\n if (count) this.headers.append(\"Prefer\", `count=${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({ count } = {}) {\n var _this$fetch4;\n const method = \"DELETE\";\n if (count) this.headers.append(\"Prefer\", `count=${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//#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* 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\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(`${this.url}/${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, args = {}, { head = false, get = false, count } = {}) {\n var _this$fetch;\n let method;\n const url = new URL(`${this.url}/rpc/${fn}`);\n let body;\n if (head || get) {\n method = head ? \"HEAD\" : \"GET\";\n Object.entries(args).filter(([_, value])=>value !== void 0).map(([name, value])=>[\n name,\n Array.isArray(value) ? `{${value.join(\",\")}}` : `${value}`\n ]).forEach(([name, value])=>{\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=${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//#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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3Bvc3RncmVzdC1qcy9kaXN0L2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9COzs7O0FBSUEsR0FDQSxJQUFJQSxpQkFBaUIsY0FBY0M7SUFDbEM7Ozs7Ozs7Ozs7OztDQVlBLEdBQ0FDLFlBQVlDLE9BQU8sQ0FBRTtRQUNwQixLQUFLLENBQUNBLFFBQVFDLE9BQU87UUFDckIsSUFBSSxDQUFDQyxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNDLE9BQU8sR0FBR0gsUUFBUUcsT0FBTztRQUM5QixJQUFJLENBQUNDLElBQUksR0FBR0osUUFBUUksSUFBSTtRQUN4QixJQUFJLENBQUNDLElBQUksR0FBR0wsUUFBUUssSUFBSTtJQUN6QjtBQUNEO0FBRUEsWUFBWTtBQUNaLGlDQUFpQztBQUNqQyxJQUFJQyxtQkFBbUI7SUFDdEI7Ozs7Ozs7Ozs7OztDQVlBLEdBQ0FQLFlBQVlRLE9BQU8sQ0FBRTtRQUNwQixJQUFJQyx1QkFBdUJDO1FBQzNCLElBQUksQ0FBQ0Msa0JBQWtCLEdBQUc7UUFDMUIsSUFBSSxDQUFDQyxNQUFNLEdBQUdKLFFBQVFJLE1BQU07UUFDNUIsSUFBSSxDQUFDQyxHQUFHLEdBQUdMLFFBQVFLLEdBQUc7UUFDdEIsSUFBSSxDQUFDQyxPQUFPLEdBQUcsSUFBSUMsUUFBUVAsUUFBUU0sT0FBTztRQUMxQyxJQUFJLENBQUNFLE1BQU0sR0FBR1IsUUFBUVEsTUFBTTtRQUM1QixJQUFJLENBQUNDLElBQUksR0FBR1QsUUFBUVMsSUFBSTtRQUN4QixJQUFJLENBQUNOLGtCQUFrQixHQUFHLENBQUNGLHdCQUF3QkQsUUFBUUcsa0JBQWtCLE1BQU0sUUFBUUYsMEJBQTBCLEtBQUssSUFBSUEsd0JBQXdCO1FBQ3RKLElBQUksQ0FBQ1MsTUFBTSxHQUFHVixRQUFRVSxNQUFNO1FBQzVCLElBQUksQ0FBQ0MsYUFBYSxHQUFHLENBQUNULHdCQUF3QkYsUUFBUVcsYUFB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QUNBN0M7SUFDQWxFO0lBQ0FUO0FBQ0Q7QUFFQSxZQUFZO0FBQ21KLENBQy9KLGtDQUFrQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcG9zdGdyZXN0LWpzL2Rpc3QvaW5kZXgubWpzPzdhYzMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8jcmVnaW9uIHNyYy9Qb3N0Z3Jlc3RFcnJvci50c1xuLyoqXG4qIEVycm9yIGZvcm1hdFxuKlxuKiB7QGxpbmsgaHR0cHM6Ly9wb3N0Z3Jlc3Qub3JnL2VuL3N0YWJsZS9hcGkuaHRtbD9oaWdobGlnaHQ9b3B0aW9ucyNlcnJvcnMtYW5kLWh0dHAtc3RhdHVzLWNvZGVzfVxuKi9cbnZhciBQb3N0Z3Jlc3RFcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xuXHQvKipcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHRzXG5cdCogaW1wb3J0IFBvc3RncmVzdEVycm9yIGZyb20gJ0BzdXBhYmFzZS9wb3N0Z3Jlc3QtanMnXG5cdCpcblx0KiB0aHJvdyBuZXcgUG9zdGdyZXN0RXJyb3Ioe1xuXHQqICAgbWVzc2FnZTogJ1JvdyBsZXZlbCBzZWN1cml0eSBwcmV2ZW50ZWQgdGhlIHJlcXVlc3QnLFxuXHQqICAgZGV0YWlsczogJ1JMUyBkZW5pZWQgdGhlIGluc2VydCcsXG5cdCogICBoaW50OiAnQ2hlY2sgeW91ciBwb2xpY2llcycsXG5cdCogICBjb2RlOiAnUEdSU1QzMDEnLFxuXHQqIH0pXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcblx0XHRzdXBlcihjb250ZXh0Lm1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IFwiUG9zdGdyZXN0RXJyb3JcIjtcblx0XHR0aGlzLmRldGFpbHMgPSBjb250ZXh0LmRldGFpbHM7XG5cdFx0dGhpcy5oaW50ID0gY29udGV4dC5oaW50O1xuXHRcdHRoaXMuY29kZSA9IGNvbnRleHQuY29kZTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1Bvc3RncmVzdEJ1aWxkZXIudHNcbnZhciBQb3N0Z3Jlc3RCdWlsZGVyID0gY2xhc3Mge1xuXHQvKipcblx0KiBDcmVhdGVzIGEgYnVpbGRlciBjb25maWd1cmVkIGZvciBhIHNwZWNpZmljIFBvc3RnUkVTVCByZXF1ZXN0LlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0c1xuXHQqIGltcG9ydCBQb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIgZnJvbSAnQHN1cGFiYXNlL3Bvc3RncmVzdC1qcydcblx0KlxuXHQqIGNvbnN0IGJ1aWxkZXIgPSBuZXcgUG9zdGdyZXN0UXVlcnlCdWlsZGVyKFxuXHQqICAgbmV3IFVSTCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL3Jlc3QvdjEvdXNlcnMnKSxcblx0KiAgIHsgaGVhZGVyczogbmV3IEhlYWRlcnMoeyBhcGlrZXk6ICdwdWJsaWMtYW5vbi1rZXknIH0pIH1cblx0KiApXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKGJ1aWxkZXIpIHtcblx0XHR2YXIgX2J1aWxkZXIkc2hvdWxkVGhyb3dPLCBfYnVpbGRlciRpc01heWJlU2luZ2w7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSBmYWxzZTtcblx0XHR0aGlzLm1ldGhvZCA9IGJ1aWxkZXIubWV0aG9kO1xuXHRcdHRoaXMudXJsID0gYnVpbGRlci51cmw7XG5cdFx0dGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoYnVpbGRlci5oZWFkZXJzKTtcblx0XHR0aGlzLnNjaGVtYSA9IGJ1aWxkZXIuc2NoZW1hO1xuXHRcdHRoaXMuYm9keSA9IGJ1aWxkZXIuYm9keTtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IChfYnVpbGRlciRzaG91bGRUaHJvd08gPSBidWlsZGVyLnNob3VsZFRocm93T25FcnJvcikgIT09IG51bGwgJiYgX2J1aWxkZXIkc2hvdWxkVGhyb3dPICE9PSB2b2lkIDAgPyBfYnVpbGRlciRzaG91bGRUaHJvd08gOiBmYWxzZTtcblx0XHR0aGlzLnNpZ25hbCA9IGJ1aWxkZXIuc2lnbmFsO1xuXHRcdHRoaXMuaXNNYXliZVNpbmdsZSA9IChfYnVpbGRlciRpc01heWJlU2luZ2wgPSBidWlsZGVyLmlzTWF5YmVTaW5nbGUpICE9PSBudWxsICYmIF9idWlsZGVyJGlzTWF5YmVTaW5nbCAhPT0gdm9pZCAwID8gX2J1aWxkZXIkaXNNYXliZVNpbmdsIDogZmFsc2U7XG5cdFx0aWYgKGJ1aWxkZXIuZmV0Y2gpIHRoaXMuZmV0Y2ggPSBidWlsZGVyLmZldGNoO1xuXHRcdGVsc2UgdGhpcy5mZXRjaCA9IGZldGNoO1xuXHR9XG5cdC8qKlxuXHQqIElmIHRoZXJlJ3MgYW4gZXJyb3Igd2l0aCB0aGUgcXVlcnksIHRocm93T25FcnJvciB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZSBieVxuXHQqIHRocm93aW5nIHRoZSBlcnJvciBpbnN0ZWFkIG9mIHJldHVybmluZyBpdCBhcyBwYXJ0IG9mIGEgc3VjY2Vzc2Z1bCByZXNwb25zZS5cblx0KlxuXHQqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc3VwYWJhc2Uvc3VwYWJhc2UtanMvaXNzdWVzLzkyfVxuXHQqL1xuXHR0aHJvd09uRXJyb3IoKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSB0cnVlO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIFNldCBhbiBIVFRQIGhlYWRlciBmb3IgdGhlIHJlcXVlc3QuXG5cdCovXG5cdHNldEhlYWRlcihuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyk7XG5cdFx0dGhpcy5oZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0dGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuXHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cdFx0aWYgKHRoaXMuc2NoZW1hID09PSB2b2lkIDApIHt9IGVsc2UgaWYgKFtcIkdFVFwiLCBcIkhFQURcIl0uaW5jbHVkZXModGhpcy5tZXRob2QpKSB0aGlzLmhlYWRlcnMuc2V0KFwiQWNjZXB0LVByb2ZpbGVcIiwgdGhpcy5zY2hlbWEpO1xuXHRcdGVsc2UgdGhpcy5oZWFkZXJzLnNldChcIkNvbnRlbnQtUHJvZmlsZVwiLCB0aGlzLnNjaGVtYSk7XG5cdFx0aWYgKHRoaXMubWV0aG9kICE9PSBcIkdFVFwiICYmIHRoaXMubWV0aG9kICE9PSBcIkhFQURcIikgdGhpcy5oZWFkZXJzLnNldChcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cdFx0Y29uc3QgX2ZldGNoID0gdGhpcy5mZXRjaDtcblx0XHRsZXQgcmVzID0gX2ZldGNoKHRoaXMudXJsLnRvU3RyaW5nKCksIHtcblx0XHRcdG1ldGhvZDogdGhpcy5tZXRob2QsXG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh0aGlzLmJvZHkpLFxuXHRcdFx0c2lnbmFsOiB0aGlzLnNpZ25hbFxuXHRcdH0pLnRoZW4oYXN5bmMgKHJlcyQxKSA9PiB7XG5cdFx0XHRsZXQgZXJyb3IgPSBudWxsO1xuXHRcdFx0bGV0IGRhdGEgPSBudWxsO1xuXHRcdFx0bGV0IGNvdW50ID0gbnVsbDtcblx0XHRcdGxldCBzdGF0dXMgPSByZXMkMS5zdGF0dXM7XG5cdFx0XHRsZXQgc3RhdHVzVGV4dCA9IHJlcyQxLnN0YXR1c1RleHQ7XG5cdFx0XHRpZiAocmVzJDEub2spIHtcblx0XHRcdFx0dmFyIF90aGlzJGhlYWRlcnMkZ2V0MiwgX3JlcyRoZWFkZXJzJGdldDtcblx0XHRcdFx0aWYgKF90aGlzLm1ldGhvZCAhPT0gXCJIRUFEXCIpIHtcblx0XHRcdFx0XHR2YXIgX3RoaXMkaGVhZGVycyRnZXQ7XG5cdFx0XHRcdFx0Y29uc3QgYm9keSA9IGF3YWl0IHJlcyQxLnRleHQoKTtcblx0XHRcdFx0XHRpZiAoYm9keSA9PT0gXCJcIikge30gZWxzZSBpZiAoX3RoaXMuaGVhZGVycy5nZXQoXCJBY2NlcHRcIikgPT09IFwidGV4dC9jc3ZcIikgZGF0YSA9IGJvZHk7XG5cdFx0XHRcdFx0ZWxzZSBpZiAoX3RoaXMuaGVhZGVycy5nZXQoXCJBY2NlcHRcIikgJiYgKChfdGhpcyRoZWFkZXJzJGdldCA9IF90aGlzLmhlYWRlcnMuZ2V0KFwiQWNjZXB0XCIpKSA9PT0gbnVsbCB8fCBfdGhpcyRoZWFkZXJzJGdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkaGVhZGVycyRnZXQuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi92bmQucGdyc3QucGxhbit0ZXh0XCIpKSkgZGF0YSA9IGJvZHk7XG5cdFx0XHRcdFx0ZWxzZSBkYXRhID0gSlNPTi5wYXJzZShib2R5KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBjb3VudEhlYWRlciA9IChfdGhpcyRoZWFkZXJzJGdldDIgPSBfdGhpcy5oZWFkZXJzLmdldChcIlByZWZlclwiKSkgPT09IG51bGwgfHwgX3RoaXMkaGVhZGVycyRnZXQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRoZWFkZXJzJGdldDIubWF0Y2goL2NvdW50PShleGFjdHxwbGFubmVkfGVzdGltYXRlZCkvKTtcblx0XHRcdFx0Y29uc3QgY29udGVudFJhbmdlID0gKF9yZXMkaGVhZGVycyRnZXQgPSByZXMkMS5oZWFkZXJzLmdldChcImNvbnRlbnQtcmFuZ2VcIikpID09PSBudWxsIHx8IF9yZXMkaGVhZGVycyRnZXQgPT09IHZvaWQgMCA/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/IGB7JHt2YWx1ZS5qb2luKFwiLFwiKX19YCA6IGAke3ZhbHVlfWBdKS5mb3JFYWNoKChbbmFtZSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKG5hbWUsIHZhbHVlKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZXRob2QgPSBcIlBPU1RcIjtcblx0XHRcdGJvZHkgPSBhcmdzO1xuXHRcdH1cblx0XHRjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKTtcblx0XHRpZiAoY291bnQpIGhlYWRlcnMuc2V0KFwiUHJlZmVyXCIsIGBjb3VudD0ke2NvdW50fWApO1xuXHRcdHJldHVybiBuZXcgUG9zdGdyZXN0RmlsdGVyQnVpbGRlcih7XG5cdFx0XHRtZXRob2QsXG5cdFx0XHR1cmwsXG5cdFx0XHRoZWFkZXJzLFxuXHRcdFx0c2NoZW1hOiB0aGlzLnNjaGVtYU5hbWUsXG5cdFx0XHRib2R5LFxuXHRcdFx0ZmV0Y2g6IChfdGhpcyRmZXRjaCA9IHRoaXMuZmV0Y2gpICE9PSBudWxsICYmIF90aGlzJGZldGNoICE9PSB2b2lkIDAgPyBfdGhpcyRmZXRjaCA6IGZldGNoXG5cdFx0fSk7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9pbmRleC50c1xudmFyIHNyY19kZWZhdWx0ID0ge1xuXHRQb3N0Z3Jlc3RDbGllbnQsXG5cdFBvc3RncmVzdFF1ZXJ5QnVpbGRlcixcblx0UG9zdGdyZXN0RmlsdGVyQnVpbGRlcixcblx0UG9zdGdyZXN0VHJhbnNmb3JtQnVpbGRlcixcblx0UG9zdGdyZXN0QnVpbGRlcixcblx0UG9zdGdyZXN0RXJyb3Jcbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgUG9zdGdyZXN0QnVpbGRlciwgUG9zdGdyZXN0Q2xpZW50LCBQb3N0Z3Jlc3RFcnJvciwgUG9zdGdyZXN0RmlsdGVyQnVpbGRlciwgUG9zdGdyZXN0UXVlcnlCdWlsZGVyLCBQb3N0Z3Jlc3RUcmFuc2Zvcm1CdWlsZGVyLCBzcmNfZGVmYXVsdCBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIl0sIm5hbWVzIjpbIlBvc3RncmVzdEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsImNvbnRleHQiLCJtZXNzYWdlIiwibmFtZSIsImRldGFpbHMiLCJoaW50IiwiY29kZSIsIlBvc3RncmVzdEJ1aWxkZXIiLCJidWlsZGVyIiwiX2J1aWxkZXIkc2hvdWxkVGhyb3dPIiwiX2J1aWxkZXIkaXNNYXliZVNpbmdsIiwic2hvdWxkVGhyb3dPbkVycm9yIiwibWV0aG9kIiwidXJsIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJzY2hlbWEiLCJib2R5Iiwic2lnbmFsIiwiaXNNYXliZVNpbmdsZSIsImZldGNoIiwidGhyb3dPbkVycm9yIiwic2V0SGVhZGVyIiwidmFsdWUiLCJzZXQiLCJ0aGVuIiwib25mdWxmaWxsZWQiLCJvbnJlamVjdGVkIiwiX3RoaXMiLCJpbmNsdWRlcyIsIl9mZXRjaCIsInJlcyIsInRvU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlcyQxIiwiZXJyb3IiLCJkYXRhIiwiY291bnQiLCJzdGF0dXMiLCJzdGF0dXNUZXh0Iiwib2siLCJfdGhpcyRoZWFkZXJzJGdldDIiLCJfcmVzJGhlYWRlcnMkZ2V0IiwiX3RoaXMkaGVhZGVycyRnZXQiLCJ0ZXh0IiwiZ2V0IiwicGFyc2UiLCJjb3VudEhlYWRlciIsIm1hdGNoIiwiY29udGVudFJhbmdlIiwic3BsaXQiLCJsZW5ndGgiLCJwYXJzZUludCIsIkFycmF5IiwiaXNBcnJheSIsIl9lcnJvciRkZXRhaWxzIiwiX3VudXNlZCIsImNhdGNoIiwiZmV0Y2hFcnJvciIsIl9mZXRjaEVycm9yJG5hbWUyIiwiZXJyb3JEZXRhaWxzIiwiY2F1c2UiLCJfY2F1c2UkbWVzc2FnZSIsIl9jYXVzZSRjb2RlIiwiX2ZldGNoRXJyb3IkbmFtZSIsIl9jYXVzZSRuYW1lIiwiY2F1c2VNZXNzYWdlIiwiY2F1c2VDb2RlIiwic3RhY2siLCJfZmV0Y2hFcnJvciRzdGFjayIsInJldHVybnMiLCJvdmVycmlkZVR5cGVzIiwiUG9zdGdyZXN0VHJhbnNmb3JtQnVpbGRlciIsInNlbGVjdCIsImNvbHVtbnMiLCJxdW90ZWQiLCJjbGVhbmVkQ29sdW1ucyIsIm1hcCIsImMiLCJ0ZXN0Iiwiam9pbiIsInNlYXJjaFBhcmFtcyIsImFwcGVuZCIsIm9yZGVyIiwiY29sdW1uIiwiYXNjZW5kaW5nIiwibnVsbHNGaXJzdCIsImZvcmVpZ25UYWJsZSIsInJlZmVyZW5jZWRUYWJsZSIsImtleSIsImV4aXN0aW5nT3JkZXIiLCJsaW1pdCIsInJhbmdlIiwiZnJvbSIsInRvIiwia2V5T2Zmc2V0Iiwia2V5TGltaXQiLCJhYm9ydFNpZ25hbCIsInNpbmdsZSIsIm1heWJlU2luZ2xlIiwiY3N2IiwiZ2VvanNvbiIsImV4cGxhaW4iLCJhbmFseXplIiwidmVyYm9zZSIsInNldHRpbmdzIiwiYnVmZmVycyIsIndhbCIsImZvcm1hdCIsIm9wdGlvbnMiLCJmaWx0ZXIiLCJCb29sZWFuIiwiZm9yTWVkaWF0eXBlIiwicm9sbGJhY2siLCJtYXhBZmZlY3RlZCIsIlBvc3RncmVzdFJlc2VydmVkQ2hhcnNSZWdleHAiLCJSZWdFeHAiLCJQb3N0Z3Jlc3RGaWx0ZXJCdWlsZGVyIiwiZXEiLCJuZXEiLCJndCIsImd0ZSIsImx0IiwibHRlIiwibGlrZSIsInBhdHRlcm4iLCJsaWtlQWxsT2YiLCJwYXR0ZXJucyIsImxpa2VBbnlPZiIsImlsaWtlIiwiaWxpa2VBbGxPZiIsImlsaWtlQW55T2YiLCJyZWdleE1hdGNoIiwicmVnZXhJTWF0Y2giLCJpcyIsImlzRGlzdGluY3QiLCJpbiIsInZhbHVlcyIsImNsZWFuZWRWYWx1ZXMiLCJTZXQiLCJzIiwibm90SW4iLCJjb250YWlucyIsImNvbnRhaW5lZEJ5IiwicmFuZ2VHdCIsInJhbmdlR3RlIiwicmFuZ2VMdCIsInJhbmdlTHRlIiwicmFuZ2VBZGphY2VudCIsIm92ZXJsYXBzIiwidGV4dFNlYXJjaCIsInF1ZXJ5IiwiY29uZmlnIiwidHlwZSIsInR5cGVQYXJ0IiwiY29uZmlnUGFydCIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwibm90Iiwib3BlcmF0b3IiLCJvciIsImZpbHRlcnMiLCJQb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIiLCJmZXRjaCQxIiwiaGVhZCIsImluc2VydCIsImRlZmF1bHRUb051bGwiLCJfdGhpcyRmZXRjaCIsInJlZHVjZSIsImFjYyIsIngiLCJjb25jYXQiLCJrZXlzIiwidW5pcXVlQ29sdW1ucyIsInVwc2VydCIsIm9uQ29uZmxpY3QiLCJpZ25vcmVEdXBsaWNhdGVzIiwiX3RoaXMkZmV0Y2gyIiwidXBkYXRlIiwiX3RoaXMkZmV0Y2gzIiwiZGVsZXRlIiwiX3RoaXMkZmV0Y2g0IiwiUG9zdGdyZXN0Q2xpZW50Iiwic2NoZW1hTmFtZSIsInJlbGF0aW9uIiwidHJpbSIsIlVSTCIsInJwYyIsImZuIiwiYXJncyIsIl8iLCJzcmNfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/postgrest-js/dist/index.mjs\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/storage-js/dist/index.mjs":
|
||
/*!**********************************************************!*\
|
||
!*** ./node_modules/@supabase/storage-js/dist/index.mjs ***!
|
||
\**********************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StorageAnalyticsClient: () => (/* binding */ StorageAnalyticsClient),\n/* harmony export */ StorageApiError: () => (/* binding */ StorageApiError),\n/* harmony export */ StorageClient: () => (/* binding */ StorageClient),\n/* harmony export */ StorageError: () => (/* binding */ StorageError),\n/* harmony export */ StorageUnknownError: () => (/* binding */ StorageUnknownError),\n/* harmony export */ StorageVectorsApiError: () => (/* binding */ StorageVectorsApiError),\n/* harmony export */ StorageVectorsClient: () => (/* binding */ StorageVectorsClient),\n/* harmony export */ StorageVectorsError: () => (/* binding */ StorageVectorsError),\n/* harmony export */ StorageVectorsErrorCode: () => (/* binding */ StorageVectorsErrorCode),\n/* harmony export */ StorageVectorsUnknownError: () => (/* binding */ StorageVectorsUnknownError),\n/* harmony export */ VectorBucketApi: () => (/* binding */ VectorBucketApi),\n/* harmony export */ VectorBucketScope: () => (/* binding */ VectorBucketScope),\n/* harmony export */ VectorDataApi: () => (/* binding */ VectorDataApi),\n/* harmony export */ VectorIndexApi: () => (/* binding */ VectorIndexApi),\n/* harmony export */ VectorIndexScope: () => (/* binding */ VectorIndexScope),\n/* harmony export */ isPlainObject: () => (/* binding */ isPlainObject),\n/* harmony export */ isStorageError: () => (/* binding */ isStorageError),\n/* harmony export */ isStorageVectorsError: () => (/* binding */ isStorageVectorsError),\n/* harmony export */ normalizeToFloat32: () => (/* binding */ normalizeToFloat32),\n/* harmony export */ resolveFetch: () => (/* binding */ resolveFetch),\n/* harmony export */ resolveResponse: () => (/* binding */ resolveResponse),\n/* harmony export */ validateVectorDimension: () => (/* binding */ validateVectorDimension)\n/* harmony export */ });\n/* harmony import */ var iceberg_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! iceberg-js */ \"(ssr)/./node_modules/iceberg-js/dist/index.mjs\");\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 constructor(message, status, statusCode){\n super(message);\n this.name = \"StorageApiError\";\n this.status = status;\n this.statusCode = statusCode;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n statusCode: this.statusCode\n };\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 (...args)=>customFetch(...args);\n return (...args)=>fetch(...args);\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(([key, value])=>{\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 constructor(downloadFn, shouldThrowOnError){\n this.downloadFn = downloadFn;\n this.shouldThrowOnError = shouldThrowOnError;\n }\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};\n//#endregion\n//#region src/packages/BlobDownloadBuilder.ts\nlet _Symbol$toStringTag;\n_Symbol$toStringTag = Symbol.toStringTag;\nvar BlobDownloadBuilder = class {\n constructor(downloadFn, shouldThrowOnError){\n this.downloadFn = downloadFn;\n this.shouldThrowOnError = shouldThrowOnError;\n this[_Symbol$toStringTag] = \"BlobDownloadBuilder\";\n this.promise = null;\n }\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};\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 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\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=${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, `${_this.url}/object/${_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/${_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=${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, `${_this4.url}/object/upload/sign/${_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, `${_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, `${_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, `${_this8.url}/object/sign/${_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=${options.download === true ? \"\" : options.download}` : \"\";\n data = {\n signedUrl: encodeURI(`${_this8.url}${data.signedURL}${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, `${_this9.url}/object/sign/${_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=${options.download === true ? \"\" : options.download}` : \"\";\n return {\n data: data.map((datum)=>_objectSpread2(_objectSpread2({}, datum), {}, {\n signedUrl: datum.signedURL ? encodeURI(`${_this9.url}${datum.signedURL}${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 ? `?${transformationQuery}` : \"\";\n const _path = this._getFinalPath(path);\n const downloadFn = ()=>get(this.fetch, `${this.url}/${renderPath}/${_path}${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, `${_this10.url}/object/info/${_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, `${_this11.url}/object/${_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=${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 = `?${queryString}`;\n return {\n data: {\n publicUrl: encodeURI(`${this.url}/${renderPath}/public/${_path}${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, `${_this12.url}/object/${_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, `${_this13.url}/object/list/${_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, `${_this14.url}/object/list-v2/${_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 `${this.bucketId}/${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=${transform.width}`);\n if (transform.height) params.push(`height=${transform.height}`);\n if (transform.resize) params.push(`resize=${transform.resize}`);\n if (transform.format) params.push(`format=${transform.format}`);\n if (transform.quality) params.push(`quality=${transform.quality}`);\n return params.join(\"&\");\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/${version}`\n};\n//#endregion\n//#region src/packages/StorageBucketApi.ts\nvar StorageBucketApi = class {\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\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, `${_this.url}/bucket${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, `${_this2.url}/bucket/${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, options = {\n public: false\n }) {\n var _this3 = this;\n try {\n return {\n data: await post$1(_this3.fetch, `${_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, `${_this4.url}/bucket/${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, `${_this5.url}/bucket/${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, `${_this6.url}/bucket/${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};\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* 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\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, `${_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 ? `${_this2.url}/bucket?${queryString}` : `${_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, `${_this3.url}/bucket/${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 (...args)=>{\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//#endregion\n//#region src/lib/vectors/constants.ts\nconst DEFAULT_HEADERS = {\n \"X-Client-Info\": `storage-js/${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 constructor(message, status, statusCode){\n super(message);\n this.name = \"StorageVectorsApiError\";\n this.status = status;\n this.statusCode = statusCode;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n statusCode: this.statusCode\n };\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 (...args)=>customFetch(...args);\n return (...args)=>fetch(...args);\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 ${expectedDimension}, got ${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 ${status} error`, status, statusCode));\n });\n else {\n const statusCode = status + \"\";\n reject(new StorageVectorsApiError(responseError.statusText || `HTTP ${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 /** 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 /** 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, `${_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, `${_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, `${_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, `${_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};\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 /** 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 /** 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, `${_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, `${_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 ${options.segmentCount - 1}`);\n }\n }\n return {\n data: await post(_this3.fetch, `${_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, `${_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, `${_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};\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 /** 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 /** 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, `${_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, `${_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(options = {}) {\n var _this3 = this;\n try {\n return {\n data: await post(_this3.fetch, `${_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, `${_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};\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* @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\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(options = {}) {\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/**\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* @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\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(options = {}) {\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/**\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* 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\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(options = {}) {\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//#endregion\n//#region src/StorageClient.ts\nvar StorageClient = class extends StorageBucketApi {\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\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//#endregion\n //# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3N0b3JhZ2UtanMvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBZ0Q7QUFFaEQsMkJBQTJCO0FBQzNCLElBQUlDLGVBQWUsY0FBY0M7SUFDaENDLFlBQVlDLE9BQU8sQ0FBRTtRQUNwQixLQUFLLENBQUNBO1FBQ04sSUFBSSxDQUFDQyxnQkFBZ0IsR0FBRztRQUN4QixJQUFJLENBQUNDLElBQUksR0FBRztJQUNiO0FBQ0Q7QUFDQSxTQUFTQyxlQUFlQyxLQUFLO0lBQzVCLE9BQU8sT0FBT0EsVUFBVSxZQUFZQSxVQUFVLFFBQVEsc0JBQXNCQTtBQUM3RTtBQUNBLElBQUlDLGtCQUFrQixjQUFjUjtJQUNuQ0UsWUFBWUMsT0FBTyxFQUFFTSxNQUFNLEVBQUVDLFVBQVUsQ0FBRTtRQUN4QyxLQUFLLENBQUNQO1FBQ04sSUFBSSxDQUFDRSxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNJLE1BQU0sR0FBR0E7UUFDZCxJQUFJLENBQUNDLFVBQVUsR0FBR0E7SUFDbkI7SUFDQUMsU0FBUztRQUNSLE9BQU87WUFDTk4sTUFBTSxJQUFJLENBQUNBLElBQUk7WUFDZkYsU0FBUyxJQUFJLENBQUNBLE9BQU87WUFDckJNLFFBQVEsSUFBSSxDQUFDQSxNQUFNO1lBQ25CQyxZQUFZLElBQUksQ0FBQ0EsVUFBVTtRQUM1QjtJQUNEO0FBQ0Q7QUFDQSxJQUFJRSxzQkFBc0IsY0FBY1o7SUFDdkNFLFlBQVlDLE9BQU8sRUFBRVUsYUFBYSxDQUFFO1FBQ25DLEtBQUssQ0FBQ1Y7UUFDTixJQUFJLENBQUNFLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ1EsYUFBYSxHQUFHQTtJQUN0QjtBQUNEO0FBRUEsWUFBWTtBQUNaLDRCQUE0QjtBQUM1QixNQUFNQyxpQkFBaUIsQ0FBQ0M7SUFDdkIsSUFBSUEsYUFBYSxPQUFPLENBQUMsR0FBR0MsT0FBU0QsZUFBZUM7SUFDcEQsT0FBTyxD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O1FBQzNFLE9BQU8yRyw4QkFBOEJwUSxJQUFJLENBQUN5SixTQUFTdkksZUFBZUEsZUFBZSxDQUFDLEdBQUdhLFVBQVUsQ0FBQyxHQUFHO1lBQ2xHdU0sa0JBQWtCN0UsUUFBUTZFLGdCQUFnQjtZQUMxQ0MsV0FBVzlFLFFBQVE4RSxTQUFTO1FBQzdCO0lBQ0Q7QUFDRDtBQUVBLFlBQVk7QUFDWiw4QkFBOEI7QUFDOUIsSUFBSThCLGdCQUFnQixjQUFjOUY7SUFDakM7Ozs7Ozs7Ozs7Ozs7Q0FhQSxHQUNBN04sWUFBWW1HLEdBQUcsRUFBRUosVUFBVSxDQUFDLENBQUMsRUFBRXlDLE9BQU8sRUFBRXNGLElBQUksQ0FBRTtRQUM3QyxLQUFLLENBQUMzSCxLQUFLSixTQUFTeUMsU0FBU3NGO0lBQzlCO0lBQ0E7Ozs7Ozs7Ozs7Q0FVQSxHQUNBVixLQUFLekQsRUFBRSxFQUFFO1FBQ1IsT0FBTyxJQUFJckIsZUFBZSxJQUFJLENBQUNuQyxHQUFHLEVBQUUsSUFBSSxDQUFDSixPQUFPLEVBQUU0RCxJQUFJLElBQUksQ0FBQzVJLEtBQUs7SUFDakU7SUFDQTs7Ozs7Ozs7OztDQVVBLEdBQ0EsSUFBSW1SLFVBQVU7UUFDYixPQUFPLElBQUlRLHFCQUFxQixJQUFJLENBQUN2TSxHQUFHLEdBQUcsV0FBVztZQUNyREosU0FBUyxJQUFJLENBQUNBLE9BQU87WUFDckJoRixPQUFPLElBQUksQ0FBQ0EsS0FBSztRQUNsQjtJQUNEO0lBQ0E7Ozs7Ozs7Ozs7Q0FVQSxHQUNBLElBQUk2UyxZQUFZO1FBQ2YsT0FBTyxJQUFJdEUsdUJBQXVCLElBQUksQ0FBQ25KLEdBQUcsR0FBRyxZQUFZLElBQUksQ0FBQ0osT0FBTyxFQUFFLElBQUksQ0FBQ2hGLEtBQUs7SUFDbEY7QUFDRDtBQUVBLFlBQVk7QUFDd2EsQ0FDcGIsa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9zdG9yYWdlLWpzL2Rpc3QvaW5kZXgubWpzP2ViMzQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSWNlYmVyZ1Jlc3RDYXRhbG9nIH0gZnJvbSBcImljZWJlcmctanNcIjtcblxuLy8jcmVnaW9uIHNyYy9saWIvZXJyb3JzLnRzXG52YXIgU3RvcmFnZUVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzLl9faXNTdG9yYWdlRXJyb3IgPSB0cnVlO1xuXHRcdHRoaXMubmFtZSA9IFwiU3RvcmFnZUVycm9yXCI7XG5cdH1cbn07XG5mdW5jdGlvbiBpc1N0b3JhZ2VFcnJvcihlcnJvcikge1xuXHRyZXR1cm4gdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiICYmIGVycm9yICE9PSBudWxsICYmIFwiX19pc1N0b3JhZ2VFcnJvclwiIGluIGVycm9yO1xufVxudmFyIFN0b3JhZ2VBcGlFcnJvciA9IGNsYXNzIGV4dGVuZHMgU3RvcmFnZUVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCBzdGF0dXNDb2RlKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gXCJTdG9yYWdlQXBpRXJyb3JcIjtcblx0XHR0aGlzLnN0YXR1cyA9IHN0YXR1cztcblx0XHR0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuXHR9XG5cdHRvSlNPTigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bmFtZTogdGhpcy5uYW1lLFxuXHRcdFx0bWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuXHRcdFx0c3RhdHVzOiB0aGlzLnN0YXR1cyxcblx0XHRcdHN0YXR1c0NvZGU6IHRoaXMuc3RhdHVzQ29kZVxuXHRcdH07XG5cdH1cbn07XG52YXIgU3RvcmFnZVVua25vd25FcnJvciA9IGNsYXNzIGV4dGVuZHMgU3RvcmFnZUVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSwgb3JpZ2luYWxFcnJvcikge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IFwiU3RvcmFnZVVua25vd25FcnJvclwiO1xuXHRcdHRoaXMub3JpZ2luYWxFcnJvciA9IG9yaWdpbmFsRXJyb3I7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvaGVscGVycy50c1xuY29uc3QgcmVzb2x2ZUZldGNoJDEgPSAoY3VzdG9tRmV0Y2gpID0+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+IHN1cGVyLmNyZWF0ZUluZGV4LCBfdGhpczUgPSB0aGlzO1xuXHRcdHJldHVybiBfc3VwZXJwcm9wX2dldENyZWF0ZUluZGV4KCkuY2FsbChfdGhpczUsIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHsgdmVjdG9yQnVja2V0TmFtZTogX3RoaXM1LnZlY3RvckJ1Y2tldE5hbWUgfSkpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBMaXN0cyBpbmRleGVzIGluIHRoaXMgYnVja2V0XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgYnVja2V0IG5hbWVcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gb3B0aW9ucyAtIExpc3Rpbmcgb3B0aW9ucyAodmVjdG9yQnVja2V0TmFtZSBpcyBhdXRvbWF0aWNhbGx5IHNldClcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBpbmRleGVzIGFycmF5IGFuZCBwYWdpbmF0aW9uIHRva2VuIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGJ1Y2tldC5saXN0SW5kZXhlcyh7IHByZWZpeDogJ2RvY3VtZW50cy0nIH0pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGxpc3RJbmRleGVzKG9wdGlvbnMgPSB7fSkge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldExpc3RJbmRleGVzID0gKCkgPT4gc3VwZXIubGlzdEluZGV4ZXMsIF90aGlzNiA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0TGlzdEluZGV4ZXMoKS5jYWxsKF90aGlzNiwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwgeyB2ZWN0b3JCdWNrZXROYW1lOiBfdGhpczYudmVjdG9yQnVja2V0TmFtZSB9KSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIFJldHJpZXZlcyBtZXRhZGF0YSBmb3IgYSBzcGVjaWZpYyBpbmRleCBpbiB0aGlzIGJ1Y2tldFxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGJ1Y2tldCBuYW1lXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIGluZGV4TmFtZSAtIE5hbWUgb2YgdGhlIGluZGV4IHRvIHJldHJpZXZlXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIGluZGV4IG1ldGFkYXRhIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGJ1Y2tldC5nZXRJbmRleCgnZG9jdW1lbnRzLW9wZW5haScpXG5cdCogY29uc29sZS5sb2coJ0RpbWVuc2lvbjonLCBkYXRhPy5pbmRleC5kaW1lbnNpb24pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGdldEluZGV4KGluZGV4TmFtZSkge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldEdldEluZGV4ID0gKCkgPT4gc3VwZXIuZ2V0SW5kZXgsIF90aGlzNyA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0R2V0SW5kZXgoKS5jYWxsKF90aGlzNywgX3RoaXM3LnZlY3RvckJ1Y2tldE5hbWUsIGluZGV4TmFtZSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIERlbGV0ZXMgYW4gaW5kZXggZnJvbSB0aGlzIGJ1Y2tldFxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGJ1Y2tldCBuYW1lXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIGluZGV4TmFtZSAtIE5hbWUgb2YgdGhlIGluZGV4IHRvIGRlbGV0ZVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBlbXB0eSByZXNwb25zZSBvbiBzdWNjZXNzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBhd2FpdCBidWNrZXQuZGVsZXRlSW5kZXgoJ29sZC1pbmRleCcpXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGRlbGV0ZUluZGV4KGluZGV4TmFtZSkge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldERlbGV0ZUluZGV4ID0gKCkgPT4gc3VwZXIuZGVsZXRlSW5kZXgsIF90aGlzOCA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0RGVsZXRlSW5kZXgoKS5jYWxsKF90aGlzOCwgX3RoaXM4LnZlY3RvckJ1Y2tldE5hbWUsIGluZGV4TmFtZSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIEFjY2VzcyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIGluZGV4IHdpdGhpbiB0aGlzIGJ1Y2tldFxuXHQqIFJldHVybnMgYSBzY29wZWQgY2xpZW50IGZvciB2ZWN0b3IgZGF0YSBvcGVyYXRpb25zXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIGluZGV4TmFtZSAtIE5hbWUgb2YgdGhlIGluZGV4XG5cdCogQHJldHVybnMgSW5kZXgtc2NvcGVkIGNsaWVudCB3aXRoIHZlY3RvciBkYXRhIG9wZXJhdGlvbnNcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KlxuXHQqIC8vIEluc2VydCB2ZWN0b3JzXG5cdCogYXdhaXQgaW5kZXgucHV0VmVjdG9ycyh7XG5cdCogICB2ZWN0b3JzOiBbXG5cdCogICAgIHsga2V5OiAnZG9jLTEnLCBkYXRhOiB7IGZsb2F0MzI6IFsuLi5dIH0sIG1ldGFkYXRhOiB7IHRpdGxlOiAnSW50cm8nIH0gfVxuXHQqICAgXVxuXHQqIH0pXG5cdCpcblx0KiAvLyBRdWVyeSBzaW1pbGFyIHZlY3RvcnNcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4LnF1ZXJ5VmVjdG9ycyh7XG5cdCogICBxdWVyeVZlY3RvcjogeyBmbG9hdDMyOiBbLi4uXSB9LFxuXHQqICAgdG9wSzogNVxuXHQqIH0pXG5cdCogYGBgXG5cdCovXG5cdGluZGV4KGluZGV4TmFtZSkge1xuXHRcdHJldHVybiBuZXcgVmVjdG9ySW5kZXhTY29wZSh0aGlzLnVybCwgdGhpcy5oZWFkZXJzLCB0aGlzLnZlY3RvckJ1Y2tldE5hbWUsIGluZGV4TmFtZSwgdGhpcy5mZXRjaCk7XG5cdH1cbn07XG4vKipcbipcbiogQGFscGhhXG4qXG4qIFNjb3BlZCBjbGllbnQgZm9yIG9wZXJhdGlvbnMgd2l0aGluIGEgc3BlY2lmaWMgdmVjdG9yIGluZGV4XG4qIFByb3ZpZGVzIHZlY3RvciBkYXRhIG9wZXJhdGlvbnMgKHB1dCwgZ2V0LCBsaXN0LCBxdWVyeSwgZGVsZXRlKVxuKlxuKiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuKi9cbnZhciBWZWN0b3JJbmRleFNjb3BlID0gY2xhc3MgZXh0ZW5kcyBWZWN0b3JEYXRhQXBpIHtcblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIENyZWF0ZXMgYSBoZWxwZXIgdGhhdCBhdXRvbWF0aWNhbGx5IHNjb3BlcyBhbGwgdmVjdG9yIG9wZXJhdGlvbnMgdG8gdGhlIHByb3ZpZGVkIGJ1Y2tldC9pbmRleCBuYW1lcy5cblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBpbmRleCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKS5pbmRleCgnZG9jdW1lbnRzLW9wZW5haScpXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKHVybCwgaGVhZGVycywgdmVjdG9yQnVja2V0TmFtZSwgaW5kZXhOYW1lLCBmZXRjaCQxKSB7XG5cdFx0c3VwZXIodXJsLCBoZWFkZXJzLCBmZXRjaCQxKTtcblx0XHR0aGlzLnZlY3RvckJ1Y2tldE5hbWUgPSB2ZWN0b3JCdWNrZXROYW1lO1xuXHRcdHRoaXMuaW5kZXhOYW1lID0gaW5kZXhOYW1lO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBJbnNlcnRzIG9yIHVwZGF0ZXMgdmVjdG9ycyBpbiB0aGlzIGluZGV4XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyBidWNrZXQgYW5kIGluZGV4IG5hbWVzXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBWZWN0b3IgaW5zZXJ0aW9uIG9wdGlvbnMgKGJ1Y2tldCBhbmQgaW5kZXggbmFtZXMgYXV0b21hdGljYWxseSBzZXQpXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIGVtcHR5IHJlc3BvbnNlIG9uIHN1Y2Nlc3Mgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBhd2FpdCBpbmRleC5wdXRWZWN0b3JzKHtcblx0KiAgIHZlY3RvcnM6IFtcblx0KiAgICAge1xuXHQqICAgICAgIGtleTogJ2RvYy0xJyxcblx0KiAgICAgICBkYXRhOiB7IGZsb2F0MzI6IFswLjEsIDAuMiwgLi4uXSB9LFxuXHQqICAgICAgIG1ldGFkYXRhOiB7IHRpdGxlOiAnSW50cm9kdWN0aW9uJywgcGFnZTogMSB9XG5cdCogICAgIH1cblx0KiAgIF1cblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBwdXRWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRQdXRWZWN0b3JzID0gKCkgPT4gc3VwZXIucHV0VmVjdG9ycywgX3RoaXM5ID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXRQdXRWZWN0b3JzKCkuY2FsbChfdGhpczksIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHtcblx0XHRcdHZlY3RvckJ1Y2tldE5hbWU6IF90aGlzOS52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczkuaW5kZXhOYW1lXG5cdFx0fSkpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBSZXRyaWV2ZXMgdmVjdG9ycyBieSBrZXlzIGZyb20gdGhpcyBpbmRleFxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgYnVja2V0IGFuZCBpbmRleCBuYW1lc1xuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBwYXJhbSBvcHRpb25zIC0gVmVjdG9yIHJldHJpZXZhbCBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIHZlY3RvcnMgYXJyYXkgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4LmdldFZlY3RvcnMoe1xuXHQqICAga2V5czogWydkb2MtMScsICdkb2MtMiddLFxuXHQqICAgcmV0dXJuTWV0YWRhdGE6IHRydWVcblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBnZXRWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRHZXRWZWN0b3JzID0gKCkgPT4gc3VwZXIuZ2V0VmVjdG9ycywgX3RoaXMxMCA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0R2V0VmVjdG9ycygpLmNhbGwoX3RoaXMxMCwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwge1xuXHRcdFx0dmVjdG9yQnVja2V0TmFtZTogX3RoaXMxMC52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczEwLmluZGV4TmFtZVxuXHRcdH0pKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogTGlzdHMgdmVjdG9ycyBpbiB0aGlzIGluZGV4IHdpdGggcGFnaW5hdGlvblxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgYnVja2V0IGFuZCBpbmRleCBuYW1lc1xuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBwYXJhbSBvcHRpb25zIC0gTGlzdGluZyBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIHZlY3RvcnMgYXJyYXkgYW5kIHBhZ2luYXRpb24gdG9rZW4gb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4Lmxpc3RWZWN0b3JzKHtcblx0KiAgIG1heFJlc3VsdHM6IDUwMCxcblx0KiAgIHJldHVybk1ldGFkYXRhOiB0cnVlXG5cdCogfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgbGlzdFZlY3RvcnMob3B0aW9ucyA9IHt9KSB7XG5cdFx0dmFyIF9zdXBlcnByb3BfZ2V0TGlzdFZlY3RvcnMgPSAoKSA9PiBzdXBlci5saXN0VmVjdG9ycywgX3RoaXMxMSA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0TGlzdFZlY3RvcnMoKS5jYWxsKF90aGlzMTEsIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHtcblx0XHRcdHZlY3RvckJ1Y2tldE5hbWU6IF90aGlzMTEudmVjdG9yQnVja2V0TmFtZSxcblx0XHRcdGluZGV4TmFtZTogX3RoaXMxMS5pbmRleE5hbWVcblx0XHR9KSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIFF1ZXJpZXMgZm9yIHNpbWlsYXIgdmVjdG9ycyBpbiB0aGlzIGluZGV4XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyBidWNrZXQgYW5kIGluZGV4IG5hbWVzXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBRdWVyeSBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIG1hdGNoZXMgYXJyYXkgb2Ygc2ltaWxhciB2ZWN0b3JzIG9yZGVyZWQgYnkgZGlzdGFuY2Ugb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4LnF1ZXJ5VmVjdG9ycyh7XG5cdCogICBxdWVyeVZlY3RvcjogeyBmbG9hdDMyOiBbMC4xLCAwLjIsIC4uLl0gfSxcblx0KiAgIHRvcEs6IDUsXG5cdCogICBmaWx0ZXI6IHsgY2F0ZWdvcnk6ICd0ZWNobmljYWwnIH0sXG5cdCogICByZXR1cm5EaXN0YW5jZTogdHJ1ZSxcblx0KiAgIHJldHVybk1ldGFkYXRhOiB0cnVlXG5cdCogfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgcXVlcnlWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRRdWVyeVZlY3RvcnMgPSAoKSA9PiBzdXBlci5xdWVyeVZlY3RvcnMsIF90aGlzMTIgPSB0aGlzO1xuXHRcdHJldHVybiBfc3VwZXJwcm9wX2dldFF1ZXJ5VmVjdG9ycygpLmNhbGwoX3RoaXMxMiwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwge1xuXHRcdFx0dmVjdG9yQnVja2V0TmFtZTogX3RoaXMxMi52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczEyLmluZGV4TmFtZVxuXHRcdH0pKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogRGVsZXRlcyB2ZWN0b3JzIGJ5IGtleXMgZnJvbSB0aGlzIGluZGV4XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyBidWNrZXQgYW5kIGluZGV4IG5hbWVzXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBEZWxldGlvbiBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBlbXB0eSByZXNwb25zZSBvbiBzdWNjZXNzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBpbmRleCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKS5pbmRleCgnZG9jdW1lbnRzLW9wZW5haScpXG5cdCogYXdhaXQgaW5kZXguZGVsZXRlVmVjdG9ycyh7XG5cdCogICBrZXlzOiBbJ2RvYy0xJywgJ2RvYy0yJywgJ2RvYy0zJ11cblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBkZWxldGVWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXREZWxldGVWZWN0b3JzID0gKCkgPT4gc3VwZXIuZGVsZXRlVmVjdG9ycywgX3RoaXMxMyA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0RGVsZXRlVmVjdG9ycygpLmNhbGwoX3RoaXMxMywgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwge1xuXHRcdFx0dmVjdG9yQnVja2V0TmFtZTogX3RoaXMxMy52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczEzLmluZGV4TmFtZVxuXHRcdH0pKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1N0b3JhZ2VDbGllbnQudHNcbnZhciBTdG9yYWdlQ2xpZW50ID0gY2xhc3MgZXh0ZW5kcyBTdG9yYWdlQnVja2V0QXBpIHtcblx0LyoqXG5cdCogQ3JlYXRlcyBhIGNsaWVudCBmb3IgU3RvcmFnZSBidWNrZXRzLCBmaWxlcywgYW5hbHl0aWNzLCBhbmQgdmVjdG9ycy5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHRzXG5cdCogaW1wb3J0IHsgU3RvcmFnZUNsaWVudCB9IGZyb20gJ0BzdXBhYmFzZS9zdG9yYWdlLWpzJ1xuXHQqXG5cdCogY29uc3Qgc3RvcmFnZSA9IG5ldyBTdG9yYWdlQ2xpZW50KCdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vc3RvcmFnZS92MScsIHtcblx0KiAgIGFwaWtleTogJ3B1YmxpYy1hbm9uLWtleScsXG5cdCogfSlcblx0KiBjb25zdCBhdmF0YXJzID0gc3RvcmFnZS5mcm9tKCdhdmF0YXJzJylcblx0KiBgYGBcblx0Ki9cblx0Y29uc3RydWN0b3IodXJsLCBoZWFkZXJzID0ge30sIGZldGNoJDEsIG9wdHMpIHtcblx0XHRzdXBlcih1cmwsIGhlYWRlcnMsIGZldGNoJDEsIG9wdHMpO1xuXHR9XG5cdC8qKlxuXHQqIFBlcmZvcm0gZmlsZSBvcGVyYXRpb24gaW4gYSBidWNrZXQuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIGlkIFRoZSBidWNrZXQgaWQgdG8gb3BlcmF0ZSBvbi5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGF2YXRhcnMgPSBzdXBhYmFzZS5zdG9yYWdlLmZyb20oJ2F2YXRhcnMnKVxuXHQqIGBgYFxuXHQqL1xuXHRmcm9tKGlkKSB7XG5cdFx0cmV0dXJuIG5ldyBTdG9yYWdlRmlsZUFwaSh0aGlzLnVybCwgdGhpcy5oZWFkZXJzLCBpZCwgdGhpcy5mZXRjaCk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIEFjY2VzcyB2ZWN0b3Igc3RvcmFnZSBvcGVyYXRpb25zLlxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEByZXR1cm5zIEEgU3RvcmFnZVZlY3RvcnNDbGllbnQgaW5zdGFuY2UgY29uZmlndXJlZCB3aXRoIHRoZSBjdXJyZW50IHN0b3JhZ2Ugc2V0dGluZ3MuXG5cdCovXG5cdGdldCB2ZWN0b3JzKCkge1xuXHRcdHJldHVybiBuZXcgU3RvcmFnZVZlY3RvcnNDbGllbnQodGhpcy51cmwgKyBcIi92ZWN0b3JcIiwge1xuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0ZmV0Y2g6IHRoaXMuZmV0Y2hcblx0XHR9KTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogQWNjZXNzIGFuYWx5dGljcyBzdG9yYWdlIG9wZXJhdGlvbnMgdXNpbmcgSWNlYmVyZyB0YWJsZXMuXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IEFuYWx5dGljcyBCdWNrZXRzXG5cdCogQHJldHVybnMgQSBTdG9yYWdlQW5hbHl0aWNzQ2xpZW50IGluc3RhbmNlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgY3VycmVudCBzdG9yYWdlIHNldHRpbmdzLlxuXHQqL1xuXHRnZXQgYW5hbHl0aWNzKCkge1xuXHRcdHJldHVybiBuZXcgU3RvcmFnZUFuYWx5dGljc0NsaWVudCh0aGlzLnVybCArIFwiL2ljZWJlcmdcIiwgdGhpcy5oZWFkZXJzLCB0aGlzLmZldGNoKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBTdG9yYWdlQW5hbHl0aWNzQ2xpZW50LCBTdG9yYWdlQXBpRXJyb3IsIFN0b3JhZ2VDbGllbnQsIFN0b3JhZ2VFcnJvciwgU3RvcmFnZVVua25vd25FcnJvciwgU3RvcmFnZVZlY3RvcnNBcGlFcnJvciwgU3RvcmFnZVZlY3RvcnNDbGllbnQsIFN0b3JhZ2VWZWN0b3JzRXJyb3IsIFN0b3JhZ2VWZWN0b3JzRXJyb3JDb2RlLCBTdG9yYWdlVmVjdG9yc1Vua25vd25FcnJvciwgVmVjdG9yQnVja2V0QXBpLCBWZWN0b3JCdWNrZXRTY29wZSwgVmVjdG9yRGF0YUFwaSwgVmVjdG9ySW5kZXhBcGksIFZlY3RvckluZGV4U2NvcGUsIGlzUGxhaW5PYmplY3QsIGlzU3RvcmFnZUVycm9yLCBpc1N0b3JhZ2VWZWN0b3JzRXJyb3IsIG5vcm1hbGl6ZVRvRmxvYXQzMiwgcmVzb2x2ZUZldGNoLCByZXNvbHZlUmVzcG9uc2UsIHZhbGlkYXRlVmVjdG9yRGltZW5zaW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIl0sIm5hbWVzIjpbIkljZWJlcmdSZXN0Q2F0YWxvZyIsIlN0b3JhZ2VFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJtZXNzYWdlIiwiX19pc1N0b3JhZ2VFcnJvciIsIm5hbWUiLCJpc1N0b3JhZ2VFcnJvciIsImVycm9yIiwiU3RvcmFnZUFwaUVycm9yIiwic3RhdHVzIiwic3RhdHVzQ29kZSIsInRvSlNPTiIsIlN0b3JhZ2VVbmtub3duRXJyb3IiLCJvcmlnaW5hbEVycm9yIiwicmVzb2x2ZUZldGNoJDEiLCJjdXN0b21GZXRjaCIsImFyZ3MiLCJmZXRjaCIsInJlc29sdmVSZXNwb25zZSQxIiwiUmVzcG9uc2UiLCJyZWN1cnNpdmVUb0NhbWVsIiwiaXRlbSIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsImVsIiwiT2JqZWN0IiwicmVzdWx0IiwiZW50cmllcyIsImZvckVhY2giLCJrZXkiLCJ2YWx1ZSIsIm5ld0tleSIsInJlcGxhY2UiLCJjIiwidG9VcHBlckNhc2UiLCJpc1BsYWluT2JqZWN0JDEiLCJwcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwiaXRlcmF0b3IiLCJpc1ZhbGlkQnVja2V0TmFtZSIsImJ1Y2tldE5hbWUiLCJsZW5ndGgiLCJ0cmltIiwiaW5jbHVkZXMiLCJ0ZXN0IiwiX3R5cGVvZiIsIm8iLCJvJDEiLCJ0b1ByaW1pdGl2ZSIsInQiLCJyIiwiZSIsImkiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwidG9Qcm9wZXJ0eUtleSIsIl9kZWZpbmVQcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJyJDEiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkMiIsImFyZ3VtZW50cyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX2dldEVycm9yTWVzc2FnZSQxIiwiZXJyIiwiX2VyciRlcnJvciIsIm1zZyIsImVycm9yX2Rlc2NyaXB0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsImhhbmRsZUVycm9yJDEiLCJyZWplY3QiLCJvcHRpb25zIiwibm9SZXNvbHZlSnNvbiIsImpzb24iLCJ0aGVuIiwiY2F0Y2giLCJfZ2V0UmVxdWVzdFBhcmFtcyQxIiwibWV0aG9kIiwicGFyYW1ldGVycyIsImJvZHkiLCJwYXJhbXMiLCJoZWFkZXJzIiwiZHVwbGV4IiwiX2hhbmRsZVJlcXVlc3QkMSIsImZldGNoZXIiLCJ1cmwiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9rIiwiZGF0YSIsImdldCIsInBvc3QkMSIsInB1dCIsImhlYWQiLCJyZW1vdmUiLCJTdHJlYW1Eb3dubG9hZEJ1aWxkZXIiLCJkb3dubG9hZEZuIiwic2hvdWxkVGhyb3dPbkVycm9yIiwib25mdWxmaWxsZWQiLCJvbnJlamVjdGVkIiwiZXhlY3V0ZSIsIl90aGlzIiwiX1N5bWJvbCR0b1N0cmluZ1RhZyIsIkJsb2JEb3dubG9hZEJ1aWxkZXIiLCJwcm9taXNlIiwiYXNTdHJlYW0iLCJnZXRQcm9taXNlIiwiZmluYWxseSIsIm9uZmluYWxseSIsImJsb2IiLCJERUZBVUxUX1NFQVJDSF9PUFRJT05TIiwibGltaXQiLCJvZmZzZXQiLCJzb3J0QnkiLCJjb2x1bW4iLCJvcmRlciIsIkRFRkFVTFRfRklMRV9PUFRJT05TIiwiY2FjaGVDb250cm9sIiwiY29udGVudFR5cGUiLCJ1cHNlcnQiLCJTdG9yYWdlRmlsZUFwaSIsImJ1Y2tldElkIiwiZmV0Y2gkMSIsInRocm93T25FcnJvciIsInVwbG9hZE9yVXBkYXRlIiwicGF0aCIsImZpbGVCb2R5IiwiZmlsZU9wdGlvbnMiLCJtZXRhZGF0YSIsIkJsb2IiLCJGb3JtRGF0YSIsImFwcGVuZCIsImVuY29kZU1ldGFkYXRhIiwiaGFzIiwidG9CYXNlNjQiLCJSZWFkYWJsZVN0cmVhbSIsInBpcGUiLCJjbGVhblBhdGgiLCJfcmVtb3ZlRW1wdHlGb2xkZXJzIiwiX3BhdGgiLCJfZ2V0RmluYWxQYXRoIiwiaWQiLCJJZCIsImZ1bGxQYXRoIiwiS2V5IiwidXBsb2FkIiwidXBsb2FkVG9TaWduZWRVcmwiLCJ0b2tlbiIsIl90aGlzMyIsIlVSTCIsInNlYXJjaFBhcmFtcyIsInNldCIsInRvU3RyaW5nIiwiY3JlYXRlU2lnbmVkVXBsb2FkVXJsIiwiX3RoaXM0Iiwic2lnbmVkVXJsIiwidXBkYXRlIiwibW92ZSIsImZyb21QYXRoIiwidG9QYXRoIiwiX3RoaXM2Iiwic291cmNlS2V5IiwiZGVzdGluYXRpb25LZXkiLCJkZXN0aW5hdGlvbkJ1Y2tldCIsImNvcHkiLCJfdGhpczciLCJjcmVhdGVTaWduZWRVcmwiLCJleHBpcmVzSW4iLCJfdGhpczgiLCJ0cmFuc2Zvcm0iLCJkb3dubG9hZFF1ZXJ5UGFyYW0iLCJkb3dubG9hZCIsImVuY29kZVVSSSIsInNpZ25lZFVSTCIsImNyZWF0ZVNpZ25lZFVybHMiLCJwYXRocyIsIl90aGlzOSIsImRhdHVtIiwicmVuZGVyUGF0aCIsInRyYW5zZm9ybWF0aW9uUXVlcnkiLCJ0cmFuc2Zvcm1PcHRzVG9RdWVyeVN0cmluZyIsInF1ZXJ5U3RyaW5nIiwiaW5mbyIsIl90aGlzMTAiLCJleGlzdHMiLCJfdGhpczExIiwiZ2V0UHVibGljVXJsIiwiX3F1ZXJ5U3RyaW5nIiwiam9pbiIsInB1YmxpY1VybCIsIl90aGlzMTIiLCJwcmVmaXhlcyIsImxpc3QiLCJfdGhpczEzIiwicHJlZml4IiwibGlzdFYyIiwiX3RoaXMxNCIsIkJ1ZmZlciIsImZyb20iLCJidG9hIiwid2lkdGgiLCJoZWlnaHQiLCJyZXNpemUiLCJmb3JtYXQiLCJxdWFsaXR5IiwidmVyc2lvbiIsIkRFRkFVTFRfSEVBREVSUyQxIiwiU3RvcmFnZUJ1Y2tldEFwaSIsIm9wdHMiLCJiYXNlVXJsIiwidXNlTmV3SG9zdG5hbWUiLCJob3N0bmFtZSIsImhyZWYiLCJsaXN0QnVja2V0cyIsImxpc3RCdWNrZXRPcHRpb25zVG9RdWVyeVN0cmluZyIsImdldEJ1Y2tldCIsIl90aGlzMiIsImNyZWF0ZUJ1Y2tldCIsInB1YmxpYyIsInR5cGUiLCJmaWxlX3NpemVfbGltaXQiLCJmaWxlU2l6ZUxpbWl0IiwiYWxsb3dlZF9taW1lX3R5cGVzIiwiYWxsb3dlZE1pbWVUeXBlcyIsInVwZGF0ZUJ1Y2tldCIsImVtcHR5QnVja2V0IiwiX3RoaXM1IiwiZGVsZXRlQnVja2V0Iiwic2VhcmNoIiwic29ydENvbHVtbiIsInNvcnRPcmRlciIsIlVSTFNlYXJjaFBhcmFtcyIsIlN0b3JhZ2VBbmFseXRpY3NDbGllbnQiLCJxdWVyeVBhcmFtcyIsImNhdGFsb2ciLCJjYXRhbG9nTmFtZSIsImF1dGgiLCJnZXRIZWFkZXJzIiwiUHJveHkiLCJ0YXJnZXQiLCJwcm9wIiwiREVGQVVMVF9IRUFERVJTIiwiU3RvcmFnZVZlY3RvcnNFcnJvciIsIl9faXNTdG9yYWdlVmVjdG9yc0Vycm9yIiwiaXNTdG9yYWdlVmVjdG9yc0Vycm9yIiwiU3RvcmFnZVZlY3RvcnNBcGlFcnJvciIsIlN0b3JhZ2VWZWN0b3JzVW5rbm93bkVycm9yIiwiU3RvcmFnZVZlY3RvcnNFcnJvckNvZGUiLCJTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSQxIiwicmVzb2x2ZUZldGNoIiwicmVzb2x2ZVJlc3BvbnNlIiwiaXNQbGFpbk9iamVjdCIsIm5vcm1hbGl6ZVRvRmxvYXQzMiIsInZhbHVlcyIsIkZsb2F0MzJBcnJheSIsInZhbGlkYXRlVmVjdG9yRGltZW5zaW9uIiwidmVjdG9yIiwiZXhwZWN0ZWREaW1lbnNpb24iLCJmbG9hdDMyIiwiX2dldEVycm9yTWVzc2FnZSIsImhhbmRsZUVycm9yIiwicmVzcG9uc2VFcnJvciIsImNvZGUiLCJzdGF0dXNUZXh0IiwiX2dldFJlcXVlc3RQYXJhbXMiLCJfaGFuZGxlUmVxdWVzdCIsInBvc3QiLCJWZWN0b3JJbmRleEFwaSIsImNyZWF0ZUluZGV4IiwiZ2V0SW5kZXgiLCJ2ZWN0b3JCdWNrZXROYW1lIiwiaW5kZXhOYW1lIiwibGlzdEluZGV4ZXMiLCJkZWxldGVJbmRleCIsIlZlY3RvckRhdGFBcGkiLCJwdXRWZWN0b3JzIiwidmVjdG9ycyIsImdldFZlY3RvcnMiLCJsaXN0VmVjdG9ycyIsInNlZ21lbnRDb3VudCIsInNlZ21lbnRJbmRleCIsInF1ZXJ5VmVjdG9ycyIsImRlbGV0ZVZlY3RvcnMiLCJWZWN0b3JCdWNrZXRBcGkiLCJTdG9yYWdlVmVjdG9yc0NsaWVudCIsIlZlY3RvckJ1Y2tldFNjb3BlIiwiX3N1cGVycHJvcF9nZXRDcmVhdGVCdWNrZXQiLCJfc3VwZXJwcm9wX2dldEdldEJ1Y2tldCIsIl9zdXBlcnByb3BfZ2V0TGlzdEJ1Y2tldHMiLCJfc3VwZXJwcm9wX2dldERlbGV0ZUJ1Y2tldCIsIl9zdXBlcnByb3BfZ2V0Q3JlYXRlSW5kZXgiLCJfc3VwZXJwcm9wX2dldExpc3RJbmRleGVzIiwiX3N1cGVycHJvcF9nZXRHZXRJbmRleCIsIl9zdXBlcnByb3BfZ2V0RGVsZXRlSW5kZXgiLCJpbmRleCIsIlZlY3RvckluZGV4U2NvcGUiLCJfc3VwZXJwcm9wX2dldFB1dFZlY3RvcnMiLCJfc3VwZXJwcm9wX2dldEdldFZlY3RvcnMiLCJfc3VwZXJwcm9wX2dldExpc3RWZWN0b3JzIiwiX3N1cGVycHJvcF9nZXRRdWVyeVZlY3RvcnMiLCJfc3VwZXJwcm9wX2dldERlbGV0ZVZlY3RvcnMiLCJTdG9yYWdlQ2xpZW50IiwiYW5hbHl0aWNzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/storage-js/dist/index.mjs\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/@supabase/supabase-js/dist/index.mjs":
|
||
/*!***********************************************************!*\
|
||
!*** ./node_modules/@supabase/supabase-js/dist/index.mjs ***!
|
||
\***********************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthAdminApi: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthAdminApi),\n/* harmony export */ AuthApiError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthApiError),\n/* harmony export */ AuthClient: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthClient),\n/* harmony export */ AuthError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthError),\n/* harmony export */ AuthImplicitGrantRedirectError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthImplicitGrantRedirectError),\n/* harmony export */ AuthInvalidCredentialsError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidCredentialsError),\n/* harmony export */ AuthInvalidJwtError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidJwtError),\n/* harmony export */ AuthInvalidTokenResponseError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidTokenResponseError),\n/* harmony export */ AuthPKCECodeVerifierMissingError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthPKCECodeVerifierMissingError),\n/* harmony export */ AuthPKCEGrantCodeExchangeError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthPKCEGrantCodeExchangeError),\n/* harmony export */ AuthRetryableFetchError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthRetryableFetchError),\n/* harmony export */ AuthSessionMissingError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError),\n/* harmony export */ AuthUnknownError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthUnknownError),\n/* harmony export */ AuthWeakPasswordError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthWeakPasswordError),\n/* harmony export */ CustomAuthError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.CustomAuthError),\n/* harmony export */ FunctionRegion: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionRegion),\n/* harmony export */ FunctionsError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsError),\n/* harmony export */ FunctionsFetchError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsFetchError),\n/* harmony export */ FunctionsHttpError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsHttpError),\n/* harmony export */ FunctionsRelayError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsRelayError),\n/* harmony export */ GoTrueAdminApi: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.GoTrueAdminApi),\n/* harmony export */ GoTrueClient: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.GoTrueClient),\n/* harmony export */ NavigatorLockAcquireTimeoutError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.NavigatorLockAcquireTimeoutError),\n/* harmony export */ PostgrestError: () => (/* reexport safe */ _supabase_postgrest_js__WEBPACK_IMPORTED_MODULE_0__.PostgrestError),\n/* harmony export */ REALTIME_CHANNEL_STATES: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_CHANNEL_STATES),\n/* harmony export */ REALTIME_LISTEN_TYPES: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_LISTEN_TYPES),\n/* harmony export */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_POSTGRES_CHANGES_LISTEN_EVENT),\n/* harmony export */ REALTIME_PRESENCE_LISTEN_EVENTS: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_PRESENCE_LISTEN_EVENTS),\n/* harmony export */ REALTIME_SUBSCRIBE_STATES: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_SUBSCRIBE_STATES),\n/* harmony export */ RealtimeChannel: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.RealtimeChannel),\n/* harmony export */ RealtimeClient: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.RealtimeClient),\n/* harmony export */ RealtimePresence: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.RealtimePresence),\n/* harmony export */ SIGN_OUT_SCOPES: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.SIGN_OUT_SCOPES),\n/* harmony export */ SupabaseClient: () => (/* binding */ SupabaseClient),\n/* harmony export */ WebSocketFactory: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.WebSocketFactory),\n/* harmony export */ createClient: () => (/* binding */ createClient),\n/* harmony export */ isAuthApiError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthApiError),\n/* harmony export */ isAuthError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthError),\n/* harmony export */ isAuthImplicitGrantRedirectError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthImplicitGrantRedirectError),\n/* harmony export */ isAuthPKCECodeVerifierMissingError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthPKCECodeVerifierMissingError),\n/* harmony export */ isAuthRetryableFetchError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthRetryableFetchError),\n/* harmony export */ isAuthSessionMissingError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthSessionMissingError),\n/* harmony export */ isAuthWeakPasswordError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthWeakPasswordError),\n/* harmony export */ lockInternals: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.lockInternals),\n/* harmony export */ navigatorLock: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.navigatorLock),\n/* harmony export */ processLock: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.processLock)\n/* harmony export */ });\n/* harmony import */ var _supabase_functions_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @supabase/functions-js */ \"(ssr)/./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 */ \"(ssr)/./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 */ \"(ssr)/./node_modules/@supabase/postgrest-js/dist/index.mjs\");\n/* harmony import */ var _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @supabase/realtime-js */ \"(ssr)/./node_modules/@supabase/realtime-js/dist/module/index.js\");\n/* harmony import */ var _supabase_storage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @supabase/storage-js */ \"(ssr)/./node_modules/@supabase/storage-js/dist/index.mjs\");\n/* harmony import */ var _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @supabase/auth-js */ \"(ssr)/./node_modules/@supabase/auth-js/dist/module/index.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-${JS_ENV}/${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 (...args)=>customFetch(...args);\n return (...args)=>fetch(...args);\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 ${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* 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-${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.${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_3__.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\t* Supabase Functions allows you to deploy and invoke edge functions.\n\t*/ get functions() {\n return new _supabase_functions_js__WEBPACK_IMPORTED_MODULE_4__.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, args = {}, options = {\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, opts = {\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({ autoRefreshToken, persistSession, detectSessionInUrl, storage, userStorage, storageKey, flowType, lock, debug, throwOnError }, headers, fetch$1) {\n const authHeaders = {\n Authorization: `Bearer ${this.supabaseKey}`,\n apikey: `${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//#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 (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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3N1cGFiYXNlLWpzL2Rpc3QvaW5kZXgubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBdUo7QUFDOUU7QUFDbEI7QUFDRjtBQUNOO0FBRVY7QUFFSjtBQUVqQyw0QkFBNEI7QUFDNUIsTUFBTVcsVUFBVTtBQUVoQixZQUFZO0FBQ1osOEJBQThCO0FBQzlCLElBQUlDLFNBQVM7QUFDYixJQUFJLE9BQU9DLFNBQVMsYUFBYUQsU0FBUztLQUNyQyxJQUFJLE9BQU9FLGFBQWEsYUFBYUYsU0FBUztLQUM5QyxJQUFJLE9BQU9HLGNBQWMsZUFBZUEsVUFBVUMsT0FBTyxLQUFLLGVBQWVKLFNBQVM7S0FDdEZBLFNBQVM7QUFDZCxNQUFNSyxrQkFBa0I7SUFBRSxpQkFBaUIsQ0FBQyxZQUFZLEVBQUVMLE9BQU8sQ0FBQyxFQUFFRCxRQUFRLENBQUM7QUFBQztBQUM5RSxNQUFNTyx5QkFBeUI7SUFBRUMsU0FBU0Y7QUFBZ0I7QUFDMUQsTUFBTUcscUJBQXFCO0lBQUVDLFFBQVE7QUFBUztBQUM5QyxNQUFNQyx1QkFBdUI7SUFDNUJDLGtCQUFrQjtJQUNsQkMsZ0JBQWdCO0lBQ2hCQyxvQkFBb0I7SUFDcEJDLFVBQVU7QUFDWDtBQUNBLE1BQU1DLDJCQUEyQixDQUFDO0FBRWxDLFlBQVk7QUFDWiwwREFBMEQ7QUFDMUQsU0FBU0MsUUFBUUMsQ0FBQztJQUNqQjtJQUNBLE9BQU9ELFVBQVUsY0FBYyxPQUFPRSxVQUFVLFlBQVksT0FBT0EsT0FBT0MsUUFBUSxHQUFHLFNBQVNDLEdBQUc7UUFDaEcsT0FBTyxPQUFPQTtJQUNmLElBQUksU0FBU0EsR0FBRztRQUNmLE9BQU9BLE9BQU8sY0FBYyxPQUFPRixVQUFVRSxJQUFJQyxXQUFXLEtBQUtILFVBQVVFLFFBQVFGLE9BQU9JLFNBQVMsR0FBRyxXQUFXLE9BQU9GO0lBQ3pILEdBQUdKLFFB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QUFrQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2Uvc3VwYWJhc2UtanMvZGlzdC9pbmRleC5tanM/NDkzYSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGdW5jdGlvblJlZ2lvbiwgRnVuY3Rpb25zQ2xpZW50LCBGdW5jdGlvbnNFcnJvciwgRnVuY3Rpb25zRmV0Y2hFcnJvciwgRnVuY3Rpb25zSHR0cEVycm9yLCBGdW5jdGlvbnNSZWxheUVycm9yIH0gZnJvbSBcIkBzdXBhYmFzZS9mdW5jdGlvbnMtanNcIjtcbmltcG9ydCB7IFBvc3RncmVzdENsaWVudCwgUG9zdGdyZXN0RXJyb3IgfSBmcm9tIFwiQHN1cGFiYXNlL3Bvc3RncmVzdC1qc1wiO1xuaW1wb3J0IHsgUmVhbHRpbWVDbGllbnQgfSBmcm9tIFwiQHN1cGFiYXNlL3JlYWx0aW1lLWpzXCI7XG5pbXBvcnQgeyBTdG9yYWdlQ2xpZW50IH0gZnJvbSBcIkBzdXBhYmFzZS9zdG9yYWdlLWpzXCI7XG5pbXBvcnQgeyBBdXRoQ2xpZW50IH0gZnJvbSBcIkBzdXBhYmFzZS9hdXRoLWpzXCI7XG5cbmV4cG9ydCAqIGZyb20gXCJAc3VwYWJhc2UvcmVhbHRpbWUtanNcIlxuXG5leHBvcnQgKiBmcm9tIFwiQHN1cGFiYXNlL2F1dGgtanNcIlxuXG4vLyNyZWdpb24gc3JjL2xpYi92ZXJzaW9uLnRzXG5jb25zdCB2ZXJzaW9uID0gXCIyLjg4LjBcIjtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi9jb25zdGFudHMudHNcbmxldCBKU19FTlYgPSBcIlwiO1xuaWYgKHR5cGVvZiBEZW5vICE9PSBcInVuZGVmaW5lZFwiKSBKU19FTlYgPSBcImRlbm9cIjtcbmVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikgSlNfRU5WID0gXCJ3ZWJcIjtcbmVsc2UgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLnByb2R1Y3QgPT09IFwiUmVhY3ROYXRpdmVcIikgSlNfRU5WID0gXCJyZWFjdC1uYXRpdmVcIjtcbmVsc2UgSlNfRU5WID0gXCJub2RlXCI7XG5jb25zdCBERUZBVUxUX0hFQURFUlMgPSB7IFwiWC1DbGllbnQtSW5mb1wiOiBgc3VwYWJhc2UtanMtJHtKU19FTlZ9LyR7dmVyc2lvbn1gIH07XG5jb25zdCBERUZBVUxUX0dMT0JBTF9PUFRJT05TID0geyBoZWFkZXJzOiBERUZBVUxUX0hFQURFUlMgfTtcbmNvbnN0IERFRkFVTFRfREJfT1BUSU9OUyA9IHsgc2NoZW1hOiBcInB1YmxpY1wiIH07XG5jb25zdCBERUZBVUxUX0FVVEhfT1BUSU9OUyA9IHtcblx0YXV0b1JlZnJlc2hUb2tlbjogdHJ1ZSxcblx0cGVyc2lzdFNlc3Npb246IHRydWUsXG5cdGRldGVjdFNlc3Npb25JblVybDogdHJ1ZSxcblx0Zmxvd1R5cGU6IFwiaW1wbGljaXRcIlxufTtcbmNvbnN0IERFRkFVTFRfUkVBTFRJTUVfT1BUSU9OUyA9IHt9O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBcXDBAb3hjLXByb2plY3QrcnVudGltZUAwLjEwMS4wL2hlbHBlcnMvdHlwZW9mLmpzXG5mdW5jdGlvbiBfdHlwZW9mKG8pIHtcblx0XCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXHRyZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uKG8kMSkge1xuXHRcdHJldHVybiB0eXBlb2YgbyQxO1xuXHR9IDogZnVuY3Rpb24obyQxKSB7XG5cdFx0cmV0dXJuIG8kMSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvJDEuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvJDEgIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG8kMTtcblx0fSwgX3R5cGVvZihvKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gXFwwQG94Yy1wcm9qZWN0K3J1bnRpbWVAMC4xMDEuMC9oZWxwZXJzL3RvUHJpbWl0aXZlLmpzXG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG5cdGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuXHR2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcblx0aWYgKHZvaWQgMCAhPT0gZSkge1xuXHRcdHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuXHRcdGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpO1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcblx0fVxuXHRyZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBcXDBAb3hjLXByb2plY3QrcnVudGltZUAwLjEwMS4wL2hlbHBlcnMvdG9Qcm9wZXJ0eUtleS5qc1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG5cdHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG5cdHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIFxcMEBveGMtcHJvamVjdCtydW50aW1lQDAuMTAxLjAvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qc1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHtcblx0cmV0dXJuIChyID0gdG9Qcm9wZXJ0eUtleShyKSkgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCB7XG5cdFx0dmFsdWU6IHQsXG5cdFx0ZW51bWVyYWJsZTogITAsXG5cdFx0Y29uZmlndXJhYmxlOiAhMCxcblx0XHR3cml0YWJsZTogITBcblx0fSkgOiBlW3JdID0gdCwgZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gXFwwQG94Yy1wcm9qZWN0K3J1bnRpbWVAMC4xMDEuMC9oZWxwZXJzL29iamVjdFNwcmVhZDIuanNcbmZ1bmN0aW9uIG93bktleXMoZSwgcikge1xuXHR2YXIgdCA9IE9iamVjdC5rZXlzKGUpO1xuXHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtcblx0XHRyICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24ociQxKSB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByJDEpLmVudW1lcmFibGU7XG5cdFx0fSkpLCB0LnB1c2guYXBwbHkodCwgbyk7XG5cdH1cblx0cmV0dXJuIHQ7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMihlKSB7XG5cdGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7XG5cdFx0dmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9O1xuXHRcdHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIkMSkge1xuXHRcdFx0X2RlZmluZVByb3BlcnR5KGUsIHIkMSwgdFtyJDFdKTtcblx0XHR9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24ociQxKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciQxLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIkMSkpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL2ZldGNoLnRzXG5jb25zdCByZXNvbHZlRmV0Y2ggPSAoY3VzdG9tRmV0Y2gpID0+IHtcblx0aWYgKGN1c3RvbUZldGNoKSByZXR1cm4gKC4uLmFyZ3MpID0+IGN1c3RvbUZldGNoKC4uLmFyZ3MpO1xuXHRyZXR1cm4gKC4uLmFyZ3MpID0+IGZldGNoKC4uLmFyZ3MpO1xufTtcbmNvbnN0IHJlc29sdmVIZWFkZXJzQ29uc3RydWN0b3IgPSAoKSA9PiB7XG5cdHJldHVybiBIZWFkZXJzO1xufTtcbmNvbnN0IGZldGNoV2l0aEF1dGggPSAoc3VwYWJhc2VLZXksIGdldEFjY2Vzc1Rva2VuLCBjdXN0b21GZXRjaCkgPT4ge1xuXHRjb25zdCBmZXRjaCQxID0gcmVzb2x2ZUZldGNoKGN1c3RvbUZldGNoKTtcblx0Y29uc3QgSGVhZGVyc0NvbnN0cnVjdG9yID0gcmVzb2x2ZUhlYWRlcnNDb25zdHJ1Y3RvcigpO1xuXHRyZXR1cm4gYXN5bmMgKGlucHV0LCBpbml0KSA9PiB7XG5cdFx0dmFyIF9hd2FpdCRnZXRBY2Nlc3NUb2tlbjtcblx0XHRjb25zdCBhY2Nlc3NUb2tlbiA9IChfYXdhaXQkZ2V0QWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpKSAhPT0gbnVsbCAmJiBfYXdhaXQkZ2V0QWNjZXNzVG9rZW4gIT09IHZvaWQgMCA/IF9hd2FpdCRnZXRBY2Nlc3NUb2tlbiA6IHN1cGFiYXNlS2V5O1xuXHRcdGxldCBoZWFkZXJzID0gbmV3IEhlYWRlcnNDb25zdHJ1Y3Rvcihpbml0ID09PSBudWxsIHx8IGluaXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluaXQuaGVhZGVycyk7XG5cdFx0aWYgKCFoZWFkZXJzLmhhcyhcImFwaWtleVwiKSkgaGVhZGVycy5zZXQoXCJhcGlrZXlcIiwgc3VwYWJhc2VLZXkpO1xuXHRcdGlmICghaGVhZGVycy5oYXMoXCJBdXRob3JpemF0aW9uXCIpKSBoZWFkZXJzLnNldChcIkF1dGhvcml6YXRpb25cIiwgYEJlYXJlciAke2FjY2Vzc1Rva2VufWApO1xuXHRcdHJldHVybiBmZXRjaCQxKGlucHV0LCBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgaW5pdCksIHt9LCB7IGhlYWRlcnMgfSkpO1xuXHR9O1xufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi9oZWxwZXJzLnRzXG5mdW5jdGlvbiBlbnN1cmVUcmFpbGluZ1NsYXNoKHVybCkge1xuXHRyZXR1cm4gdXJsLmVuZHNXaXRoKFwiL1wiKSA/IHVybCA6IHVybCArIFwiL1wiO1xufVxuZnVuY3Rpb24gYXBwbHlTZXR0aW5nRGVmYXVsdHMob3B0aW9ucywgZGVmYXVsdHMpIHtcblx0dmFyIF9ERUZBVUxUX0dMT0JBTF9PUFRJTywgX2dsb2JhbE9wdGlvbnMkaGVhZGVyO1xuXHRjb25zdCB7IGRiOiBkYk9wdGlvbnMsIGF1dGg6IGF1dGhPcHRpb25zLCByZWFsdGltZTogcmVhbHRpbWVPcHRpb25zLCBnbG9iYWw6IGdsb2JhbE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHsgZGI6IERFRkFVTFRfREJfT1BUSU9OUyQxLCBhdXRoOiBERUZBVUxUX0FVVEhfT1BUSU9OUyQxLCByZWFsdGltZTogREVGQVVMVF9SRUFMVElNRV9PUFRJT05TJDEsIGdsb2JhbDogREVGQVVMVF9HTE9CQUxfT1BUSU9OUyQxIH0gPSBkZWZhdWx0cztcblx0Y29uc3QgcmVzdWx0ID0ge1xuXHRcdGRiOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9EQl9PUFRJT05TJDEpLCBkYk9wdGlvbnMpLFxuXHRcdGF1dGg6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX0FVVEhfT1BUSU9OUyQxKSwgYXV0aE9wdGlvbnMpLFxuXHRcdHJlYWx0aW1lOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9SRUFMVElNRV9PUFRJT05TJDEpLCByZWFsdGltZU9wdGlvbnMpLFxuXHRcdHN0b3JhZ2U6IHt9LFxuXHRcdGdsb2JhbDogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERFRkFVTFRfR0xPQkFMX09QVElPTlMkMSksIGdsb2JhbE9wdGlvbnMpLCB7fSwgeyBoZWFkZXJzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgKF9ERUZBVUxUX0dMT0JBTF9PUFRJTyA9IERFRkFVTFRfR0xPQkFMX09QVElPTlMkMSA9PT0gbnVsbCB8fCBERUZBVUxUX0dMT0JBTF9PUFRJT05TJDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IERFRkFVTFRfR0xPQkFMX09QVElPTlMkMS5oZWFkZXJzKSAhPT0gbnVsbCAmJiBfREVGQVVMVF9HTE9CQUxfT1BUSU8gIT09IHZvaWQgMCA/IF9ERUZBVUxUX0dMT0JBTF9PUFRJTyA6IHt9KSwgKF9nbG9iYWxPcHRpb25zJGhlYWRlciA9IGdsb2JhbE9wdGlvbnMgPT09IG51bGwgfHwgZ2xvYmFsT3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ2xvYmFsT3B0aW9ucy5oZWFkZXJzKSAhPT0gbnVsbCAmJiBfZ2xvYmFsT3B0aW9ucyRoZWFkZXIgIT09IHZvaWQgMCA/IF9nbG9iYWxPcHRpb25zJGhlYWRlciA6IHt9KSB9KSxcblx0XHRhY2Nlc3NUb2tlbjogYXN5bmMgKCkgPT4gXCJcIlxuXHR9O1xuXHRpZiAob3B0aW9ucy5hY2Nlc3NUb2tlbikgcmVzdWx0LmFjY2Vzc1Rva2VuID0gb3B0aW9ucy5hY2Nlc3NUb2tlbjtcblx0ZWxzZSBkZWxldGUgcmVzdWx0LmFjY2Vzc1Rva2VuO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4qIFZhbGlkYXRlcyBhIFN1cGFiYXNlIGNsaWVudCBVUkxcbipcbiogQHBhcmFtIHtzdHJpbmd9IHN1cGFiYXNlVXJsIC0gVGhlIFN1cGFiYXNlIGNsaWVudCBVUkwgc3RyaW5nLlxuKiBAcmV0dXJucyB7VVJMfSAtIFRoZSB2YWxpZGF0ZWQgYmFzZSBVUkwuXG4qIEB0aHJvd3Mge0Vycm9yfVxuKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3VwYWJhc2VVcmwoc3VwYWJhc2VVcmwpIHtcblx0Y29uc3QgdHJpbW1lZFVybCA9IHN1cGFiYXNlVXJsID09PSBudWxsIHx8IHN1cGFiYXNlVXJsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdXBhYmFzZVVybC50cmltKCk7XG5cdGlmICghdHJpbW1lZFVybCkgdGhyb3cgbmV3IEVycm9yKFwic3VwYWJhc2VVcmwgaXMgcmVxdWlyZWQuXCIpO1xuXHRpZiAoIXRyaW1tZWRVcmwubWF0Y2goL15odHRwcz86XFwvXFwvL2kpKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN1cGFiYXNlVXJsOiBNdXN0IGJlIGEgdmFsaWQgSFRUUCBvciBIVFRQUyBVUkwuXCIpO1xuXHR0cnkge1xuXHRcdHJldHVybiBuZXcgVVJMKGVuc3VyZVRyYWlsaW5nU2xhc2godHJpbW1lZFVybCkpO1xuXHR9IGNhdGNoIChfdW51c2VkKSB7XG5cdFx0dGhyb3cgRXJyb3IoXCJJbnZhbGlkIHN1cGFiYXNlVXJsOiBQcm92aWRlZCBVUkwgaXMgbWFsZm9ybWVkLlwiKTtcblx0fVxufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL1N1cGFiYXNlQXV0aENsaWVudC50c1xudmFyIFN1cGFiYXNlQXV0aENsaWVudCA9IGNsYXNzIGV4dGVuZHMgQXV0aENsaWVudCB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRzdXBlcihvcHRpb25zKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1N1cGFiYXNlQ2xpZW50LnRzXG4vKipcbiogU3VwYWJhc2UgQ2xpZW50LlxuKlxuKiBBbiBpc29tb3JwaGljIEphdmFzY3JpcHQgY2xpZW50IGZvciBpbnRlcmFjdGluZyB3aXRoIFBvc3RncmVzLlxuKi9cbnZhciBTdXBhYmFzZUNsaWVudCA9IGNsYXNzIHtcblx0LyoqXG5cdCogQ3JlYXRlIGEgbmV3IGNsaWVudCBmb3IgdXNlIGluIHRoZSBicm93c2VyLlxuXHQqIEBwYXJhbSBzdXBhYmFzZVVybCBUaGUgdW5pcXVlIFN1cGFiYXNlIFVSTCB3aGljaCBpcyBzdXBwbGllZCB3aGVuIHlvdSBjcmVhdGUgYSBuZXcgcHJvamVjdCBpbiB5b3VyIHByb2plY3QgZGFzaGJvYXJkLlxuXHQqIEBwYXJhbSBzdXBhYmFzZUtleSBUaGUgdW5pcXVlIFN1cGFiYXNlIEtleSB3aGljaCBpcyBzdXBwbGllZCB3aGVuIHlvdSBjcmVhdGUgYSBuZXcgcHJvamVjdCBpbiB5b3VyIHByb2plY3QgZGFzaGJvYXJkLlxuXHQqIEBwYXJhbSBvcHRpb25zLmRiLnNjaGVtYSBZb3UgY2FuIHN3aXRjaCBpbiBiZXR3ZWVuIHNjaGVtYXMuIFRoZSBzY2hlbWEgbmVlZHMgdG8gYmUgb24gdGhlIGxpc3Qgb2YgZXhwb3NlZCBzY2hlbWFzIGluc2lkZSBTdXBhYmFzZS5cblx0KiBAcGFyYW0gb3B0aW9ucy5hdXRoLmF1dG9SZWZyZXNoVG9rZW4gU2V0IHRvIFwidHJ1ZVwiIGlmIHlvdSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB0aGUgdG9rZW4gYmVmb3JlIGV4cGlyaW5nLlxuXHQqIEBwYXJhbSBvcHRpb25zLmF1dGgucGVyc2lzdFNlc3Npb24gU2V0IHRvIFwidHJ1ZVwiIGlmIHlvdSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgc2F2ZSB0aGUgdXNlciBzZXNzaW9uIGludG8gbG9jYWwgc3RvcmFnZS5cblx0KiBAcGFyYW0gb3B0aW9ucy5hdXRoLmRldGVjdFNlc3Npb25JblVybCBTZXQgdG8gXCJ0cnVlXCIgaWYgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseSBkZXRlY3RzIE9BdXRoIGdyYW50cyBpbiB0aGUgVVJMIGFuZCBzaWducyBpbiB0aGUgdXNlci5cblx0KiBAcGFyYW0gb3B0aW9ucy5yZWFsdGltZSBPcHRpb25zIHBhc3NlZCBhbG9uZyB0byByZWFsdGltZS1qcyBjb25zdHJ1Y3Rvci5cblx0KiBAcGFyYW0gb3B0aW9ucy5zdG9yYWdlIE9wdGlvbnMgcGFzc2VkIGFsb25nIHRvIHRoZSBzdG9yYWdlLWpzIGNvbnN0cnVjdG9yLlxuXHQqIEBwYXJhbSBvcHRpb25zLmdsb2JhbC5mZXRjaCBBIGN1c3RvbSBmZXRjaCBpbXBsZW1lbnRhdGlvbi5cblx0KiBAcGFyYW0gb3B0aW9ucy5nbG9iYWwuaGVhZGVycyBBbnkgYWRkaXRpb25hbCBoZWFkZXJzIHRvIHNlbmQgd2l0aCBlYWNoIG5ldHdvcmsgcmVxdWVzdC5cblx0KiBAZXhhbXBsZVxuXHQqIGBgYHRzXG5cdCogaW1wb3J0IHsgY3JlYXRlQ2xpZW50IH0gZnJvbSAnQHN1cGFiYXNlL3N1cGFiYXNlLWpzJ1xuXHQqXG5cdCogY29uc3Qgc3VwYWJhc2UgPSBjcmVhdGVDbGllbnQoJ2h0dHBzOi8veHl6Y29tcGFueS5zdXBhYmFzZS5jbycsICdwdWJsaWMtYW5vbi1rZXknKVxuXHQqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgc3VwYWJhc2UuZnJvbSgncHJvZmlsZXMnKS5zZWxlY3QoJyonKVxuXHQqIGBgYFxuXHQqL1xuXHRjb25zdHJ1Y3RvcihzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXksIG9wdGlvbnMpIHtcblx0XHR2YXIgX3NldHRpbmdzJGF1dGgkc3RvcmFnLCBfc2V0dGluZ3MkZ2xvYmFsJGhlYWQ7XG5cdFx0dGhpcy5zdXBhYmFzZVVybCA9IHN1cGFiYXNlVXJsO1xuXHRcdHRoaXMuc3VwYWJhc2VLZXkgPSBzdXBhYmFzZUtleTtcblx0XHRjb25zdCBiYXNlVXJsID0gdmFsaWRhdGVTdXBhYmFzZVVybChzdXBhYmFzZVVybCk7XG5cdFx0aWYgKCFzdXBhYmFzZUtleSkgdGhyb3cgbmV3IEVycm9yKFwic3VwYWJhc2VLZXkgaXMgcmVxdWlyZWQuXCIpO1xuXHRcdHRoaXMucmVhbHRpbWVVcmwgPSBuZXcgVVJMKFwicmVhbHRpbWUvdjFcIiwgYmFzZVVybCk7XG5cdFx0dGhpcy5yZWFsdGltZVVybC5wcm90b2NvbCA9IHRoaXMucmVhbHRpbWVVcmwucHJvdG9jb2wucmVwbGFjZShcImh0dHBcIiwgXCJ3c1wiKTtcblx0XHR0aGlzLmF1dGhVcmwgPSBuZXcgVVJMKFwiYXV0aC92MVwiLCBiYXNlVXJsKTtcblx0XHR0aGlzLnN0b3JhZ2VVcmwgPSBuZXcgVVJMKFwic3RvcmFnZS92MVwiLCBiYXNlVXJsKTtcblx0XHR0aGlzLmZ1bmN0aW9uc1VybCA9IG5ldyBVUkwoXCJmdW5jdGlvbnMvdjFcIiwgYmFzZVVybCk7XG5cdFx0Y29uc3QgZGVmYXVsdFN0b3JhZ2VLZXkgPSBgc2ItJHtiYXNlVXJsLmhvc3RuYW1lLnNwbGl0KFwiLlwiKVswXX0tYXV0aC10b2tlbmA7XG5cdFx0Y29uc3QgREVGQVVMVFMgPSB7XG5cdFx0XHRkYjogREVGQVVMVF9EQl9PUFRJT05TLFxuXHRcdFx0cmVhbHRpbWU6IERFRkFVTFRfUkVBTFRJTUVfT1BUSU9OUyxcblx0XHRcdGF1dGg6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX0FVVEhfT1BUSU9OUyksIHt9LCB7IHN0b3JhZ2VLZXk6IGRlZmF1bHRTdG9yYWdlS2V5IH0pLFxuXHRcdFx0Z2xvYmFsOiBERUZBVUxUX0dMT0JBTF9PUFRJT05TXG5cdFx0fTtcblx0XHRjb25zdCBzZXR0aW5ncyA9IGFwcGx5U2V0dGluZ0RlZmF1bHRzKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9LCBERUZBVUxUUyk7XG5cdFx0dGhpcy5zdG9yYWdlS2V5ID0gKF9zZXR0aW5ncyRhdXRoJHN0b3JhZyA9IHNldHRpbmdzLmF1dGguc3RvcmFnZUtleSkgIT09IG51bGwgJiYgX3NldHRpbmdzJGF1dGgkc3RvcmFnICE9PSB2b2lkIDAgPyBfc2V0dGluZ3MkYXV0aCRzdG9yYWcgOiBcIlwiO1xuXHRcdHRoaXMuaGVhZGVycyA9IChfc2V0dGluZ3MkZ2xvYmFsJGhlYWQgPSBzZXR0aW5ncy5nbG9iYWwuaGVhZGVycykgIT09IG51bGwgJiYgX3NldHRpbmdzJGdsb2JhbCRoZWFkICE9PSB2b2lkIDAgPyBfc2V0dGluZ3MkZ2xvYmFsJGhlYWQgOiB7fTtcblx0XHRpZiAoIXNldHRpbmdzLmFjY2Vzc1Rva2VuKSB7XG5cdFx0XHR2YXIgX3NldHRpbmdzJGF1dGg7XG5cdFx0XHR0aGlzLmF1dGggPSB0aGlzLl9pbml0U3VwYWJhc2VBdXRoQ2xpZW50KChfc2V0dGluZ3MkYXV0aCA9IHNldHRpbmdzLmF1dGgpICE9PSBudWxsICYmIF9zZXR0aW5ncyRhdXRoICE9PSB2b2lkIDAgPyBfc2V0dGluZ3MkYXV0aCA6IHt9LCB0aGlzLmhlYWRlcnMsIHNldHRpbmdzLmdsb2JhbC5mZXRjaCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYWNjZXNzVG9rZW4gPSBzZXR0aW5ncy5hY2Nlc3NUb2tlbjtcblx0XHRcdHRoaXMuYXV0aCA9IG5ldyBQcm94eSh7fSwgeyBnZXQ6IChfLCBwcm9wKSA9PiB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL3N1cGFiYXNlLWpzOiBTdXBhYmFzZSBDbGllbnQgaXMgY29uZmlndXJlZCB3aXRoIHRoZSBhY2Nlc3NUb2tlbiBvcHRpb24sIGFjY2Vzc2luZyBzdXBhYmFzZS5hdXRoLiR7U3RyaW5nKHByb3ApfSBpcyBub3QgcG9zc2libGVgKTtcblx0XHRcdH0gfSk7XG5cdFx0fVxuXHRcdHRoaXMuZmV0Y2ggPSBmZXRjaFdpdGhBdXRoKHN1cGFiYXNlS2V5LCB0aGlzLl9nZXRBY2Nlc3NUb2tlbi5iaW5kKHRoaXMpLCBzZXR0aW5ncy5nbG9iYWwuZmV0Y2gpO1xuXHRcdHRoaXMucmVhbHRpbWUgPSB0aGlzLl9pbml0UmVhbHRpbWVDbGllbnQoX29iamVjdFNwcmVhZDIoe1xuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0YWNjZXNzVG9rZW46IHRoaXMuX2dldEFjY2Vzc1Rva2VuLmJpbmQodGhpcylcblx0XHR9LCBzZXR0aW5ncy5yZWFsdGltZSkpO1xuXHRcdGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB0aGlzLmFjY2Vzc1Rva2VuKCkudGhlbigodG9rZW4pID0+IHRoaXMucmVhbHRpbWUuc2V0QXV0aCh0b2tlbikpLmNhdGNoKChlKSA9PiBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gc2V0IGluaXRpYWwgUmVhbHRpbWUgYXV0aCB0b2tlbjpcIiwgZSkpO1xuXHRcdHRoaXMucmVzdCA9IG5ldyBQb3N0Z3Jlc3RDbGllbnQobmV3IFVSTChcInJlc3QvdjFcIiwgYmFzZVVybCkuaHJlZiwge1xuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0c2NoZW1hOiBzZXR0aW5ncy5kYi5zY2hlbWEsXG5cdFx0XHRmZXRjaDogdGhpcy5mZXRjaFxuXHRcdH0pO1xuXHRcdHRoaXMuc3RvcmFnZSA9IG5ldyBTdG9yYWdlQ2xpZW50KHRoaXMuc3RvcmFnZVVybC5ocmVmLCB0aGlzLmhlYWRlcnMsIHRoaXMuZmV0Y2gsIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zdG9yYWdlKTtcblx0XHRpZiAoIXNldHRpbmdzLmFjY2Vzc1Rva2VuKSB0aGlzLl9saXN0ZW5Gb3JBdXRoRXZlbnRzKCk7XG5cdH1cblx0LyoqXG5cdCogU3VwYWJhc2UgRnVuY3Rpb25zIGFsbG93cyB5b3UgdG8gZGVwbG95IGFuZCBpbnZva2UgZWRnZSBmdW5jdGlvbnMuXG5cdCovXG5cdGdldCBmdW5jdGlvbnMoKSB7XG5cdFx0cmV0dXJuIG5ldyBGdW5jdGlvbnNDbGllbnQodGhpcy5mdW5jdGlvbnNVcmwuaHJlZiwge1xuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0Y3VzdG9tRmV0Y2g6IHRoaXMuZmV0Y2hcblx0XHR9KTtcblx0fVxuXHQvKipcblx0KiBQZXJmb3JtIGEgcXVlcnkgb24gYSB0YWJsZSBvciBhIHZpZXcuXG5cdCpcblx0KiBAcGFyYW0gcmVsYXRpb24gLSBUaGUgdGFibGUgb3IgdmlldyBuYW1lIHRvIHF1ZXJ5XG5cdCovXG5cdGZyb20ocmVsYXRpb24pIHtcblx0XHRyZXR1cm4gdGhpcy5yZXN0LmZyb20ocmVsYXRpb24pO1xuXHR9XG5cdC8qKlxuXHQqIFNlbGVjdCBhIHNjaGVtYSB0byBxdWVyeSBvciBwZXJmb3JtIGFuIGZ1bmN0aW9uIChycGMpIGNhbGwuXG5cdCpcblx0KiBUaGUgc2NoZW1hIG5lZWRzIHRvIGJlIG9uIHRoZSBsaXN0IG9mIGV4cG9zZWQgc2NoZW1hcyBpbnNpZGUgU3VwYWJhc2UuXG5cdCpcblx0KiBAcGFyYW0gc2NoZW1hIC0gVGhlIHNjaGVtYSB0byBxdWVyeVxuXHQqL1xuXHRzY2hlbWEoc2NoZW1hKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVzdC5zY2hlbWEoc2NoZW1hKTtcblx0fVxuXHQvKipcblx0KiBQZXJmb3JtIGEgZnVuY3Rpb24gY2FsbC5cblx0KlxuXHQqIEBwYXJhbSBmbiAtIFRoZSBmdW5jdGlvbiBuYW1lIHRvIGNhbGxcblx0KiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gY2FsbFxuXHQqIEBwYXJhbSBvcHRpb25zIC0gTmFtZWQgcGFyYW1ldGVyc1xuXHQqIEBwYXJhbSBvcHRpb25zLmhlYWQgLSBXaGVuIHNldCB0byBgdHJ1ZWAsIGBkYXRhYCB3aWxsIG5vdCBiZSByZXR1cm5lZC5cblx0KiBVc2VmdWwgaWYgeW91IG9ubHkgbmVlZCB0aGUgY291bnQuXG5cdCogQHBhcmFtIG9wdGlvbnMuZ2V0IC0gV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aFxuXHQqIHJlYWQtb25seSBhY2Nlc3MgbW9kZS5cblx0KiBAcGFyYW0gb3B0aW9ucy5jb3VudCAtIENvdW50IGFsZ29yaXRobSB0byB1c2UgdG8gY291bnQgcm93cyByZXR1cm5lZCBieSB0aGVcblx0KiBmdW5jdGlvbi4gT25seSBhcHBsaWNhYmxlIGZvciBbc2V0LXJldHVybmluZ1xuXHQqIGZ1bmN0aW9uc10oaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L2Z1bmN0aW9ucy1zcmYuaHRtbCkuXG5cdCpcblx0KiBgXCJleGFjdFwiYDogRXhhY3QgYnV0IHNsb3cgY291bnQgYWxnb3JpdGhtLiBQZXJmb3JtcyBhIGBDT1VOVCgqKWAgdW5kZXIgdGhlXG5cdCogaG9vZC5cblx0KlxuXHQqIGBcInBsYW5uZWRcImA6IEFwcHJveGltYXRlZCBidXQgZmFzdCBjb3VudCBhbGdvcml0aG0uIFVzZXMgdGhlIFBvc3RncmVzXG5cdCogc3RhdGlzdGljcyB1bmRlciB0aGUgaG9vZC5cblx0KlxuXHQqIGBcImVzdGltYXRlZFwiYDogVXNlcyBleGFjdCBjb3VudCBmb3IgbG93IG51bWJlcnMgYW5kIHBsYW5uZWQgY291bnQgZm9yIGhpZ2hcblx0KiBudW1iZXJzLlxuXHQqL1xuXHRycGMoZm4sIGFyZ3MgPSB7fSwgb3B0aW9ucyA9IHtcblx0XHRoZWFkOiBmYWxzZSxcblx0XHRnZXQ6IGZhbHNlLFxuXHRcdGNvdW50OiB2b2lkIDBcblx0fSkge1xuXHRcdHJldHVybiB0aGlzLnJlc3QucnBjKGZuLCBhcmdzLCBvcHRpb25zKTtcblx0fVxuXHQvKipcblx0KiBDcmVhdGVzIGEgUmVhbHRpbWUgY2hhbm5lbCB3aXRoIEJyb2FkY2FzdCwgUHJlc2VuY2UsIGFuZCBQb3N0Z3JlcyBDaGFuZ2VzLlxuXHQqXG5cdCogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgUmVhbHRpbWUgY2hhbm5lbC5cblx0KiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIFJlYWx0aW1lIGNoYW5uZWwuXG5cdCpcblx0Ki9cblx0Y2hhbm5lbChuYW1lLCBvcHRzID0geyBjb25maWc6IHt9IH0pIHtcblx0XHRyZXR1cm4gdGhpcy5yZWFsdGltZS5jaGFubmVsKG5hbWUsIG9wdHMpO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybnMgYWxsIFJlYWx0aW1lIGNoYW5uZWxzLlxuXHQqL1xuXHRnZXRDaGFubmVscygpIHtcblx0XHRyZXR1cm4gdGhpcy5yZWFsdGltZS5nZXRDaGFubmVscygpO1xuXHR9XG5cdC8qKlxuXHQqIFVuc3Vic2NyaWJlcyBhbmQgcmVtb3ZlcyBSZWFsdGltZSBjaGFubmVsIGZyb20gUmVhbHRpbWUgY2xpZW50LlxuXHQqXG5cdCogQHBhcmFtIHtSZWFsdGltZUNoYW5uZWx9IGNoYW5uZWwgLSBUaGUgbmFtZSBvZiB0aGUgUmVhbHRpbWUgY2hhbm5lbC5cblx0KlxuXHQqL1xuXHRyZW1vdmVDaGFubmVsKGNoYW5uZWwpIHtcblx0XHRyZXR1cm4gdGhpcy5yZWFsdGltZS5yZW1vdmVDaGFubmVsKGNoYW5uZWwpO1xuXHR9XG5cdC8qKlxuXHQqIFVuc3Vic2NyaWJlcyBhbmQgcmVtb3ZlcyBhbGwgUmVhbHRpbWUgY2hhbm5lbHMgZnJvbSBSZWFsdGltZSBjbGllbnQuXG5cdCovXG5cdHJlbW92ZUFsbENoYW5uZWxzKCkge1xuXHRcdHJldHVybiB0aGlzLnJlYWx0aW1lLnJlbW92ZUFsbENoYW5uZWxzKCk7XG5cdH1cblx0YXN5bmMgX2dldEFjY2Vzc1Rva2VuKCkge1xuXHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cdFx0dmFyIF9kYXRhJHNlc3Npb24kYWNjZXNzXywgX2RhdGEkc2Vzc2lvbjtcblx0XHRpZiAoX3RoaXMuYWNjZXNzVG9rZW4pIHJldHVybiBhd2FpdCBfdGhpcy5hY2Nlc3NUb2tlbigpO1xuXHRcdGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgX3RoaXMuYXV0aC5nZXRTZXNzaW9uKCk7XG5cdFx0cmV0dXJuIChfZGF0YSRzZXNzaW9uJGFjY2Vzc18gPSAoX2RhdGEkc2Vzc2lvbiA9IGRhdGEuc2Vzc2lvbikgPT09IG51bGwgfHwgX2RhdGEkc2Vzc2lvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RhdGEkc2Vzc2lvbi5hY2Nlc3NfdG9rZW4pICE9PSBudWxsICYmIF9kYXRhJHNlc3Npb24kYWNjZXNzXyAhPT0gdm9pZCAwID8gX2RhdGEkc2Vzc2lvbiRhY2Nlc3NfIDogX3RoaXMuc3VwYWJhc2VLZXk7XG5cdH1cblx0X2luaXRTdXBhYmFzZUF1dGhDbGllbnQoeyBhdXRvUmVmcmVzaFRva2VuLCBwZXJzaXN0U2Vzc2lvbiwgZGV0ZWN0U2Vzc2lvbkluVXJsLCBzdG9yYWdlLCB1c2VyU3RvcmFnZSwgc3RvcmFnZUtleSwgZmxvd1R5cGUsIGxvY2ssIGRlYnVnLCB0aHJvd09uRXJyb3IgfSwgaGVhZGVycywgZmV0Y2gkMSkge1xuXHRcdGNvbnN0IGF1dGhIZWFkZXJzID0ge1xuXHRcdFx0QXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuc3VwYWJhc2VLZXl9YCxcblx0XHRcdGFwaWtleTogYCR7dGhpcy5zdXBhYmFzZUtleX1gXG5cdFx0fTtcblx0XHRyZXR1cm4gbmV3IFN1cGFiYXNlQXV0aENsaWVudCh7XG5cdFx0XHR1cmw6IHRoaXMuYXV0aFVybC5ocmVmLFxuXHRcdFx0aGVhZGVyczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGF1dGhIZWFkZXJzKSwgaGVhZGVycyksXG5cdFx0XHRzdG9yYWdlS2V5LFxuXHRcdFx0YXV0b1JlZnJlc2hUb2tlbixcblx0XHRcdHBlcnNpc3RTZXNzaW9uLFxuXHRcdFx0ZGV0ZWN0U2Vzc2lvbkluVXJsLFxuXHRcdFx0c3RvcmFnZSxcblx0XHRcdHVzZXJTdG9yYWdlLFxuXHRcdFx0Zmxvd1R5cGUsXG5cdFx0XHRsb2NrLFxuXHRcdFx0ZGVidWcsXG5cdFx0XHR0aHJvd09uRXJyb3IsXG5cdFx0XHRmZXRjaDogZmV0Y2gkMSxcblx0XHRcdGhhc0N1c3RvbUF1dGhvcml6YXRpb25IZWFkZXI6IE9iamVjdC5rZXlzKHRoaXMuaGVhZGVycykuc29tZSgoa2V5KSA9PiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gXCJhdXRob3JpemF0aW9uXCIpXG5cdFx0fSk7XG5cdH1cblx0X2luaXRSZWFsdGltZUNsaWVudChvcHRpb25zKSB7XG5cdFx0cmV0dXJuIG5ldyBSZWFsdGltZUNsaWVudCh0aGlzLnJlYWx0aW1lVXJsLmhyZWYsIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHsgcGFyYW1zOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgeyBhcGlrZXk6IHRoaXMuc3VwYWJhc2VLZXkgfSksIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wYXJhbXMpIH0pKTtcblx0fVxuXHRfbGlzdGVuRm9yQXV0aEV2ZW50cygpIHtcblx0XHRyZXR1cm4gdGhpcy5hdXRoLm9uQXV0aFN0YXRlQ2hhbmdlKChldmVudCwgc2Vzc2lvbikgPT4ge1xuXHRcdFx0dGhpcy5faGFuZGxlVG9rZW5DaGFuZ2VkKGV2ZW50LCBcIkNMSUVOVFwiLCBzZXNzaW9uID09PSBudWxsIHx8IHNlc3Npb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlc3Npb24uYWNjZXNzX3Rva2VuKTtcblx0XHR9KTtcblx0fVxuXHRfaGFuZGxlVG9rZW5DaGFuZ2VkKGV2ZW50LCBzb3VyY2UsIHRva2VuKSB7XG5cdFx0aWYgKChldmVudCA9PT0gXCJUT0tFTl9SRUZSRVNIRURcIiB8fCBldmVudCA9PT0gXCJTSUdORURfSU5cIikgJiYgdGhpcy5jaGFuZ2VkQWNjZXNzVG9rZW4gIT09IHRva2VuKSB7XG5cdFx0XHR0aGlzLmNoYW5nZWRBY2Nlc3NUb2tlbiA9IHRva2VuO1xuXHRcdFx0dGhpcy5yZWFsdGltZS5zZXRBdXRoKHRva2VuKTtcblx0XHR9IGVsc2UgaWYgKGV2ZW50ID09PSBcIlNJR05FRF9PVVRcIikge1xuXHRcdFx0dGhpcy5yZWFsdGltZS5zZXRBdXRoKCk7XG5cdFx0XHRpZiAoc291cmNlID09IFwiU1RPUkFHRVwiKSB0aGlzLmF1dGguc2lnbk91dCgpO1xuXHRcdFx0dGhpcy5jaGFuZ2VkQWNjZXNzVG9rZW4gPSB2b2lkIDA7XG5cdFx0fVxuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvaW5kZXgudHNcbi8qKlxuKiBDcmVhdGVzIGEgbmV3IFN1cGFiYXNlIENsaWVudC5cbipcbiogQGV4YW1wbGVcbiogYGBgdHNcbiogaW1wb3J0IHsgY3JlYXRlQ2xpZW50IH0gZnJvbSAnQHN1cGFiYXNlL3N1cGFiYXNlLWpzJ1xuKlxuKiBjb25zdCBzdXBhYmFzZSA9IGNyZWF0ZUNsaWVudCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvJywgJ3B1YmxpYy1hbm9uLWtleScpXG4qIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlLmZyb20oJ3Byb2ZpbGVzJykuc2VsZWN0KCcqJylcbiogYGBgXG4qL1xuY29uc3QgY3JlYXRlQ2xpZW50ID0gKHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwgb3B0aW9ucykgPT4ge1xuXHRyZXR1cm4gbmV3IFN1cGFiYXNlQ2xpZW50KHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwgb3B0aW9ucyk7XG59O1xuZnVuY3Rpb24gc2hvdWxkU2hvd0RlcHJlY2F0aW9uV2FybmluZygpIHtcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBwcm9jZXNzID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG5cdGNvbnN0IHByb2Nlc3NWZXJzaW9uID0gcHJvY2Vzc1tcInZlcnNpb25cIl07XG5cdGlmIChwcm9jZXNzVmVyc2lvbiA9PT0gdm9pZCAwIHx8IHByb2Nlc3NWZXJzaW9uID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cdGNvbnN0IHZlcnNpb25NYXRjaCA9IHByb2Nlc3NWZXJzaW9uLm1hdGNoKC9edihcXGQrKVxcLi8pO1xuXHRpZiAoIXZlcnNpb25NYXRjaCkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gcGFyc2VJbnQodmVyc2lvbk1hdGNoWzFdLCAxMCkgPD0gMTg7XG59XG5pZiAoc2hvdWxkU2hvd0RlcHJlY2F0aW9uV2FybmluZygpKSBjb25zb2xlLndhcm4oXCLimqDvuI8gIE5vZGUuanMgMTggYW5kIGJlbG93IGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIG5vIGxvbmdlciBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIEBzdXBhYmFzZS9zdXBhYmFzZS1qcy4gUGxlYXNlIHVwZ3JhZGUgdG8gTm9kZS5qcyAyMCBvciBsYXRlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHZpc2l0OiBodHRwczovL2dpdGh1Yi5jb20vb3Jncy9zdXBhYmFzZS9kaXNjdXNzaW9ucy8zNzIxN1wiKTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBGdW5jdGlvblJlZ2lvbiwgRnVuY3Rpb25zRXJyb3IsIEZ1bmN0aW9uc0ZldGNoRXJyb3IsIEZ1bmN0aW9uc0h0dHBFcnJvciwgRnVuY3Rpb25zUmVsYXlFcnJvciwgUG9zdGdyZXN0RXJyb3IsIFN1cGFiYXNlQ2xpZW50LCBjcmVhdGVDbGllbnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXAiXSwibmFtZXMiOlsiRnVuY3Rpb25SZWdpb24iLCJGdW5jdGlvbnNDbGllbnQiLCJGdW5jdGlvbnNFcnJvciIsIkZ1bmN0aW9uc0ZldGNoRXJyb3IiLCJGdW5jdGlvbnNIdHRwRXJyb3IiLCJGdW5jdGlvbnNSZWxheUVycm9yIiwiUG9zdGdyZXN0Q2xpZW50IiwiUG9zdGdyZXN0RXJyb3IiLCJSZWFsdGltZUNsaWVudCIsIlN0b3JhZ2VDbGllbnQiLCJBdXRoQ2xpZW50IiwidmVyc2lvbiIsIkpTX0VOViIsIkRlbm8iLCJkb2N1bWVudCIsIm5hdmlnYXRvciIsInByb2R1Y3QiLCJERUZBVUxUX0hFQURFUlMiLCJERUZBVUxUX0dMT0JBTF9PUFRJT05TIiwiaGVhZGVycyIsIkRFRkFVTFRfREJfT1BUSU9OUyIsInNjaGVtYSIsIkRFRkFVTFRfQVVUSF9PUFRJT05TIiwiYXV0b1JlZnJlc2hUb2tlbiIsInBlcnNpc3RTZXNzaW9uIiwiZGV0ZWN0U2Vzc2lvbkluVXJsIiwiZmxvd1R5cGUiLCJERUZBVUxUX1JFQUxUSU1FX09QVElPTlMiLCJfdHlwZW9mIiwibyIsIlN5bWJvbCIsIml0ZXJhdG9yIiwibyQxIiwiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJ0b1ByaW1pdGl2ZSIsInQiLCJyIiwiZSIsImkiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwidG9Qcm9wZXJ0eUtleSIsIl9kZWZpbmVQcm9wZXJ0eSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsInIkMSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQyIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicmVzb2x2ZUZldGNoIiwiY3VzdG9tRmV0Y2giLCJhcmdzIiwiZmV0Y2giLCJyZXNvbHZlSGVhZGVyc0NvbnN0cnVjdG9yIiwiSGVhZGVycyIsImZldGNoV2l0aEF1dGgiLCJzdXBhYmFzZUtleSIsImdldEFjY2Vzc1Rva2VuIiwiZmV0Y2gkMSIsIkhlYWRlcnNDb25zdHJ1Y3RvciIsImlucHV0IiwiaW5pdCIsIl9hd2FpdCRnZXRBY2Nlc3NUb2tlbiIsImFjY2Vzc1Rva2VuIiwiaGFzIiwic2V0IiwiZW5zdXJlVHJhaWxpbmdTbGFzaCIsInVybCIsImVuZHNXaXRoIiwiYXBwbHlTZXR0aW5nRGVmYXVsdHMiLCJvcHRpb25zIiwiZGVmYXVsdHMiLCJfREVGQVVMVF9HTE9CQUxfT1BUSU8iLCJfZ2xvYmFsT3B0aW9ucyRoZWFkZXIiLCJkYiIsImRiT3B0aW9ucyIsImF1dGgiLCJhdXRoT3B0aW9ucyIsInJlYWx0aW1lIiwicmVhbHRpbWVPcHRpb25zIiwiZ2xvYmFsIiwiZ2xvYmFsT3B0aW9ucyIsIkRFRkFVTFRfREJfT1BUSU9OUyQxIiwiREVGQVVMVF9BVVRIX09QVElPTlMkMSIsIkRFRkFVTFRfUkVBTFRJTUVfT1BUSU9OUyQxIiwiREVGQVVMVF9HTE9CQUxfT1BUSU9OUyQxIiwicmVzdWx0Iiwic3RvcmFnZSIsInZhbGlkYXRlU3VwYWJhc2VVcmwiLCJzdXBhYmFzZVVybCIsInRyaW1tZWRVcmwiLCJ0cmltIiwiRXJyb3IiLCJtYXRjaCIsIlVSTCIsIl91bnVzZWQiLCJTdXBhYmFzZUF1dGhDbGllbnQiLCJTdXBhYmFzZUNsaWVudCIsIl9zZXR0aW5ncyRhdXRoJHN0b3JhZyIsIl9zZXR0aW5ncyRnbG9iYWwkaGVhZCIsImJhc2VVcmwiLCJyZWFsdGltZVVybCIsInByb3RvY29sIiwicmVwbGFjZSIsImF1dGhVcmwiLCJzdG9yYWdlVXJsIiwiZnVuY3Rpb25zVXJsIiwiZGVmYXVsdFN0b3JhZ2VLZXkiLCJob3N0bmFtZSIsInNwbGl0IiwiREVGQVVMVFMiLCJzdG9yYWdlS2V5Iiwic2V0dGluZ3MiLCJfc2V0dGluZ3MkYXV0aCIsIl9pbml0U3VwYWJhc2VBdXRoQ2xpZW50IiwiUHJveHkiLCJnZXQiLCJfIiwicHJvcCIsIl9nZXRBY2Nlc3NUb2tlbiIsImJpbmQiLCJfaW5pdFJlYWx0aW1lQ2xpZW50IiwidGhlbiIsInRva2VuIiwic2V0QXV0aCIsImNhdGNoIiwiY29uc29sZSIsIndhcm4iLCJyZXN0IiwiaHJlZiIsIl9saXN0ZW5Gb3JBdXRoRXZlbnRzIiwiZnVuY3Rpb25zIiwiZnJvbSIsInJlbGF0aW9uIiwicnBjIiwiZm4iLCJoZWFkIiwiY291bnQiLCJjaGFubmVsIiwibmFtZSIsIm9wdHMiLCJjb25maWciLCJnZXRDaGFubmVscyIsInJlbW92ZUNoYW5uZWwiLCJyZW1vdmVBbGxDaGFubmVscyIsIl90aGlzIiwiX2RhdGEkc2Vzc2lvbiRhY2Nlc3NfIiwiX2RhdGEkc2Vzc2lvbiIsImRhdGEiLCJnZXRTZXNzaW9uIiwic2Vzc2lvbiIsImFjY2Vzc190b2tlbiIsInVzZXJTdG9yYWdlIiwibG9jayIsImRlYnVnIiwidGhyb3dPbkVycm9yIiwiYXV0aEhlYWRlcnMiLCJBdXRob3JpemF0aW9uIiwiYXBpa2V5IiwiaGFzQ3VzdG9tQXV0aG9yaXphdGlvbkhlYWRlciIsInNvbWUiLCJrZXkiLCJ0b0xvd2VyQ2FzZSIsInBhcmFtcyIsIm9uQXV0aFN0YXRlQ2hhbmdlIiwiZXZlbnQiLCJfaGFuZGxlVG9rZW5DaGFuZ2VkIiwic291cmNlIiwiY2hhbmdlZEFjY2Vzc1Rva2VuIiwic2lnbk91dCIsImNyZWF0ZUNsaWVudCIsInNob3VsZFNob3dEZXByZWNhdGlvbldhcm5pbmciLCJwcm9jZXNzIiwicHJvY2Vzc1ZlcnNpb24iLCJ2ZXJzaW9uTWF0Y2giLCJwYXJzZUludCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@supabase/supabase-js/dist/index.mjs\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-helpers-shared/dist/index.mjs ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BrowserCookieAuthStorageAdapter: () => (/* binding */ BrowserCookieAuthStorageAdapter),\n/* harmony export */ CookieAuthStorageAdapter: () => (/* binding */ CookieAuthStorageAdapter),\n/* harmony export */ DEFAULT_COOKIE_OPTIONS: () => (/* binding */ DEFAULT_COOKIE_OPTIONS),\n/* harmony export */ createSupabaseClient: () => (/* binding */ createSupabaseClient),\n/* harmony export */ isBrowser: () => (/* binding */ isBrowser),\n/* harmony export */ parseCookies: () => (/* binding */ export_parseCookies),\n/* harmony export */ parseSupabaseCookie: () => (/* binding */ parseSupabaseCookie),\n/* harmony export */ serializeCookie: () => (/* binding */ export_serializeCookie),\n/* harmony export */ stringifySupabaseSession: () => (/* binding */ stringifySupabaseSession)\n/* harmony export */ });\n/* harmony import */ var jose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jose */ \"(action-browser)/./node_modules/jose/dist/node/esm/index.js\");\n/* harmony import */ var _supabase_supabase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @supabase/supabase-js */ \"(action-browser)/./node_modules/@supabase/supabase-js/dist/index.mjs\");\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJS = (cb, mod)=>function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = {\n exports: {}\n }).exports, mod), mod.exports;\n };\nvar __copyProps = (to, from, except, desc)=>{\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n get: ()=>from[key],\n enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target)=>(target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(// If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n value: mod,\n enumerable: true\n }) : target, mod));\n// ../../node_modules/.pnpm/cookie@0.5.0/node_modules/cookie/index.js\nvar require_cookie = __commonJS({\n \"../../node_modules/.pnpm/cookie@0.5.0/node_modules/cookie/index.js\" (exports) {\n \"use strict\";\n exports.parse = parse3;\n exports.serialize = serialize3;\n var __toString = Object.prototype.toString;\n var fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n function parse3(str, options) {\n if (typeof str !== \"string\") {\n throw new TypeError(\"argument str must be a string\");\n }\n var obj = {};\n var opt = options || {};\n var dec = opt.decode || decode;\n var index = 0;\n while(index < str.length){\n var eqIdx = str.indexOf(\"=\", index);\n if (eqIdx === -1) {\n break;\n }\n var endIdx = str.indexOf(\";\", index);\n if (endIdx === -1) {\n endIdx = str.length;\n } else if (endIdx < eqIdx) {\n index = str.lastIndexOf(\";\", eqIdx - 1) + 1;\n continue;\n }\n var key = str.slice(index, eqIdx).trim();\n if (void 0 === obj[key]) {\n var val = str.slice(eqIdx + 1, endIdx).trim();\n if (val.charCodeAt(0) === 34) {\n val = val.slice(1, -1);\n }\n obj[key] = tryDecode(val, dec);\n }\n index = endIdx + 1;\n }\n return obj;\n }\n function serialize3(name, val, options) {\n var opt = options || {};\n var enc = opt.encode || encode;\n if (typeof enc !== \"function\") {\n throw new TypeError(\"option encode is invalid\");\n }\n if (!fieldContentRegExp.test(name)) {\n throw new TypeError(\"argument name is invalid\");\n }\n var value = enc(val);\n if (value && !fieldContentRegExp.test(value)) {\n throw new TypeError(\"argument val is invalid\");\n }\n var str = name + \"=\" + value;\n if (null != opt.maxAge) {\n var maxAge = opt.maxAge - 0;\n if (isNaN(maxAge) || !isFinite(maxAge)) {\n throw new TypeError(\"option maxAge is invalid\");\n }\n str += \"; Max-Age=\" + Math.floor(maxAge);\n }\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) {\n throw new TypeError(\"option domain is invalid\");\n }\n str += \"; Domain=\" + opt.domain;\n }\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) {\n throw new TypeError(\"option path is invalid\");\n }\n str += \"; Path=\" + opt.path;\n }\n if (opt.expires) {\n var expires = opt.expires;\n if (!isDate(expires) || isNaN(expires.valueOf())) {\n throw new TypeError(\"option expires is invalid\");\n }\n str += \"; Expires=\" + expires.toUTCString();\n }\n if (opt.httpOnly) {\n str += \"; HttpOnly\";\n }\n if (opt.secure) {\n str += \"; Secure\";\n }\n if (opt.priority) {\n var priority = typeof opt.priority === \"string\" ? opt.priority.toLowerCase() : opt.priority;\n switch(priority){\n case \"low\":\n str += \"; Priority=Low\";\n break;\n case \"medium\":\n str += \"; Priority=Medium\";\n break;\n case \"high\":\n str += \"; Priority=High\";\n break;\n default:\n throw new TypeError(\"option priority is invalid\");\n }\n }\n if (opt.sameSite) {\n var sameSite = typeof opt.sameSite === \"string\" ? opt.sameSite.toLowerCase() : opt.sameSite;\n switch(sameSite){\n case true:\n str += \"; SameSite=Strict\";\n break;\n case \"lax\":\n str += \"; SameSite=Lax\";\n break;\n case \"strict\":\n str += \"; SameSite=Strict\";\n break;\n case \"none\":\n str += \"; SameSite=None\";\n break;\n default:\n throw new TypeError(\"option sameSite is invalid\");\n }\n }\n return str;\n }\n function decode(str) {\n return str.indexOf(\"%\") !== -1 ? decodeURIComponent(str) : str;\n }\n function encode(val) {\n return encodeURIComponent(val);\n }\n function isDate(val) {\n return __toString.call(val) === \"[object Date]\" || val instanceof Date;\n }\n function tryDecode(str, decode2) {\n try {\n return decode2(str);\n } catch (e) {\n return str;\n }\n }\n }\n});\n// src/browserCookieStorage.ts\nvar import_cookie2 = __toESM(require_cookie());\n// src/utils/cookies.ts\nvar import_cookie = __toESM(require_cookie());\n\nfunction parseSupabaseCookie(str) {\n if (!str) {\n return null;\n }\n try {\n const session = JSON.parse(str);\n if (!session) {\n return null;\n }\n if (session.constructor.name === \"Object\") {\n return session;\n }\n if (session.constructor.name !== \"Array\") {\n throw new Error(`Unexpected format: ${session.constructor.name}`);\n }\n const [_header, payloadStr, _signature] = session[0].split(\".\");\n const payload = jose__WEBPACK_IMPORTED_MODULE_0__.base64url.decode(payloadStr);\n const decoder = new TextDecoder();\n const { exp, sub, ...user } = JSON.parse(decoder.decode(payload));\n return {\n expires_at: exp,\n expires_in: exp - Math.round(Date.now() / 1e3),\n token_type: \"bearer\",\n access_token: session[0],\n refresh_token: session[1],\n provider_token: session[2],\n provider_refresh_token: session[3],\n user: {\n id: sub,\n factors: session[4],\n ...user\n }\n };\n } catch (err) {\n console.warn(\"Failed to parse cookie string:\", err);\n return null;\n }\n}\nfunction stringifySupabaseSession(session) {\n var _a;\n return JSON.stringify([\n session.access_token,\n session.refresh_token,\n session.provider_token,\n session.provider_refresh_token,\n ((_a = session.user) == null ? void 0 : _a.factors) ?? null\n ]);\n}\n// src/utils/helpers.ts\nfunction isBrowser() {\n return false && 0;\n}\n// src/utils/constants.ts\nvar DEFAULT_COOKIE_OPTIONS = {\n path: \"/\",\n sameSite: \"lax\",\n maxAge: 60 * 60 * 24 * 365 * 1e3\n};\n// src/chunker.ts\nfunction createChunkRegExp(chunkSize) {\n return new RegExp(\".{1,\" + chunkSize + \"}\", \"g\");\n}\nvar MAX_CHUNK_SIZE = 3180;\nvar MAX_CHUNK_REGEXP = createChunkRegExp(MAX_CHUNK_SIZE);\nfunction createChunks(key, value, chunkSize) {\n const re = chunkSize !== void 0 ? createChunkRegExp(chunkSize) : MAX_CHUNK_REGEXP;\n const chunkCount = Math.ceil(value.length / (chunkSize ?? MAX_CHUNK_SIZE));\n if (chunkCount === 1) {\n return [\n {\n name: key,\n value\n }\n ];\n }\n const chunks = [];\n const values = value.match(re);\n values == null ? void 0 : values.forEach((value2, i)=>{\n const name = `${key}.${i}`;\n chunks.push({\n name,\n value: value2\n });\n });\n return chunks;\n}\nfunction combineChunks(key, retrieveChunk = ()=>{\n return null;\n}) {\n let values = [];\n for(let i = 0;; i++){\n const chunkName = `${key}.${i}`;\n const chunk = retrieveChunk(chunkName);\n if (!chunk) {\n break;\n }\n values.push(chunk);\n }\n return values.length ? values.join(\"\") : null;\n}\n// src/cookieAuthStorageAdapter.ts\nvar CookieAuthStorageAdapter = class {\n constructor(cookieOptions){\n this.cookieOptions = {\n ...DEFAULT_COOKIE_OPTIONS,\n ...cookieOptions,\n maxAge: DEFAULT_COOKIE_OPTIONS.maxAge\n };\n }\n getItem(key) {\n const value = this.getCookie(key);\n if (key.endsWith(\"-code-verifier\") && value) {\n return value;\n }\n if (value) {\n return JSON.stringify(parseSupabaseCookie(value));\n }\n const chunks = combineChunks(key, (chunkName)=>{\n return this.getCookie(chunkName);\n });\n return chunks !== null ? JSON.stringify(parseSupabaseCookie(chunks)) : null;\n }\n setItem(key, value) {\n if (key.endsWith(\"-code-verifier\")) {\n this.setCookie(key, value);\n return;\n }\n let session = JSON.parse(value);\n const sessionStr = stringifySupabaseSession(session);\n const sessionChunks = createChunks(key, sessionStr);\n sessionChunks.forEach((sess)=>{\n this.setCookie(sess.name, sess.value);\n });\n }\n removeItem(key) {\n this._deleteSingleCookie(key);\n this._deleteChunkedCookies(key);\n }\n _deleteSingleCookie(key) {\n if (this.getCookie(key)) {\n this.deleteCookie(key);\n }\n }\n _deleteChunkedCookies(key, from = 0) {\n for(let i = from;; i++){\n const cookieName = `${key}.${i}`;\n const value = this.getCookie(cookieName);\n if (value === void 0) {\n break;\n }\n this.deleteCookie(cookieName);\n }\n }\n};\n// src/browserCookieStorage.ts\nvar BrowserCookieAuthStorageAdapter = class extends CookieAuthStorageAdapter {\n constructor(cookieOptions){\n super(cookieOptions);\n }\n getCookie(name) {\n if (!isBrowser()) return null;\n const cookies = (0, import_cookie2.parse)(document.cookie);\n return cookies[name];\n }\n setCookie(name, value) {\n if (!isBrowser()) return null;\n document.cookie = (0, import_cookie2.serialize)(name, value, {\n ...this.cookieOptions,\n httpOnly: false\n });\n }\n deleteCookie(name) {\n if (!isBrowser()) return null;\n document.cookie = (0, import_cookie2.serialize)(name, \"\", {\n ...this.cookieOptions,\n maxAge: 0,\n httpOnly: false\n });\n }\n};\n// src/createClient.ts\n\nfunction createSupabaseClient(supabaseUrl, supabaseKey, options) {\n var _a;\n const browser = isBrowser();\n return (0,_supabase_supabase_js__WEBPACK_IMPORTED_MODULE_1__.createClient)(supabaseUrl, supabaseKey, {\n ...options,\n auth: {\n flowType: \"pkce\",\n autoRefreshToken: browser,\n detectSessionInUrl: browser,\n persistSession: true,\n storage: options.auth.storage,\n // fix this in supabase-js\n ...((_a = options.auth) == null ? void 0 : _a.storageKey) ? {\n storageKey: options.auth.storageKey\n } : {}\n }\n });\n}\nvar export_parseCookies = import_cookie.parse;\nvar export_serializeCookie = import_cookie.serialize;\n /*! Bundled license information:\n\ncookie/index.js:\n (*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n *)\n*/ //# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvYXV0aC1oZWxwZXJzLXNoYXJlZC9kaXN0L2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLElBQUlBLFdBQVdDLE9BQU9DLE1BQU07QUFDNUIsSUFBSUMsWUFBWUYsT0FBT0csY0FBYztBQUNyQyxJQUFJQyxtQkFBbUJKLE9BQU9LLHdCQUF3QjtBQUN0RCxJQUFJQyxvQkFBb0JOLE9BQU9PLG1CQUFtQjtBQUNsRCxJQUFJQyxlQUFlUixPQUFPUyxjQUFjO0FBQ3hDLElBQUlDLGVBQWVWLE9BQU9XLFNBQVMsQ0FBQ0MsY0FBYztBQUNsRCxJQUFJQyxhQUFhLENBQUNDLElBQUlDLE1BQVEsU0FBU0M7UUFDckMsT0FBT0QsT0FBTyxDQUFDLEdBQUdELEVBQUUsQ0FBQ1Isa0JBQWtCUSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQ0MsTUFBTTtZQUFFRSxTQUFTLENBQUM7UUFBRSxHQUFHQSxPQUFPLEVBQUVGLE1BQU1BLElBQUlFLE9BQU87SUFDcEc7QUFDQSxJQUFJQyxjQUFjLENBQUNDLElBQUlDLE1BQU1DLFFBQVFDO0lBQ25DLElBQUlGLFFBQVEsT0FBT0EsU0FBUyxZQUFZLE9BQU9BLFNBQVMsWUFBWTtRQUNsRSxLQUFLLElBQUlHLE9BQU9qQixrQkFBa0JjLE1BQ2hDLElBQUksQ0FBQ1YsYUFBYWMsSUFBSSxDQUFDTCxJQUFJSSxRQUFRQSxRQUFRRixRQUN6Q25CLFVBQVVpQixJQUFJSSxLQUFLO1lBQUVFLEtBQUssSUFBTUwsSUFBSSxDQUFDRyxJQUFJO1lBQUVHLFlBQVksQ0FBRUosQ0FBQUEsT0FBT2xCLGlCQUFpQmdCLE1BQU1HLElBQUcsS0FBTUQsS0FBS0ksVUFBVTtRQUFDO0lBQ3RIO0lBQ0EsT0FBT1A7QUFDVDtBQUNBLElBQUlRLFVBQVUsQ0FBQ1osS0FBS2EsWUFBWUMsU0FBWUEsQ0FBQUEsU0FBU2QsT0FBTyxPQUFPaEIsU0FBU1MsYUFBYU8sUUFBUSxDQUFDLEdBQUdHLFlBQ25HLHNFQUFzRTtJQUN0RSxpRUFBaUU7SUFDakUsc0VBQXNFO0lBQ3RFLHFFQUFxRTtJQUNyRVUsY0FBYyxDQUFDYixPQUFPLENBQUNBLElBQUllLFVBQVUsR0FBRzVCLFVBQVUyQixRQUFRLFdBQVc7UUFBRUUsT0FBT2hCO1FBQUtXLFlBQVk7SUFBSyxLQUFLRyxRQUN6R2QsSUFDRjtBQUVBLHFFQUFxRTtBQUNyRSxJQUFJaUIsaUJBQWlCbkIsV0FBVztJQUM5QixzRUFBcUVJLE9BQU87UUFDMUU7UUFDQUEsUUFBUWdCLEtBQUssR0FBR0M7UUFDaEJqQixRQUFRa0IsU0FBUyxHQUFHQztRQUNwQixJQUFJQyxhQUFhckMsT0FBT1csU0FBUyxDQUFDMkIsUUFBUTtRQUMxQyxJQUFJQyxxQkFBcUI7UUFDekIsU0FBU0wsT0FBT00sR0FBRyxFQUFFQyxPQUFPO1lBQzFCLElBQUksT0FBT0QsUUFBUSxVQUFVO2dCQUMzQixNQUFNLElBQUlFLFVBQVU7WUFDdEI7WUFDQSxJQUFJQyxNQUFNLENBQUM7WUFDWCxJQUFJQyxNQUFNSCxXQUFXLENBQUM7WUFDdEIsSUFBSUksTUFBTUQsSUFBSUUsTUFBTSxJQUFJQTtZQUN4QixJQUFJQyxRQUFRO1lBQ1osTUFBT0EsUUFBUVAsSUFBSVEsTUFBTSxDQUFFO2dCQUN6QixJQUFJQyxRQUFRVCxJQUFJVSxPQUFPLENBQUMsS0FBS0g7Z0JBQzdCLElBQUlFLFVBQVUsQ0FBQyxHQUFHO29CQUNoQjtnQkFDRjtnQkFDQSxJQUFJRSxTQUFTWCxJQUFJVSxPQUFPLENBQUMsS0FBS0g7Z0JBQzlCLElBQUlJLFdBQVcsQ0FBQyxHQUFHO29CQUNqQkEsU0FBU1gsSUFBSVEsTUFBTTtnQkFDckIsT0FBTyxJQUFJRyxTQUFTRixPQUFPO29CQUN6QkYsUUFBUVAsSUFBSVksV0FBVyxDQUFDLEtBQUtILFFBQVEsS0FBSztvQkFDMUM7Z0JBQ0Y7Z0JBQ0EsSUFBSTFCLE1BQU1pQixJQUFJYSxLQUFLLENBQUNOLE9BQU9FLE9BQU9LLElBQUk7Z0JBQ3RDLElBQUksS0FBSyxNQUFNWCxHQUFHLENBQUNwQixJQUFJLEVBQUU7b0JBQ3ZCLElBQUlnQyxNQUFNZixJQUFJYSxLQUFLLENBQUNKLFFBQVEsR0FBR0UsUUFBUUcsSUFBSTtvQkFDM0MsSUFBSUMsSUFBSUMsVUFBVSxDQUFDLE9BQU8sSUFBSTt3QkFDNUJELE1BQU1BLElBQUlGLEtBQUssQ0FBQyxHQUFHLENBQUM7b0JBQ3RCO29CQUNBVixHQUFHLENBQUNwQixJQUFJLEdBQUdrQyxVQUFVRixLQUFLVjtnQkFDNUI7Z0JBQ0FFLFFBQVFJLFNBQVM7WUFDbkI7WUFDQSxPQUFPUjtRQUNUO1FBQ0EsU0FBU1AsV0FBV3NCLElBQUksRUFBRUgsR0FBRyxFQUFFZCxPQUFPO1lBQ3BDLElBQUlHLE1BQU1ILFdBQVcsQ0FBQztZQUN0QixJQUFJa0IsTUFBTWYsSUFBSWdCLE1BQU0sSUFBSUE7WUFDeEIsSUFBSSxPQUFPRCxRQUFRLFlBQVk7Z0JBQzdCLE1BQU0sSUFBSWpCLFVBQVU7WUFDdEI7WUFDQSxJQUFJLENBQUNILG1CQUFtQnNCLElBQUksQ0FBQ0gsT0FBTztnQkFDbEMsTUFBTSxJQUFJaEIsVUFBVTtZQUN0QjtZQUNBLElBQUlYLFFBQVE0QixJQUFJSjtZQUNoQixJQUFJeEIsU0FBUyxDQUFDUSxtQkFBbUJzQixJQUFJLENBQUM5QixRQUFRO2dCQUM1QyxNQUFNLElBQUlXLFVBQVU7WUFDdEI7WUFDQSxJQUFJRixNQUFNa0IsT0FBTyxNQUFNM0I7WUFDdkIsSUFBSSxRQUFRYSxJQUFJa0IsTUFBTSxFQUFFO2dCQUN0QixJQUFJQSxTQUFTbEIsSUFBSWtCLE1BQU0sR0FBRztnQkFDMUIsSUFBSUMsTUFBTUQsV0FBVyxDQUFDRSxTQUFTRixTQUFTO29CQUN0QyxNQUFNLElBQUlwQixVQUFVO2dCQUN0QjtnQkFDQUYsT0FBTyxlQUFleUIsS0FBS0MsS0FBSyxDQUFDSjtZQUNuQztZQUNBLElBQUlsQixJQUFJdUIsTUFBTSxFQUFFO2dCQUNkLElBQUksQ0FBQzVCLG1CQUFtQnNCLElBQUksQ0FBQ2pCLElBQUl1QixNQUFNLEdBQUc7b0JBQ3hDLE1BQU0sSUFBSXpCLFVBQVU7Z0JBQ3RCO2dCQUNBRixPQUFPLGNBQWNJLElBQUl1QixNQUFNO1lBQ2pDO1lBQ0EsSUFBSXZCLElBQUl3QixJQUFJLEVBQUU7Z0JBQ1osSUFBSSxDQUFDN0IsbUJBQW1Cc0IsSUFBSSxDQUFDakIsSUFBSXdCLElBQUksR0FBRztvQkFDdEMsTUFBTSxJQUFJMUIsVUFBVTtnQkFDdEI7Z0JBQ0FGLE9BQU8sWUFBWUksSUFBSXdCLElBQUk7WUFDN0I7WUFDQSxJQUFJeEIsSUFBSXlCLE9BQU8sRUFBRTtnQkFDZixJQUFJQSxVQUFVekIsSUFBSXlCLE9BQU87Z0JBQ3pCLElBQUksQ0FBQ0MsT0FBT0QsWUFBWU4sTUFBTU0sUUFBUUUsT0FBTyxLQUFLO29CQUNoRCxNQUFNLElBQUk3QixVQUFVO2dCQUN0QjtnQkFDQUYsT0FBTyxlQUFlNkIsUUFBUUcsV0FBVztZQUMzQztZQUNBLElBQUk1QixJQUFJNkIsUUFBUSxFQUFFO2dCQUNoQmpDLE9BQU87WUFDVDtZQUNBLElBQUlJLElBQUk4QixNQUFNLEVBQUU7Z0JBQ2RsQyxPQUFPO1lBQ1Q7WUFDQSxJQUFJSSxJQUFJK0IsUUFBUSxFQUFFO2dCQUNoQixJQUFJQSxXQUFXLE9BQU8vQixJQUFJK0IsUUFBUSxLQUFLLFdBQVcvQixJQUFJK0IsUUFBUSxDQUFDQyxXQUFXLEtBQUtoQyxJQUFJK0IsUUFBUTtnQkFDM0YsT0FBUUE7b0JBQ04sS0FBSzt3QkFDSG5DLE9BQU87d0JBQ1A7b0JBQ0YsS0FBSzt3QkFDSEEsT0FBTzt3QkFDUDtvQkFDRixLQUFLO3dCQUNIQSxPQUFPO3dCQUNQO29CQUNGO3dCQUNFLE1BQU0sSUFBSUUsVUFBVTtnQkFDeEI7WUFDRjtZQUNBLElBQUlFLElBQUlpQyxRQUFRLEVBQUU7Z0JBQ2hCLElBQUlBLFdBQVcsT0FBT2pDLElBQUlpQyxRQUFRLEtBQUssV0FBV2pDLElBQUlpQyxRQUFRLENBQUNELFdBQVcsS0FBS2hDLElBQUlpQyxRQUFRO2dCQUMzRixPQUFRQTtvQkFDTixLQUFLO3dCQUNIckMsT0FBTzt3QkFDUDtvQkFDRixLQUFLO3dCQUNIQSxPQUFPO3dCQUNQO29CQUNGLEtBQUs7d0JBQ0hBLE9BQU87d0JBQ1A7b0JBQ0YsS0FBSzt3QkFDSEEsT0FBTzt3QkFDUDtvQkFDRjt3QkFDRSxNQUFNLElBQUlFLFVBQVU7Z0JBQ3hCO1lBQ0Y7WUFDQSxPQUFPRjtRQUNUO1FBQ0EsU0FBU00sT0FBT04sR0FBRztZQUNqQixPQUFPQSxJQUFJVSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUk0QixtQkFBbUJ0QyxPQUFPQTtRQUM3RDtRQUNBLFNBQVNvQixPQUFPTCxHQUFHO1lBQ2pCLE9BQU93QixtQkFBbUJ4QjtRQUM1QjtRQUNBLFNBQVNlLE9BQU9mLEdBQUc7WUFDakIsT0FBT2xCLFdBQVdiLElBQUksQ0FBQytCLFNBQVMsbUJBQW1CQSxlQUFleUI7UUFDcEU7UUFDQSxTQUFTdkIsVUFBVWpCLEdBQUcsRUFBRXlDLE9BQU87WUFDN0IsSUFBSTtnQkFDRixPQUFPQSxRQUFRekM7WUFDakIsRUFBRSxPQUFPMEMsR0FBRztnQkFDVixPQUFPMUM7WUFDVDtRQUNGO0lBQ0Y7QUFDRjtBQUVBLDhCQUE4QjtBQUM5QixJQUFJMkMsaUJBQWlCeEQsUUFBUUs7QUFFN0IsdUJBQXVCO0FBQ3ZCLElBQUlvRCxnQkFBZ0J6RCxRQUFRSztBQUNLO0FBQ2pDLFNBQVNzRCxvQkFBb0I5QyxHQUFHO0lBQzlCLElBQUksQ0FBQ0EsS0FBSztRQUNSLE9BQU87SUFDVDtJQUNBLElBQUk7UUFDRixNQUFNK0MsVUFBVUMsS0FBS3ZELEtBQUssQ0FBQ087UUFDM0IsSUFBSSxDQUFDK0MsU0FBUztZQUNaLE9BQU87UUFDVDtRQUNBLElBQUlBLFFBQVFFLFdBQVcsQ0FBQy9CLElBQUksS0FBSyxVQUFVO1lBQ3pDLE9BQU82QjtRQUNUO1FBQ0EsSUFBSUEsUUFBUUUsV0FBVyxDQUFDL0IsSUFBSSxLQUFLLFNBQVM7WUFDeEMsTUFBTSxJQUFJZ0MsTUFBTSxDQUFDLG1CQUFtQixFQUFFSCxRQUFRRSxXQUFXLENBQUMvQixJQUFJLENBQUMsQ0FBQztRQUNsRTtRQUNBLE1BQU0sQ0FBQ2lDLFNBQVNDLFlBQVlDLFdBQVcsR0FBR04sT0FBTyxDQUFDLEVBQUUsQ0FBQ08sS0FBSyxDQUFDO1FBQzNELE1BQU1DLFVBQVVWLDJDQUFTQSxDQUFDdkMsTUFBTSxDQUFDOEM7UUFDakMsTUFBTUksVUFBVSxJQUFJQztRQUNwQixNQUFNLEVBQUVDLEdBQUcsRUFBRUMsR0FBRyxFQUFFLEdBQUdDLE1BQU0sR0FBR1osS0FBS3ZELEtBQUssQ0FBQytELFFBQVFsRCxNQUFNLENBQUNpRDtRQUN4RCxPQUFPO1lBQ0xNLFlBQVlIO1lBQ1pJLFlBQVlKLE1BQU1qQyxLQUFLc0MsS0FBSyxDQUFDdkIsS0FBS3dCLEdBQUcsS0FBSztZQUMxQ0MsWUFBWTtZQUNaQyxjQUFjbkIsT0FBTyxDQUFDLEVBQUU7WUFDeEJvQixlQUFlcEIsT0FBTyxDQUFDLEVBQUU7WUFDekJxQixnQkFBZ0JyQixPQUFPLENBQUMsRUFBRTtZQUMxQnNCLHdCQUF3QnRCLE9BQU8sQ0FBQyxFQUFFO1lBQ2xDYSxNQUFNO2dCQUNKVSxJQUFJWDtnQkFDSlksU0FBU3hCLE9BQU8sQ0FBQyxFQUFFO2dCQUNuQixHQUFHYSxJQUFJO1lBQ1Q7UUFDRjtJQUNGLEVBQUUsT0FBT1ksS0FBSztRQUNaQyxRQUFRQyxJQUFJLENBQUMsa0NBQWtDRjtRQUMvQyxPQUFPO0lBQ1Q7QUFDRjtBQUNBLFNBQVNHLHlCQUF5QjVCLE9BQU87SUFDdkMsSUFBSTZCO0lBQ0osT0FBTzVCLEtBQUs2QixTQUFTLENBQUM7UUFDcEI5QixRQUFRbUIsWUFBWTtRQUNwQm5CLFFBQVFvQixhQUFhO1FBQ3JCcEIsUUFBUXFCLGNBQWM7UUFDdEJyQixRQUFRc0Isc0JBQXNCO1FBQzdCLEVBQUNPLEtBQUs3QixRQUFRYSxJQUFJLEtBQUssT0FBTyxLQUFLLElBQUlnQixHQUFHTCxPQUFPLEtBQUs7S0FDeEQ7QUFDSDtBQUVBLHVCQUF1QjtBQUN2QixTQUFTTztJQUNQLE9BQU8sTUFBNkIsSUFBSSxDQUFzQztBQUNoRjtBQUVBLHlCQUF5QjtBQUN6QixJQUFJRyx5QkFBeUI7SUFDM0JyRCxNQUFNO0lBQ05TLFVBQVU7SUFDVmYsUUFBUSxLQUFLLEtBQUssS0FBSyxNQUFNO0FBQy9CO0FBRUEsaUJBQWlCO0FBQ2pCLFNBQVM0RCxrQkFBa0JDLFNBQVM7SUFDbEMsT0FBTyxJQUFJQyxPQUFPLFNBQVNELFlBQVksS0FBSztBQUM5QztBQUNBLElBQUlFLGlCQUFpQjtBQUNyQixJQUFJQyxtQkFBbUJKLGtCQUFrQkc7QUFDekMsU0FBU0UsYUFBYXhHLEdBQUcsRUFBRVEsS0FBSyxFQUFFNEYsU0FBUztJQUN6QyxNQUFNSyxLQUFLTCxjQUFjLEtBQUssSUFBSUQsa0JBQWtCQyxhQUFhRztJQUNqRSxNQUFNRyxhQUFhaEUsS0FBS2lFLElBQUksQ0FBQ25HLE1BQU1pQixNQUFNLEdBQUkyRSxDQUFBQSxhQUFhRSxjQUFhO0lBQ3ZFLElBQUlJLGVBQWUsR0FBRztRQUNwQixPQUFPO1lBQUM7Z0JBQUV2RSxNQUFNbkM7Z0JBQUtRO1lBQU07U0FBRTtJQUMvQjtJQUNBLE1BQU1vRyxTQUFTLEVBQUU7SUFDakIsTUFBTUMsU0FBU3JHLE1BQU1zRyxLQUFLLENBQUNMO0lBQzNCSSxVQUFVLE9BQU8sS0FBSyxJQUFJQSxPQUFPRSxPQUFPLENBQUMsQ0FBQ0MsUUFBUUM7UUFDaEQsTUFBTTlFLE9BQU8sQ0FBQyxFQUFFbkMsSUFBSSxDQUFDLEVBQUVpSCxFQUFFLENBQUM7UUFDMUJMLE9BQU9NLElBQUksQ0FBQztZQUFFL0U7WUFBTTNCLE9BQU93RztRQUFPO0lBQ3BDO0lBQ0EsT0FBT0o7QUFDVDtBQUNBLFNBQVNPLGNBQWNuSCxHQUFHLEVBQUVvSCxnQkFBZ0I7SUFDMUMsT0FBTztBQUNULENBQUM7SUFDQyxJQUFJUCxTQUFTLEVBQUU7SUFDZixJQUFLLElBQUlJLElBQUksSUFBS0EsSUFBSztRQUNyQixNQUFNSSxZQUFZLENBQUMsRUFBRXJILElBQUksQ0FBQyxFQUFFaUgsRUFBRSxDQUFDO1FBQy9CLE1BQU1LLFFBQVFGLGNBQWNDO1FBQzVCLElBQUksQ0FBQ0MsT0FBTztZQUNWO1FBQ0Y7UUFDQVQsT0FBT0ssSUFBSSxDQUFDSTtJQUNkO0lBQ0EsT0FBT1QsT0FBT3BGLE1BQU0sR0FBR29GLE9BQU9VLElBQUksQ0FBQyxNQUFNO0FBQzNDO0FBRUEsa0NBQWtDO0FBQ2xDLElBQUlDLDJCQUEyQjtJQUM3QnRELFlBQVl1RCxhQUFhLENBQUU7UUFDekIsSUFBSSxDQUFDQSxhQUFhLEdBQUc7WUFDbkIsR0FBR3ZCLHNCQUFzQjtZQUN6QixHQUFHdUIsYUFBYTtZQUNoQmxGLFFBQVEyRCx1QkFBdUIzRCxNQUFNO1FBQ3ZDO0lBQ0Y7SUFDQW1GLFFBQVExSCxHQUFHLEVBQUU7UUFDWCxNQUFNUSxRQUFRLElBQUksQ0FBQ21ILFNBQVMsQ0FBQzNIO1FBQzdCLElBQUlBLElBQUk0SCxRQUFRLENBQUMscUJBQXFCcEgsT0FBTztZQUMzQyxPQUFPQTtRQUNUO1FBQ0EsSUFBSUEsT0FBTztZQUNULE9BQU95RCxLQUFLNkIsU0FBUyxDQUFDL0Isb0JBQW9CdkQ7UUFDNUM7UUFDQSxNQUFNb0csU0FBU08sY0FBY25ILEtBQUssQ0FBQ3FIO1lBQ2pDLE9BQU8sSUFBSSxDQUFDTSxTQUFTLENBQUNOO1FBQ3hCO1FBQ0EsT0FBT1QsV0FBVyxPQUFPM0MsS0FBSzZCLFNBQVMsQ0FBQy9CLG9CQUFvQjZDLFdBQVc7SUFDekU7SUFDQWlCLFFBQVE3SCxHQUFHLEVBQUVRLEtBQUssRUFBRTtRQUNsQixJQUFJUixJQUFJNEgsUUFBUSxDQUFDLG1CQUFtQjtZQUNsQyxJQUFJLENBQUNFLFNBQVMsQ0FBQzlILEtBQUtRO1lBQ3BCO1FBQ0Y7UUFDQSxJQUFJd0QsVUFBVUMsS0FBS3ZELEtBQUssQ0FBQ0Y7UUFDekIsTUFBTXVILGFBQWFuQyx5QkFBeUI1QjtRQUM1QyxNQUFNZ0UsZ0JBQWdCeEIsYUFBYXhHLEtBQUsrSDtRQUN4Q0MsY0FBY2pCLE9BQU8sQ0FBQyxDQUFDa0I7WUFDckIsSUFBSSxDQUFDSCxTQUFTLENBQUNHLEtBQUs5RixJQUFJLEVBQUU4RixLQUFLekgsS0FBSztRQUN0QztJQUNGO0lBQ0EwSCxXQUFXbEksR0FBRyxFQUFFO1FBQ2QsSUFBSSxDQUFDbUksbUJBQW1CLENBQUNuSTtRQUN6QixJQUFJLENBQUNvSSxxQkFBcUIsQ0FBQ3BJO0lBQzdCO0lBQ0FtSSxvQkFBb0JuSSxHQUFHLEVBQUU7UUFDdkIsSUFBSSxJQUFJLENBQUMySCxTQUFTLENBQUMzSCxNQUFNO1lBQ3ZCLElBQUksQ0FBQ3FJLFlBQVksQ0FBQ3JJO1FBQ3BCO0lBQ0Y7SUFDQW9JLHNCQUFzQnBJLEdBQUcsRUFBRUgsT0FBTyxDQUFDLEVBQUU7UUFDbkMsSUFBSyxJQUFJb0gsSUFBSXBILE9BQVFvSCxJQUFLO1lBQ3hCLE1BQU1xQixhQUFhLENBQUMsRUFBRXRJLElBQUksQ0FBQyxFQUFFaUgsRUFBRSxDQUFDO1lBQ2hDLE1BQU16RyxRQUFRLElBQUksQ0FBQ21ILFNBQVMsQ0FBQ1c7WUFDN0IsSUFBSTlILFVBQVUsS0FBSyxHQUFHO2dCQUNwQjtZQUNGO1lBQ0EsSUFBSSxDQUFDNkgsWUFBWSxDQUFDQztRQUNwQjtJQUNGO0FBQ0Y7QUFFQSw4QkFBOEI7QUFDOUIsSUFBSUMsa0NBQWtDLGNBQWNmO0lBQ2xEdEQsWUFBWXVELGFBQWEsQ0FBRTtRQUN6QixLQUFLLENBQUNBO0lBQ1I7SUFDQUUsVUFBVXhGLElBQUksRUFBRTtRQUNkLElBQUksQ0FBQzRELGFBQ0gsT0FBTztRQUNULE1BQU15QyxVQUFVLENBQUMsR0FBRzVFLGVBQWVsRCxLQUFLLEVBQUV1RixTQUFTd0MsTUFBTTtRQUN6RCxPQUFPRCxPQUFPLENBQUNyRyxLQUFLO0lBQ3RCO0lBQ0EyRixVQUFVM0YsSUFBSSxFQUFFM0IsS0FBSyxFQUFFO1FBQ3JCLElBQUksQ0FBQ3VGLGFBQ0gsT0FBTztRQUNURSxTQUFTd0MsTUFBTSxHQUFHLENBQUMsR0FBRzdFLGVBQWVoRCxTQUFTLEVBQUV1QixNQUFNM0IsT0FBTztZQUMzRCxHQUFHLElBQUksQ0FBQ2lILGFBQWE7WUFDckJ2RSxVQUFVO1FBQ1o7SUFDRjtJQUNBbUYsYUFBYWxHLElBQUksRUFBRTtRQUNqQixJQUFJLENBQUM0RCxhQUNILE9BQU87UUFDVEUsU0FBU3dDLE1BQU0sR0FBRyxDQUFDLEdBQUc3RSxlQUFlaEQsU0FBUyxFQUFFdUIsTUFBTSxJQUFJO1lBQ3hELEdBQUcsSUFBSSxDQUFDc0YsYUFBYTtZQUNyQmxGLFFBQVE7WUFDUlcsVUFBVTtRQUNaO0lBQ0Y7QUFDRjtBQUVBLHNCQUFzQjtBQUMrQjtBQUNyRCxTQUFTeUYscUJBQXFCQyxXQUFXLEVBQUVDLFdBQVcsRUFBRTNILE9BQU87SUFDN0QsSUFBSTJFO0lBQ0osTUFBTWlELFVBQVUvQztJQUNoQixPQUFPMkMsbUVBQVlBLENBQUNFLGFBQWFDLGFBQWE7UUFDNUMsR0FBRzNILE9BQU87UUFDVjZILE1BQU07WUFDSkMsVUFBVTtZQUNWQyxrQkFBa0JIO1lBQ2xCSSxvQkFBb0JKO1lBQ3BCSyxnQkFBZ0I7WUFDaEJDLFNBQVNsSSxRQUFRNkgsSUFBSSxDQUFDSyxPQUFPO1lBQzdCLDBCQUEwQjtZQUMxQixHQUFHLENBQUMsQ0FBQ3ZELEtBQUszRSxRQUFRNkgsSUFBSSxLQUFLLE9BQU8sS0FBSyxJQUFJbEQsR0FBR3dELFVBQVUsSUFBSTtnQkFDMURBLFlBQVluSSxRQUFRNkgsSUFBSSxDQUFDTSxVQUFVO1lBQ3JDLElBQUksQ0FBQyxDQUFDO1FBQ1I7SUFDRjtBQUNGO0FBQ0EsSUFBSUMsc0JBQXNCekYsY0FBY25ELEtBQUs7QUFDN0MsSUFBSTZJLHlCQUF5QjFGLGNBQWNqRCxTQUFTO0FBV2xELENBQ0Y7Ozs7Ozs7OztBQVNBLElBQ0Esa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWhlbHBlcnMtc2hhcmVkL2Rpc3QvaW5kZXgubWpzPzM2YjMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2dldFByb3RvT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX2NvbW1vbkpTID0gKGNiLCBtb2QpID0+IGZ1bmN0aW9uIF9fcmVxdWlyZSgpIHtcbiAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9FU00gPSAobW9kLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+ICh0YXJnZXQgPSBtb2QgIT0gbnVsbCA/IF9fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKSA6IHt9LCBfX2NvcHlQcm9wcyhcbiAgLy8gSWYgdGhlIGltcG9ydGVyIGlzIGluIG5vZGUgY29tcGF0aWJpbGl0eSBtb2RlIG9yIHRoaXMgaXMgbm90IGFuIEVTTVxuICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLVxuICAvLyBjb21wYXRpYmxlIHRyYW5zZm9ybSAoaS5lLiBcIl9fZXNNb2R1bGVcIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXRcbiAgLy8gXCJkZWZhdWx0XCIgdG8gdGhlIENvbW1vbkpTIFwibW9kdWxlLmV4cG9ydHNcIiBmb3Igbm9kZSBjb21wYXRpYmlsaXR5LlxuICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgXCJkZWZhdWx0XCIsIHsgdmFsdWU6IG1vZCwgZW51bWVyYWJsZTogdHJ1ZSB9KSA6IHRhcmdldCxcbiAgbW9kXG4pKTtcblxuLy8gLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Nvb2tpZUAwLjUuMC9ub2RlX21vZHVsZXMvY29va2llL2luZGV4LmpzXG52YXIgcmVxdWlyZV9jb29raWUgPSBfX2NvbW1vbkpTKHtcbiAgXCIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29va2llQDAuNS4wL25vZGVfbW9kdWxlcy9jb29raWUvaW5kZXguanNcIihleHBvcnRzKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgZXhwb3J0cy5wYXJzZSA9IHBhcnNlMztcbiAgICBleHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTM7XG4gICAgdmFyIF9fdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIHZhciBmaWVsZENvbnRlbnRSZWdFeHAgPSAvXltcXHUwMDA5XFx1MDAyMC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXSskLztcbiAgICBmdW5jdGlvbiBwYXJzZTMoc3RyLCBvcHRpb25zKSB7XG4gICAgICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgc3RyIG11c3QgYmUgYSBzdHJpbmdcIik7XG4gICAgICB9XG4gICAgICB2YXIgb2JqID0ge307XG4gICAgICB2YXIgb3B0ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIHZhciBkZWMgPSBvcHQuZGVjb2RlIHx8IGRlY29kZTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB3aGlsZSAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgIHZhciBlcUlkeCA9IHN0ci5pbmRleE9mKFwiPVwiLCBpbmRleCk7XG4gICAgICAgIGlmIChlcUlkeCA9PT0gLTEpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW5kSWR4ID0gc3RyLmluZGV4T2YoXCI7XCIsIGluZGV4KTtcbiAgICAgICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgICAgICBlbmRJZHggPSBzdHIubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKGVuZElkeCA8IGVxSWR4KSB7XG4gICAgICAgICAgaW5kZXggPSBzdHIubGFzdEluZGV4T2YoXCI7XCIsIGVxSWR4IC0gMSkgKyAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrZXkgPSBzdHIuc2xpY2UoaW5kZXgsIGVxSWR4KS50cmltKCk7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IG9ialtrZXldKSB7XG4gICAgICAgICAgdmFyIHZhbCA9IHN0ci5zbGljZShlcUlkeCArIDEsIGVuZElkeCkudHJpbSgpO1xuICAgICAgICAgIGlmICh2YWwuY2hhckNvZGVBdCgwKSA9PT0gMzQpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ialtrZXldID0gdHJ5RGVjb2RlKHZhbCwgZGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IGVuZElkeCArIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXJpYWxpemUzKG5hbWUsIHZhbCwgb3B0aW9ucykge1xuICAgICAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG4gICAgICB2YXIgZW5jID0gb3B0LmVuY29kZSB8fCBlbmNvZGU7XG4gICAgICBpZiAodHlwZW9mIGVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gZW5jb2RlIGlzIGludmFsaWRcIik7XG4gICAgICB9XG4gICAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBuYW1lIGlzIGludmFsaWRcIik7XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBlbmModmFsKTtcbiAgICAgIGlmICh2YWx1ZSAmJiAhZmllbGRDb250ZW50UmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCB2YWwgaXMgaW52YWxpZFwiKTtcbiAgICAgIH1cbiAgICAgIHZhciBzdHIgPSBuYW1lICsgXCI9XCIgKyB2YWx1ZTtcbiAgICAgIGlmIChudWxsICE9IG9wdC5tYXhBZ2UpIHtcbiAgICAgICAgdmFyIG1heEFnZSA9IG9wdC5tYXhBZ2UgLSAwO1xuICAgICAgICBpZiAoaXNOYU4obWF4QWdlKSB8fCAhaXNGaW5pdGUobWF4QWdlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gbWF4QWdlIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBNYXgtQWdlPVwiICsgTWF0aC5mbG9vcihtYXhBZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5kb21haW4pIHtcbiAgICAgICAgaWYgKCFmaWVsZENvbnRlbnRSZWdFeHAudGVzdChvcHQuZG9tYWluKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gZG9tYWluIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBEb21haW49XCIgKyBvcHQuZG9tYWluO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5wYXRoKSB7XG4gICAgICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LnBhdGgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbiBwYXRoIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBQYXRoPVwiICsgb3B0LnBhdGg7XG4gICAgICB9XG4gICAgICBpZiAob3B0LmV4cGlyZXMpIHtcbiAgICAgICAgdmFyIGV4cGlyZXMgPSBvcHQuZXhwaXJlcztcbiAgICAgICAgaWYgKCFpc0RhdGUoZXhwaXJlcykgfHwgaXNOYU4oZXhwaXJlcy52YWx1ZU9mKCkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbiBleHBpcmVzIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBFeHBpcmVzPVwiICsgZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5odHRwT25seSkge1xuICAgICAgICBzdHIgKz0gXCI7IEh0dHBPbmx5XCI7XG4gICAgICB9XG4gICAgICBpZiAob3B0LnNlY3VyZSkge1xuICAgICAgICBzdHIgKz0gXCI7IFNlY3VyZVwiO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5wcmlvcml0eSkge1xuICAgICAgICB2YXIgcHJpb3JpdHkgPSB0eXBlb2Ygb3B0LnByaW9yaXR5ID09PSBcInN0cmluZ1wiID8gb3B0LnByaW9yaXR5LnRvTG93ZXJDYXNlKCkgOiBvcHQucHJpb3JpdHk7XG4gICAgICAgIHN3aXRjaCAocHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIFwibG93XCI6XG4gICAgICAgICAgICBzdHIgKz0gXCI7IFByaW9yaXR5PUxvd1wiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm1lZGl1bVwiOlxuICAgICAgICAgICAgc3RyICs9IFwiOyBQcmlvcml0eT1NZWRpdW1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJoaWdoXCI6XG4gICAgICAgICAgICBzdHIgKz0gXCI7IFByaW9yaXR5PUhpZ2hcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwib3B0aW9uIHByaW9yaXR5IGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcHQuc2FtZVNpdGUpIHtcbiAgICAgICAgdmFyIHNhbWVTaXRlID0gdHlwZW9mIG9wdC5zYW1lU2l0ZSA9PT0gXCJzdHJpbmdcIiA/IG9wdC5zYW1lU2l0ZS50b0xvd2VyQ2FzZSgpIDogb3B0LnNhbWVTaXRlO1xuICAgICAgICBzd2l0Y2ggKHNhbWVTaXRlKSB7XG4gICAgICAgICAgY2FzZSB0cnVlOlxuICAgICAgICAgICAgc3RyICs9IFwiOyBTYW1lU2l0ZT1TdHJpY3RcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJsYXhcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIjsgU2FtZVNpdGU9TGF4XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic3RyaWN0XCI6XG4gICAgICAgICAgICBzdHIgKz0gXCI7IFNhbWVTaXRlPVN0cmljdFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm5vbmVcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIjsgU2FtZVNpdGU9Tm9uZVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gc2FtZVNpdGUgaXMgaW52YWxpZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVjb2RlKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci5pbmRleE9mKFwiJVwiKSAhPT0gLTEgPyBkZWNvZGVVUklDb21wb25lbnQoc3RyKSA6IHN0cjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gICAgICByZXR1cm4gX190b1N0cmluZy5jYWxsKHZhbCkgPT09IFwiW29iamVjdCBEYXRlXVwiIHx8IHZhbCBpbnN0YW5jZW9mIERhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyeURlY29kZShzdHIsIGRlY29kZTIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGUyKHN0cik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcblxuLy8gc3JjL2Jyb3dzZXJDb29raWVTdG9yYWdlLnRzXG52YXIgaW1wb3J0X2Nvb2tpZTIgPSBfX3RvRVNNKHJlcXVpcmVfY29va2llKCkpO1xuXG4vLyBzcmMvdXRpbHMvY29va2llcy50c1xudmFyIGltcG9ydF9jb29raWUgPSBfX3RvRVNNKHJlcXVpcmVfY29va2llKCkpO1xuaW1wb3J0IHsgYmFzZTY0dXJsIH0gZnJvbSBcImpvc2VcIjtcbmZ1bmN0aW9uIHBhcnNlU3VwYWJhc2VDb29raWUoc3RyKSB7XG4gIGlmICghc3RyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBzZXNzaW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChzZXNzaW9uLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH1cbiAgICBpZiAoc2Vzc2lvbi5jb25zdHJ1Y3Rvci5uYW1lICE9PSBcIkFycmF5XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmb3JtYXQ6ICR7c2Vzc2lvbi5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIH1cbiAgICBjb25zdCBbX2hlYWRlciwgcGF5bG9hZFN0ciwgX3NpZ25hdHVyZV0gPSBzZXNzaW9uWzBdLnNwbGl0KFwiLlwiKTtcbiAgICBjb25zdCBwYXlsb2FkID0gYmFzZTY0dXJsLmRlY29kZShwYXlsb2FkU3RyKTtcbiAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgeyBleHAsIHN1YiwgLi4udXNlciB9ID0gSlNPTi5wYXJzZShkZWNvZGVyLmRlY29kZShwYXlsb2FkKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGlyZXNfYXQ6IGV4cCxcbiAgICAgIGV4cGlyZXNfaW46IGV4cCAtIE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDFlMyksXG4gICAgICB0b2tlbl90eXBlOiBcImJlYXJlclwiLFxuICAgICAgYWNjZXNzX3Rva2VuOiBzZXNzaW9uWzBdLFxuICAgICAgcmVmcmVzaF90b2tlbjogc2Vzc2lvblsxXSxcbiAgICAgIHByb3ZpZGVyX3Rva2VuOiBzZXNzaW9uWzJdLFxuICAgICAgcHJvdmlkZXJfcmVmcmVzaF90b2tlbjogc2Vzc2lvblszXSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgaWQ6IHN1YixcbiAgICAgICAgZmFjdG9yczogc2Vzc2lvbls0XSxcbiAgICAgICAgLi4udXNlclxuICAgICAgfVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSBjb29raWUgc3RyaW5nOlwiLCBlcnIpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlTdXBhYmFzZVNlc3Npb24oc2Vzc2lvbikge1xuICB2YXIgX2E7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgc2Vzc2lvbi5yZWZyZXNoX3Rva2VuLFxuICAgIHNlc3Npb24ucHJvdmlkZXJfdG9rZW4sXG4gICAgc2Vzc2lvbi5wcm92aWRlcl9yZWZyZXNoX3Rva2VuLFxuICAgICgoX2EgPSBzZXNzaW9uLnVzZXIpID09IG51bGwgPyB2b2lkIDAgOiBfYS5mYWN0b3JzKSA/PyBudWxsXG4gIF0pO1xufVxuXG4vLyBzcmMvdXRpbHMvaGVscGVycy50c1xuZnVuY3Rpb24gaXNCcm93c2VyKCkge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xufVxuXG4vLyBzcmMvdXRpbHMvY29uc3RhbnRzLnRzXG52YXIgREVGQVVMVF9DT09LSUVfT1BUSU9OUyA9IHtcbiAgcGF0aDogXCIvXCIsXG4gIHNhbWVTaXRlOiBcImxheFwiLFxuICBtYXhBZ2U6IDYwICogNjAgKiAyNCAqIDM2NSAqIDFlM1xufTtcblxuLy8gc3JjL2NodW5rZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZUNodW5rUmVnRXhwKGNodW5rU2l6ZSkge1xuICByZXR1cm4gbmV3IFJlZ0V4cChcIi57MSxcIiArIGNodW5rU2l6ZSArIFwifVwiLCBcImdcIik7XG59XG52YXIgTUFYX0NIVU5LX1NJWkUgPSAzMTgwO1xudmFyIE1BWF9DSFVOS19SRUdFWFAgPSBjcmVhdGVDaHVua1JlZ0V4cChNQVhfQ0hVTktfU0laRSk7XG5mdW5jdGlvbiBjcmVhdGVDaHVua3Moa2V5LCB2YWx1ZSwgY2h1bmtTaXplKSB7XG4gIGNvbnN0IHJlID0gY2h1bmtTaXplICE9PSB2b2lkIDAgPyBjcmVhdGVDaHVua1JlZ0V4cChjaHVua1NpemUpIDogTUFYX0NIVU5LX1JFR0VYUDtcbiAgY29uc3QgY2h1bmtDb3VudCA9IE1hdGguY2VpbCh2YWx1ZS5sZW5ndGggLyAoY2h1bmtTaXplID8/IE1BWF9DSFVOS19TSVpFKSk7XG4gIGlmIChjaHVua0NvdW50ID09PSAxKSB7XG4gICAgcmV0dXJuIFt7IG5hbWU6IGtleSwgdmFsdWUgfV07XG4gIH1cbiAgY29uc3QgY2h1bmtzID0gW107XG4gIGNvbnN0IHZhbHVlcyA9IHZhbHVlLm1hdGNoKHJlKTtcbiAgdmFsdWVzID09IG51bGwgPyB2b2lkIDAgOiB2YWx1ZXMuZm9yRWFjaCgodmFsdWUyLCBpKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGAke2tleX0uJHtpfWA7XG4gICAgY2h1bmtzLnB1c2goeyBuYW1lLCB2YWx1ZTogdmFsdWUyIH0pO1xuICB9KTtcbiAgcmV0dXJuIGNodW5rcztcbn1cbmZ1bmN0aW9uIGNvbWJpbmVDaHVua3Moa2V5LCByZXRyaWV2ZUNodW5rID0gKCkgPT4ge1xuICByZXR1cm4gbnVsbDtcbn0pIHtcbiAgbGV0IHZhbHVlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgOyBpKyspIHtcbiAgICBjb25zdCBjaHVua05hbWUgPSBgJHtrZXl9LiR7aX1gO1xuICAgIGNvbnN0IGNodW5rID0gcmV0cmlldmVDaHVuayhjaHVua05hbWUpO1xuICAgIGlmICghY2h1bmspIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YWx1ZXMucHVzaChjaHVuayk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyB2YWx1ZXMuam9pbihcIlwiKSA6IG51bGw7XG59XG5cbi8vIHNyYy9jb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIudHNcbnZhciBDb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvb2tpZU9wdGlvbnMpIHtcbiAgICB0aGlzLmNvb2tpZU9wdGlvbnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0NPT0tJRV9PUFRJT05TLFxuICAgICAgLi4uY29va2llT3B0aW9ucyxcbiAgICAgIG1heEFnZTogREVGQVVMVF9DT09LSUVfT1BUSU9OUy5tYXhBZ2VcbiAgICB9O1xuICB9XG4gIGdldEl0ZW0oa2V5KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldENvb2tpZShrZXkpO1xuICAgIGlmIChrZXkuZW5kc1dpdGgoXCItY29kZS12ZXJpZmllclwiKSAmJiB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXJzZVN1cGFiYXNlQ29va2llKHZhbHVlKSk7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rcyA9IGNvbWJpbmVDaHVua3Moa2V5LCAoY2h1bmtOYW1lKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb29raWUoY2h1bmtOYW1lKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2h1bmtzICE9PSBudWxsID8gSlNPTi5zdHJpbmdpZnkocGFyc2VTdXBhYmFzZUNvb2tpZShjaHVua3MpKSA6IG51bGw7XG4gIH1cbiAgc2V0SXRlbShrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleS5lbmRzV2l0aChcIi1jb2RlLXZlcmlmaWVyXCIpKSB7XG4gICAgICB0aGlzLnNldENvb2tpZShrZXksIHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNlc3Npb24gPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICBjb25zdCBzZXNzaW9uU3RyID0gc3RyaW5naWZ5U3VwYWJhc2VTZXNzaW9uKHNlc3Npb24pO1xuICAgIGNvbnN0IHNlc3Npb25DaHVua3MgPSBjcmVhdGVDaHVua3Moa2V5LCBzZXNzaW9uU3RyKTtcbiAgICBzZXNzaW9uQ2h1bmtzLmZvckVhY2goKHNlc3MpID0+IHtcbiAgICAgIHRoaXMuc2V0Q29va2llKHNlc3MubmFtZSwgc2Vzcy52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbiAgcmVtb3ZlSXRlbShrZXkpIHtcbiAgICB0aGlzLl9kZWxldGVTaW5nbGVDb29raWUoa2V5KTtcbiAgICB0aGlzLl9kZWxldGVDaHVua2VkQ29va2llcyhrZXkpO1xuICB9XG4gIF9kZWxldGVTaW5nbGVDb29raWUoa2V5KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29va2llKGtleSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlQ29va2llKGtleSk7XG4gICAgfVxuICB9XG4gIF9kZWxldGVDaHVua2VkQ29va2llcyhrZXksIGZyb20gPSAwKSB7XG4gICAgZm9yIChsZXQgaSA9IGZyb207IDsgaSsrKSB7XG4gICAgICBjb25zdCBjb29raWVOYW1lID0gYCR7a2V5fS4ke2l9YDtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDb29raWUoY29va2llTmFtZSk7XG4gICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVsZXRlQ29va2llKGNvb2tpZU5hbWUpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gc3JjL2Jyb3dzZXJDb29raWVTdG9yYWdlLnRzXG52YXIgQnJvd3NlckNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlciA9IGNsYXNzIGV4dGVuZHMgQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IoY29va2llT3B0aW9ucykge1xuICAgIHN1cGVyKGNvb2tpZU9wdGlvbnMpO1xuICB9XG4gIGdldENvb2tpZShuYW1lKSB7XG4gICAgaWYgKCFpc0Jyb3dzZXIoKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvb2tpZXMgPSAoMCwgaW1wb3J0X2Nvb2tpZTIucGFyc2UpKGRvY3VtZW50LmNvb2tpZSk7XG4gICAgcmV0dXJuIGNvb2tpZXNbbmFtZV07XG4gIH1cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKCFpc0Jyb3dzZXIoKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9ICgwLCBpbXBvcnRfY29va2llMi5zZXJpYWxpemUpKG5hbWUsIHZhbHVlLCB7XG4gICAgICAuLi50aGlzLmNvb2tpZU9wdGlvbnMsXG4gICAgICBodHRwT25seTogZmFsc2VcbiAgICB9KTtcbiAgfVxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIGlmICghaXNCcm93c2VyKCkpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBkb2N1bWVudC5jb29raWUgPSAoMCwgaW1wb3J0X2Nvb2tpZTIuc2VyaWFsaXplKShuYW1lLCBcIlwiLCB7XG4gICAgICAuLi50aGlzLmNvb2tpZU9wdGlvbnMsXG4gICAgICBtYXhBZ2U6IDAsXG4gICAgICBodHRwT25seTogZmFsc2VcbiAgICB9KTtcbiAgfVxufTtcblxuLy8gc3JjL2NyZWF0ZUNsaWVudC50c1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50IH0gZnJvbSBcIkBzdXBhYmFzZS9zdXBhYmFzZS1qc1wiO1xuZnVuY3Rpb24gY3JlYXRlU3VwYWJhc2VDbGllbnQoc3VwYWJhc2VVcmwsIHN1cGFiYXNlS2V5LCBvcHRpb25zKSB7XG4gIHZhciBfYTtcbiAgY29uc3QgYnJvd3NlciA9IGlzQnJvd3NlcigpO1xuICByZXR1cm4gY3JlYXRlQ2xpZW50KHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgYXV0aDoge1xuICAgICAgZmxvd1R5cGU6IFwicGtjZVwiLFxuICAgICAgYXV0b1JlZnJlc2hUb2tlbjogYnJvd3NlcixcbiAgICAgIGRldGVjdFNlc3Npb25JblVybDogYnJvd3NlcixcbiAgICAgIHBlcnNpc3RTZXNzaW9uOiB0cnVlLFxuICAgICAgc3RvcmFnZTogb3B0aW9ucy5hdXRoLnN0b3JhZ2UsXG4gICAgICAvLyBmaXggdGhpcyBpbiBzdXBhYmFzZS1qc1xuICAgICAgLi4uKChfYSA9IG9wdGlvbnMuYXV0aCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnN0b3JhZ2VLZXkpID8ge1xuICAgICAgICBzdG9yYWdlS2V5OiBvcHRpb25zLmF1dGguc3RvcmFnZUtleVxuICAgICAgfSA6IHt9XG4gICAgfVxuICB9KTtcbn1cbnZhciBleHBvcnRfcGFyc2VDb29raWVzID0gaW1wb3J0X2Nvb2tpZS5wYXJzZTtcbnZhciBleHBvcnRfc2VyaWFsaXplQ29va2llID0gaW1wb3J0X2Nvb2tpZS5zZXJpYWxpemU7XG5leHBvcnQge1xuICBCcm93c2VyQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyLFxuICBDb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIsXG4gIERFRkFVTFRfQ09PS0lFX09QVElPTlMsXG4gIGNyZWF0ZVN1cGFiYXNlQ2xpZW50LFxuICBpc0Jyb3dzZXIsXG4gIGV4cG9ydF9wYXJzZUNvb2tpZXMgYXMgcGFyc2VDb29raWVzLFxuICBwYXJzZVN1cGFiYXNlQ29va2llLFxuICBleHBvcnRfc2VyaWFsaXplQ29va2llIGFzIHNlcmlhbGl6ZUNvb2tpZSxcbiAgc3RyaW5naWZ5U3VwYWJhc2VTZXNzaW9uXG59O1xuLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjpcblxuY29va2llL2luZGV4LmpzOlxuICAoKiFcbiAgICogY29va2llXG4gICAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgUm9tYW4gU2h0eWxtYW5cbiAgICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAgICogTUlUIExpY2Vuc2VkXG4gICAqKVxuKi9cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXAiXSwibmFtZXMiOlsiX19jcmVhdGUiLCJPYmplY3QiLCJjcmVhdGUiLCJfX2RlZlByb3AiLCJkZWZpbmVQcm9wZXJ0eSIsIl9fZ2V0T3duUHJvcERlc2MiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfX2dldE93blByb3BOYW1lcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJfX2dldFByb3RvT2YiLCJnZXRQcm90b3R5cGVPZiIsIl9faGFzT3duUHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiX19jb21tb25KUyIsImNiIiwibW9kIiwiX19yZXF1aXJlIiwiZXhwb3J0cyIsIl9fY29weVByb3BzIiwidG8iLCJmcm9tIiwiZXhjZXB0IiwiZGVzYyIsImtleSIsImNhbGwiLCJnZXQiLCJlbnVtZXJhYmxlIiwiX190b0VTTSIsImlzTm9kZU1vZGUiLCJ0YXJnZXQiLCJfX2VzTW9kdWxlIiwidmFsdWUiLCJyZXF1aXJlX2Nvb2tpZSIsInBhcnNlIiwicGFyc2UzIiwic2VyaWFsaXplIiwic2VyaWFsaXplMyIsIl9fdG9TdHJpbmciLCJ0b1N0cmluZyIsImZpZWxkQ29udGVudFJlZ0V4cCIsInN0ciIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJvYmoiLCJvcHQiLCJkZWMiLCJkZWNvZGUiLCJpbmRleCIsImxlbmd0aCIsImVxSWR4IiwiaW5kZXhPZiIsImVuZElkeCIsImxhc3RJbmRleE9mIiwic2xpY2UiLCJ0cmltIiwidmFsIiwiY2hhckNvZGVBdCIsInRyeURlY29kZSIsIm5hbWUiLCJlbmMiLCJlbmNvZGUiLCJ0ZXN0IiwibWF4QWdlIiwiaXNOYU4iLCJpc0Zpbml0ZSIsIk1hdGgiLCJmbG9vciIsImRvbWFpbiIsInBhdGgiLCJleHBpcmVzIiwiaXNEYXRlIiwidmFsdWVPZiIsInRvVVRDU3RyaW5nIiwiaHR0cE9ubHkiLCJzZWN1cmUiLCJwcmlvcml0eSIsInRvTG93ZXJDYXNlIiwic2FtZVNpdGUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlbmNvZGVVUklDb21wb25lbnQiLCJEYXRlIiwiZGVjb2RlMiIsImUiLCJpbXBvcnRfY29va2llMiIsImltcG9ydF9jb29raWUiLCJiYXNlNjR1cmwiLCJwYXJzZVN1cGFiYXNlQ29va2llIiwic2Vzc2lvbiIsIkpTT04iLCJjb25zdHJ1Y3RvciIsIkVycm9yIiwiX2hlYWRlciIsInBheWxvYWRTdHIiLCJfc2lnbmF0dXJlIiwic3BsaXQiLCJwYXlsb2FkIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwiZXhwIiwic3ViIiwidXNlciIsImV4cGlyZXNfYXQiLCJleHBpcmVzX2luIiwicm91bmQiLCJub3ciLCJ0b2tlbl90eXBlIiwiYWNjZXNzX3Rva2VuIiwicmVmcmVzaF90b2tlbiIsInByb3ZpZGVyX3Rva2VuIiwicHJvdmlkZXJfcmVmcmVzaF90b2tlbiIsImlkIiwiZmFjdG9ycyIsImVyciIsImNvbnNvbGUiLCJ3YXJuIiwic3RyaW5naWZ5U3VwYWJhc2VTZXNzaW9uIiwiX2EiLCJzdHJpbmdpZnkiLCJpc0Jyb3dzZXIiLCJ3aW5kb3ciLCJkb2N1bWVudCIsIkRFRkFVTFRfQ09PS0lFX09QVElPTlMiLCJjcmVhdGVDaHVua1JlZ0V4cCIsImNodW5rU2l6ZSIsIlJlZ0V4cCIsIk1BWF9DSFVOS19TSVpFIiwiTUFYX0NIVU5LX1JFR0VYUCIsImNyZWF0ZUNodW5rcyIsInJlIiwiY2h1bmtDb3VudCIsImNlaWwiLCJjaHVua3MiLCJ2YWx1ZXMiLCJtYXRjaCIsImZvckVhY2giLCJ2YWx1ZTIiLCJpIiwicHVzaCIsImNvbWJpbmVDaHVua3MiLCJyZXRyaWV2ZUNodW5rIiwiY2h1bmtOYW1lIiwiY2h1bmsiLCJqb2luIiwiQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIiwiY29va2llT3B0aW9ucyIsImdldEl0ZW0iLCJnZXRDb29raWUiLCJlbmRzV2l0aCIsInNldEl0ZW0iLCJzZXRDb29raWUiLCJzZXNzaW9uU3RyIiwic2Vzc2lvbkNodW5rcyIsInNlc3MiLCJyZW1vdmVJdGVtIiwiX2RlbGV0ZVNpbmdsZUNvb2tpZSIsIl9kZWxldGVDaHVua2VkQ29va2llcyIsImRlbGV0ZUNvb2tpZSIsImNvb2tpZU5hbWUiLCJCcm93c2VyQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIiwiY29va2llcyIsImNvb2tpZSIsImNyZWF0ZUNsaWVudCIsImNyZWF0ZVN1cGFiYXNlQ2xpZW50Iiwic3VwYWJhc2VVcmwiLCJzdXBhYmFzZUtleSIsImJyb3dzZXIiLCJhdXRoIiwiZmxvd1R5cGUiLCJhdXRvUmVmcmVzaFRva2VuIiwiZGV0ZWN0U2Vzc2lvbkluVXJsIiwicGVyc2lzdFNlc3Npb24iLCJzdG9yYWdlIiwic3RvcmFnZUtleSIsImV4cG9ydF9wYXJzZUNvb2tpZXMiLCJleHBvcnRfc2VyaWFsaXplQ29va2llIiwicGFyc2VDb29raWVzIiwic2VyaWFsaXplQ29va2llIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs":
|
||
/*!*******************************************************************!*\
|
||
!*** ./node_modules/@supabase/auth-helpers-shared/dist/index.mjs ***!
|
||
\*******************************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BrowserCookieAuthStorageAdapter: () => (/* binding */ BrowserCookieAuthStorageAdapter),\n/* harmony export */ CookieAuthStorageAdapter: () => (/* binding */ CookieAuthStorageAdapter),\n/* harmony export */ DEFAULT_COOKIE_OPTIONS: () => (/* binding */ DEFAULT_COOKIE_OPTIONS),\n/* harmony export */ createSupabaseClient: () => (/* binding */ createSupabaseClient),\n/* harmony export */ isBrowser: () => (/* binding */ isBrowser),\n/* harmony export */ parseCookies: () => (/* binding */ export_parseCookies),\n/* harmony export */ parseSupabaseCookie: () => (/* binding */ parseSupabaseCookie),\n/* harmony export */ serializeCookie: () => (/* binding */ export_serializeCookie),\n/* harmony export */ stringifySupabaseSession: () => (/* binding */ stringifySupabaseSession)\n/* harmony export */ });\n/* harmony import */ var jose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jose */ \"(rsc)/./node_modules/jose/dist/node/esm/util/base64url.js\");\n/* harmony import */ var _supabase_supabase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @supabase/supabase-js */ \"(rsc)/./node_modules/@supabase/supabase-js/dist/index.mjs\");\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJS = (cb, mod)=>function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = {\n exports: {}\n }).exports, mod), mod.exports;\n };\nvar __copyProps = (to, from, except, desc)=>{\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {\n get: ()=>from[key],\n enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable\n });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target)=>(target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(// If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", {\n value: mod,\n enumerable: true\n }) : target, mod));\n// ../../node_modules/.pnpm/cookie@0.5.0/node_modules/cookie/index.js\nvar require_cookie = __commonJS({\n \"../../node_modules/.pnpm/cookie@0.5.0/node_modules/cookie/index.js\" (exports) {\n \"use strict\";\n exports.parse = parse3;\n exports.serialize = serialize3;\n var __toString = Object.prototype.toString;\n var fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n function parse3(str, options) {\n if (typeof str !== \"string\") {\n throw new TypeError(\"argument str must be a string\");\n }\n var obj = {};\n var opt = options || {};\n var dec = opt.decode || decode;\n var index = 0;\n while(index < str.length){\n var eqIdx = str.indexOf(\"=\", index);\n if (eqIdx === -1) {\n break;\n }\n var endIdx = str.indexOf(\";\", index);\n if (endIdx === -1) {\n endIdx = str.length;\n } else if (endIdx < eqIdx) {\n index = str.lastIndexOf(\";\", eqIdx - 1) + 1;\n continue;\n }\n var key = str.slice(index, eqIdx).trim();\n if (void 0 === obj[key]) {\n var val = str.slice(eqIdx + 1, endIdx).trim();\n if (val.charCodeAt(0) === 34) {\n val = val.slice(1, -1);\n }\n obj[key] = tryDecode(val, dec);\n }\n index = endIdx + 1;\n }\n return obj;\n }\n function serialize3(name, val, options) {\n var opt = options || {};\n var enc = opt.encode || encode;\n if (typeof enc !== \"function\") {\n throw new TypeError(\"option encode is invalid\");\n }\n if (!fieldContentRegExp.test(name)) {\n throw new TypeError(\"argument name is invalid\");\n }\n var value = enc(val);\n if (value && !fieldContentRegExp.test(value)) {\n throw new TypeError(\"argument val is invalid\");\n }\n var str = name + \"=\" + value;\n if (null != opt.maxAge) {\n var maxAge = opt.maxAge - 0;\n if (isNaN(maxAge) || !isFinite(maxAge)) {\n throw new TypeError(\"option maxAge is invalid\");\n }\n str += \"; Max-Age=\" + Math.floor(maxAge);\n }\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) {\n throw new TypeError(\"option domain is invalid\");\n }\n str += \"; Domain=\" + opt.domain;\n }\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) {\n throw new TypeError(\"option path is invalid\");\n }\n str += \"; Path=\" + opt.path;\n }\n if (opt.expires) {\n var expires = opt.expires;\n if (!isDate(expires) || isNaN(expires.valueOf())) {\n throw new TypeError(\"option expires is invalid\");\n }\n str += \"; Expires=\" + expires.toUTCString();\n }\n if (opt.httpOnly) {\n str += \"; HttpOnly\";\n }\n if (opt.secure) {\n str += \"; Secure\";\n }\n if (opt.priority) {\n var priority = typeof opt.priority === \"string\" ? opt.priority.toLowerCase() : opt.priority;\n switch(priority){\n case \"low\":\n str += \"; Priority=Low\";\n break;\n case \"medium\":\n str += \"; Priority=Medium\";\n break;\n case \"high\":\n str += \"; Priority=High\";\n break;\n default:\n throw new TypeError(\"option priority is invalid\");\n }\n }\n if (opt.sameSite) {\n var sameSite = typeof opt.sameSite === \"string\" ? opt.sameSite.toLowerCase() : opt.sameSite;\n switch(sameSite){\n case true:\n str += \"; SameSite=Strict\";\n break;\n case \"lax\":\n str += \"; SameSite=Lax\";\n break;\n case \"strict\":\n str += \"; SameSite=Strict\";\n break;\n case \"none\":\n str += \"; SameSite=None\";\n break;\n default:\n throw new TypeError(\"option sameSite is invalid\");\n }\n }\n return str;\n }\n function decode(str) {\n return str.indexOf(\"%\") !== -1 ? decodeURIComponent(str) : str;\n }\n function encode(val) {\n return encodeURIComponent(val);\n }\n function isDate(val) {\n return __toString.call(val) === \"[object Date]\" || val instanceof Date;\n }\n function tryDecode(str, decode2) {\n try {\n return decode2(str);\n } catch (e) {\n return str;\n }\n }\n }\n});\n// src/browserCookieStorage.ts\nvar import_cookie2 = __toESM(require_cookie());\n// src/utils/cookies.ts\nvar import_cookie = __toESM(require_cookie());\n\nfunction parseSupabaseCookie(str) {\n if (!str) {\n return null;\n }\n try {\n const session = JSON.parse(str);\n if (!session) {\n return null;\n }\n if (session.constructor.name === \"Object\") {\n return session;\n }\n if (session.constructor.name !== \"Array\") {\n throw new Error(`Unexpected format: ${session.constructor.name}`);\n }\n const [_header, payloadStr, _signature] = session[0].split(\".\");\n const payload = jose__WEBPACK_IMPORTED_MODULE_0__.decode(payloadStr);\n const decoder = new TextDecoder();\n const { exp, sub, ...user } = JSON.parse(decoder.decode(payload));\n return {\n expires_at: exp,\n expires_in: exp - Math.round(Date.now() / 1e3),\n token_type: \"bearer\",\n access_token: session[0],\n refresh_token: session[1],\n provider_token: session[2],\n provider_refresh_token: session[3],\n user: {\n id: sub,\n factors: session[4],\n ...user\n }\n };\n } catch (err) {\n console.warn(\"Failed to parse cookie string:\", err);\n return null;\n }\n}\nfunction stringifySupabaseSession(session) {\n var _a;\n return JSON.stringify([\n session.access_token,\n session.refresh_token,\n session.provider_token,\n session.provider_refresh_token,\n ((_a = session.user) == null ? void 0 : _a.factors) ?? null\n ]);\n}\n// src/utils/helpers.ts\nfunction isBrowser() {\n return false && 0;\n}\n// src/utils/constants.ts\nvar DEFAULT_COOKIE_OPTIONS = {\n path: \"/\",\n sameSite: \"lax\",\n maxAge: 60 * 60 * 24 * 365 * 1e3\n};\n// src/chunker.ts\nfunction createChunkRegExp(chunkSize) {\n return new RegExp(\".{1,\" + chunkSize + \"}\", \"g\");\n}\nvar MAX_CHUNK_SIZE = 3180;\nvar MAX_CHUNK_REGEXP = createChunkRegExp(MAX_CHUNK_SIZE);\nfunction createChunks(key, value, chunkSize) {\n const re = chunkSize !== void 0 ? createChunkRegExp(chunkSize) : MAX_CHUNK_REGEXP;\n const chunkCount = Math.ceil(value.length / (chunkSize ?? MAX_CHUNK_SIZE));\n if (chunkCount === 1) {\n return [\n {\n name: key,\n value\n }\n ];\n }\n const chunks = [];\n const values = value.match(re);\n values == null ? void 0 : values.forEach((value2, i)=>{\n const name = `${key}.${i}`;\n chunks.push({\n name,\n value: value2\n });\n });\n return chunks;\n}\nfunction combineChunks(key, retrieveChunk = ()=>{\n return null;\n}) {\n let values = [];\n for(let i = 0;; i++){\n const chunkName = `${key}.${i}`;\n const chunk = retrieveChunk(chunkName);\n if (!chunk) {\n break;\n }\n values.push(chunk);\n }\n return values.length ? values.join(\"\") : null;\n}\n// src/cookieAuthStorageAdapter.ts\nvar CookieAuthStorageAdapter = class {\n constructor(cookieOptions){\n this.cookieOptions = {\n ...DEFAULT_COOKIE_OPTIONS,\n ...cookieOptions,\n maxAge: DEFAULT_COOKIE_OPTIONS.maxAge\n };\n }\n getItem(key) {\n const value = this.getCookie(key);\n if (key.endsWith(\"-code-verifier\") && value) {\n return value;\n }\n if (value) {\n return JSON.stringify(parseSupabaseCookie(value));\n }\n const chunks = combineChunks(key, (chunkName)=>{\n return this.getCookie(chunkName);\n });\n return chunks !== null ? JSON.stringify(parseSupabaseCookie(chunks)) : null;\n }\n setItem(key, value) {\n if (key.endsWith(\"-code-verifier\")) {\n this.setCookie(key, value);\n return;\n }\n let session = JSON.parse(value);\n const sessionStr = stringifySupabaseSession(session);\n const sessionChunks = createChunks(key, sessionStr);\n sessionChunks.forEach((sess)=>{\n this.setCookie(sess.name, sess.value);\n });\n }\n removeItem(key) {\n this._deleteSingleCookie(key);\n this._deleteChunkedCookies(key);\n }\n _deleteSingleCookie(key) {\n if (this.getCookie(key)) {\n this.deleteCookie(key);\n }\n }\n _deleteChunkedCookies(key, from = 0) {\n for(let i = from;; i++){\n const cookieName = `${key}.${i}`;\n const value = this.getCookie(cookieName);\n if (value === void 0) {\n break;\n }\n this.deleteCookie(cookieName);\n }\n }\n};\n// src/browserCookieStorage.ts\nvar BrowserCookieAuthStorageAdapter = class extends CookieAuthStorageAdapter {\n constructor(cookieOptions){\n super(cookieOptions);\n }\n getCookie(name) {\n if (!isBrowser()) return null;\n const cookies = (0, import_cookie2.parse)(document.cookie);\n return cookies[name];\n }\n setCookie(name, value) {\n if (!isBrowser()) return null;\n document.cookie = (0, import_cookie2.serialize)(name, value, {\n ...this.cookieOptions,\n httpOnly: false\n });\n }\n deleteCookie(name) {\n if (!isBrowser()) return null;\n document.cookie = (0, import_cookie2.serialize)(name, \"\", {\n ...this.cookieOptions,\n maxAge: 0,\n httpOnly: false\n });\n }\n};\n// src/createClient.ts\n\nfunction createSupabaseClient(supabaseUrl, supabaseKey, options) {\n var _a;\n const browser = isBrowser();\n return (0,_supabase_supabase_js__WEBPACK_IMPORTED_MODULE_1__.createClient)(supabaseUrl, supabaseKey, {\n ...options,\n auth: {\n flowType: \"pkce\",\n autoRefreshToken: browser,\n detectSessionInUrl: browser,\n persistSession: true,\n storage: options.auth.storage,\n // fix this in supabase-js\n ...((_a = options.auth) == null ? void 0 : _a.storageKey) ? {\n storageKey: options.auth.storageKey\n } : {}\n }\n });\n}\nvar export_parseCookies = import_cookie.parse;\nvar export_serializeCookie = import_cookie.serialize;\n /*! Bundled license information:\n\ncookie/index.js:\n (*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n *)\n*/ //# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL2F1dGgtaGVscGVycy1zaGFyZWQvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFJQSxXQUFXQyxPQUFPQyxNQUFNO0FBQzVCLElBQUlDLFlBQVlGLE9BQU9HLGNBQWM7QUFDckMsSUFBSUMsbUJBQW1CSixPQUFPSyx3QkFBd0I7QUFDdEQsSUFBSUMsb0JBQW9CTixPQUFPTyxtQkFBbUI7QUFDbEQsSUFBSUMsZUFBZVIsT0FBT1MsY0FBYztBQUN4QyxJQUFJQyxlQUFlVixPQUFPVyxTQUFTLENBQUNDLGNBQWM7QUFDbEQsSUFBSUMsYUFBYSxDQUFDQyxJQUFJQyxNQUFRLFNBQVNDO1FBQ3JDLE9BQU9ELE9BQU8sQ0FBQyxHQUFHRCxFQUFFLENBQUNSLGtCQUFrQlEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUNDLE1BQU07WUFBRUUsU0FBUyxDQUFDO1FBQUUsR0FBR0EsT0FBTyxFQUFFRixNQUFNQSxJQUFJRSxPQUFPO0lBQ3BHO0FBQ0EsSUFBSUMsY0FBYyxDQUFDQyxJQUFJQyxNQUFNQyxRQUFRQztJQUNuQyxJQUFJRixRQUFRLE9BQU9BLFNBQVMsWUFBWSxPQUFPQSxTQUFTLFlBQVk7UUFDbEUsS0FBSyxJQUFJRyxPQUFPakIsa0JBQWtCYyxNQUNoQyxJQUFJLENBQUNWLGFBQWFjLElBQUksQ0FBQ0wsSUFBSUksUUFBUUEsUUFBUUYsUUFDekNuQixVQUFVaUIsSUFBSUksS0FBSztZQUFFRSxLQUFLLElBQU1MLElBQUksQ0FBQ0csSUFBSTtZQUFFRyxZQUFZLENBQUVKLENBQUFBLE9BQU9sQixpQkFBaUJnQixNQUFNRyxJQUFHLEtBQU1ELEtBQUtJLFVBQVU7UUFBQztJQUN0SDtJQUNBLE9BQU9QO0FBQ1Q7QUFDQSxJQUFJUSxVQUFVLENBQUNaLEtBQUthLFlBQVlDLFNBQVlBLENBQUFBLFNBQVNkLE9BQU8sT0FBT2hCLFNBQVNTLGFBQWFPLFFBQVEsQ0FB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QUksRUFBRTtRQUNqQixJQUFJLENBQUM0RCxhQUNILE9BQU87UUFDVEUsU0FBU3dDLE1BQU0sR0FBRyxDQUFDLEdBQUc3RSxlQUFlaEQsU0FBUyxFQUFFdUIsTUFBTSxJQUFJO1lBQ3hELEdBQUcsSUFBSSxDQUFDc0YsYUFBYTtZQUNyQmxGLFFBQVE7WUFDUlcsVUFBVTtRQUNaO0lBQ0Y7QUFDRjtBQUVBLHNCQUFzQjtBQUMrQjtBQUNyRCxTQUFTeUYscUJBQXFCQyxXQUFXLEVBQUVDLFdBQVcsRUFBRTNILE9BQU87SUFDN0QsSUFBSTJFO0lBQ0osTUFBTWlELFVBQVUvQztJQUNoQixPQUFPMkMsbUVBQVlBLENBQUNFLGFBQWFDLGFBQWE7UUFDNUMsR0FBRzNILE9BQU87UUFDVjZILE1BQU07WUFDSkMsVUFBVTtZQUNWQyxrQkFBa0JIO1lBQ2xCSSxvQkFBb0JKO1lBQ3BCSyxnQkFBZ0I7WUFDaEJDLFNBQVNsSSxRQUFRNkgsSUFBSSxDQUFDSyxPQUFPO1lBQzdCLDBCQUEwQjtZQUMxQixHQUFHLENBQUMsQ0FBQ3ZELEtBQUszRSxRQUFRNkgsSUFBSSxLQUFLLE9BQU8sS0FBSyxJQUFJbEQsR0FBR3dELFVBQVUsSUFBSTtnQkFDMURBLFlBQVluSSxRQUFRNkgsSUFBSSxDQUFDTSxVQUFVO1lBQ3JDLElBQUksQ0FBQyxDQUFDO1FBQ1I7SUFDRjtBQUNGO0FBQ0EsSUFBSUMsc0JBQXNCekYsY0FBY25ELEtBQUs7QUFDN0MsSUFBSTZJLHlCQUF5QjFGLGNBQWNqRCxTQUFTO0FBV2xELENBQ0Y7Ozs7Ozs7OztBQVNBLElBQ0Esa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9hdXRoLWhlbHBlcnMtc2hhcmVkL2Rpc3QvaW5kZXgubWpzPzM2YjMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2dldFByb3RvT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX2NvbW1vbkpTID0gKGNiLCBtb2QpID0+IGZ1bmN0aW9uIF9fcmVxdWlyZSgpIHtcbiAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9FU00gPSAobW9kLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+ICh0YXJnZXQgPSBtb2QgIT0gbnVsbCA/IF9fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKSA6IHt9LCBfX2NvcHlQcm9wcyhcbiAgLy8gSWYgdGhlIGltcG9ydGVyIGlzIGluIG5vZGUgY29tcGF0aWJpbGl0eSBtb2RlIG9yIHRoaXMgaXMgbm90IGFuIEVTTVxuICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLVxuICAvLyBjb21wYXRpYmxlIHRyYW5zZm9ybSAoaS5lLiBcIl9fZXNNb2R1bGVcIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXRcbiAgLy8gXCJkZWZhdWx0XCIgdG8gdGhlIENvbW1vbkpTIFwibW9kdWxlLmV4cG9ydHNcIiBmb3Igbm9kZSBjb21wYXRpYmlsaXR5LlxuICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgXCJkZWZhdWx0XCIsIHsgdmFsdWU6IG1vZCwgZW51bWVyYWJsZTogdHJ1ZSB9KSA6IHRhcmdldCxcbiAgbW9kXG4pKTtcblxuLy8gLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Nvb2tpZUAwLjUuMC9ub2RlX21vZHVsZXMvY29va2llL2luZGV4LmpzXG52YXIgcmVxdWlyZV9jb29raWUgPSBfX2NvbW1vbkpTKHtcbiAgXCIuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vY29va2llQDAuNS4wL25vZGVfbW9kdWxlcy9jb29raWUvaW5kZXguanNcIihleHBvcnRzKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgZXhwb3J0cy5wYXJzZSA9IHBhcnNlMztcbiAgICBleHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTM7XG4gICAgdmFyIF9fdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIHZhciBmaWVsZENvbnRlbnRSZWdFeHAgPSAvXltcXHUwMDA5XFx1MDAyMC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXSskLztcbiAgICBmdW5jdGlvbiBwYXJzZTMoc3RyLCBvcHRpb25zKSB7XG4gICAgICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgc3RyIG11c3QgYmUgYSBzdHJpbmdcIik7XG4gICAgICB9XG4gICAgICB2YXIgb2JqID0ge307XG4gICAgICB2YXIgb3B0ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIHZhciBkZWMgPSBvcHQuZGVjb2RlIHx8IGRlY29kZTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB3aGlsZSAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgIHZhciBlcUlkeCA9IHN0ci5pbmRleE9mKFwiPVwiLCBpbmRleCk7XG4gICAgICAgIGlmIChlcUlkeCA9PT0gLTEpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW5kSWR4ID0gc3RyLmluZGV4T2YoXCI7XCIsIGluZGV4KTtcbiAgICAgICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgICAgICBlbmRJZHggPSBzdHIubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKGVuZElkeCA8IGVxSWR4KSB7XG4gICAgICAgICAgaW5kZXggPSBzdHIubGFzdEluZGV4T2YoXCI7XCIsIGVxSWR4IC0gMSkgKyAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrZXkgPSBzdHIuc2xpY2UoaW5kZXgsIGVxSWR4KS50cmltKCk7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IG9ialtrZXldKSB7XG4gICAgICAgICAgdmFyIHZhbCA9IHN0ci5zbGljZShlcUlkeCArIDEsIGVuZElkeCkudHJpbSgpO1xuICAgICAgICAgIGlmICh2YWwuY2hhckNvZGVBdCgwKSA9PT0gMzQpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ialtrZXldID0gdHJ5RGVjb2RlKHZhbCwgZGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IGVuZElkeCArIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXJpYWxpemUzKG5hbWUsIHZhbCwgb3B0aW9ucykge1xuICAgICAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG4gICAgICB2YXIgZW5jID0gb3B0LmVuY29kZSB8fCBlbmNvZGU7XG4gICAgICBpZiAodHlwZW9mIGVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gZW5jb2RlIGlzIGludmFsaWRcIik7XG4gICAgICB9XG4gICAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCBuYW1lIGlzIGludmFsaWRcIik7XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBlbmModmFsKTtcbiAgICAgIGlmICh2YWx1ZSAmJiAhZmllbGRDb250ZW50UmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCB2YWwgaXMgaW52YWxpZFwiKTtcbiAgICAgIH1cbiAgICAgIHZhciBzdHIgPSBuYW1lICsgXCI9XCIgKyB2YWx1ZTtcbiAgICAgIGlmIChudWxsICE9IG9wdC5tYXhBZ2UpIHtcbiAgICAgICAgdmFyIG1heEFnZSA9IG9wdC5tYXhBZ2UgLSAwO1xuICAgICAgICBpZiAoaXNOYU4obWF4QWdlKSB8fCAhaXNGaW5pdGUobWF4QWdlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gbWF4QWdlIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBNYXgtQWdlPVwiICsgTWF0aC5mbG9vcihtYXhBZ2UpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5kb21haW4pIHtcbiAgICAgICAgaWYgKCFmaWVsZENvbnRlbnRSZWdFeHAudGVzdChvcHQuZG9tYWluKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gZG9tYWluIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBEb21haW49XCIgKyBvcHQuZG9tYWluO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5wYXRoKSB7XG4gICAgICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LnBhdGgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbiBwYXRoIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBQYXRoPVwiICsgb3B0LnBhdGg7XG4gICAgICB9XG4gICAgICBpZiAob3B0LmV4cGlyZXMpIHtcbiAgICAgICAgdmFyIGV4cGlyZXMgPSBvcHQuZXhwaXJlcztcbiAgICAgICAgaWYgKCFpc0RhdGUoZXhwaXJlcykgfHwgaXNOYU4oZXhwaXJlcy52YWx1ZU9mKCkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbiBleHBpcmVzIGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IFwiOyBFeHBpcmVzPVwiICsgZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5odHRwT25seSkge1xuICAgICAgICBzdHIgKz0gXCI7IEh0dHBPbmx5XCI7XG4gICAgICB9XG4gICAgICBpZiAob3B0LnNlY3VyZSkge1xuICAgICAgICBzdHIgKz0gXCI7IFNlY3VyZVwiO1xuICAgICAgfVxuICAgICAgaWYgKG9wdC5wcmlvcml0eSkge1xuICAgICAgICB2YXIgcHJpb3JpdHkgPSB0eXBlb2Ygb3B0LnByaW9yaXR5ID09PSBcInN0cmluZ1wiID8gb3B0LnByaW9yaXR5LnRvTG93ZXJDYXNlKCkgOiBvcHQucHJpb3JpdHk7XG4gICAgICAgIHN3aXRjaCAocHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIFwibG93XCI6XG4gICAgICAgICAgICBzdHIgKz0gXCI7IFByaW9yaXR5PUxvd1wiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm1lZGl1bVwiOlxuICAgICAgICAgICAgc3RyICs9IFwiOyBQcmlvcml0eT1NZWRpdW1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJoaWdoXCI6XG4gICAgICAgICAgICBzdHIgKz0gXCI7IFByaW9yaXR5PUhpZ2hcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwib3B0aW9uIHByaW9yaXR5IGlzIGludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcHQuc2FtZVNpdGUpIHtcbiAgICAgICAgdmFyIHNhbWVTaXRlID0gdHlwZW9mIG9wdC5zYW1lU2l0ZSA9PT0gXCJzdHJpbmdcIiA/IG9wdC5zYW1lU2l0ZS50b0xvd2VyQ2FzZSgpIDogb3B0LnNhbWVTaXRlO1xuICAgICAgICBzd2l0Y2ggKHNhbWVTaXRlKSB7XG4gICAgICAgICAgY2FzZSB0cnVlOlxuICAgICAgICAgICAgc3RyICs9IFwiOyBTYW1lU2l0ZT1TdHJpY3RcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJsYXhcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIjsgU2FtZVNpdGU9TGF4XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic3RyaWN0XCI6XG4gICAgICAgICAgICBzdHIgKz0gXCI7IFNhbWVTaXRlPVN0cmljdFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIm5vbmVcIjpcbiAgICAgICAgICAgIHN0ciArPSBcIjsgU2FtZVNpdGU9Tm9uZVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gc2FtZVNpdGUgaXMgaW52YWxpZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVjb2RlKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci5pbmRleE9mKFwiJVwiKSAhPT0gLTEgPyBkZWNvZGVVUklDb21wb25lbnQoc3RyKSA6IHN0cjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gICAgICByZXR1cm4gX190b1N0cmluZy5jYWxsKHZhbCkgPT09IFwiW29iamVjdCBEYXRlXVwiIHx8IHZhbCBpbnN0YW5jZW9mIERhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyeURlY29kZShzdHIsIGRlY29kZTIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGUyKHN0cik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcblxuLy8gc3JjL2Jyb3dzZXJDb29raWVTdG9yYWdlLnRzXG52YXIgaW1wb3J0X2Nvb2tpZTIgPSBfX3RvRVNNKHJlcXVpcmVfY29va2llKCkpO1xuXG4vLyBzcmMvdXRpbHMvY29va2llcy50c1xudmFyIGltcG9ydF9jb29raWUgPSBfX3RvRVNNKHJlcXVpcmVfY29va2llKCkpO1xuaW1wb3J0IHsgYmFzZTY0dXJsIH0gZnJvbSBcImpvc2VcIjtcbmZ1bmN0aW9uIHBhcnNlU3VwYWJhc2VDb29raWUoc3RyKSB7XG4gIGlmICghc3RyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBzZXNzaW9uID0gSlNPTi5wYXJzZShzdHIpO1xuICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChzZXNzaW9uLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH1cbiAgICBpZiAoc2Vzc2lvbi5jb25zdHJ1Y3Rvci5uYW1lICE9PSBcIkFycmF5XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmb3JtYXQ6ICR7c2Vzc2lvbi5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICAgIH1cbiAgICBjb25zdCBbX2hlYWRlciwgcGF5bG9hZFN0ciwgX3NpZ25hdHVyZV0gPSBzZXNzaW9uWzBdLnNwbGl0KFwiLlwiKTtcbiAgICBjb25zdCBwYXlsb2FkID0gYmFzZTY0dXJsLmRlY29kZShwYXlsb2FkU3RyKTtcbiAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QgeyBleHAsIHN1YiwgLi4udXNlciB9ID0gSlNPTi5wYXJzZShkZWNvZGVyLmRlY29kZShwYXlsb2FkKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGlyZXNfYXQ6IGV4cCxcbiAgICAgIGV4cGlyZXNfaW46IGV4cCAtIE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDFlMyksXG4gICAgICB0b2tlbl90eXBlOiBcImJlYXJlclwiLFxuICAgICAgYWNjZXNzX3Rva2VuOiBzZXNzaW9uWzBdLFxuICAgICAgcmVmcmVzaF90b2tlbjogc2Vzc2lvblsxXSxcbiAgICAgIHByb3ZpZGVyX3Rva2VuOiBzZXNzaW9uWzJdLFxuICAgICAgcHJvdmlkZXJfcmVmcmVzaF90b2tlbjogc2Vzc2lvblszXSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgaWQ6IHN1YixcbiAgICAgICAgZmFjdG9yczogc2Vzc2lvbls0XSxcbiAgICAgICAgLi4udXNlclxuICAgICAgfVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSBjb29raWUgc3RyaW5nOlwiLCBlcnIpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlTdXBhYmFzZVNlc3Npb24oc2Vzc2lvbikge1xuICB2YXIgX2E7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgc2Vzc2lvbi5hY2Nlc3NfdG9rZW4sXG4gICAgc2Vzc2lvbi5yZWZyZXNoX3Rva2VuLFxuICAgIHNlc3Npb24ucHJvdmlkZXJfdG9rZW4sXG4gICAgc2Vzc2lvbi5wcm92aWRlcl9yZWZyZXNoX3Rva2VuLFxuICAgICgoX2EgPSBzZXNzaW9uLnVzZXIpID09IG51bGwgPyB2b2lkIDAgOiBfYS5mYWN0b3JzKSA/PyBudWxsXG4gIF0pO1xufVxuXG4vLyBzcmMvdXRpbHMvaGVscGVycy50c1xuZnVuY3Rpb24gaXNCcm93c2VyKCkge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xufVxuXG4vLyBzcmMvdXRpbHMvY29uc3RhbnRzLnRzXG52YXIgREVGQVVMVF9DT09LSUVfT1BUSU9OUyA9IHtcbiAgcGF0aDogXCIvXCIsXG4gIHNhbWVTaXRlOiBcImxheFwiLFxuICBtYXhBZ2U6IDYwICogNjAgKiAyNCAqIDM2NSAqIDFlM1xufTtcblxuLy8gc3JjL2NodW5rZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZUNodW5rUmVnRXhwKGNodW5rU2l6ZSkge1xuICByZXR1cm4gbmV3IFJlZ0V4cChcIi57MSxcIiArIGNodW5rU2l6ZSArIFwifVwiLCBcImdcIik7XG59XG52YXIgTUFYX0NIVU5LX1NJWkUgPSAzMTgwO1xudmFyIE1BWF9DSFVOS19SRUdFWFAgPSBjcmVhdGVDaHVua1JlZ0V4cChNQVhfQ0hVTktfU0laRSk7XG5mdW5jdGlvbiBjcmVhdGVDaHVua3Moa2V5LCB2YWx1ZSwgY2h1bmtTaXplKSB7XG4gIGNvbnN0IHJlID0gY2h1bmtTaXplICE9PSB2b2lkIDAgPyBjcmVhdGVDaHVua1JlZ0V4cChjaHVua1NpemUpIDogTUFYX0NIVU5LX1JFR0VYUDtcbiAgY29uc3QgY2h1bmtDb3VudCA9IE1hdGguY2VpbCh2YWx1ZS5sZW5ndGggLyAoY2h1bmtTaXplID8/IE1BWF9DSFVOS19TSVpFKSk7XG4gIGlmIChjaHVua0NvdW50ID09PSAxKSB7XG4gICAgcmV0dXJuIFt7IG5hbWU6IGtleSwgdmFsdWUgfV07XG4gIH1cbiAgY29uc3QgY2h1bmtzID0gW107XG4gIGNvbnN0IHZhbHVlcyA9IHZhbHVlLm1hdGNoKHJlKTtcbiAgdmFsdWVzID09IG51bGwgPyB2b2lkIDAgOiB2YWx1ZXMuZm9yRWFjaCgodmFsdWUyLCBpKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGAke2tleX0uJHtpfWA7XG4gICAgY2h1bmtzLnB1c2goeyBuYW1lLCB2YWx1ZTogdmFsdWUyIH0pO1xuICB9KTtcbiAgcmV0dXJuIGNodW5rcztcbn1cbmZ1bmN0aW9uIGNvbWJpbmVDaHVua3Moa2V5LCByZXRyaWV2ZUNodW5rID0gKCkgPT4ge1xuICByZXR1cm4gbnVsbDtcbn0pIHtcbiAgbGV0IHZhbHVlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgOyBpKyspIHtcbiAgICBjb25zdCBjaHVua05hbWUgPSBgJHtrZXl9LiR7aX1gO1xuICAgIGNvbnN0IGNodW5rID0gcmV0cmlldmVDaHVuayhjaHVua05hbWUpO1xuICAgIGlmICghY2h1bmspIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YWx1ZXMucHVzaChjaHVuayk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyB2YWx1ZXMuam9pbihcIlwiKSA6IG51bGw7XG59XG5cbi8vIHNyYy9jb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIudHNcbnZhciBDb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvb2tpZU9wdGlvbnMpIHtcbiAgICB0aGlzLmNvb2tpZU9wdGlvbnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0NPT0tJRV9PUFRJT05TLFxuICAgICAgLi4uY29va2llT3B0aW9ucyxcbiAgICAgIG1heEFnZTogREVGQVVMVF9DT09LSUVfT1BUSU9OUy5tYXhBZ2VcbiAgICB9O1xuICB9XG4gIGdldEl0ZW0oa2V5KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldENvb2tpZShrZXkpO1xuICAgIGlmIChrZXkuZW5kc1dpdGgoXCItY29kZS12ZXJpZmllclwiKSAmJiB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXJzZVN1cGFiYXNlQ29va2llKHZhbHVlKSk7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rcyA9IGNvbWJpbmVDaHVua3Moa2V5LCAoY2h1bmtOYW1lKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb29raWUoY2h1bmtOYW1lKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2h1bmtzICE9PSBudWxsID8gSlNPTi5zdHJpbmdpZnkocGFyc2VTdXBhYmFzZUNvb2tpZShjaHVua3MpKSA6IG51bGw7XG4gIH1cbiAgc2V0SXRlbShrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleS5lbmRzV2l0aChcIi1jb2RlLXZlcmlmaWVyXCIpKSB7XG4gICAgICB0aGlzLnNldENvb2tpZShrZXksIHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHNlc3Npb24gPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICBjb25zdCBzZXNzaW9uU3RyID0gc3RyaW5naWZ5U3VwYWJhc2VTZXNzaW9uKHNlc3Npb24pO1xuICAgIGNvbnN0IHNlc3Npb25DaHVua3MgPSBjcmVhdGVDaHVua3Moa2V5LCBzZXNzaW9uU3RyKTtcbiAgICBzZXNzaW9uQ2h1bmtzLmZvckVhY2goKHNlc3MpID0+IHtcbiAgICAgIHRoaXMuc2V0Q29va2llKHNlc3MubmFtZSwgc2Vzcy52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbiAgcmVtb3ZlSXRlbShrZXkpIHtcbiAgICB0aGlzLl9kZWxldGVTaW5nbGVDb29raWUoa2V5KTtcbiAgICB0aGlzLl9kZWxldGVDaHVua2VkQ29va2llcyhrZXkpO1xuICB9XG4gIF9kZWxldGVTaW5nbGVDb29raWUoa2V5KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q29va2llKGtleSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlQ29va2llKGtleSk7XG4gICAgfVxuICB9XG4gIF9kZWxldGVDaHVua2VkQ29va2llcyhrZXksIGZyb20gPSAwKSB7XG4gICAgZm9yIChsZXQgaSA9IGZyb207IDsgaSsrKSB7XG4gICAgICBjb25zdCBjb29raWVOYW1lID0gYCR7a2V5fS4ke2l9YDtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDb29raWUoY29va2llTmFtZSk7XG4gICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVsZXRlQ29va2llKGNvb2tpZU5hbWUpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gc3JjL2Jyb3dzZXJDb29raWVTdG9yYWdlLnRzXG52YXIgQnJvd3NlckNvb2tpZUF1dGhTdG9yYWdlQWRhcHRlciA9IGNsYXNzIGV4dGVuZHMgQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIHtcbiAgY29uc3RydWN0b3IoY29va2llT3B0aW9ucykge1xuICAgIHN1cGVyKGNvb2tpZU9wdGlvbnMpO1xuICB9XG4gIGdldENvb2tpZShuYW1lKSB7XG4gICAgaWYgKCFpc0Jyb3dzZXIoKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvb2tpZXMgPSAoMCwgaW1wb3J0X2Nvb2tpZTIucGFyc2UpKGRvY3VtZW50LmNvb2tpZSk7XG4gICAgcmV0dXJuIGNvb2tpZXNbbmFtZV07XG4gIH1cbiAgc2V0Q29va2llKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKCFpc0Jyb3dzZXIoKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9ICgwLCBpbXBvcnRfY29va2llMi5zZXJpYWxpemUpKG5hbWUsIHZhbHVlLCB7XG4gICAgICAuLi50aGlzLmNvb2tpZU9wdGlvbnMsXG4gICAgICBodHRwT25seTogZmFsc2VcbiAgICB9KTtcbiAgfVxuICBkZWxldGVDb29raWUobmFtZSkge1xuICAgIGlmICghaXNCcm93c2VyKCkpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBkb2N1bWVudC5jb29raWUgPSAoMCwgaW1wb3J0X2Nvb2tpZTIuc2VyaWFsaXplKShuYW1lLCBcIlwiLCB7XG4gICAgICAuLi50aGlzLmNvb2tpZU9wdGlvbnMsXG4gICAgICBtYXhBZ2U6IDAsXG4gICAgICBodHRwT25seTogZmFsc2VcbiAgICB9KTtcbiAgfVxufTtcblxuLy8gc3JjL2NyZWF0ZUNsaWVudC50c1xuaW1wb3J0IHsgY3JlYXRlQ2xpZW50IH0gZnJvbSBcIkBzdXBhYmFzZS9zdXBhYmFzZS1qc1wiO1xuZnVuY3Rpb24gY3JlYXRlU3VwYWJhc2VDbGllbnQoc3VwYWJhc2VVcmwsIHN1cGFiYXNlS2V5LCBvcHRpb25zKSB7XG4gIHZhciBfYTtcbiAgY29uc3QgYnJvd3NlciA9IGlzQnJvd3NlcigpO1xuICByZXR1cm4gY3JlYXRlQ2xpZW50KHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgYXV0aDoge1xuICAgICAgZmxvd1R5cGU6IFwicGtjZVwiLFxuICAgICAgYXV0b1JlZnJlc2hUb2tlbjogYnJvd3NlcixcbiAgICAgIGRldGVjdFNlc3Npb25JblVybDogYnJvd3NlcixcbiAgICAgIHBlcnNpc3RTZXNzaW9uOiB0cnVlLFxuICAgICAgc3RvcmFnZTogb3B0aW9ucy5hdXRoLnN0b3JhZ2UsXG4gICAgICAvLyBmaXggdGhpcyBpbiBzdXBhYmFzZS1qc1xuICAgICAgLi4uKChfYSA9IG9wdGlvbnMuYXV0aCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnN0b3JhZ2VLZXkpID8ge1xuICAgICAgICBzdG9yYWdlS2V5OiBvcHRpb25zLmF1dGguc3RvcmFnZUtleVxuICAgICAgfSA6IHt9XG4gICAgfVxuICB9KTtcbn1cbnZhciBleHBvcnRfcGFyc2VDb29raWVzID0gaW1wb3J0X2Nvb2tpZS5wYXJzZTtcbnZhciBleHBvcnRfc2VyaWFsaXplQ29va2llID0gaW1wb3J0X2Nvb2tpZS5zZXJpYWxpemU7XG5leHBvcnQge1xuICBCcm93c2VyQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyLFxuICBDb29raWVBdXRoU3RvcmFnZUFkYXB0ZXIsXG4gIERFRkFVTFRfQ09PS0lFX09QVElPTlMsXG4gIGNyZWF0ZVN1cGFiYXNlQ2xpZW50LFxuICBpc0Jyb3dzZXIsXG4gIGV4cG9ydF9wYXJzZUNvb2tpZXMgYXMgcGFyc2VDb29raWVzLFxuICBwYXJzZVN1cGFiYXNlQ29va2llLFxuICBleHBvcnRfc2VyaWFsaXplQ29va2llIGFzIHNlcmlhbGl6ZUNvb2tpZSxcbiAgc3RyaW5naWZ5U3VwYWJhc2VTZXNzaW9uXG59O1xuLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjpcblxuY29va2llL2luZGV4LmpzOlxuICAoKiFcbiAgICogY29va2llXG4gICAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgUm9tYW4gU2h0eWxtYW5cbiAgICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAgICogTUlUIExpY2Vuc2VkXG4gICAqKVxuKi9cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXAiXSwibmFtZXMiOlsiX19jcmVhdGUiLCJPYmplY3QiLCJjcmVhdGUiLCJfX2RlZlByb3AiLCJkZWZpbmVQcm9wZXJ0eSIsIl9fZ2V0T3duUHJvcERlc2MiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfX2dldE93blByb3BOYW1lcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJfX2dldFByb3RvT2YiLCJnZXRQcm90b3R5cGVPZiIsIl9faGFzT3duUHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiX19jb21tb25KUyIsImNiIiwibW9kIiwiX19yZXF1aXJlIiwiZXhwb3J0cyIsIl9fY29weVByb3BzIiwidG8iLCJmcm9tIiwiZXhjZXB0IiwiZGVzYyIsImtleSIsImNhbGwiLCJnZXQiLCJlbnVtZXJhYmxlIiwiX190b0VTTSIsImlzTm9kZU1vZGUiLCJ0YXJnZXQiLCJfX2VzTW9kdWxlIiwidmFsdWUiLCJyZXF1aXJlX2Nvb2tpZSIsInBhcnNlIiwicGFyc2UzIiwic2VyaWFsaXplIiwic2VyaWFsaXplMyIsIl9fdG9TdHJpbmciLCJ0b1N0cmluZyIsImZpZWxkQ29udGVudFJlZ0V4cCIsInN0ciIsIm9wdGlvbnMiLCJUeXBlRXJyb3IiLCJvYmoiLCJvcHQiLCJkZWMiLCJkZWNvZGUiLCJpbmRleCIsImxlbmd0aCIsImVxSWR4IiwiaW5kZXhPZiIsImVuZElkeCIsImxhc3RJbmRleE9mIiwic2xpY2UiLCJ0cmltIiwidmFsIiwiY2hhckNvZGVBdCIsInRyeURlY29kZSIsIm5hbWUiLCJlbmMiLCJlbmNvZGUiLCJ0ZXN0IiwibWF4QWdlIiwiaXNOYU4iLCJpc0Zpbml0ZSIsIk1hdGgiLCJmbG9vciIsImRvbWFpbiIsInBhdGgiLCJleHBpcmVzIiwiaXNEYXRlIiwidmFsdWVPZiIsInRvVVRDU3RyaW5nIiwiaHR0cE9ubHkiLCJzZWN1cmUiLCJwcmlvcml0eSIsInRvTG93ZXJDYXNlIiwic2FtZVNpdGUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlbmNvZGVVUklDb21wb25lbnQiLCJEYXRlIiwiZGVjb2RlMiIsImUiLCJpbXBvcnRfY29va2llMiIsImltcG9ydF9jb29raWUiLCJiYXNlNjR1cmwiLCJwYXJzZVN1cGFiYXNlQ29va2llIiwic2Vzc2lvbiIsIkpTT04iLCJjb25zdHJ1Y3RvciIsIkVycm9yIiwiX2hlYWRlciIsInBheWxvYWRTdHIiLCJfc2lnbmF0dXJlIiwic3BsaXQiLCJwYXlsb2FkIiwiZGVjb2RlciIsIlRleHREZWNvZGVyIiwiZXhwIiwic3ViIiwidXNlciIsImV4cGlyZXNfYXQiLCJleHBpcmVzX2luIiwicm91bmQiLCJub3ciLCJ0b2tlbl90eXBlIiwiYWNjZXNzX3Rva2VuIiwicmVmcmVzaF90b2tlbiIsInByb3ZpZGVyX3Rva2VuIiwicHJvdmlkZXJfcmVmcmVzaF90b2tlbiIsImlkIiwiZmFjdG9ycyIsImVyciIsImNvbnNvbGUiLCJ3YXJuIiwic3RyaW5naWZ5U3VwYWJhc2VTZXNzaW9uIiwiX2EiLCJzdHJpbmdpZnkiLCJpc0Jyb3dzZXIiLCJ3aW5kb3ciLCJkb2N1bWVudCIsIkRFRkFVTFRfQ09PS0lFX09QVElPTlMiLCJjcmVhdGVDaHVua1JlZ0V4cCIsImNodW5rU2l6ZSIsIlJlZ0V4cCIsIk1BWF9DSFVOS19TSVpFIiwiTUFYX0NIVU5LX1JFR0VYUCIsImNyZWF0ZUNodW5rcyIsInJlIiwiY2h1bmtDb3VudCIsImNlaWwiLCJjaHVua3MiLCJ2YWx1ZXMiLCJtYXRjaCIsImZvckVhY2giLCJ2YWx1ZTIiLCJpIiwicHVzaCIsImNvbWJpbmVDaHVua3MiLCJyZXRyaWV2ZUNodW5rIiwiY2h1bmtOYW1lIiwiY2h1bmsiLCJqb2luIiwiQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIiwiY29va2llT3B0aW9ucyIsImdldEl0ZW0iLCJnZXRDb29raWUiLCJlbmRzV2l0aCIsInNldEl0ZW0iLCJzZXRDb29raWUiLCJzZXNzaW9uU3RyIiwic2Vzc2lvbkNodW5rcyIsInNlc3MiLCJyZW1vdmVJdGVtIiwiX2RlbGV0ZVNpbmdsZUNvb2tpZSIsIl9kZWxldGVDaHVua2VkQ29va2llcyIsImRlbGV0ZUNvb2tpZSIsImNvb2tpZU5hbWUiLCJCcm93c2VyQ29va2llQXV0aFN0b3JhZ2VBZGFwdGVyIiwiY29va2llcyIsImNvb2tpZSIsImNyZWF0ZUNsaWVudCIsImNyZWF0ZVN1cGFiYXNlQ2xpZW50Iiwic3VwYWJhc2VVcmwiLCJzdXBhYmFzZUtleSIsImJyb3dzZXIiLCJhdXRoIiwiZmxvd1R5cGUiLCJhdXRvUmVmcmVzaFRva2VuIiwiZGV0ZWN0U2Vzc2lvbkluVXJsIiwicGVyc2lzdFNlc3Npb24iLCJzdG9yYWdlIiwic3RvcmFnZUtleSIsImV4cG9ydF9wYXJzZUNvb2tpZXMiLCJleHBvcnRfc2VyaWFsaXplQ29va2llIiwicGFyc2VDb29raWVzIiwic2VyaWFsaXplQ29va2llIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/auth-helpers-shared/dist/index.mjs\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/postgrest-js/dist/index.mjs":
|
||
/*!************************************************************!*\
|
||
!*** ./node_modules/@supabase/postgrest-js/dist/index.mjs ***!
|
||
\************************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PostgrestBuilder: () => (/* binding */ PostgrestBuilder),\n/* harmony export */ PostgrestClient: () => (/* binding */ PostgrestClient),\n/* harmony export */ PostgrestError: () => (/* binding */ PostgrestError),\n/* harmony export */ PostgrestFilterBuilder: () => (/* binding */ PostgrestFilterBuilder),\n/* harmony export */ PostgrestQueryBuilder: () => (/* binding */ PostgrestQueryBuilder),\n/* harmony export */ PostgrestTransformBuilder: () => (/* binding */ PostgrestTransformBuilder),\n/* harmony export */ \"default\": () => (/* 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* 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\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 ${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 = `${(_fetchError$name = fetchError === null || fetchError === void 0 ? void 0 : fetchError.name) !== null && _fetchError$name !== void 0 ? _fetchError$name : \"FetchError\"}: ${fetchError === null || fetchError === void 0 ? void 0 : fetchError.message}`;\n errorDetails += `\\n\\nCaused by: ${(_cause$name = cause === null || cause === void 0 ? void 0 : cause.name) !== null && _cause$name !== void 0 ? _cause$name : \"Error\"}: ${causeMessage}`;\n if (causeCode) errorDetails += ` (${causeCode})`;\n if (cause === null || cause === void 0 ? void 0 : cause.stack) errorDetails += `\\n${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: `${(_fetchError$name2 = fetchError === null || fetchError === void 0 ? void 0 : fetchError.name) !== null && _fetchError$name2 !== void 0 ? _fetchError$name2 : \"FetchError\"}: ${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//#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, { ascending = true, nullsFirst, foreignTable, referencedTable = foreignTable } = {}) {\n const key = referencedTable ? `${referencedTable}.order` : \"order\";\n const existingOrder = this.url.searchParams.get(key);\n this.url.searchParams.set(key, `${existingOrder ? `${existingOrder},` : \"\"}${column}.${ascending ? \"asc\" : \"desc\"}${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, { foreignTable, referencedTable = foreignTable } = {}) {\n const key = typeof referencedTable === \"undefined\" ? \"limit\" : `${referencedTable}.limit`;\n this.url.searchParams.set(key, `${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, { foreignTable, referencedTable = foreignTable } = {}) {\n const keyOffset = typeof referencedTable === \"undefined\" ? \"offset\" : `${referencedTable}.offset`;\n const keyLimit = typeof referencedTable === \"undefined\" ? \"limit\" : `${referencedTable}.limit`;\n this.url.searchParams.set(keyOffset, `${from}`);\n this.url.searchParams.set(keyLimit, `${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({ analyze = false, verbose = false, settings = false, buffers = false, wal = false, format = \"text\" } = {}) {\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+${format}; for=\"${forMediatype}\"; options=${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=${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.${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.${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.${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.${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.${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.${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.${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).{${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).{${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.${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).{${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).{${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.${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.${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.${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.${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 `\"${s}\"`;\n else return `${s}`;\n }).join(\",\");\n this.url.searchParams.append(column, `in.(${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 `\"${s}\"`;\n else return `${s}`;\n }).join(\",\");\n this.url.searchParams.append(column, `not.in.(${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.${value}`);\n else if (Array.isArray(value)) this.url.searchParams.append(column, `cs.{${value.join(\",\")}}`);\n else this.url.searchParams.append(column, `cs.${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.${value}`);\n else if (Array.isArray(value)) this.url.searchParams.append(column, `cd.{${value.join(\",\")}}`);\n else this.url.searchParams.append(column, `cd.${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.${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.${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.${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.${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.${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.${value}`);\n else this.url.searchParams.append(column, `ov.{${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, { config, type } = {}) {\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 ? \"\" : `(${config})`;\n this.url.searchParams.append(column, `${typePart}fts${configPart}.${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(([column, value])=>{\n this.url.searchParams.append(column, `eq.${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.${operator}.${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, { foreignTable, referencedTable = foreignTable } = {}) {\n const key = referencedTable ? `${referencedTable}.or` : \"or\";\n this.url.searchParams.append(key, `(${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, `${operator}.${value}`);\n return this;\n }\n};\n//#endregion\n//#region src/PostgrestQueryBuilder.ts\nvar PostgrestQueryBuilder = class {\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\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=${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, { count, defaultToNull = true } = {}) {\n var _this$fetch;\n const method = \"POST\";\n if (count) this.headers.append(\"Prefer\", `count=${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)=>`\"${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, { onConflict, ignoreDuplicates = false, count, defaultToNull = true } = {}) {\n var _this$fetch2;\n const method = \"POST\";\n this.headers.append(\"Prefer\", `resolution=${ignoreDuplicates ? \"ignore\" : \"merge\"}-duplicates`);\n if (onConflict !== void 0) this.url.searchParams.set(\"on_conflict\", onConflict);\n if (count) this.headers.append(\"Prefer\", `count=${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)=>`\"${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, { count } = {}) {\n var _this$fetch3;\n const method = \"PATCH\";\n if (count) this.headers.append(\"Prefer\", `count=${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({ count } = {}) {\n var _this$fetch4;\n const method = \"DELETE\";\n if (count) this.headers.append(\"Prefer\", `count=${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//#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* 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\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(`${this.url}/${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, args = {}, { head = false, get = false, count } = {}) {\n var _this$fetch;\n let method;\n const url = new URL(`${this.url}/rpc/${fn}`);\n let body;\n if (head || get) {\n method = head ? \"HEAD\" : \"GET\";\n Object.entries(args).filter(([_, value])=>value !== void 0).map(([name, value])=>[\n name,\n Array.isArray(value) ? `{${value.join(\",\")}}` : `${value}`\n ]).forEach(([name, value])=>{\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=${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//#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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcG9zdGdyZXN0LWpzL2Rpc3QvaW5kZXgubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0I7Ozs7QUFJQSxHQUNBLElBQUlBLGlCQUFpQixjQUFjQztJQUNsQzs7Ozs7Ozs7Ozs7O0NBWUEsR0FDQUMsWUFBWUMsT0FBTyxDQUFFO1FBQ3BCLEtBQUssQ0FBQ0EsUUFBUUMsT0FBTztRQUNyQixJQUFJLENBQUNDLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ0MsT0FBTyxHQUFHSCxRQUFRRyxPQUFPO1FBQzlCLElBQUksQ0FBQ0MsSUFBSSxHQUFHSixRQUFRSSxJQUFJO1FBQ3hCLElBQUksQ0FBQ0MsSUFBSSxHQUFHTCxRQUFRSyxJQUFJO0lBQ3pCO0FBQ0Q7QUFFQSxZQUFZO0FBQ1osaUNBQWlDO0FBQ2pDLElBQUlDLG1CQUFtQjtJQUN0Qjs7Ozs7Ozs7Ozs7O0NBWUEsR0FDQVAsWUFBWVEsT0FBTyxDQUFFO1FBQ3BCLElBQUlDLHVCQUF1QkM7UUFDM0IsSUFBSSxDQUFDQyxrQkFBa0IsR0FBRztRQUMxQixJQUFJLENBQUNDLE1BQU0sR0FBR0osUUFBUUksTUFBTTtRQUM1QixJQUFJLENBQUNDLEdBQUcsR0FBR0wsUUFBUUssR0FBRztRQUN0QixJQUFJLENBQUNDLE9BQU8sR0FBRyxJQUFJQyxRQUFRUCxRQUFRTSxPQUFPO1FBQzFDLElBQUksQ0FBQ0UsTUFBTSxHQUFHUixRQUFRUSxNQUFNO1FBQzVCLElBQUksQ0FBQ0MsSUFBSSxHQUFHVCxRQUFRUyxJQUFJO1FBQ3hCLElBQUksQ0FBQ04sa0JBQWtCLEdBQUcsQ0FBQ0Ysd0JBQXdCRCxRQUFRRyxrQkFBa0IsTUFBTSxRQUFRRiwwQkFBMEIsS0FBSyxJQUFJQSx3QkFBd0I7UUFDdEosSUFBSSxDQUFDUyxNQUFNLEdBQUdWLFFBQVFVLE1BQU07UUFDNUIsSUFBSSxDQUFDQyxhQUFhLEdBQUcsQ0FBQ1Qsd0JBQXdC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cEI7SUFDQTlDO0lBQ0E3QztJQUNBbEU7SUFDQVQ7QUFDRDtBQUVBLFlBQVk7QUFDbUosQ0FDL0osa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9wb3N0Z3Jlc3QtanMvZGlzdC9pbmRleC5tanM/N2FjMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyNyZWdpb24gc3JjL1Bvc3RncmVzdEVycm9yLnRzXG4vKipcbiogRXJyb3IgZm9ybWF0XG4qXG4qIHtAbGluayBodHRwczovL3Bvc3RncmVzdC5vcmcvZW4vc3RhYmxlL2FwaS5odG1sP2hpZ2hsaWdodD1vcHRpb25zI2Vycm9ycy1hbmQtaHR0cC1zdGF0dXMtY29kZXN9XG4qL1xudmFyIFBvc3RncmVzdEVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG5cdC8qKlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHNcblx0KiBpbXBvcnQgUG9zdGdyZXN0RXJyb3IgZnJvbSAnQHN1cGFiYXNlL3Bvc3RncmVzdC1qcydcblx0KlxuXHQqIHRocm93IG5ldyBQb3N0Z3Jlc3RFcnJvcih7XG5cdCogICBtZXNzYWdlOiAnUm93IGxldmVsIHNlY3VyaXR5IHByZXZlbnRlZCB0aGUgcmVxdWVzdCcsXG5cdCogICBkZXRhaWxzOiAnUkxTIGRlbmllZCB0aGUgaW5zZXJ0Jyxcblx0KiAgIGhpbnQ6ICdDaGVjayB5b3VyIHBvbGljaWVzJyxcblx0KiAgIGNvZGU6ICdQR1JTVDMwMScsXG5cdCogfSlcblx0KiBgYGBcblx0Ki9cblx0Y29uc3RydWN0b3IoY29udGV4dCkge1xuXHRcdHN1cGVyKGNvbnRleHQubWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gXCJQb3N0Z3Jlc3RFcnJvclwiO1xuXHRcdHRoaXMuZGV0YWlscyA9IGNvbnRleHQuZGV0YWlscztcblx0XHR0aGlzLmhpbnQgPSBjb250ZXh0LmhpbnQ7XG5cdFx0dGhpcy5jb2RlID0gY29udGV4dC5jb2RlO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvUG9zdGdyZXN0QnVpbGRlci50c1xudmFyIFBvc3RncmVzdEJ1aWxkZXIgPSBjbGFzcyB7XG5cdC8qKlxuXHQqIENyZWF0ZXMgYSBidWlsZGVyIGNvbmZpZ3VyZWQgZm9yIGEgc3BlY2lmaWMgUG9zdGdSRVNUIHJlcXVlc3QuXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHRzXG5cdCogaW1wb3J0IFBvc3RncmVzdFF1ZXJ5QnVpbGRlciBmcm9tICdAc3VwYWJhc2UvcG9zdGdyZXN0LWpzJ1xuXHQqXG5cdCogY29uc3QgYnVpbGRlciA9IG5ldyBQb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIoXG5cdCogICBuZXcgVVJMKCdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vcmVzdC92MS91c2VycycpLFxuXHQqICAgeyBoZWFkZXJzOiBuZXcgSGVhZGVycyh7IGFwaWtleTogJ3B1YmxpYy1hbm9uLWtleScgfSkgfVxuXHQqIClcblx0KiBgYGBcblx0Ki9cblx0Y29uc3RydWN0b3IoYnVpbGRlcikge1xuXHRcdHZhciBfYnVpbGRlciRzaG91bGRUaHJvd08sIF9idWlsZGVyJGlzTWF5YmVTaW5nbDtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IGZhbHNlO1xuXHRcdHRoaXMubWV0aG9kID0gYnVpbGRlci5tZXRob2Q7XG5cdFx0dGhpcy51cmwgPSBidWlsZGVyLnVybDtcblx0XHR0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhidWlsZGVyLmhlYWRlcnMpO1xuXHRcdHRoaXMuc2NoZW1hID0gYnVpbGRlci5zY2hlbWE7XG5cdFx0dGhpcy5ib2R5ID0gYnVpbGRlci5ib2R5O1xuXHRcdHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yID0gKF9idWlsZGVyJHNob3VsZFRocm93TyA9IGJ1aWxkZXIuc2hvdWxkVGhyb3dPbkVycm9yKSAhPT0gbnVsbCAmJiBfYnVpbGRlciRzaG91bGRUaHJvd08gIT09IHZvaWQgMCA/IF9idWlsZGVyJHNob3VsZFRocm93TyA6IGZhbHNlO1xuXHRcdHRoaXMuc2lnbmFsID0gYnVpbGRlci5zaWduYWw7XG5cdFx0dGhpcy5pc01heWJlU2luZ2xlID0gKF9idWlsZGVyJGlzTWF5YmVTaW5nbCA9IGJ1aWxkZXIuaXNNYXliZVNpbmdsZSkgIT09IG51bGwgJiYgX2J1aWxkZXIkaXNNYXliZVNpbmdsICE9PSB2b2lkIDAgPyBfYnVpbGRlciRpc01heWJlU2luZ2wgOiBmYWxzZTtcblx0XHRpZiAoYnVpbGRlci5mZXRjaCkgdGhpcy5mZXRjaCA9IGJ1aWxkZXIuZmV0Y2g7XG5cdFx0ZWxzZSB0aGlzLmZldGNoID0gZmV0Y2g7XG5cdH1cblx0LyoqXG5cdCogSWYgdGhlcmUncyBhbiBlcnJvciB3aXRoIHRoZSBxdWVyeSwgdGhyb3dPbkVycm9yIHdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGJ5XG5cdCogdGhyb3dpbmcgdGhlIGVycm9yIGluc3RlYWQgb2YgcmV0dXJuaW5nIGl0IGFzIHBhcnQgb2YgYSBzdWNjZXNzZnVsIHJlc3BvbnNlLlxuXHQqXG5cdCoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBhYmFzZS9zdXBhYmFzZS1qcy9pc3N1ZXMvOTJ9XG5cdCovXG5cdHRocm93T25FcnJvcigpIHtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IHRydWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogU2V0IGFuIEhUVFAgaGVhZGVyIGZvciB0aGUgcmVxdWVzdC5cblx0Ki9cblx0c2V0SGVhZGVyKG5hbWUsIHZhbHVlKSB7XG5cdFx0dGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKTtcblx0XHR0aGlzLmhlYWRlcnMuc2V0KG5hbWUsIHZhbHVlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHR0aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSB7XG5cdFx0dmFyIF90aGlzID0gdGhpcztcblx0XHRpZiAodGhpcy5zY2hlbWEgPT09IHZvaWQgMCkge30gZWxzZSBpZiAoW1wiR0VUXCIsIFwiSEVBRFwiXS5pbmNsdWRlcyh0aGlzLm1ldGhvZCkpIHRoaXMuaGVhZGVycy5zZXQoXCJBY2NlcHQtUHJvZmlsZVwiLCB0aGlzLnNjaGVtYSk7XG5cdFx0ZWxzZSB0aGlzLmhlYWRlcnMuc2V0KFwiQ29udGVudC1Qcm9maWxlXCIsIHRoaXMuc2NoZW1hKTtcblx0XHRpZiAodGhpcy5tZXRob2QgIT09IFwiR0VUXCIgJiYgdGhpcy5tZXRob2QgIT09IFwiSEVBRFwiKSB0aGlzLmhlYWRlcnMuc2V0KFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcblx0XHRjb25zdCBfZmV0Y2ggPSB0aGlzLmZldGNoO1xuXHRcdGxldCByZXMgPSBfZmV0Y2godGhpcy51cmwudG9TdHJpbmcoKSwge1xuXHRcdFx0bWV0aG9kOiB0aGlzLm1ldGhvZCxcblx0XHRcdGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcblx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHRoaXMuYm9keSksXG5cdFx0XHRzaWduYWw6IHRoaXMuc2lnbmFsXG5cdFx0fSkudGhlbihhc3luYyAocmVzJDEpID0+IHtcblx0XHRcdGxldCBlcnJvciA9IG51bGw7XG5cdFx0XHRsZXQgZGF0YSA9IG51bGw7XG5cdFx0XHRsZXQgY291bnQgPSBudWxsO1xuXHRcdFx0bGV0IHN0YXR1cyA9IHJlcyQxLnN0YXR1cztcblx0XHRcdGxldCBzdGF0dXNUZXh0ID0gcmVzJDEuc3RhdHVzVGV4dDtcblx0XHRcdGlmIChyZXMkMS5vaykge1xuXHRcdFx0XHR2YXIgX3RoaXMkaGVhZGVycyRnZXQyLCBfcmVzJGhlYWRlcnMkZ2V0O1xuXHRcdFx0XHRpZiAoX3RoaXMubWV0aG9kICE9PSBcIkhFQURcIikge1xuXHRcdFx0XHRcdHZhciBfdGhpcyRoZWFkZXJzJGdldDtcblx0XHRcdFx0XHRjb25zdCBib2R5ID0gYXdhaXQgcmVzJDEudGV4dCgpO1xuXHRcdFx0XHRcdGlmIChib2R5ID09PSBcIlwiKSB7fSBlbHNlIGlmIChfdGhpcy5oZWFkZXJzLmdldChcIkFjY2VwdFwiKSA9PT0gXCJ0ZXh0L2NzdlwiKSBkYXRhID0gYm9keTtcblx0XHRcdFx0XHRlbHNlIGlmIChfdGhpcy5oZWFkZXJzLmdldChcIkFjY2VwdFwiKSAmJiAoKF90aGlzJGhlYWRlcnMkZ2V0ID0gX3RoaXMuaGVhZGVycy5nZXQoXCJBY2NlcHRcIikpID09PSBudWxsIHx8IF90aGlzJGhlYWRlcnMkZ2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRoZWFkZXJzJGdldC5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL3ZuZC5wZ3JzdC5wbGFuK3RleHRcIikpKSBkYXRhID0gYm9keTtcblx0XHRcdFx0XHRlbHNlIGRhdGEgPSBKU09OLnBhcnNlKGJvZHkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGNvdW50SGVhZGVyID0gKF90aGlzJGhlYWRlcnMkZ2V0MiA9IF90aGlzLmhlYWRlcnMuZ2V0KFwiUHJlZmVyXCIpKSA9PT0gbnVsbCB8fCBfdGhpcyRoZWFkZXJzJGdldDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGhlYWRlcnMkZ2V0Mi5tYXRjaCgvY291bnQ9KGV4YWN0fHBsYW5uZWR8ZXN0aW1hdGVkKS8pO1xuXHRcdFx0XHRjb25zdCBjb250ZW50UmFuZ2UgPSAoX3JlcyRoZWFkZXJzJGdldCA9IHJlcyQxLmhlYWRlcnMuZ2V0KFwiY29udGVudC1yYW5nZVwiKSkgPT09IG51bGwgfHwgX3JlcyRoZWFkZXJzJGdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3JlcyRoZWFkZXJzJGdldC5zcGxpdChcIi9cIik7XG5cdFx0XHRcdGlmIChjb3VudEhlYWRlciAmJiBjb250ZW50UmFuZ2UgJiYgY29udGVudFJhbmdlLmxlbmd0aCA+IDEpIGNvdW50ID0gcGFyc2VJbnQoY29udGVudFJhbmdlWzFdKTtcblx0XHRcdFx0aWYgKF90aGlzLmlzTWF5YmVTaW5nbGUgJiYgX3RoaXMubWV0aG9kID09PSBcIkdFVFwiICYmIEFycmF5LmlzQXJyYXkoZGF0YSkpIGlmIChkYXRhLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRlcnJvciA9IHtcblx0XHRcdFx0XHRcdGNvZGU6IFwiUEdSU1QxMTZcIixcblx0XHRcdFx0XHRcdGRldGFpbHM6IGBSZXN1bHRzIGNvbnRhaW4gJHtkYXRhLmxlbmd0aH0gcm93cywgYXBwbGljYXRpb24vdm5kLnBncnN0Lm9iamVjdCtqc29uIHJlcXVpcmVzIDEgcm93YCxcblx0XHRcdFx0XHRcdGhpbnQ6IG51bGwsXG5cdFx0XHRcdFx0XHRtZXNzYWdlOiBcIkpTT04gb2JqZWN0IHJlcXVlc3RlZCwgbXVsdGlwbGUgKG9yIG5vKSByb3dzIHJldHVybmVkXCJcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGRhdGEgPSBudWxsO1xuXHRcdFx0XHRcdGNvdW50ID0gbnVsbDtcblx0XHRcdFx0XHRzdGF0dXMgPSA0MDY7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiTm90IEFjY2VwdGFibGVcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChkYXRhLmxlbmd0aCA9PT0gMSkgZGF0YSA9IGRhdGFbMF07XG5cdFx0XHRcdGVsc2UgZGF0YSA9IG51bGw7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgX2Vycm9yJGRldGFpbHM7XG5cdFx0XHRcdGNvbnN0IGJvZHkgPSBhd2FpdCByZXMkMS50ZXh0KCk7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0ZXJyb3IgPSBKU09OLnBhcnNlKGJvZHkpO1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGVycm9yKSAmJiByZXMkMS5zdGF0dXMgPT09IDQwNCkge1xuXHRcdFx0XHRcdFx0ZGF0YSA9IFtdO1xuXHRcdFx0XHRcdFx0ZXJyb3IgPSBudWxsO1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMjAwO1xuXHRcdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiT0tcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKF91bnVzZWQpIHtcblx0XHRcdFx0XHRpZiAocmVzJDEuc3RhdHVzID09PSA0MDQgJiYgYm9keSA9PT0gXCJcIikge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMjA0O1xuXHRcdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiTm8gQ29udGVudFwiO1xuXHRcdFx0XHRcdH0gZWxzZSBlcnJvciA9IHsgbWVzc2FnZTogYm9keSB9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChlcnJvciAmJiBfdGhpcy5pc01heWJlU2luZ2xlICYmIChlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwIHx8IChfZXJyb3IkZGV0YWlscyA9IGVycm9yLmRldGFpbHMpID09PSBudWxsIHx8IF9lcnJvciRkZXRhaWxzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXJyb3IkZGV0YWlscy5pbmNsdWRlcyhcIjAgcm93c1wiKSkpIHtcblx0XHRcdFx0XHRlcnJvciA9IG51bGw7XG5cdFx0XHRcdFx0c3RhdHVzID0gMjAwO1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIk9LXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGVycm9yICYmIF90aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgbmV3IFBvc3RncmVzdEVycm9yKGVycm9yKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0XHRkYXRhLFxuXHRcdFx0XHRjb3VudCxcblx0XHRcdFx0c3RhdHVzLFxuXHRcdFx0XHRzdGF0dXNUZXh0XG5cdFx0XHR9O1xuXHRcdH0pO1xuXHRcdGlmICghdGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHJlcyA9IHJlcy5jYXRjaCgoZmV0Y2hFcnJvcikgPT4ge1xuXHRcdFx0dmFyIF9mZXRjaEVycm9yJG5hbWUyO1xuXHRcdFx0bGV0IGVycm9yRGV0YWlscyA9IFwiXCI7XG5cdFx0XHRjb25zdCBjYXVzZSA9IGZldGNoRXJyb3IgPT09IG51bGwgfHwgZmV0Y2hFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmV0Y2hFcnJvci5jYXVzZTtcblx0XHRcdGlmIChjYXVzZSkge1xuXHRcdFx0XHR2YXIgX2NhdXNlJG1lc3NhZ2UsIF9jYXVzZSRjb2RlLCBfZmV0Y2hFcnJvciRuYW1lLCBfY2F1c2UkbmFtZTtcblx0XHRcdFx0Y29uc3QgY2F1c2VNZXNzYWdlID0gKF9jYXVzZSRtZXNzYWdlID0gY2F1c2UgPT09IG51bGwgfHwgY2F1c2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhdXNlLm1lc3NhZ2UpICE9PSBudWxsICYmIF9jYXVzZSRtZXNzYWdlICE9PSB2b2lkIDAgPyBfY2F1c2UkbWVzc2FnZSA6IFwiXCI7XG5cdFx0XHRcdGNvbnN0IGNhdXNlQ29kZSA9IChfY2F1c2UkY29kZSA9IGNhdXNlID09PSBudWxsIHx8IGNhdXNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYXVzZS5jb2RlKSAhPT0gbnVsbCAmJiBfY2F1c2UkY29kZSAhPT0gdm9pZCAwID8gX2NhdXNlJGNvZGUgOiBcIlwiO1xuXHRcdFx0XHRlcnJvckRldGFpbHMgPSBgJHsoX2ZldGNoRXJyb3IkbmFtZSA9IGZldGNoRXJyb3IgPT09IG51bGwgfHwgZmV0Y2hFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmV0Y2hFcnJvci5uYW1lKSAhPT0gbnVsbCAmJiBfZmV0Y2hFcnJvciRuYW1lICE9PSB2b2lkIDAgPyBfZmV0Y2hFcnJvciRuYW1lIDogXCJGZXRjaEVycm9yXCJ9OiAke2ZldGNoRXJyb3IgPT09IG51bGwgfHwgZmV0Y2hFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmV0Y2hFcnJvci5tZXNzYWdlfWA7XG5cdFx0XHRcdGVycm9yRGV0YWlscyArPSBgXFxuXFxuQ2F1c2VkIGJ5OiAkeyhfY2F1c2UkbmFtZSA9IGNhdXNlID09PSBudWxsIHx8IGNhdXNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYXVzZS5uYW1lKSAhPT0gbnVsbCAmJiBfY2F1c2UkbmFtZSAhPT0gdm9pZCAwID8gX2NhdXNlJG5hbWUgOiBcIkVycm9yXCJ9OiAke2NhdXNlTWVzc2FnZX1gO1xuXHRcdFx0XHRpZiAoY2F1c2VDb2RlKSBlcnJvckRldGFpbHMgKz0gYCAoJHtjYXVzZUNvZGV9KWA7XG5cdFx0XHRcdGlmIChjYXVzZSA9PT0gbnVsbCB8fCBjYXVzZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2F1c2Uuc3RhY2spIGVycm9yRGV0YWlscyArPSBgXFxuJHtjYXVzZS5zdGFja31gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIF9mZXRjaEVycm9yJHN0YWNrO1xuXHRcdFx0XHRlcnJvckRldGFpbHMgPSAoX2ZldGNoRXJyb3Ikc3RhY2sgPSBmZXRjaEVycm9yID09PSBudWxsIHx8IGZldGNoRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZldGNoRXJyb3Iuc3RhY2spICE9PSBudWxsICYmIF9mZXRjaEVycm9yJHN0YWNrICE9PSB2b2lkIDAgPyBfZmV0Y2hFcnJvciRzdGFjayA6IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRlcnJvcjoge1xuXHRcdFx0XHRcdG1lc3NhZ2U6IGAkeyhfZmV0Y2hFcnJvciRuYW1lMiA9IGZldGNoRXJyb3IgPT09IG51bGwgfHwgZmV0Y2hFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmV0Y2hFcnJvci5uYW1lKSAhPT0gbnVsbCAmJiBfZmV0Y2hFcnJvciRuYW1lMiAhPT0gdm9pZCAwID8gX2ZldGNoRXJyb3IkbmFtZTIgOiBcIkZldGNoRXJyb3JcIn06ICR7ZmV0Y2hFcnJvciA9PT0gbnVsbCB8fCBmZXRjaEVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmZXRjaEVycm9yLm1lc3NhZ2V9YCxcblx0XHRcdFx0XHRkZXRhaWxzOiBlcnJvckRldGFpbHMsXG5cdFx0XHRcdFx0aGludDogXCJcIixcblx0XHRcdFx0XHRjb2RlOiBcIlwiXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGNvdW50OiBudWxsLFxuXHRcdFx0XHRzdGF0dXM6IDAsXG5cdFx0XHRcdHN0YXR1c1RleHQ6IFwiXCJcblx0XHRcdH07XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHJlcy50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcblx0fVxuXHQvKipcblx0KiBPdmVycmlkZSB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgYGRhdGFgLlxuXHQqXG5cdCogQHR5cGVQYXJhbSBOZXdSZXN1bHQgLSBUaGUgbmV3IHJlc3VsdCB0eXBlIHRvIG92ZXJyaWRlIHdpdGhcblx0KiBAZGVwcmVjYXRlZCBVc2Ugb3ZlcnJpZGVUeXBlczx5b3VyVHlwZSwgeyBtZXJnZTogZmFsc2UgfT4oKSBtZXRob2QgYXQgdGhlIGVuZCBvZiB5b3VyIGNhbGwgY2hhaW4gaW5zdGVhZFxuXHQqL1xuXHRyZXR1cm5zKCkge1xuXHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogT3ZlcnJpZGUgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIGBkYXRhYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UuXG5cdCpcblx0KiBAdHlwZVBhcmFtIE5ld1Jlc3VsdCAtIFRoZSBuZXcgdHlwZSB0byBjYXN0IHRoZSByZXNwb25zZSBkYXRhIHRvXG5cdCogQHR5cGVQYXJhbSBPcHRpb25zIC0gT3B0aW9uYWwgdHlwZSBjb25maWd1cmF0aW9uIChkZWZhdWx0cyB0byB7IG1lcmdlOiB0cnVlIH0pXG5cdCogQHR5cGVQYXJhbSBPcHRpb25zLm1lcmdlIC0gV2hlbiB0cnVlLCBtZXJnZXMgdGhlIG5ldyB0eXBlIHdpdGggZXhpc3RpbmcgcmV0dXJuIHR5cGUuIFdoZW4gZmFsc2UsIHJlcGxhY2VzIHRoZSBleGlzdGluZyB0eXBlcyBlbnRpcmVseSAoZGVmYXVsdHMgdG8gdHJ1ZSlcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiAvLyBNZXJnZSB3aXRoIGV4aXN0aW5nIHR5cGVzIChkZWZhdWx0IGJlaGF2aW9yKVxuXHQqIGNvbnN0IHF1ZXJ5ID0gc3VwYWJhc2Vcblx0KiAgIC5mcm9tKCd1c2VycycpXG5cdCogICAuc2VsZWN0KClcblx0KiAgIC5vdmVycmlkZVR5cGVzPHsgY3VzdG9tX2ZpZWxkOiBzdHJpbmcgfT4oKVxuXHQqXG5cdCogLy8gUmVwbGFjZSBleGlzdGluZyB0eXBlcyBjb21wbGV0ZWx5XG5cdCogY29uc3QgcmVwbGFjZVF1ZXJ5ID0gc3VwYWJhc2Vcblx0KiAgIC5mcm9tKCd1c2VycycpXG5cdCogICAuc2VsZWN0KClcblx0KiAgIC5vdmVycmlkZVR5cGVzPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nIH0sIHsgbWVyZ2U6IGZhbHNlIH0+KClcblx0KiBgYGBcblx0KiBAcmV0dXJucyBBIFBvc3RncmVzdEJ1aWxkZXIgaW5zdGFuY2Ugd2l0aCB0aGUgbmV3IHR5cGVcblx0Ki9cblx0b3ZlcnJpZGVUeXBlcygpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1Bvc3RncmVzdFRyYW5zZm9ybUJ1aWxkZXIudHNcbnZhciBQb3N0Z3Jlc3RUcmFuc2Zvcm1CdWlsZGVyID0gY2xhc3MgZXh0ZW5kcyBQb3N0Z3Jlc3RCdWlsZGVyIHtcblx0LyoqXG5cdCogUGVyZm9ybSBhIFNFTEVDVCBvbiB0aGUgcXVlcnkgcmVzdWx0LlxuXHQqXG5cdCogQnkgZGVmYXVsdCwgYC5pbnNlcnQoKWAsIGAudXBkYXRlKClgLCBgLnVwc2VydCgpYCwgYW5kIGAuZGVsZXRlKClgIGRvIG5vdFxuXHQqIHJldHVybiBtb2RpZmllZCByb3dzLiBCeSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBtb2RpZmllZCByb3dzIGFyZSByZXR1cm5lZCBpblxuXHQqIGBkYXRhYC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW5zIC0gVGhlIGNvbHVtbnMgdG8gcmV0cmlldmUsIHNlcGFyYXRlZCBieSBjb21tYXNcblx0Ki9cblx0c2VsZWN0KGNvbHVtbnMpIHtcblx0XHRsZXQgcXVvdGVkID0gZmFsc2U7XG5cdFx0Y29uc3QgY2xlYW5lZENvbHVtbnMgPSAoY29sdW1ucyAhPT0gbnVsbCAmJiBjb2x1bW5zICE9PSB2b2lkIDAgPyBjb2x1bW5zIDogXCIqXCIpLnNwbGl0KFwiXCIpLm1hcCgoYykgPT4ge1xuXHRcdFx0aWYgKC9cXHMvLnRlc3QoYykgJiYgIXF1b3RlZCkgcmV0dXJuIFwiXCI7XG5cdFx0XHRpZiAoYyA9PT0gXCJcXFwiXCIpIHF1b3RlZCA9ICFxdW90ZWQ7XG5cdFx0XHRyZXR1cm4gYztcblx0XHR9KS5qb2luKFwiXCIpO1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJzZWxlY3RcIiwgY2xlYW5lZENvbHVtbnMpO1xuXHRcdHRoaXMuaGVhZGVycy5hcHBlbmQoXCJQcmVmZXJcIiwgXCJyZXR1cm49cmVwcmVzZW50YXRpb25cIik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogT3JkZXIgdGhlIHF1ZXJ5IHJlc3VsdCBieSBgY29sdW1uYC5cblx0KlxuXHQqIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcyB0byBvcmRlciBieSBtdWx0aXBsZSBjb2x1bW5zLlxuXHQqXG5cdCogWW91IGNhbiBvcmRlciByZWZlcmVuY2VkIHRhYmxlcywgYnV0IGl0IG9ubHkgYWZmZWN0cyB0aGUgb3JkZXJpbmcgb2YgdGhlXG5cdCogcGFyZW50IHRhYmxlIGlmIHlvdSB1c2UgYCFpbm5lcmAgaW4gdGhlIHF1ZXJ5LlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gb3JkZXIgYnlcblx0KiBAcGFyYW0gb3B0aW9ucyAtIE5hbWVkIHBhcmFtZXRlcnNcblx0KiBAcGFyYW0gb3B0aW9ucy5hc2NlbmRpbmcgLSBJZiBgdHJ1ZWAsIHRoZSByZXN1bHQgd2lsbCBiZSBpbiBhc2NlbmRpbmcgb3JkZXJcblx0KiBAcGFyYW0gb3B0aW9ucy5udWxsc0ZpcnN0IC0gSWYgYHRydWVgLCBgbnVsbGBzIGFwcGVhciBmaXJzdC4gSWYgYGZhbHNlYCxcblx0KiBgbnVsbGBzIGFwcGVhciBsYXN0LlxuXHQqIEBwYXJhbSBvcHRpb25zLnJlZmVyZW5jZWRUYWJsZSAtIFNldCB0aGlzIHRvIG9yZGVyIGEgcmVmZXJlbmNlZCB0YWJsZSBieVxuXHQqIGl0cyBjb2x1bW5zXG5cdCogQHBhcmFtIG9wdGlvbnMuZm9yZWlnblRhYmxlIC0gRGVwcmVjYXRlZCwgdXNlIGBvcHRpb25zLnJlZmVyZW5jZWRUYWJsZWBcblx0KiBpbnN0ZWFkXG5cdCovXG5cdG9yZGVyKGNvbHVtbiwgeyBhc2NlbmRpbmcgPSB0cnVlLCBudWxsc0ZpcnN0LCBmb3JlaWduVGFibGUsIHJlZmVyZW5jZWRUYWJsZSA9IGZvcmVpZ25UYWJsZSB9ID0ge30pIHtcblx0XHRjb25zdCBrZXkgPSByZWZlcmVuY2VkVGFibGUgPyBgJHtyZWZlcmVuY2VkVGFibGV9Lm9yZGVyYCA6IFwib3JkZXJcIjtcblx0XHRjb25zdCBleGlzdGluZ09yZGVyID0gdGhpcy51cmwuc2VhcmNoUGFyYW1zLmdldChrZXkpO1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCBgJHtleGlzdGluZ09yZGVyID8gYCR7ZXhpc3RpbmdPcmRlcn0sYCA6IFwiXCJ9JHtjb2x1bW59LiR7YXNjZW5kaW5nID8gXCJhc2NcIiA6IFwiZGVzY1wifSR7bnVsbHNGaXJzdCA9PT0gdm9pZCAwID8gXCJcIiA6IG51bGxzRmlyc3QgPyBcIi5udWxsc2ZpcnN0XCIgOiBcIi5udWxsc2xhc3RcIn1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBMaW1pdCB0aGUgcXVlcnkgcmVzdWx0IGJ5IGBjb3VudGAuXG5cdCpcblx0KiBAcGFyYW0gY291bnQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm5cblx0KiBAcGFyYW0gb3B0aW9ucyAtIE5hbWVkIHBhcmFtZXRlcnNcblx0KiBAcGFyYW0gb3B0aW9ucy5yZWZlcmVuY2VkVGFibGUgLSBTZXQgdGhpcyB0byBsaW1pdCByb3dzIG9mIHJlZmVyZW5jZWRcblx0KiB0YWJsZXMgaW5zdGVhZCBvZiB0aGUgcGFyZW50IHRhYmxlXG5cdCogQHBhcmFtIG9wdGlvbnMuZm9yZWlnblRhYmxlIC0gRGVwcmVjYXRlZCwgdXNlIGBvcHRpb25zLnJlZmVyZW5jZWRUYWJsZWBcblx0KiBpbnN0ZWFkXG5cdCovXG5cdGxpbWl0KGNvdW50LCB7IGZvcmVpZ25UYWJsZSwgcmVmZXJlbmNlZFRhYmxlID0gZm9yZWlnblRhYmxlIH0gPSB7fSkge1xuXHRcdGNvbnN0IGtleSA9IHR5cGVvZiByZWZlcmVuY2VkVGFibGUgPT09IFwidW5kZWZpbmVkXCIgPyBcImxpbWl0XCIgOiBgJHtyZWZlcmVuY2VkVGFibGV9LmxpbWl0YDtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuc2V0KGtleSwgYCR7Y291bnR9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTGltaXQgdGhlIHF1ZXJ5IHJlc3VsdCBieSBzdGFydGluZyBhdCBhbiBvZmZzZXQgYGZyb21gIGFuZCBlbmRpbmcgYXQgdGhlIG9mZnNldCBgdG9gLlxuXHQqIE9ubHkgcmVjb3JkcyB3aXRoaW4gdGhpcyByYW5nZSBhcmUgcmV0dXJuZWQuXG5cdCogVGhpcyByZXNwZWN0cyB0aGUgcXVlcnkgb3JkZXIgYW5kIGlmIHRoZXJlIGlzIG5vIG9yZGVyIGNsYXVzZSB0aGUgcmFuZ2UgY291bGQgYmVoYXZlIHVuZXhwZWN0ZWRseS5cblx0KiBUaGUgYGZyb21gIGFuZCBgdG9gIHZhbHVlcyBhcmUgMC1iYXNlZCBhbmQgaW5jbHVzaXZlOiBgcmFuZ2UoMSwgMylgIHdpbGwgaW5jbHVkZSB0aGUgc2Vjb25kLCB0aGlyZFxuXHQqIGFuZCBmb3VydGggcm93cyBvZiB0aGUgcXVlcnkuXG5cdCpcblx0KiBAcGFyYW0gZnJvbSAtIFRoZSBzdGFydGluZyBpbmRleCBmcm9tIHdoaWNoIHRvIGxpbWl0IHRoZSByZXN1bHRcblx0KiBAcGFyYW0gdG8gLSBUaGUgbGFzdCBpbmRleCB0byB3aGljaCB0byBsaW1pdCB0aGUgcmVzdWx0XG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCogQHBhcmFtIG9wdGlvbnMucmVmZXJlbmNlZFRhYmxlIC0gU2V0IHRoaXMgdG8gbGltaXQgcm93cyBvZiByZWZlcmVuY2VkXG5cdCogdGFibGVzIGluc3RlYWQgb2YgdGhlIHBhcmVudCB0YWJsZVxuXHQqIEBwYXJhbSBvcHRpb25zLmZvcmVpZ25UYWJsZSAtIERlcHJlY2F0ZWQsIHVzZSBgb3B0aW9ucy5yZWZlcmVuY2VkVGFibGVgXG5cdCogaW5zdGVhZFxuXHQqL1xuXHRyYW5nZShmcm9tLCB0bywgeyBmb3JlaWduVGFibGUsIHJlZmVyZW5jZWRUYWJsZSA9IGZvcmVpZ25UYWJsZSB9ID0ge30pIHtcblx0XHRjb25zdCBrZXlPZmZzZXQgPSB0eXBlb2YgcmVmZXJlbmNlZFRhYmxlID09PSBcInVuZGVmaW5lZFwiID8gXCJvZmZzZXRcIiA6IGAke3JlZmVyZW5jZWRUYWJsZX0ub2Zmc2V0YDtcblx0XHRjb25zdCBrZXlMaW1pdCA9IHR5cGVvZiByZWZlcmVuY2VkVGFibGUgPT09IFwidW5kZWZpbmVkXCIgPyBcImxpbWl0XCIgOiBgJHtyZWZlcmVuY2VkVGFibGV9LmxpbWl0YDtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuc2V0KGtleU9mZnNldCwgYCR7ZnJvbX1gKTtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuc2V0KGtleUxpbWl0LCBgJHt0byAtIGZyb20gKyAxfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIFNldCB0aGUgQWJvcnRTaWduYWwgZm9yIHRoZSBmZXRjaCByZXF1ZXN0LlxuXHQqXG5cdCogQHBhcmFtIHNpZ25hbCAtIFRoZSBBYm9ydFNpZ25hbCB0byB1c2UgZm9yIHRoZSBmZXRjaCByZXF1ZXN0XG5cdCovXG5cdGFib3J0U2lnbmFsKHNpZ25hbCkge1xuXHRcdHRoaXMuc2lnbmFsID0gc2lnbmFsO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybiBgZGF0YWAgYXMgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYW4gYXJyYXkgb2Ygb2JqZWN0cy5cblx0KlxuXHQqIFF1ZXJ5IHJlc3VsdCBtdXN0IGJlIG9uZSByb3cgKGUuZy4gdXNpbmcgYC5saW1pdCgxKWApLCBvdGhlcndpc2UgdGhpc1xuXHQqIHJldHVybnMgYW4gZXJyb3IuXG5cdCovXG5cdHNpbmdsZSgpIHtcblx0XHR0aGlzLmhlYWRlcnMuc2V0KFwiQWNjZXB0XCIsIFwiYXBwbGljYXRpb24vdm5kLnBncnN0Lm9iamVjdCtqc29uXCIpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybiBgZGF0YWAgYXMgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYW4gYXJyYXkgb2Ygb2JqZWN0cy5cblx0KlxuXHQqIFF1ZXJ5IHJlc3VsdCBtdXN0IGJlIHplcm8gb3Igb25lIHJvdyAoZS5nLiB1c2luZyBgLmxpbWl0KDEpYCksIG90aGVyd2lzZVxuXHQqIHRoaXMgcmV0dXJucyBhbiBlcnJvci5cblx0Ki9cblx0bWF5YmVTaW5nbGUoKSB7XG5cdFx0aWYgKHRoaXMubWV0aG9kID09PSBcIkdFVFwiKSB0aGlzLmhlYWRlcnMuc2V0KFwiQWNjZXB0XCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcblx0XHRlbHNlIHRoaXMuaGVhZGVycy5zZXQoXCJBY2NlcHRcIiwgXCJhcHBsaWNhdGlvbi92bmQucGdyc3Qub2JqZWN0K2pzb25cIik7XG5cdFx0dGhpcy5pc01heWJlU2luZ2xlID0gdHJ1ZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBSZXR1cm4gYGRhdGFgIGFzIGEgc3RyaW5nIGluIENTViBmb3JtYXQuXG5cdCovXG5cdGNzdigpIHtcblx0XHR0aGlzLmhlYWRlcnMuc2V0KFwiQWNjZXB0XCIsIFwidGV4dC9jc3ZcIik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogUmV0dXJuIGBkYXRhYCBhcyBhbiBvYmplY3QgaW4gW0dlb0pTT05dKGh0dHBzOi8vZ2VvanNvbi5vcmcpIGZvcm1hdC5cblx0Ki9cblx0Z2VvanNvbigpIHtcblx0XHR0aGlzLmhlYWRlcnMuc2V0KFwiQWNjZXB0XCIsIFwiYXBwbGljYXRpb24vZ2VvK2pzb25cIik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogUmV0dXJuIGBkYXRhYCBhcyB0aGUgRVhQTEFJTiBwbGFuIGZvciB0aGUgcXVlcnkuXG5cdCpcblx0KiBZb3UgbmVlZCB0byBlbmFibGUgdGhlXG5cdCogW2RiX3BsYW5fZW5hYmxlZF0oaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9ndWlkZXMvZGF0YWJhc2UvZGVidWdnaW5nLXBlcmZvcm1hbmNlI2VuYWJsaW5nLWV4cGxhaW4pXG5cdCogc2V0dGluZyBiZWZvcmUgdXNpbmcgdGhpcyBtZXRob2QuXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucyAtIE5hbWVkIHBhcmFtZXRlcnNcblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zLmFuYWx5emUgLSBJZiBgdHJ1ZWAsIHRoZSBxdWVyeSB3aWxsIGJlIGV4ZWN1dGVkIGFuZCB0aGVcblx0KiBhY3R1YWwgcnVuIHRpbWUgd2lsbCBiZSByZXR1cm5lZFxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMudmVyYm9zZSAtIElmIGB0cnVlYCwgdGhlIHF1ZXJ5IGlkZW50aWZpZXIgd2lsbCBiZSByZXR1cm5lZFxuXHQqIGFuZCBgZGF0YWAgd2lsbCBpbmNsdWRlIHRoZSBvdXRwdXQgY29sdW1ucyBvZiB0aGUgcXVlcnlcblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zLnNldHRpbmdzIC0gSWYgYHRydWVgLCBpbmNsdWRlIGluZm9ybWF0aW9uIG9uIGNvbmZpZ3VyYXRpb25cblx0KiBwYXJhbWV0ZXJzIHRoYXQgYWZmZWN0IHF1ZXJ5IHBsYW5uaW5nXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucy5idWZmZXJzIC0gSWYgYHRydWVgLCBpbmNsdWRlIGluZm9ybWF0aW9uIG9uIGJ1ZmZlciB1c2FnZVxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMud2FsIC0gSWYgYHRydWVgLCBpbmNsdWRlIGluZm9ybWF0aW9uIG9uIFdBTCByZWNvcmQgZ2VuZXJhdGlvblxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMuZm9ybWF0IC0gVGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0LCBjYW4gYmUgYFwidGV4dFwiYCAoZGVmYXVsdClcblx0KiBvciBgXCJqc29uXCJgXG5cdCovXG5cdGV4cGxhaW4oeyBhbmFseXplID0gZmFsc2UsIHZlcmJvc2UgPSBmYWxzZSwgc2V0dGluZ3MgPSBmYWxzZSwgYnVmZmVycyA9IGZhbHNlLCB3YWwgPSBmYWxzZSwgZm9ybWF0ID0gXCJ0ZXh0XCIgfSA9IHt9KSB7XG5cdFx0dmFyIF90aGlzJGhlYWRlcnMkZ2V0O1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBbXG5cdFx0XHRhbmFseXplID8gXCJhbmFseXplXCIgOiBudWxsLFxuXHRcdFx0dmVyYm9zZSA/IFwidmVyYm9zZVwiIDogbnVsbCxcblx0XHRcdHNldHRpbmdzID8gXCJzZXR0aW5nc1wiIDogbnVsbCxcblx0XHRcdGJ1ZmZlcnMgPyBcImJ1ZmZlcnNcIiA6IG51bGwsXG5cdFx0XHR3YWwgPyBcIndhbFwiIDogbnVsbFxuXHRcdF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCJ8XCIpO1xuXHRcdGNvbnN0IGZvck1lZGlhdHlwZSA9IChfdGhpcyRoZWFkZXJzJGdldCA9IHRoaXMuaGVhZGVycy5nZXQoXCJBY2NlcHRcIikpICE9PSBudWxsICYmIF90aGlzJGhlYWRlcnMkZ2V0ICE9PSB2b2lkIDAgPyBfdGhpcyRoZWFkZXJzJGdldCA6IFwiYXBwbGljYXRpb24vanNvblwiO1xuXHRcdHRoaXMuaGVhZGVycy5zZXQoXCJBY2NlcHRcIiwgYGFwcGxpY2F0aW9uL3ZuZC5wZ3JzdC5wbGFuKyR7Zm9ybWF0fTsgZm9yPVwiJHtmb3JNZWRpYXR5cGV9XCI7IG9wdGlvbnM9JHtvcHRpb25zfTtgKTtcblx0XHRpZiAoZm9ybWF0ID09PSBcImpzb25cIikgcmV0dXJuIHRoaXM7XG5cdFx0ZWxzZSByZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBSb2xsYmFjayB0aGUgcXVlcnkuXG5cdCpcblx0KiBgZGF0YWAgd2lsbCBzdGlsbCBiZSByZXR1cm5lZCwgYnV0IHRoZSBxdWVyeSBpcyBub3QgY29tbWl0dGVkLlxuXHQqL1xuXHRyb2xsYmFjaygpIHtcblx0XHR0aGlzLmhlYWRlcnMuYXBwZW5kKFwiUHJlZmVyXCIsIFwidHg9cm9sbGJhY2tcIik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogT3ZlcnJpZGUgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIGBkYXRhYC5cblx0KlxuXHQqIEB0eXBlUGFyYW0gTmV3UmVzdWx0IC0gVGhlIG5ldyByZXN1bHQgdHlwZSB0byBvdmVycmlkZSB3aXRoXG5cdCogQGRlcHJlY2F0ZWQgVXNlIG92ZXJyaWRlVHlwZXM8eW91clR5cGUsIHsgbWVyZ2U6IGZhbHNlIH0+KCkgbWV0aG9kIGF0IHRoZSBlbmQgb2YgeW91ciBjYWxsIGNoYWluIGluc3RlYWRcblx0Ki9cblx0cmV0dXJucygpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCBjYW4gYmUgYWZmZWN0ZWQgYnkgdGhlIHF1ZXJ5LlxuXHQqIE9ubHkgYXZhaWxhYmxlIGluIFBvc3RnUkVTVCB2MTMrIGFuZCBvbmx5IHdvcmtzIHdpdGggUEFUQ0ggYW5kIERFTEVURSBtZXRob2RzLlxuXHQqXG5cdCogQHBhcmFtIHZhbHVlIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCBjYW4gYmUgYWZmZWN0ZWRcblx0Ki9cblx0bWF4QWZmZWN0ZWQodmFsdWUpIHtcblx0XHR0aGlzLmhlYWRlcnMuYXBwZW5kKFwiUHJlZmVyXCIsIFwiaGFuZGxpbmc9c3RyaWN0XCIpO1xuXHRcdHRoaXMuaGVhZGVycy5hcHBlbmQoXCJQcmVmZXJcIiwgYG1heC1hZmZlY3RlZD0ke3ZhbHVlfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvUG9zdGdyZXN0RmlsdGVyQnVpbGRlci50c1xuY29uc3QgUG9zdGdyZXN0UmVzZXJ2ZWRDaGFyc1JlZ2V4cCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgUmVnRXhwKFwiWywoKV1cIik7XG52YXIgUG9zdGdyZXN0RmlsdGVyQnVpbGRlciA9IGNsYXNzIGV4dGVuZHMgUG9zdGdyZXN0VHJhbnNmb3JtQnVpbGRlciB7XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBpcyBlcXVhbCB0byBgdmFsdWVgLlxuXHQqXG5cdCogVG8gY2hlY2sgaWYgdGhlIHZhbHVlIG9mIGBjb2x1bW5gIGlzIE5VTEwsIHlvdSBzaG91bGQgdXNlIGAuaXMoKWAgaW5zdGVhZC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBmaWx0ZXIgd2l0aFxuXHQqL1xuXHRlcShjb2x1bW4sIHZhbHVlKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBlcS4ke3ZhbHVlfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBpcyBub3QgZXF1YWwgdG8gYHZhbHVlYC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBmaWx0ZXIgd2l0aFxuXHQqL1xuXHRuZXEoY29sdW1uLCB2YWx1ZSkge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgbmVxLiR7dmFsdWV9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIGlzIGdyZWF0ZXIgdGhhbiBgdmFsdWVgLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdGd0KGNvbHVtbiwgdmFsdWUpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGd0LiR7dmFsdWV9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgdmFsdWVgLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdGd0ZShjb2x1bW4sIHZhbHVlKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBndGUuJHt2YWx1ZX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgaXMgbGVzcyB0aGFuIGB2YWx1ZWAuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0bHQoY29sdW1uLCB2YWx1ZSkge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgbHQuJHt2YWx1ZX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGB2YWx1ZWAuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0bHRlKGNvbHVtbiwgdmFsdWUpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGx0ZS4ke3ZhbHVlfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBtYXRjaGVzIGBwYXR0ZXJuYCBjYXNlLXNlbnNpdGl2ZWx5LlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHBhdHRlcm4gLSBUaGUgcGF0dGVybiB0byBtYXRjaCB3aXRoXG5cdCovXG5cdGxpa2UoY29sdW1uLCBwYXR0ZXJuKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBsaWtlLiR7cGF0dGVybn1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgbWF0Y2hlcyBhbGwgb2YgYHBhdHRlcm5zYCBjYXNlLXNlbnNpdGl2ZWx5LlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHBhdHRlcm5zIC0gVGhlIHBhdHRlcm5zIHRvIG1hdGNoIHdpdGhcblx0Ki9cblx0bGlrZUFsbE9mKGNvbHVtbiwgcGF0dGVybnMpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGxpa2UoYWxsKS57JHtwYXR0ZXJucy5qb2luKFwiLFwiKX19YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIG1hdGNoZXMgYW55IG9mIGBwYXR0ZXJuc2AgY2FzZS1zZW5zaXRpdmVseS5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSBwYXR0ZXJucyAtIFRoZSBwYXR0ZXJucyB0byBtYXRjaCB3aXRoXG5cdCovXG5cdGxpa2VBbnlPZihjb2x1bW4sIHBhdHRlcm5zKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBsaWtlKGFueSkueyR7cGF0dGVybnMuam9pbihcIixcIil9fWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBtYXRjaGVzIGBwYXR0ZXJuYCBjYXNlLWluc2Vuc2l0aXZlbHkuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gcGF0dGVybiAtIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdpdGhcblx0Ki9cblx0aWxpa2UoY29sdW1uLCBwYXR0ZXJuKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBpbGlrZS4ke3BhdHRlcm59YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIG1hdGNoZXMgYWxsIG9mIGBwYXR0ZXJuc2AgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHBhdHRlcm5zIC0gVGhlIHBhdHRlcm5zIHRvIG1hdGNoIHdpdGhcblx0Ki9cblx0aWxpa2VBbGxPZihjb2x1bW4sIHBhdHRlcm5zKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBpbGlrZShhbGwpLnske3BhdHRlcm5zLmpvaW4oXCIsXCIpfX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgbWF0Y2hlcyBhbnkgb2YgYHBhdHRlcm5zYCBjYXNlLWluc2Vuc2l0aXZlbHkuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gcGF0dGVybnMgLSBUaGUgcGF0dGVybnMgdG8gbWF0Y2ggd2l0aFxuXHQqL1xuXHRpbGlrZUFueU9mKGNvbHVtbiwgcGF0dGVybnMpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGlsaWtlKGFueSkueyR7cGF0dGVybnMuam9pbihcIixcIil9fWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBtYXRjaGVzIHRoZSBQb3N0Z3JlU1FMIHJlZ2V4IGBwYXR0ZXJuYFxuXHQqIGNhc2Utc2Vuc2l0aXZlbHkgKHVzaW5nIHRoZSBgfmAgb3BlcmF0b3IpLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHBhdHRlcm4gLSBUaGUgUG9zdGdyZVNRTCByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCB3aXRoXG5cdCovXG5cdHJlZ2V4TWF0Y2goY29sdW1uLCBwYXR0ZXJuKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBtYXRjaC4ke3BhdHRlcm59YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIG1hdGNoZXMgdGhlIFBvc3RncmVTUUwgcmVnZXggYHBhdHRlcm5gXG5cdCogY2FzZS1pbnNlbnNpdGl2ZWx5ICh1c2luZyB0aGUgYH4qYCBvcGVyYXRvcikuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gcGF0dGVybiAtIFRoZSBQb3N0Z3JlU1FMIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIHdpdGhcblx0Ki9cblx0cmVnZXhJTWF0Y2goY29sdW1uLCBwYXR0ZXJuKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBpbWF0Y2guJHtwYXR0ZXJufWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBgY29sdW1uYCBJUyBgdmFsdWVgLlxuXHQqXG5cdCogRm9yIG5vbi1ib29sZWFuIGNvbHVtbnMsIHRoaXMgaXMgb25seSByZWxldmFudCBmb3IgY2hlY2tpbmcgaWYgdGhlIHZhbHVlIG9mXG5cdCogYGNvbHVtbmAgaXMgTlVMTCBieSBzZXR0aW5nIGB2YWx1ZWAgdG8gYG51bGxgLlxuXHQqXG5cdCogRm9yIGJvb2xlYW4gY29sdW1ucywgeW91IGNhbiBhbHNvIHNldCBgdmFsdWVgIHRvIGB0cnVlYCBvciBgZmFsc2VgIGFuZCBpdFxuXHQqIHdpbGwgYmVoYXZlIHRoZSBzYW1lIHdheSBhcyBgLmVxKClgLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdGlzKGNvbHVtbiwgdmFsdWUpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGlzLiR7dmFsdWV9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoZXJlIGBjb2x1bW5gIElTIERJU1RJTkNUIEZST00gYHZhbHVlYC5cblx0KlxuXHQqIFVubGlrZSBgLm5lcSgpYCwgdGhpcyB0cmVhdHMgYE5VTExgIGFzIGEgY29tcGFyYWJsZSB2YWx1ZS4gVHdvIGBOVUxMYCB2YWx1ZXNcblx0KiBhcmUgY29uc2lkZXJlZCBlcXVhbCAobm90IGRpc3RpbmN0KSwgYW5kIGNvbXBhcmluZyBgTlVMTGAgd2l0aCBhbnkgbm9uLU5VTExcblx0KiB2YWx1ZSByZXR1cm5zIHRydWUgKGRpc3RpbmN0KS5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBmaWx0ZXIgd2l0aFxuXHQqL1xuXHRpc0Rpc3RpbmN0KGNvbHVtbiwgdmFsdWUpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGlzZGlzdGluY3QuJHt2YWx1ZX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGB2YWx1ZXNgIGFycmF5LlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHZhbHVlcyAtIFRoZSB2YWx1ZXMgYXJyYXkgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0aW4oY29sdW1uLCB2YWx1ZXMpIHtcblx0XHRjb25zdCBjbGVhbmVkVmFsdWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KHZhbHVlcykpLm1hcCgocykgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiBzID09PSBcInN0cmluZ1wiICYmIFBvc3RncmVzdFJlc2VydmVkQ2hhcnNSZWdleHAudGVzdChzKSkgcmV0dXJuIGBcIiR7c31cImA7XG5cdFx0XHRlbHNlIHJldHVybiBgJHtzfWA7XG5cdFx0fSkuam9pbihcIixcIik7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBpbi4oJHtjbGVhbmVkVmFsdWVzfSlgKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgaXMgTk9UIGluY2x1ZGVkIGluIHRoZSBgdmFsdWVzYCBhcnJheS5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgdmFsdWVzIGFycmF5IHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdG5vdEluKGNvbHVtbiwgdmFsdWVzKSB7XG5cdFx0Y29uc3QgY2xlYW5lZFZhbHVlcyA9IEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKS5tYXAoKHMpID0+IHtcblx0XHRcdGlmICh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIiAmJiBQb3N0Z3Jlc3RSZXNlcnZlZENoYXJzUmVnZXhwLnRlc3QocykpIHJldHVybiBgXCIke3N9XCJgO1xuXHRcdFx0ZWxzZSByZXR1cm4gYCR7c31gO1xuXHRcdH0pLmpvaW4oXCIsXCIpO1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgbm90LmluLigke2NsZWFuZWRWYWx1ZXN9KWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE9ubHkgcmVsZXZhbnQgZm9yIGpzb25iLCBhcnJheSwgYW5kIHJhbmdlIGNvbHVtbnMuIE1hdGNoIG9ubHkgcm93cyB3aGVyZVxuXHQqIGBjb2x1bW5gIGNvbnRhaW5zIGV2ZXJ5IGVsZW1lbnQgYXBwZWFyaW5nIGluIGB2YWx1ZWAuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGpzb25iLCBhcnJheSwgb3IgcmFuZ2UgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSB2YWx1ZSAtIFRoZSBqc29uYiwgYXJyYXksIG9yIHJhbmdlIHZhbHVlIHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdGNvbnRhaW5zKGNvbHVtbiwgdmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGNzLiR7dmFsdWV9YCk7XG5cdFx0ZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgY3MueyR7dmFsdWUuam9pbihcIixcIil9fWApO1xuXHRcdGVsc2UgdGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBjcy4ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBPbmx5IHJlbGV2YW50IGZvciBqc29uYiwgYXJyYXksIGFuZCByYW5nZSBjb2x1bW5zLiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmVcblx0KiBldmVyeSBlbGVtZW50IGFwcGVhcmluZyBpbiBgY29sdW1uYCBpcyBjb250YWluZWQgYnkgYHZhbHVlYC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUganNvbmIsIGFycmF5LCBvciByYW5nZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHZhbHVlIC0gVGhlIGpzb25iLCBhcnJheSwgb3IgcmFuZ2UgdmFsdWUgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0Y29udGFpbmVkQnkoY29sdW1uLCB2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgY2QuJHt2YWx1ZX1gKTtcblx0XHRlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgdGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBjZC57JHt2YWx1ZS5qb2luKFwiLFwiKX19YCk7XG5cdFx0ZWxzZSB0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYGNkLiR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE9ubHkgcmVsZXZhbnQgZm9yIHJhbmdlIGNvbHVtbnMuIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBldmVyeSBlbGVtZW50IGluXG5cdCogYGNvbHVtbmAgaXMgZ3JlYXRlciB0aGFuIGFueSBlbGVtZW50IGluIGByYW5nZWAuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIHJhbmdlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gcmFuZ2UgLSBUaGUgcmFuZ2UgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0cmFuZ2VHdChjb2x1bW4sIHJhbmdlKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBzci4ke3JhbmdlfWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE9ubHkgcmVsZXZhbnQgZm9yIHJhbmdlIGNvbHVtbnMuIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBldmVyeSBlbGVtZW50IGluXG5cdCogYGNvbHVtbmAgaXMgZWl0aGVyIGNvbnRhaW5lZCBpbiBgcmFuZ2VgIG9yIGdyZWF0ZXIgdGhhbiBhbnkgZWxlbWVudCBpblxuXHQqIGByYW5nZWAuXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIHJhbmdlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gcmFuZ2UgLSBUaGUgcmFuZ2UgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0cmFuZ2VHdGUoY29sdW1uLCByYW5nZSkge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgbnhsLiR7cmFuZ2V9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogT25seSByZWxldmFudCBmb3IgcmFuZ2UgY29sdW1ucy4gTWF0Y2ggb25seSByb3dzIHdoZXJlIGV2ZXJ5IGVsZW1lbnQgaW5cblx0KiBgY29sdW1uYCBpcyBsZXNzIHRoYW4gYW55IGVsZW1lbnQgaW4gYHJhbmdlYC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgcmFuZ2UgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSByYW5nZSAtIFRoZSByYW5nZSB0byBmaWx0ZXIgd2l0aFxuXHQqL1xuXHRyYW5nZUx0KGNvbHVtbiwgcmFuZ2UpIHtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYHNsLiR7cmFuZ2V9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogT25seSByZWxldmFudCBmb3IgcmFuZ2UgY29sdW1ucy4gTWF0Y2ggb25seSByb3dzIHdoZXJlIGV2ZXJ5IGVsZW1lbnQgaW5cblx0KiBgY29sdW1uYCBpcyBlaXRoZXIgY29udGFpbmVkIGluIGByYW5nZWAgb3IgbGVzcyB0aGFuIGFueSBlbGVtZW50IGluXG5cdCogYHJhbmdlYC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgcmFuZ2UgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSByYW5nZSAtIFRoZSByYW5nZSB0byBmaWx0ZXIgd2l0aFxuXHQqL1xuXHRyYW5nZUx0ZShjb2x1bW4sIHJhbmdlKSB7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChjb2x1bW4sIGBueHIuJHtyYW5nZX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBPbmx5IHJlbGV2YW50IGZvciByYW5nZSBjb2x1bW5zLiBNYXRjaCBvbmx5IHJvd3Mgd2hlcmUgYGNvbHVtbmAgaXNcblx0KiBtdXR1YWxseSBleGNsdXNpdmUgdG8gYHJhbmdlYCBhbmQgdGhlcmUgY2FuIGJlIG5vIGVsZW1lbnQgYmV0d2VlbiB0aGUgdHdvXG5cdCogcmFuZ2VzLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSByYW5nZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIHJhbmdlIC0gVGhlIHJhbmdlIHRvIGZpbHRlciB3aXRoXG5cdCovXG5cdHJhbmdlQWRqYWNlbnQoY29sdW1uLCByYW5nZSkge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgYWRqLiR7cmFuZ2V9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogT25seSByZWxldmFudCBmb3IgYXJyYXkgYW5kIHJhbmdlIGNvbHVtbnMuIE1hdGNoIG9ubHkgcm93cyB3aGVyZVxuXHQqIGBjb2x1bW5gIGFuZCBgdmFsdWVgIGhhdmUgYW4gZWxlbWVudCBpbiBjb21tb24uXG5cdCpcblx0KiBAcGFyYW0gY29sdW1uIC0gVGhlIGFycmF5IG9yIHJhbmdlIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gdmFsdWUgLSBUaGUgYXJyYXkgb3IgcmFuZ2UgdmFsdWUgdG8gZmlsdGVyIHdpdGhcblx0Ki9cblx0b3ZlcmxhcHMoY29sdW1uLCB2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgb3YuJHt2YWx1ZX1gKTtcblx0XHRlbHNlIHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgb3YueyR7dmFsdWUuam9pbihcIixcIil9fWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE9ubHkgcmVsZXZhbnQgZm9yIHRleHQgYW5kIHRzdmVjdG9yIGNvbHVtbnMuIE1hdGNoIG9ubHkgcm93cyB3aGVyZVxuXHQqIGBjb2x1bW5gIG1hdGNoZXMgdGhlIHF1ZXJ5IHN0cmluZyBpbiBgcXVlcnlgLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSB0ZXh0IG9yIHRzdmVjdG9yIGNvbHVtbiB0byBmaWx0ZXIgb25cblx0KiBAcGFyYW0gcXVlcnkgLSBUaGUgcXVlcnkgdGV4dCB0byBtYXRjaCB3aXRoXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCogQHBhcmFtIG9wdGlvbnMuY29uZmlnIC0gVGhlIHRleHQgc2VhcmNoIGNvbmZpZ3VyYXRpb24gdG8gdXNlXG5cdCogQHBhcmFtIG9wdGlvbnMudHlwZSAtIENoYW5nZSBob3cgdGhlIGBxdWVyeWAgdGV4dCBpcyBpbnRlcnByZXRlZFxuXHQqL1xuXHR0ZXh0U2VhcmNoKGNvbHVtbiwgcXVlcnksIHsgY29uZmlnLCB0eXBlIH0gPSB7fSkge1xuXHRcdGxldCB0eXBlUGFydCA9IFwiXCI7XG5cdFx0aWYgKHR5cGUgPT09IFwicGxhaW5cIikgdHlwZVBhcnQgPSBcInBsXCI7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJwaHJhc2VcIikgdHlwZVBhcnQgPSBcInBoXCI7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJ3ZWJzZWFyY2hcIikgdHlwZVBhcnQgPSBcIndcIjtcblx0XHRjb25zdCBjb25maWdQYXJ0ID0gY29uZmlnID09PSB2b2lkIDAgPyBcIlwiIDogYCgke2NvbmZpZ30pYDtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGNvbHVtbiwgYCR7dHlwZVBhcnR9ZnRzJHtjb25maWdQYXJ0fS4ke3F1ZXJ5fWApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIE1hdGNoIG9ubHkgcm93cyB3aGVyZSBlYWNoIGNvbHVtbiBpbiBgcXVlcnlgIGtleXMgaXMgZXF1YWwgdG8gaXRzXG5cdCogYXNzb2NpYXRlZCB2YWx1ZS4gU2hvcnRoYW5kIGZvciBtdWx0aXBsZSBgLmVxKClgcy5cblx0KlxuXHQqIEBwYXJhbSBxdWVyeSAtIFRoZSBvYmplY3QgdG8gZmlsdGVyIHdpdGgsIHdpdGggY29sdW1uIG5hbWVzIGFzIGtleXMgbWFwcGVkXG5cdCogdG8gdGhlaXIgZmlsdGVyIHZhbHVlc1xuXHQqL1xuXHRtYXRjaChxdWVyeSkge1xuXHRcdE9iamVjdC5lbnRyaWVzKHF1ZXJ5KS5mb3JFYWNoKChbY29sdW1uLCB2YWx1ZV0pID0+IHtcblx0XHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgZXEuJHt2YWx1ZX1gKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hpY2ggZG9lc24ndCBzYXRpc2Z5IHRoZSBmaWx0ZXIuXG5cdCpcblx0KiBVbmxpa2UgbW9zdCBmaWx0ZXJzLCBgb3BlYXJhdG9yYCBhbmQgYHZhbHVlYCBhcmUgdXNlZCBhcy1pcyBhbmQgbmVlZCB0b1xuXHQqIGZvbGxvdyBbUG9zdGdSRVNUXG5cdCogc3ludGF4XShodHRwczovL3Bvc3RncmVzdC5vcmcvZW4vc3RhYmxlL2FwaS5odG1sI29wZXJhdG9ycykuIFlvdSBhbHNvIG5lZWRcblx0KiB0byBtYWtlIHN1cmUgdGhleSBhcmUgcHJvcGVybHkgc2FuaXRpemVkLlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbiAtIFRoZSBjb2x1bW4gdG8gZmlsdGVyIG9uXG5cdCogQHBhcmFtIG9wZXJhdG9yIC0gVGhlIG9wZXJhdG9yIHRvIGJlIG5lZ2F0ZWQgdG8gZmlsdGVyIHdpdGgsIGZvbGxvd2luZ1xuXHQqIFBvc3RnUkVTVCBzeW50YXhcblx0KiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZmlsdGVyIHdpdGgsIGZvbGxvd2luZyBQb3N0Z1JFU1Qgc3ludGF4XG5cdCovXG5cdG5vdChjb2x1bW4sIG9wZXJhdG9yLCB2YWx1ZSkge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgbm90LiR7b3BlcmF0b3J9LiR7dmFsdWV9YCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogTWF0Y2ggb25seSByb3dzIHdoaWNoIHNhdGlzZnkgYXQgbGVhc3Qgb25lIG9mIHRoZSBmaWx0ZXJzLlxuXHQqXG5cdCogVW5saWtlIG1vc3QgZmlsdGVycywgYGZpbHRlcnNgIGlzIHVzZWQgYXMtaXMgYW5kIG5lZWRzIHRvIGZvbGxvdyBbUG9zdGdSRVNUXG5cdCogc3ludGF4XShodHRwczovL3Bvc3RncmVzdC5vcmcvZW4vc3RhYmxlL2FwaS5odG1sI29wZXJhdG9ycykuIFlvdSBhbHNvIG5lZWRcblx0KiB0byBtYWtlIHN1cmUgaXQncyBwcm9wZXJseSBzYW5pdGl6ZWQuXG5cdCpcblx0KiBJdCdzIGN1cnJlbnRseSBub3QgcG9zc2libGUgdG8gZG8gYW4gYC5vcigpYCBmaWx0ZXIgYWNyb3NzIG11bHRpcGxlIHRhYmxlcy5cblx0KlxuXHQqIEBwYXJhbSBmaWx0ZXJzIC0gVGhlIGZpbHRlcnMgdG8gdXNlLCBmb2xsb3dpbmcgUG9zdGdSRVNUIHN5bnRheFxuXHQqIEBwYXJhbSBvcHRpb25zIC0gTmFtZWQgcGFyYW1ldGVyc1xuXHQqIEBwYXJhbSBvcHRpb25zLnJlZmVyZW5jZWRUYWJsZSAtIFNldCB0aGlzIHRvIGZpbHRlciBvbiByZWZlcmVuY2VkIHRhYmxlc1xuXHQqIGluc3RlYWQgb2YgdGhlIHBhcmVudCB0YWJsZVxuXHQqIEBwYXJhbSBvcHRpb25zLmZvcmVpZ25UYWJsZSAtIERlcHJlY2F0ZWQsIHVzZSBgcmVmZXJlbmNlZFRhYmxlYCBpbnN0ZWFkXG5cdCovXG5cdG9yKGZpbHRlcnMsIHsgZm9yZWlnblRhYmxlLCByZWZlcmVuY2VkVGFibGUgPSBmb3JlaWduVGFibGUgfSA9IHt9KSB7XG5cdFx0Y29uc3Qga2V5ID0gcmVmZXJlbmNlZFRhYmxlID8gYCR7cmVmZXJlbmNlZFRhYmxlfS5vcmAgOiBcIm9yXCI7XG5cdFx0dGhpcy51cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIGAoJHtmaWx0ZXJzfSlgKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKipcblx0KiBNYXRjaCBvbmx5IHJvd3Mgd2hpY2ggc2F0aXNmeSB0aGUgZmlsdGVyLiBUaGlzIGlzIGFuIGVzY2FwZSBoYXRjaCAtIHlvdVxuXHQqIHNob3VsZCB1c2UgdGhlIHNwZWNpZmljIGZpbHRlciBtZXRob2RzIHdoZXJldmVyIHBvc3NpYmxlLlxuXHQqXG5cdCogVW5saWtlIG1vc3QgZmlsdGVycywgYG9wZWFyYXRvcmAgYW5kIGB2YWx1ZWAgYXJlIHVzZWQgYXMtaXMgYW5kIG5lZWQgdG9cblx0KiBmb2xsb3cgW1Bvc3RnUkVTVFxuXHQqIHN5bnRheF0oaHR0cHM6Ly9wb3N0Z3Jlc3Qub3JnL2VuL3N0YWJsZS9hcGkuaHRtbCNvcGVyYXRvcnMpLiBZb3UgYWxzbyBuZWVkXG5cdCogdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHByb3Blcmx5IHNhbml0aXplZC5cblx0KlxuXHQqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRvIGZpbHRlciBvblxuXHQqIEBwYXJhbSBvcGVyYXRvciAtIFRoZSBvcGVyYXRvciB0byBmaWx0ZXIgd2l0aCwgZm9sbG93aW5nIFBvc3RnUkVTVCBzeW50YXhcblx0KiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gZmlsdGVyIHdpdGgsIGZvbGxvd2luZyBQb3N0Z1JFU1Qgc3ludGF4XG5cdCovXG5cdGZpbHRlcihjb2x1bW4sIG9wZXJhdG9yLCB2YWx1ZSkge1xuXHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoY29sdW1uLCBgJHtvcGVyYXRvcn0uJHt2YWx1ZX1gKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1Bvc3RncmVzdFF1ZXJ5QnVpbGRlci50c1xudmFyIFBvc3RncmVzdFF1ZXJ5QnVpbGRlciA9IGNsYXNzIHtcblx0LyoqXG5cdCogQ3JlYXRlcyBhIHF1ZXJ5IGJ1aWxkZXIgc2NvcGVkIHRvIGEgUG9zdGdyZXMgdGFibGUgb3Igdmlldy5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHNcblx0KiBpbXBvcnQgUG9zdGdyZXN0UXVlcnlCdWlsZGVyIGZyb20gJ0BzdXBhYmFzZS9wb3N0Z3Jlc3QtanMnXG5cdCpcblx0KiBjb25zdCBxdWVyeSA9IG5ldyBQb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIoXG5cdCogICBuZXcgVVJMKCdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vcmVzdC92MS91c2VycycpLFxuXHQqICAgeyBoZWFkZXJzOiB7IGFwaWtleTogJ3B1YmxpYy1hbm9uLWtleScgfSB9XG5cdCogKVxuXHQqIGBgYFxuXHQqL1xuXHRjb25zdHJ1Y3Rvcih1cmwsIHsgaGVhZGVycyA9IHt9LCBzY2hlbWEsIGZldGNoOiBmZXRjaCQxIH0pIHtcblx0XHR0aGlzLnVybCA9IHVybDtcblx0XHR0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhoZWFkZXJzKTtcblx0XHR0aGlzLnNjaGVtYSA9IHNjaGVtYTtcblx0XHR0aGlzLmZldGNoID0gZmV0Y2gkMTtcblx0fVxuXHQvKipcblx0KiBQZXJmb3JtIGEgU0VMRUNUIHF1ZXJ5IG9uIHRoZSB0YWJsZSBvciB2aWV3LlxuXHQqXG5cdCogQHBhcmFtIGNvbHVtbnMgLSBUaGUgY29sdW1ucyB0byByZXRyaWV2ZSwgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gQ29sdW1ucyBjYW4gYmUgcmVuYW1lZCB3aGVuIHJldHVybmVkIHdpdGggYGN1c3RvbU5hbWU6Y29sdW1uTmFtZWBcblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zIC0gTmFtZWQgcGFyYW1ldGVyc1xuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMuaGVhZCAtIFdoZW4gc2V0IHRvIGB0cnVlYCwgYGRhdGFgIHdpbGwgbm90IGJlIHJldHVybmVkLlxuXHQqIFVzZWZ1bCBpZiB5b3Ugb25seSBuZWVkIHRoZSBjb3VudC5cblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zLmNvdW50IC0gQ291bnQgYWxnb3JpdGhtIHRvIHVzZSB0byBjb3VudCByb3dzIGluIHRoZSB0YWJsZSBvciB2aWV3LlxuXHQqXG5cdCogYFwiZXhhY3RcImA6IEV4YWN0IGJ1dCBzbG93IGNvdW50IGFsZ29yaXRobS4gUGVyZm9ybXMgYSBgQ09VTlQoKilgIHVuZGVyIHRoZVxuXHQqIGhvb2QuXG5cdCpcblx0KiBgXCJwbGFubmVkXCJgOiBBcHByb3hpbWF0ZWQgYnV0IGZhc3QgY291bnQgYWxnb3JpdGhtLiBVc2VzIHRoZSBQb3N0Z3Jlc1xuXHQqIHN0YXRpc3RpY3MgdW5kZXIgdGhlIGhvb2QuXG5cdCpcblx0KiBgXCJlc3RpbWF0ZWRcImA6IFVzZXMgZXhhY3QgY291bnQgZm9yIGxvdyBudW1iZXJzIGFuZCBwbGFubmVkIGNvdW50IGZvciBoaWdoXG5cdCogbnVtYmVycy5cblx0Ki9cblx0c2VsZWN0KGNvbHVtbnMsIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IGhlYWQgPSBmYWxzZSwgY291bnQgfSA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuXHRcdGNvbnN0IG1ldGhvZCA9IGhlYWQgPyBcIkhFQURcIiA6IFwiR0VUXCI7XG5cdFx0bGV0IHF1b3RlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IGNsZWFuZWRDb2x1bW5zID0gKGNvbHVtbnMgIT09IG51bGwgJiYgY29sdW1ucyAhPT0gdm9pZCAwID8gY29sdW1ucyA6IFwiKlwiKS5zcGxpdChcIlwiKS5tYXAoKGMpID0+IHtcblx0XHRcdGlmICgvXFxzLy50ZXN0KGMpICYmICFxdW90ZWQpIHJldHVybiBcIlwiO1xuXHRcdFx0aWYgKGMgPT09IFwiXFxcIlwiKSBxdW90ZWQgPSAhcXVvdGVkO1xuXHRcdFx0cmV0dXJuIGM7XG5cdFx0fSkuam9pbihcIlwiKTtcblx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuc2V0KFwic2VsZWN0XCIsIGNsZWFuZWRDb2x1bW5zKTtcblx0XHRpZiAoY291bnQpIHRoaXMuaGVhZGVycy5hcHBlbmQoXCJQcmVmZXJcIiwgYGNvdW50PSR7Y291bnR9YCk7XG5cdFx0cmV0dXJuIG5ldyBQb3N0Z3Jlc3RGaWx0ZXJCdWlsZGVyKHtcblx0XHRcdG1ldGhvZCxcblx0XHRcdHVybDogdGhpcy51cmwsXG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRzY2hlbWE6IHRoaXMuc2NoZW1hLFxuXHRcdFx0ZmV0Y2g6IHRoaXMuZmV0Y2hcblx0XHR9KTtcblx0fVxuXHQvKipcblx0KiBQZXJmb3JtIGFuIElOU0VSVCBpbnRvIHRoZSB0YWJsZSBvciB2aWV3LlxuXHQqXG5cdCogQnkgZGVmYXVsdCwgaW5zZXJ0ZWQgcm93cyBhcmUgbm90IHJldHVybmVkLiBUbyByZXR1cm4gaXQsIGNoYWluIHRoZSBjYWxsXG5cdCogd2l0aCBgLnNlbGVjdCgpYC5cblx0KlxuXHQqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgdmFsdWVzIHRvIGluc2VydC4gUGFzcyBhbiBvYmplY3QgdG8gaW5zZXJ0IGEgc2luZ2xlIHJvd1xuXHQqIG9yIGFuIGFycmF5IHRvIGluc2VydCBtdWx0aXBsZSByb3dzLlxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucy5jb3VudCAtIENvdW50IGFsZ29yaXRobSB0byB1c2UgdG8gY291bnQgaW5zZXJ0ZWQgcm93cy5cblx0KlxuXHQqIGBcImV4YWN0XCJgOiBFeGFjdCBidXQgc2xvdyBjb3VudCBhbGdvcml0aG0uIFBlcmZvcm1zIGEgYENPVU5UKCopYCB1bmRlciB0aGVcblx0KiBob29kLlxuXHQqXG5cdCogYFwicGxhbm5lZFwiYDogQXBwcm94aW1hdGVkIGJ1dCBmYXN0IGNvdW50IGFsZ29yaXRobS4gVXNlcyB0aGUgUG9zdGdyZXNcblx0KiBzdGF0aXN0aWNzIHVuZGVyIHRoZSBob29kLlxuXHQqXG5cdCogYFwiZXN0aW1hdGVkXCJgOiBVc2VzIGV4YWN0IGNvdW50IGZvciBsb3cgbnVtYmVycyBhbmQgcGxhbm5lZCBjb3VudCBmb3IgaGlnaFxuXHQqIG51bWJlcnMuXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucy5kZWZhdWx0VG9OdWxsIC0gTWFrZSBtaXNzaW5nIGZpZWxkcyBkZWZhdWx0IHRvIGBudWxsYC5cblx0KiBPdGhlcndpc2UsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNvbHVtbi4gT25seSBhcHBsaWVzIGZvciBidWxrXG5cdCogaW5zZXJ0cy5cblx0Ki9cblx0aW5zZXJ0KHZhbHVlcywgeyBjb3VudCwgZGVmYXVsdFRvTnVsbCA9IHRydWUgfSA9IHt9KSB7XG5cdFx0dmFyIF90aGlzJGZldGNoO1xuXHRcdGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuXHRcdGlmIChjb3VudCkgdGhpcy5oZWFkZXJzLmFwcGVuZChcIlByZWZlclwiLCBgY291bnQ9JHtjb3VudH1gKTtcblx0XHRpZiAoIWRlZmF1bHRUb051bGwpIHRoaXMuaGVhZGVycy5hcHBlbmQoXCJQcmVmZXJcIiwgYG1pc3Npbmc9ZGVmYXVsdGApO1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcblx0XHRcdGNvbnN0IGNvbHVtbnMgPSB2YWx1ZXMucmVkdWNlKChhY2MsIHgpID0+IGFjYy5jb25jYXQoT2JqZWN0LmtleXMoeCkpLCBbXSk7XG5cdFx0XHRpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbnN0IHVuaXF1ZUNvbHVtbnMgPSBbLi4ubmV3IFNldChjb2x1bW5zKV0ubWFwKChjb2x1bW4pID0+IGBcIiR7Y29sdW1ufVwiYCk7XG5cdFx0XHRcdHRoaXMudXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJjb2x1bW5zXCIsIHVuaXF1ZUNvbHVtbnMuam9pbihcIixcIikpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbmV3IFBvc3RncmVzdEZpbHRlckJ1aWxkZXIoe1xuXHRcdFx0bWV0aG9kLFxuXHRcdFx0dXJsOiB0aGlzLnVybCxcblx0XHRcdGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcblx0XHRcdHNjaGVtYTogdGhpcy5zY2hlbWEsXG5cdFx0XHRib2R5OiB2YWx1ZXMsXG5cdFx0XHRmZXRjaDogKF90aGlzJGZldGNoID0gdGhpcy5mZXRjaCkgIT09IG51bGwgJiYgX3RoaXMkZmV0Y2ggIT09IHZvaWQgMCA/IF90aGlzJGZldGNoIDogZmV0Y2hcblx0XHR9KTtcblx0fVxuXHQvKipcblx0KiBQZXJmb3JtIGFuIFVQU0VSVCBvbiB0aGUgdGFibGUgb3Igdmlldy4gRGVwZW5kaW5nIG9uIHRoZSBjb2x1bW4ocykgcGFzc2VkXG5cdCogdG8gYG9uQ29uZmxpY3RgLCBgLnVwc2VydCgpYCBhbGxvd3MgeW91IHRvIHBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2Zcblx0KiBgLmluc2VydCgpYCBpZiBhIHJvdyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGBvbkNvbmZsaWN0YCBjb2x1bW5zIGRvZXNuJ3Rcblx0KiBleGlzdCwgb3IgaWYgaXQgZG9lcyBleGlzdCwgcGVyZm9ybSBhbiBhbHRlcm5hdGl2ZSBhY3Rpb24gZGVwZW5kaW5nIG9uXG5cdCogYGlnbm9yZUR1cGxpY2F0ZXNgLlxuXHQqXG5cdCogQnkgZGVmYXVsdCwgdXBzZXJ0ZWQgcm93cyBhcmUgbm90IHJldHVybmVkLiBUbyByZXR1cm4gaXQsIGNoYWluIHRoZSBjYWxsXG5cdCogd2l0aCBgLnNlbGVjdCgpYC5cblx0KlxuXHQqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgdmFsdWVzIHRvIHVwc2VydCB3aXRoLiBQYXNzIGFuIG9iamVjdCB0byB1cHNlcnQgYVxuXHQqIHNpbmdsZSByb3cgb3IgYW4gYXJyYXkgdG8gdXBzZXJ0IG11bHRpcGxlIHJvd3MuXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucyAtIE5hbWVkIHBhcmFtZXRlcnNcblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zLm9uQ29uZmxpY3QgLSBDb21tYS1zZXBhcmF0ZWQgVU5JUVVFIGNvbHVtbihzKSB0byBzcGVjaWZ5IGhvd1xuXHQqIGR1cGxpY2F0ZSByb3dzIGFyZSBkZXRlcm1pbmVkLiBUd28gcm93cyBhcmUgZHVwbGljYXRlcyBpZiBhbGwgdGhlXG5cdCogYG9uQ29uZmxpY3RgIGNvbHVtbnMgYXJlIGVxdWFsLlxuXHQqXG5cdCogQHBhcmFtIG9wdGlvbnMuaWdub3JlRHVwbGljYXRlcyAtIElmIGB0cnVlYCwgZHVwbGljYXRlIHJvd3MgYXJlIGlnbm9yZWQuIElmXG5cdCogYGZhbHNlYCwgZHVwbGljYXRlIHJvd3MgYXJlIG1lcmdlZCB3aXRoIGV4aXN0aW5nIHJvd3MuXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucy5jb3VudCAtIENvdW50IGFsZ29yaXRobSB0byB1c2UgdG8gY291bnQgdXBzZXJ0ZWQgcm93cy5cblx0KlxuXHQqIGBcImV4YWN0XCJgOiBFeGFjdCBidXQgc2xvdyBjb3VudCBhbGdvcml0aG0uIFBlcmZvcm1zIGEgYENPVU5UKCopYCB1bmRlciB0aGVcblx0KiBob29kLlxuXHQqXG5cdCogYFwicGxhbm5lZFwiYDogQXBwcm94aW1hdGVkIGJ1dCBmYXN0IGNvdW50IGFsZ29yaXRobS4gVXNlcyB0aGUgUG9zdGdyZXNcblx0KiBzdGF0aXN0aWNzIHVuZGVyIHRoZSBob29kLlxuXHQqXG5cdCogYFwiZXN0aW1hdGVkXCJgOiBVc2VzIGV4YWN0IGNvdW50IGZvciBsb3cgbnVtYmVycyBhbmQgcGxhbm5lZCBjb3VudCBmb3IgaGlnaFxuXHQqIG51bWJlcnMuXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucy5kZWZhdWx0VG9OdWxsIC0gTWFrZSBtaXNzaW5nIGZpZWxkcyBkZWZhdWx0IHRvIGBudWxsYC5cblx0KiBPdGhlcndpc2UsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNvbHVtbi4gVGhpcyBvbmx5IGFwcGxpZXMgd2hlblxuXHQqIGluc2VydGluZyBuZXcgcm93cywgbm90IHdoZW4gbWVyZ2luZyB3aXRoIGV4aXN0aW5nIHJvd3MgdW5kZXJcblx0KiBgaWdub3JlRHVwbGljYXRlczogZmFsc2VgLiBUaGlzIGFsc28gb25seSBhcHBsaWVzIHdoZW4gZG9pbmcgYnVsayB1cHNlcnRzLlxuXHQqXG5cdCogQGV4YW1wbGUgVXBzZXJ0IGEgc2luZ2xlIHJvdyB1c2luZyBhIHVuaXF1ZSBrZXlcblx0KiBgYGB0c1xuXHQqIC8vIFVwc2VydGluZyBhIHNpbmdsZSByb3csIG92ZXJ3cml0aW5nIGJhc2VkIG9uIHRoZSAndXNlcm5hbWUnIHVuaXF1ZSBjb2x1bW5cblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLmZyb20oJ3VzZXJzJylcblx0KiAgIC51cHNlcnQoeyB1c2VybmFtZTogJ3N1cGFib3QnIH0sIHsgb25Db25mbGljdDogJ3VzZXJuYW1lJyB9KVxuXHQqXG5cdCogLy8gRXhhbXBsZSByZXNwb25zZTpcblx0KiAvLyB7XG5cdCogLy8gICBkYXRhOiBbXG5cdCogLy8gICAgIHsgaWQ6IDQsIG1lc3NhZ2U6ICdiYXInLCB1c2VybmFtZTogJ3N1cGFib3QnIH1cblx0KiAvLyAgIF0sXG5cdCogLy8gICBlcnJvcjogbnVsbFxuXHQqIC8vIH1cblx0KiBgYGBcblx0KlxuXHQqIEBleGFtcGxlIFVwc2VydCB3aXRoIGNvbmZsaWN0IHJlc29sdXRpb24gYW5kIGV4YWN0IHJvdyBjb3VudGluZ1xuXHQqIGBgYHRzXG5cdCogLy8gVXBzZXJ0aW5nIGFuZCByZXR1cm5pbmcgZXhhY3QgY291bnRcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yLCBjb3VudCB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5mcm9tKCd1c2VycycpXG5cdCogICAudXBzZXJ0KFxuXHQqICAgICB7XG5cdCogICAgICAgaWQ6IDMsXG5cdCogICAgICAgbWVzc2FnZTogJ2ZvbycsXG5cdCogICAgICAgdXNlcm5hbWU6ICdzdXBhYm90J1xuXHQqICAgICB9LFxuXHQqICAgICB7XG5cdCogICAgICAgb25Db25mbGljdDogJ3VzZXJuYW1lJyxcblx0KiAgICAgICBjb3VudDogJ2V4YWN0J1xuXHQqICAgICB9XG5cdCogICApXG5cdCpcblx0KiAvLyBFeGFtcGxlIHJlc3BvbnNlOlxuXHQqIC8vIHtcblx0KiAvLyAgIGRhdGE6IFtcblx0KiAvLyAgICAge1xuXHQqIC8vICAgICAgIGlkOiA0Mixcblx0KiAvLyAgICAgICBoYW5kbGU6IFwic2FvaXJzZVwiLFxuXHQqIC8vICAgICAgIGRpc3BsYXlfbmFtZTogXCJTYW9pcnNlXCJcblx0KiAvLyAgICAgfVxuXHQqIC8vICAgXSxcblx0KiAvLyAgIGNvdW50OiAxLFxuXHQqIC8vICAgZXJyb3I6IG51bGxcblx0KiAvLyB9XG5cdCogYGBgXG5cdCovXG5cdHVwc2VydCh2YWx1ZXMsIHsgb25Db25mbGljdCwgaWdub3JlRHVwbGljYXRlcyA9IGZhbHNlLCBjb3VudCwgZGVmYXVsdFRvTnVsbCA9IHRydWUgfSA9IHt9KSB7XG5cdFx0dmFyIF90aGlzJGZldGNoMjtcblx0XHRjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcblx0XHR0aGlzLmhlYWRlcnMuYXBwZW5kKFwiUHJlZmVyXCIsIGByZXNvbHV0aW9uPSR7aWdub3JlRHVwbGljYXRlcyA/IFwiaWdub3JlXCIgOiBcIm1lcmdlXCJ9LWR1cGxpY2F0ZXNgKTtcblx0XHRpZiAob25Db25mbGljdCAhPT0gdm9pZCAwKSB0aGlzLnVybC5zZWFyY2hQYXJhbXMuc2V0KFwib25fY29uZmxpY3RcIiwgb25Db25mbGljdCk7XG5cdFx0aWYgKGNvdW50KSB0aGlzLmhlYWRlcnMuYXBwZW5kKFwiUHJlZmVyXCIsIGBjb3VudD0ke2NvdW50fWApO1xuXHRcdGlmICghZGVmYXVsdFRvTnVsbCkgdGhpcy5oZWFkZXJzLmFwcGVuZChcIlByZWZlclwiLCBcIm1pc3Npbmc9ZGVmYXVsdFwiKTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5zID0gdmFsdWVzLnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MuY29uY2F0KE9iamVjdC5rZXlzKHgpKSwgW10pO1xuXHRcdFx0aWYgKGNvbHVtbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb25zdCB1bmlxdWVDb2x1bW5zID0gWy4uLm5ldyBTZXQoY29sdW1ucyldLm1hcCgoY29sdW1uKSA9PiBgXCIke2NvbHVtbn1cImApO1xuXHRcdFx0XHR0aGlzLnVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY29sdW1uc1wiLCB1bmlxdWVDb2x1bW5zLmpvaW4oXCIsXCIpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG5ldyBQb3N0Z3Jlc3RGaWx0ZXJCdWlsZGVyKHtcblx0XHRcdG1ldGhvZCxcblx0XHRcdHVybDogdGhpcy51cmwsXG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRzY2hlbWE6IHRoaXMuc2NoZW1hLFxuXHRcdFx0Ym9keTogdmFsdWVzLFxuXHRcdFx0ZmV0Y2g6IChfdGhpcyRmZXRjaDIgPSB0aGlzLmZldGNoKSAhPT0gbnVsbCAmJiBfdGhpcyRmZXRjaDIgIT09IHZvaWQgMCA/IF90aGlzJGZldGNoMiA6IGZldGNoXG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCogUGVyZm9ybSBhbiBVUERBVEUgb24gdGhlIHRhYmxlIG9yIHZpZXcuXG5cdCpcblx0KiBCeSBkZWZhdWx0LCB1cGRhdGVkIHJvd3MgYXJlIG5vdCByZXR1cm5lZC4gVG8gcmV0dXJuIGl0LCBjaGFpbiB0aGUgY2FsbFxuXHQqIHdpdGggYC5zZWxlY3QoKWAgYWZ0ZXIgZmlsdGVycy5cblx0KlxuXHQqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgdmFsdWVzIHRvIHVwZGF0ZSB3aXRoXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucyAtIE5hbWVkIHBhcmFtZXRlcnNcblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zLmNvdW50IC0gQ291bnQgYWxnb3JpdGhtIHRvIHVzZSB0byBjb3VudCB1cGRhdGVkIHJvd3MuXG5cdCpcblx0KiBgXCJleGFjdFwiYDogRXhhY3QgYnV0IHNsb3cgY291bnQgYWxnb3JpdGhtLiBQZXJmb3JtcyBhIGBDT1VOVCgqKWAgdW5kZXIgdGhlXG5cdCogaG9vZC5cblx0KlxuXHQqIGBcInBsYW5uZWRcImA6IEFwcHJveGltYXRlZCBidXQgZmFzdCBjb3VudCBhbGdvcml0aG0uIFVzZXMgdGhlIFBvc3RncmVzXG5cdCogc3RhdGlzdGljcyB1bmRlciB0aGUgaG9vZC5cblx0KlxuXHQqIGBcImVzdGltYXRlZFwiYDogVXNlcyBleGFjdCBjb3VudCBmb3IgbG93IG51bWJlcnMgYW5kIHBsYW5uZWQgY291bnQgZm9yIGhpZ2hcblx0KiBudW1iZXJzLlxuXHQqL1xuXHR1cGRhdGUodmFsdWVzLCB7IGNvdW50IH0gPSB7fSkge1xuXHRcdHZhciBfdGhpcyRmZXRjaDM7XG5cdFx0Y29uc3QgbWV0aG9kID0gXCJQQVRDSFwiO1xuXHRcdGlmIChjb3VudCkgdGhpcy5oZWFkZXJzLmFwcGVuZChcIlByZWZlclwiLCBgY291bnQ9JHtjb3VudH1gKTtcblx0XHRyZXR1cm4gbmV3IFBvc3RncmVzdEZpbHRlckJ1aWxkZXIoe1xuXHRcdFx0bWV0aG9kLFxuXHRcdFx0dXJsOiB0aGlzLnVybCxcblx0XHRcdGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcblx0XHRcdHNjaGVtYTogdGhpcy5zY2hlbWEsXG5cdFx0XHRib2R5OiB2YWx1ZXMsXG5cdFx0XHRmZXRjaDogKF90aGlzJGZldGNoMyA9IHRoaXMuZmV0Y2gpICE9PSBudWxsICYmIF90aGlzJGZldGNoMyAhPT0gdm9pZCAwID8gX3RoaXMkZmV0Y2gzIDogZmV0Y2hcblx0XHR9KTtcblx0fVxuXHQvKipcblx0KiBQZXJmb3JtIGEgREVMRVRFIG9uIHRoZSB0YWJsZSBvciB2aWV3LlxuXHQqXG5cdCogQnkgZGVmYXVsdCwgZGVsZXRlZCByb3dzIGFyZSBub3QgcmV0dXJuZWQuIFRvIHJldHVybiBpdCwgY2hhaW4gdGhlIGNhbGxcblx0KiB3aXRoIGAuc2VsZWN0KClgIGFmdGVyIGZpbHRlcnMuXG5cdCpcblx0KiBAcGFyYW0gb3B0aW9ucyAtIE5hbWVkIHBhcmFtZXRlcnNcblx0KlxuXHQqIEBwYXJhbSBvcHRpb25zLmNvdW50IC0gQ291bnQgYWxnb3JpdGhtIHRvIHVzZSB0byBjb3VudCBkZWxldGVkIHJvd3MuXG5cdCpcblx0KiBgXCJleGFjdFwiYDogRXhhY3QgYnV0IHNsb3cgY291bnQgYWxnb3JpdGhtLiBQZXJmb3JtcyBhIGBDT1VOVCgqKWAgdW5kZXIgdGhlXG5cdCogaG9vZC5cblx0KlxuXHQqIGBcInBsYW5uZWRcImA6IEFwcHJveGltYXRlZCBidXQgZmFzdCBjb3VudCBhbGdvcml0aG0uIFVzZXMgdGhlIFBvc3RncmVzXG5cdCogc3RhdGlzdGljcyB1bmRlciB0aGUgaG9vZC5cblx0KlxuXHQqIGBcImVzdGltYXRlZFwiYDogVXNlcyBleGFjdCBjb3VudCBmb3IgbG93IG51bWJlcnMgYW5kIHBsYW5uZWQgY291bnQgZm9yIGhpZ2hcblx0KiBudW1iZXJzLlxuXHQqL1xuXHRkZWxldGUoeyBjb3VudCB9ID0ge30pIHtcblx0XHR2YXIgX3RoaXMkZmV0Y2g0O1xuXHRcdGNvbnN0IG1ldGhvZCA9IFwiREVMRVRFXCI7XG5cdFx0aWYgKGNvdW50KSB0aGlzLmhlYWRlcnMuYXBwZW5kKFwiUHJlZmVyXCIsIGBjb3VudD0ke2NvdW50fWApO1xuXHRcdHJldHVybiBuZXcgUG9zdGdyZXN0RmlsdGVyQnVpbGRlcih7XG5cdFx0XHRtZXRob2QsXG5cdFx0XHR1cmw6IHRoaXMudXJsLFxuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0c2NoZW1hOiB0aGlzLnNjaGVtYSxcblx0XHRcdGZldGNoOiAoX3RoaXMkZmV0Y2g0ID0gdGhpcy5mZXRjaCkgIT09IG51bGwgJiYgX3RoaXMkZmV0Y2g0ICE9PSB2b2lkIDAgPyBfdGhpcyRmZXRjaDQgOiBmZXRjaFxuXHRcdH0pO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvUG9zdGdyZXN0Q2xpZW50LnRzXG4vKipcbiogUG9zdGdSRVNUIGNsaWVudC5cbipcbiogQHR5cGVQYXJhbSBEYXRhYmFzZSAtIFR5cGVzIGZvciB0aGUgc2NoZW1hIGZyb20gdGhlIFt0eXBlXG4qIGdlbmVyYXRvcl0oaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9uZXh0L3R5cGVzY3JpcHQtc3VwcG9ydClcbipcbiogQHR5cGVQYXJhbSBTY2hlbWFOYW1lIC0gUG9zdGdyZXMgc2NoZW1hIHRvIHN3aXRjaCB0by4gTXVzdCBiZSBhIHN0cmluZ1xuKiBsaXRlcmFsLCB0aGUgc2FtZSBvbmUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSWYgdGhlIHNjaGVtYSBpcyBub3RcbiogYFwicHVibGljXCJgLCB0aGlzIG11c3QgYmUgc3VwcGxpZWQgbWFudWFsbHkuXG4qL1xudmFyIFBvc3RncmVzdENsaWVudCA9IGNsYXNzIFBvc3RncmVzdENsaWVudCB7XG5cdC8qKlxuXHQqIENyZWF0ZXMgYSBQb3N0Z1JFU1QgY2xpZW50LlxuXHQqXG5cdCogQHBhcmFtIHVybCAtIFVSTCBvZiB0aGUgUG9zdGdSRVNUIGVuZHBvaW50XG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCogQHBhcmFtIG9wdGlvbnMuaGVhZGVycyAtIEN1c3RvbSBoZWFkZXJzXG5cdCogQHBhcmFtIG9wdGlvbnMuc2NoZW1hIC0gUG9zdGdyZXMgc2NoZW1hIHRvIHN3aXRjaCB0b1xuXHQqIEBwYXJhbSBvcHRpb25zLmZldGNoIC0gQ3VzdG9tIGZldGNoXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0c1xuXHQqIGltcG9ydCBQb3N0Z3Jlc3RDbGllbnQgZnJvbSAnQHN1cGFiYXNlL3Bvc3RncmVzdC1qcydcblx0KlxuXHQqIGNvbnN0IHBvc3RncmVzdCA9IG5ldyBQb3N0Z3Jlc3RDbGllbnQoJ2h0dHBzOi8veHl6Y29tcGFueS5zdXBhYmFzZS5jby9yZXN0L3YxJywge1xuXHQqICAgaGVhZGVyczogeyBhcGlrZXk6ICdwdWJsaWMtYW5vbi1rZXknIH0sXG5cdCogICBzY2hlbWE6ICdwdWJsaWMnLFxuXHQqIH0pXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKHVybCwgeyBoZWFkZXJzID0ge30sIHNjaGVtYSwgZmV0Y2g6IGZldGNoJDEgfSA9IHt9KSB7XG5cdFx0dGhpcy51cmwgPSB1cmw7XG5cdFx0dGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaGVhZGVycyk7XG5cdFx0dGhpcy5zY2hlbWFOYW1lID0gc2NoZW1hO1xuXHRcdHRoaXMuZmV0Y2ggPSBmZXRjaCQxO1xuXHR9XG5cdC8qKlxuXHQqIFBlcmZvcm0gYSBxdWVyeSBvbiBhIHRhYmxlIG9yIGEgdmlldy5cblx0KlxuXHQqIEBwYXJhbSByZWxhdGlvbiAtIFRoZSB0YWJsZSBvciB2aWV3IG5hbWUgdG8gcXVlcnlcblx0Ki9cblx0ZnJvbShyZWxhdGlvbikge1xuXHRcdGlmICghcmVsYXRpb24gfHwgdHlwZW9mIHJlbGF0aW9uICE9PSBcInN0cmluZ1wiIHx8IHJlbGF0aW9uLnRyaW0oKSA9PT0gXCJcIikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByZWxhdGlvbiBuYW1lOiByZWxhdGlvbiBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy5cIik7XG5cdFx0cmV0dXJuIG5ldyBQb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIobmV3IFVSTChgJHt0aGlzLnVybH0vJHtyZWxhdGlvbn1gKSwge1xuXHRcdFx0aGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcblx0XHRcdHNjaGVtYTogdGhpcy5zY2hlbWFOYW1lLFxuXHRcdFx0ZmV0Y2g6IHRoaXMuZmV0Y2hcblx0XHR9KTtcblx0fVxuXHQvKipcblx0KiBTZWxlY3QgYSBzY2hlbWEgdG8gcXVlcnkgb3IgcGVyZm9ybSBhbiBmdW5jdGlvbiAocnBjKSBjYWxsLlxuXHQqXG5cdCogVGhlIHNjaGVtYSBuZWVkcyB0byBiZSBvbiB0aGUgbGlzdCBvZiBleHBvc2VkIHNjaGVtYXMgaW5zaWRlIFN1cGFiYXNlLlxuXHQqXG5cdCogQHBhcmFtIHNjaGVtYSAtIFRoZSBzY2hlbWEgdG8gcXVlcnlcblx0Ki9cblx0c2NoZW1hKHNjaGVtYSkge1xuXHRcdHJldHVybiBuZXcgUG9zdGdyZXN0Q2xpZW50KHRoaXMudXJsLCB7XG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRzY2hlbWEsXG5cdFx0XHRmZXRjaDogdGhpcy5mZXRjaFxuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQqIFBlcmZvcm0gYSBmdW5jdGlvbiBjYWxsLlxuXHQqXG5cdCogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIG5hbWUgdG8gY2FsbFxuXHQqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiBjYWxsXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCogQHBhcmFtIG9wdGlvbnMuaGVhZCAtIFdoZW4gc2V0IHRvIGB0cnVlYCwgYGRhdGFgIHdpbGwgbm90IGJlIHJldHVybmVkLlxuXHQqIFVzZWZ1bCBpZiB5b3Ugb25seSBuZWVkIHRoZSBjb3VudC5cblx0KiBAcGFyYW0gb3B0aW9ucy5nZXQgLSBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoXG5cdCogcmVhZC1vbmx5IGFjY2VzcyBtb2RlLlxuXHQqIEBwYXJhbSBvcHRpb25zLmNvdW50IC0gQ291bnQgYWxnb3JpdGhtIHRvIHVzZSB0byBjb3VudCByb3dzIHJldHVybmVkIGJ5IHRoZVxuXHQqIGZ1bmN0aW9uLiBPbmx5IGFwcGxpY2FibGUgZm9yIFtzZXQtcmV0dXJuaW5nXG5cdCogZnVuY3Rpb25zXShodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzL2N1cnJlbnQvZnVuY3Rpb25zLXNyZi5odG1sKS5cblx0KlxuXHQqIGBcImV4YWN0XCJgOiBFeGFjdCBidXQgc2xvdyBjb3VudCBhbGdvcml0aG0uIFBlcmZvcm1zIGEgYENPVU5UKCopYCB1bmRlciB0aGVcblx0KiBob29kLlxuXHQqXG5cdCogYFwicGxhbm5lZFwiYDogQXBwcm94aW1hdGVkIGJ1dCBmYXN0IGNvdW50IGFsZ29yaXRobS4gVXNlcyB0aGUgUG9zdGdyZXNcblx0KiBzdGF0aXN0aWNzIHVuZGVyIHRoZSBob29kLlxuXHQqXG5cdCogYFwiZXN0aW1hdGVkXCJgOiBVc2VzIGV4YWN0IGNvdW50IGZvciBsb3cgbnVtYmVycyBhbmQgcGxhbm5lZCBjb3VudCBmb3IgaGlnaFxuXHQqIG51bWJlcnMuXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHRzXG5cdCogLy8gRm9yIGNyb3NzLXNjaGVtYSBmdW5jdGlvbnMgd2hlcmUgdHlwZSBpbmZlcmVuY2UgZmFpbHMsIHVzZSBvdmVycmlkZVR5cGVzOlxuXHQqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zY2hlbWEoJ3NjaGVtYV9iJylcblx0KiAgIC5ycGMoJ2Z1bmN0aW9uX2EnLCB7fSlcblx0KiAgIC5vdmVycmlkZVR5cGVzPHsgaWQ6IHN0cmluZzsgdXNlcl9pZDogc3RyaW5nIH1bXT4oKVxuXHQqIGBgYFxuXHQqL1xuXHRycGMoZm4sIGFyZ3MgPSB7fSwgeyBoZWFkID0gZmFsc2UsIGdldCA9IGZhbHNlLCBjb3VudCB9ID0ge30pIHtcblx0XHR2YXIgX3RoaXMkZmV0Y2g7XG5cdFx0bGV0IG1ldGhvZDtcblx0XHRjb25zdCB1cmwgPSBuZXcgVVJMKGAke3RoaXMudXJsfS9ycGMvJHtmbn1gKTtcblx0XHRsZXQgYm9keTtcblx0XHRpZiAoaGVhZCB8fCBnZXQpIHtcblx0XHRcdG1ldGhvZCA9IGhlYWQgPyBcIkhFQURcIiA6IFwiR0VUXCI7XG5cdFx0XHRPYmplY3QuZW50cmllcyhhcmdzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB2b2lkIDApLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gW25hbWUsIEFycmF5LmlzQXJyYXkodmFsdWUpID8gYHske3ZhbHVlLmpvaW4oXCIsXCIpfX1gIDogYCR7dmFsdWV9YF0pLmZvckVhY2goKFtuYW1lLCB2YWx1ZV0pID0+IHtcblx0XHRcdFx0dXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQobmFtZSwgdmFsdWUpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1ldGhvZCA9IFwiUE9TVFwiO1xuXHRcdFx0Ym9keSA9IGFyZ3M7XG5cdFx0fVxuXHRcdGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpO1xuXHRcdGlmIChjb3VudCkgaGVhZGVycy5zZXQoXCJQcmVmZXJcIiwgYGNvdW50PSR7Y291bnR9YCk7XG5cdFx0cmV0dXJuIG5ldyBQb3N0Z3Jlc3RGaWx0ZXJCdWlsZGVyKHtcblx0XHRcdG1ldGhvZCxcblx0XHRcdHVybCxcblx0XHRcdGhlYWRlcnMsXG5cdFx0XHRzY2hlbWE6IHRoaXMuc2NoZW1hTmFtZSxcblx0XHRcdGJvZHksXG5cdFx0XHRmZXRjaDogKF90aGlzJGZldGNoID0gdGhpcy5mZXRjaCkgIT09IG51bGwgJiYgX3RoaXMkZmV0Y2ggIT09IHZvaWQgMCA/IF90aGlzJGZldGNoIDogZmV0Y2hcblx0XHR9KTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2luZGV4LnRzXG52YXIgc3JjX2RlZmF1bHQgPSB7XG5cdFBvc3RncmVzdENsaWVudCxcblx0UG9zdGdyZXN0UXVlcnlCdWlsZGVyLFxuXHRQb3N0Z3Jlc3RGaWx0ZXJCdWlsZGVyLFxuXHRQb3N0Z3Jlc3RUcmFuc2Zvcm1CdWlsZGVyLFxuXHRQb3N0Z3Jlc3RCdWlsZGVyLFxuXHRQb3N0Z3Jlc3RFcnJvclxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBQb3N0Z3Jlc3RCdWlsZGVyLCBQb3N0Z3Jlc3RDbGllbnQsIFBvc3RncmVzdEVycm9yLCBQb3N0Z3Jlc3RGaWx0ZXJCdWlsZGVyLCBQb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIsIFBvc3RncmVzdFRyYW5zZm9ybUJ1aWxkZXIsIHNyY19kZWZhdWx0IGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXAiXSwibmFtZXMiOlsiUG9zdGdyZXN0RXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwiY29udGV4dCIsIm1lc3NhZ2UiLCJuYW1lIiwiZGV0YWlscyIsImhpbnQiLCJjb2RlIiwiUG9zdGdyZXN0QnVpbGRlciIsImJ1aWxkZXIiLCJfYnVpbGRlciRzaG91bGRUaHJvd08iLCJfYnVpbGRlciRpc01heWJlU2luZ2wiLCJzaG91bGRUaHJvd09uRXJyb3IiLCJtZXRob2QiLCJ1cmwiLCJoZWFkZXJzIiwiSGVhZGVycyIsInNjaGVtYSIsImJvZHkiLCJzaWduYWwiLCJpc01heWJlU2luZ2xlIiwiZmV0Y2giLCJ0aHJvd09uRXJyb3IiLCJzZXRIZWFkZXIiLCJ2YWx1ZSIsInNldCIsInRoZW4iLCJvbmZ1bGZpbGxlZCIsIm9ucmVqZWN0ZWQiLCJfdGhpcyIsImluY2x1ZGVzIiwiX2ZldGNoIiwicmVzIiwidG9TdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwicmVzJDEiLCJlcnJvciIsImRhdGEiLCJjb3VudCIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJvayIsIl90aGlzJGhlYWRlcnMkZ2V0MiIsIl9yZXMkaGVhZGVycyRnZXQiLCJfdGhpcyRoZWFkZXJzJGdldCIsInRleHQiLCJnZXQiLCJwYXJzZSIsImNvdW50SGVhZGVyIiwibWF0Y2giLCJjb250ZW50UmFuZ2UiLCJzcGxpdCIsImxlbmd0aCIsInBhcnNlSW50IiwiQXJyYXkiLCJpc0FycmF5IiwiX2Vycm9yJGRldGFpbHMiLCJfdW51c2VkIiwiY2F0Y2giLCJmZXRjaEVycm9yIiwiX2ZldGNoRXJyb3IkbmFtZTIiLCJlcnJvckRldGFpbHMiLCJjYXVzZSIsIl9jYXVzZSRtZXNzYWdlIiwiX2NhdXNlJGNvZGUiLCJfZmV0Y2hFcnJvciRuYW1lIiwiX2NhdXNlJG5hbWUiLCJjYXVzZU1lc3NhZ2UiLCJjYXVzZUNvZGUiLCJzdGFjayIsIl9mZXRjaEVycm9yJHN0YWNrIiwicmV0dXJucyIsIm92ZXJyaWRlVHlwZXMiLCJQb3N0Z3Jlc3RUcmFuc2Zvcm1CdWlsZGVyIiwic2VsZWN0IiwiY29sdW1ucyIsInF1b3RlZCIsImNsZWFuZWRDb2x1bW5zIiwibWFwIiwiYyIsInRlc3QiLCJqb2luIiwic2VhcmNoUGFyYW1zIiwiYXBwZW5kIiwib3JkZXIiLCJjb2x1bW4iLCJhc2NlbmRpbmciLCJudWxsc0ZpcnN0IiwiZm9yZWlnblRhYmxlIiwicmVmZXJlbmNlZFRhYmxlIiwia2V5IiwiZXhpc3RpbmdPcmRlciIsImxpbWl0IiwicmFuZ2UiLCJmcm9tIiwidG8iLCJrZXlPZmZzZXQiLCJrZXlMaW1pdCIsImFib3J0U2lnbmFsIiwic2luZ2xlIiwibWF5YmVTaW5nbGUiLCJjc3YiLCJnZW9qc29uIiwiZXhwbGFpbiIsImFuYWx5emUiLCJ2ZXJib3NlIiwic2V0dGluZ3MiLCJidWZmZXJzIiwid2FsIiwiZm9ybWF0Iiwib3B0aW9ucyIsImZpbHRlciIsIkJvb2xlYW4iLCJmb3JNZWRpYXR5cGUiLCJyb2xsYmFjayIsIm1heEFmZmVjdGVkIiwiUG9zdGdyZXN0UmVzZXJ2ZWRDaGFyc1JlZ2V4cCIsIlJlZ0V4cCIsIlBvc3RncmVzdEZpbHRlckJ1aWxkZXIiLCJlcSIsIm5lcSIsImd0IiwiZ3RlIiwibHQiLCJsdGUiLCJsaWtlIiwicGF0dGVybiIsImxpa2VBbGxPZiIsInBhdHRlcm5zIiwibGlrZUFueU9mIiwiaWxpa2UiLCJpbGlrZUFsbE9mIiwiaWxpa2VBbnlPZiIsInJlZ2V4TWF0Y2giLCJyZWdleElNYXRjaCIsImlzIiwiaXNEaXN0aW5jdCIsImluIiwidmFsdWVzIiwiY2xlYW5lZFZhbHVlcyIsIlNldCIsInMiLCJub3RJbiIsImNvbnRhaW5zIiwiY29udGFpbmVkQnkiLCJyYW5nZUd0IiwicmFuZ2VHdGUiLCJyYW5nZUx0IiwicmFuZ2VMdGUiLCJyYW5nZUFkamFjZW50Iiwib3ZlcmxhcHMiLCJ0ZXh0U2VhcmNoIiwicXVlcnkiLCJjb25maWciLCJ0eXBlIiwidHlwZVBhcnQiLCJjb25maWdQYXJ0IiwiT2JqZWN0IiwiZW50cmllcyIsImZvckVhY2giLCJub3QiLCJvcGVyYXRvciIsIm9yIiwiZmlsdGVycyIsIlBvc3RncmVzdFF1ZXJ5QnVpbGRlciIsImZldGNoJDEiLCJoZWFkIiwiaW5zZXJ0IiwiZGVmYXVsdFRvTnVsbCIsIl90aGlzJGZldGNoIiwicmVkdWNlIiwiYWNjIiwieCIsImNvbmNhdCIsImtleXMiLCJ1bmlxdWVDb2x1bW5zIiwidXBzZXJ0Iiwib25Db25mbGljdCIsImlnbm9yZUR1cGxpY2F0ZXMiLCJfdGhpcyRmZXRjaDIiLCJ1cGRhdGUiLCJfdGhpcyRmZXRjaDMiLCJkZWxldGUiLCJfdGhpcyRmZXRjaDQiLCJQb3N0Z3Jlc3RDbGllbnQiLCJzY2hlbWFOYW1lIiwicmVsYXRpb24iLCJ0cmltIiwiVVJMIiwicnBjIiwiZm4iLCJhcmdzIiwiXyIsInNyY19kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/postgrest-js/dist/index.mjs\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/postgrest-js/dist/index.mjs":
|
||
/*!************************************************************!*\
|
||
!*** ./node_modules/@supabase/postgrest-js/dist/index.mjs ***!
|
||
\************************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PostgrestBuilder: () => (/* binding */ PostgrestBuilder),\n/* harmony export */ PostgrestClient: () => (/* binding */ PostgrestClient),\n/* harmony export */ PostgrestError: () => (/* binding */ PostgrestError),\n/* harmony export */ PostgrestFilterBuilder: () => (/* binding */ PostgrestFilterBuilder),\n/* harmony export */ PostgrestQueryBuilder: () => (/* binding */ PostgrestQueryBuilder),\n/* harmony export */ PostgrestTransformBuilder: () => (/* binding */ PostgrestTransformBuilder),\n/* harmony export */ \"default\": () => (/* 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* 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\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 ${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 = `${(_fetchError$name = fetchError === null || fetchError === void 0 ? void 0 : fetchError.name) !== null && _fetchError$name !== void 0 ? _fetchError$name : \"FetchError\"}: ${fetchError === null || fetchError === void 0 ? void 0 : fetchError.message}`;\n errorDetails += `\\n\\nCaused by: ${(_cause$name = cause === null || cause === void 0 ? void 0 : cause.name) !== null && _cause$name !== void 0 ? _cause$name : \"Error\"}: ${causeMessage}`;\n if (causeCode) errorDetails += ` (${causeCode})`;\n if (cause === null || cause === void 0 ? void 0 : cause.stack) errorDetails += `\\n${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: `${(_fetchError$name2 = fetchError === null || fetchError === void 0 ? void 0 : fetchError.name) !== null && _fetchError$name2 !== void 0 ? _fetchError$name2 : \"FetchError\"}: ${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//#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, { ascending = true, nullsFirst, foreignTable, referencedTable = foreignTable } = {}) {\n const key = referencedTable ? `${referencedTable}.order` : \"order\";\n const existingOrder = this.url.searchParams.get(key);\n this.url.searchParams.set(key, `${existingOrder ? `${existingOrder},` : \"\"}${column}.${ascending ? \"asc\" : \"desc\"}${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, { foreignTable, referencedTable = foreignTable } = {}) {\n const key = typeof referencedTable === \"undefined\" ? \"limit\" : `${referencedTable}.limit`;\n this.url.searchParams.set(key, `${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, { foreignTable, referencedTable = foreignTable } = {}) {\n const keyOffset = typeof referencedTable === \"undefined\" ? \"offset\" : `${referencedTable}.offset`;\n const keyLimit = typeof referencedTable === \"undefined\" ? \"limit\" : `${referencedTable}.limit`;\n this.url.searchParams.set(keyOffset, `${from}`);\n this.url.searchParams.set(keyLimit, `${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({ analyze = false, verbose = false, settings = false, buffers = false, wal = false, format = \"text\" } = {}) {\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+${format}; for=\"${forMediatype}\"; options=${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=${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.${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.${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.${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.${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.${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.${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.${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).{${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).{${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.${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).{${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).{${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.${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.${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.${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.${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 `\"${s}\"`;\n else return `${s}`;\n }).join(\",\");\n this.url.searchParams.append(column, `in.(${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 `\"${s}\"`;\n else return `${s}`;\n }).join(\",\");\n this.url.searchParams.append(column, `not.in.(${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.${value}`);\n else if (Array.isArray(value)) this.url.searchParams.append(column, `cs.{${value.join(\",\")}}`);\n else this.url.searchParams.append(column, `cs.${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.${value}`);\n else if (Array.isArray(value)) this.url.searchParams.append(column, `cd.{${value.join(\",\")}}`);\n else this.url.searchParams.append(column, `cd.${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.${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.${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.${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.${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.${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.${value}`);\n else this.url.searchParams.append(column, `ov.{${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, { config, type } = {}) {\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 ? \"\" : `(${config})`;\n this.url.searchParams.append(column, `${typePart}fts${configPart}.${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(([column, value])=>{\n this.url.searchParams.append(column, `eq.${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.${operator}.${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, { foreignTable, referencedTable = foreignTable } = {}) {\n const key = referencedTable ? `${referencedTable}.or` : \"or\";\n this.url.searchParams.append(key, `(${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, `${operator}.${value}`);\n return this;\n }\n};\n//#endregion\n//#region src/PostgrestQueryBuilder.ts\nvar PostgrestQueryBuilder = class {\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\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=${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, { count, defaultToNull = true } = {}) {\n var _this$fetch;\n const method = \"POST\";\n if (count) this.headers.append(\"Prefer\", `count=${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)=>`\"${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, { onConflict, ignoreDuplicates = false, count, defaultToNull = true } = {}) {\n var _this$fetch2;\n const method = \"POST\";\n this.headers.append(\"Prefer\", `resolution=${ignoreDuplicates ? \"ignore\" : \"merge\"}-duplicates`);\n if (onConflict !== void 0) this.url.searchParams.set(\"on_conflict\", onConflict);\n if (count) this.headers.append(\"Prefer\", `count=${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)=>`\"${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, { count } = {}) {\n var _this$fetch3;\n const method = \"PATCH\";\n if (count) this.headers.append(\"Prefer\", `count=${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({ count } = {}) {\n var _this$fetch4;\n const method = \"DELETE\";\n if (count) this.headers.append(\"Prefer\", `count=${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//#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* 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\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(`${this.url}/${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, args = {}, { head = false, get = false, count } = {}) {\n var _this$fetch;\n let method;\n const url = new URL(`${this.url}/rpc/${fn}`);\n let body;\n if (head || get) {\n method = head ? \"HEAD\" : \"GET\";\n Object.entries(args).filter(([_, value])=>value !== void 0).map(([name, value])=>[\n name,\n Array.isArray(value) ? `{${value.join(\",\")}}` : `${value}`\n ]).forEach(([name, value])=>{\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=${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//#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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3Bvc3RncmVzdC1qcy9kaXN0L2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9COzs7O0FBSUEsR0FDQSxJQUFJQSxpQkFBaUIsY0FBY0M7SUFDbEM7Ozs7Ozs7Ozs7OztDQVlBLEdBQ0FDLFlBQVlDLE9BQU8sQ0FBRTtRQUNwQixLQUFLLENBQUNBLFFBQVFDLE9BQU87UUFDckIsSUFBSSxDQUFDQyxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNDLE9BQU8sR0FBR0gsUUFBUUcsT0FBTztRQUM5QixJQUFJLENBQUNDLElBQUksR0FBR0osUUFBUUksSUFBSTtRQUN4QixJQUFJLENBQUNDLElBQUksR0FBR0wsUUFBUUssSUFBSTtJQUN6QjtBQUNEO0FBRUEsWUFBWTtBQUNaLGlDQUFpQztBQUNqQyxJQUFJQyxtQkFBbUI7SUFDdEI7Ozs7Ozs7Ozs7OztDQVlBLEdBQ0FQLFlBQVlRLE9BQU8sQ0FBRTtRQUNwQixJQUFJQyx1QkFBdUJDO1FBQzNCLElBQUksQ0FBQ0Msa0JBQWtCLEdBQUc7UUFDMUIsSUFBSSxDQUFDQyxNQUFNLEdBQUdKLFFBQVFJLE1BQU07UUFDNUIsSUFBSSxDQUFDQyxHQUFHLEdBQUdMLFFBQVFLLEdBQUc7UUFDdEIsSUFBSSxDQUFDQyxPQUFPLEdBQUcsSUFBSUMsUUFBUVAsUUFBUU0sT0FBTztRQUMxQyxJQUFJLENBQUNFLE1BQU0sR0FBR1IsUUFBUVEsTUFBTTtRQUM1QixJQUFJLENBQUNDLElBQUksR0FBR1QsUUFBUVMsSUFBSTtRQUN4QixJQUFJLENBQUNOLGtCQUFrQixHQUFHLENBQUNGLHdCQUF3QkQsUUFBUUcsa0JBQWtCLE1BQU0sUUFBUUYsMEJBQTBCLEtBQUssSUFBSUEsd0JBQXdCO1FBQ3RKLElBQUksQ0FBQ1MsTUFBTSxHQUFHVixRQUFRVSxNQUFNO1FBQzVCLElBQUksQ0FBQ0MsYUFBYSxHQUFHLENBQUNULHdCQUF3QkYsUUFBUVcsYUFB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QUNBN0M7SUFDQWxFO0lBQ0FUO0FBQ0Q7QUFFQSxZQUFZO0FBQ21KLENBQy9KLGtDQUFrQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2UvcG9zdGdyZXN0LWpzL2Rpc3QvaW5kZXgubWpzPzdhYzMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8jcmVnaW9uIHNyYy9Qb3N0Z3Jlc3RFcnJvci50c1xuLyoqXG4qIEVycm9yIGZvcm1hdFxuKlxuKiB7QGxpbmsgaHR0cHM6Ly9wb3N0Z3Jlc3Qub3JnL2VuL3N0YWJsZS9hcGkuaHRtbD9oaWdobGlnaHQ9b3B0aW9ucyNlcnJvcnMtYW5kLWh0dHAtc3RhdHVzLWNvZGVzfVxuKi9cbnZhciBQb3N0Z3Jlc3RFcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xuXHQvKipcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHRzXG5cdCogaW1wb3J0IFBvc3RncmVzdEVycm9yIGZyb20gJ0BzdXBhYmFzZS9wb3N0Z3Jlc3QtanMnXG5cdCpcblx0KiB0aHJvdyBuZXcgUG9zdGdyZXN0RXJyb3Ioe1xuXHQqICAgbWVzc2FnZTogJ1JvdyBsZXZlbCBzZWN1cml0eSBwcmV2ZW50ZWQgdGhlIHJlcXVlc3QnLFxuXHQqICAgZGV0YWlsczogJ1JMUyBkZW5pZWQgdGhlIGluc2VydCcsXG5cdCogICBoaW50OiAnQ2hlY2sgeW91ciBwb2xpY2llcycsXG5cdCogICBjb2RlOiAnUEdSU1QzMDEnLFxuXHQqIH0pXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcblx0XHRzdXBlcihjb250ZXh0Lm1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IFwiUG9zdGdyZXN0RXJyb3JcIjtcblx0XHR0aGlzLmRldGFpbHMgPSBjb250ZXh0LmRldGFpbHM7XG5cdFx0dGhpcy5oaW50ID0gY29udGV4dC5oaW50O1xuXHRcdHRoaXMuY29kZSA9IGNvbnRleHQuY29kZTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1Bvc3RncmVzdEJ1aWxkZXIudHNcbnZhciBQb3N0Z3Jlc3RCdWlsZGVyID0gY2xhc3Mge1xuXHQvKipcblx0KiBDcmVhdGVzIGEgYnVpbGRlciBjb25maWd1cmVkIGZvciBhIHNwZWNpZmljIFBvc3RnUkVTVCByZXF1ZXN0LlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0c1xuXHQqIGltcG9ydCBQb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIgZnJvbSAnQHN1cGFiYXNlL3Bvc3RncmVzdC1qcydcblx0KlxuXHQqIGNvbnN0IGJ1aWxkZXIgPSBuZXcgUG9zdGdyZXN0UXVlcnlCdWlsZGVyKFxuXHQqICAgbmV3IFVSTCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvL3Jlc3QvdjEvdXNlcnMnKSxcblx0KiAgIHsgaGVhZGVyczogbmV3IEhlYWRlcnMoeyBhcGlrZXk6ICdwdWJsaWMtYW5vbi1rZXknIH0pIH1cblx0KiApXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKGJ1aWxkZXIpIHtcblx0XHR2YXIgX2J1aWxkZXIkc2hvdWxkVGhyb3dPLCBfYnVpbGRlciRpc01heWJlU2luZ2w7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSBmYWxzZTtcblx0XHR0aGlzLm1ldGhvZCA9IGJ1aWxkZXIubWV0aG9kO1xuXHRcdHRoaXMudXJsID0gYnVpbGRlci51cmw7XG5cdFx0dGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoYnVpbGRlci5oZWFkZXJzKTtcblx0XHR0aGlzLnNjaGVtYSA9IGJ1aWxkZXIuc2NoZW1hO1xuXHRcdHRoaXMuYm9keSA9IGJ1aWxkZXIuYm9keTtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IChfYnVpbGRlciRzaG91bGRUaHJvd08gPSBidWlsZGVyLnNob3VsZFRocm93T25FcnJvcikgIT09IG51bGwgJiYgX2J1aWxkZXIkc2hvdWxkVGhyb3dPICE9PSB2b2lkIDAgPyBfYnVpbGRlciRzaG91bGRUaHJvd08gOiBmYWxzZTtcblx0XHR0aGlzLnNpZ25hbCA9IGJ1aWxkZXIuc2lnbmFsO1xuXHRcdHRoaXMuaXNNYXliZVNpbmdsZSA9IChfYnVpbGRlciRpc01heWJlU2luZ2wgPSBidWlsZGVyLmlzTWF5YmVTaW5nbGUpICE9PSBudWxsICYmIF9idWlsZGVyJGlzTWF5YmVTaW5nbCAhPT0gdm9pZCAwID8gX2J1aWxkZXIkaXNNYXliZVNpbmdsIDogZmFsc2U7XG5cdFx0aWYgKGJ1aWxkZXIuZmV0Y2gpIHRoaXMuZmV0Y2ggPSBidWlsZGVyLmZldGNoO1xuXHRcdGVsc2UgdGhpcy5mZXRjaCA9IGZldGNoO1xuXHR9XG5cdC8qKlxuXHQqIElmIHRoZXJlJ3MgYW4gZXJyb3Igd2l0aCB0aGUgcXVlcnksIHRocm93T25FcnJvciB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZSBieVxuXHQqIHRocm93aW5nIHRoZSBlcnJvciBpbnN0ZWFkIG9mIHJldHVybmluZyBpdCBhcyBwYXJ0IG9mIGEgc3VjY2Vzc2Z1bCByZXNwb25zZS5cblx0KlxuXHQqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vc3VwYWJhc2Uvc3VwYWJhc2UtanMvaXNzdWVzLzkyfVxuXHQqL1xuXHR0aHJvd09uRXJyb3IoKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSB0cnVlO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIFNldCBhbiBIVFRQIGhlYWRlciBmb3IgdGhlIHJlcXVlc3QuXG5cdCovXG5cdHNldEhlYWRlcihuYW1lLCB2YWx1ZSkge1xuXHRcdHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyk7XG5cdFx0dGhpcy5oZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0dGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuXHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cdFx0aWYgKHRoaXMuc2NoZW1hID09PSB2b2lkIDApIHt9IGVsc2UgaWYgKFtcIkdFVFwiLCBcIkhFQURcIl0uaW5jbHVkZXModGhpcy5tZXRob2QpKSB0aGlzLmhlYWRlcnMuc2V0KFwiQWNjZXB0LVByb2ZpbGVcIiwgdGhpcy5zY2hlbWEpO1xuXHRcdGVsc2UgdGhpcy5oZWFkZXJzLnNldChcIkNvbnRlbnQtUHJvZmlsZVwiLCB0aGlzLnNjaGVtYSk7XG5cdFx0aWYgKHRoaXMubWV0aG9kICE9PSBcIkdFVFwiICYmIHRoaXMubWV0aG9kICE9PSBcIkhFQURcIikgdGhpcy5oZWFkZXJzLnNldChcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cdFx0Y29uc3QgX2ZldGNoID0gdGhpcy5mZXRjaDtcblx0XHRsZXQgcmVzID0gX2ZldGNoKHRoaXMudXJsLnRvU3RyaW5nKCksIHtcblx0XHRcdG1ldGhvZDogdGhpcy5tZXRob2QsXG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh0aGlzLmJvZHkpLFxuXHRcdFx0c2lnbmFsOiB0aGlzLnNpZ25hbFxuXHRcdH0pLnRoZW4oYXN5bmMgKHJlcyQxKSA9PiB7XG5cdFx0XHRsZXQgZXJyb3IgPSBudWxsO1xuXHRcdFx0bGV0IGRhdGEgPSBudWxsO1xuXHRcdFx0bGV0IGNvdW50ID0gbnVsbDtcblx0XHRcdGxldCBzdGF0dXMgPSByZXMkMS5zdGF0dXM7XG5cdFx0XHRsZXQgc3RhdHVzVGV4dCA9IHJlcyQxLnN0YXR1c1RleHQ7XG5cdFx0XHRpZiAocmVzJDEub2spIHtcblx0XHRcdFx0dmFyIF90aGlzJGhlYWRlcnMkZ2V0MiwgX3JlcyRoZWFkZXJzJGdldDtcblx0XHRcdFx0aWYgKF90aGlzLm1ldGhvZCAhPT0gXCJIRUFEXCIpIHtcblx0XHRcdFx0XHR2YXIgX3RoaXMkaGVhZGVycyRnZXQ7XG5cdFx0XHRcdFx0Y29uc3QgYm9keSA9IGF3YWl0IHJlcyQxLnRleHQoKTtcblx0XHRcdFx0XHRpZiAoYm9keSA9PT0gXCJcIikge30gZWxzZSBpZiAoX3RoaXMuaGVhZGVycy5nZXQoXCJBY2NlcHRcIikgPT09IFwidGV4dC9jc3ZcIikgZGF0YSA9IGJvZHk7XG5cdFx0XHRcdFx0ZWxzZSBpZiAoX3RoaXMuaGVhZGVycy5nZXQoXCJBY2NlcHRcIikgJiYgKChfdGhpcyRoZWFkZXJzJGdldCA9IF90aGlzLmhlYWRlcnMuZ2V0KFwiQWNjZXB0XCIpKSA9PT0gbnVsbCB8fCBfdGhpcyRoZWFkZXJzJGdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkaGVhZGVycyRnZXQuaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi92bmQucGdyc3QucGxhbit0ZXh0XCIpKSkgZGF0YSA9IGJvZHk7XG5cdFx0XHRcdFx0ZWxzZSBkYXRhID0gSlNPTi5wYXJzZShib2R5KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBjb3VudEhlYWRlciA9IChfdGhpcyRoZWFkZXJzJGdldDIgPSBfdGhpcy5oZWFkZXJzLmdldChcIlByZWZlclwiKSkgPT09IG51bGwgfHwgX3RoaXMkaGVhZGVycyRnZXQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRoZWFkZXJzJGdldDIubWF0Y2goL2NvdW50PShleGFjdHxwbGFubmVkfGVzdGltYXRlZCkvKTtcblx0XHRcdFx0Y29uc3QgY29udGVudFJhbmdlID0gKF9yZXMkaGVhZGVycyRnZXQgPSByZXMkMS5oZWFkZXJzLmdldChcImNvbnRlbnQtcmFuZ2VcIikpID09PSBudWxsIHx8IF9yZXMkaGVhZGVycyRnZXQgPT09IHZvaWQgMCA/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/IGB7JHt2YWx1ZS5qb2luKFwiLFwiKX19YCA6IGAke3ZhbHVlfWBdKS5mb3JFYWNoKChbbmFtZSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKG5hbWUsIHZhbHVlKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZXRob2QgPSBcIlBPU1RcIjtcblx0XHRcdGJvZHkgPSBhcmdzO1xuXHRcdH1cblx0XHRjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKTtcblx0XHRpZiAoY291bnQpIGhlYWRlcnMuc2V0KFwiUHJlZmVyXCIsIGBjb3VudD0ke2NvdW50fWApO1xuXHRcdHJldHVybiBuZXcgUG9zdGdyZXN0RmlsdGVyQnVpbGRlcih7XG5cdFx0XHRtZXRob2QsXG5cdFx0XHR1cmwsXG5cdFx0XHRoZWFkZXJzLFxuXHRcdFx0c2NoZW1hOiB0aGlzLnNjaGVtYU5hbWUsXG5cdFx0XHRib2R5LFxuXHRcdFx0ZmV0Y2g6IChfdGhpcyRmZXRjaCA9IHRoaXMuZmV0Y2gpICE9PSBudWxsICYmIF90aGlzJGZldGNoICE9PSB2b2lkIDAgPyBfdGhpcyRmZXRjaCA6IGZldGNoXG5cdFx0fSk7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9pbmRleC50c1xudmFyIHNyY19kZWZhdWx0ID0ge1xuXHRQb3N0Z3Jlc3RDbGllbnQsXG5cdFBvc3RncmVzdFF1ZXJ5QnVpbGRlcixcblx0UG9zdGdyZXN0RmlsdGVyQnVpbGRlcixcblx0UG9zdGdyZXN0VHJhbnNmb3JtQnVpbGRlcixcblx0UG9zdGdyZXN0QnVpbGRlcixcblx0UG9zdGdyZXN0RXJyb3Jcbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgUG9zdGdyZXN0QnVpbGRlciwgUG9zdGdyZXN0Q2xpZW50LCBQb3N0Z3Jlc3RFcnJvciwgUG9zdGdyZXN0RmlsdGVyQnVpbGRlciwgUG9zdGdyZXN0UXVlcnlCdWlsZGVyLCBQb3N0Z3Jlc3RUcmFuc2Zvcm1CdWlsZGVyLCBzcmNfZGVmYXVsdCBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIl0sIm5hbWVzIjpbIlBvc3RncmVzdEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsImNvbnRleHQiLCJtZXNzYWdlIiwibmFtZSIsImRldGFpbHMiLCJoaW50IiwiY29kZSIsIlBvc3RncmVzdEJ1aWxkZXIiLCJidWlsZGVyIiwiX2J1aWxkZXIkc2hvdWxkVGhyb3dPIiwiX2J1aWxkZXIkaXNNYXliZVNpbmdsIiwic2hvdWxkVGhyb3dPbkVycm9yIiwibWV0aG9kIiwidXJsIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJzY2hlbWEiLCJib2R5Iiwic2lnbmFsIiwiaXNNYXliZVNpbmdsZSIsImZldGNoIiwidGhyb3dPbkVycm9yIiwic2V0SGVhZGVyIiwidmFsdWUiLCJzZXQiLCJ0aGVuIiwib25mdWxmaWxsZWQiLCJvbnJlamVjdGVkIiwiX3RoaXMiLCJpbmNsdWRlcyIsIl9mZXRjaCIsInJlcyIsInRvU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlcyQxIiwiZXJyb3IiLCJkYXRhIiwiY291bnQiLCJzdGF0dXMiLCJzdGF0dXNUZXh0Iiwib2siLCJfdGhpcyRoZWFkZXJzJGdldDIiLCJfcmVzJGhlYWRlcnMkZ2V0IiwiX3RoaXMkaGVhZGVycyRnZXQiLCJ0ZXh0IiwiZ2V0IiwicGFyc2UiLCJjb3VudEhlYWRlciIsIm1hdGNoIiwiY29udGVudFJhbmdlIiwic3BsaXQiLCJsZW5ndGgiLCJwYXJzZUludCIsIkFycmF5IiwiaXNBcnJheSIsIl9lcnJvciRkZXRhaWxzIiwiX3VudXNlZCIsImNhdGNoIiwiZmV0Y2hFcnJvciIsIl9mZXRjaEVycm9yJG5hbWUyIiwiZXJyb3JEZXRhaWxzIiwiY2F1c2UiLCJfY2F1c2UkbWVzc2FnZSIsIl9jYXVzZSRjb2RlIiwiX2ZldGNoRXJyb3IkbmFtZSIsIl9jYXVzZSRuYW1lIiwiY2F1c2VNZXNzYWdlIiwiY2F1c2VDb2RlIiwic3RhY2siLCJfZmV0Y2hFcnJvciRzdGFjayIsInJldHVybnMiLCJvdmVycmlkZVR5cGVzIiwiUG9zdGdyZXN0VHJhbnNmb3JtQnVpbGRlciIsInNlbGVjdCIsImNvbHVtbnMiLCJxdW90ZWQiLCJjbGVhbmVkQ29sdW1ucyIsIm1hcCIsImMiLCJ0ZXN0Iiwiam9pbiIsInNlYXJjaFBhcmFtcyIsImFwcGVuZCIsIm9yZGVyIiwiY29sdW1uIiwiYXNjZW5kaW5nIiwibnVsbHNGaXJzdCIsImZvcmVpZ25UYWJsZSIsInJlZmVyZW5jZWRUYWJsZSIsImtleSIsImV4aXN0aW5nT3JkZXIiLCJsaW1pdCIsInJhbmdlIiwiZnJvbSIsInRvIiwia2V5T2Zmc2V0Iiwia2V5TGltaXQiLCJhYm9ydFNpZ25hbCIsInNpbmdsZSIsIm1heWJlU2luZ2xlIiwiY3N2IiwiZ2VvanNvbiIsImV4cGxhaW4iLCJhbmFseXplIiwidmVyYm9zZSIsInNldHRpbmdzIiwiYnVmZmVycyIsIndhbCIsImZvcm1hdCIsIm9wdGlvbnMiLCJmaWx0ZXIiLCJCb29sZWFuIiwiZm9yTWVkaWF0eXBlIiwicm9sbGJhY2siLCJtYXhBZmZlY3RlZCIsIlBvc3RncmVzdFJlc2VydmVkQ2hhcnNSZWdleHAiLCJSZWdFeHAiLCJQb3N0Z3Jlc3RGaWx0ZXJCdWlsZGVyIiwiZXEiLCJuZXEiLCJndCIsImd0ZSIsImx0IiwibHRlIiwibGlrZSIsInBhdHRlcm4iLCJsaWtlQWxsT2YiLCJwYXR0ZXJucyIsImxpa2VBbnlPZiIsImlsaWtlIiwiaWxpa2VBbGxPZiIsImlsaWtlQW55T2YiLCJyZWdleE1hdGNoIiwicmVnZXhJTWF0Y2giLCJpcyIsImlzRGlzdGluY3QiLCJpbiIsInZhbHVlcyIsImNsZWFuZWRWYWx1ZXMiLCJTZXQiLCJzIiwibm90SW4iLCJjb250YWlucyIsImNvbnRhaW5lZEJ5IiwicmFuZ2VHdCIsInJhbmdlR3RlIiwicmFuZ2VMdCIsInJhbmdlTHRlIiwicmFuZ2VBZGphY2VudCIsIm92ZXJsYXBzIiwidGV4dFNlYXJjaCIsInF1ZXJ5IiwiY29uZmlnIiwidHlwZSIsInR5cGVQYXJ0IiwiY29uZmlnUGFydCIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwibm90Iiwib3BlcmF0b3IiLCJvciIsImZpbHRlcnMiLCJQb3N0Z3Jlc3RRdWVyeUJ1aWxkZXIiLCJmZXRjaCQxIiwiaGVhZCIsImluc2VydCIsImRlZmF1bHRUb051bGwiLCJfdGhpcyRmZXRjaCIsInJlZHVjZSIsImFjYyIsIngiLCJjb25jYXQiLCJrZXlzIiwidW5pcXVlQ29sdW1ucyIsInVwc2VydCIsIm9uQ29uZmxpY3QiLCJpZ25vcmVEdXBsaWNhdGVzIiwiX3RoaXMkZmV0Y2gyIiwidXBkYXRlIiwiX3RoaXMkZmV0Y2gzIiwiZGVsZXRlIiwiX3RoaXMkZmV0Y2g0IiwiUG9zdGdyZXN0Q2xpZW50Iiwic2NoZW1hTmFtZSIsInJlbGF0aW9uIiwidHJpbSIsIlVSTCIsInJwYyIsImZuIiwiYXJncyIsIl8iLCJzcmNfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/postgrest-js/dist/index.mjs\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/storage-js/dist/index.mjs":
|
||
/*!**********************************************************!*\
|
||
!*** ./node_modules/@supabase/storage-js/dist/index.mjs ***!
|
||
\**********************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StorageAnalyticsClient: () => (/* binding */ StorageAnalyticsClient),\n/* harmony export */ StorageApiError: () => (/* binding */ StorageApiError),\n/* harmony export */ StorageClient: () => (/* binding */ StorageClient),\n/* harmony export */ StorageError: () => (/* binding */ StorageError),\n/* harmony export */ StorageUnknownError: () => (/* binding */ StorageUnknownError),\n/* harmony export */ StorageVectorsApiError: () => (/* binding */ StorageVectorsApiError),\n/* harmony export */ StorageVectorsClient: () => (/* binding */ StorageVectorsClient),\n/* harmony export */ StorageVectorsError: () => (/* binding */ StorageVectorsError),\n/* harmony export */ StorageVectorsErrorCode: () => (/* binding */ StorageVectorsErrorCode),\n/* harmony export */ StorageVectorsUnknownError: () => (/* binding */ StorageVectorsUnknownError),\n/* harmony export */ VectorBucketApi: () => (/* binding */ VectorBucketApi),\n/* harmony export */ VectorBucketScope: () => (/* binding */ VectorBucketScope),\n/* harmony export */ VectorDataApi: () => (/* binding */ VectorDataApi),\n/* harmony export */ VectorIndexApi: () => (/* binding */ VectorIndexApi),\n/* harmony export */ VectorIndexScope: () => (/* binding */ VectorIndexScope),\n/* harmony export */ isPlainObject: () => (/* binding */ isPlainObject),\n/* harmony export */ isStorageError: () => (/* binding */ isStorageError),\n/* harmony export */ isStorageVectorsError: () => (/* binding */ isStorageVectorsError),\n/* harmony export */ normalizeToFloat32: () => (/* binding */ normalizeToFloat32),\n/* harmony export */ resolveFetch: () => (/* binding */ resolveFetch),\n/* harmony export */ resolveResponse: () => (/* binding */ resolveResponse),\n/* harmony export */ validateVectorDimension: () => (/* binding */ validateVectorDimension)\n/* harmony export */ });\n/* harmony import */ var iceberg_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! iceberg-js */ \"(action-browser)/./node_modules/iceberg-js/dist/index.mjs\");\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 constructor(message, status, statusCode){\n super(message);\n this.name = \"StorageApiError\";\n this.status = status;\n this.statusCode = statusCode;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n statusCode: this.statusCode\n };\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 (...args)=>customFetch(...args);\n return (...args)=>fetch(...args);\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(([key, value])=>{\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 constructor(downloadFn, shouldThrowOnError){\n this.downloadFn = downloadFn;\n this.shouldThrowOnError = shouldThrowOnError;\n }\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};\n//#endregion\n//#region src/packages/BlobDownloadBuilder.ts\nlet _Symbol$toStringTag;\n_Symbol$toStringTag = Symbol.toStringTag;\nvar BlobDownloadBuilder = class {\n constructor(downloadFn, shouldThrowOnError){\n this.downloadFn = downloadFn;\n this.shouldThrowOnError = shouldThrowOnError;\n this[_Symbol$toStringTag] = \"BlobDownloadBuilder\";\n this.promise = null;\n }\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};\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 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\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=${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, `${_this.url}/object/${_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/${_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=${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, `${_this4.url}/object/upload/sign/${_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, `${_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, `${_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, `${_this8.url}/object/sign/${_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=${options.download === true ? \"\" : options.download}` : \"\";\n data = {\n signedUrl: encodeURI(`${_this8.url}${data.signedURL}${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, `${_this9.url}/object/sign/${_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=${options.download === true ? \"\" : options.download}` : \"\";\n return {\n data: data.map((datum)=>_objectSpread2(_objectSpread2({}, datum), {}, {\n signedUrl: datum.signedURL ? encodeURI(`${_this9.url}${datum.signedURL}${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 ? `?${transformationQuery}` : \"\";\n const _path = this._getFinalPath(path);\n const downloadFn = ()=>get(this.fetch, `${this.url}/${renderPath}/${_path}${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, `${_this10.url}/object/info/${_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, `${_this11.url}/object/${_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=${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 = `?${queryString}`;\n return {\n data: {\n publicUrl: encodeURI(`${this.url}/${renderPath}/public/${_path}${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, `${_this12.url}/object/${_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, `${_this13.url}/object/list/${_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, `${_this14.url}/object/list-v2/${_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 `${this.bucketId}/${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=${transform.width}`);\n if (transform.height) params.push(`height=${transform.height}`);\n if (transform.resize) params.push(`resize=${transform.resize}`);\n if (transform.format) params.push(`format=${transform.format}`);\n if (transform.quality) params.push(`quality=${transform.quality}`);\n return params.join(\"&\");\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/${version}`\n};\n//#endregion\n//#region src/packages/StorageBucketApi.ts\nvar StorageBucketApi = class {\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\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, `${_this.url}/bucket${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, `${_this2.url}/bucket/${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, options = {\n public: false\n }) {\n var _this3 = this;\n try {\n return {\n data: await post$1(_this3.fetch, `${_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, `${_this4.url}/bucket/${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, `${_this5.url}/bucket/${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, `${_this6.url}/bucket/${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};\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* 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\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, `${_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 ? `${_this2.url}/bucket?${queryString}` : `${_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, `${_this3.url}/bucket/${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 (...args)=>{\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//#endregion\n//#region src/lib/vectors/constants.ts\nconst DEFAULT_HEADERS = {\n \"X-Client-Info\": `storage-js/${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 constructor(message, status, statusCode){\n super(message);\n this.name = \"StorageVectorsApiError\";\n this.status = status;\n this.statusCode = statusCode;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n statusCode: this.statusCode\n };\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 (...args)=>customFetch(...args);\n return (...args)=>fetch(...args);\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 ${expectedDimension}, got ${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 ${status} error`, status, statusCode));\n });\n else {\n const statusCode = status + \"\";\n reject(new StorageVectorsApiError(responseError.statusText || `HTTP ${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 /** 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 /** 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, `${_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, `${_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, `${_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, `${_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};\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 /** 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 /** 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, `${_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, `${_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 ${options.segmentCount - 1}`);\n }\n }\n return {\n data: await post(_this3.fetch, `${_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, `${_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, `${_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};\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 /** 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 /** 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, `${_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, `${_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(options = {}) {\n var _this3 = this;\n try {\n return {\n data: await post(_this3.fetch, `${_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, `${_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};\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* @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\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(options = {}) {\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/**\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* @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\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(options = {}) {\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/**\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* 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\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(options = {}) {\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//#endregion\n//#region src/StorageClient.ts\nvar StorageClient = class extends StorageBucketApi {\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\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//#endregion\n //# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2Uvc3RvcmFnZS1qcy9kaXN0L2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFnRDtBQUVoRCwyQkFBMkI7QUFDM0IsSUFBSUMsZUFBZSxjQUFjQztJQUNoQ0MsWUFBWUMsT0FBTyxDQUFFO1FBQ3BCLEtBQUssQ0FBQ0E7UUFDTixJQUFJLENBQUNDLGdCQUFnQixHQUFHO1FBQ3hCLElBQUksQ0FBQ0MsSUFBSSxHQUFHO0lBQ2I7QUFDRDtBQUNBLFNBQVNDLGVBQWVDLEtBQUs7SUFDNUIsT0FBTyxPQUFPQSxVQUFVLFlBQVlBLFVBQVUsUUFBUSxzQkFBc0JBO0FBQzdFO0FBQ0EsSUFBSUMsa0JBQWtCLGNBQWNSO0lBQ25DRSxZQUFZQyxPQUFPLEVBQUVNLE1BQU0sRUFBRUMsVUFBVSxDQUFFO1FBQ3hDLEtBQUssQ0FBQ1A7UUFDTixJQUFJLENBQUNFLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ0ksTUFBTSxHQUFHQTtRQUNkLElBQUksQ0FBQ0MsVUFBVSxHQUFHQTtJQUNuQjtJQUNBQyxTQUFTO1FBQ1IsT0FBTztZQUNOTixNQUFNLElBQUksQ0FBQ0EsSUFBSTtZQUNmRixTQUFTLElBQUksQ0FBQ0EsT0FBTztZQUNyQk0sUUFBUSxJQUFJLENBQUNBLE1BQU07WUFDbkJDLFlBQVksSUFBSSxDQUFDQSxVQUFVO1FBQzVCO0lBQ0Q7QUFDRDtBQUNBLElBQUlFLHNCQUFzQixjQUFjWjtJQUN2Q0UsWUFBWUMsT0FBTyxFQUFFVSxhQUFhLENBQUU7UUFDbkMsS0FBSyxDQUFDVjtRQUNOLElBQUksQ0FBQ0UsSUFBSSxHQUFHO1FBQ1osSUFBSSxDQUFDUSxhQUFhLEdBQUdBO0lBQ3RCO0FBQ0Q7QUFFQSxZQUFZO0FBQ1osNEJBQTRCO0FBQzVCLE1BQU1DLGlCQUFpQixDQUFDQztJQUN2QixJQUFJQSxhQUFhLE9BQU8sQ0FBQyxHQUFHQyxPQUFTRCxlQUFlQztJ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RixVQUFVLElBQUk7UUFDM0UsT0FBTzJHLDhCQUE4QnBRLElBQUksQ0FBQ3lKLFNBQVN2SSxlQUFlQSxlQUFlLENBQUMsR0FBR2EsVUFBVSxDQUFDLEdBQUc7WUFDbEd1TSxrQkFBa0I3RSxRQUFRNkUsZ0JBQWdCO1lBQzFDQyxXQUFXOUUsUUFBUThFLFNBQVM7UUFDN0I7SUFDRDtBQUNEO0FBRUEsWUFBWTtBQUNaLDhCQUE4QjtBQUM5QixJQUFJOEIsZ0JBQWdCLGNBQWM5RjtJQUNqQzs7Ozs7Ozs7Ozs7OztDQWFBLEdBQ0E3TixZQUFZbUcsR0FBRyxFQUFFSixVQUFVLENBQUMsQ0FBQyxFQUFFeUMsT0FBTyxFQUFFc0YsSUFBSSxDQUFFO1FBQzdDLEtBQUssQ0FBQzNILEtBQUtKLFNBQVN5QyxTQUFTc0Y7SUFDOUI7SUFDQTs7Ozs7Ozs7OztDQVVBLEdBQ0FWLEtBQUt6RCxFQUFFLEVBQUU7UUFDUixPQUFPLElBQUlyQixlQUFlLElBQUksQ0FBQ25DLEdBQUcsRUFBRSxJQUFJLENBQUNKLE9BQU8sRUFBRTRELElBQUksSUFBSSxDQUFDNUksS0FBSztJQUNqRTtJQUNBOzs7Ozs7Ozs7O0NBVUEsR0FDQSxJQUFJbVIsVUFBVTtRQUNiLE9BQU8sSUFBSVEscUJBQXFCLElBQUksQ0FBQ3ZNLEdBQUcsR0FBRyxXQUFXO1lBQ3JESixTQUFTLElBQUksQ0FBQ0EsT0FBTztZQUNyQmhGLE9BQU8sSUFBSSxDQUFDQSxLQUFLO1FBQ2xCO0lBQ0Q7SUFDQTs7Ozs7Ozs7OztDQVVBLEdBQ0EsSUFBSTZTLFlBQVk7UUFDZixPQUFPLElBQUl0RSx1QkFBdUIsSUFBSSxDQUFDbkosR0FBRyxHQUFHLFlBQVksSUFBSSxDQUFDSixPQUFPLEVBQUUsSUFBSSxDQUFDaEYsS0FBSztJQUNsRjtBQUNEO0FBRUEsWUFBWTtBQUN3YSxDQUNwYixrQ0FBa0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93aGlza3ktdmF1bHQvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3N0b3JhZ2UtanMvZGlzdC9pbmRleC5tanM/ZWIzNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJY2ViZXJnUmVzdENhdGFsb2cgfSBmcm9tIFwiaWNlYmVyZy1qc1wiO1xuXG4vLyNyZWdpb24gc3JjL2xpYi9lcnJvcnMudHNcbnZhciBTdG9yYWdlRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSkge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMuX19pc1N0b3JhZ2VFcnJvciA9IHRydWU7XG5cdFx0dGhpcy5uYW1lID0gXCJTdG9yYWdlRXJyb3JcIjtcblx0fVxufTtcbmZ1bmN0aW9uIGlzU3RvcmFnZUVycm9yKGVycm9yKSB7XG5cdHJldHVybiB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiYgZXJyb3IgIT09IG51bGwgJiYgXCJfX2lzU3RvcmFnZUVycm9yXCIgaW4gZXJyb3I7XG59XG52YXIgU3RvcmFnZUFwaUVycm9yID0gY2xhc3MgZXh0ZW5kcyBTdG9yYWdlRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlLCBzdGF0dXMsIHN0YXR1c0NvZGUpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzLm5hbWUgPSBcIlN0b3JhZ2VBcGlFcnJvclwiO1xuXHRcdHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuXHRcdHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG5cdH1cblx0dG9KU09OKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsXG5cdFx0XHRtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG5cdFx0XHRzdGF0dXM6IHRoaXMuc3RhdHVzLFxuXHRcdFx0c3RhdHVzQ29kZTogdGhpcy5zdGF0dXNDb2RlXG5cdFx0fTtcblx0fVxufTtcbnZhciBTdG9yYWdlVW5rbm93bkVycm9yID0gY2xhc3MgZXh0ZW5kcyBTdG9yYWdlRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcmlnaW5hbEVycm9yKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gXCJTdG9yYWdlVW5rbm93bkVycm9yXCI7XG5cdFx0dGhpcy5vcmlnaW5hbEVycm9yID0gb3JpZ2luYWxFcnJvcjtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi9oZWxwZXJzLnRzXG5jb25zdCByZXNvbHZlRmV0Y2gkMSA9IChjdXN0b21GZXRjaCkgPT4ge1xuXHRpZiAoY3VzdG9tRmV0Y2gpIHJldHVybiAoLi4uYXJncykgPT4gY3VzdG9tRmV0Y2goLi4uYXJncyk7XG5cdHJldHVybiAoLi4uYXJncykgPT4gZmV0Y2goLi4uYXJncyk7XG59O1xuY29uc3QgcmVzb2x2ZVJlc3BvbnNlJDEgPSAoKSA9PiB7XG5cdHJldHVybiBSZXNwb25zZTtcbn07XG5jb25zdCByZWN1cnNpdmVUb0NhbWVsID0gKGl0ZW0pID0+IHtcblx0aWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHJldHVybiBpdGVtLm1hcCgoZWwpID0+IHJlY3Vyc2l2ZVRvQ2FtZWwoZWwpKTtcblx0ZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09IFwiZnVuY3Rpb25cIiB8fCBpdGVtICE9PSBPYmplY3QoaXRlbSkpIHJldHVybiBpdGVtO1xuXHRjb25zdCByZXN1bHQgPSB7fTtcblx0T2JqZWN0LmVudHJpZXMoaXRlbSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG5cdFx0Y29uc3QgbmV3S2V5ID0ga2V5LnJlcGxhY2UoLyhbLV9dW2Etel0pL2dpLCAoYykgPT4gYy50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoL1stX10vZywgXCJcIikpO1xuXHRcdHJlc3VsdFtuZXdLZXldID0gcmVjdXJzaXZlVG9DYW1lbCh2YWx1ZSk7XG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcbi8qKlxuKiBEZXRlcm1pbmUgaWYgaW5wdXQgaXMgYSBwbGFpbiBvYmplY3RcbiogQW4gb2JqZWN0IGlzIHBsYWluIGlmIGl0J3MgY3JlYXRlZCBieSBlaXRoZXIge30sIG5ldyBPYmplY3QoKSwgb3IgT2JqZWN0LmNyZWF0ZShudWxsKVxuKiBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvaXMtcGxhaW4tb2JqXG4qL1xuY29uc3QgaXNQbGFpbk9iamVjdCQxID0gKHZhbHVlKSA9PiB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblx0Y29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcblx0cmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsdWUpO1xufTtcbi8qKlxuKiBWYWxpZGF0ZXMgaWYgYSBnaXZlbiBidWNrZXQgbmFtZSBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gU3VwYWJhc2UgU3RvcmFnZSBBUEkgcnVsZXNcbiogTWlycm9ycyBiYWNrZW5kIHZhbGlkYXRpb24gZnJvbTogc3RvcmFnZS9zcmMvc3RvcmFnZS9saW1pdHMudHM6aXNWYWxpZEJ1Y2tldE5hbWUoKVxuKlxuKiBSdWxlczpcbiogLSBMZW5ndGg6IDEtMTAwIGNoYXJhY3RlcnNcbiogLSBBbGxvd2VkIGNoYXJhY3RlcnM6IGFscGhhbnVtZXJpYyAoYS16LCBBLVosIDAtOSksIHVuZGVyc2NvcmUgKF8pLCBhbmQgc2FmZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiogLSBTYWZlIHNwZWNpYWwgY2hhcmFjdGVyczogISAtIC4gKiAnICggKSBzcGFjZSAmICQgQCA9IDsgOiArICwgP1xuKiAtIEZvcmJpZGRlbjogcGF0aCBzZXBhcmF0b3JzICgvLCBcXCksIHBhdGggdHJhdmVyc2FsICguLiksIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuKlxuKiBBV1MgUzMgUmVmZXJlbmNlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9vYmplY3Qta2V5cy5odG1sXG4qXG4qIEBwYXJhbSBidWNrZXROYW1lIC0gVGhlIGJ1Y2tldCBuYW1lIHRvIHZhbGlkYXRlXG4qIEByZXR1cm5zIHRydWUgaWYgdmFsaWQsIGZhbHNlIG90aGVyd2lzZVxuKi9cbmNvbnN0IGlzVmFsaWRCdWNrZXROYW1lID0gKGJ1Y2tldE5hbWUpID0+IHtcblx0aWYgKCFidWNrZXROYW1lIHx8IHR5cGVvZiBidWNrZXROYW1lICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XG5cdGlmIChidWNrZXROYW1lLmxlbmd0aCA9PT0gMCB8fCBidWNrZXROYW1lLmxlbmd0aCA+IDEwMCkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoYnVja2V0TmFtZS50cmltKCkgIT09IGJ1Y2tldE5hbWUpIHJldHVybiBmYWxzZTtcblx0aWYgKGJ1Y2tldE5hbWUuaW5jbHVkZXMoXCIvXCIpIHx8IGJ1Y2tldE5hbWUuaW5jbHVkZXMoXCJcXFxcXCIpKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiAvXltcXHchLlxcKicoKSAmJEA9OzorLD8tXSskLy50ZXN0KGJ1Y2tldE5hbWUpO1xufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gXFwwQG94Yy1wcm9qZWN0K3J1bnRpbWVAMC4xMDEuMC9oZWxwZXJzL3R5cGVvZi5qc1xuZnVuY3Rpb24gX3R5cGVvZihvKSB7XG5cdFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblx0cmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbihvJDEpIHtcblx0XHRyZXR1cm4gdHlwZW9mIG8kMTtcblx0fSA6IGZ1bmN0aW9uKG8kMSkge1xuXHRcdHJldHVybiBvJDEgJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgbyQxLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyQxICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvJDE7XG5cdH0sIF90eXBlb2Yobyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIFxcMEBveGMtcHJvamVjdCtydW50aW1lQDAuMTAxLjAvaGVscGVycy90b1ByaW1pdGl2ZS5qc1xuZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikge1xuXHRpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDtcblx0dmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG5cdGlmICh2b2lkIDAgIT09IGUpIHtcblx0XHR2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcblx0XHRpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG5cdH1cblx0cmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gXFwwQG94Yy1wcm9qZWN0K3J1bnRpbWVAMC4xMDEuMC9oZWxwZXJzL3RvUHJvcGVydHlLZXkuanNcbmZ1bmN0aW9uIHRvUHJvcGVydHlLZXkodCkge1xuXHR2YXIgaSA9IHRvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuXHRyZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBcXDBAb3hjLXByb2plY3QrcnVudGltZUAwLjEwMS4wL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanNcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7XG5cdHJldHVybiAociA9IHRvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwge1xuXHRcdHZhbHVlOiB0LFxuXHRcdGVudW1lcmFibGU6ICEwLFxuXHRcdGNvbmZpZ3VyYWJsZTogITAsXG5cdFx0d3JpdGFibGU6ICEwXG5cdH0pIDogZVtyXSA9IHQsIGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIFxcMEBveGMtcHJvamVjdCtydW50aW1lQDAuMTAxLjAvaGVscGVycy9vYmplY3RTcHJlYWQyLmpzXG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHtcblx0dmFyIHQgPSBPYmplY3Qua2V5cyhlKTtcblx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHR2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7XG5cdFx0ciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uKHIkMSkge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgciQxKS5lbnVtZXJhYmxlO1xuXHRcdH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pO1xuXHR9XG5cdHJldHVybiB0O1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIoZSkge1xuXHRmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykge1xuXHRcdHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTtcblx0XHRyICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbihyJDEpIHtcblx0XHRcdF9kZWZpbmVQcm9wZXJ0eShlLCByJDEsIHRbciQxXSk7XG5cdFx0fSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uKHIkMSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIkMSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByJDEpKTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi9mZXRjaC50c1xuY29uc3QgX2dldEVycm9yTWVzc2FnZSQxID0gKGVycikgPT4ge1xuXHR2YXIgX2VyciRlcnJvcjtcblx0cmV0dXJuIGVyci5tc2cgfHwgZXJyLm1lc3NhZ2UgfHwgZXJyLmVycm9yX2Rlc2NyaXB0aW9uIHx8ICh0eXBlb2YgZXJyLmVycm9yID09PSBcInN0cmluZ1wiID8gZXJyLmVycm9yIDogKF9lcnIkZXJyb3IgPSBlcnIuZXJyb3IpID09PSBudWxsIHx8IF9lcnIkZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lcnIkZXJyb3IubWVzc2FnZSkgfHwgSlNPTi5zdHJpbmdpZnkoZXJyKTtcbn07XG5jb25zdCBoYW5kbGVFcnJvciQxID0gYXN5bmMgKGVycm9yLCByZWplY3QsIG9wdGlvbnMpID0+IHtcblx0aWYgKGVycm9yIGluc3RhbmNlb2YgYXdhaXQgcmVzb2x2ZVJlc3BvbnNlJDEoKSAmJiAhKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ub1Jlc29sdmVKc29uKSkgZXJyb3IuanNvbigpLnRoZW4oKGVycikgPT4ge1xuXHRcdGNvbnN0IHN0YXR1cyA9IGVycm9yLnN0YXR1cyB8fCA1MDA7XG5cdFx0Y29uc3Qgc3RhdHVzQ29kZSA9IChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIuc3RhdHVzQ29kZSkgfHwgc3RhdHVzICsgXCJcIjtcblx0XHRyZWplY3QobmV3IFN0b3JhZ2VBcGlFcnJvcihfZ2V0RXJyb3JNZXNzYWdlJDEoZXJyKSwgc3RhdHVzLCBzdGF0dXNDb2RlKSk7XG5cdH0pLmNhdGNoKChlcnIpID0+IHtcblx0XHRyZWplY3QobmV3IFN0b3JhZ2VVbmtub3duRXJyb3IoX2dldEVycm9yTWVzc2FnZSQxKGVyciksIGVycikpO1xuXHR9KTtcblx0ZWxzZSByZWplY3QobmV3IFN0b3JhZ2VVbmtub3duRXJyb3IoX2dldEVycm9yTWVzc2FnZSQxKGVycm9yKSwgZXJyb3IpKTtcbn07XG5jb25zdCBfZ2V0UmVxdWVzdFBhcmFtcyQxID0gKG1ldGhvZCwgb3B0aW9ucywgcGFyYW1ldGVycywgYm9keSkgPT4ge1xuXHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0bWV0aG9kLFxuXHRcdGhlYWRlcnM6IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhZGVycykgfHwge31cblx0fTtcblx0aWYgKG1ldGhvZCA9PT0gXCJHRVRcIiB8fCAhYm9keSkgcmV0dXJuIHBhcmFtcztcblx0aWYgKGlzUGxhaW5PYmplY3QkMShib2R5KSkge1xuXHRcdHBhcmFtcy5oZWFkZXJzID0gX29iamVjdFNwcmVhZDIoeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhZGVycyk7XG5cdFx0cGFyYW1zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblx0fSBlbHNlIHBhcmFtcy5ib2R5ID0gYm9keTtcblx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kdXBsZXgpIHBhcmFtcy5kdXBsZXggPSBvcHRpb25zLmR1cGxleDtcblx0cmV0dXJuIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBwYXJhbXMpLCBwYXJhbWV0ZXJzKTtcbn07XG5hc3luYyBmdW5jdGlvbiBfaGFuZGxlUmVxdWVzdCQxKGZldGNoZXIsIG1ldGhvZCwgdXJsLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0ZmV0Y2hlcih1cmwsIF9nZXRSZXF1ZXN0UGFyYW1zJDEobWV0aG9kLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KSkudGhlbigocmVzdWx0KSA9PiB7XG5cdFx0XHRpZiAoIXJlc3VsdC5vaykgdGhyb3cgcmVzdWx0O1xuXHRcdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ub1Jlc29sdmVKc29uKSByZXR1cm4gcmVzdWx0O1xuXHRcdFx0cmV0dXJuIHJlc3VsdC5qc29uKCk7XG5cdFx0fSkudGhlbigoZGF0YSkgPT4gcmVzb2x2ZShkYXRhKSkuY2F0Y2goKGVycm9yKSA9PiBoYW5kbGVFcnJvciQxKGVycm9yLCByZWplY3QsIG9wdGlvbnMpKTtcblx0fSk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXQoZmV0Y2hlciwgdXJsLCBvcHRpb25zLCBwYXJhbWV0ZXJzKSB7XG5cdHJldHVybiBfaGFuZGxlUmVxdWVzdCQxKGZldGNoZXIsIFwiR0VUXCIsIHVybCwgb3B0aW9ucywgcGFyYW1ldGVycyk7XG59XG5hc3luYyBmdW5jdGlvbiBwb3N0JDEoZmV0Y2hlciwgdXJsLCBib2R5LCBvcHRpb25zLCBwYXJhbWV0ZXJzKSB7XG5cdHJldHVybiBfaGFuZGxlUmVxdWVzdCQxKGZldGNoZXIsIFwiUE9TVFwiLCB1cmwsIG9wdGlvbnMsIHBhcmFtZXRlcnMsIGJvZHkpO1xufVxuYXN5bmMgZnVuY3Rpb24gcHV0KGZldGNoZXIsIHVybCwgYm9keSwgb3B0aW9ucywgcGFyYW1ldGVycykge1xuXHRyZXR1cm4gX2hhbmRsZVJlcXVlc3QkMShmZXRjaGVyLCBcIlBVVFwiLCB1cmwsIG9wdGlvbnMsIHBhcmFtZXRlcnMsIGJvZHkpO1xufVxuYXN5bmMgZnVuY3Rpb24gaGVhZChmZXRjaGVyLCB1cmwsIG9wdGlvbnMsIHBhcmFtZXRlcnMpIHtcblx0cmV0dXJuIF9oYW5kbGVSZXF1ZXN0JDEoZmV0Y2hlciwgXCJIRUFEXCIsIHVybCwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwgeyBub1Jlc29sdmVKc29uOiB0cnVlIH0pLCBwYXJhbWV0ZXJzKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZShmZXRjaGVyLCB1cmwsIGJvZHksIG9wdGlvbnMsIHBhcmFtZXRlcnMpIHtcblx0cmV0dXJuIF9oYW5kbGVSZXF1ZXN0JDEoZmV0Y2hlciwgXCJERUxFVEVcIiwgdXJsLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3BhY2thZ2VzL1N0cmVhbURvd25sb2FkQnVpbGRlci50c1xudmFyIFN0cmVhbURvd25sb2FkQnVpbGRlciA9IGNsYXNzIHtcblx0Y29uc3RydWN0b3IoZG93bmxvYWRGbiwgc2hvdWxkVGhyb3dPbkVycm9yKSB7XG5cdFx0dGhpcy5kb3dubG9hZEZuID0gZG93bmxvYWRGbjtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IHNob3VsZFRocm93T25FcnJvcjtcblx0fVxuXHR0aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0ZSgpLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuXHR9XG5cdGFzeW5jIGV4ZWN1dGUoKSB7XG5cdFx0dmFyIF90aGlzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogKGF3YWl0IF90aGlzLmRvd25sb2FkRm4oKSkuYm9keSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9wYWNrYWdlcy9CbG9iRG93bmxvYWRCdWlsZGVyLnRzXG5sZXQgX1N5bWJvbCR0b1N0cmluZ1RhZztcbl9TeW1ib2wkdG9TdHJpbmdUYWcgPSBTeW1ib2wudG9TdHJpbmdUYWc7XG52YXIgQmxvYkRvd25sb2FkQnVpbGRlciA9IGNsYXNzIHtcblx0Y29uc3RydWN0b3IoZG93bmxvYWRGbiwgc2hvdWxkVGhyb3dPbkVycm9yKSB7XG5cdFx0dGhpcy5kb3dubG9hZEZuID0gZG93bmxvYWRGbjtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IHNob3VsZFRocm93T25FcnJvcjtcblx0XHR0aGlzW19TeW1ib2wkdG9TdHJpbmdUYWddID0gXCJCbG9iRG93bmxvYWRCdWlsZGVyXCI7XG5cdFx0dGhpcy5wcm9taXNlID0gbnVsbDtcblx0fVxuXHRhc1N0cmVhbSgpIHtcblx0XHRyZXR1cm4gbmV3IFN0cmVhbURvd25sb2FkQnVpbGRlcih0aGlzLmRvd25sb2FkRm4sIHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yKTtcblx0fVxuXHR0aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuXHR9XG5cdGNhdGNoKG9ucmVqZWN0ZWQpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRQcm9taXNlKCkuY2F0Y2gob25yZWplY3RlZCk7XG5cdH1cblx0ZmluYWxseShvbmZpbmFsbHkpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRQcm9taXNlKCkuZmluYWxseShvbmZpbmFsbHkpO1xuXHR9XG5cdGdldFByb21pc2UoKSB7XG5cdFx0aWYgKCF0aGlzLnByb21pc2UpIHRoaXMucHJvbWlzZSA9IHRoaXMuZXhlY3V0ZSgpO1xuXHRcdHJldHVybiB0aGlzLnByb21pc2U7XG5cdH1cblx0YXN5bmMgZXhlY3V0ZSgpIHtcblx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCAoYXdhaXQgX3RoaXMuZG93bmxvYWRGbigpKS5ibG9iKCksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvcGFja2FnZXMvU3RvcmFnZUZpbGVBcGkudHNcbmNvbnN0IERFRkFVTFRfU0VBUkNIX09QVElPTlMgPSB7XG5cdGxpbWl0OiAxMDAsXG5cdG9mZnNldDogMCxcblx0c29ydEJ5OiB7XG5cdFx0Y29sdW1uOiBcIm5hbWVcIixcblx0XHRvcmRlcjogXCJhc2NcIlxuXHR9XG59O1xuY29uc3QgREVGQVVMVF9GSUxFX09QVElPTlMgPSB7XG5cdGNhY2hlQ29udHJvbDogXCIzNjAwXCIsXG5cdGNvbnRlbnRUeXBlOiBcInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOFwiLFxuXHR1cHNlcnQ6IGZhbHNlXG59O1xudmFyIFN0b3JhZ2VGaWxlQXBpID0gY2xhc3Mge1xuXHRjb25zdHJ1Y3Rvcih1cmwsIGhlYWRlcnMgPSB7fSwgYnVja2V0SWQsIGZldGNoJDEpIHtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IGZhbHNlO1xuXHRcdHRoaXMudXJsID0gdXJsO1xuXHRcdHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG5cdFx0dGhpcy5idWNrZXRJZCA9IGJ1Y2tldElkO1xuXHRcdHRoaXMuZmV0Y2ggPSByZXNvbHZlRmV0Y2gkMShmZXRjaCQxKTtcblx0fVxuXHQvKipcblx0KiBFbmFibGUgdGhyb3dpbmcgZXJyb3JzIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZW0uXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCovXG5cdHRocm93T25FcnJvcigpIHtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IHRydWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqXG5cdCogVXBsb2FkcyBhIGZpbGUgdG8gYW4gZXhpc3RpbmcgYnVja2V0IG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoIHdpdGggYSBuZXcgb25lLlxuXHQqXG5cdCogQHBhcmFtIG1ldGhvZCBIVFRQIG1ldGhvZC5cblx0KiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgZmlsZSBwYXRoLiBTaG91bGQgYmUgb2YgdGhlIGZvcm1hdCBgZm9sZGVyL3N1YmZvbGRlci9maWxlbmFtZS5wbmdgLiBUaGUgYnVja2V0IG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUgYXR0ZW1wdGluZyB0byB1cGxvYWQuXG5cdCogQHBhcmFtIGZpbGVCb2R5IFRoZSBib2R5IG9mIHRoZSBmaWxlIHRvIGJlIHN0b3JlZCBpbiB0aGUgYnVja2V0LlxuXHQqL1xuXHRhc3luYyB1cGxvYWRPclVwZGF0ZShtZXRob2QsIHBhdGgsIGZpbGVCb2R5LCBmaWxlT3B0aW9ucykge1xuXHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCBib2R5O1xuXHRcdFx0Y29uc3Qgb3B0aW9ucyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX0ZJTEVfT1BUSU9OUyksIGZpbGVPcHRpb25zKTtcblx0XHRcdGxldCBoZWFkZXJzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIF90aGlzLmhlYWRlcnMpLCBtZXRob2QgPT09IFwiUE9TVFwiICYmIHsgXCJ4LXVwc2VydFwiOiBTdHJpbmcob3B0aW9ucy51cHNlcnQpIH0pO1xuXHRcdFx0Y29uc3QgbWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuXHRcdFx0aWYgKHR5cGVvZiBCbG9iICE9PSBcInVuZGVmaW5lZFwiICYmIGZpbGVCb2R5IGluc3RhbmNlb2YgQmxvYikge1xuXHRcdFx0XHRib2R5ID0gbmV3IEZvcm1EYXRhKCk7XG5cdFx0XHRcdGJvZHkuYXBwZW5kKFwiY2FjaGVDb250cm9sXCIsIG9wdGlvbnMuY2FjaGVDb250cm9sKTtcblx0XHRcdFx0aWYgKG1ldGFkYXRhKSBib2R5LmFwcGVuZChcIm1ldGFkYXRhXCIsIF90aGlzLmVuY29kZU1ldGFkYXRhKG1ldGFkYXRhKSk7XG5cdFx0XHRcdGJvZHkuYXBwZW5kKFwiXCIsIGZpbGVCb2R5KTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIEZvcm1EYXRhICE9PSBcInVuZGVmaW5lZFwiICYmIGZpbGVCb2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcblx0XHRcdFx0Ym9keSA9IGZpbGVCb2R5O1xuXHRcdFx0XHRpZiAoIWJvZHkuaGFzKFwiY2FjaGVDb250cm9sXCIpKSBib2R5LmFwcGVuZChcImNhY2hlQ29udHJvbFwiLCBvcHRpb25zLmNhY2hlQ29udHJvbCk7XG5cdFx0XHRcdGlmIChtZXRhZGF0YSAmJiAhYm9keS5oYXMoXCJtZXRhZGF0YVwiKSkgYm9keS5hcHBlbmQoXCJtZXRhZGF0YVwiLCBfdGhpcy5lbmNvZGVNZXRhZGF0YShtZXRhZGF0YSkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ym9keSA9IGZpbGVCb2R5O1xuXHRcdFx0XHRoZWFkZXJzW1wiY2FjaGUtY29udHJvbFwiXSA9IGBtYXgtYWdlPSR7b3B0aW9ucy5jYWNoZUNvbnRyb2x9YDtcblx0XHRcdFx0aGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9IG9wdGlvbnMuY29udGVudFR5cGU7XG5cdFx0XHRcdGlmIChtZXRhZGF0YSkgaGVhZGVyc1tcIngtbWV0YWRhdGFcIl0gPSBfdGhpcy50b0Jhc2U2NChfdGhpcy5lbmNvZGVNZXRhZGF0YShtZXRhZGF0YSkpO1xuXHRcdFx0XHRpZiAoKHR5cGVvZiBSZWFkYWJsZVN0cmVhbSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBib2R5IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0gfHwgYm9keSAmJiB0eXBlb2YgYm9keSA9PT0gXCJvYmplY3RcIiAmJiBcInBpcGVcIiBpbiBib2R5ICYmIHR5cGVvZiBib2R5LnBpcGUgPT09IFwiZnVuY3Rpb25cIikgJiYgIW9wdGlvbnMuZHVwbGV4KSBvcHRpb25zLmR1cGxleCA9IFwiaGFsZlwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGZpbGVPcHRpb25zID09PSBudWxsIHx8IGZpbGVPcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWxlT3B0aW9ucy5oZWFkZXJzKSBoZWFkZXJzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGhlYWRlcnMpLCBmaWxlT3B0aW9ucy5oZWFkZXJzKTtcblx0XHRcdGNvbnN0IGNsZWFuUGF0aCA9IF90aGlzLl9yZW1vdmVFbXB0eUZvbGRlcnMocGF0aCk7XG5cdFx0XHRjb25zdCBfcGF0aCA9IF90aGlzLl9nZXRGaW5hbFBhdGgoY2xlYW5QYXRoKTtcblx0XHRcdGNvbnN0IGRhdGEgPSBhd2FpdCAobWV0aG9kID09IFwiUFVUXCIgPyBwdXQgOiBwb3N0JDEpKF90aGlzLmZldGNoLCBgJHtfdGhpcy51cmx9L29iamVjdC8ke19wYXRofWAsIGJvZHksIF9vYmplY3RTcHJlYWQyKHsgaGVhZGVycyB9LCAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmR1cGxleCkgPyB7IGR1cGxleDogb3B0aW9ucy5kdXBsZXggfSA6IHt9KSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0cGF0aDogY2xlYW5QYXRoLFxuXHRcdFx0XHRcdGlkOiBkYXRhLklkLFxuXHRcdFx0XHRcdGZ1bGxQYXRoOiBkYXRhLktleVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBVcGxvYWRzIGEgZmlsZSB0byBhbiBleGlzdGluZyBidWNrZXQuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIHBhdGggVGhlIGZpbGUgcGF0aCwgaW5jbHVkaW5nIHRoZSBmaWxlIG5hbWUuIFNob3VsZCBiZSBvZiB0aGUgZm9ybWF0IGBmb2xkZXIvc3ViZm9sZGVyL2ZpbGVuYW1lLnBuZ2AuIFRoZSBidWNrZXQgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZSBhdHRlbXB0aW5nIHRvIHVwbG9hZC5cblx0KiBAcGFyYW0gZmlsZUJvZHkgVGhlIGJvZHkgb2YgdGhlIGZpbGUgdG8gYmUgc3RvcmVkIGluIHRoZSBidWNrZXQuXG5cdCogQHBhcmFtIGZpbGVPcHRpb25zIE9wdGlvbmFsIGZpbGUgdXBsb2FkIG9wdGlvbnMgaW5jbHVkaW5nIGNhY2hlQ29udHJvbCwgY29udGVudFR5cGUsIHVwc2VydCwgYW5kIG1ldGFkYXRhLlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIGZpbGUgcGF0aCwgaWQsIGFuZCBmdWxsUGF0aCBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgVXBsb2FkIGZpbGVcblx0KiBgYGBqc1xuXHQqIGNvbnN0IGF2YXRhckZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF1cblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdhdmF0YXJzJylcblx0KiAgIC51cGxvYWQoJ3B1YmxpYy9hdmF0YXIxLnBuZycsIGF2YXRhckZpbGUsIHtcblx0KiAgICAgY2FjaGVDb250cm9sOiAnMzYwMCcsXG5cdCogICAgIHVwc2VydDogZmFsc2Vcblx0KiAgIH0pXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IHtcblx0KiAgICAgXCJwYXRoXCI6IFwicHVibGljL2F2YXRhcjEucG5nXCIsXG5cdCogICAgIFwiZnVsbFBhdGhcIjogXCJhdmF0YXJzL3B1YmxpYy9hdmF0YXIxLnBuZ1wiXG5cdCogICB9LFxuXHQqICAgXCJlcnJvclwiOiBudWxsXG5cdCogfVxuXHQqIGBgYFxuXHQqXG5cdCogQGV4YW1wbGUgVXBsb2FkIGZpbGUgdXNpbmcgYEFycmF5QnVmZmVyYCBmcm9tIGJhc2U2NCBmaWxlIGRhdGFcblx0KiBgYGBqc1xuXHQqIGltcG9ydCB7IGRlY29kZSB9IGZyb20gJ2Jhc2U2NC1hcnJheWJ1ZmZlcidcblx0KlxuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLnVwbG9hZCgncHVibGljL2F2YXRhcjEucG5nJywgZGVjb2RlKCdiYXNlNjRGaWxlRGF0YScpLCB7XG5cdCogICAgIGNvbnRlbnRUeXBlOiAnaW1hZ2UvcG5nJ1xuXHQqICAgfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgdXBsb2FkKHBhdGgsIGZpbGVCb2R5LCBmaWxlT3B0aW9ucykge1xuXHRcdHJldHVybiB0aGlzLnVwbG9hZE9yVXBkYXRlKFwiUE9TVFwiLCBwYXRoLCBmaWxlQm9keSwgZmlsZU9wdGlvbnMpO1xuXHR9XG5cdC8qKlxuXHQqIFVwbG9hZCBhIGZpbGUgd2l0aCBhIHRva2VuIGdlbmVyYXRlZCBmcm9tIGBjcmVhdGVTaWduZWRVcGxvYWRVcmxgLlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBwYXRoIFRoZSBmaWxlIHBhdGgsIGluY2x1ZGluZyB0aGUgZmlsZSBuYW1lLiBTaG91bGQgYmUgb2YgdGhlIGZvcm1hdCBgZm9sZGVyL3N1YmZvbGRlci9maWxlbmFtZS5wbmdgLiBUaGUgYnVja2V0IG11c3QgYWxyZWFkeSBleGlzdCBiZWZvcmUgYXR0ZW1wdGluZyB0byB1cGxvYWQuXG5cdCogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiBnZW5lcmF0ZWQgZnJvbSBgY3JlYXRlU2lnbmVkVXBsb2FkVXJsYFxuXHQqIEBwYXJhbSBmaWxlQm9keSBUaGUgYm9keSBvZiB0aGUgZmlsZSB0byBiZSBzdG9yZWQgaW4gdGhlIGJ1Y2tldC5cblx0KiBAcGFyYW0gZmlsZU9wdGlvbnMgSFRUUCBoZWFkZXJzIChjYWNoZUNvbnRyb2wsIGNvbnRlbnRUeXBlLCBldGMuKS5cblx0KiAqKk5vdGU6KiogVGhlIGB1cHNlcnRgIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGhlcmUuIFRvIGVuYWJsZSB1cHNlcnQgYmVoYXZpb3IsXG5cdCogcGFzcyBgeyB1cHNlcnQ6IHRydWUgfWAgd2hlbiBjYWxsaW5nIGBjcmVhdGVTaWduZWRVcGxvYWRVcmwoKWAgaW5zdGVhZC5cblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBmaWxlIHBhdGggYW5kIGZ1bGxQYXRoIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBVcGxvYWQgdG8gYSBzaWduZWQgVVJMXG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdhdmF0YXJzJylcblx0KiAgIC51cGxvYWRUb1NpZ25lZFVybCgnZm9sZGVyL2NhdC5qcGcnLCAndG9rZW4tZnJvbS1jcmVhdGVTaWduZWRVcGxvYWRVcmwnLCBmaWxlKVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiB7XG5cdCogICAgIFwicGF0aFwiOiBcImZvbGRlci9jYXQuanBnXCIsXG5cdCogICAgIFwiZnVsbFBhdGhcIjogXCJhdmF0YXJzL2ZvbGRlci9jYXQuanBnXCJcblx0KiAgIH0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIHVwbG9hZFRvU2lnbmVkVXJsKHBhdGgsIHRva2VuLCBmaWxlQm9keSwgZmlsZU9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXMzID0gdGhpcztcblx0XHRjb25zdCBjbGVhblBhdGggPSBfdGhpczMuX3JlbW92ZUVtcHR5Rm9sZGVycyhwYXRoKTtcblx0XHRjb25zdCBfcGF0aCA9IF90aGlzMy5fZ2V0RmluYWxQYXRoKGNsZWFuUGF0aCk7XG5cdFx0Y29uc3QgdXJsID0gbmV3IFVSTChfdGhpczMudXJsICsgYC9vYmplY3QvdXBsb2FkL3NpZ24vJHtfcGF0aH1gKTtcblx0XHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInRva2VuXCIsIHRva2VuKTtcblx0XHR0cnkge1xuXHRcdFx0bGV0IGJvZHk7XG5cdFx0XHRjb25zdCBvcHRpb25zID0gX29iamVjdFNwcmVhZDIoeyB1cHNlcnQ6IERFRkFVTFRfRklMRV9PUFRJT05TLnVwc2VydCB9LCBmaWxlT3B0aW9ucyk7XG5cdFx0XHRjb25zdCBoZWFkZXJzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIF90aGlzMy5oZWFkZXJzKSwgeyBcIngtdXBzZXJ0XCI6IFN0cmluZyhvcHRpb25zLnVwc2VydCkgfSk7XG5cdFx0XHRpZiAodHlwZW9mIEJsb2IgIT09IFwidW5kZWZpbmVkXCIgJiYgZmlsZUJvZHkgaW5zdGFuY2VvZiBCbG9iKSB7XG5cdFx0XHRcdGJvZHkgPSBuZXcgRm9ybURhdGEoKTtcblx0XHRcdFx0Ym9keS5hcHBlbmQoXCJjYWNoZUNvbnRyb2xcIiwgb3B0aW9ucy5jYWNoZUNvbnRyb2wpO1xuXHRcdFx0XHRib2R5LmFwcGVuZChcIlwiLCBmaWxlQm9keSk7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBGb3JtRGF0YSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBmaWxlQm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhKSB7XG5cdFx0XHRcdGJvZHkgPSBmaWxlQm9keTtcblx0XHRcdFx0Ym9keS5hcHBlbmQoXCJjYWNoZUNvbnRyb2xcIiwgb3B0aW9ucy5jYWNoZUNvbnRyb2wpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ym9keSA9IGZpbGVCb2R5O1xuXHRcdFx0XHRoZWFkZXJzW1wiY2FjaGUtY29udHJvbFwiXSA9IGBtYXgtYWdlPSR7b3B0aW9ucy5jYWNoZUNvbnRyb2x9YDtcblx0XHRcdFx0aGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9IG9wdGlvbnMuY29udGVudFR5cGU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0cGF0aDogY2xlYW5QYXRoLFxuXHRcdFx0XHRcdGZ1bGxQYXRoOiAoYXdhaXQgcHV0KF90aGlzMy5mZXRjaCwgdXJsLnRvU3RyaW5nKCksIGJvZHksIHsgaGVhZGVycyB9KSkuS2V5XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBDcmVhdGVzIGEgc2lnbmVkIHVwbG9hZCBVUkwuXG5cdCogU2lnbmVkIHVwbG9hZCBVUkxzIGNhbiBiZSB1c2VkIHRvIHVwbG9hZCBmaWxlcyB0byB0aGUgYnVja2V0IHdpdGhvdXQgZnVydGhlciBhdXRoZW50aWNhdGlvbi5cblx0KiBUaGV5IGFyZSB2YWxpZCBmb3IgMiBob3Vycy5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gcGF0aCBUaGUgZmlsZSBwYXRoLCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgZmlsZSBuYW1lLiBGb3IgZXhhbXBsZSBgZm9sZGVyL2ltYWdlLnBuZ2AuXG5cdCogQHBhcmFtIG9wdGlvbnMudXBzZXJ0IElmIHNldCB0byB0cnVlLCBhbGxvd3MgdGhlIGZpbGUgdG8gYmUgb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgc2lnbmVkIHVwbG9hZCBVUkwsIHRva2VuLCBhbmQgcGF0aCBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgQ3JlYXRlIFNpZ25lZCBVcGxvYWQgVVJMXG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdhdmF0YXJzJylcblx0KiAgIC5jcmVhdGVTaWduZWRVcGxvYWRVcmwoJ2ZvbGRlci9jYXQuanBnJylcblx0KiBgYGBcblx0KlxuXHQqIFJlc3BvbnNlOlxuXHQqIGBgYGpzb25cblx0KiB7XG5cdCogICBcImRhdGFcIjoge1xuXHQqICAgICBcInNpZ25lZFVybFwiOiBcImh0dHBzOi8vZXhhbXBsZS5zdXBhYmFzZS5jby9zdG9yYWdlL3YxL29iamVjdC91cGxvYWQvc2lnbi9hdmF0YXJzL2ZvbGRlci9jYXQuanBnP3Rva2VuPTxUT0tFTj5cIixcblx0KiAgICAgXCJwYXRoXCI6IFwiZm9sZGVyL2NhdC5qcGdcIixcblx0KiAgICAgXCJ0b2tlblwiOiBcIjxUT0tFTj5cIlxuXHQqICAgfSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgY3JlYXRlU2lnbmVkVXBsb2FkVXJsKHBhdGgsIG9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXM0ID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0bGV0IF9wYXRoID0gX3RoaXM0Ll9nZXRGaW5hbFBhdGgocGF0aCk7XG5cdFx0XHRjb25zdCBoZWFkZXJzID0gX29iamVjdFNwcmVhZDIoe30sIF90aGlzNC5oZWFkZXJzKTtcblx0XHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudXBzZXJ0KSBoZWFkZXJzW1wieC11cHNlcnRcIl0gPSBcInRydWVcIjtcblx0XHRcdGNvbnN0IGRhdGEgPSBhd2FpdCBwb3N0JDEoX3RoaXM0LmZldGNoLCBgJHtfdGhpczQudXJsfS9vYmplY3QvdXBsb2FkL3NpZ24vJHtfcGF0aH1gLCB7fSwgeyBoZWFkZXJzIH0pO1xuXHRcdFx0Y29uc3QgdXJsID0gbmV3IFVSTChfdGhpczQudXJsICsgZGF0YS51cmwpO1xuXHRcdFx0Y29uc3QgdG9rZW4gPSB1cmwuc2VhcmNoUGFyYW1zLmdldChcInRva2VuXCIpO1xuXHRcdFx0aWYgKCF0b2tlbikgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcihcIk5vIHRva2VuIHJldHVybmVkIGJ5IEFQSVwiKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHRzaWduZWRVcmw6IHVybC50b1N0cmluZygpLFxuXHRcdFx0XHRcdHBhdGgsXG5cdFx0XHRcdFx0dG9rZW5cblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczQuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIFJlcGxhY2VzIGFuIGV4aXN0aW5nIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoIHdpdGggYSBuZXcgb25lLlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBmaWxlIHBhdGguIFNob3VsZCBiZSBvZiB0aGUgZm9ybWF0IGBmb2xkZXIvc3ViZm9sZGVyL2ZpbGVuYW1lLnBuZ2AuIFRoZSBidWNrZXQgbXVzdCBhbHJlYWR5IGV4aXN0IGJlZm9yZSBhdHRlbXB0aW5nIHRvIHVwZGF0ZS5cblx0KiBAcGFyYW0gZmlsZUJvZHkgVGhlIGJvZHkgb2YgdGhlIGZpbGUgdG8gYmUgc3RvcmVkIGluIHRoZSBidWNrZXQuXG5cdCogQHBhcmFtIGZpbGVPcHRpb25zIE9wdGlvbmFsIGZpbGUgdXBsb2FkIG9wdGlvbnMgaW5jbHVkaW5nIGNhY2hlQ29udHJvbCwgY29udGVudFR5cGUsIHVwc2VydCwgYW5kIG1ldGFkYXRhLlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIGZpbGUgcGF0aCwgaWQsIGFuZCBmdWxsUGF0aCBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgVXBkYXRlIGZpbGVcblx0KiBgYGBqc1xuXHQqIGNvbnN0IGF2YXRhckZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF1cblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdhdmF0YXJzJylcblx0KiAgIC51cGRhdGUoJ3B1YmxpYy9hdmF0YXIxLnBuZycsIGF2YXRhckZpbGUsIHtcblx0KiAgICAgY2FjaGVDb250cm9sOiAnMzYwMCcsXG5cdCogICAgIHVwc2VydDogdHJ1ZVxuXHQqICAgfSlcblx0KiBgYGBcblx0KlxuXHQqIFJlc3BvbnNlOlxuXHQqIGBgYGpzb25cblx0KiB7XG5cdCogICBcImRhdGFcIjoge1xuXHQqICAgICBcInBhdGhcIjogXCJwdWJsaWMvYXZhdGFyMS5wbmdcIixcblx0KiAgICAgXCJmdWxsUGF0aFwiOiBcImF2YXRhcnMvcHVibGljL2F2YXRhcjEucG5nXCJcblx0KiAgIH0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCpcblx0KiBAZXhhbXBsZSBVcGRhdGUgZmlsZSB1c2luZyBgQXJyYXlCdWZmZXJgIGZyb20gYmFzZTY0IGZpbGUgZGF0YVxuXHQqIGBgYGpzXG5cdCogaW1wb3J0IHtkZWNvZGV9IGZyb20gJ2Jhc2U2NC1hcnJheWJ1ZmZlcidcblx0KlxuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLnVwZGF0ZSgncHVibGljL2F2YXRhcjEucG5nJywgZGVjb2RlKCdiYXNlNjRGaWxlRGF0YScpLCB7XG5cdCogICAgIGNvbnRlbnRUeXBlOiAnaW1hZ2UvcG5nJ1xuXHQqICAgfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgdXBkYXRlKHBhdGgsIGZpbGVCb2R5LCBmaWxlT3B0aW9ucykge1xuXHRcdHJldHVybiB0aGlzLnVwbG9hZE9yVXBkYXRlKFwiUFVUXCIsIHBhdGgsIGZpbGVCb2R5LCBmaWxlT3B0aW9ucyk7XG5cdH1cblx0LyoqXG5cdCogTW92ZXMgYW4gZXhpc3RpbmcgZmlsZSB0byBhIG5ldyBwYXRoIGluIHRoZSBzYW1lIGJ1Y2tldC5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gZnJvbVBhdGggVGhlIG9yaWdpbmFsIGZpbGUgcGF0aCwgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGZpbGUgbmFtZS4gRm9yIGV4YW1wbGUgYGZvbGRlci9pbWFnZS5wbmdgLlxuXHQqIEBwYXJhbSB0b1BhdGggVGhlIG5ldyBmaWxlIHBhdGgsIGluY2x1ZGluZyB0aGUgbmV3IGZpbGUgbmFtZS4gRm9yIGV4YW1wbGUgYGZvbGRlci9pbWFnZS1uZXcucG5nYC5cblx0KiBAcGFyYW0gb3B0aW9ucyBUaGUgZGVzdGluYXRpb24gb3B0aW9ucy5cblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBzdWNjZXNzIG1lc3NhZ2Ugb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIE1vdmUgZmlsZVxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAubW92ZSgncHVibGljL2F2YXRhcjEucG5nJywgJ3ByaXZhdGUvYXZhdGFyMi5wbmcnKVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiB7XG5cdCogICAgIFwibWVzc2FnZVwiOiBcIlN1Y2Nlc3NmdWxseSBtb3ZlZFwiXG5cdCogICB9LFxuXHQqICAgXCJlcnJvclwiOiBudWxsXG5cdCogfVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBtb3ZlKGZyb21QYXRoLCB0b1BhdGgsIG9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXM2ID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdCQxKF90aGlzNi5mZXRjaCwgYCR7X3RoaXM2LnVybH0vb2JqZWN0L21vdmVgLCB7XG5cdFx0XHRcdFx0YnVja2V0SWQ6IF90aGlzNi5idWNrZXRJZCxcblx0XHRcdFx0XHRzb3VyY2VLZXk6IGZyb21QYXRoLFxuXHRcdFx0XHRcdGRlc3RpbmF0aW9uS2V5OiB0b1BhdGgsXG5cdFx0XHRcdFx0ZGVzdGluYXRpb25CdWNrZXQ6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZXN0aW5hdGlvbkJ1Y2tldFxuXHRcdFx0XHR9LCB7IGhlYWRlcnM6IF90aGlzNi5oZWFkZXJzIH0pLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzNi5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogQ29waWVzIGFuIGV4aXN0aW5nIGZpbGUgdG8gYSBuZXcgcGF0aCBpbiB0aGUgc2FtZSBidWNrZXQuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIGZyb21QYXRoIFRoZSBvcmlnaW5hbCBmaWxlIHBhdGgsIGluY2x1ZGluZyB0aGUgY3VycmVudCBmaWxlIG5hbWUuIEZvciBleGFtcGxlIGBmb2xkZXIvaW1hZ2UucG5nYC5cblx0KiBAcGFyYW0gdG9QYXRoIFRoZSBuZXcgZmlsZSBwYXRoLCBpbmNsdWRpbmcgdGhlIG5ldyBmaWxlIG5hbWUuIEZvciBleGFtcGxlIGBmb2xkZXIvaW1hZ2UtY29weS5wbmdgLlxuXHQqIEBwYXJhbSBvcHRpb25zIFRoZSBkZXN0aW5hdGlvbiBvcHRpb25zLlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIGNvcGllZCBmaWxlIHBhdGggb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIENvcHkgZmlsZVxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAuY29weSgncHVibGljL2F2YXRhcjEucG5nJywgJ3ByaXZhdGUvYXZhdGFyMi5wbmcnKVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiB7XG5cdCogICAgIFwicGF0aFwiOiBcImF2YXRhcnMvcHJpdmF0ZS9hdmF0YXIyLnBuZ1wiXG5cdCogICB9LFxuXHQqICAgXCJlcnJvclwiOiBudWxsXG5cdCogfVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBjb3B5KGZyb21QYXRoLCB0b1BhdGgsIG9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXM3ID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogeyBwYXRoOiAoYXdhaXQgcG9zdCQxKF90aGlzNy5mZXRjaCwgYCR7X3RoaXM3LnVybH0vb2JqZWN0L2NvcHlgLCB7XG5cdFx0XHRcdFx0YnVja2V0SWQ6IF90aGlzNy5idWNrZXRJZCxcblx0XHRcdFx0XHRzb3VyY2VLZXk6IGZyb21QYXRoLFxuXHRcdFx0XHRcdGRlc3RpbmF0aW9uS2V5OiB0b1BhdGgsXG5cdFx0XHRcdFx0ZGVzdGluYXRpb25CdWNrZXQ6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZXN0aW5hdGlvbkJ1Y2tldFxuXHRcdFx0XHR9LCB7IGhlYWRlcnM6IF90aGlzNy5oZWFkZXJzIH0pKS5LZXkgfSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczcuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIENyZWF0ZXMgYSBzaWduZWQgVVJMLiBVc2UgYSBzaWduZWQgVVJMIHRvIHNoYXJlIGEgZmlsZSBmb3IgYSBmaXhlZCBhbW91bnQgb2YgdGltZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gcGF0aCBUaGUgZmlsZSBwYXRoLCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgZmlsZSBuYW1lLiBGb3IgZXhhbXBsZSBgZm9sZGVyL2ltYWdlLnBuZ2AuXG5cdCogQHBhcmFtIGV4cGlyZXNJbiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgdW50aWwgdGhlIHNpZ25lZCBVUkwgZXhwaXJlcy4gRm9yIGV4YW1wbGUsIGA2MGAgZm9yIGEgVVJMIHdoaWNoIGlzIHZhbGlkIGZvciBvbmUgbWludXRlLlxuXHQqIEBwYXJhbSBvcHRpb25zLmRvd25sb2FkIHRyaWdnZXJzIHRoZSBmaWxlIGFzIGEgZG93bmxvYWQgaWYgc2V0IHRvIHRydWUuIFNldCB0aGlzIHBhcmFtZXRlciBhcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpZiB5b3Ugd2FudCB0byB0cmlnZ2VyIHRoZSBkb3dubG9hZCB3aXRoIGEgZGlmZmVyZW50IGZpbGVuYW1lLlxuXHQqIEBwYXJhbSBvcHRpb25zLnRyYW5zZm9ybSBUcmFuc2Zvcm0gdGhlIGFzc2V0IGJlZm9yZSBzZXJ2aW5nIGl0IHRvIHRoZSBjbGllbnQuXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgc2lnbmVkIFVSTCBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgQ3JlYXRlIFNpZ25lZCBVUkxcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLmNyZWF0ZVNpZ25lZFVybCgnZm9sZGVyL2F2YXRhcjEucG5nJywgNjApXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IHtcblx0KiAgICAgXCJzaWduZWRVcmxcIjogXCJodHRwczovL2V4YW1wbGUuc3VwYWJhc2UuY28vc3RvcmFnZS92MS9vYmplY3Qvc2lnbi9hdmF0YXJzL2ZvbGRlci9hdmF0YXIxLnBuZz90b2tlbj08VE9LRU4+XCJcblx0KiAgIH0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCpcblx0KiBAZXhhbXBsZSBDcmVhdGUgYSBzaWduZWQgVVJMIGZvciBhbiBhc3NldCB3aXRoIHRyYW5zZm9ybWF0aW9uc1xuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdhdmF0YXJzJylcblx0KiAgIC5jcmVhdGVTaWduZWRVcmwoJ2ZvbGRlci9hdmF0YXIxLnBuZycsIDYwLCB7XG5cdCogICAgIHRyYW5zZm9ybToge1xuXHQqICAgICAgIHdpZHRoOiAxMDAsXG5cdCogICAgICAgaGVpZ2h0OiAxMDAsXG5cdCogICAgIH1cblx0KiAgIH0pXG5cdCogYGBgXG5cdCpcblx0KiBAZXhhbXBsZSBDcmVhdGUgYSBzaWduZWQgVVJMIHdoaWNoIHRyaWdnZXJzIHRoZSBkb3dubG9hZCBvZiB0aGUgYXNzZXRcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAuY3JlYXRlU2lnbmVkVXJsKCdmb2xkZXIvYXZhdGFyMS5wbmcnLCA2MCwge1xuXHQqICAgICBkb3dubG9hZDogdHJ1ZSxcblx0KiAgIH0pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGNyZWF0ZVNpZ25lZFVybChwYXRoLCBleHBpcmVzSW4sIG9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXM4ID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0bGV0IF9wYXRoID0gX3RoaXM4Ll9nZXRGaW5hbFBhdGgocGF0aCk7XG5cdFx0XHRsZXQgZGF0YSA9IGF3YWl0IHBvc3QkMShfdGhpczguZmV0Y2gsIGAke190aGlzOC51cmx9L29iamVjdC9zaWduLyR7X3BhdGh9YCwgX29iamVjdFNwcmVhZDIoeyBleHBpcmVzSW4gfSwgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50cmFuc2Zvcm0pID8geyB0cmFuc2Zvcm06IG9wdGlvbnMudHJhbnNmb3JtIH0gOiB7fSksIHsgaGVhZGVyczogX3RoaXM4LmhlYWRlcnMgfSk7XG5cdFx0XHRjb25zdCBkb3dubG9hZFF1ZXJ5UGFyYW0gPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRvd25sb2FkKSA/IGAmZG93bmxvYWQ9JHtvcHRpb25zLmRvd25sb2FkID09PSB0cnVlID8gXCJcIiA6IG9wdGlvbnMuZG93bmxvYWR9YCA6IFwiXCI7XG5cdFx0XHRkYXRhID0geyBzaWduZWRVcmw6IGVuY29kZVVSSShgJHtfdGhpczgudXJsfSR7ZGF0YS5zaWduZWRVUkx9JHtkb3dubG9hZFF1ZXJ5UGFyYW19YCkgfTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGEsXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXM4LnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBDcmVhdGVzIG11bHRpcGxlIHNpZ25lZCBVUkxzLiBVc2UgYSBzaWduZWQgVVJMIHRvIHNoYXJlIGEgZmlsZSBmb3IgYSBmaXhlZCBhbW91bnQgb2YgdGltZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gcGF0aHMgVGhlIGZpbGUgcGF0aHMgdG8gYmUgZG93bmxvYWRlZCwgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGZpbGUgbmFtZXMuIEZvciBleGFtcGxlIGBbJ2ZvbGRlci9pbWFnZS5wbmcnLCAnZm9sZGVyMi9pbWFnZTIucG5nJ11gLlxuXHQqIEBwYXJhbSBleHBpcmVzSW4gVGhlIG51bWJlciBvZiBzZWNvbmRzIHVudGlsIHRoZSBzaWduZWQgVVJMcyBleHBpcmUuIEZvciBleGFtcGxlLCBgNjBgIGZvciBVUkxzIHdoaWNoIGFyZSB2YWxpZCBmb3Igb25lIG1pbnV0ZS5cblx0KiBAcGFyYW0gb3B0aW9ucy5kb3dubG9hZCB0cmlnZ2VycyB0aGUgZmlsZSBhcyBhIGRvd25sb2FkIGlmIHNldCB0byB0cnVlLiBTZXQgdGhpcyBwYXJhbWV0ZXIgYXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaWYgeW91IHdhbnQgdG8gdHJpZ2dlciB0aGUgZG93bmxvYWQgd2l0aCBhIGRpZmZlcmVudCBmaWxlbmFtZS5cblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBhcnJheSBvZiBvYmplY3RzIHdpdGggc2lnbmVkVXJsLCBwYXRoLCBhbmQgZXJyb3Igb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIENyZWF0ZSBTaWduZWQgVVJMc1xuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAuY3JlYXRlU2lnbmVkVXJscyhbJ2ZvbGRlci9hdmF0YXIxLnBuZycsICdmb2xkZXIvYXZhdGFyMi5wbmcnXSwgNjApXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IFtcblx0KiAgICAge1xuXHQqICAgICAgIFwiZXJyb3JcIjogbnVsbCxcblx0KiAgICAgICBcInBhdGhcIjogXCJmb2xkZXIvYXZhdGFyMS5wbmdcIixcblx0KiAgICAgICBcInNpZ25lZFVSTFwiOiBcIi9vYmplY3Qvc2lnbi9hdmF0YXJzL2ZvbGRlci9hdmF0YXIxLnBuZz90b2tlbj08VE9LRU4+XCIsXG5cdCogICAgICAgXCJzaWduZWRVcmxcIjogXCJodHRwczovL2V4YW1wbGUuc3VwYWJhc2UuY28vc3RvcmFnZS92MS9vYmplY3Qvc2lnbi9hdmF0YXJzL2ZvbGRlci9hdmF0YXIxLnBuZz90b2tlbj08VE9LRU4+XCJcblx0KiAgICAgfSxcblx0KiAgICAge1xuXHQqICAgICAgIFwiZXJyb3JcIjogbnVsbCxcblx0KiAgICAgICBcInBhdGhcIjogXCJmb2xkZXIvYXZhdGFyMi5wbmdcIixcblx0KiAgICAgICBcInNpZ25lZFVSTFwiOiBcIi9vYmplY3Qvc2lnbi9hdmF0YXJzL2ZvbGRlci9hdmF0YXIyLnBuZz90b2tlbj08VE9LRU4+XCIsXG5cdCogICAgICAgXCJzaWduZWRVcmxcIjogXCJodHRwczovL2V4YW1wbGUuc3VwYWJhc2UuY28vc3RvcmFnZS92MS9vYmplY3Qvc2lnbi9hdmF0YXJzL2ZvbGRlci9hdmF0YXIyLnBuZz90b2tlbj08VE9LRU4+XCJcblx0KiAgICAgfVxuXHQqICAgXSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgY3JlYXRlU2lnbmVkVXJscyhwYXRocywgZXhwaXJlc0luLCBvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzOSA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGRhdGEgPSBhd2FpdCBwb3N0JDEoX3RoaXM5LmZldGNoLCBgJHtfdGhpczkudXJsfS9vYmplY3Qvc2lnbi8ke190aGlzOS5idWNrZXRJZH1gLCB7XG5cdFx0XHRcdGV4cGlyZXNJbixcblx0XHRcdFx0cGF0aHNcblx0XHRcdH0sIHsgaGVhZGVyczogX3RoaXM5LmhlYWRlcnMgfSk7XG5cdFx0XHRjb25zdCBkb3dubG9hZFF1ZXJ5UGFyYW0gPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRvd25sb2FkKSA/IGAmZG93bmxvYWQ9JHtvcHRpb25zLmRvd25sb2FkID09PSB0cnVlID8gXCJcIiA6IG9wdGlvbnMuZG93bmxvYWR9YCA6IFwiXCI7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBkYXRhLm1hcCgoZGF0dW0pID0+IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBkYXR1bSksIHt9LCB7IHNpZ25lZFVybDogZGF0dW0uc2lnbmVkVVJMID8gZW5jb2RlVVJJKGAke190aGlzOS51cmx9JHtkYXR1bS5zaWduZWRVUkx9JHtkb3dubG9hZFF1ZXJ5UGFyYW19YCkgOiBudWxsIH0pKSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczkuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIERvd25sb2FkcyBhIGZpbGUgZnJvbSBhIHByaXZhdGUgYnVja2V0LiBGb3IgcHVibGljIGJ1Y2tldHMsIG1ha2UgYSByZXF1ZXN0IHRvIHRoZSBVUkwgcmV0dXJuZWQgZnJvbSBgZ2V0UHVibGljVXJsYCBpbnN0ZWFkLlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBwYXRoIFRoZSBmdWxsIHBhdGggYW5kIGZpbGUgbmFtZSBvZiB0aGUgZmlsZSB0byBiZSBkb3dubG9hZGVkLiBGb3IgZXhhbXBsZSBgZm9sZGVyL2ltYWdlLnBuZ2AuXG5cdCogQHBhcmFtIG9wdGlvbnMudHJhbnNmb3JtIFRyYW5zZm9ybSB0aGUgYXNzZXQgYmVmb3JlIHNlcnZpbmcgaXQgdG8gdGhlIGNsaWVudC5cblx0KiBAcmV0dXJucyBCbG9iRG93bmxvYWRCdWlsZGVyIGluc3RhbmNlIGZvciBkb3dubG9hZGluZyB0aGUgZmlsZVxuXHQqXG5cdCogQGV4YW1wbGUgRG93bmxvYWQgZmlsZVxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAuZG93bmxvYWQoJ2ZvbGRlci9hdmF0YXIxLnBuZycpXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IDxCTE9CPixcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0KlxuXHQqIEBleGFtcGxlIERvd25sb2FkIGZpbGUgd2l0aCB0cmFuc2Zvcm1hdGlvbnNcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ2F2YXRhcnMnKVxuXHQqICAgLmRvd25sb2FkKCdmb2xkZXIvYXZhdGFyMS5wbmcnLCB7XG5cdCogICAgIHRyYW5zZm9ybToge1xuXHQqICAgICAgIHdpZHRoOiAxMDAsXG5cdCogICAgICAgaGVpZ2h0OiAxMDAsXG5cdCogICAgICAgcXVhbGl0eTogODBcblx0KiAgICAgfVxuXHQqICAgfSlcblx0KiBgYGBcblx0Ki9cblx0ZG93bmxvYWQocGF0aCwgb3B0aW9ucykge1xuXHRcdGNvbnN0IHJlbmRlclBhdGggPSB0eXBlb2YgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50cmFuc2Zvcm0pICE9PSBcInVuZGVmaW5lZFwiID8gXCJyZW5kZXIvaW1hZ2UvYXV0aGVudGljYXRlZFwiIDogXCJvYmplY3RcIjtcblx0XHRjb25zdCB0cmFuc2Zvcm1hdGlvblF1ZXJ5ID0gdGhpcy50cmFuc2Zvcm1PcHRzVG9RdWVyeVN0cmluZygob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnRyYW5zZm9ybSkgfHwge30pO1xuXHRcdGNvbnN0IHF1ZXJ5U3RyaW5nID0gdHJhbnNmb3JtYXRpb25RdWVyeSA/IGA/JHt0cmFuc2Zvcm1hdGlvblF1ZXJ5fWAgOiBcIlwiO1xuXHRcdGNvbnN0IF9wYXRoID0gdGhpcy5fZ2V0RmluYWxQYXRoKHBhdGgpO1xuXHRcdGNvbnN0IGRvd25sb2FkRm4gPSAoKSA9PiBnZXQodGhpcy5mZXRjaCwgYCR7dGhpcy51cmx9LyR7cmVuZGVyUGF0aH0vJHtfcGF0aH0ke3F1ZXJ5U3RyaW5nfWAsIHtcblx0XHRcdGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcblx0XHRcdG5vUmVzb2x2ZUpzb246IHRydWVcblx0XHR9KTtcblx0XHRyZXR1cm4gbmV3IEJsb2JEb3dubG9hZEJ1aWxkZXIoZG93bmxvYWRGbiwgdGhpcy5zaG91bGRUaHJvd09uRXJyb3IpO1xuXHR9XG5cdC8qKlxuXHQqIFJldHJpZXZlcyB0aGUgZGV0YWlscyBvZiBhbiBleGlzdGluZyBmaWxlLlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBwYXRoIFRoZSBmaWxlIHBhdGgsIGluY2x1ZGluZyB0aGUgZmlsZSBuYW1lLiBGb3IgZXhhbXBsZSBgZm9sZGVyL2ltYWdlLnBuZ2AuXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgZmlsZSBtZXRhZGF0YSBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgR2V0IGZpbGUgaW5mb1xuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAuaW5mbygnZm9sZGVyL2F2YXRhcjEucG5nJylcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgaW5mbyhwYXRoKSB7XG5cdFx0dmFyIF90aGlzMTAgPSB0aGlzO1xuXHRcdGNvbnN0IF9wYXRoID0gX3RoaXMxMC5fZ2V0RmluYWxQYXRoKHBhdGgpO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiByZWN1cnNpdmVUb0NhbWVsKGF3YWl0IGdldChfdGhpczEwLmZldGNoLCBgJHtfdGhpczEwLnVybH0vb2JqZWN0L2luZm8vJHtfcGF0aH1gLCB7IGhlYWRlcnM6IF90aGlzMTAuaGVhZGVycyB9KSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMxMC5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogQ2hlY2tzIHRoZSBleGlzdGVuY2Ugb2YgYSBmaWxlLlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBwYXRoIFRoZSBmaWxlIHBhdGgsIGluY2x1ZGluZyB0aGUgZmlsZSBuYW1lLiBGb3IgZXhhbXBsZSBgZm9sZGVyL2ltYWdlLnBuZ2AuXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgYm9vbGVhbiBpbmRpY2F0aW5nIGZpbGUgZXhpc3RlbmNlIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBDaGVjayBmaWxlIGV4aXN0ZW5jZVxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAuZXhpc3RzKCdmb2xkZXIvYXZhdGFyMS5wbmcnKVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBleGlzdHMocGF0aCkge1xuXHRcdHZhciBfdGhpczExID0gdGhpcztcblx0XHRjb25zdCBfcGF0aCA9IF90aGlzMTEuX2dldEZpbmFsUGF0aChwYXRoKTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgaGVhZChfdGhpczExLmZldGNoLCBgJHtfdGhpczExLnVybH0vb2JqZWN0LyR7X3BhdGh9YCwgeyBoZWFkZXJzOiBfdGhpczExLmhlYWRlcnMgfSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiB0cnVlLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzMTEuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikgJiYgZXJyb3IgaW5zdGFuY2VvZiBTdG9yYWdlVW5rbm93bkVycm9yKSB7XG5cdFx0XHRcdGNvbnN0IG9yaWdpbmFsRXJyb3IgPSBlcnJvci5vcmlnaW5hbEVycm9yO1xuXHRcdFx0XHRpZiAoWzQwMCwgNDA0XS5pbmNsdWRlcyhvcmlnaW5hbEVycm9yID09PSBudWxsIHx8IG9yaWdpbmFsRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsRXJyb3Iuc3RhdHVzKSkgcmV0dXJuIHtcblx0XHRcdFx0XHRkYXRhOiBmYWxzZSxcblx0XHRcdFx0XHRlcnJvclxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIEEgc2ltcGxlIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGdldCB0aGUgVVJMIGZvciBhbiBhc3NldCBpbiBhIHB1YmxpYyBidWNrZXQuIElmIHlvdSBkbyBub3Qgd2FudCB0byB1c2UgdGhpcyBmdW5jdGlvbiwgeW91IGNhbiBjb25zdHJ1Y3QgdGhlIHB1YmxpYyBVUkwgYnkgY29uY2F0ZW5hdGluZyB0aGUgYnVja2V0IFVSTCB3aXRoIHRoZSBwYXRoIHRvIHRoZSBhc3NldC5cblx0KiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHZlcmlmeSBpZiB0aGUgYnVja2V0IGlzIHB1YmxpYy4gSWYgYSBwdWJsaWMgVVJMIGlzIGNyZWF0ZWQgZm9yIGEgYnVja2V0IHdoaWNoIGlzIG5vdCBwdWJsaWMsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGRvd25sb2FkIHRoZSBhc3NldC5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgZmlsZSB0byBnZW5lcmF0ZSB0aGUgcHVibGljIFVSTCBmb3IuIEZvciBleGFtcGxlIGBmb2xkZXIvaW1hZ2UucG5nYC5cblx0KiBAcGFyYW0gb3B0aW9ucy5kb3dubG9hZCBUcmlnZ2VycyB0aGUgZmlsZSBhcyBhIGRvd25sb2FkIGlmIHNldCB0byB0cnVlLiBTZXQgdGhpcyBwYXJhbWV0ZXIgYXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaWYgeW91IHdhbnQgdG8gdHJpZ2dlciB0aGUgZG93bmxvYWQgd2l0aCBhIGRpZmZlcmVudCBmaWxlbmFtZS5cblx0KiBAcGFyYW0gb3B0aW9ucy50cmFuc2Zvcm0gVHJhbnNmb3JtIHRoZSBhc3NldCBiZWZvcmUgc2VydmluZyBpdCB0byB0aGUgY2xpZW50LlxuXHQqIEByZXR1cm5zIE9iamVjdCB3aXRoIHB1YmxpYyBVUkxcblx0KlxuXHQqIEBleGFtcGxlIFJldHVybnMgdGhlIFVSTCBmb3IgYW4gYXNzZXQgaW4gYSBwdWJsaWMgYnVja2V0XG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEgfSA9IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ3B1YmxpYy1idWNrZXQnKVxuXHQqICAgLmdldFB1YmxpY1VybCgnZm9sZGVyL2F2YXRhcjEucG5nJylcblx0KiBgYGBcblx0KlxuXHQqIFJlc3BvbnNlOlxuXHQqIGBgYGpzb25cblx0KiB7XG5cdCogICBcImRhdGFcIjoge1xuXHQqICAgICBcInB1YmxpY1VybFwiOiBcImh0dHBzOi8vZXhhbXBsZS5zdXBhYmFzZS5jby9zdG9yYWdlL3YxL29iamVjdC9wdWJsaWMvcHVibGljLWJ1Y2tldC9mb2xkZXIvYXZhdGFyMS5wbmdcIlxuXHQqICAgfVxuXHQqIH1cblx0KiBgYGBcblx0KlxuXHQqIEBleGFtcGxlIFJldHVybnMgdGhlIFVSTCBmb3IgYW4gYXNzZXQgaW4gYSBwdWJsaWMgYnVja2V0IHdpdGggdHJhbnNmb3JtYXRpb25zXG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEgfSA9IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmZyb20oJ3B1YmxpYy1idWNrZXQnKVxuXHQqICAgLmdldFB1YmxpY1VybCgnZm9sZGVyL2F2YXRhcjEucG5nJywge1xuXHQqICAgICB0cmFuc2Zvcm06IHtcblx0KiAgICAgICB3aWR0aDogMTAwLFxuXHQqICAgICAgIGhlaWdodDogMTAwLFxuXHQqICAgICB9XG5cdCogICB9KVxuXHQqIGBgYFxuXHQqXG5cdCogQGV4YW1wbGUgUmV0dXJucyB0aGUgVVJMIHdoaWNoIHRyaWdnZXJzIHRoZSBkb3dubG9hZCBvZiBhbiBhc3NldCBpbiBhIHB1YmxpYyBidWNrZXRcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSB9ID0gc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgncHVibGljLWJ1Y2tldCcpXG5cdCogICAuZ2V0UHVibGljVXJsKCdmb2xkZXIvYXZhdGFyMS5wbmcnLCB7XG5cdCogICAgIGRvd25sb2FkOiB0cnVlLFxuXHQqICAgfSlcblx0KiBgYGBcblx0Ki9cblx0Z2V0UHVibGljVXJsKHBhdGgsIG9wdGlvbnMpIHtcblx0XHRjb25zdCBfcGF0aCA9IHRoaXMuX2dldEZpbmFsUGF0aChwYXRoKTtcblx0XHRjb25zdCBfcXVlcnlTdHJpbmcgPSBbXTtcblx0XHRjb25zdCBkb3dubG9hZFF1ZXJ5UGFyYW0gPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRvd25sb2FkKSA/IGBkb3dubG9hZD0ke29wdGlvbnMuZG93bmxvYWQgPT09IHRydWUgPyBcIlwiIDogb3B0aW9ucy5kb3dubG9hZH1gIDogXCJcIjtcblx0XHRpZiAoZG93bmxvYWRRdWVyeVBhcmFtICE9PSBcIlwiKSBfcXVlcnlTdHJpbmcucHVzaChkb3dubG9hZFF1ZXJ5UGFyYW0pO1xuXHRcdGNvbnN0IHJlbmRlclBhdGggPSB0eXBlb2YgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50cmFuc2Zvcm0pICE9PSBcInVuZGVmaW5lZFwiID8gXCJyZW5kZXIvaW1hZ2VcIiA6IFwib2JqZWN0XCI7XG5cdFx0Y29uc3QgdHJhbnNmb3JtYXRpb25RdWVyeSA9IHRoaXMudHJhbnNmb3JtT3B0c1RvUXVlcnlTdHJpbmcoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50cmFuc2Zvcm0pIHx8IHt9KTtcblx0XHRpZiAodHJhbnNmb3JtYXRpb25RdWVyeSAhPT0gXCJcIikgX3F1ZXJ5U3RyaW5nLnB1c2godHJhbnNmb3JtYXRpb25RdWVyeSk7XG5cdFx0bGV0IHF1ZXJ5U3RyaW5nID0gX3F1ZXJ5U3RyaW5nLmpvaW4oXCImXCIpO1xuXHRcdGlmIChxdWVyeVN0cmluZyAhPT0gXCJcIikgcXVlcnlTdHJpbmcgPSBgPyR7cXVlcnlTdHJpbmd9YDtcblx0XHRyZXR1cm4geyBkYXRhOiB7IHB1YmxpY1VybDogZW5jb2RlVVJJKGAke3RoaXMudXJsfS8ke3JlbmRlclBhdGh9L3B1YmxpYy8ke19wYXRofSR7cXVlcnlTdHJpbmd9YCkgfSB9O1xuXHR9XG5cdC8qKlxuXHQqIERlbGV0ZXMgZmlsZXMgd2l0aGluIHRoZSBzYW1lIGJ1Y2tldFxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBwYXRocyBBbiBhcnJheSBvZiBmaWxlcyB0byBkZWxldGUsIGluY2x1ZGluZyB0aGUgcGF0aCBhbmQgZmlsZSBuYW1lLiBGb3IgZXhhbXBsZSBbYCdmb2xkZXIvaW1hZ2UucG5nJ2BdLlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIGFycmF5IG9mIGRlbGV0ZWQgZmlsZSBvYmplY3RzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBEZWxldGUgZmlsZVxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAucmVtb3ZlKFsnZm9sZGVyL2F2YXRhcjEucG5nJ10pXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IFtdLFxuXHQqICAgXCJlcnJvclwiOiBudWxsXG5cdCogfVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyByZW1vdmUocGF0aHMpIHtcblx0XHR2YXIgX3RoaXMxMiA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHJlbW92ZShfdGhpczEyLmZldGNoLCBgJHtfdGhpczEyLnVybH0vb2JqZWN0LyR7X3RoaXMxMi5idWNrZXRJZH1gLCB7IHByZWZpeGVzOiBwYXRocyB9LCB7IGhlYWRlcnM6IF90aGlzMTIuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczEyLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBHZXQgZmlsZSBtZXRhZGF0YVxuXHQqIEBwYXJhbSBpZCB0aGUgZmlsZSBpZCB0byByZXRyaWV2ZSBtZXRhZGF0YVxuXHQqL1xuXHQvKipcblx0KiBVcGRhdGUgZmlsZSBtZXRhZGF0YVxuXHQqIEBwYXJhbSBpZCB0aGUgZmlsZSBpZCB0byB1cGRhdGUgbWV0YWRhdGFcblx0KiBAcGFyYW0gbWV0YSB0aGUgbmV3IGZpbGUgbWV0YWRhdGFcblx0Ki9cblx0LyoqXG5cdCogTGlzdHMgYWxsIHRoZSBmaWxlcyBhbmQgZm9sZGVycyB3aXRoaW4gYSBwYXRoIG9mIHRoZSBidWNrZXQuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIHBhdGggVGhlIGZvbGRlciBwYXRoLlxuXHQqIEBwYXJhbSBvcHRpb25zIFNlYXJjaCBvcHRpb25zIGluY2x1ZGluZyBsaW1pdCAoZGVmYXVsdHMgdG8gMTAwKSwgb2Zmc2V0LCBzb3J0QnksIGFuZCBzZWFyY2hcblx0KiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBmZXRjaCBwYXJhbWV0ZXJzIGluY2x1ZGluZyBzaWduYWwgZm9yIGNhbmNlbGxhdGlvblxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIGFycmF5IG9mIGZpbGVzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBMaXN0IGZpbGVzIGluIGEgYnVja2V0XG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5mcm9tKCdhdmF0YXJzJylcblx0KiAgIC5saXN0KCdmb2xkZXInLCB7XG5cdCogICAgIGxpbWl0OiAxMDAsXG5cdCogICAgIG9mZnNldDogMCxcblx0KiAgICAgc29ydEJ5OiB7IGNvbHVtbjogJ25hbWUnLCBvcmRlcjogJ2FzYycgfSxcblx0KiAgIH0pXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IFtcblx0KiAgICAge1xuXHQqICAgICAgIFwibmFtZVwiOiBcImF2YXRhcjEucG5nXCIsXG5cdCogICAgICAgXCJpZFwiOiBcImU2NjhjZjdmLTgyMWItNGEyZi05ZGNlLTdkZmE1ZGQxY2ZkMlwiLFxuXHQqICAgICAgIFwidXBkYXRlZF9hdFwiOiBcIjIwMjQtMDUtMjJUMjM6MDY6MDUuNTgwWlwiLFxuXHQqICAgICAgIFwiY3JlYXRlZF9hdFwiOiBcIjIwMjQtMDUtMjJUMjM6MDQ6MzQuNDQzWlwiLFxuXHQqICAgICAgIFwibGFzdF9hY2Nlc3NlZF9hdFwiOiBcIjIwMjQtMDUtMjJUMjM6MDQ6MzQuNDQzWlwiLFxuXHQqICAgICAgIFwibWV0YWRhdGFcIjoge1xuXHQqICAgICAgICAgXCJlVGFnXCI6IFwiXFxcImM1ZThjNTUzMjM1ZDlhZjMwZWY0ZjZlMjgwNzkwYjkyXFxcIlwiLFxuXHQqICAgICAgICAgXCJzaXplXCI6IDMyMTc1LFxuXHQqICAgICAgICAgXCJtaW1ldHlwZVwiOiBcImltYWdlL3BuZ1wiLFxuXHQqICAgICAgICAgXCJjYWNoZUNvbnRyb2xcIjogXCJtYXgtYWdlPTM2MDBcIixcblx0KiAgICAgICAgIFwibGFzdE1vZGlmaWVkXCI6IFwiMjAyNC0wNS0yMlQyMzowNjowNS41NzRaXCIsXG5cdCogICAgICAgICBcImNvbnRlbnRMZW5ndGhcIjogMzIxNzUsXG5cdCogICAgICAgICBcImh0dHBTdGF0dXNDb2RlXCI6IDIwMFxuXHQqICAgICAgIH1cblx0KiAgICAgfVxuXHQqICAgXSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0KlxuXHQqIEBleGFtcGxlIFNlYXJjaCBmaWxlcyBpbiBhIGJ1Y2tldFxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZnJvbSgnYXZhdGFycycpXG5cdCogICAubGlzdCgnZm9sZGVyJywge1xuXHQqICAgICBsaW1pdDogMTAwLFxuXHQqICAgICBvZmZzZXQ6IDAsXG5cdCogICAgIHNvcnRCeTogeyBjb2x1bW46ICduYW1lJywgb3JkZXI6ICdhc2MnIH0sXG5cdCogICAgIHNlYXJjaDogJ2pvbidcblx0KiAgIH0pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGxpc3QocGF0aCwgb3B0aW9ucywgcGFyYW1ldGVycykge1xuXHRcdHZhciBfdGhpczEzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgYm9keSA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX1NFQVJDSF9PUFRJT05TKSwgb3B0aW9ucyksIHt9LCB7IHByZWZpeDogcGF0aCB8fCBcIlwiIH0pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdCQxKF90aGlzMTMuZmV0Y2gsIGAke190aGlzMTMudXJsfS9vYmplY3QvbGlzdC8ke190aGlzMTMuYnVja2V0SWR9YCwgYm9keSwgeyBoZWFkZXJzOiBfdGhpczEzLmhlYWRlcnMgfSwgcGFyYW1ldGVycyksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMxMy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogQGV4cGVyaW1lbnRhbCB0aGlzIG1ldGhvZCBzaWduYXR1cmUgbWlnaHQgY2hhbmdlIGluIHRoZSBmdXR1cmVcblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gb3B0aW9ucyBzZWFyY2ggb3B0aW9uc1xuXHQqIEBwYXJhbSBwYXJhbWV0ZXJzXG5cdCovXG5cdGFzeW5jIGxpc3RWMihvcHRpb25zLCBwYXJhbWV0ZXJzKSB7XG5cdFx0dmFyIF90aGlzMTQgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBib2R5ID0gX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdCQxKF90aGlzMTQuZmV0Y2gsIGAke190aGlzMTQudXJsfS9vYmplY3QvbGlzdC12Mi8ke190aGlzMTQuYnVja2V0SWR9YCwgYm9keSwgeyBoZWFkZXJzOiBfdGhpczE0LmhlYWRlcnMgfSwgcGFyYW1ldGVycyksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMxNC5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0ZW5jb2RlTWV0YWRhdGEobWV0YWRhdGEpIHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpO1xuXHR9XG5cdHRvQmFzZTY0KGRhdGEpIHtcblx0XHRpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuXHRcdHJldHVybiBidG9hKGRhdGEpO1xuXHR9XG5cdF9nZXRGaW5hbFBhdGgocGF0aCkge1xuXHRcdHJldHVybiBgJHt0aGlzLmJ1Y2tldElkfS8ke3BhdGgucmVwbGFjZSgvXlxcLysvLCBcIlwiKX1gO1xuXHR9XG5cdF9yZW1vdmVFbXB0eUZvbGRlcnMocGF0aCkge1xuXHRcdHJldHVybiBwYXRoLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKS5yZXBsYWNlKC9cXC8rL2csIFwiL1wiKTtcblx0fVxuXHR0cmFuc2Zvcm1PcHRzVG9RdWVyeVN0cmluZyh0cmFuc2Zvcm0pIHtcblx0XHRjb25zdCBwYXJhbXMgPSBbXTtcblx0XHRpZiAodHJhbnNmb3JtLndpZHRoKSBwYXJhbXMucHVzaChgd2lkdGg9JHt0cmFuc2Zvcm0ud2lkdGh9YCk7XG5cdFx0aWYgKHRyYW5zZm9ybS5oZWlnaHQpIHBhcmFtcy5wdXNoKGBoZWlnaHQ9JHt0cmFuc2Zvcm0uaGVpZ2h0fWApO1xuXHRcdGlmICh0cmFuc2Zvcm0ucmVzaXplKSBwYXJhbXMucHVzaChgcmVzaXplPSR7dHJhbnNmb3JtLnJlc2l6ZX1gKTtcblx0XHRpZiAodHJhbnNmb3JtLmZvcm1hdCkgcGFyYW1zLnB1c2goYGZvcm1hdD0ke3RyYW5zZm9ybS5mb3JtYXR9YCk7XG5cdFx0aWYgKHRyYW5zZm9ybS5xdWFsaXR5KSBwYXJhbXMucHVzaChgcXVhbGl0eT0ke3RyYW5zZm9ybS5xdWFsaXR5fWApO1xuXHRcdHJldHVybiBwYXJhbXMuam9pbihcIiZcIik7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvdmVyc2lvbi50c1xuY29uc3QgdmVyc2lvbiA9IFwiMi44OC4wXCI7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvY29uc3RhbnRzLnRzXG5jb25zdCBERUZBVUxUX0hFQURFUlMkMSA9IHsgXCJYLUNsaWVudC1JbmZvXCI6IGBzdG9yYWdlLWpzLyR7dmVyc2lvbn1gIH07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9wYWNrYWdlcy9TdG9yYWdlQnVja2V0QXBpLnRzXG52YXIgU3RvcmFnZUJ1Y2tldEFwaSA9IGNsYXNzIHtcblx0Y29uc3RydWN0b3IodXJsLCBoZWFkZXJzID0ge30sIGZldGNoJDEsIG9wdHMpIHtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IGZhbHNlO1xuXHRcdGNvbnN0IGJhc2VVcmwgPSBuZXcgVVJMKHVybCk7XG5cdFx0aWYgKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy51c2VOZXdIb3N0bmFtZSkge1xuXHRcdFx0aWYgKC9zdXBhYmFzZVxcLihjb3xpbnxyZWQpJC8udGVzdChiYXNlVXJsLmhvc3RuYW1lKSAmJiAhYmFzZVVybC5ob3N0bmFtZS5pbmNsdWRlcyhcInN0b3JhZ2Uuc3VwYWJhc2UuXCIpKSBiYXNlVXJsLmhvc3RuYW1lID0gYmFzZVVybC5ob3N0bmFtZS5yZXBsYWNlKFwic3VwYWJhc2UuXCIsIFwic3RvcmFnZS5zdXBhYmFzZS5cIik7XG5cdFx0fVxuXHRcdHRoaXMudXJsID0gYmFzZVVybC5ocmVmLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcblx0XHR0aGlzLmhlYWRlcnMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9IRUFERVJTJDEpLCBoZWFkZXJzKTtcblx0XHR0aGlzLmZldGNoID0gcmVzb2x2ZUZldGNoJDEoZmV0Y2gkMSk7XG5cdH1cblx0LyoqXG5cdCogRW5hYmxlIHRocm93aW5nIGVycm9ycyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGVtLlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqL1xuXHR0aHJvd09uRXJyb3IoKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSB0cnVlO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIFJldHJpZXZlcyB0aGUgZGV0YWlscyBvZiBhbGwgU3RvcmFnZSBidWNrZXRzIHdpdGhpbiBhbiBleGlzdGluZyBwcm9qZWN0LlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBvcHRpb25zIFF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGxpc3RpbmcgYnVja2V0c1xuXHQqIEBwYXJhbSBvcHRpb25zLmxpbWl0IE1heGltdW0gbnVtYmVyIG9mIGJ1Y2tldHMgdG8gcmV0dXJuXG5cdCogQHBhcmFtIG9wdGlvbnMub2Zmc2V0IE51bWJlciBvZiBidWNrZXRzIHRvIHNraXBcblx0KiBAcGFyYW0gb3B0aW9ucy5zb3J0Q29sdW1uIENvbHVtbiB0byBzb3J0IGJ5ICgnaWQnLCAnbmFtZScsICdjcmVhdGVkX2F0JywgJ3VwZGF0ZWRfYXQnKVxuXHQqIEBwYXJhbSBvcHRpb25zLnNvcnRPcmRlciBTb3J0IG9yZGVyICgnYXNjJyBvciAnZGVzYycpXG5cdCogQHBhcmFtIG9wdGlvbnMuc2VhcmNoIFNlYXJjaCB0ZXJtIHRvIGZpbHRlciBidWNrZXQgbmFtZXNcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBhcnJheSBvZiBidWNrZXRzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBMaXN0IGJ1Y2tldHNcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmxpc3RCdWNrZXRzKClcblx0KiBgYGBcblx0KlxuXHQqIEBleGFtcGxlIExpc3QgYnVja2V0cyB3aXRoIG9wdGlvbnNcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmxpc3RCdWNrZXRzKHtcblx0KiAgICAgbGltaXQ6IDEwLFxuXHQqICAgICBvZmZzZXQ6IDAsXG5cdCogICAgIHNvcnRDb2x1bW46ICdjcmVhdGVkX2F0Jyxcblx0KiAgICAgc29ydE9yZGVyOiAnZGVzYycsXG5cdCogICAgIHNlYXJjaDogJ3Byb2QnXG5cdCogICB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBsaXN0QnVja2V0cyhvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcXVlcnlTdHJpbmcgPSBfdGhpcy5saXN0QnVja2V0T3B0aW9uc1RvUXVlcnlTdHJpbmcob3B0aW9ucyk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBnZXQoX3RoaXMuZmV0Y2gsIGAke190aGlzLnVybH0vYnVja2V0JHtxdWVyeVN0cmluZ31gLCB7IGhlYWRlcnM6IF90aGlzLmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIFJldHJpZXZlcyB0aGUgZGV0YWlscyBvZiBhbiBleGlzdGluZyBTdG9yYWdlIGJ1Y2tldC5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gaWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBidWNrZXQgeW91IHdvdWxkIGxpa2UgdG8gcmV0cmlldmUuXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgYnVja2V0IGRldGFpbHMgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIEdldCBidWNrZXRcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmdldEJ1Y2tldCgnYXZhdGFycycpXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IHtcblx0KiAgICAgXCJpZFwiOiBcImF2YXRhcnNcIixcblx0KiAgICAgXCJuYW1lXCI6IFwiYXZhdGFyc1wiLFxuXHQqICAgICBcIm93bmVyXCI6IFwiXCIsXG5cdCogICAgIFwicHVibGljXCI6IGZhbHNlLFxuXHQqICAgICBcImZpbGVfc2l6ZV9saW1pdFwiOiAxMDI0LFxuXHQqICAgICBcImFsbG93ZWRfbWltZV90eXBlc1wiOiBbXG5cdCogICAgICAgXCJpbWFnZS9wbmdcIlxuXHQqICAgICBdLFxuXHQqICAgICBcImNyZWF0ZWRfYXRcIjogXCIyMDI0LTA1LTIyVDIyOjI2OjA1LjEwMFpcIixcblx0KiAgICAgXCJ1cGRhdGVkX2F0XCI6IFwiMjAyNC0wNS0yMlQyMjoyNjowNS4xMDBaXCJcblx0KiAgIH0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGdldEJ1Y2tldChpZCkge1xuXHRcdHZhciBfdGhpczIgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBnZXQoX3RoaXMyLmZldGNoLCBgJHtfdGhpczIudXJsfS9idWNrZXQvJHtpZH1gLCB7IGhlYWRlcnM6IF90aGlzMi5oZWFkZXJzIH0pLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzMi5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogQ3JlYXRlcyBhIG5ldyBTdG9yYWdlIGJ1Y2tldFxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBwYXJhbSBpZCBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYnVja2V0IHlvdSBhcmUgY3JlYXRpbmcuXG5cdCogQHBhcmFtIG9wdGlvbnMucHVibGljIFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBidWNrZXQuIFB1YmxpYyBidWNrZXRzIGRvbid0IHJlcXVpcmUgYW4gYXV0aG9yaXphdGlvbiB0b2tlbiB0byBkb3dubG9hZCBvYmplY3RzLCBidXQgc3RpbGwgcmVxdWlyZSBhIHZhbGlkIHRva2VuIGZvciBhbGwgb3RoZXIgb3BlcmF0aW9ucy4gQnkgZGVmYXVsdCwgYnVja2V0cyBhcmUgcHJpdmF0ZS5cblx0KiBAcGFyYW0gb3B0aW9ucy5maWxlU2l6ZUxpbWl0IHNwZWNpZmllcyB0aGUgbWF4IGZpbGUgc2l6ZSBpbiBieXRlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZCB0byB0aGlzIGJ1Y2tldC5cblx0KiBUaGUgZ2xvYmFsIGZpbGUgc2l6ZSBsaW1pdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhpcyB2YWx1ZS5cblx0KiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBudWxsLCB3aGljaCBkb2Vzbid0IHNldCBhIHBlciBidWNrZXQgZmlsZSBzaXplIGxpbWl0LlxuXHQqIEBwYXJhbSBvcHRpb25zLmFsbG93ZWRNaW1lVHlwZXMgc3BlY2lmaWVzIHRoZSBhbGxvd2VkIG1pbWUgdHlwZXMgdGhhdCB0aGlzIGJ1Y2tldCBjYW4gYWNjZXB0IGR1cmluZyB1cGxvYWQuXG5cdCogVGhlIGRlZmF1bHQgdmFsdWUgaXMgbnVsbCwgd2hpY2ggYWxsb3dzIGZpbGVzIHdpdGggYWxsIG1pbWUgdHlwZXMgdG8gYmUgdXBsb2FkZWQuXG5cdCogRWFjaCBtaW1lIHR5cGUgc3BlY2lmaWVkIGNhbiBiZSBhIHdpbGRjYXJkLCBlLmcuIGltYWdlLyosIG9yIGEgc3BlY2lmaWMgbWltZSB0eXBlLCBlLmcuIGltYWdlL3BuZy5cblx0KiBAcGFyYW0gb3B0aW9ucy50eXBlIChwcml2YXRlLWJldGEpIHNwZWNpZmllcyB0aGUgYnVja2V0IHR5cGUuIHNlZSBgQnVja2V0VHlwZWAgZm9yIG1vcmUgZGV0YWlscy5cblx0KiAgIC0gZGVmYXVsdCBidWNrZXQgdHlwZSBpcyBgU1RBTkRBUkRgXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgbmV3bHkgY3JlYXRlZCBidWNrZXQgbmFtZSBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGUgQ3JlYXRlIGJ1Y2tldFxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuY3JlYXRlQnVja2V0KCdhdmF0YXJzJywge1xuXHQqICAgICBwdWJsaWM6IGZhbHNlLFxuXHQqICAgICBhbGxvd2VkTWltZVR5cGVzOiBbJ2ltYWdlL3BuZyddLFxuXHQqICAgICBmaWxlU2l6ZUxpbWl0OiAxMDI0XG5cdCogICB9KVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiB7XG5cdCogICAgIFwibmFtZVwiOiBcImF2YXRhcnNcIlxuXHQqICAgfSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgY3JlYXRlQnVja2V0KGlkLCBvcHRpb25zID0geyBwdWJsaWM6IGZhbHNlIH0pIHtcblx0XHR2YXIgX3RoaXMzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdCQxKF90aGlzMy5mZXRjaCwgYCR7X3RoaXMzLnVybH0vYnVja2V0YCwge1xuXHRcdFx0XHRcdGlkLFxuXHRcdFx0XHRcdG5hbWU6IGlkLFxuXHRcdFx0XHRcdHR5cGU6IG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRwdWJsaWM6IG9wdGlvbnMucHVibGljLFxuXHRcdFx0XHRcdGZpbGVfc2l6ZV9saW1pdDogb3B0aW9ucy5maWxlU2l6ZUxpbWl0LFxuXHRcdFx0XHRcdGFsbG93ZWRfbWltZV90eXBlczogb3B0aW9ucy5hbGxvd2VkTWltZVR5cGVzXG5cdFx0XHRcdH0sIHsgaGVhZGVyczogX3RoaXMzLmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBVcGRhdGVzIGEgU3RvcmFnZSBidWNrZXRcblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gaWQgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGJ1Y2tldCB5b3UgYXJlIHVwZGF0aW5nLlxuXHQqIEBwYXJhbSBvcHRpb25zLnB1YmxpYyBUaGUgdmlzaWJpbGl0eSBvZiB0aGUgYnVja2V0LiBQdWJsaWMgYnVja2V0cyBkb24ndCByZXF1aXJlIGFuIGF1dGhvcml6YXRpb24gdG9rZW4gdG8gZG93bmxvYWQgb2JqZWN0cywgYnV0IHN0aWxsIHJlcXVpcmUgYSB2YWxpZCB0b2tlbiBmb3IgYWxsIG90aGVyIG9wZXJhdGlvbnMuXG5cdCogQHBhcmFtIG9wdGlvbnMuZmlsZVNpemVMaW1pdCBzcGVjaWZpZXMgdGhlIG1heCBmaWxlIHNpemUgaW4gYnl0ZXMgdGhhdCBjYW4gYmUgdXBsb2FkZWQgdG8gdGhpcyBidWNrZXQuXG5cdCogVGhlIGdsb2JhbCBmaWxlIHNpemUgbGltaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoaXMgdmFsdWUuXG5cdCogVGhlIGRlZmF1bHQgdmFsdWUgaXMgbnVsbCwgd2hpY2ggZG9lc24ndCBzZXQgYSBwZXIgYnVja2V0IGZpbGUgc2l6ZSBsaW1pdC5cblx0KiBAcGFyYW0gb3B0aW9ucy5hbGxvd2VkTWltZVR5cGVzIHNwZWNpZmllcyB0aGUgYWxsb3dlZCBtaW1lIHR5cGVzIHRoYXQgdGhpcyBidWNrZXQgY2FuIGFjY2VwdCBkdXJpbmcgdXBsb2FkLlxuXHQqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwsIHdoaWNoIGFsbG93cyBmaWxlcyB3aXRoIGFsbCBtaW1lIHR5cGVzIHRvIGJlIHVwbG9hZGVkLlxuXHQqIEVhY2ggbWltZSB0eXBlIHNwZWNpZmllZCBjYW4gYmUgYSB3aWxkY2FyZCwgZS5nLiBpbWFnZS8qLCBvciBhIHNwZWNpZmljIG1pbWUgdHlwZSwgZS5nLiBpbWFnZS9wbmcuXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgc3VjY2VzcyBtZXNzYWdlIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBVcGRhdGUgYnVja2V0XG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC51cGRhdGVCdWNrZXQoJ2F2YXRhcnMnLCB7XG5cdCogICAgIHB1YmxpYzogZmFsc2UsXG5cdCogICAgIGFsbG93ZWRNaW1lVHlwZXM6IFsnaW1hZ2UvcG5nJ10sXG5cdCogICAgIGZpbGVTaXplTGltaXQ6IDEwMjRcblx0KiAgIH0pXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IHtcblx0KiAgICAgXCJtZXNzYWdlXCI6IFwiU3VjY2Vzc2Z1bGx5IHVwZGF0ZWRcIlxuXHQqICAgfSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgdXBkYXRlQnVja2V0KGlkLCBvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzNCA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHB1dChfdGhpczQuZmV0Y2gsIGAke190aGlzNC51cmx9L2J1Y2tldC8ke2lkfWAsIHtcblx0XHRcdFx0XHRpZCxcblx0XHRcdFx0XHRuYW1lOiBpZCxcblx0XHRcdFx0XHRwdWJsaWM6IG9wdGlvbnMucHVibGljLFxuXHRcdFx0XHRcdGZpbGVfc2l6ZV9saW1pdDogb3B0aW9ucy5maWxlU2l6ZUxpbWl0LFxuXHRcdFx0XHRcdGFsbG93ZWRfbWltZV90eXBlczogb3B0aW9ucy5hbGxvd2VkTWltZVR5cGVzXG5cdFx0XHRcdH0sIHsgaGVhZGVyczogX3RoaXM0LmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXM0LnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKipcblx0KiBSZW1vdmVzIGFsbCBvYmplY3RzIGluc2lkZSBhIHNpbmdsZSBidWNrZXQuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYnVja2V0IHlvdSB3b3VsZCBsaWtlIHRvIGVtcHR5LlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIG1lc3NhZ2Ugb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIEVtcHR5IGJ1Y2tldFxuXHQqIGBgYGpzXG5cdCogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2Vcblx0KiAgIC5zdG9yYWdlXG5cdCogICAuZW1wdHlCdWNrZXQoJ2F2YXRhcnMnKVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiB7XG5cdCogICAgIFwibWVzc2FnZVwiOiBcIlN1Y2Nlc3NmdWxseSBlbXB0aWVkXCJcblx0KiAgIH0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGVtcHR5QnVja2V0KGlkKSB7XG5cdFx0dmFyIF90aGlzNSA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QkMShfdGhpczUuZmV0Y2gsIGAke190aGlzNS51cmx9L2J1Y2tldC8ke2lkfS9lbXB0eWAsIHt9LCB7IGhlYWRlcnM6IF90aGlzNS5oZWFkZXJzIH0pLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzNS5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogRGVsZXRlcyBhbiBleGlzdGluZyBidWNrZXQuIEEgYnVja2V0IGNhbid0IGJlIGRlbGV0ZWQgd2l0aCBleGlzdGluZyBvYmplY3RzIGluc2lkZSBpdC5cblx0KiBZb3UgbXVzdCBmaXJzdCBgZW1wdHkoKWAgdGhlIGJ1Y2tldC5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gaWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBidWNrZXQgeW91IHdvdWxkIGxpa2UgdG8gZGVsZXRlLlxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIG1lc3NhZ2Ugb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIERlbGV0ZSBidWNrZXRcblx0KiBgYGBqc1xuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmRlbGV0ZUJ1Y2tldCgnYXZhdGFycycpXG5cdCogYGBgXG5cdCpcblx0KiBSZXNwb25zZTpcblx0KiBgYGBqc29uXG5cdCoge1xuXHQqICAgXCJkYXRhXCI6IHtcblx0KiAgICAgXCJtZXNzYWdlXCI6IFwiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcIlxuXHQqICAgfSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgZGVsZXRlQnVja2V0KGlkKSB7XG5cdFx0dmFyIF90aGlzNiA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHJlbW92ZShfdGhpczYuZmV0Y2gsIGAke190aGlzNi51cmx9L2J1Y2tldC8ke2lkfWAsIHt9LCB7IGhlYWRlcnM6IF90aGlzNi5oZWFkZXJzIH0pLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzNi5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0bGlzdEJ1Y2tldE9wdGlvbnNUb1F1ZXJ5U3RyaW5nKG9wdGlvbnMpIHtcblx0XHRjb25zdCBwYXJhbXMgPSB7fTtcblx0XHRpZiAob3B0aW9ucykge1xuXHRcdFx0aWYgKFwibGltaXRcIiBpbiBvcHRpb25zKSBwYXJhbXMubGltaXQgPSBTdHJpbmcob3B0aW9ucy5saW1pdCk7XG5cdFx0XHRpZiAoXCJvZmZzZXRcIiBpbiBvcHRpb25zKSBwYXJhbXMub2Zmc2V0ID0gU3RyaW5nKG9wdGlvbnMub2Zmc2V0KTtcblx0XHRcdGlmIChvcHRpb25zLnNlYXJjaCkgcGFyYW1zLnNlYXJjaCA9IG9wdGlvbnMuc2VhcmNoO1xuXHRcdFx0aWYgKG9wdGlvbnMuc29ydENvbHVtbikgcGFyYW1zLnNvcnRDb2x1bW4gPSBvcHRpb25zLnNvcnRDb2x1bW47XG5cdFx0XHRpZiAob3B0aW9ucy5zb3J0T3JkZXIpIHBhcmFtcy5zb3J0T3JkZXIgPSBvcHRpb25zLnNvcnRPcmRlcjtcblx0XHR9XG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoID4gMCA/IFwiP1wiICsgbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpLnRvU3RyaW5nKCkgOiBcIlwiO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvcGFja2FnZXMvU3RvcmFnZUFuYWx5dGljc0NsaWVudC50c1xuLyoqXG4qIENsaWVudCBjbGFzcyBmb3IgbWFuYWdpbmcgQW5hbHl0aWNzIEJ1Y2tldHMgdXNpbmcgSWNlYmVyZyB0YWJsZXNcbiogUHJvdmlkZXMgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIGxpc3RpbmcsIGFuZCBkZWxldGluZyBhbmFseXRpY3MgYnVja2V0c1xuKi9cbnZhciBTdG9yYWdlQW5hbHl0aWNzQ2xpZW50ID0gY2xhc3Mge1xuXHQvKipcblx0KiBAYWxwaGFcblx0KlxuXHQqIENyZWF0ZXMgYSBuZXcgU3RvcmFnZUFuYWx5dGljc0NsaWVudCBpbnN0YW5jZVxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBBbmFseXRpY3MgQnVja2V0c1xuXHQqIEBwYXJhbSB1cmwgLSBUaGUgYmFzZSBVUkwgZm9yIHRoZSBzdG9yYWdlIEFQSVxuXHQqIEBwYXJhbSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzIHRvIGluY2x1ZGUgaW4gcmVxdWVzdHNcblx0KiBAcGFyYW0gZmV0Y2ggLSBPcHRpb25hbCBjdXN0b20gZmV0Y2ggaW1wbGVtZW50YXRpb25cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGNsaWVudCA9IG5ldyBTdG9yYWdlQW5hbHl0aWNzQ2xpZW50KHVybCwgaGVhZGVycylcblx0KiBgYGBcblx0Ki9cblx0Y29uc3RydWN0b3IodXJsLCBoZWFkZXJzID0ge30sIGZldGNoJDEpIHtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IGZhbHNlO1xuXHRcdHRoaXMudXJsID0gdXJsLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcblx0XHR0aGlzLmhlYWRlcnMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9IRUFERVJTJDEpLCBoZWFkZXJzKTtcblx0XHR0aGlzLmZldGNoID0gcmVzb2x2ZUZldGNoJDEoZmV0Y2gkMSk7XG5cdH1cblx0LyoqXG5cdCogQGFscGhhXG5cdCpcblx0KiBFbmFibGUgdGhyb3dpbmcgZXJyb3JzIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZW0gaW4gdGhlIHJlc3BvbnNlXG5cdCogV2hlbiBlbmFibGVkLCBmYWlsZWQgb3BlcmF0aW9ucyB3aWxsIHRocm93IGluc3RlYWQgb2YgcmV0dXJuaW5nIHsgZGF0YTogbnVsbCwgZXJyb3IgfVxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBBbmFseXRpY3MgQnVja2V0c1xuXHQqIEByZXR1cm5zIFRoaXMgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZ1xuXHQqL1xuXHR0aHJvd09uRXJyb3IoKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSB0cnVlO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdC8qKlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogQ3JlYXRlcyBhIG5ldyBhbmFseXRpY3MgYnVja2V0IHVzaW5nIEljZWJlcmcgdGFibGVzXG5cdCogQW5hbHl0aWNzIGJ1Y2tldHMgYXJlIG9wdGltaXplZCBmb3IgYW5hbHl0aWNhbCBxdWVyaWVzIGFuZCBkYXRhIHByb2Nlc3Npbmdcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgQW5hbHl0aWNzIEJ1Y2tldHNcblx0KiBAcGFyYW0gbmFtZSBBIHVuaXF1ZSBuYW1lIGZvciB0aGUgYnVja2V0IHlvdSBhcmUgY3JlYXRpbmdcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBuZXdseSBjcmVhdGVkIGFuYWx5dGljcyBidWNrZXQgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIENyZWF0ZSBhbmFseXRpY3MgYnVja2V0XG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5hbmFseXRpY3Ncblx0KiAgIC5jcmVhdGVCdWNrZXQoJ2FuYWx5dGljcy1kYXRhJylcblx0KiBgYGBcblx0KlxuXHQqIFJlc3BvbnNlOlxuXHQqIGBgYGpzb25cblx0KiB7XG5cdCogICBcImRhdGFcIjoge1xuXHQqICAgICBcIm5hbWVcIjogXCJhbmFseXRpY3MtZGF0YVwiLFxuXHQqICAgICBcInR5cGVcIjogXCJBTkFMWVRJQ1NcIixcblx0KiAgICAgXCJmb3JtYXRcIjogXCJpY2ViZXJnXCIsXG5cdCogICAgIFwiY3JlYXRlZF9hdFwiOiBcIjIwMjQtMDUtMjJUMjI6MjY6MDUuMTAwWlwiLFxuXHQqICAgICBcInVwZGF0ZWRfYXRcIjogXCIyMDI0LTA1LTIyVDIyOjI2OjA1LjEwMFpcIlxuXHQqICAgfSxcblx0KiAgIFwiZXJyb3JcIjogbnVsbFxuXHQqIH1cblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgY3JlYXRlQnVja2V0KG5hbWUpIHtcblx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwb3N0JDEoX3RoaXMuZmV0Y2gsIGAke190aGlzLnVybH0vYnVja2V0YCwgeyBuYW1lIH0sIHsgaGVhZGVyczogX3RoaXMuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogQGFscGhhXG5cdCpcblx0KiBSZXRyaWV2ZXMgdGhlIGRldGFpbHMgb2YgYWxsIEFuYWx5dGljcyBTdG9yYWdlIGJ1Y2tldHMgd2l0aGluIGFuIGV4aXN0aW5nIHByb2plY3Rcblx0KiBPbmx5IHJldHVybnMgYnVja2V0cyBvZiB0eXBlICdBTkFMWVRJQ1MnXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IEFuYWx5dGljcyBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgUXVlcnkgcGFyYW1ldGVycyBmb3IgbGlzdGluZyBidWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMubGltaXQgTWF4aW11bSBudW1iZXIgb2YgYnVja2V0cyB0byByZXR1cm5cblx0KiBAcGFyYW0gb3B0aW9ucy5vZmZzZXQgTnVtYmVyIG9mIGJ1Y2tldHMgdG8gc2tpcFxuXHQqIEBwYXJhbSBvcHRpb25zLnNvcnRDb2x1bW4gQ29sdW1uIHRvIHNvcnQgYnkgKCduYW1lJywgJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcpXG5cdCogQHBhcmFtIG9wdGlvbnMuc29ydE9yZGVyIFNvcnQgb3JkZXIgKCdhc2MnIG9yICdkZXNjJylcblx0KiBAcGFyYW0gb3B0aW9ucy5zZWFyY2ggU2VhcmNoIHRlcm0gdG8gZmlsdGVyIGJ1Y2tldCBuYW1lc1xuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIGFycmF5IG9mIGFuYWx5dGljcyBidWNrZXRzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZSBMaXN0IGFuYWx5dGljcyBidWNrZXRzXG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5hbmFseXRpY3Ncblx0KiAgIC5saXN0QnVja2V0cyh7XG5cdCogICAgIGxpbWl0OiAxMCxcblx0KiAgICAgb2Zmc2V0OiAwLFxuXHQqICAgICBzb3J0Q29sdW1uOiAnY3JlYXRlZF9hdCcsXG5cdCogICAgIHNvcnRPcmRlcjogJ2Rlc2MnXG5cdCogICB9KVxuXHQqIGBgYFxuXHQqXG5cdCogUmVzcG9uc2U6XG5cdCogYGBganNvblxuXHQqIHtcblx0KiAgIFwiZGF0YVwiOiBbXG5cdCogICAgIHtcblx0KiAgICAgICBcIm5hbWVcIjogXCJhbmFseXRpY3MtZGF0YVwiLFxuXHQqICAgICAgIFwidHlwZVwiOiBcIkFOQUxZVElDU1wiLFxuXHQqICAgICAgIFwiZm9ybWF0XCI6IFwiaWNlYmVyZ1wiLFxuXHQqICAgICAgIFwiY3JlYXRlZF9hdFwiOiBcIjIwMjQtMDUtMjJUMjI6MjY6MDUuMTAwWlwiLFxuXHQqICAgICAgIFwidXBkYXRlZF9hdFwiOiBcIjIwMjQtMDUtMjJUMjI6MjY6MDUuMTAwWlwiXG5cdCogICAgIH1cblx0KiAgIF0sXG5cdCogICBcImVycm9yXCI6IG51bGxcblx0KiB9XG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGxpc3RCdWNrZXRzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXMyID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG5cdFx0XHRpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5saW1pdCkgIT09IHZvaWQgMCkgcXVlcnlQYXJhbXMuc2V0KFwibGltaXRcIiwgb3B0aW9ucy5saW1pdC50b1N0cmluZygpKTtcblx0XHRcdGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9mZnNldCkgIT09IHZvaWQgMCkgcXVlcnlQYXJhbXMuc2V0KFwib2Zmc2V0XCIsIG9wdGlvbnMub2Zmc2V0LnRvU3RyaW5nKCkpO1xuXHRcdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zb3J0Q29sdW1uKSBxdWVyeVBhcmFtcy5zZXQoXCJzb3J0Q29sdW1uXCIsIG9wdGlvbnMuc29ydENvbHVtbik7XG5cdFx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnNvcnRPcmRlcikgcXVlcnlQYXJhbXMuc2V0KFwic29ydE9yZGVyXCIsIG9wdGlvbnMuc29ydE9yZGVyKTtcblx0XHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2VhcmNoKSBxdWVyeVBhcmFtcy5zZXQoXCJzZWFyY2hcIiwgb3B0aW9ucy5zZWFyY2gpO1xuXHRcdFx0Y29uc3QgcXVlcnlTdHJpbmcgPSBxdWVyeVBhcmFtcy50b1N0cmluZygpO1xuXHRcdFx0Y29uc3QgdXJsID0gcXVlcnlTdHJpbmcgPyBgJHtfdGhpczIudXJsfS9idWNrZXQ/JHtxdWVyeVN0cmluZ31gIDogYCR7X3RoaXMyLnVybH0vYnVja2V0YDtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IGdldChfdGhpczIuZmV0Y2gsIHVybCwgeyBoZWFkZXJzOiBfdGhpczIuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczIuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogRGVsZXRlcyBhbiBleGlzdGluZyBhbmFseXRpY3MgYnVja2V0XG5cdCogQSBidWNrZXQgY2FuJ3QgYmUgZGVsZXRlZCB3aXRoIGV4aXN0aW5nIG9iamVjdHMgaW5zaWRlIGl0XG5cdCogWW91IG11c3QgZmlyc3QgZW1wdHkgdGhlIGJ1Y2tldCBiZWZvcmUgZGVsZXRpb25cblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgQW5hbHl0aWNzIEJ1Y2tldHNcblx0KiBAcGFyYW0gYnVja2V0TmFtZSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGJ1Y2tldCB5b3Ugd291bGQgbGlrZSB0byBkZWxldGVcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBzdWNjZXNzIG1lc3NhZ2Ugb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlIERlbGV0ZSBhbmFseXRpY3MgYnVja2V0XG5cdCogYGBganNcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC5hbmFseXRpY3Ncblx0KiAgIC5kZWxldGVCdWNrZXQoJ2FuYWx5dGljcy1kYXRhJylcblx0KiBgYGBcblx0KlxuXHQqIFJlc3BvbnNlOlxuXHQqIGBgYGpzb25cblx0KiB7XG5cdCogICBcImRhdGFcIjoge1xuXHQqICAgICBcIm1lc3NhZ2VcIjogXCJTdWNjZXNzZnVsbHkgZGVsZXRlZFwiXG5cdCogICB9LFxuXHQqICAgXCJlcnJvclwiOiBudWxsXG5cdCogfVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBkZWxldGVCdWNrZXQoYnVja2V0TmFtZSkge1xuXHRcdHZhciBfdGhpczMgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCByZW1vdmUoX3RoaXMzLmZldGNoLCBgJHtfdGhpczMudXJsfS9idWNrZXQvJHtidWNrZXROYW1lfWAsIHt9LCB7IGhlYWRlcnM6IF90aGlzMy5oZWFkZXJzIH0pLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzMy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCogQGFscGhhXG5cdCpcblx0KiBHZXQgYW4gSWNlYmVyZyBSRVNUIENhdGFsb2cgY2xpZW50IGNvbmZpZ3VyZWQgZm9yIGEgc3BlY2lmaWMgYW5hbHl0aWNzIGJ1Y2tldFxuXHQqIFVzZSB0aGlzIHRvIHBlcmZvcm0gYWR2YW5jZWQgdGFibGUgYW5kIG5hbWVzcGFjZSBvcGVyYXRpb25zIHdpdGhpbiB0aGUgYnVja2V0XG5cdCogVGhlIHJldHVybmVkIGNsaWVudCBwcm92aWRlcyBmdWxsIGFjY2VzcyB0byB0aGUgQXBhY2hlIEljZWJlcmcgUkVTVCBDYXRhbG9nIEFQSVxuXHQqIHdpdGggdGhlIFN1cGFiYXNlIGB7IGRhdGEsIGVycm9yIH1gIHBhdHRlcm4gZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmcgb24gYWxsIG9wZXJhdGlvbnMuXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IEFuYWx5dGljcyBCdWNrZXRzXG5cdCogQHBhcmFtIGJ1Y2tldE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYW5hbHl0aWNzIGJ1Y2tldCAod2FyZWhvdXNlKSB0byBjb25uZWN0IHRvXG5cdCogQHJldHVybnMgVGhlIHdyYXBwZWQgSWNlYmVyZyBjYXRhbG9nIGNsaWVudFxuXHQqIEB0aHJvd3Mge1N0b3JhZ2VFcnJvcn0gSWYgdGhlIGJ1Y2tldCBuYW1lIGlzIGludmFsaWRcblx0KlxuXHQqIEBleGFtcGxlIEdldCBjYXRhbG9nIGFuZCBjcmVhdGUgdGFibGVcblx0KiBgYGBqc1xuXHQqIC8vIEZpcnN0LCBjcmVhdGUgYW4gYW5hbHl0aWNzIGJ1Y2tldFxuXHQqIGNvbnN0IHsgZGF0YTogYnVja2V0LCBlcnJvcjogYnVja2V0RXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLmFuYWx5dGljc1xuXHQqICAgLmNyZWF0ZUJ1Y2tldCgnYW5hbHl0aWNzLWRhdGEnKVxuXHQqXG5cdCogLy8gR2V0IHRoZSBJY2ViZXJnIGNhdGFsb2cgZm9yIHRoYXQgYnVja2V0XG5cdCogY29uc3QgY2F0YWxvZyA9IHN1cGFiYXNlLnN0b3JhZ2UuYW5hbHl0aWNzLmZyb20oJ2FuYWx5dGljcy1kYXRhJylcblx0KlxuXHQqIC8vIENyZWF0ZSBhIG5hbWVzcGFjZVxuXHQqIGNvbnN0IHsgZXJyb3I6IG5zRXJyb3IgfSA9IGF3YWl0IGNhdGFsb2cuY3JlYXRlTmFtZXNwYWNlKHsgbmFtZXNwYWNlOiBbJ2RlZmF1bHQnXSB9KVxuXHQqXG5cdCogLy8gQ3JlYXRlIGEgdGFibGUgd2l0aCBzY2hlbWFcblx0KiBjb25zdCB7IGRhdGE6IHRhYmxlTWV0YWRhdGEsIGVycm9yOiB0YWJsZUVycm9yIH0gPSBhd2FpdCBjYXRhbG9nLmNyZWF0ZVRhYmxlKFxuXHQqICAgeyBuYW1lc3BhY2U6IFsnZGVmYXVsdCddIH0sXG5cdCogICB7XG5cdCogICAgIG5hbWU6ICdldmVudHMnLFxuXHQqICAgICBzY2hlbWE6IHtcblx0KiAgICAgICB0eXBlOiAnc3RydWN0Jyxcblx0KiAgICAgICBmaWVsZHM6IFtcblx0KiAgICAgICAgIHsgaWQ6IDEsIG5hbWU6ICdpZCcsIHR5cGU6ICdsb25nJywgcmVxdWlyZWQ6IHRydWUgfSxcblx0KiAgICAgICAgIHsgaWQ6IDIsIG5hbWU6ICd0aW1lc3RhbXAnLCB0eXBlOiAndGltZXN0YW1wJywgcmVxdWlyZWQ6IHRydWUgfSxcblx0KiAgICAgICAgIHsgaWQ6IDMsIG5hbWU6ICd1c2VyX2lkJywgdHlwZTogJ3N0cmluZycsIHJlcXVpcmVkOiBmYWxzZSB9XG5cdCogICAgICAgXSxcblx0KiAgICAgICAnc2NoZW1hLWlkJzogMCxcblx0KiAgICAgICAnaWRlbnRpZmllci1maWVsZC1pZHMnOiBbMV1cblx0KiAgICAgfSxcblx0KiAgICAgJ3BhcnRpdGlvbi1zcGVjJzoge1xuXHQqICAgICAgICdzcGVjLWlkJzogMCxcblx0KiAgICAgICBmaWVsZHM6IFtdXG5cdCogICAgIH0sXG5cdCogICAgICd3cml0ZS1vcmRlcic6IHtcblx0KiAgICAgICAnb3JkZXItaWQnOiAwLFxuXHQqICAgICAgIGZpZWxkczogW11cblx0KiAgICAgfSxcblx0KiAgICAgcHJvcGVydGllczoge1xuXHQqICAgICAgICd3cml0ZS5mb3JtYXQuZGVmYXVsdCc6ICdwYXJxdWV0J1xuXHQqICAgICB9XG5cdCogICB9XG5cdCogKVxuXHQqIGBgYFxuXHQqXG5cdCogQGV4YW1wbGUgTGlzdCB0YWJsZXMgaW4gbmFtZXNwYWNlXG5cdCogYGBganNcblx0KiBjb25zdCBjYXRhbG9nID0gc3VwYWJhc2Uuc3RvcmFnZS5hbmFseXRpY3MuZnJvbSgnYW5hbHl0aWNzLWRhdGEnKVxuXHQqXG5cdCogLy8gTGlzdCBhbGwgdGFibGVzIGluIHRoZSBkZWZhdWx0IG5hbWVzcGFjZVxuXHQqIGNvbnN0IHsgZGF0YTogdGFibGVzLCBlcnJvcjogbGlzdEVycm9yIH0gPSBhd2FpdCBjYXRhbG9nLmxpc3RUYWJsZXMoeyBuYW1lc3BhY2U6IFsnZGVmYXVsdCddIH0pXG5cdCogaWYgKGxpc3RFcnJvcikge1xuXHQqICAgaWYgKGxpc3RFcnJvci5pc05vdEZvdW5kKCkpIHtcblx0KiAgICAgY29uc29sZS5sb2coJ05hbWVzcGFjZSBub3QgZm91bmQnKVxuXHQqICAgfVxuXHQqICAgcmV0dXJuXG5cdCogfVxuXHQqIGNvbnNvbGUubG9nKHRhYmxlcykgLy8gW3sgbmFtZXNwYWNlOiBbJ2RlZmF1bHQnXSwgbmFtZTogJ2V2ZW50cycgfV1cblx0KiBgYGBcblx0KlxuXHQqIEBleGFtcGxlIFdvcmtpbmcgd2l0aCBuYW1lc3BhY2VzXG5cdCogYGBganNcblx0KiBjb25zdCBjYXRhbG9nID0gc3VwYWJhc2Uuc3RvcmFnZS5hbmFseXRpY3MuZnJvbSgnYW5hbHl0aWNzLWRhdGEnKVxuXHQqXG5cdCogLy8gTGlzdCBhbGwgbmFtZXNwYWNlc1xuXHQqIGNvbnN0IHsgZGF0YTogbmFtZXNwYWNlcyB9ID0gYXdhaXQgY2F0YWxvZy5saXN0TmFtZXNwYWNlcygpXG5cdCpcblx0KiAvLyBDcmVhdGUgbmFtZXNwYWNlIHdpdGggcHJvcGVydGllc1xuXHQqIGF3YWl0IGNhdGFsb2cuY3JlYXRlTmFtZXNwYWNlKFxuXHQqICAgeyBuYW1lc3BhY2U6IFsncHJvZHVjdGlvbiddIH0sXG5cdCogICB7IHByb3BlcnRpZXM6IHsgb3duZXI6ICdkYXRhLXRlYW0nLCBlbnY6ICdwcm9kJyB9IH1cblx0KiApXG5cdCogYGBgXG5cdCpcblx0KiBAZXhhbXBsZSBDbGVhbnVwIG9wZXJhdGlvbnNcblx0KiBgYGBqc1xuXHQqIGNvbnN0IGNhdGFsb2cgPSBzdXBhYmFzZS5zdG9yYWdlLmFuYWx5dGljcy5mcm9tKCdhbmFseXRpY3MtZGF0YScpXG5cdCpcblx0KiAvLyBEcm9wIHRhYmxlIHdpdGggcHVyZ2Ugb3B0aW9uIChyZW1vdmVzIGFsbCBkYXRhKVxuXHQqIGNvbnN0IHsgZXJyb3I6IGRyb3BFcnJvciB9ID0gYXdhaXQgY2F0YWxvZy5kcm9wVGFibGUoXG5cdCogICB7IG5hbWVzcGFjZTogWydkZWZhdWx0J10sIG5hbWU6ICdldmVudHMnIH0sXG5cdCogICB7IHB1cmdlOiB0cnVlIH1cblx0KiApXG5cdCpcblx0KiBpZiAoZHJvcEVycm9yPy5pc05vdEZvdW5kKCkpIHtcblx0KiAgIGNvbnNvbGUubG9nKCdUYWJsZSBkb2VzIG5vdCBleGlzdCcpXG5cdCogfVxuXHQqXG5cdCogLy8gRHJvcCBuYW1lc3BhY2UgKG11c3QgYmUgZW1wdHkpXG5cdCogYXdhaXQgY2F0YWxvZy5kcm9wTmFtZXNwYWNlKHsgbmFtZXNwYWNlOiBbJ2RlZmF1bHQnXSB9KVxuXHQqIGBgYFxuXHQqXG5cdCogQHJlbWFya3Ncblx0KiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIGJyaWRnZSBiZXR3ZWVuIFN1cGFiYXNlJ3MgYnVja2V0IG1hbmFnZW1lbnQgYW5kIHRoZSBzdGFuZGFyZFxuXHQqIEFwYWNoZSBJY2ViZXJnIFJFU1QgQ2F0YWxvZyBBUEkuIFRoZSBidWNrZXQgbmFtZSBtYXBzIHRvIHRoZSBJY2ViZXJnIHdhcmVob3VzZSBwYXJhbWV0ZXIuXG5cdCogQWxsIGF1dGhlbnRpY2F0aW9uIGFuZCBjb25maWd1cmF0aW9uIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSB1c2luZyB5b3VyIFN1cGFiYXNlIGNyZWRlbnRpYWxzLlxuXHQqXG5cdCogKipFcnJvciBIYW5kbGluZyoqOiBJbnZhbGlkIGJ1Y2tldCBuYW1lcyB0aHJvdyBpbW1lZGlhdGVseS4gQWxsIGNhdGFsb2dcblx0KiBvcGVyYXRpb25zIHJldHVybiBgeyBkYXRhLCBlcnJvciB9YCB3aGVyZSBlcnJvcnMgYXJlIGBJY2ViZXJnRXJyb3JgIGluc3RhbmNlcyBmcm9tIGljZWJlcmctanMuXG5cdCogVXNlIGhlbHBlciBtZXRob2RzIGxpa2UgYGVycm9yLmlzTm90Rm91bmQoKWAgb3IgY2hlY2sgYGVycm9yLnN0YXR1c2AgZm9yIHNwZWNpZmljIGVycm9yIGhhbmRsaW5nLlxuXHQqIFVzZSBgLnRocm93T25FcnJvcigpYCBvbiB0aGUgYW5hbHl0aWNzIGNsaWVudCBpZiB5b3UgcHJlZmVyIGV4Y2VwdGlvbnMgZm9yIGNhdGFsb2cgb3BlcmF0aW9ucy5cblx0KlxuXHQqICoqQ2xlYW51cCBPcGVyYXRpb25zKio6IFdoZW4gdXNpbmcgYGRyb3BUYWJsZWAsIHRoZSBgcHVyZ2U6IHRydWVgIG9wdGlvbiBwZXJtYW5lbnRseVxuXHQqIGRlbGV0ZXMgYWxsIHRhYmxlIGRhdGEuIFdpdGhvdXQgaXQsIHRoZSB0YWJsZSBpcyBtYXJrZWQgYXMgZGVsZXRlZCBidXQgZGF0YSByZW1haW5zLlxuXHQqXG5cdCogKipMaWJyYXJ5IERlcGVuZGVuY3kqKjogVGhlIHJldHVybmVkIGNhdGFsb2cgd3JhcHMgYEljZWJlcmdSZXN0Q2F0YWxvZ2AgZnJvbSBpY2ViZXJnLWpzLlxuXHQqIEZvciBjb21wbGV0ZSBBUEkgZG9jdW1lbnRhdGlvbiBhbmQgYWR2YW5jZWQgdXNhZ2UsIHJlZmVyIHRvIHRoZVxuXHQqIFtpY2ViZXJnLWpzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vc3VwYWJhc2UuZ2l0aHViLmlvL2ljZWJlcmctanMvKS5cblx0Ki9cblx0ZnJvbShidWNrZXROYW1lKSB7XG5cdFx0dmFyIF90aGlzNCA9IHRoaXM7XG5cdFx0aWYgKCFpc1ZhbGlkQnVja2V0TmFtZShidWNrZXROYW1lKSkgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcihcIkludmFsaWQgYnVja2V0IG5hbWU6IEZpbGUsIGZvbGRlciwgYW5kIGJ1Y2tldCBuYW1lcyBtdXN0IGZvbGxvdyBBV1Mgb2JqZWN0IGtleSBuYW1pbmcgZ3VpZGVsaW5lcyBhbmQgc2hvdWxkIGF2b2lkIHRoZSB1c2Ugb2YgYW55IG90aGVyIGNoYXJhY3RlcnMuXCIpO1xuXHRcdGNvbnN0IGNhdGFsb2cgPSBuZXcgSWNlYmVyZ1Jlc3RDYXRhbG9nKHtcblx0XHRcdGJhc2VVcmw6IHRoaXMudXJsLFxuXHRcdFx0Y2F0YWxvZ05hbWU6IGJ1Y2tldE5hbWUsXG5cdFx0XHRhdXRoOiB7XG5cdFx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRcdGdldEhlYWRlcnM6IGFzeW5jICgpID0+IF90aGlzNC5oZWFkZXJzXG5cdFx0XHR9LFxuXHRcdFx0ZmV0Y2g6IHRoaXMuZmV0Y2hcblx0XHR9KTtcblx0XHRjb25zdCBzaG91bGRUaHJvd09uRXJyb3IgPSB0aGlzLnNob3VsZFRocm93T25FcnJvcjtcblx0XHRyZXR1cm4gbmV3IFByb3h5KGNhdGFsb2csIHsgZ2V0KHRhcmdldCwgcHJvcCkge1xuXHRcdFx0Y29uc3QgdmFsdWUgPSB0YXJnZXRbcHJvcF07XG5cdFx0XHRpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB2YWx1ZTtcblx0XHRcdHJldHVybiBhc3luYyAoLi4uYXJncykgPT4ge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRkYXRhOiBhd2FpdCB2YWx1ZS5hcHBseSh0YXJnZXQsIGFyZ3MpLFxuXHRcdFx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdGlmIChzaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRcdFx0ZXJyb3Jcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH0gfSk7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvdmVjdG9ycy9jb25zdGFudHMudHNcbmNvbnN0IERFRkFVTFRfSEVBREVSUyA9IHtcblx0XCJYLUNsaWVudC1JbmZvXCI6IGBzdG9yYWdlLWpzLyR7dmVyc2lvbn1gLFxuXHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi92ZWN0b3JzL2Vycm9ycy50c1xuLyoqXG4qIEJhc2UgZXJyb3IgY2xhc3MgZm9yIGFsbCBTdG9yYWdlIFZlY3RvcnMgZXJyb3JzXG4qL1xudmFyIFN0b3JhZ2VWZWN0b3JzRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSkge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMuX19pc1N0b3JhZ2VWZWN0b3JzRXJyb3IgPSB0cnVlO1xuXHRcdHRoaXMubmFtZSA9IFwiU3RvcmFnZVZlY3RvcnNFcnJvclwiO1xuXHR9XG59O1xuLyoqXG4qIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gZXJyb3IgaXMgYSBTdG9yYWdlVmVjdG9yc0Vycm9yXG4qIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBjaGVja1xuKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBlcnJvciBpcyBhIFN0b3JhZ2VWZWN0b3JzRXJyb3JcbiovXG5mdW5jdGlvbiBpc1N0b3JhZ2VWZWN0b3JzRXJyb3IoZXJyb3IpIHtcblx0cmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJiBlcnJvciAhPT0gbnVsbCAmJiBcIl9faXNTdG9yYWdlVmVjdG9yc0Vycm9yXCIgaW4gZXJyb3I7XG59XG4vKipcbiogQVBJIGVycm9yIHJldHVybmVkIGZyb20gUzMgVmVjdG9ycyBzZXJ2aWNlXG4qIEluY2x1ZGVzIEhUVFAgc3RhdHVzIGNvZGUgYW5kIHNlcnZpY2Utc3BlY2lmaWMgZXJyb3IgY29kZVxuKi9cbnZhciBTdG9yYWdlVmVjdG9yc0FwaUVycm9yID0gY2xhc3MgZXh0ZW5kcyBTdG9yYWdlVmVjdG9yc0Vycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCBzdGF0dXNDb2RlKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gXCJTdG9yYWdlVmVjdG9yc0FwaUVycm9yXCI7XG5cdFx0dGhpcy5zdGF0dXMgPSBzdGF0dXM7XG5cdFx0dGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcblx0fVxuXHR0b0pTT04oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hbWU6IHRoaXMubmFtZSxcblx0XHRcdG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcblx0XHRcdHN0YXR1czogdGhpcy5zdGF0dXMsXG5cdFx0XHRzdGF0dXNDb2RlOiB0aGlzLnN0YXR1c0NvZGVcblx0XHR9O1xuXHR9XG59O1xuLyoqXG4qIFVua25vd24gZXJyb3IgdGhhdCBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIGVycm9yIHBhdHRlcm5zXG4qIFdyYXBzIHRoZSBvcmlnaW5hbCBlcnJvciBmb3IgZGVidWdnaW5nXG4qL1xudmFyIFN0b3JhZ2VWZWN0b3JzVW5rbm93bkVycm9yID0gY2xhc3MgZXh0ZW5kcyBTdG9yYWdlVmVjdG9yc0Vycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSwgb3JpZ2luYWxFcnJvcikge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IFwiU3RvcmFnZVZlY3RvcnNVbmtub3duRXJyb3JcIjtcblx0XHR0aGlzLm9yaWdpbmFsRXJyb3IgPSBvcmlnaW5hbEVycm9yO1xuXHR9XG59O1xuLyoqXG4qIEVycm9yIGNvZGVzIHNwZWNpZmljIHRvIFMzIFZlY3RvcnMgQVBJXG4qIE1hcHMgQVdTIHNlcnZpY2UgZXJyb3JzIHRvIGFwcGxpY2F0aW9uLWZyaWVuZGx5IGVycm9yIGNvZGVzXG4qL1xubGV0IFN0b3JhZ2VWZWN0b3JzRXJyb3JDb2RlID0gLyogQF9fUFVSRV9fICovIGZ1bmN0aW9uKFN0b3JhZ2VWZWN0b3JzRXJyb3JDb2RlJDEpIHtcblx0LyoqIEludGVybmFsIHNlcnZlciBmYXVsdCAoSFRUUCA1MDApICovXG5cdFN0b3JhZ2VWZWN0b3JzRXJyb3JDb2RlJDFbXCJJbnRlcm5hbEVycm9yXCJdID0gXCJJbnRlcm5hbEVycm9yXCI7XG5cdC8qKiBSZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyAvIGNvbmZsaWN0IChIVFRQIDQwOSkgKi9cblx0U3RvcmFnZVZlY3RvcnNFcnJvckNvZGUkMVtcIlMzVmVjdG9yQ29uZmxpY3RFeGNlcHRpb25cIl0gPSBcIlMzVmVjdG9yQ29uZmxpY3RFeGNlcHRpb25cIjtcblx0LyoqIFJlc291cmNlIG5vdCBmb3VuZCAoSFRUUCA0MDQpICovXG5cdFN0b3JhZ2VWZWN0b3JzRXJyb3JDb2RlJDFbXCJTM1ZlY3Rvck5vdEZvdW5kRXhjZXB0aW9uXCJdID0gXCJTM1ZlY3Rvck5vdEZvdW5kRXhjZXB0aW9uXCI7XG5cdC8qKiBEZWxldGUgYnVja2V0IHdoaWxlIG5vdCBlbXB0eSAoSFRUUCA0MDApICovXG5cdFN0b3JhZ2VWZWN0b3JzRXJyb3JDb2RlJDFbXCJTM1ZlY3RvckJ1Y2tldE5vdEVtcHR5XCJdID0gXCJTM1ZlY3RvckJ1Y2tldE5vdEVtcHR5XCI7XG5cdC8qKiBFeGNlZWRzIGJ1Y2tldCBxdW90YS9saW1pdCAoSFRUUCA0MDApICovXG5cdFN0b3JhZ2VWZWN0b3JzRXJyb3JDb2RlJDFbXCJTM1ZlY3Rvck1heEJ1Y2tldHNFeGNlZWRlZFwiXSA9IFwiUzNWZWN0b3JNYXhCdWNrZXRzRXhjZWVkZWRcIjtcblx0LyoqIEV4Y2VlZHMgaW5kZXggcXVvdGEvbGltaXQgKEhUVFAgNDAwKSAqL1xuXHRTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSQxW1wiUzNWZWN0b3JNYXhJbmRleGVzRXhjZWVkZWRcIl0gPSBcIlMzVmVjdG9yTWF4SW5kZXhlc0V4Y2VlZGVkXCI7XG5cdHJldHVybiBTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSQxO1xufSh7fSk7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvdmVjdG9ycy9oZWxwZXJzLnRzXG4vKipcbiogUmVzb2x2ZXMgdGhlIGZldGNoIGltcGxlbWVudGF0aW9uIHRvIHVzZVxuKiBVc2VzIGN1c3RvbSBmZXRjaCBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIHVzZXMgbmF0aXZlIGZldGNoXG4qXG4qIEBwYXJhbSBjdXN0b21GZXRjaCAtIE9wdGlvbmFsIGN1c3RvbSBmZXRjaCBpbXBsZW1lbnRhdGlvblxuKiBAcmV0dXJucyBSZXNvbHZlZCBmZXRjaCBmdW5jdGlvblxuKi9cbmNvbnN0IHJlc29sdmVGZXRjaCA9IChjdXN0b21GZXRjaCkgPT4ge1xuXHRpZiAoY3VzdG9tRmV0Y2gpIHJldHVybiAoLi4uYXJncykgPT4gY3VzdG9tRmV0Y2goLi4uYXJncyk7XG5cdHJldHVybiAoLi4uYXJncykgPT4gZmV0Y2goLi4uYXJncyk7XG59O1xuLyoqXG4qIFJlc29sdmVzIHRoZSBSZXNwb25zZSBjb25zdHJ1Y3RvciB0byB1c2VcbiogUmV0dXJucyBuYXRpdmUgUmVzcG9uc2UgY29uc3RydWN0b3JcbipcbiogQHJldHVybnMgUmVzcG9uc2UgY29uc3RydWN0b3JcbiovXG5jb25zdCByZXNvbHZlUmVzcG9uc2UgPSAoKSA9PiB7XG5cdHJldHVybiBSZXNwb25zZTtcbn07XG4vKipcbiogRGV0ZXJtaW5lIGlmIGlucHV0IGlzIGEgcGxhaW4gb2JqZWN0XG4qIEFuIG9iamVjdCBpcyBwbGFpbiBpZiBpdCdzIGNyZWF0ZWQgYnkgZWl0aGVyIHt9LCBuZXcgT2JqZWN0KCksIG9yIE9iamVjdC5jcmVhdGUobnVsbClcbipcbiogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY2hlY2tcbiogQHJldHVybnMgVHJ1ZSBpZiB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdFxuKiBAc291cmNlIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvaXMtcGxhaW4tb2JqXG4qL1xuY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2YWx1ZSkgPT4ge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG5cdHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlKTtcbn07XG4vKipcbiogTm9ybWFsaXplcyBhIG51bWJlciBhcnJheSB0byBmbG9hdDMyIGZvcm1hdFxuKiBFbnN1cmVzIGFsbCB2ZWN0b3IgdmFsdWVzIGFyZSB2YWxpZCAzMi1iaXQgZmxvYXRzXG4qXG4qIEBwYXJhbSB2YWx1ZXMgLSBBcnJheSBvZiBudW1iZXJzIHRvIG5vcm1hbGl6ZVxuKiBAcmV0dXJucyBOb3JtYWxpemVkIGZsb2F0MzIgYXJyYXlcbiovXG5jb25zdCBub3JtYWxpemVUb0Zsb2F0MzIgPSAodmFsdWVzKSA9PiB7XG5cdHJldHVybiBBcnJheS5mcm9tKG5ldyBGbG9hdDMyQXJyYXkodmFsdWVzKSk7XG59O1xuLyoqXG4qIFZhbGlkYXRlcyB2ZWN0b3IgZGltZW5zaW9ucyBtYXRjaCBleHBlY3RlZCBkaW1lbnNpb25cbiogVGhyb3dzIGVycm9yIGlmIGRpbWVuc2lvbnMgZG9uJ3QgbWF0Y2hcbipcbiogQHBhcmFtIHZlY3RvciAtIFZlY3RvciBkYXRhIHRvIHZhbGlkYXRlXG4qIEBwYXJhbSBleHBlY3RlZERpbWVuc2lvbiAtIEV4cGVjdGVkIHZlY3RvciBkaW1lbnNpb25cbiogQHRocm93cyBFcnJvciBpZiBkaW1lbnNpb25zIGRvbid0IG1hdGNoXG4qL1xuY29uc3QgdmFsaWRhdGVWZWN0b3JEaW1lbnNpb24gPSAodmVjdG9yLCBleHBlY3RlZERpbWVuc2lvbikgPT4ge1xuXHRpZiAoZXhwZWN0ZWREaW1lbnNpb24gIT09IHZvaWQgMCAmJiB2ZWN0b3IuZmxvYXQzMi5sZW5ndGggIT09IGV4cGVjdGVkRGltZW5zaW9uKSB0aHJvdyBuZXcgRXJyb3IoYFZlY3RvciBkaW1lbnNpb24gbWlzbWF0Y2g6IGV4cGVjdGVkICR7ZXhwZWN0ZWREaW1lbnNpb259LCBnb3QgJHt2ZWN0b3IuZmxvYXQzMi5sZW5ndGh9YCk7XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL3ZlY3RvcnMvZmV0Y2gudHNcbi8qKlxuKiBFeHRyYWN0cyBlcnJvciBtZXNzYWdlIGZyb20gdmFyaW91cyBlcnJvciByZXNwb25zZSBmb3JtYXRzXG4qIEBwYXJhbSBlcnIgLSBFcnJvciBvYmplY3QgZnJvbSBBUElcbiogQHJldHVybnMgSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZVxuKi9cbmNvbnN0IF9nZXRFcnJvck1lc3NhZ2UgPSAoZXJyKSA9PiBlcnIubXNnIHx8IGVyci5tZXNzYWdlIHx8IGVyci5lcnJvcl9kZXNjcmlwdGlvbiB8fCBlcnIuZXJyb3IgfHwgSlNPTi5zdHJpbmdpZnkoZXJyKTtcbi8qKlxuKiBIYW5kbGVzIGZldGNoIGVycm9ycyBhbmQgY29udmVydHMgdGhlbSB0byBTdG9yYWdlVmVjdG9ycyBlcnJvciB0eXBlc1xuKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgY2F1Z2h0IGZyb20gZmV0Y2hcbiogQHBhcmFtIHJlamVjdCAtIFByb21pc2UgcmVqZWN0aW9uIGZ1bmN0aW9uXG4qIEBwYXJhbSBvcHRpb25zIC0gRmV0Y2ggb3B0aW9ucyB0aGF0IG1heSBhZmZlY3QgZXJyb3IgaGFuZGxpbmdcbiovXG5jb25zdCBoYW5kbGVFcnJvciA9IGFzeW5jIChlcnJvciwgcmVqZWN0LCBvcHRpb25zKSA9PiB7XG5cdGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiYgXCJzdGF0dXNcIiBpbiBlcnJvciAmJiBcIm9rXCIgaW4gZXJyb3IgJiYgdHlwZW9mIGVycm9yLnN0YXR1cyA9PT0gXCJudW1iZXJcIiAmJiAhKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ub1Jlc29sdmVKc29uKSkge1xuXHRcdGNvbnN0IHN0YXR1cyA9IGVycm9yLnN0YXR1cyB8fCA1MDA7XG5cdFx0Y29uc3QgcmVzcG9uc2VFcnJvciA9IGVycm9yO1xuXHRcdGlmICh0eXBlb2YgcmVzcG9uc2VFcnJvci5qc29uID09PSBcImZ1bmN0aW9uXCIpIHJlc3BvbnNlRXJyb3IuanNvbigpLnRoZW4oKGVycikgPT4ge1xuXHRcdFx0Y29uc3Qgc3RhdHVzQ29kZSA9IChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIuc3RhdHVzQ29kZSkgfHwgKGVyciA9PT0gbnVsbCB8fCBlcnIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVyci5jb2RlKSB8fCBzdGF0dXMgKyBcIlwiO1xuXHRcdFx0cmVqZWN0KG5ldyBTdG9yYWdlVmVjdG9yc0FwaUVycm9yKF9nZXRFcnJvck1lc3NhZ2UoZXJyKSwgc3RhdHVzLCBzdGF0dXNDb2RlKSk7XG5cdFx0fSkuY2F0Y2goKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc3RhdHVzQ29kZSA9IHN0YXR1cyArIFwiXCI7XG5cdFx0XHRyZWplY3QobmV3IFN0b3JhZ2VWZWN0b3JzQXBpRXJyb3IocmVzcG9uc2VFcnJvci5zdGF0dXNUZXh0IHx8IGBIVFRQICR7c3RhdHVzfSBlcnJvcmAsIHN0YXR1cywgc3RhdHVzQ29kZSkpO1xuXHRcdH0pO1xuXHRcdGVsc2Uge1xuXHRcdFx0Y29uc3Qgc3RhdHVzQ29kZSA9IHN0YXR1cyArIFwiXCI7XG5cdFx0XHRyZWplY3QobmV3IFN0b3JhZ2VWZWN0b3JzQXBpRXJyb3IocmVzcG9uc2VFcnJvci5zdGF0dXNUZXh0IHx8IGBIVFRQICR7c3RhdHVzfSBlcnJvcmAsIHN0YXR1cywgc3RhdHVzQ29kZSkpO1xuXHRcdH1cblx0fSBlbHNlIHJlamVjdChuZXcgU3RvcmFnZVZlY3RvcnNVbmtub3duRXJyb3IoX2dldEVycm9yTWVzc2FnZShlcnJvciksIGVycm9yKSk7XG59O1xuLyoqXG4qIEJ1aWxkcyByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIGZldGNoIGNhbGxzXG4qIEBwYXJhbSBtZXRob2QgLSBIVFRQIG1ldGhvZFxuKiBAcGFyYW0gb3B0aW9ucyAtIEN1c3RvbSBmZXRjaCBvcHRpb25zXG4qIEBwYXJhbSBwYXJhbWV0ZXJzIC0gQWRkaXRpb25hbCBmZXRjaCBwYXJhbWV0ZXJzIGxpa2UgQWJvcnRTaWduYWxcbiogQHBhcmFtIGJvZHkgLSBSZXF1ZXN0IGJvZHkgKHdpbGwgYmUgSlNPTiBzdHJpbmdpZmllZCBpZiBwbGFpbiBvYmplY3QpXG4qIEByZXR1cm5zIENvbXBsZXRlIGZldGNoIHJlcXVlc3QgcGFyYW1ldGVyc1xuKi9cbmNvbnN0IF9nZXRSZXF1ZXN0UGFyYW1zID0gKG1ldGhvZCwgb3B0aW9ucywgcGFyYW1ldGVycywgYm9keSkgPT4ge1xuXHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0bWV0aG9kLFxuXHRcdGhlYWRlcnM6IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVhZGVycykgfHwge31cblx0fTtcblx0aWYgKG1ldGhvZCA9PT0gXCJHRVRcIiB8fCAhYm9keSkgcmV0dXJuIHBhcmFtcztcblx0aWYgKGlzUGxhaW5PYmplY3QoYm9keSkpIHtcblx0XHRwYXJhbXMuaGVhZGVycyA9IF9vYmplY3RTcHJlYWQyKHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlYWRlcnMpO1xuXHRcdHBhcmFtcy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cdH0gZWxzZSBwYXJhbXMuYm9keSA9IGJvZHk7XG5cdHJldHVybiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgcGFyYW1zKSwgcGFyYW1ldGVycyk7XG59O1xuLyoqXG4qIEludGVybmFsIHJlcXVlc3QgaGFuZGxlciB0aGF0IHdyYXBzIGZldGNoIHdpdGggZXJyb3IgaGFuZGxpbmdcbiogQHBhcmFtIGZldGNoZXIgLSBGZXRjaCBmdW5jdGlvbiB0byB1c2VcbiogQHBhcmFtIG1ldGhvZCAtIEhUVFAgbWV0aG9kXG4qIEBwYXJhbSB1cmwgLSBSZXF1ZXN0IFVSTFxuKiBAcGFyYW0gb3B0aW9ucyAtIEN1c3RvbSBmZXRjaCBvcHRpb25zXG4qIEBwYXJhbSBwYXJhbWV0ZXJzIC0gQWRkaXRpb25hbCBmZXRjaCBwYXJhbWV0ZXJzXG4qIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5XG4qIEByZXR1cm5zIFByb21pc2Ugd2l0aCBwYXJzZWQgcmVzcG9uc2Ugb3IgZXJyb3JcbiovXG5hc3luYyBmdW5jdGlvbiBfaGFuZGxlUmVxdWVzdChmZXRjaGVyLCBtZXRob2QsIHVybCwgb3B0aW9ucywgcGFyYW1ldGVycywgYm9keSkge1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGZldGNoZXIodXJsLCBfZ2V0UmVxdWVzdFBhcmFtcyhtZXRob2QsIG9wdGlvbnMsIHBhcmFtZXRlcnMsIGJvZHkpKS50aGVuKChyZXN1bHQpID0+IHtcblx0XHRcdGlmICghcmVzdWx0Lm9rKSB0aHJvdyByZXN1bHQ7XG5cdFx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm5vUmVzb2x2ZUpzb24pIHJldHVybiByZXN1bHQ7XG5cdFx0XHRjb25zdCBjb250ZW50VHlwZSA9IHJlc3VsdC5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKTtcblx0XHRcdGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSkgcmV0dXJuIHt9O1xuXHRcdFx0cmV0dXJuIHJlc3VsdC5qc29uKCk7XG5cdFx0fSkudGhlbigoZGF0YSkgPT4gcmVzb2x2ZShkYXRhKSkuY2F0Y2goKGVycm9yKSA9PiBoYW5kbGVFcnJvcihlcnJvciwgcmVqZWN0LCBvcHRpb25zKSk7XG5cdH0pO1xufVxuLyoqXG4qIFBlcmZvcm1zIGEgUE9TVCByZXF1ZXN0XG4qIEBwYXJhbSBmZXRjaGVyIC0gRmV0Y2ggZnVuY3Rpb24gdG8gdXNlXG4qIEBwYXJhbSB1cmwgLSBSZXF1ZXN0IFVSTFxuKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keSB0byBiZSBKU09OIHN0cmluZ2lmaWVkXG4qIEBwYXJhbSBvcHRpb25zIC0gQ3VzdG9tIGZldGNoIG9wdGlvbnNcbiogQHBhcmFtIHBhcmFtZXRlcnMgLSBBZGRpdGlvbmFsIGZldGNoIHBhcmFtZXRlcnNcbiogQHJldHVybnMgUHJvbWlzZSB3aXRoIHBhcnNlZCByZXNwb25zZVxuKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3QoZmV0Y2hlciwgdXJsLCBib2R5LCBvcHRpb25zLCBwYXJhbWV0ZXJzKSB7XG5cdHJldHVybiBfaGFuZGxlUmVxdWVzdChmZXRjaGVyLCBcIlBPU1RcIiwgdXJsLCBvcHRpb25zLCBwYXJhbWV0ZXJzLCBib2R5KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi92ZWN0b3JzL1ZlY3RvckluZGV4QXBpLnRzXG4vKipcbiogQGhpZGRlblxuKiBCYXNlIGltcGxlbWVudGF0aW9uIGZvciB2ZWN0b3IgaW5kZXggb3BlcmF0aW9ucy5cbiogVXNlIHtAbGluayBWZWN0b3JCdWNrZXRTY29wZX0gdmlhIGBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnYnVja2V0JylgIGluc3RlYWQuXG4qL1xudmFyIFZlY3RvckluZGV4QXBpID0gY2xhc3Mge1xuXHQvKiogQ3JlYXRlcyBhIG5ldyBWZWN0b3JJbmRleEFwaSBpbnN0YW5jZSAqL1xuXHRjb25zdHJ1Y3Rvcih1cmwsIGhlYWRlcnMgPSB7fSwgZmV0Y2gkMSkge1xuXHRcdHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yID0gZmFsc2U7XG5cdFx0dGhpcy51cmwgPSB1cmwucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuXHRcdHRoaXMuaGVhZGVycyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX0hFQURFUlMpLCBoZWFkZXJzKTtcblx0XHR0aGlzLmZldGNoID0gcmVzb2x2ZUZldGNoKGZldGNoJDEpO1xuXHR9XG5cdC8qKiBFbmFibGUgdGhyb3dpbmcgZXJyb3JzIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZW0gaW4gdGhlIHJlc3BvbnNlICovXG5cdHRocm93T25FcnJvcigpIHtcblx0XHR0aGlzLnNob3VsZFRocm93T25FcnJvciA9IHRydWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0LyoqIENyZWF0ZXMgYSBuZXcgdmVjdG9yIGluZGV4IHdpdGhpbiBhIGJ1Y2tldCAqL1xuXHRhc3luYyBjcmVhdGVJbmRleChvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdChfdGhpcy5mZXRjaCwgYCR7X3RoaXMudXJsfS9DcmVhdGVJbmRleGAsIG9wdGlvbnMsIHsgaGVhZGVyczogX3RoaXMuaGVhZGVycyB9KSB8fCB7fSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZVZlY3RvcnNFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKiBSZXRyaWV2ZXMgbWV0YWRhdGEgZm9yIGEgc3BlY2lmaWMgdmVjdG9yIGluZGV4ICovXG5cdGFzeW5jIGdldEluZGV4KHZlY3RvckJ1Y2tldE5hbWUsIGluZGV4TmFtZSkge1xuXHRcdHZhciBfdGhpczIgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwb3N0KF90aGlzMi5mZXRjaCwgYCR7X3RoaXMyLnVybH0vR2V0SW5kZXhgLCB7XG5cdFx0XHRcdFx0dmVjdG9yQnVja2V0TmFtZSxcblx0XHRcdFx0XHRpbmRleE5hbWVcblx0XHRcdFx0fSwgeyBoZWFkZXJzOiBfdGhpczIuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczIuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VWZWN0b3JzRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKiogTGlzdHMgdmVjdG9yIGluZGV4ZXMgd2l0aGluIGEgYnVja2V0IHdpdGggb3B0aW9uYWwgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uICovXG5cdGFzeW5jIGxpc3RJbmRleGVzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXMzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdChfdGhpczMuZmV0Y2gsIGAke190aGlzMy51cmx9L0xpc3RJbmRleGVzYCwgb3B0aW9ucywgeyBoZWFkZXJzOiBfdGhpczMuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VWZWN0b3JzRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKiogRGVsZXRlcyBhIHZlY3RvciBpbmRleCBhbmQgYWxsIGl0cyBkYXRhICovXG5cdGFzeW5jIGRlbGV0ZUluZGV4KHZlY3RvckJ1Y2tldE5hbWUsIGluZGV4TmFtZSkge1xuXHRcdHZhciBfdGhpczQgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwb3N0KF90aGlzNC5mZXRjaCwgYCR7X3RoaXM0LnVybH0vRGVsZXRlSW5kZXhgLCB7XG5cdFx0XHRcdFx0dmVjdG9yQnVja2V0TmFtZSxcblx0XHRcdFx0XHRpbmRleE5hbWVcblx0XHRcdFx0fSwgeyBoZWFkZXJzOiBfdGhpczQuaGVhZGVycyB9KSB8fCB7fSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczQuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VWZWN0b3JzRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi92ZWN0b3JzL1ZlY3RvckRhdGFBcGkudHNcbi8qKlxuKiBAaGlkZGVuXG4qIEJhc2UgaW1wbGVtZW50YXRpb24gZm9yIHZlY3RvciBkYXRhIG9wZXJhdGlvbnMuXG4qIFVzZSB7QGxpbmsgVmVjdG9ySW5kZXhTY29wZX0gdmlhIGBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnYnVja2V0JykuaW5kZXgoJ2lkeCcpYCBpbnN0ZWFkLlxuKi9cbnZhciBWZWN0b3JEYXRhQXBpID0gY2xhc3Mge1xuXHQvKiogQ3JlYXRlcyBhIG5ldyBWZWN0b3JEYXRhQXBpIGluc3RhbmNlICovXG5cdGNvbnN0cnVjdG9yKHVybCwgaGVhZGVycyA9IHt9LCBmZXRjaCQxKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSBmYWxzZTtcblx0XHR0aGlzLnVybCA9IHVybC5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG5cdFx0dGhpcy5oZWFkZXJzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERFRkFVTFRfSEVBREVSUyksIGhlYWRlcnMpO1xuXHRcdHRoaXMuZmV0Y2ggPSByZXNvbHZlRmV0Y2goZmV0Y2gkMSk7XG5cdH1cblx0LyoqIEVuYWJsZSB0aHJvd2luZyBlcnJvcnMgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlbSBpbiB0aGUgcmVzcG9uc2UgKi9cblx0dGhyb3dPbkVycm9yKCkge1xuXHRcdHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yID0gdHJ1ZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKiogSW5zZXJ0cyBvciB1cGRhdGVzIHZlY3RvcnMgaW4gYmF0Y2ggKDEtNTAwIHBlciByZXF1ZXN0KSAqL1xuXHRhc3luYyBwdXRWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAob3B0aW9ucy52ZWN0b3JzLmxlbmd0aCA8IDEgfHwgb3B0aW9ucy52ZWN0b3JzLmxlbmd0aCA+IDUwMCkgdGhyb3cgbmV3IEVycm9yKFwiVmVjdG9yIGJhdGNoIHNpemUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDUwMCBpdGVtc1wiKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QoX3RoaXMuZmV0Y2gsIGAke190aGlzLnVybH0vUHV0VmVjdG9yc2AsIG9wdGlvbnMsIHsgaGVhZGVyczogX3RoaXMuaGVhZGVycyB9KSB8fCB7fSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZVZlY3RvcnNFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKiBSZXRyaWV2ZXMgdmVjdG9ycyBieSB0aGVpciBrZXlzIGluIGJhdGNoICovXG5cdGFzeW5jIGdldFZlY3RvcnMob3B0aW9ucykge1xuXHRcdHZhciBfdGhpczIgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwb3N0KF90aGlzMi5mZXRjaCwgYCR7X3RoaXMyLnVybH0vR2V0VmVjdG9yc2AsIG9wdGlvbnMsIHsgaGVhZGVyczogX3RoaXMyLmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMyLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlVmVjdG9yc0Vycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqIExpc3RzIHZlY3RvcnMgaW4gYW4gaW5kZXggd2l0aCBwYWdpbmF0aW9uICovXG5cdGFzeW5jIGxpc3RWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3RoaXMzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9wdGlvbnMuc2VnbWVudENvdW50ICE9PSB2b2lkIDApIHtcblx0XHRcdFx0aWYgKG9wdGlvbnMuc2VnbWVudENvdW50IDwgMSB8fCBvcHRpb25zLnNlZ21lbnRDb3VudCA+IDE2KSB0aHJvdyBuZXcgRXJyb3IoXCJzZWdtZW50Q291bnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDE2XCIpO1xuXHRcdFx0XHRpZiAob3B0aW9ucy5zZWdtZW50SW5kZXggIT09IHZvaWQgMCkge1xuXHRcdFx0XHRcdGlmIChvcHRpb25zLnNlZ21lbnRJbmRleCA8IDAgfHwgb3B0aW9ucy5zZWdtZW50SW5kZXggPj0gb3B0aW9ucy5zZWdtZW50Q291bnQpIHRocm93IG5ldyBFcnJvcihgc2VnbWVudEluZGV4IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAke29wdGlvbnMuc2VnbWVudENvdW50IC0gMX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdChfdGhpczMuZmV0Y2gsIGAke190aGlzMy51cmx9L0xpc3RWZWN0b3JzYCwgb3B0aW9ucywgeyBoZWFkZXJzOiBfdGhpczMuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VWZWN0b3JzRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKiogUXVlcmllcyBmb3Igc2ltaWxhciB2ZWN0b3JzIHVzaW5nIGFwcHJveGltYXRlIG5lYXJlc3QgbmVpZ2hib3Igc2VhcmNoICovXG5cdGFzeW5jIHF1ZXJ5VmVjdG9ycyhvcHRpb25zKSB7XG5cdFx0dmFyIF90aGlzNCA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QoX3RoaXM0LmZldGNoLCBgJHtfdGhpczQudXJsfS9RdWVyeVZlY3RvcnNgLCBvcHRpb25zLCB7IGhlYWRlcnM6IF90aGlzNC5oZWFkZXJzIH0pLFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzNC5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yO1xuXHRcdFx0aWYgKGlzU3RvcmFnZVZlY3RvcnNFcnJvcihlcnJvcikpIHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IG51bGwsXG5cdFx0XHRcdGVycm9yXG5cdFx0XHR9O1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cdC8qKiBEZWxldGVzIHZlY3RvcnMgYnkgdGhlaXIga2V5cyBpbiBiYXRjaCAoMS01MDAgcGVyIHJlcXVlc3QpICovXG5cdGFzeW5jIGRlbGV0ZVZlY3RvcnMob3B0aW9ucykge1xuXHRcdHZhciBfdGhpczUgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAob3B0aW9ucy5rZXlzLmxlbmd0aCA8IDEgfHwgb3B0aW9ucy5rZXlzLmxlbmd0aCA+IDUwMCkgdGhyb3cgbmV3IEVycm9yKFwiS2V5cyBiYXRjaCBzaXplIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA1MDAgaXRlbXNcIik7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwb3N0KF90aGlzNS5mZXRjaCwgYCR7X3RoaXM1LnVybH0vRGVsZXRlVmVjdG9yc2AsIG9wdGlvbnMsIHsgaGVhZGVyczogX3RoaXM1LmhlYWRlcnMgfSkgfHwge30sXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXM1LnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlVmVjdG9yc0Vycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvdmVjdG9ycy9WZWN0b3JCdWNrZXRBcGkudHNcbi8qKlxuKiBAaGlkZGVuXG4qIEJhc2UgaW1wbGVtZW50YXRpb24gZm9yIHZlY3RvciBidWNrZXQgb3BlcmF0aW9ucy5cbiogVXNlIHtAbGluayBTdG9yYWdlVmVjdG9yc0NsaWVudH0gdmlhIGBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnNgIGluc3RlYWQuXG4qL1xudmFyIFZlY3RvckJ1Y2tldEFwaSA9IGNsYXNzIHtcblx0LyoqIENyZWF0ZXMgYSBuZXcgVmVjdG9yQnVja2V0QXBpIGluc3RhbmNlICovXG5cdGNvbnN0cnVjdG9yKHVybCwgaGVhZGVycyA9IHt9LCBmZXRjaCQxKSB7XG5cdFx0dGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSBmYWxzZTtcblx0XHR0aGlzLnVybCA9IHVybC5yZXBsYWNlKC9cXC8kLywgXCJcIik7XG5cdFx0dGhpcy5oZWFkZXJzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERFRkFVTFRfSEVBREVSUyksIGhlYWRlcnMpO1xuXHRcdHRoaXMuZmV0Y2ggPSByZXNvbHZlRmV0Y2goZmV0Y2gkMSk7XG5cdH1cblx0LyoqIEVuYWJsZSB0aHJvd2luZyBlcnJvcnMgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlbSBpbiB0aGUgcmVzcG9uc2UgKi9cblx0dGhyb3dPbkVycm9yKCkge1xuXHRcdHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yID0gdHJ1ZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHQvKiogQ3JlYXRlcyBhIG5ldyB2ZWN0b3IgYnVja2V0ICovXG5cdGFzeW5jIGNyZWF0ZUJ1Y2tldCh2ZWN0b3JCdWNrZXROYW1lKSB7XG5cdFx0dmFyIF90aGlzID0gdGhpcztcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogYXdhaXQgcG9zdChfdGhpcy5mZXRjaCwgYCR7X3RoaXMudXJsfS9DcmVhdGVWZWN0b3JCdWNrZXRgLCB7IHZlY3RvckJ1Y2tldE5hbWUgfSwgeyBoZWFkZXJzOiBfdGhpcy5oZWFkZXJzIH0pIHx8IHt9LFxuXHRcdFx0XHRlcnJvcjogbnVsbFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKF90aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlVmVjdG9yc0Vycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqIFJldHJpZXZlcyBtZXRhZGF0YSBmb3IgYSBzcGVjaWZpYyB2ZWN0b3IgYnVja2V0ICovXG5cdGFzeW5jIGdldEJ1Y2tldCh2ZWN0b3JCdWNrZXROYW1lKSB7XG5cdFx0dmFyIF90aGlzMiA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QoX3RoaXMyLmZldGNoLCBgJHtfdGhpczIudXJsfS9HZXRWZWN0b3JCdWNrZXRgLCB7IHZlY3RvckJ1Y2tldE5hbWUgfSwgeyBoZWFkZXJzOiBfdGhpczIuaGVhZGVycyB9KSxcblx0XHRcdFx0ZXJyb3I6IG51bGxcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChfdGhpczIuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvcjtcblx0XHRcdGlmIChpc1N0b3JhZ2VWZWN0b3JzRXJyb3IoZXJyb3IpKSByZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBudWxsLFxuXHRcdFx0XHRlcnJvclxuXHRcdFx0fTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXHQvKiogTGlzdHMgdmVjdG9yIGJ1Y2tldHMgd2l0aCBvcHRpb25hbCBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb24gKi9cblx0YXN5bmMgbGlzdEJ1Y2tldHMob3B0aW9ucyA9IHt9KSB7XG5cdFx0dmFyIF90aGlzMyA9IHRoaXM7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGE6IGF3YWl0IHBvc3QoX3RoaXMzLmZldGNoLCBgJHtfdGhpczMudXJsfS9MaXN0VmVjdG9yQnVja2V0c2AsIG9wdGlvbnMsIHsgaGVhZGVyczogX3RoaXMzLmhlYWRlcnMgfSksXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXMzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlVmVjdG9yc0Vycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblx0LyoqIERlbGV0ZXMgYSB2ZWN0b3IgYnVja2V0IChtdXN0IGJlIGVtcHR5IGZpcnN0KSAqL1xuXHRhc3luYyBkZWxldGVCdWNrZXQodmVjdG9yQnVja2V0TmFtZSkge1xuXHRcdHZhciBfdGhpczQgPSB0aGlzO1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkYXRhOiBhd2FpdCBwb3N0KF90aGlzNC5mZXRjaCwgYCR7X3RoaXM0LnVybH0vRGVsZXRlVmVjdG9yQnVja2V0YCwgeyB2ZWN0b3JCdWNrZXROYW1lIH0sIHsgaGVhZGVyczogX3RoaXM0LmhlYWRlcnMgfSkgfHwge30sXG5cdFx0XHRcdGVycm9yOiBudWxsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAoX3RoaXM0LnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3I7XG5cdFx0XHRpZiAoaXNTdG9yYWdlVmVjdG9yc0Vycm9yKGVycm9yKSkgcmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogbnVsbCxcblx0XHRcdFx0ZXJyb3Jcblx0XHRcdH07XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvdmVjdG9ycy9TdG9yYWdlVmVjdG9yc0NsaWVudC50c1xuLyoqXG4qXG4qIEBhbHBoYVxuKlxuKiBNYWluIGNsaWVudCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBTMyBWZWN0b3JzIEFQSVxuKiBQcm92aWRlcyBhY2Nlc3MgdG8gYnVja2V0LCBpbmRleCwgYW5kIHZlY3RvciBkYXRhIG9wZXJhdGlvbnNcbipcbiogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cbipcbiogKipVc2FnZSBQYXR0ZXJuczoqKlxuKlxuKiBgYGB0eXBlc2NyaXB0XG4qIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG4qICAuc3RvcmFnZVxuKiAgLnZlY3RvcnNcbiogIC5jcmVhdGVCdWNrZXQoJ2VtYmVkZGluZ3MtcHJvZCcpXG4qXG4qIC8vIEFjY2VzcyBpbmRleCBvcGVyYXRpb25zIHZpYSBidWNrZXRzXG4qIGNvbnN0IGJ1Y2tldCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKVxuKiBhd2FpdCBidWNrZXQuY3JlYXRlSW5kZXgoe1xuKiAgIGluZGV4TmFtZTogJ2RvY3VtZW50cycsXG4qICAgZGF0YVR5cGU6ICdmbG9hdDMyJyxcbiogICBkaW1lbnNpb246IDE1MzYsXG4qICAgZGlzdGFuY2VNZXRyaWM6ICdjb3NpbmUnXG4qIH0pXG4qXG4qIC8vIEFjY2VzcyB2ZWN0b3Igb3BlcmF0aW9ucyB2aWEgaW5kZXhcbiogY29uc3QgaW5kZXggPSBidWNrZXQuaW5kZXgoJ2RvY3VtZW50cycpXG4qIGF3YWl0IGluZGV4LnB1dFZlY3RvcnMoe1xuKiAgIHZlY3RvcnM6IFtcbiogICAgIHsga2V5OiAnZG9jLTEnLCBkYXRhOiB7IGZsb2F0MzI6IFsuLi5dIH0sIG1ldGFkYXRhOiB7IHRpdGxlOiAnSW50cm8nIH0gfVxuKiAgIF1cbiogfSlcbipcbiogLy8gUXVlcnkgc2ltaWxhciB2ZWN0b3JzXG4qIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgaW5kZXgucXVlcnlWZWN0b3JzKHtcbiogICBxdWVyeVZlY3RvcjogeyBmbG9hdDMyOiBbLi4uXSB9LFxuKiAgIHRvcEs6IDUsXG4qICAgcmV0dXJuRGlzdGFuY2U6IHRydWVcbiogfSlcbiogYGBgXG4qL1xudmFyIFN0b3JhZ2VWZWN0b3JzQ2xpZW50ID0gY2xhc3MgZXh0ZW5kcyBWZWN0b3JCdWNrZXRBcGkge1xuXHQvKipcblx0KiBAYWxwaGFcblx0KlxuXHQqIENyZWF0ZXMgYSBTdG9yYWdlVmVjdG9yc0NsaWVudCB0aGF0IGNhbiBtYW5hZ2UgYnVja2V0cywgaW5kZXhlcywgYW5kIHZlY3RvcnMuXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIHVybCAtIEJhc2UgVVJMIG9mIHRoZSBTdG9yYWdlIFZlY3RvcnMgUkVTVCBBUEkuXG5cdCogQHBhcmFtIG9wdGlvbnMuaGVhZGVycyAtIE9wdGlvbmFsIGhlYWRlcnMgKGZvciBleGFtcGxlIGBBdXRob3JpemF0aW9uYCkgYXBwbGllZCB0byBldmVyeSByZXF1ZXN0LlxuXHQqIEBwYXJhbSBvcHRpb25zLmZldGNoIC0gT3B0aW9uYWwgY3VzdG9tIGBmZXRjaGAgaW1wbGVtZW50YXRpb24gZm9yIG5vbi1icm93c2VyIHJ1bnRpbWVzLlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0eXBlc2NyaXB0XG5cdCogY29uc3QgY2xpZW50ID0gbmV3IFN0b3JhZ2VWZWN0b3JzQ2xpZW50KHVybCwgb3B0aW9ucylcblx0KiBgYGBcblx0Ki9cblx0Y29uc3RydWN0b3IodXJsLCBvcHRpb25zID0ge30pIHtcblx0XHRzdXBlcih1cmwsIG9wdGlvbnMuaGVhZGVycyB8fCB7fSwgb3B0aW9ucy5mZXRjaCk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIEFjY2VzcyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIHZlY3RvciBidWNrZXRcblx0KiBSZXR1cm5zIGEgc2NvcGVkIGNsaWVudCBmb3IgaW5kZXggYW5kIHZlY3RvciBvcGVyYXRpb25zIHdpdGhpbiB0aGUgYnVja2V0XG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIHZlY3RvckJ1Y2tldE5hbWUgLSBOYW1lIG9mIHRoZSB2ZWN0b3IgYnVja2V0XG5cdCogQHJldHVybnMgQnVja2V0LXNjb3BlZCBjbGllbnQgd2l0aCBpbmRleCBhbmQgdmVjdG9yIG9wZXJhdGlvbnNcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGJ1Y2tldCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKVxuXHQqIGBgYFxuXHQqL1xuXHRmcm9tKHZlY3RvckJ1Y2tldE5hbWUpIHtcblx0XHRyZXR1cm4gbmV3IFZlY3RvckJ1Y2tldFNjb3BlKHRoaXMudXJsLCB0aGlzLmhlYWRlcnMsIHZlY3RvckJ1Y2tldE5hbWUsIHRoaXMuZmV0Y2gpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBDcmVhdGVzIGEgbmV3IHZlY3RvciBidWNrZXRcblx0KiBWZWN0b3IgYnVja2V0cyBhcmUgY29udGFpbmVycyBmb3IgdmVjdG9yIGluZGV4ZXMgYW5kIHRoZWlyIGRhdGFcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gdmVjdG9yQnVja2V0TmFtZSAtIFVuaXF1ZSBuYW1lIGZvciB0aGUgdmVjdG9yIGJ1Y2tldFxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBlbXB0eSByZXNwb25zZSBvbiBzdWNjZXNzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC52ZWN0b3JzXG5cdCogICAuY3JlYXRlQnVja2V0KCdlbWJlZGRpbmdzLXByb2QnKVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBjcmVhdGVCdWNrZXQodmVjdG9yQnVja2V0TmFtZSkge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldENyZWF0ZUJ1Y2tldCA9ICgpID0+IHN1cGVyLmNyZWF0ZUJ1Y2tldCwgX3RoaXMgPSB0aGlzO1xuXHRcdHJldHVybiBfc3VwZXJwcm9wX2dldENyZWF0ZUJ1Y2tldCgpLmNhbGwoX3RoaXMsIHZlY3RvckJ1Y2tldE5hbWUpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBSZXRyaWV2ZXMgbWV0YWRhdGEgZm9yIGEgc3BlY2lmaWMgdmVjdG9yIGJ1Y2tldFxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBwYXJhbSB2ZWN0b3JCdWNrZXROYW1lIC0gTmFtZSBvZiB0aGUgdmVjdG9yIGJ1Y2tldFxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBidWNrZXQgbWV0YWRhdGEgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLnZlY3RvcnNcblx0KiAgIC5nZXRCdWNrZXQoJ2VtYmVkZGluZ3MtcHJvZCcpXG5cdCpcblx0KiBjb25zb2xlLmxvZygnQnVja2V0IGNyZWF0ZWQ6JywgZGF0YT8udmVjdG9yQnVja2V0LmNyZWF0aW9uVGltZSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgZ2V0QnVja2V0KHZlY3RvckJ1Y2tldE5hbWUpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRHZXRCdWNrZXQgPSAoKSA9PiBzdXBlci5nZXRCdWNrZXQsIF90aGlzMiA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0R2V0QnVja2V0KCkuY2FsbChfdGhpczIsIHZlY3RvckJ1Y2tldE5hbWUpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBMaXN0cyBhbGwgdmVjdG9yIGJ1Y2tldHMgd2l0aCBvcHRpb25hbCBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb25cblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGZpbHRlcnMgKHByZWZpeCwgbWF4UmVzdWx0cywgbmV4dFRva2VuKVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBsaXN0IG9mIGJ1Y2tldHMgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlXG5cdCogICAuc3RvcmFnZVxuXHQqICAgLnZlY3RvcnNcblx0KiAgIC5saXN0QnVja2V0cyh7IHByZWZpeDogJ2VtYmVkZGluZ3MtJyB9KVxuXHQqXG5cdCogZGF0YT8udmVjdG9yQnVja2V0cy5mb3JFYWNoKGJ1Y2tldCA9PiB7XG5cdCogICBjb25zb2xlLmxvZyhidWNrZXQudmVjdG9yQnVja2V0TmFtZSlcblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBsaXN0QnVja2V0cyhvcHRpb25zID0ge30pIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRMaXN0QnVja2V0cyA9ICgpID0+IHN1cGVyLmxpc3RCdWNrZXRzLCBfdGhpczMgPSB0aGlzO1xuXHRcdHJldHVybiBfc3VwZXJwcm9wX2dldExpc3RCdWNrZXRzKCkuY2FsbChfdGhpczMsIG9wdGlvbnMpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBEZWxldGVzIGEgdmVjdG9yIGJ1Y2tldCAoYnVja2V0IG11c3QgYmUgZW1wdHkpXG5cdCogQWxsIGluZGV4ZXMgbXVzdCBiZSBkZWxldGVkIGJlZm9yZSBkZWxldGluZyB0aGUgYnVja2V0XG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIHZlY3RvckJ1Y2tldE5hbWUgLSBOYW1lIG9mIHRoZSB2ZWN0b3IgYnVja2V0IHRvIGRlbGV0ZVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBlbXB0eSByZXNwb25zZSBvbiBzdWNjZXNzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZVxuXHQqICAgLnN0b3JhZ2Vcblx0KiAgIC52ZWN0b3JzXG5cdCogICAuZGVsZXRlQnVja2V0KCdlbWJlZGRpbmdzLW9sZCcpXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGRlbGV0ZUJ1Y2tldCh2ZWN0b3JCdWNrZXROYW1lKSB7XG5cdFx0dmFyIF9zdXBlcnByb3BfZ2V0RGVsZXRlQnVja2V0ID0gKCkgPT4gc3VwZXIuZGVsZXRlQnVja2V0LCBfdGhpczQgPSB0aGlzO1xuXHRcdHJldHVybiBfc3VwZXJwcm9wX2dldERlbGV0ZUJ1Y2tldCgpLmNhbGwoX3RoaXM0LCB2ZWN0b3JCdWNrZXROYW1lKTtcblx0fVxufTtcbi8qKlxuKlxuKiBAYWxwaGFcbipcbiogU2NvcGVkIGNsaWVudCBmb3Igb3BlcmF0aW9ucyB3aXRoaW4gYSBzcGVjaWZpYyB2ZWN0b3IgYnVja2V0XG4qIFByb3ZpZGVzIGluZGV4IG1hbmFnZW1lbnQgYW5kIGFjY2VzcyB0byB2ZWN0b3Igb3BlcmF0aW9uc1xuKlxuKiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuKi9cbnZhciBWZWN0b3JCdWNrZXRTY29wZSA9IGNsYXNzIGV4dGVuZHMgVmVjdG9ySW5kZXhBcGkge1xuXHQvKipcblx0KiBAYWxwaGFcblx0KlxuXHQqIENyZWF0ZXMgYSBoZWxwZXIgdGhhdCBhdXRvbWF0aWNhbGx5IHNjb3BlcyBhbGwgaW5kZXggb3BlcmF0aW9ucyB0byB0aGUgcHJvdmlkZWQgYnVja2V0LlxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGJ1Y2tldCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKVxuXHQqIGBgYFxuXHQqL1xuXHRjb25zdHJ1Y3Rvcih1cmwsIGhlYWRlcnMsIHZlY3RvckJ1Y2tldE5hbWUsIGZldGNoJDEpIHtcblx0XHRzdXBlcih1cmwsIGhlYWRlcnMsIGZldGNoJDEpO1xuXHRcdHRoaXMudmVjdG9yQnVja2V0TmFtZSA9IHZlY3RvckJ1Y2tldE5hbWU7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIENyZWF0ZXMgYSBuZXcgdmVjdG9yIGluZGV4IGluIHRoaXMgYnVja2V0XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgYnVja2V0IG5hbWVcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gb3B0aW9ucyAtIEluZGV4IGNvbmZpZ3VyYXRpb24gKHZlY3RvckJ1Y2tldE5hbWUgaXMgYXV0b21hdGljYWxseSBzZXQpXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIGVtcHR5IHJlc3BvbnNlIG9uIHN1Y2Nlc3Mgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGJ1Y2tldCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKVxuXHQqIGF3YWl0IGJ1Y2tldC5jcmVhdGVJbmRleCh7XG5cdCogICBpbmRleE5hbWU6ICdkb2N1bWVudHMtb3BlbmFpJyxcblx0KiAgIGRhdGFUeXBlOiAnZmxvYXQzMicsXG5cdCogICBkaW1lbnNpb246IDE1MzYsXG5cdCogICBkaXN0YW5jZU1ldHJpYzogJ2Nvc2luZScsXG5cdCogICBtZXRhZGF0YUNvbmZpZ3VyYXRpb246IHtcblx0KiAgICAgbm9uRmlsdGVyYWJsZU1ldGFkYXRhS2V5czogWydyYXdfdGV4dCddXG5cdCogICB9XG5cdCogfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgY3JlYXRlSW5kZXgob3B0aW9ucykge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldENyZWF0ZUluZGV4ID0gKCkgPT4gc3VwZXIuY3JlYXRlSW5kZXgsIF90aGlzNSA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0Q3JlYXRlSW5kZXgoKS5jYWxsKF90aGlzNSwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwgeyB2ZWN0b3JCdWNrZXROYW1lOiBfdGhpczUudmVjdG9yQnVja2V0TmFtZSB9KSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIExpc3RzIGluZGV4ZXMgaW4gdGhpcyBidWNrZXRcblx0KiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIHRoZSBidWNrZXQgbmFtZVxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBwYXJhbSBvcHRpb25zIC0gTGlzdGluZyBvcHRpb25zICh2ZWN0b3JCdWNrZXROYW1lIGlzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIGluZGV4ZXMgYXJyYXkgYW5kIHBhZ2luYXRpb24gdG9rZW4gb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGJ1Y2tldCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKVxuXHQqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYnVja2V0Lmxpc3RJbmRleGVzKHsgcHJlZml4OiAnZG9jdW1lbnRzLScgfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgbGlzdEluZGV4ZXMob3B0aW9ucyA9IHt9KSB7XG5cdFx0dmFyIF9zdXBlcnByb3BfZ2V0TGlzdEluZGV4ZXMgPSAoKSA9PiBzdXBlci5saXN0SW5kZXhlcywgX3RoaXM2ID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXRMaXN0SW5kZXhlcygpLmNhbGwoX3RoaXM2LCBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgb3B0aW9ucyksIHt9LCB7IHZlY3RvckJ1Y2tldE5hbWU6IF90aGlzNi52ZWN0b3JCdWNrZXROYW1lIH0pKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogUmV0cmlldmVzIG1ldGFkYXRhIGZvciBhIHNwZWNpZmljIGluZGV4IGluIHRoaXMgYnVja2V0XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgYnVja2V0IG5hbWVcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gaW5kZXhOYW1lIC0gTmFtZSBvZiB0aGUgaW5kZXggdG8gcmV0cmlldmVcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggaW5kZXggbWV0YWRhdGEgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGJ1Y2tldCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKVxuXHQqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYnVja2V0LmdldEluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBjb25zb2xlLmxvZygnRGltZW5zaW9uOicsIGRhdGE/LmluZGV4LmRpbWVuc2lvbilcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgZ2V0SW5kZXgoaW5kZXhOYW1lKSB7XG5cdFx0dmFyIF9zdXBlcnByb3BfZ2V0R2V0SW5kZXggPSAoKSA9PiBzdXBlci5nZXRJbmRleCwgX3RoaXM3ID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXRHZXRJbmRleCgpLmNhbGwoX3RoaXM3LCBfdGhpczcudmVjdG9yQnVja2V0TmFtZSwgaW5kZXhOYW1lKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogRGVsZXRlcyBhbiBpbmRleCBmcm9tIHRoaXMgYnVja2V0XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgYnVja2V0IG5hbWVcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gaW5kZXhOYW1lIC0gTmFtZSBvZiB0aGUgaW5kZXggdG8gZGVsZXRlXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIGVtcHR5IHJlc3BvbnNlIG9uIHN1Y2Nlc3Mgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGJ1Y2tldCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKVxuXHQqIGF3YWl0IGJ1Y2tldC5kZWxldGVJbmRleCgnb2xkLWluZGV4Jylcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgZGVsZXRlSW5kZXgoaW5kZXhOYW1lKSB7XG5cdFx0dmFyIF9zdXBlcnByb3BfZ2V0RGVsZXRlSW5kZXggPSAoKSA9PiBzdXBlci5kZWxldGVJbmRleCwgX3RoaXM4ID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXREZWxldGVJbmRleCgpLmNhbGwoX3RoaXM4LCBfdGhpczgudmVjdG9yQnVja2V0TmFtZSwgaW5kZXhOYW1lKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogQWNjZXNzIG9wZXJhdGlvbnMgZm9yIGEgc3BlY2lmaWMgaW5kZXggd2l0aGluIHRoaXMgYnVja2V0XG5cdCogUmV0dXJucyBhIHNjb3BlZCBjbGllbnQgZm9yIHZlY3RvciBkYXRhIG9wZXJhdGlvbnNcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gaW5kZXhOYW1lIC0gTmFtZSBvZiB0aGUgaW5kZXhcblx0KiBAcmV0dXJucyBJbmRleC1zY29wZWQgY2xpZW50IHdpdGggdmVjdG9yIGRhdGEgb3BlcmF0aW9uc1xuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0eXBlc2NyaXB0XG5cdCogY29uc3QgaW5kZXggPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJykuaW5kZXgoJ2RvY3VtZW50cy1vcGVuYWknKVxuXHQqXG5cdCogLy8gSW5zZXJ0IHZlY3RvcnNcblx0KiBhd2FpdCBpbmRleC5wdXRWZWN0b3JzKHtcblx0KiAgIHZlY3RvcnM6IFtcblx0KiAgICAgeyBrZXk6ICdkb2MtMScsIGRhdGE6IHsgZmxvYXQzMjogWy4uLl0gfSwgbWV0YWRhdGE6IHsgdGl0bGU6ICdJbnRybycgfSB9XG5cdCogICBdXG5cdCogfSlcblx0KlxuXHQqIC8vIFF1ZXJ5IHNpbWlsYXIgdmVjdG9yc1xuXHQqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgaW5kZXgucXVlcnlWZWN0b3JzKHtcblx0KiAgIHF1ZXJ5VmVjdG9yOiB7IGZsb2F0MzI6IFsuLi5dIH0sXG5cdCogICB0b3BLOiA1XG5cdCogfSlcblx0KiBgYGBcblx0Ki9cblx0aW5kZXgoaW5kZXhOYW1lKSB7XG5cdFx0cmV0dXJuIG5ldyBWZWN0b3JJbmRleFNjb3BlKHRoaXMudXJsLCB0aGlzLmhlYWRlcnMsIHRoaXMudmVjdG9yQnVja2V0TmFtZSwgaW5kZXhOYW1lLCB0aGlzLmZldGNoKTtcblx0fVxufTtcbi8qKlxuKlxuKiBAYWxwaGFcbipcbiogU2NvcGVkIGNsaWVudCBmb3Igb3BlcmF0aW9ucyB3aXRoaW4gYSBzcGVjaWZpYyB2ZWN0b3IgaW5kZXhcbiogUHJvdmlkZXMgdmVjdG9yIGRhdGEgb3BlcmF0aW9ucyAocHV0LCBnZXQsIGxpc3QsIHF1ZXJ5LCBkZWxldGUpXG4qXG4qICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG4qL1xudmFyIFZlY3RvckluZGV4U2NvcGUgPSBjbGFzcyBleHRlbmRzIFZlY3RvckRhdGFBcGkge1xuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogQ3JlYXRlcyBhIGhlbHBlciB0aGF0IGF1dG9tYXRpY2FsbHkgc2NvcGVzIGFsbCB2ZWN0b3Igb3BlcmF0aW9ucyB0byB0aGUgcHJvdmlkZWQgYnVja2V0L2luZGV4IG5hbWVzLlxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBgYGBcblx0Ki9cblx0Y29uc3RydWN0b3IodXJsLCBoZWFkZXJzLCB2ZWN0b3JCdWNrZXROYW1lLCBpbmRleE5hbWUsIGZldGNoJDEpIHtcblx0XHRzdXBlcih1cmwsIGhlYWRlcnMsIGZldGNoJDEpO1xuXHRcdHRoaXMudmVjdG9yQnVja2V0TmFtZSA9IHZlY3RvckJ1Y2tldE5hbWU7XG5cdFx0dGhpcy5pbmRleE5hbWUgPSBpbmRleE5hbWU7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIEluc2VydHMgb3IgdXBkYXRlcyB2ZWN0b3JzIGluIHRoaXMgaW5kZXhcblx0KiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIGJ1Y2tldCBhbmQgaW5kZXggbmFtZXNcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gb3B0aW9ucyAtIFZlY3RvciBpbnNlcnRpb24gb3B0aW9ucyAoYnVja2V0IGFuZCBpbmRleCBuYW1lcyBhdXRvbWF0aWNhbGx5IHNldClcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggZW1wdHkgcmVzcG9uc2Ugb24gc3VjY2VzcyBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0eXBlc2NyaXB0XG5cdCogY29uc3QgaW5kZXggPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJykuaW5kZXgoJ2RvY3VtZW50cy1vcGVuYWknKVxuXHQqIGF3YWl0IGluZGV4LnB1dFZlY3RvcnMoe1xuXHQqICAgdmVjdG9yczogW1xuXHQqICAgICB7XG5cdCogICAgICAga2V5OiAnZG9jLTEnLFxuXHQqICAgICAgIGRhdGE6IHsgZmxvYXQzMjogWzAuMSwgMC4yLCAuLi5dIH0sXG5cdCogICAgICAgbWV0YWRhdGE6IHsgdGl0bGU6ICdJbnRyb2R1Y3Rpb24nLCBwYWdlOiAxIH1cblx0KiAgICAgfVxuXHQqICAgXVxuXHQqIH0pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIHB1dFZlY3RvcnMob3B0aW9ucykge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldFB1dFZlY3RvcnMgPSAoKSA9PiBzdXBlci5wdXRWZWN0b3JzLCBfdGhpczkgPSB0aGlzO1xuXHRcdHJldHVybiBfc3VwZXJwcm9wX2dldFB1dFZlY3RvcnMoKS5jYWxsKF90aGlzOSwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwge1xuXHRcdFx0dmVjdG9yQnVja2V0TmFtZTogX3RoaXM5LnZlY3RvckJ1Y2tldE5hbWUsXG5cdFx0XHRpbmRleE5hbWU6IF90aGlzOS5pbmRleE5hbWVcblx0XHR9KSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIFJldHJpZXZlcyB2ZWN0b3JzIGJ5IGtleXMgZnJvbSB0aGlzIGluZGV4XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyBidWNrZXQgYW5kIGluZGV4IG5hbWVzXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBWZWN0b3IgcmV0cmlldmFsIG9wdGlvbnMgKGJ1Y2tldCBhbmQgaW5kZXggbmFtZXMgYXV0b21hdGljYWxseSBzZXQpXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgdmVjdG9ycyBhcnJheSBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0eXBlc2NyaXB0XG5cdCogY29uc3QgaW5kZXggPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJykuaW5kZXgoJ2RvY3VtZW50cy1vcGVuYWknKVxuXHQqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgaW5kZXguZ2V0VmVjdG9ycyh7XG5cdCogICBrZXlzOiBbJ2RvYy0xJywgJ2RvYy0yJ10sXG5cdCogICByZXR1cm5NZXRhZGF0YTogdHJ1ZVxuXHQqIH0pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGdldFZlY3RvcnMob3B0aW9ucykge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldEdldFZlY3RvcnMgPSAoKSA9PiBzdXBlci5nZXRWZWN0b3JzLCBfdGhpczEwID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXRHZXRWZWN0b3JzKCkuY2FsbChfdGhpczEwLCBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgb3B0aW9ucyksIHt9LCB7XG5cdFx0XHR2ZWN0b3JCdWNrZXROYW1lOiBfdGhpczEwLnZlY3RvckJ1Y2tldE5hbWUsXG5cdFx0XHRpbmRleE5hbWU6IF90aGlzMTAuaW5kZXhOYW1lXG5cdFx0fSkpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBMaXN0cyB2ZWN0b3JzIGluIHRoaXMgaW5kZXggd2l0aCBwYWdpbmF0aW9uXG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyBidWNrZXQgYW5kIGluZGV4IG5hbWVzXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBMaXN0aW5nIG9wdGlvbnMgKGJ1Y2tldCBhbmQgaW5kZXggbmFtZXMgYXV0b21hdGljYWxseSBzZXQpXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgdmVjdG9ycyBhcnJheSBhbmQgcGFnaW5hdGlvbiB0b2tlbiBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0eXBlc2NyaXB0XG5cdCogY29uc3QgaW5kZXggPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJykuaW5kZXgoJ2RvY3VtZW50cy1vcGVuYWknKVxuXHQqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgaW5kZXgubGlzdFZlY3RvcnMoe1xuXHQqICAgbWF4UmVzdWx0czogNTAwLFxuXHQqICAgcmV0dXJuTWV0YWRhdGE6IHRydWVcblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBsaXN0VmVjdG9ycyhvcHRpb25zID0ge30pIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRMaXN0VmVjdG9ycyA9ICgpID0+IHN1cGVyLmxpc3RWZWN0b3JzLCBfdGhpczExID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXRMaXN0VmVjdG9ycygpLmNhbGwoX3RoaXMxMSwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwge1xuXHRcdFx0dmVjdG9yQnVja2V0TmFtZTogX3RoaXMxMS52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczExLmluZGV4TmFtZVxuXHRcdH0pKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogUXVlcmllcyBmb3Igc2ltaWxhciB2ZWN0b3JzIGluIHRoaXMgaW5kZXhcblx0KiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIGJ1Y2tldCBhbmQgaW5kZXggbmFtZXNcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gb3B0aW9ucyAtIFF1ZXJ5IG9wdGlvbnMgKGJ1Y2tldCBhbmQgaW5kZXggbmFtZXMgYXV0b21hdGljYWxseSBzZXQpXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIHJlc3BvbnNlIGNvbnRhaW5pbmcgbWF0Y2hlcyBhcnJheSBvZiBzaW1pbGFyIHZlY3RvcnMgb3JkZXJlZCBieSBkaXN0YW5jZSBvciBlcnJvclxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0eXBlc2NyaXB0XG5cdCogY29uc3QgaW5kZXggPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJykuaW5kZXgoJ2RvY3VtZW50cy1vcGVuYWknKVxuXHQqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgaW5kZXgucXVlcnlWZWN0b3JzKHtcblx0KiAgIHF1ZXJ5VmVjdG9yOiB7IGZsb2F0MzI6IFswLjEsIDAuMiwgLi4uXSB9LFxuXHQqICAgdG9wSzogNSxcblx0KiAgIGZpbHRlcjogeyBjYXRlZ29yeTogJ3RlY2huaWNhbCcgfSxcblx0KiAgIHJldHVybkRpc3RhbmNlOiB0cnVlLFxuXHQqICAgcmV0dXJuTWV0YWRhdGE6IHRydWVcblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBxdWVyeVZlY3RvcnMob3B0aW9ucykge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldFF1ZXJ5VmVjdG9ycyA9ICgpID0+IHN1cGVyLnF1ZXJ5VmVjdG9ycywgX3RoaXMxMiA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0UXVlcnlWZWN0b3JzKCkuY2FsbChfdGhpczEyLCBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgb3B0aW9ucyksIHt9LCB7XG5cdFx0XHR2ZWN0b3JCdWNrZXROYW1lOiBfdGhpczEyLnZlY3RvckJ1Y2tldE5hbWUsXG5cdFx0XHRpbmRleE5hbWU6IF90aGlzMTIuaW5kZXhOYW1lXG5cdFx0fSkpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBEZWxldGVzIHZlY3RvcnMgYnkga2V5cyBmcm9tIHRoaXMgaW5kZXhcblx0KiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIGJ1Y2tldCBhbmQgaW5kZXggbmFtZXNcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gb3B0aW9ucyAtIERlbGV0aW9uIG9wdGlvbnMgKGJ1Y2tldCBhbmQgaW5kZXggbmFtZXMgYXV0b21hdGljYWxseSBzZXQpXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIGVtcHR5IHJlc3BvbnNlIG9uIHN1Y2Nlc3Mgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBhd2FpdCBpbmRleC5kZWxldGVWZWN0b3JzKHtcblx0KiAgIGtleXM6IFsnZG9jLTEnLCAnZG9jLTInLCAnZG9jLTMnXVxuXHQqIH0pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGRlbGV0ZVZlY3RvcnMob3B0aW9ucykge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldERlbGV0ZVZlY3RvcnMgPSAoKSA9PiBzdXBlci5kZWxldGVWZWN0b3JzLCBfdGhpczEzID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXREZWxldGVWZWN0b3JzKCkuY2FsbChfdGhpczEzLCBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgb3B0aW9ucyksIHt9LCB7XG5cdFx0XHR2ZWN0b3JCdWNrZXROYW1lOiBfdGhpczEzLnZlY3RvckJ1Y2tldE5hbWUsXG5cdFx0XHRpbmRleE5hbWU6IF90aGlzMTMuaW5kZXhOYW1lXG5cdFx0fSkpO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvU3RvcmFnZUNsaWVudC50c1xudmFyIFN0b3JhZ2VDbGllbnQgPSBjbGFzcyBleHRlbmRzIFN0b3JhZ2VCdWNrZXRBcGkge1xuXHQvKipcblx0KiBDcmVhdGVzIGEgY2xpZW50IGZvciBTdG9yYWdlIGJ1Y2tldHMsIGZpbGVzLCBhbmFseXRpY3MsIGFuZCB2ZWN0b3JzLlxuXHQqXG5cdCogQGNhdGVnb3J5IEZpbGUgQnVja2V0c1xuXHQqIEBleGFtcGxlXG5cdCogYGBgdHNcblx0KiBpbXBvcnQgeyBTdG9yYWdlQ2xpZW50IH0gZnJvbSAnQHN1cGFiYXNlL3N0b3JhZ2UtanMnXG5cdCpcblx0KiBjb25zdCBzdG9yYWdlID0gbmV3IFN0b3JhZ2VDbGllbnQoJ2h0dHBzOi8veHl6Y29tcGFueS5zdXBhYmFzZS5jby9zdG9yYWdlL3YxJywge1xuXHQqICAgYXBpa2V5OiAncHVibGljLWFub24ta2V5Jyxcblx0KiB9KVxuXHQqIGNvbnN0IGF2YXRhcnMgPSBzdG9yYWdlLmZyb20oJ2F2YXRhcnMnKVxuXHQqIGBgYFxuXHQqL1xuXHRjb25zdHJ1Y3Rvcih1cmwsIGhlYWRlcnMgPSB7fSwgZmV0Y2gkMSwgb3B0cykge1xuXHRcdHN1cGVyKHVybCwgaGVhZGVycywgZmV0Y2gkMSwgb3B0cyk7XG5cdH1cblx0LyoqXG5cdCogUGVyZm9ybSBmaWxlIG9wZXJhdGlvbiBpbiBhIGJ1Y2tldC5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAcGFyYW0gaWQgVGhlIGJ1Y2tldCBpZCB0byBvcGVyYXRlIG9uLlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiBgYGB0eXBlc2NyaXB0XG5cdCogY29uc3QgYXZhdGFycyA9IHN1cGFiYXNlLnN0b3JhZ2UuZnJvbSgnYXZhdGFycycpXG5cdCogYGBgXG5cdCovXG5cdGZyb20oaWQpIHtcblx0XHRyZXR1cm4gbmV3IFN0b3JhZ2VGaWxlQXBpKHRoaXMudXJsLCB0aGlzLmhlYWRlcnMsIGlkLCB0aGlzLmZldGNoKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogQWNjZXNzIHZlY3RvciBzdG9yYWdlIG9wZXJhdGlvbnMuXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHJldHVybnMgQSBTdG9yYWdlVmVjdG9yc0NsaWVudCBpbnN0YW5jZSBjb25maWd1cmVkIHdpdGggdGhlIGN1cnJlbnQgc3RvcmFnZSBzZXR0aW5ncy5cblx0Ki9cblx0Z2V0IHZlY3RvcnMoKSB7XG5cdFx0cmV0dXJuIG5ldyBTdG9yYWdlVmVjdG9yc0NsaWVudCh0aGlzLnVybCArIFwiL3ZlY3RvclwiLCB7XG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRmZXRjaDogdGhpcy5mZXRjaFxuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBBY2Nlc3MgYW5hbHl0aWNzIHN0b3JhZ2Ugb3BlcmF0aW9ucyB1c2luZyBJY2ViZXJnIHRhYmxlcy5cblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgQW5hbHl0aWNzIEJ1Y2tldHNcblx0KiBAcmV0dXJucyBBIFN0b3JhZ2VBbmFseXRpY3NDbGllbnQgaW5zdGFuY2UgY29uZmlndXJlZCB3aXRoIHRoZSBjdXJyZW50IHN0b3JhZ2Ugc2V0dGluZ3MuXG5cdCovXG5cdGdldCBhbmFseXRpY3MoKSB7XG5cdFx0cmV0dXJuIG5ldyBTdG9yYWdlQW5hbHl0aWNzQ2xpZW50KHRoaXMudXJsICsgXCIvaWNlYmVyZ1wiLCB0aGlzLmhlYWRlcnMsIHRoaXMuZmV0Y2gpO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IFN0b3JhZ2VBbmFseXRpY3NDbGllbnQsIFN0b3JhZ2VBcGlFcnJvciwgU3RvcmFnZUNsaWVudCwgU3RvcmFnZUVycm9yLCBTdG9yYWdlVW5rbm93bkVycm9yLCBTdG9yYWdlVmVjdG9yc0FwaUVycm9yLCBTdG9yYWdlVmVjdG9yc0NsaWVudCwgU3RvcmFnZVZlY3RvcnNFcnJvciwgU3RvcmFnZVZlY3RvcnNFcnJvckNvZGUsIFN0b3JhZ2VWZWN0b3JzVW5rbm93bkVycm9yLCBWZWN0b3JCdWNrZXRBcGksIFZlY3RvckJ1Y2tldFNjb3BlLCBWZWN0b3JEYXRhQXBpLCBWZWN0b3JJbmRleEFwaSwgVmVjdG9ySW5kZXhTY29wZSwgaXNQbGFpbk9iamVjdCwgaXNTdG9yYWdlRXJyb3IsIGlzU3RvcmFnZVZlY3RvcnNFcnJvciwgbm9ybWFsaXplVG9GbG9hdDMyLCByZXNvbHZlRmV0Y2gsIHJlc29sdmVSZXNwb25zZSwgdmFsaWRhdGVWZWN0b3JEaW1lbnNpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXAiXSwibmFtZXMiOlsiSWNlYmVyZ1Jlc3RDYXRhbG9nIiwiU3RvcmFnZUVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsIm1lc3NhZ2UiLCJfX2lzU3RvcmFnZUVycm9yIiwibmFtZSIsImlzU3RvcmFnZUVycm9yIiwiZXJyb3IiLCJTdG9yYWdlQXBpRXJyb3IiLCJzdGF0dXMiLCJzdGF0dXNDb2RlIiwidG9KU09OIiwiU3RvcmFnZVVua25vd25FcnJvciIsIm9yaWdpbmFsRXJyb3IiLCJyZXNvbHZlRmV0Y2gkMSIsImN1c3RvbUZldGNoIiwiYXJncyIsImZldGNoIiwicmVzb2x2ZVJlc3BvbnNlJDEiLCJSZXNwb25zZSIsInJlY3Vyc2l2ZVRvQ2FtZWwiLCJpdGVtIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiZWwiLCJPYmplY3QiLCJyZXN1bHQiLCJlbnRyaWVzIiwiZm9yRWFjaCIsImtleSIsInZhbHVlIiwibmV3S2V5IiwicmVwbGFjZSIsImMiLCJ0b1VwcGVyQ2FzZSIsImlzUGxhaW5PYmplY3QkMSIsInByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJpdGVyYXRvciIsImlzVmFsaWRCdWNrZXROYW1lIiwiYnVja2V0TmFtZSIsImxlbmd0aCIsInRyaW0iLCJpbmNsdWRlcyIsInRlc3QiLCJfdHlwZW9mIiwibyIsIm8kMSIsInRvUHJpbWl0aXZlIiwidCIsInIiLCJlIiwiaSIsImNhbGwiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJ0b1Byb3BlcnR5S2V5IiwiX2RlZmluZVByb3BlcnR5IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsInIkMSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQyIiwiYXJndW1lbnRzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfZ2V0RXJyb3JNZXNzYWdlJDEiLCJlcnIiLCJfZXJyJGVycm9yIiwibXNnIiwiZXJyb3JfZGVzY3JpcHRpb24iLCJKU09OIiwic3RyaW5naWZ5IiwiaGFuZGxlRXJyb3IkMSIsInJlamVjdCIsIm9wdGlvbnMiLCJub1Jlc29sdmVKc29uIiwianNvbiIsInRoZW4iLCJjYXRjaCIsIl9nZXRSZXF1ZXN0UGFyYW1zJDEiLCJtZXRob2QiLCJwYXJhbWV0ZXJzIiwiYm9keSIsInBhcmFtcyIsImhlYWRlcnMiLCJkdXBsZXgiLCJfaGFuZGxlUmVxdWVzdCQxIiwiZmV0Y2hlciIsInVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwib2siLCJkYXRhIiwiZ2V0IiwicG9zdCQxIiwicHV0IiwiaGVhZCIsInJlbW92ZSIsIlN0cmVhbURvd25sb2FkQnVpbGRlciIsImRvd25sb2FkRm4iLCJzaG91bGRUaHJvd09uRXJyb3IiLCJvbmZ1bGZpbGxlZCIsIm9ucmVqZWN0ZWQiLCJleGVjdXRlIiwiX3RoaXMiLCJfU3ltYm9sJHRvU3RyaW5nVGFnIiwiQmxvYkRvd25sb2FkQnVpbGRlciIsInByb21pc2UiLCJhc1N0cmVhbSIsImdldFByb21pc2UiLCJmaW5hbGx5Iiwib25maW5hbGx5IiwiYmxvYiIsIkRFRkFVTFRfU0VBUkNIX09QVElPTlMiLCJsaW1pdCIsIm9mZnNldCIsInNvcnRCeSIsImNvbHVtbiIsIm9yZGVyIiwiREVGQVVMVF9GSUxFX09QVElPTlMiLCJjYWNoZUNvbnRyb2wiLCJjb250ZW50VHlwZSIsInVwc2VydCIsIlN0b3JhZ2VGaWxlQXBpIiwiYnVja2V0SWQiLCJmZXRjaCQxIiwidGhyb3dPbkVycm9yIiwidXBsb2FkT3JVcGRhdGUiLCJwYXRoIiwiZmlsZUJvZHkiLCJmaWxlT3B0aW9ucyIsIm1ldGFkYXRhIiwiQmxvYiIsIkZvcm1EYXRhIiwiYXBwZW5kIiwiZW5jb2RlTWV0YWRhdGEiLCJoYXMiLCJ0b0Jhc2U2NCIsIlJlYWRhYmxlU3RyZWFtIiwicGlwZSIsImNsZWFuUGF0aCIsIl9yZW1vdmVFbXB0eUZvbGRlcnMiLCJfcGF0aCIsIl9nZXRGaW5hbFBhdGgiLCJpZCIsIklkIiwiZnVsbFBhdGgiLCJLZXkiLCJ1cGxvYWQiLCJ1cGxvYWRUb1NpZ25lZFVybCIsInRva2VuIiwiX3RoaXMzIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwidG9TdHJpbmciLCJjcmVhdGVTaWduZWRVcGxvYWRVcmwiLCJfdGhpczQiLCJzaWduZWRVcmwiLCJ1cGRhdGUiLCJtb3ZlIiwiZnJvbVBhdGgiLCJ0b1BhdGgiLCJfdGhpczYiLCJzb3VyY2VLZXkiLCJkZXN0aW5hdGlvbktleSIsImRlc3RpbmF0aW9uQnVja2V0IiwiY29weSIsIl90aGlzNyIsImNyZWF0ZVNpZ25lZFVybCIsImV4cGlyZXNJbiIsIl90aGlzOCIsInRyYW5zZm9ybSIsImRvd25sb2FkUXVlcnlQYXJhbSIsImRvd25sb2FkIiwiZW5jb2RlVVJJIiwic2lnbmVkVVJMIiwiY3JlYXRlU2lnbmVkVXJscyIsInBhdGhzIiwiX3RoaXM5IiwiZGF0dW0iLCJyZW5kZXJQYXRoIiwidHJhbnNmb3JtYXRpb25RdWVyeSIsInRyYW5zZm9ybU9wdHNUb1F1ZXJ5U3RyaW5nIiwicXVlcnlTdHJpbmciLCJpbmZvIiwiX3RoaXMxMCIsImV4aXN0cyIsIl90aGlzMTEiLCJnZXRQdWJsaWNVcmwiLCJfcXVlcnlTdHJpbmciLCJqb2luIiwicHVibGljVXJsIiwiX3RoaXMxMiIsInByZWZpeGVzIiwibGlzdCIsIl90aGlzMTMiLCJwcmVmaXgiLCJsaXN0VjIiLCJfdGhpczE0IiwiQnVmZmVyIiwiZnJvbSIsImJ0b2EiLCJ3aWR0aCIsImhlaWdodCIsInJlc2l6ZSIsImZvcm1hdCIsInF1YWxpdHkiLCJ2ZXJzaW9uIiwiREVGQVVMVF9IRUFERVJTJDEiLCJTdG9yYWdlQnVja2V0QXBpIiwib3B0cyIsImJhc2VVcmwiLCJ1c2VOZXdIb3N0bmFtZSIsImhvc3RuYW1lIiwiaHJlZiIsImxpc3RCdWNrZXRzIiwibGlzdEJ1Y2tldE9wdGlvbnNUb1F1ZXJ5U3RyaW5nIiwiZ2V0QnVja2V0IiwiX3RoaXMyIiwiY3JlYXRlQnVja2V0IiwicHVibGljIiwidHlwZSIsImZpbGVfc2l6ZV9saW1pdCIsImZpbGVTaXplTGltaXQiLCJhbGxvd2VkX21pbWVfdHlwZXMiLCJhbGxvd2VkTWltZVR5cGVzIiwidXBkYXRlQnVja2V0IiwiZW1wdHlCdWNrZXQiLCJfdGhpczUiLCJkZWxldGVCdWNrZXQiLCJzZWFyY2giLCJzb3J0Q29sdW1uIiwic29ydE9yZGVyIiwiVVJMU2VhcmNoUGFyYW1zIiwiU3RvcmFnZUFuYWx5dGljc0NsaWVudCIsInF1ZXJ5UGFyYW1zIiwiY2F0YWxvZyIsImNhdGFsb2dOYW1lIiwiYXV0aCIsImdldEhlYWRlcnMiLCJQcm94eSIsInRhcmdldCIsInByb3AiLCJERUZBVUxUX0hFQURFUlMiLCJTdG9yYWdlVmVjdG9yc0Vycm9yIiwiX19pc1N0b3JhZ2VWZWN0b3JzRXJyb3IiLCJpc1N0b3JhZ2VWZWN0b3JzRXJyb3IiLCJTdG9yYWdlVmVjdG9yc0FwaUVycm9yIiwiU3RvcmFnZVZlY3RvcnNVbmtub3duRXJyb3IiLCJTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSIsIlN0b3JhZ2VWZWN0b3JzRXJyb3JDb2RlJDEiLCJyZXNvbHZlRmV0Y2giLCJyZXNvbHZlUmVzcG9uc2UiLCJpc1BsYWluT2JqZWN0Iiwibm9ybWFsaXplVG9GbG9hdDMyIiwidmFsdWVzIiwiRmxvYXQzMkFycmF5IiwidmFsaWRhdGVWZWN0b3JEaW1lbnNpb24iLCJ2ZWN0b3IiLCJleHBlY3RlZERpbWVuc2lvbiIsImZsb2F0MzIiLCJfZ2V0RXJyb3JNZXNzYWdlIiwiaGFuZGxlRXJyb3IiLCJyZXNwb25zZUVycm9yIiwiY29kZSIsInN0YXR1c1RleHQiLCJfZ2V0UmVxdWVzdFBhcmFtcyIsIl9oYW5kbGVSZXF1ZXN0IiwicG9zdCIsIlZlY3RvckluZGV4QXBpIiwiY3JlYXRlSW5kZXgiLCJnZXRJbmRleCIsInZlY3RvckJ1Y2tldE5hbWUiLCJpbmRleE5hbWUiLCJsaXN0SW5kZXhlcyIsImRlbGV0ZUluZGV4IiwiVmVjdG9yRGF0YUFwaSIsInB1dFZlY3RvcnMiLCJ2ZWN0b3JzIiwiZ2V0VmVjdG9ycyIsImxpc3RWZWN0b3JzIiwic2VnbWVudENvdW50Iiwic2VnbWVudEluZGV4IiwicXVlcnlWZWN0b3JzIiwiZGVsZXRlVmVjdG9ycyIsIlZlY3RvckJ1Y2tldEFwaSIsIlN0b3JhZ2VWZWN0b3JzQ2xpZW50IiwiVmVjdG9yQnVja2V0U2NvcGUiLCJfc3VwZXJwcm9wX2dldENyZWF0ZUJ1Y2tldCIsIl9zdXBlcnByb3BfZ2V0R2V0QnVja2V0IiwiX3N1cGVycHJvcF9nZXRMaXN0QnVja2V0cyIsIl9zdXBlcnByb3BfZ2V0RGVsZXRlQnVja2V0IiwiX3N1cGVycHJvcF9nZXRDcmVhdGVJbmRleCIsIl9zdXBlcnByb3BfZ2V0TGlzdEluZGV4ZXMiLCJfc3VwZXJwcm9wX2dldEdldEluZGV4IiwiX3N1cGVycHJvcF9nZXREZWxldGVJbmRleCIsImluZGV4IiwiVmVjdG9ySW5kZXhTY29wZSIsIl9zdXBlcnByb3BfZ2V0UHV0VmVjdG9ycyIsIl9zdXBlcnByb3BfZ2V0R2V0VmVjdG9ycyIsIl9zdXBlcnByb3BfZ2V0TGlzdFZlY3RvcnMiLCJfc3VwZXJwcm9wX2dldFF1ZXJ5VmVjdG9ycyIsIl9zdXBlcnByb3BfZ2V0RGVsZXRlVmVjdG9ycyIsIlN0b3JhZ2VDbGllbnQiLCJhbmFseXRpY3MiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/storage-js/dist/index.mjs\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/storage-js/dist/index.mjs":
|
||
/*!**********************************************************!*\
|
||
!*** ./node_modules/@supabase/storage-js/dist/index.mjs ***!
|
||
\**********************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StorageAnalyticsClient: () => (/* binding */ StorageAnalyticsClient),\n/* harmony export */ StorageApiError: () => (/* binding */ StorageApiError),\n/* harmony export */ StorageClient: () => (/* binding */ StorageClient),\n/* harmony export */ StorageError: () => (/* binding */ StorageError),\n/* harmony export */ StorageUnknownError: () => (/* binding */ StorageUnknownError),\n/* harmony export */ StorageVectorsApiError: () => (/* binding */ StorageVectorsApiError),\n/* harmony export */ StorageVectorsClient: () => (/* binding */ StorageVectorsClient),\n/* harmony export */ StorageVectorsError: () => (/* binding */ StorageVectorsError),\n/* harmony export */ StorageVectorsErrorCode: () => (/* binding */ StorageVectorsErrorCode),\n/* harmony export */ StorageVectorsUnknownError: () => (/* binding */ StorageVectorsUnknownError),\n/* harmony export */ VectorBucketApi: () => (/* binding */ VectorBucketApi),\n/* harmony export */ VectorBucketScope: () => (/* binding */ VectorBucketScope),\n/* harmony export */ VectorDataApi: () => (/* binding */ VectorDataApi),\n/* harmony export */ VectorIndexApi: () => (/* binding */ VectorIndexApi),\n/* harmony export */ VectorIndexScope: () => (/* binding */ VectorIndexScope),\n/* harmony export */ isPlainObject: () => (/* binding */ isPlainObject),\n/* harmony export */ isStorageError: () => (/* binding */ isStorageError),\n/* harmony export */ isStorageVectorsError: () => (/* binding */ isStorageVectorsError),\n/* harmony export */ normalizeToFloat32: () => (/* binding */ normalizeToFloat32),\n/* harmony export */ resolveFetch: () => (/* binding */ resolveFetch),\n/* harmony export */ resolveResponse: () => (/* binding */ resolveResponse),\n/* harmony export */ validateVectorDimension: () => (/* binding */ validateVectorDimension)\n/* harmony export */ });\n/* harmony import */ var iceberg_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! iceberg-js */ \"(rsc)/./node_modules/iceberg-js/dist/index.mjs\");\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 constructor(message, status, statusCode){\n super(message);\n this.name = \"StorageApiError\";\n this.status = status;\n this.statusCode = statusCode;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n statusCode: this.statusCode\n };\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 (...args)=>customFetch(...args);\n return (...args)=>fetch(...args);\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(([key, value])=>{\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 constructor(downloadFn, shouldThrowOnError){\n this.downloadFn = downloadFn;\n this.shouldThrowOnError = shouldThrowOnError;\n }\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};\n//#endregion\n//#region src/packages/BlobDownloadBuilder.ts\nlet _Symbol$toStringTag;\n_Symbol$toStringTag = Symbol.toStringTag;\nvar BlobDownloadBuilder = class {\n constructor(downloadFn, shouldThrowOnError){\n this.downloadFn = downloadFn;\n this.shouldThrowOnError = shouldThrowOnError;\n this[_Symbol$toStringTag] = \"BlobDownloadBuilder\";\n this.promise = null;\n }\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};\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 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\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=${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, `${_this.url}/object/${_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/${_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=${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, `${_this4.url}/object/upload/sign/${_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, `${_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, `${_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, `${_this8.url}/object/sign/${_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=${options.download === true ? \"\" : options.download}` : \"\";\n data = {\n signedUrl: encodeURI(`${_this8.url}${data.signedURL}${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, `${_this9.url}/object/sign/${_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=${options.download === true ? \"\" : options.download}` : \"\";\n return {\n data: data.map((datum)=>_objectSpread2(_objectSpread2({}, datum), {}, {\n signedUrl: datum.signedURL ? encodeURI(`${_this9.url}${datum.signedURL}${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 ? `?${transformationQuery}` : \"\";\n const _path = this._getFinalPath(path);\n const downloadFn = ()=>get(this.fetch, `${this.url}/${renderPath}/${_path}${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, `${_this10.url}/object/info/${_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, `${_this11.url}/object/${_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=${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 = `?${queryString}`;\n return {\n data: {\n publicUrl: encodeURI(`${this.url}/${renderPath}/public/${_path}${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, `${_this12.url}/object/${_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, `${_this13.url}/object/list/${_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, `${_this14.url}/object/list-v2/${_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 `${this.bucketId}/${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=${transform.width}`);\n if (transform.height) params.push(`height=${transform.height}`);\n if (transform.resize) params.push(`resize=${transform.resize}`);\n if (transform.format) params.push(`format=${transform.format}`);\n if (transform.quality) params.push(`quality=${transform.quality}`);\n return params.join(\"&\");\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/${version}`\n};\n//#endregion\n//#region src/packages/StorageBucketApi.ts\nvar StorageBucketApi = class {\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\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, `${_this.url}/bucket${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, `${_this2.url}/bucket/${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, options = {\n public: false\n }) {\n var _this3 = this;\n try {\n return {\n data: await post$1(_this3.fetch, `${_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, `${_this4.url}/bucket/${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, `${_this5.url}/bucket/${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, `${_this6.url}/bucket/${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};\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* 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\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, `${_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 ? `${_this2.url}/bucket?${queryString}` : `${_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, `${_this3.url}/bucket/${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 (...args)=>{\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//#endregion\n//#region src/lib/vectors/constants.ts\nconst DEFAULT_HEADERS = {\n \"X-Client-Info\": `storage-js/${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 constructor(message, status, statusCode){\n super(message);\n this.name = \"StorageVectorsApiError\";\n this.status = status;\n this.statusCode = statusCode;\n }\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n statusCode: this.statusCode\n };\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 (...args)=>customFetch(...args);\n return (...args)=>fetch(...args);\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 ${expectedDimension}, got ${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 ${status} error`, status, statusCode));\n });\n else {\n const statusCode = status + \"\";\n reject(new StorageVectorsApiError(responseError.statusText || `HTTP ${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 /** 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 /** 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, `${_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, `${_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, `${_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, `${_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};\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 /** 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 /** 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, `${_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, `${_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 ${options.segmentCount - 1}`);\n }\n }\n return {\n data: await post(_this3.fetch, `${_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, `${_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, `${_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};\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 /** 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 /** 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, `${_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, `${_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(options = {}) {\n var _this3 = this;\n try {\n return {\n data: await post(_this3.fetch, `${_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, `${_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};\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* @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\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(options = {}) {\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/**\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* @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\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(options = {}) {\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/**\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* 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\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(options = {}) {\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//#endregion\n//#region src/StorageClient.ts\nvar StorageClient = class extends StorageBucketApi {\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\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//#endregion\n //# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3N0b3JhZ2UtanMvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBZ0Q7QUFFaEQsMkJBQTJCO0FBQzNCLElBQUlDLGVBQWUsY0FBY0M7SUFDaENDLFlBQVlDLE9BQU8sQ0FBRTtRQUNwQixLQUFLLENBQUNBO1FBQ04sSUFBSSxDQUFDQyxnQkFBZ0IsR0FBRztRQUN4QixJQUFJLENBQUNDLElBQUksR0FBRztJQUNiO0FBQ0Q7QUFDQSxTQUFTQyxlQUFlQyxLQUFLO0lBQzVCLE9BQU8sT0FBT0EsVUFBVSxZQUFZQSxVQUFVLFFBQVEsc0JBQXNCQTtBQUM3RTtBQUNBLElBQUlDLGtCQUFrQixjQUFjUjtJQUNuQ0UsWUFBWUMsT0FBTyxFQUFFTSxNQUFNLEVBQUVDLFVBQVUsQ0FBRTtRQUN4QyxLQUFLLENBQUNQO1FBQ04sSUFBSSxDQUFDRSxJQUFJLEdBQUc7UUFDWixJQUFJLENBQUNJLE1BQU0sR0FBR0E7UUFDZCxJQUFJLENBQUNDLFVBQVUsR0FBR0E7SUFDbkI7SUFDQUMsU0FBUztRQUNSLE9BQU87WUFDTk4sTUFBTSxJQUFJLENBQUNBLElBQUk7WUFDZkYsU0FBUyxJQUFJLENBQUNBLE9BQU87WUFDckJNLFFBQVEsSUFBSSxDQUFDQSxNQUFNO1lBQ25CQyxZQUFZLElBQUksQ0FBQ0EsVUFBVTtRQUM1QjtJQUNEO0FBQ0Q7QUFDQSxJQUFJRSxzQkFBc0IsY0FBY1o7SUFDdkNFLFlBQVlDLE9BQU8sRUFBRVUsYUFBYSxDQUFFO1FBQ25DLEtBQUssQ0FBQ1Y7UUFDTixJQUFJLENBQUNFLElBQUksR0FBRztRQUNaLElBQUksQ0FBQ1EsYUFBYSxHQUFHQTtJQUN0QjtBQUNEO0FBRUEsWUFBWTtBQUNaLDRCQUE0QjtBQUM1QixNQUFNQyxpQkFBaUIsQ0FBQ0M7SUFDdkIsSUFBSUEsYUFBYSxPQUFPLENBQUMsR0FBR0MsT0FBU0QsZUFBZUM7SUFDcEQsT0FBTyxD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O1FBQzNFLE9BQU8yRyw4QkFBOEJwUSxJQUFJLENBQUN5SixTQUFTdkksZUFBZUEsZUFBZSxDQUFDLEdBQUdhLFVBQVUsQ0FBQyxHQUFHO1lBQ2xHdU0sa0JBQWtCN0UsUUFBUTZFLGdCQUFnQjtZQUMxQ0MsV0FBVzlFLFFBQVE4RSxTQUFTO1FBQzdCO0lBQ0Q7QUFDRDtBQUVBLFlBQVk7QUFDWiw4QkFBOEI7QUFDOUIsSUFBSThCLGdCQUFnQixjQUFjOUY7SUFDakM7Ozs7Ozs7Ozs7Ozs7Q0FhQSxHQUNBN04sWUFBWW1HLEdBQUcsRUFBRUosVUFBVSxDQUFDLENBQUMsRUFBRXlDLE9BQU8sRUFBRXNGLElBQUksQ0FBRTtRQUM3QyxLQUFLLENBQUMzSCxLQUFLSixTQUFTeUMsU0FBU3NGO0lBQzlCO0lBQ0E7Ozs7Ozs7Ozs7Q0FVQSxHQUNBVixLQUFLekQsRUFBRSxFQUFFO1FBQ1IsT0FBTyxJQUFJckIsZUFBZSxJQUFJLENBQUNuQyxHQUFHLEVBQUUsSUFBSSxDQUFDSixPQUFPLEVBQUU0RCxJQUFJLElBQUksQ0FBQzVJLEtBQUs7SUFDakU7SUFDQTs7Ozs7Ozs7OztDQVVBLEdBQ0EsSUFBSW1SLFVBQVU7UUFDYixPQUFPLElBQUlRLHFCQUFxQixJQUFJLENBQUN2TSxHQUFHLEdBQUcsV0FBVztZQUNyREosU0FBUyxJQUFJLENBQUNBLE9BQU87WUFDckJoRixPQUFPLElBQUksQ0FBQ0EsS0FBSztRQUNsQjtJQUNEO0lBQ0E7Ozs7Ozs7Ozs7Q0FVQSxHQUNBLElBQUk2UyxZQUFZO1FBQ2YsT0FBTyxJQUFJdEUsdUJBQXVCLElBQUksQ0FBQ25KLEdBQUcsR0FBRyxZQUFZLElBQUksQ0FBQ0osT0FBTyxFQUFFLElBQUksQ0FBQ2hGLEtBQUs7SUFDbEY7QUFDRDtBQUVBLFlBQVk7QUFDd2EsQ0FDcGIsa0NBQWtDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9zdG9yYWdlLWpzL2Rpc3QvaW5kZXgubWpzP2ViMzQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSWNlYmVyZ1Jlc3RDYXRhbG9nIH0gZnJvbSBcImljZWJlcmctanNcIjtcblxuLy8jcmVnaW9uIHNyYy9saWIvZXJyb3JzLnRzXG52YXIgU3RvcmFnZUVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzLl9faXNTdG9yYWdlRXJyb3IgPSB0cnVlO1xuXHRcdHRoaXMubmFtZSA9IFwiU3RvcmFnZUVycm9yXCI7XG5cdH1cbn07XG5mdW5jdGlvbiBpc1N0b3JhZ2VFcnJvcihlcnJvcikge1xuXHRyZXR1cm4gdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiICYmIGVycm9yICE9PSBudWxsICYmIFwiX19pc1N0b3JhZ2VFcnJvclwiIGluIGVycm9yO1xufVxudmFyIFN0b3JhZ2VBcGlFcnJvciA9IGNsYXNzIGV4dGVuZHMgU3RvcmFnZUVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCBzdGF0dXNDb2RlKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gXCJTdG9yYWdlQXBpRXJyb3JcIjtcblx0XHR0aGlzLnN0YXR1cyA9IHN0YXR1cztcblx0XHR0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuXHR9XG5cdHRvSlNPTigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bmFtZTogdGhpcy5uYW1lLFxuXHRcdFx0bWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuXHRcdFx0c3RhdHVzOiB0aGlzLnN0YXR1cyxcblx0XHRcdHN0YXR1c0NvZGU6IHRoaXMuc3RhdHVzQ29kZVxuXHRcdH07XG5cdH1cbn07XG52YXIgU3RvcmFnZVVua25vd25FcnJvciA9IGNsYXNzIGV4dGVuZHMgU3RvcmFnZUVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSwgb3JpZ2luYWxFcnJvcikge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IFwiU3RvcmFnZVVua25vd25FcnJvclwiO1xuXHRcdHRoaXMub3JpZ2luYWxFcnJvciA9IG9yaWdpbmFsRXJyb3I7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvaGVscGVycy50c1xuY29uc3QgcmVzb2x2ZUZldGNoJDEgPSAoY3VzdG9tRmV0Y2gpID0+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+IHN1cGVyLmNyZWF0ZUluZGV4LCBfdGhpczUgPSB0aGlzO1xuXHRcdHJldHVybiBfc3VwZXJwcm9wX2dldENyZWF0ZUluZGV4KCkuY2FsbChfdGhpczUsIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHsgdmVjdG9yQnVja2V0TmFtZTogX3RoaXM1LnZlY3RvckJ1Y2tldE5hbWUgfSkpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBMaXN0cyBpbmRleGVzIGluIHRoaXMgYnVja2V0XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgYnVja2V0IG5hbWVcblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAcGFyYW0gb3B0aW9ucyAtIExpc3Rpbmcgb3B0aW9ucyAodmVjdG9yQnVja2V0TmFtZSBpcyBhdXRvbWF0aWNhbGx5IHNldClcblx0KiBAcmV0dXJucyBQcm9taXNlIHdpdGggcmVzcG9uc2UgY29udGFpbmluZyBpbmRleGVzIGFycmF5IGFuZCBwYWdpbmF0aW9uIHRva2VuIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGJ1Y2tldC5saXN0SW5kZXhlcyh7IHByZWZpeDogJ2RvY3VtZW50cy0nIH0pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGxpc3RJbmRleGVzKG9wdGlvbnMgPSB7fSkge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldExpc3RJbmRleGVzID0gKCkgPT4gc3VwZXIubGlzdEluZGV4ZXMsIF90aGlzNiA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0TGlzdEluZGV4ZXMoKS5jYWxsKF90aGlzNiwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwgeyB2ZWN0b3JCdWNrZXROYW1lOiBfdGhpczYudmVjdG9yQnVja2V0TmFtZSB9KSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIFJldHJpZXZlcyBtZXRhZGF0YSBmb3IgYSBzcGVjaWZpYyBpbmRleCBpbiB0aGlzIGJ1Y2tldFxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGJ1Y2tldCBuYW1lXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIGluZGV4TmFtZSAtIE5hbWUgb2YgdGhlIGluZGV4IHRvIHJldHJpZXZlXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIGluZGV4IG1ldGFkYXRhIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGJ1Y2tldC5nZXRJbmRleCgnZG9jdW1lbnRzLW9wZW5haScpXG5cdCogY29uc29sZS5sb2coJ0RpbWVuc2lvbjonLCBkYXRhPy5pbmRleC5kaW1lbnNpb24pXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGdldEluZGV4KGluZGV4TmFtZSkge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldEdldEluZGV4ID0gKCkgPT4gc3VwZXIuZ2V0SW5kZXgsIF90aGlzNyA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0R2V0SW5kZXgoKS5jYWxsKF90aGlzNywgX3RoaXM3LnZlY3RvckJ1Y2tldE5hbWUsIGluZGV4TmFtZSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIERlbGV0ZXMgYW4gaW5kZXggZnJvbSB0aGlzIGJ1Y2tldFxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGJ1Y2tldCBuYW1lXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIGluZGV4TmFtZSAtIE5hbWUgb2YgdGhlIGluZGV4IHRvIGRlbGV0ZVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBlbXB0eSByZXNwb25zZSBvbiBzdWNjZXNzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBidWNrZXQgPSBzdXBhYmFzZS5zdG9yYWdlLnZlY3RvcnMuZnJvbSgnZW1iZWRkaW5ncy1wcm9kJylcblx0KiBhd2FpdCBidWNrZXQuZGVsZXRlSW5kZXgoJ29sZC1pbmRleCcpXG5cdCogYGBgXG5cdCovXG5cdGFzeW5jIGRlbGV0ZUluZGV4KGluZGV4TmFtZSkge1xuXHRcdHZhciBfc3VwZXJwcm9wX2dldERlbGV0ZUluZGV4ID0gKCkgPT4gc3VwZXIuZGVsZXRlSW5kZXgsIF90aGlzOCA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0RGVsZXRlSW5kZXgoKS5jYWxsKF90aGlzOCwgX3RoaXM4LnZlY3RvckJ1Y2tldE5hbWUsIGluZGV4TmFtZSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIEFjY2VzcyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIGluZGV4IHdpdGhpbiB0aGlzIGJ1Y2tldFxuXHQqIFJldHVybnMgYSBzY29wZWQgY2xpZW50IGZvciB2ZWN0b3IgZGF0YSBvcGVyYXRpb25zXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIGluZGV4TmFtZSAtIE5hbWUgb2YgdGhlIGluZGV4XG5cdCogQHJldHVybnMgSW5kZXgtc2NvcGVkIGNsaWVudCB3aXRoIHZlY3RvciBkYXRhIG9wZXJhdGlvbnNcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KlxuXHQqIC8vIEluc2VydCB2ZWN0b3JzXG5cdCogYXdhaXQgaW5kZXgucHV0VmVjdG9ycyh7XG5cdCogICB2ZWN0b3JzOiBbXG5cdCogICAgIHsga2V5OiAnZG9jLTEnLCBkYXRhOiB7IGZsb2F0MzI6IFsuLi5dIH0sIG1ldGFkYXRhOiB7IHRpdGxlOiAnSW50cm8nIH0gfVxuXHQqICAgXVxuXHQqIH0pXG5cdCpcblx0KiAvLyBRdWVyeSBzaW1pbGFyIHZlY3RvcnNcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4LnF1ZXJ5VmVjdG9ycyh7XG5cdCogICBxdWVyeVZlY3RvcjogeyBmbG9hdDMyOiBbLi4uXSB9LFxuXHQqICAgdG9wSzogNVxuXHQqIH0pXG5cdCogYGBgXG5cdCovXG5cdGluZGV4KGluZGV4TmFtZSkge1xuXHRcdHJldHVybiBuZXcgVmVjdG9ySW5kZXhTY29wZSh0aGlzLnVybCwgdGhpcy5oZWFkZXJzLCB0aGlzLnZlY3RvckJ1Y2tldE5hbWUsIGluZGV4TmFtZSwgdGhpcy5mZXRjaCk7XG5cdH1cbn07XG4vKipcbipcbiogQGFscGhhXG4qXG4qIFNjb3BlZCBjbGllbnQgZm9yIG9wZXJhdGlvbnMgd2l0aGluIGEgc3BlY2lmaWMgdmVjdG9yIGluZGV4XG4qIFByb3ZpZGVzIHZlY3RvciBkYXRhIG9wZXJhdGlvbnMgKHB1dCwgZ2V0LCBsaXN0LCBxdWVyeSwgZGVsZXRlKVxuKlxuKiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuKi9cbnZhciBWZWN0b3JJbmRleFNjb3BlID0gY2xhc3MgZXh0ZW5kcyBWZWN0b3JEYXRhQXBpIHtcblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIENyZWF0ZXMgYSBoZWxwZXIgdGhhdCBhdXRvbWF0aWNhbGx5IHNjb3BlcyBhbGwgdmVjdG9yIG9wZXJhdGlvbnMgdG8gdGhlIHByb3ZpZGVkIGJ1Y2tldC9pbmRleCBuYW1lcy5cblx0KlxuXHQqICoqUHVibGljIGFscGhhOioqIFRoaXMgQVBJIGlzIHBhcnQgb2YgYSBwdWJsaWMgYWxwaGEgcmVsZWFzZSBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgdG8geW91ciBhY2NvdW50IHR5cGUuXG5cdCpcblx0KiBAY2F0ZWdvcnkgVmVjdG9yIEJ1Y2tldHNcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBpbmRleCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKS5pbmRleCgnZG9jdW1lbnRzLW9wZW5haScpXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKHVybCwgaGVhZGVycywgdmVjdG9yQnVja2V0TmFtZSwgaW5kZXhOYW1lLCBmZXRjaCQxKSB7XG5cdFx0c3VwZXIodXJsLCBoZWFkZXJzLCBmZXRjaCQxKTtcblx0XHR0aGlzLnZlY3RvckJ1Y2tldE5hbWUgPSB2ZWN0b3JCdWNrZXROYW1lO1xuXHRcdHRoaXMuaW5kZXhOYW1lID0gaW5kZXhOYW1lO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBJbnNlcnRzIG9yIHVwZGF0ZXMgdmVjdG9ycyBpbiB0aGlzIGluZGV4XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyBidWNrZXQgYW5kIGluZGV4IG5hbWVzXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBWZWN0b3IgaW5zZXJ0aW9uIG9wdGlvbnMgKGJ1Y2tldCBhbmQgaW5kZXggbmFtZXMgYXV0b21hdGljYWxseSBzZXQpXG5cdCogQHJldHVybnMgUHJvbWlzZSB3aXRoIGVtcHR5IHJlc3BvbnNlIG9uIHN1Y2Nlc3Mgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBhd2FpdCBpbmRleC5wdXRWZWN0b3JzKHtcblx0KiAgIHZlY3RvcnM6IFtcblx0KiAgICAge1xuXHQqICAgICAgIGtleTogJ2RvYy0xJyxcblx0KiAgICAgICBkYXRhOiB7IGZsb2F0MzI6IFswLjEsIDAuMiwgLi4uXSB9LFxuXHQqICAgICAgIG1ldGFkYXRhOiB7IHRpdGxlOiAnSW50cm9kdWN0aW9uJywgcGFnZTogMSB9XG5cdCogICAgIH1cblx0KiAgIF1cblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBwdXRWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRQdXRWZWN0b3JzID0gKCkgPT4gc3VwZXIucHV0VmVjdG9ycywgX3RoaXM5ID0gdGhpcztcblx0XHRyZXR1cm4gX3N1cGVycHJvcF9nZXRQdXRWZWN0b3JzKCkuY2FsbChfdGhpczksIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHtcblx0XHRcdHZlY3RvckJ1Y2tldE5hbWU6IF90aGlzOS52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczkuaW5kZXhOYW1lXG5cdFx0fSkpO1xuXHR9XG5cdC8qKlxuXHQqXG5cdCogQGFscGhhXG5cdCpcblx0KiBSZXRyaWV2ZXMgdmVjdG9ycyBieSBrZXlzIGZyb20gdGhpcyBpbmRleFxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgYnVja2V0IGFuZCBpbmRleCBuYW1lc1xuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBwYXJhbSBvcHRpb25zIC0gVmVjdG9yIHJldHJpZXZhbCBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIHZlY3RvcnMgYXJyYXkgb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4LmdldFZlY3RvcnMoe1xuXHQqICAga2V5czogWydkb2MtMScsICdkb2MtMiddLFxuXHQqICAgcmV0dXJuTWV0YWRhdGE6IHRydWVcblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBnZXRWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRHZXRWZWN0b3JzID0gKCkgPT4gc3VwZXIuZ2V0VmVjdG9ycywgX3RoaXMxMCA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0R2V0VmVjdG9ycygpLmNhbGwoX3RoaXMxMCwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwge1xuXHRcdFx0dmVjdG9yQnVja2V0TmFtZTogX3RoaXMxMC52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczEwLmluZGV4TmFtZVxuXHRcdH0pKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogTGlzdHMgdmVjdG9ycyBpbiB0aGlzIGluZGV4IHdpdGggcGFnaW5hdGlvblxuXHQqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgYnVja2V0IGFuZCBpbmRleCBuYW1lc1xuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEBwYXJhbSBvcHRpb25zIC0gTGlzdGluZyBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIHZlY3RvcnMgYXJyYXkgYW5kIHBhZ2luYXRpb24gdG9rZW4gb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4Lmxpc3RWZWN0b3JzKHtcblx0KiAgIG1heFJlc3VsdHM6IDUwMCxcblx0KiAgIHJldHVybk1ldGFkYXRhOiB0cnVlXG5cdCogfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgbGlzdFZlY3RvcnMob3B0aW9ucyA9IHt9KSB7XG5cdFx0dmFyIF9zdXBlcnByb3BfZ2V0TGlzdFZlY3RvcnMgPSAoKSA9PiBzdXBlci5saXN0VmVjdG9ycywgX3RoaXMxMSA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0TGlzdFZlY3RvcnMoKS5jYWxsKF90aGlzMTEsIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHtcblx0XHRcdHZlY3RvckJ1Y2tldE5hbWU6IF90aGlzMTEudmVjdG9yQnVja2V0TmFtZSxcblx0XHRcdGluZGV4TmFtZTogX3RoaXMxMS5pbmRleE5hbWVcblx0XHR9KSk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIFF1ZXJpZXMgZm9yIHNpbWlsYXIgdmVjdG9ycyBpbiB0aGlzIGluZGV4XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyBidWNrZXQgYW5kIGluZGV4IG5hbWVzXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBRdWVyeSBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCByZXNwb25zZSBjb250YWluaW5nIG1hdGNoZXMgYXJyYXkgb2Ygc2ltaWxhciB2ZWN0b3JzIG9yZGVyZWQgYnkgZGlzdGFuY2Ugb3IgZXJyb3Jcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGluZGV4ID0gc3VwYWJhc2Uuc3RvcmFnZS52ZWN0b3JzLmZyb20oJ2VtYmVkZGluZ3MtcHJvZCcpLmluZGV4KCdkb2N1bWVudHMtb3BlbmFpJylcblx0KiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGluZGV4LnF1ZXJ5VmVjdG9ycyh7XG5cdCogICBxdWVyeVZlY3RvcjogeyBmbG9hdDMyOiBbMC4xLCAwLjIsIC4uLl0gfSxcblx0KiAgIHRvcEs6IDUsXG5cdCogICBmaWx0ZXI6IHsgY2F0ZWdvcnk6ICd0ZWNobmljYWwnIH0sXG5cdCogICByZXR1cm5EaXN0YW5jZTogdHJ1ZSxcblx0KiAgIHJldHVybk1ldGFkYXRhOiB0cnVlXG5cdCogfSlcblx0KiBgYGBcblx0Ki9cblx0YXN5bmMgcXVlcnlWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXRRdWVyeVZlY3RvcnMgPSAoKSA9PiBzdXBlci5xdWVyeVZlY3RvcnMsIF90aGlzMTIgPSB0aGlzO1xuXHRcdHJldHVybiBfc3VwZXJwcm9wX2dldFF1ZXJ5VmVjdG9ycygpLmNhbGwoX3RoaXMxMiwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwge1xuXHRcdFx0dmVjdG9yQnVja2V0TmFtZTogX3RoaXMxMi52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczEyLmluZGV4TmFtZVxuXHRcdH0pKTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogRGVsZXRlcyB2ZWN0b3JzIGJ5IGtleXMgZnJvbSB0aGlzIGluZGV4XG5cdCogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXV0b21hdGljYWxseSBpbmNsdWRlcyBidWNrZXQgYW5kIGluZGV4IG5hbWVzXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IFZlY3RvciBCdWNrZXRzXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBEZWxldGlvbiBvcHRpb25zIChidWNrZXQgYW5kIGluZGV4IG5hbWVzIGF1dG9tYXRpY2FsbHkgc2V0KVxuXHQqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBlbXB0eSByZXNwb25zZSBvbiBzdWNjZXNzIG9yIGVycm9yXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHR5cGVzY3JpcHRcblx0KiBjb25zdCBpbmRleCA9IHN1cGFiYXNlLnN0b3JhZ2UudmVjdG9ycy5mcm9tKCdlbWJlZGRpbmdzLXByb2QnKS5pbmRleCgnZG9jdW1lbnRzLW9wZW5haScpXG5cdCogYXdhaXQgaW5kZXguZGVsZXRlVmVjdG9ycyh7XG5cdCogICBrZXlzOiBbJ2RvYy0xJywgJ2RvYy0yJywgJ2RvYy0zJ11cblx0KiB9KVxuXHQqIGBgYFxuXHQqL1xuXHRhc3luYyBkZWxldGVWZWN0b3JzKG9wdGlvbnMpIHtcblx0XHR2YXIgX3N1cGVycHJvcF9nZXREZWxldGVWZWN0b3JzID0gKCkgPT4gc3VwZXIuZGVsZXRlVmVjdG9ycywgX3RoaXMxMyA9IHRoaXM7XG5cdFx0cmV0dXJuIF9zdXBlcnByb3BfZ2V0RGVsZXRlVmVjdG9ycygpLmNhbGwoX3RoaXMxMywgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwge1xuXHRcdFx0dmVjdG9yQnVja2V0TmFtZTogX3RoaXMxMy52ZWN0b3JCdWNrZXROYW1lLFxuXHRcdFx0aW5kZXhOYW1lOiBfdGhpczEzLmluZGV4TmFtZVxuXHRcdH0pKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1N0b3JhZ2VDbGllbnQudHNcbnZhciBTdG9yYWdlQ2xpZW50ID0gY2xhc3MgZXh0ZW5kcyBTdG9yYWdlQnVja2V0QXBpIHtcblx0LyoqXG5cdCogQ3JlYXRlcyBhIGNsaWVudCBmb3IgU3RvcmFnZSBidWNrZXRzLCBmaWxlcywgYW5hbHl0aWNzLCBhbmQgdmVjdG9ycy5cblx0KlxuXHQqIEBjYXRlZ29yeSBGaWxlIEJ1Y2tldHNcblx0KiBAZXhhbXBsZVxuXHQqIGBgYHRzXG5cdCogaW1wb3J0IHsgU3RvcmFnZUNsaWVudCB9IGZyb20gJ0BzdXBhYmFzZS9zdG9yYWdlLWpzJ1xuXHQqXG5cdCogY29uc3Qgc3RvcmFnZSA9IG5ldyBTdG9yYWdlQ2xpZW50KCdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28vc3RvcmFnZS92MScsIHtcblx0KiAgIGFwaWtleTogJ3B1YmxpYy1hbm9uLWtleScsXG5cdCogfSlcblx0KiBjb25zdCBhdmF0YXJzID0gc3RvcmFnZS5mcm9tKCdhdmF0YXJzJylcblx0KiBgYGBcblx0Ki9cblx0Y29uc3RydWN0b3IodXJsLCBoZWFkZXJzID0ge30sIGZldGNoJDEsIG9wdHMpIHtcblx0XHRzdXBlcih1cmwsIGhlYWRlcnMsIGZldGNoJDEsIG9wdHMpO1xuXHR9XG5cdC8qKlxuXHQqIFBlcmZvcm0gZmlsZSBvcGVyYXRpb24gaW4gYSBidWNrZXQuXG5cdCpcblx0KiBAY2F0ZWdvcnkgRmlsZSBCdWNrZXRzXG5cdCogQHBhcmFtIGlkIFRoZSBidWNrZXQgaWQgdG8gb3BlcmF0ZSBvbi5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHlwZXNjcmlwdFxuXHQqIGNvbnN0IGF2YXRhcnMgPSBzdXBhYmFzZS5zdG9yYWdlLmZyb20oJ2F2YXRhcnMnKVxuXHQqIGBgYFxuXHQqL1xuXHRmcm9tKGlkKSB7XG5cdFx0cmV0dXJuIG5ldyBTdG9yYWdlRmlsZUFwaSh0aGlzLnVybCwgdGhpcy5oZWFkZXJzLCBpZCwgdGhpcy5mZXRjaCk7XG5cdH1cblx0LyoqXG5cdCpcblx0KiBAYWxwaGFcblx0KlxuXHQqIEFjY2VzcyB2ZWN0b3Igc3RvcmFnZSBvcGVyYXRpb25zLlxuXHQqXG5cdCogKipQdWJsaWMgYWxwaGE6KiogVGhpcyBBUEkgaXMgcGFydCBvZiBhIHB1YmxpYyBhbHBoYSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSB0byB5b3VyIGFjY291bnQgdHlwZS5cblx0KlxuXHQqIEBjYXRlZ29yeSBWZWN0b3IgQnVja2V0c1xuXHQqIEByZXR1cm5zIEEgU3RvcmFnZVZlY3RvcnNDbGllbnQgaW5zdGFuY2UgY29uZmlndXJlZCB3aXRoIHRoZSBjdXJyZW50IHN0b3JhZ2Ugc2V0dGluZ3MuXG5cdCovXG5cdGdldCB2ZWN0b3JzKCkge1xuXHRcdHJldHVybiBuZXcgU3RvcmFnZVZlY3RvcnNDbGllbnQodGhpcy51cmwgKyBcIi92ZWN0b3JcIiwge1xuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0ZmV0Y2g6IHRoaXMuZmV0Y2hcblx0XHR9KTtcblx0fVxuXHQvKipcblx0KlxuXHQqIEBhbHBoYVxuXHQqXG5cdCogQWNjZXNzIGFuYWx5dGljcyBzdG9yYWdlIG9wZXJhdGlvbnMgdXNpbmcgSWNlYmVyZyB0YWJsZXMuXG5cdCpcblx0KiAqKlB1YmxpYyBhbHBoYToqKiBUaGlzIEFQSSBpcyBwYXJ0IG9mIGEgcHVibGljIGFscGhhIHJlbGVhc2UgYW5kIG1heSBub3QgYmUgYXZhaWxhYmxlIHRvIHlvdXIgYWNjb3VudCB0eXBlLlxuXHQqXG5cdCogQGNhdGVnb3J5IEFuYWx5dGljcyBCdWNrZXRzXG5cdCogQHJldHVybnMgQSBTdG9yYWdlQW5hbHl0aWNzQ2xpZW50IGluc3RhbmNlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgY3VycmVudCBzdG9yYWdlIHNldHRpbmdzLlxuXHQqL1xuXHRnZXQgYW5hbHl0aWNzKCkge1xuXHRcdHJldHVybiBuZXcgU3RvcmFnZUFuYWx5dGljc0NsaWVudCh0aGlzLnVybCArIFwiL2ljZWJlcmdcIiwgdGhpcy5oZWFkZXJzLCB0aGlzLmZldGNoKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBTdG9yYWdlQW5hbHl0aWNzQ2xpZW50LCBTdG9yYWdlQXBpRXJyb3IsIFN0b3JhZ2VDbGllbnQsIFN0b3JhZ2VFcnJvciwgU3RvcmFnZVVua25vd25FcnJvciwgU3RvcmFnZVZlY3RvcnNBcGlFcnJvciwgU3RvcmFnZVZlY3RvcnNDbGllbnQsIFN0b3JhZ2VWZWN0b3JzRXJyb3IsIFN0b3JhZ2VWZWN0b3JzRXJyb3JDb2RlLCBTdG9yYWdlVmVjdG9yc1Vua25vd25FcnJvciwgVmVjdG9yQnVja2V0QXBpLCBWZWN0b3JCdWNrZXRTY29wZSwgVmVjdG9yRGF0YUFwaSwgVmVjdG9ySW5kZXhBcGksIFZlY3RvckluZGV4U2NvcGUsIGlzUGxhaW5PYmplY3QsIGlzU3RvcmFnZUVycm9yLCBpc1N0b3JhZ2VWZWN0b3JzRXJyb3IsIG5vcm1hbGl6ZVRvRmxvYXQzMiwgcmVzb2x2ZUZldGNoLCByZXNvbHZlUmVzcG9uc2UsIHZhbGlkYXRlVmVjdG9yRGltZW5zaW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIl0sIm5hbWVzIjpbIkljZWJlcmdSZXN0Q2F0YWxvZyIsIlN0b3JhZ2VFcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJtZXNzYWdlIiwiX19pc1N0b3JhZ2VFcnJvciIsIm5hbWUiLCJpc1N0b3JhZ2VFcnJvciIsImVycm9yIiwiU3RvcmFnZUFwaUVycm9yIiwic3RhdHVzIiwic3RhdHVzQ29kZSIsInRvSlNPTiIsIlN0b3JhZ2VVbmtub3duRXJyb3IiLCJvcmlnaW5hbEVycm9yIiwicmVzb2x2ZUZldGNoJDEiLCJjdXN0b21GZXRjaCIsImFyZ3MiLCJmZXRjaCIsInJlc29sdmVSZXNwb25zZSQxIiwiUmVzcG9uc2UiLCJyZWN1cnNpdmVUb0NhbWVsIiwiaXRlbSIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsImVsIiwiT2JqZWN0IiwicmVzdWx0IiwiZW50cmllcyIsImZvckVhY2giLCJrZXkiLCJ2YWx1ZSIsIm5ld0tleSIsInJlcGxhY2UiLCJjIiwidG9VcHBlckNhc2UiLCJpc1BsYWluT2JqZWN0JDEiLCJwcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwiaXRlcmF0b3IiLCJpc1ZhbGlkQnVja2V0TmFtZSIsImJ1Y2tldE5hbWUiLCJsZW5ndGgiLCJ0cmltIiwiaW5jbHVkZXMiLCJ0ZXN0IiwiX3R5cGVvZiIsIm8iLCJvJDEiLCJ0b1ByaW1pdGl2ZSIsInQiLCJyIiwiZSIsImkiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwidG9Qcm9wZXJ0eUtleSIsIl9kZWZpbmVQcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJyJDEiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkMiIsImFyZ3VtZW50cyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX2dldEVycm9yTWVzc2FnZSQxIiwiZXJyIiwiX2VyciRlcnJvciIsIm1zZyIsImVycm9yX2Rlc2NyaXB0aW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsImhhbmRsZUVycm9yJDEiLCJyZWplY3QiLCJvcHRpb25zIiwibm9SZXNvbHZlSnNvbiIsImpzb24iLCJ0aGVuIiwiY2F0Y2giLCJfZ2V0UmVxdWVzdFBhcmFtcyQxIiwibWV0aG9kIiwicGFyYW1ldGVycyIsImJvZHkiLCJwYXJhbXMiLCJoZWFkZXJzIiwiZHVwbGV4IiwiX2hhbmRsZVJlcXVlc3QkMSIsImZldGNoZXIiLCJ1cmwiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9rIiwiZGF0YSIsImdldCIsInBvc3QkMSIsInB1dCIsImhlYWQiLCJyZW1vdmUiLCJTdHJlYW1Eb3dubG9hZEJ1aWxkZXIiLCJkb3dubG9hZEZuIiwic2hvdWxkVGhyb3dPbkVycm9yIiwib25mdWxmaWxsZWQiLCJvbnJlamVjdGVkIiwiZXhlY3V0ZSIsIl90aGlzIiwiX1N5bWJvbCR0b1N0cmluZ1RhZyIsIkJsb2JEb3dubG9hZEJ1aWxkZXIiLCJwcm9taXNlIiwiYXNTdHJlYW0iLCJnZXRQcm9taXNlIiwiZmluYWxseSIsIm9uZmluYWxseSIsImJsb2IiLCJERUZBVUxUX1NFQVJDSF9PUFRJT05TIiwibGltaXQiLCJvZmZzZXQiLCJzb3J0QnkiLCJjb2x1bW4iLCJvcmRlciIsIkRFRkFVTFRfRklMRV9PUFRJT05TIiwiY2FjaGVDb250cm9sIiwiY29udGVudFR5cGUiLCJ1cHNlcnQiLCJTdG9yYWdlRmlsZUFwaSIsImJ1Y2tldElkIiwiZmV0Y2gkMSIsInRocm93T25FcnJvciIsInVwbG9hZE9yVXBkYXRlIiwicGF0aCIsImZpbGVCb2R5IiwiZmlsZU9wdGlvbnMiLCJtZXRhZGF0YSIsIkJsb2IiLCJGb3JtRGF0YSIsImFwcGVuZCIsImVuY29kZU1ldGFkYXRhIiwiaGFzIiwidG9CYXNlNjQiLCJSZWFkYWJsZVN0cmVhbSIsInBpcGUiLCJjbGVhblBhdGgiLCJfcmVtb3ZlRW1wdHlGb2xkZXJzIiwiX3BhdGgiLCJfZ2V0RmluYWxQYXRoIiwiaWQiLCJJZCIsImZ1bGxQYXRoIiwiS2V5IiwidXBsb2FkIiwidXBsb2FkVG9TaWduZWRVcmwiLCJ0b2tlbiIsIl90aGlzMyIsIlVSTCIsInNlYXJjaFBhcmFtcyIsInNldCIsInRvU3RyaW5nIiwiY3JlYXRlU2lnbmVkVXBsb2FkVXJsIiwiX3RoaXM0Iiwic2lnbmVkVXJsIiwidXBkYXRlIiwibW92ZSIsImZyb21QYXRoIiwidG9QYXRoIiwiX3RoaXM2Iiwic291cmNlS2V5IiwiZGVzdGluYXRpb25LZXkiLCJkZXN0aW5hdGlvbkJ1Y2tldCIsImNvcHkiLCJfdGhpczciLCJjcmVhdGVTaWduZWRVcmwiLCJleHBpcmVzSW4iLCJfdGhpczgiLCJ0cmFuc2Zvcm0iLCJkb3dubG9hZFF1ZXJ5UGFyYW0iLCJkb3dubG9hZCIsImVuY29kZVVSSSIsInNpZ25lZFVSTCIsImNyZWF0ZVNpZ25lZFVybHMiLCJwYXRocyIsIl90aGlzOSIsImRhdHVtIiwicmVuZGVyUGF0aCIsInRyYW5zZm9ybWF0aW9uUXVlcnkiLCJ0cmFuc2Zvcm1PcHRzVG9RdWVyeVN0cmluZyIsInF1ZXJ5U3RyaW5nIiwiaW5mbyIsIl90aGlzMTAiLCJleGlzdHMiLCJfdGhpczExIiwiZ2V0UHVibGljVXJsIiwiX3F1ZXJ5U3RyaW5nIiwiam9pbiIsInB1YmxpY1VybCIsIl90aGlzMTIiLCJwcmVmaXhlcyIsImxpc3QiLCJfdGhpczEzIiwicHJlZml4IiwibGlzdFYyIiwiX3RoaXMxNCIsIkJ1ZmZlciIsImZyb20iLCJidG9hIiwid2lkdGgiLCJoZWlnaHQiLCJyZXNpemUiLCJmb3JtYXQiLCJxdWFsaXR5IiwidmVyc2lvbiIsIkRFRkFVTFRfSEVBREVSUyQxIiwiU3RvcmFnZUJ1Y2tldEFwaSIsIm9wdHMiLCJiYXNlVXJsIiwidXNlTmV3SG9zdG5hbWUiLCJob3N0bmFtZSIsImhyZWYiLCJsaXN0QnVja2V0cyIsImxpc3RCdWNrZXRPcHRpb25zVG9RdWVyeVN0cmluZyIsImdldEJ1Y2tldCIsIl90aGlzMiIsImNyZWF0ZUJ1Y2tldCIsInB1YmxpYyIsInR5cGUiLCJmaWxlX3NpemVfbGltaXQiLCJmaWxlU2l6ZUxpbWl0IiwiYWxsb3dlZF9taW1lX3R5cGVzIiwiYWxsb3dlZE1pbWVUeXBlcyIsInVwZGF0ZUJ1Y2tldCIsImVtcHR5QnVja2V0IiwiX3RoaXM1IiwiZGVsZXRlQnVja2V0Iiwic2VhcmNoIiwic29ydENvbHVtbiIsInNvcnRPcmRlciIsIlVSTFNlYXJjaFBhcmFtcyIsIlN0b3JhZ2VBbmFseXRpY3NDbGllbnQiLCJxdWVyeVBhcmFtcyIsImNhdGFsb2ciLCJjYXRhbG9nTmFtZSIsImF1dGgiLCJnZXRIZWFkZXJzIiwiUHJveHkiLCJ0YXJnZXQiLCJwcm9wIiwiREVGQVVMVF9IRUFERVJTIiwiU3RvcmFnZVZlY3RvcnNFcnJvciIsIl9faXNTdG9yYWdlVmVjdG9yc0Vycm9yIiwiaXNTdG9yYWdlVmVjdG9yc0Vycm9yIiwiU3RvcmFnZVZlY3RvcnNBcGlFcnJvciIsIlN0b3JhZ2VWZWN0b3JzVW5rbm93bkVycm9yIiwiU3RvcmFnZVZlY3RvcnNFcnJvckNvZGUiLCJTdG9yYWdlVmVjdG9yc0Vycm9yQ29kZSQxIiwicmVzb2x2ZUZldGNoIiwicmVzb2x2ZVJlc3BvbnNlIiwiaXNQbGFpbk9iamVjdCIsIm5vcm1hbGl6ZVRvRmxvYXQzMiIsInZhbHVlcyIsIkZsb2F0MzJBcnJheSIsInZhbGlkYXRlVmVjdG9yRGltZW5zaW9uIiwidmVjdG9yIiwiZXhwZWN0ZWREaW1lbnNpb24iLCJmbG9hdDMyIiwiX2dldEVycm9yTWVzc2FnZSIsImhhbmRsZUVycm9yIiwicmVzcG9uc2VFcnJvciIsImNvZGUiLCJzdGF0dXNUZXh0IiwiX2dldFJlcXVlc3RQYXJhbXMiLCJfaGFuZGxlUmVxdWVzdCIsInBvc3QiLCJWZWN0b3JJbmRleEFwaSIsImNyZWF0ZUluZGV4IiwiZ2V0SW5kZXgiLCJ2ZWN0b3JCdWNrZXROYW1lIiwiaW5kZXhOYW1lIiwibGlzdEluZGV4ZXMiLCJkZWxldGVJbmRleCIsIlZlY3RvckRhdGFBcGkiLCJwdXRWZWN0b3JzIiwidmVjdG9ycyIsImdldFZlY3RvcnMiLCJsaXN0VmVjdG9ycyIsInNlZ21lbnRDb3VudCIsInNlZ21lbnRJbmRleCIsInF1ZXJ5VmVjdG9ycyIsImRlbGV0ZVZlY3RvcnMiLCJWZWN0b3JCdWNrZXRBcGkiLCJTdG9yYWdlVmVjdG9yc0NsaWVudCIsIlZlY3RvckJ1Y2tldFNjb3BlIiwiX3N1cGVycHJvcF9nZXRDcmVhdGVCdWNrZXQiLCJfc3VwZXJwcm9wX2dldEdldEJ1Y2tldCIsIl9zdXBlcnByb3BfZ2V0TGlzdEJ1Y2tldHMiLCJfc3VwZXJwcm9wX2dldERlbGV0ZUJ1Y2tldCIsIl9zdXBlcnByb3BfZ2V0Q3JlYXRlSW5kZXgiLCJfc3VwZXJwcm9wX2dldExpc3RJbmRleGVzIiwiX3N1cGVycHJvcF9nZXRHZXRJbmRleCIsIl9zdXBlcnByb3BfZ2V0RGVsZXRlSW5kZXgiLCJpbmRleCIsIlZlY3RvckluZGV4U2NvcGUiLCJfc3VwZXJwcm9wX2dldFB1dFZlY3RvcnMiLCJfc3VwZXJwcm9wX2dldEdldFZlY3RvcnMiLCJfc3VwZXJwcm9wX2dldExpc3RWZWN0b3JzIiwiX3N1cGVycHJvcF9nZXRRdWVyeVZlY3RvcnMiLCJfc3VwZXJwcm9wX2dldERlbGV0ZVZlY3RvcnMiLCJTdG9yYWdlQ2xpZW50IiwiYW5hbHl0aWNzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/storage-js/dist/index.mjs\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/@supabase/supabase-js/dist/index.mjs":
|
||
/*!***********************************************************!*\
|
||
!*** ./node_modules/@supabase/supabase-js/dist/index.mjs ***!
|
||
\***********************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FunctionRegion: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_4__.FunctionRegion),\n/* harmony export */ FunctionsError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_4__.FunctionsError),\n/* harmony export */ FunctionsFetchError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_4__.FunctionsFetchError),\n/* harmony export */ FunctionsHttpError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_4__.FunctionsHttpError),\n/* harmony export */ FunctionsRelayError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_4__.FunctionsRelayError),\n/* harmony export */ PostgrestError: () => (/* reexport safe */ _supabase_postgrest_js__WEBPACK_IMPORTED_MODULE_0__.PostgrestError),\n/* harmony export */ SupabaseClient: () => (/* binding */ SupabaseClient),\n/* harmony export */ createClient: () => (/* binding */ createClient)\n/* harmony export */ });\n/* harmony import */ var _supabase_functions_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @supabase/functions-js */ \"(action-browser)/./node_modules/@supabase/functions-js/dist/module/index.js\");\n/* harmony import */ var _supabase_postgrest_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @supabase/postgrest-js */ \"(action-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 */ \"(action-browser)/./node_modules/@supabase/realtime-js/dist/module/index.js\");\n/* harmony import */ var _supabase_storage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @supabase/storage-js */ \"(action-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 */ \"(action-browser)/./node_modules/@supabase/auth-js/dist/module/index.js\");\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__) if([\"default\",\"FunctionRegion\",\"FunctionsError\",\"FunctionsFetchError\",\"FunctionsHttpError\",\"FunctionsRelayError\",\"PostgrestError\",\"SupabaseClient\",\"createClient\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__) if([\"default\",\"FunctionRegion\",\"FunctionsError\",\"FunctionsFetchError\",\"FunctionsHttpError\",\"FunctionsRelayError\",\"PostgrestError\",\"SupabaseClient\",\"createClient\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\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-${JS_ENV}/${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 (...args)=>customFetch(...args);\n return (...args)=>fetch(...args);\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 ${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* 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-${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.${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_3__.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\t* Supabase Functions allows you to deploy and invoke edge functions.\n\t*/ get functions() {\n return new _supabase_functions_js__WEBPACK_IMPORTED_MODULE_4__.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, args = {}, options = {\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, opts = {\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({ autoRefreshToken, persistSession, detectSessionInUrl, storage, userStorage, storageKey, flowType, lock, debug, throwOnError }, headers, fetch$1) {\n const authHeaders = {\n Authorization: `Bearer ${this.supabaseKey}`,\n apikey: `${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//#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 (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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2Uvc3VwYWJhc2UtanMvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUF1SjtBQUM5RTtBQUNsQjtBQUNGO0FBQ047QUFFVjtBQUVKO0FBRWpDLDRCQUE0QjtBQUM1QixNQUFNVyxVQUFVO0FBRWhCLFlBQVk7QUFDWiw4QkFBOEI7QUFDOUIsSUFBSUMsU0FBUztBQUNiLElBQUksT0FBT0MsU0FBUyxhQUFhRCxTQUFTO0tBQ3JDLElBQUksT0FBT0UsYUFBYSxhQUFhRixTQUFTO0tBQzlDLElBQUksT0FBT0csY0FBYyxlQUFlQSxVQUFVQyxPQUFPLEtBQUssZUFBZUosU0FBUztLQUN0RkEsU0FBUztBQUNkLE1BQU1LLGtCQUFrQjtJQUFFLGlCQUFpQixDQUFDLFlBQVksRUFBRUwsT0FBTyxDQUFDLEVBQUVELFFBQVEsQ0FBQztBQUFDO0FBQzlFLE1BQU1PLHlCQUF5QjtJQUFFQyxTQUFTRjtBQUFnQjtBQUMxRCxNQUFNRyxxQkFBcUI7SUFBRUMsUUFBUTtBQUFTO0FBQzlDLE1BQU1DLHVCQUF1QjtJQUM1QkMsa0JBQWtCO0lBQ2xCQyxnQkFBZ0I7SUFDaEJDLG9CQUFvQjtJQUNwQkMsVUFBVTtBQUNYO0FBQ0EsTUFBTUMsMkJBQTJCLENBQUM7QUFFbEMsWUFBWTtBQUNaLDBEQUEwRDtBQUMxRCxTQUFTQyxRQUFRQyxDQUFDO0lBQ2pCO0lBQ0EsT0FBT0QsVUFBVSxjQUFjLE9BQU9FLFVBQVUsWUFBWSxPQUFPQSxPQUFPQyxRQUFRLEdBQUcsU0FBU0MsR0FBRztRQUNoRyxPQUFPLE9BQU9BO0lBQ2YsSUFBSSxTQUFTQSxHQUFHO1FBQ2YsT0FBT0EsT0FBTyxjQUFjLE9BQU9GLFVBQVVFLElBQUlDLFdBQVcsS0FBS0gsVUFBVUUsUUFBUUYsT0FBT0ksU0FBUyxHQUFHLFdBQVcsT0FBT0Y7SUFDekgsR0FBR0osUUFBUUM7QUFDWjtBQUVBLFlBQVk7QUFD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YWNrOi8vd2hpc2t5LXZhdWx0Ly4vbm9kZV9tb2R1bGVzL0BzdXBhYmFzZS9zdXBhYmFzZS1qcy9kaXN0L2luZGV4Lm1qcz80OTNhIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZ1bmN0aW9uUmVnaW9uLCBGdW5jdGlvbnNDbGllbnQsIEZ1bmN0aW9uc0Vycm9yLCBGdW5jdGlvbnNGZXRjaEVycm9yLCBGdW5jdGlvbnNIdHRwRXJyb3IsIEZ1bmN0aW9uc1JlbGF5RXJyb3IgfSBmcm9tIFwiQHN1cGFiYXNlL2Z1bmN0aW9ucy1qc1wiO1xuaW1wb3J0IHsgUG9zdGdyZXN0Q2xpZW50LCBQb3N0Z3Jlc3RFcnJvciB9IGZyb20gXCJAc3VwYWJhc2UvcG9zdGdyZXN0LWpzXCI7XG5pbXBvcnQgeyBSZWFsdGltZUNsaWVudCB9IGZyb20gXCJAc3VwYWJhc2UvcmVhbHRpbWUtanNcIjtcbmltcG9ydCB7IFN0b3JhZ2VDbGllbnQgfSBmcm9tIFwiQHN1cGFiYXNlL3N0b3JhZ2UtanNcIjtcbmltcG9ydCB7IEF1dGhDbGllbnQgfSBmcm9tIFwiQHN1cGFiYXNlL2F1dGgtanNcIjtcblxuZXhwb3J0ICogZnJvbSBcIkBzdXBhYmFzZS9yZWFsdGltZS1qc1wiXG5cbmV4cG9ydCAqIGZyb20gXCJAc3VwYWJhc2UvYXV0aC1qc1wiXG5cbi8vI3JlZ2lvbiBzcmMvbGliL3ZlcnNpb24udHNcbmNvbnN0IHZlcnNpb24gPSBcIjIuODguMFwiO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL2NvbnN0YW50cy50c1xubGV0IEpTX0VOViA9IFwiXCI7XG5pZiAodHlwZW9mIERlbm8gIT09IFwidW5kZWZpbmVkXCIpIEpTX0VOViA9IFwiZGVub1wiO1xuZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSBKU19FTlYgPSBcIndlYlwiO1xuZWxzZSBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gXCJSZWFjdE5hdGl2ZVwiKSBKU19FTlYgPSBcInJlYWN0LW5hdGl2ZVwiO1xuZWxzZSBKU19FTlYgPSBcIm5vZGVcIjtcbmNvbnN0IERFRkFVTFRfSEVBREVSUyA9IHsgXCJYLUNsaWVudC1JbmZvXCI6IGBzdXBhYmFzZS1qcy0ke0pTX0VOVn0vJHt2ZXJzaW9ufWAgfTtcbmNvbnN0IERFRkFVTFRfR0xPQkFMX09QVElPTlMgPSB7IGhlYWRlcnM6IERFRkFVTFRfSEVBREVSUyB9O1xuY29uc3QgREVGQVVMVF9EQl9PUFRJT05TID0geyBzY2hlbWE6IFwicHVibGljXCIgfTtcbmNvbnN0IERFRkFVTFRfQVVUSF9PUFRJT05TID0ge1xuXHRhdXRvUmVmcmVzaFRva2VuOiB0cnVlLFxuXHRwZXJzaXN0U2Vzc2lvbjogdHJ1ZSxcblx0ZGV0ZWN0U2Vzc2lvbkluVXJsOiB0cnVlLFxuXHRmbG93VHlwZTogXCJpbXBsaWNpdFwiXG59O1xuY29uc3QgREVGQVVMVF9SRUFMVElNRV9PUFRJT05TID0ge307XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIFxcMEBveGMtcHJvamVjdCtydW50aW1lQDAuMTAxLjAvaGVscGVycy90eXBlb2YuanNcbmZ1bmN0aW9uIF90eXBlb2Yobykge1xuXHRcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cdHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24obyQxKSB7XG5cdFx0cmV0dXJuIHR5cGVvZiBvJDE7XG5cdH0gOiBmdW5jdGlvbihvJDEpIHtcblx0XHRyZXR1cm4gbyQxICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8kMS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8kMSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbyQxO1xuXHR9LCBfdHlwZW9mKG8pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBcXDBAb3hjLXByb2plY3QrcnVudGltZUAwLjEwMS4wL2hlbHBlcnMvdG9QcmltaXRpdmUuanNcbmZ1bmN0aW9uIHRvUHJpbWl0aXZlKHQsIHIpIHtcblx0aWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7XG5cdHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuXHRpZiAodm9pZCAwICE9PSBlKSB7XG5cdFx0dmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG5cdFx0aWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuXHR9XG5cdHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIFxcMEBveGMtcHJvamVjdCtydW50aW1lQDAuMTAxLjAvaGVscGVycy90b1Byb3BlcnR5S2V5LmpzXG5mdW5jdGlvbiB0b1Byb3BlcnR5S2V5KHQpIHtcblx0dmFyIGkgPSB0b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTtcblx0cmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gXFwwQG94Yy1wcm9qZWN0K3J1bnRpbWVAMC4xMDEuMC9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkge1xuXHRyZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHtcblx0XHR2YWx1ZTogdCxcblx0XHRlbnVtZXJhYmxlOiAhMCxcblx0XHRjb25maWd1cmFibGU6ICEwLFxuXHRcdHdyaXRhYmxlOiAhMFxuXHR9KSA6IGVbcl0gPSB0LCBlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBcXDBAb3hjLXByb2plY3QrcnVudGltZUAwLjEwMS4wL2hlbHBlcnMvb2JqZWN0U3ByZWFkMi5qc1xuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7XG5cdHZhciB0ID0gT2JqZWN0LmtleXMoZSk7XG5cdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0dmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuXHRcdHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbihyJDEpIHtcblx0XHRcdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIkMSkuZW51bWVyYWJsZTtcblx0XHR9KSksIHQucHVzaC5hcHBseSh0LCBvKTtcblx0fVxuXHRyZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKGUpIHtcblx0Zm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHtcblx0XHR2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307XG5cdFx0ciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24ociQxKSB7XG5cdFx0XHRfZGVmaW5lUHJvcGVydHkoZSwgciQxLCB0W3IkMV0pO1xuXHRcdH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbihyJDEpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByJDEsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgciQxKSk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvZmV0Y2gudHNcbmNvbnN0IHJlc29sdmVGZXRjaCA9IChjdXN0b21GZXRjaCkgPT4ge1xuXHRpZiAoY3VzdG9tRmV0Y2gpIHJldHVybiAoLi4uYXJncykgPT4gY3VzdG9tRmV0Y2goLi4uYXJncyk7XG5cdHJldHVybiAoLi4uYXJncykgPT4gZmV0Y2goLi4uYXJncyk7XG59O1xuY29uc3QgcmVzb2x2ZUhlYWRlcnNDb25zdHJ1Y3RvciA9ICgpID0+IHtcblx0cmV0dXJuIEhlYWRlcnM7XG59O1xuY29uc3QgZmV0Y2hXaXRoQXV0aCA9IChzdXBhYmFzZUtleSwgZ2V0QWNjZXNzVG9rZW4sIGN1c3RvbUZldGNoKSA9PiB7XG5cdGNvbnN0IGZldGNoJDEgPSByZXNvbHZlRmV0Y2goY3VzdG9tRmV0Y2gpO1xuXHRjb25zdCBIZWFkZXJzQ29uc3RydWN0b3IgPSByZXNvbHZlSGVhZGVyc0NvbnN0cnVjdG9yKCk7XG5cdHJldHVybiBhc3luYyAoaW5wdXQsIGluaXQpID0+IHtcblx0XHR2YXIgX2F3YWl0JGdldEFjY2Vzc1Rva2VuO1xuXHRcdGNvbnN0IGFjY2Vzc1Rva2VuID0gKF9hd2FpdCRnZXRBY2Nlc3NUb2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCkpICE9PSBudWxsICYmIF9hd2FpdCRnZXRBY2Nlc3NUb2tlbiAhPT0gdm9pZCAwID8gX2F3YWl0JGdldEFjY2Vzc1Rva2VuIDogc3VwYWJhc2VLZXk7XG5cdFx0bGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVyc0NvbnN0cnVjdG9yKGluaXQgPT09IG51bGwgfHwgaW5pdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5pdC5oZWFkZXJzKTtcblx0XHRpZiAoIWhlYWRlcnMuaGFzKFwiYXBpa2V5XCIpKSBoZWFkZXJzLnNldChcImFwaWtleVwiLCBzdXBhYmFzZUtleSk7XG5cdFx0aWYgKCFoZWFkZXJzLmhhcyhcIkF1dGhvcml6YXRpb25cIikpIGhlYWRlcnMuc2V0KFwiQXV0aG9yaXphdGlvblwiLCBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCk7XG5cdFx0cmV0dXJuIGZldGNoJDEoaW5wdXQsIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBpbml0KSwge30sIHsgaGVhZGVycyB9KSk7XG5cdH07XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL2hlbHBlcnMudHNcbmZ1bmN0aW9uIGVuc3VyZVRyYWlsaW5nU2xhc2godXJsKSB7XG5cdHJldHVybiB1cmwuZW5kc1dpdGgoXCIvXCIpID8gdXJsIDogdXJsICsgXCIvXCI7XG59XG5mdW5jdGlvbiBhcHBseVNldHRpbmdEZWZhdWx0cyhvcHRpb25zLCBkZWZhdWx0cykge1xuXHR2YXIgX0RFRkFVTFRfR0xPQkFMX09QVElPLCBfZ2xvYmFsT3B0aW9ucyRoZWFkZXI7XG5cdGNvbnN0IHsgZGI6IGRiT3B0aW9ucywgYXV0aDogYXV0aE9wdGlvbnMsIHJlYWx0aW1lOiByZWFsdGltZU9wdGlvbnMsIGdsb2JhbDogZ2xvYmFsT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0Y29uc3QgeyBkYjogREVGQVVMVF9EQl9PUFRJT05TJDEsIGF1dGg6IERFRkFVTFRfQVVUSF9PUFRJT05TJDEsIHJlYWx0aW1lOiBERUZBVUxUX1JFQUxUSU1FX09QVElPTlMkMSwgZ2xvYmFsOiBERUZBVUxUX0dMT0JBTF9PUFRJT05TJDEgfSA9IGRlZmF1bHRzO1xuXHRjb25zdCByZXN1bHQgPSB7XG5cdFx0ZGI6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX0RCX09QVElPTlMkMSksIGRiT3B0aW9ucyksXG5cdFx0YXV0aDogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERFRkFVTFRfQVVUSF9PUFRJT05TJDEpLCBhdXRoT3B0aW9ucyksXG5cdFx0cmVhbHRpbWU6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX1JFQUxUSU1FX09QVElPTlMkMSksIHJlYWx0aW1lT3B0aW9ucyksXG5cdFx0c3RvcmFnZToge30sXG5cdFx0Z2xvYmFsOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9HTE9CQUxfT1BUSU9OUyQxKSwgZ2xvYmFsT3B0aW9ucyksIHt9LCB7IGhlYWRlcnM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCAoX0RFRkFVTFRfR0xPQkFMX09QVElPID0gREVGQVVMVF9HTE9CQUxfT1BUSU9OUyQxID09PSBudWxsIHx8IERFRkFVTFRfR0xPQkFMX09QVElPTlMkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogREVGQVVMVF9HTE9CQUxfT1BUSU9OUyQxLmhlYWRlcnMpICE9PSBudWxsICYmIF9ERUZBVUxUX0dMT0JBTF9PUFRJTyAhPT0gdm9pZCAwID8gX0RFRkFVTFRfR0xPQkFMX09QVElPIDoge30pLCAoX2dsb2JhbE9wdGlvbnMkaGVhZGVyID0gZ2xvYmFsT3B0aW9ucyA9PT0gbnVsbCB8fCBnbG9iYWxPcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBnbG9iYWxPcHRpb25zLmhlYWRlcnMpICE9PSBudWxsICYmIF9nbG9iYWxPcHRpb25zJGhlYWRlciAhPT0gdm9pZCAwID8gX2dsb2JhbE9wdGlvbnMkaGVhZGVyIDoge30pIH0pLFxuXHRcdGFjY2Vzc1Rva2VuOiBhc3luYyAoKSA9PiBcIlwiXG5cdH07XG5cdGlmIChvcHRpb25zLmFjY2Vzc1Rva2VuKSByZXN1bHQuYWNjZXNzVG9rZW4gPSBvcHRpb25zLmFjY2Vzc1Rva2VuO1xuXHRlbHNlIGRlbGV0ZSByZXN1bHQuYWNjZXNzVG9rZW47XG5cdHJldHVybiByZXN1bHQ7XG59XG4vKipcbiogVmFsaWRhdGVzIGEgU3VwYWJhc2UgY2xpZW50IFVSTFxuKlxuKiBAcGFyYW0ge3N0cmluZ30gc3VwYWJhc2VVcmwgLSBUaGUgU3VwYWJhc2UgY2xpZW50IFVSTCBzdHJpbmcuXG4qIEByZXR1cm5zIHtVUkx9IC0gVGhlIHZhbGlkYXRlZCBiYXNlIFVSTC5cbiogQHRocm93cyB7RXJyb3J9XG4qL1xuZnVuY3Rpb24gdmFsaWRhdGVTdXBhYmFzZVVybChzdXBhYmFzZVVybCkge1xuXHRjb25zdCB0cmltbWVkVXJsID0gc3VwYWJhc2VVcmwgPT09IG51bGwgfHwgc3VwYWJhc2VVcmwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN1cGFiYXNlVXJsLnRyaW0oKTtcblx0aWYgKCF0cmltbWVkVXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJzdXBhYmFzZVVybCBpcyByZXF1aXJlZC5cIik7XG5cdGlmICghdHJpbW1lZFVybC5tYXRjaCgvXmh0dHBzPzpcXC9cXC8vaSkpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3VwYWJhc2VVcmw6IE11c3QgYmUgYSB2YWxpZCBIVFRQIG9yIEhUVFBTIFVSTC5cIik7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyBVUkwoZW5zdXJlVHJhaWxpbmdTbGFzaCh0cmltbWVkVXJsKSk7XG5cdH0gY2F0Y2ggKF91bnVzZWQpIHtcblx0XHR0aHJvdyBFcnJvcihcIkludmFsaWQgc3VwYWJhc2VVcmw6IFByb3ZpZGVkIFVSTCBpcyBtYWxmb3JtZWQuXCIpO1xuXHR9XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9saWIvU3VwYWJhc2VBdXRoQ2xpZW50LnRzXG52YXIgU3VwYWJhc2VBdXRoQ2xpZW50ID0gY2xhc3MgZXh0ZW5kcyBBdXRoQ2xpZW50IHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHN1cGVyKG9wdGlvbnMpO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvU3VwYWJhc2VDbGllbnQudHNcbi8qKlxuKiBTdXBhYmFzZSBDbGllbnQuXG4qXG4qIEFuIGlzb21vcnBoaWMgSmF2YXNjcmlwdCBjbGllbnQgZm9yIGludGVyYWN0aW5nIHdpdGggUG9zdGdyZXMuXG4qL1xudmFyIFN1cGFiYXNlQ2xpZW50ID0gY2xhc3Mge1xuXHQvKipcblx0KiBDcmVhdGUgYSBuZXcgY2xpZW50IGZvciB1c2UgaW4gdGhlIGJyb3dzZXIuXG5cdCogQHBhcmFtIHN1cGFiYXNlVXJsIFRoZSB1bmlxdWUgU3VwYWJhc2UgVVJMIHdoaWNoIGlzIHN1cHBsaWVkIHdoZW4geW91IGNyZWF0ZSBhIG5ldyBwcm9qZWN0IGluIHlvdXIgcHJvamVjdCBkYXNoYm9hcmQuXG5cdCogQHBhcmFtIHN1cGFiYXNlS2V5IFRoZSB1bmlxdWUgU3VwYWJhc2UgS2V5IHdoaWNoIGlzIHN1cHBsaWVkIHdoZW4geW91IGNyZWF0ZSBhIG5ldyBwcm9qZWN0IGluIHlvdXIgcHJvamVjdCBkYXNoYm9hcmQuXG5cdCogQHBhcmFtIG9wdGlvbnMuZGIuc2NoZW1hIFlvdSBjYW4gc3dpdGNoIGluIGJldHdlZW4gc2NoZW1hcy4gVGhlIHNjaGVtYSBuZWVkcyB0byBiZSBvbiB0aGUgbGlzdCBvZiBleHBvc2VkIHNjaGVtYXMgaW5zaWRlIFN1cGFiYXNlLlxuXHQqIEBwYXJhbSBvcHRpb25zLmF1dGguYXV0b1JlZnJlc2hUb2tlbiBTZXQgdG8gXCJ0cnVlXCIgaWYgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseSByZWZyZXNoIHRoZSB0b2tlbiBiZWZvcmUgZXhwaXJpbmcuXG5cdCogQHBhcmFtIG9wdGlvbnMuYXV0aC5wZXJzaXN0U2Vzc2lvbiBTZXQgdG8gXCJ0cnVlXCIgaWYgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseSBzYXZlIHRoZSB1c2VyIHNlc3Npb24gaW50byBsb2NhbCBzdG9yYWdlLlxuXHQqIEBwYXJhbSBvcHRpb25zLmF1dGguZGV0ZWN0U2Vzc2lvbkluVXJsIFNldCB0byBcInRydWVcIiBpZiB5b3Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IGRldGVjdHMgT0F1dGggZ3JhbnRzIGluIHRoZSBVUkwgYW5kIHNpZ25zIGluIHRoZSB1c2VyLlxuXHQqIEBwYXJhbSBvcHRpb25zLnJlYWx0aW1lIE9wdGlvbnMgcGFzc2VkIGFsb25nIHRvIHJlYWx0aW1lLWpzIGNvbnN0cnVjdG9yLlxuXHQqIEBwYXJhbSBvcHRpb25zLnN0b3JhZ2UgT3B0aW9ucyBwYXNzZWQgYWxvbmcgdG8gdGhlIHN0b3JhZ2UtanMgY29uc3RydWN0b3IuXG5cdCogQHBhcmFtIG9wdGlvbnMuZ2xvYmFsLmZldGNoIEEgY3VzdG9tIGZldGNoIGltcGxlbWVudGF0aW9uLlxuXHQqIEBwYXJhbSBvcHRpb25zLmdsb2JhbC5oZWFkZXJzIEFueSBhZGRpdGlvbmFsIGhlYWRlcnMgdG8gc2VuZCB3aXRoIGVhY2ggbmV0d29yayByZXF1ZXN0LlxuXHQqIEBleGFtcGxlXG5cdCogYGBgdHNcblx0KiBpbXBvcnQgeyBjcmVhdGVDbGllbnQgfSBmcm9tICdAc3VwYWJhc2Uvc3VwYWJhc2UtanMnXG5cdCpcblx0KiBjb25zdCBzdXBhYmFzZSA9IGNyZWF0ZUNsaWVudCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvJywgJ3B1YmxpYy1hbm9uLWtleScpXG5cdCogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBzdXBhYmFzZS5mcm9tKCdwcm9maWxlcycpLnNlbGVjdCgnKicpXG5cdCogYGBgXG5cdCovXG5cdGNvbnN0cnVjdG9yKHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwgb3B0aW9ucykge1xuXHRcdHZhciBfc2V0dGluZ3MkYXV0aCRzdG9yYWcsIF9zZXR0aW5ncyRnbG9iYWwkaGVhZDtcblx0XHR0aGlzLnN1cGFiYXNlVXJsID0gc3VwYWJhc2VVcmw7XG5cdFx0dGhpcy5zdXBhYmFzZUtleSA9IHN1cGFiYXNlS2V5O1xuXHRcdGNvbnN0IGJhc2VVcmwgPSB2YWxpZGF0ZVN1cGFiYXNlVXJsKHN1cGFiYXNlVXJsKTtcblx0XHRpZiAoIXN1cGFiYXNlS2V5KSB0aHJvdyBuZXcgRXJyb3IoXCJzdXBhYmFzZUtleSBpcyByZXF1aXJlZC5cIik7XG5cdFx0dGhpcy5yZWFsdGltZVVybCA9IG5ldyBVUkwoXCJyZWFsdGltZS92MVwiLCBiYXNlVXJsKTtcblx0XHR0aGlzLnJlYWx0aW1lVXJsLnByb3RvY29sID0gdGhpcy5yZWFsdGltZVVybC5wcm90b2NvbC5yZXBsYWNlKFwiaHR0cFwiLCBcIndzXCIpO1xuXHRcdHRoaXMuYXV0aFVybCA9IG5ldyBVUkwoXCJhdXRoL3YxXCIsIGJhc2VVcmwpO1xuXHRcdHRoaXMuc3RvcmFnZVVybCA9IG5ldyBVUkwoXCJzdG9yYWdlL3YxXCIsIGJhc2VVcmwpO1xuXHRcdHRoaXMuZnVuY3Rpb25zVXJsID0gbmV3IFVSTChcImZ1bmN0aW9ucy92MVwiLCBiYXNlVXJsKTtcblx0XHRjb25zdCBkZWZhdWx0U3RvcmFnZUtleSA9IGBzYi0ke2Jhc2VVcmwuaG9zdG5hbWUuc3BsaXQoXCIuXCIpWzBdfS1hdXRoLXRva2VuYDtcblx0XHRjb25zdCBERUZBVUxUUyA9IHtcblx0XHRcdGRiOiBERUZBVUxUX0RCX09QVElPTlMsXG5cdFx0XHRyZWFsdGltZTogREVGQVVMVF9SRUFMVElNRV9PUFRJT05TLFxuXHRcdFx0YXV0aDogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERFRkFVTFRfQVVUSF9PUFRJT05TKSwge30sIHsgc3RvcmFnZUtleTogZGVmYXVsdFN0b3JhZ2VLZXkgfSksXG5cdFx0XHRnbG9iYWw6IERFRkFVTFRfR0xPQkFMX09QVElPTlNcblx0XHR9O1xuXHRcdGNvbnN0IHNldHRpbmdzID0gYXBwbHlTZXR0aW5nRGVmYXVsdHMob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge30sIERFRkFVTFRTKTtcblx0XHR0aGlzLnN0b3JhZ2VLZXkgPSAoX3NldHRpbmdzJGF1dGgkc3RvcmFnID0gc2V0dGluZ3MuYXV0aC5zdG9yYWdlS2V5KSAhPT0gbnVsbCAmJiBfc2V0dGluZ3MkYXV0aCRzdG9yYWcgIT09IHZvaWQgMCA/IF9zZXR0aW5ncyRhdXRoJHN0b3JhZyA6IFwiXCI7XG5cdFx0dGhpcy5oZWFkZXJzID0gKF9zZXR0aW5ncyRnbG9iYWwkaGVhZCA9IHNldHRpbmdzLmdsb2JhbC5oZWFkZXJzKSAhPT0gbnVsbCAmJiBfc2V0dGluZ3MkZ2xvYmFsJGhlYWQgIT09IHZvaWQgMCA/IF9zZXR0aW5ncyRnbG9iYWwkaGVhZCA6IHt9O1xuXHRcdGlmICghc2V0dGluZ3MuYWNjZXNzVG9rZW4pIHtcblx0XHRcdHZhciBfc2V0dGluZ3MkYXV0aDtcblx0XHRcdHRoaXMuYXV0aCA9IHRoaXMuX2luaXRTdXBhYmFzZUF1dGhDbGllbnQoKF9zZXR0aW5ncyRhdXRoID0gc2V0dGluZ3MuYXV0aCkgIT09IG51bGwgJiYgX3NldHRpbmdzJGF1dGggIT09IHZvaWQgMCA/IF9zZXR0aW5ncyRhdXRoIDoge30sIHRoaXMuaGVhZGVycywgc2V0dGluZ3MuZ2xvYmFsLmZldGNoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5hY2Nlc3NUb2tlbiA9IHNldHRpbmdzLmFjY2Vzc1Rva2VuO1xuXHRcdFx0dGhpcy5hdXRoID0gbmV3IFByb3h5KHt9LCB7IGdldDogKF8sIHByb3ApID0+IHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBAc3VwYWJhc2Uvc3VwYWJhc2UtanM6IFN1cGFiYXNlIENsaWVudCBpcyBjb25maWd1cmVkIHdpdGggdGhlIGFjY2Vzc1Rva2VuIG9wdGlvbiwgYWNjZXNzaW5nIHN1cGFiYXNlLmF1dGguJHtTdHJpbmcocHJvcCl9IGlzIG5vdCBwb3NzaWJsZWApO1xuXHRcdFx0fSB9KTtcblx0XHR9XG5cdFx0dGhpcy5mZXRjaCA9IGZldGNoV2l0aEF1dGgoc3VwYWJhc2VLZXksIHRoaXMuX2dldEFjY2Vzc1Rva2VuLmJpbmQodGhpcyksIHNldHRpbmdzLmdsb2JhbC5mZXRjaCk7XG5cdFx0dGhpcy5yZWFsdGltZSA9IHRoaXMuX2luaXRSZWFsdGltZUNsaWVudChfb2JqZWN0U3ByZWFkMih7XG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRhY2Nlc3NUb2tlbjogdGhpcy5fZ2V0QWNjZXNzVG9rZW4uYmluZCh0aGlzKVxuXHRcdH0sIHNldHRpbmdzLnJlYWx0aW1lKSk7XG5cdFx0aWYgKHRoaXMuYWNjZXNzVG9rZW4pIHRoaXMuYWNjZXNzVG9rZW4oKS50aGVuKCh0b2tlbikgPT4gdGhpcy5yZWFsdGltZS5zZXRBdXRoKHRva2VuKSkuY2F0Y2goKGUpID0+IGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBzZXQgaW5pdGlhbCBSZWFsdGltZSBhdXRoIHRva2VuOlwiLCBlKSk7XG5cdFx0dGhpcy5yZXN0ID0gbmV3IFBvc3RncmVzdENsaWVudChuZXcgVVJMKFwicmVzdC92MVwiLCBiYXNlVXJsKS5ocmVmLCB7XG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRzY2hlbWE6IHNldHRpbmdzLmRiLnNjaGVtYSxcblx0XHRcdGZldGNoOiB0aGlzLmZldGNoXG5cdFx0fSk7XG5cdFx0dGhpcy5zdG9yYWdlID0gbmV3IFN0b3JhZ2VDbGllbnQodGhpcy5zdG9yYWdlVXJsLmhyZWYsIHRoaXMuaGVhZGVycywgdGhpcy5mZXRjaCwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnN0b3JhZ2UpO1xuXHRcdGlmICghc2V0dGluZ3MuYWNjZXNzVG9rZW4pIHRoaXMuX2xpc3RlbkZvckF1dGhFdmVudHMoKTtcblx0fVxuXHQvKipcblx0KiBTdXBhYmFzZSBGdW5jdGlvbnMgYWxsb3dzIHlvdSB0byBkZXBsb3kgYW5kIGludm9rZSBlZGdlIGZ1bmN0aW9ucy5cblx0Ki9cblx0Z2V0IGZ1bmN0aW9ucygpIHtcblx0XHRyZXR1cm4gbmV3IEZ1bmN0aW9uc0NsaWVudCh0aGlzLmZ1bmN0aW9uc1VybC5ocmVmLCB7XG5cdFx0XHRoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG5cdFx0XHRjdXN0b21GZXRjaDogdGhpcy5mZXRjaFxuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQqIFBlcmZvcm0gYSBxdWVyeSBvbiBhIHRhYmxlIG9yIGEgdmlldy5cblx0KlxuXHQqIEBwYXJhbSByZWxhdGlvbiAtIFRoZSB0YWJsZSBvciB2aWV3IG5hbWUgdG8gcXVlcnlcblx0Ki9cblx0ZnJvbShyZWxhdGlvbikge1xuXHRcdHJldHVybiB0aGlzLnJlc3QuZnJvbShyZWxhdGlvbik7XG5cdH1cblx0LyoqXG5cdCogU2VsZWN0IGEgc2NoZW1hIHRvIHF1ZXJ5IG9yIHBlcmZvcm0gYW4gZnVuY3Rpb24gKHJwYykgY2FsbC5cblx0KlxuXHQqIFRoZSBzY2hlbWEgbmVlZHMgdG8gYmUgb24gdGhlIGxpc3Qgb2YgZXhwb3NlZCBzY2hlbWFzIGluc2lkZSBTdXBhYmFzZS5cblx0KlxuXHQqIEBwYXJhbSBzY2hlbWEgLSBUaGUgc2NoZW1hIHRvIHF1ZXJ5XG5cdCovXG5cdHNjaGVtYShzY2hlbWEpIHtcblx0XHRyZXR1cm4gdGhpcy5yZXN0LnNjaGVtYShzY2hlbWEpO1xuXHR9XG5cdC8qKlxuXHQqIFBlcmZvcm0gYSBmdW5jdGlvbiBjYWxsLlxuXHQqXG5cdCogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIG5hbWUgdG8gY2FsbFxuXHQqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiBjYWxsXG5cdCogQHBhcmFtIG9wdGlvbnMgLSBOYW1lZCBwYXJhbWV0ZXJzXG5cdCogQHBhcmFtIG9wdGlvbnMuaGVhZCAtIFdoZW4gc2V0IHRvIGB0cnVlYCwgYGRhdGFgIHdpbGwgbm90IGJlIHJldHVybmVkLlxuXHQqIFVzZWZ1bCBpZiB5b3Ugb25seSBuZWVkIHRoZSBjb3VudC5cblx0KiBAcGFyYW0gb3B0aW9ucy5nZXQgLSBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoXG5cdCogcmVhZC1vbmx5IGFjY2VzcyBtb2RlLlxuXHQqIEBwYXJhbSBvcHRpb25zLmNvdW50IC0gQ291bnQgYWxnb3JpdGhtIHRvIHVzZSB0byBjb3VudCByb3dzIHJldHVybmVkIGJ5IHRoZVxuXHQqIGZ1bmN0aW9uLiBPbmx5IGFwcGxpY2FibGUgZm9yIFtzZXQtcmV0dXJuaW5nXG5cdCogZnVuY3Rpb25zXShodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzL2N1cnJlbnQvZnVuY3Rpb25zLXNyZi5odG1sKS5cblx0KlxuXHQqIGBcImV4YWN0XCJgOiBFeGFjdCBidXQgc2xvdyBjb3VudCBhbGdvcml0aG0uIFBlcmZvcm1zIGEgYENPVU5UKCopYCB1bmRlciB0aGVcblx0KiBob29kLlxuXHQqXG5cdCogYFwicGxhbm5lZFwiYDogQXBwcm94aW1hdGVkIGJ1dCBmYXN0IGNvdW50IGFsZ29yaXRobS4gVXNlcyB0aGUgUG9zdGdyZXNcblx0KiBzdGF0aXN0aWNzIHVuZGVyIHRoZSBob29kLlxuXHQqXG5cdCogYFwiZXN0aW1hdGVkXCJgOiBVc2VzIGV4YWN0IGNvdW50IGZvciBsb3cgbnVtYmVycyBhbmQgcGxhbm5lZCBjb3VudCBmb3IgaGlnaFxuXHQqIG51bWJlcnMuXG5cdCovXG5cdHJwYyhmbiwgYXJncyA9IHt9LCBvcHRpb25zID0ge1xuXHRcdGhlYWQ6IGZhbHNlLFxuXHRcdGdldDogZmFsc2UsXG5cdFx0Y291bnQ6IHZvaWQgMFxuXHR9KSB7XG5cdFx0cmV0dXJuIHRoaXMucmVzdC5ycGMoZm4sIGFyZ3MsIG9wdGlvbnMpO1xuXHR9XG5cdC8qKlxuXHQqIENyZWF0ZXMgYSBSZWFsdGltZSBjaGFubmVsIHdpdGggQnJvYWRjYXN0LCBQcmVzZW5jZSwgYW5kIFBvc3RncmVzIENoYW5nZXMuXG5cdCpcblx0KiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBSZWFsdGltZSBjaGFubmVsLlxuXHQqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gVGhlIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgUmVhbHRpbWUgY2hhbm5lbC5cblx0KlxuXHQqL1xuXHRjaGFubmVsKG5hbWUsIG9wdHMgPSB7IGNvbmZpZzoge30gfSkge1xuXHRcdHJldHVybiB0aGlzLnJlYWx0aW1lLmNoYW5uZWwobmFtZSwgb3B0cyk7XG5cdH1cblx0LyoqXG5cdCogUmV0dXJucyBhbGwgUmVhbHRpbWUgY2hhbm5lbHMuXG5cdCovXG5cdGdldENoYW5uZWxzKCkge1xuXHRcdHJldHVybiB0aGlzLnJlYWx0aW1lLmdldENoYW5uZWxzKCk7XG5cdH1cblx0LyoqXG5cdCogVW5zdWJzY3JpYmVzIGFuZCByZW1vdmVzIFJlYWx0aW1lIGNoYW5uZWwgZnJvbSBSZWFsdGltZSBjbGllbnQuXG5cdCpcblx0KiBAcGFyYW0ge1JlYWx0aW1lQ2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBuYW1lIG9mIHRoZSBSZWFsdGltZSBjaGFubmVsLlxuXHQqXG5cdCovXG5cdHJlbW92ZUNoYW5uZWwoY2hhbm5lbCkge1xuXHRcdHJldHVybiB0aGlzLnJlYWx0aW1lLnJlbW92ZUNoYW5uZWwoY2hhbm5lbCk7XG5cdH1cblx0LyoqXG5cdCogVW5zdWJzY3JpYmVzIGFuZCByZW1vdmVzIGFsbCBSZWFsdGltZSBjaGFubmVscyBmcm9tIFJlYWx0aW1lIGNsaWVudC5cblx0Ki9cblx0cmVtb3ZlQWxsQ2hhbm5lbHMoKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVhbHRpbWUucmVtb3ZlQWxsQ2hhbm5lbHMoKTtcblx0fVxuXHRhc3luYyBfZ2V0QWNjZXNzVG9rZW4oKSB7XG5cdFx0dmFyIF90aGlzID0gdGhpcztcblx0XHR2YXIgX2RhdGEkc2Vzc2lvbiRhY2Nlc3NfLCBfZGF0YSRzZXNzaW9uO1xuXHRcdGlmIChfdGhpcy5hY2Nlc3NUb2tlbikgcmV0dXJuIGF3YWl0IF90aGlzLmFjY2Vzc1Rva2VuKCk7XG5cdFx0Y29uc3QgeyBkYXRhIH0gPSBhd2FpdCBfdGhpcy5hdXRoLmdldFNlc3Npb24oKTtcblx0XHRyZXR1cm4gKF9kYXRhJHNlc3Npb24kYWNjZXNzXyA9IChfZGF0YSRzZXNzaW9uID0gZGF0YS5zZXNzaW9uKSA9PT0gbnVsbCB8fCBfZGF0YSRzZXNzaW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZGF0YSRzZXNzaW9uLmFjY2Vzc190b2tlbikgIT09IG51bGwgJiYgX2RhdGEkc2Vzc2lvbiRhY2Nlc3NfICE9PSB2b2lkIDAgPyBfZGF0YSRzZXNzaW9uJGFjY2Vzc18gOiBfdGhpcy5zdXBhYmFzZUtleTtcblx0fVxuXHRfaW5pdFN1cGFiYXNlQXV0aENsaWVudCh7IGF1dG9SZWZyZXNoVG9rZW4sIHBlcnNpc3RTZXNzaW9uLCBkZXRlY3RTZXNzaW9uSW5VcmwsIHN0b3JhZ2UsIHVzZXJTdG9yYWdlLCBzdG9yYWdlS2V5LCBmbG93VHlwZSwgbG9jaywgZGVidWcsIHRocm93T25FcnJvciB9LCBoZWFkZXJzLCBmZXRjaCQxKSB7XG5cdFx0Y29uc3QgYXV0aEhlYWRlcnMgPSB7XG5cdFx0XHRBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5zdXBhYmFzZUtleX1gLFxuXHRcdFx0YXBpa2V5OiBgJHt0aGlzLnN1cGFiYXNlS2V5fWBcblx0XHR9O1xuXHRcdHJldHVybiBuZXcgU3VwYWJhc2VBdXRoQ2xpZW50KHtcblx0XHRcdHVybDogdGhpcy5hdXRoVXJsLmhyZWYsXG5cdFx0XHRoZWFkZXJzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgYXV0aEhlYWRlcnMpLCBoZWFkZXJzKSxcblx0XHRcdHN0b3JhZ2VLZXksXG5cdFx0XHRhdXRvUmVmcmVzaFRva2VuLFxuXHRcdFx0cGVyc2lzdFNlc3Npb24sXG5cdFx0XHRkZXRlY3RTZXNzaW9uSW5VcmwsXG5cdFx0XHRzdG9yYWdlLFxuXHRcdFx0dXNlclN0b3JhZ2UsXG5cdFx0XHRmbG93VHlwZSxcblx0XHRcdGxvY2ssXG5cdFx0XHRkZWJ1Zyxcblx0XHRcdHRocm93T25FcnJvcixcblx0XHRcdGZldGNoOiBmZXRjaCQxLFxuXHRcdFx0aGFzQ3VzdG9tQXV0aG9yaXphdGlvbkhlYWRlcjogT2JqZWN0LmtleXModGhpcy5oZWFkZXJzKS5zb21lKChrZXkpID0+IGtleS50b0xvd2VyQ2FzZSgpID09PSBcImF1dGhvcml6YXRpb25cIilcblx0XHR9KTtcblx0fVxuXHRfaW5pdFJlYWx0aW1lQ2xpZW50KG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gbmV3IFJlYWx0aW1lQ2xpZW50KHRoaXMucmVhbHRpbWVVcmwuaHJlZiwgX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIG9wdGlvbnMpLCB7fSwgeyBwYXJhbXM6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCB7IGFwaWtleTogdGhpcy5zdXBhYmFzZUtleSB9KSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnBhcmFtcykgfSkpO1xuXHR9XG5cdF9saXN0ZW5Gb3JBdXRoRXZlbnRzKCkge1xuXHRcdHJldHVybiB0aGlzLmF1dGgub25BdXRoU3RhdGVDaGFuZ2UoKGV2ZW50LCBzZXNzaW9uKSA9PiB7XG5cdFx0XHR0aGlzLl9oYW5kbGVUb2tlbkNoYW5nZWQoZXZlbnQsIFwiQ0xJRU5UXCIsIHNlc3Npb24gPT09IG51bGwgfHwgc2Vzc2lvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2Vzc2lvbi5hY2Nlc3NfdG9rZW4pO1xuXHRcdH0pO1xuXHR9XG5cdF9oYW5kbGVUb2tlbkNoYW5nZWQoZXZlbnQsIHNvdXJjZSwgdG9rZW4pIHtcblx0XHRpZiAoKGV2ZW50ID09PSBcIlRPS0VOX1JFRlJFU0hFRFwiIHx8IGV2ZW50ID09PSBcIlNJR05FRF9JTlwiKSAmJiB0aGlzLmNoYW5nZWRBY2Nlc3NUb2tlbiAhPT0gdG9rZW4pIHtcblx0XHRcdHRoaXMuY2hhbmdlZEFjY2Vzc1Rva2VuID0gdG9rZW47XG5cdFx0XHR0aGlzLnJlYWx0aW1lLnNldEF1dGgodG9rZW4pO1xuXHRcdH0gZWxzZSBpZiAoZXZlbnQgPT09IFwiU0lHTkVEX09VVFwiKSB7XG5cdFx0XHR0aGlzLnJlYWx0aW1lLnNldEF1dGgoKTtcblx0XHRcdGlmIChzb3VyY2UgPT0gXCJTVE9SQUdFXCIpIHRoaXMuYXV0aC5zaWduT3V0KCk7XG5cdFx0XHR0aGlzLmNoYW5nZWRBY2Nlc3NUb2tlbiA9IHZvaWQgMDtcblx0XHR9XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9pbmRleC50c1xuLyoqXG4qIENyZWF0ZXMgYSBuZXcgU3VwYWJhc2UgQ2xpZW50LlxuKlxuKiBAZXhhbXBsZVxuKiBgYGB0c1xuKiBpbXBvcnQgeyBjcmVhdGVDbGllbnQgfSBmcm9tICdAc3VwYWJhc2Uvc3VwYWJhc2UtanMnXG4qXG4qIGNvbnN0IHN1cGFiYXNlID0gY3JlYXRlQ2xpZW50KCdodHRwczovL3h5emNvbXBhbnkuc3VwYWJhc2UuY28nLCAncHVibGljLWFub24ta2V5JylcbiogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2UuZnJvbSgncHJvZmlsZXMnKS5zZWxlY3QoJyonKVxuKiBgYGBcbiovXG5jb25zdCBjcmVhdGVDbGllbnQgPSAoc3VwYWJhc2VVcmwsIHN1cGFiYXNlS2V5LCBvcHRpb25zKSA9PiB7XG5cdHJldHVybiBuZXcgU3VwYWJhc2VDbGllbnQoc3VwYWJhc2VVcmwsIHN1cGFiYXNlS2V5LCBvcHRpb25zKTtcbn07XG5mdW5jdGlvbiBzaG91bGRTaG93RGVwcmVjYXRpb25XYXJuaW5nKCkge1xuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuXHRpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcblx0Y29uc3QgcHJvY2Vzc1ZlcnNpb24gPSBwcm9jZXNzW1widmVyc2lvblwiXTtcblx0aWYgKHByb2Nlc3NWZXJzaW9uID09PSB2b2lkIDAgfHwgcHJvY2Vzc1ZlcnNpb24gPT09IG51bGwpIHJldHVybiBmYWxzZTtcblx0Y29uc3QgdmVyc2lvbk1hdGNoID0gcHJvY2Vzc1ZlcnNpb24ubWF0Y2goL152KFxcZCspXFwuLyk7XG5cdGlmICghdmVyc2lvbk1hdGNoKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiBwYXJzZUludCh2ZXJzaW9uTWF0Y2hbMV0sIDEwKSA8PSAxODtcbn1cbmlmIChzaG91bGRTaG93RGVwcmVjYXRpb25XYXJuaW5nKCkpIGNvbnNvbGUud2FybihcIuKaoO+4jyAgTm9kZS5qcyAxOCBhbmQgYmVsb3cgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgQHN1cGFiYXNlL3N1cGFiYXNlLWpzLiBQbGVhc2UgdXBncmFkZSB0byBOb2RlLmpzIDIwIG9yIGxhdGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdmlzaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9vcmdzL3N1cGFiYXNlL2Rpc2N1c3Npb25zLzM3MjE3XCIpO1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IEZ1bmN0aW9uUmVnaW9uLCBGdW5jdGlvbnNFcnJvciwgRnVuY3Rpb25zRmV0Y2hFcnJvciwgRnVuY3Rpb25zSHR0cEVycm9yLCBGdW5jdGlvbnNSZWxheUVycm9yLCBQb3N0Z3Jlc3RFcnJvciwgU3VwYWJhc2VDbGllbnQsIGNyZWF0ZUNsaWVudCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcCJdLCJuYW1lcyI6WyJGdW5jdGlvblJlZ2lvbiIsIkZ1bmN0aW9uc0NsaWVudCIsIkZ1bmN0aW9uc0Vycm9yIiwiRnVuY3Rpb25zRmV0Y2hFcnJvciIsIkZ1bmN0aW9uc0h0dHBFcnJvciIsIkZ1bmN0aW9uc1JlbGF5RXJyb3IiLCJQb3N0Z3Jlc3RDbGllbnQiLCJQb3N0Z3Jlc3RFcnJvciIsIlJlYWx0aW1lQ2xpZW50IiwiU3RvcmFnZUNsaWVudCIsIkF1dGhDbGllbnQiLCJ2ZXJzaW9uIiwiSlNfRU5WIiwiRGVubyIsImRvY3VtZW50IiwibmF2aWdhdG9yIiwicHJvZHVjdCIsIkRFRkFVTFRfSEVBREVSUyIsIkRFRkFVTFRfR0xPQkFMX09QVElPTlMiLCJoZWFkZXJzIiwiREVGQVVMVF9EQl9PUFRJT05TIiwic2NoZW1hIiwiREVGQVVMVF9BVVRIX09QVElPTlMiLCJhdXRvUmVmcmVzaFRva2VuIiwicGVyc2lzdFNlc3Npb24iLCJkZXRlY3RTZXNzaW9uSW5VcmwiLCJmbG93VHlwZSIsIkRFRkFVTFRfUkVBTFRJTUVfT1BUSU9OUyIsIl90eXBlb2YiLCJvIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJvJDEiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsInRvUHJpbWl0aXZlIiwidCIsInIiLCJlIiwiaSIsImNhbGwiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJ0b1Byb3BlcnR5S2V5IiwiX2RlZmluZVByb3BlcnR5IiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiciQxIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZDIiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJyZXNvbHZlRmV0Y2giLCJjdXN0b21GZXRjaCIsImFyZ3MiLCJmZXRjaCIsInJlc29sdmVIZWFkZXJzQ29uc3RydWN0b3IiLCJIZWFkZXJzIiwiZmV0Y2hXaXRoQXV0aCIsInN1cGFiYXNlS2V5IiwiZ2V0QWNjZXNzVG9rZW4iLCJmZXRjaCQxIiwiSGVhZGVyc0NvbnN0cnVjdG9yIiwiaW5wdXQiLCJpbml0IiwiX2F3YWl0JGdldEFjY2Vzc1Rva2VuIiwiYWNjZXNzVG9rZW4iLCJoYXMiLCJzZXQiLCJlbnN1cmVUcmFpbGluZ1NsYXNoIiwidXJsIiwiZW5kc1dpdGgiLCJhcHBseVNldHRpbmdEZWZhdWx0cyIsIm9wdGlvbnMiLCJkZWZhdWx0cyIsIl9ERUZBVUxUX0dMT0JBTF9PUFRJTyIsIl9nbG9iYWxPcHRpb25zJGhlYWRlciIsImRiIiwiZGJPcHRpb25zIiwiYXV0aCIsImF1dGhPcHRpb25zIiwicmVhbHRpbWUiLCJyZWFsdGltZU9wdGlvbnMiLCJnbG9iYWwiLCJnbG9iYWxPcHRpb25zIiwiREVGQVVMVF9EQl9PUFRJT05TJDEiLCJERUZBVUxUX0FVVEhfT1BUSU9OUyQxIiwiREVGQVVMVF9SRUFMVElNRV9PUFRJT05TJDEiLCJERUZBVUxUX0dMT0JBTF9PUFRJT05TJDEiLCJyZXN1bHQiLCJzdG9yYWdlIiwidmFsaWRhdGVTdXBhYmFzZVVybCIsInN1cGFiYXNlVXJsIiwidHJpbW1lZFVybCIsInRyaW0iLCJFcnJvciIsIm1hdGNoIiwiVVJMIiwiX3VudXNlZCIsIlN1cGFiYXNlQXV0aENsaWVudCIsIlN1cGFiYXNlQ2xpZW50IiwiX3NldHRpbmdzJGF1dGgkc3RvcmFnIiwiX3NldHRpbmdzJGdsb2JhbCRoZWFkIiwiYmFzZVVybCIsInJlYWx0aW1lVXJsIiwicHJvdG9jb2wiLCJyZXBsYWNlIiwiYXV0aFVybCIsInN0b3JhZ2VVcmwiLCJmdW5jdGlvbnNVcmwiLCJkZWZhdWx0U3RvcmFnZUtleSIsImhvc3RuYW1lIiwic3BsaXQiLCJERUZBVUxUUyIsInN0b3JhZ2VLZXkiLCJzZXR0aW5ncyIsIl9zZXR0aW5ncyRhdXRoIiwiX2luaXRTdXBhYmFzZUF1dGhDbGllbnQiLCJQcm94eSIsImdldCIsIl8iLCJwcm9wIiwiX2dldEFjY2Vzc1Rva2VuIiwiYmluZCIsIl9pbml0UmVhbHRpbWVDbGllbnQiLCJ0aGVuIiwidG9rZW4iLCJzZXRBdXRoIiwiY2F0Y2giLCJjb25zb2xlIiwid2FybiIsInJlc3QiLCJocmVmIiwiX2xpc3RlbkZvckF1dGhFdmVudHMiLCJmdW5jdGlvbnMiLCJmcm9tIiwicmVsYXRpb24iLCJycGMiLCJmbiIsImhlYWQiLCJjb3VudCIsImNoYW5uZWwiLCJuYW1lIiwib3B0cyIsImNvbmZpZyIsImdldENoYW5uZWxzIiwicmVtb3ZlQ2hhbm5lbCIsInJlbW92ZUFsbENoYW5uZWxzIiwiX3RoaXMiLCJfZGF0YSRzZXNzaW9uJGFjY2Vzc18iLCJfZGF0YSRzZXNzaW9uIiwiZGF0YSIsImdldFNlc3Npb24iLCJzZXNzaW9uIiwiYWNjZXNzX3Rva2VuIiwidXNlclN0b3JhZ2UiLCJsb2NrIiwiZGVidWciLCJ0aHJvd09uRXJyb3IiLCJhdXRoSGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJhcGlrZXkiLCJoYXNDdXN0b21BdXRob3JpemF0aW9uSGVhZGVyIiwic29tZSIsImtleSIsInRvTG93ZXJDYXNlIiwicGFyYW1zIiwib25BdXRoU3RhdGVDaGFuZ2UiLCJldmVudCIsIl9oYW5kbGVUb2tlbkNoYW5nZWQiLCJzb3VyY2UiLCJjaGFuZ2VkQWNjZXNzVG9rZW4iLCJzaWduT3V0IiwiY3JlYXRlQ2xpZW50Iiwic2hvdWxkU2hvd0RlcHJlY2F0aW9uV2FybmluZyIsInByb2Nlc3MiLCJwcm9jZXNzVmVyc2lvbiIsInZlcnNpb25NYXRjaCIsInBhcnNlSW50Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/@supabase/supabase-js/dist/index.mjs\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/@supabase/supabase-js/dist/index.mjs":
|
||
/*!***********************************************************!*\
|
||
!*** ./node_modules/@supabase/supabase-js/dist/index.mjs ***!
|
||
\***********************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthAdminApi: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthAdminApi),\n/* harmony export */ AuthApiError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthApiError),\n/* harmony export */ AuthClient: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthClient),\n/* harmony export */ AuthError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthError),\n/* harmony export */ AuthImplicitGrantRedirectError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthImplicitGrantRedirectError),\n/* harmony export */ AuthInvalidCredentialsError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidCredentialsError),\n/* harmony export */ AuthInvalidJwtError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidJwtError),\n/* harmony export */ AuthInvalidTokenResponseError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthInvalidTokenResponseError),\n/* harmony export */ AuthPKCECodeVerifierMissingError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthPKCECodeVerifierMissingError),\n/* harmony export */ AuthPKCEGrantCodeExchangeError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthPKCEGrantCodeExchangeError),\n/* harmony export */ AuthRetryableFetchError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthRetryableFetchError),\n/* harmony export */ AuthSessionMissingError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthSessionMissingError),\n/* harmony export */ AuthUnknownError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthUnknownError),\n/* harmony export */ AuthWeakPasswordError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.AuthWeakPasswordError),\n/* harmony export */ CustomAuthError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.CustomAuthError),\n/* harmony export */ FunctionRegion: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionRegion),\n/* harmony export */ FunctionsError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsError),\n/* harmony export */ FunctionsFetchError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsFetchError),\n/* harmony export */ FunctionsHttpError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsHttpError),\n/* harmony export */ FunctionsRelayError: () => (/* reexport safe */ _supabase_functions_js__WEBPACK_IMPORTED_MODULE_5__.FunctionsRelayError),\n/* harmony export */ GoTrueAdminApi: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.GoTrueAdminApi),\n/* harmony export */ GoTrueClient: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.GoTrueClient),\n/* harmony export */ NavigatorLockAcquireTimeoutError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.NavigatorLockAcquireTimeoutError),\n/* harmony export */ PostgrestError: () => (/* reexport safe */ _supabase_postgrest_js__WEBPACK_IMPORTED_MODULE_0__.PostgrestError),\n/* harmony export */ REALTIME_CHANNEL_STATES: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_CHANNEL_STATES),\n/* harmony export */ REALTIME_LISTEN_TYPES: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_LISTEN_TYPES),\n/* harmony export */ REALTIME_POSTGRES_CHANGES_LISTEN_EVENT: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_POSTGRES_CHANGES_LISTEN_EVENT),\n/* harmony export */ REALTIME_PRESENCE_LISTEN_EVENTS: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_PRESENCE_LISTEN_EVENTS),\n/* harmony export */ REALTIME_SUBSCRIBE_STATES: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.REALTIME_SUBSCRIBE_STATES),\n/* harmony export */ RealtimeChannel: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.RealtimeChannel),\n/* harmony export */ RealtimeClient: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.RealtimeClient),\n/* harmony export */ RealtimePresence: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.RealtimePresence),\n/* harmony export */ SIGN_OUT_SCOPES: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.SIGN_OUT_SCOPES),\n/* harmony export */ SupabaseClient: () => (/* binding */ SupabaseClient),\n/* harmony export */ WebSocketFactory: () => (/* reexport safe */ _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__.WebSocketFactory),\n/* harmony export */ createClient: () => (/* binding */ createClient),\n/* harmony export */ isAuthApiError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthApiError),\n/* harmony export */ isAuthError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthError),\n/* harmony export */ isAuthImplicitGrantRedirectError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthImplicitGrantRedirectError),\n/* harmony export */ isAuthPKCECodeVerifierMissingError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthPKCECodeVerifierMissingError),\n/* harmony export */ isAuthRetryableFetchError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthRetryableFetchError),\n/* harmony export */ isAuthSessionMissingError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthSessionMissingError),\n/* harmony export */ isAuthWeakPasswordError: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.isAuthWeakPasswordError),\n/* harmony export */ lockInternals: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.lockInternals),\n/* harmony export */ navigatorLock: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.navigatorLock),\n/* harmony export */ processLock: () => (/* reexport safe */ _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__.processLock)\n/* harmony export */ });\n/* harmony import */ var _supabase_functions_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @supabase/functions-js */ \"(rsc)/./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 */ \"(rsc)/./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 */ \"(rsc)/./node_modules/@supabase/postgrest-js/dist/index.mjs\");\n/* harmony import */ var _supabase_realtime_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @supabase/realtime-js */ \"(rsc)/./node_modules/@supabase/realtime-js/dist/module/index.js\");\n/* harmony import */ var _supabase_storage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @supabase/storage-js */ \"(rsc)/./node_modules/@supabase/storage-js/dist/index.mjs\");\n/* harmony import */ var _supabase_auth_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @supabase/auth-js */ \"(rsc)/./node_modules/@supabase/auth-js/dist/module/index.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-${JS_ENV}/${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 (...args)=>customFetch(...args);\n return (...args)=>fetch(...args);\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 ${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* 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-${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.${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_3__.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\t* Supabase Functions allows you to deploy and invoke edge functions.\n\t*/ get functions() {\n return new _supabase_functions_js__WEBPACK_IMPORTED_MODULE_4__.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, args = {}, options = {\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, opts = {\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({ autoRefreshToken, persistSession, detectSessionInUrl, storage, userStorage, storageKey, flowType, lock, debug, throwOnError }, headers, fetch$1) {\n const authHeaders = {\n Authorization: `Bearer ${this.supabaseKey}`,\n apikey: `${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//#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 (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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvQHN1cGFiYXNlL3N1cGFiYXNlLWpzL2Rpc3QvaW5kZXgubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBdUo7QUFDOUU7QUFDbEI7QUFDRjtBQUNOO0FBRVY7QUFFSjtBQUVqQyw0QkFBNEI7QUFDNUIsTUFBTVcsVUFBVTtBQUVoQixZQUFZO0FBQ1osOEJBQThCO0FBQzlCLElBQUlDLFNBQVM7QUFDYixJQUFJLE9BQU9DLFNBQVMsYUFBYUQsU0FBUztLQUNyQyxJQUFJLE9BQU9FLGFBQWEsYUFBYUYsU0FBUztLQUM5QyxJQUFJLE9BQU9HLGNBQWMsZUFBZUEsVUFBVUMsT0FBTyxLQUFLLGVBQWVKLFNBQVM7S0FDdEZBLFNBQVM7QUFDZCxNQUFNSyxrQkFBa0I7SUFBRSxpQkFBaUIsQ0FBQyxZQUFZLEVBQUVMLE9BQU8sQ0FBQyxFQUFFRCxRQUFRLENBQUM7QUFBQztBQUM5RSxNQUFNTyx5QkFBeUI7SUFBRUMsU0FBU0Y7QUFBZ0I7QUFDMUQsTUFBTUcscUJBQXFCO0lBQUVDLFFBQVE7QUFBUztBQUM5QyxNQUFNQyx1QkFBdUI7SUFDNUJDLGtCQUFrQjtJQUNsQkMsZ0JBQWdCO0lBQ2hCQyxvQkFBb0I7SUFDcEJDLFVBQVU7QUFDWDtBQUNBLE1BQU1DLDJCQUEyQixDQUFDO0FBRWxDLFlBQVk7QUFDWiwwREFBMEQ7QUFDMUQsU0FBU0MsUUFBUUMsQ0FBQztJQUNqQjtJQUNBLE9BQU9ELFVBQVUsY0FBYyxPQUFPRSxVQUFVLFlBQVksT0FBT0EsT0FBT0MsUUFBUSxHQUFHLFNBQVNDLEdBQUc7UUFDaEcsT0FBTyxPQUFPQTtJQUNmLElBQUksU0FBU0EsR0FBRztRQUNmLE9BQU9BLE9BQU8sY0FBYyxPQUFPRixVQUFVRSxJQUFJQyxXQUFXLEtBQUtILFVBQVVFLFFBQVFGLE9BQU9JLFNBQVMsR0FBRyxXQUFXLE9BQU9GO0lBQ3pILEdBQUdKLFFB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QUFrQyIsInNvdXJjZXMiOlsid2VicGFjazovL3doaXNreS12YXVsdC8uL25vZGVfbW9kdWxlcy9Ac3VwYWJhc2Uvc3VwYWJhc2UtanMvZGlzdC9pbmRleC5tanM/NDkzYSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGdW5jdGlvblJlZ2lvbiwgRnVuY3Rpb25zQ2xpZW50LCBGdW5jdGlvbnNFcnJvciwgRnVuY3Rpb25zRmV0Y2hFcnJvciwgRnVuY3Rpb25zSHR0cEVycm9yLCBGdW5jdGlvbnNSZWxheUVycm9yIH0gZnJvbSBcIkBzdXBhYmFzZS9mdW5jdGlvbnMtanNcIjtcbmltcG9ydCB7IFBvc3RncmVzdENsaWVudCwgUG9zdGdyZXN0RXJyb3IgfSBmcm9tIFwiQHN1cGFiYXNlL3Bvc3RncmVzdC1qc1wiO1xuaW1wb3J0IHsgUmVhbHRpbWVDbGllbnQgfSBmcm9tIFwiQHN1cGFiYXNlL3JlYWx0aW1lLWpzXCI7XG5pbXBvcnQgeyBTdG9yYWdlQ2xpZW50IH0gZnJvbSBcIkBzdXBhYmFzZS9zdG9yYWdlLWpzXCI7XG5pbXBvcnQgeyBBdXRoQ2xpZW50IH0gZnJvbSBcIkBzdXBhYmFzZS9hdXRoLWpzXCI7XG5cbmV4cG9ydCAqIGZyb20gXCJAc3VwYWJhc2UvcmVhbHRpbWUtanNcIlxuXG5leHBvcnQgKiBmcm9tIFwiQHN1cGFiYXNlL2F1dGgtanNcIlxuXG4vLyNyZWdpb24gc3JjL2xpYi92ZXJzaW9uLnRzXG5jb25zdCB2ZXJzaW9uID0gXCIyLjg4LjBcIjtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi9jb25zdGFudHMudHNcbmxldCBKU19FTlYgPSBcIlwiO1xuaWYgKHR5cGVvZiBEZW5vICE9PSBcInVuZGVmaW5lZFwiKSBKU19FTlYgPSBcImRlbm9cIjtcbmVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikgSlNfRU5WID0gXCJ3ZWJcIjtcbmVsc2UgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLnByb2R1Y3QgPT09IFwiUmVhY3ROYXRpdmVcIikgSlNfRU5WID0gXCJyZWFjdC1uYXRpdmVcIjtcbmVsc2UgSlNfRU5WID0gXCJub2RlXCI7XG5jb25zdCBERUZBVUxUX0hFQURFUlMgPSB7IFwiWC1DbGllbnQtSW5mb1wiOiBgc3VwYWJhc2UtanMtJHtKU19FTlZ9LyR7dmVyc2lvbn1gIH07XG5jb25zdCBERUZBVUxUX0dMT0JBTF9PUFRJT05TID0geyBoZWFkZXJzOiBERUZBVUxUX0hFQURFUlMgfTtcbmNvbnN0IERFRkFVTFRfREJfT1BUSU9OUyA9IHsgc2NoZW1hOiBcInB1YmxpY1wiIH07XG5jb25zdCBERUZBVUxUX0FVVEhfT1BUSU9OUyA9IHtcblx0YXV0b1JlZnJlc2hUb2tlbjogdHJ1ZSxcblx0cGVyc2lzdFNlc3Npb246IHRydWUsXG5cdGRldGVjdFNlc3Npb25JblVybDogdHJ1ZSxcblx0Zmxvd1R5cGU6IFwiaW1wbGljaXRcIlxufTtcbmNvbnN0IERFRkFVTFRfUkVBTFRJTUVfT1BUSU9OUyA9IHt9O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBcXDBAb3hjLXByb2plY3QrcnVudGltZUAwLjEwMS4wL2hlbHBlcnMvdHlwZW9mLmpzXG5mdW5jdGlvbiBfdHlwZW9mKG8pIHtcblx0XCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXHRyZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uKG8kMSkge1xuXHRcdHJldHVybiB0eXBlb2YgbyQxO1xuXHR9IDogZnVuY3Rpb24obyQxKSB7XG5cdFx0cmV0dXJuIG8kMSAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvJDEuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvJDEgIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG8kMTtcblx0fSwgX3R5cGVvZihvKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gXFwwQG94Yy1wcm9qZWN0K3J1bnRpbWVAMC4xMDEuMC9oZWxwZXJzL3RvUHJpbWl0aXZlLmpzXG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG5cdGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuXHR2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcblx0aWYgKHZvaWQgMCAhPT0gZSkge1xuXHRcdHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuXHRcdGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpO1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcblx0fVxuXHRyZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBcXDBAb3hjLXByb2plY3QrcnVudGltZUAwLjEwMS4wL2hlbHBlcnMvdG9Qcm9wZXJ0eUtleS5qc1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG5cdHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG5cdHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIFxcMEBveGMtcHJvamVjdCtydW50aW1lQDAuMTAxLjAvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qc1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHtcblx0cmV0dXJuIChyID0gdG9Qcm9wZXJ0eUtleShyKSkgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCB7XG5cdFx0dmFsdWU6IHQsXG5cdFx0ZW51bWVyYWJsZTogITAsXG5cdFx0Y29uZmlndXJhYmxlOiAhMCxcblx0XHR3cml0YWJsZTogITBcblx0fSkgOiBlW3JdID0gdCwgZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gXFwwQG94Yy1wcm9qZWN0K3J1bnRpbWVAMC4xMDEuMC9oZWxwZXJzL29iamVjdFNwcmVhZDIuanNcbmZ1bmN0aW9uIG93bktleXMoZSwgcikge1xuXHR2YXIgdCA9IE9iamVjdC5rZXlzKGUpO1xuXHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtcblx0XHRyICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24ociQxKSB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByJDEpLmVudW1lcmFibGU7XG5cdFx0fSkpLCB0LnB1c2guYXBwbHkodCwgbyk7XG5cdH1cblx0cmV0dXJuIHQ7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMihlKSB7XG5cdGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7XG5cdFx0dmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9O1xuXHRcdHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIkMSkge1xuXHRcdFx0X2RlZmluZVByb3BlcnR5KGUsIHIkMSwgdFtyJDFdKTtcblx0XHR9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24ociQxKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciQxLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIkMSkpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL2ZldGNoLnRzXG5jb25zdCByZXNvbHZlRmV0Y2ggPSAoY3VzdG9tRmV0Y2gpID0+IHtcblx0aWYgKGN1c3RvbUZldGNoKSByZXR1cm4gKC4uLmFyZ3MpID0+IGN1c3RvbUZldGNoKC4uLmFyZ3MpO1xuXHRyZXR1cm4gKC4uLmFyZ3MpID0+IGZldGNoKC4uLmFyZ3MpO1xufTtcbmNvbnN0IHJlc29sdmVIZWFkZXJzQ29uc3RydWN0b3IgPSAoKSA9PiB7XG5cdHJldHVybiBIZWFkZXJzO1xufTtcbmNvbnN0IGZldGNoV2l0aEF1dGggPSAoc3VwYWJhc2VLZXksIGdldEFjY2Vzc1Rva2VuLCBjdXN0b21GZXRjaCkgPT4ge1xuXHRjb25zdCBmZXRjaCQxID0gcmVzb2x2ZUZldGNoKGN1c3RvbUZldGNoKTtcblx0Y29uc3QgSGVhZGVyc0NvbnN0cnVjdG9yID0gcmVzb2x2ZUhlYWRlcnNDb25zdHJ1Y3RvcigpO1xuXHRyZXR1cm4gYXN5bmMgKGlucHV0LCBpbml0KSA9PiB7XG5cdFx0dmFyIF9hd2FpdCRnZXRBY2Nlc3NUb2tlbjtcblx0XHRjb25zdCBhY2Nlc3NUb2tlbiA9IChfYXdhaXQkZ2V0QWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpKSAhPT0gbnVsbCAmJiBfYXdhaXQkZ2V0QWNjZXNzVG9rZW4gIT09IHZvaWQgMCA/IF9hd2FpdCRnZXRBY2Nlc3NUb2tlbiA6IHN1cGFiYXNlS2V5O1xuXHRcdGxldCBoZWFkZXJzID0gbmV3IEhlYWRlcnNDb25zdHJ1Y3Rvcihpbml0ID09PSBudWxsIHx8IGluaXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluaXQuaGVhZGVycyk7XG5cdFx0aWYgKCFoZWFkZXJzLmhhcyhcImFwaWtleVwiKSkgaGVhZGVycy5zZXQoXCJhcGlrZXlcIiwgc3VwYWJhc2VLZXkpO1xuXHRcdGlmICghaGVhZGVycy5oYXMoXCJBdXRob3JpemF0aW9uXCIpKSBoZWFkZXJzLnNldChcIkF1dGhvcml6YXRpb25cIiwgYEJlYXJlciAke2FjY2Vzc1Rva2VufWApO1xuXHRcdHJldHVybiBmZXRjaCQxKGlucHV0LCBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgaW5pdCksIHt9LCB7IGhlYWRlcnMgfSkpO1xuXHR9O1xufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2xpYi9oZWxwZXJzLnRzXG5mdW5jdGlvbiBlbnN1cmVUcmFpbGluZ1NsYXNoKHVybCkge1xuXHRyZXR1cm4gdXJsLmVuZHNXaXRoKFwiL1wiKSA/IHVybCA6IHVybCArIFwiL1wiO1xufVxuZnVuY3Rpb24gYXBwbHlTZXR0aW5nRGVmYXVsdHMob3B0aW9ucywgZGVmYXVsdHMpIHtcblx0dmFyIF9ERUZBVUxUX0dMT0JBTF9PUFRJTywgX2dsb2JhbE9wdGlvbnMkaGVhZGVyO1xuXHRjb25zdCB7IGRiOiBkYk9wdGlvbnMsIGF1dGg6IGF1dGhPcHRpb25zLCByZWFsdGltZTogcmVhbHRpbWVPcHRpb25zLCBnbG9iYWw6IGdsb2JhbE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHsgZGI6IERFRkFVTFRfREJfT1BUSU9OUyQxLCBhdXRoOiBERUZBVUxUX0FVVEhfT1BUSU9OUyQxLCByZWFsdGltZTogREVGQVVMVF9SRUFMVElNRV9PUFRJT05TJDEsIGdsb2JhbDogREVGQVVMVF9HTE9CQUxfT1BUSU9OUyQxIH0gPSBkZWZhdWx0cztcblx0Y29uc3QgcmVzdWx0ID0ge1xuXHRcdGRiOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9EQl9PUFRJT05TJDEpLCBkYk9wdGlvbnMpLFxuXHRcdGF1dGg6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX0FVVEhfT1BUSU9OUyQxKSwgYXV0aE9wdGlvbnMpLFxuXHRcdHJlYWx0aW1lOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgREVGQVVMVF9SRUFMVElNRV9PUFRJT05TJDEpLCByZWFsdGltZU9wdGlvbnMpLFxuXHRcdHN0b3JhZ2U6IHt9LFxuXHRcdGdsb2JhbDogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIERFRkFVTFRfR0xPQkFMX09QVElPTlMkMSksIGdsb2JhbE9wdGlvbnMpLCB7fSwgeyBoZWFkZXJzOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgKF9ERUZBVUxUX0dMT0JBTF9PUFRJTyA9IERFRkFVTFRfR0xPQkFMX09QVElPTlMkMSA9PT0gbnVsbCB8fCBERUZBVUxUX0dMT0JBTF9PUFRJT05TJDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IERFRkFVTFRfR0xPQkFMX09QVElPTlMkMS5oZWFkZXJzKSAhPT0gbnVsbCAmJiBfREVGQVVMVF9HTE9CQUxfT1BUSU8gIT09IHZvaWQgMCA/IF9ERUZBVUxUX0dMT0JBTF9PUFRJTyA6IHt9KSwgKF9nbG9iYWxPcHRpb25zJGhlYWRlciA9IGdsb2JhbE9wdGlvbnMgPT09IG51bGwgfHwgZ2xvYmFsT3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ2xvYmFsT3B0aW9ucy5oZWFkZXJzKSAhPT0gbnVsbCAmJiBfZ2xvYmFsT3B0aW9ucyRoZWFkZXIgIT09IHZvaWQgMCA/IF9nbG9iYWxPcHRpb25zJGhlYWRlciA6IHt9KSB9KSxcblx0XHRhY2Nlc3NUb2tlbjogYXN5bmMgKCkgPT4gXCJcIlxuXHR9O1xuXHRpZiAob3B0aW9ucy5hY2Nlc3NUb2tlbikgcmVzdWx0LmFjY2Vzc1Rva2VuID0gb3B0aW9ucy5hY2Nlc3NUb2tlbjtcblx0ZWxzZSBkZWxldGUgcmVzdWx0LmFjY2Vzc1Rva2VuO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4qIFZhbGlkYXRlcyBhIFN1cGFiYXNlIGNsaWVudCBVUkxcbipcbiogQHBhcmFtIHtzdHJpbmd9IHN1cGFiYXNlVXJsIC0gVGhlIFN1cGFiYXNlIGNsaWVudCBVUkwgc3RyaW5nLlxuKiBAcmV0dXJucyB7VVJMfSAtIFRoZSB2YWxpZGF0ZWQgYmFzZSBVUkwuXG4qIEB0aHJvd3Mge0Vycm9yfVxuKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3VwYWJhc2VVcmwoc3VwYWJhc2VVcmwpIHtcblx0Y29uc3QgdHJpbW1lZFVybCA9IHN1cGFiYXNlVXJsID09PSBudWxsIHx8IHN1cGFiYXNlVXJsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdXBhYmFzZVVybC50cmltKCk7XG5cdGlmICghdHJpbW1lZFVybCkgdGhyb3cgbmV3IEVycm9yKFwic3VwYWJhc2VVcmwgaXMgcmVxdWlyZWQuXCIpO1xuXHRpZiAoIXRyaW1tZWRVcmwubWF0Y2goL15odHRwcz86XFwvXFwvL2kpKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN1cGFiYXNlVXJsOiBNdXN0IGJlIGEgdmFsaWQgSFRUUCBvciBIVFRQUyBVUkwuXCIpO1xuXHR0cnkge1xuXHRcdHJldHVybiBuZXcgVVJMKGVuc3VyZVRyYWlsaW5nU2xhc2godHJpbW1lZFVybCkpO1xuXHR9IGNhdGNoIChfdW51c2VkKSB7XG5cdFx0dGhyb3cgRXJyb3IoXCJJbnZhbGlkIHN1cGFiYXNlVXJsOiBQcm92aWRlZCBVUkwgaXMgbWFsZm9ybWVkLlwiKTtcblx0fVxufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbGliL1N1cGFiYXNlQXV0aENsaWVudC50c1xudmFyIFN1cGFiYXNlQXV0aENsaWVudCA9IGNsYXNzIGV4dGVuZHMgQXV0aENsaWVudCB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRzdXBlcihvcHRpb25zKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL1N1cGFiYXNlQ2xpZW50LnRzXG4vKipcbiogU3VwYWJhc2UgQ2xpZW50LlxuKlxuKiBBbiBpc29tb3JwaGljIEphdmFzY3JpcHQgY2xpZW50IGZvciBpbnRlcmFjdGluZyB3aXRoIFBvc3RncmVzLlxuKi9cbnZhciBTdXBhYmFzZUNsaWVudCA9IGNsYXNzIHtcblx0LyoqXG5cdCogQ3JlYXRlIGEgbmV3IGNsaWVudCBmb3IgdXNlIGluIHRoZSBicm93c2VyLlxuXHQqIEBwYXJhbSBzdXBhYmFzZVVybCBUaGUgdW5pcXVlIFN1cGFiYXNlIFVSTCB3aGljaCBpcyBzdXBwbGllZCB3aGVuIHlvdSBjcmVhdGUgYSBuZXcgcHJvamVjdCBpbiB5b3VyIHByb2plY3QgZGFzaGJvYXJkLlxuXHQqIEBwYXJhbSBzdXBhYmFzZUtleSBUaGUgdW5pcXVlIFN1cGFiYXNlIEtleSB3aGljaCBpcyBzdXBwbGllZCB3aGVuIHlvdSBjcmVhdGUgYSBuZXcgcHJvamVjdCBpbiB5b3VyIHByb2plY3QgZGFzaGJvYXJkLlxuXHQqIEBwYXJhbSBvcHRpb25zLmRiLnNjaGVtYSBZb3UgY2FuIHN3aXRjaCBpbiBiZXR3ZWVuIHNjaGVtYXMuIFRoZSBzY2hlbWEgbmVlZHMgdG8gYmUgb24gdGhlIGxpc3Qgb2YgZXhwb3NlZCBzY2hlbWFzIGluc2lkZSBTdXBhYmFzZS5cblx0KiBAcGFyYW0gb3B0aW9ucy5hdXRoLmF1dG9SZWZyZXNoVG9rZW4gU2V0IHRvIFwidHJ1ZVwiIGlmIHlvdSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB0aGUgdG9rZW4gYmVmb3JlIGV4cGlyaW5nLlxuXHQqIEBwYXJhbSBvcHRpb25zLmF1dGgucGVyc2lzdFNlc3Npb24gU2V0IHRvIFwidHJ1ZVwiIGlmIHlvdSB3YW50IHRvIGF1dG9tYXRpY2FsbHkgc2F2ZSB0aGUgdXNlciBzZXNzaW9uIGludG8gbG9jYWwgc3RvcmFnZS5cblx0KiBAcGFyYW0gb3B0aW9ucy5hdXRoLmRldGVjdFNlc3Npb25JblVybCBTZXQgdG8gXCJ0cnVlXCIgaWYgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseSBkZXRlY3RzIE9BdXRoIGdyYW50cyBpbiB0aGUgVVJMIGFuZCBzaWducyBpbiB0aGUgdXNlci5cblx0KiBAcGFyYW0gb3B0aW9ucy5yZWFsdGltZSBPcHRpb25zIHBhc3NlZCBhbG9uZyB0byByZWFsdGltZS1qcyBjb25zdHJ1Y3Rvci5cblx0KiBAcGFyYW0gb3B0aW9ucy5zdG9yYWdlIE9wdGlvbnMgcGFzc2VkIGFsb25nIHRvIHRoZSBzdG9yYWdlLWpzIGNvbnN0cnVjdG9yLlxuXHQqIEBwYXJhbSBvcHRpb25zLmdsb2JhbC5mZXRjaCBBIGN1c3RvbSBmZXRjaCBpbXBsZW1lbnRhdGlvbi5cblx0KiBAcGFyYW0gb3B0aW9ucy5nbG9iYWwuaGVhZGVycyBBbnkgYWRkaXRpb25hbCBoZWFkZXJzIHRvIHNlbmQgd2l0aCBlYWNoIG5ldHdvcmsgcmVxdWVzdC5cblx0KiBAZXhhbXBsZVxuXHQqIGBgYHRzXG5cdCogaW1wb3J0IHsgY3JlYXRlQ2xpZW50IH0gZnJvbSAnQHN1cGFiYXNlL3N1cGFiYXNlLWpzJ1xuXHQqXG5cdCogY29uc3Qgc3VwYWJhc2UgPSBjcmVhdGVDbGllbnQoJ2h0dHBzOi8veHl6Y29tcGFueS5zdXBhYmFzZS5jbycsICdwdWJsaWMtYW5vbi1rZXknKVxuXHQqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgc3VwYWJhc2UuZnJvbSgncHJvZmlsZXMnKS5zZWxlY3QoJyonKVxuXHQqIGBgYFxuXHQqL1xuXHRjb25zdHJ1Y3RvcihzdXBhYmFzZVVybCwgc3VwYWJhc2VLZXksIG9wdGlvbnMpIHtcblx0XHR2YXIgX3NldHRpbmdzJGF1dGgkc3RvcmFnLCBfc2V0dGluZ3MkZ2xvYmFsJGhlYWQ7XG5cdFx0dGhpcy5zdXBhYmFzZVVybCA9IHN1cGFiYXNlVXJsO1xuXHRcdHRoaXMuc3VwYWJhc2VLZXkgPSBzdXBhYmFzZUtleTtcblx0XHRjb25zdCBiYXNlVXJsID0gdmFsaWRhdGVTdXBhYmFzZVVybChzdXBhYmFzZVVybCk7XG5cdFx0aWYgKCFzdXBhYmFzZUtleSkgdGhyb3cgbmV3IEVycm9yKFwic3VwYWJhc2VLZXkgaXMgcmVxdWlyZWQuXCIpO1xuXHRcdHRoaXMucmVhbHRpbWVVcmwgPSBuZXcgVVJMKFwicmVhbHRpbWUvdjFcIiwgYmFzZVVybCk7XG5cdFx0dGhpcy5yZWFsdGltZVVybC5wcm90b2NvbCA9IHRoaXMucmVhbHRpbWVVcmwucHJvdG9jb2wucmVwbGFjZShcImh0dHBcIiwgXCJ3c1wiKTtcblx0XHR0aGlzLmF1dGhVcmwgPSBuZXcgVVJMKFwiYXV0aC92MVwiLCBiYXNlVXJsKTtcblx0XHR0aGlzLnN0b3JhZ2VVcmwgPSBuZXcgVVJMKFwic3RvcmFnZS92MVwiLCBiYXNlVXJsKTtcblx0XHR0aGlzLmZ1bmN0aW9uc1VybCA9IG5ldyBVUkwoXCJmdW5jdGlvbnMvdjFcIiwgYmFzZVVybCk7XG5cdFx0Y29uc3QgZGVmYXVsdFN0b3JhZ2VLZXkgPSBgc2ItJHtiYXNlVXJsLmhvc3RuYW1lLnNwbGl0KFwiLlwiKVswXX0tYXV0aC10b2tlbmA7XG5cdFx0Y29uc3QgREVGQVVMVFMgPSB7XG5cdFx0XHRkYjogREVGQVVMVF9EQl9PUFRJT05TLFxuXHRcdFx0cmVhbHRpbWU6IERFRkFVTFRfUkVBTFRJTUVfT1BUSU9OUyxcblx0XHRcdGF1dGg6IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBERUZBVUxUX0FVVEhfT1BUSU9OUyksIHt9LCB7IHN0b3JhZ2VLZXk6IGRlZmF1bHRTdG9yYWdlS2V5IH0pLFxuXHRcdFx0Z2xvYmFsOiBERUZBVUxUX0dMT0JBTF9PUFRJT05TXG5cdFx0fTtcblx0XHRjb25zdCBzZXR0aW5ncyA9IGFwcGx5U2V0dGluZ0RlZmF1bHRzKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9LCBERUZBVUxUUyk7XG5cdFx0dGhpcy5zdG9yYWdlS2V5ID0gKF9zZXR0aW5ncyRhdXRoJHN0b3JhZyA9IHNldHRpbmdzLmF1dGguc3RvcmFnZUtleSkgIT09IG51bGwgJiYgX3NldHRpbmdzJGF1dGgkc3RvcmFnICE9PSB2b2lkIDAgPyBfc2V0dGluZ3MkYXV0aCRzdG9yYWcgOiBcIlwiO1xuXHRcdHRoaXMuaGVhZGVycyA9IChfc2V0dGluZ3MkZ2xvYmFsJGhlYWQgPSBzZXR0aW5ncy5nbG9iYWwuaGVhZGVycykgIT09IG51bGwgJiYgX3NldHRpbmdzJGdsb2JhbCRoZWFkICE9PSB2b2lkIDAgPyBfc2V0dGluZ3MkZ2xvYmFsJGhlYWQgOiB7fTtcblx0XHRpZiAoIXNldHRpbmdzLmFjY2Vzc1Rva2VuKSB7XG5cdFx0XHR2YXIgX3NldHRpbmdzJGF1dGg7XG5cdFx0XHR0aGlzLmF1dGggPSB0aGlzLl9pbml0U3VwYWJhc2VBdXRoQ2xpZW50KChfc2V0dGluZ3MkYXV0aCA9IHNldHRpbmdzLmF1dGgpICE9PSBudWxsICYmIF9zZXR0aW5ncyRhdXRoICE9PSB2b2lkIDAgPyBfc2V0dGluZ3MkYXV0aCA6IHt9LCB0aGlzLmhlYWRlcnMsIHNldHRpbmdzLmdsb2JhbC5mZXRjaCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYWNjZXNzVG9rZW4gPSBzZXR0aW5ncy5hY2Nlc3NUb2tlbjtcblx0XHRcdHRoaXMuYXV0aCA9IG5ldyBQcm94eSh7fSwgeyBnZXQ6IChfLCBwcm9wKSA9PiB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQHN1cGFiYXNlL3N1cGFiYXNlLWpzOiBTdXBhYmFzZSBDbGllbnQgaXMgY29uZmlndXJlZCB3aXRoIHRoZSBhY2Nlc3NUb2tlbiBvcHRpb24sIGFjY2Vzc2luZyBzdXBhYmFzZS5hdXRoLiR7U3RyaW5nKHByb3ApfSBpcyBub3QgcG9zc2libGVgKTtcblx0XHRcdH0gfSk7XG5cdFx0fVxuXHRcdHRoaXMuZmV0Y2ggPSBmZXRjaFdpdGhBdXRoKHN1cGFiYXNlS2V5LCB0aGlzLl9nZXRBY2Nlc3NUb2tlbi5iaW5kKHRoaXMpLCBzZXR0aW5ncy5nbG9iYWwuZmV0Y2gpO1xuXHRcdHRoaXMucmVhbHRpbWUgPSB0aGlzLl9pbml0UmVhbHRpbWVDbGllbnQoX29iamVjdFNwcmVhZDIoe1xuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0YWNjZXNzVG9rZW46IHRoaXMuX2dldEFjY2Vzc1Rva2VuLmJpbmQodGhpcylcblx0XHR9LCBzZXR0aW5ncy5yZWFsdGltZSkpO1xuXHRcdGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB0aGlzLmFjY2Vzc1Rva2VuKCkudGhlbigodG9rZW4pID0+IHRoaXMucmVhbHRpbWUuc2V0QXV0aCh0b2tlbikpLmNhdGNoKChlKSA9PiBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gc2V0IGluaXRpYWwgUmVhbHRpbWUgYXV0aCB0b2tlbjpcIiwgZSkpO1xuXHRcdHRoaXMucmVzdCA9IG5ldyBQb3N0Z3Jlc3RDbGllbnQobmV3IFVSTChcInJlc3QvdjFcIiwgYmFzZVVybCkuaHJlZiwge1xuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0c2NoZW1hOiBzZXR0aW5ncy5kYi5zY2hlbWEsXG5cdFx0XHRmZXRjaDogdGhpcy5mZXRjaFxuXHRcdH0pO1xuXHRcdHRoaXMuc3RvcmFnZSA9IG5ldyBTdG9yYWdlQ2xpZW50KHRoaXMuc3RvcmFnZVVybC5ocmVmLCB0aGlzLmhlYWRlcnMsIHRoaXMuZmV0Y2gsIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zdG9yYWdlKTtcblx0XHRpZiAoIXNldHRpbmdzLmFjY2Vzc1Rva2VuKSB0aGlzLl9saXN0ZW5Gb3JBdXRoRXZlbnRzKCk7XG5cdH1cblx0LyoqXG5cdCogU3VwYWJhc2UgRnVuY3Rpb25zIGFsbG93cyB5b3UgdG8gZGVwbG95IGFuZCBpbnZva2UgZWRnZSBmdW5jdGlvbnMuXG5cdCovXG5cdGdldCBmdW5jdGlvbnMoKSB7XG5cdFx0cmV0dXJuIG5ldyBGdW5jdGlvbnNDbGllbnQodGhpcy5mdW5jdGlvbnNVcmwuaHJlZiwge1xuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0Y3VzdG9tRmV0Y2g6IHRoaXMuZmV0Y2hcblx0XHR9KTtcblx0fVxuXHQvKipcblx0KiBQZXJmb3JtIGEgcXVlcnkgb24gYSB0YWJsZSBvciBhIHZpZXcuXG5cdCpcblx0KiBAcGFyYW0gcmVsYXRpb24gLSBUaGUgdGFibGUgb3IgdmlldyBuYW1lIHRvIHF1ZXJ5XG5cdCovXG5cdGZyb20ocmVsYXRpb24pIHtcblx0XHRyZXR1cm4gdGhpcy5yZXN0LmZyb20ocmVsYXRpb24pO1xuXHR9XG5cdC8qKlxuXHQqIFNlbGVjdCBhIHNjaGVtYSB0byBxdWVyeSBvciBwZXJmb3JtIGFuIGZ1bmN0aW9uIChycGMpIGNhbGwuXG5cdCpcblx0KiBUaGUgc2NoZW1hIG5lZWRzIHRvIGJlIG9uIHRoZSBsaXN0IG9mIGV4cG9zZWQgc2NoZW1hcyBpbnNpZGUgU3VwYWJhc2UuXG5cdCpcblx0KiBAcGFyYW0gc2NoZW1hIC0gVGhlIHNjaGVtYSB0byBxdWVyeVxuXHQqL1xuXHRzY2hlbWEoc2NoZW1hKSB7XG5cdFx0cmV0dXJuIHRoaXMucmVzdC5zY2hlbWEoc2NoZW1hKTtcblx0fVxuXHQvKipcblx0KiBQZXJmb3JtIGEgZnVuY3Rpb24gY2FsbC5cblx0KlxuXHQqIEBwYXJhbSBmbiAtIFRoZSBmdW5jdGlvbiBuYW1lIHRvIGNhbGxcblx0KiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gY2FsbFxuXHQqIEBwYXJhbSBvcHRpb25zIC0gTmFtZWQgcGFyYW1ldGVyc1xuXHQqIEBwYXJhbSBvcHRpb25zLmhlYWQgLSBXaGVuIHNldCB0byBgdHJ1ZWAsIGBkYXRhYCB3aWxsIG5vdCBiZSByZXR1cm5lZC5cblx0KiBVc2VmdWwgaWYgeW91IG9ubHkgbmVlZCB0aGUgY291bnQuXG5cdCogQHBhcmFtIG9wdGlvbnMuZ2V0IC0gV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aFxuXHQqIHJlYWQtb25seSBhY2Nlc3MgbW9kZS5cblx0KiBAcGFyYW0gb3B0aW9ucy5jb3VudCAtIENvdW50IGFsZ29yaXRobSB0byB1c2UgdG8gY291bnQgcm93cyByZXR1cm5lZCBieSB0aGVcblx0KiBmdW5jdGlvbi4gT25seSBhcHBsaWNhYmxlIGZvciBbc2V0LXJldHVybmluZ1xuXHQqIGZ1bmN0aW9uc10oaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L2Z1bmN0aW9ucy1zcmYuaHRtbCkuXG5cdCpcblx0KiBgXCJleGFjdFwiYDogRXhhY3QgYnV0IHNsb3cgY291bnQgYWxnb3JpdGhtLiBQZXJmb3JtcyBhIGBDT1VOVCgqKWAgdW5kZXIgdGhlXG5cdCogaG9vZC5cblx0KlxuXHQqIGBcInBsYW5uZWRcImA6IEFwcHJveGltYXRlZCBidXQgZmFzdCBjb3VudCBhbGdvcml0aG0uIFVzZXMgdGhlIFBvc3RncmVzXG5cdCogc3RhdGlzdGljcyB1bmRlciB0aGUgaG9vZC5cblx0KlxuXHQqIGBcImVzdGltYXRlZFwiYDogVXNlcyBleGFjdCBjb3VudCBmb3IgbG93IG51bWJlcnMgYW5kIHBsYW5uZWQgY291bnQgZm9yIGhpZ2hcblx0KiBudW1iZXJzLlxuXHQqL1xuXHRycGMoZm4sIGFyZ3MgPSB7fSwgb3B0aW9ucyA9IHtcblx0XHRoZWFkOiBmYWxzZSxcblx0XHRnZXQ6IGZhbHNlLFxuXHRcdGNvdW50OiB2b2lkIDBcblx0fSkge1xuXHRcdHJldHVybiB0aGlzLnJlc3QucnBjKGZuLCBhcmdzLCBvcHRpb25zKTtcblx0fVxuXHQvKipcblx0KiBDcmVhdGVzIGEgUmVhbHRpbWUgY2hhbm5lbCB3aXRoIEJyb2FkY2FzdCwgUHJlc2VuY2UsIGFuZCBQb3N0Z3JlcyBDaGFuZ2VzLlxuXHQqXG5cdCogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgUmVhbHRpbWUgY2hhbm5lbC5cblx0KiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIFJlYWx0aW1lIGNoYW5uZWwuXG5cdCpcblx0Ki9cblx0Y2hhbm5lbChuYW1lLCBvcHRzID0geyBjb25maWc6IHt9IH0pIHtcblx0XHRyZXR1cm4gdGhpcy5yZWFsdGltZS5jaGFubmVsKG5hbWUsIG9wdHMpO1xuXHR9XG5cdC8qKlxuXHQqIFJldHVybnMgYWxsIFJlYWx0aW1lIGNoYW5uZWxzLlxuXHQqL1xuXHRnZXRDaGFubmVscygpIHtcblx0XHRyZXR1cm4gdGhpcy5yZWFsdGltZS5nZXRDaGFubmVscygpO1xuXHR9XG5cdC8qKlxuXHQqIFVuc3Vic2NyaWJlcyBhbmQgcmVtb3ZlcyBSZWFsdGltZSBjaGFubmVsIGZyb20gUmVhbHRpbWUgY2xpZW50LlxuXHQqXG5cdCogQHBhcmFtIHtSZWFsdGltZUNoYW5uZWx9IGNoYW5uZWwgLSBUaGUgbmFtZSBvZiB0aGUgUmVhbHRpbWUgY2hhbm5lbC5cblx0KlxuXHQqL1xuXHRyZW1vdmVDaGFubmVsKGNoYW5uZWwpIHtcblx0XHRyZXR1cm4gdGhpcy5yZWFsdGltZS5yZW1vdmVDaGFubmVsKGNoYW5uZWwpO1xuXHR9XG5cdC8qKlxuXHQqIFVuc3Vic2NyaWJlcyBhbmQgcmVtb3ZlcyBhbGwgUmVhbHRpbWUgY2hhbm5lbHMgZnJvbSBSZWFsdGltZSBjbGllbnQuXG5cdCovXG5cdHJlbW92ZUFsbENoYW5uZWxzKCkge1xuXHRcdHJldHVybiB0aGlzLnJlYWx0aW1lLnJlbW92ZUFsbENoYW5uZWxzKCk7XG5cdH1cblx0YXN5bmMgX2dldEFjY2Vzc1Rva2VuKCkge1xuXHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cdFx0dmFyIF9kYXRhJHNlc3Npb24kYWNjZXNzXywgX2RhdGEkc2Vzc2lvbjtcblx0XHRpZiAoX3RoaXMuYWNjZXNzVG9rZW4pIHJldHVybiBhd2FpdCBfdGhpcy5hY2Nlc3NUb2tlbigpO1xuXHRcdGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgX3RoaXMuYXV0aC5nZXRTZXNzaW9uKCk7XG5cdFx0cmV0dXJuIChfZGF0YSRzZXNzaW9uJGFjY2Vzc18gPSAoX2RhdGEkc2Vzc2lvbiA9IGRhdGEuc2Vzc2lvbikgPT09IG51bGwgfHwgX2RhdGEkc2Vzc2lvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RhdGEkc2Vzc2lvbi5hY2Nlc3NfdG9rZW4pICE9PSBudWxsICYmIF9kYXRhJHNlc3Npb24kYWNjZXNzXyAhPT0gdm9pZCAwID8gX2RhdGEkc2Vzc2lvbiRhY2Nlc3NfIDogX3RoaXMuc3VwYWJhc2VLZXk7XG5cdH1cblx0X2luaXRTdXBhYmFzZUF1dGhDbGllbnQoeyBhdXRvUmVmcmVzaFRva2VuLCBwZXJzaXN0U2Vzc2lvbiwgZGV0ZWN0U2Vzc2lvbkluVXJsLCBzdG9yYWdlLCB1c2VyU3RvcmFnZSwgc3RvcmFnZUtleSwgZmxvd1R5cGUsIGxvY2ssIGRlYnVnLCB0aHJvd09uRXJyb3IgfSwgaGVhZGVycywgZmV0Y2gkMSkge1xuXHRcdGNvbnN0IGF1dGhIZWFkZXJzID0ge1xuXHRcdFx0QXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuc3VwYWJhc2VLZXl9YCxcblx0XHRcdGFwaWtleTogYCR7dGhpcy5zdXBhYmFzZUtleX1gXG5cdFx0fTtcblx0XHRyZXR1cm4gbmV3IFN1cGFiYXNlQXV0aENsaWVudCh7XG5cdFx0XHR1cmw6IHRoaXMuYXV0aFVybC5ocmVmLFxuXHRcdFx0aGVhZGVyczogX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGF1dGhIZWFkZXJzKSwgaGVhZGVycyksXG5cdFx0XHRzdG9yYWdlS2V5LFxuXHRcdFx0YXV0b1JlZnJlc2hUb2tlbixcblx0XHRcdHBlcnNpc3RTZXNzaW9uLFxuXHRcdFx0ZGV0ZWN0U2Vzc2lvbkluVXJsLFxuXHRcdFx0c3RvcmFnZSxcblx0XHRcdHVzZXJTdG9yYWdlLFxuXHRcdFx0Zmxvd1R5cGUsXG5cdFx0XHRsb2NrLFxuXHRcdFx0ZGVidWcsXG5cdFx0XHR0aHJvd09uRXJyb3IsXG5cdFx0XHRmZXRjaDogZmV0Y2gkMSxcblx0XHRcdGhhc0N1c3RvbUF1dGhvcml6YXRpb25IZWFkZXI6IE9iamVjdC5rZXlzKHRoaXMuaGVhZGVycykuc29tZSgoa2V5KSA9PiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gXCJhdXRob3JpemF0aW9uXCIpXG5cdFx0fSk7XG5cdH1cblx0X2luaXRSZWFsdGltZUNsaWVudChvcHRpb25zKSB7XG5cdFx0cmV0dXJuIG5ldyBSZWFsdGltZUNsaWVudCh0aGlzLnJlYWx0aW1lVXJsLmhyZWYsIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBvcHRpb25zKSwge30sIHsgcGFyYW1zOiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgeyBhcGlrZXk6IHRoaXMuc3VwYWJhc2VLZXkgfSksIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wYXJhbXMpIH0pKTtcblx0fVxuXHRfbGlzdGVuRm9yQXV0aEV2ZW50cygpIHtcblx0XHRyZXR1cm4gdGhpcy5hdXRoLm9uQXV0aFN0YXRlQ2hhbmdlKChldmVudCwgc2Vzc2lvbikgPT4ge1xuXHRcdFx0dGhpcy5faGFuZGxlVG9rZW5DaGFuZ2VkKGV2ZW50LCBcIkNMSUVOVFwiLCBzZXNzaW9uID09PSBudWxsIHx8IHNlc3Npb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlc3Npb24uYWNjZXNzX3Rva2VuKTtcblx0XHR9KTtcblx0fVxuXHRfaGFuZGxlVG9rZW5DaGFuZ2VkKGV2ZW50LCBzb3VyY2UsIHRva2VuKSB7XG5cdFx0aWYgKChldmVudCA9PT0gXCJUT0tFTl9SRUZSRVNIRURcIiB8fCBldmVudCA9PT0gXCJTSUdORURfSU5cIikgJiYgdGhpcy5jaGFuZ2VkQWNjZXNzVG9rZW4gIT09IHRva2VuKSB7XG5cdFx0XHR0aGlzLmNoYW5nZWRBY2Nlc3NUb2tlbiA9IHRva2VuO1xuXHRcdFx0dGhpcy5yZWFsdGltZS5zZXRBdXRoKHRva2VuKTtcblx0XHR9IGVsc2UgaWYgKGV2ZW50ID09PSBcIlNJR05FRF9PVVRcIikge1xuXHRcdFx0dGhpcy5yZWFsdGltZS5zZXRBdXRoKCk7XG5cdFx0XHRpZiAoc291cmNlID09IFwiU1RPUkFHRVwiKSB0aGlzLmF1dGguc2lnbk91dCgpO1xuXHRcdFx0dGhpcy5jaGFuZ2VkQWNjZXNzVG9rZW4gPSB2b2lkIDA7XG5cdFx0fVxuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvaW5kZXgudHNcbi8qKlxuKiBDcmVhdGVzIGEgbmV3IFN1cGFiYXNlIENsaWVudC5cbipcbiogQGV4YW1wbGVcbiogYGBgdHNcbiogaW1wb3J0IHsgY3JlYXRlQ2xpZW50IH0gZnJvbSAnQHN1cGFiYXNlL3N1cGFiYXNlLWpzJ1xuKlxuKiBjb25zdCBzdXBhYmFzZSA9IGNyZWF0ZUNsaWVudCgnaHR0cHM6Ly94eXpjb21wYW55LnN1cGFiYXNlLmNvJywgJ3B1YmxpYy1hbm9uLWtleScpXG4qIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlLmZyb20oJ3Byb2ZpbGVzJykuc2VsZWN0KCcqJylcbiogYGBgXG4qL1xuY29uc3QgY3JlYXRlQ2xpZW50ID0gKHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwgb3B0aW9ucykgPT4ge1xuXHRyZXR1cm4gbmV3IFN1cGFiYXNlQ2xpZW50KHN1cGFiYXNlVXJsLCBzdXBhYmFzZUtleSwgb3B0aW9ucyk7XG59O1xuZnVuY3Rpb24gc2hvdWxkU2hvd0RlcHJlY2F0aW9uV2FybmluZygpIHtcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcblx0aWYgKHR5cGVvZiBwcm9jZXNzID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG5cdGNvbnN0IHByb2Nlc3NWZXJzaW9uID0gcHJvY2Vzc1tcInZlcnNpb25cIl07XG5cdGlmIChwcm9jZXNzVmVyc2lvbiA9PT0gdm9pZCAwIHx8IHByb2Nlc3NWZXJzaW9uID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cdGNvbnN0IHZlcnNpb25NYXRjaCA9IHByb2Nlc3NWZXJzaW9uLm1hdGNoKC9edihcXGQrKVxcLi8pO1xuXHRpZiAoIXZlcnNpb25NYXRjaCkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gcGFyc2VJbnQodmVyc2lvbk1hdGNoWzFdLCAxMCkgPD0gMTg7XG59XG5pZiAoc2hvdWxkU2hvd0RlcHJlY2F0aW9uV2FybmluZygpKSBjb25zb2xlLndhcm4oXCLimqDvuI8gIE5vZGUuanMgMTggYW5kIGJlbG93IGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIG5vIGxvbmdlciBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIEBzdXBhYmFzZS9zdXBhYmFzZS1qcy4gUGxlYXNlIHVwZ3JhZGUgdG8gTm9kZS5qcyAyMCBvciBsYXRlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHZpc2l0OiBodHRwczovL2dpdGh1Yi5jb20vb3Jncy9zdXBhYmFzZS9kaXNjdXNzaW9ucy8zNzIxN1wiKTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBGdW5jdGlvblJlZ2lvbiwgRnVuY3Rpb25zRXJyb3IsIEZ1bmN0aW9uc0ZldGNoRXJyb3IsIEZ1bmN0aW9uc0h0dHBFcnJvciwgRnVuY3Rpb25zUmVsYXlFcnJvciwgUG9zdGdyZXN0RXJyb3IsIFN1cGFiYXNlQ2xpZW50LCBjcmVhdGVDbGllbnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXAiXSwibmFtZXMiOlsiRnVuY3Rpb25SZWdpb24iLCJGdW5jdGlvbnNDbGllbnQiLCJGdW5jdGlvbnNFcnJvciIsIkZ1bmN0aW9uc0ZldGNoRXJyb3IiLCJGdW5jdGlvbnNIdHRwRXJyb3IiLCJGdW5jdGlvbnNSZWxheUVycm9yIiwiUG9zdGdyZXN0Q2xpZW50IiwiUG9zdGdyZXN0RXJyb3IiLCJSZWFsdGltZUNsaWVudCIsIlN0b3JhZ2VDbGllbnQiLCJBdXRoQ2xpZW50IiwidmVyc2lvbiIsIkpTX0VOViIsIkRlbm8iLCJkb2N1bWVudCIsIm5hdmlnYXRvciIsInByb2R1Y3QiLCJERUZBVUxUX0hFQURFUlMiLCJERUZBVUxUX0dMT0JBTF9PUFRJT05TIiwiaGVhZGVycyIsIkRFRkFVTFRfREJfT1BUSU9OUyIsInNjaGVtYSIsIkRFRkFVTFRfQVVUSF9PUFRJT05TIiwiYXV0b1JlZnJlc2hUb2tlbiIsInBlcnNpc3RTZXNzaW9uIiwiZGV0ZWN0U2Vzc2lvbkluVXJsIiwiZmxvd1R5cGUiLCJERUZBVUxUX1JFQUxUSU1FX09QVElPTlMiLCJfdHlwZW9mIiwibyIsIlN5bWJvbCIsIml0ZXJhdG9yIiwibyQxIiwiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJ0b1ByaW1pdGl2ZSIsInQiLCJyIiwiZSIsImkiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwidG9Qcm9wZXJ0eUtleSIsIl9kZWZpbmVQcm9wZXJ0eSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsInIkMSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQyIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicmVzb2x2ZUZldGNoIiwiY3VzdG9tRmV0Y2giLCJhcmdzIiwiZmV0Y2giLCJyZXNvbHZlSGVhZGVyc0NvbnN0cnVjdG9yIiwiSGVhZGVycyIsImZldGNoV2l0aEF1dGgiLCJzdXBhYmFzZUtleSIsImdldEFjY2Vzc1Rva2VuIiwiZmV0Y2gkMSIsIkhlYWRlcnNDb25zdHJ1Y3RvciIsImlucHV0IiwiaW5pdCIsIl9hd2FpdCRnZXRBY2Nlc3NUb2tlbiIsImFjY2Vzc1Rva2VuIiwiaGFzIiwic2V0IiwiZW5zdXJlVHJhaWxpbmdTbGFzaCIsInVybCIsImVuZHNXaXRoIiwiYXBwbHlTZXR0aW5nRGVmYXVsdHMiLCJvcHRpb25zIiwiZGVmYXVsdHMiLCJfREVGQVVMVF9HTE9CQUxfT1BUSU8iLCJfZ2xvYmFsT3B0aW9ucyRoZWFkZXIiLCJkYiIsImRiT3B0aW9ucyIsImF1dGgiLCJhdXRoT3B0aW9ucyIsInJlYWx0aW1lIiwicmVhbHRpbWVPcHRpb25zIiwiZ2xvYmFsIiwiZ2xvYmFsT3B0aW9ucyIsIkRFRkFVTFRfREJfT1BUSU9OUyQxIiwiREVGQVVMVF9BVVRIX09QVElPTlMkMSIsIkRFRkFVTFRfUkVBTFRJTUVfT1BUSU9OUyQxIiwiREVGQVVMVF9HTE9CQUxfT1BUSU9OUyQxIiwicmVzdWx0Iiwic3RvcmFnZSIsInZhbGlkYXRlU3VwYWJhc2VVcmwiLCJzdXBhYmFzZVVybCIsInRyaW1tZWRVcmwiLCJ0cmltIiwiRXJyb3IiLCJtYXRjaCIsIlVSTCIsIl91bnVzZWQiLCJTdXBhYmFzZUF1dGhDbGllbnQiLCJTdXBhYmFzZUNsaWVudCIsIl9zZXR0aW5ncyRhdXRoJHN0b3JhZyIsIl9zZXR0aW5ncyRnbG9iYWwkaGVhZCIsImJhc2VVcmwiLCJyZWFsdGltZVVybCIsInByb3RvY29sIiwicmVwbGFjZSIsImF1dGhVcmwiLCJzdG9yYWdlVXJsIiwiZnVuY3Rpb25zVXJsIiwiZGVmYXVsdFN0b3JhZ2VLZXkiLCJob3N0bmFtZSIsInNwbGl0IiwiREVGQVVMVFMiLCJzdG9yYWdlS2V5Iiwic2V0dGluZ3MiLCJfc2V0dGluZ3MkYXV0aCIsIl9pbml0U3VwYWJhc2VBdXRoQ2xpZW50IiwiUHJveHkiLCJnZXQiLCJfIiwicHJvcCIsIl9nZXRBY2Nlc3NUb2tlbiIsImJpbmQiLCJfaW5pdFJlYWx0aW1lQ2xpZW50IiwidGhlbiIsInRva2VuIiwic2V0QXV0aCIsImNhdGNoIiwiY29uc29sZSIsIndhcm4iLCJyZXN0IiwiaHJlZiIsIl9saXN0ZW5Gb3JBdXRoRXZlbnRzIiwiZnVuY3Rpb25zIiwiZnJvbSIsInJlbGF0aW9uIiwicnBjIiwiZm4iLCJoZWFkIiwiY291bnQiLCJjaGFubmVsIiwibmFtZSIsIm9wdHMiLCJjb25maWciLCJnZXRDaGFubmVscyIsInJlbW92ZUNoYW5uZWwiLCJyZW1vdmVBbGxDaGFubmVscyIsIl90aGlzIiwiX2RhdGEkc2Vzc2lvbiRhY2Nlc3NfIiwiX2RhdGEkc2Vzc2lvbiIsImRhdGEiLCJnZXRTZXNzaW9uIiwic2Vzc2lvbiIsImFjY2Vzc190b2tlbiIsInVzZXJTdG9yYWdlIiwibG9jayIsImRlYnVnIiwidGhyb3dPbkVycm9yIiwiYXV0aEhlYWRlcnMiLCJBdXRob3JpemF0aW9uIiwiYXBpa2V5IiwiaGFzQ3VzdG9tQXV0aG9yaXphdGlvbkhlYWRlciIsInNvbWUiLCJrZXkiLCJ0b0xvd2VyQ2FzZSIsInBhcmFtcyIsIm9uQXV0aFN0YXRlQ2hhbmdlIiwiZXZlbnQiLCJfaGFuZGxlVG9rZW5DaGFuZ2VkIiwic291cmNlIiwiY2hhbmdlZEFjY2Vzc1Rva2VuIiwic2lnbk91dCIsImNyZWF0ZUNsaWVudCIsInNob3VsZFNob3dEZXByZWNhdGlvbldhcm5pbmciLCJwcm9jZXNzIiwicHJvY2Vzc1ZlcnNpb24iLCJ2ZXJzaW9uTWF0Y2giLCJwYXJzZUludCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/@supabase/supabase-js/dist/index.mjs\n");
|
||
|
||
/***/ })
|
||
|
||
};
|
||
; |