35 lines
1.4 MiB
35 lines
1.4 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/@ai-sdk+openai@3.0.49_zod@3.25.76";
|
|
exports.ids = ["vendor-chunks/@ai-sdk+openai@3.0.49_zod@3.25.76"];
|
|
exports.modules = {
|
|
|
|
/***/ "(action-browser)/./node_modules/.pnpm/@ai-sdk+openai@3.0.49_zod@3.25.76/node_modules/@ai-sdk/openai/dist/index.mjs":
|
|
/*!*********************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@ai-sdk+openai@3.0.49_zod@3.25.76/node_modules/@ai-sdk/openai/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 */ VERSION: () => (/* binding */ VERSION),\n/* harmony export */ createOpenAI: () => (/* binding */ createOpenAI),\n/* harmony export */ openai: () => (/* binding */ openai)\n/* harmony export */ });\n/* harmony import */ var _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ai-sdk/provider-utils */ \"(action-browser)/./node_modules/.pnpm/@ai-sdk+provider-utils@4.0.21_zod@3.25.76/node_modules/@ai-sdk/provider-utils/dist/index.mjs\");\n/* harmony import */ var _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ai-sdk/provider */ \"(action-browser)/./node_modules/.pnpm/@ai-sdk+provider@3.0.8/node_modules/@ai-sdk/provider/dist/index.mjs\");\n/* harmony import */ var zod_v4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zod/v4 */ \"(action-browser)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/schemas.js\");\n/* harmony import */ var zod_v4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! zod/v4 */ \"(action-browser)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/coerce.js\");\n// src/openai-provider.ts\n\n\n// src/chat/openai-chat-language-model.ts\n\n\n\n// src/openai-error.ts\n\n\nvar openaiErrorDataSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n // The additional information below is handled loosely to support\n // OpenAI-compatible providers that have slightly different error\n // responses:\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n param: zod_v4__WEBPACK_IMPORTED_MODULE_0__.any().nullish(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()]).nullish()\n })\n});\nvar openaiFailedResponseHandler = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonErrorResponseHandler)({\n errorSchema: openaiErrorDataSchema,\n errorToMessage: (data) => data.error.message\n});\n\n// src/openai-language-model-capabilities.ts\nfunction getOpenAILanguageModelCapabilities(modelId) {\n const supportsFlexProcessing = modelId.startsWith(\"o3\") || modelId.startsWith(\"o4-mini\") || modelId.startsWith(\"gpt-5\") && !modelId.startsWith(\"gpt-5-chat\");\n const supportsPriorityProcessing = modelId.startsWith(\"gpt-4\") || modelId.startsWith(\"gpt-5\") && !modelId.startsWith(\"gpt-5-nano\") && !modelId.startsWith(\"gpt-5-chat\") && !modelId.startsWith(\"gpt-5.4-nano\") || modelId.startsWith(\"o3\") || modelId.startsWith(\"o4-mini\");\n const isReasoningModel = modelId.startsWith(\"o1\") || modelId.startsWith(\"o3\") || modelId.startsWith(\"o4-mini\") || modelId.startsWith(\"gpt-5\") && !modelId.startsWith(\"gpt-5-chat\");\n const supportsNonReasoningParameters = modelId.startsWith(\"gpt-5.1\") || modelId.startsWith(\"gpt-5.2\") || modelId.startsWith(\"gpt-5.3\") || modelId.startsWith(\"gpt-5.4\");\n const systemMessageMode = isReasoningModel ? \"developer\" : \"system\";\n return {\n supportsFlexProcessing,\n supportsPriorityProcessing,\n isReasoningModel,\n systemMessageMode,\n supportsNonReasoningParameters\n };\n}\n\n// src/chat/convert-openai-chat-usage.ts\nfunction convertOpenAIChatUsage(usage) {\n var _a, _b, _c, _d, _e, _f;\n if (usage == null) {\n return {\n inputTokens: {\n total: void 0,\n noCache: void 0,\n cacheRead: void 0,\n cacheWrite: void 0\n },\n outputTokens: {\n total: void 0,\n text: void 0,\n reasoning: void 0\n },\n raw: void 0\n };\n }\n const promptTokens = (_a = usage.prompt_tokens) != null ? _a : 0;\n const completionTokens = (_b = usage.completion_tokens) != null ? _b : 0;\n const cachedTokens = (_d = (_c = usage.prompt_tokens_details) == null ? void 0 : _c.cached_tokens) != null ? _d : 0;\n const reasoningTokens = (_f = (_e = usage.completion_tokens_details) == null ? void 0 : _e.reasoning_tokens) != null ? _f : 0;\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cachedTokens,\n cacheRead: cachedTokens,\n cacheWrite: void 0\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens\n },\n raw: usage\n };\n}\n\n// src/chat/convert-to-openai-chat-messages.ts\n\n\nfunction convertToOpenAIChatMessages({\n prompt,\n systemMessageMode = \"system\"\n}) {\n var _a;\n const messages = [];\n const warnings = [];\n for (const { role, content } of prompt) {\n switch (role) {\n case \"system\": {\n switch (systemMessageMode) {\n case \"system\": {\n messages.push({ role: \"system\", content });\n break;\n }\n case \"developer\": {\n messages.push({ role: \"developer\", content });\n break;\n }\n case \"remove\": {\n warnings.push({\n type: \"other\",\n message: \"system messages are removed for this model\"\n });\n break;\n }\n default: {\n const _exhaustiveCheck = systemMessageMode;\n throw new Error(\n `Unsupported system message mode: ${_exhaustiveCheck}`\n );\n }\n }\n break;\n }\n case \"user\": {\n if (content.length === 1 && content[0].type === \"text\") {\n messages.push({ role: \"user\", content: content[0].text });\n break;\n }\n messages.push({\n role: \"user\",\n content: content.map((part, index) => {\n var _a2, _b, _c;\n switch (part.type) {\n case \"text\": {\n return { type: \"text\", text: part.text };\n }\n case \"file\": {\n if (part.mediaType.startsWith(\"image/\")) {\n const mediaType = part.mediaType === \"image/*\" ? \"image/jpeg\" : part.mediaType;\n return {\n type: \"image_url\",\n image_url: {\n url: part.data instanceof URL ? part.data.toString() : `data:${mediaType};base64,${(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data)}`,\n // OpenAI specific extension: image detail\n detail: (_b = (_a2 = part.providerOptions) == null ? void 0 : _a2.openai) == null ? void 0 : _b.imageDetail\n }\n };\n } else if (part.mediaType.startsWith(\"audio/\")) {\n if (part.data instanceof URL) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: \"audio file parts with URLs\"\n });\n }\n switch (part.mediaType) {\n case \"audio/wav\": {\n return {\n type: \"input_audio\",\n input_audio: {\n data: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data),\n format: \"wav\"\n }\n };\n }\n case \"audio/mp3\":\n case \"audio/mpeg\": {\n return {\n type: \"input_audio\",\n input_audio: {\n data: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data),\n format: \"mp3\"\n }\n };\n }\n default: {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: `audio content parts with media type ${part.mediaType}`\n });\n }\n }\n } else if (part.mediaType === \"application/pdf\") {\n if (part.data instanceof URL) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: \"PDF file parts with URLs\"\n });\n }\n return {\n type: \"file\",\n file: typeof part.data === \"string\" && part.data.startsWith(\"file-\") ? { file_id: part.data } : {\n filename: (_c = part.filename) != null ? _c : `part-${index}.pdf`,\n file_data: `data:application/pdf;base64,${(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data)}`\n }\n };\n } else {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: `file part media type ${part.mediaType}`\n });\n }\n }\n }\n })\n });\n break;\n }\n case \"assistant\": {\n let text = \"\";\n const toolCalls = [];\n for (const part of content) {\n switch (part.type) {\n case \"text\": {\n text += part.text;\n break;\n }\n case \"tool-call\": {\n toolCalls.push({\n id: part.toolCallId,\n type: \"function\",\n function: {\n name: part.toolName,\n arguments: JSON.stringify(part.input)\n }\n });\n break;\n }\n }\n }\n messages.push({\n role: \"assistant\",\n content: text,\n tool_calls: toolCalls.length > 0 ? toolCalls : void 0\n });\n break;\n }\n case \"tool\": {\n for (const toolResponse of content) {\n if (toolResponse.type === \"tool-approval-response\") {\n continue;\n }\n const output = toolResponse.output;\n let contentValue;\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n contentValue = output.value;\n break;\n case \"execution-denied\":\n contentValue = (_a = output.reason) != null ? _a : \"Tool execution denied.\";\n break;\n case \"content\":\n case \"json\":\n case \"error-json\":\n contentValue = JSON.stringify(output.value);\n break;\n }\n messages.push({\n role: \"tool\",\n tool_call_id: toolResponse.toolCallId,\n content: contentValue\n });\n }\n break;\n }\n default: {\n const _exhaustiveCheck = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n return { messages, warnings };\n}\n\n// src/chat/get-response-metadata.ts\nfunction getResponseMetadata({\n id,\n model,\n created\n}) {\n return {\n id: id != null ? id : void 0,\n modelId: model != null ? model : void 0,\n timestamp: created ? new Date(created * 1e3) : void 0\n };\n}\n\n// src/chat/map-openai-finish-reason.ts\nfunction mapOpenAIFinishReason(finishReason) {\n switch (finishReason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"content_filter\":\n return \"content-filter\";\n case \"function_call\":\n case \"tool_calls\":\n return \"tool-calls\";\n default:\n return \"other\";\n }\n}\n\n// src/chat/openai-chat-api.ts\n\n\nvar openaiChatResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n created: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n choices: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n role: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"assistant\").nullish(),\n content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n tool_calls: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"function\"),\n function: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n })\n ).nullish(),\n annotations: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url_citation\"),\n url_citation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n })\n ).nullish()\n }),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n )\n })\n ).nullish()\n }).nullish(),\n finish_reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n prompt_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n completion_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n total_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n prompt_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n cached_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish()\n }).nullish(),\n completion_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n accepted_prediction_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n rejected_prediction_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish()\n }).nullish()\n }).nullish()\n })\n )\n);\nvar openaiChatChunkSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n created: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n choices: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n role: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"assistant\"]).nullish(),\n content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n tool_calls: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"function\").nullish(),\n function: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n })\n ).nullish(),\n annotations: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url_citation\"),\n url_citation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n })\n ).nullish()\n }).nullish(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n )\n })\n ).nullish()\n }).nullish(),\n finish_reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n prompt_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n completion_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n total_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n prompt_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n cached_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish()\n }).nullish(),\n completion_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n accepted_prediction_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n rejected_prediction_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish()\n }).nullish()\n }).nullish()\n }),\n openaiErrorDataSchema\n ])\n )\n);\n\n// src/chat/openai-chat-options.ts\n\n\nvar openaiLanguageModelChatOptions = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n /**\n * Modify the likelihood of specified tokens appearing in the completion.\n *\n * Accepts a JSON object that maps tokens (specified by their token ID in\n * the GPT tokenizer) to an associated bias value from -100 to 100.\n */\n logitBias: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_3__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()).optional(),\n /**\n * Return the log probabilities of the tokens.\n *\n * Setting to true will return the log probabilities of the tokens that\n * were generated.\n *\n * Setting to a number will return the log probabilities of the top n\n * tokens that were generated.\n */\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()]).optional(),\n /**\n * Whether to enable parallel function calling during tool use. Default to true.\n */\n parallelToolCalls: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n /**\n * A unique identifier representing your end-user, which can help OpenAI to\n * monitor and detect abuse.\n */\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * Reasoning effort for reasoning models. Defaults to `medium`.\n */\n reasoningEffort: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"]).optional(),\n /**\n * Maximum number of completion tokens to generate. Useful for reasoning models.\n */\n maxCompletionTokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n /**\n * Whether to enable persistence in responses API.\n */\n store: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n /**\n * Metadata to associate with the request.\n */\n metadata: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().max(64), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().max(512)).optional(),\n /**\n * Parameters for prediction mode.\n */\n prediction: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.any()).optional(),\n /**\n * Service tier for the request.\n * - 'auto': Default service tier. The request will be processed with the service tier configured in the\n * Project settings. Unless otherwise configured, the Project will use 'default'.\n * - 'flex': 50% cheaper processing at the cost of increased latency. Only available for o3 and o4-mini models.\n * - 'priority': Higher-speed processing with predictably low latency at premium cost. Available for Enterprise customers.\n * - 'default': The request will be processed with the standard pricing and performance for the selected model.\n *\n * @default 'auto'\n */\n serviceTier: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\", \"flex\", \"priority\", \"default\"]).optional(),\n /**\n * Whether to use strict JSON schema validation.\n *\n * @default true\n */\n strictJsonSchema: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n /**\n * Controls the verbosity of the model's responses.\n * Lower values will result in more concise responses, while higher values will result in more verbose responses.\n */\n textVerbosity: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"low\", \"medium\", \"high\"]).optional(),\n /**\n * A cache key for prompt caching. Allows manual control over prompt caching behavior.\n * Useful for improving cache hit rates and working around automatic caching issues.\n */\n promptCacheKey: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * The retention policy for the prompt cache.\n * - 'in_memory': Default. Standard prompt caching behavior.\n * - '24h': Extended prompt caching that keeps cached prefixes active for up to 24 hours.\n * Currently only available for 5.1 series models.\n *\n * @default 'in_memory'\n */\n promptCacheRetention: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_memory\", \"24h\"]).optional(),\n /**\n * A stable identifier used to help detect users of your application\n * that may be violating OpenAI's usage policies. The IDs should be a\n * string that uniquely identifies each user. We recommend hashing their\n * username or email address, in order to avoid sending us any identifying\n * information.\n */\n safetyIdentifier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * Override the system message mode for this model.\n * - 'system': Use the 'system' role for system messages (default for most models)\n * - 'developer': Use the 'developer' role for system messages (used by reasoning models)\n * - 'remove': Remove system messages entirely\n *\n * If not specified, the mode is automatically determined based on the model.\n */\n systemMessageMode: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"system\", \"developer\", \"remove\"]).optional(),\n /**\n * Force treating this model as a reasoning model.\n *\n * This is useful for \"stealth\" reasoning models (e.g. via a custom baseURL)\n * where the model ID is not recognized by the SDK's allowlist.\n *\n * When enabled, the SDK applies reasoning-model parameter compatibility rules\n * and defaults `systemMessageMode` to `developer` unless overridden.\n */\n forceReasoning: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional()\n })\n )\n);\n\n// src/chat/openai-chat-prepare-tools.ts\n\nfunction prepareChatTools({\n tools,\n toolChoice\n}) {\n tools = (tools == null ? void 0 : tools.length) ? tools : void 0;\n const toolWarnings = [];\n if (tools == null) {\n return { tools: void 0, toolChoice: void 0, toolWarnings };\n }\n const openaiTools2 = [];\n for (const tool of tools) {\n switch (tool.type) {\n case \"function\":\n openaiTools2.push({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n ...tool.strict != null ? { strict: tool.strict } : {}\n }\n });\n break;\n default:\n toolWarnings.push({\n type: \"unsupported\",\n feature: `tool type: ${tool.type}`\n });\n break;\n }\n }\n if (toolChoice == null) {\n return { tools: openaiTools2, toolChoice: void 0, toolWarnings };\n }\n const type = toolChoice.type;\n switch (type) {\n case \"auto\":\n case \"none\":\n case \"required\":\n return { tools: openaiTools2, toolChoice: type, toolWarnings };\n case \"tool\":\n return {\n tools: openaiTools2,\n toolChoice: {\n type: \"function\",\n function: {\n name: toolChoice.toolName\n }\n },\n toolWarnings\n };\n default: {\n const _exhaustiveCheck = type;\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`\n });\n }\n }\n}\n\n// src/chat/openai-chat-language-model.ts\nvar OpenAIChatLanguageModel = class {\n constructor(modelId, config) {\n this.specificationVersion = \"v3\";\n this.supportedUrls = {\n \"image/*\": [/^https?:\\/\\/.*$/]\n };\n this.modelId = modelId;\n this.config = config;\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n tools,\n toolChoice,\n providerOptions\n }) {\n var _a, _b, _c, _d, _e;\n const warnings = [];\n const openaiOptions = (_a = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openaiLanguageModelChatOptions\n })) != null ? _a : {};\n const modelCapabilities = getOpenAILanguageModelCapabilities(this.modelId);\n const isReasoningModel = (_b = openaiOptions.forceReasoning) != null ? _b : modelCapabilities.isReasoningModel;\n if (topK != null) {\n warnings.push({ type: \"unsupported\", feature: \"topK\" });\n }\n const { messages, warnings: messageWarnings } = convertToOpenAIChatMessages(\n {\n prompt,\n systemMessageMode: (_c = openaiOptions.systemMessageMode) != null ? _c : isReasoningModel ? \"developer\" : modelCapabilities.systemMessageMode\n }\n );\n warnings.push(...messageWarnings);\n const strictJsonSchema = (_d = openaiOptions.strictJsonSchema) != null ? _d : true;\n const baseArgs = {\n // model id:\n model: this.modelId,\n // model specific settings:\n logit_bias: openaiOptions.logitBias,\n logprobs: openaiOptions.logprobs === true || typeof openaiOptions.logprobs === \"number\" ? true : void 0,\n top_logprobs: typeof openaiOptions.logprobs === \"number\" ? openaiOptions.logprobs : typeof openaiOptions.logprobs === \"boolean\" ? openaiOptions.logprobs ? 0 : void 0 : void 0,\n user: openaiOptions.user,\n parallel_tool_calls: openaiOptions.parallelToolCalls,\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n response_format: (responseFormat == null ? void 0 : responseFormat.type) === \"json\" ? responseFormat.schema != null ? {\n type: \"json_schema\",\n json_schema: {\n schema: responseFormat.schema,\n strict: strictJsonSchema,\n name: (_e = responseFormat.name) != null ? _e : \"response\",\n description: responseFormat.description\n }\n } : { type: \"json_object\" } : void 0,\n stop: stopSequences,\n seed,\n verbosity: openaiOptions.textVerbosity,\n // openai specific settings:\n // TODO AI SDK 6: remove, we auto-map maxOutputTokens now\n max_completion_tokens: openaiOptions.maxCompletionTokens,\n store: openaiOptions.store,\n metadata: openaiOptions.metadata,\n prediction: openaiOptions.prediction,\n reasoning_effort: openaiOptions.reasoningEffort,\n service_tier: openaiOptions.serviceTier,\n prompt_cache_key: openaiOptions.promptCacheKey,\n prompt_cache_retention: openaiOptions.promptCacheRetention,\n safety_identifier: openaiOptions.safetyIdentifier,\n // messages:\n messages\n };\n if (isReasoningModel) {\n if (openaiOptions.reasoningEffort !== \"none\" || !modelCapabilities.supportsNonReasoningParameters) {\n if (baseArgs.temperature != null) {\n baseArgs.temperature = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"temperature\",\n details: \"temperature is not supported for reasoning models\"\n });\n }\n if (baseArgs.top_p != null) {\n baseArgs.top_p = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"topP\",\n details: \"topP is not supported for reasoning models\"\n });\n }\n if (baseArgs.logprobs != null) {\n baseArgs.logprobs = void 0;\n warnings.push({\n type: \"other\",\n message: \"logprobs is not supported for reasoning models\"\n });\n }\n }\n if (baseArgs.frequency_penalty != null) {\n baseArgs.frequency_penalty = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"frequencyPenalty\",\n details: \"frequencyPenalty is not supported for reasoning models\"\n });\n }\n if (baseArgs.presence_penalty != null) {\n baseArgs.presence_penalty = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"presencePenalty\",\n details: \"presencePenalty is not supported for reasoning models\"\n });\n }\n if (baseArgs.logit_bias != null) {\n baseArgs.logit_bias = void 0;\n warnings.push({\n type: \"other\",\n message: \"logitBias is not supported for reasoning models\"\n });\n }\n if (baseArgs.top_logprobs != null) {\n baseArgs.top_logprobs = void 0;\n warnings.push({\n type: \"other\",\n message: \"topLogprobs is not supported for reasoning models\"\n });\n }\n if (baseArgs.max_tokens != null) {\n if (baseArgs.max_completion_tokens == null) {\n baseArgs.max_completion_tokens = baseArgs.max_tokens;\n }\n baseArgs.max_tokens = void 0;\n }\n } else if (this.modelId.startsWith(\"gpt-4o-search-preview\") || this.modelId.startsWith(\"gpt-4o-mini-search-preview\")) {\n if (baseArgs.temperature != null) {\n baseArgs.temperature = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"temperature\",\n details: \"temperature is not supported for the search preview models and has been removed.\"\n });\n }\n }\n if (openaiOptions.serviceTier === \"flex\" && !modelCapabilities.supportsFlexProcessing) {\n warnings.push({\n type: \"unsupported\",\n feature: \"serviceTier\",\n details: \"flex processing is only available for o3, o4-mini, and gpt-5 models\"\n });\n baseArgs.service_tier = void 0;\n }\n if (openaiOptions.serviceTier === \"priority\" && !modelCapabilities.supportsPriorityProcessing) {\n warnings.push({\n type: \"unsupported\",\n feature: \"serviceTier\",\n details: \"priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported\"\n });\n baseArgs.service_tier = void 0;\n }\n const {\n tools: openaiTools2,\n toolChoice: openaiToolChoice,\n toolWarnings\n } = prepareChatTools({\n tools,\n toolChoice\n });\n return {\n args: {\n ...baseArgs,\n tools: openaiTools2,\n tool_choice: openaiToolChoice\n },\n warnings: [...warnings, ...toolWarnings]\n };\n }\n async doGenerate(options) {\n var _a, _b, _c, _d, _e, _f, _g;\n const { args: body, warnings } = await this.getArgs(options);\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/chat/completions\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiChatResponseSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n const choice = response.choices[0];\n const content = [];\n const text = choice.message.content;\n if (text != null && text.length > 0) {\n content.push({ type: \"text\", text });\n }\n for (const toolCall of (_a = choice.message.tool_calls) != null ? _a : []) {\n content.push({\n type: \"tool-call\",\n toolCallId: (_b = toolCall.id) != null ? _b : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments\n });\n }\n for (const annotation of (_c = choice.message.annotations) != null ? _c : []) {\n content.push({\n type: \"source\",\n sourceType: \"url\",\n id: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n url: annotation.url_citation.url,\n title: annotation.url_citation.title\n });\n }\n const completionTokenDetails = (_d = response.usage) == null ? void 0 : _d.completion_tokens_details;\n const promptTokenDetails = (_e = response.usage) == null ? void 0 : _e.prompt_tokens_details;\n const providerMetadata = { openai: {} };\n if ((completionTokenDetails == null ? void 0 : completionTokenDetails.accepted_prediction_tokens) != null) {\n providerMetadata.openai.acceptedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.accepted_prediction_tokens;\n }\n if ((completionTokenDetails == null ? void 0 : completionTokenDetails.rejected_prediction_tokens) != null) {\n providerMetadata.openai.rejectedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.rejected_prediction_tokens;\n }\n if (((_f = choice.logprobs) == null ? void 0 : _f.content) != null) {\n providerMetadata.openai.logprobs = choice.logprobs.content;\n }\n return {\n content,\n finishReason: {\n unified: mapOpenAIFinishReason(choice.finish_reason),\n raw: (_g = choice.finish_reason) != null ? _g : void 0\n },\n usage: convertOpenAIChatUsage(response.usage),\n request: { body },\n response: {\n ...getResponseMetadata(response),\n headers: responseHeaders,\n body: rawResponse\n },\n warnings,\n providerMetadata\n };\n }\n async doStream(options) {\n const { args, warnings } = await this.getArgs(options);\n const body = {\n ...args,\n stream: true,\n stream_options: {\n include_usage: true\n }\n };\n const { responseHeaders, value: response } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/chat/completions\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createEventSourceResponseHandler)(\n openaiChatChunkSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n const toolCalls = [];\n let finishReason = {\n unified: \"other\",\n raw: void 0\n };\n let usage = void 0;\n let metadataExtracted = false;\n let isActiveText = false;\n const providerMetadata = { openai: {} };\n return {\n stream: response.pipeThrough(\n new TransformStream({\n start(controller) {\n controller.enqueue({ type: \"stream-start\", warnings });\n },\n transform(chunk, controller) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;\n if (options.includeRawChunks) {\n controller.enqueue({ type: \"raw\", rawValue: chunk.rawValue });\n }\n if (!chunk.success) {\n finishReason = { unified: \"error\", raw: void 0 };\n controller.enqueue({ type: \"error\", error: chunk.error });\n return;\n }\n const value = chunk.value;\n if (\"error\" in value) {\n finishReason = { unified: \"error\", raw: void 0 };\n controller.enqueue({ type: \"error\", error: value.error });\n return;\n }\n if (!metadataExtracted) {\n const metadata = getResponseMetadata(value);\n if (Object.values(metadata).some(Boolean)) {\n metadataExtracted = true;\n controller.enqueue({\n type: \"response-metadata\",\n ...getResponseMetadata(value)\n });\n }\n }\n if (value.usage != null) {\n usage = value.usage;\n if (((_a = value.usage.completion_tokens_details) == null ? void 0 : _a.accepted_prediction_tokens) != null) {\n providerMetadata.openai.acceptedPredictionTokens = (_b = value.usage.completion_tokens_details) == null ? void 0 : _b.accepted_prediction_tokens;\n }\n if (((_c = value.usage.completion_tokens_details) == null ? void 0 : _c.rejected_prediction_tokens) != null) {\n providerMetadata.openai.rejectedPredictionTokens = (_d = value.usage.completion_tokens_details) == null ? void 0 : _d.rejected_prediction_tokens;\n }\n }\n const choice = value.choices[0];\n if ((choice == null ? void 0 : choice.finish_reason) != null) {\n finishReason = {\n unified: mapOpenAIFinishReason(choice.finish_reason),\n raw: choice.finish_reason\n };\n }\n if (((_e = choice == null ? void 0 : choice.logprobs) == null ? void 0 : _e.content) != null) {\n providerMetadata.openai.logprobs = choice.logprobs.content;\n }\n if ((choice == null ? void 0 : choice.delta) == null) {\n return;\n }\n const delta = choice.delta;\n if (delta.content != null) {\n if (!isActiveText) {\n controller.enqueue({ type: \"text-start\", id: \"0\" });\n isActiveText = true;\n }\n controller.enqueue({\n type: \"text-delta\",\n id: \"0\",\n delta: delta.content\n });\n }\n if (delta.tool_calls != null) {\n for (const toolCallDelta of delta.tool_calls) {\n const index = toolCallDelta.index;\n if (toolCalls[index] == null) {\n if (toolCallDelta.type != null && toolCallDelta.type !== \"function\") {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function' type.`\n });\n }\n if (toolCallDelta.id == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'id' to be a string.`\n });\n }\n if (((_f = toolCallDelta.function) == null ? void 0 : _f.name) == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function.name' to be a string.`\n });\n }\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallDelta.id,\n toolName: toolCallDelta.function.name\n });\n toolCalls[index] = {\n id: toolCallDelta.id,\n type: \"function\",\n function: {\n name: toolCallDelta.function.name,\n arguments: (_g = toolCallDelta.function.arguments) != null ? _g : \"\"\n },\n hasFinished: false\n };\n const toolCall2 = toolCalls[index];\n if (((_h = toolCall2.function) == null ? void 0 : _h.name) != null && ((_i = toolCall2.function) == null ? void 0 : _i.arguments) != null) {\n if (toolCall2.function.arguments.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall2.id,\n delta: toolCall2.function.arguments\n });\n }\n if ((0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.isParsableJson)(toolCall2.function.arguments)) {\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCall2.id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: (_j = toolCall2.id) != null ? _j : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n toolName: toolCall2.function.name,\n input: toolCall2.function.arguments\n });\n toolCall2.hasFinished = true;\n }\n }\n continue;\n }\n const toolCall = toolCalls[index];\n if (toolCall.hasFinished) {\n continue;\n }\n if (((_k = toolCallDelta.function) == null ? void 0 : _k.arguments) != null) {\n toolCall.function.arguments += (_m = (_l = toolCallDelta.function) == null ? void 0 : _l.arguments) != null ? _m : \"\";\n }\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.id,\n delta: (_n = toolCallDelta.function.arguments) != null ? _n : \"\"\n });\n if (((_o = toolCall.function) == null ? void 0 : _o.name) != null && ((_p = toolCall.function) == null ? void 0 : _p.arguments) != null && (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.isParsableJson)(toolCall.function.arguments)) {\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCall.id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: (_q = toolCall.id) != null ? _q : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments\n });\n toolCall.hasFinished = true;\n }\n }\n }\n if (delta.annotations != null) {\n for (const annotation of delta.annotations) {\n controller.enqueue({\n type: \"source\",\n sourceType: \"url\",\n id: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n url: annotation.url_citation.url,\n title: annotation.url_citation.title\n });\n }\n }\n },\n flush(controller) {\n if (isActiveText) {\n controller.enqueue({ type: \"text-end\", id: \"0\" });\n }\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage: convertOpenAIChatUsage(usage),\n ...providerMetadata != null ? { providerMetadata } : {}\n });\n }\n })\n ),\n request: { body },\n response: { headers: responseHeaders }\n };\n }\n};\n\n// src/completion/openai-completion-language-model.ts\n\n\n// src/completion/convert-openai-completion-usage.ts\nfunction convertOpenAICompletionUsage(usage) {\n var _a, _b, _c, _d;\n if (usage == null) {\n return {\n inputTokens: {\n total: void 0,\n noCache: void 0,\n cacheRead: void 0,\n cacheWrite: void 0\n },\n outputTokens: {\n total: void 0,\n text: void 0,\n reasoning: void 0\n },\n raw: void 0\n };\n }\n const promptTokens = (_a = usage.prompt_tokens) != null ? _a : 0;\n const completionTokens = (_b = usage.completion_tokens) != null ? _b : 0;\n return {\n inputTokens: {\n total: (_c = usage.prompt_tokens) != null ? _c : void 0,\n noCache: promptTokens,\n cacheRead: void 0,\n cacheWrite: void 0\n },\n outputTokens: {\n total: (_d = usage.completion_tokens) != null ? _d : void 0,\n text: completionTokens,\n reasoning: void 0\n },\n raw: usage\n };\n}\n\n// src/completion/convert-to-openai-completion-prompt.ts\n\nfunction convertToOpenAICompletionPrompt({\n prompt,\n user = \"user\",\n assistant = \"assistant\"\n}) {\n let text = \"\";\n if (prompt[0].role === \"system\") {\n text += `${prompt[0].content}\n\n`;\n prompt = prompt.slice(1);\n }\n for (const { role, content } of prompt) {\n switch (role) {\n case \"system\": {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.InvalidPromptError({\n message: \"Unexpected system message in prompt: ${content}\",\n prompt\n });\n }\n case \"user\": {\n const userMessage = content.map((part) => {\n switch (part.type) {\n case \"text\": {\n return part.text;\n }\n }\n }).filter(Boolean).join(\"\");\n text += `${user}:\n${userMessage}\n\n`;\n break;\n }\n case \"assistant\": {\n const assistantMessage = content.map((part) => {\n switch (part.type) {\n case \"text\": {\n return part.text;\n }\n case \"tool-call\": {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: \"tool-call messages\"\n });\n }\n }\n }).join(\"\");\n text += `${assistant}:\n${assistantMessage}\n\n`;\n break;\n }\n case \"tool\": {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: \"tool messages\"\n });\n }\n default: {\n const _exhaustiveCheck = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n text += `${assistant}:\n`;\n return {\n prompt: text,\n stopSequences: [`\n${user}:`]\n };\n}\n\n// src/completion/get-response-metadata.ts\nfunction getResponseMetadata2({\n id,\n model,\n created\n}) {\n return {\n id: id != null ? id : void 0,\n modelId: model != null ? model : void 0,\n timestamp: created != null ? new Date(created * 1e3) : void 0\n };\n}\n\n// src/completion/map-openai-finish-reason.ts\nfunction mapOpenAIFinishReason2(finishReason) {\n switch (finishReason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"content_filter\":\n return \"content-filter\";\n case \"function_call\":\n case \"tool_calls\":\n return \"tool-calls\";\n default:\n return \"other\";\n }\n}\n\n// src/completion/openai-completion-api.ts\n\n\nvar openaiCompletionResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n created: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n choices: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n finish_reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n token_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number())).nullish()\n }).nullish()\n })\n ),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n prompt_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n completion_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n total_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }).nullish()\n })\n )\n);\nvar openaiCompletionChunkSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n created: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n choices: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n finish_reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n token_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number())).nullish()\n }).nullish()\n })\n ),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n prompt_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n completion_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n total_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }).nullish()\n }),\n openaiErrorDataSchema\n ])\n )\n);\n\n// src/completion/openai-completion-options.ts\n\n\nvar openaiLanguageModelCompletionOptions = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n /**\n * Echo back the prompt in addition to the completion.\n */\n echo: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n /**\n * Modify the likelihood of specified tokens appearing in the completion.\n *\n * Accepts a JSON object that maps tokens (specified by their token ID in\n * the GPT tokenizer) to an associated bias value from -100 to 100. You\n * can use this tokenizer tool to convert text to token IDs. Mathematically,\n * the bias is added to the logits generated by the model prior to sampling.\n * The exact effect will vary per model, but values between -1 and 1 should\n * decrease or increase likelihood of selection; values like -100 or 100\n * should result in a ban or exclusive selection of the relevant token.\n *\n * As an example, you can pass {\"50256\": -100} to prevent the <|endoftext|>\n * token from being generated.\n */\n logitBias: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()).optional(),\n /**\n * The suffix that comes after a completion of inserted text.\n */\n suffix: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * A unique identifier representing your end-user, which can help OpenAI to\n * monitor and detect abuse. Learn more.\n */\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * Return the log probabilities of the tokens. Including logprobs will increase\n * the response size and can slow down response times. However, it can\n * be useful to better understand how the model is behaving.\n * Setting to true will return the log probabilities of the tokens that\n * were generated.\n * Setting to a number will return the log probabilities of the top n\n * tokens that were generated.\n */\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()]).optional()\n })\n )\n);\n\n// src/completion/openai-completion-language-model.ts\nvar OpenAICompletionLanguageModel = class {\n constructor(modelId, config) {\n this.specificationVersion = \"v3\";\n this.supportedUrls = {\n // No URLs are supported for completion models.\n };\n this.modelId = modelId;\n this.config = config;\n }\n get providerOptionsName() {\n return this.config.provider.split(\".\")[0].trim();\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences: userStopSequences,\n responseFormat,\n tools,\n toolChoice,\n seed,\n providerOptions\n }) {\n const warnings = [];\n const openaiOptions = {\n ...await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openaiLanguageModelCompletionOptions\n }),\n ...await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: this.providerOptionsName,\n providerOptions,\n schema: openaiLanguageModelCompletionOptions\n })\n };\n if (topK != null) {\n warnings.push({ type: \"unsupported\", feature: \"topK\" });\n }\n if (tools == null ? void 0 : tools.length) {\n warnings.push({ type: \"unsupported\", feature: \"tools\" });\n }\n if (toolChoice != null) {\n warnings.push({ type: \"unsupported\", feature: \"toolChoice\" });\n }\n if (responseFormat != null && responseFormat.type !== \"text\") {\n warnings.push({\n type: \"unsupported\",\n feature: \"responseFormat\",\n details: \"JSON response format is not supported.\"\n });\n }\n const { prompt: completionPrompt, stopSequences } = convertToOpenAICompletionPrompt({ prompt });\n const stop = [...stopSequences != null ? stopSequences : [], ...userStopSequences != null ? userStopSequences : []];\n return {\n args: {\n // model id:\n model: this.modelId,\n // model specific settings:\n echo: openaiOptions.echo,\n logit_bias: openaiOptions.logitBias,\n logprobs: (openaiOptions == null ? void 0 : openaiOptions.logprobs) === true ? 0 : (openaiOptions == null ? void 0 : openaiOptions.logprobs) === false ? void 0 : openaiOptions == null ? void 0 : openaiOptions.logprobs,\n suffix: openaiOptions.suffix,\n user: openaiOptions.user,\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n seed,\n // prompt:\n prompt: completionPrompt,\n // stop sequences:\n stop: stop.length > 0 ? stop : void 0\n },\n warnings\n };\n }\n async doGenerate(options) {\n var _a;\n const { args, warnings } = await this.getArgs(options);\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/completions\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body: args,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiCompletionResponseSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n const choice = response.choices[0];\n const providerMetadata = { openai: {} };\n if (choice.logprobs != null) {\n providerMetadata.openai.logprobs = choice.logprobs;\n }\n return {\n content: [{ type: \"text\", text: choice.text }],\n usage: convertOpenAICompletionUsage(response.usage),\n finishReason: {\n unified: mapOpenAIFinishReason2(choice.finish_reason),\n raw: (_a = choice.finish_reason) != null ? _a : void 0\n },\n request: { body: args },\n response: {\n ...getResponseMetadata2(response),\n headers: responseHeaders,\n body: rawResponse\n },\n providerMetadata,\n warnings\n };\n }\n async doStream(options) {\n const { args, warnings } = await this.getArgs(options);\n const body = {\n ...args,\n stream: true,\n stream_options: {\n include_usage: true\n }\n };\n const { responseHeaders, value: response } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/completions\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createEventSourceResponseHandler)(\n openaiCompletionChunkSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n let finishReason = {\n unified: \"other\",\n raw: void 0\n };\n const providerMetadata = { openai: {} };\n let usage = void 0;\n let isFirstChunk = true;\n return {\n stream: response.pipeThrough(\n new TransformStream({\n start(controller) {\n controller.enqueue({ type: \"stream-start\", warnings });\n },\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: \"raw\", rawValue: chunk.rawValue });\n }\n if (!chunk.success) {\n finishReason = { unified: \"error\", raw: void 0 };\n controller.enqueue({ type: \"error\", error: chunk.error });\n return;\n }\n const value = chunk.value;\n if (\"error\" in value) {\n finishReason = { unified: \"error\", raw: void 0 };\n controller.enqueue({ type: \"error\", error: value.error });\n return;\n }\n if (isFirstChunk) {\n isFirstChunk = false;\n controller.enqueue({\n type: \"response-metadata\",\n ...getResponseMetadata2(value)\n });\n controller.enqueue({ type: \"text-start\", id: \"0\" });\n }\n if (value.usage != null) {\n usage = value.usage;\n }\n const choice = value.choices[0];\n if ((choice == null ? void 0 : choice.finish_reason) != null) {\n finishReason = {\n unified: mapOpenAIFinishReason2(choice.finish_reason),\n raw: choice.finish_reason\n };\n }\n if ((choice == null ? void 0 : choice.logprobs) != null) {\n providerMetadata.openai.logprobs = choice.logprobs;\n }\n if ((choice == null ? void 0 : choice.text) != null && choice.text.length > 0) {\n controller.enqueue({\n type: \"text-delta\",\n id: \"0\",\n delta: choice.text\n });\n }\n },\n flush(controller) {\n if (!isFirstChunk) {\n controller.enqueue({ type: \"text-end\", id: \"0\" });\n }\n controller.enqueue({\n type: \"finish\",\n finishReason,\n providerMetadata,\n usage: convertOpenAICompletionUsage(usage)\n });\n }\n })\n ),\n request: { body },\n response: { headers: responseHeaders }\n };\n }\n};\n\n// src/embedding/openai-embedding-model.ts\n\n\n\n// src/embedding/openai-embedding-options.ts\n\n\nvar openaiEmbeddingModelOptions = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n /**\n * The number of dimensions the resulting output embeddings should have.\n * Only supported in text-embedding-3 and later models.\n */\n dimensions: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n /**\n * A unique identifier representing your end-user, which can help OpenAI to\n * monitor and detect abuse. Learn more.\n */\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n })\n )\n);\n\n// src/embedding/openai-embedding-api.ts\n\n\nvar openaiTextEmbeddingResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n data: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ embedding: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()) })),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ prompt_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number() }).nullish()\n })\n )\n);\n\n// src/embedding/openai-embedding-model.ts\nvar OpenAIEmbeddingModel = class {\n constructor(modelId, config) {\n this.specificationVersion = \"v3\";\n this.maxEmbeddingsPerCall = 2048;\n this.supportsParallelCalls = true;\n this.modelId = modelId;\n this.config = config;\n }\n get provider() {\n return this.config.provider;\n }\n async doEmbed({\n values,\n headers,\n abortSignal,\n providerOptions\n }) {\n var _a;\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values\n });\n }\n const openaiOptions = (_a = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openaiEmbeddingModelOptions\n })) != null ? _a : {};\n const {\n responseHeaders,\n value: response,\n rawValue\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/embeddings\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), headers),\n body: {\n model: this.modelId,\n input: values,\n encoding_format: \"float\",\n dimensions: openaiOptions.dimensions,\n user: openaiOptions.user\n },\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiTextEmbeddingResponseSchema\n ),\n abortSignal,\n fetch: this.config.fetch\n });\n return {\n warnings: [],\n embeddings: response.data.map((item) => item.embedding),\n usage: response.usage ? { tokens: response.usage.prompt_tokens } : void 0,\n response: { headers: responseHeaders, body: rawValue }\n };\n }\n};\n\n// src/image/openai-image-model.ts\n\n\n// src/image/openai-image-api.ts\n\n\nvar openaiImageResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n created: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n b64_json: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n revised_prompt: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ),\n background: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n output_format: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n size: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n quality: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n output_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n total_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n input_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n image_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n text_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish()\n }).nullish()\n }).nullish()\n })\n )\n);\n\n// src/image/openai-image-options.ts\nvar modelMaxImagesPerCall = {\n \"dall-e-3\": 1,\n \"dall-e-2\": 10,\n \"gpt-image-1\": 10,\n \"gpt-image-1-mini\": 10,\n \"gpt-image-1.5\": 10,\n \"chatgpt-image-latest\": 10\n};\nvar defaultResponseFormatPrefixes = [\n \"chatgpt-image-\",\n \"gpt-image-1-mini\",\n \"gpt-image-1.5\",\n \"gpt-image-1\"\n];\nfunction hasDefaultResponseFormat(modelId) {\n return defaultResponseFormatPrefixes.some(\n (prefix) => modelId.startsWith(prefix)\n );\n}\n\n// src/image/openai-image-model.ts\nvar OpenAIImageModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n }\n get maxImagesPerCall() {\n var _a;\n return (_a = modelMaxImagesPerCall[this.modelId]) != null ? _a : 1;\n }\n get provider() {\n return this.config.provider;\n }\n async doGenerate({\n prompt,\n files,\n mask,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal\n }) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;\n const warnings = [];\n if (aspectRatio != null) {\n warnings.push({\n type: \"unsupported\",\n feature: \"aspectRatio\",\n details: \"This model does not support aspect ratio. Use `size` instead.\"\n });\n }\n if (seed != null) {\n warnings.push({ type: \"unsupported\", feature: \"seed\" });\n }\n const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();\n if (files != null) {\n const { value: response2, responseHeaders: responseHeaders2 } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postFormDataToApi)({\n url: this.config.url({\n path: \"/images/edits\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), headers),\n formData: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToFormData)({\n model: this.modelId,\n prompt,\n image: await Promise.all(\n files.map(\n (file) => file.type === \"file\" ? new Blob(\n [\n file.data instanceof Uint8Array ? new Blob([file.data], {\n type: file.mediaType\n }) : new Blob([(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertBase64ToUint8Array)(file.data)], {\n type: file.mediaType\n })\n ],\n { type: file.mediaType }\n ) : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.downloadBlob)(file.url)\n )\n ),\n mask: mask != null ? await fileToBlob(mask) : void 0,\n n,\n size,\n ...(_d = providerOptions.openai) != null ? _d : {}\n }),\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiImageResponseSchema\n ),\n abortSignal,\n fetch: this.config.fetch\n });\n return {\n images: response2.data.map((item) => item.b64_json),\n warnings,\n usage: response2.usage != null ? {\n inputTokens: (_e = response2.usage.input_tokens) != null ? _e : void 0,\n outputTokens: (_f = response2.usage.output_tokens) != null ? _f : void 0,\n totalTokens: (_g = response2.usage.total_tokens) != null ? _g : void 0\n } : void 0,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders2\n },\n providerMetadata: {\n openai: {\n images: response2.data.map((item, index) => {\n var _a2, _b2, _c2, _d2, _e2, _f2;\n return {\n ...item.revised_prompt ? { revisedPrompt: item.revised_prompt } : {},\n created: (_a2 = response2.created) != null ? _a2 : void 0,\n size: (_b2 = response2.size) != null ? _b2 : void 0,\n quality: (_c2 = response2.quality) != null ? _c2 : void 0,\n background: (_d2 = response2.background) != null ? _d2 : void 0,\n outputFormat: (_e2 = response2.output_format) != null ? _e2 : void 0,\n ...distributeTokenDetails(\n (_f2 = response2.usage) == null ? void 0 : _f2.input_tokens_details,\n index,\n response2.data.length\n )\n };\n })\n }\n }\n };\n }\n const { value: response, responseHeaders } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/images/generations\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), headers),\n body: {\n model: this.modelId,\n prompt,\n n,\n size,\n ...(_h = providerOptions.openai) != null ? _h : {},\n ...!hasDefaultResponseFormat(this.modelId) ? { response_format: \"b64_json\" } : {}\n },\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiImageResponseSchema\n ),\n abortSignal,\n fetch: this.config.fetch\n });\n return {\n images: response.data.map((item) => item.b64_json),\n warnings,\n usage: response.usage != null ? {\n inputTokens: (_i = response.usage.input_tokens) != null ? _i : void 0,\n outputTokens: (_j = response.usage.output_tokens) != null ? _j : void 0,\n totalTokens: (_k = response.usage.total_tokens) != null ? _k : void 0\n } : void 0,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders\n },\n providerMetadata: {\n openai: {\n images: response.data.map((item, index) => {\n var _a2, _b2, _c2, _d2, _e2, _f2;\n return {\n ...item.revised_prompt ? { revisedPrompt: item.revised_prompt } : {},\n created: (_a2 = response.created) != null ? _a2 : void 0,\n size: (_b2 = response.size) != null ? _b2 : void 0,\n quality: (_c2 = response.quality) != null ? _c2 : void 0,\n background: (_d2 = response.background) != null ? _d2 : void 0,\n outputFormat: (_e2 = response.output_format) != null ? _e2 : void 0,\n ...distributeTokenDetails(\n (_f2 = response.usage) == null ? void 0 : _f2.input_tokens_details,\n index,\n response.data.length\n )\n };\n })\n }\n }\n };\n }\n};\nfunction distributeTokenDetails(details, index, total) {\n if (details == null) {\n return {};\n }\n const result = {};\n if (details.image_tokens != null) {\n const base = Math.floor(details.image_tokens / total);\n const remainder = details.image_tokens - base * (total - 1);\n result.imageTokens = index === total - 1 ? remainder : base;\n }\n if (details.text_tokens != null) {\n const base = Math.floor(details.text_tokens / total);\n const remainder = details.text_tokens - base * (total - 1);\n result.textTokens = index === total - 1 ? remainder : base;\n }\n return result;\n}\nasync function fileToBlob(file) {\n if (!file) return void 0;\n if (file.type === \"url\") {\n return (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.downloadBlob)(file.url);\n }\n const data = file.data instanceof Uint8Array ? file.data : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertBase64ToUint8Array)(file.data);\n return new Blob([data], { type: file.mediaType });\n}\n\n// src/tool/apply-patch.ts\n\n\nvar applyPatchInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n callId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n operation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"create_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"delete_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"update_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ])\n })\n )\n);\nvar applyPatchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"completed\", \"failed\"]),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n })\n )\n);\nvar applyPatchArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(() => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({})));\nvar applyPatchToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.apply_patch\",\n inputSchema: applyPatchInputSchema,\n outputSchema: applyPatchOutputSchema\n});\nvar applyPatch = applyPatchToolFactory;\n\n// src/tool/code-interpreter.ts\n\n\nvar codeInterpreterInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n containerId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n )\n);\nvar codeInterpreterOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n outputs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"logs\"), logs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).nullish()\n })\n )\n);\nvar codeInterpreterArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n container: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n fileIds: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n })\n ]).optional()\n })\n )\n);\nvar codeInterpreterToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.code_interpreter\",\n inputSchema: codeInterpreterInputSchema,\n outputSchema: codeInterpreterOutputSchema\n});\nvar codeInterpreter = (args = {}) => {\n return codeInterpreterToolFactory(args);\n};\n\n// src/tool/custom.ts\n\n\nvar customArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n format: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"grammar\"),\n syntax: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"regex\", \"lark\"]),\n definition: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"text\")\n })\n ]).optional()\n })\n )\n);\nvar customInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(() => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()));\nvar customToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactory)({\n id: \"openai.custom\",\n inputSchema: customInputSchema\n});\nvar customTool = (args) => customToolFactory(args);\n\n// src/tool/file-search.ts\n\n\nvar comparisonFilterSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n key: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"eq\", \"ne\", \"gt\", \"gte\", \"lt\", \"lte\", \"in\", \"nin\"]),\n value: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string())])\n});\nvar compoundFilterSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"and\", \"or\"]),\n filters: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([comparisonFilterSchema, zod_v4__WEBPACK_IMPORTED_MODULE_0__.lazy(() => compoundFilterSchema)])\n )\n});\nvar fileSearchArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n vectorStoreIds: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n maxNumResults: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n ranking: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n ranker: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n scoreThreshold: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional()\n }).optional(),\n filters: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([comparisonFilterSchema, compoundFilterSchema]).optional()\n })\n )\n);\nvar fileSearchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n queries: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n results: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n attributes: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()),\n fileId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n score: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ).nullable()\n })\n )\n);\nvar fileSearch = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.file_search\",\n inputSchema: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({}),\n outputSchema: fileSearchOutputSchema\n});\n\n// src/tool/image-generation.ts\n\n\nvar imageGenerationArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n background: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\", \"opaque\", \"transparent\"]).optional(),\n inputFidelity: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"low\", \"high\"]).optional(),\n inputImageMask: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n fileId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n imageUrl: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).optional(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n moderation: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\"]).optional(),\n outputCompression: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().int().min(0).max(100).optional(),\n outputFormat: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"png\", \"jpeg\", \"webp\"]).optional(),\n partialImages: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().int().min(0).max(3).optional(),\n quality: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\", \"low\", \"medium\", \"high\"]).optional(),\n size: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"1024x1024\", \"1024x1536\", \"1536x1024\", \"auto\"]).optional()\n }).strict()\n )\n);\nvar imageGenerationInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(() => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({})));\nvar imageGenerationOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ result: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }))\n);\nvar imageGenerationToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.image_generation\",\n inputSchema: imageGenerationInputSchema,\n outputSchema: imageGenerationOutputSchema\n});\nvar imageGeneration = (args = {}) => {\n return imageGenerationToolFactory(args);\n};\n\n// src/tool/local-shell.ts\n\n\nvar localShellInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exec\"),\n command: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n timeoutMs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n workingDirectory: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n env: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n })\n })\n )\n);\nvar localShellOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }))\n);\nvar localShell = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.local_shell\",\n inputSchema: localShellInputSchema,\n outputSchema: localShellOutputSchema\n});\n\n// src/tool/shell.ts\n\n\nvar shellInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n commands: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n timeoutMs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n maxOutputLength: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional()\n })\n })\n )\n);\nvar shellOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n stdout: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n stderr: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outcome: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"timeout\") }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exit\"), exitCode: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number() })\n ])\n })\n )\n })\n )\n);\nvar shellSkillsSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"skillReference\"),\n skillId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n version: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"inline\"),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n source: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"base64\"),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"application/zip\"),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n })\n ])\n).optional();\nvar shellArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n environment: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"containerAuto\"),\n fileIds: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional(),\n memoryLimit: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"1g\", \"4g\", \"16g\", \"64g\"]).optional(),\n networkPolicy: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"disabled\") }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"allowlist\"),\n allowedDomains: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n domainSecrets: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n domain: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n value: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ).optional()\n })\n ]).optional(),\n skills: shellSkillsSchema\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"containerReference\"),\n containerId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"local\").optional(),\n skills: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ).optional()\n })\n ]).optional()\n })\n )\n);\nvar shell = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.shell\",\n inputSchema: shellInputSchema,\n outputSchema: shellOutputSchema\n});\n\n// src/tool/tool-search.ts\n\n\nvar toolSearchArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]).optional(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n parameters: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()).optional()\n })\n )\n);\nvar toolSearchInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown().optional(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n )\n);\nvar toolSearchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()))\n })\n )\n);\nvar toolSearchToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.tool_search\",\n inputSchema: toolSearchInputSchema,\n outputSchema: toolSearchOutputSchema\n});\nvar toolSearch = (args = {}) => toolSearchToolFactory(args);\n\n// src/tool/web-search.ts\n\n\nvar webSearchArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n externalWebAccess: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n filters: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ allowedDomains: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional() }).optional(),\n searchContextSize: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"low\", \"medium\", \"high\"]).optional(),\n userLocation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"approximate\"),\n country: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n city: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n region: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n timezone: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).optional()\n })\n )\n);\nvar webSearchInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(() => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({})));\nvar webSearchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"search\"),\n query: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"openPage\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"findInPage\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n pattern: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ]).optional(),\n sources: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"api\"), name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).optional()\n })\n )\n);\nvar webSearchToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.web_search\",\n inputSchema: webSearchInputSchema,\n outputSchema: webSearchOutputSchema\n});\nvar webSearch = (args = {}) => webSearchToolFactory(args);\n\n// src/tool/web-search-preview.ts\n\n\nvar webSearchPreviewArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n searchContextSize: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"low\", \"medium\", \"high\"]).optional(),\n userLocation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"approximate\"),\n country: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n city: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n region: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n timezone: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).optional()\n })\n )\n);\nvar webSearchPreviewInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({}))\n);\nvar webSearchPreviewOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"search\"),\n query: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"openPage\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"findInPage\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n pattern: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ]).optional()\n })\n )\n);\nvar webSearchPreview = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.web_search_preview\",\n inputSchema: webSearchPreviewInputSchema,\n outputSchema: webSearchPreviewOutputSchema\n});\n\n// src/tool/mcp.ts\n\n\nvar jsonValueSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.lazy(\n () => zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"null\"](),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(jsonValueSchema),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema)\n ])\n);\nvar mcpArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n serverLabel: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n allowedTools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n readOnly: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n toolNames: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n })\n ]).optional(),\n authorization: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n connectorId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n headers: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional(),\n requireApproval: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"always\", \"never\"]),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n never: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n toolNames: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n }).optional()\n })\n ]).optional(),\n serverDescription: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n serverUrl: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).refine(\n (v) => v.serverUrl != null || v.connectorId != null,\n \"One of serverUrl or connectorId must be provided.\"\n )\n )\n);\nvar mcpInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(() => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({})));\nvar mcpOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"call\"),\n serverLabel: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema]).optional()\n })\n )\n);\nvar mcpToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.mcp\",\n inputSchema: mcpInputSchema,\n outputSchema: mcpOutputSchema\n});\nvar mcp = (args) => mcpToolFactory(args);\n\n// src/openai-tools.ts\nvar openaiTools = {\n /**\n * The apply_patch tool lets GPT-5.1 create, update, and delete files in your\n * codebase using structured diffs. Instead of just suggesting edits, the model\n * emits patch operations that your application applies and then reports back on,\n * enabling iterative, multi-step code editing workflows.\n *\n */\n applyPatch,\n /**\n * Custom tools let callers constrain model output to a grammar (regex or\n * Lark syntax). The model returns a `custom_tool_call` output item whose\n * `input` field is a string matching the specified grammar.\n *\n * @param name - The name of the custom tool.\n * @param description - An optional description of the tool.\n * @param format - The output format constraint (grammar type, syntax, and definition).\n */\n customTool,\n /**\n * The Code Interpreter tool allows models to write and run Python code in a\n * sandboxed environment to solve complex problems in domains like data analysis,\n * coding, and math.\n *\n * @param container - The container to use for the code interpreter.\n */\n codeInterpreter,\n /**\n * File search is a tool available in the Responses API. It enables models to\n * retrieve information in a knowledge base of previously uploaded files through\n * semantic and keyword search.\n *\n * @param vectorStoreIds - The vector store IDs to use for the file search.\n * @param maxNumResults - The maximum number of results to return.\n * @param ranking - The ranking options to use for the file search.\n * @param filters - The filters to use for the file search.\n */\n fileSearch,\n /**\n * The image generation tool allows you to generate images using a text prompt,\n * and optionally image inputs. It leverages the GPT Image model,\n * and automatically optimizes text inputs for improved performance.\n *\n * @param background - Background type for the generated image. One of 'auto', 'opaque', or 'transparent'.\n * @param inputFidelity - Input fidelity for the generated image. One of 'low' or 'high'.\n * @param inputImageMask - Optional mask for inpainting. Contains fileId and/or imageUrl.\n * @param model - The image generation model to use. Default: gpt-image-1.\n * @param moderation - Moderation level for the generated image. Default: 'auto'.\n * @param outputCompression - Compression level for the output image (0-100).\n * @param outputFormat - The output format of the generated image. One of 'png', 'jpeg', or 'webp'.\n * @param partialImages - Number of partial images to generate in streaming mode (0-3).\n * @param quality - The quality of the generated image. One of 'auto', 'low', 'medium', or 'high'.\n * @param size - The size of the generated image. One of 'auto', '1024x1024', '1024x1536', or '1536x1024'.\n */\n imageGeneration,\n /**\n * Local shell is a tool that allows agents to run shell commands locally\n * on a machine you or the user provides.\n *\n * Supported models: `gpt-5-codex`\n */\n localShell,\n /**\n * The shell tool allows the model to interact with your local computer through\n * a controlled command-line interface. The model proposes shell commands; your\n * integration executes them and returns the outputs.\n *\n * Available through the Responses API for use with GPT-5.1.\n *\n * WARNING: Running arbitrary shell commands can be dangerous. Always sandbox\n * execution or add strict allow-/deny-lists before forwarding a command to\n * the system shell.\n */\n shell,\n /**\n * Web search allows models to access up-to-date information from the internet\n * and provide answers with sourced citations.\n *\n * @param searchContextSize - The search context size to use for the web search.\n * @param userLocation - The user location to use for the web search.\n */\n webSearchPreview,\n /**\n * Web search allows models to access up-to-date information from the internet\n * and provide answers with sourced citations.\n *\n * @param filters - The filters to use for the web search.\n * @param searchContextSize - The search context size to use for the web search.\n * @param userLocation - The user location to use for the web search.\n */\n webSearch,\n /**\n * MCP (Model Context Protocol) allows models to call tools exposed by\n * remote MCP servers or service connectors.\n *\n * @param serverLabel - Label to identify the MCP server.\n * @param allowedTools - Allowed tool names or filter object.\n * @param authorization - OAuth access token for the MCP server/connector.\n * @param connectorId - Identifier for a service connector.\n * @param headers - Optional headers to include in MCP requests.\n * // param requireApproval - Approval policy ('always'|'never'|filter object). (Removed - always 'never')\n * @param serverDescription - Optional description of the server.\n * @param serverUrl - URL for the MCP server.\n */\n mcp,\n /**\n * Tool search allows the model to dynamically search for and load deferred\n * tools into the model's context as needed. This helps reduce overall token\n * usage, cost, and latency by only loading tools when the model needs them.\n *\n * To use tool search, mark functions or namespaces with `defer_loading: true`\n * in the tools array. The model will use tool search to load these tools\n * when it determines they are needed.\n */\n toolSearch\n};\n\n// src/responses/openai-responses-language-model.ts\n\n\n\n// src/responses/convert-openai-responses-usage.ts\nfunction convertOpenAIResponsesUsage(usage) {\n var _a, _b, _c, _d;\n if (usage == null) {\n return {\n inputTokens: {\n total: void 0,\n noCache: void 0,\n cacheRead: void 0,\n cacheWrite: void 0\n },\n outputTokens: {\n total: void 0,\n text: void 0,\n reasoning: void 0\n },\n raw: void 0\n };\n }\n const inputTokens = usage.input_tokens;\n const outputTokens = usage.output_tokens;\n const cachedTokens = (_b = (_a = usage.input_tokens_details) == null ? void 0 : _a.cached_tokens) != null ? _b : 0;\n const reasoningTokens = (_d = (_c = usage.output_tokens_details) == null ? void 0 : _c.reasoning_tokens) != null ? _d : 0;\n return {\n inputTokens: {\n total: inputTokens,\n noCache: inputTokens - cachedTokens,\n cacheRead: cachedTokens,\n cacheWrite: void 0\n },\n outputTokens: {\n total: outputTokens,\n text: outputTokens - reasoningTokens,\n reasoning: reasoningTokens\n },\n raw: usage\n };\n}\n\n// src/responses/convert-to-openai-responses-input.ts\n\n\n\nfunction isFileId(data, prefixes) {\n if (!prefixes) return false;\n return prefixes.some((prefix) => data.startsWith(prefix));\n}\nasync function convertToOpenAIResponsesInput({\n prompt,\n toolNameMapping,\n systemMessageMode,\n providerOptionsName,\n fileIdPrefixes,\n store,\n hasConversation = false,\n hasLocalShellTool = false,\n hasShellTool = false,\n hasApplyPatchTool = false,\n customProviderToolNames\n}) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;\n let input = [];\n const warnings = [];\n const processedApprovalIds = /* @__PURE__ */ new Set();\n for (const { role, content } of prompt) {\n switch (role) {\n case \"system\": {\n switch (systemMessageMode) {\n case \"system\": {\n input.push({ role: \"system\", content });\n break;\n }\n case \"developer\": {\n input.push({ role: \"developer\", content });\n break;\n }\n case \"remove\": {\n warnings.push({\n type: \"other\",\n message: \"system messages are removed for this model\"\n });\n break;\n }\n default: {\n const _exhaustiveCheck = systemMessageMode;\n throw new Error(\n `Unsupported system message mode: ${_exhaustiveCheck}`\n );\n }\n }\n break;\n }\n case \"user\": {\n input.push({\n role: \"user\",\n content: content.map((part, index) => {\n var _a2, _b2, _c2;\n switch (part.type) {\n case \"text\": {\n return { type: \"input_text\", text: part.text };\n }\n case \"file\": {\n if (part.mediaType.startsWith(\"image/\")) {\n const mediaType = part.mediaType === \"image/*\" ? \"image/jpeg\" : part.mediaType;\n return {\n type: \"input_image\",\n ...part.data instanceof URL ? { image_url: part.data.toString() } : typeof part.data === \"string\" && isFileId(part.data, fileIdPrefixes) ? { file_id: part.data } : {\n image_url: `data:${mediaType};base64,${(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data)}`\n },\n detail: (_b2 = (_a2 = part.providerOptions) == null ? void 0 : _a2[providerOptionsName]) == null ? void 0 : _b2.imageDetail\n };\n } else if (part.mediaType === \"application/pdf\") {\n if (part.data instanceof URL) {\n return {\n type: \"input_file\",\n file_url: part.data.toString()\n };\n }\n return {\n type: \"input_file\",\n ...typeof part.data === \"string\" && isFileId(part.data, fileIdPrefixes) ? { file_id: part.data } : {\n filename: (_c2 = part.filename) != null ? _c2 : `part-${index}.pdf`,\n file_data: `data:application/pdf;base64,${(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data)}`\n }\n };\n } else {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: `file part media type ${part.mediaType}`\n });\n }\n }\n }\n })\n });\n break;\n }\n case \"assistant\": {\n const reasoningMessages = {};\n for (const part of content) {\n switch (part.type) {\n case \"text\": {\n const providerOpts = (_a = part.providerOptions) == null ? void 0 : _a[providerOptionsName];\n const id = providerOpts == null ? void 0 : providerOpts.itemId;\n const phase = providerOpts == null ? void 0 : providerOpts.phase;\n if (hasConversation && id != null) {\n break;\n }\n if (store && id != null) {\n input.push({ type: \"item_reference\", id });\n break;\n }\n input.push({\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text }],\n id,\n ...phase != null && { phase }\n });\n break;\n }\n case \"tool-call\": {\n const id = (_f = (_c = (_b = part.providerOptions) == null ? void 0 : _b[providerOptionsName]) == null ? void 0 : _c.itemId) != null ? _f : (_e = (_d = part.providerMetadata) == null ? void 0 : _d[providerOptionsName]) == null ? void 0 : _e.itemId;\n if (hasConversation && id != null) {\n break;\n }\n const resolvedToolName = toolNameMapping.toProviderToolName(\n part.toolName\n );\n if (resolvedToolName === \"tool_search\") {\n if (store && id != null) {\n input.push({ type: \"item_reference\", id });\n break;\n }\n const parsedInput = typeof part.input === \"string\" ? await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseJSON)({\n text: part.input,\n schema: toolSearchInputSchema\n }) : await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.input,\n schema: toolSearchInputSchema\n });\n const execution = parsedInput.call_id != null ? \"client\" : \"server\";\n input.push({\n type: \"tool_search_call\",\n id: id != null ? id : part.toolCallId,\n execution,\n call_id: (_g = parsedInput.call_id) != null ? _g : null,\n status: \"completed\",\n arguments: parsedInput.arguments\n });\n break;\n }\n if (part.providerExecuted) {\n if (store && id != null) {\n input.push({ type: \"item_reference\", id });\n }\n break;\n }\n if (store && id != null) {\n input.push({ type: \"item_reference\", id });\n break;\n }\n if (hasLocalShellTool && resolvedToolName === \"local_shell\") {\n const parsedInput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.input,\n schema: localShellInputSchema\n });\n input.push({\n type: \"local_shell_call\",\n call_id: part.toolCallId,\n id,\n action: {\n type: \"exec\",\n command: parsedInput.action.command,\n timeout_ms: parsedInput.action.timeoutMs,\n user: parsedInput.action.user,\n working_directory: parsedInput.action.workingDirectory,\n env: parsedInput.action.env\n }\n });\n break;\n }\n if (hasShellTool && resolvedToolName === \"shell\") {\n const parsedInput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.input,\n schema: shellInputSchema\n });\n input.push({\n type: \"shell_call\",\n call_id: part.toolCallId,\n id,\n status: \"completed\",\n action: {\n commands: parsedInput.action.commands,\n timeout_ms: parsedInput.action.timeoutMs,\n max_output_length: parsedInput.action.maxOutputLength\n }\n });\n break;\n }\n if (hasApplyPatchTool && resolvedToolName === \"apply_patch\") {\n const parsedInput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.input,\n schema: applyPatchInputSchema\n });\n input.push({\n type: \"apply_patch_call\",\n call_id: parsedInput.callId,\n id,\n status: \"completed\",\n operation: parsedInput.operation\n });\n break;\n }\n if (customProviderToolNames == null ? void 0 : customProviderToolNames.has(resolvedToolName)) {\n input.push({\n type: \"custom_tool_call\",\n call_id: part.toolCallId,\n name: resolvedToolName,\n input: typeof part.input === \"string\" ? part.input : JSON.stringify(part.input),\n id\n });\n break;\n }\n input.push({\n type: \"function_call\",\n call_id: part.toolCallId,\n name: resolvedToolName,\n arguments: JSON.stringify(part.input),\n id\n });\n break;\n }\n // assistant tool result parts are from provider-executed tools:\n case \"tool-result\": {\n if (part.output.type === \"execution-denied\" || part.output.type === \"json\" && typeof part.output.value === \"object\" && part.output.value != null && \"type\" in part.output.value && part.output.value.type === \"execution-denied\") {\n break;\n }\n if (hasConversation) {\n break;\n }\n const resolvedResultToolName = toolNameMapping.toProviderToolName(\n part.toolName\n );\n if (resolvedResultToolName === \"tool_search\") {\n const itemId = (_j = (_i = (_h = part.providerOptions) == null ? void 0 : _h[providerOptionsName]) == null ? void 0 : _i.itemId) != null ? _j : part.toolCallId;\n if (store) {\n input.push({ type: \"item_reference\", id: itemId });\n } else if (part.output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.output.value,\n schema: toolSearchOutputSchema\n });\n input.push({\n type: \"tool_search_output\",\n id: itemId,\n execution: \"server\",\n call_id: null,\n status: \"completed\",\n tools: parsedOutput.tools\n });\n }\n break;\n }\n if (hasShellTool && resolvedResultToolName === \"shell\") {\n if (part.output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.output.value,\n schema: shellOutputSchema\n });\n input.push({\n type: \"shell_call_output\",\n call_id: part.toolCallId,\n output: parsedOutput.output.map((item) => ({\n stdout: item.stdout,\n stderr: item.stderr,\n outcome: item.outcome.type === \"timeout\" ? { type: \"timeout\" } : {\n type: \"exit\",\n exit_code: item.outcome.exitCode\n }\n }))\n });\n }\n break;\n }\n if (store) {\n const itemId = (_m = (_l = (_k = part.providerOptions) == null ? void 0 : _k[providerOptionsName]) == null ? void 0 : _l.itemId) != null ? _m : part.toolCallId;\n input.push({ type: \"item_reference\", id: itemId });\n } else {\n warnings.push({\n type: \"other\",\n message: `Results for OpenAI tool ${part.toolName} are not sent to the API when store is false`\n });\n }\n break;\n }\n case \"reasoning\": {\n const providerOptions = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: providerOptionsName,\n providerOptions: part.providerOptions,\n schema: openaiResponsesReasoningProviderOptionsSchema\n });\n const reasoningId = providerOptions == null ? void 0 : providerOptions.itemId;\n if (hasConversation && reasoningId != null) {\n break;\n }\n if (reasoningId != null) {\n const reasoningMessage = reasoningMessages[reasoningId];\n if (store) {\n if (reasoningMessage === void 0) {\n input.push({ type: \"item_reference\", id: reasoningId });\n reasoningMessages[reasoningId] = {\n type: \"reasoning\",\n id: reasoningId,\n summary: []\n };\n }\n } else {\n const summaryParts = [];\n if (part.text.length > 0) {\n summaryParts.push({\n type: \"summary_text\",\n text: part.text\n });\n } else if (reasoningMessage !== void 0) {\n warnings.push({\n type: \"other\",\n message: `Cannot append empty reasoning part to existing reasoning sequence. Skipping reasoning part: ${JSON.stringify(part)}.`\n });\n }\n if (reasoningMessage === void 0) {\n reasoningMessages[reasoningId] = {\n type: \"reasoning\",\n id: reasoningId,\n encrypted_content: providerOptions == null ? void 0 : providerOptions.reasoningEncryptedContent,\n summary: summaryParts\n };\n input.push(reasoningMessages[reasoningId]);\n } else {\n reasoningMessage.summary.push(...summaryParts);\n if ((providerOptions == null ? void 0 : providerOptions.reasoningEncryptedContent) != null) {\n reasoningMessage.encrypted_content = providerOptions.reasoningEncryptedContent;\n }\n }\n }\n } else {\n const encryptedContent = providerOptions == null ? void 0 : providerOptions.reasoningEncryptedContent;\n if (encryptedContent != null) {\n const summaryParts = [];\n if (part.text.length > 0) {\n summaryParts.push({\n type: \"summary_text\",\n text: part.text\n });\n }\n input.push({\n type: \"reasoning\",\n encrypted_content: encryptedContent,\n summary: summaryParts\n });\n } else {\n warnings.push({\n type: \"other\",\n message: `Non-OpenAI reasoning parts are not supported. Skipping reasoning part: ${JSON.stringify(part)}.`\n });\n }\n }\n break;\n }\n }\n }\n break;\n }\n case \"tool\": {\n for (const part of content) {\n if (part.type === \"tool-approval-response\") {\n const approvalResponse = part;\n if (processedApprovalIds.has(approvalResponse.approvalId)) {\n continue;\n }\n processedApprovalIds.add(approvalResponse.approvalId);\n if (store) {\n input.push({\n type: \"item_reference\",\n id: approvalResponse.approvalId\n });\n }\n input.push({\n type: \"mcp_approval_response\",\n approval_request_id: approvalResponse.approvalId,\n approve: approvalResponse.approved\n });\n continue;\n }\n const output = part.output;\n if (output.type === \"execution-denied\") {\n const approvalId = (_o = (_n = output.providerOptions) == null ? void 0 : _n.openai) == null ? void 0 : _o.approvalId;\n if (approvalId) {\n continue;\n }\n }\n const resolvedToolName = toolNameMapping.toProviderToolName(\n part.toolName\n );\n if (resolvedToolName === \"tool_search\" && output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: output.value,\n schema: toolSearchOutputSchema\n });\n input.push({\n type: \"tool_search_output\",\n execution: \"client\",\n call_id: part.toolCallId,\n status: \"completed\",\n tools: parsedOutput.tools\n });\n continue;\n }\n if (hasLocalShellTool && resolvedToolName === \"local_shell\" && output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: output.value,\n schema: localShellOutputSchema\n });\n input.push({\n type: \"local_shell_call_output\",\n call_id: part.toolCallId,\n output: parsedOutput.output\n });\n continue;\n }\n if (hasShellTool && resolvedToolName === \"shell\" && output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: output.value,\n schema: shellOutputSchema\n });\n input.push({\n type: \"shell_call_output\",\n call_id: part.toolCallId,\n output: parsedOutput.output.map((item) => ({\n stdout: item.stdout,\n stderr: item.stderr,\n outcome: item.outcome.type === \"timeout\" ? { type: \"timeout\" } : {\n type: \"exit\",\n exit_code: item.outcome.exitCode\n }\n }))\n });\n continue;\n }\n if (hasApplyPatchTool && part.toolName === \"apply_patch\" && output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: output.value,\n schema: applyPatchOutputSchema\n });\n input.push({\n type: \"apply_patch_call_output\",\n call_id: part.toolCallId,\n status: parsedOutput.status,\n output: parsedOutput.output\n });\n continue;\n }\n if (customProviderToolNames == null ? void 0 : customProviderToolNames.has(resolvedToolName)) {\n let outputValue;\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n outputValue = output.value;\n break;\n case \"execution-denied\":\n outputValue = (_p = output.reason) != null ? _p : \"Tool execution denied.\";\n break;\n case \"json\":\n case \"error-json\":\n outputValue = JSON.stringify(output.value);\n break;\n case \"content\":\n outputValue = output.value.map((item) => {\n var _a2;\n switch (item.type) {\n case \"text\":\n return { type: \"input_text\", text: item.text };\n case \"image-data\":\n return {\n type: \"input_image\",\n image_url: `data:${item.mediaType};base64,${item.data}`\n };\n case \"image-url\":\n return {\n type: \"input_image\",\n image_url: item.url\n };\n case \"file-data\":\n return {\n type: \"input_file\",\n filename: (_a2 = item.filename) != null ? _a2 : \"data\",\n file_data: `data:${item.mediaType};base64,${item.data}`\n };\n case \"file-url\":\n return {\n type: \"input_file\",\n file_url: item.url\n };\n default:\n warnings.push({\n type: \"other\",\n message: `unsupported custom tool content part type: ${item.type}`\n });\n return void 0;\n }\n }).filter(_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.isNonNullable);\n break;\n default:\n outputValue = \"\";\n }\n input.push({\n type: \"custom_tool_call_output\",\n call_id: part.toolCallId,\n output: outputValue\n });\n continue;\n }\n let contentValue;\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n contentValue = output.value;\n break;\n case \"execution-denied\":\n contentValue = (_q = output.reason) != null ? _q : \"Tool execution denied.\";\n break;\n case \"json\":\n case \"error-json\":\n contentValue = JSON.stringify(output.value);\n break;\n case \"content\":\n contentValue = output.value.map((item) => {\n var _a2;\n switch (item.type) {\n case \"text\": {\n return { type: \"input_text\", text: item.text };\n }\n case \"image-data\": {\n return {\n type: \"input_image\",\n image_url: `data:${item.mediaType};base64,${item.data}`\n };\n }\n case \"image-url\": {\n return {\n type: \"input_image\",\n image_url: item.url\n };\n }\n case \"file-data\": {\n return {\n type: \"input_file\",\n filename: (_a2 = item.filename) != null ? _a2 : \"data\",\n file_data: `data:${item.mediaType};base64,${item.data}`\n };\n }\n case \"file-url\": {\n return {\n type: \"input_file\",\n file_url: item.url\n };\n }\n default: {\n warnings.push({\n type: \"other\",\n message: `unsupported tool content part type: ${item.type}`\n });\n return void 0;\n }\n }\n }).filter(_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.isNonNullable);\n break;\n }\n input.push({\n type: \"function_call_output\",\n call_id: part.toolCallId,\n output: contentValue\n });\n }\n break;\n }\n default: {\n const _exhaustiveCheck = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n if (!store && input.some(\n (item) => \"type\" in item && item.type === \"reasoning\" && item.encrypted_content == null\n )) {\n warnings.push({\n type: \"other\",\n message: \"Reasoning parts without encrypted content are not supported when store is false. Skipping reasoning parts.\"\n });\n input = input.filter(\n (item) => !(\"type\" in item) || item.type !== \"reasoning\" || item.encrypted_content != null\n );\n }\n return { input, warnings };\n}\nvar openaiResponsesReasoningProviderOptionsSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n itemId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n reasoningEncryptedContent: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n});\n\n// src/responses/map-openai-responses-finish-reason.ts\nfunction mapOpenAIResponseFinishReason({\n finishReason,\n hasFunctionCall\n}) {\n switch (finishReason) {\n case void 0:\n case null:\n return hasFunctionCall ? \"tool-calls\" : \"stop\";\n case \"max_output_tokens\":\n return \"length\";\n case \"content_filter\":\n return \"content-filter\";\n default:\n return hasFunctionCall ? \"tool-calls\" : \"other\";\n }\n}\n\n// src/responses/openai-responses-api.ts\n\n\nvar jsonValueSchema2 = zod_v4__WEBPACK_IMPORTED_MODULE_0__.lazy(\n () => zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"null\"](),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(jsonValueSchema2),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema2.optional())\n ])\n);\nvar openaiResponsesChunkSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.output_text.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n )\n })\n ).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"response.completed\", \"response.incomplete\"]),\n response: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n incomplete_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }).nullish(),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n input_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ cached_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish(),\n output_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n output_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish()\n }),\n service_tier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.failed\"),\n response: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }).nullish(),\n incomplete_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }).nullish(),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n input_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ cached_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish(),\n output_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n output_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish()\n }).nullish(),\n service_tier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.created\"),\n response: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n created_at: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n service_tier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.output_item.added\"),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n item: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"message\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n phase: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"commentary\", \"final_answer\"]).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"reasoning\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n encrypted_content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"function_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"web_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"computer_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image_generation_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"code_interpreter_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n container_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n outputs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"logs\"), logs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n approval_request_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_list_tools\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_approval_request\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"apply_patch_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\"]),\n operation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"create_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"delete_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"update_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"custom_tool_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n commands: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string())\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n stdout: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n stderr: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outcome: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"timeout\") }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exit\"),\n exit_code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ])\n })\n )\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema2.optional()))\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.output_item.done\"),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n item: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"message\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n phase: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"commentary\", \"final_answer\"]).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"reasoning\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n encrypted_content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"function_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"completed\")\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"custom_tool_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"completed\")\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"code_interpreter_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n container_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outputs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"logs\"), logs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).nullable()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image_generation_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n result: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"web_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"search\"),\n query: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n sources: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"api\"), name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"open_page\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"find_in_page\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n pattern: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ]).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n queries: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n results: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n attributes: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean()])\n ),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n score: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"local_shell_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exec\"),\n command: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n timeout_ms: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n working_directory: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n env: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"computer_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"completed\")\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()]).optional(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).loose()\n ]).nullish(),\n approval_request_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_list_tools\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n input_schema: zod_v4__WEBPACK_IMPORTED_MODULE_0__.any(),\n annotations: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()).optional()\n })\n ),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()]).optional(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).loose()\n ]).optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_approval_request\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n approval_request_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"apply_patch_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\"]),\n operation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"create_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"delete_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"update_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n commands: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string())\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n stdout: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n stderr: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outcome: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"timeout\") }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exit\"),\n exit_code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ])\n })\n )\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema2.optional()))\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.function_call_arguments.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.custom_tool_call_input.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.image_generation_call.partial_image\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n partial_image_b64: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.code_interpreter_call_code.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.code_interpreter_call_code.done\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.output_text.annotation.added\"),\n annotation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url_citation\"),\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_citation\"),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"container_file_citation\"),\n container_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_path\"),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.reasoning_summary_part.added\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n summary_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.reasoning_summary_text.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n summary_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.reasoning_summary_part.done\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n summary_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.apply_patch_call_operation_diff.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n obfuscation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.apply_patch_call_operation_diff.done\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"error\"),\n sequence_number: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n param: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }).loose().transform((value) => ({\n type: \"unknown_chunk\",\n message: value.type\n }))\n // fallback for unknown chunks\n ])\n )\n);\nvar openaiResponsesResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n created_at: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n param: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }).nullish(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"message\"),\n role: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"assistant\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n phase: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"commentary\", \"final_answer\"]).nullish(),\n content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"output_text\"),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n )\n })\n ).nullish(),\n annotations: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url_citation\"),\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_citation\"),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"container_file_citation\"),\n container_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_path\"),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ])\n )\n })\n )\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"web_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"search\"),\n query: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n sources: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"api\"),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ])\n ).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"open_page\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"find_in_page\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n pattern: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ]).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n queries: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n results: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n attributes: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean()])\n ),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n score: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"code_interpreter_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n container_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outputs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"logs\"), logs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).nullable()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image_generation_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n result: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"local_shell_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exec\"),\n command: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n timeout_ms: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n working_directory: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n env: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"function_call\"),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"custom_tool_call\"),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"computer_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"reasoning\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n encrypted_content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n summary: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"summary_text\"),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n )\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()]).optional(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).loose()\n ]).nullish(),\n approval_request_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_list_tools\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n input_schema: zod_v4__WEBPACK_IMPORTED_MODULE_0__.any(),\n annotations: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()).optional()\n })\n ),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()]).optional(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).loose()\n ]).optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_approval_request\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n approval_request_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"apply_patch_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\"]),\n operation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"create_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"delete_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"update_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n commands: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string())\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n stdout: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n stderr: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outcome: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"timeout\") }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exit\"),\n exit_code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ])\n })\n )\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema2.optional()))\n })\n ])\n ).optional(),\n service_tier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n incomplete_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }).nullish(),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n input_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ cached_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish(),\n output_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n output_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish()\n }).optional()\n })\n )\n);\n\n// src/responses/openai-responses-options.ts\n\n\nvar TOP_LOGPROBS_MAX = 20;\nvar openaiResponsesReasoningModelIds = [\n \"o1\",\n \"o1-2024-12-17\",\n \"o3\",\n \"o3-2025-04-16\",\n \"o3-mini\",\n \"o3-mini-2025-01-31\",\n \"o4-mini\",\n \"o4-mini-2025-04-16\",\n \"gpt-5\",\n \"gpt-5-2025-08-07\",\n \"gpt-5-codex\",\n \"gpt-5-mini\",\n \"gpt-5-mini-2025-08-07\",\n \"gpt-5-nano\",\n \"gpt-5-nano-2025-08-07\",\n \"gpt-5-pro\",\n \"gpt-5-pro-2025-10-06\",\n \"gpt-5.1\",\n \"gpt-5.1-chat-latest\",\n \"gpt-5.1-codex-mini\",\n \"gpt-5.1-codex\",\n \"gpt-5.1-codex-max\",\n \"gpt-5.2\",\n \"gpt-5.2-chat-latest\",\n \"gpt-5.2-pro\",\n \"gpt-5.2-codex\",\n \"gpt-5.3-chat-latest\",\n \"gpt-5.3-codex\",\n \"gpt-5.4\",\n \"gpt-5.4-2026-03-05\",\n \"gpt-5.4-mini\",\n \"gpt-5.4-mini-2026-03-17\",\n \"gpt-5.4-nano\",\n \"gpt-5.4-nano-2026-03-17\",\n \"gpt-5.4-pro\",\n \"gpt-5.4-pro-2026-03-05\"\n];\nvar openaiResponsesModelIds = [\n \"gpt-4.1\",\n \"gpt-4.1-2025-04-14\",\n \"gpt-4.1-mini\",\n \"gpt-4.1-mini-2025-04-14\",\n \"gpt-4.1-nano\",\n \"gpt-4.1-nano-2025-04-14\",\n \"gpt-4o\",\n \"gpt-4o-2024-05-13\",\n \"gpt-4o-2024-08-06\",\n \"gpt-4o-2024-11-20\",\n \"gpt-4o-audio-preview\",\n \"gpt-4o-audio-preview-2024-12-17\",\n \"gpt-4o-search-preview\",\n \"gpt-4o-search-preview-2025-03-11\",\n \"gpt-4o-mini-search-preview\",\n \"gpt-4o-mini-search-preview-2025-03-11\",\n \"gpt-4o-mini\",\n \"gpt-4o-mini-2024-07-18\",\n \"gpt-3.5-turbo-0125\",\n \"gpt-3.5-turbo\",\n \"gpt-3.5-turbo-1106\",\n \"gpt-5-chat-latest\",\n ...openaiResponsesReasoningModelIds\n];\nvar openaiLanguageModelResponsesOptionsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n /**\n * The ID of the OpenAI Conversation to continue.\n * You must create a conversation first via the OpenAI API.\n * Cannot be used in conjunction with `previousResponseId`.\n * Defaults to `undefined`.\n * @see https://platform.openai.com/docs/api-reference/conversations/create\n */\n conversation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * The set of extra fields to include in the response (advanced, usually not needed).\n * Example values: 'reasoning.encrypted_content', 'file_search_call.results', 'message.output_text.logprobs'.\n */\n include: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\n \"reasoning.encrypted_content\",\n // handled internally by default, only needed for unknown reasoning models\n \"file_search_call.results\",\n \"message.output_text.logprobs\"\n ])\n ).nullish(),\n /**\n * Instructions for the model.\n * They can be used to change the system or developer message when continuing a conversation using the `previousResponseId` option.\n * Defaults to `undefined`.\n */\n instructions: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * Return the log probabilities of the tokens. Including logprobs will increase\n * the response size and can slow down response times. However, it can\n * be useful to better understand how the model is behaving.\n *\n * Setting to true will return the log probabilities of the tokens that\n * were generated.\n *\n * Setting to a number will return the log probabilities of the top n\n * tokens that were generated.\n *\n * @see https://platform.openai.com/docs/api-reference/responses/create\n * @see https://cookbook.openai.com/examples/using_logprobs\n */\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().min(1).max(TOP_LOGPROBS_MAX)]).optional(),\n /**\n * The maximum number of total calls to built-in tools that can be processed in a response.\n * This maximum number applies across all built-in tool calls, not per individual tool.\n * Any further attempts to call a tool by the model will be ignored.\n */\n maxToolCalls: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n /**\n * Additional metadata to store with the generation.\n */\n metadata: zod_v4__WEBPACK_IMPORTED_MODULE_0__.any().nullish(),\n /**\n * Whether to use parallel tool calls. Defaults to `true`.\n */\n parallelToolCalls: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().nullish(),\n /**\n * The ID of the previous response. You can use it to continue a conversation.\n * Defaults to `undefined`.\n */\n previousResponseId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * Sets a cache key to tie this prompt to cached prefixes for better caching performance.\n */\n promptCacheKey: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * The retention policy for the prompt cache.\n * - 'in_memory': Default. Standard prompt caching behavior.\n * - '24h': Extended prompt caching that keeps cached prefixes active for up to 24 hours.\n * Currently only available for 5.1 series models.\n *\n * @default 'in_memory'\n */\n promptCacheRetention: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_memory\", \"24h\"]).nullish(),\n /**\n * Reasoning effort for reasoning models. Defaults to `medium`. If you use\n * `providerOptions` to set the `reasoningEffort` option, this model setting will be ignored.\n * Valid values: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh'\n *\n * The 'none' type for `reasoningEffort` is only available for OpenAI's GPT-5.1\n * models. Also, the 'xhigh' type for `reasoningEffort` is only available for\n * OpenAI's GPT-5.1-Codex-Max model. Setting `reasoningEffort` to 'none' or 'xhigh' with unsupported models will result in\n * an error.\n */\n reasoningEffort: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * Controls reasoning summary output from the model.\n * Set to \"auto\" to automatically receive the richest level available,\n * or \"detailed\" for comprehensive summaries.\n */\n reasoningSummary: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * The identifier for safety monitoring and tracking.\n */\n safetyIdentifier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * Service tier for the request.\n * Set to 'flex' for 50% cheaper processing at the cost of increased latency (available for o3, o4-mini, and gpt-5 models).\n * Set to 'priority' for faster processing with Enterprise access (available for gpt-4, gpt-5, gpt-5-mini, o3, o4-mini; gpt-5-nano is not supported).\n *\n * Defaults to 'auto'.\n */\n serviceTier: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\", \"flex\", \"priority\", \"default\"]).nullish(),\n /**\n * Whether to store the generation. Defaults to `true`.\n */\n store: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().nullish(),\n /**\n * Whether to use strict JSON schema validation.\n * Defaults to `true`.\n */\n strictJsonSchema: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().nullish(),\n /**\n * Controls the verbosity of the model's responses. Lower values ('low') will result\n * in more concise responses, while higher values ('high') will result in more verbose responses.\n * Valid values: 'low', 'medium', 'high'.\n */\n textVerbosity: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"low\", \"medium\", \"high\"]).nullish(),\n /**\n * Controls output truncation. 'auto' (default) performs truncation automatically;\n * 'disabled' turns truncation off.\n */\n truncation: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\", \"disabled\"]).nullish(),\n /**\n * A unique identifier representing your end-user, which can help OpenAI to\n * monitor and detect abuse.\n * Defaults to `undefined`.\n * @see https://platform.openai.com/docs/guides/safety-best-practices/end-user-ids\n */\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * Override the system message mode for this model.\n * - 'system': Use the 'system' role for system messages (default for most models)\n * - 'developer': Use the 'developer' role for system messages (used by reasoning models)\n * - 'remove': Remove system messages entirely\n *\n * If not specified, the mode is automatically determined based on the model.\n */\n systemMessageMode: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"system\", \"developer\", \"remove\"]).optional(),\n /**\n * Force treating this model as a reasoning model.\n *\n * This is useful for \"stealth\" reasoning models (e.g. via a custom baseURL)\n * where the model ID is not recognized by the SDK's allowlist.\n *\n * When enabled, the SDK applies reasoning-model parameter compatibility rules\n * and defaults `systemMessageMode` to `developer` unless overridden.\n */\n forceReasoning: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional()\n })\n )\n);\n\n// src/responses/openai-responses-prepare-tools.ts\n\n\nasync function prepareResponsesTools({\n tools,\n toolChoice,\n toolNameMapping,\n customProviderToolNames\n}) {\n var _a, _b;\n tools = (tools == null ? void 0 : tools.length) ? tools : void 0;\n const toolWarnings = [];\n if (tools == null) {\n return { tools: void 0, toolChoice: void 0, toolWarnings };\n }\n const openaiTools2 = [];\n const resolvedCustomProviderToolNames = customProviderToolNames != null ? customProviderToolNames : /* @__PURE__ */ new Set();\n for (const tool of tools) {\n switch (tool.type) {\n case \"function\": {\n const openaiOptions = (_a = tool.providerOptions) == null ? void 0 : _a.openai;\n const deferLoading = openaiOptions == null ? void 0 : openaiOptions.deferLoading;\n openaiTools2.push({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n ...tool.strict != null ? { strict: tool.strict } : {},\n ...deferLoading != null ? { defer_loading: deferLoading } : {}\n });\n break;\n }\n case \"provider\": {\n switch (tool.id) {\n case \"openai.file_search\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: fileSearchArgsSchema\n });\n openaiTools2.push({\n type: \"file_search\",\n vector_store_ids: args.vectorStoreIds,\n max_num_results: args.maxNumResults,\n ranking_options: args.ranking ? {\n ranker: args.ranking.ranker,\n score_threshold: args.ranking.scoreThreshold\n } : void 0,\n filters: args.filters\n });\n break;\n }\n case \"openai.local_shell\": {\n openaiTools2.push({\n type: \"local_shell\"\n });\n break;\n }\n case \"openai.shell\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: shellArgsSchema\n });\n openaiTools2.push({\n type: \"shell\",\n ...args.environment && {\n environment: mapShellEnvironment(args.environment)\n }\n });\n break;\n }\n case \"openai.apply_patch\": {\n openaiTools2.push({\n type: \"apply_patch\"\n });\n break;\n }\n case \"openai.web_search_preview\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: webSearchPreviewArgsSchema\n });\n openaiTools2.push({\n type: \"web_search_preview\",\n search_context_size: args.searchContextSize,\n user_location: args.userLocation\n });\n break;\n }\n case \"openai.web_search\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: webSearchArgsSchema\n });\n openaiTools2.push({\n type: \"web_search\",\n filters: args.filters != null ? { allowed_domains: args.filters.allowedDomains } : void 0,\n external_web_access: args.externalWebAccess,\n search_context_size: args.searchContextSize,\n user_location: args.userLocation\n });\n break;\n }\n case \"openai.code_interpreter\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: codeInterpreterArgsSchema\n });\n openaiTools2.push({\n type: \"code_interpreter\",\n container: args.container == null ? { type: \"auto\", file_ids: void 0 } : typeof args.container === \"string\" ? args.container : { type: \"auto\", file_ids: args.container.fileIds }\n });\n break;\n }\n case \"openai.image_generation\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: imageGenerationArgsSchema\n });\n openaiTools2.push({\n type: \"image_generation\",\n background: args.background,\n input_fidelity: args.inputFidelity,\n input_image_mask: args.inputImageMask ? {\n file_id: args.inputImageMask.fileId,\n image_url: args.inputImageMask.imageUrl\n } : void 0,\n model: args.model,\n moderation: args.moderation,\n partial_images: args.partialImages,\n quality: args.quality,\n output_compression: args.outputCompression,\n output_format: args.outputFormat,\n size: args.size\n });\n break;\n }\n case \"openai.mcp\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: mcpArgsSchema\n });\n const mapApprovalFilter = (filter) => ({\n tool_names: filter.toolNames\n });\n const requireApproval = args.requireApproval;\n const requireApprovalParam = requireApproval == null ? void 0 : typeof requireApproval === \"string\" ? requireApproval : requireApproval.never != null ? { never: mapApprovalFilter(requireApproval.never) } : void 0;\n openaiTools2.push({\n type: \"mcp\",\n server_label: args.serverLabel,\n allowed_tools: Array.isArray(args.allowedTools) ? args.allowedTools : args.allowedTools ? {\n read_only: args.allowedTools.readOnly,\n tool_names: args.allowedTools.toolNames\n } : void 0,\n authorization: args.authorization,\n connector_id: args.connectorId,\n headers: args.headers,\n require_approval: requireApprovalParam != null ? requireApprovalParam : \"never\",\n server_description: args.serverDescription,\n server_url: args.serverUrl\n });\n break;\n }\n case \"openai.custom\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: customArgsSchema\n });\n openaiTools2.push({\n type: \"custom\",\n name: args.name,\n description: args.description,\n format: args.format\n });\n resolvedCustomProviderToolNames.add(args.name);\n break;\n }\n case \"openai.tool_search\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: toolSearchArgsSchema\n });\n openaiTools2.push({\n type: \"tool_search\",\n ...args.execution != null ? { execution: args.execution } : {},\n ...args.description != null ? { description: args.description } : {},\n ...args.parameters != null ? { parameters: args.parameters } : {}\n });\n break;\n }\n }\n break;\n }\n default:\n toolWarnings.push({\n type: \"unsupported\",\n feature: `function tool ${tool}`\n });\n break;\n }\n }\n if (toolChoice == null) {\n return { tools: openaiTools2, toolChoice: void 0, toolWarnings };\n }\n const type = toolChoice.type;\n switch (type) {\n case \"auto\":\n case \"none\":\n case \"required\":\n return { tools: openaiTools2, toolChoice: type, toolWarnings };\n case \"tool\": {\n const resolvedToolName = (_b = toolNameMapping == null ? void 0 : toolNameMapping.toProviderToolName(toolChoice.toolName)) != null ? _b : toolChoice.toolName;\n return {\n tools: openaiTools2,\n toolChoice: resolvedToolName === \"code_interpreter\" || resolvedToolName === \"file_search\" || resolvedToolName === \"image_generation\" || resolvedToolName === \"web_search_preview\" || resolvedToolName === \"web_search\" || resolvedToolName === \"mcp\" || resolvedToolName === \"apply_patch\" ? { type: resolvedToolName } : resolvedCustomProviderToolNames.has(resolvedToolName) ? { type: \"custom\", name: resolvedToolName } : { type: \"function\", name: resolvedToolName },\n toolWarnings\n };\n }\n default: {\n const _exhaustiveCheck = type;\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`\n });\n }\n }\n}\nfunction mapShellEnvironment(environment) {\n if (environment.type === \"containerReference\") {\n const env2 = environment;\n return {\n type: \"container_reference\",\n container_id: env2.containerId\n };\n }\n if (environment.type === \"containerAuto\") {\n const env2 = environment;\n return {\n type: \"container_auto\",\n file_ids: env2.fileIds,\n memory_limit: env2.memoryLimit,\n network_policy: env2.networkPolicy == null ? void 0 : env2.networkPolicy.type === \"disabled\" ? { type: \"disabled\" } : {\n type: \"allowlist\",\n allowed_domains: env2.networkPolicy.allowedDomains,\n domain_secrets: env2.networkPolicy.domainSecrets\n },\n skills: mapShellSkills(env2.skills)\n };\n }\n const env = environment;\n return {\n type: \"local\",\n skills: env.skills\n };\n}\nfunction mapShellSkills(skills) {\n return skills == null ? void 0 : skills.map(\n (skill) => skill.type === \"skillReference\" ? {\n type: \"skill_reference\",\n skill_id: skill.skillId,\n version: skill.version\n } : {\n type: \"inline\",\n name: skill.name,\n description: skill.description,\n source: {\n type: \"base64\",\n media_type: skill.source.mediaType,\n data: skill.source.data\n }\n }\n );\n}\n\n// src/responses/openai-responses-language-model.ts\nfunction extractApprovalRequestIdToToolCallIdMapping(prompt) {\n var _a, _b;\n const mapping = {};\n for (const message of prompt) {\n if (message.role !== \"assistant\") continue;\n for (const part of message.content) {\n if (part.type !== \"tool-call\") continue;\n const approvalRequestId = (_b = (_a = part.providerOptions) == null ? void 0 : _a.openai) == null ? void 0 : _b.approvalRequestId;\n if (approvalRequestId != null) {\n mapping[approvalRequestId] = part.toolCallId;\n }\n }\n }\n return mapping;\n}\nvar OpenAIResponsesLanguageModel = class {\n constructor(modelId, config) {\n this.specificationVersion = \"v3\";\n this.supportedUrls = {\n \"image/*\": [/^https?:\\/\\/.*$/],\n \"application/pdf\": [/^https?:\\/\\/.*$/]\n };\n this.modelId = modelId;\n this.config = config;\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs({\n maxOutputTokens,\n temperature,\n stopSequences,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n seed,\n prompt,\n providerOptions,\n tools,\n toolChoice,\n responseFormat\n }) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i;\n const warnings = [];\n const modelCapabilities = getOpenAILanguageModelCapabilities(this.modelId);\n if (topK != null) {\n warnings.push({ type: \"unsupported\", feature: \"topK\" });\n }\n if (seed != null) {\n warnings.push({ type: \"unsupported\", feature: \"seed\" });\n }\n if (presencePenalty != null) {\n warnings.push({ type: \"unsupported\", feature: \"presencePenalty\" });\n }\n if (frequencyPenalty != null) {\n warnings.push({ type: \"unsupported\", feature: \"frequencyPenalty\" });\n }\n if (stopSequences != null) {\n warnings.push({ type: \"unsupported\", feature: \"stopSequences\" });\n }\n const providerOptionsName = this.config.provider.includes(\"azure\") ? \"azure\" : \"openai\";\n let openaiOptions = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: providerOptionsName,\n providerOptions,\n schema: openaiLanguageModelResponsesOptionsSchema\n });\n if (openaiOptions == null && providerOptionsName !== \"openai\") {\n openaiOptions = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openaiLanguageModelResponsesOptionsSchema\n });\n }\n const isReasoningModel = (_a = openaiOptions == null ? void 0 : openaiOptions.forceReasoning) != null ? _a : modelCapabilities.isReasoningModel;\n if ((openaiOptions == null ? void 0 : openaiOptions.conversation) && (openaiOptions == null ? void 0 : openaiOptions.previousResponseId)) {\n warnings.push({\n type: \"unsupported\",\n feature: \"conversation\",\n details: \"conversation and previousResponseId cannot be used together\"\n });\n }\n const toolNameMapping = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createToolNameMapping)({\n tools,\n providerToolNames: {\n \"openai.code_interpreter\": \"code_interpreter\",\n \"openai.file_search\": \"file_search\",\n \"openai.image_generation\": \"image_generation\",\n \"openai.local_shell\": \"local_shell\",\n \"openai.shell\": \"shell\",\n \"openai.web_search\": \"web_search\",\n \"openai.web_search_preview\": \"web_search_preview\",\n \"openai.mcp\": \"mcp\",\n \"openai.apply_patch\": \"apply_patch\",\n \"openai.tool_search\": \"tool_search\"\n },\n resolveProviderToolName: (tool) => tool.id === \"openai.custom\" ? tool.args.name : void 0\n });\n const customProviderToolNames = /* @__PURE__ */ new Set();\n const {\n tools: openaiTools2,\n toolChoice: openaiToolChoice,\n toolWarnings\n } = await prepareResponsesTools({\n tools,\n toolChoice,\n toolNameMapping,\n customProviderToolNames\n });\n const { input, warnings: inputWarnings } = await convertToOpenAIResponsesInput({\n prompt,\n toolNameMapping,\n systemMessageMode: (_b = openaiOptions == null ? void 0 : openaiOptions.systemMessageMode) != null ? _b : isReasoningModel ? \"developer\" : modelCapabilities.systemMessageMode,\n providerOptionsName,\n fileIdPrefixes: this.config.fileIdPrefixes,\n store: (_c = openaiOptions == null ? void 0 : openaiOptions.store) != null ? _c : true,\n hasConversation: (openaiOptions == null ? void 0 : openaiOptions.conversation) != null,\n hasLocalShellTool: hasOpenAITool(\"openai.local_shell\"),\n hasShellTool: hasOpenAITool(\"openai.shell\"),\n hasApplyPatchTool: hasOpenAITool(\"openai.apply_patch\"),\n customProviderToolNames: customProviderToolNames.size > 0 ? customProviderToolNames : void 0\n });\n warnings.push(...inputWarnings);\n const strictJsonSchema = (_d = openaiOptions == null ? void 0 : openaiOptions.strictJsonSchema) != null ? _d : true;\n let include = openaiOptions == null ? void 0 : openaiOptions.include;\n function addInclude(key) {\n if (include == null) {\n include = [key];\n } else if (!include.includes(key)) {\n include = [...include, key];\n }\n }\n function hasOpenAITool(id) {\n return (tools == null ? void 0 : tools.find((tool) => tool.type === \"provider\" && tool.id === id)) != null;\n }\n const topLogprobs = typeof (openaiOptions == null ? void 0 : openaiOptions.logprobs) === \"number\" ? openaiOptions == null ? void 0 : openaiOptions.logprobs : (openaiOptions == null ? void 0 : openaiOptions.logprobs) === true ? TOP_LOGPROBS_MAX : void 0;\n if (topLogprobs) {\n addInclude(\"message.output_text.logprobs\");\n }\n const webSearchToolName = (_e = tools == null ? void 0 : tools.find(\n (tool) => tool.type === \"provider\" && (tool.id === \"openai.web_search\" || tool.id === \"openai.web_search_preview\")\n )) == null ? void 0 : _e.name;\n if (webSearchToolName) {\n addInclude(\"web_search_call.action.sources\");\n }\n if (hasOpenAITool(\"openai.code_interpreter\")) {\n addInclude(\"code_interpreter_call.outputs\");\n }\n const store = openaiOptions == null ? void 0 : openaiOptions.store;\n if (store === false && isReasoningModel) {\n addInclude(\"reasoning.encrypted_content\");\n }\n const baseArgs = {\n model: this.modelId,\n input,\n temperature,\n top_p: topP,\n max_output_tokens: maxOutputTokens,\n ...((responseFormat == null ? void 0 : responseFormat.type) === \"json\" || (openaiOptions == null ? void 0 : openaiOptions.textVerbosity)) && {\n text: {\n ...(responseFormat == null ? void 0 : responseFormat.type) === \"json\" && {\n format: responseFormat.schema != null ? {\n type: \"json_schema\",\n strict: strictJsonSchema,\n name: (_f = responseFormat.name) != null ? _f : \"response\",\n description: responseFormat.description,\n schema: responseFormat.schema\n } : { type: \"json_object\" }\n },\n ...(openaiOptions == null ? void 0 : openaiOptions.textVerbosity) && {\n verbosity: openaiOptions.textVerbosity\n }\n }\n },\n // provider options:\n conversation: openaiOptions == null ? void 0 : openaiOptions.conversation,\n max_tool_calls: openaiOptions == null ? void 0 : openaiOptions.maxToolCalls,\n metadata: openaiOptions == null ? void 0 : openaiOptions.metadata,\n parallel_tool_calls: openaiOptions == null ? void 0 : openaiOptions.parallelToolCalls,\n previous_response_id: openaiOptions == null ? void 0 : openaiOptions.previousResponseId,\n store,\n user: openaiOptions == null ? void 0 : openaiOptions.user,\n instructions: openaiOptions == null ? void 0 : openaiOptions.instructions,\n service_tier: openaiOptions == null ? void 0 : openaiOptions.serviceTier,\n include,\n prompt_cache_key: openaiOptions == null ? void 0 : openaiOptions.promptCacheKey,\n prompt_cache_retention: openaiOptions == null ? void 0 : openaiOptions.promptCacheRetention,\n safety_identifier: openaiOptions == null ? void 0 : openaiOptions.safetyIdentifier,\n top_logprobs: topLogprobs,\n truncation: openaiOptions == null ? void 0 : openaiOptions.truncation,\n // model-specific settings:\n ...isReasoningModel && ((openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) != null || (openaiOptions == null ? void 0 : openaiOptions.reasoningSummary) != null) && {\n reasoning: {\n ...(openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) != null && {\n effort: openaiOptions.reasoningEffort\n },\n ...(openaiOptions == null ? void 0 : openaiOptions.reasoningSummary) != null && {\n summary: openaiOptions.reasoningSummary\n }\n }\n }\n };\n if (isReasoningModel) {\n if (!((openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) === \"none\" && modelCapabilities.supportsNonReasoningParameters)) {\n if (baseArgs.temperature != null) {\n baseArgs.temperature = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"temperature\",\n details: \"temperature is not supported for reasoning models\"\n });\n }\n if (baseArgs.top_p != null) {\n baseArgs.top_p = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"topP\",\n details: \"topP is not supported for reasoning models\"\n });\n }\n }\n } else {\n if ((openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) != null) {\n warnings.push({\n type: \"unsupported\",\n feature: \"reasoningEffort\",\n details: \"reasoningEffort is not supported for non-reasoning models\"\n });\n }\n if ((openaiOptions == null ? void 0 : openaiOptions.reasoningSummary) != null) {\n warnings.push({\n type: \"unsupported\",\n feature: \"reasoningSummary\",\n details: \"reasoningSummary is not supported for non-reasoning models\"\n });\n }\n }\n if ((openaiOptions == null ? void 0 : openaiOptions.serviceTier) === \"flex\" && !modelCapabilities.supportsFlexProcessing) {\n warnings.push({\n type: \"unsupported\",\n feature: \"serviceTier\",\n details: \"flex processing is only available for o3, o4-mini, and gpt-5 models\"\n });\n delete baseArgs.service_tier;\n }\n if ((openaiOptions == null ? void 0 : openaiOptions.serviceTier) === \"priority\" && !modelCapabilities.supportsPriorityProcessing) {\n warnings.push({\n type: \"unsupported\",\n feature: \"serviceTier\",\n details: \"priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported\"\n });\n delete baseArgs.service_tier;\n }\n const shellToolEnvType = (_i = (_h = (_g = tools == null ? void 0 : tools.find(\n (tool) => tool.type === \"provider\" && tool.id === \"openai.shell\"\n )) == null ? void 0 : _g.args) == null ? void 0 : _h.environment) == null ? void 0 : _i.type;\n const isShellProviderExecuted = shellToolEnvType === \"containerAuto\" || shellToolEnvType === \"containerReference\";\n return {\n webSearchToolName,\n args: {\n ...baseArgs,\n tools: openaiTools2,\n tool_choice: openaiToolChoice\n },\n warnings: [...warnings, ...toolWarnings],\n store,\n toolNameMapping,\n providerOptionsName,\n isShellProviderExecuted\n };\n }\n async doGenerate(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B;\n const {\n args: body,\n warnings,\n webSearchToolName,\n toolNameMapping,\n providerOptionsName,\n isShellProviderExecuted\n } = await this.getArgs(options);\n const url = this.config.url({\n path: \"/responses\",\n modelId: this.modelId\n });\n const approvalRequestIdToDummyToolCallIdFromPrompt = extractApprovalRequestIdToToolCallIdMapping(options.prompt);\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url,\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiResponsesResponseSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n if (response.error) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError({\n message: response.error.message,\n url,\n requestBodyValues: body,\n statusCode: 400,\n responseHeaders,\n responseBody: rawResponse,\n isRetryable: false\n });\n }\n const content = [];\n const logprobs = [];\n let hasFunctionCall = false;\n const hostedToolSearchCallIds = [];\n for (const part of response.output) {\n switch (part.type) {\n case \"reasoning\": {\n if (part.summary.length === 0) {\n part.summary.push({ type: \"summary_text\", text: \"\" });\n }\n for (const summary of part.summary) {\n content.push({\n type: \"reasoning\",\n text: summary.text,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id,\n reasoningEncryptedContent: (_a = part.encrypted_content) != null ? _a : null\n }\n }\n });\n }\n break;\n }\n case \"image_generation_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"image_generation\"),\n input: \"{}\",\n providerExecuted: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"image_generation\"),\n result: {\n result: part.result\n }\n });\n break;\n }\n case \"tool_search_call\": {\n const toolCallId = (_b = part.call_id) != null ? _b : part.id;\n const isHosted = part.execution === \"server\";\n if (isHosted) {\n hostedToolSearchCallIds.push(toolCallId);\n }\n content.push({\n type: \"tool-call\",\n toolCallId,\n toolName: toolNameMapping.toCustomToolName(\"tool_search\"),\n input: JSON.stringify({\n arguments: part.arguments,\n call_id: part.call_id\n }),\n ...isHosted ? { providerExecuted: true } : {},\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"tool_search_output\": {\n const toolCallId = (_d = (_c = part.call_id) != null ? _c : hostedToolSearchCallIds.shift()) != null ? _d : part.id;\n content.push({\n type: \"tool-result\",\n toolCallId,\n toolName: toolNameMapping.toCustomToolName(\"tool_search\"),\n result: {\n tools: part.tools\n },\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"local_shell_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.call_id,\n toolName: toolNameMapping.toCustomToolName(\"local_shell\"),\n input: JSON.stringify({\n action: part.action\n }),\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"shell_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.call_id,\n toolName: toolNameMapping.toCustomToolName(\"shell\"),\n input: JSON.stringify({\n action: {\n commands: part.action.commands\n }\n }),\n ...isShellProviderExecuted && { providerExecuted: true },\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"shell_call_output\": {\n content.push({\n type: \"tool-result\",\n toolCallId: part.call_id,\n toolName: toolNameMapping.toCustomToolName(\"shell\"),\n result: {\n output: part.output.map((item) => ({\n stdout: item.stdout,\n stderr: item.stderr,\n outcome: item.outcome.type === \"exit\" ? {\n type: \"exit\",\n exitCode: item.outcome.exit_code\n } : { type: \"timeout\" }\n }))\n }\n });\n break;\n }\n case \"message\": {\n for (const contentPart of part.content) {\n if (((_f = (_e = options.providerOptions) == null ? void 0 : _e[providerOptionsName]) == null ? void 0 : _f.logprobs) && contentPart.logprobs) {\n logprobs.push(contentPart.logprobs);\n }\n const providerMetadata2 = {\n itemId: part.id,\n ...part.phase != null && { phase: part.phase },\n ...contentPart.annotations.length > 0 && {\n annotations: contentPart.annotations\n }\n };\n content.push({\n type: \"text\",\n text: contentPart.text,\n providerMetadata: {\n [providerOptionsName]: providerMetadata2\n }\n });\n for (const annotation of contentPart.annotations) {\n if (annotation.type === \"url_citation\") {\n content.push({\n type: \"source\",\n sourceType: \"url\",\n id: (_i = (_h = (_g = this.config).generateId) == null ? void 0 : _h.call(_g)) != null ? _i : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n url: annotation.url,\n title: annotation.title\n });\n } else if (annotation.type === \"file_citation\") {\n content.push({\n type: \"source\",\n sourceType: \"document\",\n id: (_l = (_k = (_j = this.config).generateId) == null ? void 0 : _k.call(_j)) != null ? _l : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"text/plain\",\n title: annotation.filename,\n filename: annotation.filename,\n providerMetadata: {\n [providerOptionsName]: {\n type: annotation.type,\n fileId: annotation.file_id,\n index: annotation.index\n }\n }\n });\n } else if (annotation.type === \"container_file_citation\") {\n content.push({\n type: \"source\",\n sourceType: \"document\",\n id: (_o = (_n = (_m = this.config).generateId) == null ? void 0 : _n.call(_m)) != null ? _o : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"text/plain\",\n title: annotation.filename,\n filename: annotation.filename,\n providerMetadata: {\n [providerOptionsName]: {\n type: annotation.type,\n fileId: annotation.file_id,\n containerId: annotation.container_id\n }\n }\n });\n } else if (annotation.type === \"file_path\") {\n content.push({\n type: \"source\",\n sourceType: \"document\",\n id: (_r = (_q = (_p = this.config).generateId) == null ? void 0 : _q.call(_p)) != null ? _r : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"application/octet-stream\",\n title: annotation.file_id,\n filename: annotation.file_id,\n providerMetadata: {\n [providerOptionsName]: {\n type: annotation.type,\n fileId: annotation.file_id,\n index: annotation.index\n }\n }\n });\n }\n }\n }\n break;\n }\n case \"function_call\": {\n hasFunctionCall = true;\n content.push({\n type: \"tool-call\",\n toolCallId: part.call_id,\n toolName: part.name,\n input: part.arguments,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"custom_tool_call\": {\n hasFunctionCall = true;\n const toolName = toolNameMapping.toCustomToolName(part.name);\n content.push({\n type: \"tool-call\",\n toolCallId: part.call_id,\n toolName,\n input: JSON.stringify(part.input),\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"web_search_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n input: JSON.stringify({}),\n providerExecuted: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n result: mapWebSearchOutput(part.action)\n });\n break;\n }\n case \"mcp_call\": {\n const toolCallId = part.approval_request_id != null ? (_s = approvalRequestIdToDummyToolCallIdFromPrompt[part.approval_request_id]) != null ? _s : part.id : part.id;\n const toolName = `mcp.${part.name}`;\n content.push({\n type: \"tool-call\",\n toolCallId,\n toolName,\n input: part.arguments,\n providerExecuted: true,\n dynamic: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId,\n toolName,\n result: {\n type: \"call\",\n serverLabel: part.server_label,\n name: part.name,\n arguments: part.arguments,\n ...part.output != null ? { output: part.output } : {},\n ...part.error != null ? { error: part.error } : {}\n },\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"mcp_list_tools\": {\n break;\n }\n case \"mcp_approval_request\": {\n const approvalRequestId = (_t = part.approval_request_id) != null ? _t : part.id;\n const dummyToolCallId = (_w = (_v = (_u = this.config).generateId) == null ? void 0 : _v.call(_u)) != null ? _w : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)();\n const toolName = `mcp.${part.name}`;\n content.push({\n type: \"tool-call\",\n toolCallId: dummyToolCallId,\n toolName,\n input: part.arguments,\n providerExecuted: true,\n dynamic: true\n });\n content.push({\n type: \"tool-approval-request\",\n approvalId: approvalRequestId,\n toolCallId: dummyToolCallId\n });\n break;\n }\n case \"computer_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n input: \"\",\n providerExecuted: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n result: {\n type: \"computer_use_tool_result\",\n status: part.status || \"completed\"\n }\n });\n break;\n }\n case \"file_search_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"file_search\"),\n input: \"{}\",\n providerExecuted: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"file_search\"),\n result: {\n queries: part.queries,\n results: (_y = (_x = part.results) == null ? void 0 : _x.map((result) => ({\n attributes: result.attributes,\n fileId: result.file_id,\n filename: result.filename,\n score: result.score,\n text: result.text\n }))) != null ? _y : null\n }\n });\n break;\n }\n case \"code_interpreter_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n input: JSON.stringify({\n code: part.code,\n containerId: part.container_id\n }),\n providerExecuted: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n result: {\n outputs: part.outputs\n }\n });\n break;\n }\n case \"apply_patch_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.call_id,\n toolName: toolNameMapping.toCustomToolName(\"apply_patch\"),\n input: JSON.stringify({\n callId: part.call_id,\n operation: part.operation\n }),\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n }\n }\n const providerMetadata = {\n [providerOptionsName]: {\n responseId: response.id,\n ...logprobs.length > 0 ? { logprobs } : {},\n ...typeof response.service_tier === \"string\" ? { serviceTier: response.service_tier } : {}\n }\n };\n const usage = response.usage;\n return {\n content,\n finishReason: {\n unified: mapOpenAIResponseFinishReason({\n finishReason: (_z = response.incomplete_details) == null ? void 0 : _z.reason,\n hasFunctionCall\n }),\n raw: (_B = (_A = response.incomplete_details) == null ? void 0 : _A.reason) != null ? _B : void 0\n },\n usage: convertOpenAIResponsesUsage(usage),\n request: { body },\n response: {\n id: response.id,\n timestamp: new Date(response.created_at * 1e3),\n modelId: response.model,\n headers: responseHeaders,\n body: rawResponse\n },\n providerMetadata,\n warnings\n };\n }\n async doStream(options) {\n const {\n args: body,\n warnings,\n webSearchToolName,\n toolNameMapping,\n store,\n providerOptionsName,\n isShellProviderExecuted\n } = await this.getArgs(options);\n const { responseHeaders, value: response } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/responses\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body: {\n ...body,\n stream: true\n },\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createEventSourceResponseHandler)(\n openaiResponsesChunkSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n const self = this;\n const approvalRequestIdToDummyToolCallIdFromPrompt = extractApprovalRequestIdToToolCallIdMapping(options.prompt);\n const approvalRequestIdToDummyToolCallIdFromStream = /* @__PURE__ */ new Map();\n let finishReason = {\n unified: \"other\",\n raw: void 0\n };\n let usage = void 0;\n const logprobs = [];\n let responseId = null;\n const ongoingToolCalls = {};\n const ongoingAnnotations = [];\n let activeMessagePhase;\n let hasFunctionCall = false;\n const activeReasoning = {};\n let serviceTier;\n const hostedToolSearchCallIds = [];\n return {\n stream: response.pipeThrough(\n new TransformStream({\n start(controller) {\n controller.enqueue({ type: \"stream-start\", warnings });\n },\n transform(chunk, controller) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L;\n if (options.includeRawChunks) {\n controller.enqueue({ type: \"raw\", rawValue: chunk.rawValue });\n }\n if (!chunk.success) {\n finishReason = { unified: \"error\", raw: void 0 };\n controller.enqueue({ type: \"error\", error: chunk.error });\n return;\n }\n const value = chunk.value;\n if (isResponseOutputItemAddedChunk(value)) {\n if (value.item.type === \"function_call\") {\n ongoingToolCalls[value.output_index] = {\n toolName: value.item.name,\n toolCallId: value.item.call_id\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: value.item.call_id,\n toolName: value.item.name\n });\n } else if (value.item.type === \"custom_tool_call\") {\n const toolName = toolNameMapping.toCustomToolName(\n value.item.name\n );\n ongoingToolCalls[value.output_index] = {\n toolName,\n toolCallId: value.item.call_id\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: value.item.call_id,\n toolName\n });\n } else if (value.item.type === \"web_search_call\") {\n ongoingToolCalls[value.output_index] = {\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n toolCallId: value.item.id\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n providerExecuted: true\n });\n controller.enqueue({\n type: \"tool-input-end\",\n id: value.item.id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n input: JSON.stringify({}),\n providerExecuted: true\n });\n } else if (value.item.type === \"computer_call\") {\n ongoingToolCalls[value.output_index] = {\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n toolCallId: value.item.id\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n providerExecuted: true\n });\n } else if (value.item.type === \"code_interpreter_call\") {\n ongoingToolCalls[value.output_index] = {\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n toolCallId: value.item.id,\n codeInterpreter: {\n containerId: value.item.container_id\n }\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n providerExecuted: true\n });\n controller.enqueue({\n type: \"tool-input-delta\",\n id: value.item.id,\n delta: `{\"containerId\":\"${value.item.container_id}\",\"code\":\"`\n });\n } else if (value.item.type === \"file_search_call\") {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"file_search\"),\n input: \"{}\",\n providerExecuted: true\n });\n } else if (value.item.type === \"image_generation_call\") {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"image_generation\"),\n input: \"{}\",\n providerExecuted: true\n });\n } else if (value.item.type === \"tool_search_call\") {\n const toolCallId = value.item.id;\n const toolName = toolNameMapping.toCustomToolName(\"tool_search\");\n const isHosted = value.item.execution === \"server\";\n ongoingToolCalls[value.output_index] = {\n toolName,\n toolCallId,\n toolSearchExecution: (_a = value.item.execution) != null ? _a : \"server\"\n };\n if (isHosted) {\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName,\n providerExecuted: true\n });\n }\n } else if (value.item.type === \"tool_search_output\") {\n } else if (value.item.type === \"mcp_call\" || value.item.type === \"mcp_list_tools\" || value.item.type === \"mcp_approval_request\") {\n } else if (value.item.type === \"apply_patch_call\") {\n const { call_id: callId, operation } = value.item;\n ongoingToolCalls[value.output_index] = {\n toolName: toolNameMapping.toCustomToolName(\"apply_patch\"),\n toolCallId: callId,\n applyPatch: {\n // delete_file doesn't have diff\n hasDiff: operation.type === \"delete_file\",\n endEmitted: operation.type === \"delete_file\"\n }\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: callId,\n toolName: toolNameMapping.toCustomToolName(\"apply_patch\")\n });\n if (operation.type === \"delete_file\") {\n const inputString = JSON.stringify({\n callId,\n operation\n });\n controller.enqueue({\n type: \"tool-input-delta\",\n id: callId,\n delta: inputString\n });\n controller.enqueue({\n type: \"tool-input-end\",\n id: callId\n });\n } else {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: callId,\n delta: `{\"callId\":\"${escapeJSONDelta(callId)}\",\"operation\":{\"type\":\"${escapeJSONDelta(operation.type)}\",\"path\":\"${escapeJSONDelta(operation.path)}\",\"diff\":\"`\n });\n }\n } else if (value.item.type === \"shell_call\") {\n ongoingToolCalls[value.output_index] = {\n toolName: toolNameMapping.toCustomToolName(\"shell\"),\n toolCallId: value.item.call_id\n };\n } else if (value.item.type === \"shell_call_output\") {\n } else if (value.item.type === \"message\") {\n ongoingAnnotations.splice(0, ongoingAnnotations.length);\n activeMessagePhase = (_b = value.item.phase) != null ? _b : void 0;\n controller.enqueue({\n type: \"text-start\",\n id: value.item.id,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id,\n ...value.item.phase != null && {\n phase: value.item.phase\n }\n }\n }\n });\n } else if (isResponseOutputItemAddedChunk(value) && value.item.type === \"reasoning\") {\n activeReasoning[value.item.id] = {\n encryptedContent: value.item.encrypted_content,\n summaryParts: { 0: \"active\" }\n };\n controller.enqueue({\n type: \"reasoning-start\",\n id: `${value.item.id}:0`,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id,\n reasoningEncryptedContent: (_c = value.item.encrypted_content) != null ? _c : null\n }\n }\n });\n }\n } else if (isResponseOutputItemDoneChunk(value)) {\n if (value.item.type === \"message\") {\n const phase = (_d = value.item.phase) != null ? _d : activeMessagePhase;\n activeMessagePhase = void 0;\n controller.enqueue({\n type: \"text-end\",\n id: value.item.id,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id,\n ...phase != null && { phase },\n ...ongoingAnnotations.length > 0 && {\n annotations: ongoingAnnotations\n }\n }\n }\n });\n } else if (value.item.type === \"function_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n hasFunctionCall = true;\n controller.enqueue({\n type: \"tool-input-end\",\n id: value.item.call_id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.call_id,\n toolName: value.item.name,\n input: value.item.arguments,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n } else if (value.item.type === \"custom_tool_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n hasFunctionCall = true;\n const toolName = toolNameMapping.toCustomToolName(\n value.item.name\n );\n controller.enqueue({\n type: \"tool-input-end\",\n id: value.item.call_id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.call_id,\n toolName,\n input: JSON.stringify(value.item.input),\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n } else if (value.item.type === \"web_search_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n result: mapWebSearchOutput(value.item.action)\n });\n } else if (value.item.type === \"computer_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-input-end\",\n id: value.item.id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n input: \"\",\n providerExecuted: true\n });\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n result: {\n type: \"computer_use_tool_result\",\n status: value.item.status || \"completed\"\n }\n });\n } else if (value.item.type === \"file_search_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"file_search\"),\n result: {\n queries: value.item.queries,\n results: (_f = (_e = value.item.results) == null ? void 0 : _e.map((result) => ({\n attributes: result.attributes,\n fileId: result.file_id,\n filename: result.filename,\n score: result.score,\n text: result.text\n }))) != null ? _f : null\n }\n });\n } else if (value.item.type === \"code_interpreter_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n result: {\n outputs: value.item.outputs\n }\n });\n } else if (value.item.type === \"image_generation_call\") {\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"image_generation\"),\n result: {\n result: value.item.result\n }\n });\n } else if (value.item.type === \"tool_search_call\") {\n const toolCall = ongoingToolCalls[value.output_index];\n const isHosted = value.item.execution === \"server\";\n if (toolCall != null) {\n const toolCallId = isHosted ? toolCall.toolCallId : (_g = value.item.call_id) != null ? _g : value.item.id;\n if (isHosted) {\n hostedToolSearchCallIds.push(toolCallId);\n } else {\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName: toolCall.toolName\n });\n }\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCallId\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId,\n toolName: toolCall.toolName,\n input: JSON.stringify({\n arguments: value.item.arguments,\n call_id: isHosted ? null : toolCallId\n }),\n ...isHosted ? { providerExecuted: true } : {},\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n }\n ongoingToolCalls[value.output_index] = void 0;\n } else if (value.item.type === \"tool_search_output\") {\n const toolCallId = (_i = (_h = value.item.call_id) != null ? _h : hostedToolSearchCallIds.shift()) != null ? _i : value.item.id;\n controller.enqueue({\n type: \"tool-result\",\n toolCallId,\n toolName: toolNameMapping.toCustomToolName(\"tool_search\"),\n result: {\n tools: value.item.tools\n },\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n } else if (value.item.type === \"mcp_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n const approvalRequestId = (_j = value.item.approval_request_id) != null ? _j : void 0;\n const aliasedToolCallId = approvalRequestId != null ? (_l = (_k = approvalRequestIdToDummyToolCallIdFromStream.get(\n approvalRequestId\n )) != null ? _k : approvalRequestIdToDummyToolCallIdFromPrompt[approvalRequestId]) != null ? _l : value.item.id : value.item.id;\n const toolName = `mcp.${value.item.name}`;\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: aliasedToolCallId,\n toolName,\n input: value.item.arguments,\n providerExecuted: true,\n dynamic: true\n });\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: aliasedToolCallId,\n toolName,\n result: {\n type: \"call\",\n serverLabel: value.item.server_label,\n name: value.item.name,\n arguments: value.item.arguments,\n ...value.item.output != null ? { output: value.item.output } : {},\n ...value.item.error != null ? { error: value.item.error } : {}\n },\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n } else if (value.item.type === \"mcp_list_tools\") {\n ongoingToolCalls[value.output_index] = void 0;\n } else if (value.item.type === \"apply_patch_call\") {\n const toolCall = ongoingToolCalls[value.output_index];\n if ((toolCall == null ? void 0 : toolCall.applyPatch) && !toolCall.applyPatch.endEmitted && value.item.operation.type !== \"delete_file\") {\n if (!toolCall.applyPatch.hasDiff) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: escapeJSONDelta(value.item.operation.diff)\n });\n }\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: '\"}}'\n });\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCall.toolCallId\n });\n toolCall.applyPatch.endEmitted = true;\n }\n if (toolCall && value.item.status === \"completed\") {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolNameMapping.toCustomToolName(\"apply_patch\"),\n input: JSON.stringify({\n callId: value.item.call_id,\n operation: value.item.operation\n }),\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n }\n ongoingToolCalls[value.output_index] = void 0;\n } else if (value.item.type === \"mcp_approval_request\") {\n ongoingToolCalls[value.output_index] = void 0;\n const dummyToolCallId = (_o = (_n = (_m = self.config).generateId) == null ? void 0 : _n.call(_m)) != null ? _o : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)();\n const approvalRequestId = (_p = value.item.approval_request_id) != null ? _p : value.item.id;\n approvalRequestIdToDummyToolCallIdFromStream.set(\n approvalRequestId,\n dummyToolCallId\n );\n const toolName = `mcp.${value.item.name}`;\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: dummyToolCallId,\n toolName,\n input: value.item.arguments,\n providerExecuted: true,\n dynamic: true\n });\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId: approvalRequestId,\n toolCallId: dummyToolCallId\n });\n } else if (value.item.type === \"local_shell_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.call_id,\n toolName: toolNameMapping.toCustomToolName(\"local_shell\"),\n input: JSON.stringify({\n action: {\n type: \"exec\",\n command: value.item.action.command,\n timeoutMs: value.item.action.timeout_ms,\n user: value.item.action.user,\n workingDirectory: value.item.action.working_directory,\n env: value.item.action.env\n }\n }),\n providerMetadata: {\n [providerOptionsName]: { itemId: value.item.id }\n }\n });\n } else if (value.item.type === \"shell_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.call_id,\n toolName: toolNameMapping.toCustomToolName(\"shell\"),\n input: JSON.stringify({\n action: {\n commands: value.item.action.commands\n }\n }),\n ...isShellProviderExecuted && {\n providerExecuted: true\n },\n providerMetadata: {\n [providerOptionsName]: { itemId: value.item.id }\n }\n });\n } else if (value.item.type === \"shell_call_output\") {\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.call_id,\n toolName: toolNameMapping.toCustomToolName(\"shell\"),\n result: {\n output: value.item.output.map(\n (item) => ({\n stdout: item.stdout,\n stderr: item.stderr,\n outcome: item.outcome.type === \"exit\" ? {\n type: \"exit\",\n exitCode: item.outcome.exit_code\n } : { type: \"timeout\" }\n })\n )\n }\n });\n } else if (value.item.type === \"reasoning\") {\n const activeReasoningPart = activeReasoning[value.item.id];\n const summaryPartIndices = Object.entries(\n activeReasoningPart.summaryParts\n ).filter(\n ([_, status]) => status === \"active\" || status === \"can-conclude\"\n ).map(([summaryIndex]) => summaryIndex);\n for (const summaryIndex of summaryPartIndices) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: `${value.item.id}:${summaryIndex}`,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id,\n reasoningEncryptedContent: (_q = value.item.encrypted_content) != null ? _q : null\n }\n }\n });\n }\n delete activeReasoning[value.item.id];\n }\n } else if (isResponseFunctionCallArgumentsDeltaChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if (toolCall != null) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: value.delta\n });\n }\n } else if (isResponseCustomToolCallInputDeltaChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if (toolCall != null) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: value.delta\n });\n }\n } else if (isResponseApplyPatchCallOperationDiffDeltaChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if (toolCall == null ? void 0 : toolCall.applyPatch) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: escapeJSONDelta(value.delta)\n });\n toolCall.applyPatch.hasDiff = true;\n }\n } else if (isResponseApplyPatchCallOperationDiffDoneChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if ((toolCall == null ? void 0 : toolCall.applyPatch) && !toolCall.applyPatch.endEmitted) {\n if (!toolCall.applyPatch.hasDiff) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: escapeJSONDelta(value.diff)\n });\n toolCall.applyPatch.hasDiff = true;\n }\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: '\"}}'\n });\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCall.toolCallId\n });\n toolCall.applyPatch.endEmitted = true;\n }\n } else if (isResponseImageGenerationCallPartialImageChunk(value)) {\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item_id,\n toolName: toolNameMapping.toCustomToolName(\"image_generation\"),\n result: {\n result: value.partial_image_b64\n },\n preliminary: true\n });\n } else if (isResponseCodeInterpreterCallCodeDeltaChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if (toolCall != null) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: escapeJSONDelta(value.delta)\n });\n }\n } else if (isResponseCodeInterpreterCallCodeDoneChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if (toolCall != null) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: '\"}'\n });\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCall.toolCallId\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n input: JSON.stringify({\n code: value.code,\n containerId: toolCall.codeInterpreter.containerId\n }),\n providerExecuted: true\n });\n }\n } else if (isResponseCreatedChunk(value)) {\n responseId = value.response.id;\n controller.enqueue({\n type: \"response-metadata\",\n id: value.response.id,\n timestamp: new Date(value.response.created_at * 1e3),\n modelId: value.response.model\n });\n } else if (isTextDeltaChunk(value)) {\n controller.enqueue({\n type: \"text-delta\",\n id: value.item_id,\n delta: value.delta\n });\n if (((_s = (_r = options.providerOptions) == null ? void 0 : _r[providerOptionsName]) == null ? void 0 : _s.logprobs) && value.logprobs) {\n logprobs.push(value.logprobs);\n }\n } else if (value.type === \"response.reasoning_summary_part.added\") {\n if (value.summary_index > 0) {\n const activeReasoningPart = activeReasoning[value.item_id];\n activeReasoningPart.summaryParts[value.summary_index] = \"active\";\n for (const summaryIndex of Object.keys(\n activeReasoningPart.summaryParts\n )) {\n if (activeReasoningPart.summaryParts[summaryIndex] === \"can-conclude\") {\n controller.enqueue({\n type: \"reasoning-end\",\n id: `${value.item_id}:${summaryIndex}`,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item_id\n }\n }\n });\n activeReasoningPart.summaryParts[summaryIndex] = \"concluded\";\n }\n }\n controller.enqueue({\n type: \"reasoning-start\",\n id: `${value.item_id}:${value.summary_index}`,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item_id,\n reasoningEncryptedContent: (_u = (_t = activeReasoning[value.item_id]) == null ? void 0 : _t.encryptedContent) != null ? _u : null\n }\n }\n });\n }\n } else if (value.type === \"response.reasoning_summary_text.delta\") {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: `${value.item_id}:${value.summary_index}`,\n delta: value.delta,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item_id\n }\n }\n });\n } else if (value.type === \"response.reasoning_summary_part.done\") {\n if (store) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: `${value.item_id}:${value.summary_index}`,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item_id\n }\n }\n });\n activeReasoning[value.item_id].summaryParts[value.summary_index] = \"concluded\";\n } else {\n activeReasoning[value.item_id].summaryParts[value.summary_index] = \"can-conclude\";\n }\n } else if (isResponseFinishedChunk(value)) {\n finishReason = {\n unified: mapOpenAIResponseFinishReason({\n finishReason: (_v = value.response.incomplete_details) == null ? void 0 : _v.reason,\n hasFunctionCall\n }),\n raw: (_x = (_w = value.response.incomplete_details) == null ? void 0 : _w.reason) != null ? _x : void 0\n };\n usage = value.response.usage;\n if (typeof value.response.service_tier === \"string\") {\n serviceTier = value.response.service_tier;\n }\n } else if (isResponseFailedChunk(value)) {\n const incompleteReason = (_y = value.response.incomplete_details) == null ? void 0 : _y.reason;\n finishReason = {\n unified: incompleteReason ? mapOpenAIResponseFinishReason({\n finishReason: incompleteReason,\n hasFunctionCall\n }) : \"error\",\n raw: incompleteReason != null ? incompleteReason : \"error\"\n };\n usage = (_z = value.response.usage) != null ? _z : void 0;\n } else if (isResponseAnnotationAddedChunk(value)) {\n ongoingAnnotations.push(value.annotation);\n if (value.annotation.type === \"url_citation\") {\n controller.enqueue({\n type: \"source\",\n sourceType: \"url\",\n id: (_C = (_B = (_A = self.config).generateId) == null ? void 0 : _B.call(_A)) != null ? _C : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n url: value.annotation.url,\n title: value.annotation.title\n });\n } else if (value.annotation.type === \"file_citation\") {\n controller.enqueue({\n type: \"source\",\n sourceType: \"document\",\n id: (_F = (_E = (_D = self.config).generateId) == null ? void 0 : _E.call(_D)) != null ? _F : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"text/plain\",\n title: value.annotation.filename,\n filename: value.annotation.filename,\n providerMetadata: {\n [providerOptionsName]: {\n type: value.annotation.type,\n fileId: value.annotation.file_id,\n index: value.annotation.index\n }\n }\n });\n } else if (value.annotation.type === \"container_file_citation\") {\n controller.enqueue({\n type: \"source\",\n sourceType: \"document\",\n id: (_I = (_H = (_G = self.config).generateId) == null ? void 0 : _H.call(_G)) != null ? _I : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"text/plain\",\n title: value.annotation.filename,\n filename: value.annotation.filename,\n providerMetadata: {\n [providerOptionsName]: {\n type: value.annotation.type,\n fileId: value.annotation.file_id,\n containerId: value.annotation.container_id\n }\n }\n });\n } else if (value.annotation.type === \"file_path\") {\n controller.enqueue({\n type: \"source\",\n sourceType: \"document\",\n id: (_L = (_K = (_J = self.config).generateId) == null ? void 0 : _K.call(_J)) != null ? _L : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"application/octet-stream\",\n title: value.annotation.file_id,\n filename: value.annotation.file_id,\n providerMetadata: {\n [providerOptionsName]: {\n type: value.annotation.type,\n fileId: value.annotation.file_id,\n index: value.annotation.index\n }\n }\n });\n }\n } else if (isErrorChunk(value)) {\n controller.enqueue({ type: \"error\", error: value });\n }\n },\n flush(controller) {\n const providerMetadata = {\n [providerOptionsName]: {\n responseId,\n ...logprobs.length > 0 ? { logprobs } : {},\n ...serviceTier !== void 0 ? { serviceTier } : {}\n }\n };\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage: convertOpenAIResponsesUsage(usage),\n providerMetadata\n });\n }\n })\n ),\n request: { body },\n response: { headers: responseHeaders }\n };\n }\n};\nfunction isTextDeltaChunk(chunk) {\n return chunk.type === \"response.output_text.delta\";\n}\nfunction isResponseOutputItemDoneChunk(chunk) {\n return chunk.type === \"response.output_item.done\";\n}\nfunction isResponseFinishedChunk(chunk) {\n return chunk.type === \"response.completed\" || chunk.type === \"response.incomplete\";\n}\nfunction isResponseFailedChunk(chunk) {\n return chunk.type === \"response.failed\";\n}\nfunction isResponseCreatedChunk(chunk) {\n return chunk.type === \"response.created\";\n}\nfunction isResponseFunctionCallArgumentsDeltaChunk(chunk) {\n return chunk.type === \"response.function_call_arguments.delta\";\n}\nfunction isResponseCustomToolCallInputDeltaChunk(chunk) {\n return chunk.type === \"response.custom_tool_call_input.delta\";\n}\nfunction isResponseImageGenerationCallPartialImageChunk(chunk) {\n return chunk.type === \"response.image_generation_call.partial_image\";\n}\nfunction isResponseCodeInterpreterCallCodeDeltaChunk(chunk) {\n return chunk.type === \"response.code_interpreter_call_code.delta\";\n}\nfunction isResponseCodeInterpreterCallCodeDoneChunk(chunk) {\n return chunk.type === \"response.code_interpreter_call_code.done\";\n}\nfunction isResponseApplyPatchCallOperationDiffDeltaChunk(chunk) {\n return chunk.type === \"response.apply_patch_call_operation_diff.delta\";\n}\nfunction isResponseApplyPatchCallOperationDiffDoneChunk(chunk) {\n return chunk.type === \"response.apply_patch_call_operation_diff.done\";\n}\nfunction isResponseOutputItemAddedChunk(chunk) {\n return chunk.type === \"response.output_item.added\";\n}\nfunction isResponseAnnotationAddedChunk(chunk) {\n return chunk.type === \"response.output_text.annotation.added\";\n}\nfunction isErrorChunk(chunk) {\n return chunk.type === \"error\";\n}\nfunction mapWebSearchOutput(action) {\n var _a;\n if (action == null) {\n return {};\n }\n switch (action.type) {\n case \"search\":\n return {\n action: { type: \"search\", query: (_a = action.query) != null ? _a : void 0 },\n // include sources when provided by the Responses API (behind include flag)\n ...action.sources != null && { sources: action.sources }\n };\n case \"open_page\":\n return { action: { type: \"openPage\", url: action.url } };\n case \"find_in_page\":\n return {\n action: {\n type: \"findInPage\",\n url: action.url,\n pattern: action.pattern\n }\n };\n }\n}\nfunction escapeJSONDelta(delta) {\n return JSON.stringify(delta).slice(1, -1);\n}\n\n// src/speech/openai-speech-model.ts\n\n\n// src/speech/openai-speech-options.ts\n\n\nvar openaiSpeechModelOptionsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n instructions: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n speed: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().min(0.25).max(4).default(1).nullish()\n })\n )\n);\n\n// src/speech/openai-speech-model.ts\nvar OpenAISpeechModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs({\n text,\n voice = \"alloy\",\n outputFormat = \"mp3\",\n speed,\n instructions,\n language,\n providerOptions\n }) {\n const warnings = [];\n const openAIOptions = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openaiSpeechModelOptionsSchema\n });\n const requestBody = {\n model: this.modelId,\n input: text,\n voice,\n response_format: \"mp3\",\n speed,\n instructions\n };\n if (outputFormat) {\n if ([\"mp3\", \"opus\", \"aac\", \"flac\", \"wav\", \"pcm\"].includes(outputFormat)) {\n requestBody.response_format = outputFormat;\n } else {\n warnings.push({\n type: \"unsupported\",\n feature: \"outputFormat\",\n details: `Unsupported output format: ${outputFormat}. Using mp3 instead.`\n });\n }\n }\n if (openAIOptions) {\n const speechModelOptions = {};\n for (const key in speechModelOptions) {\n const value = speechModelOptions[key];\n if (value !== void 0) {\n requestBody[key] = value;\n }\n }\n }\n if (language) {\n warnings.push({\n type: \"unsupported\",\n feature: \"language\",\n details: `OpenAI speech models do not support language selection. Language parameter \"${language}\" was ignored.`\n });\n }\n return {\n requestBody,\n warnings\n };\n }\n async doGenerate(options) {\n var _a, _b, _c;\n const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();\n const { requestBody, warnings } = await this.getArgs(options);\n const {\n value: audio,\n responseHeaders,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/audio/speech\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body: requestBody,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createBinaryResponseHandler)(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n return {\n audio,\n warnings,\n request: {\n body: JSON.stringify(requestBody)\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse\n }\n };\n }\n};\n\n// src/transcription/openai-transcription-model.ts\n\n\n// src/transcription/openai-transcription-api.ts\n\n\nvar openaiTranscriptionResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n language: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n duration: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n words: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n word: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n start: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ).nullish(),\n segments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n seek: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n start: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()),\n temperature: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n avg_logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n compression_ratio: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n no_speech_prob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ).nullish()\n })\n )\n);\n\n// src/transcription/openai-transcription-options.ts\n\n\nvar openAITranscriptionModelOptions = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n /**\n * Additional information to include in the transcription response.\n */\n include: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional(),\n /**\n * The language of the input audio in ISO-639-1 format.\n */\n language: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * An optional text to guide the model's style or continue a previous audio segment.\n */\n prompt: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * The sampling temperature, between 0 and 1.\n * @default 0\n */\n temperature: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().min(0).max(1).default(0).optional(),\n /**\n * The timestamp granularities to populate for this transcription.\n * @default ['segment']\n */\n timestampGranularities: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"word\", \"segment\"])).default([\"segment\"]).optional()\n })\n )\n);\n\n// src/transcription/openai-transcription-model.ts\nvar languageMap = {\n afrikaans: \"af\",\n arabic: \"ar\",\n armenian: \"hy\",\n azerbaijani: \"az\",\n belarusian: \"be\",\n bosnian: \"bs\",\n bulgarian: \"bg\",\n catalan: \"ca\",\n chinese: \"zh\",\n croatian: \"hr\",\n czech: \"cs\",\n danish: \"da\",\n dutch: \"nl\",\n english: \"en\",\n estonian: \"et\",\n finnish: \"fi\",\n french: \"fr\",\n galician: \"gl\",\n german: \"de\",\n greek: \"el\",\n hebrew: \"he\",\n hindi: \"hi\",\n hungarian: \"hu\",\n icelandic: \"is\",\n indonesian: \"id\",\n italian: \"it\",\n japanese: \"ja\",\n kannada: \"kn\",\n kazakh: \"kk\",\n korean: \"ko\",\n latvian: \"lv\",\n lithuanian: \"lt\",\n macedonian: \"mk\",\n malay: \"ms\",\n marathi: \"mr\",\n maori: \"mi\",\n nepali: \"ne\",\n norwegian: \"no\",\n persian: \"fa\",\n polish: \"pl\",\n portuguese: \"pt\",\n romanian: \"ro\",\n russian: \"ru\",\n serbian: \"sr\",\n slovak: \"sk\",\n slovenian: \"sl\",\n spanish: \"es\",\n swahili: \"sw\",\n swedish: \"sv\",\n tagalog: \"tl\",\n tamil: \"ta\",\n thai: \"th\",\n turkish: \"tr\",\n ukrainian: \"uk\",\n urdu: \"ur\",\n vietnamese: \"vi\",\n welsh: \"cy\"\n};\nvar OpenAITranscriptionModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs({\n audio,\n mediaType,\n providerOptions\n }) {\n const warnings = [];\n const openAIOptions = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openAITranscriptionModelOptions\n });\n const formData = new FormData();\n const blob = audio instanceof Uint8Array ? new Blob([audio]) : new Blob([(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertBase64ToUint8Array)(audio)]);\n formData.append(\"model\", this.modelId);\n const fileExtension = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.mediaTypeToExtension)(mediaType);\n formData.append(\n \"file\",\n new File([blob], \"audio\", { type: mediaType }),\n `audio.${fileExtension}`\n );\n if (openAIOptions) {\n const transcriptionModelOptions = {\n include: openAIOptions.include,\n language: openAIOptions.language,\n prompt: openAIOptions.prompt,\n // https://platform.openai.com/docs/api-reference/audio/createTranscription#audio_createtranscription-response_format\n // prefer verbose_json to get segments for models that support it\n response_format: [\n \"gpt-4o-transcribe\",\n \"gpt-4o-mini-transcribe\"\n ].includes(this.modelId) ? \"json\" : \"verbose_json\",\n temperature: openAIOptions.temperature,\n timestamp_granularities: openAIOptions.timestampGranularities\n };\n for (const [key, value] of Object.entries(transcriptionModelOptions)) {\n if (value != null) {\n if (Array.isArray(value)) {\n for (const item of value) {\n formData.append(`${key}[]`, String(item));\n }\n } else {\n formData.append(key, String(value));\n }\n }\n }\n }\n return {\n formData,\n warnings\n };\n }\n async doGenerate(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();\n const { formData, warnings } = await this.getArgs(options);\n const {\n value: response,\n responseHeaders,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postFormDataToApi)({\n url: this.config.url({\n path: \"/audio/transcriptions\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n formData,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiTranscriptionResponseSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n const language = response.language != null && response.language in languageMap ? languageMap[response.language] : void 0;\n return {\n text: response.text,\n segments: (_g = (_f = (_d = response.segments) == null ? void 0 : _d.map((segment) => ({\n text: segment.text,\n startSecond: segment.start,\n endSecond: segment.end\n }))) != null ? _f : (_e = response.words) == null ? void 0 : _e.map((word) => ({\n text: word.word,\n startSecond: word.start,\n endSecond: word.end\n }))) != null ? _g : [],\n language,\n durationInSeconds: (_h = response.duration) != null ? _h : void 0,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse\n }\n };\n }\n};\n\n// src/version.ts\nvar VERSION = true ? \"3.0.49\" : 0;\n\n// src/openai-provider.ts\nfunction createOpenAI(options = {}) {\n var _a, _b;\n const baseURL = (_a = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.withoutTrailingSlash)(\n (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.loadOptionalSetting)({\n settingValue: options.baseURL,\n environmentVariableName: \"OPENAI_BASE_URL\"\n })\n )) != null ? _a : \"https://api.openai.com/v1\";\n const providerName = (_b = options.name) != null ? _b : \"openai\";\n const getHeaders = () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.withUserAgentSuffix)(\n {\n Authorization: `Bearer ${(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.loadApiKey)({\n apiKey: options.apiKey,\n environmentVariableName: \"OPENAI_API_KEY\",\n description: \"OpenAI\"\n })}`,\n \"OpenAI-Organization\": options.organization,\n \"OpenAI-Project\": options.project,\n ...options.headers\n },\n `ai-sdk/openai/${VERSION}`\n );\n const createChatModel = (modelId) => new OpenAIChatLanguageModel(modelId, {\n provider: `${providerName}.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createCompletionModel = (modelId) => new OpenAICompletionLanguageModel(modelId, {\n provider: `${providerName}.completion`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createEmbeddingModel = (modelId) => new OpenAIEmbeddingModel(modelId, {\n provider: `${providerName}.embedding`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createImageModel = (modelId) => new OpenAIImageModel(modelId, {\n provider: `${providerName}.image`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createTranscriptionModel = (modelId) => new OpenAITranscriptionModel(modelId, {\n provider: `${providerName}.transcription`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createSpeechModel = (modelId) => new OpenAISpeechModel(modelId, {\n provider: `${providerName}.speech`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createLanguageModel = (modelId) => {\n if (new.target) {\n throw new Error(\n \"The OpenAI model function cannot be called with the new keyword.\"\n );\n }\n return createResponsesModel(modelId);\n };\n const createResponsesModel = (modelId) => {\n return new OpenAIResponsesLanguageModel(modelId, {\n provider: `${providerName}.responses`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n fileIdPrefixes: [\"file-\"]\n });\n };\n const provider = function(modelId) {\n return createLanguageModel(modelId);\n };\n provider.specificationVersion = \"v3\";\n provider.languageModel = createLanguageModel;\n provider.chat = createChatModel;\n provider.completion = createCompletionModel;\n provider.responses = createResponsesModel;\n provider.embedding = createEmbeddingModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbedding = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n provider.tools = openaiTools;\n return provider;\n}\nvar openai = createOpenAI();\n\n//# sourceMappingURL=index.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9AYWktc2RrK29wZW5haUAzLjAuNDlfem9kQDMuMjUuNzYvbm9kZV9tb2R1bGVzL0BhaS1zZGsvb3BlbmFpL2Rpc3QvaW5kZXgubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQU1nQzs7QUFFaEM7QUFHMEI7QUFTTTs7QUFFaEM7QUFDMkI7QUFDNkM7QUFDeEUsNEJBQTRCLDBDQUFRO0FBQ3BDLFNBQVMsMENBQVE7QUFDakIsYUFBYSwwQ0FBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxVQUFVLDBDQUFRO0FBQ2xCLFdBQVcsdUNBQUs7QUFDaEIsVUFBVSx5Q0FBTyxFQUFFLDBDQUFRLElBQUksMENBQVE7QUFDdkMsR0FBRztBQUNILENBQUM7QUFDRCxrQ0FBa0Msc0ZBQThCO0FBQ2hFO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFHMEI7QUFDK0I7QUFDekQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHlCQUF5QjtBQUNyRDtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsNEJBQTRCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLFlBQVksaUNBQWlDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLElBQUk7QUFDbEIsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxRQUFRLHFFQUFjO0FBQzVCO0FBQ0EsZUFBZSxzRUFBZTtBQUM5QjtBQUNBO0FBQ0EsaUNBQWlDLGlGQUEwQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGdCQUFnQiwwREFBWTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsZ0NBQWdDO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsNEJBQTRCLHlCQUF5QixJQUFJO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLDRDQUE0Qyx3QkFBd0I7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLElBQUk7QUFDdEIsZUFBZTtBQUNmO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxtQkFBbUI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdIQUFnSCxrRUFBVztBQUMzSDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQSxnSEFBZ0gsa0VBQVc7QUFDM0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLGdIQUFnSCxrRUFBVztBQUMzSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsZ0hBQWdILGtFQUFXO0FBQzNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxVQUFVO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxzQkFBc0IsSUFBSTtBQUNuRSx3Q0FBd0Msb0JBQW9CO0FBQzVELGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEhBQTRILGtFQUFXO0FBQ3ZJLGtDQUFrQyxVQUFVO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFdBQVcsSUFBSTtBQUNsRCx5REFBeUQscUNBQXFDO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBLGlCQUFpQixNQUFNO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixZQUFZLG1DQUFtQyxRQUFRLHFFQUFjO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxlQUFlLHNFQUFlO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLGlDQUFpQyx3RkFBaUM7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdDQUFnQztBQUNqRSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHVDQUF1QztBQUMxRTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLG1DQUFtQyxtQ0FBbUM7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixpQkFBaUIsd0JBQXdCO0FBQ3BFLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsZ0JBQWdCO0FBQ2hCLGdCQUFnQjtBQUNoQixnQkFBZ0I7QUFDaEIsd0JBQXdCLDZCQUE2QjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixZQUFZLHdCQUF3QixlQUFlLFVBQVUsZ0NBQWdDLFlBQVksZ0NBQWdDO0FBQ3RLLG1CQUFtQjtBQUNuQjtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGNBQWM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxPQUFPO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixvQ0FBb0MseUJBQXlCLElBQUk7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsZ0JBQWdCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCw0QkFBNEIsSUFBSTtBQUNyRixvREFBb0QsMEJBQTBCO0FBQzlFLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQjtBQUNoQjtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBLGtJQUFrSSxrRUFBVztBQUM3STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLGdCQUFnQjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLDZDQUE2QztBQUM3QztBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixJQUFJO0FBQzlCLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsY0FBYyxHQUFHLGFBQWE7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGVBQWU7QUFDZixjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsY0FBYyxHQUFHLGFBQWE7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGNBQWMsR0FBRyxvQkFBb0I7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSx1QkFBdUIsY0FBYyxHQUFHLG9CQUFvQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixjQUFjLEdBQUcsb0JBQW9CO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdIQUFnSCxrRUFBVztBQUMzSDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQSxnSEFBZ0gsa0VBQVc7QUFDM0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLGdIQUFnSCxrRUFBVztBQUMzSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsZ0hBQWdILGtFQUFXO0FBQzNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsY0FBYztBQUNkLG1DQUFtQyw2QkFBNkI7QUFDaEU7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsV0FBVyxJQUFJO0FBQzFELDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0EsaUJBQWlCLE1BQU07QUFDdkIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0VBQWtFO0FBQ3BGO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFNZ0M7O0FBRWhDO0FBQzhGO0FBQzVEO0FBQ2xDLHFDQUFxQyxrRUFBWTtBQUNqRCxRQUFRLGlFQUFXO0FBQ25CLElBQUksMENBQVU7QUFDZCxvQkFBb0IsMENBQVU7QUFDOUIsYUFBYSwwQ0FBVTtBQUN2QixLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxnQ0FBZ0MsNEVBQXFCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxhQUFhO0FBQzlELFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnR0FBZ0csU0FBUztBQUN6RyxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx3QkFBd0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLFFBQVEscUVBQWM7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLGVBQWUsc0VBQWU7QUFDOUI7QUFDQTtBQUNBLGlDQUFpQyxtRkFBMkI7QUFDNUQ7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQVFnQzs7QUFFaEM7QUFDOEY7QUFDNUQ7QUFDbEMsd0NBQXdDLGtFQUFZO0FBQ3BELFFBQVEsaUVBQVc7QUFDbkIsSUFBSSwwQ0FBVTtBQUNkLFlBQVksMENBQVU7QUFDdEIsZ0JBQWdCLDBDQUFVO0FBQzFCLGdCQUFnQiwwQ0FBVTtBQUMxQixhQUFhLHlDQUFTO0FBQ3RCLFFBQVEsMENBQVU7QUFDbEIsZ0JBQWdCLDBDQUFVO0FBQzFCLGlCQUFpQiwwQ0FBVTtBQUMzQixlQUFlLDBDQUFVO0FBQ3pCLFNBQVM7QUFDVDtBQUNBLGdCQUFnQix5Q0FBUztBQUN6QixRQUFRLDBDQUFVO0FBQ2xCLGNBQWMsMENBQVU7QUFDeEIsZ0JBQWdCLDBDQUFVO0FBQzFCLGlCQUFpQiwwQ0FBVTtBQUMzQixlQUFlLDBDQUFVO0FBQ3pCLGdCQUFnQiwwQ0FBVTtBQUMxQixrQkFBa0IseUNBQVMsQ0FBQywwQ0FBVTtBQUN0Qyx1QkFBdUIsMENBQVU7QUFDakMsdUJBQXVCLDBDQUFVO0FBQ2pDLDZCQUE2QiwwQ0FBVTtBQUN2QywwQkFBMEIsMENBQVU7QUFDcEMsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDOEY7QUFDNUQ7QUFDbEMsc0NBQXNDLGtFQUFZO0FBQ2xELFFBQVEsaUVBQVc7QUFDbkIsSUFBSSwwQ0FBVTtBQUNkO0FBQ0E7QUFDQTtBQUNBLGVBQWUseUNBQVMsQ0FBQywwQ0FBVTtBQUNuQztBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsMENBQVU7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsY0FBYywwQ0FBVTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwwQ0FBVTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qix5Q0FBUyxDQUFDLDJDQUFRO0FBQ2hELEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZ0NBQWdDLDRFQUFxQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw2RUFBNkUsaUZBQTBCO0FBQ3ZHO0FBQ0EsMEJBQTBCLDRFQUFvQjtBQUM5QztBQUNBO0FBQ0Esa0NBQWtDLGlCQUFpQjtBQUNuRCxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsSUFBSTtBQUNyQztBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVkscUJBQXFCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxRQUFRLHlFQUFrQjtBQUNoQztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsZUFBZSxzRUFBZTtBQUM5QjtBQUNBO0FBQ0EsaUNBQWlDLGlGQUEwQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYyxLQUFJLGNBQWMsQ0FBWTs7QUFFNUM7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQSx3QkFBd0IsNEVBQW9CO0FBQzVDLElBQUksMkVBQW1CO0FBQ3ZCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDJCQUEyQiwyRUFBbUI7QUFDOUM7QUFDQSwrQkFBK0Isa0VBQVU7QUFDekM7QUFDQTtBQUNBO0FBQ0EsT0FBTyxFQUFFO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHFCQUFxQixRQUFRO0FBQzdCO0FBQ0E7QUFDQSxpQkFBaUIsYUFBYTtBQUM5QixZQUFZLE1BQU0sUUFBUSxRQUFRLEVBQUUsS0FBSztBQUN6QztBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsaUJBQWlCLGFBQWE7QUFDOUIsWUFBWSxNQUFNLFFBQVEsUUFBUSxFQUFFLEtBQUs7QUFDekM7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGlCQUFpQixhQUFhO0FBQzlCLFlBQVksTUFBTSxRQUFRLFFBQVEsRUFBRSxLQUFLO0FBQ3pDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxpQkFBaUIsYUFBYTtBQUM5QixZQUFZLE1BQU0sUUFBUSxRQUFRLEVBQUUsS0FBSztBQUN6QztBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsaUJBQWlCLGFBQWE7QUFDOUIsWUFBWSxNQUFNLFFBQVEsUUFBUSxFQUFFLEtBQUs7QUFDekM7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGlCQUFpQixhQUFhO0FBQzlCLFlBQVksTUFBTSxRQUFRLFFBQVEsRUFBRSxLQUFLO0FBQ3pDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsYUFBYTtBQUNoQyxjQUFjLE1BQU0sUUFBUSxRQUFRLEVBQUUsS0FBSztBQUMzQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtFO0FBQ0YiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vQGFpLXNkaytvcGVuYWlAMy4wLjQ5X3pvZEAzLjI1Ljc2L25vZGVfbW9kdWxlcy9AYWktc2RrL29wZW5haS9kaXN0L2luZGV4Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzcmMvb3BlbmFpLXByb3ZpZGVyLnRzXG5pbXBvcnQge1xuICBsb2FkQXBpS2V5LFxuICBsb2FkT3B0aW9uYWxTZXR0aW5nLFxuICB3aXRob3V0VHJhaWxpbmdTbGFzaCxcbiAgd2l0aFVzZXJBZ2VudFN1ZmZpeFxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvY2hhdC9vcGVuYWktY2hhdC1sYW5ndWFnZS1tb2RlbC50c1xuaW1wb3J0IHtcbiAgSW52YWxpZFJlc3BvbnNlRGF0YUVycm9yXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5pbXBvcnQge1xuICBjb21iaW5lSGVhZGVycyxcbiAgY3JlYXRlRXZlbnRTb3VyY2VSZXNwb25zZUhhbmRsZXIsXG4gIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIsXG4gIGdlbmVyYXRlSWQsXG4gIGlzUGFyc2FibGVKc29uLFxuICBwYXJzZVByb3ZpZGVyT3B0aW9ucyxcbiAgcG9zdEpzb25Ub0FwaVxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvb3BlbmFpLWVycm9yLnRzXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZC92NFwiO1xuaW1wb3J0IHsgY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbnZhciBvcGVuYWlFcnJvckRhdGFTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGVycm9yOiB6Lm9iamVjdCh7XG4gICAgbWVzc2FnZTogei5zdHJpbmcoKSxcbiAgICAvLyBUaGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBiZWxvdyBpcyBoYW5kbGVkIGxvb3NlbHkgdG8gc3VwcG9ydFxuICAgIC8vIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVycyB0aGF0IGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50IGVycm9yXG4gICAgLy8gcmVzcG9uc2VzOlxuICAgIHR5cGU6IHouc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgIHBhcmFtOiB6LmFueSgpLm51bGxpc2goKSxcbiAgICBjb2RlOiB6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSkubnVsbGlzaCgpXG4gIH0pXG59KTtcbnZhciBvcGVuYWlGYWlsZWRSZXNwb25zZUhhbmRsZXIgPSBjcmVhdGVKc29uRXJyb3JSZXNwb25zZUhhbmRsZXIoe1xuICBlcnJvclNjaGVtYTogb3BlbmFpRXJyb3JEYXRhU2NoZW1hLFxuICBlcnJvclRvTWVzc2FnZTogKGRhdGEpID0+IGRhdGEuZXJyb3IubWVzc2FnZVxufSk7XG5cbi8vIHNyYy9vcGVuYWktbGFuZ3VhZ2UtbW9kZWwtY2FwYWJpbGl0aWVzLnRzXG5mdW5jdGlvbiBnZXRPcGVuQUlMYW5ndWFnZU1vZGVsQ2FwYWJpbGl0aWVzKG1vZGVsSWQpIHtcbiAgY29uc3Qgc3VwcG9ydHNGbGV4UHJvY2Vzc2luZyA9IG1vZGVsSWQuc3RhcnRzV2l0aChcIm8zXCIpIHx8IG1vZGVsSWQuc3RhcnRzV2l0aChcIm80LW1pbmlcIikgfHwgbW9kZWxJZC5zdGFydHNXaXRoKFwiZ3B0LTVcIikgJiYgIW1vZGVsSWQuc3RhcnRzV2l0aChcImdwdC01LWNoYXRcIik7XG4gIGNvbnN0IHN1cHBvcnRzUHJpb3JpdHlQcm9jZXNzaW5nID0gbW9kZWxJZC5zdGFydHNXaXRoKFwiZ3B0LTRcIikgfHwgbW9kZWxJZC5zdGFydHNXaXRoKFwiZ3B0LTVcIikgJiYgIW1vZGVsSWQuc3RhcnRzV2l0aChcImdwdC01LW5hbm9cIikgJiYgIW1vZGVsSWQuc3RhcnRzV2l0aChcImdwdC01LWNoYXRcIikgJiYgIW1vZGVsSWQuc3RhcnRzV2l0aChcImdwdC01LjQtbmFub1wiKSB8fCBtb2RlbElkLnN0YXJ0c1dpdGgoXCJvM1wiKSB8fCBtb2RlbElkLnN0YXJ0c1dpdGgoXCJvNC1taW5pXCIpO1xuICBjb25zdCBpc1JlYXNvbmluZ01vZGVsID0gbW9kZWxJZC5zdGFydHNXaXRoKFwibzFcIikgfHwgbW9kZWxJZC5zdGFydHNXaXRoKFwibzNcIikgfHwgbW9kZWxJZC5zdGFydHNXaXRoKFwibzQtbWluaVwiKSB8fCBtb2RlbElkLnN0YXJ0c1dpdGgoXCJncHQtNVwiKSAmJiAhbW9kZWxJZC5zdGFydHNXaXRoKFwiZ3B0LTUtY2hhdFwiKTtcbiAgY29uc3Qgc3VwcG9ydHNOb25SZWFzb25pbmdQYXJhbWV0ZXJzID0gbW9kZWxJZC5zdGFydHNXaXRoKFwiZ3B0LTUuMVwiKSB8fCBtb2RlbElkLnN0YXJ0c1dpdGgoXCJncHQtNS4yXCIpIHx8IG1vZGVsSWQuc3RhcnRzV2l0aChcImdwdC01LjNcIikgfHwgbW9kZWxJZC5zdGFydHNXaXRoKFwiZ3B0LTUuNFwiKTtcbiAgY29uc3Qgc3lzdGVtTWVzc2FnZU1vZGUgPSBpc1JlYXNvbmluZ01vZGVsID8gXCJkZXZlbG9wZXJcIiA6IFwic3lzdGVtXCI7XG4gIHJldHVybiB7XG4gICAgc3VwcG9ydHNGbGV4UHJvY2Vzc2luZyxcbiAgICBzdXBwb3J0c1ByaW9yaXR5UHJvY2Vzc2luZyxcbiAgICBpc1JlYXNvbmluZ01vZGVsLFxuICAgIHN5c3RlbU1lc3NhZ2VNb2RlLFxuICAgIHN1cHBvcnRzTm9uUmVhc29uaW5nUGFyYW1ldGVyc1xuICB9O1xufVxuXG4vLyBzcmMvY2hhdC9jb252ZXJ0LW9wZW5haS1jaGF0LXVzYWdlLnRzXG5mdW5jdGlvbiBjb252ZXJ0T3BlbkFJQ2hhdFVzYWdlKHVzYWdlKSB7XG4gIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICBpZiAodXNhZ2UgPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dFRva2Vuczoge1xuICAgICAgICB0b3RhbDogdm9pZCAwLFxuICAgICAgICBub0NhY2hlOiB2b2lkIDAsXG4gICAgICAgIGNhY2hlUmVhZDogdm9pZCAwLFxuICAgICAgICBjYWNoZVdyaXRlOiB2b2lkIDBcbiAgICAgIH0sXG4gICAgICBvdXRwdXRUb2tlbnM6IHtcbiAgICAgICAgdG90YWw6IHZvaWQgMCxcbiAgICAgICAgdGV4dDogdm9pZCAwLFxuICAgICAgICByZWFzb25pbmc6IHZvaWQgMFxuICAgICAgfSxcbiAgICAgIHJhdzogdm9pZCAwXG4gICAgfTtcbiAgfVxuICBjb25zdCBwcm9tcHRUb2tlbnMgPSAoX2EgPSB1c2FnZS5wcm9tcHRfdG9rZW5zKSAhPSBudWxsID8gX2EgOiAwO1xuICBjb25zdCBjb21wbGV0aW9uVG9rZW5zID0gKF9iID0gdXNhZ2UuY29tcGxldGlvbl90b2tlbnMpICE9IG51bGwgPyBfYiA6IDA7XG4gIGNvbnN0IGNhY2hlZFRva2VucyA9IChfZCA9IChfYyA9IHVzYWdlLnByb21wdF90b2tlbnNfZGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9jLmNhY2hlZF90b2tlbnMpICE9IG51bGwgPyBfZCA6IDA7XG4gIGNvbnN0IHJlYXNvbmluZ1Rva2VucyA9IChfZiA9IChfZSA9IHVzYWdlLmNvbXBsZXRpb25fdG9rZW5zX2RldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfZS5yZWFzb25pbmdfdG9rZW5zKSAhPSBudWxsID8gX2YgOiAwO1xuICByZXR1cm4ge1xuICAgIGlucHV0VG9rZW5zOiB7XG4gICAgICB0b3RhbDogcHJvbXB0VG9rZW5zLFxuICAgICAgbm9DYWNoZTogcHJvbXB0VG9rZW5zIC0gY2FjaGVkVG9rZW5zLFxuICAgICAgY2FjaGVSZWFkOiBjYWNoZWRUb2tlbnMsXG4gICAgICBjYWNoZVdyaXRlOiB2b2lkIDBcbiAgICB9LFxuICAgIG91dHB1dFRva2Vuczoge1xuICAgICAgdG90YWw6IGNvbXBsZXRpb25Ub2tlbnMsXG4gICAgICB0ZXh0OiBjb21wbGV0aW9uVG9rZW5zIC0gcmVhc29uaW5nVG9rZW5zLFxuICAgICAgcmVhc29uaW5nOiByZWFzb25pbmdUb2tlbnNcbiAgICB9LFxuICAgIHJhdzogdXNhZ2VcbiAgfTtcbn1cblxuLy8gc3JjL2NoYXQvY29udmVydC10by1vcGVuYWktY2hhdC1tZXNzYWdlcy50c1xuaW1wb3J0IHtcbiAgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3Jcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGNvbnZlcnRUb0Jhc2U2NCB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5mdW5jdGlvbiBjb252ZXJ0VG9PcGVuQUlDaGF0TWVzc2FnZXMoe1xuICBwcm9tcHQsXG4gIHN5c3RlbU1lc3NhZ2VNb2RlID0gXCJzeXN0ZW1cIlxufSkge1xuICB2YXIgX2E7XG4gIGNvbnN0IG1lc3NhZ2VzID0gW107XG4gIGNvbnN0IHdhcm5pbmdzID0gW107XG4gIGZvciAoY29uc3QgeyByb2xlLCBjb250ZW50IH0gb2YgcHJvbXB0KSB7XG4gICAgc3dpdGNoIChyb2xlKSB7XG4gICAgICBjYXNlIFwic3lzdGVtXCI6IHtcbiAgICAgICAgc3dpdGNoIChzeXN0ZW1NZXNzYWdlTW9kZSkge1xuICAgICAgICAgIGNhc2UgXCJzeXN0ZW1cIjoge1xuICAgICAgICAgICAgbWVzc2FnZXMucHVzaCh7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImRldmVsb3BlclwiOiB7XG4gICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHsgcm9sZTogXCJkZXZlbG9wZXJcIiwgY29udGVudCB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwic3lzdGVtIG1lc3NhZ2VzIGFyZSByZW1vdmVkIGZvciB0aGlzIG1vZGVsXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGNvbnN0IF9leGhhdXN0aXZlQ2hlY2sgPSBzeXN0ZW1NZXNzYWdlTW9kZTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFVuc3VwcG9ydGVkIHN5c3RlbSBtZXNzYWdlIG1vZGU6ICR7X2V4aGF1c3RpdmVDaGVja31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ1c2VyXCI6IHtcbiAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID09PSAxICYmIGNvbnRlbnRbMF0udHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICBtZXNzYWdlcy5wdXNoKHsgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IGNvbnRlbnRbMF0udGV4dCB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICByb2xlOiBcInVzZXJcIixcbiAgICAgICAgICBjb250ZW50OiBjb250ZW50Lm1hcCgocGFydCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTIsIF9iLCBfYztcbiAgICAgICAgICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0eXBlOiBcInRleHRcIiwgdGV4dDogcGFydC50ZXh0IH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcImZpbGVcIjoge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0Lm1lZGlhVHlwZS5zdGFydHNXaXRoKFwiaW1hZ2UvXCIpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBwYXJ0Lm1lZGlhVHlwZSA9PT0gXCJpbWFnZS8qXCIgPyBcImltYWdlL2pwZWdcIiA6IHBhcnQubWVkaWFUeXBlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbWFnZV91cmxcIixcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdXJsOiBwYXJ0LmRhdGEgaW5zdGFuY2VvZiBVUkwgPyBwYXJ0LmRhdGEudG9TdHJpbmcoKSA6IGBkYXRhOiR7bWVkaWFUeXBlfTtiYXNlNjQsJHtjb252ZXJ0VG9CYXNlNjQocGFydC5kYXRhKX1gLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW5BSSBzcGVjaWZpYyBleHRlbnNpb246IGltYWdlIGRldGFpbFxuICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogKF9iID0gKF9hMiA9IHBhcnQucHJvdmlkZXJPcHRpb25zKSA9PSBudWxsID8gdm9pZCAwIDogX2EyLm9wZW5haSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmltYWdlRGV0YWlsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0Lm1lZGlhVHlwZS5zdGFydHNXaXRoKFwiYXVkaW8vXCIpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocGFydC5kYXRhIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25hbGl0eTogXCJhdWRpbyBmaWxlIHBhcnRzIHdpdGggVVJMc1wiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgc3dpdGNoIChwYXJ0Lm1lZGlhVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXVkaW8vd2F2XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnB1dF9hdWRpb1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfYXVkaW86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogY29udmVydFRvQmFzZTY0KHBhcnQuZGF0YSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogXCJ3YXZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImF1ZGlvL21wM1wiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXVkaW8vbXBlZ1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5wdXRfYXVkaW9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2F1ZGlvOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGNvbnZlcnRUb0Jhc2U2NChwYXJ0LmRhdGEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFwibXAzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25hbGl0eTogYGF1ZGlvIGNvbnRlbnQgcGFydHMgd2l0aCBtZWRpYSB0eXBlICR7cGFydC5tZWRpYVR5cGV9YFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0Lm1lZGlhVHlwZSA9PT0gXCJhcHBsaWNhdGlvbi9wZGZcIikge1xuICAgICAgICAgICAgICAgICAgaWYgKHBhcnQuZGF0YSBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHk6IFwiUERGIGZpbGUgcGFydHMgd2l0aCBVUkxzXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogdHlwZW9mIHBhcnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJiBwYXJ0LmRhdGEuc3RhcnRzV2l0aChcImZpbGUtXCIpID8geyBmaWxlX2lkOiBwYXJ0LmRhdGEgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogKF9jID0gcGFydC5maWxlbmFtZSkgIT0gbnVsbCA/IF9jIDogYHBhcnQtJHtpbmRleH0ucGRmYCxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlX2RhdGE6IGBkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsJHtjb252ZXJ0VG9CYXNlNjQocGFydC5kYXRhKX1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHk6IGBmaWxlIHBhcnQgbWVkaWEgdHlwZSAke3BhcnQubWVkaWFUeXBlfWBcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhc3Npc3RhbnRcIjoge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHRvb2xDYWxscyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgY29udGVudCkge1xuICAgICAgICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgIHRleHQgKz0gcGFydC50ZXh0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJ0b29sLWNhbGxcIjoge1xuICAgICAgICAgICAgICB0b29sQ2FsbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcnQudG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICBhcmd1bWVudHM6IEpTT04uc3RyaW5naWZ5KHBhcnQuaW5wdXQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgICAgY29udGVudDogdGV4dCxcbiAgICAgICAgICB0b29sX2NhbGxzOiB0b29sQ2FsbHMubGVuZ3RoID4gMCA/IHRvb2xDYWxscyA6IHZvaWQgMFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidG9vbFwiOiB7XG4gICAgICAgIGZvciAoY29uc3QgdG9vbFJlc3BvbnNlIG9mIGNvbnRlbnQpIHtcbiAgICAgICAgICBpZiAodG9vbFJlc3BvbnNlLnR5cGUgPT09IFwidG9vbC1hcHByb3ZhbC1yZXNwb25zZVwiKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb3V0cHV0ID0gdG9vbFJlc3BvbnNlLm91dHB1dDtcbiAgICAgICAgICBsZXQgY29udGVudFZhbHVlO1xuICAgICAgICAgIHN3aXRjaCAob3V0cHV0LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICBjYXNlIFwiZXJyb3ItdGV4dFwiOlxuICAgICAgICAgICAgICBjb250ZW50VmFsdWUgPSBvdXRwdXQudmFsdWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImV4ZWN1dGlvbi1kZW5pZWRcIjpcbiAgICAgICAgICAgICAgY29udGVudFZhbHVlID0gKF9hID0gb3V0cHV0LnJlYXNvbikgIT0gbnVsbCA/IF9hIDogXCJUb29sIGV4ZWN1dGlvbiBkZW5pZWQuXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNvbnRlbnRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgICAgICBjYXNlIFwiZXJyb3ItanNvblwiOlxuICAgICAgICAgICAgICBjb250ZW50VmFsdWUgPSBKU09OLnN0cmluZ2lmeShvdXRwdXQudmFsdWUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICByb2xlOiBcInRvb2xcIixcbiAgICAgICAgICAgIHRvb2xfY2FsbF9pZDogdG9vbFJlc3BvbnNlLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50VmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgX2V4aGF1c3RpdmVDaGVjayA9IHJvbGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcm9sZTogJHtfZXhoYXVzdGl2ZUNoZWNrfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtZXNzYWdlcywgd2FybmluZ3MgfTtcbn1cblxuLy8gc3JjL2NoYXQvZ2V0LXJlc3BvbnNlLW1ldGFkYXRhLnRzXG5mdW5jdGlvbiBnZXRSZXNwb25zZU1ldGFkYXRhKHtcbiAgaWQsXG4gIG1vZGVsLFxuICBjcmVhdGVkXG59KSB7XG4gIHJldHVybiB7XG4gICAgaWQ6IGlkICE9IG51bGwgPyBpZCA6IHZvaWQgMCxcbiAgICBtb2RlbElkOiBtb2RlbCAhPSBudWxsID8gbW9kZWwgOiB2b2lkIDAsXG4gICAgdGltZXN0YW1wOiBjcmVhdGVkID8gbmV3IERhdGUoY3JlYXRlZCAqIDFlMykgOiB2b2lkIDBcbiAgfTtcbn1cblxuLy8gc3JjL2NoYXQvbWFwLW9wZW5haS1maW5pc2gtcmVhc29uLnRzXG5mdW5jdGlvbiBtYXBPcGVuQUlGaW5pc2hSZWFzb24oZmluaXNoUmVhc29uKSB7XG4gIHN3aXRjaCAoZmluaXNoUmVhc29uKSB7XG4gICAgY2FzZSBcInN0b3BcIjpcbiAgICAgIHJldHVybiBcInN0b3BcIjtcbiAgICBjYXNlIFwibGVuZ3RoXCI6XG4gICAgICByZXR1cm4gXCJsZW5ndGhcIjtcbiAgICBjYXNlIFwiY29udGVudF9maWx0ZXJcIjpcbiAgICAgIHJldHVybiBcImNvbnRlbnQtZmlsdGVyXCI7XG4gICAgY2FzZSBcImZ1bmN0aW9uX2NhbGxcIjpcbiAgICBjYXNlIFwidG9vbF9jYWxsc1wiOlxuICAgICAgcmV0dXJuIFwidG9vbC1jYWxsc1wiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJvdGhlclwiO1xuICB9XG59XG5cbi8vIHNyYy9jaGF0L29wZW5haS1jaGF0LWFwaS50c1xuaW1wb3J0IHsgbGF6eVNjaGVtYSwgem9kU2NoZW1hIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejIgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgb3BlbmFpQ2hhdFJlc3BvbnNlU2NoZW1hID0gbGF6eVNjaGVtYShcbiAgKCkgPT4gem9kU2NoZW1hKFxuICAgIHoyLm9iamVjdCh7XG4gICAgICBpZDogejIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgY3JlYXRlZDogejIubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgbW9kZWw6IHoyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIGNob2ljZXM6IHoyLmFycmF5KFxuICAgICAgICB6Mi5vYmplY3Qoe1xuICAgICAgICAgIG1lc3NhZ2U6IHoyLm9iamVjdCh7XG4gICAgICAgICAgICByb2xlOiB6Mi5saXRlcmFsKFwiYXNzaXN0YW50XCIpLm51bGxpc2goKSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHoyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgIHRvb2xfY2FsbHM6IHoyLmFycmF5KFxuICAgICAgICAgICAgICB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGlkOiB6Mi5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgICAgICAgICAgdHlwZTogejIubGl0ZXJhbChcImZ1bmN0aW9uXCIpLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgbmFtZTogejIuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICBhcmd1bWVudHM6IHoyLnN0cmluZygpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkubnVsbGlzaCgpLFxuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHoyLmFycmF5KFxuICAgICAgICAgICAgICB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyLmxpdGVyYWwoXCJ1cmxfY2l0YXRpb25cIiksXG4gICAgICAgICAgICAgICAgdXJsX2NpdGF0aW9uOiB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgc3RhcnRfaW5kZXg6IHoyLm51bWJlcigpLFxuICAgICAgICAgICAgICAgICAgZW5kX2luZGV4OiB6Mi5udW1iZXIoKSxcbiAgICAgICAgICAgICAgICAgIHVybDogejIuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICB0aXRsZTogejIuc3RyaW5nKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5udWxsaXNoKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBpbmRleDogejIubnVtYmVyKCksXG4gICAgICAgICAgbG9ncHJvYnM6IHoyLm9iamVjdCh7XG4gICAgICAgICAgICBjb250ZW50OiB6Mi5hcnJheShcbiAgICAgICAgICAgICAgejIub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0b2tlbjogejIuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgbG9ncHJvYjogejIubnVtYmVyKCksXG4gICAgICAgICAgICAgICAgdG9wX2xvZ3Byb2JzOiB6Mi5hcnJheShcbiAgICAgICAgICAgICAgICAgIHoyLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuOiB6Mi5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgbG9ncHJvYjogejIubnVtYmVyKClcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5udWxsaXNoKClcbiAgICAgICAgICB9KS5udWxsaXNoKCksXG4gICAgICAgICAgZmluaXNoX3JlYXNvbjogejIuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgdXNhZ2U6IHoyLm9iamVjdCh7XG4gICAgICAgIHByb21wdF90b2tlbnM6IHoyLm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgY29tcGxldGlvbl90b2tlbnM6IHoyLm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgdG90YWxfdG9rZW5zOiB6Mi5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICAgIHByb21wdF90b2tlbnNfZGV0YWlsczogejIub2JqZWN0KHtcbiAgICAgICAgICBjYWNoZWRfdG9rZW5zOiB6Mi5udW1iZXIoKS5udWxsaXNoKClcbiAgICAgICAgfSkubnVsbGlzaCgpLFxuICAgICAgICBjb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzOiB6Mi5vYmplY3Qoe1xuICAgICAgICAgIHJlYXNvbmluZ190b2tlbnM6IHoyLm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgICBhY2NlcHRlZF9wcmVkaWN0aW9uX3Rva2VuczogejIubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgICAgIHJlamVjdGVkX3ByZWRpY3Rpb25fdG9rZW5zOiB6Mi5udW1iZXIoKS5udWxsaXNoKClcbiAgICAgICAgfSkubnVsbGlzaCgpXG4gICAgICB9KS5udWxsaXNoKClcbiAgICB9KVxuICApXG4pO1xudmFyIG9wZW5haUNoYXRDaHVua1NjaGVtYSA9IGxhenlTY2hlbWEoXG4gICgpID0+IHpvZFNjaGVtYShcbiAgICB6Mi51bmlvbihbXG4gICAgICB6Mi5vYmplY3Qoe1xuICAgICAgICBpZDogejIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICBjcmVhdGVkOiB6Mi5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICAgIG1vZGVsOiB6Mi5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgIGNob2ljZXM6IHoyLmFycmF5KFxuICAgICAgICAgIHoyLm9iamVjdCh7XG4gICAgICAgICAgICBkZWx0YTogejIub2JqZWN0KHtcbiAgICAgICAgICAgICAgcm9sZTogejIuZW51bShbXCJhc3Npc3RhbnRcIl0pLm51bGxpc2goKSxcbiAgICAgICAgICAgICAgY29udGVudDogejIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgICB0b29sX2NhbGxzOiB6Mi5hcnJheShcbiAgICAgICAgICAgICAgICB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgaW5kZXg6IHoyLm51bWJlcigpLFxuICAgICAgICAgICAgICAgICAgaWQ6IHoyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHoyLmxpdGVyYWwoXCJmdW5jdGlvblwiKS5udWxsaXNoKCksXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbjogejIub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogejIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHM6IHoyLnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApLm51bGxpc2goKSxcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHoyLmFycmF5KFxuICAgICAgICAgICAgICAgIHoyLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiB6Mi5saXRlcmFsKFwidXJsX2NpdGF0aW9uXCIpLFxuICAgICAgICAgICAgICAgICAgdXJsX2NpdGF0aW9uOiB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBzdGFydF9pbmRleDogejIubnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICAgIGVuZF9pbmRleDogejIubnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICAgIHVybDogejIuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB6Mi5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApLm51bGxpc2goKVxuICAgICAgICAgICAgfSkubnVsbGlzaCgpLFxuICAgICAgICAgICAgbG9ncHJvYnM6IHoyLm9iamVjdCh7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IHoyLmFycmF5KFxuICAgICAgICAgICAgICAgIHoyLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICB0b2tlbjogejIuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICBsb2dwcm9iOiB6Mi5udW1iZXIoKSxcbiAgICAgICAgICAgICAgICAgIHRvcF9sb2dwcm9iczogejIuYXJyYXkoXG4gICAgICAgICAgICAgICAgICAgIHoyLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgdG9rZW46IHoyLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgIGxvZ3Byb2I6IHoyLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKS5udWxsaXNoKClcbiAgICAgICAgICAgIH0pLm51bGxpc2goKSxcbiAgICAgICAgICAgIGZpbmlzaF9yZWFzb246IHoyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgIGluZGV4OiB6Mi5udW1iZXIoKVxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHVzYWdlOiB6Mi5vYmplY3Qoe1xuICAgICAgICAgIHByb21wdF90b2tlbnM6IHoyLm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgICBjb21wbGV0aW9uX3Rva2VuczogejIubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgICAgIHRvdGFsX3Rva2VuczogejIubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgICAgIHByb21wdF90b2tlbnNfZGV0YWlsczogejIub2JqZWN0KHtcbiAgICAgICAgICAgIGNhY2hlZF90b2tlbnM6IHoyLm51bWJlcigpLm51bGxpc2goKVxuICAgICAgICAgIH0pLm51bGxpc2goKSxcbiAgICAgICAgICBjb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzOiB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgcmVhc29uaW5nX3Rva2VuczogejIubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgYWNjZXB0ZWRfcHJlZGljdGlvbl90b2tlbnM6IHoyLm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgICAgIHJlamVjdGVkX3ByZWRpY3Rpb25fdG9rZW5zOiB6Mi5udW1iZXIoKS5udWxsaXNoKClcbiAgICAgICAgICB9KS5udWxsaXNoKClcbiAgICAgICAgfSkubnVsbGlzaCgpXG4gICAgICB9KSxcbiAgICAgIG9wZW5haUVycm9yRGF0YVNjaGVtYVxuICAgIF0pXG4gIClcbik7XG5cbi8vIHNyYy9jaGF0L29wZW5haS1jaGF0LW9wdGlvbnMudHNcbmltcG9ydCB7IGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTIsIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWEyIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejMgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgb3BlbmFpTGFuZ3VhZ2VNb2RlbENoYXRPcHRpb25zID0gbGF6eVNjaGVtYTIoXG4gICgpID0+IHpvZFNjaGVtYTIoXG4gICAgejMub2JqZWN0KHtcbiAgICAgIC8qKlxuICAgICAgICogTW9kaWZ5IHRoZSBsaWtlbGlob29kIG9mIHNwZWNpZmllZCB0b2tlbnMgYXBwZWFyaW5nIGluIHRoZSBjb21wbGV0aW9uLlxuICAgICAgICpcbiAgICAgICAqIEFjY2VwdHMgYSBKU09OIG9iamVjdCB0aGF0IG1hcHMgdG9rZW5zIChzcGVjaWZpZWQgYnkgdGhlaXIgdG9rZW4gSUQgaW5cbiAgICAgICAqIHRoZSBHUFQgdG9rZW5pemVyKSB0byBhbiBhc3NvY2lhdGVkIGJpYXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMC5cbiAgICAgICAqL1xuICAgICAgbG9naXRCaWFzOiB6My5yZWNvcmQoejMuY29lcmNlLm51bWJlcigpLCB6My5udW1iZXIoKSkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogUmV0dXJuIHRoZSBsb2cgcHJvYmFiaWxpdGllcyBvZiB0aGUgdG9rZW5zLlxuICAgICAgICpcbiAgICAgICAqIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIHJldHVybiB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb2YgdGhlIHRva2VucyB0aGF0XG4gICAgICAgKiB3ZXJlIGdlbmVyYXRlZC5cbiAgICAgICAqXG4gICAgICAgKiBTZXR0aW5nIHRvIGEgbnVtYmVyIHdpbGwgcmV0dXJuIHRoZSBsb2cgcHJvYmFiaWxpdGllcyBvZiB0aGUgdG9wIG5cbiAgICAgICAqIHRva2VucyB0aGF0IHdlcmUgZ2VuZXJhdGVkLlxuICAgICAgICovXG4gICAgICBsb2dwcm9iczogejMudW5pb24oW3ozLmJvb2xlYW4oKSwgejMubnVtYmVyKCldKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBwYXJhbGxlbCBmdW5jdGlvbiBjYWxsaW5nIGR1cmluZyB0b29sIHVzZS4gRGVmYXVsdCB0byB0cnVlLlxuICAgICAgICovXG4gICAgICBwYXJhbGxlbFRvb2xDYWxsczogejMuYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0b1xuICAgICAgICogbW9uaXRvciBhbmQgZGV0ZWN0IGFidXNlLlxuICAgICAgICovXG4gICAgICB1c2VyOiB6My5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBSZWFzb25pbmcgZWZmb3J0IGZvciByZWFzb25pbmcgbW9kZWxzLiBEZWZhdWx0cyB0byBgbWVkaXVtYC5cbiAgICAgICAqL1xuICAgICAgcmVhc29uaW5nRWZmb3J0OiB6My5lbnVtKFtcIm5vbmVcIiwgXCJtaW5pbWFsXCIsIFwibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiLCBcInhoaWdoXCJdKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBNYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyB0byBnZW5lcmF0ZS4gVXNlZnVsIGZvciByZWFzb25pbmcgbW9kZWxzLlxuICAgICAgICovXG4gICAgICBtYXhDb21wbGV0aW9uVG9rZW5zOiB6My5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBwZXJzaXN0ZW5jZSBpbiByZXNwb25zZXMgQVBJLlxuICAgICAgICovXG4gICAgICBzdG9yZTogejMuYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIE1ldGFkYXRhIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSByZXF1ZXN0LlxuICAgICAgICovXG4gICAgICBtZXRhZGF0YTogejMucmVjb3JkKHozLnN0cmluZygpLm1heCg2NCksIHozLnN0cmluZygpLm1heCg1MTIpKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBQYXJhbWV0ZXJzIGZvciBwcmVkaWN0aW9uIG1vZGUuXG4gICAgICAgKi9cbiAgICAgIHByZWRpY3Rpb246IHozLnJlY29yZCh6My5zdHJpbmcoKSwgejMuYW55KCkpLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIFNlcnZpY2UgdGllciBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICAgKiAtICdhdXRvJzogRGVmYXVsdCBzZXJ2aWNlIHRpZXIuIFRoZSByZXF1ZXN0IHdpbGwgYmUgcHJvY2Vzc2VkIHdpdGggdGhlIHNlcnZpY2UgdGllciBjb25maWd1cmVkIGluIHRoZVxuICAgICAgICogICAgICAgICAgIFByb2plY3Qgc2V0dGluZ3MuIFVubGVzcyBvdGhlcndpc2UgY29uZmlndXJlZCwgdGhlIFByb2plY3Qgd2lsbCB1c2UgJ2RlZmF1bHQnLlxuICAgICAgICogLSAnZmxleCc6IDUwJSBjaGVhcGVyIHByb2Nlc3NpbmcgYXQgdGhlIGNvc3Qgb2YgaW5jcmVhc2VkIGxhdGVuY3kuIE9ubHkgYXZhaWxhYmxlIGZvciBvMyBhbmQgbzQtbWluaSBtb2RlbHMuXG4gICAgICAgKiAtICdwcmlvcml0eSc6IEhpZ2hlci1zcGVlZCBwcm9jZXNzaW5nIHdpdGggcHJlZGljdGFibHkgbG93IGxhdGVuY3kgYXQgcHJlbWl1bSBjb3N0LiBBdmFpbGFibGUgZm9yIEVudGVycHJpc2UgY3VzdG9tZXJzLlxuICAgICAgICogLSAnZGVmYXVsdCc6IFRoZSByZXF1ZXN0IHdpbGwgYmUgcHJvY2Vzc2VkIHdpdGggdGhlIHN0YW5kYXJkIHByaWNpbmcgYW5kIHBlcmZvcm1hbmNlIGZvciB0aGUgc2VsZWN0ZWQgbW9kZWwuXG4gICAgICAgKlxuICAgICAgICogQGRlZmF1bHQgJ2F1dG8nXG4gICAgICAgKi9cbiAgICAgIHNlcnZpY2VUaWVyOiB6My5lbnVtKFtcImF1dG9cIiwgXCJmbGV4XCIsIFwicHJpb3JpdHlcIiwgXCJkZWZhdWx0XCJdKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBzdHJpY3QgSlNPTiBzY2hlbWEgdmFsaWRhdGlvbi5cbiAgICAgICAqXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHN0cmljdEpzb25TY2hlbWE6IHozLmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBDb250cm9scyB0aGUgdmVyYm9zaXR5IG9mIHRoZSBtb2RlbCdzIHJlc3BvbnNlcy5cbiAgICAgICAqIExvd2VyIHZhbHVlcyB3aWxsIHJlc3VsdCBpbiBtb3JlIGNvbmNpc2UgcmVzcG9uc2VzLCB3aGlsZSBoaWdoZXIgdmFsdWVzIHdpbGwgcmVzdWx0IGluIG1vcmUgdmVyYm9zZSByZXNwb25zZXMuXG4gICAgICAgKi9cbiAgICAgIHRleHRWZXJib3NpdHk6IHozLmVudW0oW1wibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiXSkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogQSBjYWNoZSBrZXkgZm9yIHByb21wdCBjYWNoaW5nLiBBbGxvd3MgbWFudWFsIGNvbnRyb2wgb3ZlciBwcm9tcHQgY2FjaGluZyBiZWhhdmlvci5cbiAgICAgICAqIFVzZWZ1bCBmb3IgaW1wcm92aW5nIGNhY2hlIGhpdCByYXRlcyBhbmQgd29ya2luZyBhcm91bmQgYXV0b21hdGljIGNhY2hpbmcgaXNzdWVzLlxuICAgICAgICovXG4gICAgICBwcm9tcHRDYWNoZUtleTogejMuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHJldGVudGlvbiBwb2xpY3kgZm9yIHRoZSBwcm9tcHQgY2FjaGUuXG4gICAgICAgKiAtICdpbl9tZW1vcnknOiBEZWZhdWx0LiBTdGFuZGFyZCBwcm9tcHQgY2FjaGluZyBiZWhhdmlvci5cbiAgICAgICAqIC0gJzI0aCc6IEV4dGVuZGVkIHByb21wdCBjYWNoaW5nIHRoYXQga2VlcHMgY2FjaGVkIHByZWZpeGVzIGFjdGl2ZSBmb3IgdXAgdG8gMjQgaG91cnMuXG4gICAgICAgKiAgICAgICAgICBDdXJyZW50bHkgb25seSBhdmFpbGFibGUgZm9yIDUuMSBzZXJpZXMgbW9kZWxzLlxuICAgICAgICpcbiAgICAgICAqIEBkZWZhdWx0ICdpbl9tZW1vcnknXG4gICAgICAgKi9cbiAgICAgIHByb21wdENhY2hlUmV0ZW50aW9uOiB6My5lbnVtKFtcImluX21lbW9yeVwiLCBcIjI0aFwiXSkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogQSBzdGFibGUgaWRlbnRpZmllciB1c2VkIHRvIGhlbHAgZGV0ZWN0IHVzZXJzIG9mIHlvdXIgYXBwbGljYXRpb25cbiAgICAgICAqIHRoYXQgbWF5IGJlIHZpb2xhdGluZyBPcGVuQUkncyB1c2FnZSBwb2xpY2llcy4gVGhlIElEcyBzaG91bGQgYmUgYVxuICAgICAgICogc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBlYWNoIHVzZXIuIFdlIHJlY29tbWVuZCBoYXNoaW5nIHRoZWlyXG4gICAgICAgKiB1c2VybmFtZSBvciBlbWFpbCBhZGRyZXNzLCBpbiBvcmRlciB0byBhdm9pZCBzZW5kaW5nIHVzIGFueSBpZGVudGlmeWluZ1xuICAgICAgICogaW5mb3JtYXRpb24uXG4gICAgICAgKi9cbiAgICAgIHNhZmV0eUlkZW50aWZpZXI6IHozLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIE92ZXJyaWRlIHRoZSBzeXN0ZW0gbWVzc2FnZSBtb2RlIGZvciB0aGlzIG1vZGVsLlxuICAgICAgICogLSAnc3lzdGVtJzogVXNlIHRoZSAnc3lzdGVtJyByb2xlIGZvciBzeXN0ZW0gbWVzc2FnZXMgKGRlZmF1bHQgZm9yIG1vc3QgbW9kZWxzKVxuICAgICAgICogLSAnZGV2ZWxvcGVyJzogVXNlIHRoZSAnZGV2ZWxvcGVyJyByb2xlIGZvciBzeXN0ZW0gbWVzc2FnZXMgKHVzZWQgYnkgcmVhc29uaW5nIG1vZGVscylcbiAgICAgICAqIC0gJ3JlbW92ZSc6IFJlbW92ZSBzeXN0ZW0gbWVzc2FnZXMgZW50aXJlbHlcbiAgICAgICAqXG4gICAgICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgbW9kZSBpcyBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYmFzZWQgb24gdGhlIG1vZGVsLlxuICAgICAgICovXG4gICAgICBzeXN0ZW1NZXNzYWdlTW9kZTogejMuZW51bShbXCJzeXN0ZW1cIiwgXCJkZXZlbG9wZXJcIiwgXCJyZW1vdmVcIl0pLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIEZvcmNlIHRyZWF0aW5nIHRoaXMgbW9kZWwgYXMgYSByZWFzb25pbmcgbW9kZWwuXG4gICAgICAgKlxuICAgICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIFwic3RlYWx0aFwiIHJlYXNvbmluZyBtb2RlbHMgKGUuZy4gdmlhIGEgY3VzdG9tIGJhc2VVUkwpXG4gICAgICAgKiB3aGVyZSB0aGUgbW9kZWwgSUQgaXMgbm90IHJlY29nbml6ZWQgYnkgdGhlIFNESydzIGFsbG93bGlzdC5cbiAgICAgICAqXG4gICAgICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBTREsgYXBwbGllcyByZWFzb25pbmctbW9kZWwgcGFyYW1ldGVyIGNvbXBhdGliaWxpdHkgcnVsZXNcbiAgICAgICAqIGFuZCBkZWZhdWx0cyBgc3lzdGVtTWVzc2FnZU1vZGVgIHRvIGBkZXZlbG9wZXJgIHVubGVzcyBvdmVycmlkZGVuLlxuICAgICAgICovXG4gICAgICBmb3JjZVJlYXNvbmluZzogejMuYm9vbGVhbigpLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG4pO1xuXG4vLyBzcmMvY2hhdC9vcGVuYWktY2hhdC1wcmVwYXJlLXRvb2xzLnRzXG5pbXBvcnQge1xuICBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvciBhcyBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvcjJcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmZ1bmN0aW9uIHByZXBhcmVDaGF0VG9vbHMoe1xuICB0b29scyxcbiAgdG9vbENob2ljZVxufSkge1xuICB0b29scyA9ICh0b29scyA9PSBudWxsID8gdm9pZCAwIDogdG9vbHMubGVuZ3RoKSA/IHRvb2xzIDogdm9pZCAwO1xuICBjb25zdCB0b29sV2FybmluZ3MgPSBbXTtcbiAgaWYgKHRvb2xzID09IG51bGwpIHtcbiAgICByZXR1cm4geyB0b29sczogdm9pZCAwLCB0b29sQ2hvaWNlOiB2b2lkIDAsIHRvb2xXYXJuaW5ncyB9O1xuICB9XG4gIGNvbnN0IG9wZW5haVRvb2xzMiA9IFtdO1xuICBmb3IgKGNvbnN0IHRvb2wgb2YgdG9vbHMpIHtcbiAgICBzd2l0Y2ggKHRvb2wudHlwZSkge1xuICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgZnVuY3Rpb246IHtcbiAgICAgICAgICAgIG5hbWU6IHRvb2wubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0b29sLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogdG9vbC5pbnB1dFNjaGVtYSxcbiAgICAgICAgICAgIC4uLnRvb2wuc3RyaWN0ICE9IG51bGwgPyB7IHN0cmljdDogdG9vbC5zdHJpY3QgfSA6IHt9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0b29sV2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLFxuICAgICAgICAgIGZlYXR1cmU6IGB0b29sIHR5cGU6ICR7dG9vbC50eXBlfWBcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAodG9vbENob2ljZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHsgdG9vbHM6IG9wZW5haVRvb2xzMiwgdG9vbENob2ljZTogdm9pZCAwLCB0b29sV2FybmluZ3MgfTtcbiAgfVxuICBjb25zdCB0eXBlID0gdG9vbENob2ljZS50eXBlO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiYXV0b1wiOlxuICAgIGNhc2UgXCJub25lXCI6XG4gICAgY2FzZSBcInJlcXVpcmVkXCI6XG4gICAgICByZXR1cm4geyB0b29sczogb3BlbmFpVG9vbHMyLCB0b29sQ2hvaWNlOiB0eXBlLCB0b29sV2FybmluZ3MgfTtcbiAgICBjYXNlIFwidG9vbFwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9vbHM6IG9wZW5haVRvb2xzMixcbiAgICAgICAgdG9vbENob2ljZToge1xuICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBmdW5jdGlvbjoge1xuICAgICAgICAgICAgbmFtZTogdG9vbENob2ljZS50b29sTmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdG9vbFdhcm5pbmdzXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IF9leGhhdXN0aXZlQ2hlY2sgPSB0eXBlO1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yMih7XG4gICAgICAgIGZ1bmN0aW9uYWxpdHk6IGB0b29sIGNob2ljZSB0eXBlOiAke19leGhhdXN0aXZlQ2hlY2t9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIHNyYy9jaGF0L29wZW5haS1jaGF0LWxhbmd1YWdlLW1vZGVsLnRzXG52YXIgT3BlbkFJQ2hhdExhbmd1YWdlTW9kZWwgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsSWQsIGNvbmZpZykge1xuICAgIHRoaXMuc3BlY2lmaWNhdGlvblZlcnNpb24gPSBcInYzXCI7XG4gICAgdGhpcy5zdXBwb3J0ZWRVcmxzID0ge1xuICAgICAgXCJpbWFnZS8qXCI6IFsvXmh0dHBzPzpcXC9cXC8uKiQvXVxuICAgIH07XG4gICAgdGhpcy5tb2RlbElkID0gbW9kZWxJZDtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgcHJvdmlkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb3ZpZGVyO1xuICB9XG4gIGFzeW5jIGdldEFyZ3Moe1xuICAgIHByb21wdCxcbiAgICBtYXhPdXRwdXRUb2tlbnMsXG4gICAgdGVtcGVyYXR1cmUsXG4gICAgdG9wUCxcbiAgICB0b3BLLFxuICAgIGZyZXF1ZW5jeVBlbmFsdHksXG4gICAgcHJlc2VuY2VQZW5hbHR5LFxuICAgIHN0b3BTZXF1ZW5jZXMsXG4gICAgcmVzcG9uc2VGb3JtYXQsXG4gICAgc2VlZCxcbiAgICB0b29scyxcbiAgICB0b29sQ2hvaWNlLFxuICAgIHByb3ZpZGVyT3B0aW9uc1xuICB9KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICAgIGNvbnN0IG9wZW5haU9wdGlvbnMgPSAoX2EgPSBhd2FpdCBwYXJzZVByb3ZpZGVyT3B0aW9ucyh7XG4gICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICAgIHNjaGVtYTogb3BlbmFpTGFuZ3VhZ2VNb2RlbENoYXRPcHRpb25zXG4gICAgfSkpICE9IG51bGwgPyBfYSA6IHt9O1xuICAgIGNvbnN0IG1vZGVsQ2FwYWJpbGl0aWVzID0gZ2V0T3BlbkFJTGFuZ3VhZ2VNb2RlbENhcGFiaWxpdGllcyh0aGlzLm1vZGVsSWQpO1xuICAgIGNvbnN0IGlzUmVhc29uaW5nTW9kZWwgPSAoX2IgPSBvcGVuYWlPcHRpb25zLmZvcmNlUmVhc29uaW5nKSAhPSBudWxsID8gX2IgOiBtb2RlbENhcGFiaWxpdGllcy5pc1JlYXNvbmluZ01vZGVsO1xuICAgIGlmICh0b3BLICE9IG51bGwpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goeyB0eXBlOiBcInVuc3VwcG9ydGVkXCIsIGZlYXR1cmU6IFwidG9wS1wiIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IG1lc3NhZ2VzLCB3YXJuaW5nczogbWVzc2FnZVdhcm5pbmdzIH0gPSBjb252ZXJ0VG9PcGVuQUlDaGF0TWVzc2FnZXMoXG4gICAgICB7XG4gICAgICAgIHByb21wdCxcbiAgICAgICAgc3lzdGVtTWVzc2FnZU1vZGU6IChfYyA9IG9wZW5haU9wdGlvbnMuc3lzdGVtTWVzc2FnZU1vZGUpICE9IG51bGwgPyBfYyA6IGlzUmVhc29uaW5nTW9kZWwgPyBcImRldmVsb3BlclwiIDogbW9kZWxDYXBhYmlsaXRpZXMuc3lzdGVtTWVzc2FnZU1vZGVcbiAgICAgIH1cbiAgICApO1xuICAgIHdhcm5pbmdzLnB1c2goLi4ubWVzc2FnZVdhcm5pbmdzKTtcbiAgICBjb25zdCBzdHJpY3RKc29uU2NoZW1hID0gKF9kID0gb3BlbmFpT3B0aW9ucy5zdHJpY3RKc29uU2NoZW1hKSAhPSBudWxsID8gX2QgOiB0cnVlO1xuICAgIGNvbnN0IGJhc2VBcmdzID0ge1xuICAgICAgLy8gbW9kZWwgaWQ6XG4gICAgICBtb2RlbDogdGhpcy5tb2RlbElkLFxuICAgICAgLy8gbW9kZWwgc3BlY2lmaWMgc2V0dGluZ3M6XG4gICAgICBsb2dpdF9iaWFzOiBvcGVuYWlPcHRpb25zLmxvZ2l0QmlhcyxcbiAgICAgIGxvZ3Byb2JzOiBvcGVuYWlPcHRpb25zLmxvZ3Byb2JzID09PSB0cnVlIHx8IHR5cGVvZiBvcGVuYWlPcHRpb25zLmxvZ3Byb2JzID09PSBcIm51bWJlclwiID8gdHJ1ZSA6IHZvaWQgMCxcbiAgICAgIHRvcF9sb2dwcm9iczogdHlwZW9mIG9wZW5haU9wdGlvbnMubG9ncHJvYnMgPT09IFwibnVtYmVyXCIgPyBvcGVuYWlPcHRpb25zLmxvZ3Byb2JzIDogdHlwZW9mIG9wZW5haU9wdGlvbnMubG9ncHJvYnMgPT09IFwiYm9vbGVhblwiID8gb3BlbmFpT3B0aW9ucy5sb2dwcm9icyA/IDAgOiB2b2lkIDAgOiB2b2lkIDAsXG4gICAgICB1c2VyOiBvcGVuYWlPcHRpb25zLnVzZXIsXG4gICAgICBwYXJhbGxlbF90b29sX2NhbGxzOiBvcGVuYWlPcHRpb25zLnBhcmFsbGVsVG9vbENhbGxzLFxuICAgICAgLy8gc3RhbmRhcmRpemVkIHNldHRpbmdzOlxuICAgICAgbWF4X3Rva2VuczogbWF4T3V0cHV0VG9rZW5zLFxuICAgICAgdGVtcGVyYXR1cmUsXG4gICAgICB0b3BfcDogdG9wUCxcbiAgICAgIGZyZXF1ZW5jeV9wZW5hbHR5OiBmcmVxdWVuY3lQZW5hbHR5LFxuICAgICAgcHJlc2VuY2VfcGVuYWx0eTogcHJlc2VuY2VQZW5hbHR5LFxuICAgICAgcmVzcG9uc2VfZm9ybWF0OiAocmVzcG9uc2VGb3JtYXQgPT0gbnVsbCA/IHZvaWQgMCA6IHJlc3BvbnNlRm9ybWF0LnR5cGUpID09PSBcImpzb25cIiA/IHJlc3BvbnNlRm9ybWF0LnNjaGVtYSAhPSBudWxsID8ge1xuICAgICAgICB0eXBlOiBcImpzb25fc2NoZW1hXCIsXG4gICAgICAgIGpzb25fc2NoZW1hOiB7XG4gICAgICAgICAgc2NoZW1hOiByZXNwb25zZUZvcm1hdC5zY2hlbWEsXG4gICAgICAgICAgc3RyaWN0OiBzdHJpY3RKc29uU2NoZW1hLFxuICAgICAgICAgIG5hbWU6IChfZSA9IHJlc3BvbnNlRm9ybWF0Lm5hbWUpICE9IG51bGwgPyBfZSA6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcmVzcG9uc2VGb3JtYXQuZGVzY3JpcHRpb25cbiAgICAgICAgfVxuICAgICAgfSA6IHsgdHlwZTogXCJqc29uX29iamVjdFwiIH0gOiB2b2lkIDAsXG4gICAgICBzdG9wOiBzdG9wU2VxdWVuY2VzLFxuICAgICAgc2VlZCxcbiAgICAgIHZlcmJvc2l0eTogb3BlbmFpT3B0aW9ucy50ZXh0VmVyYm9zaXR5LFxuICAgICAgLy8gb3BlbmFpIHNwZWNpZmljIHNldHRpbmdzOlxuICAgICAgLy8gVE9ETyBBSSBTREsgNjogcmVtb3ZlLCB3ZSBhdXRvLW1hcCBtYXhPdXRwdXRUb2tlbnMgbm93XG4gICAgICBtYXhfY29tcGxldGlvbl90b2tlbnM6IG9wZW5haU9wdGlvbnMubWF4Q29tcGxldGlvblRva2VucyxcbiAgICAgIHN0b3JlOiBvcGVuYWlPcHRpb25zLnN0b3JlLFxuICAgICAgbWV0YWRhdGE6IG9wZW5haU9wdGlvbnMubWV0YWRhdGEsXG4gICAgICBwcmVkaWN0aW9uOiBvcGVuYWlPcHRpb25zLnByZWRpY3Rpb24sXG4gICAgICByZWFzb25pbmdfZWZmb3J0OiBvcGVuYWlPcHRpb25zLnJlYXNvbmluZ0VmZm9ydCxcbiAgICAgIHNlcnZpY2VfdGllcjogb3BlbmFpT3B0aW9ucy5zZXJ2aWNlVGllcixcbiAgICAgIHByb21wdF9jYWNoZV9rZXk6IG9wZW5haU9wdGlvbnMucHJvbXB0Q2FjaGVLZXksXG4gICAgICBwcm9tcHRfY2FjaGVfcmV0ZW50aW9uOiBvcGVuYWlPcHRpb25zLnByb21wdENhY2hlUmV0ZW50aW9uLFxuICAgICAgc2FmZXR5X2lkZW50aWZpZXI6IG9wZW5haU9wdGlvbnMuc2FmZXR5SWRlbnRpZmllcixcbiAgICAgIC8vIG1lc3NhZ2VzOlxuICAgICAgbWVzc2FnZXNcbiAgICB9O1xuICAgIGlmIChpc1JlYXNvbmluZ01vZGVsKSB7XG4gICAgICBpZiAob3BlbmFpT3B0aW9ucy5yZWFzb25pbmdFZmZvcnQgIT09IFwibm9uZVwiIHx8ICFtb2RlbENhcGFiaWxpdGllcy5zdXBwb3J0c05vblJlYXNvbmluZ1BhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKGJhc2VBcmdzLnRlbXBlcmF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgICBiYXNlQXJncy50ZW1wZXJhdHVyZSA9IHZvaWQgMDtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICAgIGZlYXR1cmU6IFwidGVtcGVyYXR1cmVcIixcbiAgICAgICAgICAgIGRldGFpbHM6IFwidGVtcGVyYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBmb3IgcmVhc29uaW5nIG1vZGVsc1wiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2VBcmdzLnRvcF9wICE9IG51bGwpIHtcbiAgICAgICAgICBiYXNlQXJncy50b3BfcCA9IHZvaWQgMDtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICAgIGZlYXR1cmU6IFwidG9wUFwiLFxuICAgICAgICAgICAgZGV0YWlsczogXCJ0b3BQIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHJlYXNvbmluZyBtb2RlbHNcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlQXJncy5sb2dwcm9icyAhPSBudWxsKSB7XG4gICAgICAgICAgYmFzZUFyZ3MubG9ncHJvYnMgPSB2b2lkIDA7XG4gICAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBcImxvZ3Byb2JzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHJlYXNvbmluZyBtb2RlbHNcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYmFzZUFyZ3MuZnJlcXVlbmN5X3BlbmFsdHkgIT0gbnVsbCkge1xuICAgICAgICBiYXNlQXJncy5mcmVxdWVuY3lfcGVuYWx0eSA9IHZvaWQgMDtcbiAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLFxuICAgICAgICAgIGZlYXR1cmU6IFwiZnJlcXVlbmN5UGVuYWx0eVwiLFxuICAgICAgICAgIGRldGFpbHM6IFwiZnJlcXVlbmN5UGVuYWx0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciByZWFzb25pbmcgbW9kZWxzXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYmFzZUFyZ3MucHJlc2VuY2VfcGVuYWx0eSAhPSBudWxsKSB7XG4gICAgICAgIGJhc2VBcmdzLnByZXNlbmNlX3BlbmFsdHkgPSB2b2lkIDA7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICBmZWF0dXJlOiBcInByZXNlbmNlUGVuYWx0eVwiLFxuICAgICAgICAgIGRldGFpbHM6IFwicHJlc2VuY2VQZW5hbHR5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHJlYXNvbmluZyBtb2RlbHNcIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChiYXNlQXJncy5sb2dpdF9iaWFzICE9IG51bGwpIHtcbiAgICAgICAgYmFzZUFyZ3MubG9naXRfYmlhcyA9IHZvaWQgMDtcbiAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwibG9naXRCaWFzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHJlYXNvbmluZyBtb2RlbHNcIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChiYXNlQXJncy50b3BfbG9ncHJvYnMgIT0gbnVsbCkge1xuICAgICAgICBiYXNlQXJncy50b3BfbG9ncHJvYnMgPSB2b2lkIDA7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgICAgICBtZXNzYWdlOiBcInRvcExvZ3Byb2JzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHJlYXNvbmluZyBtb2RlbHNcIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChiYXNlQXJncy5tYXhfdG9rZW5zICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGJhc2VBcmdzLm1heF9jb21wbGV0aW9uX3Rva2VucyA9PSBudWxsKSB7XG4gICAgICAgICAgYmFzZUFyZ3MubWF4X2NvbXBsZXRpb25fdG9rZW5zID0gYmFzZUFyZ3MubWF4X3Rva2VucztcbiAgICAgICAgfVxuICAgICAgICBiYXNlQXJncy5tYXhfdG9rZW5zID0gdm9pZCAwO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlbElkLnN0YXJ0c1dpdGgoXCJncHQtNG8tc2VhcmNoLXByZXZpZXdcIikgfHwgdGhpcy5tb2RlbElkLnN0YXJ0c1dpdGgoXCJncHQtNG8tbWluaS1zZWFyY2gtcHJldmlld1wiKSkge1xuICAgICAgaWYgKGJhc2VBcmdzLnRlbXBlcmF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgYmFzZUFyZ3MudGVtcGVyYXR1cmUgPSB2b2lkIDA7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICBmZWF0dXJlOiBcInRlbXBlcmF0dXJlXCIsXG4gICAgICAgICAgZGV0YWlsczogXCJ0ZW1wZXJhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgc2VhcmNoIHByZXZpZXcgbW9kZWxzIGFuZCBoYXMgYmVlbiByZW1vdmVkLlwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3BlbmFpT3B0aW9ucy5zZXJ2aWNlVGllciA9PT0gXCJmbGV4XCIgJiYgIW1vZGVsQ2FwYWJpbGl0aWVzLnN1cHBvcnRzRmxleFByb2Nlc3NpbmcpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgIGZlYXR1cmU6IFwic2VydmljZVRpZXJcIixcbiAgICAgICAgZGV0YWlsczogXCJmbGV4IHByb2Nlc3NpbmcgaXMgb25seSBhdmFpbGFibGUgZm9yIG8zLCBvNC1taW5pLCBhbmQgZ3B0LTUgbW9kZWxzXCJcbiAgICAgIH0pO1xuICAgICAgYmFzZUFyZ3Muc2VydmljZV90aWVyID0gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAob3BlbmFpT3B0aW9ucy5zZXJ2aWNlVGllciA9PT0gXCJwcmlvcml0eVwiICYmICFtb2RlbENhcGFiaWxpdGllcy5zdXBwb3J0c1ByaW9yaXR5UHJvY2Vzc2luZykge1xuICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgZmVhdHVyZTogXCJzZXJ2aWNlVGllclwiLFxuICAgICAgICBkZXRhaWxzOiBcInByaW9yaXR5IHByb2Nlc3NpbmcgaXMgb25seSBhdmFpbGFibGUgZm9yIHN1cHBvcnRlZCBtb2RlbHMgKGdwdC00LCBncHQtNSwgZ3B0LTUtbWluaSwgbzMsIG80LW1pbmkpIGFuZCByZXF1aXJlcyBFbnRlcnByaXNlIGFjY2Vzcy4gZ3B0LTUtbmFubyBpcyBub3Qgc3VwcG9ydGVkXCJcbiAgICAgIH0pO1xuICAgICAgYmFzZUFyZ3Muc2VydmljZV90aWVyID0gdm9pZCAwO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICB0b29sczogb3BlbmFpVG9vbHMyLFxuICAgICAgdG9vbENob2ljZTogb3BlbmFpVG9vbENob2ljZSxcbiAgICAgIHRvb2xXYXJuaW5nc1xuICAgIH0gPSBwcmVwYXJlQ2hhdFRvb2xzKHtcbiAgICAgIHRvb2xzLFxuICAgICAgdG9vbENob2ljZVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBhcmdzOiB7XG4gICAgICAgIC4uLmJhc2VBcmdzLFxuICAgICAgICB0b29sczogb3BlbmFpVG9vbHMyLFxuICAgICAgICB0b29sX2Nob2ljZTogb3BlbmFpVG9vbENob2ljZVxuICAgICAgfSxcbiAgICAgIHdhcm5pbmdzOiBbLi4ud2FybmluZ3MsIC4uLnRvb2xXYXJuaW5nc11cbiAgICB9O1xuICB9XG4gIGFzeW5jIGRvR2VuZXJhdGUob3B0aW9ucykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICBjb25zdCB7IGFyZ3M6IGJvZHksIHdhcm5pbmdzIH0gPSBhd2FpdCB0aGlzLmdldEFyZ3Mob3B0aW9ucyk7XG4gICAgY29uc3Qge1xuICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgdmFsdWU6IHJlc3BvbnNlLFxuICAgICAgcmF3VmFsdWU6IHJhd1Jlc3BvbnNlXG4gICAgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGkoe1xuICAgICAgdXJsOiB0aGlzLmNvbmZpZy51cmwoe1xuICAgICAgICBwYXRoOiBcIi9jaGF0L2NvbXBsZXRpb25zXCIsXG4gICAgICAgIG1vZGVsSWQ6IHRoaXMubW9kZWxJZFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVycyh0aGlzLmNvbmZpZy5oZWFkZXJzKCksIG9wdGlvbnMuaGVhZGVycyksXG4gICAgICBib2R5LFxuICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBvcGVuYWlGYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyKFxuICAgICAgICBvcGVuYWlDaGF0UmVzcG9uc2VTY2hlbWFcbiAgICAgICksXG4gICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgIH0pO1xuICAgIGNvbnN0IGNob2ljZSA9IHJlc3BvbnNlLmNob2ljZXNbMF07XG4gICAgY29uc3QgY29udGVudCA9IFtdO1xuICAgIGNvbnN0IHRleHQgPSBjaG9pY2UubWVzc2FnZS5jb250ZW50O1xuICAgIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICBjb250ZW50LnB1c2goeyB0eXBlOiBcInRleHRcIiwgdGV4dCB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0b29sQ2FsbCBvZiAoX2EgPSBjaG9pY2UubWVzc2FnZS50b29sX2NhbGxzKSAhPSBudWxsID8gX2EgOiBbXSkge1xuICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgdG9vbENhbGxJZDogKF9iID0gdG9vbENhbGwuaWQpICE9IG51bGwgPyBfYiA6IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsLmZ1bmN0aW9uLm5hbWUsXG4gICAgICAgIGlucHV0OiB0b29sQ2FsbC5mdW5jdGlvbi5hcmd1bWVudHNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgKF9jID0gY2hvaWNlLm1lc3NhZ2UuYW5ub3RhdGlvbnMpICE9IG51bGwgPyBfYyA6IFtdKSB7XG4gICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICB0eXBlOiBcInNvdXJjZVwiLFxuICAgICAgICBzb3VyY2VUeXBlOiBcInVybFwiLFxuICAgICAgICBpZDogZ2VuZXJhdGVJZCgpLFxuICAgICAgICB1cmw6IGFubm90YXRpb24udXJsX2NpdGF0aW9uLnVybCxcbiAgICAgICAgdGl0bGU6IGFubm90YXRpb24udXJsX2NpdGF0aW9uLnRpdGxlXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgY29tcGxldGlvblRva2VuRGV0YWlscyA9IChfZCA9IHJlc3BvbnNlLnVzYWdlKSA9PSBudWxsID8gdm9pZCAwIDogX2QuY29tcGxldGlvbl90b2tlbnNfZGV0YWlscztcbiAgICBjb25zdCBwcm9tcHRUb2tlbkRldGFpbHMgPSAoX2UgPSByZXNwb25zZS51c2FnZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lLnByb21wdF90b2tlbnNfZGV0YWlscztcbiAgICBjb25zdCBwcm92aWRlck1ldGFkYXRhID0geyBvcGVuYWk6IHt9IH07XG4gICAgaWYgKChjb21wbGV0aW9uVG9rZW5EZXRhaWxzID09IG51bGwgPyB2b2lkIDAgOiBjb21wbGV0aW9uVG9rZW5EZXRhaWxzLmFjY2VwdGVkX3ByZWRpY3Rpb25fdG9rZW5zKSAhPSBudWxsKSB7XG4gICAgICBwcm92aWRlck1ldGFkYXRhLm9wZW5haS5hY2NlcHRlZFByZWRpY3Rpb25Ub2tlbnMgPSBjb21wbGV0aW9uVG9rZW5EZXRhaWxzID09IG51bGwgPyB2b2lkIDAgOiBjb21wbGV0aW9uVG9rZW5EZXRhaWxzLmFjY2VwdGVkX3ByZWRpY3Rpb25fdG9rZW5zO1xuICAgIH1cbiAgICBpZiAoKGNvbXBsZXRpb25Ub2tlbkRldGFpbHMgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbXBsZXRpb25Ub2tlbkRldGFpbHMucmVqZWN0ZWRfcHJlZGljdGlvbl90b2tlbnMpICE9IG51bGwpIHtcbiAgICAgIHByb3ZpZGVyTWV0YWRhdGEub3BlbmFpLnJlamVjdGVkUHJlZGljdGlvblRva2VucyA9IGNvbXBsZXRpb25Ub2tlbkRldGFpbHMgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbXBsZXRpb25Ub2tlbkRldGFpbHMucmVqZWN0ZWRfcHJlZGljdGlvbl90b2tlbnM7XG4gICAgfVxuICAgIGlmICgoKF9mID0gY2hvaWNlLmxvZ3Byb2JzKSA9PSBudWxsID8gdm9pZCAwIDogX2YuY29udGVudCkgIT0gbnVsbCkge1xuICAgICAgcHJvdmlkZXJNZXRhZGF0YS5vcGVuYWkubG9ncHJvYnMgPSBjaG9pY2UubG9ncHJvYnMuY29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBmaW5pc2hSZWFzb246IHtcbiAgICAgICAgdW5pZmllZDogbWFwT3BlbkFJRmluaXNoUmVhc29uKGNob2ljZS5maW5pc2hfcmVhc29uKSxcbiAgICAgICAgcmF3OiAoX2cgPSBjaG9pY2UuZmluaXNoX3JlYXNvbikgIT0gbnVsbCA/IF9nIDogdm9pZCAwXG4gICAgICB9LFxuICAgICAgdXNhZ2U6IGNvbnZlcnRPcGVuQUlDaGF0VXNhZ2UocmVzcG9uc2UudXNhZ2UpLFxuICAgICAgcmVxdWVzdDogeyBib2R5IH0sXG4gICAgICByZXNwb25zZToge1xuICAgICAgICAuLi5nZXRSZXNwb25zZU1ldGFkYXRhKHJlc3BvbnNlKSxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBib2R5OiByYXdSZXNwb25zZVxuICAgICAgfSxcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgcHJvdmlkZXJNZXRhZGF0YVxuICAgIH07XG4gIH1cbiAgYXN5bmMgZG9TdHJlYW0ob3B0aW9ucykge1xuICAgIGNvbnN0IHsgYXJncywgd2FybmluZ3MgfSA9IGF3YWl0IHRoaXMuZ2V0QXJncyhvcHRpb25zKTtcbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAgLi4uYXJncyxcbiAgICAgIHN0cmVhbTogdHJ1ZSxcbiAgICAgIHN0cmVhbV9vcHRpb25zOiB7XG4gICAgICAgIGluY2x1ZGVfdXNhZ2U6IHRydWVcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHsgcmVzcG9uc2VIZWFkZXJzLCB2YWx1ZTogcmVzcG9uc2UgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGkoe1xuICAgICAgdXJsOiB0aGlzLmNvbmZpZy51cmwoe1xuICAgICAgICBwYXRoOiBcIi9jaGF0L2NvbXBsZXRpb25zXCIsXG4gICAgICAgIG1vZGVsSWQ6IHRoaXMubW9kZWxJZFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVycyh0aGlzLmNvbmZpZy5oZWFkZXJzKCksIG9wdGlvbnMuaGVhZGVycyksXG4gICAgICBib2R5LFxuICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBvcGVuYWlGYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVFdmVudFNvdXJjZVJlc3BvbnNlSGFuZGxlcihcbiAgICAgICAgb3BlbmFpQ2hhdENodW5rU2NoZW1hXG4gICAgICApLFxuICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICB9KTtcbiAgICBjb25zdCB0b29sQ2FsbHMgPSBbXTtcbiAgICBsZXQgZmluaXNoUmVhc29uID0ge1xuICAgICAgdW5pZmllZDogXCJvdGhlclwiLFxuICAgICAgcmF3OiB2b2lkIDBcbiAgICB9O1xuICAgIGxldCB1c2FnZSA9IHZvaWQgMDtcbiAgICBsZXQgbWV0YWRhdGFFeHRyYWN0ZWQgPSBmYWxzZTtcbiAgICBsZXQgaXNBY3RpdmVUZXh0ID0gZmFsc2U7XG4gICAgY29uc3QgcHJvdmlkZXJNZXRhZGF0YSA9IHsgb3BlbmFpOiB7fSB9O1xuICAgIHJldHVybiB7XG4gICAgICBzdHJlYW06IHJlc3BvbnNlLnBpcGVUaHJvdWdoKFxuICAgICAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInN0cmVhbS1zdGFydFwiLCB3YXJuaW5ncyB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2ksIF9qLCBfaywgX2wsIF9tLCBfbiwgX28sIF9wLCBfcTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVSYXdDaHVua3MpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJyYXdcIiwgcmF3VmFsdWU6IGNodW5rLnJhd1ZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjaHVuay5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbiA9IHsgdW5pZmllZDogXCJlcnJvclwiLCByYXc6IHZvaWQgMCB9O1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcImVycm9yXCIsIGVycm9yOiBjaHVuay5lcnJvciB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVuay52YWx1ZTtcbiAgICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgZmluaXNoUmVhc29uID0geyB1bmlmaWVkOiBcImVycm9yXCIsIHJhdzogdm9pZCAwIH07XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwiZXJyb3JcIiwgZXJyb3I6IHZhbHVlLmVycm9yIH0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1ldGFkYXRhRXh0cmFjdGVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0UmVzcG9uc2VNZXRhZGF0YSh2YWx1ZSk7XG4gICAgICAgICAgICAgIGlmIChPYmplY3QudmFsdWVzKG1ldGFkYXRhKS5zb21lKEJvb2xlYW4pKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFFeHRyYWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInJlc3BvbnNlLW1ldGFkYXRhXCIsXG4gICAgICAgICAgICAgICAgICAuLi5nZXRSZXNwb25zZU1ldGFkYXRhKHZhbHVlKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUudXNhZ2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICB1c2FnZSA9IHZhbHVlLnVzYWdlO1xuICAgICAgICAgICAgICBpZiAoKChfYSA9IHZhbHVlLnVzYWdlLmNvbXBsZXRpb25fdG9rZW5zX2RldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfYS5hY2NlcHRlZF9wcmVkaWN0aW9uX3Rva2VucykgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGEub3BlbmFpLmFjY2VwdGVkUHJlZGljdGlvblRva2VucyA9IChfYiA9IHZhbHVlLnVzYWdlLmNvbXBsZXRpb25fdG9rZW5zX2RldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfYi5hY2NlcHRlZF9wcmVkaWN0aW9uX3Rva2VucztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoKChfYyA9IHZhbHVlLnVzYWdlLmNvbXBsZXRpb25fdG9rZW5zX2RldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfYy5yZWplY3RlZF9wcmVkaWN0aW9uX3Rva2VucykgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGEub3BlbmFpLnJlamVjdGVkUHJlZGljdGlvblRva2VucyA9IChfZCA9IHZhbHVlLnVzYWdlLmNvbXBsZXRpb25fdG9rZW5zX2RldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfZC5yZWplY3RlZF9wcmVkaWN0aW9uX3Rva2VucztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2hvaWNlID0gdmFsdWUuY2hvaWNlc1swXTtcbiAgICAgICAgICAgIGlmICgoY2hvaWNlID09IG51bGwgPyB2b2lkIDAgOiBjaG9pY2UuZmluaXNoX3JlYXNvbikgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmaW5pc2hSZWFzb24gPSB7XG4gICAgICAgICAgICAgICAgdW5pZmllZDogbWFwT3BlbkFJRmluaXNoUmVhc29uKGNob2ljZS5maW5pc2hfcmVhc29uKSxcbiAgICAgICAgICAgICAgICByYXc6IGNob2ljZS5maW5pc2hfcmVhc29uXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKChfZSA9IGNob2ljZSA9PSBudWxsID8gdm9pZCAwIDogY2hvaWNlLmxvZ3Byb2JzKSA9PSBudWxsID8gdm9pZCAwIDogX2UuY29udGVudCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhLm9wZW5haS5sb2dwcm9icyA9IGNob2ljZS5sb2dwcm9icy5jb250ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChjaG9pY2UgPT0gbnVsbCA/IHZvaWQgMCA6IGNob2ljZS5kZWx0YSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGNob2ljZS5kZWx0YTtcbiAgICAgICAgICAgIGlmIChkZWx0YS5jb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc0FjdGl2ZVRleHQpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInRleHQtc3RhcnRcIiwgaWQ6IFwiMFwiIH0pO1xuICAgICAgICAgICAgICAgIGlzQWN0aXZlVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICBpZDogXCIwXCIsXG4gICAgICAgICAgICAgICAgZGVsdGE6IGRlbHRhLmNvbnRlbnRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVsdGEudG9vbF9jYWxscyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgdG9vbENhbGxEZWx0YSBvZiBkZWx0YS50b29sX2NhbGxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0b29sQ2FsbERlbHRhLmluZGV4O1xuICAgICAgICAgICAgICAgIGlmICh0b29sQ2FsbHNbaW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0b29sQ2FsbERlbHRhLnR5cGUgIT0gbnVsbCAmJiB0b29sQ2FsbERlbHRhLnR5cGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlc3BvbnNlRGF0YUVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0b29sQ2FsbERlbHRhLFxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCAnZnVuY3Rpb24nIHR5cGUuYFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmICh0b29sQ2FsbERlbHRhLmlkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXNwb25zZURhdGFFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgZGF0YTogdG9vbENhbGxEZWx0YSxcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJ2lkJyB0byBiZSBhIHN0cmluZy5gXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKCgoX2YgPSB0b29sQ2FsbERlbHRhLmZ1bmN0aW9uKSA9PSBudWxsID8gdm9pZCAwIDogX2YubmFtZSkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlc3BvbnNlRGF0YUVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0b29sQ2FsbERlbHRhLFxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCAnZnVuY3Rpb24ubmFtZScgdG8gYmUgYSBzdHJpbmcuYFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1zdGFydFwiLFxuICAgICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGxEZWx0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsRGVsdGEuZnVuY3Rpb24ubmFtZVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbHNbaW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGxEZWx0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRvb2xDYWxsRGVsdGEuZnVuY3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHM6IChfZyA9IHRvb2xDYWxsRGVsdGEuZnVuY3Rpb24uYXJndW1lbnRzKSAhPSBudWxsID8gX2cgOiBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGhhc0ZpbmlzaGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xDYWxsMiA9IHRvb2xDYWxsc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICBpZiAoKChfaCA9IHRvb2xDYWxsMi5mdW5jdGlvbikgPT0gbnVsbCA/IHZvaWQgMCA6IF9oLm5hbWUpICE9IG51bGwgJiYgKChfaSA9IHRvb2xDYWxsMi5mdW5jdGlvbikgPT0gbnVsbCA/IHZvaWQgMCA6IF9pLmFyZ3VtZW50cykgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9vbENhbGwyLmZ1bmN0aW9uLmFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsMi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhOiB0b29sQ2FsbDIuZnVuY3Rpb24uYXJndW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFyc2FibGVKc29uKHRvb2xDYWxsMi5mdW5jdGlvbi5hcmd1bWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1lbmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbDIuaWRcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IChfaiA9IHRvb2xDYWxsMi5pZCkgIT0gbnVsbCA/IF9qIDogZ2VuZXJhdGVJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsMi5mdW5jdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHRvb2xDYWxsMi5mdW5jdGlvbi5hcmd1bWVudHNcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB0b29sQ2FsbDIuaGFzRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbENhbGwgPSB0b29sQ2FsbHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmICh0b29sQ2FsbC5oYXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgoKF9rID0gdG9vbENhbGxEZWx0YS5mdW5jdGlvbikgPT0gbnVsbCA/IHZvaWQgMCA6IF9rLmFyZ3VtZW50cykgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgdG9vbENhbGwuZnVuY3Rpb24uYXJndW1lbnRzICs9IChfbSA9IChfbCA9IHRvb2xDYWxsRGVsdGEuZnVuY3Rpb24pID09IG51bGwgPyB2b2lkIDAgOiBfbC5hcmd1bWVudHMpICE9IG51bGwgPyBfbSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC5pZCxcbiAgICAgICAgICAgICAgICAgIGRlbHRhOiAoX24gPSB0b29sQ2FsbERlbHRhLmZ1bmN0aW9uLmFyZ3VtZW50cykgIT0gbnVsbCA/IF9uIDogXCJcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICgoKF9vID0gdG9vbENhbGwuZnVuY3Rpb24pID09IG51bGwgPyB2b2lkIDAgOiBfby5uYW1lKSAhPSBudWxsICYmICgoX3AgPSB0b29sQ2FsbC5mdW5jdGlvbikgPT0gbnVsbCA/IHZvaWQgMCA6IF9wLmFyZ3VtZW50cykgIT0gbnVsbCAmJiBpc1BhcnNhYmxlSnNvbih0b29sQ2FsbC5mdW5jdGlvbi5hcmd1bWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZW5kXCIsXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC5pZFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiAoX3EgPSB0b29sQ2FsbC5pZCkgIT0gbnVsbCA/IF9xIDogZ2VuZXJhdGVJZCgpLFxuICAgICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbENhbGwuZnVuY3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHRvb2xDYWxsLmZ1bmN0aW9uLmFyZ3VtZW50c1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbC5oYXNGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVsdGEuYW5ub3RhdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgZGVsdGEuYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgICAgICAgIHNvdXJjZVR5cGU6IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgICBpZDogZ2VuZXJhdGVJZCgpLFxuICAgICAgICAgICAgICAgICAgdXJsOiBhbm5vdGF0aW9uLnVybF9jaXRhdGlvbi51cmwsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogYW5ub3RhdGlvbi51cmxfY2l0YXRpb24udGl0bGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgICAgICAgaWYgKGlzQWN0aXZlVGV4dCkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInRleHQtZW5kXCIsIGlkOiBcIjBcIiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiZmluaXNoXCIsXG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbixcbiAgICAgICAgICAgICAgdXNhZ2U6IGNvbnZlcnRPcGVuQUlDaGF0VXNhZ2UodXNhZ2UpLFxuICAgICAgICAgICAgICAuLi5wcm92aWRlck1ldGFkYXRhICE9IG51bGwgPyB7IHByb3ZpZGVyTWV0YWRhdGEgfSA6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgcmVxdWVzdDogeyBib2R5IH0sXG4gICAgICByZXNwb25zZTogeyBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMgfVxuICAgIH07XG4gIH1cbn07XG5cbi8vIHNyYy9jb21wbGV0aW9uL29wZW5haS1jb21wbGV0aW9uLWxhbmd1YWdlLW1vZGVsLnRzXG5pbXBvcnQge1xuICBjb21iaW5lSGVhZGVycyBhcyBjb21iaW5lSGVhZGVyczIsXG4gIGNyZWF0ZUV2ZW50U291cmNlUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUV2ZW50U291cmNlUmVzcG9uc2VIYW5kbGVyMixcbiAgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyMixcbiAgcGFyc2VQcm92aWRlck9wdGlvbnMgYXMgcGFyc2VQcm92aWRlck9wdGlvbnMyLFxuICBwb3N0SnNvblRvQXBpIGFzIHBvc3RKc29uVG9BcGkyXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5cbi8vIHNyYy9jb21wbGV0aW9uL2NvbnZlcnQtb3BlbmFpLWNvbXBsZXRpb24tdXNhZ2UudHNcbmZ1bmN0aW9uIGNvbnZlcnRPcGVuQUlDb21wbGV0aW9uVXNhZ2UodXNhZ2UpIHtcbiAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICBpZiAodXNhZ2UgPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dFRva2Vuczoge1xuICAgICAgICB0b3RhbDogdm9pZCAwLFxuICAgICAgICBub0NhY2hlOiB2b2lkIDAsXG4gICAgICAgIGNhY2hlUmVhZDogdm9pZCAwLFxuICAgICAgICBjYWNoZVdyaXRlOiB2b2lkIDBcbiAgICAgIH0sXG4gICAgICBvdXRwdXRUb2tlbnM6IHtcbiAgICAgICAgdG90YWw6IHZvaWQgMCxcbiAgICAgICAgdGV4dDogdm9pZCAwLFxuICAgICAgICByZWFzb25pbmc6IHZvaWQgMFxuICAgICAgfSxcbiAgICAgIHJhdzogdm9pZCAwXG4gICAgfTtcbiAgfVxuICBjb25zdCBwcm9tcHRUb2tlbnMgPSAoX2EgPSB1c2FnZS5wcm9tcHRfdG9rZW5zKSAhPSBudWxsID8gX2EgOiAwO1xuICBjb25zdCBjb21wbGV0aW9uVG9rZW5zID0gKF9iID0gdXNhZ2UuY29tcGxldGlvbl90b2tlbnMpICE9IG51bGwgPyBfYiA6IDA7XG4gIHJldHVybiB7XG4gICAgaW5wdXRUb2tlbnM6IHtcbiAgICAgIHRvdGFsOiAoX2MgPSB1c2FnZS5wcm9tcHRfdG9rZW5zKSAhPSBudWxsID8gX2MgOiB2b2lkIDAsXG4gICAgICBub0NhY2hlOiBwcm9tcHRUb2tlbnMsXG4gICAgICBjYWNoZVJlYWQ6IHZvaWQgMCxcbiAgICAgIGNhY2hlV3JpdGU6IHZvaWQgMFxuICAgIH0sXG4gICAgb3V0cHV0VG9rZW5zOiB7XG4gICAgICB0b3RhbDogKF9kID0gdXNhZ2UuY29tcGxldGlvbl90b2tlbnMpICE9IG51bGwgPyBfZCA6IHZvaWQgMCxcbiAgICAgIHRleHQ6IGNvbXBsZXRpb25Ub2tlbnMsXG4gICAgICByZWFzb25pbmc6IHZvaWQgMFxuICAgIH0sXG4gICAgcmF3OiB1c2FnZVxuICB9O1xufVxuXG4vLyBzcmMvY29tcGxldGlvbi9jb252ZXJ0LXRvLW9wZW5haS1jb21wbGV0aW9uLXByb21wdC50c1xuaW1wb3J0IHtcbiAgSW52YWxpZFByb21wdEVycm9yLFxuICBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvciBhcyBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvcjNcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmZ1bmN0aW9uIGNvbnZlcnRUb09wZW5BSUNvbXBsZXRpb25Qcm9tcHQoe1xuICBwcm9tcHQsXG4gIHVzZXIgPSBcInVzZXJcIixcbiAgYXNzaXN0YW50ID0gXCJhc3Npc3RhbnRcIlxufSkge1xuICBsZXQgdGV4dCA9IFwiXCI7XG4gIGlmIChwcm9tcHRbMF0ucm9sZSA9PT0gXCJzeXN0ZW1cIikge1xuICAgIHRleHQgKz0gYCR7cHJvbXB0WzBdLmNvbnRlbnR9XG5cbmA7XG4gICAgcHJvbXB0ID0gcHJvbXB0LnNsaWNlKDEpO1xuICB9XG4gIGZvciAoY29uc3QgeyByb2xlLCBjb250ZW50IH0gb2YgcHJvbXB0KSB7XG4gICAgc3dpdGNoIChyb2xlKSB7XG4gICAgICBjYXNlIFwic3lzdGVtXCI6IHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm9tcHRFcnJvcih7XG4gICAgICAgICAgbWVzc2FnZTogXCJVbmV4cGVjdGVkIHN5c3RlbSBtZXNzYWdlIGluIHByb21wdDogJHtjb250ZW50fVwiLFxuICAgICAgICAgIHByb21wdFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ1c2VyXCI6IHtcbiAgICAgICAgY29uc3QgdXNlck1lc3NhZ2UgPSBjb250ZW50Lm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJ0LnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbikuam9pbihcIlwiKTtcbiAgICAgICAgdGV4dCArPSBgJHt1c2VyfTpcbiR7dXNlck1lc3NhZ2V9XG5cbmA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFzc2lzdGFudFwiOiB7XG4gICAgICAgIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2UgPSBjb250ZW50Lm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJ0LnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidG9vbC1jYWxsXCI6IHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yMyh7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25hbGl0eTogXCJ0b29sLWNhbGwgbWVzc2FnZXNcIlxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pLmpvaW4oXCJcIik7XG4gICAgICAgIHRleHQgKz0gYCR7YXNzaXN0YW50fTpcbiR7YXNzaXN0YW50TWVzc2FnZX1cblxuYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidG9vbFwiOiB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvcjMoe1xuICAgICAgICAgIGZ1bmN0aW9uYWxpdHk6IFwidG9vbCBtZXNzYWdlc1wiXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gcm9sZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCByb2xlOiAke19leGhhdXN0aXZlQ2hlY2t9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHRleHQgKz0gYCR7YXNzaXN0YW50fTpcbmA7XG4gIHJldHVybiB7XG4gICAgcHJvbXB0OiB0ZXh0LFxuICAgIHN0b3BTZXF1ZW5jZXM6IFtgXG4ke3VzZXJ9OmBdXG4gIH07XG59XG5cbi8vIHNyYy9jb21wbGV0aW9uL2dldC1yZXNwb25zZS1tZXRhZGF0YS50c1xuZnVuY3Rpb24gZ2V0UmVzcG9uc2VNZXRhZGF0YTIoe1xuICBpZCxcbiAgbW9kZWwsXG4gIGNyZWF0ZWRcbn0pIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogaWQgIT0gbnVsbCA/IGlkIDogdm9pZCAwLFxuICAgIG1vZGVsSWQ6IG1vZGVsICE9IG51bGwgPyBtb2RlbCA6IHZvaWQgMCxcbiAgICB0aW1lc3RhbXA6IGNyZWF0ZWQgIT0gbnVsbCA/IG5ldyBEYXRlKGNyZWF0ZWQgKiAxZTMpIDogdm9pZCAwXG4gIH07XG59XG5cbi8vIHNyYy9jb21wbGV0aW9uL21hcC1vcGVuYWktZmluaXNoLXJlYXNvbi50c1xuZnVuY3Rpb24gbWFwT3BlbkFJRmluaXNoUmVhc29uMihmaW5pc2hSZWFzb24pIHtcbiAgc3dpdGNoIChmaW5pc2hSZWFzb24pIHtcbiAgICBjYXNlIFwic3RvcFwiOlxuICAgICAgcmV0dXJuIFwic3RvcFwiO1xuICAgIGNhc2UgXCJsZW5ndGhcIjpcbiAgICAgIHJldHVybiBcImxlbmd0aFwiO1xuICAgIGNhc2UgXCJjb250ZW50X2ZpbHRlclwiOlxuICAgICAgcmV0dXJuIFwiY29udGVudC1maWx0ZXJcIjtcbiAgICBjYXNlIFwiZnVuY3Rpb25fY2FsbFwiOlxuICAgIGNhc2UgXCJ0b29sX2NhbGxzXCI6XG4gICAgICByZXR1cm4gXCJ0b29sLWNhbGxzXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcIm90aGVyXCI7XG4gIH1cbn1cblxuLy8gc3JjL2NvbXBsZXRpb24vb3BlbmFpLWNvbXBsZXRpb24tYXBpLnRzXG5pbXBvcnQgeyB6IGFzIHo0IH0gZnJvbSBcInpvZC92NFwiO1xuaW1wb3J0IHsgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMywgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTMgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xudmFyIG9wZW5haUNvbXBsZXRpb25SZXNwb25zZVNjaGVtYSA9IGxhenlTY2hlbWEzKFxuICAoKSA9PiB6b2RTY2hlbWEzKFxuICAgIHo0Lm9iamVjdCh7XG4gICAgICBpZDogejQuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgY3JlYXRlZDogejQubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgbW9kZWw6IHo0LnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIGNob2ljZXM6IHo0LmFycmF5KFxuICAgICAgICB6NC5vYmplY3Qoe1xuICAgICAgICAgIHRleHQ6IHo0LnN0cmluZygpLFxuICAgICAgICAgIGZpbmlzaF9yZWFzb246IHo0LnN0cmluZygpLFxuICAgICAgICAgIGxvZ3Byb2JzOiB6NC5vYmplY3Qoe1xuICAgICAgICAgICAgdG9rZW5zOiB6NC5hcnJheSh6NC5zdHJpbmcoKSksXG4gICAgICAgICAgICB0b2tlbl9sb2dwcm9iczogejQuYXJyYXkoejQubnVtYmVyKCkpLFxuICAgICAgICAgICAgdG9wX2xvZ3Byb2JzOiB6NC5hcnJheSh6NC5yZWNvcmQoejQuc3RyaW5nKCksIHo0Lm51bWJlcigpKSkubnVsbGlzaCgpXG4gICAgICAgICAgfSkubnVsbGlzaCgpXG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgdXNhZ2U6IHo0Lm9iamVjdCh7XG4gICAgICAgIHByb21wdF90b2tlbnM6IHo0Lm51bWJlcigpLFxuICAgICAgICBjb21wbGV0aW9uX3Rva2VuczogejQubnVtYmVyKCksXG4gICAgICAgIHRvdGFsX3Rva2VuczogejQubnVtYmVyKClcbiAgICAgIH0pLm51bGxpc2goKVxuICAgIH0pXG4gIClcbik7XG52YXIgb3BlbmFpQ29tcGxldGlvbkNodW5rU2NoZW1hID0gbGF6eVNjaGVtYTMoXG4gICgpID0+IHpvZFNjaGVtYTMoXG4gICAgejQudW5pb24oW1xuICAgICAgejQub2JqZWN0KHtcbiAgICAgICAgaWQ6IHo0LnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgY3JlYXRlZDogejQubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgICBtb2RlbDogejQuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICBjaG9pY2VzOiB6NC5hcnJheShcbiAgICAgICAgICB6NC5vYmplY3Qoe1xuICAgICAgICAgICAgdGV4dDogejQuc3RyaW5nKCksXG4gICAgICAgICAgICBmaW5pc2hfcmVhc29uOiB6NC5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgICAgICBpbmRleDogejQubnVtYmVyKCksXG4gICAgICAgICAgICBsb2dwcm9iczogejQub2JqZWN0KHtcbiAgICAgICAgICAgICAgdG9rZW5zOiB6NC5hcnJheSh6NC5zdHJpbmcoKSksXG4gICAgICAgICAgICAgIHRva2VuX2xvZ3Byb2JzOiB6NC5hcnJheSh6NC5udW1iZXIoKSksXG4gICAgICAgICAgICAgIHRvcF9sb2dwcm9iczogejQuYXJyYXkoejQucmVjb3JkKHo0LnN0cmluZygpLCB6NC5udW1iZXIoKSkpLm51bGxpc2goKVxuICAgICAgICAgICAgfSkubnVsbGlzaCgpXG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgdXNhZ2U6IHo0Lm9iamVjdCh7XG4gICAgICAgICAgcHJvbXB0X3Rva2VuczogejQubnVtYmVyKCksXG4gICAgICAgICAgY29tcGxldGlvbl90b2tlbnM6IHo0Lm51bWJlcigpLFxuICAgICAgICAgIHRvdGFsX3Rva2VuczogejQubnVtYmVyKClcbiAgICAgICAgfSkubnVsbGlzaCgpXG4gICAgICB9KSxcbiAgICAgIG9wZW5haUVycm9yRGF0YVNjaGVtYVxuICAgIF0pXG4gIClcbik7XG5cbi8vIHNyYy9jb21wbGV0aW9uL29wZW5haS1jb21wbGV0aW9uLW9wdGlvbnMudHNcbmltcG9ydCB7IGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTQsIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWE0IH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejUgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgb3BlbmFpTGFuZ3VhZ2VNb2RlbENvbXBsZXRpb25PcHRpb25zID0gbGF6eVNjaGVtYTQoXG4gICgpID0+IHpvZFNjaGVtYTQoXG4gICAgejUub2JqZWN0KHtcbiAgICAgIC8qKlxuICAgICAgICogRWNobyBiYWNrIHRoZSBwcm9tcHQgaW4gYWRkaXRpb24gdG8gdGhlIGNvbXBsZXRpb24uXG4gICAgICAgKi9cbiAgICAgIGVjaG86IHo1LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBNb2RpZnkgdGhlIGxpa2VsaWhvb2Qgb2Ygc3BlY2lmaWVkIHRva2VucyBhcHBlYXJpbmcgaW4gdGhlIGNvbXBsZXRpb24uXG4gICAgICAgKlxuICAgICAgICogQWNjZXB0cyBhIEpTT04gb2JqZWN0IHRoYXQgbWFwcyB0b2tlbnMgKHNwZWNpZmllZCBieSB0aGVpciB0b2tlbiBJRCBpblxuICAgICAgICogdGhlIEdQVCB0b2tlbml6ZXIpIHRvIGFuIGFzc29jaWF0ZWQgYmlhcyB2YWx1ZSBmcm9tIC0xMDAgdG8gMTAwLiBZb3VcbiAgICAgICAqIGNhbiB1c2UgdGhpcyB0b2tlbml6ZXIgdG9vbCB0byBjb252ZXJ0IHRleHQgdG8gdG9rZW4gSURzLiBNYXRoZW1hdGljYWxseSxcbiAgICAgICAqIHRoZSBiaWFzIGlzIGFkZGVkIHRvIHRoZSBsb2dpdHMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBwcmlvciB0byBzYW1wbGluZy5cbiAgICAgICAqIFRoZSBleGFjdCBlZmZlY3Qgd2lsbCB2YXJ5IHBlciBtb2RlbCwgYnV0IHZhbHVlcyBiZXR3ZWVuIC0xIGFuZCAxIHNob3VsZFxuICAgICAgICogZGVjcmVhc2Ugb3IgaW5jcmVhc2UgbGlrZWxpaG9vZCBvZiBzZWxlY3Rpb247IHZhbHVlcyBsaWtlIC0xMDAgb3IgMTAwXG4gICAgICAgKiBzaG91bGQgcmVzdWx0IGluIGEgYmFuIG9yIGV4Y2x1c2l2ZSBzZWxlY3Rpb24gb2YgdGhlIHJlbGV2YW50IHRva2VuLlxuICAgICAgICpcbiAgICAgICAqIEFzIGFuIGV4YW1wbGUsIHlvdSBjYW4gcGFzcyB7XCI1MDI1NlwiOiAtMTAwfSB0byBwcmV2ZW50IHRoZSA8fGVuZG9mdGV4dHw+XG4gICAgICAgKiB0b2tlbiBmcm9tIGJlaW5nIGdlbmVyYXRlZC5cbiAgICAgICAqL1xuICAgICAgbG9naXRCaWFzOiB6NS5yZWNvcmQoejUuc3RyaW5nKCksIHo1Lm51bWJlcigpKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgc3VmZml4IHRoYXQgY29tZXMgYWZ0ZXIgYSBjb21wbGV0aW9uIG9mIGluc2VydGVkIHRleHQuXG4gICAgICAgKi9cbiAgICAgIHN1ZmZpeDogejUuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogQSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgeW91ciBlbmQtdXNlciwgd2hpY2ggY2FuIGhlbHAgT3BlbkFJIHRvXG4gICAgICAgKiBtb25pdG9yIGFuZCBkZXRlY3QgYWJ1c2UuIExlYXJuIG1vcmUuXG4gICAgICAgKi9cbiAgICAgIHVzZXI6IHo1LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIFJldHVybiB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb2YgdGhlIHRva2Vucy4gSW5jbHVkaW5nIGxvZ3Byb2JzIHdpbGwgaW5jcmVhc2VcbiAgICAgICAqIHRoZSByZXNwb25zZSBzaXplIGFuZCBjYW4gc2xvdyBkb3duIHJlc3BvbnNlIHRpbWVzLiBIb3dldmVyLCBpdCBjYW5cbiAgICAgICAqIGJlIHVzZWZ1bCB0byBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgdGhlIG1vZGVsIGlzIGJlaGF2aW5nLlxuICAgICAgICogU2V0dGluZyB0byB0cnVlIHdpbGwgcmV0dXJuIHRoZSBsb2cgcHJvYmFiaWxpdGllcyBvZiB0aGUgdG9rZW5zIHRoYXRcbiAgICAgICAqIHdlcmUgZ2VuZXJhdGVkLlxuICAgICAgICogU2V0dGluZyB0byBhIG51bWJlciB3aWxsIHJldHVybiB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb2YgdGhlIHRvcCBuXG4gICAgICAgKiB0b2tlbnMgdGhhdCB3ZXJlIGdlbmVyYXRlZC5cbiAgICAgICAqL1xuICAgICAgbG9ncHJvYnM6IHo1LnVuaW9uKFt6NS5ib29sZWFuKCksIHo1Lm51bWJlcigpXSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG5cbi8vIHNyYy9jb21wbGV0aW9uL29wZW5haS1jb21wbGV0aW9uLWxhbmd1YWdlLW1vZGVsLnRzXG52YXIgT3BlbkFJQ29tcGxldGlvbkxhbmd1YWdlTW9kZWwgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsSWQsIGNvbmZpZykge1xuICAgIHRoaXMuc3BlY2lmaWNhdGlvblZlcnNpb24gPSBcInYzXCI7XG4gICAgdGhpcy5zdXBwb3J0ZWRVcmxzID0ge1xuICAgICAgLy8gTm8gVVJMcyBhcmUgc3VwcG9ydGVkIGZvciBjb21wbGV0aW9uIG1vZGVscy5cbiAgICB9O1xuICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQ7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cbiAgZ2V0IHByb3ZpZGVyT3B0aW9uc05hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb3ZpZGVyLnNwbGl0KFwiLlwiKVswXS50cmltKCk7XG4gIH1cbiAgZ2V0IHByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm92aWRlcjtcbiAgfVxuICBhc3luYyBnZXRBcmdzKHtcbiAgICBwcm9tcHQsXG4gICAgbWF4T3V0cHV0VG9rZW5zLFxuICAgIHRlbXBlcmF0dXJlLFxuICAgIHRvcFAsXG4gICAgdG9wSyxcbiAgICBmcmVxdWVuY3lQZW5hbHR5LFxuICAgIHByZXNlbmNlUGVuYWx0eSxcbiAgICBzdG9wU2VxdWVuY2VzOiB1c2VyU3RvcFNlcXVlbmNlcyxcbiAgICByZXNwb25zZUZvcm1hdCxcbiAgICB0b29scyxcbiAgICB0b29sQ2hvaWNlLFxuICAgIHNlZWQsXG4gICAgcHJvdmlkZXJPcHRpb25zXG4gIH0pIHtcbiAgICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICAgIGNvbnN0IG9wZW5haU9wdGlvbnMgPSB7XG4gICAgICAuLi5hd2FpdCBwYXJzZVByb3ZpZGVyT3B0aW9uczIoe1xuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgcHJvdmlkZXJPcHRpb25zLFxuICAgICAgICBzY2hlbWE6IG9wZW5haUxhbmd1YWdlTW9kZWxDb21wbGV0aW9uT3B0aW9uc1xuICAgICAgfSksXG4gICAgICAuLi5hd2FpdCBwYXJzZVByb3ZpZGVyT3B0aW9uczIoe1xuICAgICAgICBwcm92aWRlcjogdGhpcy5wcm92aWRlck9wdGlvbnNOYW1lLFxuICAgICAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgICAgIHNjaGVtYTogb3BlbmFpTGFuZ3VhZ2VNb2RlbENvbXBsZXRpb25PcHRpb25zXG4gICAgICB9KVxuICAgIH07XG4gICAgaWYgKHRvcEsgIT0gbnVsbCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7IHR5cGU6IFwidW5zdXBwb3J0ZWRcIiwgZmVhdHVyZTogXCJ0b3BLXCIgfSk7XG4gICAgfVxuICAgIGlmICh0b29scyA9PSBudWxsID8gdm9pZCAwIDogdG9vbHMubGVuZ3RoKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHsgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLCBmZWF0dXJlOiBcInRvb2xzXCIgfSk7XG4gICAgfVxuICAgIGlmICh0b29sQ2hvaWNlICE9IG51bGwpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goeyB0eXBlOiBcInVuc3VwcG9ydGVkXCIsIGZlYXR1cmU6IFwidG9vbENob2ljZVwiIH0pO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2VGb3JtYXQgIT0gbnVsbCAmJiByZXNwb25zZUZvcm1hdC50eXBlICE9PSBcInRleHRcIikge1xuICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgZmVhdHVyZTogXCJyZXNwb25zZUZvcm1hdFwiLFxuICAgICAgICBkZXRhaWxzOiBcIkpTT04gcmVzcG9uc2UgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21wdDogY29tcGxldGlvblByb21wdCwgc3RvcFNlcXVlbmNlcyB9ID0gY29udmVydFRvT3BlbkFJQ29tcGxldGlvblByb21wdCh7IHByb21wdCB9KTtcbiAgICBjb25zdCBzdG9wID0gWy4uLnN0b3BTZXF1ZW5jZXMgIT0gbnVsbCA/IHN0b3BTZXF1ZW5jZXMgOiBbXSwgLi4udXNlclN0b3BTZXF1ZW5jZXMgIT0gbnVsbCA/IHVzZXJTdG9wU2VxdWVuY2VzIDogW11dO1xuICAgIHJldHVybiB7XG4gICAgICBhcmdzOiB7XG4gICAgICAgIC8vIG1vZGVsIGlkOlxuICAgICAgICBtb2RlbDogdGhpcy5tb2RlbElkLFxuICAgICAgICAvLyBtb2RlbCBzcGVjaWZpYyBzZXR0aW5nczpcbiAgICAgICAgZWNobzogb3BlbmFpT3B0aW9ucy5lY2hvLFxuICAgICAgICBsb2dpdF9iaWFzOiBvcGVuYWlPcHRpb25zLmxvZ2l0QmlhcyxcbiAgICAgICAgbG9ncHJvYnM6IChvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLmxvZ3Byb2JzKSA9PT0gdHJ1ZSA/IDAgOiAob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5sb2dwcm9icykgPT09IGZhbHNlID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5sb2dwcm9icyxcbiAgICAgICAgc3VmZml4OiBvcGVuYWlPcHRpb25zLnN1ZmZpeCxcbiAgICAgICAgdXNlcjogb3BlbmFpT3B0aW9ucy51c2VyLFxuICAgICAgICAvLyBzdGFuZGFyZGl6ZWQgc2V0dGluZ3M6XG4gICAgICAgIG1heF90b2tlbnM6IG1heE91dHB1dFRva2VucyxcbiAgICAgICAgdGVtcGVyYXR1cmUsXG4gICAgICAgIHRvcF9wOiB0b3BQLFxuICAgICAgICBmcmVxdWVuY3lfcGVuYWx0eTogZnJlcXVlbmN5UGVuYWx0eSxcbiAgICAgICAgcHJlc2VuY2VfcGVuYWx0eTogcHJlc2VuY2VQZW5hbHR5LFxuICAgICAgICBzZWVkLFxuICAgICAgICAvLyBwcm9tcHQ6XG4gICAgICAgIHByb21wdDogY29tcGxldGlvblByb21wdCxcbiAgICAgICAgLy8gc3RvcCBzZXF1ZW5jZXM6XG4gICAgICAgIHN0b3A6IHN0b3AubGVuZ3RoID4gMCA/IHN0b3AgOiB2b2lkIDBcbiAgICAgIH0sXG4gICAgICB3YXJuaW5nc1xuICAgIH07XG4gIH1cbiAgYXN5bmMgZG9HZW5lcmF0ZShvcHRpb25zKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHsgYXJncywgd2FybmluZ3MgfSA9IGF3YWl0IHRoaXMuZ2V0QXJncyhvcHRpb25zKTtcbiAgICBjb25zdCB7XG4gICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICB2YWx1ZTogcmVzcG9uc2UsXG4gICAgICByYXdWYWx1ZTogcmF3UmVzcG9uc2VcbiAgICB9ID0gYXdhaXQgcG9zdEpzb25Ub0FwaTIoe1xuICAgICAgdXJsOiB0aGlzLmNvbmZpZy51cmwoe1xuICAgICAgICBwYXRoOiBcIi9jb21wbGV0aW9uc1wiLFxuICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWRcbiAgICAgIH0pLFxuICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnMyKHRoaXMuY29uZmlnLmhlYWRlcnMoKSwgb3B0aW9ucy5oZWFkZXJzKSxcbiAgICAgIGJvZHk6IGFyZ3MsXG4gICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IG9wZW5haUZhaWxlZFJlc3BvbnNlSGFuZGxlcixcbiAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIyKFxuICAgICAgICBvcGVuYWlDb21wbGV0aW9uUmVzcG9uc2VTY2hlbWFcbiAgICAgICksXG4gICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgIH0pO1xuICAgIGNvbnN0IGNob2ljZSA9IHJlc3BvbnNlLmNob2ljZXNbMF07XG4gICAgY29uc3QgcHJvdmlkZXJNZXRhZGF0YSA9IHsgb3BlbmFpOiB7fSB9O1xuICAgIGlmIChjaG9pY2UubG9ncHJvYnMgIT0gbnVsbCkge1xuICAgICAgcHJvdmlkZXJNZXRhZGF0YS5vcGVuYWkubG9ncHJvYnMgPSBjaG9pY2UubG9ncHJvYnM7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogY2hvaWNlLnRleHQgfV0sXG4gICAgICB1c2FnZTogY29udmVydE9wZW5BSUNvbXBsZXRpb25Vc2FnZShyZXNwb25zZS51c2FnZSksXG4gICAgICBmaW5pc2hSZWFzb246IHtcbiAgICAgICAgdW5pZmllZDogbWFwT3BlbkFJRmluaXNoUmVhc29uMihjaG9pY2UuZmluaXNoX3JlYXNvbiksXG4gICAgICAgIHJhdzogKF9hID0gY2hvaWNlLmZpbmlzaF9yZWFzb24pICE9IG51bGwgPyBfYSA6IHZvaWQgMFxuICAgICAgfSxcbiAgICAgIHJlcXVlc3Q6IHsgYm9keTogYXJncyB9LFxuICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgLi4uZ2V0UmVzcG9uc2VNZXRhZGF0YTIocmVzcG9uc2UpLFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHJhd1Jlc3BvbnNlXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXJNZXRhZGF0YSxcbiAgICAgIHdhcm5pbmdzXG4gICAgfTtcbiAgfVxuICBhc3luYyBkb1N0cmVhbShvcHRpb25zKSB7XG4gICAgY29uc3QgeyBhcmdzLCB3YXJuaW5ncyB9ID0gYXdhaXQgdGhpcy5nZXRBcmdzKG9wdGlvbnMpO1xuICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAuLi5hcmdzLFxuICAgICAgc3RyZWFtOiB0cnVlLFxuICAgICAgc3RyZWFtX29wdGlvbnM6IHtcbiAgICAgICAgaW5jbHVkZV91c2FnZTogdHJ1ZVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgeyByZXNwb25zZUhlYWRlcnMsIHZhbHVlOiByZXNwb25zZSB9ID0gYXdhaXQgcG9zdEpzb25Ub0FwaTIoe1xuICAgICAgdXJsOiB0aGlzLmNvbmZpZy51cmwoe1xuICAgICAgICBwYXRoOiBcIi9jb21wbGV0aW9uc1wiLFxuICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWRcbiAgICAgIH0pLFxuICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnMyKHRoaXMuY29uZmlnLmhlYWRlcnMoKSwgb3B0aW9ucy5oZWFkZXJzKSxcbiAgICAgIGJvZHksXG4gICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IG9wZW5haUZhaWxlZFJlc3BvbnNlSGFuZGxlcixcbiAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUV2ZW50U291cmNlUmVzcG9uc2VIYW5kbGVyMihcbiAgICAgICAgb3BlbmFpQ29tcGxldGlvbkNodW5rU2NoZW1hXG4gICAgICApLFxuICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICB9KTtcbiAgICBsZXQgZmluaXNoUmVhc29uID0ge1xuICAgICAgdW5pZmllZDogXCJvdGhlclwiLFxuICAgICAgcmF3OiB2b2lkIDBcbiAgICB9O1xuICAgIGNvbnN0IHByb3ZpZGVyTWV0YWRhdGEgPSB7IG9wZW5haToge30gfTtcbiAgICBsZXQgdXNhZ2UgPSB2b2lkIDA7XG4gICAgbGV0IGlzRmlyc3RDaHVuayA9IHRydWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVhbTogcmVzcG9uc2UucGlwZVRocm91Z2goXG4gICAgICAgIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICAgIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwic3RyZWFtLXN0YXJ0XCIsIHdhcm5pbmdzIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlUmF3Q2h1bmtzKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwicmF3XCIsIHJhd1ZhbHVlOiBjaHVuay5yYXdWYWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2h1bmsuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBmaW5pc2hSZWFzb24gPSB7IHVuaWZpZWQ6IFwiZXJyb3JcIiwgcmF3OiB2b2lkIDAgfTtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJlcnJvclwiLCBlcnJvcjogY2h1bmsuZXJyb3IgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2h1bmsudmFsdWU7XG4gICAgICAgICAgICBpZiAoXCJlcnJvclwiIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbiA9IHsgdW5pZmllZDogXCJlcnJvclwiLCByYXc6IHZvaWQgMCB9O1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcImVycm9yXCIsIGVycm9yOiB2YWx1ZS5lcnJvciB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRmlyc3RDaHVuaykge1xuICAgICAgICAgICAgICBpc0ZpcnN0Q2h1bmsgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInJlc3BvbnNlLW1ldGFkYXRhXCIsXG4gICAgICAgICAgICAgICAgLi4uZ2V0UmVzcG9uc2VNZXRhZGF0YTIodmFsdWUpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInRleHQtc3RhcnRcIiwgaWQ6IFwiMFwiIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlLnVzYWdlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdXNhZ2UgPSB2YWx1ZS51c2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNob2ljZSA9IHZhbHVlLmNob2ljZXNbMF07XG4gICAgICAgICAgICBpZiAoKGNob2ljZSA9PSBudWxsID8gdm9pZCAwIDogY2hvaWNlLmZpbmlzaF9yZWFzb24pICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgZmluaXNoUmVhc29uID0ge1xuICAgICAgICAgICAgICAgIHVuaWZpZWQ6IG1hcE9wZW5BSUZpbmlzaFJlYXNvbjIoY2hvaWNlLmZpbmlzaF9yZWFzb24pLFxuICAgICAgICAgICAgICAgIHJhdzogY2hvaWNlLmZpbmlzaF9yZWFzb25cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoY2hvaWNlID09IG51bGwgPyB2b2lkIDAgOiBjaG9pY2UubG9ncHJvYnMpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YS5vcGVuYWkubG9ncHJvYnMgPSBjaG9pY2UubG9ncHJvYnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGNob2ljZSA9PSBudWxsID8gdm9pZCAwIDogY2hvaWNlLnRleHQpICE9IG51bGwgJiYgY2hvaWNlLnRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgIGlkOiBcIjBcIixcbiAgICAgICAgICAgICAgICBkZWx0YTogY2hvaWNlLnRleHRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBpZiAoIWlzRmlyc3RDaHVuaykge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInRleHQtZW5kXCIsIGlkOiBcIjBcIiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiZmluaXNoXCIsXG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbixcbiAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YSxcbiAgICAgICAgICAgICAgdXNhZ2U6IGNvbnZlcnRPcGVuQUlDb21wbGV0aW9uVXNhZ2UodXNhZ2UpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgcmVxdWVzdDogeyBib2R5IH0sXG4gICAgICByZXNwb25zZTogeyBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMgfVxuICAgIH07XG4gIH1cbn07XG5cbi8vIHNyYy9lbWJlZGRpbmcvb3BlbmFpLWVtYmVkZGluZy1tb2RlbC50c1xuaW1wb3J0IHtcbiAgVG9vTWFueUVtYmVkZGluZ1ZhbHVlc0ZvckNhbGxFcnJvclxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xuaW1wb3J0IHtcbiAgY29tYmluZUhlYWRlcnMgYXMgY29tYmluZUhlYWRlcnMzLFxuICBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIzLFxuICBwYXJzZVByb3ZpZGVyT3B0aW9ucyBhcyBwYXJzZVByb3ZpZGVyT3B0aW9uczMsXG4gIHBvc3RKc29uVG9BcGkgYXMgcG9zdEpzb25Ub0FwaTNcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL2VtYmVkZGluZy9vcGVuYWktZW1iZWRkaW5nLW9wdGlvbnMudHNcbmltcG9ydCB7IGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTUsIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWE1IH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejYgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgb3BlbmFpRW1iZWRkaW5nTW9kZWxPcHRpb25zID0gbGF6eVNjaGVtYTUoXG4gICgpID0+IHpvZFNjaGVtYTUoXG4gICAgejYub2JqZWN0KHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHRoZSByZXN1bHRpbmcgb3V0cHV0IGVtYmVkZGluZ3Mgc2hvdWxkIGhhdmUuXG4gICAgICAgKiBPbmx5IHN1cHBvcnRlZCBpbiB0ZXh0LWVtYmVkZGluZy0zIGFuZCBsYXRlciBtb2RlbHMuXG4gICAgICAgKi9cbiAgICAgIGRpbWVuc2lvbnM6IHo2Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0b1xuICAgICAgICogbW9uaXRvciBhbmQgZGV0ZWN0IGFidXNlLiBMZWFybiBtb3JlLlxuICAgICAgICovXG4gICAgICB1c2VyOiB6Ni5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgfSlcbiAgKVxuKTtcblxuLy8gc3JjL2VtYmVkZGluZy9vcGVuYWktZW1iZWRkaW5nLWFwaS50c1xuaW1wb3J0IHsgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hNiwgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTYgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6NyB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBvcGVuYWlUZXh0RW1iZWRkaW5nUmVzcG9uc2VTY2hlbWEgPSBsYXp5U2NoZW1hNihcbiAgKCkgPT4gem9kU2NoZW1hNihcbiAgICB6Ny5vYmplY3Qoe1xuICAgICAgZGF0YTogejcuYXJyYXkoejcub2JqZWN0KHsgZW1iZWRkaW5nOiB6Ny5hcnJheSh6Ny5udW1iZXIoKSkgfSkpLFxuICAgICAgdXNhZ2U6IHo3Lm9iamVjdCh7IHByb21wdF90b2tlbnM6IHo3Lm51bWJlcigpIH0pLm51bGxpc2goKVxuICAgIH0pXG4gIClcbik7XG5cbi8vIHNyYy9lbWJlZGRpbmcvb3BlbmFpLWVtYmVkZGluZy1tb2RlbC50c1xudmFyIE9wZW5BSUVtYmVkZGluZ01vZGVsID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihtb2RlbElkLCBjb25maWcpIHtcbiAgICB0aGlzLnNwZWNpZmljYXRpb25WZXJzaW9uID0gXCJ2M1wiO1xuICAgIHRoaXMubWF4RW1iZWRkaW5nc1BlckNhbGwgPSAyMDQ4O1xuICAgIHRoaXMuc3VwcG9ydHNQYXJhbGxlbENhbGxzID0gdHJ1ZTtcbiAgICB0aGlzLm1vZGVsSWQgPSBtb2RlbElkO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG4gIGdldCBwcm92aWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucHJvdmlkZXI7XG4gIH1cbiAgYXN5bmMgZG9FbWJlZCh7XG4gICAgdmFsdWVzLFxuICAgIGhlYWRlcnMsXG4gICAgYWJvcnRTaWduYWwsXG4gICAgcHJvdmlkZXJPcHRpb25zXG4gIH0pIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPiB0aGlzLm1heEVtYmVkZGluZ3NQZXJDYWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vTWFueUVtYmVkZGluZ1ZhbHVlc0ZvckNhbGxFcnJvcih7XG4gICAgICAgIHByb3ZpZGVyOiB0aGlzLnByb3ZpZGVyLFxuICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWQsXG4gICAgICAgIG1heEVtYmVkZGluZ3NQZXJDYWxsOiB0aGlzLm1heEVtYmVkZGluZ3NQZXJDYWxsLFxuICAgICAgICB2YWx1ZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBvcGVuYWlPcHRpb25zID0gKF9hID0gYXdhaXQgcGFyc2VQcm92aWRlck9wdGlvbnMzKHtcbiAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgcHJvdmlkZXJPcHRpb25zLFxuICAgICAgc2NoZW1hOiBvcGVuYWlFbWJlZGRpbmdNb2RlbE9wdGlvbnNcbiAgICB9KSkgIT0gbnVsbCA/IF9hIDoge307XG4gICAgY29uc3Qge1xuICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgdmFsdWU6IHJlc3BvbnNlLFxuICAgICAgcmF3VmFsdWVcbiAgICB9ID0gYXdhaXQgcG9zdEpzb25Ub0FwaTMoe1xuICAgICAgdXJsOiB0aGlzLmNvbmZpZy51cmwoe1xuICAgICAgICBwYXRoOiBcIi9lbWJlZGRpbmdzXCIsXG4gICAgICAgIG1vZGVsSWQ6IHRoaXMubW9kZWxJZFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVyczModGhpcy5jb25maWcuaGVhZGVycygpLCBoZWFkZXJzKSxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgbW9kZWw6IHRoaXMubW9kZWxJZCxcbiAgICAgICAgaW5wdXQ6IHZhbHVlcyxcbiAgICAgICAgZW5jb2RpbmdfZm9ybWF0OiBcImZsb2F0XCIsXG4gICAgICAgIGRpbWVuc2lvbnM6IG9wZW5haU9wdGlvbnMuZGltZW5zaW9ucyxcbiAgICAgICAgdXNlcjogb3BlbmFpT3B0aW9ucy51c2VyXG4gICAgICB9LFxuICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBvcGVuYWlGYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyMyhcbiAgICAgICAgb3BlbmFpVGV4dEVtYmVkZGluZ1Jlc3BvbnNlU2NoZW1hXG4gICAgICApLFxuICAgICAgYWJvcnRTaWduYWwsXG4gICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgd2FybmluZ3M6IFtdLFxuICAgICAgZW1iZWRkaW5nczogcmVzcG9uc2UuZGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW0uZW1iZWRkaW5nKSxcbiAgICAgIHVzYWdlOiByZXNwb25zZS51c2FnZSA/IHsgdG9rZW5zOiByZXNwb25zZS51c2FnZS5wcm9tcHRfdG9rZW5zIH0gOiB2b2lkIDAsXG4gICAgICByZXNwb25zZTogeyBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsIGJvZHk6IHJhd1ZhbHVlIH1cbiAgICB9O1xuICB9XG59O1xuXG4vLyBzcmMvaW1hZ2Uvb3BlbmFpLWltYWdlLW1vZGVsLnRzXG5pbXBvcnQge1xuICBjb21iaW5lSGVhZGVycyBhcyBjb21iaW5lSGVhZGVyczQsXG4gIGNvbnZlcnRCYXNlNjRUb1VpbnQ4QXJyYXksXG4gIGNvbnZlcnRUb0Zvcm1EYXRhLFxuICBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXI0LFxuICBkb3dubG9hZEJsb2IsXG4gIHBvc3RGb3JtRGF0YVRvQXBpLFxuICBwb3N0SnNvblRvQXBpIGFzIHBvc3RKc29uVG9BcGk0XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5cbi8vIHNyYy9pbWFnZS9vcGVuYWktaW1hZ2UtYXBpLnRzXG5pbXBvcnQgeyBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWE3LCB6b2RTY2hlbWEgYXMgem9kU2NoZW1hNyB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHo4IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIG9wZW5haUltYWdlUmVzcG9uc2VTY2hlbWEgPSBsYXp5U2NoZW1hNyhcbiAgKCkgPT4gem9kU2NoZW1hNyhcbiAgICB6OC5vYmplY3Qoe1xuICAgICAgY3JlYXRlZDogejgubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgZGF0YTogejguYXJyYXkoXG4gICAgICAgIHo4Lm9iamVjdCh7XG4gICAgICAgICAgYjY0X2pzb246IHo4LnN0cmluZygpLFxuICAgICAgICAgIHJldmlzZWRfcHJvbXB0OiB6OC5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICBiYWNrZ3JvdW5kOiB6OC5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICBvdXRwdXRfZm9ybWF0OiB6OC5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICBzaXplOiB6OC5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICBxdWFsaXR5OiB6OC5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICB1c2FnZTogejgub2JqZWN0KHtcbiAgICAgICAgaW5wdXRfdG9rZW5zOiB6OC5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICAgIG91dHB1dF90b2tlbnM6IHo4Lm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgdG90YWxfdG9rZW5zOiB6OC5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICAgIGlucHV0X3Rva2Vuc19kZXRhaWxzOiB6OC5vYmplY3Qoe1xuICAgICAgICAgIGltYWdlX3Rva2VuczogejgubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgICAgIHRleHRfdG9rZW5zOiB6OC5udW1iZXIoKS5udWxsaXNoKClcbiAgICAgICAgfSkubnVsbGlzaCgpXG4gICAgICB9KS5udWxsaXNoKClcbiAgICB9KVxuICApXG4pO1xuXG4vLyBzcmMvaW1hZ2Uvb3BlbmFpLWltYWdlLW9wdGlvbnMudHNcbnZhciBtb2RlbE1heEltYWdlc1BlckNhbGwgPSB7XG4gIFwiZGFsbC1lLTNcIjogMSxcbiAgXCJkYWxsLWUtMlwiOiAxMCxcbiAgXCJncHQtaW1hZ2UtMVwiOiAxMCxcbiAgXCJncHQtaW1hZ2UtMS1taW5pXCI6IDEwLFxuICBcImdwdC1pbWFnZS0xLjVcIjogMTAsXG4gIFwiY2hhdGdwdC1pbWFnZS1sYXRlc3RcIjogMTBcbn07XG52YXIgZGVmYXVsdFJlc3BvbnNlRm9ybWF0UHJlZml4ZXMgPSBbXG4gIFwiY2hhdGdwdC1pbWFnZS1cIixcbiAgXCJncHQtaW1hZ2UtMS1taW5pXCIsXG4gIFwiZ3B0LWltYWdlLTEuNVwiLFxuICBcImdwdC1pbWFnZS0xXCJcbl07XG5mdW5jdGlvbiBoYXNEZWZhdWx0UmVzcG9uc2VGb3JtYXQobW9kZWxJZCkge1xuICByZXR1cm4gZGVmYXVsdFJlc3BvbnNlRm9ybWF0UHJlZml4ZXMuc29tZShcbiAgICAocHJlZml4KSA9PiBtb2RlbElkLnN0YXJ0c1dpdGgocHJlZml4KVxuICApO1xufVxuXG4vLyBzcmMvaW1hZ2Uvb3BlbmFpLWltYWdlLW1vZGVsLnRzXG52YXIgT3BlbkFJSW1hZ2VNb2RlbCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IobW9kZWxJZCwgY29uZmlnKSB7XG4gICAgdGhpcy5tb2RlbElkID0gbW9kZWxJZDtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNwZWNpZmljYXRpb25WZXJzaW9uID0gXCJ2M1wiO1xuICB9XG4gIGdldCBtYXhJbWFnZXNQZXJDYWxsKCkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKF9hID0gbW9kZWxNYXhJbWFnZXNQZXJDYWxsW3RoaXMubW9kZWxJZF0pICE9IG51bGwgPyBfYSA6IDE7XG4gIH1cbiAgZ2V0IHByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm92aWRlcjtcbiAgfVxuICBhc3luYyBkb0dlbmVyYXRlKHtcbiAgICBwcm9tcHQsXG4gICAgZmlsZXMsXG4gICAgbWFzayxcbiAgICBuLFxuICAgIHNpemUsXG4gICAgYXNwZWN0UmF0aW8sXG4gICAgc2VlZCxcbiAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgaGVhZGVycyxcbiAgICBhYm9ydFNpZ25hbFxuICB9KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2ksIF9qLCBfaztcbiAgICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICAgIGlmIChhc3BlY3RSYXRpbyAhPSBudWxsKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLFxuICAgICAgICBmZWF0dXJlOiBcImFzcGVjdFJhdGlvXCIsXG4gICAgICAgIGRldGFpbHM6IFwiVGhpcyBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IGFzcGVjdCByYXRpby4gVXNlIGBzaXplYCBpbnN0ZWFkLlwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNlZWQgIT0gbnVsbCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7IHR5cGU6IFwidW5zdXBwb3J0ZWRcIiwgZmVhdHVyZTogXCJzZWVkXCIgfSk7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gKF9jID0gKF9iID0gKF9hID0gdGhpcy5jb25maWcuX2ludGVybmFsKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY3VycmVudERhdGUpID09IG51bGwgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKSkgIT0gbnVsbCA/IF9jIDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG4gICAgaWYgKGZpbGVzICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWU6IHJlc3BvbnNlMiwgcmVzcG9uc2VIZWFkZXJzOiByZXNwb25zZUhlYWRlcnMyIH0gPSBhd2FpdCBwb3N0Rm9ybURhdGFUb0FwaSh7XG4gICAgICAgIHVybDogdGhpcy5jb25maWcudXJsKHtcbiAgICAgICAgICBwYXRoOiBcIi9pbWFnZXMvZWRpdHNcIixcbiAgICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWRcbiAgICAgICAgfSksXG4gICAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzNCh0aGlzLmNvbmZpZy5oZWFkZXJzKCksIGhlYWRlcnMpLFxuICAgICAgICBmb3JtRGF0YTogY29udmVydFRvRm9ybURhdGEoe1xuICAgICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsSWQsXG4gICAgICAgICAgcHJvbXB0LFxuICAgICAgICAgIGltYWdlOiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGZpbGVzLm1hcChcbiAgICAgICAgICAgICAgKGZpbGUpID0+IGZpbGUudHlwZSA9PT0gXCJmaWxlXCIgPyBuZXcgQmxvYihcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICBmaWxlLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gbmV3IEJsb2IoW2ZpbGUuZGF0YV0sIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogZmlsZS5tZWRpYVR5cGVcbiAgICAgICAgICAgICAgICAgIH0pIDogbmV3IEJsb2IoW2NvbnZlcnRCYXNlNjRUb1VpbnQ4QXJyYXkoZmlsZS5kYXRhKV0sIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogZmlsZS5tZWRpYVR5cGVcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB7IHR5cGU6IGZpbGUubWVkaWFUeXBlIH1cbiAgICAgICAgICAgICAgKSA6IGRvd25sb2FkQmxvYihmaWxlLnVybClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLFxuICAgICAgICAgIG1hc2s6IG1hc2sgIT0gbnVsbCA/IGF3YWl0IGZpbGVUb0Jsb2IobWFzaykgOiB2b2lkIDAsXG4gICAgICAgICAgbixcbiAgICAgICAgICBzaXplLFxuICAgICAgICAgIC4uLihfZCA9IHByb3ZpZGVyT3B0aW9ucy5vcGVuYWkpICE9IG51bGwgPyBfZCA6IHt9XG4gICAgICAgIH0pLFxuICAgICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IG9wZW5haUZhaWxlZFJlc3BvbnNlSGFuZGxlcixcbiAgICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjQoXG4gICAgICAgICAgb3BlbmFpSW1hZ2VSZXNwb25zZVNjaGVtYVxuICAgICAgICApLFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGltYWdlczogcmVzcG9uc2UyLmRhdGEubWFwKChpdGVtKSA9PiBpdGVtLmI2NF9qc29uKSxcbiAgICAgICAgd2FybmluZ3MsXG4gICAgICAgIHVzYWdlOiByZXNwb25zZTIudXNhZ2UgIT0gbnVsbCA/IHtcbiAgICAgICAgICBpbnB1dFRva2VuczogKF9lID0gcmVzcG9uc2UyLnVzYWdlLmlucHV0X3Rva2VucykgIT0gbnVsbCA/IF9lIDogdm9pZCAwLFxuICAgICAgICAgIG91dHB1dFRva2VuczogKF9mID0gcmVzcG9uc2UyLnVzYWdlLm91dHB1dF90b2tlbnMpICE9IG51bGwgPyBfZiA6IHZvaWQgMCxcbiAgICAgICAgICB0b3RhbFRva2VuczogKF9nID0gcmVzcG9uc2UyLnVzYWdlLnRvdGFsX3Rva2VucykgIT0gbnVsbCA/IF9nIDogdm9pZCAwXG4gICAgICAgIH0gOiB2b2lkIDAsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgdGltZXN0YW1wOiBjdXJyZW50RGF0ZSxcbiAgICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWQsXG4gICAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzMlxuICAgICAgICB9LFxuICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgb3BlbmFpOiB7XG4gICAgICAgICAgICBpbWFnZXM6IHJlc3BvbnNlMi5kYXRhLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgdmFyIF9hMiwgX2IyLCBfYzIsIF9kMiwgX2UyLCBfZjI7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uaXRlbS5yZXZpc2VkX3Byb21wdCA/IHsgcmV2aXNlZFByb21wdDogaXRlbS5yZXZpc2VkX3Byb21wdCB9IDoge30sXG4gICAgICAgICAgICAgICAgY3JlYXRlZDogKF9hMiA9IHJlc3BvbnNlMi5jcmVhdGVkKSAhPSBudWxsID8gX2EyIDogdm9pZCAwLFxuICAgICAgICAgICAgICAgIHNpemU6IChfYjIgPSByZXNwb25zZTIuc2l6ZSkgIT0gbnVsbCA/IF9iMiA6IHZvaWQgMCxcbiAgICAgICAgICAgICAgICBxdWFsaXR5OiAoX2MyID0gcmVzcG9uc2UyLnF1YWxpdHkpICE9IG51bGwgPyBfYzIgOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogKF9kMiA9IHJlc3BvbnNlMi5iYWNrZ3JvdW5kKSAhPSBudWxsID8gX2QyIDogdm9pZCAwLFxuICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdDogKF9lMiA9IHJlc3BvbnNlMi5vdXRwdXRfZm9ybWF0KSAhPSBudWxsID8gX2UyIDogdm9pZCAwLFxuICAgICAgICAgICAgICAgIC4uLmRpc3RyaWJ1dGVUb2tlbkRldGFpbHMoXG4gICAgICAgICAgICAgICAgICAoX2YyID0gcmVzcG9uc2UyLnVzYWdlKSA9PSBudWxsID8gdm9pZCAwIDogX2YyLmlucHV0X3Rva2Vuc19kZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTIuZGF0YS5sZW5ndGhcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgeyB2YWx1ZTogcmVzcG9uc2UsIHJlc3BvbnNlSGVhZGVycyB9ID0gYXdhaXQgcG9zdEpzb25Ub0FwaTQoe1xuICAgICAgdXJsOiB0aGlzLmNvbmZpZy51cmwoe1xuICAgICAgICBwYXRoOiBcIi9pbWFnZXMvZ2VuZXJhdGlvbnNcIixcbiAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkXG4gICAgICB9KSxcbiAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzNCh0aGlzLmNvbmZpZy5oZWFkZXJzKCksIGhlYWRlcnMpLFxuICAgICAgYm9keToge1xuICAgICAgICBtb2RlbDogdGhpcy5tb2RlbElkLFxuICAgICAgICBwcm9tcHQsXG4gICAgICAgIG4sXG4gICAgICAgIHNpemUsXG4gICAgICAgIC4uLihfaCA9IHByb3ZpZGVyT3B0aW9ucy5vcGVuYWkpICE9IG51bGwgPyBfaCA6IHt9LFxuICAgICAgICAuLi4haGFzRGVmYXVsdFJlc3BvbnNlRm9ybWF0KHRoaXMubW9kZWxJZCkgPyB7IHJlc3BvbnNlX2Zvcm1hdDogXCJiNjRfanNvblwiIH0gOiB7fVxuICAgICAgfSxcbiAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogb3BlbmFpRmFpbGVkUmVzcG9uc2VIYW5kbGVyLFxuICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjQoXG4gICAgICAgIG9wZW5haUltYWdlUmVzcG9uc2VTY2hlbWFcbiAgICAgICksXG4gICAgICBhYm9ydFNpZ25hbCxcbiAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBpbWFnZXM6IHJlc3BvbnNlLmRhdGEubWFwKChpdGVtKSA9PiBpdGVtLmI2NF9qc29uKSxcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgdXNhZ2U6IHJlc3BvbnNlLnVzYWdlICE9IG51bGwgPyB7XG4gICAgICAgIGlucHV0VG9rZW5zOiAoX2kgPSByZXNwb25zZS51c2FnZS5pbnB1dF90b2tlbnMpICE9IG51bGwgPyBfaSA6IHZvaWQgMCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiAoX2ogPSByZXNwb25zZS51c2FnZS5vdXRwdXRfdG9rZW5zKSAhPSBudWxsID8gX2ogOiB2b2lkIDAsXG4gICAgICAgIHRvdGFsVG9rZW5zOiAoX2sgPSByZXNwb25zZS51c2FnZS50b3RhbF90b2tlbnMpICE9IG51bGwgPyBfayA6IHZvaWQgMFxuICAgICAgfSA6IHZvaWQgMCxcbiAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgIHRpbWVzdGFtcDogY3VycmVudERhdGUsXG4gICAgICAgIG1vZGVsSWQ6IHRoaXMubW9kZWxJZCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICBvcGVuYWk6IHtcbiAgICAgICAgICBpbWFnZXM6IHJlc3BvbnNlLmRhdGEubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hMiwgX2IyLCBfYzIsIF9kMiwgX2UyLCBfZjI7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5pdGVtLnJldmlzZWRfcHJvbXB0ID8geyByZXZpc2VkUHJvbXB0OiBpdGVtLnJldmlzZWRfcHJvbXB0IH0gOiB7fSxcbiAgICAgICAgICAgICAgY3JlYXRlZDogKF9hMiA9IHJlc3BvbnNlLmNyZWF0ZWQpICE9IG51bGwgPyBfYTIgOiB2b2lkIDAsXG4gICAgICAgICAgICAgIHNpemU6IChfYjIgPSByZXNwb25zZS5zaXplKSAhPSBudWxsID8gX2IyIDogdm9pZCAwLFxuICAgICAgICAgICAgICBxdWFsaXR5OiAoX2MyID0gcmVzcG9uc2UucXVhbGl0eSkgIT0gbnVsbCA/IF9jMiA6IHZvaWQgMCxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZDogKF9kMiA9IHJlc3BvbnNlLmJhY2tncm91bmQpICE9IG51bGwgPyBfZDIgOiB2b2lkIDAsXG4gICAgICAgICAgICAgIG91dHB1dEZvcm1hdDogKF9lMiA9IHJlc3BvbnNlLm91dHB1dF9mb3JtYXQpICE9IG51bGwgPyBfZTIgOiB2b2lkIDAsXG4gICAgICAgICAgICAgIC4uLmRpc3RyaWJ1dGVUb2tlbkRldGFpbHMoXG4gICAgICAgICAgICAgICAgKF9mMiA9IHJlc3BvbnNlLnVzYWdlKSA9PSBudWxsID8gdm9pZCAwIDogX2YyLmlucHV0X3Rva2Vuc19kZXRhaWxzLFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmRhdGEubGVuZ3RoXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5mdW5jdGlvbiBkaXN0cmlidXRlVG9rZW5EZXRhaWxzKGRldGFpbHMsIGluZGV4LCB0b3RhbCkge1xuICBpZiAoZGV0YWlscyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBpZiAoZGV0YWlscy5pbWFnZV90b2tlbnMgIT0gbnVsbCkge1xuICAgIGNvbnN0IGJhc2UgPSBNYXRoLmZsb29yKGRldGFpbHMuaW1hZ2VfdG9rZW5zIC8gdG90YWwpO1xuICAgIGNvbnN0IHJlbWFpbmRlciA9IGRldGFpbHMuaW1hZ2VfdG9rZW5zIC0gYmFzZSAqICh0b3RhbCAtIDEpO1xuICAgIHJlc3VsdC5pbWFnZVRva2VucyA9IGluZGV4ID09PSB0b3RhbCAtIDEgPyByZW1haW5kZXIgOiBiYXNlO1xuICB9XG4gIGlmIChkZXRhaWxzLnRleHRfdG9rZW5zICE9IG51bGwpIHtcbiAgICBjb25zdCBiYXNlID0gTWF0aC5mbG9vcihkZXRhaWxzLnRleHRfdG9rZW5zIC8gdG90YWwpO1xuICAgIGNvbnN0IHJlbWFpbmRlciA9IGRldGFpbHMudGV4dF90b2tlbnMgLSBiYXNlICogKHRvdGFsIC0gMSk7XG4gICAgcmVzdWx0LnRleHRUb2tlbnMgPSBpbmRleCA9PT0gdG90YWwgLSAxID8gcmVtYWluZGVyIDogYmFzZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuYXN5bmMgZnVuY3Rpb24gZmlsZVRvQmxvYihmaWxlKSB7XG4gIGlmICghZmlsZSkgcmV0dXJuIHZvaWQgMDtcbiAgaWYgKGZpbGUudHlwZSA9PT0gXCJ1cmxcIikge1xuICAgIHJldHVybiBkb3dubG9hZEJsb2IoZmlsZS51cmwpO1xuICB9XG4gIGNvbnN0IGRhdGEgPSBmaWxlLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gZmlsZS5kYXRhIDogY29udmVydEJhc2U2NFRvVWludDhBcnJheShmaWxlLmRhdGEpO1xuICByZXR1cm4gbmV3IEJsb2IoW2RhdGFdLCB7IHR5cGU6IGZpbGUubWVkaWFUeXBlIH0pO1xufVxuXG4vLyBzcmMvdG9vbC9hcHBseS1wYXRjaC50c1xuaW1wb3J0IHtcbiAgY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWEsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTgsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWE4XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHo5IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIGFwcGx5UGF0Y2hJbnB1dFNjaGVtYSA9IGxhenlTY2hlbWE4KFxuICAoKSA9PiB6b2RTY2hlbWE4KFxuICAgIHo5Lm9iamVjdCh7XG4gICAgICBjYWxsSWQ6IHo5LnN0cmluZygpLFxuICAgICAgb3BlcmF0aW9uOiB6OS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgejkub2JqZWN0KHtcbiAgICAgICAgICB0eXBlOiB6OS5saXRlcmFsKFwiY3JlYXRlX2ZpbGVcIiksXG4gICAgICAgICAgcGF0aDogejkuc3RyaW5nKCksXG4gICAgICAgICAgZGlmZjogejkuc3RyaW5nKClcbiAgICAgICAgfSksXG4gICAgICAgIHo5Lm9iamVjdCh7XG4gICAgICAgICAgdHlwZTogejkubGl0ZXJhbChcImRlbGV0ZV9maWxlXCIpLFxuICAgICAgICAgIHBhdGg6IHo5LnN0cmluZygpXG4gICAgICAgIH0pLFxuICAgICAgICB6OS5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHo5LmxpdGVyYWwoXCJ1cGRhdGVfZmlsZVwiKSxcbiAgICAgICAgICBwYXRoOiB6OS5zdHJpbmcoKSxcbiAgICAgICAgICBkaWZmOiB6OS5zdHJpbmcoKVxuICAgICAgICB9KVxuICAgICAgXSlcbiAgICB9KVxuICApXG4pO1xudmFyIGFwcGx5UGF0Y2hPdXRwdXRTY2hlbWEgPSBsYXp5U2NoZW1hOChcbiAgKCkgPT4gem9kU2NoZW1hOChcbiAgICB6OS5vYmplY3Qoe1xuICAgICAgc3RhdHVzOiB6OS5lbnVtKFtcImNvbXBsZXRlZFwiLCBcImZhaWxlZFwiXSksXG4gICAgICBvdXRwdXQ6IHo5LnN0cmluZygpLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG4pO1xudmFyIGFwcGx5UGF0Y2hBcmdzU2NoZW1hID0gbGF6eVNjaGVtYTgoKCkgPT4gem9kU2NoZW1hOCh6OS5vYmplY3Qoe30pKSk7XG52YXIgYXBwbHlQYXRjaFRvb2xGYWN0b3J5ID0gY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWEoe1xuICBpZDogXCJvcGVuYWkuYXBwbHlfcGF0Y2hcIixcbiAgaW5wdXRTY2hlbWE6IGFwcGx5UGF0Y2hJbnB1dFNjaGVtYSxcbiAgb3V0cHV0U2NoZW1hOiBhcHBseVBhdGNoT3V0cHV0U2NoZW1hXG59KTtcbnZhciBhcHBseVBhdGNoID0gYXBwbHlQYXRjaFRvb2xGYWN0b3J5O1xuXG4vLyBzcmMvdG9vbC9jb2RlLWludGVycHJldGVyLnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSBhcyBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTIsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTksXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWE5XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoxMCB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBjb2RlSW50ZXJwcmV0ZXJJbnB1dFNjaGVtYSA9IGxhenlTY2hlbWE5KFxuICAoKSA9PiB6b2RTY2hlbWE5KFxuICAgIHoxMC5vYmplY3Qoe1xuICAgICAgY29kZTogejEwLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIGNvbnRhaW5lcklkOiB6MTAuc3RyaW5nKClcbiAgICB9KVxuICApXG4pO1xudmFyIGNvZGVJbnRlcnByZXRlck91dHB1dFNjaGVtYSA9IGxhenlTY2hlbWE5KFxuICAoKSA9PiB6b2RTY2hlbWE5KFxuICAgIHoxMC5vYmplY3Qoe1xuICAgICAgb3V0cHV0czogejEwLmFycmF5KFxuICAgICAgICB6MTAuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgejEwLm9iamVjdCh7IHR5cGU6IHoxMC5saXRlcmFsKFwibG9nc1wiKSwgbG9nczogejEwLnN0cmluZygpIH0pLFxuICAgICAgICAgIHoxMC5vYmplY3QoeyB0eXBlOiB6MTAubGl0ZXJhbChcImltYWdlXCIpLCB1cmw6IHoxMC5zdHJpbmcoKSB9KVxuICAgICAgICBdKVxuICAgICAgKS5udWxsaXNoKClcbiAgICB9KVxuICApXG4pO1xudmFyIGNvZGVJbnRlcnByZXRlckFyZ3NTY2hlbWEgPSBsYXp5U2NoZW1hOShcbiAgKCkgPT4gem9kU2NoZW1hOShcbiAgICB6MTAub2JqZWN0KHtcbiAgICAgIGNvbnRhaW5lcjogejEwLnVuaW9uKFtcbiAgICAgICAgejEwLnN0cmluZygpLFxuICAgICAgICB6MTAub2JqZWN0KHtcbiAgICAgICAgICBmaWxlSWRzOiB6MTAuYXJyYXkoejEwLnN0cmluZygpKS5vcHRpb25hbCgpXG4gICAgICAgIH0pXG4gICAgICBdKS5vcHRpb25hbCgpXG4gICAgfSlcbiAgKVxuKTtcbnZhciBjb2RlSW50ZXJwcmV0ZXJUb29sRmFjdG9yeSA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hMih7XG4gIGlkOiBcIm9wZW5haS5jb2RlX2ludGVycHJldGVyXCIsXG4gIGlucHV0U2NoZW1hOiBjb2RlSW50ZXJwcmV0ZXJJbnB1dFNjaGVtYSxcbiAgb3V0cHV0U2NoZW1hOiBjb2RlSW50ZXJwcmV0ZXJPdXRwdXRTY2hlbWFcbn0pO1xudmFyIGNvZGVJbnRlcnByZXRlciA9IChhcmdzID0ge30pID0+IHtcbiAgcmV0dXJuIGNvZGVJbnRlcnByZXRlclRvb2xGYWN0b3J5KGFyZ3MpO1xufTtcblxuLy8gc3JjL3Rvb2wvY3VzdG9tLnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5LFxuICBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWExMCxcbiAgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTEwXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoxMSB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBjdXN0b21BcmdzU2NoZW1hID0gbGF6eVNjaGVtYTEwKFxuICAoKSA9PiB6b2RTY2hlbWExMChcbiAgICB6MTEub2JqZWN0KHtcbiAgICAgIG5hbWU6IHoxMS5zdHJpbmcoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB6MTEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGZvcm1hdDogejExLnVuaW9uKFtcbiAgICAgICAgejExLm9iamVjdCh7XG4gICAgICAgICAgdHlwZTogejExLmxpdGVyYWwoXCJncmFtbWFyXCIpLFxuICAgICAgICAgIHN5bnRheDogejExLmVudW0oW1wicmVnZXhcIiwgXCJsYXJrXCJdKSxcbiAgICAgICAgICBkZWZpbml0aW9uOiB6MTEuc3RyaW5nKClcbiAgICAgICAgfSksXG4gICAgICAgIHoxMS5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHoxMS5saXRlcmFsKFwidGV4dFwiKVxuICAgICAgICB9KVxuICAgICAgXSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG52YXIgY3VzdG9tSW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTAoKCkgPT4gem9kU2NoZW1hMTAoejExLnN0cmluZygpKSk7XG52YXIgY3VzdG9tVG9vbEZhY3RvcnkgPSBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5KHtcbiAgaWQ6IFwib3BlbmFpLmN1c3RvbVwiLFxuICBpbnB1dFNjaGVtYTogY3VzdG9tSW5wdXRTY2hlbWFcbn0pO1xudmFyIGN1c3RvbVRvb2wgPSAoYXJncykgPT4gY3VzdG9tVG9vbEZhY3RvcnkoYXJncyk7XG5cbi8vIHNyYy90b29sL2ZpbGUtc2VhcmNoLnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSBhcyBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTMsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTExLFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMTFcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejEyIH0gZnJvbSBcInpvZC92NFwiO1xudmFyIGNvbXBhcmlzb25GaWx0ZXJTY2hlbWEgPSB6MTIub2JqZWN0KHtcbiAga2V5OiB6MTIuc3RyaW5nKCksXG4gIHR5cGU6IHoxMi5lbnVtKFtcImVxXCIsIFwibmVcIiwgXCJndFwiLCBcImd0ZVwiLCBcImx0XCIsIFwibHRlXCIsIFwiaW5cIiwgXCJuaW5cIl0pLFxuICB2YWx1ZTogejEyLnVuaW9uKFt6MTIuc3RyaW5nKCksIHoxMi5udW1iZXIoKSwgejEyLmJvb2xlYW4oKSwgejEyLmFycmF5KHoxMi5zdHJpbmcoKSldKVxufSk7XG52YXIgY29tcG91bmRGaWx0ZXJTY2hlbWEgPSB6MTIub2JqZWN0KHtcbiAgdHlwZTogejEyLmVudW0oW1wiYW5kXCIsIFwib3JcIl0pLFxuICBmaWx0ZXJzOiB6MTIuYXJyYXkoXG4gICAgejEyLnVuaW9uKFtjb21wYXJpc29uRmlsdGVyU2NoZW1hLCB6MTIubGF6eSgoKSA9PiBjb21wb3VuZEZpbHRlclNjaGVtYSldKVxuICApXG59KTtcbnZhciBmaWxlU2VhcmNoQXJnc1NjaGVtYSA9IGxhenlTY2hlbWExMShcbiAgKCkgPT4gem9kU2NoZW1hMTEoXG4gICAgejEyLm9iamVjdCh7XG4gICAgICB2ZWN0b3JTdG9yZUlkczogejEyLmFycmF5KHoxMi5zdHJpbmcoKSksXG4gICAgICBtYXhOdW1SZXN1bHRzOiB6MTIubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAgIHJhbmtpbmc6IHoxMi5vYmplY3Qoe1xuICAgICAgICByYW5rZXI6IHoxMi5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICBzY29yZVRocmVzaG9sZDogejEyLm51bWJlcigpLm9wdGlvbmFsKClcbiAgICAgIH0pLm9wdGlvbmFsKCksXG4gICAgICBmaWx0ZXJzOiB6MTIudW5pb24oW2NvbXBhcmlzb25GaWx0ZXJTY2hlbWEsIGNvbXBvdW5kRmlsdGVyU2NoZW1hXSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG52YXIgZmlsZVNlYXJjaE91dHB1dFNjaGVtYSA9IGxhenlTY2hlbWExMShcbiAgKCkgPT4gem9kU2NoZW1hMTEoXG4gICAgejEyLm9iamVjdCh7XG4gICAgICBxdWVyaWVzOiB6MTIuYXJyYXkoejEyLnN0cmluZygpKSxcbiAgICAgIHJlc3VsdHM6IHoxMi5hcnJheShcbiAgICAgICAgejEyLm9iamVjdCh7XG4gICAgICAgICAgYXR0cmlidXRlczogejEyLnJlY29yZCh6MTIuc3RyaW5nKCksIHoxMi51bmtub3duKCkpLFxuICAgICAgICAgIGZpbGVJZDogejEyLnN0cmluZygpLFxuICAgICAgICAgIGZpbGVuYW1lOiB6MTIuc3RyaW5nKCksXG4gICAgICAgICAgc2NvcmU6IHoxMi5udW1iZXIoKSxcbiAgICAgICAgICB0ZXh0OiB6MTIuc3RyaW5nKClcbiAgICAgICAgfSlcbiAgICAgICkubnVsbGFibGUoKVxuICAgIH0pXG4gIClcbik7XG52YXIgZmlsZVNlYXJjaCA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hMyh7XG4gIGlkOiBcIm9wZW5haS5maWxlX3NlYXJjaFwiLFxuICBpbnB1dFNjaGVtYTogejEyLm9iamVjdCh7fSksXG4gIG91dHB1dFNjaGVtYTogZmlsZVNlYXJjaE91dHB1dFNjaGVtYVxufSk7XG5cbi8vIHNyYy90b29sL2ltYWdlLWdlbmVyYXRpb24udHNcbmltcG9ydCB7XG4gIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hIGFzIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hNCxcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMTIsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWExMlxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6MTMgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgaW1hZ2VHZW5lcmF0aW9uQXJnc1NjaGVtYSA9IGxhenlTY2hlbWExMihcbiAgKCkgPT4gem9kU2NoZW1hMTIoXG4gICAgejEzLm9iamVjdCh7XG4gICAgICBiYWNrZ3JvdW5kOiB6MTMuZW51bShbXCJhdXRvXCIsIFwib3BhcXVlXCIsIFwidHJhbnNwYXJlbnRcIl0pLm9wdGlvbmFsKCksXG4gICAgICBpbnB1dEZpZGVsaXR5OiB6MTMuZW51bShbXCJsb3dcIiwgXCJoaWdoXCJdKS5vcHRpb25hbCgpLFxuICAgICAgaW5wdXRJbWFnZU1hc2s6IHoxMy5vYmplY3Qoe1xuICAgICAgICBmaWxlSWQ6IHoxMy5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICBpbWFnZVVybDogejEzLnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgIH0pLm9wdGlvbmFsKCksXG4gICAgICBtb2RlbDogejEzLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBtb2RlcmF0aW9uOiB6MTMuZW51bShbXCJhdXRvXCJdKS5vcHRpb25hbCgpLFxuICAgICAgb3V0cHV0Q29tcHJlc3Npb246IHoxMy5udW1iZXIoKS5pbnQoKS5taW4oMCkubWF4KDEwMCkub3B0aW9uYWwoKSxcbiAgICAgIG91dHB1dEZvcm1hdDogejEzLmVudW0oW1wicG5nXCIsIFwianBlZ1wiLCBcIndlYnBcIl0pLm9wdGlvbmFsKCksXG4gICAgICBwYXJ0aWFsSW1hZ2VzOiB6MTMubnVtYmVyKCkuaW50KCkubWluKDApLm1heCgzKS5vcHRpb25hbCgpLFxuICAgICAgcXVhbGl0eTogejEzLmVudW0oW1wiYXV0b1wiLCBcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIl0pLm9wdGlvbmFsKCksXG4gICAgICBzaXplOiB6MTMuZW51bShbXCIxMDI0eDEwMjRcIiwgXCIxMDI0eDE1MzZcIiwgXCIxNTM2eDEwMjRcIiwgXCJhdXRvXCJdKS5vcHRpb25hbCgpXG4gICAgfSkuc3RyaWN0KClcbiAgKVxuKTtcbnZhciBpbWFnZUdlbmVyYXRpb25JbnB1dFNjaGVtYSA9IGxhenlTY2hlbWExMigoKSA9PiB6b2RTY2hlbWExMih6MTMub2JqZWN0KHt9KSkpO1xudmFyIGltYWdlR2VuZXJhdGlvbk91dHB1dFNjaGVtYSA9IGxhenlTY2hlbWExMihcbiAgKCkgPT4gem9kU2NoZW1hMTIoejEzLm9iamVjdCh7IHJlc3VsdDogejEzLnN0cmluZygpIH0pKVxuKTtcbnZhciBpbWFnZUdlbmVyYXRpb25Ub29sRmFjdG9yeSA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hNCh7XG4gIGlkOiBcIm9wZW5haS5pbWFnZV9nZW5lcmF0aW9uXCIsXG4gIGlucHV0U2NoZW1hOiBpbWFnZUdlbmVyYXRpb25JbnB1dFNjaGVtYSxcbiAgb3V0cHV0U2NoZW1hOiBpbWFnZUdlbmVyYXRpb25PdXRwdXRTY2hlbWFcbn0pO1xudmFyIGltYWdlR2VuZXJhdGlvbiA9IChhcmdzID0ge30pID0+IHtcbiAgcmV0dXJuIGltYWdlR2VuZXJhdGlvblRvb2xGYWN0b3J5KGFyZ3MpO1xufTtcblxuLy8gc3JjL3Rvb2wvbG9jYWwtc2hlbGwudHNcbmltcG9ydCB7XG4gIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hIGFzIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hNSxcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMTMsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWExM1xufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6MTQgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgbG9jYWxTaGVsbElucHV0U2NoZW1hID0gbGF6eVNjaGVtYTEzKFxuICAoKSA9PiB6b2RTY2hlbWExMyhcbiAgICB6MTQub2JqZWN0KHtcbiAgICAgIGFjdGlvbjogejE0Lm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoxNC5saXRlcmFsKFwiZXhlY1wiKSxcbiAgICAgICAgY29tbWFuZDogejE0LmFycmF5KHoxNC5zdHJpbmcoKSksXG4gICAgICAgIHRpbWVvdXRNczogejE0Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAgIHVzZXI6IHoxNC5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICB3b3JraW5nRGlyZWN0b3J5OiB6MTQuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgZW52OiB6MTQucmVjb3JkKHoxNC5zdHJpbmcoKSwgejE0LnN0cmluZygpKS5vcHRpb25hbCgpXG4gICAgICB9KVxuICAgIH0pXG4gIClcbik7XG52YXIgbG9jYWxTaGVsbE91dHB1dFNjaGVtYSA9IGxhenlTY2hlbWExMyhcbiAgKCkgPT4gem9kU2NoZW1hMTMoejE0Lm9iamVjdCh7IG91dHB1dDogejE0LnN0cmluZygpIH0pKVxuKTtcbnZhciBsb2NhbFNoZWxsID0gY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWE1KHtcbiAgaWQ6IFwib3BlbmFpLmxvY2FsX3NoZWxsXCIsXG4gIGlucHV0U2NoZW1hOiBsb2NhbFNoZWxsSW5wdXRTY2hlbWEsXG4gIG91dHB1dFNjaGVtYTogbG9jYWxTaGVsbE91dHB1dFNjaGVtYVxufSk7XG5cbi8vIHNyYy90b29sL3NoZWxsLnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSBhcyBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTYsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTE0LFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMTRcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejE1IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIHNoZWxsSW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTQoXG4gICgpID0+IHpvZFNjaGVtYTE0KFxuICAgIHoxNS5vYmplY3Qoe1xuICAgICAgYWN0aW9uOiB6MTUub2JqZWN0KHtcbiAgICAgICAgY29tbWFuZHM6IHoxNS5hcnJheSh6MTUuc3RyaW5nKCkpLFxuICAgICAgICB0aW1lb3V0TXM6IHoxNS5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICBtYXhPdXRwdXRMZW5ndGg6IHoxNS5udW1iZXIoKS5vcHRpb25hbCgpXG4gICAgICB9KVxuICAgIH0pXG4gIClcbik7XG52YXIgc2hlbGxPdXRwdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTQoXG4gICgpID0+IHpvZFNjaGVtYTE0KFxuICAgIHoxNS5vYmplY3Qoe1xuICAgICAgb3V0cHV0OiB6MTUuYXJyYXkoXG4gICAgICAgIHoxNS5vYmplY3Qoe1xuICAgICAgICAgIHN0ZG91dDogejE1LnN0cmluZygpLFxuICAgICAgICAgIHN0ZGVycjogejE1LnN0cmluZygpLFxuICAgICAgICAgIG91dGNvbWU6IHoxNS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgIHoxNS5vYmplY3QoeyB0eXBlOiB6MTUubGl0ZXJhbChcInRpbWVvdXRcIikgfSksXG4gICAgICAgICAgICB6MTUub2JqZWN0KHsgdHlwZTogejE1LmxpdGVyYWwoXCJleGl0XCIpLCBleGl0Q29kZTogejE1Lm51bWJlcigpIH0pXG4gICAgICAgICAgXSlcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuICApXG4pO1xudmFyIHNoZWxsU2tpbGxzU2NoZW1hID0gejE1LmFycmF5KFxuICB6MTUuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgejE1Lm9iamVjdCh7XG4gICAgICB0eXBlOiB6MTUubGl0ZXJhbChcInNraWxsUmVmZXJlbmNlXCIpLFxuICAgICAgc2tpbGxJZDogejE1LnN0cmluZygpLFxuICAgICAgdmVyc2lvbjogejE1LnN0cmluZygpLm9wdGlvbmFsKClcbiAgICB9KSxcbiAgICB6MTUub2JqZWN0KHtcbiAgICAgIHR5cGU6IHoxNS5saXRlcmFsKFwiaW5saW5lXCIpLFxuICAgICAgbmFtZTogejE1LnN0cmluZygpLFxuICAgICAgZGVzY3JpcHRpb246IHoxNS5zdHJpbmcoKSxcbiAgICAgIHNvdXJjZTogejE1Lm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoxNS5saXRlcmFsKFwiYmFzZTY0XCIpLFxuICAgICAgICBtZWRpYVR5cGU6IHoxNS5saXRlcmFsKFwiYXBwbGljYXRpb24vemlwXCIpLFxuICAgICAgICBkYXRhOiB6MTUuc3RyaW5nKClcbiAgICAgIH0pXG4gICAgfSlcbiAgXSlcbikub3B0aW9uYWwoKTtcbnZhciBzaGVsbEFyZ3NTY2hlbWEgPSBsYXp5U2NoZW1hMTQoXG4gICgpID0+IHpvZFNjaGVtYTE0KFxuICAgIHoxNS5vYmplY3Qoe1xuICAgICAgZW52aXJvbm1lbnQ6IHoxNS51bmlvbihbXG4gICAgICAgIHoxNS5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHoxNS5saXRlcmFsKFwiY29udGFpbmVyQXV0b1wiKSxcbiAgICAgICAgICBmaWxlSWRzOiB6MTUuYXJyYXkoejE1LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgICAgIG1lbW9yeUxpbWl0OiB6MTUuZW51bShbXCIxZ1wiLCBcIjRnXCIsIFwiMTZnXCIsIFwiNjRnXCJdKS5vcHRpb25hbCgpLFxuICAgICAgICAgIG5ldHdvcmtQb2xpY3k6IHoxNS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgIHoxNS5vYmplY3QoeyB0eXBlOiB6MTUubGl0ZXJhbChcImRpc2FibGVkXCIpIH0pLFxuICAgICAgICAgICAgejE1Lm9iamVjdCh7XG4gICAgICAgICAgICAgIHR5cGU6IHoxNS5saXRlcmFsKFwiYWxsb3dsaXN0XCIpLFxuICAgICAgICAgICAgICBhbGxvd2VkRG9tYWluczogejE1LmFycmF5KHoxNS5zdHJpbmcoKSksXG4gICAgICAgICAgICAgIGRvbWFpblNlY3JldHM6IHoxNS5hcnJheShcbiAgICAgICAgICAgICAgICB6MTUub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgIGRvbWFpbjogejE1LnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgbmFtZTogejE1LnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHoxNS5zdHJpbmcoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICkub3B0aW9uYWwoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBdKS5vcHRpb25hbCgpLFxuICAgICAgICAgIHNraWxsczogc2hlbGxTa2lsbHNTY2hlbWFcbiAgICAgICAgfSksXG4gICAgICAgIHoxNS5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHoxNS5saXRlcmFsKFwiY29udGFpbmVyUmVmZXJlbmNlXCIpLFxuICAgICAgICAgIGNvbnRhaW5lcklkOiB6MTUuc3RyaW5nKClcbiAgICAgICAgfSksXG4gICAgICAgIHoxNS5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHoxNS5saXRlcmFsKFwibG9jYWxcIikub3B0aW9uYWwoKSxcbiAgICAgICAgICBza2lsbHM6IHoxNS5hcnJheShcbiAgICAgICAgICAgIHoxNS5vYmplY3Qoe1xuICAgICAgICAgICAgICBuYW1lOiB6MTUuc3RyaW5nKCksXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB6MTUuc3RyaW5nKCksXG4gICAgICAgICAgICAgIHBhdGg6IHoxNS5zdHJpbmcoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApLm9wdGlvbmFsKClcbiAgICAgICAgfSlcbiAgICAgIF0pLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG4pO1xudmFyIHNoZWxsID0gY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWE2KHtcbiAgaWQ6IFwib3BlbmFpLnNoZWxsXCIsXG4gIGlucHV0U2NoZW1hOiBzaGVsbElucHV0U2NoZW1hLFxuICBvdXRwdXRTY2hlbWE6IHNoZWxsT3V0cHV0U2NoZW1hXG59KTtcblxuLy8gc3JjL3Rvb2wvdG9vbC1zZWFyY2gudHNcbmltcG9ydCB7XG4gIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hIGFzIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hNyxcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMTUsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWExNVxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6MTYgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgdG9vbFNlYXJjaEFyZ3NTY2hlbWEgPSBsYXp5U2NoZW1hMTUoXG4gICgpID0+IHpvZFNjaGVtYTE1KFxuICAgIHoxNi5vYmplY3Qoe1xuICAgICAgZXhlY3V0aW9uOiB6MTYuZW51bShbXCJzZXJ2ZXJcIiwgXCJjbGllbnRcIl0pLm9wdGlvbmFsKCksXG4gICAgICBkZXNjcmlwdGlvbjogejE2LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBwYXJhbWV0ZXJzOiB6MTYucmVjb3JkKHoxNi5zdHJpbmcoKSwgejE2LnVua25vd24oKSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG52YXIgdG9vbFNlYXJjaElucHV0U2NoZW1hID0gbGF6eVNjaGVtYTE1KFxuICAoKSA9PiB6b2RTY2hlbWExNShcbiAgICB6MTYub2JqZWN0KHtcbiAgICAgIGFyZ3VtZW50czogejE2LnVua25vd24oKS5vcHRpb25hbCgpLFxuICAgICAgY2FsbF9pZDogejE2LnN0cmluZygpLm51bGxpc2goKVxuICAgIH0pXG4gIClcbik7XG52YXIgdG9vbFNlYXJjaE91dHB1dFNjaGVtYSA9IGxhenlTY2hlbWExNShcbiAgKCkgPT4gem9kU2NoZW1hMTUoXG4gICAgejE2Lm9iamVjdCh7XG4gICAgICB0b29sczogejE2LmFycmF5KHoxNi5yZWNvcmQoejE2LnN0cmluZygpLCB6MTYudW5rbm93bigpKSlcbiAgICB9KVxuICApXG4pO1xudmFyIHRvb2xTZWFyY2hUb29sRmFjdG9yeSA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hNyh7XG4gIGlkOiBcIm9wZW5haS50b29sX3NlYXJjaFwiLFxuICBpbnB1dFNjaGVtYTogdG9vbFNlYXJjaElucHV0U2NoZW1hLFxuICBvdXRwdXRTY2hlbWE6IHRvb2xTZWFyY2hPdXRwdXRTY2hlbWFcbn0pO1xudmFyIHRvb2xTZWFyY2ggPSAoYXJncyA9IHt9KSA9PiB0b29sU2VhcmNoVG9vbEZhY3RvcnkoYXJncyk7XG5cbi8vIHNyYy90b29sL3dlYi1zZWFyY2gudHNcbmltcG9ydCB7XG4gIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hIGFzIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hOCxcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMTYsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWExNlxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6MTcgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgd2ViU2VhcmNoQXJnc1NjaGVtYSA9IGxhenlTY2hlbWExNihcbiAgKCkgPT4gem9kU2NoZW1hMTYoXG4gICAgejE3Lm9iamVjdCh7XG4gICAgICBleHRlcm5hbFdlYkFjY2VzczogejE3LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgZmlsdGVyczogejE3Lm9iamVjdCh7IGFsbG93ZWREb21haW5zOiB6MTcuYXJyYXkoejE3LnN0cmluZygpKS5vcHRpb25hbCgpIH0pLm9wdGlvbmFsKCksXG4gICAgICBzZWFyY2hDb250ZXh0U2l6ZTogejE3LmVudW0oW1wibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiXSkub3B0aW9uYWwoKSxcbiAgICAgIHVzZXJMb2NhdGlvbjogejE3Lm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoxNy5saXRlcmFsKFwiYXBwcm94aW1hdGVcIiksXG4gICAgICAgIGNvdW50cnk6IHoxNy5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICBjaXR5OiB6MTcuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgcmVnaW9uOiB6MTcuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgdGltZXpvbmU6IHoxNy5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICB9KS5vcHRpb25hbCgpXG4gICAgfSlcbiAgKVxuKTtcbnZhciB3ZWJTZWFyY2hJbnB1dFNjaGVtYSA9IGxhenlTY2hlbWExNigoKSA9PiB6b2RTY2hlbWExNih6MTcub2JqZWN0KHt9KSkpO1xudmFyIHdlYlNlYXJjaE91dHB1dFNjaGVtYSA9IGxhenlTY2hlbWExNihcbiAgKCkgPT4gem9kU2NoZW1hMTYoXG4gICAgejE3Lm9iamVjdCh7XG4gICAgICBhY3Rpb246IHoxNy5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgejE3Lm9iamVjdCh7XG4gICAgICAgICAgdHlwZTogejE3LmxpdGVyYWwoXCJzZWFyY2hcIiksXG4gICAgICAgICAgcXVlcnk6IHoxNy5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgIH0pLFxuICAgICAgICB6MTcub2JqZWN0KHtcbiAgICAgICAgICB0eXBlOiB6MTcubGl0ZXJhbChcIm9wZW5QYWdlXCIpLFxuICAgICAgICAgIHVybDogejE3LnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICB9KSxcbiAgICAgICAgejE3Lm9iamVjdCh7XG4gICAgICAgICAgdHlwZTogejE3LmxpdGVyYWwoXCJmaW5kSW5QYWdlXCIpLFxuICAgICAgICAgIHVybDogejE3LnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICBwYXR0ZXJuOiB6MTcuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgIH0pXG4gICAgICBdKS5vcHRpb25hbCgpLFxuICAgICAgc291cmNlczogejE3LmFycmF5KFxuICAgICAgICB6MTcuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgejE3Lm9iamVjdCh7IHR5cGU6IHoxNy5saXRlcmFsKFwidXJsXCIpLCB1cmw6IHoxNy5zdHJpbmcoKSB9KSxcbiAgICAgICAgICB6MTcub2JqZWN0KHsgdHlwZTogejE3LmxpdGVyYWwoXCJhcGlcIiksIG5hbWU6IHoxNy5zdHJpbmcoKSB9KVxuICAgICAgICBdKVxuICAgICAgKS5vcHRpb25hbCgpXG4gICAgfSlcbiAgKVxuKTtcbnZhciB3ZWJTZWFyY2hUb29sRmFjdG9yeSA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hOCh7XG4gIGlkOiBcIm9wZW5haS53ZWJfc2VhcmNoXCIsXG4gIGlucHV0U2NoZW1hOiB3ZWJTZWFyY2hJbnB1dFNjaGVtYSxcbiAgb3V0cHV0U2NoZW1hOiB3ZWJTZWFyY2hPdXRwdXRTY2hlbWFcbn0pO1xudmFyIHdlYlNlYXJjaCA9IChhcmdzID0ge30pID0+IHdlYlNlYXJjaFRvb2xGYWN0b3J5KGFyZ3MpO1xuXG4vLyBzcmMvdG9vbC93ZWItc2VhcmNoLXByZXZpZXcudHNcbmltcG9ydCB7XG4gIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hIGFzIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hOSxcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMTcsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWExN1xufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6MTggfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgd2ViU2VhcmNoUHJldmlld0FyZ3NTY2hlbWEgPSBsYXp5U2NoZW1hMTcoXG4gICgpID0+IHpvZFNjaGVtYTE3KFxuICAgIHoxOC5vYmplY3Qoe1xuICAgICAgc2VhcmNoQ29udGV4dFNpemU6IHoxOC5lbnVtKFtcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIl0pLm9wdGlvbmFsKCksXG4gICAgICB1c2VyTG9jYXRpb246IHoxOC5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MTgubGl0ZXJhbChcImFwcHJveGltYXRlXCIpLFxuICAgICAgICBjb3VudHJ5OiB6MTguc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgY2l0eTogejE4LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIHJlZ2lvbjogejE4LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIHRpbWV6b25lOiB6MTguc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgICAgfSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG52YXIgd2ViU2VhcmNoUHJldmlld0lucHV0U2NoZW1hID0gbGF6eVNjaGVtYTE3KFxuICAoKSA9PiB6b2RTY2hlbWExNyh6MTgub2JqZWN0KHt9KSlcbik7XG52YXIgd2ViU2VhcmNoUHJldmlld091dHB1dFNjaGVtYSA9IGxhenlTY2hlbWExNyhcbiAgKCkgPT4gem9kU2NoZW1hMTcoXG4gICAgejE4Lm9iamVjdCh7XG4gICAgICBhY3Rpb246IHoxOC5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgejE4Lm9iamVjdCh7XG4gICAgICAgICAgdHlwZTogejE4LmxpdGVyYWwoXCJzZWFyY2hcIiksXG4gICAgICAgICAgcXVlcnk6IHoxOC5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgIH0pLFxuICAgICAgICB6MTgub2JqZWN0KHtcbiAgICAgICAgICB0eXBlOiB6MTgubGl0ZXJhbChcIm9wZW5QYWdlXCIpLFxuICAgICAgICAgIHVybDogejE4LnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICB9KSxcbiAgICAgICAgejE4Lm9iamVjdCh7XG4gICAgICAgICAgdHlwZTogejE4LmxpdGVyYWwoXCJmaW5kSW5QYWdlXCIpLFxuICAgICAgICAgIHVybDogejE4LnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICBwYXR0ZXJuOiB6MTguc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgIH0pXG4gICAgICBdKS5vcHRpb25hbCgpXG4gICAgfSlcbiAgKVxuKTtcbnZhciB3ZWJTZWFyY2hQcmV2aWV3ID0gY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWE5KHtcbiAgaWQ6IFwib3BlbmFpLndlYl9zZWFyY2hfcHJldmlld1wiLFxuICBpbnB1dFNjaGVtYTogd2ViU2VhcmNoUHJldmlld0lucHV0U2NoZW1hLFxuICBvdXRwdXRTY2hlbWE6IHdlYlNlYXJjaFByZXZpZXdPdXRwdXRTY2hlbWFcbn0pO1xuXG4vLyBzcmMvdG9vbC9tY3AudHNcbmltcG9ydCB7XG4gIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hIGFzIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hMTAsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTE4LFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMThcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejE5IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIGpzb25WYWx1ZVNjaGVtYSA9IHoxOS5sYXp5KFxuICAoKSA9PiB6MTkudW5pb24oW1xuICAgIHoxOS5zdHJpbmcoKSxcbiAgICB6MTkubnVtYmVyKCksXG4gICAgejE5LmJvb2xlYW4oKSxcbiAgICB6MTkubnVsbCgpLFxuICAgIHoxOS5hcnJheShqc29uVmFsdWVTY2hlbWEpLFxuICAgIHoxOS5yZWNvcmQoejE5LnN0cmluZygpLCBqc29uVmFsdWVTY2hlbWEpXG4gIF0pXG4pO1xudmFyIG1jcEFyZ3NTY2hlbWEgPSBsYXp5U2NoZW1hMTgoXG4gICgpID0+IHpvZFNjaGVtYTE4KFxuICAgIHoxOS5vYmplY3Qoe1xuICAgICAgc2VydmVyTGFiZWw6IHoxOS5zdHJpbmcoKSxcbiAgICAgIGFsbG93ZWRUb29sczogejE5LnVuaW9uKFtcbiAgICAgICAgejE5LmFycmF5KHoxOS5zdHJpbmcoKSksXG4gICAgICAgIHoxOS5vYmplY3Qoe1xuICAgICAgICAgIHJlYWRPbmx5OiB6MTkuYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgdG9vbE5hbWVzOiB6MTkuYXJyYXkoejE5LnN0cmluZygpKS5vcHRpb25hbCgpXG4gICAgICAgIH0pXG4gICAgICBdKS5vcHRpb25hbCgpLFxuICAgICAgYXV0aG9yaXphdGlvbjogejE5LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBjb25uZWN0b3JJZDogejE5LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBoZWFkZXJzOiB6MTkucmVjb3JkKHoxOS5zdHJpbmcoKSwgejE5LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgcmVxdWlyZUFwcHJvdmFsOiB6MTkudW5pb24oW1xuICAgICAgICB6MTkuZW51bShbXCJhbHdheXNcIiwgXCJuZXZlclwiXSksXG4gICAgICAgIHoxOS5vYmplY3Qoe1xuICAgICAgICAgIG5ldmVyOiB6MTkub2JqZWN0KHtcbiAgICAgICAgICAgIHRvb2xOYW1lczogejE5LmFycmF5KHoxOS5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICAgICAgICAgIH0pLm9wdGlvbmFsKClcbiAgICAgICAgfSlcbiAgICAgIF0pLm9wdGlvbmFsKCksXG4gICAgICBzZXJ2ZXJEZXNjcmlwdGlvbjogejE5LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBzZXJ2ZXJVcmw6IHoxOS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgfSkucmVmaW5lKFxuICAgICAgKHYpID0+IHYuc2VydmVyVXJsICE9IG51bGwgfHwgdi5jb25uZWN0b3JJZCAhPSBudWxsLFxuICAgICAgXCJPbmUgb2Ygc2VydmVyVXJsIG9yIGNvbm5lY3RvcklkIG11c3QgYmUgcHJvdmlkZWQuXCJcbiAgICApXG4gIClcbik7XG52YXIgbWNwSW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTgoKCkgPT4gem9kU2NoZW1hMTgoejE5Lm9iamVjdCh7fSkpKTtcbnZhciBtY3BPdXRwdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTgoXG4gICgpID0+IHpvZFNjaGVtYTE4KFxuICAgIHoxOS5vYmplY3Qoe1xuICAgICAgdHlwZTogejE5LmxpdGVyYWwoXCJjYWxsXCIpLFxuICAgICAgc2VydmVyTGFiZWw6IHoxOS5zdHJpbmcoKSxcbiAgICAgIG5hbWU6IHoxOS5zdHJpbmcoKSxcbiAgICAgIGFyZ3VtZW50czogejE5LnN0cmluZygpLFxuICAgICAgb3V0cHV0OiB6MTkuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgZXJyb3I6IHoxOS51bmlvbihbejE5LnN0cmluZygpLCBqc29uVmFsdWVTY2hlbWFdKS5vcHRpb25hbCgpXG4gICAgfSlcbiAgKVxuKTtcbnZhciBtY3BUb29sRmFjdG9yeSA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hMTAoe1xuICBpZDogXCJvcGVuYWkubWNwXCIsXG4gIGlucHV0U2NoZW1hOiBtY3BJbnB1dFNjaGVtYSxcbiAgb3V0cHV0U2NoZW1hOiBtY3BPdXRwdXRTY2hlbWFcbn0pO1xudmFyIG1jcCA9IChhcmdzKSA9PiBtY3BUb29sRmFjdG9yeShhcmdzKTtcblxuLy8gc3JjL29wZW5haS10b29scy50c1xudmFyIG9wZW5haVRvb2xzID0ge1xuICAvKipcbiAgICogVGhlIGFwcGx5X3BhdGNoIHRvb2wgbGV0cyBHUFQtNS4xIGNyZWF0ZSwgdXBkYXRlLCBhbmQgZGVsZXRlIGZpbGVzIGluIHlvdXJcbiAgICogY29kZWJhc2UgdXNpbmcgc3RydWN0dXJlZCBkaWZmcy4gSW5zdGVhZCBvZiBqdXN0IHN1Z2dlc3RpbmcgZWRpdHMsIHRoZSBtb2RlbFxuICAgKiBlbWl0cyBwYXRjaCBvcGVyYXRpb25zIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBhcHBsaWVzIGFuZCB0aGVuIHJlcG9ydHMgYmFjayBvbixcbiAgICogZW5hYmxpbmcgaXRlcmF0aXZlLCBtdWx0aS1zdGVwIGNvZGUgZWRpdGluZyB3b3JrZmxvd3MuXG4gICAqXG4gICAqL1xuICBhcHBseVBhdGNoLFxuICAvKipcbiAgICogQ3VzdG9tIHRvb2xzIGxldCBjYWxsZXJzIGNvbnN0cmFpbiBtb2RlbCBvdXRwdXQgdG8gYSBncmFtbWFyIChyZWdleCBvclxuICAgKiBMYXJrIHN5bnRheCkuIFRoZSBtb2RlbCByZXR1cm5zIGEgYGN1c3RvbV90b29sX2NhbGxgIG91dHB1dCBpdGVtIHdob3NlXG4gICAqIGBpbnB1dGAgZmllbGQgaXMgYSBzdHJpbmcgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBncmFtbWFyLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gdG9vbC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHRvb2wuXG4gICAqIEBwYXJhbSBmb3JtYXQgLSBUaGUgb3V0cHV0IGZvcm1hdCBjb25zdHJhaW50IChncmFtbWFyIHR5cGUsIHN5bnRheCwgYW5kIGRlZmluaXRpb24pLlxuICAgKi9cbiAgY3VzdG9tVG9vbCxcbiAgLyoqXG4gICAqIFRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgYWxsb3dzIG1vZGVscyB0byB3cml0ZSBhbmQgcnVuIFB5dGhvbiBjb2RlIGluIGFcbiAgICogc2FuZGJveGVkIGVudmlyb25tZW50IHRvIHNvbHZlIGNvbXBsZXggcHJvYmxlbXMgaW4gZG9tYWlucyBsaWtlIGRhdGEgYW5hbHlzaXMsXG4gICAqIGNvZGluZywgYW5kIG1hdGguXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXIgLSBUaGUgY29udGFpbmVyIHRvIHVzZSBmb3IgdGhlIGNvZGUgaW50ZXJwcmV0ZXIuXG4gICAqL1xuICBjb2RlSW50ZXJwcmV0ZXIsXG4gIC8qKlxuICAgKiBGaWxlIHNlYXJjaCBpcyBhIHRvb2wgYXZhaWxhYmxlIGluIHRoZSBSZXNwb25zZXMgQVBJLiBJdCBlbmFibGVzIG1vZGVscyB0b1xuICAgKiByZXRyaWV2ZSBpbmZvcm1hdGlvbiBpbiBhIGtub3dsZWRnZSBiYXNlIG9mIHByZXZpb3VzbHkgdXBsb2FkZWQgZmlsZXMgdGhyb3VnaFxuICAgKiBzZW1hbnRpYyBhbmQga2V5d29yZCBzZWFyY2guXG4gICAqXG4gICAqIEBwYXJhbSB2ZWN0b3JTdG9yZUlkcyAtIFRoZSB2ZWN0b3Igc3RvcmUgSURzIHRvIHVzZSBmb3IgdGhlIGZpbGUgc2VhcmNoLlxuICAgKiBAcGFyYW0gbWF4TnVtUmVzdWx0cyAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybi5cbiAgICogQHBhcmFtIHJhbmtpbmcgLSBUaGUgcmFua2luZyBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIGZpbGUgc2VhcmNoLlxuICAgKiBAcGFyYW0gZmlsdGVycyAtIFRoZSBmaWx0ZXJzIHRvIHVzZSBmb3IgdGhlIGZpbGUgc2VhcmNoLlxuICAgKi9cbiAgZmlsZVNlYXJjaCxcbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBnZW5lcmF0aW9uIHRvb2wgYWxsb3dzIHlvdSB0byBnZW5lcmF0ZSBpbWFnZXMgdXNpbmcgYSB0ZXh0IHByb21wdCxcbiAgICogYW5kIG9wdGlvbmFsbHkgaW1hZ2UgaW5wdXRzLiBJdCBsZXZlcmFnZXMgdGhlIEdQVCBJbWFnZSBtb2RlbCxcbiAgICogYW5kIGF1dG9tYXRpY2FsbHkgb3B0aW1pemVzIHRleHQgaW5wdXRzIGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGJhY2tncm91bmQgLSBCYWNrZ3JvdW5kIHR5cGUgZm9yIHRoZSBnZW5lcmF0ZWQgaW1hZ2UuIE9uZSBvZiAnYXV0bycsICdvcGFxdWUnLCBvciAndHJhbnNwYXJlbnQnLlxuICAgKiBAcGFyYW0gaW5wdXRGaWRlbGl0eSAtIElucHV0IGZpZGVsaXR5IGZvciB0aGUgZ2VuZXJhdGVkIGltYWdlLiBPbmUgb2YgJ2xvdycgb3IgJ2hpZ2gnLlxuICAgKiBAcGFyYW0gaW5wdXRJbWFnZU1hc2sgLSBPcHRpb25hbCBtYXNrIGZvciBpbnBhaW50aW5nLiBDb250YWlucyBmaWxlSWQgYW5kL29yIGltYWdlVXJsLlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgaW1hZ2UgZ2VuZXJhdGlvbiBtb2RlbCB0byB1c2UuIERlZmF1bHQ6IGdwdC1pbWFnZS0xLlxuICAgKiBAcGFyYW0gbW9kZXJhdGlvbiAtIE1vZGVyYXRpb24gbGV2ZWwgZm9yIHRoZSBnZW5lcmF0ZWQgaW1hZ2UuIERlZmF1bHQ6ICdhdXRvJy5cbiAgICogQHBhcmFtIG91dHB1dENvbXByZXNzaW9uIC0gQ29tcHJlc3Npb24gbGV2ZWwgZm9yIHRoZSBvdXRwdXQgaW1hZ2UgKDAtMTAwKS5cbiAgICogQHBhcmFtIG91dHB1dEZvcm1hdCAtIFRoZSBvdXRwdXQgZm9ybWF0IG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2UuIE9uZSBvZiAncG5nJywgJ2pwZWcnLCBvciAnd2VicCcuXG4gICAqIEBwYXJhbSBwYXJ0aWFsSW1hZ2VzIC0gTnVtYmVyIG9mIHBhcnRpYWwgaW1hZ2VzIHRvIGdlbmVyYXRlIGluIHN0cmVhbWluZyBtb2RlICgwLTMpLlxuICAgKiBAcGFyYW0gcXVhbGl0eSAtIFRoZSBxdWFsaXR5IG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2UuIE9uZSBvZiAnYXV0bycsICdsb3cnLCAnbWVkaXVtJywgb3IgJ2hpZ2gnLlxuICAgKiBAcGFyYW0gc2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2UuIE9uZSBvZiAnYXV0bycsICcxMDI0eDEwMjQnLCAnMTAyNHgxNTM2Jywgb3IgJzE1MzZ4MTAyNCcuXG4gICAqL1xuICBpbWFnZUdlbmVyYXRpb24sXG4gIC8qKlxuICAgKiBMb2NhbCBzaGVsbCBpcyBhIHRvb2wgdGhhdCBhbGxvd3MgYWdlbnRzIHRvIHJ1biBzaGVsbCBjb21tYW5kcyBsb2NhbGx5XG4gICAqIG9uIGEgbWFjaGluZSB5b3Ugb3IgdGhlIHVzZXIgcHJvdmlkZXMuXG4gICAqXG4gICAqIFN1cHBvcnRlZCBtb2RlbHM6IGBncHQtNS1jb2RleGBcbiAgICovXG4gIGxvY2FsU2hlbGwsXG4gIC8qKlxuICAgKiBUaGUgc2hlbGwgdG9vbCBhbGxvd3MgdGhlIG1vZGVsIHRvIGludGVyYWN0IHdpdGggeW91ciBsb2NhbCBjb21wdXRlciB0aHJvdWdoXG4gICAqIGEgY29udHJvbGxlZCBjb21tYW5kLWxpbmUgaW50ZXJmYWNlLiBUaGUgbW9kZWwgcHJvcG9zZXMgc2hlbGwgY29tbWFuZHM7IHlvdXJcbiAgICogaW50ZWdyYXRpb24gZXhlY3V0ZXMgdGhlbSBhbmQgcmV0dXJucyB0aGUgb3V0cHV0cy5cbiAgICpcbiAgICogQXZhaWxhYmxlIHRocm91Z2ggdGhlIFJlc3BvbnNlcyBBUEkgZm9yIHVzZSB3aXRoIEdQVC01LjEuXG4gICAqXG4gICAqIFdBUk5JTkc6IFJ1bm5pbmcgYXJiaXRyYXJ5IHNoZWxsIGNvbW1hbmRzIGNhbiBiZSBkYW5nZXJvdXMuIEFsd2F5cyBzYW5kYm94XG4gICAqIGV4ZWN1dGlvbiBvciBhZGQgc3RyaWN0IGFsbG93LS9kZW55LWxpc3RzIGJlZm9yZSBmb3J3YXJkaW5nIGEgY29tbWFuZCB0b1xuICAgKiB0aGUgc3lzdGVtIHNoZWxsLlxuICAgKi9cbiAgc2hlbGwsXG4gIC8qKlxuICAgKiBXZWIgc2VhcmNoIGFsbG93cyBtb2RlbHMgdG8gYWNjZXNzIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW50ZXJuZXRcbiAgICogYW5kIHByb3ZpZGUgYW5zd2VycyB3aXRoIHNvdXJjZWQgY2l0YXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gc2VhcmNoQ29udGV4dFNpemUgLSBUaGUgc2VhcmNoIGNvbnRleHQgc2l6ZSB0byB1c2UgZm9yIHRoZSB3ZWIgc2VhcmNoLlxuICAgKiBAcGFyYW0gdXNlckxvY2F0aW9uIC0gVGhlIHVzZXIgbG9jYXRpb24gdG8gdXNlIGZvciB0aGUgd2ViIHNlYXJjaC5cbiAgICovXG4gIHdlYlNlYXJjaFByZXZpZXcsXG4gIC8qKlxuICAgKiBXZWIgc2VhcmNoIGFsbG93cyBtb2RlbHMgdG8gYWNjZXNzIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgaW50ZXJuZXRcbiAgICogYW5kIHByb3ZpZGUgYW5zd2VycyB3aXRoIHNvdXJjZWQgY2l0YXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVycyAtIFRoZSBmaWx0ZXJzIHRvIHVzZSBmb3IgdGhlIHdlYiBzZWFyY2guXG4gICAqIEBwYXJhbSBzZWFyY2hDb250ZXh0U2l6ZSAtIFRoZSBzZWFyY2ggY29udGV4dCBzaXplIHRvIHVzZSBmb3IgdGhlIHdlYiBzZWFyY2guXG4gICAqIEBwYXJhbSB1c2VyTG9jYXRpb24gLSBUaGUgdXNlciBsb2NhdGlvbiB0byB1c2UgZm9yIHRoZSB3ZWIgc2VhcmNoLlxuICAgKi9cbiAgd2ViU2VhcmNoLFxuICAvKipcbiAgICogTUNQIChNb2RlbCBDb250ZXh0IFByb3RvY29sKSBhbGxvd3MgbW9kZWxzIHRvIGNhbGwgdG9vbHMgZXhwb3NlZCBieVxuICAgKiByZW1vdGUgTUNQIHNlcnZlcnMgb3Igc2VydmljZSBjb25uZWN0b3JzLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmVyTGFiZWwgLSBMYWJlbCB0byBpZGVudGlmeSB0aGUgTUNQIHNlcnZlci5cbiAgICogQHBhcmFtIGFsbG93ZWRUb29scyAtIEFsbG93ZWQgdG9vbCBuYW1lcyBvciBmaWx0ZXIgb2JqZWN0LlxuICAgKiBAcGFyYW0gYXV0aG9yaXphdGlvbiAtIE9BdXRoIGFjY2VzcyB0b2tlbiBmb3IgdGhlIE1DUCBzZXJ2ZXIvY29ubmVjdG9yLlxuICAgKiBAcGFyYW0gY29ubmVjdG9ySWQgLSBJZGVudGlmaWVyIGZvciBhIHNlcnZpY2UgY29ubmVjdG9yLlxuICAgKiBAcGFyYW0gaGVhZGVycyAtIE9wdGlvbmFsIGhlYWRlcnMgdG8gaW5jbHVkZSBpbiBNQ1AgcmVxdWVzdHMuXG4gICAqIC8vIHBhcmFtIHJlcXVpcmVBcHByb3ZhbCAtIEFwcHJvdmFsIHBvbGljeSAoJ2Fsd2F5cyd8J25ldmVyJ3xmaWx0ZXIgb2JqZWN0KS4gKFJlbW92ZWQgLSBhbHdheXMgJ25ldmVyJylcbiAgICogQHBhcmFtIHNlcnZlckRlc2NyaXB0aW9uIC0gT3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHNlcnZlci5cbiAgICogQHBhcmFtIHNlcnZlclVybCAtIFVSTCBmb3IgdGhlIE1DUCBzZXJ2ZXIuXG4gICAqL1xuICBtY3AsXG4gIC8qKlxuICAgKiBUb29sIHNlYXJjaCBhbGxvd3MgdGhlIG1vZGVsIHRvIGR5bmFtaWNhbGx5IHNlYXJjaCBmb3IgYW5kIGxvYWQgZGVmZXJyZWRcbiAgICogdG9vbHMgaW50byB0aGUgbW9kZWwncyBjb250ZXh0IGFzIG5lZWRlZC4gVGhpcyBoZWxwcyByZWR1Y2Ugb3ZlcmFsbCB0b2tlblxuICAgKiB1c2FnZSwgY29zdCwgYW5kIGxhdGVuY3kgYnkgb25seSBsb2FkaW5nIHRvb2xzIHdoZW4gdGhlIG1vZGVsIG5lZWRzIHRoZW0uXG4gICAqXG4gICAqIFRvIHVzZSB0b29sIHNlYXJjaCwgbWFyayBmdW5jdGlvbnMgb3IgbmFtZXNwYWNlcyB3aXRoIGBkZWZlcl9sb2FkaW5nOiB0cnVlYFxuICAgKiBpbiB0aGUgdG9vbHMgYXJyYXkuIFRoZSBtb2RlbCB3aWxsIHVzZSB0b29sIHNlYXJjaCB0byBsb2FkIHRoZXNlIHRvb2xzXG4gICAqIHdoZW4gaXQgZGV0ZXJtaW5lcyB0aGV5IGFyZSBuZWVkZWQuXG4gICAqL1xuICB0b29sU2VhcmNoXG59O1xuXG4vLyBzcmMvcmVzcG9uc2VzL29wZW5haS1yZXNwb25zZXMtbGFuZ3VhZ2UtbW9kZWwudHNcbmltcG9ydCB7XG4gIEFQSUNhbGxFcnJvclxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xuaW1wb3J0IHtcbiAgY29tYmluZUhlYWRlcnMgYXMgY29tYmluZUhlYWRlcnM1LFxuICBjcmVhdGVFdmVudFNvdXJjZVJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVFdmVudFNvdXJjZVJlc3BvbnNlSGFuZGxlcjMsXG4gIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjUsXG4gIGNyZWF0ZVRvb2xOYW1lTWFwcGluZyxcbiAgZ2VuZXJhdGVJZCBhcyBnZW5lcmF0ZUlkMixcbiAgcGFyc2VQcm92aWRlck9wdGlvbnMgYXMgcGFyc2VQcm92aWRlck9wdGlvbnM1LFxuICBwb3N0SnNvblRvQXBpIGFzIHBvc3RKc29uVG9BcGk1XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5cbi8vIHNyYy9yZXNwb25zZXMvY29udmVydC1vcGVuYWktcmVzcG9uc2VzLXVzYWdlLnRzXG5mdW5jdGlvbiBjb252ZXJ0T3BlbkFJUmVzcG9uc2VzVXNhZ2UodXNhZ2UpIHtcbiAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICBpZiAodXNhZ2UgPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dFRva2Vuczoge1xuICAgICAgICB0b3RhbDogdm9pZCAwLFxuICAgICAgICBub0NhY2hlOiB2b2lkIDAsXG4gICAgICAgIGNhY2hlUmVhZDogdm9pZCAwLFxuICAgICAgICBjYWNoZVdyaXRlOiB2b2lkIDBcbiAgICAgIH0sXG4gICAgICBvdXRwdXRUb2tlbnM6IHtcbiAgICAgICAgdG90YWw6IHZvaWQgMCxcbiAgICAgICAgdGV4dDogdm9pZCAwLFxuICAgICAgICByZWFzb25pbmc6IHZvaWQgMFxuICAgICAgfSxcbiAgICAgIHJhdzogdm9pZCAwXG4gICAgfTtcbiAgfVxuICBjb25zdCBpbnB1dFRva2VucyA9IHVzYWdlLmlucHV0X3Rva2VucztcbiAgY29uc3Qgb3V0cHV0VG9rZW5zID0gdXNhZ2Uub3V0cHV0X3Rva2VucztcbiAgY29uc3QgY2FjaGVkVG9rZW5zID0gKF9iID0gKF9hID0gdXNhZ2UuaW5wdXRfdG9rZW5zX2RldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWNoZWRfdG9rZW5zKSAhPSBudWxsID8gX2IgOiAwO1xuICBjb25zdCByZWFzb25pbmdUb2tlbnMgPSAoX2QgPSAoX2MgPSB1c2FnZS5vdXRwdXRfdG9rZW5zX2RldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfYy5yZWFzb25pbmdfdG9rZW5zKSAhPSBudWxsID8gX2QgOiAwO1xuICByZXR1cm4ge1xuICAgIGlucHV0VG9rZW5zOiB7XG4gICAgICB0b3RhbDogaW5wdXRUb2tlbnMsXG4gICAgICBub0NhY2hlOiBpbnB1dFRva2VucyAtIGNhY2hlZFRva2VucyxcbiAgICAgIGNhY2hlUmVhZDogY2FjaGVkVG9rZW5zLFxuICAgICAgY2FjaGVXcml0ZTogdm9pZCAwXG4gICAgfSxcbiAgICBvdXRwdXRUb2tlbnM6IHtcbiAgICAgIHRvdGFsOiBvdXRwdXRUb2tlbnMsXG4gICAgICB0ZXh0OiBvdXRwdXRUb2tlbnMgLSByZWFzb25pbmdUb2tlbnMsXG4gICAgICByZWFzb25pbmc6IHJlYXNvbmluZ1Rva2Vuc1xuICAgIH0sXG4gICAgcmF3OiB1c2FnZVxuICB9O1xufVxuXG4vLyBzcmMvcmVzcG9uc2VzL2NvbnZlcnQtdG8tb3BlbmFpLXJlc3BvbnNlcy1pbnB1dC50c1xuaW1wb3J0IHtcbiAgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3IgYXMgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3I0XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5pbXBvcnQge1xuICBjb252ZXJ0VG9CYXNlNjQgYXMgY29udmVydFRvQmFzZTY0MixcbiAgaXNOb25OdWxsYWJsZSxcbiAgcGFyc2VKU09OLFxuICBwYXJzZVByb3ZpZGVyT3B0aW9ucyBhcyBwYXJzZVByb3ZpZGVyT3B0aW9uczQsXG4gIHZhbGlkYXRlVHlwZXNcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejIwIH0gZnJvbSBcInpvZC92NFwiO1xuZnVuY3Rpb24gaXNGaWxlSWQoZGF0YSwgcHJlZml4ZXMpIHtcbiAgaWYgKCFwcmVmaXhlcykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcHJlZml4ZXMuc29tZSgocHJlZml4KSA9PiBkYXRhLnN0YXJ0c1dpdGgocHJlZml4KSk7XG59XG5hc3luYyBmdW5jdGlvbiBjb252ZXJ0VG9PcGVuQUlSZXNwb25zZXNJbnB1dCh7XG4gIHByb21wdCxcbiAgdG9vbE5hbWVNYXBwaW5nLFxuICBzeXN0ZW1NZXNzYWdlTW9kZSxcbiAgcHJvdmlkZXJPcHRpb25zTmFtZSxcbiAgZmlsZUlkUHJlZml4ZXMsXG4gIHN0b3JlLFxuICBoYXNDb252ZXJzYXRpb24gPSBmYWxzZSxcbiAgaGFzTG9jYWxTaGVsbFRvb2wgPSBmYWxzZSxcbiAgaGFzU2hlbGxUb29sID0gZmFsc2UsXG4gIGhhc0FwcGx5UGF0Y2hUb29sID0gZmFsc2UsXG4gIGN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzXG59KSB7XG4gIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9pLCBfaiwgX2ssIF9sLCBfbSwgX24sIF9vLCBfcCwgX3E7XG4gIGxldCBpbnB1dCA9IFtdO1xuICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICBjb25zdCBwcm9jZXNzZWRBcHByb3ZhbElkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3QgeyByb2xlLCBjb250ZW50IH0gb2YgcHJvbXB0KSB7XG4gICAgc3dpdGNoIChyb2xlKSB7XG4gICAgICBjYXNlIFwic3lzdGVtXCI6IHtcbiAgICAgICAgc3dpdGNoIChzeXN0ZW1NZXNzYWdlTW9kZSkge1xuICAgICAgICAgIGNhc2UgXCJzeXN0ZW1cIjoge1xuICAgICAgICAgICAgaW5wdXQucHVzaCh7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImRldmVsb3BlclwiOiB7XG4gICAgICAgICAgICBpbnB1dC5wdXNoKHsgcm9sZTogXCJkZXZlbG9wZXJcIiwgY29udGVudCB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwic3lzdGVtIG1lc3NhZ2VzIGFyZSByZW1vdmVkIGZvciB0aGlzIG1vZGVsXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGNvbnN0IF9leGhhdXN0aXZlQ2hlY2sgPSBzeXN0ZW1NZXNzYWdlTW9kZTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFVuc3VwcG9ydGVkIHN5c3RlbSBtZXNzYWdlIG1vZGU6ICR7X2V4aGF1c3RpdmVDaGVja31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ1c2VyXCI6IHtcbiAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgcm9sZTogXCJ1c2VyXCIsXG4gICAgICAgICAgY29udGVudDogY29udGVudC5tYXAoKHBhcnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EyLCBfYjIsIF9jMjtcbiAgICAgICAgICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0eXBlOiBcImlucHV0X3RleHRcIiwgdGV4dDogcGFydC50ZXh0IH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcImZpbGVcIjoge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0Lm1lZGlhVHlwZS5zdGFydHNXaXRoKFwiaW1hZ2UvXCIpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBwYXJ0Lm1lZGlhVHlwZSA9PT0gXCJpbWFnZS8qXCIgPyBcImltYWdlL2pwZWdcIiA6IHBhcnQubWVkaWFUeXBlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnB1dF9pbWFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAuLi5wYXJ0LmRhdGEgaW5zdGFuY2VvZiBVUkwgPyB7IGltYWdlX3VybDogcGFydC5kYXRhLnRvU3RyaW5nKCkgfSA6IHR5cGVvZiBwYXJ0LmRhdGEgPT09IFwic3RyaW5nXCIgJiYgaXNGaWxlSWQocGFydC5kYXRhLCBmaWxlSWRQcmVmaXhlcykgPyB7IGZpbGVfaWQ6IHBhcnQuZGF0YSB9IDoge1xuICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3VybDogYGRhdGE6JHttZWRpYVR5cGV9O2Jhc2U2NCwke2NvbnZlcnRUb0Jhc2U2NDIocGFydC5kYXRhKX1gXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDogKF9iMiA9IChfYTIgPSBwYXJ0LnByb3ZpZGVyT3B0aW9ucykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMltwcm92aWRlck9wdGlvbnNOYW1lXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iMi5pbWFnZURldGFpbFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQubWVkaWFUeXBlID09PSBcImFwcGxpY2F0aW9uL3BkZlwiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocGFydC5kYXRhIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnB1dF9maWxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZV91cmw6IHBhcnQuZGF0YS50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlucHV0X2ZpbGVcIixcbiAgICAgICAgICAgICAgICAgICAgLi4udHlwZW9mIHBhcnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJiBpc0ZpbGVJZChwYXJ0LmRhdGEsIGZpbGVJZFByZWZpeGVzKSA/IHsgZmlsZV9pZDogcGFydC5kYXRhIH0gOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IChfYzIgPSBwYXJ0LmZpbGVuYW1lKSAhPSBudWxsID8gX2MyIDogYHBhcnQtJHtpbmRleH0ucGRmYCxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlX2RhdGE6IGBkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsJHtjb252ZXJ0VG9CYXNlNjQyKHBhcnQuZGF0YSl9YFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3I0KHtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25hbGl0eTogYGZpbGUgcGFydCBtZWRpYSB0eXBlICR7cGFydC5tZWRpYVR5cGV9YFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFzc2lzdGFudFwiOiB7XG4gICAgICAgIGNvbnN0IHJlYXNvbmluZ01lc3NhZ2VzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBjb250ZW50KSB7XG4gICAgICAgICAgc3dpdGNoIChwYXJ0LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgcHJvdmlkZXJPcHRzID0gKF9hID0gcGFydC5wcm92aWRlck9wdGlvbnMpID09IG51bGwgPyB2b2lkIDAgOiBfYVtwcm92aWRlck9wdGlvbnNOYW1lXTtcbiAgICAgICAgICAgICAgY29uc3QgaWQgPSBwcm92aWRlck9wdHMgPT0gbnVsbCA/IHZvaWQgMCA6IHByb3ZpZGVyT3B0cy5pdGVtSWQ7XG4gICAgICAgICAgICAgIGNvbnN0IHBoYXNlID0gcHJvdmlkZXJPcHRzID09IG51bGwgPyB2b2lkIDAgOiBwcm92aWRlck9wdHMucGhhc2U7XG4gICAgICAgICAgICAgIGlmIChoYXNDb252ZXJzYXRpb24gJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzdG9yZSAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQucHVzaCh7IHR5cGU6IFwiaXRlbV9yZWZlcmVuY2VcIiwgaWQgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbeyB0eXBlOiBcIm91dHB1dF90ZXh0XCIsIHRleHQ6IHBhcnQudGV4dCB9XSxcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAuLi5waGFzZSAhPSBudWxsICYmIHsgcGhhc2UgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidG9vbC1jYWxsXCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgaWQgPSAoX2YgPSAoX2MgPSAoX2IgPSBwYXJ0LnByb3ZpZGVyT3B0aW9ucykgPT0gbnVsbCA/IHZvaWQgMCA6IF9iW3Byb3ZpZGVyT3B0aW9uc05hbWVdKSA9PSBudWxsID8gdm9pZCAwIDogX2MuaXRlbUlkKSAhPSBudWxsID8gX2YgOiAoX2UgPSAoX2QgPSBwYXJ0LnByb3ZpZGVyTWV0YWRhdGEpID09IG51bGwgPyB2b2lkIDAgOiBfZFtwcm92aWRlck9wdGlvbnNOYW1lXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lLml0ZW1JZDtcbiAgICAgICAgICAgICAgaWYgKGhhc0NvbnZlcnNhdGlvbiAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRUb29sTmFtZSA9IHRvb2xOYW1lTWFwcGluZy50b1Byb3ZpZGVyVG9vbE5hbWUoXG4gICAgICAgICAgICAgICAgcGFydC50b29sTmFtZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRUb29sTmFtZSA9PT0gXCJ0b29sX3NlYXJjaFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JlICYmIGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIGlucHV0LnB1c2goeyB0eXBlOiBcIml0ZW1fcmVmZXJlbmNlXCIsIGlkIH0pO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZElucHV0ID0gdHlwZW9mIHBhcnQuaW5wdXQgPT09IFwic3RyaW5nXCIgPyBhd2FpdCBwYXJzZUpTT04oe1xuICAgICAgICAgICAgICAgICAgdGV4dDogcGFydC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgIHNjaGVtYTogdG9vbFNlYXJjaElucHV0U2NoZW1hXG4gICAgICAgICAgICAgICAgfSkgOiBhd2FpdCB2YWxpZGF0ZVR5cGVzKHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJ0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgc2NoZW1hOiB0b29sU2VhcmNoSW5wdXRTY2hlbWFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRpb24gPSBwYXJzZWRJbnB1dC5jYWxsX2lkICE9IG51bGwgPyBcImNsaWVudFwiIDogXCJzZXJ2ZXJcIjtcbiAgICAgICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbF9zZWFyY2hfY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IGlkICE9IG51bGwgPyBpZCA6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbixcbiAgICAgICAgICAgICAgICAgIGNhbGxfaWQ6IChfZyA9IHBhcnNlZElucHV0LmNhbGxfaWQpICE9IG51bGwgPyBfZyA6IG51bGwsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgICBhcmd1bWVudHM6IHBhcnNlZElucHV0LmFyZ3VtZW50c1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChwYXJ0LnByb3ZpZGVyRXhlY3V0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmUgJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgaW5wdXQucHVzaCh7IHR5cGU6IFwiaXRlbV9yZWZlcmVuY2VcIiwgaWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzdG9yZSAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQucHVzaCh7IHR5cGU6IFwiaXRlbV9yZWZlcmVuY2VcIiwgaWQgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhhc0xvY2FsU2hlbGxUb29sICYmIHJlc29sdmVkVG9vbE5hbWUgPT09IFwibG9jYWxfc2hlbGxcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZElucHV0ID0gYXdhaXQgdmFsaWRhdGVUeXBlcyh7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogcGFydC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgIHNjaGVtYTogbG9jYWxTaGVsbElucHV0U2NoZW1hXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImxvY2FsX3NoZWxsX2NhbGxcIixcbiAgICAgICAgICAgICAgICAgIGNhbGxfaWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXhlY1wiLFxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBwYXJzZWRJbnB1dC5hY3Rpb24uY29tbWFuZCxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dF9tczogcGFyc2VkSW5wdXQuYWN0aW9uLnRpbWVvdXRNcyxcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogcGFyc2VkSW5wdXQuYWN0aW9uLnVzZXIsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtpbmdfZGlyZWN0b3J5OiBwYXJzZWRJbnB1dC5hY3Rpb24ud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgICAgICAgICAgICAgICAgZW52OiBwYXJzZWRJbnB1dC5hY3Rpb24uZW52XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhhc1NoZWxsVG9vbCAmJiByZXNvbHZlZFRvb2xOYW1lID09PSBcInNoZWxsXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRJbnB1dCA9IGF3YWl0IHZhbGlkYXRlVHlwZXMoe1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IHBhcnQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICBzY2hlbWE6IHNoZWxsSW5wdXRTY2hlbWFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2hlbGxfY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgY2FsbF9pZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgICBhY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHM6IHBhcnNlZElucHV0LmFjdGlvbi5jb21tYW5kcyxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dF9tczogcGFyc2VkSW5wdXQuYWN0aW9uLnRpbWVvdXRNcyxcbiAgICAgICAgICAgICAgICAgICAgbWF4X291dHB1dF9sZW5ndGg6IHBhcnNlZElucHV0LmFjdGlvbi5tYXhPdXRwdXRMZW5ndGhcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaGFzQXBwbHlQYXRjaFRvb2wgJiYgcmVzb2x2ZWRUb29sTmFtZSA9PT0gXCJhcHBseV9wYXRjaFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkSW5wdXQgPSBhd2FpdCB2YWxpZGF0ZVR5cGVzKHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJ0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgc2NoZW1hOiBhcHBseVBhdGNoSW5wdXRTY2hlbWFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXBwbHlfcGF0Y2hfY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgY2FsbF9pZDogcGFyc2VkSW5wdXQuY2FsbElkLFxuICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgICBvcGVyYXRpb246IHBhcnNlZElucHV0Lm9wZXJhdGlvblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjdXN0b21Qcm92aWRlclRvb2xOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY3VzdG9tUHJvdmlkZXJUb29sTmFtZXMuaGFzKHJlc29sdmVkVG9vbE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImN1c3RvbV90b29sX2NhbGxcIixcbiAgICAgICAgICAgICAgICAgIGNhbGxfaWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHJlc29sdmVkVG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogdHlwZW9mIHBhcnQuaW5wdXQgPT09IFwic3RyaW5nXCIgPyBwYXJ0LmlucHV0IDogSlNPTi5zdHJpbmdpZnkocGFydC5pbnB1dCksXG4gICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25fY2FsbFwiLFxuICAgICAgICAgICAgICAgIGNhbGxfaWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiByZXNvbHZlZFRvb2xOYW1lLFxuICAgICAgICAgICAgICAgIGFyZ3VtZW50czogSlNPTi5zdHJpbmdpZnkocGFydC5pbnB1dCksXG4gICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXNzaXN0YW50IHRvb2wgcmVzdWx0IHBhcnRzIGFyZSBmcm9tIHByb3ZpZGVyLWV4ZWN1dGVkIHRvb2xzOlxuICAgICAgICAgICAgY2FzZSBcInRvb2wtcmVzdWx0XCI6IHtcbiAgICAgICAgICAgICAgaWYgKHBhcnQub3V0cHV0LnR5cGUgPT09IFwiZXhlY3V0aW9uLWRlbmllZFwiIHx8IHBhcnQub3V0cHV0LnR5cGUgPT09IFwianNvblwiICYmIHR5cGVvZiBwYXJ0Lm91dHB1dC52YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBwYXJ0Lm91dHB1dC52YWx1ZSAhPSBudWxsICYmIFwidHlwZVwiIGluIHBhcnQub3V0cHV0LnZhbHVlICYmIHBhcnQub3V0cHV0LnZhbHVlLnR5cGUgPT09IFwiZXhlY3V0aW9uLWRlbmllZFwiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhhc0NvbnZlcnNhdGlvbikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkUmVzdWx0VG9vbE5hbWUgPSB0b29sTmFtZU1hcHBpbmcudG9Qcm92aWRlclRvb2xOYW1lKFxuICAgICAgICAgICAgICAgIHBhcnQudG9vbE5hbWVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVzdWx0VG9vbE5hbWUgPT09IFwidG9vbF9zZWFyY2hcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IChfaiA9IChfaSA9IChfaCA9IHBhcnQucHJvdmlkZXJPcHRpb25zKSA9PSBudWxsID8gdm9pZCAwIDogX2hbcHJvdmlkZXJPcHRpb25zTmFtZV0pID09IG51bGwgPyB2b2lkIDAgOiBfaS5pdGVtSWQpICE9IG51bGwgPyBfaiA6IHBhcnQudG9vbENhbGxJZDtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgIGlucHV0LnB1c2goeyB0eXBlOiBcIml0ZW1fcmVmZXJlbmNlXCIsIGlkOiBpdGVtSWQgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0Lm91dHB1dC50eXBlID09PSBcImpzb25cIikge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkT3V0cHV0ID0gYXdhaXQgdmFsaWRhdGVUeXBlcyh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJ0Lm91dHB1dC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiB0b29sU2VhcmNoT3V0cHV0U2NoZW1hXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2xfc2VhcmNoX291dHB1dFwiLFxuICAgICAgICAgICAgICAgICAgICBpZDogaXRlbUlkLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb246IFwic2VydmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxfaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJjb21wbGV0ZWRcIixcbiAgICAgICAgICAgICAgICAgICAgdG9vbHM6IHBhcnNlZE91dHB1dC50b29sc1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChoYXNTaGVsbFRvb2wgJiYgcmVzb2x2ZWRSZXN1bHRUb29sTmFtZSA9PT0gXCJzaGVsbFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQub3V0cHV0LnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRPdXRwdXQgPSBhd2FpdCB2YWxpZGF0ZVR5cGVzKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBhcnQub3V0cHV0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNoZWxsT3V0cHV0U2NoZW1hXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNoZWxsX2NhbGxfb3V0cHV0XCIsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxfaWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiBwYXJzZWRPdXRwdXQub3V0cHV0Lm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ6IGl0ZW0uc3Rkb3V0LFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycjogaXRlbS5zdGRlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZTogaXRlbS5vdXRjb21lLnR5cGUgPT09IFwidGltZW91dFwiID8geyB0eXBlOiBcInRpbWVvdXRcIiB9IDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJleGl0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGl0X2NvZGU6IGl0ZW0ub3V0Y29tZS5leGl0Q29kZVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHN0b3JlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUlkID0gKF9tID0gKF9sID0gKF9rID0gcGFydC5wcm92aWRlck9wdGlvbnMpID09IG51bGwgPyB2b2lkIDAgOiBfa1twcm92aWRlck9wdGlvbnNOYW1lXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9sLml0ZW1JZCkgIT0gbnVsbCA/IF9tIDogcGFydC50b29sQ2FsbElkO1xuICAgICAgICAgICAgICAgIGlucHV0LnB1c2goeyB0eXBlOiBcIml0ZW1fcmVmZXJlbmNlXCIsIGlkOiBpdGVtSWQgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgUmVzdWx0cyBmb3IgT3BlbkFJIHRvb2wgJHtwYXJ0LnRvb2xOYW1lfSBhcmUgbm90IHNlbnQgdG8gdGhlIEFQSSB3aGVuIHN0b3JlIGlzIGZhbHNlYFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInJlYXNvbmluZ1wiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyT3B0aW9ucyA9IGF3YWl0IHBhcnNlUHJvdmlkZXJPcHRpb25zNCh7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXI6IHByb3ZpZGVyT3B0aW9uc05hbWUsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBwYXJ0LnByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IG9wZW5haVJlc3BvbnNlc1JlYXNvbmluZ1Byb3ZpZGVyT3B0aW9uc1NjaGVtYVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3QgcmVhc29uaW5nSWQgPSBwcm92aWRlck9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IHByb3ZpZGVyT3B0aW9ucy5pdGVtSWQ7XG4gICAgICAgICAgICAgIGlmIChoYXNDb252ZXJzYXRpb24gJiYgcmVhc29uaW5nSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZWFzb25pbmdJZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhc29uaW5nTWVzc2FnZSA9IHJlYXNvbmluZ01lc3NhZ2VzW3JlYXNvbmluZ0lkXTtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChyZWFzb25pbmdNZXNzYWdlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQucHVzaCh7IHR5cGU6IFwiaXRlbV9yZWZlcmVuY2VcIiwgaWQ6IHJlYXNvbmluZ0lkIH0pO1xuICAgICAgICAgICAgICAgICAgICByZWFzb25pbmdNZXNzYWdlc1tyZWFzb25pbmdJZF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJyZWFzb25pbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICBpZDogcmVhc29uaW5nSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogW11cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeVBhcnRzID0gW107XG4gICAgICAgICAgICAgICAgICBpZiAocGFydC50ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3VtbWFyeV90ZXh0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgdGV4dDogcGFydC50ZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWFzb25pbmdNZXNzYWdlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBDYW5ub3QgYXBwZW5kIGVtcHR5IHJlYXNvbmluZyBwYXJ0IHRvIGV4aXN0aW5nIHJlYXNvbmluZyBzZXF1ZW5jZS4gU2tpcHBpbmcgcmVhc29uaW5nIHBhcnQ6ICR7SlNPTi5zdHJpbmdpZnkocGFydCl9LmBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAocmVhc29uaW5nTWVzc2FnZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbmluZ01lc3NhZ2VzW3JlYXNvbmluZ0lkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGlkOiByZWFzb25pbmdJZCxcbiAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRfY29udGVudDogcHJvdmlkZXJPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBwcm92aWRlck9wdGlvbnMucmVhc29uaW5nRW5jcnlwdGVkQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJ5UGFydHNcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQucHVzaChyZWFzb25pbmdNZXNzYWdlc1tyZWFzb25pbmdJZF0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uaW5nTWVzc2FnZS5zdW1tYXJ5LnB1c2goLi4uc3VtbWFyeVBhcnRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChwcm92aWRlck9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IHByb3ZpZGVyT3B0aW9ucy5yZWFzb25pbmdFbmNyeXB0ZWRDb250ZW50KSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVhc29uaW5nTWVzc2FnZS5lbmNyeXB0ZWRfY29udGVudCA9IHByb3ZpZGVyT3B0aW9ucy5yZWFzb25pbmdFbmNyeXB0ZWRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuY3J5cHRlZENvbnRlbnQgPSBwcm92aWRlck9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IHByb3ZpZGVyT3B0aW9ucy5yZWFzb25pbmdFbmNyeXB0ZWRDb250ZW50O1xuICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWRDb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlQYXJ0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgaWYgKHBhcnQudGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnlQYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN1bW1hcnlfdGV4dFwiLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHBhcnQudGV4dFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRfY29udGVudDogZW5jcnlwdGVkQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyeVBhcnRzXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYE5vbi1PcGVuQUkgcmVhc29uaW5nIHBhcnRzIGFyZSBub3Qgc3VwcG9ydGVkLiBTa2lwcGluZyByZWFzb25pbmcgcGFydDogJHtKU09OLnN0cmluZ2lmeShwYXJ0KX0uYFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ0b29sXCI6IHtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGNvbnRlbnQpIHtcbiAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcInRvb2wtYXBwcm92YWwtcmVzcG9uc2VcIikge1xuICAgICAgICAgICAgY29uc3QgYXBwcm92YWxSZXNwb25zZSA9IHBhcnQ7XG4gICAgICAgICAgICBpZiAocHJvY2Vzc2VkQXBwcm92YWxJZHMuaGFzKGFwcHJvdmFsUmVzcG9uc2UuYXBwcm92YWxJZCkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9jZXNzZWRBcHByb3ZhbElkcy5hZGQoYXBwcm92YWxSZXNwb25zZS5hcHByb3ZhbElkKTtcbiAgICAgICAgICAgIGlmIChzdG9yZSkge1xuICAgICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIml0ZW1fcmVmZXJlbmNlXCIsXG4gICAgICAgICAgICAgICAgaWQ6IGFwcHJvdmFsUmVzcG9uc2UuYXBwcm92YWxJZFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcIm1jcF9hcHByb3ZhbF9yZXNwb25zZVwiLFxuICAgICAgICAgICAgICBhcHByb3ZhbF9yZXF1ZXN0X2lkOiBhcHByb3ZhbFJlc3BvbnNlLmFwcHJvdmFsSWQsXG4gICAgICAgICAgICAgIGFwcHJvdmU6IGFwcHJvdmFsUmVzcG9uc2UuYXBwcm92ZWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHBhcnQub3V0cHV0O1xuICAgICAgICAgIGlmIChvdXRwdXQudHlwZSA9PT0gXCJleGVjdXRpb24tZGVuaWVkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGFwcHJvdmFsSWQgPSAoX28gPSAoX24gPSBvdXRwdXQucHJvdmlkZXJPcHRpb25zKSA9PSBudWxsID8gdm9pZCAwIDogX24ub3BlbmFpKSA9PSBudWxsID8gdm9pZCAwIDogX28uYXBwcm92YWxJZDtcbiAgICAgICAgICAgIGlmIChhcHByb3ZhbElkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZXNvbHZlZFRvb2xOYW1lID0gdG9vbE5hbWVNYXBwaW5nLnRvUHJvdmlkZXJUb29sTmFtZShcbiAgICAgICAgICAgIHBhcnQudG9vbE5hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyZXNvbHZlZFRvb2xOYW1lID09PSBcInRvb2xfc2VhcmNoXCIgJiYgb3V0cHV0LnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRPdXRwdXQgPSBhd2FpdCB2YWxpZGF0ZVR5cGVzKHtcbiAgICAgICAgICAgICAgdmFsdWU6IG91dHB1dC52YWx1ZSxcbiAgICAgICAgICAgICAgc2NoZW1hOiB0b29sU2VhcmNoT3V0cHV0U2NoZW1hXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcInRvb2xfc2VhcmNoX291dHB1dFwiLFxuICAgICAgICAgICAgICBleGVjdXRpb246IFwiY2xpZW50XCIsXG4gICAgICAgICAgICAgIGNhbGxfaWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgc3RhdHVzOiBcImNvbXBsZXRlZFwiLFxuICAgICAgICAgICAgICB0b29sczogcGFyc2VkT3V0cHV0LnRvb2xzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFzTG9jYWxTaGVsbFRvb2wgJiYgcmVzb2x2ZWRUb29sTmFtZSA9PT0gXCJsb2NhbF9zaGVsbFwiICYmIG91dHB1dC50eXBlID09PSBcImpzb25cIikge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkT3V0cHV0ID0gYXdhaXQgdmFsaWRhdGVUeXBlcyh7XG4gICAgICAgICAgICAgIHZhbHVlOiBvdXRwdXQudmFsdWUsXG4gICAgICAgICAgICAgIHNjaGVtYTogbG9jYWxTaGVsbE91dHB1dFNjaGVtYVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJsb2NhbF9zaGVsbF9jYWxsX291dHB1dFwiLFxuICAgICAgICAgICAgICBjYWxsX2lkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG91dHB1dDogcGFyc2VkT3V0cHV0Lm91dHB1dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhc1NoZWxsVG9vbCAmJiByZXNvbHZlZFRvb2xOYW1lID09PSBcInNoZWxsXCIgJiYgb3V0cHV0LnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRPdXRwdXQgPSBhd2FpdCB2YWxpZGF0ZVR5cGVzKHtcbiAgICAgICAgICAgICAgdmFsdWU6IG91dHB1dC52YWx1ZSxcbiAgICAgICAgICAgICAgc2NoZW1hOiBzaGVsbE91dHB1dFNjaGVtYVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzaGVsbF9jYWxsX291dHB1dFwiLFxuICAgICAgICAgICAgICBjYWxsX2lkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIG91dHB1dDogcGFyc2VkT3V0cHV0Lm91dHB1dC5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgICAgICAgc3Rkb3V0OiBpdGVtLnN0ZG91dCxcbiAgICAgICAgICAgICAgICBzdGRlcnI6IGl0ZW0uc3RkZXJyLFxuICAgICAgICAgICAgICAgIG91dGNvbWU6IGl0ZW0ub3V0Y29tZS50eXBlID09PSBcInRpbWVvdXRcIiA/IHsgdHlwZTogXCJ0aW1lb3V0XCIgfSA6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXhpdFwiLFxuICAgICAgICAgICAgICAgICAgZXhpdF9jb2RlOiBpdGVtLm91dGNvbWUuZXhpdENvZGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhc0FwcGx5UGF0Y2hUb29sICYmIHBhcnQudG9vbE5hbWUgPT09IFwiYXBwbHlfcGF0Y2hcIiAmJiBvdXRwdXQudHlwZSA9PT0gXCJqc29uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZE91dHB1dCA9IGF3YWl0IHZhbGlkYXRlVHlwZXMoe1xuICAgICAgICAgICAgICB2YWx1ZTogb3V0cHV0LnZhbHVlLFxuICAgICAgICAgICAgICBzY2hlbWE6IGFwcGx5UGF0Y2hPdXRwdXRTY2hlbWFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiYXBwbHlfcGF0Y2hfY2FsbF9vdXRwdXRcIixcbiAgICAgICAgICAgICAgY2FsbF9pZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBzdGF0dXM6IHBhcnNlZE91dHB1dC5zdGF0dXMsXG4gICAgICAgICAgICAgIG91dHB1dDogcGFyc2VkT3V0cHV0Lm91dHB1dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzID09IG51bGwgPyB2b2lkIDAgOiBjdXN0b21Qcm92aWRlclRvb2xOYW1lcy5oYXMocmVzb2x2ZWRUb29sTmFtZSkpIHtcbiAgICAgICAgICAgIGxldCBvdXRwdXRWYWx1ZTtcbiAgICAgICAgICAgIHN3aXRjaCAob3V0cHV0LnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImVycm9yLXRleHRcIjpcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IG91dHB1dC52YWx1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImV4ZWN1dGlvbi1kZW5pZWRcIjpcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IChfcCA9IG91dHB1dC5yZWFzb24pICE9IG51bGwgPyBfcCA6IFwiVG9vbCBleGVjdXRpb24gZGVuaWVkLlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZXJyb3ItanNvblwiOlxuICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gSlNPTi5zdHJpbmdpZnkob3V0cHV0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImNvbnRlbnRcIjpcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IG91dHB1dC52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgIHZhciBfYTI7XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwiaW5wdXRfdGV4dFwiLCB0ZXh0OiBpdGVtLnRleHQgfTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImltYWdlLWRhdGFcIjpcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnB1dF9pbWFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiBgZGF0YToke2l0ZW0ubWVkaWFUeXBlfTtiYXNlNjQsJHtpdGVtLmRhdGF9YFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbWFnZS11cmxcIjpcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnB1dF9pbWFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiBpdGVtLnVybFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWxlLWRhdGFcIjpcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnB1dF9maWxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogKF9hMiA9IGl0ZW0uZmlsZW5hbWUpICE9IG51bGwgPyBfYTIgOiBcImRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGF0YTogYGRhdGE6JHtpdGVtLm1lZGlhVHlwZX07YmFzZTY0LCR7aXRlbS5kYXRhfWBcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZmlsZS11cmxcIjpcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnB1dF9maWxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3VybDogaXRlbS51cmxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHVuc3VwcG9ydGVkIGN1c3RvbSB0b29sIGNvbnRlbnQgcGFydCB0eXBlOiAke2l0ZW0udHlwZX1gXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5maWx0ZXIoaXNOb25OdWxsYWJsZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiY3VzdG9tX3Rvb2xfY2FsbF9vdXRwdXRcIixcbiAgICAgICAgICAgICAgY2FsbF9pZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBvdXRwdXQ6IG91dHB1dFZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgY29udGVudFZhbHVlO1xuICAgICAgICAgIHN3aXRjaCAob3V0cHV0LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICBjYXNlIFwiZXJyb3ItdGV4dFwiOlxuICAgICAgICAgICAgICBjb250ZW50VmFsdWUgPSBvdXRwdXQudmFsdWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImV4ZWN1dGlvbi1kZW5pZWRcIjpcbiAgICAgICAgICAgICAgY29udGVudFZhbHVlID0gKF9xID0gb3V0cHV0LnJlYXNvbikgIT0gbnVsbCA/IF9xIDogXCJUb29sIGV4ZWN1dGlvbiBkZW5pZWQuXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJlcnJvci1qc29uXCI6XG4gICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KG91dHB1dC52YWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNvbnRlbnRcIjpcbiAgICAgICAgICAgICAgY29udGVudFZhbHVlID0gb3V0cHV0LnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTI7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJpbnB1dF90ZXh0XCIsIHRleHQ6IGl0ZW0udGV4dCB9O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSBcImltYWdlLWRhdGFcIjoge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5wdXRfaW1hZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZV91cmw6IGBkYXRhOiR7aXRlbS5tZWRpYVR5cGV9O2Jhc2U2NCwke2l0ZW0uZGF0YX1gXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiaW1hZ2UtdXJsXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlucHV0X2ltYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiBpdGVtLnVybFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSBcImZpbGUtZGF0YVwiOiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnB1dF9maWxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IChfYTIgPSBpdGVtLmZpbGVuYW1lKSAhPSBudWxsID8gX2EyIDogXCJkYXRhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZV9kYXRhOiBgZGF0YToke2l0ZW0ubWVkaWFUeXBlfTtiYXNlNjQsJHtpdGVtLmRhdGF9YFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSBcImZpbGUtdXJsXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlucHV0X2ZpbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlX3VybDogaXRlbS51cmxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB1bnN1cHBvcnRlZCB0b29sIGNvbnRlbnQgcGFydCB0eXBlOiAke2l0ZW0udHlwZX1gXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSkuZmlsdGVyKGlzTm9uTnVsbGFibGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uX2NhbGxfb3V0cHV0XCIsXG4gICAgICAgICAgICBjYWxsX2lkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICBvdXRwdXQ6IGNvbnRlbnRWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gcm9sZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCByb2xlOiAke19leGhhdXN0aXZlQ2hlY2t9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghc3RvcmUgJiYgaW5wdXQuc29tZShcbiAgICAoaXRlbSkgPT4gXCJ0eXBlXCIgaW4gaXRlbSAmJiBpdGVtLnR5cGUgPT09IFwicmVhc29uaW5nXCIgJiYgaXRlbS5lbmNyeXB0ZWRfY29udGVudCA9PSBudWxsXG4gICkpIHtcbiAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgIG1lc3NhZ2U6IFwiUmVhc29uaW5nIHBhcnRzIHdpdGhvdXQgZW5jcnlwdGVkIGNvbnRlbnQgYXJlIG5vdCBzdXBwb3J0ZWQgd2hlbiBzdG9yZSBpcyBmYWxzZS4gU2tpcHBpbmcgcmVhc29uaW5nIHBhcnRzLlwiXG4gICAgfSk7XG4gICAgaW5wdXQgPSBpbnB1dC5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gIShcInR5cGVcIiBpbiBpdGVtKSB8fCBpdGVtLnR5cGUgIT09IFwicmVhc29uaW5nXCIgfHwgaXRlbS5lbmNyeXB0ZWRfY29udGVudCAhPSBudWxsXG4gICAgKTtcbiAgfVxuICByZXR1cm4geyBpbnB1dCwgd2FybmluZ3MgfTtcbn1cbnZhciBvcGVuYWlSZXNwb25zZXNSZWFzb25pbmdQcm92aWRlck9wdGlvbnNTY2hlbWEgPSB6MjAub2JqZWN0KHtcbiAgaXRlbUlkOiB6MjAuc3RyaW5nKCkubnVsbGlzaCgpLFxuICByZWFzb25pbmdFbmNyeXB0ZWRDb250ZW50OiB6MjAuc3RyaW5nKCkubnVsbGlzaCgpXG59KTtcblxuLy8gc3JjL3Jlc3BvbnNlcy9tYXAtb3BlbmFpLXJlc3BvbnNlcy1maW5pc2gtcmVhc29uLnRzXG5mdW5jdGlvbiBtYXBPcGVuQUlSZXNwb25zZUZpbmlzaFJlYXNvbih7XG4gIGZpbmlzaFJlYXNvbixcbiAgaGFzRnVuY3Rpb25DYWxsXG59KSB7XG4gIHN3aXRjaCAoZmluaXNoUmVhc29uKSB7XG4gICAgY2FzZSB2b2lkIDA6XG4gICAgY2FzZSBudWxsOlxuICAgICAgcmV0dXJuIGhhc0Z1bmN0aW9uQ2FsbCA/IFwidG9vbC1jYWxsc1wiIDogXCJzdG9wXCI7XG4gICAgY2FzZSBcIm1heF9vdXRwdXRfdG9rZW5zXCI6XG4gICAgICByZXR1cm4gXCJsZW5ndGhcIjtcbiAgICBjYXNlIFwiY29udGVudF9maWx0ZXJcIjpcbiAgICAgIHJldHVybiBcImNvbnRlbnQtZmlsdGVyXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBoYXNGdW5jdGlvbkNhbGwgPyBcInRvb2wtY2FsbHNcIiA6IFwib3RoZXJcIjtcbiAgfVxufVxuXG4vLyBzcmMvcmVzcG9uc2VzL29wZW5haS1yZXNwb25zZXMtYXBpLnRzXG5pbXBvcnQgeyBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWExOSwgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTE5IH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejIxIH0gZnJvbSBcInpvZC92NFwiO1xudmFyIGpzb25WYWx1ZVNjaGVtYTIgPSB6MjEubGF6eShcbiAgKCkgPT4gejIxLnVuaW9uKFtcbiAgICB6MjEuc3RyaW5nKCksXG4gICAgejIxLm51bWJlcigpLFxuICAgIHoyMS5ib29sZWFuKCksXG4gICAgejIxLm51bGwoKSxcbiAgICB6MjEuYXJyYXkoanNvblZhbHVlU2NoZW1hMiksXG4gICAgejIxLnJlY29yZCh6MjEuc3RyaW5nKCksIGpzb25WYWx1ZVNjaGVtYTIub3B0aW9uYWwoKSlcbiAgXSlcbik7XG52YXIgb3BlbmFpUmVzcG9uc2VzQ2h1bmtTY2hlbWEgPSBsYXp5U2NoZW1hMTkoXG4gICgpID0+IHpvZFNjaGVtYTE5KFxuICAgIHoyMS51bmlvbihbXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YVwiKSxcbiAgICAgICAgaXRlbV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICBkZWx0YTogejIxLnN0cmluZygpLFxuICAgICAgICBsb2dwcm9iczogejIxLmFycmF5KFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdG9rZW46IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGxvZ3Byb2I6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgICAgIHRvcF9sb2dwcm9iczogejIxLmFycmF5KFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0b2tlbjogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgIGxvZ3Byb2I6IHoyMS5udW1iZXIoKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG4gICAgICAgICkubnVsbGlzaCgpXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEuZW51bShbXCJyZXNwb25zZS5jb21wbGV0ZWRcIiwgXCJyZXNwb25zZS5pbmNvbXBsZXRlXCJdKSxcbiAgICAgICAgcmVzcG9uc2U6IHoyMS5vYmplY3Qoe1xuICAgICAgICAgIGluY29tcGxldGVfZGV0YWlsczogejIxLm9iamVjdCh7IHJlYXNvbjogejIxLnN0cmluZygpIH0pLm51bGxpc2goKSxcbiAgICAgICAgICB1c2FnZTogejIxLm9iamVjdCh7XG4gICAgICAgICAgICBpbnB1dF90b2tlbnM6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgICAgIGlucHV0X3Rva2Vuc19kZXRhaWxzOiB6MjEub2JqZWN0KHsgY2FjaGVkX3Rva2VuczogejIxLm51bWJlcigpLm51bGxpc2goKSB9KS5udWxsaXNoKCksXG4gICAgICAgICAgICBvdXRwdXRfdG9rZW5zOiB6MjEubnVtYmVyKCksXG4gICAgICAgICAgICBvdXRwdXRfdG9rZW5zX2RldGFpbHM6IHoyMS5vYmplY3QoeyByZWFzb25pbmdfdG9rZW5zOiB6MjEubnVtYmVyKCkubnVsbGlzaCgpIH0pLm51bGxpc2goKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNlcnZpY2VfdGllcjogejIxLnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5mYWlsZWRcIiksXG4gICAgICAgIHJlc3BvbnNlOiB6MjEub2JqZWN0KHtcbiAgICAgICAgICBlcnJvcjogejIxLm9iamVjdCh7XG4gICAgICAgICAgICBjb2RlOiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgbWVzc2FnZTogejIxLnN0cmluZygpXG4gICAgICAgICAgfSkubnVsbGlzaCgpLFxuICAgICAgICAgIGluY29tcGxldGVfZGV0YWlsczogejIxLm9iamVjdCh7IHJlYXNvbjogejIxLnN0cmluZygpIH0pLm51bGxpc2goKSxcbiAgICAgICAgICB1c2FnZTogejIxLm9iamVjdCh7XG4gICAgICAgICAgICBpbnB1dF90b2tlbnM6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgICAgIGlucHV0X3Rva2Vuc19kZXRhaWxzOiB6MjEub2JqZWN0KHsgY2FjaGVkX3Rva2VuczogejIxLm51bWJlcigpLm51bGxpc2goKSB9KS5udWxsaXNoKCksXG4gICAgICAgICAgICBvdXRwdXRfdG9rZW5zOiB6MjEubnVtYmVyKCksXG4gICAgICAgICAgICBvdXRwdXRfdG9rZW5zX2RldGFpbHM6IHoyMS5vYmplY3QoeyByZWFzb25pbmdfdG9rZW5zOiB6MjEubnVtYmVyKCkubnVsbGlzaCgpIH0pLm51bGxpc2goKVxuICAgICAgICAgIH0pLm51bGxpc2goKSxcbiAgICAgICAgICBzZXJ2aWNlX3RpZXI6IHoyMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwicmVzcG9uc2UuY3JlYXRlZFwiKSxcbiAgICAgICAgcmVzcG9uc2U6IHoyMS5vYmplY3Qoe1xuICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgY3JlYXRlZF9hdDogejIxLm51bWJlcigpLFxuICAgICAgICAgIG1vZGVsOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgc2VydmljZV90aWVyOiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlc3BvbnNlLm91dHB1dF9pdGVtLmFkZGVkXCIpLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgaXRlbTogejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJtZXNzYWdlXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHBoYXNlOiB6MjEuZW51bShbXCJjb21tZW50YXJ5XCIsIFwiZmluYWxfYW5zd2VyXCJdKS5udWxsaXNoKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwicmVhc29uaW5nXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGVuY3J5cHRlZF9jb250ZW50OiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImZ1bmN0aW9uX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgbmFtZTogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgYXJndW1lbnRzOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwid2ViX3NlYXJjaF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImNvbXB1dGVyX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiZmlsZV9zZWFyY2hfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiaW1hZ2VfZ2VuZXJhdGlvbl9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjb2RlX2ludGVycHJldGVyX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY29udGFpbmVyX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjb2RlOiB6MjEuc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICAgICAgICAgIG91dHB1dHM6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgICAgICAgIHoyMS5vYmplY3QoeyB0eXBlOiB6MjEubGl0ZXJhbChcImxvZ3NcIiksIGxvZ3M6IHoyMS5zdHJpbmcoKSB9KSxcbiAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHsgdHlwZTogejIxLmxpdGVyYWwoXCJpbWFnZVwiKSwgdXJsOiB6MjEuc3RyaW5nKCkgfSlcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICkubnVsbGFibGUoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcIm1jcF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgYXBwcm92YWxfcmVxdWVzdF9pZDogejIxLnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJtY3BfbGlzdF90b29sc1wiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibWNwX2FwcHJvdmFsX3JlcXVlc3RcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImFwcGx5X3BhdGNoX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiXSksXG4gICAgICAgICAgICBvcGVyYXRpb246IHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjcmVhdGVfZmlsZVwiKSxcbiAgICAgICAgICAgICAgICBwYXRoOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZGlmZjogejIxLnN0cmluZygpXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImRlbGV0ZV9maWxlXCIpLFxuICAgICAgICAgICAgICAgIHBhdGg6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJ1cGRhdGVfZmlsZVwiKSxcbiAgICAgICAgICAgICAgICBwYXRoOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZGlmZjogejIxLnN0cmluZygpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjdXN0b21fdG9vbF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIG5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGlucHV0OiB6MjEuc3RyaW5nKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwic2hlbGxfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5lbnVtKFtcImluX3Byb2dyZXNzXCIsIFwiY29tcGxldGVkXCIsIFwiaW5jb21wbGV0ZVwiXSksXG4gICAgICAgICAgICBhY3Rpb246IHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICBjb21tYW5kczogejIxLmFycmF5KHoyMS5zdHJpbmcoKSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInNoZWxsX2NhbGxfb3V0cHV0XCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLmVudW0oW1wiaW5fcHJvZ3Jlc3NcIiwgXCJjb21wbGV0ZWRcIiwgXCJpbmNvbXBsZXRlXCJdKSxcbiAgICAgICAgICAgIG91dHB1dDogejIxLmFycmF5KFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBzdGRvdXQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBzdGRlcnI6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBvdXRjb21lOiB6MjEuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHsgdHlwZTogejIxLmxpdGVyYWwoXCJ0aW1lb3V0XCIpIH0pLFxuICAgICAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiZXhpdFwiKSxcbiAgICAgICAgICAgICAgICAgICAgZXhpdF9jb2RlOiB6MjEubnVtYmVyKClcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwidG9vbF9zZWFyY2hfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBleGVjdXRpb246IHoyMS5lbnVtKFtcInNlcnZlclwiLCBcImNsaWVudFwiXSksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLmVudW0oW1wiaW5fcHJvZ3Jlc3NcIiwgXCJjb21wbGV0ZWRcIiwgXCJpbmNvbXBsZXRlXCJdKSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogejIxLnVua25vd24oKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJ0b29sX3NlYXJjaF9vdXRwdXRcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgZXhlY3V0aW9uOiB6MjEuZW51bShbXCJzZXJ2ZXJcIiwgXCJjbGllbnRcIl0pLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5lbnVtKFtcImluX3Byb2dyZXNzXCIsIFwiY29tcGxldGVkXCIsIFwiaW5jb21wbGV0ZVwiXSksXG4gICAgICAgICAgICB0b29sczogejIxLmFycmF5KHoyMS5yZWNvcmQoejIxLnN0cmluZygpLCBqc29uVmFsdWVTY2hlbWEyLm9wdGlvbmFsKCkpKVxuICAgICAgICAgIH0pXG4gICAgICAgIF0pXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiksXG4gICAgICAgIG91dHB1dF9pbmRleDogejIxLm51bWJlcigpLFxuICAgICAgICBpdGVtOiB6MjEuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcIm1lc3NhZ2VcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgcGhhc2U6IHoyMS5lbnVtKFtcImNvbW1lbnRhcnlcIiwgXCJmaW5hbF9hbnN3ZXJcIl0pLm51bGxpc2goKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZWFzb25pbmdcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgZW5jcnlwdGVkX2NvbnRlbnQ6IHoyMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiZnVuY3Rpb25fY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBhcmd1bWVudHM6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLmxpdGVyYWwoXCJjb21wbGV0ZWRcIilcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiY3VzdG9tX3Rvb2xfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBpbnB1dDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEubGl0ZXJhbChcImNvbXBsZXRlZFwiKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjb2RlX2ludGVycHJldGVyX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY29kZTogejIxLnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICAgICAgICBjb250YWluZXJfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIG91dHB1dHM6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgICAgICAgIHoyMS5vYmplY3QoeyB0eXBlOiB6MjEubGl0ZXJhbChcImxvZ3NcIiksIGxvZ3M6IHoyMS5zdHJpbmcoKSB9KSxcbiAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHsgdHlwZTogejIxLmxpdGVyYWwoXCJpbWFnZVwiKSwgdXJsOiB6MjEuc3RyaW5nKCkgfSlcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICkubnVsbGFibGUoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJpbWFnZV9nZW5lcmF0aW9uX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgcmVzdWx0OiB6MjEuc3RyaW5nKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwid2ViX3NlYXJjaF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgYWN0aW9uOiB6MjEuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwic2VhcmNoXCIpLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgICAgIHNvdXJjZXM6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgICAgIHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgejIxLm9iamVjdCh7IHR5cGU6IHoyMS5saXRlcmFsKFwidXJsXCIpLCB1cmw6IHoyMS5zdHJpbmcoKSB9KSxcbiAgICAgICAgICAgICAgICAgICAgejIxLm9iamVjdCh7IHR5cGU6IHoyMS5saXRlcmFsKFwiYXBpXCIpLCBuYW1lOiB6MjEuc3RyaW5nKCkgfSlcbiAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgKS5udWxsaXNoKClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwib3Blbl9wYWdlXCIpLFxuICAgICAgICAgICAgICAgIHVybDogejIxLnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJmaW5kX2luX3BhZ2VcIiksXG4gICAgICAgICAgICAgICAgdXJsOiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgICAgIHBhdHRlcm46IHoyMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pLm51bGxpc2goKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJmaWxlX3NlYXJjaF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHF1ZXJpZXM6IHoyMS5hcnJheSh6MjEuc3RyaW5nKCkpLFxuICAgICAgICAgICAgcmVzdWx0czogejIxLmFycmF5KFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB6MjEucmVjb3JkKFxuICAgICAgICAgICAgICAgICAgejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgejIxLnVuaW9uKFt6MjEuc3RyaW5nKCksIHoyMS5udW1iZXIoKSwgejIxLmJvb2xlYW4oKV0pXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBmaWxlX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBzY29yZTogejIxLm51bWJlcigpLFxuICAgICAgICAgICAgICAgIHRleHQ6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5udWxsaXNoKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibG9jYWxfc2hlbGxfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBhY3Rpb246IHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImV4ZWNcIiksXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IHoyMS5hcnJheSh6MjEuc3RyaW5nKCkpLFxuICAgICAgICAgICAgICB0aW1lb3V0X21zOiB6MjEubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgdXNlcjogejIxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB6MjEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgZW52OiB6MjEucmVjb3JkKHoyMS5zdHJpbmcoKSwgejIxLnN0cmluZygpKS5vcHRpb25hbCgpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjb21wdXRlcl9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLmxpdGVyYWwoXCJjb21wbGV0ZWRcIilcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibWNwX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBhcmd1bWVudHM6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIG5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHNlcnZlcl9sYWJlbDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgb3V0cHV0OiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgZXJyb3I6IHoyMS51bmlvbihbXG4gICAgICAgICAgICAgIHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgICAgY29kZTogejIxLnVuaW9uKFt6MjEubnVtYmVyKCksIHoyMS5zdHJpbmcoKV0pLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogejIxLnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgfSkubG9vc2UoKVxuICAgICAgICAgICAgXSkubnVsbGlzaCgpLFxuICAgICAgICAgICAgYXBwcm92YWxfcmVxdWVzdF9pZDogejIxLnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJtY3BfbGlzdF90b29sc1wiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzZXJ2ZXJfbGFiZWw6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHRvb2xzOiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIG5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogejIxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgICAgaW5wdXRfc2NoZW1hOiB6MjEuYW55KCksXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHoyMS5yZWNvcmQoejIxLnN0cmluZygpLCB6MjEudW5rbm93bigpKS5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZXJyb3I6IHoyMS51bmlvbihbXG4gICAgICAgICAgICAgIHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgICAgY29kZTogejIxLnVuaW9uKFt6MjEubnVtYmVyKCksIHoyMS5zdHJpbmcoKV0pLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogejIxLnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgfSkubG9vc2UoKVxuICAgICAgICAgICAgXSkub3B0aW9uYWwoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJtY3BfYXBwcm92YWxfcmVxdWVzdFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzZXJ2ZXJfbGFiZWw6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIG5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgYXBwcm92YWxfcmVxdWVzdF9pZDogejIxLnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiYXBwbHlfcGF0Y2hfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5lbnVtKFtcImluX3Byb2dyZXNzXCIsIFwiY29tcGxldGVkXCJdKSxcbiAgICAgICAgICAgIG9wZXJhdGlvbjogejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImNyZWF0ZV9maWxlXCIpLFxuICAgICAgICAgICAgICAgIHBhdGg6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBkaWZmOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiZGVsZXRlX2ZpbGVcIiksXG4gICAgICAgICAgICAgICAgcGF0aDogejIxLnN0cmluZygpXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInVwZGF0ZV9maWxlXCIpLFxuICAgICAgICAgICAgICAgIHBhdGg6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBkaWZmOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInNoZWxsX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiLCBcImluY29tcGxldGVcIl0pLFxuICAgICAgICAgICAgYWN0aW9uOiB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgY29tbWFuZHM6IHoyMS5hcnJheSh6MjEuc3RyaW5nKCkpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJzaGVsbF9jYWxsX291dHB1dFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5lbnVtKFtcImluX3Byb2dyZXNzXCIsIFwiY29tcGxldGVkXCIsIFwiaW5jb21wbGV0ZVwiXSksXG4gICAgICAgICAgICBvdXRwdXQ6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgc3Rkb3V0OiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgc3RkZXJyOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgb3V0Y29tZTogejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgICAgICAgICAgejIxLm9iamVjdCh7IHR5cGU6IHoyMS5saXRlcmFsKFwidGltZW91dFwiKSB9KSxcbiAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImV4aXRcIiksXG4gICAgICAgICAgICAgICAgICAgIGV4aXRfY29kZTogejIxLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInRvb2xfc2VhcmNoX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgZXhlY3V0aW9uOiB6MjEuZW51bShbXCJzZXJ2ZXJcIiwgXCJjbGllbnRcIl0pLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5lbnVtKFtcImluX3Byb2dyZXNzXCIsIFwiY29tcGxldGVkXCIsIFwiaW5jb21wbGV0ZVwiXSksXG4gICAgICAgICAgICBhcmd1bWVudHM6IHoyMS51bmtub3duKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwidG9vbF9zZWFyY2hfb3V0cHV0XCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGV4ZWN1dGlvbjogejIxLmVudW0oW1wic2VydmVyXCIsIFwiY2xpZW50XCJdKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiLCBcImluY29tcGxldGVcIl0pLFxuICAgICAgICAgICAgdG9vbHM6IHoyMS5hcnJheSh6MjEucmVjb3JkKHoyMS5zdHJpbmcoKSwganNvblZhbHVlU2NoZW1hMi5vcHRpb25hbCgpKSlcbiAgICAgICAgICB9KVxuICAgICAgICBdKVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5mdW5jdGlvbl9jYWxsX2FyZ3VtZW50cy5kZWx0YVwiKSxcbiAgICAgICAgaXRlbV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgZGVsdGE6IHoyMS5zdHJpbmcoKVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5jdXN0b21fdG9vbF9jYWxsX2lucHV0LmRlbHRhXCIpLFxuICAgICAgICBpdGVtX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgIG91dHB1dF9pbmRleDogejIxLm51bWJlcigpLFxuICAgICAgICBkZWx0YTogejIxLnN0cmluZygpXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlc3BvbnNlLmltYWdlX2dlbmVyYXRpb25fY2FsbC5wYXJ0aWFsX2ltYWdlXCIpLFxuICAgICAgICBpdGVtX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgIG91dHB1dF9pbmRleDogejIxLm51bWJlcigpLFxuICAgICAgICBwYXJ0aWFsX2ltYWdlX2I2NDogejIxLnN0cmluZygpXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlc3BvbnNlLmNvZGVfaW50ZXJwcmV0ZXJfY2FsbF9jb2RlLmRlbHRhXCIpLFxuICAgICAgICBpdGVtX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgIG91dHB1dF9pbmRleDogejIxLm51bWJlcigpLFxuICAgICAgICBkZWx0YTogejIxLnN0cmluZygpXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlc3BvbnNlLmNvZGVfaW50ZXJwcmV0ZXJfY2FsbF9jb2RlLmRvbmVcIiksXG4gICAgICAgIGl0ZW1faWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgb3V0cHV0X2luZGV4OiB6MjEubnVtYmVyKCksXG4gICAgICAgIGNvZGU6IHoyMS5zdHJpbmcoKVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5vdXRwdXRfdGV4dC5hbm5vdGF0aW9uLmFkZGVkXCIpLFxuICAgICAgICBhbm5vdGF0aW9uOiB6MjEuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInVybF9jaXRhdGlvblwiKSxcbiAgICAgICAgICAgIHN0YXJ0X2luZGV4OiB6MjEubnVtYmVyKCksXG4gICAgICAgICAgICBlbmRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgICAgIHVybDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgdGl0bGU6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJmaWxlX2NpdGF0aW9uXCIpLFxuICAgICAgICAgICAgZmlsZV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgZmlsZW5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGluZGV4OiB6MjEubnVtYmVyKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiY29udGFpbmVyX2ZpbGVfY2l0YXRpb25cIiksXG4gICAgICAgICAgICBjb250YWluZXJfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGZpbGVfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGFydF9pbmRleDogejIxLm51bWJlcigpLFxuICAgICAgICAgICAgZW5kX2luZGV4OiB6MjEubnVtYmVyKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiZmlsZV9wYXRoXCIpLFxuICAgICAgICAgICAgZmlsZV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgaW5kZXg6IHoyMS5udW1iZXIoKVxuICAgICAgICAgIH0pXG4gICAgICAgIF0pXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlc3BvbnNlLnJlYXNvbmluZ19zdW1tYXJ5X3BhcnQuYWRkZWRcIiksXG4gICAgICAgIGl0ZW1faWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgc3VtbWFyeV9pbmRleDogejIxLm51bWJlcigpXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlc3BvbnNlLnJlYXNvbmluZ19zdW1tYXJ5X3RleHQuZGVsdGFcIiksXG4gICAgICAgIGl0ZW1faWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgc3VtbWFyeV9pbmRleDogejIxLm51bWJlcigpLFxuICAgICAgICBkZWx0YTogejIxLnN0cmluZygpXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlc3BvbnNlLnJlYXNvbmluZ19zdW1tYXJ5X3BhcnQuZG9uZVwiKSxcbiAgICAgICAgaXRlbV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICBzdW1tYXJ5X2luZGV4OiB6MjEubnVtYmVyKClcbiAgICAgIH0pLFxuICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwicmVzcG9uc2UuYXBwbHlfcGF0Y2hfY2FsbF9vcGVyYXRpb25fZGlmZi5kZWx0YVwiKSxcbiAgICAgICAgaXRlbV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgZGVsdGE6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgb2JmdXNjYXRpb246IHoyMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgIH0pLFxuICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwicmVzcG9uc2UuYXBwbHlfcGF0Y2hfY2FsbF9vcGVyYXRpb25fZGlmZi5kb25lXCIpLFxuICAgICAgICBpdGVtX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgIG91dHB1dF9pbmRleDogejIxLm51bWJlcigpLFxuICAgICAgICBkaWZmOiB6MjEuc3RyaW5nKClcbiAgICAgIH0pLFxuICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiZXJyb3JcIiksXG4gICAgICAgIHNlcXVlbmNlX251bWJlcjogejIxLm51bWJlcigpLFxuICAgICAgICBlcnJvcjogejIxLm9iamVjdCh7XG4gICAgICAgICAgdHlwZTogejIxLnN0cmluZygpLFxuICAgICAgICAgIGNvZGU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICBtZXNzYWdlOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgcGFyYW06IHoyMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgICAgejIxLm9iamVjdCh7IHR5cGU6IHoyMS5zdHJpbmcoKSB9KS5sb29zZSgpLnRyYW5zZm9ybSgodmFsdWUpID0+ICh7XG4gICAgICAgIHR5cGU6IFwidW5rbm93bl9jaHVua1wiLFxuICAgICAgICBtZXNzYWdlOiB2YWx1ZS50eXBlXG4gICAgICB9KSlcbiAgICAgIC8vIGZhbGxiYWNrIGZvciB1bmtub3duIGNodW5rc1xuICAgIF0pXG4gIClcbik7XG52YXIgb3BlbmFpUmVzcG9uc2VzUmVzcG9uc2VTY2hlbWEgPSBsYXp5U2NoZW1hMTkoXG4gICgpID0+IHpvZFNjaGVtYTE5KFxuICAgIHoyMS5vYmplY3Qoe1xuICAgICAgaWQ6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgY3JlYXRlZF9hdDogejIxLm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICBlcnJvcjogejIxLm9iamVjdCh7XG4gICAgICAgIG1lc3NhZ2U6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgdHlwZTogejIxLnN0cmluZygpLFxuICAgICAgICBwYXJhbTogejIxLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgY29kZTogejIxLnN0cmluZygpXG4gICAgICB9KS5udWxsaXNoKCksXG4gICAgICBtb2RlbDogejIxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBvdXRwdXQ6IHoyMS5hcnJheShcbiAgICAgICAgejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJtZXNzYWdlXCIpLFxuICAgICAgICAgICAgcm9sZTogejIxLmxpdGVyYWwoXCJhc3Npc3RhbnRcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgcGhhc2U6IHoyMS5lbnVtKFtcImNvbW1lbnRhcnlcIiwgXCJmaW5hbF9hbnN3ZXJcIl0pLm51bGxpc2goKSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJvdXRwdXRfdGV4dFwiKSxcbiAgICAgICAgICAgICAgICB0ZXh0OiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgbG9ncHJvYnM6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICB0b2tlbjogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICBsb2dwcm9iOiB6MjEubnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICAgIHRvcF9sb2dwcm9iczogejIxLmFycmF5KFxuICAgICAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ3Byb2I6IHoyMS5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKS5udWxsaXNoKCksXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgICAgIHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJ1cmxfY2l0YXRpb25cIiksXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICB1cmw6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogejIxLnN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImZpbGVfY2l0YXRpb25cIiksXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHoyMS5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjb250YWluZXJfZmlsZV9jaXRhdGlvblwiKSxcbiAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydF9pbmRleDogejIxLm51bWJlcigpLFxuICAgICAgICAgICAgICAgICAgICAgIGVuZF9pbmRleDogejIxLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImZpbGVfcGF0aFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHoyMS5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcIndlYl9zZWFyY2hfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGFjdGlvbjogejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInNlYXJjaFwiKSxcbiAgICAgICAgICAgICAgICBxdWVyeTogejIxLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VzOiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgICAgICB6MjEuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3QoeyB0eXBlOiB6MjEubGl0ZXJhbChcInVybFwiKSwgdXJsOiB6MjEuc3RyaW5nKCkgfSksXG4gICAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiYXBpXCIpLFxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICApLm51bGxpc2goKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJvcGVuX3BhZ2VcIiksXG4gICAgICAgICAgICAgICAgdXJsOiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImZpbmRfaW5fcGFnZVwiKSxcbiAgICAgICAgICAgICAgICB1cmw6IHoyMS5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgICAgICAgICAgcGF0dGVybjogejIxLnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSkubnVsbGlzaCgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImZpbGVfc2VhcmNoX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgcXVlcmllczogejIxLmFycmF5KHoyMS5zdHJpbmcoKSksXG4gICAgICAgICAgICByZXN1bHRzOiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHoyMS5yZWNvcmQoXG4gICAgICAgICAgICAgICAgICB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICB6MjEudW5pb24oW3oyMS5zdHJpbmcoKSwgejIxLm51bWJlcigpLCB6MjEuYm9vbGVhbigpXSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGZpbGVfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgIHNjb3JlOiB6MjEubnVtYmVyKCksXG4gICAgICAgICAgICAgICAgdGV4dDogejIxLnN0cmluZygpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLm51bGxpc2goKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjb2RlX2ludGVycHJldGVyX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY29kZTogejIxLnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICAgICAgICBjb250YWluZXJfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIG91dHB1dHM6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgICAgICAgIHoyMS5vYmplY3QoeyB0eXBlOiB6MjEubGl0ZXJhbChcImxvZ3NcIiksIGxvZ3M6IHoyMS5zdHJpbmcoKSB9KSxcbiAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHsgdHlwZTogejIxLmxpdGVyYWwoXCJpbWFnZVwiKSwgdXJsOiB6MjEuc3RyaW5nKCkgfSlcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICkubnVsbGFibGUoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJpbWFnZV9nZW5lcmF0aW9uX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgcmVzdWx0OiB6MjEuc3RyaW5nKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibG9jYWxfc2hlbGxfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBhY3Rpb246IHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImV4ZWNcIiksXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IHoyMS5hcnJheSh6MjEuc3RyaW5nKCkpLFxuICAgICAgICAgICAgICB0aW1lb3V0X21zOiB6MjEubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgdXNlcjogejIxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB6MjEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICAgICAgZW52OiB6MjEucmVjb3JkKHoyMS5zdHJpbmcoKSwgejIxLnN0cmluZygpKS5vcHRpb25hbCgpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJmdW5jdGlvbl9jYWxsXCIpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgbmFtZTogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgYXJndW1lbnRzOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImN1c3RvbV90b29sX2NhbGxcIiksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBpbnB1dDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjb21wdXRlcl9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwicmVhc29uaW5nXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGVuY3J5cHRlZF9jb250ZW50OiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgc3VtbWFyeTogejIxLmFycmF5KFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInN1bW1hcnlfdGV4dFwiKSxcbiAgICAgICAgICAgICAgICB0ZXh0OiB6MjEuc3RyaW5nKClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibWNwX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBhcmd1bWVudHM6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIG5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHNlcnZlcl9sYWJlbDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgb3V0cHV0OiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgZXJyb3I6IHoyMS51bmlvbihbXG4gICAgICAgICAgICAgIHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgICAgY29kZTogejIxLnVuaW9uKFt6MjEubnVtYmVyKCksIHoyMS5zdHJpbmcoKV0pLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogejIxLnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgfSkubG9vc2UoKVxuICAgICAgICAgICAgXSkubnVsbGlzaCgpLFxuICAgICAgICAgICAgYXBwcm92YWxfcmVxdWVzdF9pZDogejIxLnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJtY3BfbGlzdF90b29sc1wiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzZXJ2ZXJfbGFiZWw6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHRvb2xzOiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIG5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogejIxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgICAgaW5wdXRfc2NoZW1hOiB6MjEuYW55KCksXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHoyMS5yZWNvcmQoejIxLnN0cmluZygpLCB6MjEudW5rbm93bigpKS5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZXJyb3I6IHoyMS51bmlvbihbXG4gICAgICAgICAgICAgIHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgICAgY29kZTogejIxLnVuaW9uKFt6MjEubnVtYmVyKCksIHoyMS5zdHJpbmcoKV0pLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogejIxLnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgfSkubG9vc2UoKVxuICAgICAgICAgICAgXSkub3B0aW9uYWwoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJtY3BfYXBwcm92YWxfcmVxdWVzdFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzZXJ2ZXJfbGFiZWw6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIG5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgYXBwcm92YWxfcmVxdWVzdF9pZDogejIxLnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiYXBwbHlfcGF0Y2hfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5lbnVtKFtcImluX3Byb2dyZXNzXCIsIFwiY29tcGxldGVkXCJdKSxcbiAgICAgICAgICAgIG9wZXJhdGlvbjogejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImNyZWF0ZV9maWxlXCIpLFxuICAgICAgICAgICAgICAgIHBhdGg6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBkaWZmOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiZGVsZXRlX2ZpbGVcIiksXG4gICAgICAgICAgICAgICAgcGF0aDogejIxLnN0cmluZygpXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInVwZGF0ZV9maWxlXCIpLFxuICAgICAgICAgICAgICAgIHBhdGg6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBkaWZmOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInNoZWxsX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiLCBcImluY29tcGxldGVcIl0pLFxuICAgICAgICAgICAgYWN0aW9uOiB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgY29tbWFuZHM6IHoyMS5hcnJheSh6MjEuc3RyaW5nKCkpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJzaGVsbF9jYWxsX291dHB1dFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5lbnVtKFtcImluX3Byb2dyZXNzXCIsIFwiY29tcGxldGVkXCIsIFwiaW5jb21wbGV0ZVwiXSksXG4gICAgICAgICAgICBvdXRwdXQ6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgc3Rkb3V0OiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgc3RkZXJyOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgb3V0Y29tZTogejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgICAgICAgICAgejIxLm9iamVjdCh7IHR5cGU6IHoyMS5saXRlcmFsKFwidGltZW91dFwiKSB9KSxcbiAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImV4aXRcIiksXG4gICAgICAgICAgICAgICAgICAgIGV4aXRfY29kZTogejIxLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInRvb2xfc2VhcmNoX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgZXhlY3V0aW9uOiB6MjEuZW51bShbXCJzZXJ2ZXJcIiwgXCJjbGllbnRcIl0pLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5lbnVtKFtcImluX3Byb2dyZXNzXCIsIFwiY29tcGxldGVkXCIsIFwiaW5jb21wbGV0ZVwiXSksXG4gICAgICAgICAgICBhcmd1bWVudHM6IHoyMS51bmtub3duKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwidG9vbF9zZWFyY2hfb3V0cHV0XCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGV4ZWN1dGlvbjogejIxLmVudW0oW1wic2VydmVyXCIsIFwiY2xpZW50XCJdKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiLCBcImluY29tcGxldGVcIl0pLFxuICAgICAgICAgICAgdG9vbHM6IHoyMS5hcnJheSh6MjEucmVjb3JkKHoyMS5zdHJpbmcoKSwganNvblZhbHVlU2NoZW1hMi5vcHRpb25hbCgpKSlcbiAgICAgICAgICB9KVxuICAgICAgICBdKVxuICAgICAgKS5vcHRpb25hbCgpLFxuICAgICAgc2VydmljZV90aWVyOiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgaW5jb21wbGV0ZV9kZXRhaWxzOiB6MjEub2JqZWN0KHsgcmVhc29uOiB6MjEuc3RyaW5nKCkgfSkubnVsbGlzaCgpLFxuICAgICAgdXNhZ2U6IHoyMS5vYmplY3Qoe1xuICAgICAgICBpbnB1dF90b2tlbnM6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgaW5wdXRfdG9rZW5zX2RldGFpbHM6IHoyMS5vYmplY3QoeyBjYWNoZWRfdG9rZW5zOiB6MjEubnVtYmVyKCkubnVsbGlzaCgpIH0pLm51bGxpc2goKSxcbiAgICAgICAgb3V0cHV0X3Rva2VuczogejIxLm51bWJlcigpLFxuICAgICAgICBvdXRwdXRfdG9rZW5zX2RldGFpbHM6IHoyMS5vYmplY3QoeyByZWFzb25pbmdfdG9rZW5zOiB6MjEubnVtYmVyKCkubnVsbGlzaCgpIH0pLm51bGxpc2goKVxuICAgICAgfSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG5cbi8vIHNyYy9yZXNwb25zZXMvb3BlbmFpLXJlc3BvbnNlcy1vcHRpb25zLnRzXG5pbXBvcnQgeyBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWEyMCwgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTIwIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejIyIH0gZnJvbSBcInpvZC92NFwiO1xudmFyIFRPUF9MT0dQUk9CU19NQVggPSAyMDtcbnZhciBvcGVuYWlSZXNwb25zZXNSZWFzb25pbmdNb2RlbElkcyA9IFtcbiAgXCJvMVwiLFxuICBcIm8xLTIwMjQtMTItMTdcIixcbiAgXCJvM1wiLFxuICBcIm8zLTIwMjUtMDQtMTZcIixcbiAgXCJvMy1taW5pXCIsXG4gIFwibzMtbWluaS0yMDI1LTAxLTMxXCIsXG4gIFwibzQtbWluaVwiLFxuICBcIm80LW1pbmktMjAyNS0wNC0xNlwiLFxuICBcImdwdC01XCIsXG4gIFwiZ3B0LTUtMjAyNS0wOC0wN1wiLFxuICBcImdwdC01LWNvZGV4XCIsXG4gIFwiZ3B0LTUtbWluaVwiLFxuICBcImdwdC01LW1pbmktMjAyNS0wOC0wN1wiLFxuICBcImdwdC01LW5hbm9cIixcbiAgXCJncHQtNS1uYW5vLTIwMjUtMDgtMDdcIixcbiAgXCJncHQtNS1wcm9cIixcbiAgXCJncHQtNS1wcm8tMjAyNS0xMC0wNlwiLFxuICBcImdwdC01LjFcIixcbiAgXCJncHQtNS4xLWNoYXQtbGF0ZXN0XCIsXG4gIFwiZ3B0LTUuMS1jb2RleC1taW5pXCIsXG4gIFwiZ3B0LTUuMS1jb2RleFwiLFxuICBcImdwdC01LjEtY29kZXgtbWF4XCIsXG4gIFwiZ3B0LTUuMlwiLFxuICBcImdwdC01LjItY2hhdC1sYXRlc3RcIixcbiAgXCJncHQtNS4yLXByb1wiLFxuICBcImdwdC01LjItY29kZXhcIixcbiAgXCJncHQtNS4zLWNoYXQtbGF0ZXN0XCIsXG4gIFwiZ3B0LTUuMy1jb2RleFwiLFxuICBcImdwdC01LjRcIixcbiAgXCJncHQtNS40LTIwMjYtMDMtMDVcIixcbiAgXCJncHQtNS40LW1pbmlcIixcbiAgXCJncHQtNS40LW1pbmktMjAyNi0wMy0xN1wiLFxuICBcImdwdC01LjQtbmFub1wiLFxuICBcImdwdC01LjQtbmFuby0yMDI2LTAzLTE3XCIsXG4gIFwiZ3B0LTUuNC1wcm9cIixcbiAgXCJncHQtNS40LXByby0yMDI2LTAzLTA1XCJcbl07XG52YXIgb3BlbmFpUmVzcG9uc2VzTW9kZWxJZHMgPSBbXG4gIFwiZ3B0LTQuMVwiLFxuICBcImdwdC00LjEtMjAyNS0wNC0xNFwiLFxuICBcImdwdC00LjEtbWluaVwiLFxuICBcImdwdC00LjEtbWluaS0yMDI1LTA0LTE0XCIsXG4gIFwiZ3B0LTQuMS1uYW5vXCIsXG4gIFwiZ3B0LTQuMS1uYW5vLTIwMjUtMDQtMTRcIixcbiAgXCJncHQtNG9cIixcbiAgXCJncHQtNG8tMjAyNC0wNS0xM1wiLFxuICBcImdwdC00by0yMDI0LTA4LTA2XCIsXG4gIFwiZ3B0LTRvLTIwMjQtMTEtMjBcIixcbiAgXCJncHQtNG8tYXVkaW8tcHJldmlld1wiLFxuICBcImdwdC00by1hdWRpby1wcmV2aWV3LTIwMjQtMTItMTdcIixcbiAgXCJncHQtNG8tc2VhcmNoLXByZXZpZXdcIixcbiAgXCJncHQtNG8tc2VhcmNoLXByZXZpZXctMjAyNS0wMy0xMVwiLFxuICBcImdwdC00by1taW5pLXNlYXJjaC1wcmV2aWV3XCIsXG4gIFwiZ3B0LTRvLW1pbmktc2VhcmNoLXByZXZpZXctMjAyNS0wMy0xMVwiLFxuICBcImdwdC00by1taW5pXCIsXG4gIFwiZ3B0LTRvLW1pbmktMjAyNC0wNy0xOFwiLFxuICBcImdwdC0zLjUtdHVyYm8tMDEyNVwiLFxuICBcImdwdC0zLjUtdHVyYm9cIixcbiAgXCJncHQtMy41LXR1cmJvLTExMDZcIixcbiAgXCJncHQtNS1jaGF0LWxhdGVzdFwiLFxuICAuLi5vcGVuYWlSZXNwb25zZXNSZWFzb25pbmdNb2RlbElkc1xuXTtcbnZhciBvcGVuYWlMYW5ndWFnZU1vZGVsUmVzcG9uc2VzT3B0aW9uc1NjaGVtYSA9IGxhenlTY2hlbWEyMChcbiAgKCkgPT4gem9kU2NoZW1hMjAoXG4gICAgejIyLm9iamVjdCh7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGUgT3BlbkFJIENvbnZlcnNhdGlvbiB0byBjb250aW51ZS5cbiAgICAgICAqIFlvdSBtdXN0IGNyZWF0ZSBhIGNvbnZlcnNhdGlvbiBmaXJzdCB2aWEgdGhlIE9wZW5BSSBBUEkuXG4gICAgICAgKiBDYW5ub3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGBwcmV2aW91c1Jlc3BvbnNlSWRgLlxuICAgICAgICogRGVmYXVsdHMgdG8gYHVuZGVmaW5lZGAuXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvY29udmVyc2F0aW9ucy9jcmVhdGVcbiAgICAgICAqL1xuICAgICAgY29udmVyc2F0aW9uOiB6MjIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgc2V0IG9mIGV4dHJhIGZpZWxkcyB0byBpbmNsdWRlIGluIHRoZSByZXNwb25zZSAoYWR2YW5jZWQsIHVzdWFsbHkgbm90IG5lZWRlZCkuXG4gICAgICAgKiBFeGFtcGxlIHZhbHVlczogJ3JlYXNvbmluZy5lbmNyeXB0ZWRfY29udGVudCcsICdmaWxlX3NlYXJjaF9jYWxsLnJlc3VsdHMnLCAnbWVzc2FnZS5vdXRwdXRfdGV4dC5sb2dwcm9icycuXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGU6IHoyMi5hcnJheShcbiAgICAgICAgejIyLmVudW0oW1xuICAgICAgICAgIFwicmVhc29uaW5nLmVuY3J5cHRlZF9jb250ZW50XCIsXG4gICAgICAgICAgLy8gaGFuZGxlZCBpbnRlcm5hbGx5IGJ5IGRlZmF1bHQsIG9ubHkgbmVlZGVkIGZvciB1bmtub3duIHJlYXNvbmluZyBtb2RlbHNcbiAgICAgICAgICBcImZpbGVfc2VhcmNoX2NhbGwucmVzdWx0c1wiLFxuICAgICAgICAgIFwibWVzc2FnZS5vdXRwdXRfdGV4dC5sb2dwcm9ic1wiXG4gICAgICAgIF0pXG4gICAgICApLm51bGxpc2goKSxcbiAgICAgIC8qKlxuICAgICAgICogSW5zdHJ1Y3Rpb25zIGZvciB0aGUgbW9kZWwuXG4gICAgICAgKiBUaGV5IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgc3lzdGVtIG9yIGRldmVsb3BlciBtZXNzYWdlIHdoZW4gY29udGludWluZyBhIGNvbnZlcnNhdGlvbiB1c2luZyB0aGUgYHByZXZpb3VzUmVzcG9uc2VJZGAgb3B0aW9uLlxuICAgICAgICogRGVmYXVsdHMgdG8gYHVuZGVmaW5lZGAuXG4gICAgICAgKi9cbiAgICAgIGluc3RydWN0aW9uczogejIyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIC8qKlxuICAgICAgICogUmV0dXJuIHRoZSBsb2cgcHJvYmFiaWxpdGllcyBvZiB0aGUgdG9rZW5zLiBJbmNsdWRpbmcgbG9ncHJvYnMgd2lsbCBpbmNyZWFzZVxuICAgICAgICogdGhlIHJlc3BvbnNlIHNpemUgYW5kIGNhbiBzbG93IGRvd24gcmVzcG9uc2UgdGltZXMuIEhvd2V2ZXIsIGl0IGNhblxuICAgICAgICogYmUgdXNlZnVsIHRvIGJldHRlciB1bmRlcnN0YW5kIGhvdyB0aGUgbW9kZWwgaXMgYmVoYXZpbmcuXG4gICAgICAgKlxuICAgICAgICogU2V0dGluZyB0byB0cnVlIHdpbGwgcmV0dXJuIHRoZSBsb2cgcHJvYmFiaWxpdGllcyBvZiB0aGUgdG9rZW5zIHRoYXRcbiAgICAgICAqIHdlcmUgZ2VuZXJhdGVkLlxuICAgICAgICpcbiAgICAgICAqIFNldHRpbmcgdG8gYSBudW1iZXIgd2lsbCByZXR1cm4gdGhlIGxvZyBwcm9iYWJpbGl0aWVzIG9mIHRoZSB0b3AgblxuICAgICAgICogdG9rZW5zIHRoYXQgd2VyZSBnZW5lcmF0ZWQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3Jlc3BvbnNlcy9jcmVhdGVcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly9jb29rYm9vay5vcGVuYWkuY29tL2V4YW1wbGVzL3VzaW5nX2xvZ3Byb2JzXG4gICAgICAgKi9cbiAgICAgIGxvZ3Byb2JzOiB6MjIudW5pb24oW3oyMi5ib29sZWFuKCksIHoyMi5udW1iZXIoKS5taW4oMSkubWF4KFRPUF9MT0dQUk9CU19NQVgpXSkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGNhbGxzIHRvIGJ1aWx0LWluIHRvb2xzIHRoYXQgY2FuIGJlIHByb2Nlc3NlZCBpbiBhIHJlc3BvbnNlLlxuICAgICAgICogVGhpcyBtYXhpbXVtIG51bWJlciBhcHBsaWVzIGFjcm9zcyBhbGwgYnVpbHQtaW4gdG9vbCBjYWxscywgbm90IHBlciBpbmRpdmlkdWFsIHRvb2wuXG4gICAgICAgKiBBbnkgZnVydGhlciBhdHRlbXB0cyB0byBjYWxsIGEgdG9vbCBieSB0aGUgbW9kZWwgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAgICovXG4gICAgICBtYXhUb29sQ2FsbHM6IHoyMi5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICAvKipcbiAgICAgICAqIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gc3RvcmUgd2l0aCB0aGUgZ2VuZXJhdGlvbi5cbiAgICAgICAqL1xuICAgICAgbWV0YWRhdGE6IHoyMi5hbnkoKS5udWxsaXNoKCksXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIHBhcmFsbGVsIHRvb2wgY2FsbHMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgICAqL1xuICAgICAgcGFyYWxsZWxUb29sQ2FsbHM6IHoyMi5ib29sZWFuKCkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlIHByZXZpb3VzIHJlc3BvbnNlLiBZb3UgY2FuIHVzZSBpdCB0byBjb250aW51ZSBhIGNvbnZlcnNhdGlvbi5cbiAgICAgICAqIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgICAgICovXG4gICAgICBwcmV2aW91c1Jlc3BvbnNlSWQ6IHoyMi5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAvKipcbiAgICAgICAqIFNldHMgYSBjYWNoZSBrZXkgdG8gdGllIHRoaXMgcHJvbXB0IHRvIGNhY2hlZCBwcmVmaXhlcyBmb3IgYmV0dGVyIGNhY2hpbmcgcGVyZm9ybWFuY2UuXG4gICAgICAgKi9cbiAgICAgIHByb21wdENhY2hlS2V5OiB6MjIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgcmV0ZW50aW9uIHBvbGljeSBmb3IgdGhlIHByb21wdCBjYWNoZS5cbiAgICAgICAqIC0gJ2luX21lbW9yeSc6IERlZmF1bHQuIFN0YW5kYXJkIHByb21wdCBjYWNoaW5nIGJlaGF2aW9yLlxuICAgICAgICogLSAnMjRoJzogRXh0ZW5kZWQgcHJvbXB0IGNhY2hpbmcgdGhhdCBrZWVwcyBjYWNoZWQgcHJlZml4ZXMgYWN0aXZlIGZvciB1cCB0byAyNCBob3Vycy5cbiAgICAgICAqICAgICAgICAgIEN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBmb3IgNS4xIHNlcmllcyBtb2RlbHMuXG4gICAgICAgKlxuICAgICAgICogQGRlZmF1bHQgJ2luX21lbW9yeSdcbiAgICAgICAqL1xuICAgICAgcHJvbXB0Q2FjaGVSZXRlbnRpb246IHoyMi5lbnVtKFtcImluX21lbW9yeVwiLCBcIjI0aFwiXSkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBSZWFzb25pbmcgZWZmb3J0IGZvciByZWFzb25pbmcgbW9kZWxzLiBEZWZhdWx0cyB0byBgbWVkaXVtYC4gSWYgeW91IHVzZVxuICAgICAgICogYHByb3ZpZGVyT3B0aW9uc2AgdG8gc2V0IHRoZSBgcmVhc29uaW5nRWZmb3J0YCBvcHRpb24sIHRoaXMgbW9kZWwgc2V0dGluZyB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICAgKiBWYWxpZCB2YWx1ZXM6ICdub25lJyB8ICdtaW5pbWFsJyB8ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAneGhpZ2gnXG4gICAgICAgKlxuICAgICAgICogVGhlICdub25lJyB0eXBlIGZvciBgcmVhc29uaW5nRWZmb3J0YCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgT3BlbkFJJ3MgR1BULTUuMVxuICAgICAgICogbW9kZWxzLiBBbHNvLCB0aGUgJ3hoaWdoJyB0eXBlIGZvciBgcmVhc29uaW5nRWZmb3J0YCBpcyBvbmx5IGF2YWlsYWJsZSBmb3JcbiAgICAgICAqIE9wZW5BSSdzIEdQVC01LjEtQ29kZXgtTWF4IG1vZGVsLiBTZXR0aW5nIGByZWFzb25pbmdFZmZvcnRgIHRvICdub25lJyBvciAneGhpZ2gnIHdpdGggdW5zdXBwb3J0ZWQgbW9kZWxzIHdpbGwgcmVzdWx0IGluXG4gICAgICAgKiBhbiBlcnJvci5cbiAgICAgICAqL1xuICAgICAgcmVhc29uaW5nRWZmb3J0OiB6MjIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBDb250cm9scyByZWFzb25pbmcgc3VtbWFyeSBvdXRwdXQgZnJvbSB0aGUgbW9kZWwuXG4gICAgICAgKiBTZXQgdG8gXCJhdXRvXCIgdG8gYXV0b21hdGljYWxseSByZWNlaXZlIHRoZSByaWNoZXN0IGxldmVsIGF2YWlsYWJsZSxcbiAgICAgICAqIG9yIFwiZGV0YWlsZWRcIiBmb3IgY29tcHJlaGVuc2l2ZSBzdW1tYXJpZXMuXG4gICAgICAgKi9cbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHoyMi5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciBzYWZldHkgbW9uaXRvcmluZyBhbmQgdHJhY2tpbmcuXG4gICAgICAgKi9cbiAgICAgIHNhZmV0eUlkZW50aWZpZXI6IHoyMi5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAvKipcbiAgICAgICAqIFNlcnZpY2UgdGllciBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICAgKiBTZXQgdG8gJ2ZsZXgnIGZvciA1MCUgY2hlYXBlciBwcm9jZXNzaW5nIGF0IHRoZSBjb3N0IG9mIGluY3JlYXNlZCBsYXRlbmN5IChhdmFpbGFibGUgZm9yIG8zLCBvNC1taW5pLCBhbmQgZ3B0LTUgbW9kZWxzKS5cbiAgICAgICAqIFNldCB0byAncHJpb3JpdHknIGZvciBmYXN0ZXIgcHJvY2Vzc2luZyB3aXRoIEVudGVycHJpc2UgYWNjZXNzIChhdmFpbGFibGUgZm9yIGdwdC00LCBncHQtNSwgZ3B0LTUtbWluaSwgbzMsIG80LW1pbmk7IGdwdC01LW5hbm8gaXMgbm90IHN1cHBvcnRlZCkuXG4gICAgICAgKlxuICAgICAgICogRGVmYXVsdHMgdG8gJ2F1dG8nLlxuICAgICAgICovXG4gICAgICBzZXJ2aWNlVGllcjogejIyLmVudW0oW1wiYXV0b1wiLCBcImZsZXhcIiwgXCJwcmlvcml0eVwiLCBcImRlZmF1bHRcIl0pLm51bGxpc2goKSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBzdG9yZSB0aGUgZ2VuZXJhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAgICovXG4gICAgICBzdG9yZTogejIyLmJvb2xlYW4oKS5udWxsaXNoKCksXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIHN0cmljdCBKU09OIHNjaGVtYSB2YWxpZGF0aW9uLlxuICAgICAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAgICovXG4gICAgICBzdHJpY3RKc29uU2NoZW1hOiB6MjIuYm9vbGVhbigpLm51bGxpc2goKSxcbiAgICAgIC8qKlxuICAgICAgICogQ29udHJvbHMgdGhlIHZlcmJvc2l0eSBvZiB0aGUgbW9kZWwncyByZXNwb25zZXMuIExvd2VyIHZhbHVlcyAoJ2xvdycpIHdpbGwgcmVzdWx0XG4gICAgICAgKiBpbiBtb3JlIGNvbmNpc2UgcmVzcG9uc2VzLCB3aGlsZSBoaWdoZXIgdmFsdWVzICgnaGlnaCcpIHdpbGwgcmVzdWx0IGluIG1vcmUgdmVyYm9zZSByZXNwb25zZXMuXG4gICAgICAgKiBWYWxpZCB2YWx1ZXM6ICdsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnLlxuICAgICAgICovXG4gICAgICB0ZXh0VmVyYm9zaXR5OiB6MjIuZW51bShbXCJsb3dcIiwgXCJtZWRpdW1cIiwgXCJoaWdoXCJdKS5udWxsaXNoKCksXG4gICAgICAvKipcbiAgICAgICAqIENvbnRyb2xzIG91dHB1dCB0cnVuY2F0aW9uLiAnYXV0bycgKGRlZmF1bHQpIHBlcmZvcm1zIHRydW5jYXRpb24gYXV0b21hdGljYWxseTtcbiAgICAgICAqICdkaXNhYmxlZCcgdHVybnMgdHJ1bmNhdGlvbiBvZmYuXG4gICAgICAgKi9cbiAgICAgIHRydW5jYXRpb246IHoyMi5lbnVtKFtcImF1dG9cIiwgXCJkaXNhYmxlZFwiXSkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG9cbiAgICAgICAqIG1vbml0b3IgYW5kIGRldGVjdCBhYnVzZS5cbiAgICAgICAqIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgICAgICogQHNlZSBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc2FmZXR5LWJlc3QtcHJhY3RpY2VzL2VuZC11c2VyLWlkc1xuICAgICAgICovXG4gICAgICB1c2VyOiB6MjIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVycmlkZSB0aGUgc3lzdGVtIG1lc3NhZ2UgbW9kZSBmb3IgdGhpcyBtb2RlbC5cbiAgICAgICAqIC0gJ3N5c3RlbSc6IFVzZSB0aGUgJ3N5c3RlbScgcm9sZSBmb3Igc3lzdGVtIG1lc3NhZ2VzIChkZWZhdWx0IGZvciBtb3N0IG1vZGVscylcbiAgICAgICAqIC0gJ2RldmVsb3Blcic6IFVzZSB0aGUgJ2RldmVsb3Blcicgcm9sZSBmb3Igc3lzdGVtIG1lc3NhZ2VzICh1c2VkIGJ5IHJlYXNvbmluZyBtb2RlbHMpXG4gICAgICAgKiAtICdyZW1vdmUnOiBSZW1vdmUgc3lzdGVtIG1lc3NhZ2VzIGVudGlyZWx5XG4gICAgICAgKlxuICAgICAgICogSWYgbm90IHNwZWNpZmllZCwgdGhlIG1vZGUgaXMgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgc3lzdGVtTWVzc2FnZU1vZGU6IHoyMi5lbnVtKFtcInN5c3RlbVwiLCBcImRldmVsb3BlclwiLCBcInJlbW92ZVwiXSkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogRm9yY2UgdHJlYXRpbmcgdGhpcyBtb2RlbCBhcyBhIHJlYXNvbmluZyBtb2RlbC5cbiAgICAgICAqXG4gICAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgXCJzdGVhbHRoXCIgcmVhc29uaW5nIG1vZGVscyAoZS5nLiB2aWEgYSBjdXN0b20gYmFzZVVSTClcbiAgICAgICAqIHdoZXJlIHRoZSBtb2RlbCBJRCBpcyBub3QgcmVjb2duaXplZCBieSB0aGUgU0RLJ3MgYWxsb3dsaXN0LlxuICAgICAgICpcbiAgICAgICAqIFdoZW4gZW5hYmxlZCwgdGhlIFNESyBhcHBsaWVzIHJlYXNvbmluZy1tb2RlbCBwYXJhbWV0ZXIgY29tcGF0aWJpbGl0eSBydWxlc1xuICAgICAgICogYW5kIGRlZmF1bHRzIGBzeXN0ZW1NZXNzYWdlTW9kZWAgdG8gYGRldmVsb3BlcmAgdW5sZXNzIG92ZXJyaWRkZW4uXG4gICAgICAgKi9cbiAgICAgIGZvcmNlUmVhc29uaW5nOiB6MjIuYm9vbGVhbigpLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG4pO1xuXG4vLyBzcmMvcmVzcG9uc2VzL29wZW5haS1yZXNwb25zZXMtcHJlcGFyZS10b29scy50c1xuaW1wb3J0IHtcbiAgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3IgYXMgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3I1XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZVR5cGVzIGFzIHZhbGlkYXRlVHlwZXMyIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVSZXNwb25zZXNUb29scyh7XG4gIHRvb2xzLFxuICB0b29sQ2hvaWNlLFxuICB0b29sTmFtZU1hcHBpbmcsXG4gIGN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzXG59KSB7XG4gIHZhciBfYSwgX2I7XG4gIHRvb2xzID0gKHRvb2xzID09IG51bGwgPyB2b2lkIDAgOiB0b29scy5sZW5ndGgpID8gdG9vbHMgOiB2b2lkIDA7XG4gIGNvbnN0IHRvb2xXYXJuaW5ncyA9IFtdO1xuICBpZiAodG9vbHMgPT0gbnVsbCkge1xuICAgIHJldHVybiB7IHRvb2xzOiB2b2lkIDAsIHRvb2xDaG9pY2U6IHZvaWQgMCwgdG9vbFdhcm5pbmdzIH07XG4gIH1cbiAgY29uc3Qgb3BlbmFpVG9vbHMyID0gW107XG4gIGNvbnN0IHJlc29sdmVkQ3VzdG9tUHJvdmlkZXJUb29sTmFtZXMgPSBjdXN0b21Qcm92aWRlclRvb2xOYW1lcyAhPSBudWxsID8gY3VzdG9tUHJvdmlkZXJUb29sTmFtZXMgOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBmb3IgKGNvbnN0IHRvb2wgb2YgdG9vbHMpIHtcbiAgICBzd2l0Y2ggKHRvb2wudHlwZSkge1xuICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6IHtcbiAgICAgICAgY29uc3Qgb3BlbmFpT3B0aW9ucyA9IChfYSA9IHRvb2wucHJvdmlkZXJPcHRpb25zKSA9PSBudWxsID8gdm9pZCAwIDogX2Eub3BlbmFpO1xuICAgICAgICBjb25zdCBkZWZlckxvYWRpbmcgPSBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLmRlZmVyTG9hZGluZztcbiAgICAgICAgb3BlbmFpVG9vbHMyLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRvb2wuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcGFyYW1ldGVyczogdG9vbC5pbnB1dFNjaGVtYSxcbiAgICAgICAgICAuLi50b29sLnN0cmljdCAhPSBudWxsID8geyBzdHJpY3Q6IHRvb2wuc3RyaWN0IH0gOiB7fSxcbiAgICAgICAgICAuLi5kZWZlckxvYWRpbmcgIT0gbnVsbCA/IHsgZGVmZXJfbG9hZGluZzogZGVmZXJMb2FkaW5nIH0gOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwicHJvdmlkZXJcIjoge1xuICAgICAgICBzd2l0Y2ggKHRvb2wuaWQpIHtcbiAgICAgICAgICBjYXNlIFwib3BlbmFpLmZpbGVfc2VhcmNoXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhd2FpdCB2YWxpZGF0ZVR5cGVzMih7XG4gICAgICAgICAgICAgIHZhbHVlOiB0b29sLmFyZ3MsXG4gICAgICAgICAgICAgIHNjaGVtYTogZmlsZVNlYXJjaEFyZ3NTY2hlbWFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3BlbmFpVG9vbHMyLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcImZpbGVfc2VhcmNoXCIsXG4gICAgICAgICAgICAgIHZlY3Rvcl9zdG9yZV9pZHM6IGFyZ3MudmVjdG9yU3RvcmVJZHMsXG4gICAgICAgICAgICAgIG1heF9udW1fcmVzdWx0czogYXJncy5tYXhOdW1SZXN1bHRzLFxuICAgICAgICAgICAgICByYW5raW5nX29wdGlvbnM6IGFyZ3MucmFua2luZyA/IHtcbiAgICAgICAgICAgICAgICByYW5rZXI6IGFyZ3MucmFua2luZy5yYW5rZXIsXG4gICAgICAgICAgICAgICAgc2NvcmVfdGhyZXNob2xkOiBhcmdzLnJhbmtpbmcuc2NvcmVUaHJlc2hvbGRcbiAgICAgICAgICAgICAgfSA6IHZvaWQgMCxcbiAgICAgICAgICAgICAgZmlsdGVyczogYXJncy5maWx0ZXJzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwib3BlbmFpLmxvY2FsX3NoZWxsXCI6IHtcbiAgICAgICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJsb2NhbF9zaGVsbFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwib3BlbmFpLnNoZWxsXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhd2FpdCB2YWxpZGF0ZVR5cGVzMih7XG4gICAgICAgICAgICAgIHZhbHVlOiB0b29sLmFyZ3MsXG4gICAgICAgICAgICAgIHNjaGVtYTogc2hlbGxBcmdzU2NoZW1hXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzaGVsbFwiLFxuICAgICAgICAgICAgICAuLi5hcmdzLmVudmlyb25tZW50ICYmIHtcbiAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogbWFwU2hlbGxFbnZpcm9ubWVudChhcmdzLmVudmlyb25tZW50KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwib3BlbmFpLmFwcGx5X3BhdGNoXCI6IHtcbiAgICAgICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJhcHBseV9wYXRjaFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwib3BlbmFpLndlYl9zZWFyY2hfcHJldmlld1wiOiB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgdmFsaWRhdGVUeXBlczIoe1xuICAgICAgICAgICAgICB2YWx1ZTogdG9vbC5hcmdzLFxuICAgICAgICAgICAgICBzY2hlbWE6IHdlYlNlYXJjaFByZXZpZXdBcmdzU2NoZW1hXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ3ZWJfc2VhcmNoX3ByZXZpZXdcIixcbiAgICAgICAgICAgICAgc2VhcmNoX2NvbnRleHRfc2l6ZTogYXJncy5zZWFyY2hDb250ZXh0U2l6ZSxcbiAgICAgICAgICAgICAgdXNlcl9sb2NhdGlvbjogYXJncy51c2VyTG9jYXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJvcGVuYWkud2ViX3NlYXJjaFwiOiB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgdmFsaWRhdGVUeXBlczIoe1xuICAgICAgICAgICAgICB2YWx1ZTogdG9vbC5hcmdzLFxuICAgICAgICAgICAgICBzY2hlbWE6IHdlYlNlYXJjaEFyZ3NTY2hlbWFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3BlbmFpVG9vbHMyLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcIndlYl9zZWFyY2hcIixcbiAgICAgICAgICAgICAgZmlsdGVyczogYXJncy5maWx0ZXJzICE9IG51bGwgPyB7IGFsbG93ZWRfZG9tYWluczogYXJncy5maWx0ZXJzLmFsbG93ZWREb21haW5zIH0gOiB2b2lkIDAsXG4gICAgICAgICAgICAgIGV4dGVybmFsX3dlYl9hY2Nlc3M6IGFyZ3MuZXh0ZXJuYWxXZWJBY2Nlc3MsXG4gICAgICAgICAgICAgIHNlYXJjaF9jb250ZXh0X3NpemU6IGFyZ3Muc2VhcmNoQ29udGV4dFNpemUsXG4gICAgICAgICAgICAgIHVzZXJfbG9jYXRpb246IGFyZ3MudXNlckxvY2F0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwib3BlbmFpLmNvZGVfaW50ZXJwcmV0ZXJcIjoge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGF3YWl0IHZhbGlkYXRlVHlwZXMyKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRvb2wuYXJncyxcbiAgICAgICAgICAgICAgc2NoZW1hOiBjb2RlSW50ZXJwcmV0ZXJBcmdzU2NoZW1hXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJjb2RlX2ludGVycHJldGVyXCIsXG4gICAgICAgICAgICAgIGNvbnRhaW5lcjogYXJncy5jb250YWluZXIgPT0gbnVsbCA/IHsgdHlwZTogXCJhdXRvXCIsIGZpbGVfaWRzOiB2b2lkIDAgfSA6IHR5cGVvZiBhcmdzLmNvbnRhaW5lciA9PT0gXCJzdHJpbmdcIiA/IGFyZ3MuY29udGFpbmVyIDogeyB0eXBlOiBcImF1dG9cIiwgZmlsZV9pZHM6IGFyZ3MuY29udGFpbmVyLmZpbGVJZHMgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm9wZW5haS5pbWFnZV9nZW5lcmF0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhd2FpdCB2YWxpZGF0ZVR5cGVzMih7XG4gICAgICAgICAgICAgIHZhbHVlOiB0b29sLmFyZ3MsXG4gICAgICAgICAgICAgIHNjaGVtYTogaW1hZ2VHZW5lcmF0aW9uQXJnc1NjaGVtYVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcGVuYWlUb29sczIucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiaW1hZ2VfZ2VuZXJhdGlvblwiLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBhcmdzLmJhY2tncm91bmQsXG4gICAgICAgICAgICAgIGlucHV0X2ZpZGVsaXR5OiBhcmdzLmlucHV0RmlkZWxpdHksXG4gICAgICAgICAgICAgIGlucHV0X2ltYWdlX21hc2s6IGFyZ3MuaW5wdXRJbWFnZU1hc2sgPyB7XG4gICAgICAgICAgICAgICAgZmlsZV9pZDogYXJncy5pbnB1dEltYWdlTWFzay5maWxlSWQsXG4gICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiBhcmdzLmlucHV0SW1hZ2VNYXNrLmltYWdlVXJsXG4gICAgICAgICAgICAgIH0gOiB2b2lkIDAsXG4gICAgICAgICAgICAgIG1vZGVsOiBhcmdzLm1vZGVsLFxuICAgICAgICAgICAgICBtb2RlcmF0aW9uOiBhcmdzLm1vZGVyYXRpb24sXG4gICAgICAgICAgICAgIHBhcnRpYWxfaW1hZ2VzOiBhcmdzLnBhcnRpYWxJbWFnZXMsXG4gICAgICAgICAgICAgIHF1YWxpdHk6IGFyZ3MucXVhbGl0eSxcbiAgICAgICAgICAgICAgb3V0cHV0X2NvbXByZXNzaW9uOiBhcmdzLm91dHB1dENvbXByZXNzaW9uLFxuICAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0OiBhcmdzLm91dHB1dEZvcm1hdCxcbiAgICAgICAgICAgICAgc2l6ZTogYXJncy5zaXplXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwib3BlbmFpLm1jcFwiOiB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgdmFsaWRhdGVUeXBlczIoe1xuICAgICAgICAgICAgICB2YWx1ZTogdG9vbC5hcmdzLFxuICAgICAgICAgICAgICBzY2hlbWE6IG1jcEFyZ3NTY2hlbWFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbWFwQXBwcm92YWxGaWx0ZXIgPSAoZmlsdGVyKSA9PiAoe1xuICAgICAgICAgICAgICB0b29sX25hbWVzOiBmaWx0ZXIudG9vbE5hbWVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVBcHByb3ZhbCA9IGFyZ3MucmVxdWlyZUFwcHJvdmFsO1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZUFwcHJvdmFsUGFyYW0gPSByZXF1aXJlQXBwcm92YWwgPT0gbnVsbCA/IHZvaWQgMCA6IHR5cGVvZiByZXF1aXJlQXBwcm92YWwgPT09IFwic3RyaW5nXCIgPyByZXF1aXJlQXBwcm92YWwgOiByZXF1aXJlQXBwcm92YWwubmV2ZXIgIT0gbnVsbCA/IHsgbmV2ZXI6IG1hcEFwcHJvdmFsRmlsdGVyKHJlcXVpcmVBcHByb3ZhbC5uZXZlcikgfSA6IHZvaWQgMDtcbiAgICAgICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJtY3BcIixcbiAgICAgICAgICAgICAgc2VydmVyX2xhYmVsOiBhcmdzLnNlcnZlckxhYmVsLFxuICAgICAgICAgICAgICBhbGxvd2VkX3Rvb2xzOiBBcnJheS5pc0FycmF5KGFyZ3MuYWxsb3dlZFRvb2xzKSA/IGFyZ3MuYWxsb3dlZFRvb2xzIDogYXJncy5hbGxvd2VkVG9vbHMgPyB7XG4gICAgICAgICAgICAgICAgcmVhZF9vbmx5OiBhcmdzLmFsbG93ZWRUb29scy5yZWFkT25seSxcbiAgICAgICAgICAgICAgICB0b29sX25hbWVzOiBhcmdzLmFsbG93ZWRUb29scy50b29sTmFtZXNcbiAgICAgICAgICAgICAgfSA6IHZvaWQgMCxcbiAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbjogYXJncy5hdXRob3JpemF0aW9uLFxuICAgICAgICAgICAgICBjb25uZWN0b3JfaWQ6IGFyZ3MuY29ubmVjdG9ySWQsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IGFyZ3MuaGVhZGVycyxcbiAgICAgICAgICAgICAgcmVxdWlyZV9hcHByb3ZhbDogcmVxdWlyZUFwcHJvdmFsUGFyYW0gIT0gbnVsbCA/IHJlcXVpcmVBcHByb3ZhbFBhcmFtIDogXCJuZXZlclwiLFxuICAgICAgICAgICAgICBzZXJ2ZXJfZGVzY3JpcHRpb246IGFyZ3Muc2VydmVyRGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIHNlcnZlcl91cmw6IGFyZ3Muc2VydmVyVXJsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwib3BlbmFpLmN1c3RvbVwiOiB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgdmFsaWRhdGVUeXBlczIoe1xuICAgICAgICAgICAgICB2YWx1ZTogdG9vbC5hcmdzLFxuICAgICAgICAgICAgICBzY2hlbWE6IGN1c3RvbUFyZ3NTY2hlbWFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3BlbmFpVG9vbHMyLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgICAgICAgICBuYW1lOiBhcmdzLm5hbWUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhcmdzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBmb3JtYXQ6IGFyZ3MuZm9ybWF0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc29sdmVkQ3VzdG9tUHJvdmlkZXJUb29sTmFtZXMuYWRkKGFyZ3MubmFtZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm9wZW5haS50b29sX3NlYXJjaFwiOiB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgdmFsaWRhdGVUeXBlczIoe1xuICAgICAgICAgICAgICB2YWx1ZTogdG9vbC5hcmdzLFxuICAgICAgICAgICAgICBzY2hlbWE6IHRvb2xTZWFyY2hBcmdzU2NoZW1hXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sX3NlYXJjaFwiLFxuICAgICAgICAgICAgICAuLi5hcmdzLmV4ZWN1dGlvbiAhPSBudWxsID8geyBleGVjdXRpb246IGFyZ3MuZXhlY3V0aW9uIH0gOiB7fSxcbiAgICAgICAgICAgICAgLi4uYXJncy5kZXNjcmlwdGlvbiAhPSBudWxsID8geyBkZXNjcmlwdGlvbjogYXJncy5kZXNjcmlwdGlvbiB9IDoge30sXG4gICAgICAgICAgICAgIC4uLmFyZ3MucGFyYW1ldGVycyAhPSBudWxsID8geyBwYXJhbWV0ZXJzOiBhcmdzLnBhcmFtZXRlcnMgfSA6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRvb2xXYXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgICAgZmVhdHVyZTogYGZ1bmN0aW9uIHRvb2wgJHt0b29sfWBcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAodG9vbENob2ljZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHsgdG9vbHM6IG9wZW5haVRvb2xzMiwgdG9vbENob2ljZTogdm9pZCAwLCB0b29sV2FybmluZ3MgfTtcbiAgfVxuICBjb25zdCB0eXBlID0gdG9vbENob2ljZS50eXBlO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiYXV0b1wiOlxuICAgIGNhc2UgXCJub25lXCI6XG4gICAgY2FzZSBcInJlcXVpcmVkXCI6XG4gICAgICByZXR1cm4geyB0b29sczogb3BlbmFpVG9vbHMyLCB0b29sQ2hvaWNlOiB0eXBlLCB0b29sV2FybmluZ3MgfTtcbiAgICBjYXNlIFwidG9vbFwiOiB7XG4gICAgICBjb25zdCByZXNvbHZlZFRvb2xOYW1lID0gKF9iID0gdG9vbE5hbWVNYXBwaW5nID09IG51bGwgPyB2b2lkIDAgOiB0b29sTmFtZU1hcHBpbmcudG9Qcm92aWRlclRvb2xOYW1lKHRvb2xDaG9pY2UudG9vbE5hbWUpKSAhPSBudWxsID8gX2IgOiB0b29sQ2hvaWNlLnRvb2xOYW1lO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9vbHM6IG9wZW5haVRvb2xzMixcbiAgICAgICAgdG9vbENob2ljZTogcmVzb2x2ZWRUb29sTmFtZSA9PT0gXCJjb2RlX2ludGVycHJldGVyXCIgfHwgcmVzb2x2ZWRUb29sTmFtZSA9PT0gXCJmaWxlX3NlYXJjaFwiIHx8IHJlc29sdmVkVG9vbE5hbWUgPT09IFwiaW1hZ2VfZ2VuZXJhdGlvblwiIHx8IHJlc29sdmVkVG9vbE5hbWUgPT09IFwid2ViX3NlYXJjaF9wcmV2aWV3XCIgfHwgcmVzb2x2ZWRUb29sTmFtZSA9PT0gXCJ3ZWJfc2VhcmNoXCIgfHwgcmVzb2x2ZWRUb29sTmFtZSA9PT0gXCJtY3BcIiB8fCByZXNvbHZlZFRvb2xOYW1lID09PSBcImFwcGx5X3BhdGNoXCIgPyB7IHR5cGU6IHJlc29sdmVkVG9vbE5hbWUgfSA6IHJlc29sdmVkQ3VzdG9tUHJvdmlkZXJUb29sTmFtZXMuaGFzKHJlc29sdmVkVG9vbE5hbWUpID8geyB0eXBlOiBcImN1c3RvbVwiLCBuYW1lOiByZXNvbHZlZFRvb2xOYW1lIH0gOiB7IHR5cGU6IFwiZnVuY3Rpb25cIiwgbmFtZTogcmVzb2x2ZWRUb29sTmFtZSB9LFxuICAgICAgICB0b29sV2FybmluZ3NcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IF9leGhhdXN0aXZlQ2hlY2sgPSB0eXBlO1xuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yNSh7XG4gICAgICAgIGZ1bmN0aW9uYWxpdHk6IGB0b29sIGNob2ljZSB0eXBlOiAke19leGhhdXN0aXZlQ2hlY2t9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXBTaGVsbEVudmlyb25tZW50KGVudmlyb25tZW50KSB7XG4gIGlmIChlbnZpcm9ubWVudC50eXBlID09PSBcImNvbnRhaW5lclJlZmVyZW5jZVwiKSB7XG4gICAgY29uc3QgZW52MiA9IGVudmlyb25tZW50O1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImNvbnRhaW5lcl9yZWZlcmVuY2VcIixcbiAgICAgIGNvbnRhaW5lcl9pZDogZW52Mi5jb250YWluZXJJZFxuICAgIH07XG4gIH1cbiAgaWYgKGVudmlyb25tZW50LnR5cGUgPT09IFwiY29udGFpbmVyQXV0b1wiKSB7XG4gICAgY29uc3QgZW52MiA9IGVudmlyb25tZW50O1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImNvbnRhaW5lcl9hdXRvXCIsXG4gICAgICBmaWxlX2lkczogZW52Mi5maWxlSWRzLFxuICAgICAgbWVtb3J5X2xpbWl0OiBlbnYyLm1lbW9yeUxpbWl0LFxuICAgICAgbmV0d29ya19wb2xpY3k6IGVudjIubmV0d29ya1BvbGljeSA9PSBudWxsID8gdm9pZCAwIDogZW52Mi5uZXR3b3JrUG9saWN5LnR5cGUgPT09IFwiZGlzYWJsZWRcIiA/IHsgdHlwZTogXCJkaXNhYmxlZFwiIH0gOiB7XG4gICAgICAgIHR5cGU6IFwiYWxsb3dsaXN0XCIsXG4gICAgICAgIGFsbG93ZWRfZG9tYWluczogZW52Mi5uZXR3b3JrUG9saWN5LmFsbG93ZWREb21haW5zLFxuICAgICAgICBkb21haW5fc2VjcmV0czogZW52Mi5uZXR3b3JrUG9saWN5LmRvbWFpblNlY3JldHNcbiAgICAgIH0sXG4gICAgICBza2lsbHM6IG1hcFNoZWxsU2tpbGxzKGVudjIuc2tpbGxzKVxuICAgIH07XG4gIH1cbiAgY29uc3QgZW52ID0gZW52aXJvbm1lbnQ7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJsb2NhbFwiLFxuICAgIHNraWxsczogZW52LnNraWxsc1xuICB9O1xufVxuZnVuY3Rpb24gbWFwU2hlbGxTa2lsbHMoc2tpbGxzKSB7XG4gIHJldHVybiBza2lsbHMgPT0gbnVsbCA/IHZvaWQgMCA6IHNraWxscy5tYXAoXG4gICAgKHNraWxsKSA9PiBza2lsbC50eXBlID09PSBcInNraWxsUmVmZXJlbmNlXCIgPyB7XG4gICAgICB0eXBlOiBcInNraWxsX3JlZmVyZW5jZVwiLFxuICAgICAgc2tpbGxfaWQ6IHNraWxsLnNraWxsSWQsXG4gICAgICB2ZXJzaW9uOiBza2lsbC52ZXJzaW9uXG4gICAgfSA6IHtcbiAgICAgIHR5cGU6IFwiaW5saW5lXCIsXG4gICAgICBuYW1lOiBza2lsbC5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHNraWxsLmRlc2NyaXB0aW9uLFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIHR5cGU6IFwiYmFzZTY0XCIsXG4gICAgICAgIG1lZGlhX3R5cGU6IHNraWxsLnNvdXJjZS5tZWRpYVR5cGUsXG4gICAgICAgIGRhdGE6IHNraWxsLnNvdXJjZS5kYXRhXG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vLyBzcmMvcmVzcG9uc2VzL29wZW5haS1yZXNwb25zZXMtbGFuZ3VhZ2UtbW9kZWwudHNcbmZ1bmN0aW9uIGV4dHJhY3RBcHByb3ZhbFJlcXVlc3RJZFRvVG9vbENhbGxJZE1hcHBpbmcocHJvbXB0KSB7XG4gIHZhciBfYSwgX2I7XG4gIGNvbnN0IG1hcHBpbmcgPSB7fTtcbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHByb21wdCkge1xuICAgIGlmIChtZXNzYWdlLnJvbGUgIT09IFwiYXNzaXN0YW50XCIpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBtZXNzYWdlLmNvbnRlbnQpIHtcbiAgICAgIGlmIChwYXJ0LnR5cGUgIT09IFwidG9vbC1jYWxsXCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYXBwcm92YWxSZXF1ZXN0SWQgPSAoX2IgPSAoX2EgPSBwYXJ0LnByb3ZpZGVyT3B0aW9ucykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLm9wZW5haSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmFwcHJvdmFsUmVxdWVzdElkO1xuICAgICAgaWYgKGFwcHJvdmFsUmVxdWVzdElkICE9IG51bGwpIHtcbiAgICAgICAgbWFwcGluZ1thcHByb3ZhbFJlcXVlc3RJZF0gPSBwYXJ0LnRvb2xDYWxsSWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXBwaW5nO1xufVxudmFyIE9wZW5BSVJlc3BvbnNlc0xhbmd1YWdlTW9kZWwgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsSWQsIGNvbmZpZykge1xuICAgIHRoaXMuc3BlY2lmaWNhdGlvblZlcnNpb24gPSBcInYzXCI7XG4gICAgdGhpcy5zdXBwb3J0ZWRVcmxzID0ge1xuICAgICAgXCJpbWFnZS8qXCI6IFsvXmh0dHBzPzpcXC9cXC8uKiQvXSxcbiAgICAgIFwiYXBwbGljYXRpb24vcGRmXCI6IFsvXmh0dHBzPzpcXC9cXC8uKiQvXVxuICAgIH07XG4gICAgdGhpcy5tb2RlbElkID0gbW9kZWxJZDtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgcHJvdmlkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb3ZpZGVyO1xuICB9XG4gIGFzeW5jIGdldEFyZ3Moe1xuICAgIG1heE91dHB1dFRva2VucyxcbiAgICB0ZW1wZXJhdHVyZSxcbiAgICBzdG9wU2VxdWVuY2VzLFxuICAgIHRvcFAsXG4gICAgdG9wSyxcbiAgICBwcmVzZW5jZVBlbmFsdHksXG4gICAgZnJlcXVlbmN5UGVuYWx0eSxcbiAgICBzZWVkLFxuICAgIHByb21wdCxcbiAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgdG9vbHMsXG4gICAgdG9vbENob2ljZSxcbiAgICByZXNwb25zZUZvcm1hdFxuICB9KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2k7XG4gICAgY29uc3Qgd2FybmluZ3MgPSBbXTtcbiAgICBjb25zdCBtb2RlbENhcGFiaWxpdGllcyA9IGdldE9wZW5BSUxhbmd1YWdlTW9kZWxDYXBhYmlsaXRpZXModGhpcy5tb2RlbElkKTtcbiAgICBpZiAodG9wSyAhPSBudWxsKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHsgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLCBmZWF0dXJlOiBcInRvcEtcIiB9KTtcbiAgICB9XG4gICAgaWYgKHNlZWQgIT0gbnVsbCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7IHR5cGU6IFwidW5zdXBwb3J0ZWRcIiwgZmVhdHVyZTogXCJzZWVkXCIgfSk7XG4gICAgfVxuICAgIGlmIChwcmVzZW5jZVBlbmFsdHkgIT0gbnVsbCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7IHR5cGU6IFwidW5zdXBwb3J0ZWRcIiwgZmVhdHVyZTogXCJwcmVzZW5jZVBlbmFsdHlcIiB9KTtcbiAgICB9XG4gICAgaWYgKGZyZXF1ZW5jeVBlbmFsdHkgIT0gbnVsbCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7IHR5cGU6IFwidW5zdXBwb3J0ZWRcIiwgZmVhdHVyZTogXCJmcmVxdWVuY3lQZW5hbHR5XCIgfSk7XG4gICAgfVxuICAgIGlmIChzdG9wU2VxdWVuY2VzICE9IG51bGwpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goeyB0eXBlOiBcInVuc3VwcG9ydGVkXCIsIGZlYXR1cmU6IFwic3RvcFNlcXVlbmNlc1wiIH0pO1xuICAgIH1cbiAgICBjb25zdCBwcm92aWRlck9wdGlvbnNOYW1lID0gdGhpcy5jb25maWcucHJvdmlkZXIuaW5jbHVkZXMoXCJhenVyZVwiKSA/IFwiYXp1cmVcIiA6IFwib3BlbmFpXCI7XG4gICAgbGV0IG9wZW5haU9wdGlvbnMgPSBhd2FpdCBwYXJzZVByb3ZpZGVyT3B0aW9uczUoe1xuICAgICAgcHJvdmlkZXI6IHByb3ZpZGVyT3B0aW9uc05hbWUsXG4gICAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgICBzY2hlbWE6IG9wZW5haUxhbmd1YWdlTW9kZWxSZXNwb25zZXNPcHRpb25zU2NoZW1hXG4gICAgfSk7XG4gICAgaWYgKG9wZW5haU9wdGlvbnMgPT0gbnVsbCAmJiBwcm92aWRlck9wdGlvbnNOYW1lICE9PSBcIm9wZW5haVwiKSB7XG4gICAgICBvcGVuYWlPcHRpb25zID0gYXdhaXQgcGFyc2VQcm92aWRlck9wdGlvbnM1KHtcbiAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgc2NoZW1hOiBvcGVuYWlMYW5ndWFnZU1vZGVsUmVzcG9uc2VzT3B0aW9uc1NjaGVtYVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGlzUmVhc29uaW5nTW9kZWwgPSAoX2EgPSBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLmZvcmNlUmVhc29uaW5nKSAhPSBudWxsID8gX2EgOiBtb2RlbENhcGFiaWxpdGllcy5pc1JlYXNvbmluZ01vZGVsO1xuICAgIGlmICgob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5jb252ZXJzYXRpb24pICYmIChvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnByZXZpb3VzUmVzcG9uc2VJZCkpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgIGZlYXR1cmU6IFwiY29udmVyc2F0aW9uXCIsXG4gICAgICAgIGRldGFpbHM6IFwiY29udmVyc2F0aW9uIGFuZCBwcmV2aW91c1Jlc3BvbnNlSWQgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXJcIlxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHRvb2xOYW1lTWFwcGluZyA9IGNyZWF0ZVRvb2xOYW1lTWFwcGluZyh7XG4gICAgICB0b29scyxcbiAgICAgIHByb3ZpZGVyVG9vbE5hbWVzOiB7XG4gICAgICAgIFwib3BlbmFpLmNvZGVfaW50ZXJwcmV0ZXJcIjogXCJjb2RlX2ludGVycHJldGVyXCIsXG4gICAgICAgIFwib3BlbmFpLmZpbGVfc2VhcmNoXCI6IFwiZmlsZV9zZWFyY2hcIixcbiAgICAgICAgXCJvcGVuYWkuaW1hZ2VfZ2VuZXJhdGlvblwiOiBcImltYWdlX2dlbmVyYXRpb25cIixcbiAgICAgICAgXCJvcGVuYWkubG9jYWxfc2hlbGxcIjogXCJsb2NhbF9zaGVsbFwiLFxuICAgICAgICBcIm9wZW5haS5zaGVsbFwiOiBcInNoZWxsXCIsXG4gICAgICAgIFwib3BlbmFpLndlYl9zZWFyY2hcIjogXCJ3ZWJfc2VhcmNoXCIsXG4gICAgICAgIFwib3BlbmFpLndlYl9zZWFyY2hfcHJldmlld1wiOiBcIndlYl9zZWFyY2hfcHJldmlld1wiLFxuICAgICAgICBcIm9wZW5haS5tY3BcIjogXCJtY3BcIixcbiAgICAgICAgXCJvcGVuYWkuYXBwbHlfcGF0Y2hcIjogXCJhcHBseV9wYXRjaFwiLFxuICAgICAgICBcIm9wZW5haS50b29sX3NlYXJjaFwiOiBcInRvb2xfc2VhcmNoXCJcbiAgICAgIH0sXG4gICAgICByZXNvbHZlUHJvdmlkZXJUb29sTmFtZTogKHRvb2wpID0+IHRvb2wuaWQgPT09IFwib3BlbmFpLmN1c3RvbVwiID8gdG9vbC5hcmdzLm5hbWUgOiB2b2lkIDBcbiAgICB9KTtcbiAgICBjb25zdCBjdXN0b21Qcm92aWRlclRvb2xOYW1lcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgY29uc3Qge1xuICAgICAgdG9vbHM6IG9wZW5haVRvb2xzMixcbiAgICAgIHRvb2xDaG9pY2U6IG9wZW5haVRvb2xDaG9pY2UsXG4gICAgICB0b29sV2FybmluZ3NcbiAgICB9ID0gYXdhaXQgcHJlcGFyZVJlc3BvbnNlc1Rvb2xzKHtcbiAgICAgIHRvb2xzLFxuICAgICAgdG9vbENob2ljZSxcbiAgICAgIHRvb2xOYW1lTWFwcGluZyxcbiAgICAgIGN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzXG4gICAgfSk7XG4gICAgY29uc3QgeyBpbnB1dCwgd2FybmluZ3M6IGlucHV0V2FybmluZ3MgfSA9IGF3YWl0IGNvbnZlcnRUb09wZW5BSVJlc3BvbnNlc0lucHV0KHtcbiAgICAgIHByb21wdCxcbiAgICAgIHRvb2xOYW1lTWFwcGluZyxcbiAgICAgIHN5c3RlbU1lc3NhZ2VNb2RlOiAoX2IgPSBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnN5c3RlbU1lc3NhZ2VNb2RlKSAhPSBudWxsID8gX2IgOiBpc1JlYXNvbmluZ01vZGVsID8gXCJkZXZlbG9wZXJcIiA6IG1vZGVsQ2FwYWJpbGl0aWVzLnN5c3RlbU1lc3NhZ2VNb2RlLFxuICAgICAgcHJvdmlkZXJPcHRpb25zTmFtZSxcbiAgICAgIGZpbGVJZFByZWZpeGVzOiB0aGlzLmNvbmZpZy5maWxlSWRQcmVmaXhlcyxcbiAgICAgIHN0b3JlOiAoX2MgPSBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnN0b3JlKSAhPSBudWxsID8gX2MgOiB0cnVlLFxuICAgICAgaGFzQ29udmVyc2F0aW9uOiAob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5jb252ZXJzYXRpb24pICE9IG51bGwsXG4gICAgICBoYXNMb2NhbFNoZWxsVG9vbDogaGFzT3BlbkFJVG9vbChcIm9wZW5haS5sb2NhbF9zaGVsbFwiKSxcbiAgICAgIGhhc1NoZWxsVG9vbDogaGFzT3BlbkFJVG9vbChcIm9wZW5haS5zaGVsbFwiKSxcbiAgICAgIGhhc0FwcGx5UGF0Y2hUb29sOiBoYXNPcGVuQUlUb29sKFwib3BlbmFpLmFwcGx5X3BhdGNoXCIpLFxuICAgICAgY3VzdG9tUHJvdmlkZXJUb29sTmFtZXM6IGN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzLnNpemUgPiAwID8gY3VzdG9tUHJvdmlkZXJUb29sTmFtZXMgOiB2b2lkIDBcbiAgICB9KTtcbiAgICB3YXJuaW5ncy5wdXNoKC4uLmlucHV0V2FybmluZ3MpO1xuICAgIGNvbnN0IHN0cmljdEpzb25TY2hlbWEgPSAoX2QgPSBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnN0cmljdEpzb25TY2hlbWEpICE9IG51bGwgPyBfZCA6IHRydWU7XG4gICAgbGV0IGluY2x1ZGUgPSBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLmluY2x1ZGU7XG4gICAgZnVuY3Rpb24gYWRkSW5jbHVkZShrZXkpIHtcbiAgICAgIGlmIChpbmNsdWRlID09IG51bGwpIHtcbiAgICAgICAgaW5jbHVkZSA9IFtrZXldO1xuICAgICAgfSBlbHNlIGlmICghaW5jbHVkZS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGluY2x1ZGUgPSBbLi4uaW5jbHVkZSwga2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFzT3BlbkFJVG9vbChpZCkge1xuICAgICAgcmV0dXJuICh0b29scyA9PSBudWxsID8gdm9pZCAwIDogdG9vbHMuZmluZCgodG9vbCkgPT4gdG9vbC50eXBlID09PSBcInByb3ZpZGVyXCIgJiYgdG9vbC5pZCA9PT0gaWQpKSAhPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCB0b3BMb2dwcm9icyA9IHR5cGVvZiAob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5sb2dwcm9icykgPT09IFwibnVtYmVyXCIgPyBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLmxvZ3Byb2JzIDogKG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMubG9ncHJvYnMpID09PSB0cnVlID8gVE9QX0xPR1BST0JTX01BWCA6IHZvaWQgMDtcbiAgICBpZiAodG9wTG9ncHJvYnMpIHtcbiAgICAgIGFkZEluY2x1ZGUoXCJtZXNzYWdlLm91dHB1dF90ZXh0LmxvZ3Byb2JzXCIpO1xuICAgIH1cbiAgICBjb25zdCB3ZWJTZWFyY2hUb29sTmFtZSA9IChfZSA9IHRvb2xzID09IG51bGwgPyB2b2lkIDAgOiB0b29scy5maW5kKFxuICAgICAgKHRvb2wpID0+IHRvb2wudHlwZSA9PT0gXCJwcm92aWRlclwiICYmICh0b29sLmlkID09PSBcIm9wZW5haS53ZWJfc2VhcmNoXCIgfHwgdG9vbC5pZCA9PT0gXCJvcGVuYWkud2ViX3NlYXJjaF9wcmV2aWV3XCIpXG4gICAgKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lLm5hbWU7XG4gICAgaWYgKHdlYlNlYXJjaFRvb2xOYW1lKSB7XG4gICAgICBhZGRJbmNsdWRlKFwid2ViX3NlYXJjaF9jYWxsLmFjdGlvbi5zb3VyY2VzXCIpO1xuICAgIH1cbiAgICBpZiAoaGFzT3BlbkFJVG9vbChcIm9wZW5haS5jb2RlX2ludGVycHJldGVyXCIpKSB7XG4gICAgICBhZGRJbmNsdWRlKFwiY29kZV9pbnRlcnByZXRlcl9jYWxsLm91dHB1dHNcIik7XG4gICAgfVxuICAgIGNvbnN0IHN0b3JlID0gb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5zdG9yZTtcbiAgICBpZiAoc3RvcmUgPT09IGZhbHNlICYmIGlzUmVhc29uaW5nTW9kZWwpIHtcbiAgICAgIGFkZEluY2x1ZGUoXCJyZWFzb25pbmcuZW5jcnlwdGVkX2NvbnRlbnRcIik7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VBcmdzID0ge1xuICAgICAgbW9kZWw6IHRoaXMubW9kZWxJZCxcbiAgICAgIGlucHV0LFxuICAgICAgdGVtcGVyYXR1cmUsXG4gICAgICB0b3BfcDogdG9wUCxcbiAgICAgIG1heF9vdXRwdXRfdG9rZW5zOiBtYXhPdXRwdXRUb2tlbnMsXG4gICAgICAuLi4oKHJlc3BvbnNlRm9ybWF0ID09IG51bGwgPyB2b2lkIDAgOiByZXNwb25zZUZvcm1hdC50eXBlKSA9PT0gXCJqc29uXCIgfHwgKG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMudGV4dFZlcmJvc2l0eSkpICYmIHtcbiAgICAgICAgdGV4dDoge1xuICAgICAgICAgIC4uLihyZXNwb25zZUZvcm1hdCA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2VGb3JtYXQudHlwZSkgPT09IFwianNvblwiICYmIHtcbiAgICAgICAgICAgIGZvcm1hdDogcmVzcG9uc2VGb3JtYXQuc2NoZW1hICE9IG51bGwgPyB7XG4gICAgICAgICAgICAgIHR5cGU6IFwianNvbl9zY2hlbWFcIixcbiAgICAgICAgICAgICAgc3RyaWN0OiBzdHJpY3RKc29uU2NoZW1hLFxuICAgICAgICAgICAgICBuYW1lOiAoX2YgPSByZXNwb25zZUZvcm1hdC5uYW1lKSAhPSBudWxsID8gX2YgOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiByZXNwb25zZUZvcm1hdC5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgc2NoZW1hOiByZXNwb25zZUZvcm1hdC5zY2hlbWFcbiAgICAgICAgICAgIH0gOiB7IHR5cGU6IFwianNvbl9vYmplY3RcIiB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi4ob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy50ZXh0VmVyYm9zaXR5KSAmJiB7XG4gICAgICAgICAgICB2ZXJib3NpdHk6IG9wZW5haU9wdGlvbnMudGV4dFZlcmJvc2l0eVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIHByb3ZpZGVyIG9wdGlvbnM6XG4gICAgICBjb252ZXJzYXRpb246IG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMuY29udmVyc2F0aW9uLFxuICAgICAgbWF4X3Rvb2xfY2FsbHM6IG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMubWF4VG9vbENhbGxzLFxuICAgICAgbWV0YWRhdGE6IG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMubWV0YWRhdGEsXG4gICAgICBwYXJhbGxlbF90b29sX2NhbGxzOiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnBhcmFsbGVsVG9vbENhbGxzLFxuICAgICAgcHJldmlvdXNfcmVzcG9uc2VfaWQ6IG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMucHJldmlvdXNSZXNwb25zZUlkLFxuICAgICAgc3RvcmUsXG4gICAgICB1c2VyOiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnVzZXIsXG4gICAgICBpbnN0cnVjdGlvbnM6IG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMuaW5zdHJ1Y3Rpb25zLFxuICAgICAgc2VydmljZV90aWVyOiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnNlcnZpY2VUaWVyLFxuICAgICAgaW5jbHVkZSxcbiAgICAgIHByb21wdF9jYWNoZV9rZXk6IG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMucHJvbXB0Q2FjaGVLZXksXG4gICAgICBwcm9tcHRfY2FjaGVfcmV0ZW50aW9uOiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnByb21wdENhY2hlUmV0ZW50aW9uLFxuICAgICAgc2FmZXR5X2lkZW50aWZpZXI6IG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMuc2FmZXR5SWRlbnRpZmllcixcbiAgICAgIHRvcF9sb2dwcm9iczogdG9wTG9ncHJvYnMsXG4gICAgICB0cnVuY2F0aW9uOiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnRydW5jYXRpb24sXG4gICAgICAvLyBtb2RlbC1zcGVjaWZpYyBzZXR0aW5nczpcbiAgICAgIC4uLmlzUmVhc29uaW5nTW9kZWwgJiYgKChvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnJlYXNvbmluZ0VmZm9ydCkgIT0gbnVsbCB8fCAob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5yZWFzb25pbmdTdW1tYXJ5KSAhPSBudWxsKSAmJiB7XG4gICAgICAgIHJlYXNvbmluZzoge1xuICAgICAgICAgIC4uLihvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnJlYXNvbmluZ0VmZm9ydCkgIT0gbnVsbCAmJiB7XG4gICAgICAgICAgICBlZmZvcnQ6IG9wZW5haU9wdGlvbnMucmVhc29uaW5nRWZmb3J0XG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi4ob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5yZWFzb25pbmdTdW1tYXJ5KSAhPSBudWxsICYmIHtcbiAgICAgICAgICAgIHN1bW1hcnk6IG9wZW5haU9wdGlvbnMucmVhc29uaW5nU3VtbWFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGlzUmVhc29uaW5nTW9kZWwpIHtcbiAgICAgIGlmICghKChvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnJlYXNvbmluZ0VmZm9ydCkgPT09IFwibm9uZVwiICYmIG1vZGVsQ2FwYWJpbGl0aWVzLnN1cHBvcnRzTm9uUmVhc29uaW5nUGFyYW1ldGVycykpIHtcbiAgICAgICAgaWYgKGJhc2VBcmdzLnRlbXBlcmF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgICBiYXNlQXJncy50ZW1wZXJhdHVyZSA9IHZvaWQgMDtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICAgIGZlYXR1cmU6IFwidGVtcGVyYXR1cmVcIixcbiAgICAgICAgICAgIGRldGFpbHM6IFwidGVtcGVyYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBmb3IgcmVhc29uaW5nIG1vZGVsc1wiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2VBcmdzLnRvcF9wICE9IG51bGwpIHtcbiAgICAgICAgICBiYXNlQXJncy50b3BfcCA9IHZvaWQgMDtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICAgIGZlYXR1cmU6IFwidG9wUFwiLFxuICAgICAgICAgICAgZGV0YWlsczogXCJ0b3BQIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHJlYXNvbmluZyBtb2RlbHNcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5yZWFzb25pbmdFZmZvcnQpICE9IG51bGwpIHtcbiAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLFxuICAgICAgICAgIGZlYXR1cmU6IFwicmVhc29uaW5nRWZmb3J0XCIsXG4gICAgICAgICAgZGV0YWlsczogXCJyZWFzb25pbmdFZmZvcnQgaXMgbm90IHN1cHBvcnRlZCBmb3Igbm9uLXJlYXNvbmluZyBtb2RlbHNcIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICgob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5yZWFzb25pbmdTdW1tYXJ5KSAhPSBudWxsKSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICBmZWF0dXJlOiBcInJlYXNvbmluZ1N1bW1hcnlcIixcbiAgICAgICAgICBkZXRhaWxzOiBcInJlYXNvbmluZ1N1bW1hcnkgaXMgbm90IHN1cHBvcnRlZCBmb3Igbm9uLXJlYXNvbmluZyBtb2RlbHNcIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKChvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnNlcnZpY2VUaWVyKSA9PT0gXCJmbGV4XCIgJiYgIW1vZGVsQ2FwYWJpbGl0aWVzLnN1cHBvcnRzRmxleFByb2Nlc3NpbmcpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgIGZlYXR1cmU6IFwic2VydmljZVRpZXJcIixcbiAgICAgICAgZGV0YWlsczogXCJmbGV4IHByb2Nlc3NpbmcgaXMgb25seSBhdmFpbGFibGUgZm9yIG8zLCBvNC1taW5pLCBhbmQgZ3B0LTUgbW9kZWxzXCJcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIGJhc2VBcmdzLnNlcnZpY2VfdGllcjtcbiAgICB9XG4gICAgaWYgKChvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnNlcnZpY2VUaWVyKSA9PT0gXCJwcmlvcml0eVwiICYmICFtb2RlbENhcGFiaWxpdGllcy5zdXBwb3J0c1ByaW9yaXR5UHJvY2Vzc2luZykge1xuICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgZmVhdHVyZTogXCJzZXJ2aWNlVGllclwiLFxuICAgICAgICBkZXRhaWxzOiBcInByaW9yaXR5IHByb2Nlc3NpbmcgaXMgb25seSBhdmFpbGFibGUgZm9yIHN1cHBvcnRlZCBtb2RlbHMgKGdwdC00LCBncHQtNSwgZ3B0LTUtbWluaSwgbzMsIG80LW1pbmkpIGFuZCByZXF1aXJlcyBFbnRlcnByaXNlIGFjY2Vzcy4gZ3B0LTUtbmFubyBpcyBub3Qgc3VwcG9ydGVkXCJcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIGJhc2VBcmdzLnNlcnZpY2VfdGllcjtcbiAgICB9XG4gICAgY29uc3Qgc2hlbGxUb29sRW52VHlwZSA9IChfaSA9IChfaCA9IChfZyA9IHRvb2xzID09IG51bGwgPyB2b2lkIDAgOiB0b29scy5maW5kKFxuICAgICAgKHRvb2wpID0+IHRvb2wudHlwZSA9PT0gXCJwcm92aWRlclwiICYmIHRvb2wuaWQgPT09IFwib3BlbmFpLnNoZWxsXCJcbiAgICApKSA9PSBudWxsID8gdm9pZCAwIDogX2cuYXJncykgPT0gbnVsbCA/IHZvaWQgMCA6IF9oLmVudmlyb25tZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2kudHlwZTtcbiAgICBjb25zdCBpc1NoZWxsUHJvdmlkZXJFeGVjdXRlZCA9IHNoZWxsVG9vbEVudlR5cGUgPT09IFwiY29udGFpbmVyQXV0b1wiIHx8IHNoZWxsVG9vbEVudlR5cGUgPT09IFwiY29udGFpbmVyUmVmZXJlbmNlXCI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdlYlNlYXJjaFRvb2xOYW1lLFxuICAgICAgYXJnczoge1xuICAgICAgICAuLi5iYXNlQXJncyxcbiAgICAgICAgdG9vbHM6IG9wZW5haVRvb2xzMixcbiAgICAgICAgdG9vbF9jaG9pY2U6IG9wZW5haVRvb2xDaG9pY2VcbiAgICAgIH0sXG4gICAgICB3YXJuaW5nczogWy4uLndhcm5pbmdzLCAuLi50b29sV2FybmluZ3NdLFxuICAgICAgc3RvcmUsXG4gICAgICB0b29sTmFtZU1hcHBpbmcsXG4gICAgICBwcm92aWRlck9wdGlvbnNOYW1lLFxuICAgICAgaXNTaGVsbFByb3ZpZGVyRXhlY3V0ZWRcbiAgICB9O1xuICB9XG4gIGFzeW5jIGRvR2VuZXJhdGUob3B0aW9ucykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9pLCBfaiwgX2ssIF9sLCBfbSwgX24sIF9vLCBfcCwgX3EsIF9yLCBfcywgX3QsIF91LCBfdiwgX3csIF94LCBfeSwgX3osIF9BLCBfQjtcbiAgICBjb25zdCB7XG4gICAgICBhcmdzOiBib2R5LFxuICAgICAgd2FybmluZ3MsXG4gICAgICB3ZWJTZWFyY2hUb29sTmFtZSxcbiAgICAgIHRvb2xOYW1lTWFwcGluZyxcbiAgICAgIHByb3ZpZGVyT3B0aW9uc05hbWUsXG4gICAgICBpc1NoZWxsUHJvdmlkZXJFeGVjdXRlZFxuICAgIH0gPSBhd2FpdCB0aGlzLmdldEFyZ3Mob3B0aW9ucyk7XG4gICAgY29uc3QgdXJsID0gdGhpcy5jb25maWcudXJsKHtcbiAgICAgIHBhdGg6IFwiL3Jlc3BvbnNlc1wiLFxuICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkXG4gICAgfSk7XG4gICAgY29uc3QgYXBwcm92YWxSZXF1ZXN0SWRUb0R1bW15VG9vbENhbGxJZEZyb21Qcm9tcHQgPSBleHRyYWN0QXBwcm92YWxSZXF1ZXN0SWRUb1Rvb2xDYWxsSWRNYXBwaW5nKG9wdGlvbnMucHJvbXB0KTtcbiAgICBjb25zdCB7XG4gICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICB2YWx1ZTogcmVzcG9uc2UsXG4gICAgICByYXdWYWx1ZTogcmF3UmVzcG9uc2VcbiAgICB9ID0gYXdhaXQgcG9zdEpzb25Ub0FwaTUoe1xuICAgICAgdXJsLFxuICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnM1KHRoaXMuY29uZmlnLmhlYWRlcnMoKSwgb3B0aW9ucy5oZWFkZXJzKSxcbiAgICAgIGJvZHksXG4gICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IG9wZW5haUZhaWxlZFJlc3BvbnNlSGFuZGxlcixcbiAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXI1KFxuICAgICAgICBvcGVuYWlSZXNwb25zZXNSZXNwb25zZVNjaGVtYVxuICAgICAgKSxcbiAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoXG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJQ2FsbEVycm9yKHtcbiAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UuZXJyb3IubWVzc2FnZSxcbiAgICAgICAgdXJsLFxuICAgICAgICByZXF1ZXN0Qm9keVZhbHVlczogYm9keSxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwLFxuICAgICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIHJlc3BvbnNlQm9keTogcmF3UmVzcG9uc2UsXG4gICAgICAgIGlzUmV0cnlhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSBbXTtcbiAgICBjb25zdCBsb2dwcm9icyA9IFtdO1xuICAgIGxldCBoYXNGdW5jdGlvbkNhbGwgPSBmYWxzZTtcbiAgICBjb25zdCBob3N0ZWRUb29sU2VhcmNoQ2FsbElkcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiByZXNwb25zZS5vdXRwdXQpIHtcbiAgICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJyZWFzb25pbmdcIjoge1xuICAgICAgICAgIGlmIChwYXJ0LnN1bW1hcnkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBwYXJ0LnN1bW1hcnkucHVzaCh7IHR5cGU6IFwic3VtbWFyeV90ZXh0XCIsIHRleHQ6IFwiXCIgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBwYXJ0LnN1bW1hcnkpIHtcbiAgICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwicmVhc29uaW5nXCIsXG4gICAgICAgICAgICAgIHRleHQ6IHN1bW1hcnkudGV4dCxcbiAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgaXRlbUlkOiBwYXJ0LmlkLFxuICAgICAgICAgICAgICAgICAgcmVhc29uaW5nRW5jcnlwdGVkQ29udGVudDogKF9hID0gcGFydC5lbmNyeXB0ZWRfY29udGVudCkgIT0gbnVsbCA/IF9hIDogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJpbWFnZV9nZW5lcmF0aW9uX2NhbGxcIjoge1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC5pZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImltYWdlX2dlbmVyYXRpb25cIiksXG4gICAgICAgICAgICBpbnB1dDogXCJ7fVwiLFxuICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmlkLFxuICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiaW1hZ2VfZ2VuZXJhdGlvblwiKSxcbiAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICByZXN1bHQ6IHBhcnQucmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInRvb2xfc2VhcmNoX2NhbGxcIjoge1xuICAgICAgICAgIGNvbnN0IHRvb2xDYWxsSWQgPSAoX2IgPSBwYXJ0LmNhbGxfaWQpICE9IG51bGwgPyBfYiA6IHBhcnQuaWQ7XG4gICAgICAgICAgY29uc3QgaXNIb3N0ZWQgPSBwYXJ0LmV4ZWN1dGlvbiA9PT0gXCJzZXJ2ZXJcIjtcbiAgICAgICAgICBpZiAoaXNIb3N0ZWQpIHtcbiAgICAgICAgICAgIGhvc3RlZFRvb2xTZWFyY2hDYWxsSWRzLnB1c2godG9vbENhbGxJZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgdG9vbENhbGxJZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcInRvb2xfc2VhcmNoXCIpLFxuICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgYXJndW1lbnRzOiBwYXJ0LmFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgY2FsbF9pZDogcGFydC5jYWxsX2lkXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLmlzSG9zdGVkID8geyBwcm92aWRlckV4ZWN1dGVkOiB0cnVlIH0gOiB7fSxcbiAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgaXRlbUlkOiBwYXJ0LmlkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwidG9vbF9zZWFyY2hfb3V0cHV0XCI6IHtcbiAgICAgICAgICBjb25zdCB0b29sQ2FsbElkID0gKF9kID0gKF9jID0gcGFydC5jYWxsX2lkKSAhPSBudWxsID8gX2MgOiBob3N0ZWRUb29sU2VhcmNoQ2FsbElkcy5zaGlmdCgpKSAhPSBudWxsID8gX2QgOiBwYXJ0LmlkO1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwidG9vbF9zZWFyY2hcIiksXG4gICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgdG9vbHM6IHBhcnQudG9vbHNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgIGl0ZW1JZDogcGFydC5pZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImxvY2FsX3NoZWxsX2NhbGxcIjoge1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC5jYWxsX2lkLFxuICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwibG9jYWxfc2hlbGxcIiksXG4gICAgICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBhY3Rpb246IHBhcnQuYWN0aW9uXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgaXRlbUlkOiBwYXJ0LmlkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2hlbGxfY2FsbFwiOiB7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmNhbGxfaWQsXG4gICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJzaGVsbFwiKSxcbiAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGFjdGlvbjoge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzOiBwYXJ0LmFjdGlvbi5jb21tYW5kc1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLmlzU2hlbGxQcm92aWRlckV4ZWN1dGVkICYmIHsgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICBpdGVtSWQ6IHBhcnQuaWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaGVsbF9jYWxsX291dHB1dFwiOiB7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuY2FsbF9pZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcInNoZWxsXCIpLFxuICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgIG91dHB1dDogcGFydC5vdXRwdXQubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0ZG91dDogaXRlbS5zdGRvdXQsXG4gICAgICAgICAgICAgICAgc3RkZXJyOiBpdGVtLnN0ZGVycixcbiAgICAgICAgICAgICAgICBvdXRjb21lOiBpdGVtLm91dGNvbWUudHlwZSA9PT0gXCJleGl0XCIgPyB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImV4aXRcIixcbiAgICAgICAgICAgICAgICAgIGV4aXRDb2RlOiBpdGVtLm91dGNvbWUuZXhpdF9jb2RlXG4gICAgICAgICAgICAgICAgfSA6IHsgdHlwZTogXCJ0aW1lb3V0XCIgfVxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwibWVzc2FnZVwiOiB7XG4gICAgICAgICAgZm9yIChjb25zdCBjb250ZW50UGFydCBvZiBwYXJ0LmNvbnRlbnQpIHtcbiAgICAgICAgICAgIGlmICgoKF9mID0gKF9lID0gb3B0aW9ucy5wcm92aWRlck9wdGlvbnMpID09IG51bGwgPyB2b2lkIDAgOiBfZVtwcm92aWRlck9wdGlvbnNOYW1lXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9mLmxvZ3Byb2JzKSAmJiBjb250ZW50UGFydC5sb2dwcm9icykge1xuICAgICAgICAgICAgICBsb2dwcm9icy5wdXNoKGNvbnRlbnRQYXJ0LmxvZ3Byb2JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyTWV0YWRhdGEyID0ge1xuICAgICAgICAgICAgICBpdGVtSWQ6IHBhcnQuaWQsXG4gICAgICAgICAgICAgIC4uLnBhcnQucGhhc2UgIT0gbnVsbCAmJiB7IHBoYXNlOiBwYXJ0LnBoYXNlIH0sXG4gICAgICAgICAgICAgIC4uLmNvbnRlbnRQYXJ0LmFubm90YXRpb25zLmxlbmd0aCA+IDAgJiYge1xuICAgICAgICAgICAgICAgIGFubm90YXRpb25zOiBjb250ZW50UGFydC5hbm5vdGF0aW9uc1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGNvbnRlbnRQYXJ0LnRleHQsXG4gICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHByb3ZpZGVyTWV0YWRhdGEyXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGNvbnRlbnRQYXJ0LmFubm90YXRpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uLnR5cGUgPT09IFwidXJsX2NpdGF0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgICAgICAgIHNvdXJjZVR5cGU6IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgICBpZDogKF9pID0gKF9oID0gKF9nID0gdGhpcy5jb25maWcpLmdlbmVyYXRlSWQpID09IG51bGwgPyB2b2lkIDAgOiBfaC5jYWxsKF9nKSkgIT0gbnVsbCA/IF9pIDogZ2VuZXJhdGVJZDIoKSxcbiAgICAgICAgICAgICAgICAgIHVybDogYW5ub3RhdGlvbi51cmwsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogYW5ub3RhdGlvbi50aXRsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb24udHlwZSA9PT0gXCJmaWxlX2NpdGF0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgICAgICAgIHNvdXJjZVR5cGU6IFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiAoX2wgPSAoX2sgPSAoX2ogPSB0aGlzLmNvbmZpZykuZ2VuZXJhdGVJZCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9rLmNhbGwoX2opKSAhPSBudWxsID8gX2wgOiBnZW5lcmF0ZUlkMigpLFxuICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiBhbm5vdGF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGFubm90YXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFubm90YXRpb24udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IGFubm90YXRpb24uZmlsZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICBpbmRleDogYW5ub3RhdGlvbi5pbmRleFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5ub3RhdGlvbi50eXBlID09PSBcImNvbnRhaW5lcl9maWxlX2NpdGF0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgICAgICAgIHNvdXJjZVR5cGU6IFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiAoX28gPSAoX24gPSAoX20gPSB0aGlzLmNvbmZpZykuZ2VuZXJhdGVJZCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9uLmNhbGwoX20pKSAhPSBudWxsID8gX28gOiBnZW5lcmF0ZUlkMigpLFxuICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiBhbm5vdGF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGFubm90YXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFubm90YXRpb24udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IGFubm90YXRpb24uZmlsZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJJZDogYW5ub3RhdGlvbi5jb250YWluZXJfaWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb24udHlwZSA9PT0gXCJmaWxlX3BhdGhcIikge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgICAgICAgc291cmNlVHlwZTogXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IChfciA9IChfcSA9IChfcCA9IHRoaXMuY29uZmlnKS5nZW5lcmF0ZUlkKSA9PSBudWxsID8gdm9pZCAwIDogX3EuY2FsbChfcCkpICE9IG51bGwgPyBfciA6IGdlbmVyYXRlSWQyKCksXG4gICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogYW5ub3RhdGlvbi5maWxlX2lkLFxuICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGFubm90YXRpb24uZmlsZV9pZCxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogYW5ub3RhdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVJZDogYW5ub3RhdGlvbi5maWxlX2lkLFxuICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBhbm5vdGF0aW9uLmluZGV4XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiZnVuY3Rpb25fY2FsbFwiOiB7XG4gICAgICAgICAgaGFzRnVuY3Rpb25DYWxsID0gdHJ1ZTtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuY2FsbF9pZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiBwYXJ0Lm5hbWUsXG4gICAgICAgICAgICBpbnB1dDogcGFydC5hcmd1bWVudHMsXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgIGl0ZW1JZDogcGFydC5pZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImN1c3RvbV90b29sX2NhbGxcIjoge1xuICAgICAgICAgIGhhc0Z1bmN0aW9uQ2FsbCA9IHRydWU7XG4gICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShwYXJ0Lm5hbWUpO1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC5jYWxsX2lkLFxuICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkocGFydC5pbnB1dCksXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgIGl0ZW1JZDogcGFydC5pZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIndlYl9zZWFyY2hfY2FsbFwiOiB7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmlkLFxuICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFxuICAgICAgICAgICAgICB3ZWJTZWFyY2hUb29sTmFtZSAhPSBudWxsID8gd2ViU2VhcmNoVG9vbE5hbWUgOiBcIndlYl9zZWFyY2hcIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh7fSksXG4gICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuaWQsXG4gICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXG4gICAgICAgICAgICAgIHdlYlNlYXJjaFRvb2xOYW1lICE9IG51bGwgPyB3ZWJTZWFyY2hUb29sTmFtZSA6IFwid2ViX3NlYXJjaFwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgcmVzdWx0OiBtYXBXZWJTZWFyY2hPdXRwdXQocGFydC5hY3Rpb24pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIm1jcF9jYWxsXCI6IHtcbiAgICAgICAgICBjb25zdCB0b29sQ2FsbElkID0gcGFydC5hcHByb3ZhbF9yZXF1ZXN0X2lkICE9IG51bGwgPyAoX3MgPSBhcHByb3ZhbFJlcXVlc3RJZFRvRHVtbXlUb29sQ2FsbElkRnJvbVByb21wdFtwYXJ0LmFwcHJvdmFsX3JlcXVlc3RfaWRdKSAhPSBudWxsID8gX3MgOiBwYXJ0LmlkIDogcGFydC5pZDtcbiAgICAgICAgICBjb25zdCB0b29sTmFtZSA9IGBtY3AuJHtwYXJ0Lm5hbWV9YDtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXJ0LmFyZ3VtZW50cyxcbiAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWUsXG4gICAgICAgICAgICBkeW5hbWljOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICB0eXBlOiBcImNhbGxcIixcbiAgICAgICAgICAgICAgc2VydmVyTGFiZWw6IHBhcnQuc2VydmVyX2xhYmVsLFxuICAgICAgICAgICAgICBuYW1lOiBwYXJ0Lm5hbWUsXG4gICAgICAgICAgICAgIGFyZ3VtZW50czogcGFydC5hcmd1bWVudHMsXG4gICAgICAgICAgICAgIC4uLnBhcnQub3V0cHV0ICE9IG51bGwgPyB7IG91dHB1dDogcGFydC5vdXRwdXQgfSA6IHt9LFxuICAgICAgICAgICAgICAuLi5wYXJ0LmVycm9yICE9IG51bGwgPyB7IGVycm9yOiBwYXJ0LmVycm9yIH0gOiB7fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgaXRlbUlkOiBwYXJ0LmlkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwibWNwX2xpc3RfdG9vbHNcIjoge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJtY3BfYXBwcm92YWxfcmVxdWVzdFwiOiB7XG4gICAgICAgICAgY29uc3QgYXBwcm92YWxSZXF1ZXN0SWQgPSAoX3QgPSBwYXJ0LmFwcHJvdmFsX3JlcXVlc3RfaWQpICE9IG51bGwgPyBfdCA6IHBhcnQuaWQ7XG4gICAgICAgICAgY29uc3QgZHVtbXlUb29sQ2FsbElkID0gKF93ID0gKF92ID0gKF91ID0gdGhpcy5jb25maWcpLmdlbmVyYXRlSWQpID09IG51bGwgPyB2b2lkIDAgOiBfdi5jYWxsKF91KSkgIT0gbnVsbCA/IF93IDogZ2VuZXJhdGVJZDIoKTtcbiAgICAgICAgICBjb25zdCB0b29sTmFtZSA9IGBtY3AuJHtwYXJ0Lm5hbWV9YDtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGR1bW15VG9vbENhbGxJZCxcbiAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHBhcnQuYXJndW1lbnRzLFxuICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGR5bmFtaWM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWFwcHJvdmFsLXJlcXVlc3RcIixcbiAgICAgICAgICAgIGFwcHJvdmFsSWQ6IGFwcHJvdmFsUmVxdWVzdElkLFxuICAgICAgICAgICAgdG9vbENhbGxJZDogZHVtbXlUb29sQ2FsbElkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImNvbXB1dGVyX2NhbGxcIjoge1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC5pZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImNvbXB1dGVyX3VzZVwiKSxcbiAgICAgICAgICAgIGlucHV0OiBcIlwiLFxuICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmlkLFxuICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiY29tcHV0ZXJfdXNlXCIpLFxuICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwiY29tcHV0ZXJfdXNlX3Rvb2xfcmVzdWx0XCIsXG4gICAgICAgICAgICAgIHN0YXR1czogcGFydC5zdGF0dXMgfHwgXCJjb21wbGV0ZWRcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJmaWxlX3NlYXJjaF9jYWxsXCI6IHtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuaWQsXG4gICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJmaWxlX3NlYXJjaFwiKSxcbiAgICAgICAgICAgIGlucHV0OiBcInt9XCIsXG4gICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuaWQsXG4gICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJmaWxlX3NlYXJjaFwiKSxcbiAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICBxdWVyaWVzOiBwYXJ0LnF1ZXJpZXMsXG4gICAgICAgICAgICAgIHJlc3VsdHM6IChfeSA9IChfeCA9IHBhcnQucmVzdWx0cykgPT0gbnVsbCA/IHZvaWQgMCA6IF94Lm1hcCgocmVzdWx0KSA9PiAoe1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJlc3VsdC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIGZpbGVJZDogcmVzdWx0LmZpbGVfaWQsXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IHJlc3VsdC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICBzY29yZTogcmVzdWx0LnNjb3JlLFxuICAgICAgICAgICAgICAgIHRleHQ6IHJlc3VsdC50ZXh0XG4gICAgICAgICAgICAgIH0pKSkgIT0gbnVsbCA/IF95IDogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJjb2RlX2ludGVycHJldGVyX2NhbGxcIjoge1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC5pZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImNvZGVfaW50ZXJwcmV0ZXJcIiksXG4gICAgICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBjb2RlOiBwYXJ0LmNvZGUsXG4gICAgICAgICAgICAgIGNvbnRhaW5lcklkOiBwYXJ0LmNvbnRhaW5lcl9pZFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuaWQsXG4gICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJjb2RlX2ludGVycHJldGVyXCIpLFxuICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgIG91dHB1dHM6IHBhcnQub3V0cHV0c1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhcHBseV9wYXRjaF9jYWxsXCI6IHtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuY2FsbF9pZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImFwcGx5X3BhdGNoXCIpLFxuICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgY2FsbElkOiBwYXJ0LmNhbGxfaWQsXG4gICAgICAgICAgICAgIG9wZXJhdGlvbjogcGFydC5vcGVyYXRpb25cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICBpdGVtSWQ6IHBhcnQuaWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb3ZpZGVyTWV0YWRhdGEgPSB7XG4gICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgcmVzcG9uc2VJZDogcmVzcG9uc2UuaWQsXG4gICAgICAgIC4uLmxvZ3Byb2JzLmxlbmd0aCA+IDAgPyB7IGxvZ3Byb2JzIH0gOiB7fSxcbiAgICAgICAgLi4udHlwZW9mIHJlc3BvbnNlLnNlcnZpY2VfdGllciA9PT0gXCJzdHJpbmdcIiA/IHsgc2VydmljZVRpZXI6IHJlc3BvbnNlLnNlcnZpY2VfdGllciB9IDoge31cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHVzYWdlID0gcmVzcG9uc2UudXNhZ2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBmaW5pc2hSZWFzb246IHtcbiAgICAgICAgdW5pZmllZDogbWFwT3BlbkFJUmVzcG9uc2VGaW5pc2hSZWFzb24oe1xuICAgICAgICAgIGZpbmlzaFJlYXNvbjogKF96ID0gcmVzcG9uc2UuaW5jb21wbGV0ZV9kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX3oucmVhc29uLFxuICAgICAgICAgIGhhc0Z1bmN0aW9uQ2FsbFxuICAgICAgICB9KSxcbiAgICAgICAgcmF3OiAoX0IgPSAoX0EgPSByZXNwb25zZS5pbmNvbXBsZXRlX2RldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfQS5yZWFzb24pICE9IG51bGwgPyBfQiA6IHZvaWQgMFxuICAgICAgfSxcbiAgICAgIHVzYWdlOiBjb252ZXJ0T3BlbkFJUmVzcG9uc2VzVXNhZ2UodXNhZ2UpLFxuICAgICAgcmVxdWVzdDogeyBib2R5IH0sXG4gICAgICByZXNwb25zZToge1xuICAgICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUocmVzcG9uc2UuY3JlYXRlZF9hdCAqIDFlMyksXG4gICAgICAgIG1vZGVsSWQ6IHJlc3BvbnNlLm1vZGVsLFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHJhd1Jlc3BvbnNlXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXJNZXRhZGF0YSxcbiAgICAgIHdhcm5pbmdzXG4gICAgfTtcbiAgfVxuICBhc3luYyBkb1N0cmVhbShvcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXJnczogYm9keSxcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgd2ViU2VhcmNoVG9vbE5hbWUsXG4gICAgICB0b29sTmFtZU1hcHBpbmcsXG4gICAgICBzdG9yZSxcbiAgICAgIHByb3ZpZGVyT3B0aW9uc05hbWUsXG4gICAgICBpc1NoZWxsUHJvdmlkZXJFeGVjdXRlZFxuICAgIH0gPSBhd2FpdCB0aGlzLmdldEFyZ3Mob3B0aW9ucyk7XG4gICAgY29uc3QgeyByZXNwb25zZUhlYWRlcnMsIHZhbHVlOiByZXNwb25zZSB9ID0gYXdhaXQgcG9zdEpzb25Ub0FwaTUoe1xuICAgICAgdXJsOiB0aGlzLmNvbmZpZy51cmwoe1xuICAgICAgICBwYXRoOiBcIi9yZXNwb25zZXNcIixcbiAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkXG4gICAgICB9KSxcbiAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzNSh0aGlzLmNvbmZpZy5oZWFkZXJzKCksIG9wdGlvbnMuaGVhZGVycyksXG4gICAgICBib2R5OiB7XG4gICAgICAgIC4uLmJvZHksXG4gICAgICAgIHN0cmVhbTogdHJ1ZVxuICAgICAgfSxcbiAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogb3BlbmFpRmFpbGVkUmVzcG9uc2VIYW5kbGVyLFxuICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlRXZlbnRTb3VyY2VSZXNwb25zZUhhbmRsZXIzKFxuICAgICAgICBvcGVuYWlSZXNwb25zZXNDaHVua1NjaGVtYVxuICAgICAgKSxcbiAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoXG4gICAgfSk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgYXBwcm92YWxSZXF1ZXN0SWRUb0R1bW15VG9vbENhbGxJZEZyb21Qcm9tcHQgPSBleHRyYWN0QXBwcm92YWxSZXF1ZXN0SWRUb1Rvb2xDYWxsSWRNYXBwaW5nKG9wdGlvbnMucHJvbXB0KTtcbiAgICBjb25zdCBhcHByb3ZhbFJlcXVlc3RJZFRvRHVtbXlUb29sQ2FsbElkRnJvbVN0cmVhbSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgbGV0IGZpbmlzaFJlYXNvbiA9IHtcbiAgICAgIHVuaWZpZWQ6IFwib3RoZXJcIixcbiAgICAgIHJhdzogdm9pZCAwXG4gICAgfTtcbiAgICBsZXQgdXNhZ2UgPSB2b2lkIDA7XG4gICAgY29uc3QgbG9ncHJvYnMgPSBbXTtcbiAgICBsZXQgcmVzcG9uc2VJZCA9IG51bGw7XG4gICAgY29uc3Qgb25nb2luZ1Rvb2xDYWxscyA9IHt9O1xuICAgIGNvbnN0IG9uZ29pbmdBbm5vdGF0aW9ucyA9IFtdO1xuICAgIGxldCBhY3RpdmVNZXNzYWdlUGhhc2U7XG4gICAgbGV0IGhhc0Z1bmN0aW9uQ2FsbCA9IGZhbHNlO1xuICAgIGNvbnN0IGFjdGl2ZVJlYXNvbmluZyA9IHt9O1xuICAgIGxldCBzZXJ2aWNlVGllcjtcbiAgICBjb25zdCBob3N0ZWRUb29sU2VhcmNoQ2FsbElkcyA9IFtdO1xuICAgIHJldHVybiB7XG4gICAgICBzdHJlYW06IHJlc3BvbnNlLnBpcGVUaHJvdWdoKFxuICAgICAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInN0cmVhbS1zdGFydFwiLCB3YXJuaW5ncyB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2ksIF9qLCBfaywgX2wsIF9tLCBfbiwgX28sIF9wLCBfcSwgX3IsIF9zLCBfdCwgX3UsIF92LCBfdywgX3gsIF95LCBfeiwgX0EsIF9CLCBfQywgX0QsIF9FLCBfRiwgX0csIF9ILCBfSSwgX0osIF9LLCBfTDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVSYXdDaHVua3MpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJyYXdcIiwgcmF3VmFsdWU6IGNodW5rLnJhd1ZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjaHVuay5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbiA9IHsgdW5pZmllZDogXCJlcnJvclwiLCByYXc6IHZvaWQgMCB9O1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcImVycm9yXCIsIGVycm9yOiBjaHVuay5lcnJvciB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVuay52YWx1ZTtcbiAgICAgICAgICAgIGlmIChpc1Jlc3BvbnNlT3V0cHV0SXRlbUFkZGVkQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHZhbHVlLml0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHZhbHVlLml0ZW0uY2FsbF9pZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1zdGFydFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHZhbHVlLml0ZW0uY2FsbF9pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB2YWx1ZS5pdGVtLm5hbWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiY3VzdG9tX3Rvb2xfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcbiAgICAgICAgICAgICAgICAgIHZhbHVlLml0ZW0ubmFtZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmNhbGxfaWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB2YWx1ZS5pdGVtLmNhbGxfaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJ3ZWJfc2VhcmNoX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcbiAgICAgICAgICAgICAgICAgICAgd2ViU2VhcmNoVG9vbE5hbWUgIT0gbnVsbCA/IHdlYlNlYXJjaFRvb2xOYW1lIDogXCJ3ZWJfc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmlkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LXN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICBpZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcbiAgICAgICAgICAgICAgICAgICAgd2ViU2VhcmNoVG9vbE5hbWUgIT0gbnVsbCA/IHdlYlNlYXJjaFRvb2xOYW1lIDogXCJ3ZWJfc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1lbmRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB2YWx1ZS5pdGVtLmlkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFxuICAgICAgICAgICAgICAgICAgICB3ZWJTZWFyY2hUb29sTmFtZSAhPSBudWxsID8gd2ViU2VhcmNoVG9vbE5hbWUgOiBcIndlYl9zZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh7fSksXG4gICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcImNvbXB1dGVyX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImNvbXB1dGVyX3VzZVwiKSxcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHZhbHVlLml0ZW0uaWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiY29tcHV0ZXJfdXNlXCIpLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJjb2RlX2ludGVycHJldGVyX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImNvZGVfaW50ZXJwcmV0ZXJcIiksXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgY29kZUludGVycHJldGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcklkOiB2YWx1ZS5pdGVtLmNvbnRhaW5lcl9pZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1zdGFydFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJjb2RlX2ludGVycHJldGVyXCIpLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgZGVsdGE6IGB7XCJjb250YWluZXJJZFwiOlwiJHt2YWx1ZS5pdGVtLmNvbnRhaW5lcl9pZH1cIixcImNvZGVcIjpcImBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiZmlsZV9zZWFyY2hfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiZmlsZV9zZWFyY2hcIiksXG4gICAgICAgICAgICAgICAgICBpbnB1dDogXCJ7fVwiLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJpbWFnZV9nZW5lcmF0aW9uX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImltYWdlX2dlbmVyYXRpb25cIiksXG4gICAgICAgICAgICAgICAgICBpbnB1dDogXCJ7fVwiLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJ0b29sX3NlYXJjaF9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29sQ2FsbElkID0gdmFsdWUuaXRlbS5pZDtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29sTmFtZSA9IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwidG9vbF9zZWFyY2hcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNIb3N0ZWQgPSB2YWx1ZS5pdGVtLmV4ZWN1dGlvbiA9PT0gXCJzZXJ2ZXJcIjtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sU2VhcmNoRXhlY3V0aW9uOiAoX2EgPSB2YWx1ZS5pdGVtLmV4ZWN1dGlvbikgIT0gbnVsbCA/IF9hIDogXCJzZXJ2ZXJcIlxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGlzSG9zdGVkKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcInRvb2xfc2VhcmNoX291dHB1dFwiKSB7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcIm1jcF9jYWxsXCIgfHwgdmFsdWUuaXRlbS50eXBlID09PSBcIm1jcF9saXN0X3Rvb2xzXCIgfHwgdmFsdWUuaXRlbS50eXBlID09PSBcIm1jcF9hcHByb3ZhbF9yZXF1ZXN0XCIpIHtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiYXBwbHlfcGF0Y2hfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBjYWxsX2lkOiBjYWxsSWQsIG9wZXJhdGlvbiB9ID0gdmFsdWUuaXRlbTtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJhcHBseV9wYXRjaFwiKSxcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGNhbGxJZCxcbiAgICAgICAgICAgICAgICAgIGFwcGx5UGF0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlX2ZpbGUgZG9lc24ndCBoYXZlIGRpZmZcbiAgICAgICAgICAgICAgICAgICAgaGFzRGlmZjogb3BlcmF0aW9uLnR5cGUgPT09IFwiZGVsZXRlX2ZpbGVcIixcbiAgICAgICAgICAgICAgICAgICAgZW5kRW1pdHRlZDogb3BlcmF0aW9uLnR5cGUgPT09IFwiZGVsZXRlX2ZpbGVcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1zdGFydFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IGNhbGxJZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImFwcGx5X3BhdGNoXCIpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi50eXBlID09PSBcImRlbGV0ZV9maWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0U3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBjYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvblxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNhbGxJZCxcbiAgICAgICAgICAgICAgICAgICAgZGVsdGE6IGlucHV0U3RyaW5nXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1lbmRcIixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNhbGxJZFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgICBpZDogY2FsbElkLFxuICAgICAgICAgICAgICAgICAgICBkZWx0YTogYHtcImNhbGxJZFwiOlwiJHtlc2NhcGVKU09ORGVsdGEoY2FsbElkKX1cIixcIm9wZXJhdGlvblwiOntcInR5cGVcIjpcIiR7ZXNjYXBlSlNPTkRlbHRhKG9wZXJhdGlvbi50eXBlKX1cIixcInBhdGhcIjpcIiR7ZXNjYXBlSlNPTkRlbHRhKG9wZXJhdGlvbi5wYXRoKX1cIixcImRpZmZcIjpcImBcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwic2hlbGxfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwic2hlbGxcIiksXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmNhbGxfaWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJzaGVsbF9jYWxsX291dHB1dFwiKSB7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdBbm5vdGF0aW9ucy5zcGxpY2UoMCwgb25nb2luZ0Fubm90YXRpb25zLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgYWN0aXZlTWVzc2FnZVBoYXNlID0gKF9iID0gdmFsdWUuaXRlbS5waGFzZSkgIT0gbnVsbCA/IF9iIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRleHQtc3RhcnRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgLi4udmFsdWUuaXRlbS5waGFzZSAhPSBudWxsICYmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlOiB2YWx1ZS5pdGVtLnBoYXNlXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZU91dHB1dEl0ZW1BZGRlZENodW5rKHZhbHVlKSAmJiB2YWx1ZS5pdGVtLnR5cGUgPT09IFwicmVhc29uaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmVSZWFzb25pbmdbdmFsdWUuaXRlbS5pZF0gPSB7XG4gICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRDb250ZW50OiB2YWx1ZS5pdGVtLmVuY3J5cHRlZF9jb250ZW50LFxuICAgICAgICAgICAgICAgICAgc3VtbWFyeVBhcnRzOiB7IDA6IFwiYWN0aXZlXCIgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhc29uaW5nLXN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICBpZDogYCR7dmFsdWUuaXRlbS5pZH06MGAsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICByZWFzb25pbmdFbmNyeXB0ZWRDb250ZW50OiAoX2MgPSB2YWx1ZS5pdGVtLmVuY3J5cHRlZF9jb250ZW50KSAhPSBudWxsID8gX2MgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1Jlc3BvbnNlT3V0cHV0SXRlbURvbmVDaHVuayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwaGFzZSA9IChfZCA9IHZhbHVlLml0ZW0ucGhhc2UpICE9IG51bGwgPyBfZCA6IGFjdGl2ZU1lc3NhZ2VQaGFzZTtcbiAgICAgICAgICAgICAgICBhY3RpdmVNZXNzYWdlUGhhc2UgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dC1lbmRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgLi4ucGhhc2UgIT0gbnVsbCAmJiB7IHBoYXNlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgLi4ub25nb2luZ0Fubm90YXRpb25zLmxlbmd0aCA+IDAgJiYge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IG9uZ29pbmdBbm5vdGF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgaGFzRnVuY3Rpb25DYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWVuZFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHZhbHVlLml0ZW0uY2FsbF9pZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5jYWxsX2lkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHZhbHVlLml0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB2YWx1ZS5pdGVtLmFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiB2YWx1ZS5pdGVtLmlkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiY3VzdG9tX3Rvb2xfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGhhc0Z1bmN0aW9uQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcbiAgICAgICAgICAgICAgICAgIHZhbHVlLml0ZW0ubmFtZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1lbmRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB2YWx1ZS5pdGVtLmNhbGxfaWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHZhbHVlLml0ZW0uY2FsbF9pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHZhbHVlLml0ZW0uaW5wdXQpLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IHZhbHVlLml0ZW0uaWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJ3ZWJfc2VhcmNoX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcbiAgICAgICAgICAgICAgICAgICAgd2ViU2VhcmNoVG9vbE5hbWUgIT0gbnVsbCA/IHdlYlNlYXJjaFRvb2xOYW1lIDogXCJ3ZWJfc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICByZXN1bHQ6IG1hcFdlYlNlYXJjaE91dHB1dCh2YWx1ZS5pdGVtLmFjdGlvbilcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiY29tcHV0ZXJfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZW5kXCIsXG4gICAgICAgICAgICAgICAgICBpZDogdmFsdWUuaXRlbS5pZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImNvbXB1dGVyX3VzZVwiKSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBcIlwiLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiY29tcHV0ZXJfdXNlXCIpLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY29tcHV0ZXJfdXNlX3Rvb2xfcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogdmFsdWUuaXRlbS5zdGF0dXMgfHwgXCJjb21wbGV0ZWRcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJmaWxlX3NlYXJjaF9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJmaWxlX3NlYXJjaFwiKSxcbiAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICBxdWVyaWVzOiB2YWx1ZS5pdGVtLnF1ZXJpZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IChfZiA9IChfZSA9IHZhbHVlLml0ZW0ucmVzdWx0cykgPT0gbnVsbCA/IHZvaWQgMCA6IF9lLm1hcCgocmVzdWx0KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJlc3VsdC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVJZDogcmVzdWx0LmZpbGVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHJlc3VsdC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBzY29yZTogcmVzdWx0LnNjb3JlLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHJlc3VsdC50ZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pKSkgIT0gbnVsbCA/IF9mIDogbnVsbFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJjb2RlX2ludGVycHJldGVyX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImNvZGVfaW50ZXJwcmV0ZXJcIiksXG4gICAgICAgICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogdmFsdWUuaXRlbS5vdXRwdXRzXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcImltYWdlX2dlbmVyYXRpb25fY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJpbWFnZV9nZW5lcmF0aW9uXCIpLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogdmFsdWUuaXRlbS5yZXN1bHRcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwidG9vbF9zZWFyY2hfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbENhbGwgPSBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF07XG4gICAgICAgICAgICAgICAgY29uc3QgaXNIb3N0ZWQgPSB2YWx1ZS5pdGVtLmV4ZWN1dGlvbiA9PT0gXCJzZXJ2ZXJcIjtcbiAgICAgICAgICAgICAgICBpZiAodG9vbENhbGwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdG9vbENhbGxJZCA9IGlzSG9zdGVkID8gdG9vbENhbGwudG9vbENhbGxJZCA6IChfZyA9IHZhbHVlLml0ZW0uY2FsbF9pZCkgIT0gbnVsbCA/IF9nIDogdmFsdWUuaXRlbS5pZDtcbiAgICAgICAgICAgICAgICAgIGlmIChpc0hvc3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBob3N0ZWRUb29sU2VhcmNoQ2FsbElkcy5wdXNoKHRvb2xDYWxsSWQpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbENhbGwudG9vbE5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZW5kXCIsXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbElkXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbC50b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHM6IHZhbHVlLml0ZW0uYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgIGNhbGxfaWQ6IGlzSG9zdGVkID8gbnVsbCA6IHRvb2xDYWxsSWRcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIC4uLmlzSG9zdGVkID8geyBwcm92aWRlckV4ZWN1dGVkOiB0cnVlIH0gOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiB2YWx1ZS5pdGVtLmlkXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0gdm9pZCAwO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJ0b29sX3NlYXJjaF9vdXRwdXRcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xDYWxsSWQgPSAoX2kgPSAoX2ggPSB2YWx1ZS5pdGVtLmNhbGxfaWQpICE9IG51bGwgPyBfaCA6IGhvc3RlZFRvb2xTZWFyY2hDYWxsSWRzLnNoaWZ0KCkpICE9IG51bGwgPyBfaSA6IHZhbHVlLml0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJ0b29sX3NlYXJjaFwiKSxcbiAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICB0b29sczogdmFsdWUuaXRlbS50b29sc1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiB2YWx1ZS5pdGVtLmlkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwibWNwX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBjb25zdCBhcHByb3ZhbFJlcXVlc3RJZCA9IChfaiA9IHZhbHVlLml0ZW0uYXBwcm92YWxfcmVxdWVzdF9pZCkgIT0gbnVsbCA/IF9qIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzZWRUb29sQ2FsbElkID0gYXBwcm92YWxSZXF1ZXN0SWQgIT0gbnVsbCA/IChfbCA9IChfayA9IGFwcHJvdmFsUmVxdWVzdElkVG9EdW1teVRvb2xDYWxsSWRGcm9tU3RyZWFtLmdldChcbiAgICAgICAgICAgICAgICAgIGFwcHJvdmFsUmVxdWVzdElkXG4gICAgICAgICAgICAgICAgKSkgIT0gbnVsbCA/IF9rIDogYXBwcm92YWxSZXF1ZXN0SWRUb0R1bW15VG9vbENhbGxJZEZyb21Qcm9tcHRbYXBwcm92YWxSZXF1ZXN0SWRdKSAhPSBudWxsID8gX2wgOiB2YWx1ZS5pdGVtLmlkIDogdmFsdWUuaXRlbS5pZDtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29sTmFtZSA9IGBtY3AuJHt2YWx1ZS5pdGVtLm5hbWV9YDtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGFsaWFzZWRUb29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogdmFsdWUuaXRlbS5hcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgZHluYW1pYzogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBhbGlhc2VkVG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJMYWJlbDogdmFsdWUuaXRlbS5zZXJ2ZXJfbGFiZWwsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHZhbHVlLml0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzOiB2YWx1ZS5pdGVtLmFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgLi4udmFsdWUuaXRlbS5vdXRwdXQgIT0gbnVsbCA/IHsgb3V0cHV0OiB2YWx1ZS5pdGVtLm91dHB1dCB9IDoge30sXG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlLml0ZW0uZXJyb3IgIT0gbnVsbCA/IHsgZXJyb3I6IHZhbHVlLml0ZW0uZXJyb3IgfSA6IHt9XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IHZhbHVlLml0ZW0uaWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJtY3BfbGlzdF90b29sc1wiKSB7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0gdm9pZCAwO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJhcHBseV9wYXRjaF9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29sQ2FsbCA9IG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoKHRvb2xDYWxsID09IG51bGwgPyB2b2lkIDAgOiB0b29sQ2FsbC5hcHBseVBhdGNoKSAmJiAhdG9vbENhbGwuYXBwbHlQYXRjaC5lbmRFbWl0dGVkICYmIHZhbHVlLml0ZW0ub3BlcmF0aW9uLnR5cGUgIT09IFwiZGVsZXRlX2ZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgaWYgKCF0b29sQ2FsbC5hcHBseVBhdGNoLmhhc0RpZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGwudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgICAgICBkZWx0YTogZXNjYXBlSlNPTkRlbHRhKHZhbHVlLml0ZW0ub3BlcmF0aW9uLmRpZmYpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgICBkZWx0YTogJ1wifX0nXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1lbmRcIixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWRcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdG9vbENhbGwuYXBwbHlQYXRjaC5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRvb2xDYWxsICYmIHZhbHVlLml0ZW0uc3RhdHVzID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJhcHBseV9wYXRjaFwiKSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICBjYWxsSWQ6IHZhbHVlLml0ZW0uY2FsbF9pZCxcbiAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IHZhbHVlLml0ZW0ub3BlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IHZhbHVlLml0ZW0uaWRcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcIm1jcF9hcHByb3ZhbF9yZXF1ZXN0XCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgY29uc3QgZHVtbXlUb29sQ2FsbElkID0gKF9vID0gKF9uID0gKF9tID0gc2VsZi5jb25maWcpLmdlbmVyYXRlSWQpID09IG51bGwgPyB2b2lkIDAgOiBfbi5jYWxsKF9tKSkgIT0gbnVsbCA/IF9vIDogZ2VuZXJhdGVJZDIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcHByb3ZhbFJlcXVlc3RJZCA9IChfcCA9IHZhbHVlLml0ZW0uYXBwcm92YWxfcmVxdWVzdF9pZCkgIT0gbnVsbCA/IF9wIDogdmFsdWUuaXRlbS5pZDtcbiAgICAgICAgICAgICAgICBhcHByb3ZhbFJlcXVlc3RJZFRvRHVtbXlUb29sQ2FsbElkRnJvbVN0cmVhbS5zZXQoXG4gICAgICAgICAgICAgICAgICBhcHByb3ZhbFJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgIGR1bW15VG9vbENhbGxJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBgbWNwLiR7dmFsdWUuaXRlbS5uYW1lfWA7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBkdW1teVRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB2YWx1ZS5pdGVtLmFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBkeW5hbWljOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1hcHByb3ZhbC1yZXF1ZXN0XCIsXG4gICAgICAgICAgICAgICAgICBhcHByb3ZhbElkOiBhcHByb3ZhbFJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGR1bW15VG9vbENhbGxJZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJsb2NhbF9zaGVsbF9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmNhbGxfaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJsb2NhbF9zaGVsbFwiKSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXhlY1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IHZhbHVlLml0ZW0uYWN0aW9uLmNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgICAgdGltZW91dE1zOiB2YWx1ZS5pdGVtLmFjdGlvbi50aW1lb3V0X21zLFxuICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IHZhbHVlLml0ZW0uYWN0aW9uLnVzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2luZ0RpcmVjdG9yeTogdmFsdWUuaXRlbS5hY3Rpb24ud29ya2luZ19kaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgICAgICAgZW52OiB2YWx1ZS5pdGVtLmFjdGlvbi5lbnZcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXTogeyBpdGVtSWQ6IHZhbHVlLml0ZW0uaWQgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJzaGVsbF9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmNhbGxfaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJzaGVsbFwiKSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzOiB2YWx1ZS5pdGVtLmFjdGlvbi5jb21tYW5kc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIC4uLmlzU2hlbGxQcm92aWRlckV4ZWN1dGVkICYmIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7IGl0ZW1JZDogdmFsdWUuaXRlbS5pZCB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcInNoZWxsX2NhbGxfb3V0cHV0XCIpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5jYWxsX2lkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwic2hlbGxcIiksXG4gICAgICAgICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiB2YWx1ZS5pdGVtLm91dHB1dC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgKGl0ZW0pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ6IGl0ZW0uc3Rkb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyOiBpdGVtLnN0ZGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWU6IGl0ZW0ub3V0Y29tZS50eXBlID09PSBcImV4aXRcIiA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJleGl0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlOiBpdGVtLm91dGNvbWUuZXhpdF9jb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICB9IDogeyB0eXBlOiBcInRpbWVvdXRcIiB9XG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJyZWFzb25pbmdcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVJlYXNvbmluZ1BhcnQgPSBhY3RpdmVSZWFzb25pbmdbdmFsdWUuaXRlbS5pZF07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeVBhcnRJbmRpY2VzID0gT2JqZWN0LmVudHJpZXMoXG4gICAgICAgICAgICAgICAgICBhY3RpdmVSZWFzb25pbmdQYXJ0LnN1bW1hcnlQYXJ0c1xuICAgICAgICAgICAgICAgICkuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgKFtfLCBzdGF0dXNdKSA9PiBzdGF0dXMgPT09IFwiYWN0aXZlXCIgfHwgc3RhdHVzID09PSBcImNhbi1jb25jbHVkZVwiXG4gICAgICAgICAgICAgICAgKS5tYXAoKFtzdW1tYXJ5SW5kZXhdKSA9PiBzdW1tYXJ5SW5kZXgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3VtbWFyeUluZGV4IG9mIHN1bW1hcnlQYXJ0SW5kaWNlcykge1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJyZWFzb25pbmctZW5kXCIsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgJHt2YWx1ZS5pdGVtLmlkfToke3N1bW1hcnlJbmRleH1gLFxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb25pbmdFbmNyeXB0ZWRDb250ZW50OiAoX3EgPSB2YWx1ZS5pdGVtLmVuY3J5cHRlZF9jb250ZW50KSAhPSBudWxsID8gX3EgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFjdGl2ZVJlYXNvbmluZ1t2YWx1ZS5pdGVtLmlkXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1Jlc3BvbnNlRnVuY3Rpb25DYWxsQXJndW1lbnRzRGVsdGFDaHVuayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9vbENhbGwgPSBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF07XG4gICAgICAgICAgICAgIGlmICh0b29sQ2FsbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBkZWx0YTogdmFsdWUuZGVsdGFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1Jlc3BvbnNlQ3VzdG9tVG9vbENhbGxJbnB1dERlbHRhQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvb2xDYWxsID0gb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdO1xuICAgICAgICAgICAgICBpZiAodG9vbENhbGwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgZGVsdGE6IHZhbHVlLmRlbHRhXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZUFwcGx5UGF0Y2hDYWxsT3BlcmF0aW9uRGlmZkRlbHRhQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvb2xDYWxsID0gb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdO1xuICAgICAgICAgICAgICBpZiAodG9vbENhbGwgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xDYWxsLmFwcGx5UGF0Y2gpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGwudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIGRlbHRhOiBlc2NhcGVKU09ORGVsdGEodmFsdWUuZGVsdGEpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdG9vbENhbGwuYXBwbHlQYXRjaC5oYXNEaWZmID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1Jlc3BvbnNlQXBwbHlQYXRjaENhbGxPcGVyYXRpb25EaWZmRG9uZUNodW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgICBjb25zdCB0b29sQ2FsbCA9IG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XTtcbiAgICAgICAgICAgICAgaWYgKCh0b29sQ2FsbCA9PSBudWxsID8gdm9pZCAwIDogdG9vbENhbGwuYXBwbHlQYXRjaCkgJiYgIXRvb2xDYWxsLmFwcGx5UGF0Y2guZW5kRW1pdHRlZCkge1xuICAgICAgICAgICAgICAgIGlmICghdG9vbENhbGwuYXBwbHlQYXRjaC5oYXNEaWZmKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhOiBlc2NhcGVKU09ORGVsdGEodmFsdWUuZGlmZilcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdG9vbENhbGwuYXBwbHlQYXRjaC5oYXNEaWZmID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBkZWx0YTogJ1wifX0nXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1lbmRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC50b29sQ2FsbElkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdG9vbENhbGwuYXBwbHlQYXRjaC5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1Jlc3BvbnNlSW1hZ2VHZW5lcmF0aW9uQ2FsbFBhcnRpYWxJbWFnZUNodW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtX2lkLFxuICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImltYWdlX2dlbmVyYXRpb25cIiksXG4gICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQ6IHZhbHVlLnBhcnRpYWxfaW1hZ2VfYjY0XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwcmVsaW1pbmFyeTogdHJ1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZUNvZGVJbnRlcnByZXRlckNhbGxDb2RlRGVsdGFDaHVuayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9vbENhbGwgPSBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF07XG4gICAgICAgICAgICAgIGlmICh0b29sQ2FsbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBkZWx0YTogZXNjYXBlSlNPTkRlbHRhKHZhbHVlLmRlbHRhKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVzcG9uc2VDb2RlSW50ZXJwcmV0ZXJDYWxsQ29kZURvbmVDaHVuayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9vbENhbGwgPSBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF07XG4gICAgICAgICAgICAgIGlmICh0b29sQ2FsbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBkZWx0YTogJ1wifSdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWVuZFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJjb2RlX2ludGVycHJldGVyXCIpLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogdmFsdWUuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVySWQ6IHRvb2xDYWxsLmNvZGVJbnRlcnByZXRlci5jb250YWluZXJJZFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZUNyZWF0ZWRDaHVuayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VJZCA9IHZhbHVlLnJlc3BvbnNlLmlkO1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwicmVzcG9uc2UtbWV0YWRhdGFcIixcbiAgICAgICAgICAgICAgICBpZDogdmFsdWUucmVzcG9uc2UuaWQsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSh2YWx1ZS5yZXNwb25zZS5jcmVhdGVkX2F0ICogMWUzKSxcbiAgICAgICAgICAgICAgICBtb2RlbElkOiB2YWx1ZS5yZXNwb25zZS5tb2RlbFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNUZXh0RGVsdGFDaHVuayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICBpZDogdmFsdWUuaXRlbV9pZCxcbiAgICAgICAgICAgICAgICBkZWx0YTogdmFsdWUuZGVsdGFcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmICgoKF9zID0gKF9yID0gb3B0aW9ucy5wcm92aWRlck9wdGlvbnMpID09IG51bGwgPyB2b2lkIDAgOiBfcltwcm92aWRlck9wdGlvbnNOYW1lXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9zLmxvZ3Byb2JzKSAmJiB2YWx1ZS5sb2dwcm9icykge1xuICAgICAgICAgICAgICAgIGxvZ3Byb2JzLnB1c2godmFsdWUubG9ncHJvYnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09IFwicmVzcG9uc2UucmVhc29uaW5nX3N1bW1hcnlfcGFydC5hZGRlZFwiKSB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZS5zdW1tYXJ5X2luZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVJlYXNvbmluZ1BhcnQgPSBhY3RpdmVSZWFzb25pbmdbdmFsdWUuaXRlbV9pZF07XG4gICAgICAgICAgICAgICAgYWN0aXZlUmVhc29uaW5nUGFydC5zdW1tYXJ5UGFydHNbdmFsdWUuc3VtbWFyeV9pbmRleF0gPSBcImFjdGl2ZVwiO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3VtbWFyeUluZGV4IG9mIE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgICAgICAgYWN0aXZlUmVhc29uaW5nUGFydC5zdW1tYXJ5UGFydHNcbiAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlUmVhc29uaW5nUGFydC5zdW1tYXJ5UGFydHNbc3VtbWFyeUluZGV4XSA9PT0gXCJjYW4tY29uY2x1ZGVcIikge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhc29uaW5nLWVuZFwiLFxuICAgICAgICAgICAgICAgICAgICAgIGlkOiBgJHt2YWx1ZS5pdGVtX2lkfToke3N1bW1hcnlJbmRleH1gLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IHZhbHVlLml0ZW1faWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmVSZWFzb25pbmdQYXJ0LnN1bW1hcnlQYXJ0c1tzdW1tYXJ5SW5kZXhdID0gXCJjb25jbHVkZWRcIjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhc29uaW5nLXN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICBpZDogYCR7dmFsdWUuaXRlbV9pZH06JHt2YWx1ZS5zdW1tYXJ5X2luZGV4fWAsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogdmFsdWUuaXRlbV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICByZWFzb25pbmdFbmNyeXB0ZWRDb250ZW50OiAoX3UgPSAoX3QgPSBhY3RpdmVSZWFzb25pbmdbdmFsdWUuaXRlbV9pZF0pID09IG51bGwgPyB2b2lkIDAgOiBfdC5lbmNyeXB0ZWRDb250ZW50KSAhPSBudWxsID8gX3UgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSBcInJlc3BvbnNlLnJlYXNvbmluZ19zdW1tYXJ5X3RleHQuZGVsdGFcIikge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhc29uaW5nLWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgaWQ6IGAke3ZhbHVlLml0ZW1faWR9OiR7dmFsdWUuc3VtbWFyeV9pbmRleH1gLFxuICAgICAgICAgICAgICAgIGRlbHRhOiB2YWx1ZS5kZWx0YSxcbiAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiB2YWx1ZS5pdGVtX2lkXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gXCJyZXNwb25zZS5yZWFzb25pbmdfc3VtbWFyeV9wYXJ0LmRvbmVcIikge1xuICAgICAgICAgICAgICBpZiAoc3RvcmUpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJyZWFzb25pbmctZW5kXCIsXG4gICAgICAgICAgICAgICAgICBpZDogYCR7dmFsdWUuaXRlbV9pZH06JHt2YWx1ZS5zdW1tYXJ5X2luZGV4fWAsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogdmFsdWUuaXRlbV9pZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYWN0aXZlUmVhc29uaW5nW3ZhbHVlLml0ZW1faWRdLnN1bW1hcnlQYXJ0c1t2YWx1ZS5zdW1tYXJ5X2luZGV4XSA9IFwiY29uY2x1ZGVkXCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlUmVhc29uaW5nW3ZhbHVlLml0ZW1faWRdLnN1bW1hcnlQYXJ0c1t2YWx1ZS5zdW1tYXJ5X2luZGV4XSA9IFwiY2FuLWNvbmNsdWRlXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZUZpbmlzaGVkQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbiA9IHtcbiAgICAgICAgICAgICAgICB1bmlmaWVkOiBtYXBPcGVuQUlSZXNwb25zZUZpbmlzaFJlYXNvbih7XG4gICAgICAgICAgICAgICAgICBmaW5pc2hSZWFzb246IChfdiA9IHZhbHVlLnJlc3BvbnNlLmluY29tcGxldGVfZGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF92LnJlYXNvbixcbiAgICAgICAgICAgICAgICAgIGhhc0Z1bmN0aW9uQ2FsbFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHJhdzogKF94ID0gKF93ID0gdmFsdWUucmVzcG9uc2UuaW5jb21wbGV0ZV9kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX3cucmVhc29uKSAhPSBudWxsID8gX3ggOiB2b2lkIDBcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdXNhZ2UgPSB2YWx1ZS5yZXNwb25zZS51c2FnZTtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5yZXNwb25zZS5zZXJ2aWNlX3RpZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBzZXJ2aWNlVGllciA9IHZhbHVlLnJlc3BvbnNlLnNlcnZpY2VfdGllcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1Jlc3BvbnNlRmFpbGVkQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluY29tcGxldGVSZWFzb24gPSAoX3kgPSB2YWx1ZS5yZXNwb25zZS5pbmNvbXBsZXRlX2RldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfeS5yZWFzb247XG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbiA9IHtcbiAgICAgICAgICAgICAgICB1bmlmaWVkOiBpbmNvbXBsZXRlUmVhc29uID8gbWFwT3BlbkFJUmVzcG9uc2VGaW5pc2hSZWFzb24oe1xuICAgICAgICAgICAgICAgICAgZmluaXNoUmVhc29uOiBpbmNvbXBsZXRlUmVhc29uLFxuICAgICAgICAgICAgICAgICAgaGFzRnVuY3Rpb25DYWxsXG4gICAgICAgICAgICAgICAgfSkgOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgcmF3OiBpbmNvbXBsZXRlUmVhc29uICE9IG51bGwgPyBpbmNvbXBsZXRlUmVhc29uIDogXCJlcnJvclwiXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHVzYWdlID0gKF96ID0gdmFsdWUucmVzcG9uc2UudXNhZ2UpICE9IG51bGwgPyBfeiA6IHZvaWQgMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZUFubm90YXRpb25BZGRlZENodW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgICBvbmdvaW5nQW5ub3RhdGlvbnMucHVzaCh2YWx1ZS5hbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlLmFubm90YXRpb24udHlwZSA9PT0gXCJ1cmxfY2l0YXRpb25cIikge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgICAgICAgc291cmNlVHlwZTogXCJ1cmxcIixcbiAgICAgICAgICAgICAgICAgIGlkOiAoX0MgPSAoX0IgPSAoX0EgPSBzZWxmLmNvbmZpZykuZ2VuZXJhdGVJZCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9CLmNhbGwoX0EpKSAhPSBudWxsID8gX0MgOiBnZW5lcmF0ZUlkMigpLFxuICAgICAgICAgICAgICAgICAgdXJsOiB2YWx1ZS5hbm5vdGF0aW9uLnVybCxcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZS5hbm5vdGF0aW9uLnRpdGxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuYW5ub3RhdGlvbi50eXBlID09PSBcImZpbGVfY2l0YXRpb25cIikge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgICAgICAgc291cmNlVHlwZTogXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IChfRiA9IChfRSA9IChfRCA9IHNlbGYuY29uZmlnKS5nZW5lcmF0ZUlkKSA9PSBudWxsID8gdm9pZCAwIDogX0UuY2FsbChfRCkpICE9IG51bGwgPyBfRiA6IGdlbmVyYXRlSWQyKCksXG4gICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6IFwidGV4dC9wbGFpblwiLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IHZhbHVlLmFubm90YXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICBmaWxlbmFtZTogdmFsdWUuYW5ub3RhdGlvbi5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmFsdWUuYW5ub3RhdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVJZDogdmFsdWUuYW5ub3RhdGlvbi5maWxlX2lkLFxuICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiB2YWx1ZS5hbm5vdGF0aW9uLmluZGV4XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5hbm5vdGF0aW9uLnR5cGUgPT09IFwiY29udGFpbmVyX2ZpbGVfY2l0YXRpb25cIikge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgICAgICAgc291cmNlVHlwZTogXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IChfSSA9IChfSCA9IChfRyA9IHNlbGYuY29uZmlnKS5nZW5lcmF0ZUlkKSA9PSBudWxsID8gdm9pZCAwIDogX0guY2FsbChfRykpICE9IG51bGwgPyBfSSA6IGdlbmVyYXRlSWQyKCksXG4gICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6IFwidGV4dC9wbGFpblwiLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IHZhbHVlLmFubm90YXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICBmaWxlbmFtZTogdmFsdWUuYW5ub3RhdGlvbi5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmFsdWUuYW5ub3RhdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVJZDogdmFsdWUuYW5ub3RhdGlvbi5maWxlX2lkLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcklkOiB2YWx1ZS5hbm5vdGF0aW9uLmNvbnRhaW5lcl9pZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuYW5ub3RhdGlvbi50eXBlID09PSBcImZpbGVfcGF0aFwiKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgICAgICBzb3VyY2VUeXBlOiBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgICBpZDogKF9MID0gKF9LID0gKF9KID0gc2VsZi5jb25maWcpLmdlbmVyYXRlSWQpID09IG51bGwgPyB2b2lkIDAgOiBfSy5jYWxsKF9KKSkgIT0gbnVsbCA/IF9MIDogZ2VuZXJhdGVJZDIoKSxcbiAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIixcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZS5hbm5vdGF0aW9uLmZpbGVfaWQsXG4gICAgICAgICAgICAgICAgICBmaWxlbmFtZTogdmFsdWUuYW5ub3RhdGlvbi5maWxlX2lkLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB2YWx1ZS5hbm5vdGF0aW9uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiB2YWx1ZS5hbm5vdGF0aW9uLmZpbGVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHZhbHVlLmFubm90YXRpb24uaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRXJyb3JDaHVuayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJlcnJvclwiLCBlcnJvcjogdmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmbHVzaChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBjb25zdCBwcm92aWRlck1ldGFkYXRhID0ge1xuICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICByZXNwb25zZUlkLFxuICAgICAgICAgICAgICAgIC4uLmxvZ3Byb2JzLmxlbmd0aCA+IDAgPyB7IGxvZ3Byb2JzIH0gOiB7fSxcbiAgICAgICAgICAgICAgICAuLi5zZXJ2aWNlVGllciAhPT0gdm9pZCAwID8geyBzZXJ2aWNlVGllciB9IDoge31cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiZmluaXNoXCIsXG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbixcbiAgICAgICAgICAgICAgdXNhZ2U6IGNvbnZlcnRPcGVuQUlSZXNwb25zZXNVc2FnZSh1c2FnZSksXG4gICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgICByZXF1ZXN0OiB7IGJvZHkgfSxcbiAgICAgIHJlc3BvbnNlOiB7IGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyB9XG4gICAgfTtcbiAgfVxufTtcbmZ1bmN0aW9uIGlzVGV4dERlbHRhQ2h1bmsoY2h1bmspIHtcbiAgcmV0dXJuIGNodW5rLnR5cGUgPT09IFwicmVzcG9uc2Uub3V0cHV0X3RleHQuZGVsdGFcIjtcbn1cbmZ1bmN0aW9uIGlzUmVzcG9uc2VPdXRwdXRJdGVtRG9uZUNodW5rKGNodW5rKSB7XG4gIHJldHVybiBjaHVuay50eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIjtcbn1cbmZ1bmN0aW9uIGlzUmVzcG9uc2VGaW5pc2hlZENodW5rKGNodW5rKSB7XG4gIHJldHVybiBjaHVuay50eXBlID09PSBcInJlc3BvbnNlLmNvbXBsZXRlZFwiIHx8IGNodW5rLnR5cGUgPT09IFwicmVzcG9uc2UuaW5jb21wbGV0ZVwiO1xufVxuZnVuY3Rpb24gaXNSZXNwb25zZUZhaWxlZENodW5rKGNodW5rKSB7XG4gIHJldHVybiBjaHVuay50eXBlID09PSBcInJlc3BvbnNlLmZhaWxlZFwiO1xufVxuZnVuY3Rpb24gaXNSZXNwb25zZUNyZWF0ZWRDaHVuayhjaHVuaykge1xuICByZXR1cm4gY2h1bmsudHlwZSA9PT0gXCJyZXNwb25zZS5jcmVhdGVkXCI7XG59XG5mdW5jdGlvbiBpc1Jlc3BvbnNlRnVuY3Rpb25DYWxsQXJndW1lbnRzRGVsdGFDaHVuayhjaHVuaykge1xuICByZXR1cm4gY2h1bmsudHlwZSA9PT0gXCJyZXNwb25zZS5mdW5jdGlvbl9jYWxsX2FyZ3VtZW50cy5kZWx0YVwiO1xufVxuZnVuY3Rpb24gaXNSZXNwb25zZUN1c3RvbVRvb2xDYWxsSW5wdXREZWx0YUNodW5rKGNodW5rKSB7XG4gIHJldHVybiBjaHVuay50eXBlID09PSBcInJlc3BvbnNlLmN1c3RvbV90b29sX2NhbGxfaW5wdXQuZGVsdGFcIjtcbn1cbmZ1bmN0aW9uIGlzUmVzcG9uc2VJbWFnZUdlbmVyYXRpb25DYWxsUGFydGlhbEltYWdlQ2h1bmsoY2h1bmspIHtcbiAgcmV0dXJuIGNodW5rLnR5cGUgPT09IFwicmVzcG9uc2UuaW1hZ2VfZ2VuZXJhdGlvbl9jYWxsLnBhcnRpYWxfaW1hZ2VcIjtcbn1cbmZ1bmN0aW9uIGlzUmVzcG9uc2VDb2RlSW50ZXJwcmV0ZXJDYWxsQ29kZURlbHRhQ2h1bmsoY2h1bmspIHtcbiAgcmV0dXJuIGNodW5rLnR5cGUgPT09IFwicmVzcG9uc2UuY29kZV9pbnRlcnByZXRlcl9jYWxsX2NvZGUuZGVsdGFcIjtcbn1cbmZ1bmN0aW9uIGlzUmVzcG9uc2VDb2RlSW50ZXJwcmV0ZXJDYWxsQ29kZURvbmVDaHVuayhjaHVuaykge1xuICByZXR1cm4gY2h1bmsudHlwZSA9PT0gXCJyZXNwb25zZS5jb2RlX2ludGVycHJldGVyX2NhbGxfY29kZS5kb25lXCI7XG59XG5mdW5jdGlvbiBpc1Jlc3BvbnNlQXBwbHlQYXRjaENhbGxPcGVyYXRpb25EaWZmRGVsdGFDaHVuayhjaHVuaykge1xuICByZXR1cm4gY2h1bmsudHlwZSA9PT0gXCJyZXNwb25zZS5hcHBseV9wYXRjaF9jYWxsX29wZXJhdGlvbl9kaWZmLmRlbHRhXCI7XG59XG5mdW5jdGlvbiBpc1Jlc3BvbnNlQXBwbHlQYXRjaENhbGxPcGVyYXRpb25EaWZmRG9uZUNodW5rKGNodW5rKSB7XG4gIHJldHVybiBjaHVuay50eXBlID09PSBcInJlc3BvbnNlLmFwcGx5X3BhdGNoX2NhbGxfb3BlcmF0aW9uX2RpZmYuZG9uZVwiO1xufVxuZnVuY3Rpb24gaXNSZXNwb25zZU91dHB1dEl0ZW1BZGRlZENodW5rKGNodW5rKSB7XG4gIHJldHVybiBjaHVuay50eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmFkZGVkXCI7XG59XG5mdW5jdGlvbiBpc1Jlc3BvbnNlQW5ub3RhdGlvbkFkZGVkQ2h1bmsoY2h1bmspIHtcbiAgcmV0dXJuIGNodW5rLnR5cGUgPT09IFwicmVzcG9uc2Uub3V0cHV0X3RleHQuYW5ub3RhdGlvbi5hZGRlZFwiO1xufVxuZnVuY3Rpb24gaXNFcnJvckNodW5rKGNodW5rKSB7XG4gIHJldHVybiBjaHVuay50eXBlID09PSBcImVycm9yXCI7XG59XG5mdW5jdGlvbiBtYXBXZWJTZWFyY2hPdXRwdXQoYWN0aW9uKSB7XG4gIHZhciBfYTtcbiAgaWYgKGFjdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpb246IHsgdHlwZTogXCJzZWFyY2hcIiwgcXVlcnk6IChfYSA9IGFjdGlvbi5xdWVyeSkgIT0gbnVsbCA/IF9hIDogdm9pZCAwIH0sXG4gICAgICAgIC8vIGluY2x1ZGUgc291cmNlcyB3aGVuIHByb3ZpZGVkIGJ5IHRoZSBSZXNwb25zZXMgQVBJIChiZWhpbmQgaW5jbHVkZSBmbGFnKVxuICAgICAgICAuLi5hY3Rpb24uc291cmNlcyAhPSBudWxsICYmIHsgc291cmNlczogYWN0aW9uLnNvdXJjZXMgfVxuICAgICAgfTtcbiAgICBjYXNlIFwib3Blbl9wYWdlXCI6XG4gICAgICByZXR1cm4geyBhY3Rpb246IHsgdHlwZTogXCJvcGVuUGFnZVwiLCB1cmw6IGFjdGlvbi51cmwgfSB9O1xuICAgIGNhc2UgXCJmaW5kX2luX3BhZ2VcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdGlvbjoge1xuICAgICAgICAgIHR5cGU6IFwiZmluZEluUGFnZVwiLFxuICAgICAgICAgIHVybDogYWN0aW9uLnVybCxcbiAgICAgICAgICBwYXR0ZXJuOiBhY3Rpb24ucGF0dGVyblxuICAgICAgICB9XG4gICAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBlc2NhcGVKU09ORGVsdGEoZGVsdGEpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRlbHRhKS5zbGljZSgxLCAtMSk7XG59XG5cbi8vIHNyYy9zcGVlY2gvb3BlbmFpLXNwZWVjaC1tb2RlbC50c1xuaW1wb3J0IHtcbiAgY29tYmluZUhlYWRlcnMgYXMgY29tYmluZUhlYWRlcnM2LFxuICBjcmVhdGVCaW5hcnlSZXNwb25zZUhhbmRsZXIsXG4gIHBhcnNlUHJvdmlkZXJPcHRpb25zIGFzIHBhcnNlUHJvdmlkZXJPcHRpb25zNixcbiAgcG9zdEpzb25Ub0FwaSBhcyBwb3N0SnNvblRvQXBpNlxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvc3BlZWNoL29wZW5haS1zcGVlY2gtb3B0aW9ucy50c1xuaW1wb3J0IHsgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMjEsIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWEyMSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoyMyB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBvcGVuYWlTcGVlY2hNb2RlbE9wdGlvbnNTY2hlbWEgPSBsYXp5U2NoZW1hMjEoXG4gICgpID0+IHpvZFNjaGVtYTIxKFxuICAgIHoyMy5vYmplY3Qoe1xuICAgICAgaW5zdHJ1Y3Rpb25zOiB6MjMuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgc3BlZWQ6IHoyMy5udW1iZXIoKS5taW4oMC4yNSkubWF4KDQpLmRlZmF1bHQoMSkubnVsbGlzaCgpXG4gICAgfSlcbiAgKVxuKTtcblxuLy8gc3JjL3NwZWVjaC9vcGVuYWktc3BlZWNoLW1vZGVsLnRzXG52YXIgT3BlbkFJU3BlZWNoTW9kZWwgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsSWQsIGNvbmZpZykge1xuICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQ7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9IFwidjNcIjtcbiAgfVxuICBnZXQgcHJvdmlkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb3ZpZGVyO1xuICB9XG4gIGFzeW5jIGdldEFyZ3Moe1xuICAgIHRleHQsXG4gICAgdm9pY2UgPSBcImFsbG95XCIsXG4gICAgb3V0cHV0Rm9ybWF0ID0gXCJtcDNcIixcbiAgICBzcGVlZCxcbiAgICBpbnN0cnVjdGlvbnMsXG4gICAgbGFuZ3VhZ2UsXG4gICAgcHJvdmlkZXJPcHRpb25zXG4gIH0pIHtcbiAgICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICAgIGNvbnN0IG9wZW5BSU9wdGlvbnMgPSBhd2FpdCBwYXJzZVByb3ZpZGVyT3B0aW9uczYoe1xuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgICBzY2hlbWE6IG9wZW5haVNwZWVjaE1vZGVsT3B0aW9uc1NjaGVtYVxuICAgIH0pO1xuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xuICAgICAgbW9kZWw6IHRoaXMubW9kZWxJZCxcbiAgICAgIGlucHV0OiB0ZXh0LFxuICAgICAgdm9pY2UsXG4gICAgICByZXNwb25zZV9mb3JtYXQ6IFwibXAzXCIsXG4gICAgICBzcGVlZCxcbiAgICAgIGluc3RydWN0aW9uc1xuICAgIH07XG4gICAgaWYgKG91dHB1dEZvcm1hdCkge1xuICAgICAgaWYgKFtcIm1wM1wiLCBcIm9wdXNcIiwgXCJhYWNcIiwgXCJmbGFjXCIsIFwid2F2XCIsIFwicGNtXCJdLmluY2x1ZGVzKG91dHB1dEZvcm1hdCkpIHtcbiAgICAgICAgcmVxdWVzdEJvZHkucmVzcG9uc2VfZm9ybWF0ID0gb3V0cHV0Rm9ybWF0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLFxuICAgICAgICAgIGZlYXR1cmU6IFwib3V0cHV0Rm9ybWF0XCIsXG4gICAgICAgICAgZGV0YWlsczogYFVuc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQ6ICR7b3V0cHV0Rm9ybWF0fS4gVXNpbmcgbXAzIGluc3RlYWQuYFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wZW5BSU9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNwZWVjaE1vZGVsT3B0aW9ucyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3BlZWNoTW9kZWxPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3BlZWNoTW9kZWxPcHRpb25zW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmVxdWVzdEJvZHlba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsYW5ndWFnZSkge1xuICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgZmVhdHVyZTogXCJsYW5ndWFnZVwiLFxuICAgICAgICBkZXRhaWxzOiBgT3BlbkFJIHNwZWVjaCBtb2RlbHMgZG8gbm90IHN1cHBvcnQgbGFuZ3VhZ2Ugc2VsZWN0aW9uLiBMYW5ndWFnZSBwYXJhbWV0ZXIgXCIke2xhbmd1YWdlfVwiIHdhcyBpZ25vcmVkLmBcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWVzdEJvZHksXG4gICAgICB3YXJuaW5nc1xuICAgIH07XG4gIH1cbiAgYXN5bmMgZG9HZW5lcmF0ZShvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgY29uc3QgY3VycmVudERhdGUgPSAoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLmNvbmZpZy5faW50ZXJuYWwpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jdXJyZW50RGF0ZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EpKSAhPSBudWxsID8gX2MgOiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTtcbiAgICBjb25zdCB7IHJlcXVlc3RCb2R5LCB3YXJuaW5ncyB9ID0gYXdhaXQgdGhpcy5nZXRBcmdzKG9wdGlvbnMpO1xuICAgIGNvbnN0IHtcbiAgICAgIHZhbHVlOiBhdWRpbyxcbiAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgIHJhd1ZhbHVlOiByYXdSZXNwb25zZVxuICAgIH0gPSBhd2FpdCBwb3N0SnNvblRvQXBpNih7XG4gICAgICB1cmw6IHRoaXMuY29uZmlnLnVybCh7XG4gICAgICAgIHBhdGg6IFwiL2F1ZGlvL3NwZWVjaFwiLFxuICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWRcbiAgICAgIH0pLFxuICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnM2KHRoaXMuY29uZmlnLmhlYWRlcnMoKSwgb3B0aW9ucy5oZWFkZXJzKSxcbiAgICAgIGJvZHk6IHJlcXVlc3RCb2R5LFxuICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBvcGVuYWlGYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVCaW5hcnlSZXNwb25zZUhhbmRsZXIoKSxcbiAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF1ZGlvLFxuICAgICAgd2FybmluZ3MsXG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3RCb2R5KVxuICAgICAgfSxcbiAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgIHRpbWVzdGFtcDogY3VycmVudERhdGUsXG4gICAgICAgIG1vZGVsSWQ6IHRoaXMubW9kZWxJZCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBib2R5OiByYXdSZXNwb25zZVxuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cbi8vIHNyYy90cmFuc2NyaXB0aW9uL29wZW5haS10cmFuc2NyaXB0aW9uLW1vZGVsLnRzXG5pbXBvcnQge1xuICBjb21iaW5lSGVhZGVycyBhcyBjb21iaW5lSGVhZGVyczcsXG4gIGNvbnZlcnRCYXNlNjRUb1VpbnQ4QXJyYXkgYXMgY29udmVydEJhc2U2NFRvVWludDhBcnJheTIsXG4gIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjYsXG4gIG1lZGlhVHlwZVRvRXh0ZW5zaW9uLFxuICBwYXJzZVByb3ZpZGVyT3B0aW9ucyBhcyBwYXJzZVByb3ZpZGVyT3B0aW9uczcsXG4gIHBvc3RGb3JtRGF0YVRvQXBpIGFzIHBvc3RGb3JtRGF0YVRvQXBpMlxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvdHJhbnNjcmlwdGlvbi9vcGVuYWktdHJhbnNjcmlwdGlvbi1hcGkudHNcbmltcG9ydCB7IGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTIyLCB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMjIgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6MjQgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgb3BlbmFpVHJhbnNjcmlwdGlvblJlc3BvbnNlU2NoZW1hID0gbGF6eVNjaGVtYTIyKFxuICAoKSA9PiB6b2RTY2hlbWEyMihcbiAgICB6MjQub2JqZWN0KHtcbiAgICAgIHRleHQ6IHoyNC5zdHJpbmcoKSxcbiAgICAgIGxhbmd1YWdlOiB6MjQuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgZHVyYXRpb246IHoyNC5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICB3b3JkczogejI0LmFycmF5KFxuICAgICAgICB6MjQub2JqZWN0KHtcbiAgICAgICAgICB3b3JkOiB6MjQuc3RyaW5nKCksXG4gICAgICAgICAgc3RhcnQ6IHoyNC5udW1iZXIoKSxcbiAgICAgICAgICBlbmQ6IHoyNC5udW1iZXIoKVxuICAgICAgICB9KVxuICAgICAgKS5udWxsaXNoKCksXG4gICAgICBzZWdtZW50czogejI0LmFycmF5KFxuICAgICAgICB6MjQub2JqZWN0KHtcbiAgICAgICAgICBpZDogejI0Lm51bWJlcigpLFxuICAgICAgICAgIHNlZWs6IHoyNC5udW1iZXIoKSxcbiAgICAgICAgICBzdGFydDogejI0Lm51bWJlcigpLFxuICAgICAgICAgIGVuZDogejI0Lm51bWJlcigpLFxuICAgICAgICAgIHRleHQ6IHoyNC5zdHJpbmcoKSxcbiAgICAgICAgICB0b2tlbnM6IHoyNC5hcnJheSh6MjQubnVtYmVyKCkpLFxuICAgICAgICAgIHRlbXBlcmF0dXJlOiB6MjQubnVtYmVyKCksXG4gICAgICAgICAgYXZnX2xvZ3Byb2I6IHoyNC5udW1iZXIoKSxcbiAgICAgICAgICBjb21wcmVzc2lvbl9yYXRpbzogejI0Lm51bWJlcigpLFxuICAgICAgICAgIG5vX3NwZWVjaF9wcm9iOiB6MjQubnVtYmVyKClcbiAgICAgICAgfSlcbiAgICAgICkubnVsbGlzaCgpXG4gICAgfSlcbiAgKVxuKTtcblxuLy8gc3JjL3RyYW5zY3JpcHRpb24vb3BlbmFpLXRyYW5zY3JpcHRpb24tb3B0aW9ucy50c1xuaW1wb3J0IHsgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMjMsIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWEyMyB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoyNSB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBvcGVuQUlUcmFuc2NyaXB0aW9uTW9kZWxPcHRpb25zID0gbGF6eVNjaGVtYTIzKFxuICAoKSA9PiB6b2RTY2hlbWEyMyhcbiAgICB6MjUub2JqZWN0KHtcbiAgICAgIC8qKlxuICAgICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBpbmNsdWRlIGluIHRoZSB0cmFuc2NyaXB0aW9uIHJlc3BvbnNlLlxuICAgICAgICovXG4gICAgICBpbmNsdWRlOiB6MjUuYXJyYXkoejI1LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIGlucHV0IGF1ZGlvIGluIElTTy02MzktMSBmb3JtYXQuXG4gICAgICAgKi9cbiAgICAgIGxhbmd1YWdlOiB6MjUuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogQW4gb3B0aW9uYWwgdGV4dCB0byBndWlkZSB0aGUgbW9kZWwncyBzdHlsZSBvciBjb250aW51ZSBhIHByZXZpb3VzIGF1ZGlvIHNlZ21lbnQuXG4gICAgICAgKi9cbiAgICAgIHByb21wdDogejI1LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBzYW1wbGluZyB0ZW1wZXJhdHVyZSwgYmV0d2VlbiAwIGFuZCAxLlxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0ZW1wZXJhdHVyZTogejI1Lm51bWJlcigpLm1pbigwKS5tYXgoMSkuZGVmYXVsdCgwKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdGltZXN0YW1wIGdyYW51bGFyaXRpZXMgdG8gcG9wdWxhdGUgZm9yIHRoaXMgdHJhbnNjcmlwdGlvbi5cbiAgICAgICAqIEBkZWZhdWx0IFsnc2VnbWVudCddXG4gICAgICAgKi9cbiAgICAgIHRpbWVzdGFtcEdyYW51bGFyaXRpZXM6IHoyNS5hcnJheSh6MjUuZW51bShbXCJ3b3JkXCIsIFwic2VnbWVudFwiXSkpLmRlZmF1bHQoW1wic2VnbWVudFwiXSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG5cbi8vIHNyYy90cmFuc2NyaXB0aW9uL29wZW5haS10cmFuc2NyaXB0aW9uLW1vZGVsLnRzXG52YXIgbGFuZ3VhZ2VNYXAgPSB7XG4gIGFmcmlrYWFuczogXCJhZlwiLFxuICBhcmFiaWM6IFwiYXJcIixcbiAgYXJtZW5pYW46IFwiaHlcIixcbiAgYXplcmJhaWphbmk6IFwiYXpcIixcbiAgYmVsYXJ1c2lhbjogXCJiZVwiLFxuICBib3NuaWFuOiBcImJzXCIsXG4gIGJ1bGdhcmlhbjogXCJiZ1wiLFxuICBjYXRhbGFuOiBcImNhXCIsXG4gIGNoaW5lc2U6IFwiemhcIixcbiAgY3JvYXRpYW46IFwiaHJcIixcbiAgY3plY2g6IFwiY3NcIixcbiAgZGFuaXNoOiBcImRhXCIsXG4gIGR1dGNoOiBcIm5sXCIsXG4gIGVuZ2xpc2g6IFwiZW5cIixcbiAgZXN0b25pYW46IFwiZXRcIixcbiAgZmlubmlzaDogXCJmaVwiLFxuICBmcmVuY2g6IFwiZnJcIixcbiAgZ2FsaWNpYW46IFwiZ2xcIixcbiAgZ2VybWFuOiBcImRlXCIsXG4gIGdyZWVrOiBcImVsXCIsXG4gIGhlYnJldzogXCJoZVwiLFxuICBoaW5kaTogXCJoaVwiLFxuICBodW5nYXJpYW46IFwiaHVcIixcbiAgaWNlbGFuZGljOiBcImlzXCIsXG4gIGluZG9uZXNpYW46IFwiaWRcIixcbiAgaXRhbGlhbjogXCJpdFwiLFxuICBqYXBhbmVzZTogXCJqYVwiLFxuICBrYW5uYWRhOiBcImtuXCIsXG4gIGthemFraDogXCJra1wiLFxuICBrb3JlYW46IFwia29cIixcbiAgbGF0dmlhbjogXCJsdlwiLFxuICBsaXRodWFuaWFuOiBcImx0XCIsXG4gIG1hY2Vkb25pYW46IFwibWtcIixcbiAgbWFsYXk6IFwibXNcIixcbiAgbWFyYXRoaTogXCJtclwiLFxuICBtYW9yaTogXCJtaVwiLFxuICBuZXBhbGk6IFwibmVcIixcbiAgbm9yd2VnaWFuOiBcIm5vXCIsXG4gIHBlcnNpYW46IFwiZmFcIixcbiAgcG9saXNoOiBcInBsXCIsXG4gIHBvcnR1Z3Vlc2U6IFwicHRcIixcbiAgcm9tYW5pYW46IFwicm9cIixcbiAgcnVzc2lhbjogXCJydVwiLFxuICBzZXJiaWFuOiBcInNyXCIsXG4gIHNsb3ZhazogXCJza1wiLFxuICBzbG92ZW5pYW46IFwic2xcIixcbiAgc3BhbmlzaDogXCJlc1wiLFxuICBzd2FoaWxpOiBcInN3XCIsXG4gIHN3ZWRpc2g6IFwic3ZcIixcbiAgdGFnYWxvZzogXCJ0bFwiLFxuICB0YW1pbDogXCJ0YVwiLFxuICB0aGFpOiBcInRoXCIsXG4gIHR1cmtpc2g6IFwidHJcIixcbiAgdWtyYWluaWFuOiBcInVrXCIsXG4gIHVyZHU6IFwidXJcIixcbiAgdmlldG5hbWVzZTogXCJ2aVwiLFxuICB3ZWxzaDogXCJjeVwiXG59O1xudmFyIE9wZW5BSVRyYW5zY3JpcHRpb25Nb2RlbCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IobW9kZWxJZCwgY29uZmlnKSB7XG4gICAgdGhpcy5tb2RlbElkID0gbW9kZWxJZDtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNwZWNpZmljYXRpb25WZXJzaW9uID0gXCJ2M1wiO1xuICB9XG4gIGdldCBwcm92aWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucHJvdmlkZXI7XG4gIH1cbiAgYXN5bmMgZ2V0QXJncyh7XG4gICAgYXVkaW8sXG4gICAgbWVkaWFUeXBlLFxuICAgIHByb3ZpZGVyT3B0aW9uc1xuICB9KSB7XG4gICAgY29uc3Qgd2FybmluZ3MgPSBbXTtcbiAgICBjb25zdCBvcGVuQUlPcHRpb25zID0gYXdhaXQgcGFyc2VQcm92aWRlck9wdGlvbnM3KHtcbiAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgcHJvdmlkZXJPcHRpb25zLFxuICAgICAgc2NoZW1hOiBvcGVuQUlUcmFuc2NyaXB0aW9uTW9kZWxPcHRpb25zXG4gICAgfSk7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBjb25zdCBibG9iID0gYXVkaW8gaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gbmV3IEJsb2IoW2F1ZGlvXSkgOiBuZXcgQmxvYihbY29udmVydEJhc2U2NFRvVWludDhBcnJheTIoYXVkaW8pXSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKFwibW9kZWxcIiwgdGhpcy5tb2RlbElkKTtcbiAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gbWVkaWFUeXBlVG9FeHRlbnNpb24obWVkaWFUeXBlKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICBcImZpbGVcIixcbiAgICAgIG5ldyBGaWxlKFtibG9iXSwgXCJhdWRpb1wiLCB7IHR5cGU6IG1lZGlhVHlwZSB9KSxcbiAgICAgIGBhdWRpby4ke2ZpbGVFeHRlbnNpb259YFxuICAgICk7XG4gICAgaWYgKG9wZW5BSU9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHRyYW5zY3JpcHRpb25Nb2RlbE9wdGlvbnMgPSB7XG4gICAgICAgIGluY2x1ZGU6IG9wZW5BSU9wdGlvbnMuaW5jbHVkZSxcbiAgICAgICAgbGFuZ3VhZ2U6IG9wZW5BSU9wdGlvbnMubGFuZ3VhZ2UsXG4gICAgICAgIHByb21wdDogb3BlbkFJT3B0aW9ucy5wcm9tcHQsXG4gICAgICAgIC8vIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXVkaW8vY3JlYXRlVHJhbnNjcmlwdGlvbiNhdWRpb19jcmVhdGV0cmFuc2NyaXB0aW9uLXJlc3BvbnNlX2Zvcm1hdFxuICAgICAgICAvLyBwcmVmZXIgdmVyYm9zZV9qc29uIHRvIGdldCBzZWdtZW50cyBmb3IgbW9kZWxzIHRoYXQgc3VwcG9ydCBpdFxuICAgICAgICByZXNwb25zZV9mb3JtYXQ6IFtcbiAgICAgICAgICBcImdwdC00by10cmFuc2NyaWJlXCIsXG4gICAgICAgICAgXCJncHQtNG8tbWluaS10cmFuc2NyaWJlXCJcbiAgICAgICAgXS5pbmNsdWRlcyh0aGlzLm1vZGVsSWQpID8gXCJqc29uXCIgOiBcInZlcmJvc2VfanNvblwiLFxuICAgICAgICB0ZW1wZXJhdHVyZTogb3BlbkFJT3B0aW9ucy50ZW1wZXJhdHVyZSxcbiAgICAgICAgdGltZXN0YW1wX2dyYW51bGFyaXRpZXM6IG9wZW5BSU9wdGlvbnMudGltZXN0YW1wR3JhbnVsYXJpdGllc1xuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRyYW5zY3JpcHRpb25Nb2RlbE9wdGlvbnMpKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGAke2tleX1bXWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZm9ybURhdGEsXG4gICAgICB3YXJuaW5nc1xuICAgIH07XG4gIH1cbiAgYXN5bmMgZG9HZW5lcmF0ZShvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaDtcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IChfYyA9IChfYiA9IChfYSA9IHRoaXMuY29uZmlnLl9pbnRlcm5hbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmN1cnJlbnREYXRlKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChfYSkpICE9IG51bGwgPyBfYyA6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHsgZm9ybURhdGEsIHdhcm5pbmdzIH0gPSBhd2FpdCB0aGlzLmdldEFyZ3Mob3B0aW9ucyk7XG4gICAgY29uc3Qge1xuICAgICAgdmFsdWU6IHJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgcmF3VmFsdWU6IHJhd1Jlc3BvbnNlXG4gICAgfSA9IGF3YWl0IHBvc3RGb3JtRGF0YVRvQXBpMih7XG4gICAgICB1cmw6IHRoaXMuY29uZmlnLnVybCh7XG4gICAgICAgIHBhdGg6IFwiL2F1ZGlvL3RyYW5zY3JpcHRpb25zXCIsXG4gICAgICAgIG1vZGVsSWQ6IHRoaXMubW9kZWxJZFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVyczcodGhpcy5jb25maWcuaGVhZGVycygpLCBvcHRpb25zLmhlYWRlcnMpLFxuICAgICAgZm9ybURhdGEsXG4gICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IG9wZW5haUZhaWxlZFJlc3BvbnNlSGFuZGxlcixcbiAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXI2KFxuICAgICAgICBvcGVuYWlUcmFuc2NyaXB0aW9uUmVzcG9uc2VTY2hlbWFcbiAgICAgICksXG4gICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgIH0pO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gcmVzcG9uc2UubGFuZ3VhZ2UgIT0gbnVsbCAmJiByZXNwb25zZS5sYW5ndWFnZSBpbiBsYW5ndWFnZU1hcCA/IGxhbmd1YWdlTWFwW3Jlc3BvbnNlLmxhbmd1YWdlXSA6IHZvaWQgMDtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogcmVzcG9uc2UudGV4dCxcbiAgICAgIHNlZ21lbnRzOiAoX2cgPSAoX2YgPSAoX2QgPSByZXNwb25zZS5zZWdtZW50cykgPT0gbnVsbCA/IHZvaWQgMCA6IF9kLm1hcCgoc2VnbWVudCkgPT4gKHtcbiAgICAgICAgdGV4dDogc2VnbWVudC50ZXh0LFxuICAgICAgICBzdGFydFNlY29uZDogc2VnbWVudC5zdGFydCxcbiAgICAgICAgZW5kU2Vjb25kOiBzZWdtZW50LmVuZFxuICAgICAgfSkpKSAhPSBudWxsID8gX2YgOiAoX2UgPSByZXNwb25zZS53b3JkcykgPT0gbnVsbCA/IHZvaWQgMCA6IF9lLm1hcCgod29yZCkgPT4gKHtcbiAgICAgICAgdGV4dDogd29yZC53b3JkLFxuICAgICAgICBzdGFydFNlY29uZDogd29yZC5zdGFydCxcbiAgICAgICAgZW5kU2Vjb25kOiB3b3JkLmVuZFxuICAgICAgfSkpKSAhPSBudWxsID8gX2cgOiBbXSxcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgZHVyYXRpb25JblNlY29uZHM6IChfaCA9IHJlc3BvbnNlLmR1cmF0aW9uKSAhPSBudWxsID8gX2ggOiB2b2lkIDAsXG4gICAgICB3YXJuaW5ncyxcbiAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgIHRpbWVzdGFtcDogY3VycmVudERhdGUsXG4gICAgICAgIG1vZGVsSWQ6IHRoaXMubW9kZWxJZCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBib2R5OiByYXdSZXNwb25zZVxuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cbi8vIHNyYy92ZXJzaW9uLnRzXG52YXIgVkVSU0lPTiA9IHRydWUgPyBcIjMuMC40OVwiIDogXCIwLjAuMC10ZXN0XCI7XG5cbi8vIHNyYy9vcGVuYWktcHJvdmlkZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZU9wZW5BSShvcHRpb25zID0ge30pIHtcbiAgdmFyIF9hLCBfYjtcbiAgY29uc3QgYmFzZVVSTCA9IChfYSA9IHdpdGhvdXRUcmFpbGluZ1NsYXNoKFxuICAgIGxvYWRPcHRpb25hbFNldHRpbmcoe1xuICAgICAgc2V0dGluZ1ZhbHVlOiBvcHRpb25zLmJhc2VVUkwsXG4gICAgICBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZTogXCJPUEVOQUlfQkFTRV9VUkxcIlxuICAgIH0pXG4gICkpICE9IG51bGwgPyBfYSA6IFwiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MVwiO1xuICBjb25zdCBwcm92aWRlck5hbWUgPSAoX2IgPSBvcHRpb25zLm5hbWUpICE9IG51bGwgPyBfYiA6IFwib3BlbmFpXCI7XG4gIGNvbnN0IGdldEhlYWRlcnMgPSAoKSA9PiB3aXRoVXNlckFnZW50U3VmZml4KFxuICAgIHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2FkQXBpS2V5KHtcbiAgICAgICAgYXBpS2V5OiBvcHRpb25zLmFwaUtleSxcbiAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWU6IFwiT1BFTkFJX0FQSV9LRVlcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiT3BlbkFJXCJcbiAgICAgIH0pfWAsXG4gICAgICBcIk9wZW5BSS1Pcmdhbml6YXRpb25cIjogb3B0aW9ucy5vcmdhbml6YXRpb24sXG4gICAgICBcIk9wZW5BSS1Qcm9qZWN0XCI6IG9wdGlvbnMucHJvamVjdCxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVyc1xuICAgIH0sXG4gICAgYGFpLXNkay9vcGVuYWkvJHtWRVJTSU9OfWBcbiAgKTtcbiAgY29uc3QgY3JlYXRlQ2hhdE1vZGVsID0gKG1vZGVsSWQpID0+IG5ldyBPcGVuQUlDaGF0TGFuZ3VhZ2VNb2RlbChtb2RlbElkLCB7XG4gICAgcHJvdmlkZXI6IGAke3Byb3ZpZGVyTmFtZX0uY2hhdGAsXG4gICAgdXJsOiAoeyBwYXRoIH0pID0+IGAke2Jhc2VVUkx9JHtwYXRofWAsXG4gICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICBmZXRjaDogb3B0aW9ucy5mZXRjaFxuICB9KTtcbiAgY29uc3QgY3JlYXRlQ29tcGxldGlvbk1vZGVsID0gKG1vZGVsSWQpID0+IG5ldyBPcGVuQUlDb21wbGV0aW9uTGFuZ3VhZ2VNb2RlbChtb2RlbElkLCB7XG4gICAgcHJvdmlkZXI6IGAke3Byb3ZpZGVyTmFtZX0uY29tcGxldGlvbmAsXG4gICAgdXJsOiAoeyBwYXRoIH0pID0+IGAke2Jhc2VVUkx9JHtwYXRofWAsXG4gICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICBmZXRjaDogb3B0aW9ucy5mZXRjaFxuICB9KTtcbiAgY29uc3QgY3JlYXRlRW1iZWRkaW5nTW9kZWwgPSAobW9kZWxJZCkgPT4gbmV3IE9wZW5BSUVtYmVkZGluZ01vZGVsKG1vZGVsSWQsIHtcbiAgICBwcm92aWRlcjogYCR7cHJvdmlkZXJOYW1lfS5lbWJlZGRpbmdgLFxuICAgIHVybDogKHsgcGF0aCB9KSA9PiBgJHtiYXNlVVJMfSR7cGF0aH1gLFxuICAgIGhlYWRlcnM6IGdldEhlYWRlcnMsXG4gICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2hcbiAgfSk7XG4gIGNvbnN0IGNyZWF0ZUltYWdlTW9kZWwgPSAobW9kZWxJZCkgPT4gbmV3IE9wZW5BSUltYWdlTW9kZWwobW9kZWxJZCwge1xuICAgIHByb3ZpZGVyOiBgJHtwcm92aWRlck5hbWV9LmltYWdlYCxcbiAgICB1cmw6ICh7IHBhdGggfSkgPT4gYCR7YmFzZVVSTH0ke3BhdGh9YCxcbiAgICBoZWFkZXJzOiBnZXRIZWFkZXJzLFxuICAgIGZldGNoOiBvcHRpb25zLmZldGNoXG4gIH0pO1xuICBjb25zdCBjcmVhdGVUcmFuc2NyaXB0aW9uTW9kZWwgPSAobW9kZWxJZCkgPT4gbmV3IE9wZW5BSVRyYW5zY3JpcHRpb25Nb2RlbChtb2RlbElkLCB7XG4gICAgcHJvdmlkZXI6IGAke3Byb3ZpZGVyTmFtZX0udHJhbnNjcmlwdGlvbmAsXG4gICAgdXJsOiAoeyBwYXRoIH0pID0+IGAke2Jhc2VVUkx9JHtwYXRofWAsXG4gICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICBmZXRjaDogb3B0aW9ucy5mZXRjaFxuICB9KTtcbiAgY29uc3QgY3JlYXRlU3BlZWNoTW9kZWwgPSAobW9kZWxJZCkgPT4gbmV3IE9wZW5BSVNwZWVjaE1vZGVsKG1vZGVsSWQsIHtcbiAgICBwcm92aWRlcjogYCR7cHJvdmlkZXJOYW1lfS5zcGVlY2hgLFxuICAgIHVybDogKHsgcGF0aCB9KSA9PiBgJHtiYXNlVVJMfSR7cGF0aH1gLFxuICAgIGhlYWRlcnM6IGdldEhlYWRlcnMsXG4gICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2hcbiAgfSk7XG4gIGNvbnN0IGNyZWF0ZUxhbmd1YWdlTW9kZWwgPSAobW9kZWxJZCkgPT4ge1xuICAgIGlmIChuZXcudGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGhlIE9wZW5BSSBtb2RlbCBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBrZXl3b3JkLlwiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlUmVzcG9uc2VzTW9kZWwobW9kZWxJZCk7XG4gIH07XG4gIGNvbnN0IGNyZWF0ZVJlc3BvbnNlc01vZGVsID0gKG1vZGVsSWQpID0+IHtcbiAgICByZXR1cm4gbmV3IE9wZW5BSVJlc3BvbnNlc0xhbmd1YWdlTW9kZWwobW9kZWxJZCwge1xuICAgICAgcHJvdmlkZXI6IGAke3Byb3ZpZGVyTmFtZX0ucmVzcG9uc2VzYCxcbiAgICAgIHVybDogKHsgcGF0aCB9KSA9PiBgJHtiYXNlVVJMfSR7cGF0aH1gLFxuICAgICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICAgIGZldGNoOiBvcHRpb25zLmZldGNoLFxuICAgICAgZmlsZUlkUHJlZml4ZXM6IFtcImZpbGUtXCJdXG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHByb3ZpZGVyID0gZnVuY3Rpb24obW9kZWxJZCkge1xuICAgIHJldHVybiBjcmVhdGVMYW5ndWFnZU1vZGVsKG1vZGVsSWQpO1xuICB9O1xuICBwcm92aWRlci5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9IFwidjNcIjtcbiAgcHJvdmlkZXIubGFuZ3VhZ2VNb2RlbCA9IGNyZWF0ZUxhbmd1YWdlTW9kZWw7XG4gIHByb3ZpZGVyLmNoYXQgPSBjcmVhdGVDaGF0TW9kZWw7XG4gIHByb3ZpZGVyLmNvbXBsZXRpb24gPSBjcmVhdGVDb21wbGV0aW9uTW9kZWw7XG4gIHByb3ZpZGVyLnJlc3BvbnNlcyA9IGNyZWF0ZVJlc3BvbnNlc01vZGVsO1xuICBwcm92aWRlci5lbWJlZGRpbmcgPSBjcmVhdGVFbWJlZGRpbmdNb2RlbDtcbiAgcHJvdmlkZXIuZW1iZWRkaW5nTW9kZWwgPSBjcmVhdGVFbWJlZGRpbmdNb2RlbDtcbiAgcHJvdmlkZXIudGV4dEVtYmVkZGluZyA9IGNyZWF0ZUVtYmVkZGluZ01vZGVsO1xuICBwcm92aWRlci50ZXh0RW1iZWRkaW5nTW9kZWwgPSBjcmVhdGVFbWJlZGRpbmdNb2RlbDtcbiAgcHJvdmlkZXIuaW1hZ2UgPSBjcmVhdGVJbWFnZU1vZGVsO1xuICBwcm92aWRlci5pbWFnZU1vZGVsID0gY3JlYXRlSW1hZ2VNb2RlbDtcbiAgcHJvdmlkZXIudHJhbnNjcmlwdGlvbiA9IGNyZWF0ZVRyYW5zY3JpcHRpb25Nb2RlbDtcbiAgcHJvdmlkZXIudHJhbnNjcmlwdGlvbk1vZGVsID0gY3JlYXRlVHJhbnNjcmlwdGlvbk1vZGVsO1xuICBwcm92aWRlci5zcGVlY2ggPSBjcmVhdGVTcGVlY2hNb2RlbDtcbiAgcHJvdmlkZXIuc3BlZWNoTW9kZWwgPSBjcmVhdGVTcGVlY2hNb2RlbDtcbiAgcHJvdmlkZXIudG9vbHMgPSBvcGVuYWlUb29scztcbiAgcmV0dXJuIHByb3ZpZGVyO1xufVxudmFyIG9wZW5haSA9IGNyZWF0ZU9wZW5BSSgpO1xuZXhwb3J0IHtcbiAgVkVSU0lPTixcbiAgY3JlYXRlT3BlbkFJLFxuICBvcGVuYWlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/@ai-sdk+openai@3.0.49_zod@3.25.76/node_modules/@ai-sdk/openai/dist/index.mjs\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/.pnpm/@ai-sdk+openai@3.0.49_zod@3.25.76/node_modules/@ai-sdk/openai/dist/index.mjs":
|
|
/*!*********************************************************************************************************!*\
|
|
!*** ./node_modules/.pnpm/@ai-sdk+openai@3.0.49_zod@3.25.76/node_modules/@ai-sdk/openai/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 */ VERSION: () => (/* binding */ VERSION),\n/* harmony export */ createOpenAI: () => (/* binding */ createOpenAI),\n/* harmony export */ openai: () => (/* binding */ openai)\n/* harmony export */ });\n/* harmony import */ var _ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ai-sdk/provider-utils */ \"(rsc)/./node_modules/.pnpm/@ai-sdk+provider-utils@4.0.21_zod@3.25.76/node_modules/@ai-sdk/provider-utils/dist/index.mjs\");\n/* harmony import */ var _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ai-sdk/provider */ \"(rsc)/./node_modules/.pnpm/@ai-sdk+provider@3.0.8/node_modules/@ai-sdk/provider/dist/index.mjs\");\n/* harmony import */ var zod_v4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zod/v4 */ \"(rsc)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/schemas.js\");\n/* harmony import */ var zod_v4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! zod/v4 */ \"(rsc)/./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/classic/coerce.js\");\n// src/openai-provider.ts\n\n\n// src/chat/openai-chat-language-model.ts\n\n\n\n// src/openai-error.ts\n\n\nvar openaiErrorDataSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n // The additional information below is handled loosely to support\n // OpenAI-compatible providers that have slightly different error\n // responses:\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n param: zod_v4__WEBPACK_IMPORTED_MODULE_0__.any().nullish(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()]).nullish()\n })\n});\nvar openaiFailedResponseHandler = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonErrorResponseHandler)({\n errorSchema: openaiErrorDataSchema,\n errorToMessage: (data) => data.error.message\n});\n\n// src/openai-language-model-capabilities.ts\nfunction getOpenAILanguageModelCapabilities(modelId) {\n const supportsFlexProcessing = modelId.startsWith(\"o3\") || modelId.startsWith(\"o4-mini\") || modelId.startsWith(\"gpt-5\") && !modelId.startsWith(\"gpt-5-chat\");\n const supportsPriorityProcessing = modelId.startsWith(\"gpt-4\") || modelId.startsWith(\"gpt-5\") && !modelId.startsWith(\"gpt-5-nano\") && !modelId.startsWith(\"gpt-5-chat\") && !modelId.startsWith(\"gpt-5.4-nano\") || modelId.startsWith(\"o3\") || modelId.startsWith(\"o4-mini\");\n const isReasoningModel = modelId.startsWith(\"o1\") || modelId.startsWith(\"o3\") || modelId.startsWith(\"o4-mini\") || modelId.startsWith(\"gpt-5\") && !modelId.startsWith(\"gpt-5-chat\");\n const supportsNonReasoningParameters = modelId.startsWith(\"gpt-5.1\") || modelId.startsWith(\"gpt-5.2\") || modelId.startsWith(\"gpt-5.3\") || modelId.startsWith(\"gpt-5.4\");\n const systemMessageMode = isReasoningModel ? \"developer\" : \"system\";\n return {\n supportsFlexProcessing,\n supportsPriorityProcessing,\n isReasoningModel,\n systemMessageMode,\n supportsNonReasoningParameters\n };\n}\n\n// src/chat/convert-openai-chat-usage.ts\nfunction convertOpenAIChatUsage(usage) {\n var _a, _b, _c, _d, _e, _f;\n if (usage == null) {\n return {\n inputTokens: {\n total: void 0,\n noCache: void 0,\n cacheRead: void 0,\n cacheWrite: void 0\n },\n outputTokens: {\n total: void 0,\n text: void 0,\n reasoning: void 0\n },\n raw: void 0\n };\n }\n const promptTokens = (_a = usage.prompt_tokens) != null ? _a : 0;\n const completionTokens = (_b = usage.completion_tokens) != null ? _b : 0;\n const cachedTokens = (_d = (_c = usage.prompt_tokens_details) == null ? void 0 : _c.cached_tokens) != null ? _d : 0;\n const reasoningTokens = (_f = (_e = usage.completion_tokens_details) == null ? void 0 : _e.reasoning_tokens) != null ? _f : 0;\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cachedTokens,\n cacheRead: cachedTokens,\n cacheWrite: void 0\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens\n },\n raw: usage\n };\n}\n\n// src/chat/convert-to-openai-chat-messages.ts\n\n\nfunction convertToOpenAIChatMessages({\n prompt,\n systemMessageMode = \"system\"\n}) {\n var _a;\n const messages = [];\n const warnings = [];\n for (const { role, content } of prompt) {\n switch (role) {\n case \"system\": {\n switch (systemMessageMode) {\n case \"system\": {\n messages.push({ role: \"system\", content });\n break;\n }\n case \"developer\": {\n messages.push({ role: \"developer\", content });\n break;\n }\n case \"remove\": {\n warnings.push({\n type: \"other\",\n message: \"system messages are removed for this model\"\n });\n break;\n }\n default: {\n const _exhaustiveCheck = systemMessageMode;\n throw new Error(\n `Unsupported system message mode: ${_exhaustiveCheck}`\n );\n }\n }\n break;\n }\n case \"user\": {\n if (content.length === 1 && content[0].type === \"text\") {\n messages.push({ role: \"user\", content: content[0].text });\n break;\n }\n messages.push({\n role: \"user\",\n content: content.map((part, index) => {\n var _a2, _b, _c;\n switch (part.type) {\n case \"text\": {\n return { type: \"text\", text: part.text };\n }\n case \"file\": {\n if (part.mediaType.startsWith(\"image/\")) {\n const mediaType = part.mediaType === \"image/*\" ? \"image/jpeg\" : part.mediaType;\n return {\n type: \"image_url\",\n image_url: {\n url: part.data instanceof URL ? part.data.toString() : `data:${mediaType};base64,${(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data)}`,\n // OpenAI specific extension: image detail\n detail: (_b = (_a2 = part.providerOptions) == null ? void 0 : _a2.openai) == null ? void 0 : _b.imageDetail\n }\n };\n } else if (part.mediaType.startsWith(\"audio/\")) {\n if (part.data instanceof URL) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: \"audio file parts with URLs\"\n });\n }\n switch (part.mediaType) {\n case \"audio/wav\": {\n return {\n type: \"input_audio\",\n input_audio: {\n data: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data),\n format: \"wav\"\n }\n };\n }\n case \"audio/mp3\":\n case \"audio/mpeg\": {\n return {\n type: \"input_audio\",\n input_audio: {\n data: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data),\n format: \"mp3\"\n }\n };\n }\n default: {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: `audio content parts with media type ${part.mediaType}`\n });\n }\n }\n } else if (part.mediaType === \"application/pdf\") {\n if (part.data instanceof URL) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: \"PDF file parts with URLs\"\n });\n }\n return {\n type: \"file\",\n file: typeof part.data === \"string\" && part.data.startsWith(\"file-\") ? { file_id: part.data } : {\n filename: (_c = part.filename) != null ? _c : `part-${index}.pdf`,\n file_data: `data:application/pdf;base64,${(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data)}`\n }\n };\n } else {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: `file part media type ${part.mediaType}`\n });\n }\n }\n }\n })\n });\n break;\n }\n case \"assistant\": {\n let text = \"\";\n const toolCalls = [];\n for (const part of content) {\n switch (part.type) {\n case \"text\": {\n text += part.text;\n break;\n }\n case \"tool-call\": {\n toolCalls.push({\n id: part.toolCallId,\n type: \"function\",\n function: {\n name: part.toolName,\n arguments: JSON.stringify(part.input)\n }\n });\n break;\n }\n }\n }\n messages.push({\n role: \"assistant\",\n content: text,\n tool_calls: toolCalls.length > 0 ? toolCalls : void 0\n });\n break;\n }\n case \"tool\": {\n for (const toolResponse of content) {\n if (toolResponse.type === \"tool-approval-response\") {\n continue;\n }\n const output = toolResponse.output;\n let contentValue;\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n contentValue = output.value;\n break;\n case \"execution-denied\":\n contentValue = (_a = output.reason) != null ? _a : \"Tool execution denied.\";\n break;\n case \"content\":\n case \"json\":\n case \"error-json\":\n contentValue = JSON.stringify(output.value);\n break;\n }\n messages.push({\n role: \"tool\",\n tool_call_id: toolResponse.toolCallId,\n content: contentValue\n });\n }\n break;\n }\n default: {\n const _exhaustiveCheck = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n return { messages, warnings };\n}\n\n// src/chat/get-response-metadata.ts\nfunction getResponseMetadata({\n id,\n model,\n created\n}) {\n return {\n id: id != null ? id : void 0,\n modelId: model != null ? model : void 0,\n timestamp: created ? new Date(created * 1e3) : void 0\n };\n}\n\n// src/chat/map-openai-finish-reason.ts\nfunction mapOpenAIFinishReason(finishReason) {\n switch (finishReason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"content_filter\":\n return \"content-filter\";\n case \"function_call\":\n case \"tool_calls\":\n return \"tool-calls\";\n default:\n return \"other\";\n }\n}\n\n// src/chat/openai-chat-api.ts\n\n\nvar openaiChatResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n created: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n choices: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n role: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"assistant\").nullish(),\n content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n tool_calls: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"function\"),\n function: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n })\n ).nullish(),\n annotations: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url_citation\"),\n url_citation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n })\n ).nullish()\n }),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n )\n })\n ).nullish()\n }).nullish(),\n finish_reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n prompt_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n completion_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n total_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n prompt_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n cached_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish()\n }).nullish(),\n completion_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n accepted_prediction_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n rejected_prediction_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish()\n }).nullish()\n }).nullish()\n })\n )\n);\nvar openaiChatChunkSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n created: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n choices: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n role: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"assistant\"]).nullish(),\n content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n tool_calls: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"function\").nullish(),\n function: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n })\n ).nullish(),\n annotations: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url_citation\"),\n url_citation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n })\n ).nullish()\n }).nullish(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n )\n })\n ).nullish()\n }).nullish(),\n finish_reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n prompt_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n completion_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n total_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n prompt_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n cached_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish()\n }).nullish(),\n completion_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n accepted_prediction_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n rejected_prediction_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish()\n }).nullish()\n }).nullish()\n }),\n openaiErrorDataSchema\n ])\n )\n);\n\n// src/chat/openai-chat-options.ts\n\n\nvar openaiLanguageModelChatOptions = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n /**\n * Modify the likelihood of specified tokens appearing in the completion.\n *\n * Accepts a JSON object that maps tokens (specified by their token ID in\n * the GPT tokenizer) to an associated bias value from -100 to 100.\n */\n logitBias: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_3__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()).optional(),\n /**\n * Return the log probabilities of the tokens.\n *\n * Setting to true will return the log probabilities of the tokens that\n * were generated.\n *\n * Setting to a number will return the log probabilities of the top n\n * tokens that were generated.\n */\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()]).optional(),\n /**\n * Whether to enable parallel function calling during tool use. Default to true.\n */\n parallelToolCalls: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n /**\n * A unique identifier representing your end-user, which can help OpenAI to\n * monitor and detect abuse.\n */\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * Reasoning effort for reasoning models. Defaults to `medium`.\n */\n reasoningEffort: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"]).optional(),\n /**\n * Maximum number of completion tokens to generate. Useful for reasoning models.\n */\n maxCompletionTokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n /**\n * Whether to enable persistence in responses API.\n */\n store: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n /**\n * Metadata to associate with the request.\n */\n metadata: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().max(64), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().max(512)).optional(),\n /**\n * Parameters for prediction mode.\n */\n prediction: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.any()).optional(),\n /**\n * Service tier for the request.\n * - 'auto': Default service tier. The request will be processed with the service tier configured in the\n * Project settings. Unless otherwise configured, the Project will use 'default'.\n * - 'flex': 50% cheaper processing at the cost of increased latency. Only available for o3 and o4-mini models.\n * - 'priority': Higher-speed processing with predictably low latency at premium cost. Available for Enterprise customers.\n * - 'default': The request will be processed with the standard pricing and performance for the selected model.\n *\n * @default 'auto'\n */\n serviceTier: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\", \"flex\", \"priority\", \"default\"]).optional(),\n /**\n * Whether to use strict JSON schema validation.\n *\n * @default true\n */\n strictJsonSchema: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n /**\n * Controls the verbosity of the model's responses.\n * Lower values will result in more concise responses, while higher values will result in more verbose responses.\n */\n textVerbosity: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"low\", \"medium\", \"high\"]).optional(),\n /**\n * A cache key for prompt caching. Allows manual control over prompt caching behavior.\n * Useful for improving cache hit rates and working around automatic caching issues.\n */\n promptCacheKey: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * The retention policy for the prompt cache.\n * - 'in_memory': Default. Standard prompt caching behavior.\n * - '24h': Extended prompt caching that keeps cached prefixes active for up to 24 hours.\n * Currently only available for 5.1 series models.\n *\n * @default 'in_memory'\n */\n promptCacheRetention: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_memory\", \"24h\"]).optional(),\n /**\n * A stable identifier used to help detect users of your application\n * that may be violating OpenAI's usage policies. The IDs should be a\n * string that uniquely identifies each user. We recommend hashing their\n * username or email address, in order to avoid sending us any identifying\n * information.\n */\n safetyIdentifier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * Override the system message mode for this model.\n * - 'system': Use the 'system' role for system messages (default for most models)\n * - 'developer': Use the 'developer' role for system messages (used by reasoning models)\n * - 'remove': Remove system messages entirely\n *\n * If not specified, the mode is automatically determined based on the model.\n */\n systemMessageMode: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"system\", \"developer\", \"remove\"]).optional(),\n /**\n * Force treating this model as a reasoning model.\n *\n * This is useful for \"stealth\" reasoning models (e.g. via a custom baseURL)\n * where the model ID is not recognized by the SDK's allowlist.\n *\n * When enabled, the SDK applies reasoning-model parameter compatibility rules\n * and defaults `systemMessageMode` to `developer` unless overridden.\n */\n forceReasoning: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional()\n })\n )\n);\n\n// src/chat/openai-chat-prepare-tools.ts\n\nfunction prepareChatTools({\n tools,\n toolChoice\n}) {\n tools = (tools == null ? void 0 : tools.length) ? tools : void 0;\n const toolWarnings = [];\n if (tools == null) {\n return { tools: void 0, toolChoice: void 0, toolWarnings };\n }\n const openaiTools2 = [];\n for (const tool of tools) {\n switch (tool.type) {\n case \"function\":\n openaiTools2.push({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n ...tool.strict != null ? { strict: tool.strict } : {}\n }\n });\n break;\n default:\n toolWarnings.push({\n type: \"unsupported\",\n feature: `tool type: ${tool.type}`\n });\n break;\n }\n }\n if (toolChoice == null) {\n return { tools: openaiTools2, toolChoice: void 0, toolWarnings };\n }\n const type = toolChoice.type;\n switch (type) {\n case \"auto\":\n case \"none\":\n case \"required\":\n return { tools: openaiTools2, toolChoice: type, toolWarnings };\n case \"tool\":\n return {\n tools: openaiTools2,\n toolChoice: {\n type: \"function\",\n function: {\n name: toolChoice.toolName\n }\n },\n toolWarnings\n };\n default: {\n const _exhaustiveCheck = type;\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`\n });\n }\n }\n}\n\n// src/chat/openai-chat-language-model.ts\nvar OpenAIChatLanguageModel = class {\n constructor(modelId, config) {\n this.specificationVersion = \"v3\";\n this.supportedUrls = {\n \"image/*\": [/^https?:\\/\\/.*$/]\n };\n this.modelId = modelId;\n this.config = config;\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n tools,\n toolChoice,\n providerOptions\n }) {\n var _a, _b, _c, _d, _e;\n const warnings = [];\n const openaiOptions = (_a = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openaiLanguageModelChatOptions\n })) != null ? _a : {};\n const modelCapabilities = getOpenAILanguageModelCapabilities(this.modelId);\n const isReasoningModel = (_b = openaiOptions.forceReasoning) != null ? _b : modelCapabilities.isReasoningModel;\n if (topK != null) {\n warnings.push({ type: \"unsupported\", feature: \"topK\" });\n }\n const { messages, warnings: messageWarnings } = convertToOpenAIChatMessages(\n {\n prompt,\n systemMessageMode: (_c = openaiOptions.systemMessageMode) != null ? _c : isReasoningModel ? \"developer\" : modelCapabilities.systemMessageMode\n }\n );\n warnings.push(...messageWarnings);\n const strictJsonSchema = (_d = openaiOptions.strictJsonSchema) != null ? _d : true;\n const baseArgs = {\n // model id:\n model: this.modelId,\n // model specific settings:\n logit_bias: openaiOptions.logitBias,\n logprobs: openaiOptions.logprobs === true || typeof openaiOptions.logprobs === \"number\" ? true : void 0,\n top_logprobs: typeof openaiOptions.logprobs === \"number\" ? openaiOptions.logprobs : typeof openaiOptions.logprobs === \"boolean\" ? openaiOptions.logprobs ? 0 : void 0 : void 0,\n user: openaiOptions.user,\n parallel_tool_calls: openaiOptions.parallelToolCalls,\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n response_format: (responseFormat == null ? void 0 : responseFormat.type) === \"json\" ? responseFormat.schema != null ? {\n type: \"json_schema\",\n json_schema: {\n schema: responseFormat.schema,\n strict: strictJsonSchema,\n name: (_e = responseFormat.name) != null ? _e : \"response\",\n description: responseFormat.description\n }\n } : { type: \"json_object\" } : void 0,\n stop: stopSequences,\n seed,\n verbosity: openaiOptions.textVerbosity,\n // openai specific settings:\n // TODO AI SDK 6: remove, we auto-map maxOutputTokens now\n max_completion_tokens: openaiOptions.maxCompletionTokens,\n store: openaiOptions.store,\n metadata: openaiOptions.metadata,\n prediction: openaiOptions.prediction,\n reasoning_effort: openaiOptions.reasoningEffort,\n service_tier: openaiOptions.serviceTier,\n prompt_cache_key: openaiOptions.promptCacheKey,\n prompt_cache_retention: openaiOptions.promptCacheRetention,\n safety_identifier: openaiOptions.safetyIdentifier,\n // messages:\n messages\n };\n if (isReasoningModel) {\n if (openaiOptions.reasoningEffort !== \"none\" || !modelCapabilities.supportsNonReasoningParameters) {\n if (baseArgs.temperature != null) {\n baseArgs.temperature = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"temperature\",\n details: \"temperature is not supported for reasoning models\"\n });\n }\n if (baseArgs.top_p != null) {\n baseArgs.top_p = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"topP\",\n details: \"topP is not supported for reasoning models\"\n });\n }\n if (baseArgs.logprobs != null) {\n baseArgs.logprobs = void 0;\n warnings.push({\n type: \"other\",\n message: \"logprobs is not supported for reasoning models\"\n });\n }\n }\n if (baseArgs.frequency_penalty != null) {\n baseArgs.frequency_penalty = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"frequencyPenalty\",\n details: \"frequencyPenalty is not supported for reasoning models\"\n });\n }\n if (baseArgs.presence_penalty != null) {\n baseArgs.presence_penalty = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"presencePenalty\",\n details: \"presencePenalty is not supported for reasoning models\"\n });\n }\n if (baseArgs.logit_bias != null) {\n baseArgs.logit_bias = void 0;\n warnings.push({\n type: \"other\",\n message: \"logitBias is not supported for reasoning models\"\n });\n }\n if (baseArgs.top_logprobs != null) {\n baseArgs.top_logprobs = void 0;\n warnings.push({\n type: \"other\",\n message: \"topLogprobs is not supported for reasoning models\"\n });\n }\n if (baseArgs.max_tokens != null) {\n if (baseArgs.max_completion_tokens == null) {\n baseArgs.max_completion_tokens = baseArgs.max_tokens;\n }\n baseArgs.max_tokens = void 0;\n }\n } else if (this.modelId.startsWith(\"gpt-4o-search-preview\") || this.modelId.startsWith(\"gpt-4o-mini-search-preview\")) {\n if (baseArgs.temperature != null) {\n baseArgs.temperature = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"temperature\",\n details: \"temperature is not supported for the search preview models and has been removed.\"\n });\n }\n }\n if (openaiOptions.serviceTier === \"flex\" && !modelCapabilities.supportsFlexProcessing) {\n warnings.push({\n type: \"unsupported\",\n feature: \"serviceTier\",\n details: \"flex processing is only available for o3, o4-mini, and gpt-5 models\"\n });\n baseArgs.service_tier = void 0;\n }\n if (openaiOptions.serviceTier === \"priority\" && !modelCapabilities.supportsPriorityProcessing) {\n warnings.push({\n type: \"unsupported\",\n feature: \"serviceTier\",\n details: \"priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported\"\n });\n baseArgs.service_tier = void 0;\n }\n const {\n tools: openaiTools2,\n toolChoice: openaiToolChoice,\n toolWarnings\n } = prepareChatTools({\n tools,\n toolChoice\n });\n return {\n args: {\n ...baseArgs,\n tools: openaiTools2,\n tool_choice: openaiToolChoice\n },\n warnings: [...warnings, ...toolWarnings]\n };\n }\n async doGenerate(options) {\n var _a, _b, _c, _d, _e, _f, _g;\n const { args: body, warnings } = await this.getArgs(options);\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/chat/completions\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiChatResponseSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n const choice = response.choices[0];\n const content = [];\n const text = choice.message.content;\n if (text != null && text.length > 0) {\n content.push({ type: \"text\", text });\n }\n for (const toolCall of (_a = choice.message.tool_calls) != null ? _a : []) {\n content.push({\n type: \"tool-call\",\n toolCallId: (_b = toolCall.id) != null ? _b : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments\n });\n }\n for (const annotation of (_c = choice.message.annotations) != null ? _c : []) {\n content.push({\n type: \"source\",\n sourceType: \"url\",\n id: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n url: annotation.url_citation.url,\n title: annotation.url_citation.title\n });\n }\n const completionTokenDetails = (_d = response.usage) == null ? void 0 : _d.completion_tokens_details;\n const promptTokenDetails = (_e = response.usage) == null ? void 0 : _e.prompt_tokens_details;\n const providerMetadata = { openai: {} };\n if ((completionTokenDetails == null ? void 0 : completionTokenDetails.accepted_prediction_tokens) != null) {\n providerMetadata.openai.acceptedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.accepted_prediction_tokens;\n }\n if ((completionTokenDetails == null ? void 0 : completionTokenDetails.rejected_prediction_tokens) != null) {\n providerMetadata.openai.rejectedPredictionTokens = completionTokenDetails == null ? void 0 : completionTokenDetails.rejected_prediction_tokens;\n }\n if (((_f = choice.logprobs) == null ? void 0 : _f.content) != null) {\n providerMetadata.openai.logprobs = choice.logprobs.content;\n }\n return {\n content,\n finishReason: {\n unified: mapOpenAIFinishReason(choice.finish_reason),\n raw: (_g = choice.finish_reason) != null ? _g : void 0\n },\n usage: convertOpenAIChatUsage(response.usage),\n request: { body },\n response: {\n ...getResponseMetadata(response),\n headers: responseHeaders,\n body: rawResponse\n },\n warnings,\n providerMetadata\n };\n }\n async doStream(options) {\n const { args, warnings } = await this.getArgs(options);\n const body = {\n ...args,\n stream: true,\n stream_options: {\n include_usage: true\n }\n };\n const { responseHeaders, value: response } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/chat/completions\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createEventSourceResponseHandler)(\n openaiChatChunkSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n const toolCalls = [];\n let finishReason = {\n unified: \"other\",\n raw: void 0\n };\n let usage = void 0;\n let metadataExtracted = false;\n let isActiveText = false;\n const providerMetadata = { openai: {} };\n return {\n stream: response.pipeThrough(\n new TransformStream({\n start(controller) {\n controller.enqueue({ type: \"stream-start\", warnings });\n },\n transform(chunk, controller) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;\n if (options.includeRawChunks) {\n controller.enqueue({ type: \"raw\", rawValue: chunk.rawValue });\n }\n if (!chunk.success) {\n finishReason = { unified: \"error\", raw: void 0 };\n controller.enqueue({ type: \"error\", error: chunk.error });\n return;\n }\n const value = chunk.value;\n if (\"error\" in value) {\n finishReason = { unified: \"error\", raw: void 0 };\n controller.enqueue({ type: \"error\", error: value.error });\n return;\n }\n if (!metadataExtracted) {\n const metadata = getResponseMetadata(value);\n if (Object.values(metadata).some(Boolean)) {\n metadataExtracted = true;\n controller.enqueue({\n type: \"response-metadata\",\n ...getResponseMetadata(value)\n });\n }\n }\n if (value.usage != null) {\n usage = value.usage;\n if (((_a = value.usage.completion_tokens_details) == null ? void 0 : _a.accepted_prediction_tokens) != null) {\n providerMetadata.openai.acceptedPredictionTokens = (_b = value.usage.completion_tokens_details) == null ? void 0 : _b.accepted_prediction_tokens;\n }\n if (((_c = value.usage.completion_tokens_details) == null ? void 0 : _c.rejected_prediction_tokens) != null) {\n providerMetadata.openai.rejectedPredictionTokens = (_d = value.usage.completion_tokens_details) == null ? void 0 : _d.rejected_prediction_tokens;\n }\n }\n const choice = value.choices[0];\n if ((choice == null ? void 0 : choice.finish_reason) != null) {\n finishReason = {\n unified: mapOpenAIFinishReason(choice.finish_reason),\n raw: choice.finish_reason\n };\n }\n if (((_e = choice == null ? void 0 : choice.logprobs) == null ? void 0 : _e.content) != null) {\n providerMetadata.openai.logprobs = choice.logprobs.content;\n }\n if ((choice == null ? void 0 : choice.delta) == null) {\n return;\n }\n const delta = choice.delta;\n if (delta.content != null) {\n if (!isActiveText) {\n controller.enqueue({ type: \"text-start\", id: \"0\" });\n isActiveText = true;\n }\n controller.enqueue({\n type: \"text-delta\",\n id: \"0\",\n delta: delta.content\n });\n }\n if (delta.tool_calls != null) {\n for (const toolCallDelta of delta.tool_calls) {\n const index = toolCallDelta.index;\n if (toolCalls[index] == null) {\n if (toolCallDelta.type != null && toolCallDelta.type !== \"function\") {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function' type.`\n });\n }\n if (toolCallDelta.id == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'id' to be a string.`\n });\n }\n if (((_f = toolCallDelta.function) == null ? void 0 : _f.name) == null) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.InvalidResponseDataError({\n data: toolCallDelta,\n message: `Expected 'function.name' to be a string.`\n });\n }\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallDelta.id,\n toolName: toolCallDelta.function.name\n });\n toolCalls[index] = {\n id: toolCallDelta.id,\n type: \"function\",\n function: {\n name: toolCallDelta.function.name,\n arguments: (_g = toolCallDelta.function.arguments) != null ? _g : \"\"\n },\n hasFinished: false\n };\n const toolCall2 = toolCalls[index];\n if (((_h = toolCall2.function) == null ? void 0 : _h.name) != null && ((_i = toolCall2.function) == null ? void 0 : _i.arguments) != null) {\n if (toolCall2.function.arguments.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall2.id,\n delta: toolCall2.function.arguments\n });\n }\n if ((0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.isParsableJson)(toolCall2.function.arguments)) {\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCall2.id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: (_j = toolCall2.id) != null ? _j : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n toolName: toolCall2.function.name,\n input: toolCall2.function.arguments\n });\n toolCall2.hasFinished = true;\n }\n }\n continue;\n }\n const toolCall = toolCalls[index];\n if (toolCall.hasFinished) {\n continue;\n }\n if (((_k = toolCallDelta.function) == null ? void 0 : _k.arguments) != null) {\n toolCall.function.arguments += (_m = (_l = toolCallDelta.function) == null ? void 0 : _l.arguments) != null ? _m : \"\";\n }\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.id,\n delta: (_n = toolCallDelta.function.arguments) != null ? _n : \"\"\n });\n if (((_o = toolCall.function) == null ? void 0 : _o.name) != null && ((_p = toolCall.function) == null ? void 0 : _p.arguments) != null && (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.isParsableJson)(toolCall.function.arguments)) {\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCall.id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: (_q = toolCall.id) != null ? _q : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments\n });\n toolCall.hasFinished = true;\n }\n }\n }\n if (delta.annotations != null) {\n for (const annotation of delta.annotations) {\n controller.enqueue({\n type: \"source\",\n sourceType: \"url\",\n id: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n url: annotation.url_citation.url,\n title: annotation.url_citation.title\n });\n }\n }\n },\n flush(controller) {\n if (isActiveText) {\n controller.enqueue({ type: \"text-end\", id: \"0\" });\n }\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage: convertOpenAIChatUsage(usage),\n ...providerMetadata != null ? { providerMetadata } : {}\n });\n }\n })\n ),\n request: { body },\n response: { headers: responseHeaders }\n };\n }\n};\n\n// src/completion/openai-completion-language-model.ts\n\n\n// src/completion/convert-openai-completion-usage.ts\nfunction convertOpenAICompletionUsage(usage) {\n var _a, _b, _c, _d;\n if (usage == null) {\n return {\n inputTokens: {\n total: void 0,\n noCache: void 0,\n cacheRead: void 0,\n cacheWrite: void 0\n },\n outputTokens: {\n total: void 0,\n text: void 0,\n reasoning: void 0\n },\n raw: void 0\n };\n }\n const promptTokens = (_a = usage.prompt_tokens) != null ? _a : 0;\n const completionTokens = (_b = usage.completion_tokens) != null ? _b : 0;\n return {\n inputTokens: {\n total: (_c = usage.prompt_tokens) != null ? _c : void 0,\n noCache: promptTokens,\n cacheRead: void 0,\n cacheWrite: void 0\n },\n outputTokens: {\n total: (_d = usage.completion_tokens) != null ? _d : void 0,\n text: completionTokens,\n reasoning: void 0\n },\n raw: usage\n };\n}\n\n// src/completion/convert-to-openai-completion-prompt.ts\n\nfunction convertToOpenAICompletionPrompt({\n prompt,\n user = \"user\",\n assistant = \"assistant\"\n}) {\n let text = \"\";\n if (prompt[0].role === \"system\") {\n text += `${prompt[0].content}\n\n`;\n prompt = prompt.slice(1);\n }\n for (const { role, content } of prompt) {\n switch (role) {\n case \"system\": {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.InvalidPromptError({\n message: \"Unexpected system message in prompt: ${content}\",\n prompt\n });\n }\n case \"user\": {\n const userMessage = content.map((part) => {\n switch (part.type) {\n case \"text\": {\n return part.text;\n }\n }\n }).filter(Boolean).join(\"\");\n text += `${user}:\n${userMessage}\n\n`;\n break;\n }\n case \"assistant\": {\n const assistantMessage = content.map((part) => {\n switch (part.type) {\n case \"text\": {\n return part.text;\n }\n case \"tool-call\": {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: \"tool-call messages\"\n });\n }\n }\n }).join(\"\");\n text += `${assistant}:\n${assistantMessage}\n\n`;\n break;\n }\n case \"tool\": {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: \"tool messages\"\n });\n }\n default: {\n const _exhaustiveCheck = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n text += `${assistant}:\n`;\n return {\n prompt: text,\n stopSequences: [`\n${user}:`]\n };\n}\n\n// src/completion/get-response-metadata.ts\nfunction getResponseMetadata2({\n id,\n model,\n created\n}) {\n return {\n id: id != null ? id : void 0,\n modelId: model != null ? model : void 0,\n timestamp: created != null ? new Date(created * 1e3) : void 0\n };\n}\n\n// src/completion/map-openai-finish-reason.ts\nfunction mapOpenAIFinishReason2(finishReason) {\n switch (finishReason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"content_filter\":\n return \"content-filter\";\n case \"function_call\":\n case \"tool_calls\":\n return \"tool-calls\";\n default:\n return \"other\";\n }\n}\n\n// src/completion/openai-completion-api.ts\n\n\nvar openaiCompletionResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n created: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n choices: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n finish_reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n token_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number())).nullish()\n }).nullish()\n })\n ),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n prompt_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n completion_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n total_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }).nullish()\n })\n )\n);\nvar openaiCompletionChunkSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n created: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n choices: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n finish_reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n token_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number())).nullish()\n }).nullish()\n })\n ),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n prompt_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n completion_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n total_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }).nullish()\n }),\n openaiErrorDataSchema\n ])\n )\n);\n\n// src/completion/openai-completion-options.ts\n\n\nvar openaiLanguageModelCompletionOptions = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n /**\n * Echo back the prompt in addition to the completion.\n */\n echo: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n /**\n * Modify the likelihood of specified tokens appearing in the completion.\n *\n * Accepts a JSON object that maps tokens (specified by their token ID in\n * the GPT tokenizer) to an associated bias value from -100 to 100. You\n * can use this tokenizer tool to convert text to token IDs. Mathematically,\n * the bias is added to the logits generated by the model prior to sampling.\n * The exact effect will vary per model, but values between -1 and 1 should\n * decrease or increase likelihood of selection; values like -100 or 100\n * should result in a ban or exclusive selection of the relevant token.\n *\n * As an example, you can pass {\"50256\": -100} to prevent the <|endoftext|>\n * token from being generated.\n */\n logitBias: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()).optional(),\n /**\n * The suffix that comes after a completion of inserted text.\n */\n suffix: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * A unique identifier representing your end-user, which can help OpenAI to\n * monitor and detect abuse. Learn more.\n */\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * Return the log probabilities of the tokens. Including logprobs will increase\n * the response size and can slow down response times. However, it can\n * be useful to better understand how the model is behaving.\n * Setting to true will return the log probabilities of the tokens that\n * were generated.\n * Setting to a number will return the log probabilities of the top n\n * tokens that were generated.\n */\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()]).optional()\n })\n )\n);\n\n// src/completion/openai-completion-language-model.ts\nvar OpenAICompletionLanguageModel = class {\n constructor(modelId, config) {\n this.specificationVersion = \"v3\";\n this.supportedUrls = {\n // No URLs are supported for completion models.\n };\n this.modelId = modelId;\n this.config = config;\n }\n get providerOptionsName() {\n return this.config.provider.split(\".\")[0].trim();\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences: userStopSequences,\n responseFormat,\n tools,\n toolChoice,\n seed,\n providerOptions\n }) {\n const warnings = [];\n const openaiOptions = {\n ...await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openaiLanguageModelCompletionOptions\n }),\n ...await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: this.providerOptionsName,\n providerOptions,\n schema: openaiLanguageModelCompletionOptions\n })\n };\n if (topK != null) {\n warnings.push({ type: \"unsupported\", feature: \"topK\" });\n }\n if (tools == null ? void 0 : tools.length) {\n warnings.push({ type: \"unsupported\", feature: \"tools\" });\n }\n if (toolChoice != null) {\n warnings.push({ type: \"unsupported\", feature: \"toolChoice\" });\n }\n if (responseFormat != null && responseFormat.type !== \"text\") {\n warnings.push({\n type: \"unsupported\",\n feature: \"responseFormat\",\n details: \"JSON response format is not supported.\"\n });\n }\n const { prompt: completionPrompt, stopSequences } = convertToOpenAICompletionPrompt({ prompt });\n const stop = [...stopSequences != null ? stopSequences : [], ...userStopSequences != null ? userStopSequences : []];\n return {\n args: {\n // model id:\n model: this.modelId,\n // model specific settings:\n echo: openaiOptions.echo,\n logit_bias: openaiOptions.logitBias,\n logprobs: (openaiOptions == null ? void 0 : openaiOptions.logprobs) === true ? 0 : (openaiOptions == null ? void 0 : openaiOptions.logprobs) === false ? void 0 : openaiOptions == null ? void 0 : openaiOptions.logprobs,\n suffix: openaiOptions.suffix,\n user: openaiOptions.user,\n // standardized settings:\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n seed,\n // prompt:\n prompt: completionPrompt,\n // stop sequences:\n stop: stop.length > 0 ? stop : void 0\n },\n warnings\n };\n }\n async doGenerate(options) {\n var _a;\n const { args, warnings } = await this.getArgs(options);\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/completions\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body: args,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiCompletionResponseSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n const choice = response.choices[0];\n const providerMetadata = { openai: {} };\n if (choice.logprobs != null) {\n providerMetadata.openai.logprobs = choice.logprobs;\n }\n return {\n content: [{ type: \"text\", text: choice.text }],\n usage: convertOpenAICompletionUsage(response.usage),\n finishReason: {\n unified: mapOpenAIFinishReason2(choice.finish_reason),\n raw: (_a = choice.finish_reason) != null ? _a : void 0\n },\n request: { body: args },\n response: {\n ...getResponseMetadata2(response),\n headers: responseHeaders,\n body: rawResponse\n },\n providerMetadata,\n warnings\n };\n }\n async doStream(options) {\n const { args, warnings } = await this.getArgs(options);\n const body = {\n ...args,\n stream: true,\n stream_options: {\n include_usage: true\n }\n };\n const { responseHeaders, value: response } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/completions\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createEventSourceResponseHandler)(\n openaiCompletionChunkSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n let finishReason = {\n unified: \"other\",\n raw: void 0\n };\n const providerMetadata = { openai: {} };\n let usage = void 0;\n let isFirstChunk = true;\n return {\n stream: response.pipeThrough(\n new TransformStream({\n start(controller) {\n controller.enqueue({ type: \"stream-start\", warnings });\n },\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: \"raw\", rawValue: chunk.rawValue });\n }\n if (!chunk.success) {\n finishReason = { unified: \"error\", raw: void 0 };\n controller.enqueue({ type: \"error\", error: chunk.error });\n return;\n }\n const value = chunk.value;\n if (\"error\" in value) {\n finishReason = { unified: \"error\", raw: void 0 };\n controller.enqueue({ type: \"error\", error: value.error });\n return;\n }\n if (isFirstChunk) {\n isFirstChunk = false;\n controller.enqueue({\n type: \"response-metadata\",\n ...getResponseMetadata2(value)\n });\n controller.enqueue({ type: \"text-start\", id: \"0\" });\n }\n if (value.usage != null) {\n usage = value.usage;\n }\n const choice = value.choices[0];\n if ((choice == null ? void 0 : choice.finish_reason) != null) {\n finishReason = {\n unified: mapOpenAIFinishReason2(choice.finish_reason),\n raw: choice.finish_reason\n };\n }\n if ((choice == null ? void 0 : choice.logprobs) != null) {\n providerMetadata.openai.logprobs = choice.logprobs;\n }\n if ((choice == null ? void 0 : choice.text) != null && choice.text.length > 0) {\n controller.enqueue({\n type: \"text-delta\",\n id: \"0\",\n delta: choice.text\n });\n }\n },\n flush(controller) {\n if (!isFirstChunk) {\n controller.enqueue({ type: \"text-end\", id: \"0\" });\n }\n controller.enqueue({\n type: \"finish\",\n finishReason,\n providerMetadata,\n usage: convertOpenAICompletionUsage(usage)\n });\n }\n })\n ),\n request: { body },\n response: { headers: responseHeaders }\n };\n }\n};\n\n// src/embedding/openai-embedding-model.ts\n\n\n\n// src/embedding/openai-embedding-options.ts\n\n\nvar openaiEmbeddingModelOptions = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n /**\n * The number of dimensions the resulting output embeddings should have.\n * Only supported in text-embedding-3 and later models.\n */\n dimensions: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n /**\n * A unique identifier representing your end-user, which can help OpenAI to\n * monitor and detect abuse. Learn more.\n */\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n })\n )\n);\n\n// src/embedding/openai-embedding-api.ts\n\n\nvar openaiTextEmbeddingResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n data: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ embedding: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()) })),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ prompt_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number() }).nullish()\n })\n )\n);\n\n// src/embedding/openai-embedding-model.ts\nvar OpenAIEmbeddingModel = class {\n constructor(modelId, config) {\n this.specificationVersion = \"v3\";\n this.maxEmbeddingsPerCall = 2048;\n this.supportsParallelCalls = true;\n this.modelId = modelId;\n this.config = config;\n }\n get provider() {\n return this.config.provider;\n }\n async doEmbed({\n values,\n headers,\n abortSignal,\n providerOptions\n }) {\n var _a;\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values\n });\n }\n const openaiOptions = (_a = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openaiEmbeddingModelOptions\n })) != null ? _a : {};\n const {\n responseHeaders,\n value: response,\n rawValue\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/embeddings\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), headers),\n body: {\n model: this.modelId,\n input: values,\n encoding_format: \"float\",\n dimensions: openaiOptions.dimensions,\n user: openaiOptions.user\n },\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiTextEmbeddingResponseSchema\n ),\n abortSignal,\n fetch: this.config.fetch\n });\n return {\n warnings: [],\n embeddings: response.data.map((item) => item.embedding),\n usage: response.usage ? { tokens: response.usage.prompt_tokens } : void 0,\n response: { headers: responseHeaders, body: rawValue }\n };\n }\n};\n\n// src/image/openai-image-model.ts\n\n\n// src/image/openai-image-api.ts\n\n\nvar openaiImageResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n created: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n b64_json: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n revised_prompt: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ),\n background: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n output_format: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n size: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n quality: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n output_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n total_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n input_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n image_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n text_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish()\n }).nullish()\n }).nullish()\n })\n )\n);\n\n// src/image/openai-image-options.ts\nvar modelMaxImagesPerCall = {\n \"dall-e-3\": 1,\n \"dall-e-2\": 10,\n \"gpt-image-1\": 10,\n \"gpt-image-1-mini\": 10,\n \"gpt-image-1.5\": 10,\n \"chatgpt-image-latest\": 10\n};\nvar defaultResponseFormatPrefixes = [\n \"chatgpt-image-\",\n \"gpt-image-1-mini\",\n \"gpt-image-1.5\",\n \"gpt-image-1\"\n];\nfunction hasDefaultResponseFormat(modelId) {\n return defaultResponseFormatPrefixes.some(\n (prefix) => modelId.startsWith(prefix)\n );\n}\n\n// src/image/openai-image-model.ts\nvar OpenAIImageModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n }\n get maxImagesPerCall() {\n var _a;\n return (_a = modelMaxImagesPerCall[this.modelId]) != null ? _a : 1;\n }\n get provider() {\n return this.config.provider;\n }\n async doGenerate({\n prompt,\n files,\n mask,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal\n }) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;\n const warnings = [];\n if (aspectRatio != null) {\n warnings.push({\n type: \"unsupported\",\n feature: \"aspectRatio\",\n details: \"This model does not support aspect ratio. Use `size` instead.\"\n });\n }\n if (seed != null) {\n warnings.push({ type: \"unsupported\", feature: \"seed\" });\n }\n const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();\n if (files != null) {\n const { value: response2, responseHeaders: responseHeaders2 } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postFormDataToApi)({\n url: this.config.url({\n path: \"/images/edits\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), headers),\n formData: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToFormData)({\n model: this.modelId,\n prompt,\n image: await Promise.all(\n files.map(\n (file) => file.type === \"file\" ? new Blob(\n [\n file.data instanceof Uint8Array ? new Blob([file.data], {\n type: file.mediaType\n }) : new Blob([(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertBase64ToUint8Array)(file.data)], {\n type: file.mediaType\n })\n ],\n { type: file.mediaType }\n ) : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.downloadBlob)(file.url)\n )\n ),\n mask: mask != null ? await fileToBlob(mask) : void 0,\n n,\n size,\n ...(_d = providerOptions.openai) != null ? _d : {}\n }),\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiImageResponseSchema\n ),\n abortSignal,\n fetch: this.config.fetch\n });\n return {\n images: response2.data.map((item) => item.b64_json),\n warnings,\n usage: response2.usage != null ? {\n inputTokens: (_e = response2.usage.input_tokens) != null ? _e : void 0,\n outputTokens: (_f = response2.usage.output_tokens) != null ? _f : void 0,\n totalTokens: (_g = response2.usage.total_tokens) != null ? _g : void 0\n } : void 0,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders2\n },\n providerMetadata: {\n openai: {\n images: response2.data.map((item, index) => {\n var _a2, _b2, _c2, _d2, _e2, _f2;\n return {\n ...item.revised_prompt ? { revisedPrompt: item.revised_prompt } : {},\n created: (_a2 = response2.created) != null ? _a2 : void 0,\n size: (_b2 = response2.size) != null ? _b2 : void 0,\n quality: (_c2 = response2.quality) != null ? _c2 : void 0,\n background: (_d2 = response2.background) != null ? _d2 : void 0,\n outputFormat: (_e2 = response2.output_format) != null ? _e2 : void 0,\n ...distributeTokenDetails(\n (_f2 = response2.usage) == null ? void 0 : _f2.input_tokens_details,\n index,\n response2.data.length\n )\n };\n })\n }\n }\n };\n }\n const { value: response, responseHeaders } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/images/generations\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), headers),\n body: {\n model: this.modelId,\n prompt,\n n,\n size,\n ...(_h = providerOptions.openai) != null ? _h : {},\n ...!hasDefaultResponseFormat(this.modelId) ? { response_format: \"b64_json\" } : {}\n },\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiImageResponseSchema\n ),\n abortSignal,\n fetch: this.config.fetch\n });\n return {\n images: response.data.map((item) => item.b64_json),\n warnings,\n usage: response.usage != null ? {\n inputTokens: (_i = response.usage.input_tokens) != null ? _i : void 0,\n outputTokens: (_j = response.usage.output_tokens) != null ? _j : void 0,\n totalTokens: (_k = response.usage.total_tokens) != null ? _k : void 0\n } : void 0,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders\n },\n providerMetadata: {\n openai: {\n images: response.data.map((item, index) => {\n var _a2, _b2, _c2, _d2, _e2, _f2;\n return {\n ...item.revised_prompt ? { revisedPrompt: item.revised_prompt } : {},\n created: (_a2 = response.created) != null ? _a2 : void 0,\n size: (_b2 = response.size) != null ? _b2 : void 0,\n quality: (_c2 = response.quality) != null ? _c2 : void 0,\n background: (_d2 = response.background) != null ? _d2 : void 0,\n outputFormat: (_e2 = response.output_format) != null ? _e2 : void 0,\n ...distributeTokenDetails(\n (_f2 = response.usage) == null ? void 0 : _f2.input_tokens_details,\n index,\n response.data.length\n )\n };\n })\n }\n }\n };\n }\n};\nfunction distributeTokenDetails(details, index, total) {\n if (details == null) {\n return {};\n }\n const result = {};\n if (details.image_tokens != null) {\n const base = Math.floor(details.image_tokens / total);\n const remainder = details.image_tokens - base * (total - 1);\n result.imageTokens = index === total - 1 ? remainder : base;\n }\n if (details.text_tokens != null) {\n const base = Math.floor(details.text_tokens / total);\n const remainder = details.text_tokens - base * (total - 1);\n result.textTokens = index === total - 1 ? remainder : base;\n }\n return result;\n}\nasync function fileToBlob(file) {\n if (!file) return void 0;\n if (file.type === \"url\") {\n return (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.downloadBlob)(file.url);\n }\n const data = file.data instanceof Uint8Array ? file.data : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertBase64ToUint8Array)(file.data);\n return new Blob([data], { type: file.mediaType });\n}\n\n// src/tool/apply-patch.ts\n\n\nvar applyPatchInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n callId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n operation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"create_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"delete_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"update_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ])\n })\n )\n);\nvar applyPatchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"completed\", \"failed\"]),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n })\n )\n);\nvar applyPatchArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(() => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({})));\nvar applyPatchToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.apply_patch\",\n inputSchema: applyPatchInputSchema,\n outputSchema: applyPatchOutputSchema\n});\nvar applyPatch = applyPatchToolFactory;\n\n// src/tool/code-interpreter.ts\n\n\nvar codeInterpreterInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n containerId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n )\n);\nvar codeInterpreterOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n outputs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"logs\"), logs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).nullish()\n })\n )\n);\nvar codeInterpreterArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n container: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n fileIds: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n })\n ]).optional()\n })\n )\n);\nvar codeInterpreterToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.code_interpreter\",\n inputSchema: codeInterpreterInputSchema,\n outputSchema: codeInterpreterOutputSchema\n});\nvar codeInterpreter = (args = {}) => {\n return codeInterpreterToolFactory(args);\n};\n\n// src/tool/custom.ts\n\n\nvar customArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n format: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"grammar\"),\n syntax: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"regex\", \"lark\"]),\n definition: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"text\")\n })\n ]).optional()\n })\n )\n);\nvar customInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(() => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()));\nvar customToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactory)({\n id: \"openai.custom\",\n inputSchema: customInputSchema\n});\nvar customTool = (args) => customToolFactory(args);\n\n// src/tool/file-search.ts\n\n\nvar comparisonFilterSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n key: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"eq\", \"ne\", \"gt\", \"gte\", \"lt\", \"lte\", \"in\", \"nin\"]),\n value: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string())])\n});\nvar compoundFilterSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"and\", \"or\"]),\n filters: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([comparisonFilterSchema, zod_v4__WEBPACK_IMPORTED_MODULE_0__.lazy(() => compoundFilterSchema)])\n )\n});\nvar fileSearchArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n vectorStoreIds: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n maxNumResults: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n ranking: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n ranker: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n scoreThreshold: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional()\n }).optional(),\n filters: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([comparisonFilterSchema, compoundFilterSchema]).optional()\n })\n )\n);\nvar fileSearchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n queries: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n results: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n attributes: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()),\n fileId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n score: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ).nullable()\n })\n )\n);\nvar fileSearch = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.file_search\",\n inputSchema: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({}),\n outputSchema: fileSearchOutputSchema\n});\n\n// src/tool/image-generation.ts\n\n\nvar imageGenerationArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n background: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\", \"opaque\", \"transparent\"]).optional(),\n inputFidelity: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"low\", \"high\"]).optional(),\n inputImageMask: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n fileId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n imageUrl: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).optional(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n moderation: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\"]).optional(),\n outputCompression: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().int().min(0).max(100).optional(),\n outputFormat: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"png\", \"jpeg\", \"webp\"]).optional(),\n partialImages: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().int().min(0).max(3).optional(),\n quality: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\", \"low\", \"medium\", \"high\"]).optional(),\n size: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"1024x1024\", \"1024x1536\", \"1536x1024\", \"auto\"]).optional()\n }).strict()\n )\n);\nvar imageGenerationInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(() => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({})));\nvar imageGenerationOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ result: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }))\n);\nvar imageGenerationToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.image_generation\",\n inputSchema: imageGenerationInputSchema,\n outputSchema: imageGenerationOutputSchema\n});\nvar imageGeneration = (args = {}) => {\n return imageGenerationToolFactory(args);\n};\n\n// src/tool/local-shell.ts\n\n\nvar localShellInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exec\"),\n command: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n timeoutMs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n workingDirectory: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n env: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n })\n })\n )\n);\nvar localShellOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }))\n);\nvar localShell = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.local_shell\",\n inputSchema: localShellInputSchema,\n outputSchema: localShellOutputSchema\n});\n\n// src/tool/shell.ts\n\n\nvar shellInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n commands: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n timeoutMs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n maxOutputLength: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional()\n })\n })\n )\n);\nvar shellOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n stdout: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n stderr: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outcome: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"timeout\") }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exit\"), exitCode: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number() })\n ])\n })\n )\n })\n )\n);\nvar shellSkillsSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"skillReference\"),\n skillId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n version: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"inline\"),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n source: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"base64\"),\n mediaType: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"application/zip\"),\n data: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n })\n ])\n).optional();\nvar shellArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n environment: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"containerAuto\"),\n fileIds: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional(),\n memoryLimit: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"1g\", \"4g\", \"16g\", \"64g\"]).optional(),\n networkPolicy: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"disabled\") }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"allowlist\"),\n allowedDomains: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n domainSecrets: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n domain: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n value: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ).optional()\n })\n ]).optional(),\n skills: shellSkillsSchema\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"containerReference\"),\n containerId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"local\").optional(),\n skills: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ).optional()\n })\n ]).optional()\n })\n )\n);\nvar shell = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.shell\",\n inputSchema: shellInputSchema,\n outputSchema: shellOutputSchema\n});\n\n// src/tool/tool-search.ts\n\n\nvar toolSearchArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]).optional(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n parameters: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()).optional()\n })\n )\n);\nvar toolSearchInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown().optional(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n )\n);\nvar toolSearchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()))\n })\n )\n);\nvar toolSearchToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.tool_search\",\n inputSchema: toolSearchInputSchema,\n outputSchema: toolSearchOutputSchema\n});\nvar toolSearch = (args = {}) => toolSearchToolFactory(args);\n\n// src/tool/web-search.ts\n\n\nvar webSearchArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n externalWebAccess: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n filters: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ allowedDomains: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional() }).optional(),\n searchContextSize: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"low\", \"medium\", \"high\"]).optional(),\n userLocation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"approximate\"),\n country: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n city: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n region: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n timezone: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).optional()\n })\n )\n);\nvar webSearchInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(() => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({})));\nvar webSearchOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"search\"),\n query: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"openPage\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"findInPage\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n pattern: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ]).optional(),\n sources: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"api\"), name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).optional()\n })\n )\n);\nvar webSearchToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.web_search\",\n inputSchema: webSearchInputSchema,\n outputSchema: webSearchOutputSchema\n});\nvar webSearch = (args = {}) => webSearchToolFactory(args);\n\n// src/tool/web-search-preview.ts\n\n\nvar webSearchPreviewArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n searchContextSize: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"low\", \"medium\", \"high\"]).optional(),\n userLocation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"approximate\"),\n country: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n city: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n region: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n timezone: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).optional()\n })\n )\n);\nvar webSearchPreviewInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({}))\n);\nvar webSearchPreviewOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"search\"),\n query: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"openPage\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"findInPage\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n pattern: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ]).optional()\n })\n )\n);\nvar webSearchPreview = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.web_search_preview\",\n inputSchema: webSearchPreviewInputSchema,\n outputSchema: webSearchPreviewOutputSchema\n});\n\n// src/tool/mcp.ts\n\n\nvar jsonValueSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.lazy(\n () => zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"null\"](),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(jsonValueSchema),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema)\n ])\n);\nvar mcpArgsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n serverLabel: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n allowedTools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n readOnly: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional(),\n toolNames: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n })\n ]).optional(),\n authorization: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n connectorId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n headers: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional(),\n requireApproval: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"always\", \"never\"]),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n never: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n toolNames: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n }).optional()\n })\n ]).optional(),\n serverDescription: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n serverUrl: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).refine(\n (v) => v.serverUrl != null || v.connectorId != null,\n \"One of serverUrl or connectorId must be provided.\"\n )\n )\n);\nvar mcpInputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(() => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({})));\nvar mcpOutputSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"call\"),\n serverLabel: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema]).optional()\n })\n )\n);\nvar mcpToolFactory = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createProviderToolFactoryWithOutputSchema)({\n id: \"openai.mcp\",\n inputSchema: mcpInputSchema,\n outputSchema: mcpOutputSchema\n});\nvar mcp = (args) => mcpToolFactory(args);\n\n// src/openai-tools.ts\nvar openaiTools = {\n /**\n * The apply_patch tool lets GPT-5.1 create, update, and delete files in your\n * codebase using structured diffs. Instead of just suggesting edits, the model\n * emits patch operations that your application applies and then reports back on,\n * enabling iterative, multi-step code editing workflows.\n *\n */\n applyPatch,\n /**\n * Custom tools let callers constrain model output to a grammar (regex or\n * Lark syntax). The model returns a `custom_tool_call` output item whose\n * `input` field is a string matching the specified grammar.\n *\n * @param name - The name of the custom tool.\n * @param description - An optional description of the tool.\n * @param format - The output format constraint (grammar type, syntax, and definition).\n */\n customTool,\n /**\n * The Code Interpreter tool allows models to write and run Python code in a\n * sandboxed environment to solve complex problems in domains like data analysis,\n * coding, and math.\n *\n * @param container - The container to use for the code interpreter.\n */\n codeInterpreter,\n /**\n * File search is a tool available in the Responses API. It enables models to\n * retrieve information in a knowledge base of previously uploaded files through\n * semantic and keyword search.\n *\n * @param vectorStoreIds - The vector store IDs to use for the file search.\n * @param maxNumResults - The maximum number of results to return.\n * @param ranking - The ranking options to use for the file search.\n * @param filters - The filters to use for the file search.\n */\n fileSearch,\n /**\n * The image generation tool allows you to generate images using a text prompt,\n * and optionally image inputs. It leverages the GPT Image model,\n * and automatically optimizes text inputs for improved performance.\n *\n * @param background - Background type for the generated image. One of 'auto', 'opaque', or 'transparent'.\n * @param inputFidelity - Input fidelity for the generated image. One of 'low' or 'high'.\n * @param inputImageMask - Optional mask for inpainting. Contains fileId and/or imageUrl.\n * @param model - The image generation model to use. Default: gpt-image-1.\n * @param moderation - Moderation level for the generated image. Default: 'auto'.\n * @param outputCompression - Compression level for the output image (0-100).\n * @param outputFormat - The output format of the generated image. One of 'png', 'jpeg', or 'webp'.\n * @param partialImages - Number of partial images to generate in streaming mode (0-3).\n * @param quality - The quality of the generated image. One of 'auto', 'low', 'medium', or 'high'.\n * @param size - The size of the generated image. One of 'auto', '1024x1024', '1024x1536', or '1536x1024'.\n */\n imageGeneration,\n /**\n * Local shell is a tool that allows agents to run shell commands locally\n * on a machine you or the user provides.\n *\n * Supported models: `gpt-5-codex`\n */\n localShell,\n /**\n * The shell tool allows the model to interact with your local computer through\n * a controlled command-line interface. The model proposes shell commands; your\n * integration executes them and returns the outputs.\n *\n * Available through the Responses API for use with GPT-5.1.\n *\n * WARNING: Running arbitrary shell commands can be dangerous. Always sandbox\n * execution or add strict allow-/deny-lists before forwarding a command to\n * the system shell.\n */\n shell,\n /**\n * Web search allows models to access up-to-date information from the internet\n * and provide answers with sourced citations.\n *\n * @param searchContextSize - The search context size to use for the web search.\n * @param userLocation - The user location to use for the web search.\n */\n webSearchPreview,\n /**\n * Web search allows models to access up-to-date information from the internet\n * and provide answers with sourced citations.\n *\n * @param filters - The filters to use for the web search.\n * @param searchContextSize - The search context size to use for the web search.\n * @param userLocation - The user location to use for the web search.\n */\n webSearch,\n /**\n * MCP (Model Context Protocol) allows models to call tools exposed by\n * remote MCP servers or service connectors.\n *\n * @param serverLabel - Label to identify the MCP server.\n * @param allowedTools - Allowed tool names or filter object.\n * @param authorization - OAuth access token for the MCP server/connector.\n * @param connectorId - Identifier for a service connector.\n * @param headers - Optional headers to include in MCP requests.\n * // param requireApproval - Approval policy ('always'|'never'|filter object). (Removed - always 'never')\n * @param serverDescription - Optional description of the server.\n * @param serverUrl - URL for the MCP server.\n */\n mcp,\n /**\n * Tool search allows the model to dynamically search for and load deferred\n * tools into the model's context as needed. This helps reduce overall token\n * usage, cost, and latency by only loading tools when the model needs them.\n *\n * To use tool search, mark functions or namespaces with `defer_loading: true`\n * in the tools array. The model will use tool search to load these tools\n * when it determines they are needed.\n */\n toolSearch\n};\n\n// src/responses/openai-responses-language-model.ts\n\n\n\n// src/responses/convert-openai-responses-usage.ts\nfunction convertOpenAIResponsesUsage(usage) {\n var _a, _b, _c, _d;\n if (usage == null) {\n return {\n inputTokens: {\n total: void 0,\n noCache: void 0,\n cacheRead: void 0,\n cacheWrite: void 0\n },\n outputTokens: {\n total: void 0,\n text: void 0,\n reasoning: void 0\n },\n raw: void 0\n };\n }\n const inputTokens = usage.input_tokens;\n const outputTokens = usage.output_tokens;\n const cachedTokens = (_b = (_a = usage.input_tokens_details) == null ? void 0 : _a.cached_tokens) != null ? _b : 0;\n const reasoningTokens = (_d = (_c = usage.output_tokens_details) == null ? void 0 : _c.reasoning_tokens) != null ? _d : 0;\n return {\n inputTokens: {\n total: inputTokens,\n noCache: inputTokens - cachedTokens,\n cacheRead: cachedTokens,\n cacheWrite: void 0\n },\n outputTokens: {\n total: outputTokens,\n text: outputTokens - reasoningTokens,\n reasoning: reasoningTokens\n },\n raw: usage\n };\n}\n\n// src/responses/convert-to-openai-responses-input.ts\n\n\n\nfunction isFileId(data, prefixes) {\n if (!prefixes) return false;\n return prefixes.some((prefix) => data.startsWith(prefix));\n}\nasync function convertToOpenAIResponsesInput({\n prompt,\n toolNameMapping,\n systemMessageMode,\n providerOptionsName,\n fileIdPrefixes,\n store,\n hasConversation = false,\n hasLocalShellTool = false,\n hasShellTool = false,\n hasApplyPatchTool = false,\n customProviderToolNames\n}) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;\n let input = [];\n const warnings = [];\n const processedApprovalIds = /* @__PURE__ */ new Set();\n for (const { role, content } of prompt) {\n switch (role) {\n case \"system\": {\n switch (systemMessageMode) {\n case \"system\": {\n input.push({ role: \"system\", content });\n break;\n }\n case \"developer\": {\n input.push({ role: \"developer\", content });\n break;\n }\n case \"remove\": {\n warnings.push({\n type: \"other\",\n message: \"system messages are removed for this model\"\n });\n break;\n }\n default: {\n const _exhaustiveCheck = systemMessageMode;\n throw new Error(\n `Unsupported system message mode: ${_exhaustiveCheck}`\n );\n }\n }\n break;\n }\n case \"user\": {\n input.push({\n role: \"user\",\n content: content.map((part, index) => {\n var _a2, _b2, _c2;\n switch (part.type) {\n case \"text\": {\n return { type: \"input_text\", text: part.text };\n }\n case \"file\": {\n if (part.mediaType.startsWith(\"image/\")) {\n const mediaType = part.mediaType === \"image/*\" ? \"image/jpeg\" : part.mediaType;\n return {\n type: \"input_image\",\n ...part.data instanceof URL ? { image_url: part.data.toString() } : typeof part.data === \"string\" && isFileId(part.data, fileIdPrefixes) ? { file_id: part.data } : {\n image_url: `data:${mediaType};base64,${(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data)}`\n },\n detail: (_b2 = (_a2 = part.providerOptions) == null ? void 0 : _a2[providerOptionsName]) == null ? void 0 : _b2.imageDetail\n };\n } else if (part.mediaType === \"application/pdf\") {\n if (part.data instanceof URL) {\n return {\n type: \"input_file\",\n file_url: part.data.toString()\n };\n }\n return {\n type: \"input_file\",\n ...typeof part.data === \"string\" && isFileId(part.data, fileIdPrefixes) ? { file_id: part.data } : {\n filename: (_c2 = part.filename) != null ? _c2 : `part-${index}.pdf`,\n file_data: `data:application/pdf;base64,${(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertToBase64)(part.data)}`\n }\n };\n } else {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: `file part media type ${part.mediaType}`\n });\n }\n }\n }\n })\n });\n break;\n }\n case \"assistant\": {\n const reasoningMessages = {};\n for (const part of content) {\n switch (part.type) {\n case \"text\": {\n const providerOpts = (_a = part.providerOptions) == null ? void 0 : _a[providerOptionsName];\n const id = providerOpts == null ? void 0 : providerOpts.itemId;\n const phase = providerOpts == null ? void 0 : providerOpts.phase;\n if (hasConversation && id != null) {\n break;\n }\n if (store && id != null) {\n input.push({ type: \"item_reference\", id });\n break;\n }\n input.push({\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text }],\n id,\n ...phase != null && { phase }\n });\n break;\n }\n case \"tool-call\": {\n const id = (_f = (_c = (_b = part.providerOptions) == null ? void 0 : _b[providerOptionsName]) == null ? void 0 : _c.itemId) != null ? _f : (_e = (_d = part.providerMetadata) == null ? void 0 : _d[providerOptionsName]) == null ? void 0 : _e.itemId;\n if (hasConversation && id != null) {\n break;\n }\n const resolvedToolName = toolNameMapping.toProviderToolName(\n part.toolName\n );\n if (resolvedToolName === \"tool_search\") {\n if (store && id != null) {\n input.push({ type: \"item_reference\", id });\n break;\n }\n const parsedInput = typeof part.input === \"string\" ? await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseJSON)({\n text: part.input,\n schema: toolSearchInputSchema\n }) : await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.input,\n schema: toolSearchInputSchema\n });\n const execution = parsedInput.call_id != null ? \"client\" : \"server\";\n input.push({\n type: \"tool_search_call\",\n id: id != null ? id : part.toolCallId,\n execution,\n call_id: (_g = parsedInput.call_id) != null ? _g : null,\n status: \"completed\",\n arguments: parsedInput.arguments\n });\n break;\n }\n if (part.providerExecuted) {\n if (store && id != null) {\n input.push({ type: \"item_reference\", id });\n }\n break;\n }\n if (store && id != null) {\n input.push({ type: \"item_reference\", id });\n break;\n }\n if (hasLocalShellTool && resolvedToolName === \"local_shell\") {\n const parsedInput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.input,\n schema: localShellInputSchema\n });\n input.push({\n type: \"local_shell_call\",\n call_id: part.toolCallId,\n id,\n action: {\n type: \"exec\",\n command: parsedInput.action.command,\n timeout_ms: parsedInput.action.timeoutMs,\n user: parsedInput.action.user,\n working_directory: parsedInput.action.workingDirectory,\n env: parsedInput.action.env\n }\n });\n break;\n }\n if (hasShellTool && resolvedToolName === \"shell\") {\n const parsedInput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.input,\n schema: shellInputSchema\n });\n input.push({\n type: \"shell_call\",\n call_id: part.toolCallId,\n id,\n status: \"completed\",\n action: {\n commands: parsedInput.action.commands,\n timeout_ms: parsedInput.action.timeoutMs,\n max_output_length: parsedInput.action.maxOutputLength\n }\n });\n break;\n }\n if (hasApplyPatchTool && resolvedToolName === \"apply_patch\") {\n const parsedInput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.input,\n schema: applyPatchInputSchema\n });\n input.push({\n type: \"apply_patch_call\",\n call_id: parsedInput.callId,\n id,\n status: \"completed\",\n operation: parsedInput.operation\n });\n break;\n }\n if (customProviderToolNames == null ? void 0 : customProviderToolNames.has(resolvedToolName)) {\n input.push({\n type: \"custom_tool_call\",\n call_id: part.toolCallId,\n name: resolvedToolName,\n input: typeof part.input === \"string\" ? part.input : JSON.stringify(part.input),\n id\n });\n break;\n }\n input.push({\n type: \"function_call\",\n call_id: part.toolCallId,\n name: resolvedToolName,\n arguments: JSON.stringify(part.input),\n id\n });\n break;\n }\n // assistant tool result parts are from provider-executed tools:\n case \"tool-result\": {\n if (part.output.type === \"execution-denied\" || part.output.type === \"json\" && typeof part.output.value === \"object\" && part.output.value != null && \"type\" in part.output.value && part.output.value.type === \"execution-denied\") {\n break;\n }\n if (hasConversation) {\n break;\n }\n const resolvedResultToolName = toolNameMapping.toProviderToolName(\n part.toolName\n );\n if (resolvedResultToolName === \"tool_search\") {\n const itemId = (_j = (_i = (_h = part.providerOptions) == null ? void 0 : _h[providerOptionsName]) == null ? void 0 : _i.itemId) != null ? _j : part.toolCallId;\n if (store) {\n input.push({ type: \"item_reference\", id: itemId });\n } else if (part.output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.output.value,\n schema: toolSearchOutputSchema\n });\n input.push({\n type: \"tool_search_output\",\n id: itemId,\n execution: \"server\",\n call_id: null,\n status: \"completed\",\n tools: parsedOutput.tools\n });\n }\n break;\n }\n if (hasShellTool && resolvedResultToolName === \"shell\") {\n if (part.output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: part.output.value,\n schema: shellOutputSchema\n });\n input.push({\n type: \"shell_call_output\",\n call_id: part.toolCallId,\n output: parsedOutput.output.map((item) => ({\n stdout: item.stdout,\n stderr: item.stderr,\n outcome: item.outcome.type === \"timeout\" ? { type: \"timeout\" } : {\n type: \"exit\",\n exit_code: item.outcome.exitCode\n }\n }))\n });\n }\n break;\n }\n if (store) {\n const itemId = (_m = (_l = (_k = part.providerOptions) == null ? void 0 : _k[providerOptionsName]) == null ? void 0 : _l.itemId) != null ? _m : part.toolCallId;\n input.push({ type: \"item_reference\", id: itemId });\n } else {\n warnings.push({\n type: \"other\",\n message: `Results for OpenAI tool ${part.toolName} are not sent to the API when store is false`\n });\n }\n break;\n }\n case \"reasoning\": {\n const providerOptions = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: providerOptionsName,\n providerOptions: part.providerOptions,\n schema: openaiResponsesReasoningProviderOptionsSchema\n });\n const reasoningId = providerOptions == null ? void 0 : providerOptions.itemId;\n if (hasConversation && reasoningId != null) {\n break;\n }\n if (reasoningId != null) {\n const reasoningMessage = reasoningMessages[reasoningId];\n if (store) {\n if (reasoningMessage === void 0) {\n input.push({ type: \"item_reference\", id: reasoningId });\n reasoningMessages[reasoningId] = {\n type: \"reasoning\",\n id: reasoningId,\n summary: []\n };\n }\n } else {\n const summaryParts = [];\n if (part.text.length > 0) {\n summaryParts.push({\n type: \"summary_text\",\n text: part.text\n });\n } else if (reasoningMessage !== void 0) {\n warnings.push({\n type: \"other\",\n message: `Cannot append empty reasoning part to existing reasoning sequence. Skipping reasoning part: ${JSON.stringify(part)}.`\n });\n }\n if (reasoningMessage === void 0) {\n reasoningMessages[reasoningId] = {\n type: \"reasoning\",\n id: reasoningId,\n encrypted_content: providerOptions == null ? void 0 : providerOptions.reasoningEncryptedContent,\n summary: summaryParts\n };\n input.push(reasoningMessages[reasoningId]);\n } else {\n reasoningMessage.summary.push(...summaryParts);\n if ((providerOptions == null ? void 0 : providerOptions.reasoningEncryptedContent) != null) {\n reasoningMessage.encrypted_content = providerOptions.reasoningEncryptedContent;\n }\n }\n }\n } else {\n const encryptedContent = providerOptions == null ? void 0 : providerOptions.reasoningEncryptedContent;\n if (encryptedContent != null) {\n const summaryParts = [];\n if (part.text.length > 0) {\n summaryParts.push({\n type: \"summary_text\",\n text: part.text\n });\n }\n input.push({\n type: \"reasoning\",\n encrypted_content: encryptedContent,\n summary: summaryParts\n });\n } else {\n warnings.push({\n type: \"other\",\n message: `Non-OpenAI reasoning parts are not supported. Skipping reasoning part: ${JSON.stringify(part)}.`\n });\n }\n }\n break;\n }\n }\n }\n break;\n }\n case \"tool\": {\n for (const part of content) {\n if (part.type === \"tool-approval-response\") {\n const approvalResponse = part;\n if (processedApprovalIds.has(approvalResponse.approvalId)) {\n continue;\n }\n processedApprovalIds.add(approvalResponse.approvalId);\n if (store) {\n input.push({\n type: \"item_reference\",\n id: approvalResponse.approvalId\n });\n }\n input.push({\n type: \"mcp_approval_response\",\n approval_request_id: approvalResponse.approvalId,\n approve: approvalResponse.approved\n });\n continue;\n }\n const output = part.output;\n if (output.type === \"execution-denied\") {\n const approvalId = (_o = (_n = output.providerOptions) == null ? void 0 : _n.openai) == null ? void 0 : _o.approvalId;\n if (approvalId) {\n continue;\n }\n }\n const resolvedToolName = toolNameMapping.toProviderToolName(\n part.toolName\n );\n if (resolvedToolName === \"tool_search\" && output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: output.value,\n schema: toolSearchOutputSchema\n });\n input.push({\n type: \"tool_search_output\",\n execution: \"client\",\n call_id: part.toolCallId,\n status: \"completed\",\n tools: parsedOutput.tools\n });\n continue;\n }\n if (hasLocalShellTool && resolvedToolName === \"local_shell\" && output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: output.value,\n schema: localShellOutputSchema\n });\n input.push({\n type: \"local_shell_call_output\",\n call_id: part.toolCallId,\n output: parsedOutput.output\n });\n continue;\n }\n if (hasShellTool && resolvedToolName === \"shell\" && output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: output.value,\n schema: shellOutputSchema\n });\n input.push({\n type: \"shell_call_output\",\n call_id: part.toolCallId,\n output: parsedOutput.output.map((item) => ({\n stdout: item.stdout,\n stderr: item.stderr,\n outcome: item.outcome.type === \"timeout\" ? { type: \"timeout\" } : {\n type: \"exit\",\n exit_code: item.outcome.exitCode\n }\n }))\n });\n continue;\n }\n if (hasApplyPatchTool && part.toolName === \"apply_patch\" && output.type === \"json\") {\n const parsedOutput = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: output.value,\n schema: applyPatchOutputSchema\n });\n input.push({\n type: \"apply_patch_call_output\",\n call_id: part.toolCallId,\n status: parsedOutput.status,\n output: parsedOutput.output\n });\n continue;\n }\n if (customProviderToolNames == null ? void 0 : customProviderToolNames.has(resolvedToolName)) {\n let outputValue;\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n outputValue = output.value;\n break;\n case \"execution-denied\":\n outputValue = (_p = output.reason) != null ? _p : \"Tool execution denied.\";\n break;\n case \"json\":\n case \"error-json\":\n outputValue = JSON.stringify(output.value);\n break;\n case \"content\":\n outputValue = output.value.map((item) => {\n var _a2;\n switch (item.type) {\n case \"text\":\n return { type: \"input_text\", text: item.text };\n case \"image-data\":\n return {\n type: \"input_image\",\n image_url: `data:${item.mediaType};base64,${item.data}`\n };\n case \"image-url\":\n return {\n type: \"input_image\",\n image_url: item.url\n };\n case \"file-data\":\n return {\n type: \"input_file\",\n filename: (_a2 = item.filename) != null ? _a2 : \"data\",\n file_data: `data:${item.mediaType};base64,${item.data}`\n };\n case \"file-url\":\n return {\n type: \"input_file\",\n file_url: item.url\n };\n default:\n warnings.push({\n type: \"other\",\n message: `unsupported custom tool content part type: ${item.type}`\n });\n return void 0;\n }\n }).filter(_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.isNonNullable);\n break;\n default:\n outputValue = \"\";\n }\n input.push({\n type: \"custom_tool_call_output\",\n call_id: part.toolCallId,\n output: outputValue\n });\n continue;\n }\n let contentValue;\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n contentValue = output.value;\n break;\n case \"execution-denied\":\n contentValue = (_q = output.reason) != null ? _q : \"Tool execution denied.\";\n break;\n case \"json\":\n case \"error-json\":\n contentValue = JSON.stringify(output.value);\n break;\n case \"content\":\n contentValue = output.value.map((item) => {\n var _a2;\n switch (item.type) {\n case \"text\": {\n return { type: \"input_text\", text: item.text };\n }\n case \"image-data\": {\n return {\n type: \"input_image\",\n image_url: `data:${item.mediaType};base64,${item.data}`\n };\n }\n case \"image-url\": {\n return {\n type: \"input_image\",\n image_url: item.url\n };\n }\n case \"file-data\": {\n return {\n type: \"input_file\",\n filename: (_a2 = item.filename) != null ? _a2 : \"data\",\n file_data: `data:${item.mediaType};base64,${item.data}`\n };\n }\n case \"file-url\": {\n return {\n type: \"input_file\",\n file_url: item.url\n };\n }\n default: {\n warnings.push({\n type: \"other\",\n message: `unsupported tool content part type: ${item.type}`\n });\n return void 0;\n }\n }\n }).filter(_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.isNonNullable);\n break;\n }\n input.push({\n type: \"function_call_output\",\n call_id: part.toolCallId,\n output: contentValue\n });\n }\n break;\n }\n default: {\n const _exhaustiveCheck = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n if (!store && input.some(\n (item) => \"type\" in item && item.type === \"reasoning\" && item.encrypted_content == null\n )) {\n warnings.push({\n type: \"other\",\n message: \"Reasoning parts without encrypted content are not supported when store is false. Skipping reasoning parts.\"\n });\n input = input.filter(\n (item) => !(\"type\" in item) || item.type !== \"reasoning\" || item.encrypted_content != null\n );\n }\n return { input, warnings };\n}\nvar openaiResponsesReasoningProviderOptionsSchema = zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n itemId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n reasoningEncryptedContent: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n});\n\n// src/responses/map-openai-responses-finish-reason.ts\nfunction mapOpenAIResponseFinishReason({\n finishReason,\n hasFunctionCall\n}) {\n switch (finishReason) {\n case void 0:\n case null:\n return hasFunctionCall ? \"tool-calls\" : \"stop\";\n case \"max_output_tokens\":\n return \"length\";\n case \"content_filter\":\n return \"content-filter\";\n default:\n return hasFunctionCall ? \"tool-calls\" : \"other\";\n }\n}\n\n// src/responses/openai-responses-api.ts\n\n\nvar jsonValueSchema2 = zod_v4__WEBPACK_IMPORTED_MODULE_0__.lazy(\n () => zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"null\"](),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(jsonValueSchema2),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema2.optional())\n ])\n);\nvar openaiResponsesChunkSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.output_text.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n )\n })\n ).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"response.completed\", \"response.incomplete\"]),\n response: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n incomplete_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }).nullish(),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n input_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ cached_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish(),\n output_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n output_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish()\n }),\n service_tier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.failed\"),\n response: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }).nullish(),\n incomplete_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }).nullish(),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n input_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ cached_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish(),\n output_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n output_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish()\n }).nullish(),\n service_tier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.created\"),\n response: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n created_at: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n service_tier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.output_item.added\"),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n item: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"message\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n phase: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"commentary\", \"final_answer\"]).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"reasoning\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n encrypted_content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"function_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"web_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"computer_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image_generation_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"code_interpreter_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n container_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n outputs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"logs\"), logs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n approval_request_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_list_tools\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_approval_request\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"apply_patch_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\"]),\n operation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"create_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"delete_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"update_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"custom_tool_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n commands: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string())\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n stdout: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n stderr: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outcome: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"timeout\") }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exit\"),\n exit_code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ])\n })\n )\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema2.optional()))\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.output_item.done\"),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n item: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"message\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n phase: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"commentary\", \"final_answer\"]).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"reasoning\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n encrypted_content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"function_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"completed\")\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"custom_tool_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"completed\")\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"code_interpreter_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n container_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outputs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"logs\"), logs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).nullable()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image_generation_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n result: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"web_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"search\"),\n query: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n sources: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"api\"), name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"open_page\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"find_in_page\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n pattern: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ]).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n queries: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n results: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n attributes: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean()])\n ),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n score: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"local_shell_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exec\"),\n command: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n timeout_ms: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n working_directory: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n env: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"computer_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"completed\")\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()]).optional(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).loose()\n ]).nullish(),\n approval_request_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_list_tools\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n input_schema: zod_v4__WEBPACK_IMPORTED_MODULE_0__.any(),\n annotations: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()).optional()\n })\n ),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()]).optional(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).loose()\n ]).optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_approval_request\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n approval_request_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"apply_patch_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\"]),\n operation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"create_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"delete_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"update_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n commands: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string())\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n stdout: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n stderr: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outcome: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"timeout\") }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exit\"),\n exit_code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ])\n })\n )\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema2.optional()))\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.function_call_arguments.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.custom_tool_call_input.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.image_generation_call.partial_image\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n partial_image_b64: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.code_interpreter_call_code.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.code_interpreter_call_code.done\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.output_text.annotation.added\"),\n annotation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url_citation\"),\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_citation\"),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"container_file_citation\"),\n container_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_path\"),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.reasoning_summary_part.added\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n summary_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.reasoning_summary_text.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n summary_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.reasoning_summary_part.done\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n summary_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.apply_patch_call_operation_diff.delta\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n delta: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n obfuscation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"response.apply_patch_call_operation_diff.done\"),\n item_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"error\"),\n sequence_number: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n param: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }).loose().transform((value) => ({\n type: \"unknown_chunk\",\n message: value.type\n }))\n // fallback for unknown chunks\n ])\n )\n);\nvar openaiResponsesResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n created_at: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n param: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }).nullish(),\n model: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"message\"),\n role: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"assistant\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n phase: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"commentary\", \"final_answer\"]).nullish(),\n content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"output_text\"),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n top_logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n token: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n )\n })\n ).nullish(),\n annotations: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url_citation\"),\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n title: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_citation\"),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"container_file_citation\"),\n container_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n start_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end_index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_path\"),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n index: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ])\n )\n })\n )\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"web_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"search\"),\n query: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n sources: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"url\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"api\"),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ])\n ).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"open_page\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"find_in_page\"),\n url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n pattern: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n })\n ]).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"file_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n queries: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n results: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n attributes: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean()])\n ),\n file_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n filename: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n score: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ).nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"code_interpreter_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n container_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outputs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"logs\"), logs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image\"), url: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() })\n ])\n ).nullable()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"image_generation_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n result: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"local_shell_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exec\"),\n command: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()),\n timeout_ms: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().optional(),\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n working_directory: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n env: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional()\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"function_call\"),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"custom_tool_call\"),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n input: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"computer_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"reasoning\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n encrypted_content: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n summary: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"summary_text\"),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n )\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()]).optional(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).loose()\n ]).nullish(),\n approval_request_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_list_tools\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n description: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n input_schema: zod_v4__WEBPACK_IMPORTED_MODULE_0__.any(),\n annotations: zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()).optional()\n })\n ),\n error: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()]).optional(),\n message: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }).loose()\n ]).optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"mcp_approval_request\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n server_label: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n name: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n approval_request_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"apply_patch_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\"]),\n operation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"create_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"delete_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"update_file\"),\n path: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n diff: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()\n })\n ])\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n action: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n commands: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string())\n })\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"shell_call_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n output: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n stdout: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n stderr: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n outcome: zod_v4__WEBPACK_IMPORTED_MODULE_0__.discriminatedUnion(\"type\", [\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"timeout\") }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"exit\"),\n exit_code: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ])\n })\n )\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_call\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n arguments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.unknown()\n }),\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n type: zod_v4__WEBPACK_IMPORTED_MODULE_0__.literal(\"tool_search_output\"),\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n execution: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"server\", \"client\"]),\n call_id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullable(),\n status: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_progress\", \"completed\", \"incomplete\"]),\n tools: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.record(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(), jsonValueSchema2.optional()))\n })\n ])\n ).optional(),\n service_tier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n incomplete_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reason: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string() }).nullish(),\n usage: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n input_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n input_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ cached_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish(),\n output_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n output_tokens_details: zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({ reasoning_tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish() }).nullish()\n }).optional()\n })\n )\n);\n\n// src/responses/openai-responses-options.ts\n\n\nvar TOP_LOGPROBS_MAX = 20;\nvar openaiResponsesReasoningModelIds = [\n \"o1\",\n \"o1-2024-12-17\",\n \"o3\",\n \"o3-2025-04-16\",\n \"o3-mini\",\n \"o3-mini-2025-01-31\",\n \"o4-mini\",\n \"o4-mini-2025-04-16\",\n \"gpt-5\",\n \"gpt-5-2025-08-07\",\n \"gpt-5-codex\",\n \"gpt-5-mini\",\n \"gpt-5-mini-2025-08-07\",\n \"gpt-5-nano\",\n \"gpt-5-nano-2025-08-07\",\n \"gpt-5-pro\",\n \"gpt-5-pro-2025-10-06\",\n \"gpt-5.1\",\n \"gpt-5.1-chat-latest\",\n \"gpt-5.1-codex-mini\",\n \"gpt-5.1-codex\",\n \"gpt-5.1-codex-max\",\n \"gpt-5.2\",\n \"gpt-5.2-chat-latest\",\n \"gpt-5.2-pro\",\n \"gpt-5.2-codex\",\n \"gpt-5.3-chat-latest\",\n \"gpt-5.3-codex\",\n \"gpt-5.4\",\n \"gpt-5.4-2026-03-05\",\n \"gpt-5.4-mini\",\n \"gpt-5.4-mini-2026-03-17\",\n \"gpt-5.4-nano\",\n \"gpt-5.4-nano-2026-03-17\",\n \"gpt-5.4-pro\",\n \"gpt-5.4-pro-2026-03-05\"\n];\nvar openaiResponsesModelIds = [\n \"gpt-4.1\",\n \"gpt-4.1-2025-04-14\",\n \"gpt-4.1-mini\",\n \"gpt-4.1-mini-2025-04-14\",\n \"gpt-4.1-nano\",\n \"gpt-4.1-nano-2025-04-14\",\n \"gpt-4o\",\n \"gpt-4o-2024-05-13\",\n \"gpt-4o-2024-08-06\",\n \"gpt-4o-2024-11-20\",\n \"gpt-4o-audio-preview\",\n \"gpt-4o-audio-preview-2024-12-17\",\n \"gpt-4o-search-preview\",\n \"gpt-4o-search-preview-2025-03-11\",\n \"gpt-4o-mini-search-preview\",\n \"gpt-4o-mini-search-preview-2025-03-11\",\n \"gpt-4o-mini\",\n \"gpt-4o-mini-2024-07-18\",\n \"gpt-3.5-turbo-0125\",\n \"gpt-3.5-turbo\",\n \"gpt-3.5-turbo-1106\",\n \"gpt-5-chat-latest\",\n ...openaiResponsesReasoningModelIds\n];\nvar openaiLanguageModelResponsesOptionsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n /**\n * The ID of the OpenAI Conversation to continue.\n * You must create a conversation first via the OpenAI API.\n * Cannot be used in conjunction with `previousResponseId`.\n * Defaults to `undefined`.\n * @see https://platform.openai.com/docs/api-reference/conversations/create\n */\n conversation: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * The set of extra fields to include in the response (advanced, usually not needed).\n * Example values: 'reasoning.encrypted_content', 'file_search_call.results', 'message.output_text.logprobs'.\n */\n include: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\n \"reasoning.encrypted_content\",\n // handled internally by default, only needed for unknown reasoning models\n \"file_search_call.results\",\n \"message.output_text.logprobs\"\n ])\n ).nullish(),\n /**\n * Instructions for the model.\n * They can be used to change the system or developer message when continuing a conversation using the `previousResponseId` option.\n * Defaults to `undefined`.\n */\n instructions: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * Return the log probabilities of the tokens. Including logprobs will increase\n * the response size and can slow down response times. However, it can\n * be useful to better understand how the model is behaving.\n *\n * Setting to true will return the log probabilities of the tokens that\n * were generated.\n *\n * Setting to a number will return the log probabilities of the top n\n * tokens that were generated.\n *\n * @see https://platform.openai.com/docs/api-reference/responses/create\n * @see https://cookbook.openai.com/examples/using_logprobs\n */\n logprobs: zod_v4__WEBPACK_IMPORTED_MODULE_0__.union([zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean(), zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().min(1).max(TOP_LOGPROBS_MAX)]).optional(),\n /**\n * The maximum number of total calls to built-in tools that can be processed in a response.\n * This maximum number applies across all built-in tool calls, not per individual tool.\n * Any further attempts to call a tool by the model will be ignored.\n */\n maxToolCalls: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n /**\n * Additional metadata to store with the generation.\n */\n metadata: zod_v4__WEBPACK_IMPORTED_MODULE_0__.any().nullish(),\n /**\n * Whether to use parallel tool calls. Defaults to `true`.\n */\n parallelToolCalls: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().nullish(),\n /**\n * The ID of the previous response. You can use it to continue a conversation.\n * Defaults to `undefined`.\n */\n previousResponseId: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * Sets a cache key to tie this prompt to cached prefixes for better caching performance.\n */\n promptCacheKey: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * The retention policy for the prompt cache.\n * - 'in_memory': Default. Standard prompt caching behavior.\n * - '24h': Extended prompt caching that keeps cached prefixes active for up to 24 hours.\n * Currently only available for 5.1 series models.\n *\n * @default 'in_memory'\n */\n promptCacheRetention: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"in_memory\", \"24h\"]).nullish(),\n /**\n * Reasoning effort for reasoning models. Defaults to `medium`. If you use\n * `providerOptions` to set the `reasoningEffort` option, this model setting will be ignored.\n * Valid values: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh'\n *\n * The 'none' type for `reasoningEffort` is only available for OpenAI's GPT-5.1\n * models. Also, the 'xhigh' type for `reasoningEffort` is only available for\n * OpenAI's GPT-5.1-Codex-Max model. Setting `reasoningEffort` to 'none' or 'xhigh' with unsupported models will result in\n * an error.\n */\n reasoningEffort: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * Controls reasoning summary output from the model.\n * Set to \"auto\" to automatically receive the richest level available,\n * or \"detailed\" for comprehensive summaries.\n */\n reasoningSummary: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * The identifier for safety monitoring and tracking.\n */\n safetyIdentifier: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * Service tier for the request.\n * Set to 'flex' for 50% cheaper processing at the cost of increased latency (available for o3, o4-mini, and gpt-5 models).\n * Set to 'priority' for faster processing with Enterprise access (available for gpt-4, gpt-5, gpt-5-mini, o3, o4-mini; gpt-5-nano is not supported).\n *\n * Defaults to 'auto'.\n */\n serviceTier: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\", \"flex\", \"priority\", \"default\"]).nullish(),\n /**\n * Whether to store the generation. Defaults to `true`.\n */\n store: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().nullish(),\n /**\n * Whether to use strict JSON schema validation.\n * Defaults to `true`.\n */\n strictJsonSchema: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().nullish(),\n /**\n * Controls the verbosity of the model's responses. Lower values ('low') will result\n * in more concise responses, while higher values ('high') will result in more verbose responses.\n * Valid values: 'low', 'medium', 'high'.\n */\n textVerbosity: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"low\", \"medium\", \"high\"]).nullish(),\n /**\n * Controls output truncation. 'auto' (default) performs truncation automatically;\n * 'disabled' turns truncation off.\n */\n truncation: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"auto\", \"disabled\"]).nullish(),\n /**\n * A unique identifier representing your end-user, which can help OpenAI to\n * monitor and detect abuse.\n * Defaults to `undefined`.\n * @see https://platform.openai.com/docs/guides/safety-best-practices/end-user-ids\n */\n user: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n /**\n * Override the system message mode for this model.\n * - 'system': Use the 'system' role for system messages (default for most models)\n * - 'developer': Use the 'developer' role for system messages (used by reasoning models)\n * - 'remove': Remove system messages entirely\n *\n * If not specified, the mode is automatically determined based on the model.\n */\n systemMessageMode: zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"system\", \"developer\", \"remove\"]).optional(),\n /**\n * Force treating this model as a reasoning model.\n *\n * This is useful for \"stealth\" reasoning models (e.g. via a custom baseURL)\n * where the model ID is not recognized by the SDK's allowlist.\n *\n * When enabled, the SDK applies reasoning-model parameter compatibility rules\n * and defaults `systemMessageMode` to `developer` unless overridden.\n */\n forceReasoning: zod_v4__WEBPACK_IMPORTED_MODULE_0__.boolean().optional()\n })\n )\n);\n\n// src/responses/openai-responses-prepare-tools.ts\n\n\nasync function prepareResponsesTools({\n tools,\n toolChoice,\n toolNameMapping,\n customProviderToolNames\n}) {\n var _a, _b;\n tools = (tools == null ? void 0 : tools.length) ? tools : void 0;\n const toolWarnings = [];\n if (tools == null) {\n return { tools: void 0, toolChoice: void 0, toolWarnings };\n }\n const openaiTools2 = [];\n const resolvedCustomProviderToolNames = customProviderToolNames != null ? customProviderToolNames : /* @__PURE__ */ new Set();\n for (const tool of tools) {\n switch (tool.type) {\n case \"function\": {\n const openaiOptions = (_a = tool.providerOptions) == null ? void 0 : _a.openai;\n const deferLoading = openaiOptions == null ? void 0 : openaiOptions.deferLoading;\n openaiTools2.push({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n ...tool.strict != null ? { strict: tool.strict } : {},\n ...deferLoading != null ? { defer_loading: deferLoading } : {}\n });\n break;\n }\n case \"provider\": {\n switch (tool.id) {\n case \"openai.file_search\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: fileSearchArgsSchema\n });\n openaiTools2.push({\n type: \"file_search\",\n vector_store_ids: args.vectorStoreIds,\n max_num_results: args.maxNumResults,\n ranking_options: args.ranking ? {\n ranker: args.ranking.ranker,\n score_threshold: args.ranking.scoreThreshold\n } : void 0,\n filters: args.filters\n });\n break;\n }\n case \"openai.local_shell\": {\n openaiTools2.push({\n type: \"local_shell\"\n });\n break;\n }\n case \"openai.shell\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: shellArgsSchema\n });\n openaiTools2.push({\n type: \"shell\",\n ...args.environment && {\n environment: mapShellEnvironment(args.environment)\n }\n });\n break;\n }\n case \"openai.apply_patch\": {\n openaiTools2.push({\n type: \"apply_patch\"\n });\n break;\n }\n case \"openai.web_search_preview\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: webSearchPreviewArgsSchema\n });\n openaiTools2.push({\n type: \"web_search_preview\",\n search_context_size: args.searchContextSize,\n user_location: args.userLocation\n });\n break;\n }\n case \"openai.web_search\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: webSearchArgsSchema\n });\n openaiTools2.push({\n type: \"web_search\",\n filters: args.filters != null ? { allowed_domains: args.filters.allowedDomains } : void 0,\n external_web_access: args.externalWebAccess,\n search_context_size: args.searchContextSize,\n user_location: args.userLocation\n });\n break;\n }\n case \"openai.code_interpreter\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: codeInterpreterArgsSchema\n });\n openaiTools2.push({\n type: \"code_interpreter\",\n container: args.container == null ? { type: \"auto\", file_ids: void 0 } : typeof args.container === \"string\" ? args.container : { type: \"auto\", file_ids: args.container.fileIds }\n });\n break;\n }\n case \"openai.image_generation\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: imageGenerationArgsSchema\n });\n openaiTools2.push({\n type: \"image_generation\",\n background: args.background,\n input_fidelity: args.inputFidelity,\n input_image_mask: args.inputImageMask ? {\n file_id: args.inputImageMask.fileId,\n image_url: args.inputImageMask.imageUrl\n } : void 0,\n model: args.model,\n moderation: args.moderation,\n partial_images: args.partialImages,\n quality: args.quality,\n output_compression: args.outputCompression,\n output_format: args.outputFormat,\n size: args.size\n });\n break;\n }\n case \"openai.mcp\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: mcpArgsSchema\n });\n const mapApprovalFilter = (filter) => ({\n tool_names: filter.toolNames\n });\n const requireApproval = args.requireApproval;\n const requireApprovalParam = requireApproval == null ? void 0 : typeof requireApproval === \"string\" ? requireApproval : requireApproval.never != null ? { never: mapApprovalFilter(requireApproval.never) } : void 0;\n openaiTools2.push({\n type: \"mcp\",\n server_label: args.serverLabel,\n allowed_tools: Array.isArray(args.allowedTools) ? args.allowedTools : args.allowedTools ? {\n read_only: args.allowedTools.readOnly,\n tool_names: args.allowedTools.toolNames\n } : void 0,\n authorization: args.authorization,\n connector_id: args.connectorId,\n headers: args.headers,\n require_approval: requireApprovalParam != null ? requireApprovalParam : \"never\",\n server_description: args.serverDescription,\n server_url: args.serverUrl\n });\n break;\n }\n case \"openai.custom\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: customArgsSchema\n });\n openaiTools2.push({\n type: \"custom\",\n name: args.name,\n description: args.description,\n format: args.format\n });\n resolvedCustomProviderToolNames.add(args.name);\n break;\n }\n case \"openai.tool_search\": {\n const args = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.validateTypes)({\n value: tool.args,\n schema: toolSearchArgsSchema\n });\n openaiTools2.push({\n type: \"tool_search\",\n ...args.execution != null ? { execution: args.execution } : {},\n ...args.description != null ? { description: args.description } : {},\n ...args.parameters != null ? { parameters: args.parameters } : {}\n });\n break;\n }\n }\n break;\n }\n default:\n toolWarnings.push({\n type: \"unsupported\",\n feature: `function tool ${tool}`\n });\n break;\n }\n }\n if (toolChoice == null) {\n return { tools: openaiTools2, toolChoice: void 0, toolWarnings };\n }\n const type = toolChoice.type;\n switch (type) {\n case \"auto\":\n case \"none\":\n case \"required\":\n return { tools: openaiTools2, toolChoice: type, toolWarnings };\n case \"tool\": {\n const resolvedToolName = (_b = toolNameMapping == null ? void 0 : toolNameMapping.toProviderToolName(toolChoice.toolName)) != null ? _b : toolChoice.toolName;\n return {\n tools: openaiTools2,\n toolChoice: resolvedToolName === \"code_interpreter\" || resolvedToolName === \"file_search\" || resolvedToolName === \"image_generation\" || resolvedToolName === \"web_search_preview\" || resolvedToolName === \"web_search\" || resolvedToolName === \"mcp\" || resolvedToolName === \"apply_patch\" ? { type: resolvedToolName } : resolvedCustomProviderToolNames.has(resolvedToolName) ? { type: \"custom\", name: resolvedToolName } : { type: \"function\", name: resolvedToolName },\n toolWarnings\n };\n }\n default: {\n const _exhaustiveCheck = type;\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`\n });\n }\n }\n}\nfunction mapShellEnvironment(environment) {\n if (environment.type === \"containerReference\") {\n const env2 = environment;\n return {\n type: \"container_reference\",\n container_id: env2.containerId\n };\n }\n if (environment.type === \"containerAuto\") {\n const env2 = environment;\n return {\n type: \"container_auto\",\n file_ids: env2.fileIds,\n memory_limit: env2.memoryLimit,\n network_policy: env2.networkPolicy == null ? void 0 : env2.networkPolicy.type === \"disabled\" ? { type: \"disabled\" } : {\n type: \"allowlist\",\n allowed_domains: env2.networkPolicy.allowedDomains,\n domain_secrets: env2.networkPolicy.domainSecrets\n },\n skills: mapShellSkills(env2.skills)\n };\n }\n const env = environment;\n return {\n type: \"local\",\n skills: env.skills\n };\n}\nfunction mapShellSkills(skills) {\n return skills == null ? void 0 : skills.map(\n (skill) => skill.type === \"skillReference\" ? {\n type: \"skill_reference\",\n skill_id: skill.skillId,\n version: skill.version\n } : {\n type: \"inline\",\n name: skill.name,\n description: skill.description,\n source: {\n type: \"base64\",\n media_type: skill.source.mediaType,\n data: skill.source.data\n }\n }\n );\n}\n\n// src/responses/openai-responses-language-model.ts\nfunction extractApprovalRequestIdToToolCallIdMapping(prompt) {\n var _a, _b;\n const mapping = {};\n for (const message of prompt) {\n if (message.role !== \"assistant\") continue;\n for (const part of message.content) {\n if (part.type !== \"tool-call\") continue;\n const approvalRequestId = (_b = (_a = part.providerOptions) == null ? void 0 : _a.openai) == null ? void 0 : _b.approvalRequestId;\n if (approvalRequestId != null) {\n mapping[approvalRequestId] = part.toolCallId;\n }\n }\n }\n return mapping;\n}\nvar OpenAIResponsesLanguageModel = class {\n constructor(modelId, config) {\n this.specificationVersion = \"v3\";\n this.supportedUrls = {\n \"image/*\": [/^https?:\\/\\/.*$/],\n \"application/pdf\": [/^https?:\\/\\/.*$/]\n };\n this.modelId = modelId;\n this.config = config;\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs({\n maxOutputTokens,\n temperature,\n stopSequences,\n topP,\n topK,\n presencePenalty,\n frequencyPenalty,\n seed,\n prompt,\n providerOptions,\n tools,\n toolChoice,\n responseFormat\n }) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i;\n const warnings = [];\n const modelCapabilities = getOpenAILanguageModelCapabilities(this.modelId);\n if (topK != null) {\n warnings.push({ type: \"unsupported\", feature: \"topK\" });\n }\n if (seed != null) {\n warnings.push({ type: \"unsupported\", feature: \"seed\" });\n }\n if (presencePenalty != null) {\n warnings.push({ type: \"unsupported\", feature: \"presencePenalty\" });\n }\n if (frequencyPenalty != null) {\n warnings.push({ type: \"unsupported\", feature: \"frequencyPenalty\" });\n }\n if (stopSequences != null) {\n warnings.push({ type: \"unsupported\", feature: \"stopSequences\" });\n }\n const providerOptionsName = this.config.provider.includes(\"azure\") ? \"azure\" : \"openai\";\n let openaiOptions = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: providerOptionsName,\n providerOptions,\n schema: openaiLanguageModelResponsesOptionsSchema\n });\n if (openaiOptions == null && providerOptionsName !== \"openai\") {\n openaiOptions = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openaiLanguageModelResponsesOptionsSchema\n });\n }\n const isReasoningModel = (_a = openaiOptions == null ? void 0 : openaiOptions.forceReasoning) != null ? _a : modelCapabilities.isReasoningModel;\n if ((openaiOptions == null ? void 0 : openaiOptions.conversation) && (openaiOptions == null ? void 0 : openaiOptions.previousResponseId)) {\n warnings.push({\n type: \"unsupported\",\n feature: \"conversation\",\n details: \"conversation and previousResponseId cannot be used together\"\n });\n }\n const toolNameMapping = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createToolNameMapping)({\n tools,\n providerToolNames: {\n \"openai.code_interpreter\": \"code_interpreter\",\n \"openai.file_search\": \"file_search\",\n \"openai.image_generation\": \"image_generation\",\n \"openai.local_shell\": \"local_shell\",\n \"openai.shell\": \"shell\",\n \"openai.web_search\": \"web_search\",\n \"openai.web_search_preview\": \"web_search_preview\",\n \"openai.mcp\": \"mcp\",\n \"openai.apply_patch\": \"apply_patch\",\n \"openai.tool_search\": \"tool_search\"\n },\n resolveProviderToolName: (tool) => tool.id === \"openai.custom\" ? tool.args.name : void 0\n });\n const customProviderToolNames = /* @__PURE__ */ new Set();\n const {\n tools: openaiTools2,\n toolChoice: openaiToolChoice,\n toolWarnings\n } = await prepareResponsesTools({\n tools,\n toolChoice,\n toolNameMapping,\n customProviderToolNames\n });\n const { input, warnings: inputWarnings } = await convertToOpenAIResponsesInput({\n prompt,\n toolNameMapping,\n systemMessageMode: (_b = openaiOptions == null ? void 0 : openaiOptions.systemMessageMode) != null ? _b : isReasoningModel ? \"developer\" : modelCapabilities.systemMessageMode,\n providerOptionsName,\n fileIdPrefixes: this.config.fileIdPrefixes,\n store: (_c = openaiOptions == null ? void 0 : openaiOptions.store) != null ? _c : true,\n hasConversation: (openaiOptions == null ? void 0 : openaiOptions.conversation) != null,\n hasLocalShellTool: hasOpenAITool(\"openai.local_shell\"),\n hasShellTool: hasOpenAITool(\"openai.shell\"),\n hasApplyPatchTool: hasOpenAITool(\"openai.apply_patch\"),\n customProviderToolNames: customProviderToolNames.size > 0 ? customProviderToolNames : void 0\n });\n warnings.push(...inputWarnings);\n const strictJsonSchema = (_d = openaiOptions == null ? void 0 : openaiOptions.strictJsonSchema) != null ? _d : true;\n let include = openaiOptions == null ? void 0 : openaiOptions.include;\n function addInclude(key) {\n if (include == null) {\n include = [key];\n } else if (!include.includes(key)) {\n include = [...include, key];\n }\n }\n function hasOpenAITool(id) {\n return (tools == null ? void 0 : tools.find((tool) => tool.type === \"provider\" && tool.id === id)) != null;\n }\n const topLogprobs = typeof (openaiOptions == null ? void 0 : openaiOptions.logprobs) === \"number\" ? openaiOptions == null ? void 0 : openaiOptions.logprobs : (openaiOptions == null ? void 0 : openaiOptions.logprobs) === true ? TOP_LOGPROBS_MAX : void 0;\n if (topLogprobs) {\n addInclude(\"message.output_text.logprobs\");\n }\n const webSearchToolName = (_e = tools == null ? void 0 : tools.find(\n (tool) => tool.type === \"provider\" && (tool.id === \"openai.web_search\" || tool.id === \"openai.web_search_preview\")\n )) == null ? void 0 : _e.name;\n if (webSearchToolName) {\n addInclude(\"web_search_call.action.sources\");\n }\n if (hasOpenAITool(\"openai.code_interpreter\")) {\n addInclude(\"code_interpreter_call.outputs\");\n }\n const store = openaiOptions == null ? void 0 : openaiOptions.store;\n if (store === false && isReasoningModel) {\n addInclude(\"reasoning.encrypted_content\");\n }\n const baseArgs = {\n model: this.modelId,\n input,\n temperature,\n top_p: topP,\n max_output_tokens: maxOutputTokens,\n ...((responseFormat == null ? void 0 : responseFormat.type) === \"json\" || (openaiOptions == null ? void 0 : openaiOptions.textVerbosity)) && {\n text: {\n ...(responseFormat == null ? void 0 : responseFormat.type) === \"json\" && {\n format: responseFormat.schema != null ? {\n type: \"json_schema\",\n strict: strictJsonSchema,\n name: (_f = responseFormat.name) != null ? _f : \"response\",\n description: responseFormat.description,\n schema: responseFormat.schema\n } : { type: \"json_object\" }\n },\n ...(openaiOptions == null ? void 0 : openaiOptions.textVerbosity) && {\n verbosity: openaiOptions.textVerbosity\n }\n }\n },\n // provider options:\n conversation: openaiOptions == null ? void 0 : openaiOptions.conversation,\n max_tool_calls: openaiOptions == null ? void 0 : openaiOptions.maxToolCalls,\n metadata: openaiOptions == null ? void 0 : openaiOptions.metadata,\n parallel_tool_calls: openaiOptions == null ? void 0 : openaiOptions.parallelToolCalls,\n previous_response_id: openaiOptions == null ? void 0 : openaiOptions.previousResponseId,\n store,\n user: openaiOptions == null ? void 0 : openaiOptions.user,\n instructions: openaiOptions == null ? void 0 : openaiOptions.instructions,\n service_tier: openaiOptions == null ? void 0 : openaiOptions.serviceTier,\n include,\n prompt_cache_key: openaiOptions == null ? void 0 : openaiOptions.promptCacheKey,\n prompt_cache_retention: openaiOptions == null ? void 0 : openaiOptions.promptCacheRetention,\n safety_identifier: openaiOptions == null ? void 0 : openaiOptions.safetyIdentifier,\n top_logprobs: topLogprobs,\n truncation: openaiOptions == null ? void 0 : openaiOptions.truncation,\n // model-specific settings:\n ...isReasoningModel && ((openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) != null || (openaiOptions == null ? void 0 : openaiOptions.reasoningSummary) != null) && {\n reasoning: {\n ...(openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) != null && {\n effort: openaiOptions.reasoningEffort\n },\n ...(openaiOptions == null ? void 0 : openaiOptions.reasoningSummary) != null && {\n summary: openaiOptions.reasoningSummary\n }\n }\n }\n };\n if (isReasoningModel) {\n if (!((openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) === \"none\" && modelCapabilities.supportsNonReasoningParameters)) {\n if (baseArgs.temperature != null) {\n baseArgs.temperature = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"temperature\",\n details: \"temperature is not supported for reasoning models\"\n });\n }\n if (baseArgs.top_p != null) {\n baseArgs.top_p = void 0;\n warnings.push({\n type: \"unsupported\",\n feature: \"topP\",\n details: \"topP is not supported for reasoning models\"\n });\n }\n }\n } else {\n if ((openaiOptions == null ? void 0 : openaiOptions.reasoningEffort) != null) {\n warnings.push({\n type: \"unsupported\",\n feature: \"reasoningEffort\",\n details: \"reasoningEffort is not supported for non-reasoning models\"\n });\n }\n if ((openaiOptions == null ? void 0 : openaiOptions.reasoningSummary) != null) {\n warnings.push({\n type: \"unsupported\",\n feature: \"reasoningSummary\",\n details: \"reasoningSummary is not supported for non-reasoning models\"\n });\n }\n }\n if ((openaiOptions == null ? void 0 : openaiOptions.serviceTier) === \"flex\" && !modelCapabilities.supportsFlexProcessing) {\n warnings.push({\n type: \"unsupported\",\n feature: \"serviceTier\",\n details: \"flex processing is only available for o3, o4-mini, and gpt-5 models\"\n });\n delete baseArgs.service_tier;\n }\n if ((openaiOptions == null ? void 0 : openaiOptions.serviceTier) === \"priority\" && !modelCapabilities.supportsPriorityProcessing) {\n warnings.push({\n type: \"unsupported\",\n feature: \"serviceTier\",\n details: \"priority processing is only available for supported models (gpt-4, gpt-5, gpt-5-mini, o3, o4-mini) and requires Enterprise access. gpt-5-nano is not supported\"\n });\n delete baseArgs.service_tier;\n }\n const shellToolEnvType = (_i = (_h = (_g = tools == null ? void 0 : tools.find(\n (tool) => tool.type === \"provider\" && tool.id === \"openai.shell\"\n )) == null ? void 0 : _g.args) == null ? void 0 : _h.environment) == null ? void 0 : _i.type;\n const isShellProviderExecuted = shellToolEnvType === \"containerAuto\" || shellToolEnvType === \"containerReference\";\n return {\n webSearchToolName,\n args: {\n ...baseArgs,\n tools: openaiTools2,\n tool_choice: openaiToolChoice\n },\n warnings: [...warnings, ...toolWarnings],\n store,\n toolNameMapping,\n providerOptionsName,\n isShellProviderExecuted\n };\n }\n async doGenerate(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B;\n const {\n args: body,\n warnings,\n webSearchToolName,\n toolNameMapping,\n providerOptionsName,\n isShellProviderExecuted\n } = await this.getArgs(options);\n const url = this.config.url({\n path: \"/responses\",\n modelId: this.modelId\n });\n const approvalRequestIdToDummyToolCallIdFromPrompt = extractApprovalRequestIdToToolCallIdMapping(options.prompt);\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url,\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiResponsesResponseSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n if (response.error) {\n throw new _ai_sdk_provider__WEBPACK_IMPORTED_MODULE_2__.APICallError({\n message: response.error.message,\n url,\n requestBodyValues: body,\n statusCode: 400,\n responseHeaders,\n responseBody: rawResponse,\n isRetryable: false\n });\n }\n const content = [];\n const logprobs = [];\n let hasFunctionCall = false;\n const hostedToolSearchCallIds = [];\n for (const part of response.output) {\n switch (part.type) {\n case \"reasoning\": {\n if (part.summary.length === 0) {\n part.summary.push({ type: \"summary_text\", text: \"\" });\n }\n for (const summary of part.summary) {\n content.push({\n type: \"reasoning\",\n text: summary.text,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id,\n reasoningEncryptedContent: (_a = part.encrypted_content) != null ? _a : null\n }\n }\n });\n }\n break;\n }\n case \"image_generation_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"image_generation\"),\n input: \"{}\",\n providerExecuted: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"image_generation\"),\n result: {\n result: part.result\n }\n });\n break;\n }\n case \"tool_search_call\": {\n const toolCallId = (_b = part.call_id) != null ? _b : part.id;\n const isHosted = part.execution === \"server\";\n if (isHosted) {\n hostedToolSearchCallIds.push(toolCallId);\n }\n content.push({\n type: \"tool-call\",\n toolCallId,\n toolName: toolNameMapping.toCustomToolName(\"tool_search\"),\n input: JSON.stringify({\n arguments: part.arguments,\n call_id: part.call_id\n }),\n ...isHosted ? { providerExecuted: true } : {},\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"tool_search_output\": {\n const toolCallId = (_d = (_c = part.call_id) != null ? _c : hostedToolSearchCallIds.shift()) != null ? _d : part.id;\n content.push({\n type: \"tool-result\",\n toolCallId,\n toolName: toolNameMapping.toCustomToolName(\"tool_search\"),\n result: {\n tools: part.tools\n },\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"local_shell_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.call_id,\n toolName: toolNameMapping.toCustomToolName(\"local_shell\"),\n input: JSON.stringify({\n action: part.action\n }),\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"shell_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.call_id,\n toolName: toolNameMapping.toCustomToolName(\"shell\"),\n input: JSON.stringify({\n action: {\n commands: part.action.commands\n }\n }),\n ...isShellProviderExecuted && { providerExecuted: true },\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"shell_call_output\": {\n content.push({\n type: \"tool-result\",\n toolCallId: part.call_id,\n toolName: toolNameMapping.toCustomToolName(\"shell\"),\n result: {\n output: part.output.map((item) => ({\n stdout: item.stdout,\n stderr: item.stderr,\n outcome: item.outcome.type === \"exit\" ? {\n type: \"exit\",\n exitCode: item.outcome.exit_code\n } : { type: \"timeout\" }\n }))\n }\n });\n break;\n }\n case \"message\": {\n for (const contentPart of part.content) {\n if (((_f = (_e = options.providerOptions) == null ? void 0 : _e[providerOptionsName]) == null ? void 0 : _f.logprobs) && contentPart.logprobs) {\n logprobs.push(contentPart.logprobs);\n }\n const providerMetadata2 = {\n itemId: part.id,\n ...part.phase != null && { phase: part.phase },\n ...contentPart.annotations.length > 0 && {\n annotations: contentPart.annotations\n }\n };\n content.push({\n type: \"text\",\n text: contentPart.text,\n providerMetadata: {\n [providerOptionsName]: providerMetadata2\n }\n });\n for (const annotation of contentPart.annotations) {\n if (annotation.type === \"url_citation\") {\n content.push({\n type: \"source\",\n sourceType: \"url\",\n id: (_i = (_h = (_g = this.config).generateId) == null ? void 0 : _h.call(_g)) != null ? _i : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n url: annotation.url,\n title: annotation.title\n });\n } else if (annotation.type === \"file_citation\") {\n content.push({\n type: \"source\",\n sourceType: \"document\",\n id: (_l = (_k = (_j = this.config).generateId) == null ? void 0 : _k.call(_j)) != null ? _l : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"text/plain\",\n title: annotation.filename,\n filename: annotation.filename,\n providerMetadata: {\n [providerOptionsName]: {\n type: annotation.type,\n fileId: annotation.file_id,\n index: annotation.index\n }\n }\n });\n } else if (annotation.type === \"container_file_citation\") {\n content.push({\n type: \"source\",\n sourceType: \"document\",\n id: (_o = (_n = (_m = this.config).generateId) == null ? void 0 : _n.call(_m)) != null ? _o : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"text/plain\",\n title: annotation.filename,\n filename: annotation.filename,\n providerMetadata: {\n [providerOptionsName]: {\n type: annotation.type,\n fileId: annotation.file_id,\n containerId: annotation.container_id\n }\n }\n });\n } else if (annotation.type === \"file_path\") {\n content.push({\n type: \"source\",\n sourceType: \"document\",\n id: (_r = (_q = (_p = this.config).generateId) == null ? void 0 : _q.call(_p)) != null ? _r : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"application/octet-stream\",\n title: annotation.file_id,\n filename: annotation.file_id,\n providerMetadata: {\n [providerOptionsName]: {\n type: annotation.type,\n fileId: annotation.file_id,\n index: annotation.index\n }\n }\n });\n }\n }\n }\n break;\n }\n case \"function_call\": {\n hasFunctionCall = true;\n content.push({\n type: \"tool-call\",\n toolCallId: part.call_id,\n toolName: part.name,\n input: part.arguments,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"custom_tool_call\": {\n hasFunctionCall = true;\n const toolName = toolNameMapping.toCustomToolName(part.name);\n content.push({\n type: \"tool-call\",\n toolCallId: part.call_id,\n toolName,\n input: JSON.stringify(part.input),\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"web_search_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n input: JSON.stringify({}),\n providerExecuted: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n result: mapWebSearchOutput(part.action)\n });\n break;\n }\n case \"mcp_call\": {\n const toolCallId = part.approval_request_id != null ? (_s = approvalRequestIdToDummyToolCallIdFromPrompt[part.approval_request_id]) != null ? _s : part.id : part.id;\n const toolName = `mcp.${part.name}`;\n content.push({\n type: \"tool-call\",\n toolCallId,\n toolName,\n input: part.arguments,\n providerExecuted: true,\n dynamic: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId,\n toolName,\n result: {\n type: \"call\",\n serverLabel: part.server_label,\n name: part.name,\n arguments: part.arguments,\n ...part.output != null ? { output: part.output } : {},\n ...part.error != null ? { error: part.error } : {}\n },\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n case \"mcp_list_tools\": {\n break;\n }\n case \"mcp_approval_request\": {\n const approvalRequestId = (_t = part.approval_request_id) != null ? _t : part.id;\n const dummyToolCallId = (_w = (_v = (_u = this.config).generateId) == null ? void 0 : _v.call(_u)) != null ? _w : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)();\n const toolName = `mcp.${part.name}`;\n content.push({\n type: \"tool-call\",\n toolCallId: dummyToolCallId,\n toolName,\n input: part.arguments,\n providerExecuted: true,\n dynamic: true\n });\n content.push({\n type: \"tool-approval-request\",\n approvalId: approvalRequestId,\n toolCallId: dummyToolCallId\n });\n break;\n }\n case \"computer_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n input: \"\",\n providerExecuted: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n result: {\n type: \"computer_use_tool_result\",\n status: part.status || \"completed\"\n }\n });\n break;\n }\n case \"file_search_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"file_search\"),\n input: \"{}\",\n providerExecuted: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"file_search\"),\n result: {\n queries: part.queries,\n results: (_y = (_x = part.results) == null ? void 0 : _x.map((result) => ({\n attributes: result.attributes,\n fileId: result.file_id,\n filename: result.filename,\n score: result.score,\n text: result.text\n }))) != null ? _y : null\n }\n });\n break;\n }\n case \"code_interpreter_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n input: JSON.stringify({\n code: part.code,\n containerId: part.container_id\n }),\n providerExecuted: true\n });\n content.push({\n type: \"tool-result\",\n toolCallId: part.id,\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n result: {\n outputs: part.outputs\n }\n });\n break;\n }\n case \"apply_patch_call\": {\n content.push({\n type: \"tool-call\",\n toolCallId: part.call_id,\n toolName: toolNameMapping.toCustomToolName(\"apply_patch\"),\n input: JSON.stringify({\n callId: part.call_id,\n operation: part.operation\n }),\n providerMetadata: {\n [providerOptionsName]: {\n itemId: part.id\n }\n }\n });\n break;\n }\n }\n }\n const providerMetadata = {\n [providerOptionsName]: {\n responseId: response.id,\n ...logprobs.length > 0 ? { logprobs } : {},\n ...typeof response.service_tier === \"string\" ? { serviceTier: response.service_tier } : {}\n }\n };\n const usage = response.usage;\n return {\n content,\n finishReason: {\n unified: mapOpenAIResponseFinishReason({\n finishReason: (_z = response.incomplete_details) == null ? void 0 : _z.reason,\n hasFunctionCall\n }),\n raw: (_B = (_A = response.incomplete_details) == null ? void 0 : _A.reason) != null ? _B : void 0\n },\n usage: convertOpenAIResponsesUsage(usage),\n request: { body },\n response: {\n id: response.id,\n timestamp: new Date(response.created_at * 1e3),\n modelId: response.model,\n headers: responseHeaders,\n body: rawResponse\n },\n providerMetadata,\n warnings\n };\n }\n async doStream(options) {\n const {\n args: body,\n warnings,\n webSearchToolName,\n toolNameMapping,\n store,\n providerOptionsName,\n isShellProviderExecuted\n } = await this.getArgs(options);\n const { responseHeaders, value: response } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/responses\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body: {\n ...body,\n stream: true\n },\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createEventSourceResponseHandler)(\n openaiResponsesChunkSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n const self = this;\n const approvalRequestIdToDummyToolCallIdFromPrompt = extractApprovalRequestIdToToolCallIdMapping(options.prompt);\n const approvalRequestIdToDummyToolCallIdFromStream = /* @__PURE__ */ new Map();\n let finishReason = {\n unified: \"other\",\n raw: void 0\n };\n let usage = void 0;\n const logprobs = [];\n let responseId = null;\n const ongoingToolCalls = {};\n const ongoingAnnotations = [];\n let activeMessagePhase;\n let hasFunctionCall = false;\n const activeReasoning = {};\n let serviceTier;\n const hostedToolSearchCallIds = [];\n return {\n stream: response.pipeThrough(\n new TransformStream({\n start(controller) {\n controller.enqueue({ type: \"stream-start\", warnings });\n },\n transform(chunk, controller) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L;\n if (options.includeRawChunks) {\n controller.enqueue({ type: \"raw\", rawValue: chunk.rawValue });\n }\n if (!chunk.success) {\n finishReason = { unified: \"error\", raw: void 0 };\n controller.enqueue({ type: \"error\", error: chunk.error });\n return;\n }\n const value = chunk.value;\n if (isResponseOutputItemAddedChunk(value)) {\n if (value.item.type === \"function_call\") {\n ongoingToolCalls[value.output_index] = {\n toolName: value.item.name,\n toolCallId: value.item.call_id\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: value.item.call_id,\n toolName: value.item.name\n });\n } else if (value.item.type === \"custom_tool_call\") {\n const toolName = toolNameMapping.toCustomToolName(\n value.item.name\n );\n ongoingToolCalls[value.output_index] = {\n toolName,\n toolCallId: value.item.call_id\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: value.item.call_id,\n toolName\n });\n } else if (value.item.type === \"web_search_call\") {\n ongoingToolCalls[value.output_index] = {\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n toolCallId: value.item.id\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n providerExecuted: true\n });\n controller.enqueue({\n type: \"tool-input-end\",\n id: value.item.id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n input: JSON.stringify({}),\n providerExecuted: true\n });\n } else if (value.item.type === \"computer_call\") {\n ongoingToolCalls[value.output_index] = {\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n toolCallId: value.item.id\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n providerExecuted: true\n });\n } else if (value.item.type === \"code_interpreter_call\") {\n ongoingToolCalls[value.output_index] = {\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n toolCallId: value.item.id,\n codeInterpreter: {\n containerId: value.item.container_id\n }\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n providerExecuted: true\n });\n controller.enqueue({\n type: \"tool-input-delta\",\n id: value.item.id,\n delta: `{\"containerId\":\"${value.item.container_id}\",\"code\":\"`\n });\n } else if (value.item.type === \"file_search_call\") {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"file_search\"),\n input: \"{}\",\n providerExecuted: true\n });\n } else if (value.item.type === \"image_generation_call\") {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"image_generation\"),\n input: \"{}\",\n providerExecuted: true\n });\n } else if (value.item.type === \"tool_search_call\") {\n const toolCallId = value.item.id;\n const toolName = toolNameMapping.toCustomToolName(\"tool_search\");\n const isHosted = value.item.execution === \"server\";\n ongoingToolCalls[value.output_index] = {\n toolName,\n toolCallId,\n toolSearchExecution: (_a = value.item.execution) != null ? _a : \"server\"\n };\n if (isHosted) {\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName,\n providerExecuted: true\n });\n }\n } else if (value.item.type === \"tool_search_output\") {\n } else if (value.item.type === \"mcp_call\" || value.item.type === \"mcp_list_tools\" || value.item.type === \"mcp_approval_request\") {\n } else if (value.item.type === \"apply_patch_call\") {\n const { call_id: callId, operation } = value.item;\n ongoingToolCalls[value.output_index] = {\n toolName: toolNameMapping.toCustomToolName(\"apply_patch\"),\n toolCallId: callId,\n applyPatch: {\n // delete_file doesn't have diff\n hasDiff: operation.type === \"delete_file\",\n endEmitted: operation.type === \"delete_file\"\n }\n };\n controller.enqueue({\n type: \"tool-input-start\",\n id: callId,\n toolName: toolNameMapping.toCustomToolName(\"apply_patch\")\n });\n if (operation.type === \"delete_file\") {\n const inputString = JSON.stringify({\n callId,\n operation\n });\n controller.enqueue({\n type: \"tool-input-delta\",\n id: callId,\n delta: inputString\n });\n controller.enqueue({\n type: \"tool-input-end\",\n id: callId\n });\n } else {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: callId,\n delta: `{\"callId\":\"${escapeJSONDelta(callId)}\",\"operation\":{\"type\":\"${escapeJSONDelta(operation.type)}\",\"path\":\"${escapeJSONDelta(operation.path)}\",\"diff\":\"`\n });\n }\n } else if (value.item.type === \"shell_call\") {\n ongoingToolCalls[value.output_index] = {\n toolName: toolNameMapping.toCustomToolName(\"shell\"),\n toolCallId: value.item.call_id\n };\n } else if (value.item.type === \"shell_call_output\") {\n } else if (value.item.type === \"message\") {\n ongoingAnnotations.splice(0, ongoingAnnotations.length);\n activeMessagePhase = (_b = value.item.phase) != null ? _b : void 0;\n controller.enqueue({\n type: \"text-start\",\n id: value.item.id,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id,\n ...value.item.phase != null && {\n phase: value.item.phase\n }\n }\n }\n });\n } else if (isResponseOutputItemAddedChunk(value) && value.item.type === \"reasoning\") {\n activeReasoning[value.item.id] = {\n encryptedContent: value.item.encrypted_content,\n summaryParts: { 0: \"active\" }\n };\n controller.enqueue({\n type: \"reasoning-start\",\n id: `${value.item.id}:0`,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id,\n reasoningEncryptedContent: (_c = value.item.encrypted_content) != null ? _c : null\n }\n }\n });\n }\n } else if (isResponseOutputItemDoneChunk(value)) {\n if (value.item.type === \"message\") {\n const phase = (_d = value.item.phase) != null ? _d : activeMessagePhase;\n activeMessagePhase = void 0;\n controller.enqueue({\n type: \"text-end\",\n id: value.item.id,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id,\n ...phase != null && { phase },\n ...ongoingAnnotations.length > 0 && {\n annotations: ongoingAnnotations\n }\n }\n }\n });\n } else if (value.item.type === \"function_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n hasFunctionCall = true;\n controller.enqueue({\n type: \"tool-input-end\",\n id: value.item.call_id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.call_id,\n toolName: value.item.name,\n input: value.item.arguments,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n } else if (value.item.type === \"custom_tool_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n hasFunctionCall = true;\n const toolName = toolNameMapping.toCustomToolName(\n value.item.name\n );\n controller.enqueue({\n type: \"tool-input-end\",\n id: value.item.call_id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.call_id,\n toolName,\n input: JSON.stringify(value.item.input),\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n } else if (value.item.type === \"web_search_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\n webSearchToolName != null ? webSearchToolName : \"web_search\"\n ),\n result: mapWebSearchOutput(value.item.action)\n });\n } else if (value.item.type === \"computer_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-input-end\",\n id: value.item.id\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n input: \"\",\n providerExecuted: true\n });\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"computer_use\"),\n result: {\n type: \"computer_use_tool_result\",\n status: value.item.status || \"completed\"\n }\n });\n } else if (value.item.type === \"file_search_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"file_search\"),\n result: {\n queries: value.item.queries,\n results: (_f = (_e = value.item.results) == null ? void 0 : _e.map((result) => ({\n attributes: result.attributes,\n fileId: result.file_id,\n filename: result.filename,\n score: result.score,\n text: result.text\n }))) != null ? _f : null\n }\n });\n } else if (value.item.type === \"code_interpreter_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n result: {\n outputs: value.item.outputs\n }\n });\n } else if (value.item.type === \"image_generation_call\") {\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.id,\n toolName: toolNameMapping.toCustomToolName(\"image_generation\"),\n result: {\n result: value.item.result\n }\n });\n } else if (value.item.type === \"tool_search_call\") {\n const toolCall = ongoingToolCalls[value.output_index];\n const isHosted = value.item.execution === \"server\";\n if (toolCall != null) {\n const toolCallId = isHosted ? toolCall.toolCallId : (_g = value.item.call_id) != null ? _g : value.item.id;\n if (isHosted) {\n hostedToolSearchCallIds.push(toolCallId);\n } else {\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName: toolCall.toolName\n });\n }\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCallId\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId,\n toolName: toolCall.toolName,\n input: JSON.stringify({\n arguments: value.item.arguments,\n call_id: isHosted ? null : toolCallId\n }),\n ...isHosted ? { providerExecuted: true } : {},\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n }\n ongoingToolCalls[value.output_index] = void 0;\n } else if (value.item.type === \"tool_search_output\") {\n const toolCallId = (_i = (_h = value.item.call_id) != null ? _h : hostedToolSearchCallIds.shift()) != null ? _i : value.item.id;\n controller.enqueue({\n type: \"tool-result\",\n toolCallId,\n toolName: toolNameMapping.toCustomToolName(\"tool_search\"),\n result: {\n tools: value.item.tools\n },\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n } else if (value.item.type === \"mcp_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n const approvalRequestId = (_j = value.item.approval_request_id) != null ? _j : void 0;\n const aliasedToolCallId = approvalRequestId != null ? (_l = (_k = approvalRequestIdToDummyToolCallIdFromStream.get(\n approvalRequestId\n )) != null ? _k : approvalRequestIdToDummyToolCallIdFromPrompt[approvalRequestId]) != null ? _l : value.item.id : value.item.id;\n const toolName = `mcp.${value.item.name}`;\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: aliasedToolCallId,\n toolName,\n input: value.item.arguments,\n providerExecuted: true,\n dynamic: true\n });\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: aliasedToolCallId,\n toolName,\n result: {\n type: \"call\",\n serverLabel: value.item.server_label,\n name: value.item.name,\n arguments: value.item.arguments,\n ...value.item.output != null ? { output: value.item.output } : {},\n ...value.item.error != null ? { error: value.item.error } : {}\n },\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n } else if (value.item.type === \"mcp_list_tools\") {\n ongoingToolCalls[value.output_index] = void 0;\n } else if (value.item.type === \"apply_patch_call\") {\n const toolCall = ongoingToolCalls[value.output_index];\n if ((toolCall == null ? void 0 : toolCall.applyPatch) && !toolCall.applyPatch.endEmitted && value.item.operation.type !== \"delete_file\") {\n if (!toolCall.applyPatch.hasDiff) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: escapeJSONDelta(value.item.operation.diff)\n });\n }\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: '\"}}'\n });\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCall.toolCallId\n });\n toolCall.applyPatch.endEmitted = true;\n }\n if (toolCall && value.item.status === \"completed\") {\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolNameMapping.toCustomToolName(\"apply_patch\"),\n input: JSON.stringify({\n callId: value.item.call_id,\n operation: value.item.operation\n }),\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id\n }\n }\n });\n }\n ongoingToolCalls[value.output_index] = void 0;\n } else if (value.item.type === \"mcp_approval_request\") {\n ongoingToolCalls[value.output_index] = void 0;\n const dummyToolCallId = (_o = (_n = (_m = self.config).generateId) == null ? void 0 : _n.call(_m)) != null ? _o : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)();\n const approvalRequestId = (_p = value.item.approval_request_id) != null ? _p : value.item.id;\n approvalRequestIdToDummyToolCallIdFromStream.set(\n approvalRequestId,\n dummyToolCallId\n );\n const toolName = `mcp.${value.item.name}`;\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: dummyToolCallId,\n toolName,\n input: value.item.arguments,\n providerExecuted: true,\n dynamic: true\n });\n controller.enqueue({\n type: \"tool-approval-request\",\n approvalId: approvalRequestId,\n toolCallId: dummyToolCallId\n });\n } else if (value.item.type === \"local_shell_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.call_id,\n toolName: toolNameMapping.toCustomToolName(\"local_shell\"),\n input: JSON.stringify({\n action: {\n type: \"exec\",\n command: value.item.action.command,\n timeoutMs: value.item.action.timeout_ms,\n user: value.item.action.user,\n workingDirectory: value.item.action.working_directory,\n env: value.item.action.env\n }\n }),\n providerMetadata: {\n [providerOptionsName]: { itemId: value.item.id }\n }\n });\n } else if (value.item.type === \"shell_call\") {\n ongoingToolCalls[value.output_index] = void 0;\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: value.item.call_id,\n toolName: toolNameMapping.toCustomToolName(\"shell\"),\n input: JSON.stringify({\n action: {\n commands: value.item.action.commands\n }\n }),\n ...isShellProviderExecuted && {\n providerExecuted: true\n },\n providerMetadata: {\n [providerOptionsName]: { itemId: value.item.id }\n }\n });\n } else if (value.item.type === \"shell_call_output\") {\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item.call_id,\n toolName: toolNameMapping.toCustomToolName(\"shell\"),\n result: {\n output: value.item.output.map(\n (item) => ({\n stdout: item.stdout,\n stderr: item.stderr,\n outcome: item.outcome.type === \"exit\" ? {\n type: \"exit\",\n exitCode: item.outcome.exit_code\n } : { type: \"timeout\" }\n })\n )\n }\n });\n } else if (value.item.type === \"reasoning\") {\n const activeReasoningPart = activeReasoning[value.item.id];\n const summaryPartIndices = Object.entries(\n activeReasoningPart.summaryParts\n ).filter(\n ([_, status]) => status === \"active\" || status === \"can-conclude\"\n ).map(([summaryIndex]) => summaryIndex);\n for (const summaryIndex of summaryPartIndices) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: `${value.item.id}:${summaryIndex}`,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item.id,\n reasoningEncryptedContent: (_q = value.item.encrypted_content) != null ? _q : null\n }\n }\n });\n }\n delete activeReasoning[value.item.id];\n }\n } else if (isResponseFunctionCallArgumentsDeltaChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if (toolCall != null) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: value.delta\n });\n }\n } else if (isResponseCustomToolCallInputDeltaChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if (toolCall != null) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: value.delta\n });\n }\n } else if (isResponseApplyPatchCallOperationDiffDeltaChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if (toolCall == null ? void 0 : toolCall.applyPatch) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: escapeJSONDelta(value.delta)\n });\n toolCall.applyPatch.hasDiff = true;\n }\n } else if (isResponseApplyPatchCallOperationDiffDoneChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if ((toolCall == null ? void 0 : toolCall.applyPatch) && !toolCall.applyPatch.endEmitted) {\n if (!toolCall.applyPatch.hasDiff) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: escapeJSONDelta(value.diff)\n });\n toolCall.applyPatch.hasDiff = true;\n }\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: '\"}}'\n });\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCall.toolCallId\n });\n toolCall.applyPatch.endEmitted = true;\n }\n } else if (isResponseImageGenerationCallPartialImageChunk(value)) {\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: value.item_id,\n toolName: toolNameMapping.toCustomToolName(\"image_generation\"),\n result: {\n result: value.partial_image_b64\n },\n preliminary: true\n });\n } else if (isResponseCodeInterpreterCallCodeDeltaChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if (toolCall != null) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: escapeJSONDelta(value.delta)\n });\n }\n } else if (isResponseCodeInterpreterCallCodeDoneChunk(value)) {\n const toolCall = ongoingToolCalls[value.output_index];\n if (toolCall != null) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCall.toolCallId,\n delta: '\"}'\n });\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCall.toolCallId\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: toolCall.toolCallId,\n toolName: toolNameMapping.toCustomToolName(\"code_interpreter\"),\n input: JSON.stringify({\n code: value.code,\n containerId: toolCall.codeInterpreter.containerId\n }),\n providerExecuted: true\n });\n }\n } else if (isResponseCreatedChunk(value)) {\n responseId = value.response.id;\n controller.enqueue({\n type: \"response-metadata\",\n id: value.response.id,\n timestamp: new Date(value.response.created_at * 1e3),\n modelId: value.response.model\n });\n } else if (isTextDeltaChunk(value)) {\n controller.enqueue({\n type: \"text-delta\",\n id: value.item_id,\n delta: value.delta\n });\n if (((_s = (_r = options.providerOptions) == null ? void 0 : _r[providerOptionsName]) == null ? void 0 : _s.logprobs) && value.logprobs) {\n logprobs.push(value.logprobs);\n }\n } else if (value.type === \"response.reasoning_summary_part.added\") {\n if (value.summary_index > 0) {\n const activeReasoningPart = activeReasoning[value.item_id];\n activeReasoningPart.summaryParts[value.summary_index] = \"active\";\n for (const summaryIndex of Object.keys(\n activeReasoningPart.summaryParts\n )) {\n if (activeReasoningPart.summaryParts[summaryIndex] === \"can-conclude\") {\n controller.enqueue({\n type: \"reasoning-end\",\n id: `${value.item_id}:${summaryIndex}`,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item_id\n }\n }\n });\n activeReasoningPart.summaryParts[summaryIndex] = \"concluded\";\n }\n }\n controller.enqueue({\n type: \"reasoning-start\",\n id: `${value.item_id}:${value.summary_index}`,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item_id,\n reasoningEncryptedContent: (_u = (_t = activeReasoning[value.item_id]) == null ? void 0 : _t.encryptedContent) != null ? _u : null\n }\n }\n });\n }\n } else if (value.type === \"response.reasoning_summary_text.delta\") {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: `${value.item_id}:${value.summary_index}`,\n delta: value.delta,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item_id\n }\n }\n });\n } else if (value.type === \"response.reasoning_summary_part.done\") {\n if (store) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: `${value.item_id}:${value.summary_index}`,\n providerMetadata: {\n [providerOptionsName]: {\n itemId: value.item_id\n }\n }\n });\n activeReasoning[value.item_id].summaryParts[value.summary_index] = \"concluded\";\n } else {\n activeReasoning[value.item_id].summaryParts[value.summary_index] = \"can-conclude\";\n }\n } else if (isResponseFinishedChunk(value)) {\n finishReason = {\n unified: mapOpenAIResponseFinishReason({\n finishReason: (_v = value.response.incomplete_details) == null ? void 0 : _v.reason,\n hasFunctionCall\n }),\n raw: (_x = (_w = value.response.incomplete_details) == null ? void 0 : _w.reason) != null ? _x : void 0\n };\n usage = value.response.usage;\n if (typeof value.response.service_tier === \"string\") {\n serviceTier = value.response.service_tier;\n }\n } else if (isResponseFailedChunk(value)) {\n const incompleteReason = (_y = value.response.incomplete_details) == null ? void 0 : _y.reason;\n finishReason = {\n unified: incompleteReason ? mapOpenAIResponseFinishReason({\n finishReason: incompleteReason,\n hasFunctionCall\n }) : \"error\",\n raw: incompleteReason != null ? incompleteReason : \"error\"\n };\n usage = (_z = value.response.usage) != null ? _z : void 0;\n } else if (isResponseAnnotationAddedChunk(value)) {\n ongoingAnnotations.push(value.annotation);\n if (value.annotation.type === \"url_citation\") {\n controller.enqueue({\n type: \"source\",\n sourceType: \"url\",\n id: (_C = (_B = (_A = self.config).generateId) == null ? void 0 : _B.call(_A)) != null ? _C : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n url: value.annotation.url,\n title: value.annotation.title\n });\n } else if (value.annotation.type === \"file_citation\") {\n controller.enqueue({\n type: \"source\",\n sourceType: \"document\",\n id: (_F = (_E = (_D = self.config).generateId) == null ? void 0 : _E.call(_D)) != null ? _F : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"text/plain\",\n title: value.annotation.filename,\n filename: value.annotation.filename,\n providerMetadata: {\n [providerOptionsName]: {\n type: value.annotation.type,\n fileId: value.annotation.file_id,\n index: value.annotation.index\n }\n }\n });\n } else if (value.annotation.type === \"container_file_citation\") {\n controller.enqueue({\n type: \"source\",\n sourceType: \"document\",\n id: (_I = (_H = (_G = self.config).generateId) == null ? void 0 : _H.call(_G)) != null ? _I : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"text/plain\",\n title: value.annotation.filename,\n filename: value.annotation.filename,\n providerMetadata: {\n [providerOptionsName]: {\n type: value.annotation.type,\n fileId: value.annotation.file_id,\n containerId: value.annotation.container_id\n }\n }\n });\n } else if (value.annotation.type === \"file_path\") {\n controller.enqueue({\n type: \"source\",\n sourceType: \"document\",\n id: (_L = (_K = (_J = self.config).generateId) == null ? void 0 : _K.call(_J)) != null ? _L : (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.generateId)(),\n mediaType: \"application/octet-stream\",\n title: value.annotation.file_id,\n filename: value.annotation.file_id,\n providerMetadata: {\n [providerOptionsName]: {\n type: value.annotation.type,\n fileId: value.annotation.file_id,\n index: value.annotation.index\n }\n }\n });\n }\n } else if (isErrorChunk(value)) {\n controller.enqueue({ type: \"error\", error: value });\n }\n },\n flush(controller) {\n const providerMetadata = {\n [providerOptionsName]: {\n responseId,\n ...logprobs.length > 0 ? { logprobs } : {},\n ...serviceTier !== void 0 ? { serviceTier } : {}\n }\n };\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage: convertOpenAIResponsesUsage(usage),\n providerMetadata\n });\n }\n })\n ),\n request: { body },\n response: { headers: responseHeaders }\n };\n }\n};\nfunction isTextDeltaChunk(chunk) {\n return chunk.type === \"response.output_text.delta\";\n}\nfunction isResponseOutputItemDoneChunk(chunk) {\n return chunk.type === \"response.output_item.done\";\n}\nfunction isResponseFinishedChunk(chunk) {\n return chunk.type === \"response.completed\" || chunk.type === \"response.incomplete\";\n}\nfunction isResponseFailedChunk(chunk) {\n return chunk.type === \"response.failed\";\n}\nfunction isResponseCreatedChunk(chunk) {\n return chunk.type === \"response.created\";\n}\nfunction isResponseFunctionCallArgumentsDeltaChunk(chunk) {\n return chunk.type === \"response.function_call_arguments.delta\";\n}\nfunction isResponseCustomToolCallInputDeltaChunk(chunk) {\n return chunk.type === \"response.custom_tool_call_input.delta\";\n}\nfunction isResponseImageGenerationCallPartialImageChunk(chunk) {\n return chunk.type === \"response.image_generation_call.partial_image\";\n}\nfunction isResponseCodeInterpreterCallCodeDeltaChunk(chunk) {\n return chunk.type === \"response.code_interpreter_call_code.delta\";\n}\nfunction isResponseCodeInterpreterCallCodeDoneChunk(chunk) {\n return chunk.type === \"response.code_interpreter_call_code.done\";\n}\nfunction isResponseApplyPatchCallOperationDiffDeltaChunk(chunk) {\n return chunk.type === \"response.apply_patch_call_operation_diff.delta\";\n}\nfunction isResponseApplyPatchCallOperationDiffDoneChunk(chunk) {\n return chunk.type === \"response.apply_patch_call_operation_diff.done\";\n}\nfunction isResponseOutputItemAddedChunk(chunk) {\n return chunk.type === \"response.output_item.added\";\n}\nfunction isResponseAnnotationAddedChunk(chunk) {\n return chunk.type === \"response.output_text.annotation.added\";\n}\nfunction isErrorChunk(chunk) {\n return chunk.type === \"error\";\n}\nfunction mapWebSearchOutput(action) {\n var _a;\n if (action == null) {\n return {};\n }\n switch (action.type) {\n case \"search\":\n return {\n action: { type: \"search\", query: (_a = action.query) != null ? _a : void 0 },\n // include sources when provided by the Responses API (behind include flag)\n ...action.sources != null && { sources: action.sources }\n };\n case \"open_page\":\n return { action: { type: \"openPage\", url: action.url } };\n case \"find_in_page\":\n return {\n action: {\n type: \"findInPage\",\n url: action.url,\n pattern: action.pattern\n }\n };\n }\n}\nfunction escapeJSONDelta(delta) {\n return JSON.stringify(delta).slice(1, -1);\n}\n\n// src/speech/openai-speech-model.ts\n\n\n// src/speech/openai-speech-options.ts\n\n\nvar openaiSpeechModelOptionsSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n instructions: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n speed: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().min(0.25).max(4).default(1).nullish()\n })\n )\n);\n\n// src/speech/openai-speech-model.ts\nvar OpenAISpeechModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs({\n text,\n voice = \"alloy\",\n outputFormat = \"mp3\",\n speed,\n instructions,\n language,\n providerOptions\n }) {\n const warnings = [];\n const openAIOptions = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openaiSpeechModelOptionsSchema\n });\n const requestBody = {\n model: this.modelId,\n input: text,\n voice,\n response_format: \"mp3\",\n speed,\n instructions\n };\n if (outputFormat) {\n if ([\"mp3\", \"opus\", \"aac\", \"flac\", \"wav\", \"pcm\"].includes(outputFormat)) {\n requestBody.response_format = outputFormat;\n } else {\n warnings.push({\n type: \"unsupported\",\n feature: \"outputFormat\",\n details: `Unsupported output format: ${outputFormat}. Using mp3 instead.`\n });\n }\n }\n if (openAIOptions) {\n const speechModelOptions = {};\n for (const key in speechModelOptions) {\n const value = speechModelOptions[key];\n if (value !== void 0) {\n requestBody[key] = value;\n }\n }\n }\n if (language) {\n warnings.push({\n type: \"unsupported\",\n feature: \"language\",\n details: `OpenAI speech models do not support language selection. Language parameter \"${language}\" was ignored.`\n });\n }\n return {\n requestBody,\n warnings\n };\n }\n async doGenerate(options) {\n var _a, _b, _c;\n const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();\n const { requestBody, warnings } = await this.getArgs(options);\n const {\n value: audio,\n responseHeaders,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postJsonToApi)({\n url: this.config.url({\n path: \"/audio/speech\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n body: requestBody,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createBinaryResponseHandler)(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n return {\n audio,\n warnings,\n request: {\n body: JSON.stringify(requestBody)\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse\n }\n };\n }\n};\n\n// src/transcription/openai-transcription-model.ts\n\n\n// src/transcription/openai-transcription-api.ts\n\n\nvar openaiTranscriptionResponseSchema = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n language: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().nullish(),\n duration: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().nullish(),\n words: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n word: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n start: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ).nullish(),\n segments: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n id: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n seek: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n start: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n end: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n text: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string(),\n tokens: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()),\n temperature: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n avg_logprob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n compression_ratio: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number(),\n no_speech_prob: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number()\n })\n ).nullish()\n })\n )\n);\n\n// src/transcription/openai-transcription-options.ts\n\n\nvar openAITranscriptionModelOptions = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.lazySchema)(\n () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.zodSchema)(\n zod_v4__WEBPACK_IMPORTED_MODULE_0__.object({\n /**\n * Additional information to include in the transcription response.\n */\n include: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__.string()).optional(),\n /**\n * The language of the input audio in ISO-639-1 format.\n */\n language: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * An optional text to guide the model's style or continue a previous audio segment.\n */\n prompt: zod_v4__WEBPACK_IMPORTED_MODULE_0__.string().optional(),\n /**\n * The sampling temperature, between 0 and 1.\n * @default 0\n */\n temperature: zod_v4__WEBPACK_IMPORTED_MODULE_0__.number().min(0).max(1).default(0).optional(),\n /**\n * The timestamp granularities to populate for this transcription.\n * @default ['segment']\n */\n timestampGranularities: zod_v4__WEBPACK_IMPORTED_MODULE_0__.array(zod_v4__WEBPACK_IMPORTED_MODULE_0__[\"enum\"]([\"word\", \"segment\"])).default([\"segment\"]).optional()\n })\n )\n);\n\n// src/transcription/openai-transcription-model.ts\nvar languageMap = {\n afrikaans: \"af\",\n arabic: \"ar\",\n armenian: \"hy\",\n azerbaijani: \"az\",\n belarusian: \"be\",\n bosnian: \"bs\",\n bulgarian: \"bg\",\n catalan: \"ca\",\n chinese: \"zh\",\n croatian: \"hr\",\n czech: \"cs\",\n danish: \"da\",\n dutch: \"nl\",\n english: \"en\",\n estonian: \"et\",\n finnish: \"fi\",\n french: \"fr\",\n galician: \"gl\",\n german: \"de\",\n greek: \"el\",\n hebrew: \"he\",\n hindi: \"hi\",\n hungarian: \"hu\",\n icelandic: \"is\",\n indonesian: \"id\",\n italian: \"it\",\n japanese: \"ja\",\n kannada: \"kn\",\n kazakh: \"kk\",\n korean: \"ko\",\n latvian: \"lv\",\n lithuanian: \"lt\",\n macedonian: \"mk\",\n malay: \"ms\",\n marathi: \"mr\",\n maori: \"mi\",\n nepali: \"ne\",\n norwegian: \"no\",\n persian: \"fa\",\n polish: \"pl\",\n portuguese: \"pt\",\n romanian: \"ro\",\n russian: \"ru\",\n serbian: \"sr\",\n slovak: \"sk\",\n slovenian: \"sl\",\n spanish: \"es\",\n swahili: \"sw\",\n swedish: \"sv\",\n tagalog: \"tl\",\n tamil: \"ta\",\n thai: \"th\",\n turkish: \"tr\",\n ukrainian: \"uk\",\n urdu: \"ur\",\n vietnamese: \"vi\",\n welsh: \"cy\"\n};\nvar OpenAITranscriptionModel = class {\n constructor(modelId, config) {\n this.modelId = modelId;\n this.config = config;\n this.specificationVersion = \"v3\";\n }\n get provider() {\n return this.config.provider;\n }\n async getArgs({\n audio,\n mediaType,\n providerOptions\n }) {\n const warnings = [];\n const openAIOptions = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.parseProviderOptions)({\n provider: \"openai\",\n providerOptions,\n schema: openAITranscriptionModelOptions\n });\n const formData = new FormData();\n const blob = audio instanceof Uint8Array ? new Blob([audio]) : new Blob([(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.convertBase64ToUint8Array)(audio)]);\n formData.append(\"model\", this.modelId);\n const fileExtension = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.mediaTypeToExtension)(mediaType);\n formData.append(\n \"file\",\n new File([blob], \"audio\", { type: mediaType }),\n `audio.${fileExtension}`\n );\n if (openAIOptions) {\n const transcriptionModelOptions = {\n include: openAIOptions.include,\n language: openAIOptions.language,\n prompt: openAIOptions.prompt,\n // https://platform.openai.com/docs/api-reference/audio/createTranscription#audio_createtranscription-response_format\n // prefer verbose_json to get segments for models that support it\n response_format: [\n \"gpt-4o-transcribe\",\n \"gpt-4o-mini-transcribe\"\n ].includes(this.modelId) ? \"json\" : \"verbose_json\",\n temperature: openAIOptions.temperature,\n timestamp_granularities: openAIOptions.timestampGranularities\n };\n for (const [key, value] of Object.entries(transcriptionModelOptions)) {\n if (value != null) {\n if (Array.isArray(value)) {\n for (const item of value) {\n formData.append(`${key}[]`, String(item));\n }\n } else {\n formData.append(key, String(value));\n }\n }\n }\n }\n return {\n formData,\n warnings\n };\n }\n async doGenerate(options) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();\n const { formData, warnings } = await this.getArgs(options);\n const {\n value: response,\n responseHeaders,\n rawValue: rawResponse\n } = await (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.postFormDataToApi)({\n url: this.config.url({\n path: \"/audio/transcriptions\",\n modelId: this.modelId\n }),\n headers: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.combineHeaders)(this.config.headers(), options.headers),\n formData,\n failedResponseHandler: openaiFailedResponseHandler,\n successfulResponseHandler: (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.createJsonResponseHandler)(\n openaiTranscriptionResponseSchema\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n const language = response.language != null && response.language in languageMap ? languageMap[response.language] : void 0;\n return {\n text: response.text,\n segments: (_g = (_f = (_d = response.segments) == null ? void 0 : _d.map((segment) => ({\n text: segment.text,\n startSecond: segment.start,\n endSecond: segment.end\n }))) != null ? _f : (_e = response.words) == null ? void 0 : _e.map((word) => ({\n text: word.word,\n startSecond: word.start,\n endSecond: word.end\n }))) != null ? _g : [],\n language,\n durationInSeconds: (_h = response.duration) != null ? _h : void 0,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse\n }\n };\n }\n};\n\n// src/version.ts\nvar VERSION = true ? \"3.0.49\" : 0;\n\n// src/openai-provider.ts\nfunction createOpenAI(options = {}) {\n var _a, _b;\n const baseURL = (_a = (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.withoutTrailingSlash)(\n (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.loadOptionalSetting)({\n settingValue: options.baseURL,\n environmentVariableName: \"OPENAI_BASE_URL\"\n })\n )) != null ? _a : \"https://api.openai.com/v1\";\n const providerName = (_b = options.name) != null ? _b : \"openai\";\n const getHeaders = () => (0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.withUserAgentSuffix)(\n {\n Authorization: `Bearer ${(0,_ai_sdk_provider_utils__WEBPACK_IMPORTED_MODULE_1__.loadApiKey)({\n apiKey: options.apiKey,\n environmentVariableName: \"OPENAI_API_KEY\",\n description: \"OpenAI\"\n })}`,\n \"OpenAI-Organization\": options.organization,\n \"OpenAI-Project\": options.project,\n ...options.headers\n },\n `ai-sdk/openai/${VERSION}`\n );\n const createChatModel = (modelId) => new OpenAIChatLanguageModel(modelId, {\n provider: `${providerName}.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createCompletionModel = (modelId) => new OpenAICompletionLanguageModel(modelId, {\n provider: `${providerName}.completion`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createEmbeddingModel = (modelId) => new OpenAIEmbeddingModel(modelId, {\n provider: `${providerName}.embedding`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createImageModel = (modelId) => new OpenAIImageModel(modelId, {\n provider: `${providerName}.image`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createTranscriptionModel = (modelId) => new OpenAITranscriptionModel(modelId, {\n provider: `${providerName}.transcription`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createSpeechModel = (modelId) => new OpenAISpeechModel(modelId, {\n provider: `${providerName}.speech`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch\n });\n const createLanguageModel = (modelId) => {\n if (new.target) {\n throw new Error(\n \"The OpenAI model function cannot be called with the new keyword.\"\n );\n }\n return createResponsesModel(modelId);\n };\n const createResponsesModel = (modelId) => {\n return new OpenAIResponsesLanguageModel(modelId, {\n provider: `${providerName}.responses`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n fileIdPrefixes: [\"file-\"]\n });\n };\n const provider = function(modelId) {\n return createLanguageModel(modelId);\n };\n provider.specificationVersion = \"v3\";\n provider.languageModel = createLanguageModel;\n provider.chat = createChatModel;\n provider.completion = createCompletionModel;\n provider.responses = createResponsesModel;\n provider.embedding = createEmbeddingModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbedding = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n provider.tools = openaiTools;\n return provider;\n}\nvar openai = createOpenAI();\n\n//# sourceMappingURL=index.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvLnBucG0vQGFpLXNkaytvcGVuYWlAMy4wLjQ5X3pvZEAzLjI1Ljc2L25vZGVfbW9kdWxlcy9AYWktc2RrL29wZW5haS9kaXN0L2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFNZ0M7O0FBRWhDO0FBRzBCO0FBU007O0FBRWhDO0FBQzJCO0FBQzZDO0FBQ3hFLDRCQUE0QiwwQ0FBUTtBQUNwQyxTQUFTLDBDQUFRO0FBQ2pCLGFBQWEsMENBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0EsVUFBVSwwQ0FBUTtBQUNsQixXQUFXLHVDQUFLO0FBQ2hCLFVBQVUseUNBQU8sRUFBRSwwQ0FBUSxJQUFJLDBDQUFRO0FBQ3ZDLEdBQUc7QUFDSCxDQUFDO0FBQ0Qsa0NBQWtDLHNGQUE4QjtBQUNoRTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBRzBCO0FBQytCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qix5QkFBeUI7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDRCQUE0QjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFD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OUIsWUFBWSxNQUFNLFFBQVEsUUFBUSxFQUFFLEtBQUs7QUFDekM7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGlCQUFpQixhQUFhO0FBQzlCLFlBQVksTUFBTSxRQUFRLFFBQVEsRUFBRSxLQUFLO0FBQ3pDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxpQkFBaUIsYUFBYTtBQUM5QixZQUFZLE1BQU0sUUFBUSxRQUFRLEVBQUUsS0FBSztBQUN6QztBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGFBQWE7QUFDaEMsY0FBYyxNQUFNLFFBQVEsUUFBUSxFQUFFLEtBQUs7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLRTtBQUNGIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL0BhaS1zZGsrb3BlbmFpQDMuMC40OV96b2RAMy4yNS43Ni9ub2RlX21vZHVsZXMvQGFpLXNkay9vcGVuYWkvZGlzdC9pbmRleC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL29wZW5haS1wcm92aWRlci50c1xuaW1wb3J0IHtcbiAgbG9hZEFwaUtleSxcbiAgbG9hZE9wdGlvbmFsU2V0dGluZyxcbiAgd2l0aG91dFRyYWlsaW5nU2xhc2gsXG4gIHdpdGhVc2VyQWdlbnRTdWZmaXhcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL2NoYXQvb3BlbmFpLWNoYXQtbGFuZ3VhZ2UtbW9kZWwudHNcbmltcG9ydCB7XG4gIEludmFsaWRSZXNwb25zZURhdGFFcnJvclxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xuaW1wb3J0IHtcbiAgY29tYmluZUhlYWRlcnMsXG4gIGNyZWF0ZUV2ZW50U291cmNlUmVzcG9uc2VIYW5kbGVyLFxuICBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyLFxuICBnZW5lcmF0ZUlkLFxuICBpc1BhcnNhYmxlSnNvbixcbiAgcGFyc2VQcm92aWRlck9wdGlvbnMsXG4gIHBvc3RKc29uVG9BcGlcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL29wZW5haS1lcnJvci50c1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2QvdjRcIjtcbmltcG9ydCB7IGNyZWF0ZUpzb25FcnJvclJlc3BvbnNlSGFuZGxlciB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG52YXIgb3BlbmFpRXJyb3JEYXRhU2NoZW1hID0gei5vYmplY3Qoe1xuICBlcnJvcjogei5vYmplY3Qoe1xuICAgIG1lc3NhZ2U6IHouc3RyaW5nKCksXG4gICAgLy8gVGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYmVsb3cgaXMgaGFuZGxlZCBsb29zZWx5IHRvIHN1cHBvcnRcbiAgICAvLyBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlcnMgdGhhdCBoYXZlIHNsaWdodGx5IGRpZmZlcmVudCBlcnJvclxuICAgIC8vIHJlc3BvbnNlczpcbiAgICB0eXBlOiB6LnN0cmluZygpLm51bGxpc2goKSxcbiAgICBwYXJhbTogei5hbnkoKS5udWxsaXNoKCksXG4gICAgY29kZTogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLm51bGxpc2goKVxuICB9KVxufSk7XG52YXIgb3BlbmFpRmFpbGVkUmVzcG9uc2VIYW5kbGVyID0gY3JlYXRlSnNvbkVycm9yUmVzcG9uc2VIYW5kbGVyKHtcbiAgZXJyb3JTY2hlbWE6IG9wZW5haUVycm9yRGF0YVNjaGVtYSxcbiAgZXJyb3JUb01lc3NhZ2U6IChkYXRhKSA9PiBkYXRhLmVycm9yLm1lc3NhZ2Vcbn0pO1xuXG4vLyBzcmMvb3BlbmFpLWxhbmd1YWdlLW1vZGVsLWNhcGFiaWxpdGllcy50c1xuZnVuY3Rpb24gZ2V0T3BlbkFJTGFuZ3VhZ2VNb2RlbENhcGFiaWxpdGllcyhtb2RlbElkKSB7XG4gIGNvbnN0IHN1cHBvcnRzRmxleFByb2Nlc3NpbmcgPSBtb2RlbElkLnN0YXJ0c1dpdGgoXCJvM1wiKSB8fCBtb2RlbElkLnN0YXJ0c1dpdGgoXCJvNC1taW5pXCIpIHx8IG1vZGVsSWQuc3RhcnRzV2l0aChcImdwdC01XCIpICYmICFtb2RlbElkLnN0YXJ0c1dpdGgoXCJncHQtNS1jaGF0XCIpO1xuICBjb25zdCBzdXBwb3J0c1ByaW9yaXR5UHJvY2Vzc2luZyA9IG1vZGVsSWQuc3RhcnRzV2l0aChcImdwdC00XCIpIHx8IG1vZGVsSWQuc3RhcnRzV2l0aChcImdwdC01XCIpICYmICFtb2RlbElkLnN0YXJ0c1dpdGgoXCJncHQtNS1uYW5vXCIpICYmICFtb2RlbElkLnN0YXJ0c1dpdGgoXCJncHQtNS1jaGF0XCIpICYmICFtb2RlbElkLnN0YXJ0c1dpdGgoXCJncHQtNS40LW5hbm9cIikgfHwgbW9kZWxJZC5zdGFydHNXaXRoKFwibzNcIikgfHwgbW9kZWxJZC5zdGFydHNXaXRoKFwibzQtbWluaVwiKTtcbiAgY29uc3QgaXNSZWFzb25pbmdNb2RlbCA9IG1vZGVsSWQuc3RhcnRzV2l0aChcIm8xXCIpIHx8IG1vZGVsSWQuc3RhcnRzV2l0aChcIm8zXCIpIHx8IG1vZGVsSWQuc3RhcnRzV2l0aChcIm80LW1pbmlcIikgfHwgbW9kZWxJZC5zdGFydHNXaXRoKFwiZ3B0LTVcIikgJiYgIW1vZGVsSWQuc3RhcnRzV2l0aChcImdwdC01LWNoYXRcIik7XG4gIGNvbnN0IHN1cHBvcnRzTm9uUmVhc29uaW5nUGFyYW1ldGVycyA9IG1vZGVsSWQuc3RhcnRzV2l0aChcImdwdC01LjFcIikgfHwgbW9kZWxJZC5zdGFydHNXaXRoKFwiZ3B0LTUuMlwiKSB8fCBtb2RlbElkLnN0YXJ0c1dpdGgoXCJncHQtNS4zXCIpIHx8IG1vZGVsSWQuc3RhcnRzV2l0aChcImdwdC01LjRcIik7XG4gIGNvbnN0IHN5c3RlbU1lc3NhZ2VNb2RlID0gaXNSZWFzb25pbmdNb2RlbCA/IFwiZGV2ZWxvcGVyXCIgOiBcInN5c3RlbVwiO1xuICByZXR1cm4ge1xuICAgIHN1cHBvcnRzRmxleFByb2Nlc3NpbmcsXG4gICAgc3VwcG9ydHNQcmlvcml0eVByb2Nlc3NpbmcsXG4gICAgaXNSZWFzb25pbmdNb2RlbCxcbiAgICBzeXN0ZW1NZXNzYWdlTW9kZSxcbiAgICBzdXBwb3J0c05vblJlYXNvbmluZ1BhcmFtZXRlcnNcbiAgfTtcbn1cblxuLy8gc3JjL2NoYXQvY29udmVydC1vcGVuYWktY2hhdC11c2FnZS50c1xuZnVuY3Rpb24gY29udmVydE9wZW5BSUNoYXRVc2FnZSh1c2FnZSkge1xuICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZjtcbiAgaWYgKHVzYWdlID09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRUb2tlbnM6IHtcbiAgICAgICAgdG90YWw6IHZvaWQgMCxcbiAgICAgICAgbm9DYWNoZTogdm9pZCAwLFxuICAgICAgICBjYWNoZVJlYWQ6IHZvaWQgMCxcbiAgICAgICAgY2FjaGVXcml0ZTogdm9pZCAwXG4gICAgICB9LFxuICAgICAgb3V0cHV0VG9rZW5zOiB7XG4gICAgICAgIHRvdGFsOiB2b2lkIDAsXG4gICAgICAgIHRleHQ6IHZvaWQgMCxcbiAgICAgICAgcmVhc29uaW5nOiB2b2lkIDBcbiAgICAgIH0sXG4gICAgICByYXc6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgY29uc3QgcHJvbXB0VG9rZW5zID0gKF9hID0gdXNhZ2UucHJvbXB0X3Rva2VucykgIT0gbnVsbCA/IF9hIDogMDtcbiAgY29uc3QgY29tcGxldGlvblRva2VucyA9IChfYiA9IHVzYWdlLmNvbXBsZXRpb25fdG9rZW5zKSAhPSBudWxsID8gX2IgOiAwO1xuICBjb25zdCBjYWNoZWRUb2tlbnMgPSAoX2QgPSAoX2MgPSB1c2FnZS5wcm9tcHRfdG9rZW5zX2RldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfYy5jYWNoZWRfdG9rZW5zKSAhPSBudWxsID8gX2QgOiAwO1xuICBjb25zdCByZWFzb25pbmdUb2tlbnMgPSAoX2YgPSAoX2UgPSB1c2FnZS5jb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2UucmVhc29uaW5nX3Rva2VucykgIT0gbnVsbCA/IF9mIDogMDtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dFRva2Vuczoge1xuICAgICAgdG90YWw6IHByb21wdFRva2VucyxcbiAgICAgIG5vQ2FjaGU6IHByb21wdFRva2VucyAtIGNhY2hlZFRva2VucyxcbiAgICAgIGNhY2hlUmVhZDogY2FjaGVkVG9rZW5zLFxuICAgICAgY2FjaGVXcml0ZTogdm9pZCAwXG4gICAgfSxcbiAgICBvdXRwdXRUb2tlbnM6IHtcbiAgICAgIHRvdGFsOiBjb21wbGV0aW9uVG9rZW5zLFxuICAgICAgdGV4dDogY29tcGxldGlvblRva2VucyAtIHJlYXNvbmluZ1Rva2VucyxcbiAgICAgIHJlYXNvbmluZzogcmVhc29uaW5nVG9rZW5zXG4gICAgfSxcbiAgICByYXc6IHVzYWdlXG4gIH07XG59XG5cbi8vIHNyYy9jaGF0L2NvbnZlcnQtdG8tb3BlbmFpLWNoYXQtbWVzc2FnZXMudHNcbmltcG9ydCB7XG4gIFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0VG9CYXNlNjQgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuZnVuY3Rpb24gY29udmVydFRvT3BlbkFJQ2hhdE1lc3NhZ2VzKHtcbiAgcHJvbXB0LFxuICBzeXN0ZW1NZXNzYWdlTW9kZSA9IFwic3lzdGVtXCJcbn0pIHtcbiAgdmFyIF9hO1xuICBjb25zdCBtZXNzYWdlcyA9IFtdO1xuICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICBmb3IgKGNvbnN0IHsgcm9sZSwgY29udGVudCB9IG9mIHByb21wdCkge1xuICAgIHN3aXRjaCAocm9sZSkge1xuICAgICAgY2FzZSBcInN5c3RlbVwiOiB7XG4gICAgICAgIHN3aXRjaCAoc3lzdGVtTWVzc2FnZU1vZGUpIHtcbiAgICAgICAgICBjYXNlIFwic3lzdGVtXCI6IHtcbiAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50IH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJkZXZlbG9wZXJcIjoge1xuICAgICAgICAgICAgbWVzc2FnZXMucHVzaCh7IHJvbGU6IFwiZGV2ZWxvcGVyXCIsIGNvbnRlbnQgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBcInN5c3RlbSBtZXNzYWdlcyBhcmUgcmVtb3ZlZCBmb3IgdGhpcyBtb2RlbFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gc3lzdGVtTWVzc2FnZU1vZGU7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBzeXN0ZW0gbWVzc2FnZSBtb2RlOiAke19leGhhdXN0aXZlQ2hlY2t9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidXNlclwiOiB7XG4gICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMSAmJiBjb250ZW50WzBdLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgICAgbWVzc2FnZXMucHVzaCh7IHJvbGU6IFwidXNlclwiLCBjb250ZW50OiBjb250ZW50WzBdLnRleHQgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgcm9sZTogXCJ1c2VyXCIsXG4gICAgICAgICAgY29udGVudDogY29udGVudC5tYXAoKHBhcnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EyLCBfYiwgX2M7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcnQudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHBhcnQudGV4dCB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJmaWxlXCI6IHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC5tZWRpYVR5cGUuc3RhcnRzV2l0aChcImltYWdlL1wiKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gcGFydC5tZWRpYVR5cGUgPT09IFwiaW1hZ2UvKlwiID8gXCJpbWFnZS9qcGVnXCIgOiBwYXJ0Lm1lZGlhVHlwZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW1hZ2VfdXJsXCIsXG4gICAgICAgICAgICAgICAgICAgIGltYWdlX3VybDoge1xuICAgICAgICAgICAgICAgICAgICAgIHVybDogcGFydC5kYXRhIGluc3RhbmNlb2YgVVJMID8gcGFydC5kYXRhLnRvU3RyaW5nKCkgOiBgZGF0YToke21lZGlhVHlwZX07YmFzZTY0LCR7Y29udmVydFRvQmFzZTY0KHBhcnQuZGF0YSl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuQUkgc3BlY2lmaWMgZXh0ZW5zaW9uOiBpbWFnZSBkZXRhaWxcbiAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IChfYiA9IChfYTIgPSBwYXJ0LnByb3ZpZGVyT3B0aW9ucykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5vcGVuYWkpID09IG51bGwgPyB2b2lkIDAgOiBfYi5pbWFnZURldGFpbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5tZWRpYVR5cGUuc3RhcnRzV2l0aChcImF1ZGlvL1wiKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHBhcnQuZGF0YSBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHk6IFwiYXVkaW8gZmlsZSBwYXJ0cyB3aXRoIFVSTHNcIlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGFydC5tZWRpYVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImF1ZGlvL3dhdlwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5wdXRfYXVkaW9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2F1ZGlvOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGNvbnZlcnRUb0Jhc2U2NChwYXJ0LmRhdGEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFwid2F2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhdWRpby9tcDNcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImF1ZGlvL21wZWdcIjoge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlucHV0X2F1ZGlvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9hdWRpbzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjb252ZXJ0VG9CYXNlNjQocGFydC5kYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBcIm1wM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHk6IGBhdWRpbyBjb250ZW50IHBhcnRzIHdpdGggbWVkaWEgdHlwZSAke3BhcnQubWVkaWFUeXBlfWBcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5tZWRpYVR5cGUgPT09IFwiYXBwbGljYXRpb24vcGRmXCIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LmRhdGEgaW5zdGFuY2VvZiBVUkwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbmFsaXR5OiBcIlBERiBmaWxlIHBhcnRzIHdpdGggVVJMc1wiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IHR5cGVvZiBwYXJ0LmRhdGEgPT09IFwic3RyaW5nXCIgJiYgcGFydC5kYXRhLnN0YXJ0c1dpdGgoXCJmaWxlLVwiKSA/IHsgZmlsZV9pZDogcGFydC5kYXRhIH0gOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IChfYyA9IHBhcnQuZmlsZW5hbWUpICE9IG51bGwgPyBfYyA6IGBwYXJ0LSR7aW5kZXh9LnBkZmAsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZV9kYXRhOiBgZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LCR7Y29udmVydFRvQmFzZTY0KHBhcnQuZGF0YSl9YFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbmFsaXR5OiBgZmlsZSBwYXJ0IG1lZGlhIHR5cGUgJHtwYXJ0Lm1lZGlhVHlwZX1gXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXNzaXN0YW50XCI6IHtcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBjb25zdCB0b29sQ2FsbHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGNvbnRlbnQpIHtcbiAgICAgICAgICBzd2l0Y2ggKHBhcnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInRleHRcIjoge1xuICAgICAgICAgICAgICB0ZXh0ICs9IHBhcnQudGV4dDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidG9vbC1jYWxsXCI6IHtcbiAgICAgICAgICAgICAgdG9vbENhbGxzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBwYXJ0LnRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgYXJndW1lbnRzOiBKU09OLnN0cmluZ2lmeShwYXJ0LmlucHV0KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICAgIGNvbnRlbnQ6IHRleHQsXG4gICAgICAgICAgdG9vbF9jYWxsczogdG9vbENhbGxzLmxlbmd0aCA+IDAgPyB0b29sQ2FsbHMgOiB2b2lkIDBcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInRvb2xcIjoge1xuICAgICAgICBmb3IgKGNvbnN0IHRvb2xSZXNwb25zZSBvZiBjb250ZW50KSB7XG4gICAgICAgICAgaWYgKHRvb2xSZXNwb25zZS50eXBlID09PSBcInRvb2wtYXBwcm92YWwtcmVzcG9uc2VcIikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHRvb2xSZXNwb25zZS5vdXRwdXQ7XG4gICAgICAgICAgbGV0IGNvbnRlbnRWYWx1ZTtcbiAgICAgICAgICBzd2l0Y2ggKG91dHB1dC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgY2FzZSBcImVycm9yLXRleHRcIjpcbiAgICAgICAgICAgICAgY29udGVudFZhbHVlID0gb3V0cHV0LnZhbHVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJleGVjdXRpb24tZGVuaWVkXCI6XG4gICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZSA9IChfYSA9IG91dHB1dC5yZWFzb24pICE9IG51bGwgPyBfYSA6IFwiVG9vbCBleGVjdXRpb24gZGVuaWVkLlwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjb250ZW50XCI6XG4gICAgICAgICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAgICAgY2FzZSBcImVycm9yLWpzb25cIjpcbiAgICAgICAgICAgICAgY29udGVudFZhbHVlID0gSlNPTi5zdHJpbmdpZnkob3V0cHV0LnZhbHVlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgICAgcm9sZTogXCJ0b29sXCIsXG4gICAgICAgICAgICB0b29sX2NhbGxfaWQ6IHRvb2xSZXNwb25zZS50b29sQ2FsbElkLFxuICAgICAgICAgICAgY29udGVudDogY29udGVudFZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IF9leGhhdXN0aXZlQ2hlY2sgPSByb2xlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJvbGU6ICR7X2V4aGF1c3RpdmVDaGVja31gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWVzc2FnZXMsIHdhcm5pbmdzIH07XG59XG5cbi8vIHNyYy9jaGF0L2dldC1yZXNwb25zZS1tZXRhZGF0YS50c1xuZnVuY3Rpb24gZ2V0UmVzcG9uc2VNZXRhZGF0YSh7XG4gIGlkLFxuICBtb2RlbCxcbiAgY3JlYXRlZFxufSkge1xuICByZXR1cm4ge1xuICAgIGlkOiBpZCAhPSBudWxsID8gaWQgOiB2b2lkIDAsXG4gICAgbW9kZWxJZDogbW9kZWwgIT0gbnVsbCA/IG1vZGVsIDogdm9pZCAwLFxuICAgIHRpbWVzdGFtcDogY3JlYXRlZCA/IG5ldyBEYXRlKGNyZWF0ZWQgKiAxZTMpIDogdm9pZCAwXG4gIH07XG59XG5cbi8vIHNyYy9jaGF0L21hcC1vcGVuYWktZmluaXNoLXJlYXNvbi50c1xuZnVuY3Rpb24gbWFwT3BlbkFJRmluaXNoUmVhc29uKGZpbmlzaFJlYXNvbikge1xuICBzd2l0Y2ggKGZpbmlzaFJlYXNvbikge1xuICAgIGNhc2UgXCJzdG9wXCI6XG4gICAgICByZXR1cm4gXCJzdG9wXCI7XG4gICAgY2FzZSBcImxlbmd0aFwiOlxuICAgICAgcmV0dXJuIFwibGVuZ3RoXCI7XG4gICAgY2FzZSBcImNvbnRlbnRfZmlsdGVyXCI6XG4gICAgICByZXR1cm4gXCJjb250ZW50LWZpbHRlclwiO1xuICAgIGNhc2UgXCJmdW5jdGlvbl9jYWxsXCI6XG4gICAgY2FzZSBcInRvb2xfY2FsbHNcIjpcbiAgICAgIHJldHVybiBcInRvb2wtY2FsbHNcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwib3RoZXJcIjtcbiAgfVxufVxuXG4vLyBzcmMvY2hhdC9vcGVuYWktY2hhdC1hcGkudHNcbmltcG9ydCB7IGxhenlTY2hlbWEsIHpvZFNjaGVtYSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoyIH0gZnJvbSBcInpvZC92NFwiO1xudmFyIG9wZW5haUNoYXRSZXNwb25zZVNjaGVtYSA9IGxhenlTY2hlbWEoXG4gICgpID0+IHpvZFNjaGVtYShcbiAgICB6Mi5vYmplY3Qoe1xuICAgICAgaWQ6IHoyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIGNyZWF0ZWQ6IHoyLm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgIG1vZGVsOiB6Mi5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICBjaG9pY2VzOiB6Mi5hcnJheShcbiAgICAgICAgejIub2JqZWN0KHtcbiAgICAgICAgICBtZXNzYWdlOiB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgcm9sZTogejIubGl0ZXJhbChcImFzc2lzdGFudFwiKS5udWxsaXNoKCksXG4gICAgICAgICAgICBjb250ZW50OiB6Mi5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgICAgICB0b29sX2NhbGxzOiB6Mi5hcnJheShcbiAgICAgICAgICAgICAgejIub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBpZDogejIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgICAgIHR5cGU6IHoyLmxpdGVyYWwoXCJmdW5jdGlvblwiKSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbjogejIub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHoyLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgYXJndW1lbnRzOiB6Mi5zdHJpbmcoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLm51bGxpc2goKSxcbiAgICAgICAgICAgIGFubm90YXRpb25zOiB6Mi5hcnJheShcbiAgICAgICAgICAgICAgejIub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6Mi5saXRlcmFsKFwidXJsX2NpdGF0aW9uXCIpLFxuICAgICAgICAgICAgICAgIHVybF9jaXRhdGlvbjogejIub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgIHN0YXJ0X2luZGV4OiB6Mi5udW1iZXIoKSxcbiAgICAgICAgICAgICAgICAgIGVuZF9pbmRleDogejIubnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICB1cmw6IHoyLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IHoyLnN0cmluZygpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkubnVsbGlzaCgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaW5kZXg6IHoyLm51bWJlcigpLFxuICAgICAgICAgIGxvZ3Byb2JzOiB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgY29udGVudDogejIuYXJyYXkoXG4gICAgICAgICAgICAgIHoyLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdG9rZW46IHoyLnN0cmluZygpLFxuICAgICAgICAgICAgICAgIGxvZ3Byb2I6IHoyLm51bWJlcigpLFxuICAgICAgICAgICAgICAgIHRvcF9sb2dwcm9iczogejIuYXJyYXkoXG4gICAgICAgICAgICAgICAgICB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICB0b2tlbjogejIuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIGxvZ3Byb2I6IHoyLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkubnVsbGlzaCgpXG4gICAgICAgICAgfSkubnVsbGlzaCgpLFxuICAgICAgICAgIGZpbmlzaF9yZWFzb246IHoyLnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHVzYWdlOiB6Mi5vYmplY3Qoe1xuICAgICAgICBwcm9tcHRfdG9rZW5zOiB6Mi5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICAgIGNvbXBsZXRpb25fdG9rZW5zOiB6Mi5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICAgIHRvdGFsX3Rva2VuczogejIubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgICBwcm9tcHRfdG9rZW5zX2RldGFpbHM6IHoyLm9iamVjdCh7XG4gICAgICAgICAgY2FjaGVkX3Rva2VuczogejIubnVtYmVyKCkubnVsbGlzaCgpXG4gICAgICAgIH0pLm51bGxpc2goKSxcbiAgICAgICAgY29tcGxldGlvbl90b2tlbnNfZGV0YWlsczogejIub2JqZWN0KHtcbiAgICAgICAgICByZWFzb25pbmdfdG9rZW5zOiB6Mi5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICAgICAgYWNjZXB0ZWRfcHJlZGljdGlvbl90b2tlbnM6IHoyLm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgICByZWplY3RlZF9wcmVkaWN0aW9uX3Rva2VuczogejIubnVtYmVyKCkubnVsbGlzaCgpXG4gICAgICAgIH0pLm51bGxpc2goKVxuICAgICAgfSkubnVsbGlzaCgpXG4gICAgfSlcbiAgKVxuKTtcbnZhciBvcGVuYWlDaGF0Q2h1bmtTY2hlbWEgPSBsYXp5U2NoZW1hKFxuICAoKSA9PiB6b2RTY2hlbWEoXG4gICAgejIudW5pb24oW1xuICAgICAgejIub2JqZWN0KHtcbiAgICAgICAgaWQ6IHoyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgY3JlYXRlZDogejIubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgICBtb2RlbDogejIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICBjaG9pY2VzOiB6Mi5hcnJheShcbiAgICAgICAgICB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgZGVsdGE6IHoyLm9iamVjdCh7XG4gICAgICAgICAgICAgIHJvbGU6IHoyLmVudW0oW1wiYXNzaXN0YW50XCJdKS5udWxsaXNoKCksXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IHoyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgICAgdG9vbF9jYWxsczogejIuYXJyYXkoXG4gICAgICAgICAgICAgICAgejIub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgIGluZGV4OiB6Mi5udW1iZXIoKSxcbiAgICAgICAgICAgICAgICAgIGlkOiB6Mi5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgICAgICAgICAgICB0eXBlOiB6Mi5saXRlcmFsKFwiZnVuY3Rpb25cIikubnVsbGlzaCgpLFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb246IHoyLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHoyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzOiB6Mi5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKS5udWxsaXNoKCksXG4gICAgICAgICAgICAgIGFubm90YXRpb25zOiB6Mi5hcnJheShcbiAgICAgICAgICAgICAgICB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogejIubGl0ZXJhbChcInVybF9jaXRhdGlvblwiKSxcbiAgICAgICAgICAgICAgICAgIHVybF9jaXRhdGlvbjogejIub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRfaW5kZXg6IHoyLm51bWJlcigpLFxuICAgICAgICAgICAgICAgICAgICBlbmRfaW5kZXg6IHoyLm51bWJlcigpLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHoyLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogejIuc3RyaW5nKClcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKS5udWxsaXNoKClcbiAgICAgICAgICAgIH0pLm51bGxpc2goKSxcbiAgICAgICAgICAgIGxvZ3Byb2JzOiB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgICBjb250ZW50OiB6Mi5hcnJheShcbiAgICAgICAgICAgICAgICB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgdG9rZW46IHoyLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgbG9ncHJvYjogejIubnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICB0b3BfbG9ncHJvYnM6IHoyLmFycmF5KFxuICAgICAgICAgICAgICAgICAgICB6Mi5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiB6Mi5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICBsb2dwcm9iOiB6Mi5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICkubnVsbGlzaCgpXG4gICAgICAgICAgICB9KS5udWxsaXNoKCksXG4gICAgICAgICAgICBmaW5pc2hfcmVhc29uOiB6Mi5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgICAgICBpbmRleDogejIubnVtYmVyKClcbiAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgICB1c2FnZTogejIub2JqZWN0KHtcbiAgICAgICAgICBwcm9tcHRfdG9rZW5zOiB6Mi5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICAgICAgY29tcGxldGlvbl90b2tlbnM6IHoyLm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgICB0b3RhbF90b2tlbnM6IHoyLm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgICBwcm9tcHRfdG9rZW5zX2RldGFpbHM6IHoyLm9iamVjdCh7XG4gICAgICAgICAgICBjYWNoZWRfdG9rZW5zOiB6Mi5udW1iZXIoKS5udWxsaXNoKClcbiAgICAgICAgICB9KS5udWxsaXNoKCksXG4gICAgICAgICAgY29tcGxldGlvbl90b2tlbnNfZGV0YWlsczogejIub2JqZWN0KHtcbiAgICAgICAgICAgIHJlYXNvbmluZ190b2tlbnM6IHoyLm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgICAgIGFjY2VwdGVkX3ByZWRpY3Rpb25fdG9rZW5zOiB6Mi5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICAgICAgICByZWplY3RlZF9wcmVkaWN0aW9uX3Rva2VuczogejIubnVtYmVyKCkubnVsbGlzaCgpXG4gICAgICAgICAgfSkubnVsbGlzaCgpXG4gICAgICAgIH0pLm51bGxpc2goKVxuICAgICAgfSksXG4gICAgICBvcGVuYWlFcnJvckRhdGFTY2hlbWFcbiAgICBdKVxuICApXG4pO1xuXG4vLyBzcmMvY2hhdC9vcGVuYWktY2hhdC1vcHRpb25zLnRzXG5pbXBvcnQgeyBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWEyLCB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMiB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHozIH0gZnJvbSBcInpvZC92NFwiO1xudmFyIG9wZW5haUxhbmd1YWdlTW9kZWxDaGF0T3B0aW9ucyA9IGxhenlTY2hlbWEyKFxuICAoKSA9PiB6b2RTY2hlbWEyKFxuICAgIHozLm9iamVjdCh7XG4gICAgICAvKipcbiAgICAgICAqIE1vZGlmeSB0aGUgbGlrZWxpaG9vZCBvZiBzcGVjaWZpZWQgdG9rZW5zIGFwcGVhcmluZyBpbiB0aGUgY29tcGxldGlvbi5cbiAgICAgICAqXG4gICAgICAgKiBBY2NlcHRzIGEgSlNPTiBvYmplY3QgdGhhdCBtYXBzIHRva2VucyAoc3BlY2lmaWVkIGJ5IHRoZWlyIHRva2VuIElEIGluXG4gICAgICAgKiB0aGUgR1BUIHRva2VuaXplcikgdG8gYW4gYXNzb2NpYXRlZCBiaWFzIHZhbHVlIGZyb20gLTEwMCB0byAxMDAuXG4gICAgICAgKi9cbiAgICAgIGxvZ2l0QmlhczogejMucmVjb3JkKHozLmNvZXJjZS5udW1iZXIoKSwgejMubnVtYmVyKCkpLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIFJldHVybiB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb2YgdGhlIHRva2Vucy5cbiAgICAgICAqXG4gICAgICAgKiBTZXR0aW5nIHRvIHRydWUgd2lsbCByZXR1cm4gdGhlIGxvZyBwcm9iYWJpbGl0aWVzIG9mIHRoZSB0b2tlbnMgdGhhdFxuICAgICAgICogd2VyZSBnZW5lcmF0ZWQuXG4gICAgICAgKlxuICAgICAgICogU2V0dGluZyB0byBhIG51bWJlciB3aWxsIHJldHVybiB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb2YgdGhlIHRvcCBuXG4gICAgICAgKiB0b2tlbnMgdGhhdCB3ZXJlIGdlbmVyYXRlZC5cbiAgICAgICAqL1xuICAgICAgbG9ncHJvYnM6IHozLnVuaW9uKFt6My5ib29sZWFuKCksIHozLm51bWJlcigpXSkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBlbmFibGUgcGFyYWxsZWwgZnVuY3Rpb24gY2FsbGluZyBkdXJpbmcgdG9vbCB1c2UuIERlZmF1bHQgdG8gdHJ1ZS5cbiAgICAgICAqL1xuICAgICAgcGFyYWxsZWxUb29sQ2FsbHM6IHozLmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG9cbiAgICAgICAqIG1vbml0b3IgYW5kIGRldGVjdCBhYnVzZS5cbiAgICAgICAqL1xuICAgICAgdXNlcjogejMuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogUmVhc29uaW5nIGVmZm9ydCBmb3IgcmVhc29uaW5nIG1vZGVscy4gRGVmYXVsdHMgdG8gYG1lZGl1bWAuXG4gICAgICAgKi9cbiAgICAgIHJlYXNvbmluZ0VmZm9ydDogejMuZW51bShbXCJub25lXCIsIFwibWluaW1hbFwiLCBcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIiwgXCJ4aGlnaFwiXSkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogTWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdG8gZ2VuZXJhdGUuIFVzZWZ1bCBmb3IgcmVhc29uaW5nIG1vZGVscy5cbiAgICAgICAqL1xuICAgICAgbWF4Q29tcGxldGlvblRva2VuczogejMubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBlbmFibGUgcGVyc2lzdGVuY2UgaW4gcmVzcG9uc2VzIEFQSS5cbiAgICAgICAqL1xuICAgICAgc3RvcmU6IHozLmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBNZXRhZGF0YSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcmVxdWVzdC5cbiAgICAgICAqL1xuICAgICAgbWV0YWRhdGE6IHozLnJlY29yZCh6My5zdHJpbmcoKS5tYXgoNjQpLCB6My5zdHJpbmcoKS5tYXgoNTEyKSkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogUGFyYW1ldGVycyBmb3IgcHJlZGljdGlvbiBtb2RlLlxuICAgICAgICovXG4gICAgICBwcmVkaWN0aW9uOiB6My5yZWNvcmQoejMuc3RyaW5nKCksIHozLmFueSgpKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBTZXJ2aWNlIHRpZXIgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAgICogLSAnYXV0byc6IERlZmF1bHQgc2VydmljZSB0aWVyLiBUaGUgcmVxdWVzdCB3aWxsIGJlIHByb2Nlc3NlZCB3aXRoIHRoZSBzZXJ2aWNlIHRpZXIgY29uZmlndXJlZCBpbiB0aGVcbiAgICAgICAqICAgICAgICAgICBQcm9qZWN0IHNldHRpbmdzLiBVbmxlc3Mgb3RoZXJ3aXNlIGNvbmZpZ3VyZWQsIHRoZSBQcm9qZWN0IHdpbGwgdXNlICdkZWZhdWx0Jy5cbiAgICAgICAqIC0gJ2ZsZXgnOiA1MCUgY2hlYXBlciBwcm9jZXNzaW5nIGF0IHRoZSBjb3N0IG9mIGluY3JlYXNlZCBsYXRlbmN5LiBPbmx5IGF2YWlsYWJsZSBmb3IgbzMgYW5kIG80LW1pbmkgbW9kZWxzLlxuICAgICAgICogLSAncHJpb3JpdHknOiBIaWdoZXItc3BlZWQgcHJvY2Vzc2luZyB3aXRoIHByZWRpY3RhYmx5IGxvdyBsYXRlbmN5IGF0IHByZW1pdW0gY29zdC4gQXZhaWxhYmxlIGZvciBFbnRlcnByaXNlIGN1c3RvbWVycy5cbiAgICAgICAqIC0gJ2RlZmF1bHQnOiBUaGUgcmVxdWVzdCB3aWxsIGJlIHByb2Nlc3NlZCB3aXRoIHRoZSBzdGFuZGFyZCBwcmljaW5nIGFuZCBwZXJmb3JtYW5jZSBmb3IgdGhlIHNlbGVjdGVkIG1vZGVsLlxuICAgICAgICpcbiAgICAgICAqIEBkZWZhdWx0ICdhdXRvJ1xuICAgICAgICovXG4gICAgICBzZXJ2aWNlVGllcjogejMuZW51bShbXCJhdXRvXCIsIFwiZmxleFwiLCBcInByaW9yaXR5XCIsIFwiZGVmYXVsdFwiXSkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2Ugc3RyaWN0IEpTT04gc2NoZW1hIHZhbGlkYXRpb24uXG4gICAgICAgKlxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzdHJpY3RKc29uU2NoZW1hOiB6My5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogQ29udHJvbHMgdGhlIHZlcmJvc2l0eSBvZiB0aGUgbW9kZWwncyByZXNwb25zZXMuXG4gICAgICAgKiBMb3dlciB2YWx1ZXMgd2lsbCByZXN1bHQgaW4gbW9yZSBjb25jaXNlIHJlc3BvbnNlcywgd2hpbGUgaGlnaGVyIHZhbHVlcyB3aWxsIHJlc3VsdCBpbiBtb3JlIHZlcmJvc2UgcmVzcG9uc2VzLlxuICAgICAgICovXG4gICAgICB0ZXh0VmVyYm9zaXR5OiB6My5lbnVtKFtcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIl0pLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIEEgY2FjaGUga2V5IGZvciBwcm9tcHQgY2FjaGluZy4gQWxsb3dzIG1hbnVhbCBjb250cm9sIG92ZXIgcHJvbXB0IGNhY2hpbmcgYmVoYXZpb3IuXG4gICAgICAgKiBVc2VmdWwgZm9yIGltcHJvdmluZyBjYWNoZSBoaXQgcmF0ZXMgYW5kIHdvcmtpbmcgYXJvdW5kIGF1dG9tYXRpYyBjYWNoaW5nIGlzc3Vlcy5cbiAgICAgICAqL1xuICAgICAgcHJvbXB0Q2FjaGVLZXk6IHozLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIFRoZSByZXRlbnRpb24gcG9saWN5IGZvciB0aGUgcHJvbXB0IGNhY2hlLlxuICAgICAgICogLSAnaW5fbWVtb3J5JzogRGVmYXVsdC4gU3RhbmRhcmQgcHJvbXB0IGNhY2hpbmcgYmVoYXZpb3IuXG4gICAgICAgKiAtICcyNGgnOiBFeHRlbmRlZCBwcm9tcHQgY2FjaGluZyB0aGF0IGtlZXBzIGNhY2hlZCBwcmVmaXhlcyBhY3RpdmUgZm9yIHVwIHRvIDI0IGhvdXJzLlxuICAgICAgICogICAgICAgICAgQ3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGZvciA1LjEgc2VyaWVzIG1vZGVscy5cbiAgICAgICAqXG4gICAgICAgKiBAZGVmYXVsdCAnaW5fbWVtb3J5J1xuICAgICAgICovXG4gICAgICBwcm9tcHRDYWNoZVJldGVudGlvbjogejMuZW51bShbXCJpbl9tZW1vcnlcIiwgXCIyNGhcIl0pLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIEEgc3RhYmxlIGlkZW50aWZpZXIgdXNlZCB0byBoZWxwIGRldGVjdCB1c2VycyBvZiB5b3VyIGFwcGxpY2F0aW9uXG4gICAgICAgKiB0aGF0IG1heSBiZSB2aW9sYXRpbmcgT3BlbkFJJ3MgdXNhZ2UgcG9saWNpZXMuIFRoZSBJRHMgc2hvdWxkIGJlIGFcbiAgICAgICAqIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgZWFjaCB1c2VyLiBXZSByZWNvbW1lbmQgaGFzaGluZyB0aGVpclxuICAgICAgICogdXNlcm5hbWUgb3IgZW1haWwgYWRkcmVzcywgaW4gb3JkZXIgdG8gYXZvaWQgc2VuZGluZyB1cyBhbnkgaWRlbnRpZnlpbmdcbiAgICAgICAqIGluZm9ybWF0aW9uLlxuICAgICAgICovXG4gICAgICBzYWZldHlJZGVudGlmaWVyOiB6My5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBPdmVycmlkZSB0aGUgc3lzdGVtIG1lc3NhZ2UgbW9kZSBmb3IgdGhpcyBtb2RlbC5cbiAgICAgICAqIC0gJ3N5c3RlbSc6IFVzZSB0aGUgJ3N5c3RlbScgcm9sZSBmb3Igc3lzdGVtIG1lc3NhZ2VzIChkZWZhdWx0IGZvciBtb3N0IG1vZGVscylcbiAgICAgICAqIC0gJ2RldmVsb3Blcic6IFVzZSB0aGUgJ2RldmVsb3Blcicgcm9sZSBmb3Igc3lzdGVtIG1lc3NhZ2VzICh1c2VkIGJ5IHJlYXNvbmluZyBtb2RlbHMpXG4gICAgICAgKiAtICdyZW1vdmUnOiBSZW1vdmUgc3lzdGVtIG1lc3NhZ2VzIGVudGlyZWx5XG4gICAgICAgKlxuICAgICAgICogSWYgbm90IHNwZWNpZmllZCwgdGhlIG1vZGUgaXMgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgc3lzdGVtTWVzc2FnZU1vZGU6IHozLmVudW0oW1wic3lzdGVtXCIsIFwiZGV2ZWxvcGVyXCIsIFwicmVtb3ZlXCJdKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBGb3JjZSB0cmVhdGluZyB0aGlzIG1vZGVsIGFzIGEgcmVhc29uaW5nIG1vZGVsLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBcInN0ZWFsdGhcIiByZWFzb25pbmcgbW9kZWxzIChlLmcuIHZpYSBhIGN1c3RvbSBiYXNlVVJMKVxuICAgICAgICogd2hlcmUgdGhlIG1vZGVsIElEIGlzIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBTREsncyBhbGxvd2xpc3QuXG4gICAgICAgKlxuICAgICAgICogV2hlbiBlbmFibGVkLCB0aGUgU0RLIGFwcGxpZXMgcmVhc29uaW5nLW1vZGVsIHBhcmFtZXRlciBjb21wYXRpYmlsaXR5IHJ1bGVzXG4gICAgICAgKiBhbmQgZGVmYXVsdHMgYHN5c3RlbU1lc3NhZ2VNb2RlYCB0byBgZGV2ZWxvcGVyYCB1bmxlc3Mgb3ZlcnJpZGRlbi5cbiAgICAgICAqL1xuICAgICAgZm9yY2VSZWFzb25pbmc6IHozLmJvb2xlYW4oKS5vcHRpb25hbCgpXG4gICAgfSlcbiAgKVxuKTtcblxuLy8gc3JjL2NoYXQvb3BlbmFpLWNoYXQtcHJlcGFyZS10b29scy50c1xuaW1wb3J0IHtcbiAgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3IgYXMgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3IyXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5mdW5jdGlvbiBwcmVwYXJlQ2hhdFRvb2xzKHtcbiAgdG9vbHMsXG4gIHRvb2xDaG9pY2Vcbn0pIHtcbiAgdG9vbHMgPSAodG9vbHMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xzLmxlbmd0aCkgPyB0b29scyA6IHZvaWQgMDtcbiAgY29uc3QgdG9vbFdhcm5pbmdzID0gW107XG4gIGlmICh0b29scyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHsgdG9vbHM6IHZvaWQgMCwgdG9vbENob2ljZTogdm9pZCAwLCB0b29sV2FybmluZ3MgfTtcbiAgfVxuICBjb25zdCBvcGVuYWlUb29sczIgPSBbXTtcbiAgZm9yIChjb25zdCB0b29sIG9mIHRvb2xzKSB7XG4gICAgc3dpdGNoICh0b29sLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICBvcGVuYWlUb29sczIucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgIGZ1bmN0aW9uOiB7XG4gICAgICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdG9vbC5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHRvb2wuaW5wdXRTY2hlbWEsXG4gICAgICAgICAgICAuLi50b29sLnN0cmljdCAhPSBudWxsID8geyBzdHJpY3Q6IHRvb2wuc3RyaWN0IH0gOiB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdG9vbFdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICBmZWF0dXJlOiBgdG9vbCB0eXBlOiAke3Rvb2wudHlwZX1gXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHRvb2xDaG9pY2UgPT0gbnVsbCkge1xuICAgIHJldHVybiB7IHRvb2xzOiBvcGVuYWlUb29sczIsIHRvb2xDaG9pY2U6IHZvaWQgMCwgdG9vbFdhcm5pbmdzIH07XG4gIH1cbiAgY29uc3QgdHlwZSA9IHRvb2xDaG9pY2UudHlwZTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcImF1dG9cIjpcbiAgICBjYXNlIFwibm9uZVwiOlxuICAgIGNhc2UgXCJyZXF1aXJlZFwiOlxuICAgICAgcmV0dXJuIHsgdG9vbHM6IG9wZW5haVRvb2xzMiwgdG9vbENob2ljZTogdHlwZSwgdG9vbFdhcm5pbmdzIH07XG4gICAgY2FzZSBcInRvb2xcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvb2xzOiBvcGVuYWlUb29sczIsXG4gICAgICAgIHRvb2xDaG9pY2U6IHtcbiAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgZnVuY3Rpb246IHtcbiAgICAgICAgICAgIG5hbWU6IHRvb2xDaG9pY2UudG9vbE5hbWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRvb2xXYXJuaW5nc1xuICAgICAgfTtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gdHlwZTtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvcjIoe1xuICAgICAgICBmdW5jdGlvbmFsaXR5OiBgdG9vbCBjaG9pY2UgdHlwZTogJHtfZXhoYXVzdGl2ZUNoZWNrfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyBzcmMvY2hhdC9vcGVuYWktY2hhdC1sYW5ndWFnZS1tb2RlbC50c1xudmFyIE9wZW5BSUNoYXRMYW5ndWFnZU1vZGVsID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihtb2RlbElkLCBjb25maWcpIHtcbiAgICB0aGlzLnNwZWNpZmljYXRpb25WZXJzaW9uID0gXCJ2M1wiO1xuICAgIHRoaXMuc3VwcG9ydGVkVXJscyA9IHtcbiAgICAgIFwiaW1hZ2UvKlwiOiBbL15odHRwcz86XFwvXFwvLiokL11cbiAgICB9O1xuICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQ7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cbiAgZ2V0IHByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm92aWRlcjtcbiAgfVxuICBhc3luYyBnZXRBcmdzKHtcbiAgICBwcm9tcHQsXG4gICAgbWF4T3V0cHV0VG9rZW5zLFxuICAgIHRlbXBlcmF0dXJlLFxuICAgIHRvcFAsXG4gICAgdG9wSyxcbiAgICBmcmVxdWVuY3lQZW5hbHR5LFxuICAgIHByZXNlbmNlUGVuYWx0eSxcbiAgICBzdG9wU2VxdWVuY2VzLFxuICAgIHJlc3BvbnNlRm9ybWF0LFxuICAgIHNlZWQsXG4gICAgdG9vbHMsXG4gICAgdG9vbENob2ljZSxcbiAgICBwcm92aWRlck9wdGlvbnNcbiAgfSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgY29uc3Qgd2FybmluZ3MgPSBbXTtcbiAgICBjb25zdCBvcGVuYWlPcHRpb25zID0gKF9hID0gYXdhaXQgcGFyc2VQcm92aWRlck9wdGlvbnMoe1xuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgICBzY2hlbWE6IG9wZW5haUxhbmd1YWdlTW9kZWxDaGF0T3B0aW9uc1xuICAgIH0pKSAhPSBudWxsID8gX2EgOiB7fTtcbiAgICBjb25zdCBtb2RlbENhcGFiaWxpdGllcyA9IGdldE9wZW5BSUxhbmd1YWdlTW9kZWxDYXBhYmlsaXRpZXModGhpcy5tb2RlbElkKTtcbiAgICBjb25zdCBpc1JlYXNvbmluZ01vZGVsID0gKF9iID0gb3BlbmFpT3B0aW9ucy5mb3JjZVJlYXNvbmluZykgIT0gbnVsbCA/IF9iIDogbW9kZWxDYXBhYmlsaXRpZXMuaXNSZWFzb25pbmdNb2RlbDtcbiAgICBpZiAodG9wSyAhPSBudWxsKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHsgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLCBmZWF0dXJlOiBcInRvcEtcIiB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBtZXNzYWdlcywgd2FybmluZ3M6IG1lc3NhZ2VXYXJuaW5ncyB9ID0gY29udmVydFRvT3BlbkFJQ2hhdE1lc3NhZ2VzKFxuICAgICAge1xuICAgICAgICBwcm9tcHQsXG4gICAgICAgIHN5c3RlbU1lc3NhZ2VNb2RlOiAoX2MgPSBvcGVuYWlPcHRpb25zLnN5c3RlbU1lc3NhZ2VNb2RlKSAhPSBudWxsID8gX2MgOiBpc1JlYXNvbmluZ01vZGVsID8gXCJkZXZlbG9wZXJcIiA6IG1vZGVsQ2FwYWJpbGl0aWVzLnN5c3RlbU1lc3NhZ2VNb2RlXG4gICAgICB9XG4gICAgKTtcbiAgICB3YXJuaW5ncy5wdXNoKC4uLm1lc3NhZ2VXYXJuaW5ncyk7XG4gICAgY29uc3Qgc3RyaWN0SnNvblNjaGVtYSA9IChfZCA9IG9wZW5haU9wdGlvbnMuc3RyaWN0SnNvblNjaGVtYSkgIT0gbnVsbCA/IF9kIDogdHJ1ZTtcbiAgICBjb25zdCBiYXNlQXJncyA9IHtcbiAgICAgIC8vIG1vZGVsIGlkOlxuICAgICAgbW9kZWw6IHRoaXMubW9kZWxJZCxcbiAgICAgIC8vIG1vZGVsIHNwZWNpZmljIHNldHRpbmdzOlxuICAgICAgbG9naXRfYmlhczogb3BlbmFpT3B0aW9ucy5sb2dpdEJpYXMsXG4gICAgICBsb2dwcm9iczogb3BlbmFpT3B0aW9ucy5sb2dwcm9icyA9PT0gdHJ1ZSB8fCB0eXBlb2Ygb3BlbmFpT3B0aW9ucy5sb2dwcm9icyA9PT0gXCJudW1iZXJcIiA/IHRydWUgOiB2b2lkIDAsXG4gICAgICB0b3BfbG9ncHJvYnM6IHR5cGVvZiBvcGVuYWlPcHRpb25zLmxvZ3Byb2JzID09PSBcIm51bWJlclwiID8gb3BlbmFpT3B0aW9ucy5sb2dwcm9icyA6IHR5cGVvZiBvcGVuYWlPcHRpb25zLmxvZ3Byb2JzID09PSBcImJvb2xlYW5cIiA/IG9wZW5haU9wdGlvbnMubG9ncHJvYnMgPyAwIDogdm9pZCAwIDogdm9pZCAwLFxuICAgICAgdXNlcjogb3BlbmFpT3B0aW9ucy51c2VyLFxuICAgICAgcGFyYWxsZWxfdG9vbF9jYWxsczogb3BlbmFpT3B0aW9ucy5wYXJhbGxlbFRvb2xDYWxscyxcbiAgICAgIC8vIHN0YW5kYXJkaXplZCBzZXR0aW5nczpcbiAgICAgIG1heF90b2tlbnM6IG1heE91dHB1dFRva2VucyxcbiAgICAgIHRlbXBlcmF0dXJlLFxuICAgICAgdG9wX3A6IHRvcFAsXG4gICAgICBmcmVxdWVuY3lfcGVuYWx0eTogZnJlcXVlbmN5UGVuYWx0eSxcbiAgICAgIHByZXNlbmNlX3BlbmFsdHk6IHByZXNlbmNlUGVuYWx0eSxcbiAgICAgIHJlc3BvbnNlX2Zvcm1hdDogKHJlc3BvbnNlRm9ybWF0ID09IG51bGwgPyB2b2lkIDAgOiByZXNwb25zZUZvcm1hdC50eXBlKSA9PT0gXCJqc29uXCIgPyByZXNwb25zZUZvcm1hdC5zY2hlbWEgIT0gbnVsbCA/IHtcbiAgICAgICAgdHlwZTogXCJqc29uX3NjaGVtYVwiLFxuICAgICAgICBqc29uX3NjaGVtYToge1xuICAgICAgICAgIHNjaGVtYTogcmVzcG9uc2VGb3JtYXQuc2NoZW1hLFxuICAgICAgICAgIHN0cmljdDogc3RyaWN0SnNvblNjaGVtYSxcbiAgICAgICAgICBuYW1lOiAoX2UgPSByZXNwb25zZUZvcm1hdC5uYW1lKSAhPSBudWxsID8gX2UgOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHJlc3BvbnNlRm9ybWF0LmRlc2NyaXB0aW9uXG4gICAgICAgIH1cbiAgICAgIH0gOiB7IHR5cGU6IFwianNvbl9vYmplY3RcIiB9IDogdm9pZCAwLFxuICAgICAgc3RvcDogc3RvcFNlcXVlbmNlcyxcbiAgICAgIHNlZWQsXG4gICAgICB2ZXJib3NpdHk6IG9wZW5haU9wdGlvbnMudGV4dFZlcmJvc2l0eSxcbiAgICAgIC8vIG9wZW5haSBzcGVjaWZpYyBzZXR0aW5nczpcbiAgICAgIC8vIFRPRE8gQUkgU0RLIDY6IHJlbW92ZSwgd2UgYXV0by1tYXAgbWF4T3V0cHV0VG9rZW5zIG5vd1xuICAgICAgbWF4X2NvbXBsZXRpb25fdG9rZW5zOiBvcGVuYWlPcHRpb25zLm1heENvbXBsZXRpb25Ub2tlbnMsXG4gICAgICBzdG9yZTogb3BlbmFpT3B0aW9ucy5zdG9yZSxcbiAgICAgIG1ldGFkYXRhOiBvcGVuYWlPcHRpb25zLm1ldGFkYXRhLFxuICAgICAgcHJlZGljdGlvbjogb3BlbmFpT3B0aW9ucy5wcmVkaWN0aW9uLFxuICAgICAgcmVhc29uaW5nX2VmZm9ydDogb3BlbmFpT3B0aW9ucy5yZWFzb25pbmdFZmZvcnQsXG4gICAgICBzZXJ2aWNlX3RpZXI6IG9wZW5haU9wdGlvbnMuc2VydmljZVRpZXIsXG4gICAgICBwcm9tcHRfY2FjaGVfa2V5OiBvcGVuYWlPcHRpb25zLnByb21wdENhY2hlS2V5LFxuICAgICAgcHJvbXB0X2NhY2hlX3JldGVudGlvbjogb3BlbmFpT3B0aW9ucy5wcm9tcHRDYWNoZVJldGVudGlvbixcbiAgICAgIHNhZmV0eV9pZGVudGlmaWVyOiBvcGVuYWlPcHRpb25zLnNhZmV0eUlkZW50aWZpZXIsXG4gICAgICAvLyBtZXNzYWdlczpcbiAgICAgIG1lc3NhZ2VzXG4gICAgfTtcbiAgICBpZiAoaXNSZWFzb25pbmdNb2RlbCkge1xuICAgICAgaWYgKG9wZW5haU9wdGlvbnMucmVhc29uaW5nRWZmb3J0ICE9PSBcIm5vbmVcIiB8fCAhbW9kZWxDYXBhYmlsaXRpZXMuc3VwcG9ydHNOb25SZWFzb25pbmdQYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmIChiYXNlQXJncy50ZW1wZXJhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgYmFzZUFyZ3MudGVtcGVyYXR1cmUgPSB2b2lkIDA7XG4gICAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgICAgICBmZWF0dXJlOiBcInRlbXBlcmF0dXJlXCIsXG4gICAgICAgICAgICBkZXRhaWxzOiBcInRlbXBlcmF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHJlYXNvbmluZyBtb2RlbHNcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlQXJncy50b3BfcCAhPSBudWxsKSB7XG4gICAgICAgICAgYmFzZUFyZ3MudG9wX3AgPSB2b2lkIDA7XG4gICAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgICAgICBmZWF0dXJlOiBcInRvcFBcIixcbiAgICAgICAgICAgIGRldGFpbHM6IFwidG9wUCBpcyBub3Qgc3VwcG9ydGVkIGZvciByZWFzb25pbmcgbW9kZWxzXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFzZUFyZ3MubG9ncHJvYnMgIT0gbnVsbCkge1xuICAgICAgICAgIGJhc2VBcmdzLmxvZ3Byb2JzID0gdm9pZCAwO1xuICAgICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgbWVzc2FnZTogXCJsb2dwcm9icyBpcyBub3Qgc3VwcG9ydGVkIGZvciByZWFzb25pbmcgbW9kZWxzXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGJhc2VBcmdzLmZyZXF1ZW5jeV9wZW5hbHR5ICE9IG51bGwpIHtcbiAgICAgICAgYmFzZUFyZ3MuZnJlcXVlbmN5X3BlbmFsdHkgPSB2b2lkIDA7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICBmZWF0dXJlOiBcImZyZXF1ZW5jeVBlbmFsdHlcIixcbiAgICAgICAgICBkZXRhaWxzOiBcImZyZXF1ZW5jeVBlbmFsdHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgcmVhc29uaW5nIG1vZGVsc1wiXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGJhc2VBcmdzLnByZXNlbmNlX3BlbmFsdHkgIT0gbnVsbCkge1xuICAgICAgICBiYXNlQXJncy5wcmVzZW5jZV9wZW5hbHR5ID0gdm9pZCAwO1xuICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgICAgZmVhdHVyZTogXCJwcmVzZW5jZVBlbmFsdHlcIixcbiAgICAgICAgICBkZXRhaWxzOiBcInByZXNlbmNlUGVuYWx0eSBpcyBub3Qgc3VwcG9ydGVkIGZvciByZWFzb25pbmcgbW9kZWxzXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYmFzZUFyZ3MubG9naXRfYmlhcyAhPSBudWxsKSB7XG4gICAgICAgIGJhc2VBcmdzLmxvZ2l0X2JpYXMgPSB2b2lkIDA7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgICAgICBtZXNzYWdlOiBcImxvZ2l0QmlhcyBpcyBub3Qgc3VwcG9ydGVkIGZvciByZWFzb25pbmcgbW9kZWxzXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYmFzZUFyZ3MudG9wX2xvZ3Byb2JzICE9IG51bGwpIHtcbiAgICAgICAgYmFzZUFyZ3MudG9wX2xvZ3Byb2JzID0gdm9pZCAwO1xuICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJ0b3BMb2dwcm9icyBpcyBub3Qgc3VwcG9ydGVkIGZvciByZWFzb25pbmcgbW9kZWxzXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYmFzZUFyZ3MubWF4X3Rva2VucyAhPSBudWxsKSB7XG4gICAgICAgIGlmIChiYXNlQXJncy5tYXhfY29tcGxldGlvbl90b2tlbnMgPT0gbnVsbCkge1xuICAgICAgICAgIGJhc2VBcmdzLm1heF9jb21wbGV0aW9uX3Rva2VucyA9IGJhc2VBcmdzLm1heF90b2tlbnM7XG4gICAgICAgIH1cbiAgICAgICAgYmFzZUFyZ3MubWF4X3Rva2VucyA9IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZWxJZC5zdGFydHNXaXRoKFwiZ3B0LTRvLXNlYXJjaC1wcmV2aWV3XCIpIHx8IHRoaXMubW9kZWxJZC5zdGFydHNXaXRoKFwiZ3B0LTRvLW1pbmktc2VhcmNoLXByZXZpZXdcIikpIHtcbiAgICAgIGlmIChiYXNlQXJncy50ZW1wZXJhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgIGJhc2VBcmdzLnRlbXBlcmF0dXJlID0gdm9pZCAwO1xuICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgICAgZmVhdHVyZTogXCJ0ZW1wZXJhdHVyZVwiLFxuICAgICAgICAgIGRldGFpbHM6IFwidGVtcGVyYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhlIHNlYXJjaCBwcmV2aWV3IG1vZGVscyBhbmQgaGFzIGJlZW4gcmVtb3ZlZC5cIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wZW5haU9wdGlvbnMuc2VydmljZVRpZXIgPT09IFwiZmxleFwiICYmICFtb2RlbENhcGFiaWxpdGllcy5zdXBwb3J0c0ZsZXhQcm9jZXNzaW5nKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLFxuICAgICAgICBmZWF0dXJlOiBcInNlcnZpY2VUaWVyXCIsXG4gICAgICAgIGRldGFpbHM6IFwiZmxleCBwcm9jZXNzaW5nIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBvMywgbzQtbWluaSwgYW5kIGdwdC01IG1vZGVsc1wiXG4gICAgICB9KTtcbiAgICAgIGJhc2VBcmdzLnNlcnZpY2VfdGllciA9IHZvaWQgMDtcbiAgICB9XG4gICAgaWYgKG9wZW5haU9wdGlvbnMuc2VydmljZVRpZXIgPT09IFwicHJpb3JpdHlcIiAmJiAhbW9kZWxDYXBhYmlsaXRpZXMuc3VwcG9ydHNQcmlvcml0eVByb2Nlc3NpbmcpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgIGZlYXR1cmU6IFwic2VydmljZVRpZXJcIixcbiAgICAgICAgZGV0YWlsczogXCJwcmlvcml0eSBwcm9jZXNzaW5nIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdXBwb3J0ZWQgbW9kZWxzIChncHQtNCwgZ3B0LTUsIGdwdC01LW1pbmksIG8zLCBvNC1taW5pKSBhbmQgcmVxdWlyZXMgRW50ZXJwcmlzZSBhY2Nlc3MuIGdwdC01LW5hbm8gaXMgbm90IHN1cHBvcnRlZFwiXG4gICAgICB9KTtcbiAgICAgIGJhc2VBcmdzLnNlcnZpY2VfdGllciA9IHZvaWQgMDtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgdG9vbHM6IG9wZW5haVRvb2xzMixcbiAgICAgIHRvb2xDaG9pY2U6IG9wZW5haVRvb2xDaG9pY2UsXG4gICAgICB0b29sV2FybmluZ3NcbiAgICB9ID0gcHJlcGFyZUNoYXRUb29scyh7XG4gICAgICB0b29scyxcbiAgICAgIHRvb2xDaG9pY2VcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYXJnczoge1xuICAgICAgICAuLi5iYXNlQXJncyxcbiAgICAgICAgdG9vbHM6IG9wZW5haVRvb2xzMixcbiAgICAgICAgdG9vbF9jaG9pY2U6IG9wZW5haVRvb2xDaG9pY2VcbiAgICAgIH0sXG4gICAgICB3YXJuaW5nczogWy4uLndhcm5pbmdzLCAuLi50b29sV2FybmluZ3NdXG4gICAgfTtcbiAgfVxuICBhc3luYyBkb0dlbmVyYXRlKG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgY29uc3QgeyBhcmdzOiBib2R5LCB3YXJuaW5ncyB9ID0gYXdhaXQgdGhpcy5nZXRBcmdzKG9wdGlvbnMpO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgIHZhbHVlOiByZXNwb25zZSxcbiAgICAgIHJhd1ZhbHVlOiByYXdSZXNwb25zZVxuICAgIH0gPSBhd2FpdCBwb3N0SnNvblRvQXBpKHtcbiAgICAgIHVybDogdGhpcy5jb25maWcudXJsKHtcbiAgICAgICAgcGF0aDogXCIvY2hhdC9jb21wbGV0aW9uc1wiLFxuICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWRcbiAgICAgIH0pLFxuICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnModGhpcy5jb25maWcuaGVhZGVycygpLCBvcHRpb25zLmhlYWRlcnMpLFxuICAgICAgYm9keSxcbiAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogb3BlbmFpRmFpbGVkUmVzcG9uc2VIYW5kbGVyLFxuICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcihcbiAgICAgICAgb3BlbmFpQ2hhdFJlc3BvbnNlU2NoZW1hXG4gICAgICApLFxuICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICB9KTtcbiAgICBjb25zdCBjaG9pY2UgPSByZXNwb25zZS5jaG9pY2VzWzBdO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBbXTtcbiAgICBjb25zdCB0ZXh0ID0gY2hvaWNlLm1lc3NhZ2UuY29udGVudDtcbiAgICBpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoID4gMCkge1xuICAgICAgY29udGVudC5wdXNoKHsgdHlwZTogXCJ0ZXh0XCIsIHRleHQgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdG9vbENhbGwgb2YgKF9hID0gY2hvaWNlLm1lc3NhZ2UudG9vbF9jYWxscykgIT0gbnVsbCA/IF9hIDogW10pIHtcbiAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgIHRvb2xDYWxsSWQ6IChfYiA9IHRvb2xDYWxsLmlkKSAhPSBudWxsID8gX2IgOiBnZW5lcmF0ZUlkKCksXG4gICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbC5mdW5jdGlvbi5uYW1lLFxuICAgICAgICBpbnB1dDogdG9vbENhbGwuZnVuY3Rpb24uYXJndW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIChfYyA9IGNob2ljZS5tZXNzYWdlLmFubm90YXRpb25zKSAhPSBudWxsID8gX2MgOiBbXSkge1xuICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgc291cmNlVHlwZTogXCJ1cmxcIixcbiAgICAgICAgaWQ6IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgdXJsOiBhbm5vdGF0aW9uLnVybF9jaXRhdGlvbi51cmwsXG4gICAgICAgIHRpdGxlOiBhbm5vdGF0aW9uLnVybF9jaXRhdGlvbi50aXRsZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbXBsZXRpb25Ub2tlbkRldGFpbHMgPSAoX2QgPSByZXNwb25zZS51c2FnZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kLmNvbXBsZXRpb25fdG9rZW5zX2RldGFpbHM7XG4gICAgY29uc3QgcHJvbXB0VG9rZW5EZXRhaWxzID0gKF9lID0gcmVzcG9uc2UudXNhZ2UpID09IG51bGwgPyB2b2lkIDAgOiBfZS5wcm9tcHRfdG9rZW5zX2RldGFpbHM7XG4gICAgY29uc3QgcHJvdmlkZXJNZXRhZGF0YSA9IHsgb3BlbmFpOiB7fSB9O1xuICAgIGlmICgoY29tcGxldGlvblRva2VuRGV0YWlscyA9PSBudWxsID8gdm9pZCAwIDogY29tcGxldGlvblRva2VuRGV0YWlscy5hY2NlcHRlZF9wcmVkaWN0aW9uX3Rva2VucykgIT0gbnVsbCkge1xuICAgICAgcHJvdmlkZXJNZXRhZGF0YS5vcGVuYWkuYWNjZXB0ZWRQcmVkaWN0aW9uVG9rZW5zID0gY29tcGxldGlvblRva2VuRGV0YWlscyA9PSBudWxsID8gdm9pZCAwIDogY29tcGxldGlvblRva2VuRGV0YWlscy5hY2NlcHRlZF9wcmVkaWN0aW9uX3Rva2VucztcbiAgICB9XG4gICAgaWYgKChjb21wbGV0aW9uVG9rZW5EZXRhaWxzID09IG51bGwgPyB2b2lkIDAgOiBjb21wbGV0aW9uVG9rZW5EZXRhaWxzLnJlamVjdGVkX3ByZWRpY3Rpb25fdG9rZW5zKSAhPSBudWxsKSB7XG4gICAgICBwcm92aWRlck1ldGFkYXRhLm9wZW5haS5yZWplY3RlZFByZWRpY3Rpb25Ub2tlbnMgPSBjb21wbGV0aW9uVG9rZW5EZXRhaWxzID09IG51bGwgPyB2b2lkIDAgOiBjb21wbGV0aW9uVG9rZW5EZXRhaWxzLnJlamVjdGVkX3ByZWRpY3Rpb25fdG9rZW5zO1xuICAgIH1cbiAgICBpZiAoKChfZiA9IGNob2ljZS5sb2dwcm9icykgPT0gbnVsbCA/IHZvaWQgMCA6IF9mLmNvbnRlbnQpICE9IG51bGwpIHtcbiAgICAgIHByb3ZpZGVyTWV0YWRhdGEub3BlbmFpLmxvZ3Byb2JzID0gY2hvaWNlLmxvZ3Byb2JzLmNvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50LFxuICAgICAgZmluaXNoUmVhc29uOiB7XG4gICAgICAgIHVuaWZpZWQ6IG1hcE9wZW5BSUZpbmlzaFJlYXNvbihjaG9pY2UuZmluaXNoX3JlYXNvbiksXG4gICAgICAgIHJhdzogKF9nID0gY2hvaWNlLmZpbmlzaF9yZWFzb24pICE9IG51bGwgPyBfZyA6IHZvaWQgMFxuICAgICAgfSxcbiAgICAgIHVzYWdlOiBjb252ZXJ0T3BlbkFJQ2hhdFVzYWdlKHJlc3BvbnNlLnVzYWdlKSxcbiAgICAgIHJlcXVlc3Q6IHsgYm9keSB9LFxuICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgLi4uZ2V0UmVzcG9uc2VNZXRhZGF0YShyZXNwb25zZSksXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgYm9keTogcmF3UmVzcG9uc2VcbiAgICAgIH0sXG4gICAgICB3YXJuaW5ncyxcbiAgICAgIHByb3ZpZGVyTWV0YWRhdGFcbiAgICB9O1xuICB9XG4gIGFzeW5jIGRvU3RyZWFtKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGFyZ3MsIHdhcm5pbmdzIH0gPSBhd2FpdCB0aGlzLmdldEFyZ3Mob3B0aW9ucyk7XG4gICAgY29uc3QgYm9keSA9IHtcbiAgICAgIC4uLmFyZ3MsXG4gICAgICBzdHJlYW06IHRydWUsXG4gICAgICBzdHJlYW1fb3B0aW9uczoge1xuICAgICAgICBpbmNsdWRlX3VzYWdlOiB0cnVlXG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB7IHJlc3BvbnNlSGVhZGVycywgdmFsdWU6IHJlc3BvbnNlIH0gPSBhd2FpdCBwb3N0SnNvblRvQXBpKHtcbiAgICAgIHVybDogdGhpcy5jb25maWcudXJsKHtcbiAgICAgICAgcGF0aDogXCIvY2hhdC9jb21wbGV0aW9uc1wiLFxuICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWRcbiAgICAgIH0pLFxuICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnModGhpcy5jb25maWcuaGVhZGVycygpLCBvcHRpb25zLmhlYWRlcnMpLFxuICAgICAgYm9keSxcbiAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogb3BlbmFpRmFpbGVkUmVzcG9uc2VIYW5kbGVyLFxuICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlRXZlbnRTb3VyY2VSZXNwb25zZUhhbmRsZXIoXG4gICAgICAgIG9wZW5haUNoYXRDaHVua1NjaGVtYVxuICAgICAgKSxcbiAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoXG4gICAgfSk7XG4gICAgY29uc3QgdG9vbENhbGxzID0gW107XG4gICAgbGV0IGZpbmlzaFJlYXNvbiA9IHtcbiAgICAgIHVuaWZpZWQ6IFwib3RoZXJcIixcbiAgICAgIHJhdzogdm9pZCAwXG4gICAgfTtcbiAgICBsZXQgdXNhZ2UgPSB2b2lkIDA7XG4gICAgbGV0IG1ldGFkYXRhRXh0cmFjdGVkID0gZmFsc2U7XG4gICAgbGV0IGlzQWN0aXZlVGV4dCA9IGZhbHNlO1xuICAgIGNvbnN0IHByb3ZpZGVyTWV0YWRhdGEgPSB7IG9wZW5haToge30gfTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RyZWFtOiByZXNwb25zZS5waXBlVGhyb3VnaChcbiAgICAgICAgbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJzdHJlYW0tc3RhcnRcIiwgd2FybmluZ3MgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9pLCBfaiwgX2ssIF9sLCBfbSwgX24sIF9vLCBfcCwgX3E7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlUmF3Q2h1bmtzKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwicmF3XCIsIHJhd1ZhbHVlOiBjaHVuay5yYXdWYWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2h1bmsuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBmaW5pc2hSZWFzb24gPSB7IHVuaWZpZWQ6IFwiZXJyb3JcIiwgcmF3OiB2b2lkIDAgfTtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJlcnJvclwiLCBlcnJvcjogY2h1bmsuZXJyb3IgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2h1bmsudmFsdWU7XG4gICAgICAgICAgICBpZiAoXCJlcnJvclwiIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbiA9IHsgdW5pZmllZDogXCJlcnJvclwiLCByYXc6IHZvaWQgMCB9O1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcImVycm9yXCIsIGVycm9yOiB2YWx1ZS5lcnJvciB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YUV4dHJhY3RlZCkge1xuICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGdldFJlc3BvbnNlTWV0YWRhdGEodmFsdWUpO1xuICAgICAgICAgICAgICBpZiAoT2JqZWN0LnZhbHVlcyhtZXRhZGF0YSkuc29tZShCb29sZWFuKSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhRXh0cmFjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJyZXNwb25zZS1tZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgICAgLi4uZ2V0UmVzcG9uc2VNZXRhZGF0YSh2YWx1ZSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlLnVzYWdlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdXNhZ2UgPSB2YWx1ZS51c2FnZTtcbiAgICAgICAgICAgICAgaWYgKCgoX2EgPSB2YWx1ZS51c2FnZS5jb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2EuYWNjZXB0ZWRfcHJlZGljdGlvbl90b2tlbnMpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhLm9wZW5haS5hY2NlcHRlZFByZWRpY3Rpb25Ub2tlbnMgPSAoX2IgPSB2YWx1ZS51c2FnZS5jb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2IuYWNjZXB0ZWRfcHJlZGljdGlvbl90b2tlbnM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCgoX2MgPSB2YWx1ZS51c2FnZS5jb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2MucmVqZWN0ZWRfcHJlZGljdGlvbl90b2tlbnMpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhLm9wZW5haS5yZWplY3RlZFByZWRpY3Rpb25Ub2tlbnMgPSAoX2QgPSB2YWx1ZS51c2FnZS5jb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2QucmVqZWN0ZWRfcHJlZGljdGlvbl90b2tlbnM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNob2ljZSA9IHZhbHVlLmNob2ljZXNbMF07XG4gICAgICAgICAgICBpZiAoKGNob2ljZSA9PSBudWxsID8gdm9pZCAwIDogY2hvaWNlLmZpbmlzaF9yZWFzb24pICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgZmluaXNoUmVhc29uID0ge1xuICAgICAgICAgICAgICAgIHVuaWZpZWQ6IG1hcE9wZW5BSUZpbmlzaFJlYXNvbihjaG9pY2UuZmluaXNoX3JlYXNvbiksXG4gICAgICAgICAgICAgICAgcmF3OiBjaG9pY2UuZmluaXNoX3JlYXNvblxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCgoX2UgPSBjaG9pY2UgPT0gbnVsbCA/IHZvaWQgMCA6IGNob2ljZS5sb2dwcm9icykgPT0gbnVsbCA/IHZvaWQgMCA6IF9lLmNvbnRlbnQpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YS5vcGVuYWkubG9ncHJvYnMgPSBjaG9pY2UubG9ncHJvYnMuY29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoY2hvaWNlID09IG51bGwgPyB2b2lkIDAgOiBjaG9pY2UuZGVsdGEpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBjaG9pY2UuZGVsdGE7XG4gICAgICAgICAgICBpZiAoZGVsdGEuY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGlmICghaXNBY3RpdmVUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJ0ZXh0LXN0YXJ0XCIsIGlkOiBcIjBcIiB9KTtcbiAgICAgICAgICAgICAgICBpc0FjdGl2ZVRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgaWQ6IFwiMFwiLFxuICAgICAgICAgICAgICAgIGRlbHRhOiBkZWx0YS5jb250ZW50XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlbHRhLnRvb2xfY2FsbHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRvb2xDYWxsRGVsdGEgb2YgZGVsdGEudG9vbF9jYWxscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdG9vbENhbGxEZWx0YS5pbmRleDtcbiAgICAgICAgICAgICAgICBpZiAodG9vbENhbGxzW2luZGV4XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodG9vbENhbGxEZWx0YS50eXBlICE9IG51bGwgJiYgdG9vbENhbGxEZWx0YS50eXBlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXNwb25zZURhdGFFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgZGF0YTogdG9vbENhbGxEZWx0YSxcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJ2Z1bmN0aW9uJyB0eXBlLmBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAodG9vbENhbGxEZWx0YS5pZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVzcG9uc2VEYXRhRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRvb2xDYWxsRGVsdGEsXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEV4cGVjdGVkICdpZCcgdG8gYmUgYSBzdHJpbmcuYFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmICgoKF9mID0gdG9vbENhbGxEZWx0YS5mdW5jdGlvbikgPT0gbnVsbCA/IHZvaWQgMCA6IF9mLm5hbWUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXNwb25zZURhdGFFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgZGF0YTogdG9vbENhbGxEZWx0YSxcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJ2Z1bmN0aW9uLm5hbWUnIHRvIGJlIGEgc3RyaW5nLmBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsRGVsdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbERlbHRhLmZ1bmN0aW9uLm5hbWVcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdG9vbENhbGxzW2luZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsRGVsdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0b29sQ2FsbERlbHRhLmZ1bmN0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzOiAoX2cgPSB0b29sQ2FsbERlbHRhLmZ1bmN0aW9uLmFyZ3VtZW50cykgIT0gbnVsbCA/IF9nIDogXCJcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBoYXNGaW5pc2hlZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBjb25zdCB0b29sQ2FsbDIgPSB0b29sQ2FsbHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgaWYgKCgoX2ggPSB0b29sQ2FsbDIuZnVuY3Rpb24pID09IG51bGwgPyB2b2lkIDAgOiBfaC5uYW1lKSAhPSBudWxsICYmICgoX2kgPSB0b29sQ2FsbDIuZnVuY3Rpb24pID09IG51bGwgPyB2b2lkIDAgOiBfaS5hcmd1bWVudHMpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2xDYWxsMi5mdW5jdGlvbi5hcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbDIuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YTogdG9vbENhbGwyLmZ1bmN0aW9uLmFyZ3VtZW50c1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1BhcnNhYmxlSnNvbih0b29sQ2FsbDIuZnVuY3Rpb24uYXJndW1lbnRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGwyLmlkXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiAoX2ogPSB0b29sQ2FsbDIuaWQpICE9IG51bGwgPyBfaiA6IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbDIuZnVuY3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiB0b29sQ2FsbDIuZnVuY3Rpb24uYXJndW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgdG9vbENhbGwyLmhhc0ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xDYWxsID0gdG9vbENhbGxzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAodG9vbENhbGwuaGFzRmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKChfayA9IHRvb2xDYWxsRGVsdGEuZnVuY3Rpb24pID09IG51bGwgPyB2b2lkIDAgOiBfay5hcmd1bWVudHMpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsLmZ1bmN0aW9uLmFyZ3VtZW50cyArPSAoX20gPSAoX2wgPSB0b29sQ2FsbERlbHRhLmZ1bmN0aW9uKSA9PSBudWxsID8gdm9pZCAwIDogX2wuYXJndW1lbnRzKSAhPSBudWxsID8gX20gOiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGwuaWQsXG4gICAgICAgICAgICAgICAgICBkZWx0YTogKF9uID0gdG9vbENhbGxEZWx0YS5mdW5jdGlvbi5hcmd1bWVudHMpICE9IG51bGwgPyBfbiA6IFwiXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoKChfbyA9IHRvb2xDYWxsLmZ1bmN0aW9uKSA9PSBudWxsID8gdm9pZCAwIDogX28ubmFtZSkgIT0gbnVsbCAmJiAoKF9wID0gdG9vbENhbGwuZnVuY3Rpb24pID09IG51bGwgPyB2b2lkIDAgOiBfcC5hcmd1bWVudHMpICE9IG51bGwgJiYgaXNQYXJzYWJsZUpzb24odG9vbENhbGwuZnVuY3Rpb24uYXJndW1lbnRzKSkge1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWVuZFwiLFxuICAgICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGwuaWRcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogKF9xID0gdG9vbENhbGwuaWQpICE9IG51bGwgPyBfcSA6IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsLmZ1bmN0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB0b29sQ2FsbC5mdW5jdGlvbi5hcmd1bWVudHNcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdG9vbENhbGwuaGFzRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlbHRhLmFubm90YXRpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGRlbHRhLmFubm90YXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgICAgICBzb3VyY2VUeXBlOiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgICAgICAgICAgIHVybDogYW5ub3RhdGlvbi51cmxfY2l0YXRpb24udXJsLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IGFubm90YXRpb24udXJsX2NpdGF0aW9uLnRpdGxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGZsdXNoKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGlmIChpc0FjdGl2ZVRleHQpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJ0ZXh0LWVuZFwiLCBpZDogXCIwXCIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICB0eXBlOiBcImZpbmlzaFwiLFxuICAgICAgICAgICAgICBmaW5pc2hSZWFzb24sXG4gICAgICAgICAgICAgIHVzYWdlOiBjb252ZXJ0T3BlbkFJQ2hhdFVzYWdlKHVzYWdlKSxcbiAgICAgICAgICAgICAgLi4ucHJvdmlkZXJNZXRhZGF0YSAhPSBudWxsID8geyBwcm92aWRlck1ldGFkYXRhIH0gOiB7fVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHJlcXVlc3Q6IHsgYm9keSB9LFxuICAgICAgcmVzcG9uc2U6IHsgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzIH1cbiAgICB9O1xuICB9XG59O1xuXG4vLyBzcmMvY29tcGxldGlvbi9vcGVuYWktY29tcGxldGlvbi1sYW5ndWFnZS1tb2RlbC50c1xuaW1wb3J0IHtcbiAgY29tYmluZUhlYWRlcnMgYXMgY29tYmluZUhlYWRlcnMyLFxuICBjcmVhdGVFdmVudFNvdXJjZVJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVFdmVudFNvdXJjZVJlc3BvbnNlSGFuZGxlcjIsXG4gIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjIsXG4gIHBhcnNlUHJvdmlkZXJPcHRpb25zIGFzIHBhcnNlUHJvdmlkZXJPcHRpb25zMixcbiAgcG9zdEpzb25Ub0FwaSBhcyBwb3N0SnNvblRvQXBpMlxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvY29tcGxldGlvbi9jb252ZXJ0LW9wZW5haS1jb21wbGV0aW9uLXVzYWdlLnRzXG5mdW5jdGlvbiBjb252ZXJ0T3BlbkFJQ29tcGxldGlvblVzYWdlKHVzYWdlKSB7XG4gIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgaWYgKHVzYWdlID09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRUb2tlbnM6IHtcbiAgICAgICAgdG90YWw6IHZvaWQgMCxcbiAgICAgICAgbm9DYWNoZTogdm9pZCAwLFxuICAgICAgICBjYWNoZVJlYWQ6IHZvaWQgMCxcbiAgICAgICAgY2FjaGVXcml0ZTogdm9pZCAwXG4gICAgICB9LFxuICAgICAgb3V0cHV0VG9rZW5zOiB7XG4gICAgICAgIHRvdGFsOiB2b2lkIDAsXG4gICAgICAgIHRleHQ6IHZvaWQgMCxcbiAgICAgICAgcmVhc29uaW5nOiB2b2lkIDBcbiAgICAgIH0sXG4gICAgICByYXc6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgY29uc3QgcHJvbXB0VG9rZW5zID0gKF9hID0gdXNhZ2UucHJvbXB0X3Rva2VucykgIT0gbnVsbCA/IF9hIDogMDtcbiAgY29uc3QgY29tcGxldGlvblRva2VucyA9IChfYiA9IHVzYWdlLmNvbXBsZXRpb25fdG9rZW5zKSAhPSBudWxsID8gX2IgOiAwO1xuICByZXR1cm4ge1xuICAgIGlucHV0VG9rZW5zOiB7XG4gICAgICB0b3RhbDogKF9jID0gdXNhZ2UucHJvbXB0X3Rva2VucykgIT0gbnVsbCA/IF9jIDogdm9pZCAwLFxuICAgICAgbm9DYWNoZTogcHJvbXB0VG9rZW5zLFxuICAgICAgY2FjaGVSZWFkOiB2b2lkIDAsXG4gICAgICBjYWNoZVdyaXRlOiB2b2lkIDBcbiAgICB9LFxuICAgIG91dHB1dFRva2Vuczoge1xuICAgICAgdG90YWw6IChfZCA9IHVzYWdlLmNvbXBsZXRpb25fdG9rZW5zKSAhPSBudWxsID8gX2QgOiB2b2lkIDAsXG4gICAgICB0ZXh0OiBjb21wbGV0aW9uVG9rZW5zLFxuICAgICAgcmVhc29uaW5nOiB2b2lkIDBcbiAgICB9LFxuICAgIHJhdzogdXNhZ2VcbiAgfTtcbn1cblxuLy8gc3JjL2NvbXBsZXRpb24vY29udmVydC10by1vcGVuYWktY29tcGxldGlvbi1wcm9tcHQudHNcbmltcG9ydCB7XG4gIEludmFsaWRQcm9tcHRFcnJvcixcbiAgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3IgYXMgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3IzXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyXCI7XG5mdW5jdGlvbiBjb252ZXJ0VG9PcGVuQUlDb21wbGV0aW9uUHJvbXB0KHtcbiAgcHJvbXB0LFxuICB1c2VyID0gXCJ1c2VyXCIsXG4gIGFzc2lzdGFudCA9IFwiYXNzaXN0YW50XCJcbn0pIHtcbiAgbGV0IHRleHQgPSBcIlwiO1xuICBpZiAocHJvbXB0WzBdLnJvbGUgPT09IFwic3lzdGVtXCIpIHtcbiAgICB0ZXh0ICs9IGAke3Byb21wdFswXS5jb250ZW50fVxuXG5gO1xuICAgIHByb21wdCA9IHByb21wdC5zbGljZSgxKTtcbiAgfVxuICBmb3IgKGNvbnN0IHsgcm9sZSwgY29udGVudCB9IG9mIHByb21wdCkge1xuICAgIHN3aXRjaCAocm9sZSkge1xuICAgICAgY2FzZSBcInN5c3RlbVwiOiB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvbXB0RXJyb3Ioe1xuICAgICAgICAgIG1lc3NhZ2U6IFwiVW5leHBlY3RlZCBzeXN0ZW0gbWVzc2FnZSBpbiBwcm9tcHQ6ICR7Y29udGVudH1cIixcbiAgICAgICAgICBwcm9tcHRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjYXNlIFwidXNlclwiOiB7XG4gICAgICAgIGNvbnN0IHVzZXJNZXNzYWdlID0gY29udGVudC5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHBhcnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInRleHRcIjoge1xuICAgICAgICAgICAgICByZXR1cm4gcGFydC50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCJcIik7XG4gICAgICAgIHRleHQgKz0gYCR7dXNlcn06XG4ke3VzZXJNZXNzYWdlfVxuXG5gO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhc3Npc3RhbnRcIjoge1xuICAgICAgICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlID0gY29udGVudC5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHBhcnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInRleHRcIjoge1xuICAgICAgICAgICAgICByZXR1cm4gcGFydC50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInRvb2wtY2FsbFwiOiB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvcjMoe1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHk6IFwidG9vbC1jYWxsIG1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KS5qb2luKFwiXCIpO1xuICAgICAgICB0ZXh0ICs9IGAke2Fzc2lzdGFudH06XG4ke2Fzc2lzdGFudE1lc3NhZ2V9XG5cbmA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInRvb2xcIjoge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRGdW5jdGlvbmFsaXR5RXJyb3IzKHtcbiAgICAgICAgICBmdW5jdGlvbmFsaXR5OiBcInRvb2wgbWVzc2FnZXNcIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgX2V4aGF1c3RpdmVDaGVjayA9IHJvbGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcm9sZTogJHtfZXhoYXVzdGl2ZUNoZWNrfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB0ZXh0ICs9IGAke2Fzc2lzdGFudH06XG5gO1xuICByZXR1cm4ge1xuICAgIHByb21wdDogdGV4dCxcbiAgICBzdG9wU2VxdWVuY2VzOiBbYFxuJHt1c2VyfTpgXVxuICB9O1xufVxuXG4vLyBzcmMvY29tcGxldGlvbi9nZXQtcmVzcG9uc2UtbWV0YWRhdGEudHNcbmZ1bmN0aW9uIGdldFJlc3BvbnNlTWV0YWRhdGEyKHtcbiAgaWQsXG4gIG1vZGVsLFxuICBjcmVhdGVkXG59KSB7XG4gIHJldHVybiB7XG4gICAgaWQ6IGlkICE9IG51bGwgPyBpZCA6IHZvaWQgMCxcbiAgICBtb2RlbElkOiBtb2RlbCAhPSBudWxsID8gbW9kZWwgOiB2b2lkIDAsXG4gICAgdGltZXN0YW1wOiBjcmVhdGVkICE9IG51bGwgPyBuZXcgRGF0ZShjcmVhdGVkICogMWUzKSA6IHZvaWQgMFxuICB9O1xufVxuXG4vLyBzcmMvY29tcGxldGlvbi9tYXAtb3BlbmFpLWZpbmlzaC1yZWFzb24udHNcbmZ1bmN0aW9uIG1hcE9wZW5BSUZpbmlzaFJlYXNvbjIoZmluaXNoUmVhc29uKSB7XG4gIHN3aXRjaCAoZmluaXNoUmVhc29uKSB7XG4gICAgY2FzZSBcInN0b3BcIjpcbiAgICAgIHJldHVybiBcInN0b3BcIjtcbiAgICBjYXNlIFwibGVuZ3RoXCI6XG4gICAgICByZXR1cm4gXCJsZW5ndGhcIjtcbiAgICBjYXNlIFwiY29udGVudF9maWx0ZXJcIjpcbiAgICAgIHJldHVybiBcImNvbnRlbnQtZmlsdGVyXCI7XG4gICAgY2FzZSBcImZ1bmN0aW9uX2NhbGxcIjpcbiAgICBjYXNlIFwidG9vbF9jYWxsc1wiOlxuICAgICAgcmV0dXJuIFwidG9vbC1jYWxsc1wiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJvdGhlclwiO1xuICB9XG59XG5cbi8vIHNyYy9jb21wbGV0aW9uL29wZW5haS1jb21wbGV0aW9uLWFwaS50c1xuaW1wb3J0IHsgeiBhcyB6NCB9IGZyb20gXCJ6b2QvdjRcIjtcbmltcG9ydCB7IGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTMsIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWEzIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbnZhciBvcGVuYWlDb21wbGV0aW9uUmVzcG9uc2VTY2hlbWEgPSBsYXp5U2NoZW1hMyhcbiAgKCkgPT4gem9kU2NoZW1hMyhcbiAgICB6NC5vYmplY3Qoe1xuICAgICAgaWQ6IHo0LnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIGNyZWF0ZWQ6IHo0Lm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgIG1vZGVsOiB6NC5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICBjaG9pY2VzOiB6NC5hcnJheShcbiAgICAgICAgejQub2JqZWN0KHtcbiAgICAgICAgICB0ZXh0OiB6NC5zdHJpbmcoKSxcbiAgICAgICAgICBmaW5pc2hfcmVhc29uOiB6NC5zdHJpbmcoKSxcbiAgICAgICAgICBsb2dwcm9iczogejQub2JqZWN0KHtcbiAgICAgICAgICAgIHRva2VuczogejQuYXJyYXkoejQuc3RyaW5nKCkpLFxuICAgICAgICAgICAgdG9rZW5fbG9ncHJvYnM6IHo0LmFycmF5KHo0Lm51bWJlcigpKSxcbiAgICAgICAgICAgIHRvcF9sb2dwcm9iczogejQuYXJyYXkoejQucmVjb3JkKHo0LnN0cmluZygpLCB6NC5udW1iZXIoKSkpLm51bGxpc2goKVxuICAgICAgICAgIH0pLm51bGxpc2goKVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHVzYWdlOiB6NC5vYmplY3Qoe1xuICAgICAgICBwcm9tcHRfdG9rZW5zOiB6NC5udW1iZXIoKSxcbiAgICAgICAgY29tcGxldGlvbl90b2tlbnM6IHo0Lm51bWJlcigpLFxuICAgICAgICB0b3RhbF90b2tlbnM6IHo0Lm51bWJlcigpXG4gICAgICB9KS5udWxsaXNoKClcbiAgICB9KVxuICApXG4pO1xudmFyIG9wZW5haUNvbXBsZXRpb25DaHVua1NjaGVtYSA9IGxhenlTY2hlbWEzKFxuICAoKSA9PiB6b2RTY2hlbWEzKFxuICAgIHo0LnVuaW9uKFtcbiAgICAgIHo0Lm9iamVjdCh7XG4gICAgICAgIGlkOiB6NC5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgIGNyZWF0ZWQ6IHo0Lm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgbW9kZWw6IHo0LnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgY2hvaWNlczogejQuYXJyYXkoXG4gICAgICAgICAgejQub2JqZWN0KHtcbiAgICAgICAgICAgIHRleHQ6IHo0LnN0cmluZygpLFxuICAgICAgICAgICAgZmluaXNoX3JlYXNvbjogejQuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgaW5kZXg6IHo0Lm51bWJlcigpLFxuICAgICAgICAgICAgbG9ncHJvYnM6IHo0Lm9iamVjdCh7XG4gICAgICAgICAgICAgIHRva2VuczogejQuYXJyYXkoejQuc3RyaW5nKCkpLFxuICAgICAgICAgICAgICB0b2tlbl9sb2dwcm9iczogejQuYXJyYXkoejQubnVtYmVyKCkpLFxuICAgICAgICAgICAgICB0b3BfbG9ncHJvYnM6IHo0LmFycmF5KHo0LnJlY29yZCh6NC5zdHJpbmcoKSwgejQubnVtYmVyKCkpKS5udWxsaXNoKClcbiAgICAgICAgICAgIH0pLm51bGxpc2goKVxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHVzYWdlOiB6NC5vYmplY3Qoe1xuICAgICAgICAgIHByb21wdF90b2tlbnM6IHo0Lm51bWJlcigpLFxuICAgICAgICAgIGNvbXBsZXRpb25fdG9rZW5zOiB6NC5udW1iZXIoKSxcbiAgICAgICAgICB0b3RhbF90b2tlbnM6IHo0Lm51bWJlcigpXG4gICAgICAgIH0pLm51bGxpc2goKVxuICAgICAgfSksXG4gICAgICBvcGVuYWlFcnJvckRhdGFTY2hlbWFcbiAgICBdKVxuICApXG4pO1xuXG4vLyBzcmMvY29tcGxldGlvbi9vcGVuYWktY29tcGxldGlvbi1vcHRpb25zLnRzXG5pbXBvcnQgeyBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWE0LCB6b2RTY2hlbWEgYXMgem9kU2NoZW1hNCB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHo1IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIG9wZW5haUxhbmd1YWdlTW9kZWxDb21wbGV0aW9uT3B0aW9ucyA9IGxhenlTY2hlbWE0KFxuICAoKSA9PiB6b2RTY2hlbWE0KFxuICAgIHo1Lm9iamVjdCh7XG4gICAgICAvKipcbiAgICAgICAqIEVjaG8gYmFjayB0aGUgcHJvbXB0IGluIGFkZGl0aW9uIHRvIHRoZSBjb21wbGV0aW9uLlxuICAgICAgICovXG4gICAgICBlY2hvOiB6NS5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogTW9kaWZ5IHRoZSBsaWtlbGlob29kIG9mIHNwZWNpZmllZCB0b2tlbnMgYXBwZWFyaW5nIGluIHRoZSBjb21wbGV0aW9uLlxuICAgICAgICpcbiAgICAgICAqIEFjY2VwdHMgYSBKU09OIG9iamVjdCB0aGF0IG1hcHMgdG9rZW5zIChzcGVjaWZpZWQgYnkgdGhlaXIgdG9rZW4gSUQgaW5cbiAgICAgICAqIHRoZSBHUFQgdG9rZW5pemVyKSB0byBhbiBhc3NvY2lhdGVkIGJpYXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMC4gWW91XG4gICAgICAgKiBjYW4gdXNlIHRoaXMgdG9rZW5pemVyIHRvb2wgdG8gY29udmVydCB0ZXh0IHRvIHRva2VuIElEcy4gTWF0aGVtYXRpY2FsbHksXG4gICAgICAgKiB0aGUgYmlhcyBpcyBhZGRlZCB0byB0aGUgbG9naXRzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgcHJpb3IgdG8gc2FtcGxpbmcuXG4gICAgICAgKiBUaGUgZXhhY3QgZWZmZWN0IHdpbGwgdmFyeSBwZXIgbW9kZWwsIGJ1dCB2YWx1ZXMgYmV0d2VlbiAtMSBhbmQgMSBzaG91bGRcbiAgICAgICAqIGRlY3JlYXNlIG9yIGluY3JlYXNlIGxpa2VsaWhvb2Qgb2Ygc2VsZWN0aW9uOyB2YWx1ZXMgbGlrZSAtMTAwIG9yIDEwMFxuICAgICAgICogc2hvdWxkIHJlc3VsdCBpbiBhIGJhbiBvciBleGNsdXNpdmUgc2VsZWN0aW9uIG9mIHRoZSByZWxldmFudCB0b2tlbi5cbiAgICAgICAqXG4gICAgICAgKiBBcyBhbiBleGFtcGxlLCB5b3UgY2FuIHBhc3Mge1wiNTAyNTZcIjogLTEwMH0gdG8gcHJldmVudCB0aGUgPHxlbmRvZnRleHR8PlxuICAgICAgICogdG9rZW4gZnJvbSBiZWluZyBnZW5lcmF0ZWQuXG4gICAgICAgKi9cbiAgICAgIGxvZ2l0QmlhczogejUucmVjb3JkKHo1LnN0cmluZygpLCB6NS5udW1iZXIoKSkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHN1ZmZpeCB0aGF0IGNvbWVzIGFmdGVyIGEgY29tcGxldGlvbiBvZiBpbnNlcnRlZCB0ZXh0LlxuICAgICAgICovXG4gICAgICBzdWZmaXg6IHo1LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0b1xuICAgICAgICogbW9uaXRvciBhbmQgZGV0ZWN0IGFidXNlLiBMZWFybiBtb3JlLlxuICAgICAgICovXG4gICAgICB1c2VyOiB6NS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBSZXR1cm4gdGhlIGxvZyBwcm9iYWJpbGl0aWVzIG9mIHRoZSB0b2tlbnMuIEluY2x1ZGluZyBsb2dwcm9icyB3aWxsIGluY3JlYXNlXG4gICAgICAgKiB0aGUgcmVzcG9uc2Ugc2l6ZSBhbmQgY2FuIHNsb3cgZG93biByZXNwb25zZSB0aW1lcy4gSG93ZXZlciwgaXQgY2FuXG4gICAgICAgKiBiZSB1c2VmdWwgdG8gYmV0dGVyIHVuZGVyc3RhbmQgaG93IHRoZSBtb2RlbCBpcyBiZWhhdmluZy5cbiAgICAgICAqIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIHJldHVybiB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb2YgdGhlIHRva2VucyB0aGF0XG4gICAgICAgKiB3ZXJlIGdlbmVyYXRlZC5cbiAgICAgICAqIFNldHRpbmcgdG8gYSBudW1iZXIgd2lsbCByZXR1cm4gdGhlIGxvZyBwcm9iYWJpbGl0aWVzIG9mIHRoZSB0b3AgblxuICAgICAgICogdG9rZW5zIHRoYXQgd2VyZSBnZW5lcmF0ZWQuXG4gICAgICAgKi9cbiAgICAgIGxvZ3Byb2JzOiB6NS51bmlvbihbejUuYm9vbGVhbigpLCB6NS5udW1iZXIoKV0pLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG4pO1xuXG4vLyBzcmMvY29tcGxldGlvbi9vcGVuYWktY29tcGxldGlvbi1sYW5ndWFnZS1tb2RlbC50c1xudmFyIE9wZW5BSUNvbXBsZXRpb25MYW5ndWFnZU1vZGVsID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihtb2RlbElkLCBjb25maWcpIHtcbiAgICB0aGlzLnNwZWNpZmljYXRpb25WZXJzaW9uID0gXCJ2M1wiO1xuICAgIHRoaXMuc3VwcG9ydGVkVXJscyA9IHtcbiAgICAgIC8vIE5vIFVSTHMgYXJlIHN1cHBvcnRlZCBmb3IgY29tcGxldGlvbiBtb2RlbHMuXG4gICAgfTtcbiAgICB0aGlzLm1vZGVsSWQgPSBtb2RlbElkO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG4gIGdldCBwcm92aWRlck9wdGlvbnNOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm92aWRlci5zcGxpdChcIi5cIilbMF0udHJpbSgpO1xuICB9XG4gIGdldCBwcm92aWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucHJvdmlkZXI7XG4gIH1cbiAgYXN5bmMgZ2V0QXJncyh7XG4gICAgcHJvbXB0LFxuICAgIG1heE91dHB1dFRva2VucyxcbiAgICB0ZW1wZXJhdHVyZSxcbiAgICB0b3BQLFxuICAgIHRvcEssXG4gICAgZnJlcXVlbmN5UGVuYWx0eSxcbiAgICBwcmVzZW5jZVBlbmFsdHksXG4gICAgc3RvcFNlcXVlbmNlczogdXNlclN0b3BTZXF1ZW5jZXMsXG4gICAgcmVzcG9uc2VGb3JtYXQsXG4gICAgdG9vbHMsXG4gICAgdG9vbENob2ljZSxcbiAgICBzZWVkLFxuICAgIHByb3ZpZGVyT3B0aW9uc1xuICB9KSB7XG4gICAgY29uc3Qgd2FybmluZ3MgPSBbXTtcbiAgICBjb25zdCBvcGVuYWlPcHRpb25zID0ge1xuICAgICAgLi4uYXdhaXQgcGFyc2VQcm92aWRlck9wdGlvbnMyKHtcbiAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICAgICAgc2NoZW1hOiBvcGVuYWlMYW5ndWFnZU1vZGVsQ29tcGxldGlvbk9wdGlvbnNcbiAgICAgIH0pLFxuICAgICAgLi4uYXdhaXQgcGFyc2VQcm92aWRlck9wdGlvbnMyKHtcbiAgICAgICAgcHJvdmlkZXI6IHRoaXMucHJvdmlkZXJPcHRpb25zTmFtZSxcbiAgICAgICAgcHJvdmlkZXJPcHRpb25zLFxuICAgICAgICBzY2hlbWE6IG9wZW5haUxhbmd1YWdlTW9kZWxDb21wbGV0aW9uT3B0aW9uc1xuICAgICAgfSlcbiAgICB9O1xuICAgIGlmICh0b3BLICE9IG51bGwpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goeyB0eXBlOiBcInVuc3VwcG9ydGVkXCIsIGZlYXR1cmU6IFwidG9wS1wiIH0pO1xuICAgIH1cbiAgICBpZiAodG9vbHMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xzLmxlbmd0aCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7IHR5cGU6IFwidW5zdXBwb3J0ZWRcIiwgZmVhdHVyZTogXCJ0b29sc1wiIH0pO1xuICAgIH1cbiAgICBpZiAodG9vbENob2ljZSAhPSBudWxsKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHsgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLCBmZWF0dXJlOiBcInRvb2xDaG9pY2VcIiB9KTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlRm9ybWF0ICE9IG51bGwgJiYgcmVzcG9uc2VGb3JtYXQudHlwZSAhPT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgIGZlYXR1cmU6IFwicmVzcG9uc2VGb3JtYXRcIixcbiAgICAgICAgZGV0YWlsczogXCJKU09OIHJlc3BvbnNlIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLlwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9tcHQ6IGNvbXBsZXRpb25Qcm9tcHQsIHN0b3BTZXF1ZW5jZXMgfSA9IGNvbnZlcnRUb09wZW5BSUNvbXBsZXRpb25Qcm9tcHQoeyBwcm9tcHQgfSk7XG4gICAgY29uc3Qgc3RvcCA9IFsuLi5zdG9wU2VxdWVuY2VzICE9IG51bGwgPyBzdG9wU2VxdWVuY2VzIDogW10sIC4uLnVzZXJTdG9wU2VxdWVuY2VzICE9IG51bGwgPyB1c2VyU3RvcFNlcXVlbmNlcyA6IFtdXTtcbiAgICByZXR1cm4ge1xuICAgICAgYXJnczoge1xuICAgICAgICAvLyBtb2RlbCBpZDpcbiAgICAgICAgbW9kZWw6IHRoaXMubW9kZWxJZCxcbiAgICAgICAgLy8gbW9kZWwgc3BlY2lmaWMgc2V0dGluZ3M6XG4gICAgICAgIGVjaG86IG9wZW5haU9wdGlvbnMuZWNobyxcbiAgICAgICAgbG9naXRfYmlhczogb3BlbmFpT3B0aW9ucy5sb2dpdEJpYXMsXG4gICAgICAgIGxvZ3Byb2JzOiAob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5sb2dwcm9icykgPT09IHRydWUgPyAwIDogKG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMubG9ncHJvYnMpID09PSBmYWxzZSA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMubG9ncHJvYnMsXG4gICAgICAgIHN1ZmZpeDogb3BlbmFpT3B0aW9ucy5zdWZmaXgsXG4gICAgICAgIHVzZXI6IG9wZW5haU9wdGlvbnMudXNlcixcbiAgICAgICAgLy8gc3RhbmRhcmRpemVkIHNldHRpbmdzOlxuICAgICAgICBtYXhfdG9rZW5zOiBtYXhPdXRwdXRUb2tlbnMsXG4gICAgICAgIHRlbXBlcmF0dXJlLFxuICAgICAgICB0b3BfcDogdG9wUCxcbiAgICAgICAgZnJlcXVlbmN5X3BlbmFsdHk6IGZyZXF1ZW5jeVBlbmFsdHksXG4gICAgICAgIHByZXNlbmNlX3BlbmFsdHk6IHByZXNlbmNlUGVuYWx0eSxcbiAgICAgICAgc2VlZCxcbiAgICAgICAgLy8gcHJvbXB0OlxuICAgICAgICBwcm9tcHQ6IGNvbXBsZXRpb25Qcm9tcHQsXG4gICAgICAgIC8vIHN0b3Agc2VxdWVuY2VzOlxuICAgICAgICBzdG9wOiBzdG9wLmxlbmd0aCA+IDAgPyBzdG9wIDogdm9pZCAwXG4gICAgICB9LFxuICAgICAgd2FybmluZ3NcbiAgICB9O1xuICB9XG4gIGFzeW5jIGRvR2VuZXJhdGUob3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCB7IGFyZ3MsIHdhcm5pbmdzIH0gPSBhd2FpdCB0aGlzLmdldEFyZ3Mob3B0aW9ucyk7XG4gICAgY29uc3Qge1xuICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgdmFsdWU6IHJlc3BvbnNlLFxuICAgICAgcmF3VmFsdWU6IHJhd1Jlc3BvbnNlXG4gICAgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGkyKHtcbiAgICAgIHVybDogdGhpcy5jb25maWcudXJsKHtcbiAgICAgICAgcGF0aDogXCIvY29tcGxldGlvbnNcIixcbiAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkXG4gICAgICB9KSxcbiAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzMih0aGlzLmNvbmZpZy5oZWFkZXJzKCksIG9wdGlvbnMuaGVhZGVycyksXG4gICAgICBib2R5OiBhcmdzLFxuICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBvcGVuYWlGYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyMihcbiAgICAgICAgb3BlbmFpQ29tcGxldGlvblJlc3BvbnNlU2NoZW1hXG4gICAgICApLFxuICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICB9KTtcbiAgICBjb25zdCBjaG9pY2UgPSByZXNwb25zZS5jaG9pY2VzWzBdO1xuICAgIGNvbnN0IHByb3ZpZGVyTWV0YWRhdGEgPSB7IG9wZW5haToge30gfTtcbiAgICBpZiAoY2hvaWNlLmxvZ3Byb2JzICE9IG51bGwpIHtcbiAgICAgIHByb3ZpZGVyTWV0YWRhdGEub3BlbmFpLmxvZ3Byb2JzID0gY2hvaWNlLmxvZ3Byb2JzO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGNob2ljZS50ZXh0IH1dLFxuICAgICAgdXNhZ2U6IGNvbnZlcnRPcGVuQUlDb21wbGV0aW9uVXNhZ2UocmVzcG9uc2UudXNhZ2UpLFxuICAgICAgZmluaXNoUmVhc29uOiB7XG4gICAgICAgIHVuaWZpZWQ6IG1hcE9wZW5BSUZpbmlzaFJlYXNvbjIoY2hvaWNlLmZpbmlzaF9yZWFzb24pLFxuICAgICAgICByYXc6IChfYSA9IGNob2ljZS5maW5pc2hfcmVhc29uKSAhPSBudWxsID8gX2EgOiB2b2lkIDBcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0OiB7IGJvZHk6IGFyZ3MgfSxcbiAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgIC4uLmdldFJlc3BvbnNlTWV0YWRhdGEyKHJlc3BvbnNlKSxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBib2R5OiByYXdSZXNwb25zZVxuICAgICAgfSxcbiAgICAgIHByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICB3YXJuaW5nc1xuICAgIH07XG4gIH1cbiAgYXN5bmMgZG9TdHJlYW0ob3B0aW9ucykge1xuICAgIGNvbnN0IHsgYXJncywgd2FybmluZ3MgfSA9IGF3YWl0IHRoaXMuZ2V0QXJncyhvcHRpb25zKTtcbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAgLi4uYXJncyxcbiAgICAgIHN0cmVhbTogdHJ1ZSxcbiAgICAgIHN0cmVhbV9vcHRpb25zOiB7XG4gICAgICAgIGluY2x1ZGVfdXNhZ2U6IHRydWVcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHsgcmVzcG9uc2VIZWFkZXJzLCB2YWx1ZTogcmVzcG9uc2UgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGkyKHtcbiAgICAgIHVybDogdGhpcy5jb25maWcudXJsKHtcbiAgICAgICAgcGF0aDogXCIvY29tcGxldGlvbnNcIixcbiAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkXG4gICAgICB9KSxcbiAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzMih0aGlzLmNvbmZpZy5oZWFkZXJzKCksIG9wdGlvbnMuaGVhZGVycyksXG4gICAgICBib2R5LFxuICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBvcGVuYWlGYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVFdmVudFNvdXJjZVJlc3BvbnNlSGFuZGxlcjIoXG4gICAgICAgIG9wZW5haUNvbXBsZXRpb25DaHVua1NjaGVtYVxuICAgICAgKSxcbiAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoXG4gICAgfSk7XG4gICAgbGV0IGZpbmlzaFJlYXNvbiA9IHtcbiAgICAgIHVuaWZpZWQ6IFwib3RoZXJcIixcbiAgICAgIHJhdzogdm9pZCAwXG4gICAgfTtcbiAgICBjb25zdCBwcm92aWRlck1ldGFkYXRhID0geyBvcGVuYWk6IHt9IH07XG4gICAgbGV0IHVzYWdlID0gdm9pZCAwO1xuICAgIGxldCBpc0ZpcnN0Q2h1bmsgPSB0cnVlO1xuICAgIHJldHVybiB7XG4gICAgICBzdHJlYW06IHJlc3BvbnNlLnBpcGVUaHJvdWdoKFxuICAgICAgICBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInN0cmVhbS1zdGFydFwiLCB3YXJuaW5ncyB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRyYW5zZm9ybShjaHVuaywgY29udHJvbGxlcikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVJhd0NodW5rcykge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoeyB0eXBlOiBcInJhd1wiLCByYXdWYWx1ZTogY2h1bmsucmF3VmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNodW5rLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgZmluaXNoUmVhc29uID0geyB1bmlmaWVkOiBcImVycm9yXCIsIHJhdzogdm9pZCAwIH07XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwiZXJyb3JcIiwgZXJyb3I6IGNodW5rLmVycm9yIH0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNodW5rLnZhbHVlO1xuICAgICAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICBmaW5pc2hSZWFzb24gPSB7IHVuaWZpZWQ6IFwiZXJyb3JcIiwgcmF3OiB2b2lkIDAgfTtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJlcnJvclwiLCBlcnJvcjogdmFsdWUuZXJyb3IgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0ZpcnN0Q2h1bmspIHtcbiAgICAgICAgICAgICAgaXNGaXJzdENodW5rID0gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJyZXNwb25zZS1tZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgIC4uLmdldFJlc3BvbnNlTWV0YWRhdGEyKHZhbHVlKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJ0ZXh0LXN0YXJ0XCIsIGlkOiBcIjBcIiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS51c2FnZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHVzYWdlID0gdmFsdWUudXNhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjaG9pY2UgPSB2YWx1ZS5jaG9pY2VzWzBdO1xuICAgICAgICAgICAgaWYgKChjaG9pY2UgPT0gbnVsbCA/IHZvaWQgMCA6IGNob2ljZS5maW5pc2hfcmVhc29uKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZpbmlzaFJlYXNvbiA9IHtcbiAgICAgICAgICAgICAgICB1bmlmaWVkOiBtYXBPcGVuQUlGaW5pc2hSZWFzb24yKGNob2ljZS5maW5pc2hfcmVhc29uKSxcbiAgICAgICAgICAgICAgICByYXc6IGNob2ljZS5maW5pc2hfcmVhc29uXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGNob2ljZSA9PSBudWxsID8gdm9pZCAwIDogY2hvaWNlLmxvZ3Byb2JzKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGEub3BlbmFpLmxvZ3Byb2JzID0gY2hvaWNlLmxvZ3Byb2JzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChjaG9pY2UgPT0gbnVsbCA/IHZvaWQgMCA6IGNob2ljZS50ZXh0KSAhPSBudWxsICYmIGNob2ljZS50ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICBpZDogXCIwXCIsXG4gICAgICAgICAgICAgICAgZGVsdGE6IGNob2ljZS50ZXh0XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgICAgICAgaWYgKCFpc0ZpcnN0Q2h1bmspIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJ0ZXh0LWVuZFwiLCBpZDogXCIwXCIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICB0eXBlOiBcImZpbmlzaFwiLFxuICAgICAgICAgICAgICBmaW5pc2hSZWFzb24sXG4gICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICAgICAgICAgIHVzYWdlOiBjb252ZXJ0T3BlbkFJQ29tcGxldGlvblVzYWdlKHVzYWdlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHJlcXVlc3Q6IHsgYm9keSB9LFxuICAgICAgcmVzcG9uc2U6IHsgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzIH1cbiAgICB9O1xuICB9XG59O1xuXG4vLyBzcmMvZW1iZWRkaW5nL29wZW5haS1lbWJlZGRpbmctbW9kZWwudHNcbmltcG9ydCB7XG4gIFRvb01hbnlFbWJlZGRpbmdWYWx1ZXNGb3JDYWxsRXJyb3Jcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7XG4gIGNvbWJpbmVIZWFkZXJzIGFzIGNvbWJpbmVIZWFkZXJzMyxcbiAgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyMyxcbiAgcGFyc2VQcm92aWRlck9wdGlvbnMgYXMgcGFyc2VQcm92aWRlck9wdGlvbnMzLFxuICBwb3N0SnNvblRvQXBpIGFzIHBvc3RKc29uVG9BcGkzXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5cbi8vIHNyYy9lbWJlZGRpbmcvb3BlbmFpLWVtYmVkZGluZy1vcHRpb25zLnRzXG5pbXBvcnQgeyBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWE1LCB6b2RTY2hlbWEgYXMgem9kU2NoZW1hNSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHo2IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIG9wZW5haUVtYmVkZGluZ01vZGVsT3B0aW9ucyA9IGxhenlTY2hlbWE1KFxuICAoKSA9PiB6b2RTY2hlbWE1KFxuICAgIHo2Lm9iamVjdCh7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyB0aGUgcmVzdWx0aW5nIG91dHB1dCBlbWJlZGRpbmdzIHNob3VsZCBoYXZlLlxuICAgICAgICogT25seSBzdXBwb3J0ZWQgaW4gdGV4dC1lbWJlZGRpbmctMyBhbmQgbGF0ZXIgbW9kZWxzLlxuICAgICAgICovXG4gICAgICBkaW1lbnNpb25zOiB6Ni5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG9cbiAgICAgICAqIG1vbml0b3IgYW5kIGRldGVjdCBhYnVzZS4gTGVhcm4gbW9yZS5cbiAgICAgICAqL1xuICAgICAgdXNlcjogejYuc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG5cbi8vIHNyYy9lbWJlZGRpbmcvb3BlbmFpLWVtYmVkZGluZy1hcGkudHNcbmltcG9ydCB7IGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTYsIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWE2IH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejcgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgb3BlbmFpVGV4dEVtYmVkZGluZ1Jlc3BvbnNlU2NoZW1hID0gbGF6eVNjaGVtYTYoXG4gICgpID0+IHpvZFNjaGVtYTYoXG4gICAgejcub2JqZWN0KHtcbiAgICAgIGRhdGE6IHo3LmFycmF5KHo3Lm9iamVjdCh7IGVtYmVkZGluZzogejcuYXJyYXkoejcubnVtYmVyKCkpIH0pKSxcbiAgICAgIHVzYWdlOiB6Ny5vYmplY3QoeyBwcm9tcHRfdG9rZW5zOiB6Ny5udW1iZXIoKSB9KS5udWxsaXNoKClcbiAgICB9KVxuICApXG4pO1xuXG4vLyBzcmMvZW1iZWRkaW5nL29wZW5haS1lbWJlZGRpbmctbW9kZWwudHNcbnZhciBPcGVuQUlFbWJlZGRpbmdNb2RlbCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IobW9kZWxJZCwgY29uZmlnKSB7XG4gICAgdGhpcy5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9IFwidjNcIjtcbiAgICB0aGlzLm1heEVtYmVkZGluZ3NQZXJDYWxsID0gMjA0ODtcbiAgICB0aGlzLnN1cHBvcnRzUGFyYWxsZWxDYWxscyA9IHRydWU7XG4gICAgdGhpcy5tb2RlbElkID0gbW9kZWxJZDtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgcHJvdmlkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb3ZpZGVyO1xuICB9XG4gIGFzeW5jIGRvRW1iZWQoe1xuICAgIHZhbHVlcyxcbiAgICBoZWFkZXJzLFxuICAgIGFib3J0U2lnbmFsLFxuICAgIHByb3ZpZGVyT3B0aW9uc1xuICB9KSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gdGhpcy5tYXhFbWJlZGRpbmdzUGVyQ2FsbCkge1xuICAgICAgdGhyb3cgbmV3IFRvb01hbnlFbWJlZGRpbmdWYWx1ZXNGb3JDYWxsRXJyb3Ioe1xuICAgICAgICBwcm92aWRlcjogdGhpcy5wcm92aWRlcixcbiAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkLFxuICAgICAgICBtYXhFbWJlZGRpbmdzUGVyQ2FsbDogdGhpcy5tYXhFbWJlZGRpbmdzUGVyQ2FsbCxcbiAgICAgICAgdmFsdWVzXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgb3BlbmFpT3B0aW9ucyA9IChfYSA9IGF3YWl0IHBhcnNlUHJvdmlkZXJPcHRpb25zMyh7XG4gICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICAgIHNjaGVtYTogb3BlbmFpRW1iZWRkaW5nTW9kZWxPcHRpb25zXG4gICAgfSkpICE9IG51bGwgPyBfYSA6IHt9O1xuICAgIGNvbnN0IHtcbiAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgIHZhbHVlOiByZXNwb25zZSxcbiAgICAgIHJhd1ZhbHVlXG4gICAgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGkzKHtcbiAgICAgIHVybDogdGhpcy5jb25maWcudXJsKHtcbiAgICAgICAgcGF0aDogXCIvZW1iZWRkaW5nc1wiLFxuICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWRcbiAgICAgIH0pLFxuICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnMzKHRoaXMuY29uZmlnLmhlYWRlcnMoKSwgaGVhZGVycyksXG4gICAgICBib2R5OiB7XG4gICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsSWQsXG4gICAgICAgIGlucHV0OiB2YWx1ZXMsXG4gICAgICAgIGVuY29kaW5nX2Zvcm1hdDogXCJmbG9hdFwiLFxuICAgICAgICBkaW1lbnNpb25zOiBvcGVuYWlPcHRpb25zLmRpbWVuc2lvbnMsXG4gICAgICAgIHVzZXI6IG9wZW5haU9wdGlvbnMudXNlclxuICAgICAgfSxcbiAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogb3BlbmFpRmFpbGVkUmVzcG9uc2VIYW5kbGVyLFxuICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlcjMoXG4gICAgICAgIG9wZW5haVRleHRFbWJlZGRpbmdSZXNwb25zZVNjaGVtYVxuICAgICAgKSxcbiAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhcm5pbmdzOiBbXSxcbiAgICAgIGVtYmVkZGluZ3M6IHJlc3BvbnNlLmRhdGEubWFwKChpdGVtKSA9PiBpdGVtLmVtYmVkZGluZyksXG4gICAgICB1c2FnZTogcmVzcG9uc2UudXNhZ2UgPyB7IHRva2VuczogcmVzcG9uc2UudXNhZ2UucHJvbXB0X3Rva2VucyB9IDogdm9pZCAwLFxuICAgICAgcmVzcG9uc2U6IHsgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLCBib2R5OiByYXdWYWx1ZSB9XG4gICAgfTtcbiAgfVxufTtcblxuLy8gc3JjL2ltYWdlL29wZW5haS1pbWFnZS1tb2RlbC50c1xuaW1wb3J0IHtcbiAgY29tYmluZUhlYWRlcnMgYXMgY29tYmluZUhlYWRlcnM0LFxuICBjb252ZXJ0QmFzZTY0VG9VaW50OEFycmF5LFxuICBjb252ZXJ0VG9Gb3JtRGF0YSxcbiAgY3JlYXRlSnNvblJlc3BvbnNlSGFuZGxlciBhcyBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyNCxcbiAgZG93bmxvYWRCbG9iLFxuICBwb3N0Rm9ybURhdGFUb0FwaSxcbiAgcG9zdEpzb25Ub0FwaSBhcyBwb3N0SnNvblRvQXBpNFxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvaW1hZ2Uvb3BlbmFpLWltYWdlLWFwaS50c1xuaW1wb3J0IHsgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hNywgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTcgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6OCB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBvcGVuYWlJbWFnZVJlc3BvbnNlU2NoZW1hID0gbGF6eVNjaGVtYTcoXG4gICgpID0+IHpvZFNjaGVtYTcoXG4gICAgejgub2JqZWN0KHtcbiAgICAgIGNyZWF0ZWQ6IHo4Lm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgIGRhdGE6IHo4LmFycmF5KFxuICAgICAgICB6OC5vYmplY3Qoe1xuICAgICAgICAgIGI2NF9qc29uOiB6OC5zdHJpbmcoKSxcbiAgICAgICAgICByZXZpc2VkX3Byb21wdDogejguc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgYmFja2dyb3VuZDogejguc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgb3V0cHV0X2Zvcm1hdDogejguc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgc2l6ZTogejguc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgcXVhbGl0eTogejguc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgdXNhZ2U6IHo4Lm9iamVjdCh7XG4gICAgICAgIGlucHV0X3Rva2VuczogejgubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiB6OC5udW1iZXIoKS5udWxsaXNoKCksXG4gICAgICAgIHRvdGFsX3Rva2VuczogejgubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgICBpbnB1dF90b2tlbnNfZGV0YWlsczogejgub2JqZWN0KHtcbiAgICAgICAgICBpbWFnZV90b2tlbnM6IHo4Lm51bWJlcigpLm51bGxpc2goKSxcbiAgICAgICAgICB0ZXh0X3Rva2VuczogejgubnVtYmVyKCkubnVsbGlzaCgpXG4gICAgICAgIH0pLm51bGxpc2goKVxuICAgICAgfSkubnVsbGlzaCgpXG4gICAgfSlcbiAgKVxuKTtcblxuLy8gc3JjL2ltYWdlL29wZW5haS1pbWFnZS1vcHRpb25zLnRzXG52YXIgbW9kZWxNYXhJbWFnZXNQZXJDYWxsID0ge1xuICBcImRhbGwtZS0zXCI6IDEsXG4gIFwiZGFsbC1lLTJcIjogMTAsXG4gIFwiZ3B0LWltYWdlLTFcIjogMTAsXG4gIFwiZ3B0LWltYWdlLTEtbWluaVwiOiAxMCxcbiAgXCJncHQtaW1hZ2UtMS41XCI6IDEwLFxuICBcImNoYXRncHQtaW1hZ2UtbGF0ZXN0XCI6IDEwXG59O1xudmFyIGRlZmF1bHRSZXNwb25zZUZvcm1hdFByZWZpeGVzID0gW1xuICBcImNoYXRncHQtaW1hZ2UtXCIsXG4gIFwiZ3B0LWltYWdlLTEtbWluaVwiLFxuICBcImdwdC1pbWFnZS0xLjVcIixcbiAgXCJncHQtaW1hZ2UtMVwiXG5dO1xuZnVuY3Rpb24gaGFzRGVmYXVsdFJlc3BvbnNlRm9ybWF0KG1vZGVsSWQpIHtcbiAgcmV0dXJuIGRlZmF1bHRSZXNwb25zZUZvcm1hdFByZWZpeGVzLnNvbWUoXG4gICAgKHByZWZpeCkgPT4gbW9kZWxJZC5zdGFydHNXaXRoKHByZWZpeClcbiAgKTtcbn1cblxuLy8gc3JjL2ltYWdlL29wZW5haS1pbWFnZS1tb2RlbC50c1xudmFyIE9wZW5BSUltYWdlTW9kZWwgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsSWQsIGNvbmZpZykge1xuICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQ7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9IFwidjNcIjtcbiAgfVxuICBnZXQgbWF4SW1hZ2VzUGVyQ2FsbCgpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IG1vZGVsTWF4SW1hZ2VzUGVyQ2FsbFt0aGlzLm1vZGVsSWRdKSAhPSBudWxsID8gX2EgOiAxO1xuICB9XG4gIGdldCBwcm92aWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucHJvdmlkZXI7XG4gIH1cbiAgYXN5bmMgZG9HZW5lcmF0ZSh7XG4gICAgcHJvbXB0LFxuICAgIGZpbGVzLFxuICAgIG1hc2ssXG4gICAgbixcbiAgICBzaXplLFxuICAgIGFzcGVjdFJhdGlvLFxuICAgIHNlZWQsXG4gICAgcHJvdmlkZXJPcHRpb25zLFxuICAgIGhlYWRlcnMsXG4gICAgYWJvcnRTaWduYWxcbiAgfSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9pLCBfaiwgX2s7XG4gICAgY29uc3Qgd2FybmluZ3MgPSBbXTtcbiAgICBpZiAoYXNwZWN0UmF0aW8gIT0gbnVsbCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgZmVhdHVyZTogXCJhc3BlY3RSYXRpb1wiLFxuICAgICAgICBkZXRhaWxzOiBcIlRoaXMgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCBhc3BlY3QgcmF0aW8uIFVzZSBgc2l6ZWAgaW5zdGVhZC5cIlxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzZWVkICE9IG51bGwpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goeyB0eXBlOiBcInVuc3VwcG9ydGVkXCIsIGZlYXR1cmU6IFwic2VlZFwiIH0pO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IChfYyA9IChfYiA9IChfYSA9IHRoaXMuY29uZmlnLl9pbnRlcm5hbCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmN1cnJlbnREYXRlKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChfYSkpICE9IG51bGwgPyBfYyA6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuICAgIGlmIChmaWxlcyAhPSBudWxsKSB7XG4gICAgICBjb25zdCB7IHZhbHVlOiByZXNwb25zZTIsIHJlc3BvbnNlSGVhZGVyczogcmVzcG9uc2VIZWFkZXJzMiB9ID0gYXdhaXQgcG9zdEZvcm1EYXRhVG9BcGkoe1xuICAgICAgICB1cmw6IHRoaXMuY29uZmlnLnVybCh7XG4gICAgICAgICAgcGF0aDogXCIvaW1hZ2VzL2VkaXRzXCIsXG4gICAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkXG4gICAgICAgIH0pLFxuICAgICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVyczQodGhpcy5jb25maWcuaGVhZGVycygpLCBoZWFkZXJzKSxcbiAgICAgICAgZm9ybURhdGE6IGNvbnZlcnRUb0Zvcm1EYXRhKHtcbiAgICAgICAgICBtb2RlbDogdGhpcy5tb2RlbElkLFxuICAgICAgICAgIHByb21wdCxcbiAgICAgICAgICBpbWFnZTogYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBmaWxlcy5tYXAoXG4gICAgICAgICAgICAgIChmaWxlKSA9PiBmaWxlLnR5cGUgPT09IFwiZmlsZVwiID8gbmV3IEJsb2IoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgZmlsZS5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IG5ldyBCbG9iKFtmaWxlLmRhdGFdLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUubWVkaWFUeXBlXG4gICAgICAgICAgICAgICAgICB9KSA6IG5ldyBCbG9iKFtjb252ZXJ0QmFzZTY0VG9VaW50OEFycmF5KGZpbGUuZGF0YSldLCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUubWVkaWFUeXBlXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgeyB0eXBlOiBmaWxlLm1lZGlhVHlwZSB9XG4gICAgICAgICAgICAgICkgOiBkb3dubG9hZEJsb2IoZmlsZS51cmwpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtYXNrOiBtYXNrICE9IG51bGwgPyBhd2FpdCBmaWxlVG9CbG9iKG1hc2spIDogdm9pZCAwLFxuICAgICAgICAgIG4sXG4gICAgICAgICAgc2l6ZSxcbiAgICAgICAgICAuLi4oX2QgPSBwcm92aWRlck9wdGlvbnMub3BlbmFpKSAhPSBudWxsID8gX2QgOiB7fVxuICAgICAgICB9KSxcbiAgICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBvcGVuYWlGYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gICAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXI0KFxuICAgICAgICAgIG9wZW5haUltYWdlUmVzcG9uc2VTY2hlbWFcbiAgICAgICAgKSxcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbWFnZXM6IHJlc3BvbnNlMi5kYXRhLm1hcCgoaXRlbSkgPT4gaXRlbS5iNjRfanNvbiksXG4gICAgICAgIHdhcm5pbmdzLFxuICAgICAgICB1c2FnZTogcmVzcG9uc2UyLnVzYWdlICE9IG51bGwgPyB7XG4gICAgICAgICAgaW5wdXRUb2tlbnM6IChfZSA9IHJlc3BvbnNlMi51c2FnZS5pbnB1dF90b2tlbnMpICE9IG51bGwgPyBfZSA6IHZvaWQgMCxcbiAgICAgICAgICBvdXRwdXRUb2tlbnM6IChfZiA9IHJlc3BvbnNlMi51c2FnZS5vdXRwdXRfdG9rZW5zKSAhPSBudWxsID8gX2YgOiB2b2lkIDAsXG4gICAgICAgICAgdG90YWxUb2tlbnM6IChfZyA9IHJlc3BvbnNlMi51c2FnZS50b3RhbF90b2tlbnMpICE9IG51bGwgPyBfZyA6IHZvaWQgMFxuICAgICAgICB9IDogdm9pZCAwLFxuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIHRpbWVzdGFtcDogY3VycmVudERhdGUsXG4gICAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkLFxuICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVyczJcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgIG9wZW5haToge1xuICAgICAgICAgICAgaW1hZ2VzOiByZXNwb25zZTIuZGF0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIHZhciBfYTIsIF9iMiwgX2MyLCBfZDIsIF9lMiwgX2YyO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLml0ZW0ucmV2aXNlZF9wcm9tcHQgPyB7IHJldmlzZWRQcm9tcHQ6IGl0ZW0ucmV2aXNlZF9wcm9tcHQgfSA6IHt9LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IChfYTIgPSByZXNwb25zZTIuY3JlYXRlZCkgIT0gbnVsbCA/IF9hMiA6IHZvaWQgMCxcbiAgICAgICAgICAgICAgICBzaXplOiAoX2IyID0gcmVzcG9uc2UyLnNpemUpICE9IG51bGwgPyBfYjIgOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgcXVhbGl0eTogKF9jMiA9IHJlc3BvbnNlMi5xdWFsaXR5KSAhPSBudWxsID8gX2MyIDogdm9pZCAwLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IChfZDIgPSByZXNwb25zZTIuYmFja2dyb3VuZCkgIT0gbnVsbCA/IF9kMiA6IHZvaWQgMCxcbiAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQ6IChfZTIgPSByZXNwb25zZTIub3V0cHV0X2Zvcm1hdCkgIT0gbnVsbCA/IF9lMiA6IHZvaWQgMCxcbiAgICAgICAgICAgICAgICAuLi5kaXN0cmlidXRlVG9rZW5EZXRhaWxzKFxuICAgICAgICAgICAgICAgICAgKF9mMiA9IHJlc3BvbnNlMi51c2FnZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9mMi5pbnB1dF90b2tlbnNfZGV0YWlscyxcbiAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2UyLmRhdGEubGVuZ3RoXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHsgdmFsdWU6IHJlc3BvbnNlLCByZXNwb25zZUhlYWRlcnMgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGk0KHtcbiAgICAgIHVybDogdGhpcy5jb25maWcudXJsKHtcbiAgICAgICAgcGF0aDogXCIvaW1hZ2VzL2dlbmVyYXRpb25zXCIsXG4gICAgICAgIG1vZGVsSWQ6IHRoaXMubW9kZWxJZFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVyczQodGhpcy5jb25maWcuaGVhZGVycygpLCBoZWFkZXJzKSxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgbW9kZWw6IHRoaXMubW9kZWxJZCxcbiAgICAgICAgcHJvbXB0LFxuICAgICAgICBuLFxuICAgICAgICBzaXplLFxuICAgICAgICAuLi4oX2ggPSBwcm92aWRlck9wdGlvbnMub3BlbmFpKSAhPSBudWxsID8gX2ggOiB7fSxcbiAgICAgICAgLi4uIWhhc0RlZmF1bHRSZXNwb25zZUZvcm1hdCh0aGlzLm1vZGVsSWQpID8geyByZXNwb25zZV9mb3JtYXQ6IFwiYjY0X2pzb25cIiB9IDoge31cbiAgICAgIH0sXG4gICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IG9wZW5haUZhaWxlZFJlc3BvbnNlSGFuZGxlcixcbiAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXI0KFxuICAgICAgICBvcGVuYWlJbWFnZVJlc3BvbnNlU2NoZW1hXG4gICAgICApLFxuICAgICAgYWJvcnRTaWduYWwsXG4gICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgaW1hZ2VzOiByZXNwb25zZS5kYXRhLm1hcCgoaXRlbSkgPT4gaXRlbS5iNjRfanNvbiksXG4gICAgICB3YXJuaW5ncyxcbiAgICAgIHVzYWdlOiByZXNwb25zZS51c2FnZSAhPSBudWxsID8ge1xuICAgICAgICBpbnB1dFRva2VuczogKF9pID0gcmVzcG9uc2UudXNhZ2UuaW5wdXRfdG9rZW5zKSAhPSBudWxsID8gX2kgOiB2b2lkIDAsXG4gICAgICAgIG91dHB1dFRva2VuczogKF9qID0gcmVzcG9uc2UudXNhZ2Uub3V0cHV0X3Rva2VucykgIT0gbnVsbCA/IF9qIDogdm9pZCAwLFxuICAgICAgICB0b3RhbFRva2VuczogKF9rID0gcmVzcG9uc2UudXNhZ2UudG90YWxfdG9rZW5zKSAhPSBudWxsID8gX2sgOiB2b2lkIDBcbiAgICAgIH0gOiB2b2lkIDAsXG4gICAgICByZXNwb25zZToge1xuICAgICAgICB0aW1lc3RhbXA6IGN1cnJlbnREYXRlLFxuICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVyc1xuICAgICAgfSxcbiAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgb3BlbmFpOiB7XG4gICAgICAgICAgaW1hZ2VzOiByZXNwb25zZS5kYXRhLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTIsIF9iMiwgX2MyLCBfZDIsIF9lMiwgX2YyO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uaXRlbS5yZXZpc2VkX3Byb21wdCA/IHsgcmV2aXNlZFByb21wdDogaXRlbS5yZXZpc2VkX3Byb21wdCB9IDoge30sXG4gICAgICAgICAgICAgIGNyZWF0ZWQ6IChfYTIgPSByZXNwb25zZS5jcmVhdGVkKSAhPSBudWxsID8gX2EyIDogdm9pZCAwLFxuICAgICAgICAgICAgICBzaXplOiAoX2IyID0gcmVzcG9uc2Uuc2l6ZSkgIT0gbnVsbCA/IF9iMiA6IHZvaWQgMCxcbiAgICAgICAgICAgICAgcXVhbGl0eTogKF9jMiA9IHJlc3BvbnNlLnF1YWxpdHkpICE9IG51bGwgPyBfYzIgOiB2b2lkIDAsXG4gICAgICAgICAgICAgIGJhY2tncm91bmQ6IChfZDIgPSByZXNwb25zZS5iYWNrZ3JvdW5kKSAhPSBudWxsID8gX2QyIDogdm9pZCAwLFxuICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQ6IChfZTIgPSByZXNwb25zZS5vdXRwdXRfZm9ybWF0KSAhPSBudWxsID8gX2UyIDogdm9pZCAwLFxuICAgICAgICAgICAgICAuLi5kaXN0cmlidXRlVG9rZW5EZXRhaWxzKFxuICAgICAgICAgICAgICAgIChfZjIgPSByZXNwb25zZS51c2FnZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9mMi5pbnB1dF90b2tlbnNfZGV0YWlscyxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICByZXNwb25zZS5kYXRhLmxlbmd0aFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuZnVuY3Rpb24gZGlzdHJpYnV0ZVRva2VuRGV0YWlscyhkZXRhaWxzLCBpbmRleCwgdG90YWwpIHtcbiAgaWYgKGRldGFpbHMgPT0gbnVsbCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgaWYgKGRldGFpbHMuaW1hZ2VfdG9rZW5zICE9IG51bGwpIHtcbiAgICBjb25zdCBiYXNlID0gTWF0aC5mbG9vcihkZXRhaWxzLmltYWdlX3Rva2VucyAvIHRvdGFsKTtcbiAgICBjb25zdCByZW1haW5kZXIgPSBkZXRhaWxzLmltYWdlX3Rva2VucyAtIGJhc2UgKiAodG90YWwgLSAxKTtcbiAgICByZXN1bHQuaW1hZ2VUb2tlbnMgPSBpbmRleCA9PT0gdG90YWwgLSAxID8gcmVtYWluZGVyIDogYmFzZTtcbiAgfVxuICBpZiAoZGV0YWlscy50ZXh0X3Rva2VucyAhPSBudWxsKSB7XG4gICAgY29uc3QgYmFzZSA9IE1hdGguZmxvb3IoZGV0YWlscy50ZXh0X3Rva2VucyAvIHRvdGFsKTtcbiAgICBjb25zdCByZW1haW5kZXIgPSBkZXRhaWxzLnRleHRfdG9rZW5zIC0gYmFzZSAqICh0b3RhbCAtIDEpO1xuICAgIHJlc3VsdC50ZXh0VG9rZW5zID0gaW5kZXggPT09IHRvdGFsIC0gMSA/IHJlbWFpbmRlciA6IGJhc2U7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmFzeW5jIGZ1bmN0aW9uIGZpbGVUb0Jsb2IoZmlsZSkge1xuICBpZiAoIWZpbGUpIHJldHVybiB2b2lkIDA7XG4gIGlmIChmaWxlLnR5cGUgPT09IFwidXJsXCIpIHtcbiAgICByZXR1cm4gZG93bmxvYWRCbG9iKGZpbGUudXJsKTtcbiAgfVxuICBjb25zdCBkYXRhID0gZmlsZS5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGZpbGUuZGF0YSA6IGNvbnZlcnRCYXNlNjRUb1VpbnQ4QXJyYXkoZmlsZS5kYXRhKTtcbiAgcmV0dXJuIG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlOiBmaWxlLm1lZGlhVHlwZSB9KTtcbn1cblxuLy8gc3JjL3Rvb2wvYXBwbHktcGF0Y2gudHNcbmltcG9ydCB7XG4gIGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hLFxuICBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWE4LFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hOFxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6OSB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBhcHBseVBhdGNoSW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hOChcbiAgKCkgPT4gem9kU2NoZW1hOChcbiAgICB6OS5vYmplY3Qoe1xuICAgICAgY2FsbElkOiB6OS5zdHJpbmcoKSxcbiAgICAgIG9wZXJhdGlvbjogejkuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgIHo5Lm9iamVjdCh7XG4gICAgICAgICAgdHlwZTogejkubGl0ZXJhbChcImNyZWF0ZV9maWxlXCIpLFxuICAgICAgICAgIHBhdGg6IHo5LnN0cmluZygpLFxuICAgICAgICAgIGRpZmY6IHo5LnN0cmluZygpXG4gICAgICAgIH0pLFxuICAgICAgICB6OS5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHo5LmxpdGVyYWwoXCJkZWxldGVfZmlsZVwiKSxcbiAgICAgICAgICBwYXRoOiB6OS5zdHJpbmcoKVxuICAgICAgICB9KSxcbiAgICAgICAgejkub2JqZWN0KHtcbiAgICAgICAgICB0eXBlOiB6OS5saXRlcmFsKFwidXBkYXRlX2ZpbGVcIiksXG4gICAgICAgICAgcGF0aDogejkuc3RyaW5nKCksXG4gICAgICAgICAgZGlmZjogejkuc3RyaW5nKClcbiAgICAgICAgfSlcbiAgICAgIF0pXG4gICAgfSlcbiAgKVxuKTtcbnZhciBhcHBseVBhdGNoT3V0cHV0U2NoZW1hID0gbGF6eVNjaGVtYTgoXG4gICgpID0+IHpvZFNjaGVtYTgoXG4gICAgejkub2JqZWN0KHtcbiAgICAgIHN0YXR1czogejkuZW51bShbXCJjb21wbGV0ZWRcIiwgXCJmYWlsZWRcIl0pLFxuICAgICAgb3V0cHV0OiB6OS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgfSlcbiAgKVxuKTtcbnZhciBhcHBseVBhdGNoQXJnc1NjaGVtYSA9IGxhenlTY2hlbWE4KCgpID0+IHpvZFNjaGVtYTgoejkub2JqZWN0KHt9KSkpO1xudmFyIGFwcGx5UGF0Y2hUb29sRmFjdG9yeSA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hKHtcbiAgaWQ6IFwib3BlbmFpLmFwcGx5X3BhdGNoXCIsXG4gIGlucHV0U2NoZW1hOiBhcHBseVBhdGNoSW5wdXRTY2hlbWEsXG4gIG91dHB1dFNjaGVtYTogYXBwbHlQYXRjaE91dHB1dFNjaGVtYVxufSk7XG52YXIgYXBwbHlQYXRjaCA9IGFwcGx5UGF0Y2hUb29sRmFjdG9yeTtcblxuLy8gc3JjL3Rvb2wvY29kZS1pbnRlcnByZXRlci50c1xuaW1wb3J0IHtcbiAgY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWEgYXMgY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWEyLFxuICBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWE5LFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hOVxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6MTAgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgY29kZUludGVycHJldGVySW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hOShcbiAgKCkgPT4gem9kU2NoZW1hOShcbiAgICB6MTAub2JqZWN0KHtcbiAgICAgIGNvZGU6IHoxMC5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICBjb250YWluZXJJZDogejEwLnN0cmluZygpXG4gICAgfSlcbiAgKVxuKTtcbnZhciBjb2RlSW50ZXJwcmV0ZXJPdXRwdXRTY2hlbWEgPSBsYXp5U2NoZW1hOShcbiAgKCkgPT4gem9kU2NoZW1hOShcbiAgICB6MTAub2JqZWN0KHtcbiAgICAgIG91dHB1dHM6IHoxMC5hcnJheShcbiAgICAgICAgejEwLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgIHoxMC5vYmplY3QoeyB0eXBlOiB6MTAubGl0ZXJhbChcImxvZ3NcIiksIGxvZ3M6IHoxMC5zdHJpbmcoKSB9KSxcbiAgICAgICAgICB6MTAub2JqZWN0KHsgdHlwZTogejEwLmxpdGVyYWwoXCJpbWFnZVwiKSwgdXJsOiB6MTAuc3RyaW5nKCkgfSlcbiAgICAgICAgXSlcbiAgICAgICkubnVsbGlzaCgpXG4gICAgfSlcbiAgKVxuKTtcbnZhciBjb2RlSW50ZXJwcmV0ZXJBcmdzU2NoZW1hID0gbGF6eVNjaGVtYTkoXG4gICgpID0+IHpvZFNjaGVtYTkoXG4gICAgejEwLm9iamVjdCh7XG4gICAgICBjb250YWluZXI6IHoxMC51bmlvbihbXG4gICAgICAgIHoxMC5zdHJpbmcoKSxcbiAgICAgICAgejEwLm9iamVjdCh7XG4gICAgICAgICAgZmlsZUlkczogejEwLmFycmF5KHoxMC5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICAgICAgICB9KVxuICAgICAgXSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG52YXIgY29kZUludGVycHJldGVyVG9vbEZhY3RvcnkgPSBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTIoe1xuICBpZDogXCJvcGVuYWkuY29kZV9pbnRlcnByZXRlclwiLFxuICBpbnB1dFNjaGVtYTogY29kZUludGVycHJldGVySW5wdXRTY2hlbWEsXG4gIG91dHB1dFNjaGVtYTogY29kZUludGVycHJldGVyT3V0cHV0U2NoZW1hXG59KTtcbnZhciBjb2RlSW50ZXJwcmV0ZXIgPSAoYXJncyA9IHt9KSA9PiB7XG4gIHJldHVybiBjb2RlSW50ZXJwcmV0ZXJUb29sRmFjdG9yeShhcmdzKTtcbn07XG5cbi8vIHNyYy90b29sL2N1c3RvbS50c1xuaW1wb3J0IHtcbiAgY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeSxcbiAgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMTAsXG4gIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWExMFxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6MTEgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgY3VzdG9tQXJnc1NjaGVtYSA9IGxhenlTY2hlbWExMChcbiAgKCkgPT4gem9kU2NoZW1hMTAoXG4gICAgejExLm9iamVjdCh7XG4gICAgICBuYW1lOiB6MTEuc3RyaW5nKCksXG4gICAgICBkZXNjcmlwdGlvbjogejExLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICBmb3JtYXQ6IHoxMS51bmlvbihbXG4gICAgICAgIHoxMS5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHoxMS5saXRlcmFsKFwiZ3JhbW1hclwiKSxcbiAgICAgICAgICBzeW50YXg6IHoxMS5lbnVtKFtcInJlZ2V4XCIsIFwibGFya1wiXSksXG4gICAgICAgICAgZGVmaW5pdGlvbjogejExLnN0cmluZygpXG4gICAgICAgIH0pLFxuICAgICAgICB6MTEub2JqZWN0KHtcbiAgICAgICAgICB0eXBlOiB6MTEubGl0ZXJhbChcInRleHRcIilcbiAgICAgICAgfSlcbiAgICAgIF0pLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG4pO1xudmFyIGN1c3RvbUlucHV0U2NoZW1hID0gbGF6eVNjaGVtYTEwKCgpID0+IHpvZFNjaGVtYTEwKHoxMS5zdHJpbmcoKSkpO1xudmFyIGN1c3RvbVRvb2xGYWN0b3J5ID0gY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeSh7XG4gIGlkOiBcIm9wZW5haS5jdXN0b21cIixcbiAgaW5wdXRTY2hlbWE6IGN1c3RvbUlucHV0U2NoZW1hXG59KTtcbnZhciBjdXN0b21Ub29sID0gKGFyZ3MpID0+IGN1c3RvbVRvb2xGYWN0b3J5KGFyZ3MpO1xuXG4vLyBzcmMvdG9vbC9maWxlLXNlYXJjaC50c1xuaW1wb3J0IHtcbiAgY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWEgYXMgY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWEzLFxuICBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWExMSxcbiAgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTExXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoxMiB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBjb21wYXJpc29uRmlsdGVyU2NoZW1hID0gejEyLm9iamVjdCh7XG4gIGtleTogejEyLnN0cmluZygpLFxuICB0eXBlOiB6MTIuZW51bShbXCJlcVwiLCBcIm5lXCIsIFwiZ3RcIiwgXCJndGVcIiwgXCJsdFwiLCBcImx0ZVwiLCBcImluXCIsIFwibmluXCJdKSxcbiAgdmFsdWU6IHoxMi51bmlvbihbejEyLnN0cmluZygpLCB6MTIubnVtYmVyKCksIHoxMi5ib29sZWFuKCksIHoxMi5hcnJheSh6MTIuc3RyaW5nKCkpXSlcbn0pO1xudmFyIGNvbXBvdW5kRmlsdGVyU2NoZW1hID0gejEyLm9iamVjdCh7XG4gIHR5cGU6IHoxMi5lbnVtKFtcImFuZFwiLCBcIm9yXCJdKSxcbiAgZmlsdGVyczogejEyLmFycmF5KFxuICAgIHoxMi51bmlvbihbY29tcGFyaXNvbkZpbHRlclNjaGVtYSwgejEyLmxhenkoKCkgPT4gY29tcG91bmRGaWx0ZXJTY2hlbWEpXSlcbiAgKVxufSk7XG52YXIgZmlsZVNlYXJjaEFyZ3NTY2hlbWEgPSBsYXp5U2NoZW1hMTEoXG4gICgpID0+IHpvZFNjaGVtYTExKFxuICAgIHoxMi5vYmplY3Qoe1xuICAgICAgdmVjdG9yU3RvcmVJZHM6IHoxMi5hcnJheSh6MTIuc3RyaW5nKCkpLFxuICAgICAgbWF4TnVtUmVzdWx0czogejEyLm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICByYW5raW5nOiB6MTIub2JqZWN0KHtcbiAgICAgICAgcmFua2VyOiB6MTIuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgc2NvcmVUaHJlc2hvbGQ6IHoxMi5udW1iZXIoKS5vcHRpb25hbCgpXG4gICAgICB9KS5vcHRpb25hbCgpLFxuICAgICAgZmlsdGVyczogejEyLnVuaW9uKFtjb21wYXJpc29uRmlsdGVyU2NoZW1hLCBjb21wb3VuZEZpbHRlclNjaGVtYV0pLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG4pO1xudmFyIGZpbGVTZWFyY2hPdXRwdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTEoXG4gICgpID0+IHpvZFNjaGVtYTExKFxuICAgIHoxMi5vYmplY3Qoe1xuICAgICAgcXVlcmllczogejEyLmFycmF5KHoxMi5zdHJpbmcoKSksXG4gICAgICByZXN1bHRzOiB6MTIuYXJyYXkoXG4gICAgICAgIHoxMi5vYmplY3Qoe1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHoxMi5yZWNvcmQoejEyLnN0cmluZygpLCB6MTIudW5rbm93bigpKSxcbiAgICAgICAgICBmaWxlSWQ6IHoxMi5zdHJpbmcoKSxcbiAgICAgICAgICBmaWxlbmFtZTogejEyLnN0cmluZygpLFxuICAgICAgICAgIHNjb3JlOiB6MTIubnVtYmVyKCksXG4gICAgICAgICAgdGV4dDogejEyLnN0cmluZygpXG4gICAgICAgIH0pXG4gICAgICApLm51bGxhYmxlKClcbiAgICB9KVxuICApXG4pO1xudmFyIGZpbGVTZWFyY2ggPSBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTMoe1xuICBpZDogXCJvcGVuYWkuZmlsZV9zZWFyY2hcIixcbiAgaW5wdXRTY2hlbWE6IHoxMi5vYmplY3Qoe30pLFxuICBvdXRwdXRTY2hlbWE6IGZpbGVTZWFyY2hPdXRwdXRTY2hlbWFcbn0pO1xuXG4vLyBzcmMvdG9vbC9pbWFnZS1nZW5lcmF0aW9uLnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSBhcyBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTQsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTEyLFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMTJcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejEzIH0gZnJvbSBcInpvZC92NFwiO1xudmFyIGltYWdlR2VuZXJhdGlvbkFyZ3NTY2hlbWEgPSBsYXp5U2NoZW1hMTIoXG4gICgpID0+IHpvZFNjaGVtYTEyKFxuICAgIHoxMy5vYmplY3Qoe1xuICAgICAgYmFja2dyb3VuZDogejEzLmVudW0oW1wiYXV0b1wiLCBcIm9wYXF1ZVwiLCBcInRyYW5zcGFyZW50XCJdKS5vcHRpb25hbCgpLFxuICAgICAgaW5wdXRGaWRlbGl0eTogejEzLmVudW0oW1wibG93XCIsIFwiaGlnaFwiXSkub3B0aW9uYWwoKSxcbiAgICAgIGlucHV0SW1hZ2VNYXNrOiB6MTMub2JqZWN0KHtcbiAgICAgICAgZmlsZUlkOiB6MTMuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgaW1hZ2VVcmw6IHoxMy5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICB9KS5vcHRpb25hbCgpLFxuICAgICAgbW9kZWw6IHoxMy5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgbW9kZXJhdGlvbjogejEzLmVudW0oW1wiYXV0b1wiXSkub3B0aW9uYWwoKSxcbiAgICAgIG91dHB1dENvbXByZXNzaW9uOiB6MTMubnVtYmVyKCkuaW50KCkubWluKDApLm1heCgxMDApLm9wdGlvbmFsKCksXG4gICAgICBvdXRwdXRGb3JtYXQ6IHoxMy5lbnVtKFtcInBuZ1wiLCBcImpwZWdcIiwgXCJ3ZWJwXCJdKS5vcHRpb25hbCgpLFxuICAgICAgcGFydGlhbEltYWdlczogejEzLm51bWJlcigpLmludCgpLm1pbigwKS5tYXgoMykub3B0aW9uYWwoKSxcbiAgICAgIHF1YWxpdHk6IHoxMy5lbnVtKFtcImF1dG9cIiwgXCJsb3dcIiwgXCJtZWRpdW1cIiwgXCJoaWdoXCJdKS5vcHRpb25hbCgpLFxuICAgICAgc2l6ZTogejEzLmVudW0oW1wiMTAyNHgxMDI0XCIsIFwiMTAyNHgxNTM2XCIsIFwiMTUzNngxMDI0XCIsIFwiYXV0b1wiXSkub3B0aW9uYWwoKVxuICAgIH0pLnN0cmljdCgpXG4gIClcbik7XG52YXIgaW1hZ2VHZW5lcmF0aW9uSW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTIoKCkgPT4gem9kU2NoZW1hMTIoejEzLm9iamVjdCh7fSkpKTtcbnZhciBpbWFnZUdlbmVyYXRpb25PdXRwdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTIoXG4gICgpID0+IHpvZFNjaGVtYTEyKHoxMy5vYmplY3QoeyByZXN1bHQ6IHoxMy5zdHJpbmcoKSB9KSlcbik7XG52YXIgaW1hZ2VHZW5lcmF0aW9uVG9vbEZhY3RvcnkgPSBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTQoe1xuICBpZDogXCJvcGVuYWkuaW1hZ2VfZ2VuZXJhdGlvblwiLFxuICBpbnB1dFNjaGVtYTogaW1hZ2VHZW5lcmF0aW9uSW5wdXRTY2hlbWEsXG4gIG91dHB1dFNjaGVtYTogaW1hZ2VHZW5lcmF0aW9uT3V0cHV0U2NoZW1hXG59KTtcbnZhciBpbWFnZUdlbmVyYXRpb24gPSAoYXJncyA9IHt9KSA9PiB7XG4gIHJldHVybiBpbWFnZUdlbmVyYXRpb25Ub29sRmFjdG9yeShhcmdzKTtcbn07XG5cbi8vIHNyYy90b29sL2xvY2FsLXNoZWxsLnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSBhcyBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTUsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTEzLFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMTNcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejE0IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIGxvY2FsU2hlbGxJbnB1dFNjaGVtYSA9IGxhenlTY2hlbWExMyhcbiAgKCkgPT4gem9kU2NoZW1hMTMoXG4gICAgejE0Lm9iamVjdCh7XG4gICAgICBhY3Rpb246IHoxNC5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MTQubGl0ZXJhbChcImV4ZWNcIiksXG4gICAgICAgIGNvbW1hbmQ6IHoxNC5hcnJheSh6MTQuc3RyaW5nKCkpLFxuICAgICAgICB0aW1lb3V0TXM6IHoxNC5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgICB1c2VyOiB6MTQuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgd29ya2luZ0RpcmVjdG9yeTogejE0LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIGVudjogejE0LnJlY29yZCh6MTQuc3RyaW5nKCksIHoxNC5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICAgICAgfSlcbiAgICB9KVxuICApXG4pO1xudmFyIGxvY2FsU2hlbGxPdXRwdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTMoXG4gICgpID0+IHpvZFNjaGVtYTEzKHoxNC5vYmplY3QoeyBvdXRwdXQ6IHoxNC5zdHJpbmcoKSB9KSlcbik7XG52YXIgbG9jYWxTaGVsbCA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hNSh7XG4gIGlkOiBcIm9wZW5haS5sb2NhbF9zaGVsbFwiLFxuICBpbnB1dFNjaGVtYTogbG9jYWxTaGVsbElucHV0U2NoZW1hLFxuICBvdXRwdXRTY2hlbWE6IGxvY2FsU2hlbGxPdXRwdXRTY2hlbWFcbn0pO1xuXG4vLyBzcmMvdG9vbC9zaGVsbC50c1xuaW1wb3J0IHtcbiAgY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWEgYXMgY3JlYXRlUHJvdmlkZXJUb29sRmFjdG9yeVdpdGhPdXRwdXRTY2hlbWE2LFxuICBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWExNCxcbiAgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTE0XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoxNSB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBzaGVsbElucHV0U2NoZW1hID0gbGF6eVNjaGVtYTE0KFxuICAoKSA9PiB6b2RTY2hlbWExNChcbiAgICB6MTUub2JqZWN0KHtcbiAgICAgIGFjdGlvbjogejE1Lm9iamVjdCh7XG4gICAgICAgIGNvbW1hbmRzOiB6MTUuYXJyYXkoejE1LnN0cmluZygpKSxcbiAgICAgICAgdGltZW91dE1zOiB6MTUubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAgICAgbWF4T3V0cHV0TGVuZ3RoOiB6MTUubnVtYmVyKCkub3B0aW9uYWwoKVxuICAgICAgfSlcbiAgICB9KVxuICApXG4pO1xudmFyIHNoZWxsT3V0cHV0U2NoZW1hID0gbGF6eVNjaGVtYTE0KFxuICAoKSA9PiB6b2RTY2hlbWExNChcbiAgICB6MTUub2JqZWN0KHtcbiAgICAgIG91dHB1dDogejE1LmFycmF5KFxuICAgICAgICB6MTUub2JqZWN0KHtcbiAgICAgICAgICBzdGRvdXQ6IHoxNS5zdHJpbmcoKSxcbiAgICAgICAgICBzdGRlcnI6IHoxNS5zdHJpbmcoKSxcbiAgICAgICAgICBvdXRjb21lOiB6MTUuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgICB6MTUub2JqZWN0KHsgdHlwZTogejE1LmxpdGVyYWwoXCJ0aW1lb3V0XCIpIH0pLFxuICAgICAgICAgICAgejE1Lm9iamVjdCh7IHR5cGU6IHoxNS5saXRlcmFsKFwiZXhpdFwiKSwgZXhpdENvZGU6IHoxNS5udW1iZXIoKSB9KVxuICAgICAgICAgIF0pXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSlcbiAgKVxuKTtcbnZhciBzaGVsbFNraWxsc1NjaGVtYSA9IHoxNS5hcnJheShcbiAgejE1LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgIHoxNS5vYmplY3Qoe1xuICAgICAgdHlwZTogejE1LmxpdGVyYWwoXCJza2lsbFJlZmVyZW5jZVwiKSxcbiAgICAgIHNraWxsSWQ6IHoxNS5zdHJpbmcoKSxcbiAgICAgIHZlcnNpb246IHoxNS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgfSksXG4gICAgejE1Lm9iamVjdCh7XG4gICAgICB0eXBlOiB6MTUubGl0ZXJhbChcImlubGluZVwiKSxcbiAgICAgIG5hbWU6IHoxNS5zdHJpbmcoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB6MTUuc3RyaW5nKCksXG4gICAgICBzb3VyY2U6IHoxNS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MTUubGl0ZXJhbChcImJhc2U2NFwiKSxcbiAgICAgICAgbWVkaWFUeXBlOiB6MTUubGl0ZXJhbChcImFwcGxpY2F0aW9uL3ppcFwiKSxcbiAgICAgICAgZGF0YTogejE1LnN0cmluZygpXG4gICAgICB9KVxuICAgIH0pXG4gIF0pXG4pLm9wdGlvbmFsKCk7XG52YXIgc2hlbGxBcmdzU2NoZW1hID0gbGF6eVNjaGVtYTE0KFxuICAoKSA9PiB6b2RTY2hlbWExNChcbiAgICB6MTUub2JqZWN0KHtcbiAgICAgIGVudmlyb25tZW50OiB6MTUudW5pb24oW1xuICAgICAgICB6MTUub2JqZWN0KHtcbiAgICAgICAgICB0eXBlOiB6MTUubGl0ZXJhbChcImNvbnRhaW5lckF1dG9cIiksXG4gICAgICAgICAgZmlsZUlkczogejE1LmFycmF5KHoxNS5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgICAgICBtZW1vcnlMaW1pdDogejE1LmVudW0oW1wiMWdcIiwgXCI0Z1wiLCBcIjE2Z1wiLCBcIjY0Z1wiXSkub3B0aW9uYWwoKSxcbiAgICAgICAgICBuZXR3b3JrUG9saWN5OiB6MTUuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgICB6MTUub2JqZWN0KHsgdHlwZTogejE1LmxpdGVyYWwoXCJkaXNhYmxlZFwiKSB9KSxcbiAgICAgICAgICAgIHoxNS5vYmplY3Qoe1xuICAgICAgICAgICAgICB0eXBlOiB6MTUubGl0ZXJhbChcImFsbG93bGlzdFwiKSxcbiAgICAgICAgICAgICAgYWxsb3dlZERvbWFpbnM6IHoxNS5hcnJheSh6MTUuc3RyaW5nKCkpLFxuICAgICAgICAgICAgICBkb21haW5TZWNyZXRzOiB6MTUuYXJyYXkoXG4gICAgICAgICAgICAgICAgejE1Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICBkb21haW46IHoxNS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHoxNS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB6MTUuc3RyaW5nKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApLm9wdGlvbmFsKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXSkub3B0aW9uYWwoKSxcbiAgICAgICAgICBza2lsbHM6IHNoZWxsU2tpbGxzU2NoZW1hXG4gICAgICAgIH0pLFxuICAgICAgICB6MTUub2JqZWN0KHtcbiAgICAgICAgICB0eXBlOiB6MTUubGl0ZXJhbChcImNvbnRhaW5lclJlZmVyZW5jZVwiKSxcbiAgICAgICAgICBjb250YWluZXJJZDogejE1LnN0cmluZygpXG4gICAgICAgIH0pLFxuICAgICAgICB6MTUub2JqZWN0KHtcbiAgICAgICAgICB0eXBlOiB6MTUubGl0ZXJhbChcImxvY2FsXCIpLm9wdGlvbmFsKCksXG4gICAgICAgICAgc2tpbGxzOiB6MTUuYXJyYXkoXG4gICAgICAgICAgICB6MTUub2JqZWN0KHtcbiAgICAgICAgICAgICAgbmFtZTogejE1LnN0cmluZygpLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogejE1LnN0cmluZygpLFxuICAgICAgICAgICAgICBwYXRoOiB6MTUuc3RyaW5nKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKS5vcHRpb25hbCgpXG4gICAgICAgIH0pXG4gICAgICBdKS5vcHRpb25hbCgpXG4gICAgfSlcbiAgKVxuKTtcbnZhciBzaGVsbCA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hNih7XG4gIGlkOiBcIm9wZW5haS5zaGVsbFwiLFxuICBpbnB1dFNjaGVtYTogc2hlbGxJbnB1dFNjaGVtYSxcbiAgb3V0cHV0U2NoZW1hOiBzaGVsbE91dHB1dFNjaGVtYVxufSk7XG5cbi8vIHNyYy90b29sL3Rvb2wtc2VhcmNoLnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSBhcyBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTcsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTE1LFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMTVcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejE2IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIHRvb2xTZWFyY2hBcmdzU2NoZW1hID0gbGF6eVNjaGVtYTE1KFxuICAoKSA9PiB6b2RTY2hlbWExNShcbiAgICB6MTYub2JqZWN0KHtcbiAgICAgIGV4ZWN1dGlvbjogejE2LmVudW0oW1wic2VydmVyXCIsIFwiY2xpZW50XCJdKS5vcHRpb25hbCgpLFxuICAgICAgZGVzY3JpcHRpb246IHoxNi5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgcGFyYW1ldGVyczogejE2LnJlY29yZCh6MTYuc3RyaW5nKCksIHoxNi51bmtub3duKCkpLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG4pO1xudmFyIHRvb2xTZWFyY2hJbnB1dFNjaGVtYSA9IGxhenlTY2hlbWExNShcbiAgKCkgPT4gem9kU2NoZW1hMTUoXG4gICAgejE2Lm9iamVjdCh7XG4gICAgICBhcmd1bWVudHM6IHoxNi51bmtub3duKCkub3B0aW9uYWwoKSxcbiAgICAgIGNhbGxfaWQ6IHoxNi5zdHJpbmcoKS5udWxsaXNoKClcbiAgICB9KVxuICApXG4pO1xudmFyIHRvb2xTZWFyY2hPdXRwdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTUoXG4gICgpID0+IHpvZFNjaGVtYTE1KFxuICAgIHoxNi5vYmplY3Qoe1xuICAgICAgdG9vbHM6IHoxNi5hcnJheSh6MTYucmVjb3JkKHoxNi5zdHJpbmcoKSwgejE2LnVua25vd24oKSkpXG4gICAgfSlcbiAgKVxuKTtcbnZhciB0b29sU2VhcmNoVG9vbEZhY3RvcnkgPSBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTcoe1xuICBpZDogXCJvcGVuYWkudG9vbF9zZWFyY2hcIixcbiAgaW5wdXRTY2hlbWE6IHRvb2xTZWFyY2hJbnB1dFNjaGVtYSxcbiAgb3V0cHV0U2NoZW1hOiB0b29sU2VhcmNoT3V0cHV0U2NoZW1hXG59KTtcbnZhciB0b29sU2VhcmNoID0gKGFyZ3MgPSB7fSkgPT4gdG9vbFNlYXJjaFRvb2xGYWN0b3J5KGFyZ3MpO1xuXG4vLyBzcmMvdG9vbC93ZWItc2VhcmNoLnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSBhcyBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTgsXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTE2LFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMTZcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejE3IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIHdlYlNlYXJjaEFyZ3NTY2hlbWEgPSBsYXp5U2NoZW1hMTYoXG4gICgpID0+IHpvZFNjaGVtYTE2KFxuICAgIHoxNy5vYmplY3Qoe1xuICAgICAgZXh0ZXJuYWxXZWJBY2Nlc3M6IHoxNy5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgIGZpbHRlcnM6IHoxNy5vYmplY3QoeyBhbGxvd2VkRG9tYWluczogejE3LmFycmF5KHoxNy5zdHJpbmcoKSkub3B0aW9uYWwoKSB9KS5vcHRpb25hbCgpLFxuICAgICAgc2VhcmNoQ29udGV4dFNpemU6IHoxNy5lbnVtKFtcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIl0pLm9wdGlvbmFsKCksXG4gICAgICB1c2VyTG9jYXRpb246IHoxNy5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MTcubGl0ZXJhbChcImFwcHJveGltYXRlXCIpLFxuICAgICAgICBjb3VudHJ5OiB6MTcuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgY2l0eTogejE3LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIHJlZ2lvbjogejE3LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIHRpbWV6b25lOiB6MTcuc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgICAgfSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG52YXIgd2ViU2VhcmNoSW5wdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTYoKCkgPT4gem9kU2NoZW1hMTYoejE3Lm9iamVjdCh7fSkpKTtcbnZhciB3ZWJTZWFyY2hPdXRwdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTYoXG4gICgpID0+IHpvZFNjaGVtYTE2KFxuICAgIHoxNy5vYmplY3Qoe1xuICAgICAgYWN0aW9uOiB6MTcuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgIHoxNy5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHoxNy5saXRlcmFsKFwic2VhcmNoXCIpLFxuICAgICAgICAgIHF1ZXJ5OiB6MTcuc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgICAgICB9KSxcbiAgICAgICAgejE3Lm9iamVjdCh7XG4gICAgICAgICAgdHlwZTogejE3LmxpdGVyYWwoXCJvcGVuUGFnZVwiKSxcbiAgICAgICAgICB1cmw6IHoxNy5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgfSksXG4gICAgICAgIHoxNy5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHoxNy5saXRlcmFsKFwiZmluZEluUGFnZVwiKSxcbiAgICAgICAgICB1cmw6IHoxNy5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgICAgcGF0dGVybjogejE3LnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICB9KVxuICAgICAgXSkub3B0aW9uYWwoKSxcbiAgICAgIHNvdXJjZXM6IHoxNy5hcnJheShcbiAgICAgICAgejE3LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgIHoxNy5vYmplY3QoeyB0eXBlOiB6MTcubGl0ZXJhbChcInVybFwiKSwgdXJsOiB6MTcuc3RyaW5nKCkgfSksXG4gICAgICAgICAgejE3Lm9iamVjdCh7IHR5cGU6IHoxNy5saXRlcmFsKFwiYXBpXCIpLCBuYW1lOiB6MTcuc3RyaW5nKCkgfSlcbiAgICAgICAgXSlcbiAgICAgICkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG52YXIgd2ViU2VhcmNoVG9vbEZhY3RvcnkgPSBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTgoe1xuICBpZDogXCJvcGVuYWkud2ViX3NlYXJjaFwiLFxuICBpbnB1dFNjaGVtYTogd2ViU2VhcmNoSW5wdXRTY2hlbWEsXG4gIG91dHB1dFNjaGVtYTogd2ViU2VhcmNoT3V0cHV0U2NoZW1hXG59KTtcbnZhciB3ZWJTZWFyY2ggPSAoYXJncyA9IHt9KSA9PiB3ZWJTZWFyY2hUb29sRmFjdG9yeShhcmdzKTtcblxuLy8gc3JjL3Rvb2wvd2ViLXNlYXJjaC1wcmV2aWV3LnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSBhcyBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTksXG4gIGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTE3LFxuICB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMTdcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejE4IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIHdlYlNlYXJjaFByZXZpZXdBcmdzU2NoZW1hID0gbGF6eVNjaGVtYTE3KFxuICAoKSA9PiB6b2RTY2hlbWExNyhcbiAgICB6MTgub2JqZWN0KHtcbiAgICAgIHNlYXJjaENvbnRleHRTaXplOiB6MTguZW51bShbXCJsb3dcIiwgXCJtZWRpdW1cIiwgXCJoaWdoXCJdKS5vcHRpb25hbCgpLFxuICAgICAgdXNlckxvY2F0aW9uOiB6MTgub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejE4LmxpdGVyYWwoXCJhcHByb3hpbWF0ZVwiKSxcbiAgICAgICAgY291bnRyeTogejE4LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIGNpdHk6IHoxOC5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICByZWdpb246IHoxOC5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICB0aW1lem9uZTogejE4LnN0cmluZygpLm9wdGlvbmFsKClcbiAgICAgIH0pLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG4pO1xudmFyIHdlYlNlYXJjaFByZXZpZXdJbnB1dFNjaGVtYSA9IGxhenlTY2hlbWExNyhcbiAgKCkgPT4gem9kU2NoZW1hMTcoejE4Lm9iamVjdCh7fSkpXG4pO1xudmFyIHdlYlNlYXJjaFByZXZpZXdPdXRwdXRTY2hlbWEgPSBsYXp5U2NoZW1hMTcoXG4gICgpID0+IHpvZFNjaGVtYTE3KFxuICAgIHoxOC5vYmplY3Qoe1xuICAgICAgYWN0aW9uOiB6MTguZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgIHoxOC5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHoxOC5saXRlcmFsKFwic2VhcmNoXCIpLFxuICAgICAgICAgIHF1ZXJ5OiB6MTguc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgICAgICB9KSxcbiAgICAgICAgejE4Lm9iamVjdCh7XG4gICAgICAgICAgdHlwZTogejE4LmxpdGVyYWwoXCJvcGVuUGFnZVwiKSxcbiAgICAgICAgICB1cmw6IHoxOC5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgfSksXG4gICAgICAgIHoxOC5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHoxOC5saXRlcmFsKFwiZmluZEluUGFnZVwiKSxcbiAgICAgICAgICB1cmw6IHoxOC5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgICAgcGF0dGVybjogejE4LnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICB9KVxuICAgICAgXSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG52YXIgd2ViU2VhcmNoUHJldmlldyA9IGNyZWF0ZVByb3ZpZGVyVG9vbEZhY3RvcnlXaXRoT3V0cHV0U2NoZW1hOSh7XG4gIGlkOiBcIm9wZW5haS53ZWJfc2VhcmNoX3ByZXZpZXdcIixcbiAgaW5wdXRTY2hlbWE6IHdlYlNlYXJjaFByZXZpZXdJbnB1dFNjaGVtYSxcbiAgb3V0cHV0U2NoZW1hOiB3ZWJTZWFyY2hQcmV2aWV3T3V0cHV0U2NoZW1hXG59KTtcblxuLy8gc3JjL3Rvb2wvbWNwLnRzXG5pbXBvcnQge1xuICBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYSBhcyBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTEwLFxuICBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWExOCxcbiAgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTE4XG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoxOSB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBqc29uVmFsdWVTY2hlbWEgPSB6MTkubGF6eShcbiAgKCkgPT4gejE5LnVuaW9uKFtcbiAgICB6MTkuc3RyaW5nKCksXG4gICAgejE5Lm51bWJlcigpLFxuICAgIHoxOS5ib29sZWFuKCksXG4gICAgejE5Lm51bGwoKSxcbiAgICB6MTkuYXJyYXkoanNvblZhbHVlU2NoZW1hKSxcbiAgICB6MTkucmVjb3JkKHoxOS5zdHJpbmcoKSwganNvblZhbHVlU2NoZW1hKVxuICBdKVxuKTtcbnZhciBtY3BBcmdzU2NoZW1hID0gbGF6eVNjaGVtYTE4KFxuICAoKSA9PiB6b2RTY2hlbWExOChcbiAgICB6MTkub2JqZWN0KHtcbiAgICAgIHNlcnZlckxhYmVsOiB6MTkuc3RyaW5nKCksXG4gICAgICBhbGxvd2VkVG9vbHM6IHoxOS51bmlvbihbXG4gICAgICAgIHoxOS5hcnJheSh6MTkuc3RyaW5nKCkpLFxuICAgICAgICB6MTkub2JqZWN0KHtcbiAgICAgICAgICByZWFkT25seTogejE5LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICAgIHRvb2xOYW1lczogejE5LmFycmF5KHoxOS5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICAgICAgICB9KVxuICAgICAgXSkub3B0aW9uYWwoKSxcbiAgICAgIGF1dGhvcml6YXRpb246IHoxOS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgY29ubmVjdG9ySWQ6IHoxOS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgaGVhZGVyczogejE5LnJlY29yZCh6MTkuc3RyaW5nKCksIHoxOS5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHJlcXVpcmVBcHByb3ZhbDogejE5LnVuaW9uKFtcbiAgICAgICAgejE5LmVudW0oW1wiYWx3YXlzXCIsIFwibmV2ZXJcIl0pLFxuICAgICAgICB6MTkub2JqZWN0KHtcbiAgICAgICAgICBuZXZlcjogejE5Lm9iamVjdCh7XG4gICAgICAgICAgICB0b29sTmFtZXM6IHoxOS5hcnJheSh6MTkuc3RyaW5nKCkpLm9wdGlvbmFsKClcbiAgICAgICAgICB9KS5vcHRpb25hbCgpXG4gICAgICAgIH0pXG4gICAgICBdKS5vcHRpb25hbCgpLFxuICAgICAgc2VydmVyRGVzY3JpcHRpb246IHoxOS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgc2VydmVyVXJsOiB6MTkuc3RyaW5nKCkub3B0aW9uYWwoKVxuICAgIH0pLnJlZmluZShcbiAgICAgICh2KSA9PiB2LnNlcnZlclVybCAhPSBudWxsIHx8IHYuY29ubmVjdG9ySWQgIT0gbnVsbCxcbiAgICAgIFwiT25lIG9mIHNlcnZlclVybCBvciBjb25uZWN0b3JJZCBtdXN0IGJlIHByb3ZpZGVkLlwiXG4gICAgKVxuICApXG4pO1xudmFyIG1jcElucHV0U2NoZW1hID0gbGF6eVNjaGVtYTE4KCgpID0+IHpvZFNjaGVtYTE4KHoxOS5vYmplY3Qoe30pKSk7XG52YXIgbWNwT3V0cHV0U2NoZW1hID0gbGF6eVNjaGVtYTE4KFxuICAoKSA9PiB6b2RTY2hlbWExOChcbiAgICB6MTkub2JqZWN0KHtcbiAgICAgIHR5cGU6IHoxOS5saXRlcmFsKFwiY2FsbFwiKSxcbiAgICAgIHNlcnZlckxhYmVsOiB6MTkuc3RyaW5nKCksXG4gICAgICBuYW1lOiB6MTkuc3RyaW5nKCksXG4gICAgICBhcmd1bWVudHM6IHoxOS5zdHJpbmcoKSxcbiAgICAgIG91dHB1dDogejE5LnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIGVycm9yOiB6MTkudW5pb24oW3oxOS5zdHJpbmcoKSwganNvblZhbHVlU2NoZW1hXSkub3B0aW9uYWwoKVxuICAgIH0pXG4gIClcbik7XG52YXIgbWNwVG9vbEZhY3RvcnkgPSBjcmVhdGVQcm92aWRlclRvb2xGYWN0b3J5V2l0aE91dHB1dFNjaGVtYTEwKHtcbiAgaWQ6IFwib3BlbmFpLm1jcFwiLFxuICBpbnB1dFNjaGVtYTogbWNwSW5wdXRTY2hlbWEsXG4gIG91dHB1dFNjaGVtYTogbWNwT3V0cHV0U2NoZW1hXG59KTtcbnZhciBtY3AgPSAoYXJncykgPT4gbWNwVG9vbEZhY3RvcnkoYXJncyk7XG5cbi8vIHNyYy9vcGVuYWktdG9vbHMudHNcbnZhciBvcGVuYWlUb29scyA9IHtcbiAgLyoqXG4gICAqIFRoZSBhcHBseV9wYXRjaCB0b29sIGxldHMgR1BULTUuMSBjcmVhdGUsIHVwZGF0ZSwgYW5kIGRlbGV0ZSBmaWxlcyBpbiB5b3VyXG4gICAqIGNvZGViYXNlIHVzaW5nIHN0cnVjdHVyZWQgZGlmZnMuIEluc3RlYWQgb2YganVzdCBzdWdnZXN0aW5nIGVkaXRzLCB0aGUgbW9kZWxcbiAgICogZW1pdHMgcGF0Y2ggb3BlcmF0aW9ucyB0aGF0IHlvdXIgYXBwbGljYXRpb24gYXBwbGllcyBhbmQgdGhlbiByZXBvcnRzIGJhY2sgb24sXG4gICAqIGVuYWJsaW5nIGl0ZXJhdGl2ZSwgbXVsdGktc3RlcCBjb2RlIGVkaXRpbmcgd29ya2Zsb3dzLlxuICAgKlxuICAgKi9cbiAgYXBwbHlQYXRjaCxcbiAgLyoqXG4gICAqIEN1c3RvbSB0b29scyBsZXQgY2FsbGVycyBjb25zdHJhaW4gbW9kZWwgb3V0cHV0IHRvIGEgZ3JhbW1hciAocmVnZXggb3JcbiAgICogTGFyayBzeW50YXgpLiBUaGUgbW9kZWwgcmV0dXJucyBhIGBjdXN0b21fdG9vbF9jYWxsYCBvdXRwdXQgaXRlbSB3aG9zZVxuICAgKiBgaW5wdXRgIGZpZWxkIGlzIGEgc3RyaW5nIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgZ3JhbW1hci5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIHRvb2wuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSB0b29sLlxuICAgKiBAcGFyYW0gZm9ybWF0IC0gVGhlIG91dHB1dCBmb3JtYXQgY29uc3RyYWludCAoZ3JhbW1hciB0eXBlLCBzeW50YXgsIGFuZCBkZWZpbml0aW9uKS5cbiAgICovXG4gIGN1c3RvbVRvb2wsXG4gIC8qKlxuICAgKiBUaGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGFsbG93cyBtb2RlbHMgdG8gd3JpdGUgYW5kIHJ1biBQeXRob24gY29kZSBpbiBhXG4gICAqIHNhbmRib3hlZCBlbnZpcm9ubWVudCB0byBzb2x2ZSBjb21wbGV4IHByb2JsZW1zIGluIGRvbWFpbnMgbGlrZSBkYXRhIGFuYWx5c2lzLFxuICAgKiBjb2RpbmcsIGFuZCBtYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gVGhlIGNvbnRhaW5lciB0byB1c2UgZm9yIHRoZSBjb2RlIGludGVycHJldGVyLlxuICAgKi9cbiAgY29kZUludGVycHJldGVyLFxuICAvKipcbiAgICogRmlsZSBzZWFyY2ggaXMgYSB0b29sIGF2YWlsYWJsZSBpbiB0aGUgUmVzcG9uc2VzIEFQSS4gSXQgZW5hYmxlcyBtb2RlbHMgdG9cbiAgICogcmV0cmlldmUgaW5mb3JtYXRpb24gaW4gYSBrbm93bGVkZ2UgYmFzZSBvZiBwcmV2aW91c2x5IHVwbG9hZGVkIGZpbGVzIHRocm91Z2hcbiAgICogc2VtYW50aWMgYW5kIGtleXdvcmQgc2VhcmNoLlxuICAgKlxuICAgKiBAcGFyYW0gdmVjdG9yU3RvcmVJZHMgLSBUaGUgdmVjdG9yIHN0b3JlIElEcyB0byB1c2UgZm9yIHRoZSBmaWxlIHNlYXJjaC5cbiAgICogQHBhcmFtIG1heE51bVJlc3VsdHMgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSByYW5raW5nIC0gVGhlIHJhbmtpbmcgb3B0aW9ucyB0byB1c2UgZm9yIHRoZSBmaWxlIHNlYXJjaC5cbiAgICogQHBhcmFtIGZpbHRlcnMgLSBUaGUgZmlsdGVycyB0byB1c2UgZm9yIHRoZSBmaWxlIHNlYXJjaC5cbiAgICovXG4gIGZpbGVTZWFyY2gsXG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgZ2VuZXJhdGlvbiB0b29sIGFsbG93cyB5b3UgdG8gZ2VuZXJhdGUgaW1hZ2VzIHVzaW5nIGEgdGV4dCBwcm9tcHQsXG4gICAqIGFuZCBvcHRpb25hbGx5IGltYWdlIGlucHV0cy4gSXQgbGV2ZXJhZ2VzIHRoZSBHUFQgSW1hZ2UgbW9kZWwsXG4gICAqIGFuZCBhdXRvbWF0aWNhbGx5IG9wdGltaXplcyB0ZXh0IGlucHV0cyBmb3IgaW1wcm92ZWQgcGVyZm9ybWFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBiYWNrZ3JvdW5kIC0gQmFja2dyb3VuZCB0eXBlIGZvciB0aGUgZ2VuZXJhdGVkIGltYWdlLiBPbmUgb2YgJ2F1dG8nLCAnb3BhcXVlJywgb3IgJ3RyYW5zcGFyZW50Jy5cbiAgICogQHBhcmFtIGlucHV0RmlkZWxpdHkgLSBJbnB1dCBmaWRlbGl0eSBmb3IgdGhlIGdlbmVyYXRlZCBpbWFnZS4gT25lIG9mICdsb3cnIG9yICdoaWdoJy5cbiAgICogQHBhcmFtIGlucHV0SW1hZ2VNYXNrIC0gT3B0aW9uYWwgbWFzayBmb3IgaW5wYWludGluZy4gQ29udGFpbnMgZmlsZUlkIGFuZC9vciBpbWFnZVVybC5cbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIGltYWdlIGdlbmVyYXRpb24gbW9kZWwgdG8gdXNlLiBEZWZhdWx0OiBncHQtaW1hZ2UtMS5cbiAgICogQHBhcmFtIG1vZGVyYXRpb24gLSBNb2RlcmF0aW9uIGxldmVsIGZvciB0aGUgZ2VuZXJhdGVkIGltYWdlLiBEZWZhdWx0OiAnYXV0bycuXG4gICAqIEBwYXJhbSBvdXRwdXRDb21wcmVzc2lvbiAtIENvbXByZXNzaW9uIGxldmVsIGZvciB0aGUgb3V0cHV0IGltYWdlICgwLTEwMCkuXG4gICAqIEBwYXJhbSBvdXRwdXRGb3JtYXQgLSBUaGUgb3V0cHV0IGZvcm1hdCBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlLiBPbmUgb2YgJ3BuZycsICdqcGVnJywgb3IgJ3dlYnAnLlxuICAgKiBAcGFyYW0gcGFydGlhbEltYWdlcyAtIE51bWJlciBvZiBwYXJ0aWFsIGltYWdlcyB0byBnZW5lcmF0ZSBpbiBzdHJlYW1pbmcgbW9kZSAoMC0zKS5cbiAgICogQHBhcmFtIHF1YWxpdHkgLSBUaGUgcXVhbGl0eSBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlLiBPbmUgb2YgJ2F1dG8nLCAnbG93JywgJ21lZGl1bScsIG9yICdoaWdoJy5cbiAgICogQHBhcmFtIHNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlLiBPbmUgb2YgJ2F1dG8nLCAnMTAyNHgxMDI0JywgJzEwMjR4MTUzNicsIG9yICcxNTM2eDEwMjQnLlxuICAgKi9cbiAgaW1hZ2VHZW5lcmF0aW9uLFxuICAvKipcbiAgICogTG9jYWwgc2hlbGwgaXMgYSB0b29sIHRoYXQgYWxsb3dzIGFnZW50cyB0byBydW4gc2hlbGwgY29tbWFuZHMgbG9jYWxseVxuICAgKiBvbiBhIG1hY2hpbmUgeW91IG9yIHRoZSB1c2VyIHByb3ZpZGVzLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQgbW9kZWxzOiBgZ3B0LTUtY29kZXhgXG4gICAqL1xuICBsb2NhbFNoZWxsLFxuICAvKipcbiAgICogVGhlIHNoZWxsIHRvb2wgYWxsb3dzIHRoZSBtb2RlbCB0byBpbnRlcmFjdCB3aXRoIHlvdXIgbG9jYWwgY29tcHV0ZXIgdGhyb3VnaFxuICAgKiBhIGNvbnRyb2xsZWQgY29tbWFuZC1saW5lIGludGVyZmFjZS4gVGhlIG1vZGVsIHByb3Bvc2VzIHNoZWxsIGNvbW1hbmRzOyB5b3VyXG4gICAqIGludGVncmF0aW9uIGV4ZWN1dGVzIHRoZW0gYW5kIHJldHVybnMgdGhlIG91dHB1dHMuXG4gICAqXG4gICAqIEF2YWlsYWJsZSB0aHJvdWdoIHRoZSBSZXNwb25zZXMgQVBJIGZvciB1c2Ugd2l0aCBHUFQtNS4xLlxuICAgKlxuICAgKiBXQVJOSU5HOiBSdW5uaW5nIGFyYml0cmFyeSBzaGVsbCBjb21tYW5kcyBjYW4gYmUgZGFuZ2Vyb3VzLiBBbHdheXMgc2FuZGJveFxuICAgKiBleGVjdXRpb24gb3IgYWRkIHN0cmljdCBhbGxvdy0vZGVueS1saXN0cyBiZWZvcmUgZm9yd2FyZGluZyBhIGNvbW1hbmQgdG9cbiAgICogdGhlIHN5c3RlbSBzaGVsbC5cbiAgICovXG4gIHNoZWxsLFxuICAvKipcbiAgICogV2ViIHNlYXJjaCBhbGxvd3MgbW9kZWxzIHRvIGFjY2VzcyB1cC10by1kYXRlIGluZm9ybWF0aW9uIGZyb20gdGhlIGludGVybmV0XG4gICAqIGFuZCBwcm92aWRlIGFuc3dlcnMgd2l0aCBzb3VyY2VkIGNpdGF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHNlYXJjaENvbnRleHRTaXplIC0gVGhlIHNlYXJjaCBjb250ZXh0IHNpemUgdG8gdXNlIGZvciB0aGUgd2ViIHNlYXJjaC5cbiAgICogQHBhcmFtIHVzZXJMb2NhdGlvbiAtIFRoZSB1c2VyIGxvY2F0aW9uIHRvIHVzZSBmb3IgdGhlIHdlYiBzZWFyY2guXG4gICAqL1xuICB3ZWJTZWFyY2hQcmV2aWV3LFxuICAvKipcbiAgICogV2ViIHNlYXJjaCBhbGxvd3MgbW9kZWxzIHRvIGFjY2VzcyB1cC10by1kYXRlIGluZm9ybWF0aW9uIGZyb20gdGhlIGludGVybmV0XG4gICAqIGFuZCBwcm92aWRlIGFuc3dlcnMgd2l0aCBzb3VyY2VkIGNpdGF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGZpbHRlcnMgLSBUaGUgZmlsdGVycyB0byB1c2UgZm9yIHRoZSB3ZWIgc2VhcmNoLlxuICAgKiBAcGFyYW0gc2VhcmNoQ29udGV4dFNpemUgLSBUaGUgc2VhcmNoIGNvbnRleHQgc2l6ZSB0byB1c2UgZm9yIHRoZSB3ZWIgc2VhcmNoLlxuICAgKiBAcGFyYW0gdXNlckxvY2F0aW9uIC0gVGhlIHVzZXIgbG9jYXRpb24gdG8gdXNlIGZvciB0aGUgd2ViIHNlYXJjaC5cbiAgICovXG4gIHdlYlNlYXJjaCxcbiAgLyoqXG4gICAqIE1DUCAoTW9kZWwgQ29udGV4dCBQcm90b2NvbCkgYWxsb3dzIG1vZGVscyB0byBjYWxsIHRvb2xzIGV4cG9zZWQgYnlcbiAgICogcmVtb3RlIE1DUCBzZXJ2ZXJzIG9yIHNlcnZpY2UgY29ubmVjdG9ycy5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZlckxhYmVsIC0gTGFiZWwgdG8gaWRlbnRpZnkgdGhlIE1DUCBzZXJ2ZXIuXG4gICAqIEBwYXJhbSBhbGxvd2VkVG9vbHMgLSBBbGxvd2VkIHRvb2wgbmFtZXMgb3IgZmlsdGVyIG9iamVjdC5cbiAgICogQHBhcmFtIGF1dGhvcml6YXRpb24gLSBPQXV0aCBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBNQ1Agc2VydmVyL2Nvbm5lY3Rvci5cbiAgICogQHBhcmFtIGNvbm5lY3RvcklkIC0gSWRlbnRpZmllciBmb3IgYSBzZXJ2aWNlIGNvbm5lY3Rvci5cbiAgICogQHBhcmFtIGhlYWRlcnMgLSBPcHRpb25hbCBoZWFkZXJzIHRvIGluY2x1ZGUgaW4gTUNQIHJlcXVlc3RzLlxuICAgKiAvLyBwYXJhbSByZXF1aXJlQXBwcm92YWwgLSBBcHByb3ZhbCBwb2xpY3kgKCdhbHdheXMnfCduZXZlcid8ZmlsdGVyIG9iamVjdCkuIChSZW1vdmVkIC0gYWx3YXlzICduZXZlcicpXG4gICAqIEBwYXJhbSBzZXJ2ZXJEZXNjcmlwdGlvbiAtIE9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzZXJ2ZXIuXG4gICAqIEBwYXJhbSBzZXJ2ZXJVcmwgLSBVUkwgZm9yIHRoZSBNQ1Agc2VydmVyLlxuICAgKi9cbiAgbWNwLFxuICAvKipcbiAgICogVG9vbCBzZWFyY2ggYWxsb3dzIHRoZSBtb2RlbCB0byBkeW5hbWljYWxseSBzZWFyY2ggZm9yIGFuZCBsb2FkIGRlZmVycmVkXG4gICAqIHRvb2xzIGludG8gdGhlIG1vZGVsJ3MgY29udGV4dCBhcyBuZWVkZWQuIFRoaXMgaGVscHMgcmVkdWNlIG92ZXJhbGwgdG9rZW5cbiAgICogdXNhZ2UsIGNvc3QsIGFuZCBsYXRlbmN5IGJ5IG9ubHkgbG9hZGluZyB0b29scyB3aGVuIHRoZSBtb2RlbCBuZWVkcyB0aGVtLlxuICAgKlxuICAgKiBUbyB1c2UgdG9vbCBzZWFyY2gsIG1hcmsgZnVuY3Rpb25zIG9yIG5hbWVzcGFjZXMgd2l0aCBgZGVmZXJfbG9hZGluZzogdHJ1ZWBcbiAgICogaW4gdGhlIHRvb2xzIGFycmF5LiBUaGUgbW9kZWwgd2lsbCB1c2UgdG9vbCBzZWFyY2ggdG8gbG9hZCB0aGVzZSB0b29sc1xuICAgKiB3aGVuIGl0IGRldGVybWluZXMgdGhleSBhcmUgbmVlZGVkLlxuICAgKi9cbiAgdG9vbFNlYXJjaFxufTtcblxuLy8gc3JjL3Jlc3BvbnNlcy9vcGVuYWktcmVzcG9uc2VzLWxhbmd1YWdlLW1vZGVsLnRzXG5pbXBvcnQge1xuICBBUElDYWxsRXJyb3Jcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7XG4gIGNvbWJpbmVIZWFkZXJzIGFzIGNvbWJpbmVIZWFkZXJzNSxcbiAgY3JlYXRlRXZlbnRTb3VyY2VSZXNwb25zZUhhbmRsZXIgYXMgY3JlYXRlRXZlbnRTb3VyY2VSZXNwb25zZUhhbmRsZXIzLFxuICBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXI1LFxuICBjcmVhdGVUb29sTmFtZU1hcHBpbmcsXG4gIGdlbmVyYXRlSWQgYXMgZ2VuZXJhdGVJZDIsXG4gIHBhcnNlUHJvdmlkZXJPcHRpb25zIGFzIHBhcnNlUHJvdmlkZXJPcHRpb25zNSxcbiAgcG9zdEpzb25Ub0FwaSBhcyBwb3N0SnNvblRvQXBpNVxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuXG4vLyBzcmMvcmVzcG9uc2VzL2NvbnZlcnQtb3BlbmFpLXJlc3BvbnNlcy11c2FnZS50c1xuZnVuY3Rpb24gY29udmVydE9wZW5BSVJlc3BvbnNlc1VzYWdlKHVzYWdlKSB7XG4gIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgaWYgKHVzYWdlID09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRUb2tlbnM6IHtcbiAgICAgICAgdG90YWw6IHZvaWQgMCxcbiAgICAgICAgbm9DYWNoZTogdm9pZCAwLFxuICAgICAgICBjYWNoZVJlYWQ6IHZvaWQgMCxcbiAgICAgICAgY2FjaGVXcml0ZTogdm9pZCAwXG4gICAgICB9LFxuICAgICAgb3V0cHV0VG9rZW5zOiB7XG4gICAgICAgIHRvdGFsOiB2b2lkIDAsXG4gICAgICAgIHRleHQ6IHZvaWQgMCxcbiAgICAgICAgcmVhc29uaW5nOiB2b2lkIDBcbiAgICAgIH0sXG4gICAgICByYXc6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgY29uc3QgaW5wdXRUb2tlbnMgPSB1c2FnZS5pbnB1dF90b2tlbnM7XG4gIGNvbnN0IG91dHB1dFRva2VucyA9IHVzYWdlLm91dHB1dF90b2tlbnM7XG4gIGNvbnN0IGNhY2hlZFRva2VucyA9IChfYiA9IChfYSA9IHVzYWdlLmlucHV0X3Rva2Vuc19kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FjaGVkX3Rva2VucykgIT0gbnVsbCA/IF9iIDogMDtcbiAgY29uc3QgcmVhc29uaW5nVG9rZW5zID0gKF9kID0gKF9jID0gdXNhZ2Uub3V0cHV0X3Rva2Vuc19kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX2MucmVhc29uaW5nX3Rva2VucykgIT0gbnVsbCA/IF9kIDogMDtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dFRva2Vuczoge1xuICAgICAgdG90YWw6IGlucHV0VG9rZW5zLFxuICAgICAgbm9DYWNoZTogaW5wdXRUb2tlbnMgLSBjYWNoZWRUb2tlbnMsXG4gICAgICBjYWNoZVJlYWQ6IGNhY2hlZFRva2VucyxcbiAgICAgIGNhY2hlV3JpdGU6IHZvaWQgMFxuICAgIH0sXG4gICAgb3V0cHV0VG9rZW5zOiB7XG4gICAgICB0b3RhbDogb3V0cHV0VG9rZW5zLFxuICAgICAgdGV4dDogb3V0cHV0VG9rZW5zIC0gcmVhc29uaW5nVG9rZW5zLFxuICAgICAgcmVhc29uaW5nOiByZWFzb25pbmdUb2tlbnNcbiAgICB9LFxuICAgIHJhdzogdXNhZ2VcbiAgfTtcbn1cblxuLy8gc3JjL3Jlc3BvbnNlcy9jb252ZXJ0LXRvLW9wZW5haS1yZXNwb25zZXMtaW5wdXQudHNcbmltcG9ydCB7XG4gIFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yIGFzIFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yNFxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xuaW1wb3J0IHtcbiAgY29udmVydFRvQmFzZTY0IGFzIGNvbnZlcnRUb0Jhc2U2NDIsXG4gIGlzTm9uTnVsbGFibGUsXG4gIHBhcnNlSlNPTixcbiAgcGFyc2VQcm92aWRlck9wdGlvbnMgYXMgcGFyc2VQcm92aWRlck9wdGlvbnM0LFxuICB2YWxpZGF0ZVR5cGVzXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoyMCB9IGZyb20gXCJ6b2QvdjRcIjtcbmZ1bmN0aW9uIGlzRmlsZUlkKGRhdGEsIHByZWZpeGVzKSB7XG4gIGlmICghcHJlZml4ZXMpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHByZWZpeGVzLnNvbWUoKHByZWZpeCkgPT4gZGF0YS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuYXN5bmMgZnVuY3Rpb24gY29udmVydFRvT3BlbkFJUmVzcG9uc2VzSW5wdXQoe1xuICBwcm9tcHQsXG4gIHRvb2xOYW1lTWFwcGluZyxcbiAgc3lzdGVtTWVzc2FnZU1vZGUsXG4gIHByb3ZpZGVyT3B0aW9uc05hbWUsXG4gIGZpbGVJZFByZWZpeGVzLFxuICBzdG9yZSxcbiAgaGFzQ29udmVyc2F0aW9uID0gZmFsc2UsXG4gIGhhc0xvY2FsU2hlbGxUb29sID0gZmFsc2UsXG4gIGhhc1NoZWxsVG9vbCA9IGZhbHNlLFxuICBoYXNBcHBseVBhdGNoVG9vbCA9IGZhbHNlLFxuICBjdXN0b21Qcm92aWRlclRvb2xOYW1lc1xufSkge1xuICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaSwgX2osIF9rLCBfbCwgX20sIF9uLCBfbywgX3AsIF9xO1xuICBsZXQgaW5wdXQgPSBbXTtcbiAgY29uc3Qgd2FybmluZ3MgPSBbXTtcbiAgY29uc3QgcHJvY2Vzc2VkQXBwcm92YWxJZHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBmb3IgKGNvbnN0IHsgcm9sZSwgY29udGVudCB9IG9mIHByb21wdCkge1xuICAgIHN3aXRjaCAocm9sZSkge1xuICAgICAgY2FzZSBcInN5c3RlbVwiOiB7XG4gICAgICAgIHN3aXRjaCAoc3lzdGVtTWVzc2FnZU1vZGUpIHtcbiAgICAgICAgICBjYXNlIFwic3lzdGVtXCI6IHtcbiAgICAgICAgICAgIGlucHV0LnB1c2goeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50IH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJkZXZlbG9wZXJcIjoge1xuICAgICAgICAgICAgaW5wdXQucHVzaCh7IHJvbGU6IFwiZGV2ZWxvcGVyXCIsIGNvbnRlbnQgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBcInN5c3RlbSBtZXNzYWdlcyBhcmUgcmVtb3ZlZCBmb3IgdGhpcyBtb2RlbFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gc3lzdGVtTWVzc2FnZU1vZGU7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBzeXN0ZW0gbWVzc2FnZSBtb2RlOiAke19leGhhdXN0aXZlQ2hlY2t9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidXNlclwiOiB7XG4gICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgIHJvbGU6IFwidXNlclwiLFxuICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQubWFwKChwYXJ0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hMiwgX2IyLCBfYzI7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcnQudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJpbnB1dF90ZXh0XCIsIHRleHQ6IHBhcnQudGV4dCB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJmaWxlXCI6IHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC5tZWRpYVR5cGUuc3RhcnRzV2l0aChcImltYWdlL1wiKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gcGFydC5tZWRpYVR5cGUgPT09IFwiaW1hZ2UvKlwiID8gXCJpbWFnZS9qcGVnXCIgOiBwYXJ0Lm1lZGlhVHlwZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5wdXRfaW1hZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgLi4ucGFydC5kYXRhIGluc3RhbmNlb2YgVVJMID8geyBpbWFnZV91cmw6IHBhcnQuZGF0YS50b1N0cmluZygpIH0gOiB0eXBlb2YgcGFydC5kYXRhID09PSBcInN0cmluZ1wiICYmIGlzRmlsZUlkKHBhcnQuZGF0YSwgZmlsZUlkUHJlZml4ZXMpID8geyBmaWxlX2lkOiBwYXJ0LmRhdGEgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZV91cmw6IGBkYXRhOiR7bWVkaWFUeXBlfTtiYXNlNjQsJHtjb252ZXJ0VG9CYXNlNjQyKHBhcnQuZGF0YSl9YFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IChfYjIgPSAoX2EyID0gcGFydC5wcm92aWRlck9wdGlvbnMpID09IG51bGwgPyB2b2lkIDAgOiBfYTJbcHJvdmlkZXJPcHRpb25zTmFtZV0pID09IG51bGwgPyB2b2lkIDAgOiBfYjIuaW1hZ2VEZXRhaWxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0Lm1lZGlhVHlwZSA9PT0gXCJhcHBsaWNhdGlvbi9wZGZcIikge1xuICAgICAgICAgICAgICAgICAgaWYgKHBhcnQuZGF0YSBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5wdXRfZmlsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdXJsOiBwYXJ0LmRhdGEudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnB1dF9maWxlXCIsXG4gICAgICAgICAgICAgICAgICAgIC4uLnR5cGVvZiBwYXJ0LmRhdGEgPT09IFwic3RyaW5nXCIgJiYgaXNGaWxlSWQocGFydC5kYXRhLCBmaWxlSWRQcmVmaXhlcykgPyB7IGZpbGVfaWQ6IHBhcnQuZGF0YSB9IDoge1xuICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiAoX2MyID0gcGFydC5maWxlbmFtZSkgIT0gbnVsbCA/IF9jMiA6IGBwYXJ0LSR7aW5kZXh9LnBkZmAsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZV9kYXRhOiBgZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LCR7Y29udmVydFRvQmFzZTY0MihwYXJ0LmRhdGEpfWBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yNCh7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHk6IGBmaWxlIHBhcnQgbWVkaWEgdHlwZSAke3BhcnQubWVkaWFUeXBlfWBcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhc3Npc3RhbnRcIjoge1xuICAgICAgICBjb25zdCByZWFzb25pbmdNZXNzYWdlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgY29udGVudCkge1xuICAgICAgICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyT3B0cyA9IChfYSA9IHBhcnQucHJvdmlkZXJPcHRpb25zKSA9PSBudWxsID8gdm9pZCAwIDogX2FbcHJvdmlkZXJPcHRpb25zTmFtZV07XG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gcHJvdmlkZXJPcHRzID09IG51bGwgPyB2b2lkIDAgOiBwcm92aWRlck9wdHMuaXRlbUlkO1xuICAgICAgICAgICAgICBjb25zdCBwaGFzZSA9IHByb3ZpZGVyT3B0cyA9PSBudWxsID8gdm9pZCAwIDogcHJvdmlkZXJPcHRzLnBoYXNlO1xuICAgICAgICAgICAgICBpZiAoaGFzQ29udmVyc2F0aW9uICYmIGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc3RvcmUgJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlucHV0LnB1c2goeyB0eXBlOiBcIml0ZW1fcmVmZXJlbmNlXCIsIGlkIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgICAgICAgICAgY29udGVudDogW3sgdHlwZTogXCJvdXRwdXRfdGV4dFwiLCB0ZXh0OiBwYXJ0LnRleHQgfV0sXG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgLi4ucGhhc2UgIT0gbnVsbCAmJiB7IHBoYXNlIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInRvb2wtY2FsbFwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gKF9mID0gKF9jID0gKF9iID0gcGFydC5wcm92aWRlck9wdGlvbnMpID09IG51bGwgPyB2b2lkIDAgOiBfYltwcm92aWRlck9wdGlvbnNOYW1lXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9jLml0ZW1JZCkgIT0gbnVsbCA/IF9mIDogKF9lID0gKF9kID0gcGFydC5wcm92aWRlck1ldGFkYXRhKSA9PSBudWxsID8gdm9pZCAwIDogX2RbcHJvdmlkZXJPcHRpb25zTmFtZV0pID09IG51bGwgPyB2b2lkIDAgOiBfZS5pdGVtSWQ7XG4gICAgICAgICAgICAgIGlmIChoYXNDb252ZXJzYXRpb24gJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVG9vbE5hbWUgPSB0b29sTmFtZU1hcHBpbmcudG9Qcm92aWRlclRvb2xOYW1lKFxuICAgICAgICAgICAgICAgIHBhcnQudG9vbE5hbWVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHJlc29sdmVkVG9vbE5hbWUgPT09IFwidG9vbF9zZWFyY2hcIikge1xuICAgICAgICAgICAgICAgIGlmIChzdG9yZSAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBpbnB1dC5wdXNoKHsgdHlwZTogXCJpdGVtX3JlZmVyZW5jZVwiLCBpZCB9KTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHR5cGVvZiBwYXJ0LmlucHV0ID09PSBcInN0cmluZ1wiID8gYXdhaXQgcGFyc2VKU09OKHtcbiAgICAgICAgICAgICAgICAgIHRleHQ6IHBhcnQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICBzY2hlbWE6IHRvb2xTZWFyY2hJbnB1dFNjaGVtYVxuICAgICAgICAgICAgICAgIH0pIDogYXdhaXQgdmFsaWRhdGVUeXBlcyh7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogcGFydC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgIHNjaGVtYTogdG9vbFNlYXJjaElucHV0U2NoZW1hXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uID0gcGFyc2VkSW5wdXQuY2FsbF9pZCAhPSBudWxsID8gXCJjbGllbnRcIiA6IFwic2VydmVyXCI7XG4gICAgICAgICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2xfc2VhcmNoX2NhbGxcIixcbiAgICAgICAgICAgICAgICAgIGlkOiBpZCAhPSBudWxsID8gaWQgOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBleGVjdXRpb24sXG4gICAgICAgICAgICAgICAgICBjYWxsX2lkOiAoX2cgPSBwYXJzZWRJbnB1dC5jYWxsX2lkKSAhPSBudWxsID8gX2cgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImNvbXBsZXRlZFwiLFxuICAgICAgICAgICAgICAgICAgYXJndW1lbnRzOiBwYXJzZWRJbnB1dC5hcmd1bWVudHNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocGFydC5wcm92aWRlckV4ZWN1dGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JlICYmIGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIGlucHV0LnB1c2goeyB0eXBlOiBcIml0ZW1fcmVmZXJlbmNlXCIsIGlkIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc3RvcmUgJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlucHV0LnB1c2goeyB0eXBlOiBcIml0ZW1fcmVmZXJlbmNlXCIsIGlkIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChoYXNMb2NhbFNoZWxsVG9vbCAmJiByZXNvbHZlZFRvb2xOYW1lID09PSBcImxvY2FsX3NoZWxsXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRJbnB1dCA9IGF3YWl0IHZhbGlkYXRlVHlwZXMoe1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IHBhcnQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICBzY2hlbWE6IGxvY2FsU2hlbGxJbnB1dFNjaGVtYVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJsb2NhbF9zaGVsbF9jYWxsXCIsXG4gICAgICAgICAgICAgICAgICBjYWxsX2lkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImV4ZWNcIixcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogcGFyc2VkSW5wdXQuYWN0aW9uLmNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbXM6IHBhcnNlZElucHV0LmFjdGlvbi50aW1lb3V0TXMsXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IHBhcnNlZElucHV0LmFjdGlvbi51c2VyLFxuICAgICAgICAgICAgICAgICAgICB3b3JraW5nX2RpcmVjdG9yeTogcGFyc2VkSW5wdXQuYWN0aW9uLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgICAgIGVudjogcGFyc2VkSW5wdXQuYWN0aW9uLmVudlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChoYXNTaGVsbFRvb2wgJiYgcmVzb2x2ZWRUb29sTmFtZSA9PT0gXCJzaGVsbFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkSW5wdXQgPSBhd2FpdCB2YWxpZGF0ZVR5cGVzKHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJ0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzaGVsbElucHV0U2NoZW1hXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInNoZWxsX2NhbGxcIixcbiAgICAgICAgICAgICAgICAgIGNhbGxfaWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImNvbXBsZXRlZFwiLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzOiBwYXJzZWRJbnB1dC5hY3Rpb24uY29tbWFuZHMsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbXM6IHBhcnNlZElucHV0LmFjdGlvbi50aW1lb3V0TXMsXG4gICAgICAgICAgICAgICAgICAgIG1heF9vdXRwdXRfbGVuZ3RoOiBwYXJzZWRJbnB1dC5hY3Rpb24ubWF4T3V0cHV0TGVuZ3RoXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGhhc0FwcGx5UGF0Y2hUb29sICYmIHJlc29sdmVkVG9vbE5hbWUgPT09IFwiYXBwbHlfcGF0Y2hcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZElucHV0ID0gYXdhaXQgdmFsaWRhdGVUeXBlcyh7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogcGFydC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgIHNjaGVtYTogYXBwbHlQYXRjaElucHV0U2NoZW1hXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImFwcGx5X3BhdGNoX2NhbGxcIixcbiAgICAgICAgICAgICAgICAgIGNhbGxfaWQ6IHBhcnNlZElucHV0LmNhbGxJZCxcbiAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImNvbXBsZXRlZFwiLFxuICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBwYXJzZWRJbnB1dC5vcGVyYXRpb25cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY3VzdG9tUHJvdmlkZXJUb29sTmFtZXMgPT0gbnVsbCA/IHZvaWQgMCA6IGN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzLmhhcyhyZXNvbHZlZFRvb2xOYW1lKSkge1xuICAgICAgICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJjdXN0b21fdG9vbF9jYWxsXCIsXG4gICAgICAgICAgICAgICAgICBjYWxsX2lkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBuYW1lOiByZXNvbHZlZFRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IHR5cGVvZiBwYXJ0LmlucHV0ID09PSBcInN0cmluZ1wiID8gcGFydC5pbnB1dCA6IEpTT04uc3RyaW5naWZ5KHBhcnQuaW5wdXQpLFxuICAgICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uX2NhbGxcIixcbiAgICAgICAgICAgICAgICBjYWxsX2lkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogcmVzb2x2ZWRUb29sTmFtZSxcbiAgICAgICAgICAgICAgICBhcmd1bWVudHM6IEpTT04uc3RyaW5naWZ5KHBhcnQuaW5wdXQpLFxuICAgICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFzc2lzdGFudCB0b29sIHJlc3VsdCBwYXJ0cyBhcmUgZnJvbSBwcm92aWRlci1leGVjdXRlZCB0b29sczpcbiAgICAgICAgICAgIGNhc2UgXCJ0b29sLXJlc3VsdFwiOiB7XG4gICAgICAgICAgICAgIGlmIChwYXJ0Lm91dHB1dC50eXBlID09PSBcImV4ZWN1dGlvbi1kZW5pZWRcIiB8fCBwYXJ0Lm91dHB1dC50eXBlID09PSBcImpzb25cIiAmJiB0eXBlb2YgcGFydC5vdXRwdXQudmFsdWUgPT09IFwib2JqZWN0XCIgJiYgcGFydC5vdXRwdXQudmFsdWUgIT0gbnVsbCAmJiBcInR5cGVcIiBpbiBwYXJ0Lm91dHB1dC52YWx1ZSAmJiBwYXJ0Lm91dHB1dC52YWx1ZS50eXBlID09PSBcImV4ZWN1dGlvbi1kZW5pZWRcIikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChoYXNDb252ZXJzYXRpb24pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFJlc3VsdFRvb2xOYW1lID0gdG9vbE5hbWVNYXBwaW5nLnRvUHJvdmlkZXJUb29sTmFtZShcbiAgICAgICAgICAgICAgICBwYXJ0LnRvb2xOYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChyZXNvbHZlZFJlc3VsdFRvb2xOYW1lID09PSBcInRvb2xfc2VhcmNoXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtSWQgPSAoX2ogPSAoX2kgPSAoX2ggPSBwYXJ0LnByb3ZpZGVyT3B0aW9ucykgPT0gbnVsbCA/IHZvaWQgMCA6IF9oW3Byb3ZpZGVyT3B0aW9uc05hbWVdKSA9PSBudWxsID8gdm9pZCAwIDogX2kuaXRlbUlkKSAhPSBudWxsID8gX2ogOiBwYXJ0LnRvb2xDYWxsSWQ7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JlKSB7XG4gICAgICAgICAgICAgICAgICBpbnB1dC5wdXNoKHsgdHlwZTogXCJpdGVtX3JlZmVyZW5jZVwiLCBpZDogaXRlbUlkIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5vdXRwdXQudHlwZSA9PT0gXCJqc29uXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZE91dHB1dCA9IGF3YWl0IHZhbGlkYXRlVHlwZXMoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcGFydC5vdXRwdXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYTogdG9vbFNlYXJjaE91dHB1dFNjaGVtYVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sX3NlYXJjaF9vdXRwdXRcIixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGl0ZW1JZCxcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uOiBcInNlcnZlclwiLFxuICAgICAgICAgICAgICAgICAgICBjYWxsX2lkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIHRvb2xzOiBwYXJzZWRPdXRwdXQudG9vbHNcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaGFzU2hlbGxUb29sICYmIHJlc29sdmVkUmVzdWx0VG9vbE5hbWUgPT09IFwic2hlbGxcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0Lm91dHB1dC50eXBlID09PSBcImpzb25cIikge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkT3V0cHV0ID0gYXdhaXQgdmFsaWRhdGVUeXBlcyh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJ0Lm91dHB1dC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiBzaGVsbE91dHB1dFNjaGVtYVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzaGVsbF9jYWxsX291dHB1dFwiLFxuICAgICAgICAgICAgICAgICAgICBjYWxsX2lkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dDogcGFyc2VkT3V0cHV0Lm91dHB1dC5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0OiBpdGVtLnN0ZG91dCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI6IGl0ZW0uc3RkZXJyLFxuICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWU6IGl0ZW0ub3V0Y29tZS50eXBlID09PSBcInRpbWVvdXRcIiA/IHsgdHlwZTogXCJ0aW1lb3V0XCIgfSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXhpdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9jb2RlOiBpdGVtLm91dGNvbWUuZXhpdENvZGVcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzdG9yZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IChfbSA9IChfbCA9IChfayA9IHBhcnQucHJvdmlkZXJPcHRpb25zKSA9PSBudWxsID8gdm9pZCAwIDogX2tbcHJvdmlkZXJPcHRpb25zTmFtZV0pID09IG51bGwgPyB2b2lkIDAgOiBfbC5pdGVtSWQpICE9IG51bGwgPyBfbSA6IHBhcnQudG9vbENhbGxJZDtcbiAgICAgICAgICAgICAgICBpbnB1dC5wdXNoKHsgdHlwZTogXCJpdGVtX3JlZmVyZW5jZVwiLCBpZDogaXRlbUlkIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYFJlc3VsdHMgZm9yIE9wZW5BSSB0b29sICR7cGFydC50b29sTmFtZX0gYXJlIG5vdCBzZW50IHRvIHRoZSBBUEkgd2hlbiBzdG9yZSBpcyBmYWxzZWBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJyZWFzb25pbmdcIjoge1xuICAgICAgICAgICAgICBjb25zdCBwcm92aWRlck9wdGlvbnMgPSBhd2FpdCBwYXJzZVByb3ZpZGVyT3B0aW9uczQoe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyOiBwcm92aWRlck9wdGlvbnNOYW1lLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogcGFydC5wcm92aWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgc2NoZW1hOiBvcGVuYWlSZXNwb25zZXNSZWFzb25pbmdQcm92aWRlck9wdGlvbnNTY2hlbWFcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJlYXNvbmluZ0lkID0gcHJvdmlkZXJPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBwcm92aWRlck9wdGlvbnMuaXRlbUlkO1xuICAgICAgICAgICAgICBpZiAoaGFzQ29udmVyc2F0aW9uICYmIHJlYXNvbmluZ0lkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVhc29uaW5nSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbmluZ01lc3NhZ2UgPSByZWFzb25pbmdNZXNzYWdlc1tyZWFzb25pbmdJZF07XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVhc29uaW5nTWVzc2FnZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0LnB1c2goeyB0eXBlOiBcIml0ZW1fcmVmZXJlbmNlXCIsIGlkOiByZWFzb25pbmdJZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uaW5nTWVzc2FnZXNbcmVhc29uaW5nSWRdID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhc29uaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IHJlYXNvbmluZ0lkLFxuICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IFtdXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlQYXJ0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgaWYgKHBhcnQudGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnlQYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN1bW1hcnlfdGV4dFwiLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHBhcnQudGV4dFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhc29uaW5nTWVzc2FnZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgQ2Fubm90IGFwcGVuZCBlbXB0eSByZWFzb25pbmcgcGFydCB0byBleGlzdGluZyByZWFzb25pbmcgc2VxdWVuY2UuIFNraXBwaW5nIHJlYXNvbmluZyBwYXJ0OiAke0pTT04uc3RyaW5naWZ5KHBhcnQpfS5gXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHJlYXNvbmluZ01lc3NhZ2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgICAgICByZWFzb25pbmdNZXNzYWdlc1tyZWFzb25pbmdJZF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJyZWFzb25pbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICBpZDogcmVhc29uaW5nSWQsXG4gICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkX2NvbnRlbnQ6IHByb3ZpZGVyT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogcHJvdmlkZXJPcHRpb25zLnJlYXNvbmluZ0VuY3J5cHRlZENvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyeVBhcnRzXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlucHV0LnB1c2gocmVhc29uaW5nTWVzc2FnZXNbcmVhc29uaW5nSWRdKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbmluZ01lc3NhZ2Uuc3VtbWFyeS5wdXNoKC4uLnN1bW1hcnlQYXJ0cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocHJvdmlkZXJPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBwcm92aWRlck9wdGlvbnMucmVhc29uaW5nRW5jcnlwdGVkQ29udGVudCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbmluZ01lc3NhZ2UuZW5jcnlwdGVkX2NvbnRlbnQgPSBwcm92aWRlck9wdGlvbnMucmVhc29uaW5nRW5jcnlwdGVkQ29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmNyeXB0ZWRDb250ZW50ID0gcHJvdmlkZXJPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBwcm92aWRlck9wdGlvbnMucmVhc29uaW5nRW5jcnlwdGVkQ29udGVudDtcbiAgICAgICAgICAgICAgICBpZiAoZW5jcnlwdGVkQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5UGFydHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LnRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5UGFydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdW1tYXJ5X3RleHRcIixcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBwYXJ0LnRleHRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJyZWFzb25pbmdcIixcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkX2NvbnRlbnQ6IGVuY3J5cHRlZENvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcnlQYXJ0c1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBOb24tT3BlbkFJIHJlYXNvbmluZyBwYXJ0cyBhcmUgbm90IHN1cHBvcnRlZC4gU2tpcHBpbmcgcmVhc29uaW5nIHBhcnQ6ICR7SlNPTi5zdHJpbmdpZnkocGFydCl9LmBcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidG9vbFwiOiB7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBjb250ZW50KSB7XG4gICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJ0b29sLWFwcHJvdmFsLXJlc3BvbnNlXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGFwcHJvdmFsUmVzcG9uc2UgPSBwYXJ0O1xuICAgICAgICAgICAgaWYgKHByb2Nlc3NlZEFwcHJvdmFsSWRzLmhhcyhhcHByb3ZhbFJlc3BvbnNlLmFwcHJvdmFsSWQpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvY2Vzc2VkQXBwcm92YWxJZHMuYWRkKGFwcHJvdmFsUmVzcG9uc2UuYXBwcm92YWxJZCk7XG4gICAgICAgICAgICBpZiAoc3RvcmUpIHtcbiAgICAgICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJpdGVtX3JlZmVyZW5jZVwiLFxuICAgICAgICAgICAgICAgIGlkOiBhcHByb3ZhbFJlc3BvbnNlLmFwcHJvdmFsSWRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJtY3BfYXBwcm92YWxfcmVzcG9uc2VcIixcbiAgICAgICAgICAgICAgYXBwcm92YWxfcmVxdWVzdF9pZDogYXBwcm92YWxSZXNwb25zZS5hcHByb3ZhbElkLFxuICAgICAgICAgICAgICBhcHByb3ZlOiBhcHByb3ZhbFJlc3BvbnNlLmFwcHJvdmVkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvdXRwdXQgPSBwYXJ0Lm91dHB1dDtcbiAgICAgICAgICBpZiAob3V0cHV0LnR5cGUgPT09IFwiZXhlY3V0aW9uLWRlbmllZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBhcHByb3ZhbElkID0gKF9vID0gKF9uID0gb3V0cHV0LnByb3ZpZGVyT3B0aW9ucykgPT0gbnVsbCA/IHZvaWQgMCA6IF9uLm9wZW5haSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9vLmFwcHJvdmFsSWQ7XG4gICAgICAgICAgICBpZiAoYXBwcm92YWxJZCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRUb29sTmFtZSA9IHRvb2xOYW1lTWFwcGluZy50b1Byb3ZpZGVyVG9vbE5hbWUoXG4gICAgICAgICAgICBwYXJ0LnRvb2xOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZWRUb29sTmFtZSA9PT0gXCJ0b29sX3NlYXJjaFwiICYmIG91dHB1dC50eXBlID09PSBcImpzb25cIikge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkT3V0cHV0ID0gYXdhaXQgdmFsaWRhdGVUeXBlcyh7XG4gICAgICAgICAgICAgIHZhbHVlOiBvdXRwdXQudmFsdWUsXG4gICAgICAgICAgICAgIHNjaGVtYTogdG9vbFNlYXJjaE91dHB1dFNjaGVtYVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnB1dC5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0b29sX3NlYXJjaF9vdXRwdXRcIixcbiAgICAgICAgICAgICAgZXhlY3V0aW9uOiBcImNsaWVudFwiLFxuICAgICAgICAgICAgICBjYWxsX2lkOiBwYXJ0LnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgIHN0YXR1czogXCJjb21wbGV0ZWRcIixcbiAgICAgICAgICAgICAgdG9vbHM6IHBhcnNlZE91dHB1dC50b29sc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhc0xvY2FsU2hlbGxUb29sICYmIHJlc29sdmVkVG9vbE5hbWUgPT09IFwibG9jYWxfc2hlbGxcIiAmJiBvdXRwdXQudHlwZSA9PT0gXCJqc29uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZE91dHB1dCA9IGF3YWl0IHZhbGlkYXRlVHlwZXMoe1xuICAgICAgICAgICAgICB2YWx1ZTogb3V0cHV0LnZhbHVlLFxuICAgICAgICAgICAgICBzY2hlbWE6IGxvY2FsU2hlbGxPdXRwdXRTY2hlbWFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwibG9jYWxfc2hlbGxfY2FsbF9vdXRwdXRcIixcbiAgICAgICAgICAgICAgY2FsbF9pZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHBhcnNlZE91dHB1dC5vdXRwdXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYXNTaGVsbFRvb2wgJiYgcmVzb2x2ZWRUb29sTmFtZSA9PT0gXCJzaGVsbFwiICYmIG91dHB1dC50eXBlID09PSBcImpzb25cIikge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkT3V0cHV0ID0gYXdhaXQgdmFsaWRhdGVUeXBlcyh7XG4gICAgICAgICAgICAgIHZhbHVlOiBvdXRwdXQudmFsdWUsXG4gICAgICAgICAgICAgIHNjaGVtYTogc2hlbGxPdXRwdXRTY2hlbWFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwic2hlbGxfY2FsbF9vdXRwdXRcIixcbiAgICAgICAgICAgICAgY2FsbF9pZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHBhcnNlZE91dHB1dC5vdXRwdXQubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0ZG91dDogaXRlbS5zdGRvdXQsXG4gICAgICAgICAgICAgICAgc3RkZXJyOiBpdGVtLnN0ZGVycixcbiAgICAgICAgICAgICAgICBvdXRjb21lOiBpdGVtLm91dGNvbWUudHlwZSA9PT0gXCJ0aW1lb3V0XCIgPyB7IHR5cGU6IFwidGltZW91dFwiIH0gOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImV4aXRcIixcbiAgICAgICAgICAgICAgICAgIGV4aXRfY29kZTogaXRlbS5vdXRjb21lLmV4aXRDb2RlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYXNBcHBseVBhdGNoVG9vbCAmJiBwYXJ0LnRvb2xOYW1lID09PSBcImFwcGx5X3BhdGNoXCIgJiYgb3V0cHV0LnR5cGUgPT09IFwianNvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRPdXRwdXQgPSBhd2FpdCB2YWxpZGF0ZVR5cGVzKHtcbiAgICAgICAgICAgICAgdmFsdWU6IG91dHB1dC52YWx1ZSxcbiAgICAgICAgICAgICAgc2NoZW1hOiBhcHBseVBhdGNoT3V0cHV0U2NoZW1hXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcImFwcGx5X3BhdGNoX2NhbGxfb3V0cHV0XCIsXG4gICAgICAgICAgICAgIGNhbGxfaWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgc3RhdHVzOiBwYXJzZWRPdXRwdXQuc3RhdHVzLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHBhcnNlZE91dHB1dC5vdXRwdXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjdXN0b21Qcm92aWRlclRvb2xOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY3VzdG9tUHJvdmlkZXJUb29sTmFtZXMuaGFzKHJlc29sdmVkVG9vbE5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgb3V0cHV0VmFsdWU7XG4gICAgICAgICAgICBzd2l0Y2ggKG91dHB1dC50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJlcnJvci10ZXh0XCI6XG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBvdXRwdXQudmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJleGVjdXRpb24tZGVuaWVkXCI6XG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSAoX3AgPSBvdXRwdXQucmVhc29uKSAhPSBudWxsID8gX3AgOiBcIlRvb2wgZXhlY3V0aW9uIGRlbmllZC5cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgICAgICAgY2FzZSBcImVycm9yLWpzb25cIjpcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KG91dHB1dC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJjb250ZW50XCI6XG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBvdXRwdXQudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICB2YXIgX2EyO1xuICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0eXBlOiBcImlucHV0X3RleHRcIiwgdGV4dDogaXRlbS50ZXh0IH07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbWFnZS1kYXRhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5wdXRfaW1hZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3VybDogYGRhdGE6JHtpdGVtLm1lZGlhVHlwZX07YmFzZTY0LCR7aXRlbS5kYXRhfWBcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW1hZ2UtdXJsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5wdXRfaW1hZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3VybDogaXRlbS51cmxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZmlsZS1kYXRhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5wdXRfZmlsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IChfYTIgPSBpdGVtLmZpbGVuYW1lKSAhPSBudWxsID8gX2EyIDogXCJkYXRhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2RhdGE6IGBkYXRhOiR7aXRlbS5tZWRpYVR5cGV9O2Jhc2U2NCwke2l0ZW0uZGF0YX1gXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImZpbGUtdXJsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5wdXRfZmlsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV91cmw6IGl0ZW0udXJsXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB1bnN1cHBvcnRlZCBjdXN0b20gdG9vbCBjb250ZW50IHBhcnQgdHlwZTogJHtpdGVtLnR5cGV9YFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkuZmlsdGVyKGlzTm9uTnVsbGFibGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcImN1c3RvbV90b29sX2NhbGxfb3V0cHV0XCIsXG4gICAgICAgICAgICAgIGNhbGxfaWQ6IHBhcnQudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgb3V0cHV0OiBvdXRwdXRWYWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGNvbnRlbnRWYWx1ZTtcbiAgICAgICAgICBzd2l0Y2ggKG91dHB1dC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgY2FzZSBcImVycm9yLXRleHRcIjpcbiAgICAgICAgICAgICAgY29udGVudFZhbHVlID0gb3V0cHV0LnZhbHVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJleGVjdXRpb24tZGVuaWVkXCI6XG4gICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZSA9IChfcSA9IG91dHB1dC5yZWFzb24pICE9IG51bGwgPyBfcSA6IFwiVG9vbCBleGVjdXRpb24gZGVuaWVkLlwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgICAgICBjYXNlIFwiZXJyb3ItanNvblwiOlxuICAgICAgICAgICAgICBjb250ZW50VmFsdWUgPSBKU09OLnN0cmluZ2lmeShvdXRwdXQudmFsdWUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjb250ZW50XCI6XG4gICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZSA9IG91dHB1dC52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2EyO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwiaW5wdXRfdGV4dFwiLCB0ZXh0OiBpdGVtLnRleHQgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbWFnZS1kYXRhXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlucHV0X2ltYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdXJsOiBgZGF0YToke2l0ZW0ubWVkaWFUeXBlfTtiYXNlNjQsJHtpdGVtLmRhdGF9YFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSBcImltYWdlLXVybFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnB1dF9pbWFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3VybDogaXRlbS51cmxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWxlLWRhdGFcIjoge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5wdXRfZmlsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiAoX2EyID0gaXRlbS5maWxlbmFtZSkgIT0gbnVsbCA/IF9hMiA6IFwiZGF0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGF0YTogYGRhdGE6JHtpdGVtLm1lZGlhVHlwZX07YmFzZTY0LCR7aXRlbS5kYXRhfWBcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWxlLXVybFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnB1dF9maWxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZV91cmw6IGl0ZW0udXJsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdW5zdXBwb3J0ZWQgdG9vbCBjb250ZW50IHBhcnQgdHlwZTogJHtpdGVtLnR5cGV9YFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLmZpbHRlcihpc05vbk51bGxhYmxlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlucHV0LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiLFxuICAgICAgICAgICAgY2FsbF9pZDogcGFydC50b29sQ2FsbElkLFxuICAgICAgICAgICAgb3V0cHV0OiBjb250ZW50VmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgX2V4aGF1c3RpdmVDaGVjayA9IHJvbGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcm9sZTogJHtfZXhoYXVzdGl2ZUNoZWNrfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIXN0b3JlICYmIGlucHV0LnNvbWUoXG4gICAgKGl0ZW0pID0+IFwidHlwZVwiIGluIGl0ZW0gJiYgaXRlbS50eXBlID09PSBcInJlYXNvbmluZ1wiICYmIGl0ZW0uZW5jcnlwdGVkX2NvbnRlbnQgPT0gbnVsbFxuICApKSB7XG4gICAgd2FybmluZ3MucHVzaCh7XG4gICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICBtZXNzYWdlOiBcIlJlYXNvbmluZyBwYXJ0cyB3aXRob3V0IGVuY3J5cHRlZCBjb250ZW50IGFyZSBub3Qgc3VwcG9ydGVkIHdoZW4gc3RvcmUgaXMgZmFsc2UuIFNraXBwaW5nIHJlYXNvbmluZyBwYXJ0cy5cIlxuICAgIH0pO1xuICAgIGlucHV0ID0gaW5wdXQuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+ICEoXCJ0eXBlXCIgaW4gaXRlbSkgfHwgaXRlbS50eXBlICE9PSBcInJlYXNvbmluZ1wiIHx8IGl0ZW0uZW5jcnlwdGVkX2NvbnRlbnQgIT0gbnVsbFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHsgaW5wdXQsIHdhcm5pbmdzIH07XG59XG52YXIgb3BlbmFpUmVzcG9uc2VzUmVhc29uaW5nUHJvdmlkZXJPcHRpb25zU2NoZW1hID0gejIwLm9iamVjdCh7XG4gIGl0ZW1JZDogejIwLnN0cmluZygpLm51bGxpc2goKSxcbiAgcmVhc29uaW5nRW5jcnlwdGVkQ29udGVudDogejIwLnN0cmluZygpLm51bGxpc2goKVxufSk7XG5cbi8vIHNyYy9yZXNwb25zZXMvbWFwLW9wZW5haS1yZXNwb25zZXMtZmluaXNoLXJlYXNvbi50c1xuZnVuY3Rpb24gbWFwT3BlbkFJUmVzcG9uc2VGaW5pc2hSZWFzb24oe1xuICBmaW5pc2hSZWFzb24sXG4gIGhhc0Z1bmN0aW9uQ2FsbFxufSkge1xuICBzd2l0Y2ggKGZpbmlzaFJlYXNvbikge1xuICAgIGNhc2Ugdm9pZCAwOlxuICAgIGNhc2UgbnVsbDpcbiAgICAgIHJldHVybiBoYXNGdW5jdGlvbkNhbGwgPyBcInRvb2wtY2FsbHNcIiA6IFwic3RvcFwiO1xuICAgIGNhc2UgXCJtYXhfb3V0cHV0X3Rva2Vuc1wiOlxuICAgICAgcmV0dXJuIFwibGVuZ3RoXCI7XG4gICAgY2FzZSBcImNvbnRlbnRfZmlsdGVyXCI6XG4gICAgICByZXR1cm4gXCJjb250ZW50LWZpbHRlclwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gaGFzRnVuY3Rpb25DYWxsID8gXCJ0b29sLWNhbGxzXCIgOiBcIm90aGVyXCI7XG4gIH1cbn1cblxuLy8gc3JjL3Jlc3BvbnNlcy9vcGVuYWktcmVzcG9uc2VzLWFwaS50c1xuaW1wb3J0IHsgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMTksIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWExOSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoyMSB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBqc29uVmFsdWVTY2hlbWEyID0gejIxLmxhenkoXG4gICgpID0+IHoyMS51bmlvbihbXG4gICAgejIxLnN0cmluZygpLFxuICAgIHoyMS5udW1iZXIoKSxcbiAgICB6MjEuYm9vbGVhbigpLFxuICAgIHoyMS5udWxsKCksXG4gICAgejIxLmFycmF5KGpzb25WYWx1ZVNjaGVtYTIpLFxuICAgIHoyMS5yZWNvcmQoejIxLnN0cmluZygpLCBqc29uVmFsdWVTY2hlbWEyLm9wdGlvbmFsKCkpXG4gIF0pXG4pO1xudmFyIG9wZW5haVJlc3BvbnNlc0NodW5rU2NoZW1hID0gbGF6eVNjaGVtYTE5KFxuICAoKSA9PiB6b2RTY2hlbWExOShcbiAgICB6MjEudW5pb24oW1xuICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwicmVzcG9uc2Uub3V0cHV0X3RleHQuZGVsdGFcIiksXG4gICAgICAgIGl0ZW1faWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgZGVsdGE6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgbG9ncHJvYnM6IHoyMS5hcnJheShcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHRva2VuOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBsb2dwcm9iOiB6MjEubnVtYmVyKCksXG4gICAgICAgICAgICB0b3BfbG9ncHJvYnM6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdG9rZW46IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBsb2dwcm9iOiB6MjEubnVtYmVyKClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICApLm51bGxpc2goKVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmVudW0oW1wicmVzcG9uc2UuY29tcGxldGVkXCIsIFwicmVzcG9uc2UuaW5jb21wbGV0ZVwiXSksXG4gICAgICAgIHJlc3BvbnNlOiB6MjEub2JqZWN0KHtcbiAgICAgICAgICBpbmNvbXBsZXRlX2RldGFpbHM6IHoyMS5vYmplY3QoeyByZWFzb246IHoyMS5zdHJpbmcoKSB9KS5udWxsaXNoKCksXG4gICAgICAgICAgdXNhZ2U6IHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgaW5wdXRfdG9rZW5zOiB6MjEubnVtYmVyKCksXG4gICAgICAgICAgICBpbnB1dF90b2tlbnNfZGV0YWlsczogejIxLm9iamVjdCh7IGNhY2hlZF90b2tlbnM6IHoyMS5udW1iZXIoKS5udWxsaXNoKCkgfSkubnVsbGlzaCgpLFxuICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogejIxLm51bWJlcigpLFxuICAgICAgICAgICAgb3V0cHV0X3Rva2Vuc19kZXRhaWxzOiB6MjEub2JqZWN0KHsgcmVhc29uaW5nX3Rva2VuczogejIxLm51bWJlcigpLm51bGxpc2goKSB9KS5udWxsaXNoKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzZXJ2aWNlX3RpZXI6IHoyMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwicmVzcG9uc2UuZmFpbGVkXCIpLFxuICAgICAgICByZXNwb25zZTogejIxLm9iamVjdCh7XG4gICAgICAgICAgZXJyb3I6IHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgY29kZTogejIxLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgIH0pLm51bGxpc2goKSxcbiAgICAgICAgICBpbmNvbXBsZXRlX2RldGFpbHM6IHoyMS5vYmplY3QoeyByZWFzb246IHoyMS5zdHJpbmcoKSB9KS5udWxsaXNoKCksXG4gICAgICAgICAgdXNhZ2U6IHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgaW5wdXRfdG9rZW5zOiB6MjEubnVtYmVyKCksXG4gICAgICAgICAgICBpbnB1dF90b2tlbnNfZGV0YWlsczogejIxLm9iamVjdCh7IGNhY2hlZF90b2tlbnM6IHoyMS5udW1iZXIoKS5udWxsaXNoKCkgfSkubnVsbGlzaCgpLFxuICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogejIxLm51bWJlcigpLFxuICAgICAgICAgICAgb3V0cHV0X3Rva2Vuc19kZXRhaWxzOiB6MjEub2JqZWN0KHsgcmVhc29uaW5nX3Rva2VuczogejIxLm51bWJlcigpLm51bGxpc2goKSB9KS5udWxsaXNoKClcbiAgICAgICAgICB9KS5udWxsaXNoKCksXG4gICAgICAgICAgc2VydmljZV90aWVyOiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlc3BvbnNlLmNyZWF0ZWRcIiksXG4gICAgICAgIHJlc3BvbnNlOiB6MjEub2JqZWN0KHtcbiAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgIGNyZWF0ZWRfYXQ6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgICBtb2RlbDogejIxLnN0cmluZygpLFxuICAgICAgICAgIHNlcnZpY2VfdGllcjogejIxLnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiKSxcbiAgICAgICAgb3V0cHV0X2luZGV4OiB6MjEubnVtYmVyKCksXG4gICAgICAgIGl0ZW06IHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibWVzc2FnZVwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBwaGFzZTogejIxLmVudW0oW1wiY29tbWVudGFyeVwiLCBcImZpbmFsX2Fuc3dlclwiXSkubnVsbGlzaCgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlYXNvbmluZ1wiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBlbmNyeXB0ZWRfY29udGVudDogejIxLnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJmdW5jdGlvbl9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIG5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogejIxLnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcIndlYl9zZWFyY2hfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjb21wdXRlcl9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImZpbGVfc2VhcmNoX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImltYWdlX2dlbmVyYXRpb25fY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiY29kZV9pbnRlcnByZXRlcl9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGNvbnRhaW5lcl9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY29kZTogejIxLnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICAgICAgICBvdXRwdXRzOiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgIHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHsgdHlwZTogejIxLmxpdGVyYWwoXCJsb2dzXCIpLCBsb2dzOiB6MjEuc3RyaW5nKCkgfSksXG4gICAgICAgICAgICAgICAgejIxLm9iamVjdCh7IHR5cGU6IHoyMS5saXRlcmFsKFwiaW1hZ2VcIiksIHVybDogejIxLnN0cmluZygpIH0pXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApLm51bGxhYmxlKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJtY3BfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGFwcHJvdmFsX3JlcXVlc3RfaWQ6IHoyMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibWNwX2xpc3RfdG9vbHNcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcIm1jcF9hcHByb3ZhbF9yZXF1ZXN0XCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJhcHBseV9wYXRjaF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLmVudW0oW1wiaW5fcHJvZ3Jlc3NcIiwgXCJjb21wbGV0ZWRcIl0pLFxuICAgICAgICAgICAgb3BlcmF0aW9uOiB6MjEuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiY3JlYXRlX2ZpbGVcIiksXG4gICAgICAgICAgICAgICAgcGF0aDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgIGRpZmY6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJkZWxldGVfZmlsZVwiKSxcbiAgICAgICAgICAgICAgICBwYXRoOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwidXBkYXRlX2ZpbGVcIiksXG4gICAgICAgICAgICAgICAgcGF0aDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgIGRpZmY6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiY3VzdG9tX3Rvb2xfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBpbnB1dDogejIxLnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInNoZWxsX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiLCBcImluY29tcGxldGVcIl0pLFxuICAgICAgICAgICAgYWN0aW9uOiB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgY29tbWFuZHM6IHoyMS5hcnJheSh6MjEuc3RyaW5nKCkpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJzaGVsbF9jYWxsX291dHB1dFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5lbnVtKFtcImluX3Byb2dyZXNzXCIsIFwiY29tcGxldGVkXCIsIFwiaW5jb21wbGV0ZVwiXSksXG4gICAgICAgICAgICBvdXRwdXQ6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgc3Rkb3V0OiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgc3RkZXJyOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgb3V0Y29tZTogejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgICAgICAgICAgejIxLm9iamVjdCh7IHR5cGU6IHoyMS5saXRlcmFsKFwidGltZW91dFwiKSB9KSxcbiAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImV4aXRcIiksXG4gICAgICAgICAgICAgICAgICAgIGV4aXRfY29kZTogejIxLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInRvb2xfc2VhcmNoX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgZXhlY3V0aW9uOiB6MjEuZW51bShbXCJzZXJ2ZXJcIiwgXCJjbGllbnRcIl0pLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5lbnVtKFtcImluX3Byb2dyZXNzXCIsIFwiY29tcGxldGVkXCIsIFwiaW5jb21wbGV0ZVwiXSksXG4gICAgICAgICAgICBhcmd1bWVudHM6IHoyMS51bmtub3duKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwidG9vbF9zZWFyY2hfb3V0cHV0XCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGV4ZWN1dGlvbjogejIxLmVudW0oW1wic2VydmVyXCIsIFwiY2xpZW50XCJdKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiLCBcImluY29tcGxldGVcIl0pLFxuICAgICAgICAgICAgdG9vbHM6IHoyMS5hcnJheSh6MjEucmVjb3JkKHoyMS5zdHJpbmcoKSwganNvblZhbHVlU2NoZW1hMi5vcHRpb25hbCgpKSlcbiAgICAgICAgICB9KVxuICAgICAgICBdKVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5kb25lXCIpLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgaXRlbTogejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJtZXNzYWdlXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHBoYXNlOiB6MjEuZW51bShbXCJjb21tZW50YXJ5XCIsIFwiZmluYWxfYW5zd2VyXCJdKS5udWxsaXNoKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwicmVhc29uaW5nXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGVuY3J5cHRlZF9jb250ZW50OiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImZ1bmN0aW9uX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgbmFtZTogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgYXJndW1lbnRzOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5saXRlcmFsKFwiY29tcGxldGVkXCIpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImN1c3RvbV90b29sX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgbmFtZTogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgaW5wdXQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLmxpdGVyYWwoXCJjb21wbGV0ZWRcIilcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiY29kZV9pbnRlcnByZXRlcl9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGNvZGU6IHoyMS5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICAgICAgY29udGFpbmVyX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBvdXRwdXRzOiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgIHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHsgdHlwZTogejIxLmxpdGVyYWwoXCJsb2dzXCIpLCBsb2dzOiB6MjEuc3RyaW5nKCkgfSksXG4gICAgICAgICAgICAgICAgejIxLm9iamVjdCh7IHR5cGU6IHoyMS5saXRlcmFsKFwiaW1hZ2VcIiksIHVybDogejIxLnN0cmluZygpIH0pXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApLm51bGxhYmxlKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiaW1hZ2VfZ2VuZXJhdGlvbl9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHJlc3VsdDogejIxLnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcIndlYl9zZWFyY2hfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGFjdGlvbjogejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInNlYXJjaFwiKSxcbiAgICAgICAgICAgICAgICBxdWVyeTogejIxLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VzOiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgICAgICB6MjEuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3QoeyB0eXBlOiB6MjEubGl0ZXJhbChcInVybFwiKSwgdXJsOiB6MjEuc3RyaW5nKCkgfSksXG4gICAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3QoeyB0eXBlOiB6MjEubGl0ZXJhbChcImFwaVwiKSwgbmFtZTogejIxLnN0cmluZygpIH0pXG4gICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICkubnVsbGlzaCgpXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcIm9wZW5fcGFnZVwiKSxcbiAgICAgICAgICAgICAgICB1cmw6IHoyMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiZmluZF9pbl9wYWdlXCIpLFxuICAgICAgICAgICAgICAgIHVybDogejIxLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKS5udWxsaXNoKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiZmlsZV9zZWFyY2hfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBxdWVyaWVzOiB6MjEuYXJyYXkoejIxLnN0cmluZygpKSxcbiAgICAgICAgICAgIHJlc3VsdHM6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogejIxLnJlY29yZChcbiAgICAgICAgICAgICAgICAgIHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgIHoyMS51bmlvbihbejIxLnN0cmluZygpLCB6MjEubnVtYmVyKCksIHoyMS5ib29sZWFuKCldKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZmlsZV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgc2NvcmU6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgICAgICAgICB0ZXh0OiB6MjEuc3RyaW5nKClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkubnVsbGlzaCgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImxvY2FsX3NoZWxsX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgYWN0aW9uOiB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJleGVjXCIpLFxuICAgICAgICAgICAgICBjb21tYW5kOiB6MjEuYXJyYXkoejIxLnN0cmluZygpKSxcbiAgICAgICAgICAgICAgdGltZW91dF9tczogejIxLm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIHVzZXI6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICB3b3JraW5nX2RpcmVjdG9yeTogejIxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGVudjogejIxLnJlY29yZCh6MjEuc3RyaW5nKCksIHoyMS5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiY29tcHV0ZXJfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5saXRlcmFsKFwiY29tcGxldGVkXCIpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcIm1jcF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgYXJndW1lbnRzOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzZXJ2ZXJfbGFiZWw6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIG91dHB1dDogejIxLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgIGVycm9yOiB6MjEudW5pb24oW1xuICAgICAgICAgICAgICB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICAgIGNvZGU6IHoyMS51bmlvbihbejIxLm51bWJlcigpLCB6MjEuc3RyaW5nKCldKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIH0pLmxvb3NlKClcbiAgICAgICAgICAgIF0pLm51bGxpc2goKSxcbiAgICAgICAgICAgIGFwcHJvdmFsX3JlcXVlc3RfaWQ6IHoyMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibWNwX2xpc3RfdG9vbHNcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc2VydmVyX2xhYmVsOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICB0b29sczogejIxLmFycmF5KFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICAgIGlucHV0X3NjaGVtYTogejIxLmFueSgpLFxuICAgICAgICAgICAgICAgIGFubm90YXRpb25zOiB6MjEucmVjb3JkKHoyMS5zdHJpbmcoKSwgejIxLnVua25vd24oKSkub3B0aW9uYWwoKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGVycm9yOiB6MjEudW5pb24oW1xuICAgICAgICAgICAgICB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICAgIGNvZGU6IHoyMS51bmlvbihbejIxLm51bWJlcigpLCB6MjEuc3RyaW5nKCldKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIH0pLmxvb3NlKClcbiAgICAgICAgICAgIF0pLm9wdGlvbmFsKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibWNwX2FwcHJvdmFsX3JlcXVlc3RcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc2VydmVyX2xhYmVsOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBhcmd1bWVudHM6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGFwcHJvdmFsX3JlcXVlc3RfaWQ6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImFwcGx5X3BhdGNoX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiXSksXG4gICAgICAgICAgICBvcGVyYXRpb246IHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjcmVhdGVfZmlsZVwiKSxcbiAgICAgICAgICAgICAgICBwYXRoOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZGlmZjogejIxLnN0cmluZygpXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImRlbGV0ZV9maWxlXCIpLFxuICAgICAgICAgICAgICAgIHBhdGg6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJ1cGRhdGVfZmlsZVwiKSxcbiAgICAgICAgICAgICAgICBwYXRoOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZGlmZjogejIxLnN0cmluZygpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJzaGVsbF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLmVudW0oW1wiaW5fcHJvZ3Jlc3NcIiwgXCJjb21wbGV0ZWRcIiwgXCJpbmNvbXBsZXRlXCJdKSxcbiAgICAgICAgICAgIGFjdGlvbjogejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgIGNvbW1hbmRzOiB6MjEuYXJyYXkoejIxLnN0cmluZygpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwic2hlbGxfY2FsbF9vdXRwdXRcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiLCBcImluY29tcGxldGVcIl0pLFxuICAgICAgICAgICAgb3V0cHV0OiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHN0ZG91dDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgIHN0ZGVycjogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgIG91dGNvbWU6IHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3QoeyB0eXBlOiB6MjEubGl0ZXJhbChcInRpbWVvdXRcIikgfSksXG4gICAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJleGl0XCIpLFxuICAgICAgICAgICAgICAgICAgICBleGl0X2NvZGU6IHoyMS5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJ0b29sX3NlYXJjaF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGV4ZWN1dGlvbjogejIxLmVudW0oW1wic2VydmVyXCIsIFwiY2xpZW50XCJdKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiLCBcImluY29tcGxldGVcIl0pLFxuICAgICAgICAgICAgYXJndW1lbnRzOiB6MjEudW5rbm93bigpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInRvb2xfc2VhcmNoX291dHB1dFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBleGVjdXRpb246IHoyMS5lbnVtKFtcInNlcnZlclwiLCBcImNsaWVudFwiXSksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLmVudW0oW1wiaW5fcHJvZ3Jlc3NcIiwgXCJjb21wbGV0ZWRcIiwgXCJpbmNvbXBsZXRlXCJdKSxcbiAgICAgICAgICAgIHRvb2xzOiB6MjEuYXJyYXkoejIxLnJlY29yZCh6MjEuc3RyaW5nKCksIGpzb25WYWx1ZVNjaGVtYTIub3B0aW9uYWwoKSkpXG4gICAgICAgICAgfSlcbiAgICAgICAgXSlcbiAgICAgIH0pLFxuICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwicmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZGVsdGFcIiksXG4gICAgICAgIGl0ZW1faWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgb3V0cHV0X2luZGV4OiB6MjEubnVtYmVyKCksXG4gICAgICAgIGRlbHRhOiB6MjEuc3RyaW5nKClcbiAgICAgIH0pLFxuICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwicmVzcG9uc2UuY3VzdG9tX3Rvb2xfY2FsbF9pbnB1dC5kZWx0YVwiKSxcbiAgICAgICAgaXRlbV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgZGVsdGE6IHoyMS5zdHJpbmcoKVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5pbWFnZV9nZW5lcmF0aW9uX2NhbGwucGFydGlhbF9pbWFnZVwiKSxcbiAgICAgICAgaXRlbV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgcGFydGlhbF9pbWFnZV9iNjQ6IHoyMS5zdHJpbmcoKVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5jb2RlX2ludGVycHJldGVyX2NhbGxfY29kZS5kZWx0YVwiKSxcbiAgICAgICAgaXRlbV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgZGVsdGE6IHoyMS5zdHJpbmcoKVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5jb2RlX2ludGVycHJldGVyX2NhbGxfY29kZS5kb25lXCIpLFxuICAgICAgICBpdGVtX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgIG91dHB1dF9pbmRleDogejIxLm51bWJlcigpLFxuICAgICAgICBjb2RlOiB6MjEuc3RyaW5nKClcbiAgICAgIH0pLFxuICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwicmVzcG9uc2Uub3V0cHV0X3RleHQuYW5ub3RhdGlvbi5hZGRlZFwiKSxcbiAgICAgICAgYW5ub3RhdGlvbjogejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJ1cmxfY2l0YXRpb25cIiksXG4gICAgICAgICAgICBzdGFydF9pbmRleDogejIxLm51bWJlcigpLFxuICAgICAgICAgICAgZW5kX2luZGV4OiB6MjEubnVtYmVyKCksXG4gICAgICAgICAgICB1cmw6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHRpdGxlOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiZmlsZV9jaXRhdGlvblwiKSxcbiAgICAgICAgICAgIGZpbGVfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBpbmRleDogejIxLm51bWJlcigpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImNvbnRhaW5lcl9maWxlX2NpdGF0aW9uXCIpLFxuICAgICAgICAgICAgY29udGFpbmVyX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBmaWxlX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBmaWxlbmFtZTogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhcnRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgICAgIGVuZF9pbmRleDogejIxLm51bWJlcigpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImZpbGVfcGF0aFwiKSxcbiAgICAgICAgICAgIGZpbGVfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGluZGV4OiB6MjEubnVtYmVyKClcbiAgICAgICAgICB9KVxuICAgICAgICBdKVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5yZWFzb25pbmdfc3VtbWFyeV9wYXJ0LmFkZGVkXCIpLFxuICAgICAgICBpdGVtX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgIHN1bW1hcnlfaW5kZXg6IHoyMS5udW1iZXIoKVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5yZWFzb25pbmdfc3VtbWFyeV90ZXh0LmRlbHRhXCIpLFxuICAgICAgICBpdGVtX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgIHN1bW1hcnlfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgZGVsdGE6IHoyMS5zdHJpbmcoKVxuICAgICAgfSksXG4gICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJyZXNwb25zZS5yZWFzb25pbmdfc3VtbWFyeV9wYXJ0LmRvbmVcIiksXG4gICAgICAgIGl0ZW1faWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgc3VtbWFyeV9pbmRleDogejIxLm51bWJlcigpXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlc3BvbnNlLmFwcGx5X3BhdGNoX2NhbGxfb3BlcmF0aW9uX2RpZmYuZGVsdGFcIiksXG4gICAgICAgIGl0ZW1faWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgb3V0cHV0X2luZGV4OiB6MjEubnVtYmVyKCksXG4gICAgICAgIGRlbHRhOiB6MjEuc3RyaW5nKCksXG4gICAgICAgIG9iZnVzY2F0aW9uOiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlc3BvbnNlLmFwcGx5X3BhdGNoX2NhbGxfb3BlcmF0aW9uX2RpZmYuZG9uZVwiKSxcbiAgICAgICAgaXRlbV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgZGlmZjogejIxLnN0cmluZygpXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImVycm9yXCIpLFxuICAgICAgICBzZXF1ZW5jZV9udW1iZXI6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgZXJyb3I6IHoyMS5vYmplY3Qoe1xuICAgICAgICAgIHR5cGU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICBjb2RlOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgbWVzc2FnZTogejIxLnN0cmluZygpLFxuICAgICAgICAgIHBhcmFtOiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpXG4gICAgICAgIH0pXG4gICAgICB9KSxcbiAgICAgIHoyMS5vYmplY3QoeyB0eXBlOiB6MjEuc3RyaW5nKCkgfSkubG9vc2UoKS50cmFuc2Zvcm0oKHZhbHVlKSA9PiAoe1xuICAgICAgICB0eXBlOiBcInVua25vd25fY2h1bmtcIixcbiAgICAgICAgbWVzc2FnZTogdmFsdWUudHlwZVxuICAgICAgfSkpXG4gICAgICAvLyBmYWxsYmFjayBmb3IgdW5rbm93biBjaHVua3NcbiAgICBdKVxuICApXG4pO1xudmFyIG9wZW5haVJlc3BvbnNlc1Jlc3BvbnNlU2NoZW1hID0gbGF6eVNjaGVtYTE5KFxuICAoKSA9PiB6b2RTY2hlbWExOShcbiAgICB6MjEub2JqZWN0KHtcbiAgICAgIGlkOiB6MjEuc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGNyZWF0ZWRfYXQ6IHoyMS5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgICAgZXJyb3I6IHoyMS5vYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiB6MjEuc3RyaW5nKCksXG4gICAgICAgIHR5cGU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgcGFyYW06IHoyMS5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgIGNvZGU6IHoyMS5zdHJpbmcoKVxuICAgICAgfSkubnVsbGlzaCgpLFxuICAgICAgbW9kZWw6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgb3V0cHV0OiB6MjEuYXJyYXkoXG4gICAgICAgIHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibWVzc2FnZVwiKSxcbiAgICAgICAgICAgIHJvbGU6IHoyMS5saXRlcmFsKFwiYXNzaXN0YW50XCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHBoYXNlOiB6MjEuZW51bShbXCJjb21tZW50YXJ5XCIsIFwiZmluYWxfYW5zd2VyXCJdKS5udWxsaXNoKCksXG4gICAgICAgICAgICBjb250ZW50OiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwib3V0cHV0X3RleHRcIiksXG4gICAgICAgICAgICAgICAgdGV4dDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgIGxvZ3Byb2JzOiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW46IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgbG9ncHJvYjogejIxLm51bWJlcigpLFxuICAgICAgICAgICAgICAgICAgICB0b3BfbG9ncHJvYnM6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dwcm9iOiB6MjEubnVtYmVyKClcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkubnVsbGlzaCgpLFxuICAgICAgICAgICAgICAgIGFubm90YXRpb25zOiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgICAgICB6MjEuZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gICAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwidXJsX2NpdGF0aW9uXCIpLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2luZGV4OiB6MjEubnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgZW5kX2luZGV4OiB6MjEubnVtYmVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgdXJsOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJmaWxlX2NpdGF0aW9uXCIpLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiB6MjEubnVtYmVyKClcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiY29udGFpbmVyX2ZpbGVfY2l0YXRpb25cIiksXG4gICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRfaW5kZXg6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5kZXg6IHoyMS5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJmaWxlX3BhdGhcIiksXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZV9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiB6MjEubnVtYmVyKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJ3ZWJfc2VhcmNoX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBhY3Rpb246IHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJzZWFyY2hcIiksXG4gICAgICAgICAgICAgICAgcXVlcnk6IHoyMS5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAgICAgICAgICAgc291cmNlczogejIxLmFycmF5KFxuICAgICAgICAgICAgICAgICAgejIxLmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICAgICAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHsgdHlwZTogejIxLmxpdGVyYWwoXCJ1cmxcIiksIHVybDogejIxLnN0cmluZygpIH0pLFxuICAgICAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImFwaVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgKS5udWxsaXNoKClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwib3Blbl9wYWdlXCIpLFxuICAgICAgICAgICAgICAgIHVybDogejIxLnN0cmluZygpLm51bGxpc2goKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJmaW5kX2luX3BhZ2VcIiksXG4gICAgICAgICAgICAgICAgdXJsOiB6MjEuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICAgICAgICAgIHBhdHRlcm46IHoyMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pLm51bGxpc2goKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJmaWxlX3NlYXJjaF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHF1ZXJpZXM6IHoyMS5hcnJheSh6MjEuc3RyaW5nKCkpLFxuICAgICAgICAgICAgcmVzdWx0czogejIxLmFycmF5KFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB6MjEucmVjb3JkKFxuICAgICAgICAgICAgICAgICAgejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgICAgejIxLnVuaW9uKFt6MjEuc3RyaW5nKCksIHoyMS5udW1iZXIoKSwgejIxLmJvb2xlYW4oKV0pXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBmaWxlX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBzY29yZTogejIxLm51bWJlcigpLFxuICAgICAgICAgICAgICAgIHRleHQ6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKS5udWxsaXNoKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiY29kZV9pbnRlcnByZXRlcl9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGNvZGU6IHoyMS5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICAgICAgY29udGFpbmVyX2lkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBvdXRwdXRzOiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgIHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHsgdHlwZTogejIxLmxpdGVyYWwoXCJsb2dzXCIpLCBsb2dzOiB6MjEuc3RyaW5nKCkgfSksXG4gICAgICAgICAgICAgICAgejIxLm9iamVjdCh7IHR5cGU6IHoyMS5saXRlcmFsKFwiaW1hZ2VcIiksIHVybDogejIxLnN0cmluZygpIH0pXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApLm51bGxhYmxlKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiaW1hZ2VfZ2VuZXJhdGlvbl9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHJlc3VsdDogejIxLnN0cmluZygpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImxvY2FsX3NoZWxsX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgYWN0aW9uOiB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJleGVjXCIpLFxuICAgICAgICAgICAgICBjb21tYW5kOiB6MjEuYXJyYXkoejIxLnN0cmluZygpKSxcbiAgICAgICAgICAgICAgdGltZW91dF9tczogejIxLm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIHVzZXI6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICB3b3JraW5nX2RpcmVjdG9yeTogejIxLnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICAgIGVudjogejIxLnJlY29yZCh6MjEuc3RyaW5nKCksIHoyMS5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiZnVuY3Rpb25fY2FsbFwiKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIG5hbWU6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjdXN0b21fdG9vbF9jYWxsXCIpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgbmFtZTogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgaW5wdXQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwiY29tcHV0ZXJfY2FsbFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzdGF0dXM6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInJlYXNvbmluZ1wiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBlbmNyeXB0ZWRfY29udGVudDogejIxLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgIHN1bW1hcnk6IHoyMS5hcnJheShcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJzdW1tYXJ5X3RleHRcIiksXG4gICAgICAgICAgICAgICAgdGV4dDogejIxLnN0cmluZygpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcIm1jcF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgYXJndW1lbnRzOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBzZXJ2ZXJfbGFiZWw6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIG91dHB1dDogejIxLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgICAgICAgIGVycm9yOiB6MjEudW5pb24oW1xuICAgICAgICAgICAgICB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICAgIGNvZGU6IHoyMS51bmlvbihbejIxLm51bWJlcigpLCB6MjEuc3RyaW5nKCldKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIH0pLmxvb3NlKClcbiAgICAgICAgICAgIF0pLm51bGxpc2goKSxcbiAgICAgICAgICAgIGFwcHJvdmFsX3JlcXVlc3RfaWQ6IHoyMS5zdHJpbmcoKS5udWxsaXNoKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibWNwX2xpc3RfdG9vbHNcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc2VydmVyX2xhYmVsOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICB0b29sczogejIxLmFycmF5KFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICAgIGlucHV0X3NjaGVtYTogejIxLmFueSgpLFxuICAgICAgICAgICAgICAgIGFubm90YXRpb25zOiB6MjEucmVjb3JkKHoyMS5zdHJpbmcoKSwgejIxLnVua25vd24oKSkub3B0aW9uYWwoKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGVycm9yOiB6MjEudW5pb24oW1xuICAgICAgICAgICAgICB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICAgIGNvZGU6IHoyMS51bmlvbihbejIxLm51bWJlcigpLCB6MjEuc3RyaW5nKCldKS5vcHRpb25hbCgpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIH0pLmxvb3NlKClcbiAgICAgICAgICAgIF0pLm9wdGlvbmFsKClcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwibWNwX2FwcHJvdmFsX3JlcXVlc3RcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc2VydmVyX2xhYmVsOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBuYW1lOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBhcmd1bWVudHM6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGFwcHJvdmFsX3JlcXVlc3RfaWQ6IHoyMS5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImFwcGx5X3BhdGNoX2NhbGxcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiXSksXG4gICAgICAgICAgICBvcGVyYXRpb246IHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJjcmVhdGVfZmlsZVwiKSxcbiAgICAgICAgICAgICAgICBwYXRoOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZGlmZjogejIxLnN0cmluZygpXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcImRlbGV0ZV9maWxlXCIpLFxuICAgICAgICAgICAgICAgIHBhdGg6IHoyMS5zdHJpbmcoKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJ1cGRhdGVfZmlsZVwiKSxcbiAgICAgICAgICAgICAgICBwYXRoOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZGlmZjogejIxLnN0cmluZygpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJzaGVsbF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLmVudW0oW1wiaW5fcHJvZ3Jlc3NcIiwgXCJjb21wbGV0ZWRcIiwgXCJpbmNvbXBsZXRlXCJdKSxcbiAgICAgICAgICAgIGFjdGlvbjogejIxLm9iamVjdCh7XG4gICAgICAgICAgICAgIGNvbW1hbmRzOiB6MjEuYXJyYXkoejIxLnN0cmluZygpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgIHR5cGU6IHoyMS5saXRlcmFsKFwic2hlbGxfY2FsbF9vdXRwdXRcIiksXG4gICAgICAgICAgICBpZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgY2FsbF9pZDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiLCBcImluY29tcGxldGVcIl0pLFxuICAgICAgICAgICAgb3V0cHV0OiB6MjEuYXJyYXkoXG4gICAgICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIHN0ZG91dDogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgIHN0ZGVycjogejIxLnN0cmluZygpLFxuICAgICAgICAgICAgICAgIG91dGNvbWU6IHoyMS5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICAgICAgICAgICAgICAgIHoyMS5vYmplY3QoeyB0eXBlOiB6MjEubGl0ZXJhbChcInRpbWVvdXRcIikgfSksXG4gICAgICAgICAgICAgICAgICB6MjEub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJleGl0XCIpLFxuICAgICAgICAgICAgICAgICAgICBleGl0X2NvZGU6IHoyMS5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHoyMS5vYmplY3Qoe1xuICAgICAgICAgICAgdHlwZTogejIxLmxpdGVyYWwoXCJ0b29sX3NlYXJjaF9jYWxsXCIpLFxuICAgICAgICAgICAgaWQ6IHoyMS5zdHJpbmcoKSxcbiAgICAgICAgICAgIGV4ZWN1dGlvbjogejIxLmVudW0oW1wic2VydmVyXCIsIFwiY2xpZW50XCJdKSxcbiAgICAgICAgICAgIGNhbGxfaWQ6IHoyMS5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICAgICAgc3RhdHVzOiB6MjEuZW51bShbXCJpbl9wcm9ncmVzc1wiLCBcImNvbXBsZXRlZFwiLCBcImluY29tcGxldGVcIl0pLFxuICAgICAgICAgICAgYXJndW1lbnRzOiB6MjEudW5rbm93bigpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgejIxLm9iamVjdCh7XG4gICAgICAgICAgICB0eXBlOiB6MjEubGl0ZXJhbChcInRvb2xfc2VhcmNoX291dHB1dFwiKSxcbiAgICAgICAgICAgIGlkOiB6MjEuc3RyaW5nKCksXG4gICAgICAgICAgICBleGVjdXRpb246IHoyMS5lbnVtKFtcInNlcnZlclwiLCBcImNsaWVudFwiXSksXG4gICAgICAgICAgICBjYWxsX2lkOiB6MjEuc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICAgICAgICAgIHN0YXR1czogejIxLmVudW0oW1wiaW5fcHJvZ3Jlc3NcIiwgXCJjb21wbGV0ZWRcIiwgXCJpbmNvbXBsZXRlXCJdKSxcbiAgICAgICAgICAgIHRvb2xzOiB6MjEuYXJyYXkoejIxLnJlY29yZCh6MjEuc3RyaW5nKCksIGpzb25WYWx1ZVNjaGVtYTIub3B0aW9uYWwoKSkpXG4gICAgICAgICAgfSlcbiAgICAgICAgXSlcbiAgICAgICkub3B0aW9uYWwoKSxcbiAgICAgIHNlcnZpY2VfdGllcjogejIxLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIGluY29tcGxldGVfZGV0YWlsczogejIxLm9iamVjdCh7IHJlYXNvbjogejIxLnN0cmluZygpIH0pLm51bGxpc2goKSxcbiAgICAgIHVzYWdlOiB6MjEub2JqZWN0KHtcbiAgICAgICAgaW5wdXRfdG9rZW5zOiB6MjEubnVtYmVyKCksXG4gICAgICAgIGlucHV0X3Rva2Vuc19kZXRhaWxzOiB6MjEub2JqZWN0KHsgY2FjaGVkX3Rva2VuczogejIxLm51bWJlcigpLm51bGxpc2goKSB9KS5udWxsaXNoKCksXG4gICAgICAgIG91dHB1dF90b2tlbnM6IHoyMS5udW1iZXIoKSxcbiAgICAgICAgb3V0cHV0X3Rva2Vuc19kZXRhaWxzOiB6MjEub2JqZWN0KHsgcmVhc29uaW5nX3Rva2VuczogejIxLm51bWJlcigpLm51bGxpc2goKSB9KS5udWxsaXNoKClcbiAgICAgIH0pLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG4pO1xuXG4vLyBzcmMvcmVzcG9uc2VzL29wZW5haS1yZXNwb25zZXMtb3B0aW9ucy50c1xuaW1wb3J0IHsgbGF6eVNjaGVtYSBhcyBsYXp5U2NoZW1hMjAsIHpvZFNjaGVtYSBhcyB6b2RTY2hlbWEyMCB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IGFzIHoyMiB9IGZyb20gXCJ6b2QvdjRcIjtcbnZhciBUT1BfTE9HUFJPQlNfTUFYID0gMjA7XG52YXIgb3BlbmFpUmVzcG9uc2VzUmVhc29uaW5nTW9kZWxJZHMgPSBbXG4gIFwibzFcIixcbiAgXCJvMS0yMDI0LTEyLTE3XCIsXG4gIFwibzNcIixcbiAgXCJvMy0yMDI1LTA0LTE2XCIsXG4gIFwibzMtbWluaVwiLFxuICBcIm8zLW1pbmktMjAyNS0wMS0zMVwiLFxuICBcIm80LW1pbmlcIixcbiAgXCJvNC1taW5pLTIwMjUtMDQtMTZcIixcbiAgXCJncHQtNVwiLFxuICBcImdwdC01LTIwMjUtMDgtMDdcIixcbiAgXCJncHQtNS1jb2RleFwiLFxuICBcImdwdC01LW1pbmlcIixcbiAgXCJncHQtNS1taW5pLTIwMjUtMDgtMDdcIixcbiAgXCJncHQtNS1uYW5vXCIsXG4gIFwiZ3B0LTUtbmFuby0yMDI1LTA4LTA3XCIsXG4gIFwiZ3B0LTUtcHJvXCIsXG4gIFwiZ3B0LTUtcHJvLTIwMjUtMTAtMDZcIixcbiAgXCJncHQtNS4xXCIsXG4gIFwiZ3B0LTUuMS1jaGF0LWxhdGVzdFwiLFxuICBcImdwdC01LjEtY29kZXgtbWluaVwiLFxuICBcImdwdC01LjEtY29kZXhcIixcbiAgXCJncHQtNS4xLWNvZGV4LW1heFwiLFxuICBcImdwdC01LjJcIixcbiAgXCJncHQtNS4yLWNoYXQtbGF0ZXN0XCIsXG4gIFwiZ3B0LTUuMi1wcm9cIixcbiAgXCJncHQtNS4yLWNvZGV4XCIsXG4gIFwiZ3B0LTUuMy1jaGF0LWxhdGVzdFwiLFxuICBcImdwdC01LjMtY29kZXhcIixcbiAgXCJncHQtNS40XCIsXG4gIFwiZ3B0LTUuNC0yMDI2LTAzLTA1XCIsXG4gIFwiZ3B0LTUuNC1taW5pXCIsXG4gIFwiZ3B0LTUuNC1taW5pLTIwMjYtMDMtMTdcIixcbiAgXCJncHQtNS40LW5hbm9cIixcbiAgXCJncHQtNS40LW5hbm8tMjAyNi0wMy0xN1wiLFxuICBcImdwdC01LjQtcHJvXCIsXG4gIFwiZ3B0LTUuNC1wcm8tMjAyNi0wMy0wNVwiXG5dO1xudmFyIG9wZW5haVJlc3BvbnNlc01vZGVsSWRzID0gW1xuICBcImdwdC00LjFcIixcbiAgXCJncHQtNC4xLTIwMjUtMDQtMTRcIixcbiAgXCJncHQtNC4xLW1pbmlcIixcbiAgXCJncHQtNC4xLW1pbmktMjAyNS0wNC0xNFwiLFxuICBcImdwdC00LjEtbmFub1wiLFxuICBcImdwdC00LjEtbmFuby0yMDI1LTA0LTE0XCIsXG4gIFwiZ3B0LTRvXCIsXG4gIFwiZ3B0LTRvLTIwMjQtMDUtMTNcIixcbiAgXCJncHQtNG8tMjAyNC0wOC0wNlwiLFxuICBcImdwdC00by0yMDI0LTExLTIwXCIsXG4gIFwiZ3B0LTRvLWF1ZGlvLXByZXZpZXdcIixcbiAgXCJncHQtNG8tYXVkaW8tcHJldmlldy0yMDI0LTEyLTE3XCIsXG4gIFwiZ3B0LTRvLXNlYXJjaC1wcmV2aWV3XCIsXG4gIFwiZ3B0LTRvLXNlYXJjaC1wcmV2aWV3LTIwMjUtMDMtMTFcIixcbiAgXCJncHQtNG8tbWluaS1zZWFyY2gtcHJldmlld1wiLFxuICBcImdwdC00by1taW5pLXNlYXJjaC1wcmV2aWV3LTIwMjUtMDMtMTFcIixcbiAgXCJncHQtNG8tbWluaVwiLFxuICBcImdwdC00by1taW5pLTIwMjQtMDctMThcIixcbiAgXCJncHQtMy41LXR1cmJvLTAxMjVcIixcbiAgXCJncHQtMy41LXR1cmJvXCIsXG4gIFwiZ3B0LTMuNS10dXJiby0xMTA2XCIsXG4gIFwiZ3B0LTUtY2hhdC1sYXRlc3RcIixcbiAgLi4ub3BlbmFpUmVzcG9uc2VzUmVhc29uaW5nTW9kZWxJZHNcbl07XG52YXIgb3BlbmFpTGFuZ3VhZ2VNb2RlbFJlc3BvbnNlc09wdGlvbnNTY2hlbWEgPSBsYXp5U2NoZW1hMjAoXG4gICgpID0+IHpvZFNjaGVtYTIwKFxuICAgIHoyMi5vYmplY3Qoe1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlIE9wZW5BSSBDb252ZXJzYXRpb24gdG8gY29udGludWUuXG4gICAgICAgKiBZb3UgbXVzdCBjcmVhdGUgYSBjb252ZXJzYXRpb24gZmlyc3QgdmlhIHRoZSBPcGVuQUkgQVBJLlxuICAgICAgICogQ2Fubm90IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgcHJldmlvdXNSZXNwb25zZUlkYC5cbiAgICAgICAqIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgICAgICogQHNlZSBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2NvbnZlcnNhdGlvbnMvY3JlYXRlXG4gICAgICAgKi9cbiAgICAgIGNvbnZlcnNhdGlvbjogejIyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHNldCBvZiBleHRyYSBmaWVsZHMgdG8gaW5jbHVkZSBpbiB0aGUgcmVzcG9uc2UgKGFkdmFuY2VkLCB1c3VhbGx5IG5vdCBuZWVkZWQpLlxuICAgICAgICogRXhhbXBsZSB2YWx1ZXM6ICdyZWFzb25pbmcuZW5jcnlwdGVkX2NvbnRlbnQnLCAnZmlsZV9zZWFyY2hfY2FsbC5yZXN1bHRzJywgJ21lc3NhZ2Uub3V0cHV0X3RleHQubG9ncHJvYnMnLlxuICAgICAgICovXG4gICAgICBpbmNsdWRlOiB6MjIuYXJyYXkoXG4gICAgICAgIHoyMi5lbnVtKFtcbiAgICAgICAgICBcInJlYXNvbmluZy5lbmNyeXB0ZWRfY29udGVudFwiLFxuICAgICAgICAgIC8vIGhhbmRsZWQgaW50ZXJuYWxseSBieSBkZWZhdWx0LCBvbmx5IG5lZWRlZCBmb3IgdW5rbm93biByZWFzb25pbmcgbW9kZWxzXG4gICAgICAgICAgXCJmaWxlX3NlYXJjaF9jYWxsLnJlc3VsdHNcIixcbiAgICAgICAgICBcIm1lc3NhZ2Uub3V0cHV0X3RleHQubG9ncHJvYnNcIlxuICAgICAgICBdKVxuICAgICAgKS5udWxsaXNoKCksXG4gICAgICAvKipcbiAgICAgICAqIEluc3RydWN0aW9ucyBmb3IgdGhlIG1vZGVsLlxuICAgICAgICogVGhleSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHN5c3RlbSBvciBkZXZlbG9wZXIgbWVzc2FnZSB3aGVuIGNvbnRpbnVpbmcgYSBjb252ZXJzYXRpb24gdXNpbmcgdGhlIGBwcmV2aW91c1Jlc3BvbnNlSWRgIG9wdGlvbi5cbiAgICAgICAqIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgICAgICovXG4gICAgICBpbnN0cnVjdGlvbnM6IHoyMi5zdHJpbmcoKS5udWxsaXNoKCksXG4gICAgICAvKipcbiAgICAgICAqIFJldHVybiB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb2YgdGhlIHRva2Vucy4gSW5jbHVkaW5nIGxvZ3Byb2JzIHdpbGwgaW5jcmVhc2VcbiAgICAgICAqIHRoZSByZXNwb25zZSBzaXplIGFuZCBjYW4gc2xvdyBkb3duIHJlc3BvbnNlIHRpbWVzLiBIb3dldmVyLCBpdCBjYW5cbiAgICAgICAqIGJlIHVzZWZ1bCB0byBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgdGhlIG1vZGVsIGlzIGJlaGF2aW5nLlxuICAgICAgICpcbiAgICAgICAqIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIHJldHVybiB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb2YgdGhlIHRva2VucyB0aGF0XG4gICAgICAgKiB3ZXJlIGdlbmVyYXRlZC5cbiAgICAgICAqXG4gICAgICAgKiBTZXR0aW5nIHRvIGEgbnVtYmVyIHdpbGwgcmV0dXJuIHRoZSBsb2cgcHJvYmFiaWxpdGllcyBvZiB0aGUgdG9wIG5cbiAgICAgICAqIHRva2VucyB0aGF0IHdlcmUgZ2VuZXJhdGVkLlxuICAgICAgICpcbiAgICAgICAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9yZXNwb25zZXMvY3JlYXRlXG4gICAgICAgKiBAc2VlIGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy91c2luZ19sb2dwcm9ic1xuICAgICAgICovXG4gICAgICBsb2dwcm9iczogejIyLnVuaW9uKFt6MjIuYm9vbGVhbigpLCB6MjIubnVtYmVyKCkubWluKDEpLm1heChUT1BfTE9HUFJPQlNfTUFYKV0pLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBjYWxscyB0byBidWlsdC1pbiB0b29scyB0aGF0IGNhbiBiZSBwcm9jZXNzZWQgaW4gYSByZXNwb25zZS5cbiAgICAgICAqIFRoaXMgbWF4aW11bSBudW1iZXIgYXBwbGllcyBhY3Jvc3MgYWxsIGJ1aWx0LWluIHRvb2wgY2FsbHMsIG5vdCBwZXIgaW5kaXZpZHVhbCB0b29sLlxuICAgICAgICogQW55IGZ1cnRoZXIgYXR0ZW1wdHMgdG8gY2FsbCBhIHRvb2wgYnkgdGhlIG1vZGVsIHdpbGwgYmUgaWdub3JlZC5cbiAgICAgICAqL1xuICAgICAgbWF4VG9vbENhbGxzOiB6MjIubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBBZGRpdGlvbmFsIG1ldGFkYXRhIHRvIHN0b3JlIHdpdGggdGhlIGdlbmVyYXRpb24uXG4gICAgICAgKi9cbiAgICAgIG1ldGFkYXRhOiB6MjIuYW55KCkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCB0b29sIGNhbGxzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICAgKi9cbiAgICAgIHBhcmFsbGVsVG9vbENhbGxzOiB6MjIuYm9vbGVhbigpLm51bGxpc2goKSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIElEIG9mIHRoZSBwcmV2aW91cyByZXNwb25zZS4gWW91IGNhbiB1c2UgaXQgdG8gY29udGludWUgYSBjb252ZXJzYXRpb24uXG4gICAgICAgKiBEZWZhdWx0cyB0byBgdW5kZWZpbmVkYC5cbiAgICAgICAqL1xuICAgICAgcHJldmlvdXNSZXNwb25zZUlkOiB6MjIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBTZXRzIGEgY2FjaGUga2V5IHRvIHRpZSB0aGlzIHByb21wdCB0byBjYWNoZWQgcHJlZml4ZXMgZm9yIGJldHRlciBjYWNoaW5nIHBlcmZvcm1hbmNlLlxuICAgICAgICovXG4gICAgICBwcm9tcHRDYWNoZUtleTogejIyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHJldGVudGlvbiBwb2xpY3kgZm9yIHRoZSBwcm9tcHQgY2FjaGUuXG4gICAgICAgKiAtICdpbl9tZW1vcnknOiBEZWZhdWx0LiBTdGFuZGFyZCBwcm9tcHQgY2FjaGluZyBiZWhhdmlvci5cbiAgICAgICAqIC0gJzI0aCc6IEV4dGVuZGVkIHByb21wdCBjYWNoaW5nIHRoYXQga2VlcHMgY2FjaGVkIHByZWZpeGVzIGFjdGl2ZSBmb3IgdXAgdG8gMjQgaG91cnMuXG4gICAgICAgKiAgICAgICAgICBDdXJyZW50bHkgb25seSBhdmFpbGFibGUgZm9yIDUuMSBzZXJpZXMgbW9kZWxzLlxuICAgICAgICpcbiAgICAgICAqIEBkZWZhdWx0ICdpbl9tZW1vcnknXG4gICAgICAgKi9cbiAgICAgIHByb21wdENhY2hlUmV0ZW50aW9uOiB6MjIuZW51bShbXCJpbl9tZW1vcnlcIiwgXCIyNGhcIl0pLm51bGxpc2goKSxcbiAgICAgIC8qKlxuICAgICAgICogUmVhc29uaW5nIGVmZm9ydCBmb3IgcmVhc29uaW5nIG1vZGVscy4gRGVmYXVsdHMgdG8gYG1lZGl1bWAuIElmIHlvdSB1c2VcbiAgICAgICAqIGBwcm92aWRlck9wdGlvbnNgIHRvIHNldCB0aGUgYHJlYXNvbmluZ0VmZm9ydGAgb3B0aW9uLCB0aGlzIG1vZGVsIHNldHRpbmcgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAgICogVmFsaWQgdmFsdWVzOiAnbm9uZScgfCAnbWluaW1hbCcgfCAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ3hoaWdoJ1xuICAgICAgICpcbiAgICAgICAqIFRoZSAnbm9uZScgdHlwZSBmb3IgYHJlYXNvbmluZ0VmZm9ydGAgaXMgb25seSBhdmFpbGFibGUgZm9yIE9wZW5BSSdzIEdQVC01LjFcbiAgICAgICAqIG1vZGVscy4gQWxzbywgdGhlICd4aGlnaCcgdHlwZSBmb3IgYHJlYXNvbmluZ0VmZm9ydGAgaXMgb25seSBhdmFpbGFibGUgZm9yXG4gICAgICAgKiBPcGVuQUkncyBHUFQtNS4xLUNvZGV4LU1heCBtb2RlbC4gU2V0dGluZyBgcmVhc29uaW5nRWZmb3J0YCB0byAnbm9uZScgb3IgJ3hoaWdoJyB3aXRoIHVuc3VwcG9ydGVkIG1vZGVscyB3aWxsIHJlc3VsdCBpblxuICAgICAgICogYW4gZXJyb3IuXG4gICAgICAgKi9cbiAgICAgIHJlYXNvbmluZ0VmZm9ydDogejIyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIC8qKlxuICAgICAgICogQ29udHJvbHMgcmVhc29uaW5nIHN1bW1hcnkgb3V0cHV0IGZyb20gdGhlIG1vZGVsLlxuICAgICAgICogU2V0IHRvIFwiYXV0b1wiIHRvIGF1dG9tYXRpY2FsbHkgcmVjZWl2ZSB0aGUgcmljaGVzdCBsZXZlbCBhdmFpbGFibGUsXG4gICAgICAgKiBvciBcImRldGFpbGVkXCIgZm9yIGNvbXByZWhlbnNpdmUgc3VtbWFyaWVzLlxuICAgICAgICovXG4gICAgICByZWFzb25pbmdTdW1tYXJ5OiB6MjIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgaWRlbnRpZmllciBmb3Igc2FmZXR5IG1vbml0b3JpbmcgYW5kIHRyYWNraW5nLlxuICAgICAgICovXG4gICAgICBzYWZldHlJZGVudGlmaWVyOiB6MjIuc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBTZXJ2aWNlIHRpZXIgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAgICogU2V0IHRvICdmbGV4JyBmb3IgNTAlIGNoZWFwZXIgcHJvY2Vzc2luZyBhdCB0aGUgY29zdCBvZiBpbmNyZWFzZWQgbGF0ZW5jeSAoYXZhaWxhYmxlIGZvciBvMywgbzQtbWluaSwgYW5kIGdwdC01IG1vZGVscykuXG4gICAgICAgKiBTZXQgdG8gJ3ByaW9yaXR5JyBmb3IgZmFzdGVyIHByb2Nlc3Npbmcgd2l0aCBFbnRlcnByaXNlIGFjY2VzcyAoYXZhaWxhYmxlIGZvciBncHQtNCwgZ3B0LTUsIGdwdC01LW1pbmksIG8zLCBvNC1taW5pOyBncHQtNS1uYW5vIGlzIG5vdCBzdXBwb3J0ZWQpLlxuICAgICAgICpcbiAgICAgICAqIERlZmF1bHRzIHRvICdhdXRvJy5cbiAgICAgICAqL1xuICAgICAgc2VydmljZVRpZXI6IHoyMi5lbnVtKFtcImF1dG9cIiwgXCJmbGV4XCIsIFwicHJpb3JpdHlcIiwgXCJkZWZhdWx0XCJdKS5udWxsaXNoKCksXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gc3RvcmUgdGhlIGdlbmVyYXRpb24uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgICAqL1xuICAgICAgc3RvcmU6IHoyMi5ib29sZWFuKCkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBzdHJpY3QgSlNPTiBzY2hlbWEgdmFsaWRhdGlvbi5cbiAgICAgICAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgICAqL1xuICAgICAgc3RyaWN0SnNvblNjaGVtYTogejIyLmJvb2xlYW4oKS5udWxsaXNoKCksXG4gICAgICAvKipcbiAgICAgICAqIENvbnRyb2xzIHRoZSB2ZXJib3NpdHkgb2YgdGhlIG1vZGVsJ3MgcmVzcG9uc2VzLiBMb3dlciB2YWx1ZXMgKCdsb3cnKSB3aWxsIHJlc3VsdFxuICAgICAgICogaW4gbW9yZSBjb25jaXNlIHJlc3BvbnNlcywgd2hpbGUgaGlnaGVyIHZhbHVlcyAoJ2hpZ2gnKSB3aWxsIHJlc3VsdCBpbiBtb3JlIHZlcmJvc2UgcmVzcG9uc2VzLlxuICAgICAgICogVmFsaWQgdmFsdWVzOiAnbG93JywgJ21lZGl1bScsICdoaWdoJy5cbiAgICAgICAqL1xuICAgICAgdGV4dFZlcmJvc2l0eTogejIyLmVudW0oW1wibG93XCIsIFwibWVkaXVtXCIsIFwiaGlnaFwiXSkubnVsbGlzaCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBDb250cm9scyBvdXRwdXQgdHJ1bmNhdGlvbi4gJ2F1dG8nIChkZWZhdWx0KSBwZXJmb3JtcyB0cnVuY2F0aW9uIGF1dG9tYXRpY2FsbHk7XG4gICAgICAgKiAnZGlzYWJsZWQnIHR1cm5zIHRydW5jYXRpb24gb2ZmLlxuICAgICAgICovXG4gICAgICB0cnVuY2F0aW9uOiB6MjIuZW51bShbXCJhdXRvXCIsIFwiZGlzYWJsZWRcIl0pLm51bGxpc2goKSxcbiAgICAgIC8qKlxuICAgICAgICogQSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgeW91ciBlbmQtdXNlciwgd2hpY2ggY2FuIGhlbHAgT3BlbkFJIHRvXG4gICAgICAgKiBtb25pdG9yIGFuZCBkZXRlY3QgYWJ1c2UuXG4gICAgICAgKiBEZWZhdWx0cyB0byBgdW5kZWZpbmVkYC5cbiAgICAgICAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NhZmV0eS1iZXN0LXByYWN0aWNlcy9lbmQtdXNlci1pZHNcbiAgICAgICAqL1xuICAgICAgdXNlcjogejIyLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIC8qKlxuICAgICAgICogT3ZlcnJpZGUgdGhlIHN5c3RlbSBtZXNzYWdlIG1vZGUgZm9yIHRoaXMgbW9kZWwuXG4gICAgICAgKiAtICdzeXN0ZW0nOiBVc2UgdGhlICdzeXN0ZW0nIHJvbGUgZm9yIHN5c3RlbSBtZXNzYWdlcyAoZGVmYXVsdCBmb3IgbW9zdCBtb2RlbHMpXG4gICAgICAgKiAtICdkZXZlbG9wZXInOiBVc2UgdGhlICdkZXZlbG9wZXInIHJvbGUgZm9yIHN5c3RlbSBtZXNzYWdlcyAodXNlZCBieSByZWFzb25pbmcgbW9kZWxzKVxuICAgICAgICogLSAncmVtb3ZlJzogUmVtb3ZlIHN5c3RlbSBtZXNzYWdlcyBlbnRpcmVseVxuICAgICAgICpcbiAgICAgICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBtb2RlIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUgbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIHN5c3RlbU1lc3NhZ2VNb2RlOiB6MjIuZW51bShbXCJzeXN0ZW1cIiwgXCJkZXZlbG9wZXJcIiwgXCJyZW1vdmVcIl0pLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIEZvcmNlIHRyZWF0aW5nIHRoaXMgbW9kZWwgYXMgYSByZWFzb25pbmcgbW9kZWwuXG4gICAgICAgKlxuICAgICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIFwic3RlYWx0aFwiIHJlYXNvbmluZyBtb2RlbHMgKGUuZy4gdmlhIGEgY3VzdG9tIGJhc2VVUkwpXG4gICAgICAgKiB3aGVyZSB0aGUgbW9kZWwgSUQgaXMgbm90IHJlY29nbml6ZWQgYnkgdGhlIFNESydzIGFsbG93bGlzdC5cbiAgICAgICAqXG4gICAgICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBTREsgYXBwbGllcyByZWFzb25pbmctbW9kZWwgcGFyYW1ldGVyIGNvbXBhdGliaWxpdHkgcnVsZXNcbiAgICAgICAqIGFuZCBkZWZhdWx0cyBgc3lzdGVtTWVzc2FnZU1vZGVgIHRvIGBkZXZlbG9wZXJgIHVubGVzcyBvdmVycmlkZGVuLlxuICAgICAgICovXG4gICAgICBmb3JjZVJlYXNvbmluZzogejIyLmJvb2xlYW4oKS5vcHRpb25hbCgpXG4gICAgfSlcbiAgKVxuKTtcblxuLy8gc3JjL3Jlc3BvbnNlcy9vcGVuYWktcmVzcG9uc2VzLXByZXBhcmUtdG9vbHMudHNcbmltcG9ydCB7XG4gIFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yIGFzIFVuc3VwcG9ydGVkRnVuY3Rpb25hbGl0eUVycm9yNVxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlclwiO1xuaW1wb3J0IHsgdmFsaWRhdGVUeXBlcyBhcyB2YWxpZGF0ZVR5cGVzMiB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlUmVzcG9uc2VzVG9vbHMoe1xuICB0b29scyxcbiAgdG9vbENob2ljZSxcbiAgdG9vbE5hbWVNYXBwaW5nLFxuICBjdXN0b21Qcm92aWRlclRvb2xOYW1lc1xufSkge1xuICB2YXIgX2EsIF9iO1xuICB0b29scyA9ICh0b29scyA9PSBudWxsID8gdm9pZCAwIDogdG9vbHMubGVuZ3RoKSA/IHRvb2xzIDogdm9pZCAwO1xuICBjb25zdCB0b29sV2FybmluZ3MgPSBbXTtcbiAgaWYgKHRvb2xzID09IG51bGwpIHtcbiAgICByZXR1cm4geyB0b29sczogdm9pZCAwLCB0b29sQ2hvaWNlOiB2b2lkIDAsIHRvb2xXYXJuaW5ncyB9O1xuICB9XG4gIGNvbnN0IG9wZW5haVRvb2xzMiA9IFtdO1xuICBjb25zdCByZXNvbHZlZEN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzID0gY3VzdG9tUHJvdmlkZXJUb29sTmFtZXMgIT0gbnVsbCA/IGN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzIDogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgZm9yIChjb25zdCB0b29sIG9mIHRvb2xzKSB7XG4gICAgc3dpdGNoICh0b29sLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICAgIGNvbnN0IG9wZW5haU9wdGlvbnMgPSAoX2EgPSB0b29sLnByb3ZpZGVyT3B0aW9ucykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLm9wZW5haTtcbiAgICAgICAgY29uc3QgZGVmZXJMb2FkaW5nID0gb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5kZWZlckxvYWRpbmc7XG4gICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgbmFtZTogdG9vbC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0b29sLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHRvb2wuaW5wdXRTY2hlbWEsXG4gICAgICAgICAgLi4udG9vbC5zdHJpY3QgIT0gbnVsbCA/IHsgc3RyaWN0OiB0b29sLnN0cmljdCB9IDoge30sXG4gICAgICAgICAgLi4uZGVmZXJMb2FkaW5nICE9IG51bGwgPyB7IGRlZmVyX2xvYWRpbmc6IGRlZmVyTG9hZGluZyB9IDoge31cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInByb3ZpZGVyXCI6IHtcbiAgICAgICAgc3dpdGNoICh0b29sLmlkKSB7XG4gICAgICAgICAgY2FzZSBcIm9wZW5haS5maWxlX3NlYXJjaFwiOiB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgdmFsaWRhdGVUeXBlczIoe1xuICAgICAgICAgICAgICB2YWx1ZTogdG9vbC5hcmdzLFxuICAgICAgICAgICAgICBzY2hlbWE6IGZpbGVTZWFyY2hBcmdzU2NoZW1hXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJmaWxlX3NlYXJjaFwiLFxuICAgICAgICAgICAgICB2ZWN0b3Jfc3RvcmVfaWRzOiBhcmdzLnZlY3RvclN0b3JlSWRzLFxuICAgICAgICAgICAgICBtYXhfbnVtX3Jlc3VsdHM6IGFyZ3MubWF4TnVtUmVzdWx0cyxcbiAgICAgICAgICAgICAgcmFua2luZ19vcHRpb25zOiBhcmdzLnJhbmtpbmcgPyB7XG4gICAgICAgICAgICAgICAgcmFua2VyOiBhcmdzLnJhbmtpbmcucmFua2VyLFxuICAgICAgICAgICAgICAgIHNjb3JlX3RocmVzaG9sZDogYXJncy5yYW5raW5nLnNjb3JlVGhyZXNob2xkXG4gICAgICAgICAgICAgIH0gOiB2b2lkIDAsXG4gICAgICAgICAgICAgIGZpbHRlcnM6IGFyZ3MuZmlsdGVyc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm9wZW5haS5sb2NhbF9zaGVsbFwiOiB7XG4gICAgICAgICAgICBvcGVuYWlUb29sczIucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwibG9jYWxfc2hlbGxcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm9wZW5haS5zaGVsbFwiOiB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgdmFsaWRhdGVUeXBlczIoe1xuICAgICAgICAgICAgICB2YWx1ZTogdG9vbC5hcmdzLFxuICAgICAgICAgICAgICBzY2hlbWE6IHNoZWxsQXJnc1NjaGVtYVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcGVuYWlUb29sczIucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwic2hlbGxcIixcbiAgICAgICAgICAgICAgLi4uYXJncy5lbnZpcm9ubWVudCAmJiB7XG4gICAgICAgICAgICAgICAgZW52aXJvbm1lbnQ6IG1hcFNoZWxsRW52aXJvbm1lbnQoYXJncy5lbnZpcm9ubWVudClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm9wZW5haS5hcHBseV9wYXRjaFwiOiB7XG4gICAgICAgICAgICBvcGVuYWlUb29sczIucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiYXBwbHlfcGF0Y2hcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm9wZW5haS53ZWJfc2VhcmNoX3ByZXZpZXdcIjoge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGF3YWl0IHZhbGlkYXRlVHlwZXMyKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRvb2wuYXJncyxcbiAgICAgICAgICAgICAgc2NoZW1hOiB3ZWJTZWFyY2hQcmV2aWV3QXJnc1NjaGVtYVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcGVuYWlUb29sczIucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwid2ViX3NlYXJjaF9wcmV2aWV3XCIsXG4gICAgICAgICAgICAgIHNlYXJjaF9jb250ZXh0X3NpemU6IGFyZ3Muc2VhcmNoQ29udGV4dFNpemUsXG4gICAgICAgICAgICAgIHVzZXJfbG9jYXRpb246IGFyZ3MudXNlckxvY2F0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwib3BlbmFpLndlYl9zZWFyY2hcIjoge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGF3YWl0IHZhbGlkYXRlVHlwZXMyKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRvb2wuYXJncyxcbiAgICAgICAgICAgICAgc2NoZW1hOiB3ZWJTZWFyY2hBcmdzU2NoZW1hXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ3ZWJfc2VhcmNoXCIsXG4gICAgICAgICAgICAgIGZpbHRlcnM6IGFyZ3MuZmlsdGVycyAhPSBudWxsID8geyBhbGxvd2VkX2RvbWFpbnM6IGFyZ3MuZmlsdGVycy5hbGxvd2VkRG9tYWlucyB9IDogdm9pZCAwLFxuICAgICAgICAgICAgICBleHRlcm5hbF93ZWJfYWNjZXNzOiBhcmdzLmV4dGVybmFsV2ViQWNjZXNzLFxuICAgICAgICAgICAgICBzZWFyY2hfY29udGV4dF9zaXplOiBhcmdzLnNlYXJjaENvbnRleHRTaXplLFxuICAgICAgICAgICAgICB1c2VyX2xvY2F0aW9uOiBhcmdzLnVzZXJMb2NhdGlvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm9wZW5haS5jb2RlX2ludGVycHJldGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhd2FpdCB2YWxpZGF0ZVR5cGVzMih7XG4gICAgICAgICAgICAgIHZhbHVlOiB0b29sLmFyZ3MsXG4gICAgICAgICAgICAgIHNjaGVtYTogY29kZUludGVycHJldGVyQXJnc1NjaGVtYVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcGVuYWlUb29sczIucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiY29kZV9pbnRlcnByZXRlclwiLFxuICAgICAgICAgICAgICBjb250YWluZXI6IGFyZ3MuY29udGFpbmVyID09IG51bGwgPyB7IHR5cGU6IFwiYXV0b1wiLCBmaWxlX2lkczogdm9pZCAwIH0gOiB0eXBlb2YgYXJncy5jb250YWluZXIgPT09IFwic3RyaW5nXCIgPyBhcmdzLmNvbnRhaW5lciA6IHsgdHlwZTogXCJhdXRvXCIsIGZpbGVfaWRzOiBhcmdzLmNvbnRhaW5lci5maWxlSWRzIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJvcGVuYWkuaW1hZ2VfZ2VuZXJhdGlvblwiOiB7XG4gICAgICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgdmFsaWRhdGVUeXBlczIoe1xuICAgICAgICAgICAgICB2YWx1ZTogdG9vbC5hcmdzLFxuICAgICAgICAgICAgICBzY2hlbWE6IGltYWdlR2VuZXJhdGlvbkFyZ3NTY2hlbWFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3BlbmFpVG9vbHMyLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcImltYWdlX2dlbmVyYXRpb25cIixcbiAgICAgICAgICAgICAgYmFja2dyb3VuZDogYXJncy5iYWNrZ3JvdW5kLFxuICAgICAgICAgICAgICBpbnB1dF9maWRlbGl0eTogYXJncy5pbnB1dEZpZGVsaXR5LFxuICAgICAgICAgICAgICBpbnB1dF9pbWFnZV9tYXNrOiBhcmdzLmlucHV0SW1hZ2VNYXNrID8ge1xuICAgICAgICAgICAgICAgIGZpbGVfaWQ6IGFyZ3MuaW5wdXRJbWFnZU1hc2suZmlsZUlkLFxuICAgICAgICAgICAgICAgIGltYWdlX3VybDogYXJncy5pbnB1dEltYWdlTWFzay5pbWFnZVVybFxuICAgICAgICAgICAgICB9IDogdm9pZCAwLFxuICAgICAgICAgICAgICBtb2RlbDogYXJncy5tb2RlbCxcbiAgICAgICAgICAgICAgbW9kZXJhdGlvbjogYXJncy5tb2RlcmF0aW9uLFxuICAgICAgICAgICAgICBwYXJ0aWFsX2ltYWdlczogYXJncy5wYXJ0aWFsSW1hZ2VzLFxuICAgICAgICAgICAgICBxdWFsaXR5OiBhcmdzLnF1YWxpdHksXG4gICAgICAgICAgICAgIG91dHB1dF9jb21wcmVzc2lvbjogYXJncy5vdXRwdXRDb21wcmVzc2lvbixcbiAgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdDogYXJncy5vdXRwdXRGb3JtYXQsXG4gICAgICAgICAgICAgIHNpemU6IGFyZ3Muc2l6ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm9wZW5haS5tY3BcIjoge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGF3YWl0IHZhbGlkYXRlVHlwZXMyKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRvb2wuYXJncyxcbiAgICAgICAgICAgICAgc2NoZW1hOiBtY3BBcmdzU2NoZW1hXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG1hcEFwcHJvdmFsRmlsdGVyID0gKGZpbHRlcikgPT4gKHtcbiAgICAgICAgICAgICAgdG9vbF9uYW1lczogZmlsdGVyLnRvb2xOYW1lc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlQXBwcm92YWwgPSBhcmdzLnJlcXVpcmVBcHByb3ZhbDtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVBcHByb3ZhbFBhcmFtID0gcmVxdWlyZUFwcHJvdmFsID09IG51bGwgPyB2b2lkIDAgOiB0eXBlb2YgcmVxdWlyZUFwcHJvdmFsID09PSBcInN0cmluZ1wiID8gcmVxdWlyZUFwcHJvdmFsIDogcmVxdWlyZUFwcHJvdmFsLm5ldmVyICE9IG51bGwgPyB7IG5ldmVyOiBtYXBBcHByb3ZhbEZpbHRlcihyZXF1aXJlQXBwcm92YWwubmV2ZXIpIH0gOiB2b2lkIDA7XG4gICAgICAgICAgICBvcGVuYWlUb29sczIucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwibWNwXCIsXG4gICAgICAgICAgICAgIHNlcnZlcl9sYWJlbDogYXJncy5zZXJ2ZXJMYWJlbCxcbiAgICAgICAgICAgICAgYWxsb3dlZF90b29sczogQXJyYXkuaXNBcnJheShhcmdzLmFsbG93ZWRUb29scykgPyBhcmdzLmFsbG93ZWRUb29scyA6IGFyZ3MuYWxsb3dlZFRvb2xzID8ge1xuICAgICAgICAgICAgICAgIHJlYWRfb25seTogYXJncy5hbGxvd2VkVG9vbHMucmVhZE9ubHksXG4gICAgICAgICAgICAgICAgdG9vbF9uYW1lczogYXJncy5hbGxvd2VkVG9vbHMudG9vbE5hbWVzXG4gICAgICAgICAgICAgIH0gOiB2b2lkIDAsXG4gICAgICAgICAgICAgIGF1dGhvcml6YXRpb246IGFyZ3MuYXV0aG9yaXphdGlvbixcbiAgICAgICAgICAgICAgY29ubmVjdG9yX2lkOiBhcmdzLmNvbm5lY3RvcklkLFxuICAgICAgICAgICAgICBoZWFkZXJzOiBhcmdzLmhlYWRlcnMsXG4gICAgICAgICAgICAgIHJlcXVpcmVfYXBwcm92YWw6IHJlcXVpcmVBcHByb3ZhbFBhcmFtICE9IG51bGwgPyByZXF1aXJlQXBwcm92YWxQYXJhbSA6IFwibmV2ZXJcIixcbiAgICAgICAgICAgICAgc2VydmVyX2Rlc2NyaXB0aW9uOiBhcmdzLnNlcnZlckRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBzZXJ2ZXJfdXJsOiBhcmdzLnNlcnZlclVybFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm9wZW5haS5jdXN0b21cIjoge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGF3YWl0IHZhbGlkYXRlVHlwZXMyKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRvb2wuYXJncyxcbiAgICAgICAgICAgICAgc2NoZW1hOiBjdXN0b21BcmdzU2NoZW1hXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wZW5haVRvb2xzMi5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgICAgICAgICAgbmFtZTogYXJncy5uYW1lLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYXJncy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgZm9ybWF0OiBhcmdzLmZvcm1hdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXNvbHZlZEN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzLmFkZChhcmdzLm5hbWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJvcGVuYWkudG9vbF9zZWFyY2hcIjoge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGF3YWl0IHZhbGlkYXRlVHlwZXMyKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRvb2wuYXJncyxcbiAgICAgICAgICAgICAgc2NoZW1hOiB0b29sU2VhcmNoQXJnc1NjaGVtYVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcGVuYWlUb29sczIucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidG9vbF9zZWFyY2hcIixcbiAgICAgICAgICAgICAgLi4uYXJncy5leGVjdXRpb24gIT0gbnVsbCA/IHsgZXhlY3V0aW9uOiBhcmdzLmV4ZWN1dGlvbiB9IDoge30sXG4gICAgICAgICAgICAgIC4uLmFyZ3MuZGVzY3JpcHRpb24gIT0gbnVsbCA/IHsgZGVzY3JpcHRpb246IGFyZ3MuZGVzY3JpcHRpb24gfSA6IHt9LFxuICAgICAgICAgICAgICAuLi5hcmdzLnBhcmFtZXRlcnMgIT0gbnVsbCA/IHsgcGFyYW1ldGVyczogYXJncy5wYXJhbWV0ZXJzIH0gOiB7fVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0b29sV2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLFxuICAgICAgICAgIGZlYXR1cmU6IGBmdW5jdGlvbiB0b29sICR7dG9vbH1gXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHRvb2xDaG9pY2UgPT0gbnVsbCkge1xuICAgIHJldHVybiB7IHRvb2xzOiBvcGVuYWlUb29sczIsIHRvb2xDaG9pY2U6IHZvaWQgMCwgdG9vbFdhcm5pbmdzIH07XG4gIH1cbiAgY29uc3QgdHlwZSA9IHRvb2xDaG9pY2UudHlwZTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcImF1dG9cIjpcbiAgICBjYXNlIFwibm9uZVwiOlxuICAgIGNhc2UgXCJyZXF1aXJlZFwiOlxuICAgICAgcmV0dXJuIHsgdG9vbHM6IG9wZW5haVRvb2xzMiwgdG9vbENob2ljZTogdHlwZSwgdG9vbFdhcm5pbmdzIH07XG4gICAgY2FzZSBcInRvb2xcIjoge1xuICAgICAgY29uc3QgcmVzb2x2ZWRUb29sTmFtZSA9IChfYiA9IHRvb2xOYW1lTWFwcGluZyA9PSBudWxsID8gdm9pZCAwIDogdG9vbE5hbWVNYXBwaW5nLnRvUHJvdmlkZXJUb29sTmFtZSh0b29sQ2hvaWNlLnRvb2xOYW1lKSkgIT0gbnVsbCA/IF9iIDogdG9vbENob2ljZS50b29sTmFtZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvb2xzOiBvcGVuYWlUb29sczIsXG4gICAgICAgIHRvb2xDaG9pY2U6IHJlc29sdmVkVG9vbE5hbWUgPT09IFwiY29kZV9pbnRlcnByZXRlclwiIHx8IHJlc29sdmVkVG9vbE5hbWUgPT09IFwiZmlsZV9zZWFyY2hcIiB8fCByZXNvbHZlZFRvb2xOYW1lID09PSBcImltYWdlX2dlbmVyYXRpb25cIiB8fCByZXNvbHZlZFRvb2xOYW1lID09PSBcIndlYl9zZWFyY2hfcHJldmlld1wiIHx8IHJlc29sdmVkVG9vbE5hbWUgPT09IFwid2ViX3NlYXJjaFwiIHx8IHJlc29sdmVkVG9vbE5hbWUgPT09IFwibWNwXCIgfHwgcmVzb2x2ZWRUb29sTmFtZSA9PT0gXCJhcHBseV9wYXRjaFwiID8geyB0eXBlOiByZXNvbHZlZFRvb2xOYW1lIH0gOiByZXNvbHZlZEN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzLmhhcyhyZXNvbHZlZFRvb2xOYW1lKSA/IHsgdHlwZTogXCJjdXN0b21cIiwgbmFtZTogcmVzb2x2ZWRUb29sTmFtZSB9IDogeyB0eXBlOiBcImZ1bmN0aW9uXCIsIG5hbWU6IHJlc29sdmVkVG9vbE5hbWUgfSxcbiAgICAgICAgdG9vbFdhcm5pbmdzXG4gICAgICB9O1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBfZXhoYXVzdGl2ZUNoZWNrID0gdHlwZTtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEZ1bmN0aW9uYWxpdHlFcnJvcjUoe1xuICAgICAgICBmdW5jdGlvbmFsaXR5OiBgdG9vbCBjaG9pY2UgdHlwZTogJHtfZXhoYXVzdGl2ZUNoZWNrfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFwU2hlbGxFbnZpcm9ubWVudChlbnZpcm9ubWVudCkge1xuICBpZiAoZW52aXJvbm1lbnQudHlwZSA9PT0gXCJjb250YWluZXJSZWZlcmVuY2VcIikge1xuICAgIGNvbnN0IGVudjIgPSBlbnZpcm9ubWVudDtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJjb250YWluZXJfcmVmZXJlbmNlXCIsXG4gICAgICBjb250YWluZXJfaWQ6IGVudjIuY29udGFpbmVySWRcbiAgICB9O1xuICB9XG4gIGlmIChlbnZpcm9ubWVudC50eXBlID09PSBcImNvbnRhaW5lckF1dG9cIikge1xuICAgIGNvbnN0IGVudjIgPSBlbnZpcm9ubWVudDtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJjb250YWluZXJfYXV0b1wiLFxuICAgICAgZmlsZV9pZHM6IGVudjIuZmlsZUlkcyxcbiAgICAgIG1lbW9yeV9saW1pdDogZW52Mi5tZW1vcnlMaW1pdCxcbiAgICAgIG5ldHdvcmtfcG9saWN5OiBlbnYyLm5ldHdvcmtQb2xpY3kgPT0gbnVsbCA/IHZvaWQgMCA6IGVudjIubmV0d29ya1BvbGljeS50eXBlID09PSBcImRpc2FibGVkXCIgPyB7IHR5cGU6IFwiZGlzYWJsZWRcIiB9IDoge1xuICAgICAgICB0eXBlOiBcImFsbG93bGlzdFwiLFxuICAgICAgICBhbGxvd2VkX2RvbWFpbnM6IGVudjIubmV0d29ya1BvbGljeS5hbGxvd2VkRG9tYWlucyxcbiAgICAgICAgZG9tYWluX3NlY3JldHM6IGVudjIubmV0d29ya1BvbGljeS5kb21haW5TZWNyZXRzXG4gICAgICB9LFxuICAgICAgc2tpbGxzOiBtYXBTaGVsbFNraWxscyhlbnYyLnNraWxscylcbiAgICB9O1xuICB9XG4gIGNvbnN0IGVudiA9IGVudmlyb25tZW50O1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwibG9jYWxcIixcbiAgICBza2lsbHM6IGVudi5za2lsbHNcbiAgfTtcbn1cbmZ1bmN0aW9uIG1hcFNoZWxsU2tpbGxzKHNraWxscykge1xuICByZXR1cm4gc2tpbGxzID09IG51bGwgPyB2b2lkIDAgOiBza2lsbHMubWFwKFxuICAgIChza2lsbCkgPT4gc2tpbGwudHlwZSA9PT0gXCJza2lsbFJlZmVyZW5jZVwiID8ge1xuICAgICAgdHlwZTogXCJza2lsbF9yZWZlcmVuY2VcIixcbiAgICAgIHNraWxsX2lkOiBza2lsbC5za2lsbElkLFxuICAgICAgdmVyc2lvbjogc2tpbGwudmVyc2lvblxuICAgIH0gOiB7XG4gICAgICB0eXBlOiBcImlubGluZVwiLFxuICAgICAgbmFtZTogc2tpbGwubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBza2lsbC5kZXNjcmlwdGlvbixcbiAgICAgIHNvdXJjZToge1xuICAgICAgICB0eXBlOiBcImJhc2U2NFwiLFxuICAgICAgICBtZWRpYV90eXBlOiBza2lsbC5zb3VyY2UubWVkaWFUeXBlLFxuICAgICAgICBkYXRhOiBza2lsbC5zb3VyY2UuZGF0YVxuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuLy8gc3JjL3Jlc3BvbnNlcy9vcGVuYWktcmVzcG9uc2VzLWxhbmd1YWdlLW1vZGVsLnRzXG5mdW5jdGlvbiBleHRyYWN0QXBwcm92YWxSZXF1ZXN0SWRUb1Rvb2xDYWxsSWRNYXBwaW5nKHByb21wdCkge1xuICB2YXIgX2EsIF9iO1xuICBjb25zdCBtYXBwaW5nID0ge307XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBwcm9tcHQpIHtcbiAgICBpZiAobWVzc2FnZS5yb2xlICE9PSBcImFzc2lzdGFudFwiKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgbWVzc2FnZS5jb250ZW50KSB7XG4gICAgICBpZiAocGFydC50eXBlICE9PSBcInRvb2wtY2FsbFwiKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGFwcHJvdmFsUmVxdWVzdElkID0gKF9iID0gKF9hID0gcGFydC5wcm92aWRlck9wdGlvbnMpID09IG51bGwgPyB2b2lkIDAgOiBfYS5vcGVuYWkpID09IG51bGwgPyB2b2lkIDAgOiBfYi5hcHByb3ZhbFJlcXVlc3RJZDtcbiAgICAgIGlmIChhcHByb3ZhbFJlcXVlc3RJZCAhPSBudWxsKSB7XG4gICAgICAgIG1hcHBpbmdbYXBwcm92YWxSZXF1ZXN0SWRdID0gcGFydC50b29sQ2FsbElkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWFwcGluZztcbn1cbnZhciBPcGVuQUlSZXNwb25zZXNMYW5ndWFnZU1vZGVsID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihtb2RlbElkLCBjb25maWcpIHtcbiAgICB0aGlzLnNwZWNpZmljYXRpb25WZXJzaW9uID0gXCJ2M1wiO1xuICAgIHRoaXMuc3VwcG9ydGVkVXJscyA9IHtcbiAgICAgIFwiaW1hZ2UvKlwiOiBbL15odHRwcz86XFwvXFwvLiokL10sXG4gICAgICBcImFwcGxpY2F0aW9uL3BkZlwiOiBbL15odHRwcz86XFwvXFwvLiokL11cbiAgICB9O1xuICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQ7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cbiAgZ2V0IHByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm92aWRlcjtcbiAgfVxuICBhc3luYyBnZXRBcmdzKHtcbiAgICBtYXhPdXRwdXRUb2tlbnMsXG4gICAgdGVtcGVyYXR1cmUsXG4gICAgc3RvcFNlcXVlbmNlcyxcbiAgICB0b3BQLFxuICAgIHRvcEssXG4gICAgcHJlc2VuY2VQZW5hbHR5LFxuICAgIGZyZXF1ZW5jeVBlbmFsdHksXG4gICAgc2VlZCxcbiAgICBwcm9tcHQsXG4gICAgcHJvdmlkZXJPcHRpb25zLFxuICAgIHRvb2xzLFxuICAgIHRvb2xDaG9pY2UsXG4gICAgcmVzcG9uc2VGb3JtYXRcbiAgfSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9pO1xuICAgIGNvbnN0IHdhcm5pbmdzID0gW107XG4gICAgY29uc3QgbW9kZWxDYXBhYmlsaXRpZXMgPSBnZXRPcGVuQUlMYW5ndWFnZU1vZGVsQ2FwYWJpbGl0aWVzKHRoaXMubW9kZWxJZCk7XG4gICAgaWYgKHRvcEsgIT0gbnVsbCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7IHR5cGU6IFwidW5zdXBwb3J0ZWRcIiwgZmVhdHVyZTogXCJ0b3BLXCIgfSk7XG4gICAgfVxuICAgIGlmIChzZWVkICE9IG51bGwpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goeyB0eXBlOiBcInVuc3VwcG9ydGVkXCIsIGZlYXR1cmU6IFwic2VlZFwiIH0pO1xuICAgIH1cbiAgICBpZiAocHJlc2VuY2VQZW5hbHR5ICE9IG51bGwpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goeyB0eXBlOiBcInVuc3VwcG9ydGVkXCIsIGZlYXR1cmU6IFwicHJlc2VuY2VQZW5hbHR5XCIgfSk7XG4gICAgfVxuICAgIGlmIChmcmVxdWVuY3lQZW5hbHR5ICE9IG51bGwpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goeyB0eXBlOiBcInVuc3VwcG9ydGVkXCIsIGZlYXR1cmU6IFwiZnJlcXVlbmN5UGVuYWx0eVwiIH0pO1xuICAgIH1cbiAgICBpZiAoc3RvcFNlcXVlbmNlcyAhPSBudWxsKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHsgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLCBmZWF0dXJlOiBcInN0b3BTZXF1ZW5jZXNcIiB9KTtcbiAgICB9XG4gICAgY29uc3QgcHJvdmlkZXJPcHRpb25zTmFtZSA9IHRoaXMuY29uZmlnLnByb3ZpZGVyLmluY2x1ZGVzKFwiYXp1cmVcIikgPyBcImF6dXJlXCIgOiBcIm9wZW5haVwiO1xuICAgIGxldCBvcGVuYWlPcHRpb25zID0gYXdhaXQgcGFyc2VQcm92aWRlck9wdGlvbnM1KHtcbiAgICAgIHByb3ZpZGVyOiBwcm92aWRlck9wdGlvbnNOYW1lLFxuICAgICAgcHJvdmlkZXJPcHRpb25zLFxuICAgICAgc2NoZW1hOiBvcGVuYWlMYW5ndWFnZU1vZGVsUmVzcG9uc2VzT3B0aW9uc1NjaGVtYVxuICAgIH0pO1xuICAgIGlmIChvcGVuYWlPcHRpb25zID09IG51bGwgJiYgcHJvdmlkZXJPcHRpb25zTmFtZSAhPT0gXCJvcGVuYWlcIikge1xuICAgICAgb3BlbmFpT3B0aW9ucyA9IGF3YWl0IHBhcnNlUHJvdmlkZXJPcHRpb25zNSh7XG4gICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgICAgIHNjaGVtYTogb3BlbmFpTGFuZ3VhZ2VNb2RlbFJlc3BvbnNlc09wdGlvbnNTY2hlbWFcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBpc1JlYXNvbmluZ01vZGVsID0gKF9hID0gb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5mb3JjZVJlYXNvbmluZykgIT0gbnVsbCA/IF9hIDogbW9kZWxDYXBhYmlsaXRpZXMuaXNSZWFzb25pbmdNb2RlbDtcbiAgICBpZiAoKG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMuY29udmVyc2F0aW9uKSAmJiAob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5wcmV2aW91c1Jlc3BvbnNlSWQpKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLFxuICAgICAgICBmZWF0dXJlOiBcImNvbnZlcnNhdGlvblwiLFxuICAgICAgICBkZXRhaWxzOiBcImNvbnZlcnNhdGlvbiBhbmQgcHJldmlvdXNSZXNwb25zZUlkIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB0b29sTmFtZU1hcHBpbmcgPSBjcmVhdGVUb29sTmFtZU1hcHBpbmcoe1xuICAgICAgdG9vbHMsXG4gICAgICBwcm92aWRlclRvb2xOYW1lczoge1xuICAgICAgICBcIm9wZW5haS5jb2RlX2ludGVycHJldGVyXCI6IFwiY29kZV9pbnRlcnByZXRlclwiLFxuICAgICAgICBcIm9wZW5haS5maWxlX3NlYXJjaFwiOiBcImZpbGVfc2VhcmNoXCIsXG4gICAgICAgIFwib3BlbmFpLmltYWdlX2dlbmVyYXRpb25cIjogXCJpbWFnZV9nZW5lcmF0aW9uXCIsXG4gICAgICAgIFwib3BlbmFpLmxvY2FsX3NoZWxsXCI6IFwibG9jYWxfc2hlbGxcIixcbiAgICAgICAgXCJvcGVuYWkuc2hlbGxcIjogXCJzaGVsbFwiLFxuICAgICAgICBcIm9wZW5haS53ZWJfc2VhcmNoXCI6IFwid2ViX3NlYXJjaFwiLFxuICAgICAgICBcIm9wZW5haS53ZWJfc2VhcmNoX3ByZXZpZXdcIjogXCJ3ZWJfc2VhcmNoX3ByZXZpZXdcIixcbiAgICAgICAgXCJvcGVuYWkubWNwXCI6IFwibWNwXCIsXG4gICAgICAgIFwib3BlbmFpLmFwcGx5X3BhdGNoXCI6IFwiYXBwbHlfcGF0Y2hcIixcbiAgICAgICAgXCJvcGVuYWkudG9vbF9zZWFyY2hcIjogXCJ0b29sX3NlYXJjaFwiXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZVByb3ZpZGVyVG9vbE5hbWU6ICh0b29sKSA9PiB0b29sLmlkID09PSBcIm9wZW5haS5jdXN0b21cIiA/IHRvb2wuYXJncy5uYW1lIDogdm9pZCAwXG4gICAgfSk7XG4gICAgY29uc3QgY3VzdG9tUHJvdmlkZXJUb29sTmFtZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIHRvb2xzOiBvcGVuYWlUb29sczIsXG4gICAgICB0b29sQ2hvaWNlOiBvcGVuYWlUb29sQ2hvaWNlLFxuICAgICAgdG9vbFdhcm5pbmdzXG4gICAgfSA9IGF3YWl0IHByZXBhcmVSZXNwb25zZXNUb29scyh7XG4gICAgICB0b29scyxcbiAgICAgIHRvb2xDaG9pY2UsXG4gICAgICB0b29sTmFtZU1hcHBpbmcsXG4gICAgICBjdXN0b21Qcm92aWRlclRvb2xOYW1lc1xuICAgIH0pO1xuICAgIGNvbnN0IHsgaW5wdXQsIHdhcm5pbmdzOiBpbnB1dFdhcm5pbmdzIH0gPSBhd2FpdCBjb252ZXJ0VG9PcGVuQUlSZXNwb25zZXNJbnB1dCh7XG4gICAgICBwcm9tcHQsXG4gICAgICB0b29sTmFtZU1hcHBpbmcsXG4gICAgICBzeXN0ZW1NZXNzYWdlTW9kZTogKF9iID0gb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5zeXN0ZW1NZXNzYWdlTW9kZSkgIT0gbnVsbCA/IF9iIDogaXNSZWFzb25pbmdNb2RlbCA/IFwiZGV2ZWxvcGVyXCIgOiBtb2RlbENhcGFiaWxpdGllcy5zeXN0ZW1NZXNzYWdlTW9kZSxcbiAgICAgIHByb3ZpZGVyT3B0aW9uc05hbWUsXG4gICAgICBmaWxlSWRQcmVmaXhlczogdGhpcy5jb25maWcuZmlsZUlkUHJlZml4ZXMsXG4gICAgICBzdG9yZTogKF9jID0gb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5zdG9yZSkgIT0gbnVsbCA/IF9jIDogdHJ1ZSxcbiAgICAgIGhhc0NvbnZlcnNhdGlvbjogKG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMuY29udmVyc2F0aW9uKSAhPSBudWxsLFxuICAgICAgaGFzTG9jYWxTaGVsbFRvb2w6IGhhc09wZW5BSVRvb2woXCJvcGVuYWkubG9jYWxfc2hlbGxcIiksXG4gICAgICBoYXNTaGVsbFRvb2w6IGhhc09wZW5BSVRvb2woXCJvcGVuYWkuc2hlbGxcIiksXG4gICAgICBoYXNBcHBseVBhdGNoVG9vbDogaGFzT3BlbkFJVG9vbChcIm9wZW5haS5hcHBseV9wYXRjaFwiKSxcbiAgICAgIGN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzOiBjdXN0b21Qcm92aWRlclRvb2xOYW1lcy5zaXplID4gMCA/IGN1c3RvbVByb3ZpZGVyVG9vbE5hbWVzIDogdm9pZCAwXG4gICAgfSk7XG4gICAgd2FybmluZ3MucHVzaCguLi5pbnB1dFdhcm5pbmdzKTtcbiAgICBjb25zdCBzdHJpY3RKc29uU2NoZW1hID0gKF9kID0gb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5zdHJpY3RKc29uU2NoZW1hKSAhPSBudWxsID8gX2QgOiB0cnVlO1xuICAgIGxldCBpbmNsdWRlID0gb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5pbmNsdWRlO1xuICAgIGZ1bmN0aW9uIGFkZEluY2x1ZGUoa2V5KSB7XG4gICAgICBpZiAoaW5jbHVkZSA9PSBudWxsKSB7XG4gICAgICAgIGluY2x1ZGUgPSBba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoIWluY2x1ZGUuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBpbmNsdWRlID0gWy4uLmluY2x1ZGUsIGtleV07XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhc09wZW5BSVRvb2woaWQpIHtcbiAgICAgIHJldHVybiAodG9vbHMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xzLmZpbmQoKHRvb2wpID0+IHRvb2wudHlwZSA9PT0gXCJwcm92aWRlclwiICYmIHRvb2wuaWQgPT09IGlkKSkgIT0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdG9wTG9ncHJvYnMgPSB0eXBlb2YgKG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMubG9ncHJvYnMpID09PSBcIm51bWJlclwiID8gb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5sb2dwcm9icyA6IChvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLmxvZ3Byb2JzKSA9PT0gdHJ1ZSA/IFRPUF9MT0dQUk9CU19NQVggOiB2b2lkIDA7XG4gICAgaWYgKHRvcExvZ3Byb2JzKSB7XG4gICAgICBhZGRJbmNsdWRlKFwibWVzc2FnZS5vdXRwdXRfdGV4dC5sb2dwcm9ic1wiKTtcbiAgICB9XG4gICAgY29uc3Qgd2ViU2VhcmNoVG9vbE5hbWUgPSAoX2UgPSB0b29scyA9PSBudWxsID8gdm9pZCAwIDogdG9vbHMuZmluZChcbiAgICAgICh0b29sKSA9PiB0b29sLnR5cGUgPT09IFwicHJvdmlkZXJcIiAmJiAodG9vbC5pZCA9PT0gXCJvcGVuYWkud2ViX3NlYXJjaFwiIHx8IHRvb2wuaWQgPT09IFwib3BlbmFpLndlYl9zZWFyY2hfcHJldmlld1wiKVxuICAgICkpID09IG51bGwgPyB2b2lkIDAgOiBfZS5uYW1lO1xuICAgIGlmICh3ZWJTZWFyY2hUb29sTmFtZSkge1xuICAgICAgYWRkSW5jbHVkZShcIndlYl9zZWFyY2hfY2FsbC5hY3Rpb24uc291cmNlc1wiKTtcbiAgICB9XG4gICAgaWYgKGhhc09wZW5BSVRvb2woXCJvcGVuYWkuY29kZV9pbnRlcnByZXRlclwiKSkge1xuICAgICAgYWRkSW5jbHVkZShcImNvZGVfaW50ZXJwcmV0ZXJfY2FsbC5vdXRwdXRzXCIpO1xuICAgIH1cbiAgICBjb25zdCBzdG9yZSA9IG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMuc3RvcmU7XG4gICAgaWYgKHN0b3JlID09PSBmYWxzZSAmJiBpc1JlYXNvbmluZ01vZGVsKSB7XG4gICAgICBhZGRJbmNsdWRlKFwicmVhc29uaW5nLmVuY3J5cHRlZF9jb250ZW50XCIpO1xuICAgIH1cbiAgICBjb25zdCBiYXNlQXJncyA9IHtcbiAgICAgIG1vZGVsOiB0aGlzLm1vZGVsSWQsXG4gICAgICBpbnB1dCxcbiAgICAgIHRlbXBlcmF0dXJlLFxuICAgICAgdG9wX3A6IHRvcFAsXG4gICAgICBtYXhfb3V0cHV0X3Rva2VuczogbWF4T3V0cHV0VG9rZW5zLFxuICAgICAgLi4uKChyZXNwb25zZUZvcm1hdCA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2VGb3JtYXQudHlwZSkgPT09IFwianNvblwiIHx8IChvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnRleHRWZXJib3NpdHkpKSAmJiB7XG4gICAgICAgIHRleHQ6IHtcbiAgICAgICAgICAuLi4ocmVzcG9uc2VGb3JtYXQgPT0gbnVsbCA/IHZvaWQgMCA6IHJlc3BvbnNlRm9ybWF0LnR5cGUpID09PSBcImpzb25cIiAmJiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHJlc3BvbnNlRm9ybWF0LnNjaGVtYSAhPSBudWxsID8ge1xuICAgICAgICAgICAgICB0eXBlOiBcImpzb25fc2NoZW1hXCIsXG4gICAgICAgICAgICAgIHN0cmljdDogc3RyaWN0SnNvblNjaGVtYSxcbiAgICAgICAgICAgICAgbmFtZTogKF9mID0gcmVzcG9uc2VGb3JtYXQubmFtZSkgIT0gbnVsbCA/IF9mIDogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcmVzcG9uc2VGb3JtYXQuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIHNjaGVtYTogcmVzcG9uc2VGb3JtYXQuc2NoZW1hXG4gICAgICAgICAgICB9IDogeyB0eXBlOiBcImpzb25fb2JqZWN0XCIgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMudGV4dFZlcmJvc2l0eSkgJiYge1xuICAgICAgICAgICAgdmVyYm9zaXR5OiBvcGVuYWlPcHRpb25zLnRleHRWZXJib3NpdHlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBwcm92aWRlciBvcHRpb25zOlxuICAgICAgY29udmVyc2F0aW9uOiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLmNvbnZlcnNhdGlvbixcbiAgICAgIG1heF90b29sX2NhbGxzOiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLm1heFRvb2xDYWxscyxcbiAgICAgIG1ldGFkYXRhOiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLm1ldGFkYXRhLFxuICAgICAgcGFyYWxsZWxfdG9vbF9jYWxsczogb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5wYXJhbGxlbFRvb2xDYWxscyxcbiAgICAgIHByZXZpb3VzX3Jlc3BvbnNlX2lkOiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnByZXZpb3VzUmVzcG9uc2VJZCxcbiAgICAgIHN0b3JlLFxuICAgICAgdXNlcjogb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy51c2VyLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLmluc3RydWN0aW9ucyxcbiAgICAgIHNlcnZpY2VfdGllcjogb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5zZXJ2aWNlVGllcixcbiAgICAgIGluY2x1ZGUsXG4gICAgICBwcm9tcHRfY2FjaGVfa2V5OiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnByb21wdENhY2hlS2V5LFxuICAgICAgcHJvbXB0X2NhY2hlX3JldGVudGlvbjogb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5wcm9tcHRDYWNoZVJldGVudGlvbixcbiAgICAgIHNhZmV0eV9pZGVudGlmaWVyOiBvcGVuYWlPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcGVuYWlPcHRpb25zLnNhZmV0eUlkZW50aWZpZXIsXG4gICAgICB0b3BfbG9ncHJvYnM6IHRvcExvZ3Byb2JzLFxuICAgICAgdHJ1bmNhdGlvbjogb3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy50cnVuY2F0aW9uLFxuICAgICAgLy8gbW9kZWwtc3BlY2lmaWMgc2V0dGluZ3M6XG4gICAgICAuLi5pc1JlYXNvbmluZ01vZGVsICYmICgob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5yZWFzb25pbmdFZmZvcnQpICE9IG51bGwgfHwgKG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMucmVhc29uaW5nU3VtbWFyeSkgIT0gbnVsbCkgJiYge1xuICAgICAgICByZWFzb25pbmc6IHtcbiAgICAgICAgICAuLi4ob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5yZWFzb25pbmdFZmZvcnQpICE9IG51bGwgJiYge1xuICAgICAgICAgICAgZWZmb3J0OiBvcGVuYWlPcHRpb25zLnJlYXNvbmluZ0VmZm9ydFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMucmVhc29uaW5nU3VtbWFyeSkgIT0gbnVsbCAmJiB7XG4gICAgICAgICAgICBzdW1tYXJ5OiBvcGVuYWlPcHRpb25zLnJlYXNvbmluZ1N1bW1hcnlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChpc1JlYXNvbmluZ01vZGVsKSB7XG4gICAgICBpZiAoISgob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5yZWFzb25pbmdFZmZvcnQpID09PSBcIm5vbmVcIiAmJiBtb2RlbENhcGFiaWxpdGllcy5zdXBwb3J0c05vblJlYXNvbmluZ1BhcmFtZXRlcnMpKSB7XG4gICAgICAgIGlmIChiYXNlQXJncy50ZW1wZXJhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgYmFzZUFyZ3MudGVtcGVyYXR1cmUgPSB2b2lkIDA7XG4gICAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgICAgICBmZWF0dXJlOiBcInRlbXBlcmF0dXJlXCIsXG4gICAgICAgICAgICBkZXRhaWxzOiBcInRlbXBlcmF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHJlYXNvbmluZyBtb2RlbHNcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlQXJncy50b3BfcCAhPSBudWxsKSB7XG4gICAgICAgICAgYmFzZUFyZ3MudG9wX3AgPSB2b2lkIDA7XG4gICAgICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgICAgICBmZWF0dXJlOiBcInRvcFBcIixcbiAgICAgICAgICAgIGRldGFpbHM6IFwidG9wUCBpcyBub3Qgc3VwcG9ydGVkIGZvciByZWFzb25pbmcgbW9kZWxzXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoKG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMucmVhc29uaW5nRWZmb3J0KSAhPSBudWxsKSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICBmZWF0dXJlOiBcInJlYXNvbmluZ0VmZm9ydFwiLFxuICAgICAgICAgIGRldGFpbHM6IFwicmVhc29uaW5nRWZmb3J0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vbi1yZWFzb25pbmcgbW9kZWxzXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoKG9wZW5haU9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wZW5haU9wdGlvbnMucmVhc29uaW5nU3VtbWFyeSkgIT0gbnVsbCkge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgICAgZmVhdHVyZTogXCJyZWFzb25pbmdTdW1tYXJ5XCIsXG4gICAgICAgICAgZGV0YWlsczogXCJyZWFzb25pbmdTdW1tYXJ5IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vbi1yZWFzb25pbmcgbW9kZWxzXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5zZXJ2aWNlVGllcikgPT09IFwiZmxleFwiICYmICFtb2RlbENhcGFiaWxpdGllcy5zdXBwb3J0c0ZsZXhQcm9jZXNzaW5nKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJ1bnN1cHBvcnRlZFwiLFxuICAgICAgICBmZWF0dXJlOiBcInNlcnZpY2VUaWVyXCIsXG4gICAgICAgIGRldGFpbHM6IFwiZmxleCBwcm9jZXNzaW5nIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBvMywgbzQtbWluaSwgYW5kIGdwdC01IG1vZGVsc1wiXG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBiYXNlQXJncy5zZXJ2aWNlX3RpZXI7XG4gICAgfVxuICAgIGlmICgob3BlbmFpT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3BlbmFpT3B0aW9ucy5zZXJ2aWNlVGllcikgPT09IFwicHJpb3JpdHlcIiAmJiAhbW9kZWxDYXBhYmlsaXRpZXMuc3VwcG9ydHNQcmlvcml0eVByb2Nlc3NpbmcpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgIGZlYXR1cmU6IFwic2VydmljZVRpZXJcIixcbiAgICAgICAgZGV0YWlsczogXCJwcmlvcml0eSBwcm9jZXNzaW5nIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdXBwb3J0ZWQgbW9kZWxzIChncHQtNCwgZ3B0LTUsIGdwdC01LW1pbmksIG8zLCBvNC1taW5pKSBhbmQgcmVxdWlyZXMgRW50ZXJwcmlzZSBhY2Nlc3MuIGdwdC01LW5hbm8gaXMgbm90IHN1cHBvcnRlZFwiXG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBiYXNlQXJncy5zZXJ2aWNlX3RpZXI7XG4gICAgfVxuICAgIGNvbnN0IHNoZWxsVG9vbEVudlR5cGUgPSAoX2kgPSAoX2ggPSAoX2cgPSB0b29scyA9PSBudWxsID8gdm9pZCAwIDogdG9vbHMuZmluZChcbiAgICAgICh0b29sKSA9PiB0b29sLnR5cGUgPT09IFwicHJvdmlkZXJcIiAmJiB0b29sLmlkID09PSBcIm9wZW5haS5zaGVsbFwiXG4gICAgKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9nLmFyZ3MpID09IG51bGwgPyB2b2lkIDAgOiBfaC5lbnZpcm9ubWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9pLnR5cGU7XG4gICAgY29uc3QgaXNTaGVsbFByb3ZpZGVyRXhlY3V0ZWQgPSBzaGVsbFRvb2xFbnZUeXBlID09PSBcImNvbnRhaW5lckF1dG9cIiB8fCBzaGVsbFRvb2xFbnZUeXBlID09PSBcImNvbnRhaW5lclJlZmVyZW5jZVwiO1xuICAgIHJldHVybiB7XG4gICAgICB3ZWJTZWFyY2hUb29sTmFtZSxcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgLi4uYmFzZUFyZ3MsXG4gICAgICAgIHRvb2xzOiBvcGVuYWlUb29sczIsXG4gICAgICAgIHRvb2xfY2hvaWNlOiBvcGVuYWlUb29sQ2hvaWNlXG4gICAgICB9LFxuICAgICAgd2FybmluZ3M6IFsuLi53YXJuaW5ncywgLi4udG9vbFdhcm5pbmdzXSxcbiAgICAgIHN0b3JlLFxuICAgICAgdG9vbE5hbWVNYXBwaW5nLFxuICAgICAgcHJvdmlkZXJPcHRpb25zTmFtZSxcbiAgICAgIGlzU2hlbGxQcm92aWRlckV4ZWN1dGVkXG4gICAgfTtcbiAgfVxuICBhc3luYyBkb0dlbmVyYXRlKG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaSwgX2osIF9rLCBfbCwgX20sIF9uLCBfbywgX3AsIF9xLCBfciwgX3MsIF90LCBfdSwgX3YsIF93LCBfeCwgX3ksIF96LCBfQSwgX0I7XG4gICAgY29uc3Qge1xuICAgICAgYXJnczogYm9keSxcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgd2ViU2VhcmNoVG9vbE5hbWUsXG4gICAgICB0b29sTmFtZU1hcHBpbmcsXG4gICAgICBwcm92aWRlck9wdGlvbnNOYW1lLFxuICAgICAgaXNTaGVsbFByb3ZpZGVyRXhlY3V0ZWRcbiAgICB9ID0gYXdhaXQgdGhpcy5nZXRBcmdzKG9wdGlvbnMpO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnLnVybCh7XG4gICAgICBwYXRoOiBcIi9yZXNwb25zZXNcIixcbiAgICAgIG1vZGVsSWQ6IHRoaXMubW9kZWxJZFxuICAgIH0pO1xuICAgIGNvbnN0IGFwcHJvdmFsUmVxdWVzdElkVG9EdW1teVRvb2xDYWxsSWRGcm9tUHJvbXB0ID0gZXh0cmFjdEFwcHJvdmFsUmVxdWVzdElkVG9Ub29sQ2FsbElkTWFwcGluZyhvcHRpb25zLnByb21wdCk7XG4gICAgY29uc3Qge1xuICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgdmFsdWU6IHJlc3BvbnNlLFxuICAgICAgcmF3VmFsdWU6IHJhd1Jlc3BvbnNlXG4gICAgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGk1KHtcbiAgICAgIHVybCxcbiAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzNSh0aGlzLmNvbmZpZy5oZWFkZXJzKCksIG9wdGlvbnMuaGVhZGVycyksXG4gICAgICBib2R5LFxuICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBvcGVuYWlGYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyNShcbiAgICAgICAgb3BlbmFpUmVzcG9uc2VzUmVzcG9uc2VTY2hlbWFcbiAgICAgICksXG4gICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEFQSUNhbGxFcnJvcih7XG4gICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLmVycm9yLm1lc3NhZ2UsXG4gICAgICAgIHVybCxcbiAgICAgICAgcmVxdWVzdEJvZHlWYWx1ZXM6IGJvZHksXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMCxcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICByZXNwb25zZUJvZHk6IHJhd1Jlc3BvbnNlLFxuICAgICAgICBpc1JldHJ5YWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gW107XG4gICAgY29uc3QgbG9ncHJvYnMgPSBbXTtcbiAgICBsZXQgaGFzRnVuY3Rpb25DYWxsID0gZmFsc2U7XG4gICAgY29uc3QgaG9zdGVkVG9vbFNlYXJjaENhbGxJZHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcmVzcG9uc2Uub3V0cHV0KSB7XG4gICAgICBzd2l0Y2ggKHBhcnQudHlwZSkge1xuICAgICAgICBjYXNlIFwicmVhc29uaW5nXCI6IHtcbiAgICAgICAgICBpZiAocGFydC5zdW1tYXJ5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcGFydC5zdW1tYXJ5LnB1c2goeyB0eXBlOiBcInN1bW1hcnlfdGV4dFwiLCB0ZXh0OiBcIlwiIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHN1bW1hcnkgb2YgcGFydC5zdW1tYXJ5KSB7XG4gICAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZ1wiLFxuICAgICAgICAgICAgICB0ZXh0OiBzdW1tYXJ5LnRleHQsXG4gICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgIGl0ZW1JZDogcGFydC5pZCxcbiAgICAgICAgICAgICAgICAgIHJlYXNvbmluZ0VuY3J5cHRlZENvbnRlbnQ6IChfYSA9IHBhcnQuZW5jcnlwdGVkX2NvbnRlbnQpICE9IG51bGwgPyBfYSA6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiaW1hZ2VfZ2VuZXJhdGlvbl9jYWxsXCI6IHtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuaWQsXG4gICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJpbWFnZV9nZW5lcmF0aW9uXCIpLFxuICAgICAgICAgICAgaW5wdXQ6IFwie31cIixcbiAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC5pZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImltYWdlX2dlbmVyYXRpb25cIiksXG4gICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgcmVzdWx0OiBwYXJ0LnJlc3VsdFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJ0b29sX3NlYXJjaF9jYWxsXCI6IHtcbiAgICAgICAgICBjb25zdCB0b29sQ2FsbElkID0gKF9iID0gcGFydC5jYWxsX2lkKSAhPSBudWxsID8gX2IgOiBwYXJ0LmlkO1xuICAgICAgICAgIGNvbnN0IGlzSG9zdGVkID0gcGFydC5leGVjdXRpb24gPT09IFwic2VydmVyXCI7XG4gICAgICAgICAgaWYgKGlzSG9zdGVkKSB7XG4gICAgICAgICAgICBob3N0ZWRUb29sU2VhcmNoQ2FsbElkcy5wdXNoKHRvb2xDYWxsSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQsXG4gICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJ0b29sX3NlYXJjaFwiKSxcbiAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGFyZ3VtZW50czogcGFydC5hcmd1bWVudHMsXG4gICAgICAgICAgICAgIGNhbGxfaWQ6IHBhcnQuY2FsbF9pZFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAuLi5pc0hvc3RlZCA/IHsgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZSB9IDoge30sXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgIGl0ZW1JZDogcGFydC5pZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInRvb2xfc2VhcmNoX291dHB1dFwiOiB7XG4gICAgICAgICAgY29uc3QgdG9vbENhbGxJZCA9IChfZCA9IChfYyA9IHBhcnQuY2FsbF9pZCkgIT0gbnVsbCA/IF9jIDogaG9zdGVkVG9vbFNlYXJjaENhbGxJZHMuc2hpZnQoKSkgIT0gbnVsbCA/IF9kIDogcGFydC5pZDtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgICAgICAgdG9vbENhbGxJZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcInRvb2xfc2VhcmNoXCIpLFxuICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgIHRvb2xzOiBwYXJ0LnRvb2xzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICBpdGVtSWQ6IHBhcnQuaWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJsb2NhbF9zaGVsbF9jYWxsXCI6IHtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuY2FsbF9pZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImxvY2FsX3NoZWxsXCIpLFxuICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgYWN0aW9uOiBwYXJ0LmFjdGlvblxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgIGl0ZW1JZDogcGFydC5pZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNoZWxsX2NhbGxcIjoge1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC5jYWxsX2lkLFxuICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwic2hlbGxcIiksXG4gICAgICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBhY3Rpb246IHtcbiAgICAgICAgICAgICAgICBjb21tYW5kczogcGFydC5hY3Rpb24uY29tbWFuZHNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAuLi5pc1NoZWxsUHJvdmlkZXJFeGVjdXRlZCAmJiB7IHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgaXRlbUlkOiBwYXJ0LmlkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2hlbGxfY2FsbF9vdXRwdXRcIjoge1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmNhbGxfaWQsXG4gICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJzaGVsbFwiKSxcbiAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICBvdXRwdXQ6IHBhcnQub3V0cHV0Lm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgICAgICBzdGRvdXQ6IGl0ZW0uc3Rkb3V0LFxuICAgICAgICAgICAgICAgIHN0ZGVycjogaXRlbS5zdGRlcnIsXG4gICAgICAgICAgICAgICAgb3V0Y29tZTogaXRlbS5vdXRjb21lLnR5cGUgPT09IFwiZXhpdFwiID8ge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJleGl0XCIsXG4gICAgICAgICAgICAgICAgICBleGl0Q29kZTogaXRlbS5vdXRjb21lLmV4aXRfY29kZVxuICAgICAgICAgICAgICAgIH0gOiB7IHR5cGU6IFwidGltZW91dFwiIH1cbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjoge1xuICAgICAgICAgIGZvciAoY29uc3QgY29udGVudFBhcnQgb2YgcGFydC5jb250ZW50KSB7XG4gICAgICAgICAgICBpZiAoKChfZiA9IChfZSA9IG9wdGlvbnMucHJvdmlkZXJPcHRpb25zKSA9PSBudWxsID8gdm9pZCAwIDogX2VbcHJvdmlkZXJPcHRpb25zTmFtZV0pID09IG51bGwgPyB2b2lkIDAgOiBfZi5sb2dwcm9icykgJiYgY29udGVudFBhcnQubG9ncHJvYnMpIHtcbiAgICAgICAgICAgICAgbG9ncHJvYnMucHVzaChjb250ZW50UGFydC5sb2dwcm9icyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcm92aWRlck1ldGFkYXRhMiA9IHtcbiAgICAgICAgICAgICAgaXRlbUlkOiBwYXJ0LmlkLFxuICAgICAgICAgICAgICAuLi5wYXJ0LnBoYXNlICE9IG51bGwgJiYgeyBwaGFzZTogcGFydC5waGFzZSB9LFxuICAgICAgICAgICAgICAuLi5jb250ZW50UGFydC5hbm5vdGF0aW9ucy5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uczogY29udGVudFBhcnQuYW5ub3RhdGlvbnNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBjb250ZW50UGFydC50ZXh0LFxuICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiBwcm92aWRlck1ldGFkYXRhMlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBjb250ZW50UGFydC5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbi50eXBlID09PSBcInVybF9jaXRhdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgICAgICBzb3VyY2VUeXBlOiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IChfaSA9IChfaCA9IChfZyA9IHRoaXMuY29uZmlnKS5nZW5lcmF0ZUlkKSA9PSBudWxsID8gdm9pZCAwIDogX2guY2FsbChfZykpICE9IG51bGwgPyBfaSA6IGdlbmVyYXRlSWQyKCksXG4gICAgICAgICAgICAgICAgICB1cmw6IGFubm90YXRpb24udXJsLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IGFubm90YXRpb24udGl0bGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLnR5cGUgPT09IFwiZmlsZV9jaXRhdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgICAgICBzb3VyY2VUeXBlOiBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgICBpZDogKF9sID0gKF9rID0gKF9qID0gdGhpcy5jb25maWcpLmdlbmVyYXRlSWQpID09IG51bGwgPyB2b2lkIDAgOiBfay5jYWxsKF9qKSkgIT0gbnVsbCA/IF9sIDogZ2VuZXJhdGVJZDIoKSxcbiAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogXCJ0ZXh0L3BsYWluXCIsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogYW5ub3RhdGlvbi5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBhbm5vdGF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhbm5vdGF0aW9uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBhbm5vdGF0aW9uLmZpbGVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGFubm90YXRpb24uaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb24udHlwZSA9PT0gXCJjb250YWluZXJfZmlsZV9jaXRhdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgICAgICBzb3VyY2VUeXBlOiBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgICBpZDogKF9vID0gKF9uID0gKF9tID0gdGhpcy5jb25maWcpLmdlbmVyYXRlSWQpID09IG51bGwgPyB2b2lkIDAgOiBfbi5jYWxsKF9tKSkgIT0gbnVsbCA/IF9vIDogZ2VuZXJhdGVJZDIoKSxcbiAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogXCJ0ZXh0L3BsYWluXCIsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogYW5ub3RhdGlvbi5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBhbm5vdGF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhbm5vdGF0aW9uLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBhbm5vdGF0aW9uLmZpbGVfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVySWQ6IGFubm90YXRpb24uY29udGFpbmVyX2lkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uLnR5cGUgPT09IFwiZmlsZV9wYXRoXCIpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgICAgICAgIHNvdXJjZVR5cGU6IFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiAoX3IgPSAoX3EgPSAoX3AgPSB0aGlzLmNvbmZpZykuZ2VuZXJhdGVJZCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9xLmNhbGwoX3ApKSAhPSBudWxsID8gX3IgOiBnZW5lcmF0ZUlkMigpLFxuICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6IGFubm90YXRpb24uZmlsZV9pZCxcbiAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBhbm5vdGF0aW9uLmZpbGVfaWQsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFubm90YXRpb24udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IGFubm90YXRpb24uZmlsZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICBpbmRleDogYW5ub3RhdGlvbi5pbmRleFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uX2NhbGxcIjoge1xuICAgICAgICAgIGhhc0Z1bmN0aW9uQ2FsbCA9IHRydWU7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmNhbGxfaWQsXG4gICAgICAgICAgICB0b29sTmFtZTogcGFydC5uYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHBhcnQuYXJndW1lbnRzLFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICBpdGVtSWQ6IHBhcnQuaWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJjdXN0b21fdG9vbF9jYWxsXCI6IHtcbiAgICAgICAgICBoYXNGdW5jdGlvbkNhbGwgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IHRvb2xOYW1lID0gdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUocGFydC5uYW1lKTtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuY2FsbF9pZCxcbiAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHBhcnQuaW5wdXQpLFxuICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICBpdGVtSWQ6IHBhcnQuaWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJ3ZWJfc2VhcmNoX2NhbGxcIjoge1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC5pZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcbiAgICAgICAgICAgICAgd2ViU2VhcmNoVG9vbE5hbWUgIT0gbnVsbCA/IHdlYlNlYXJjaFRvb2xOYW1lIDogXCJ3ZWJfc2VhcmNoXCJcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkoe30pLFxuICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmlkLFxuICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFxuICAgICAgICAgICAgICB3ZWJTZWFyY2hUb29sTmFtZSAhPSBudWxsID8gd2ViU2VhcmNoVG9vbE5hbWUgOiBcIndlYl9zZWFyY2hcIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHJlc3VsdDogbWFwV2ViU2VhcmNoT3V0cHV0KHBhcnQuYWN0aW9uKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJtY3BfY2FsbFwiOiB7XG4gICAgICAgICAgY29uc3QgdG9vbENhbGxJZCA9IHBhcnQuYXBwcm92YWxfcmVxdWVzdF9pZCAhPSBudWxsID8gKF9zID0gYXBwcm92YWxSZXF1ZXN0SWRUb0R1bW15VG9vbENhbGxJZEZyb21Qcm9tcHRbcGFydC5hcHByb3ZhbF9yZXF1ZXN0X2lkXSkgIT0gbnVsbCA/IF9zIDogcGFydC5pZCA6IHBhcnQuaWQ7XG4gICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBgbWNwLiR7cGFydC5uYW1lfWA7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICBpbnB1dDogcGFydC5hcmd1bWVudHMsXG4gICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlLFxuICAgICAgICAgICAgZHluYW1pYzogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJjYWxsXCIsXG4gICAgICAgICAgICAgIHNlcnZlckxhYmVsOiBwYXJ0LnNlcnZlcl9sYWJlbCxcbiAgICAgICAgICAgICAgbmFtZTogcGFydC5uYW1lLFxuICAgICAgICAgICAgICBhcmd1bWVudHM6IHBhcnQuYXJndW1lbnRzLFxuICAgICAgICAgICAgICAuLi5wYXJ0Lm91dHB1dCAhPSBudWxsID8geyBvdXRwdXQ6IHBhcnQub3V0cHV0IH0gOiB7fSxcbiAgICAgICAgICAgICAgLi4ucGFydC5lcnJvciAhPSBudWxsID8geyBlcnJvcjogcGFydC5lcnJvciB9IDoge31cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgIGl0ZW1JZDogcGFydC5pZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIm1jcF9saXN0X3Rvb2xzXCI6IHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwibWNwX2FwcHJvdmFsX3JlcXVlc3RcIjoge1xuICAgICAgICAgIGNvbnN0IGFwcHJvdmFsUmVxdWVzdElkID0gKF90ID0gcGFydC5hcHByb3ZhbF9yZXF1ZXN0X2lkKSAhPSBudWxsID8gX3QgOiBwYXJ0LmlkO1xuICAgICAgICAgIGNvbnN0IGR1bW15VG9vbENhbGxJZCA9IChfdyA9IChfdiA9IChfdSA9IHRoaXMuY29uZmlnKS5nZW5lcmF0ZUlkKSA9PSBudWxsID8gdm9pZCAwIDogX3YuY2FsbChfdSkpICE9IG51bGwgPyBfdyA6IGdlbmVyYXRlSWQyKCk7XG4gICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBgbWNwLiR7cGFydC5uYW1lfWA7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBkdW1teVRvb2xDYWxsSWQsXG4gICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgIGlucHV0OiBwYXJ0LmFyZ3VtZW50cyxcbiAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWUsXG4gICAgICAgICAgICBkeW5hbWljOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1hcHByb3ZhbC1yZXF1ZXN0XCIsXG4gICAgICAgICAgICBhcHByb3ZhbElkOiBhcHByb3ZhbFJlcXVlc3RJZCxcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IGR1bW15VG9vbENhbGxJZFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJjb21wdXRlcl9jYWxsXCI6IHtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuaWQsXG4gICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJjb21wdXRlcl91c2VcIiksXG4gICAgICAgICAgICBpbnB1dDogXCJcIixcbiAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgICAgICAgdG9vbENhbGxJZDogcGFydC5pZCxcbiAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImNvbXB1dGVyX3VzZVwiKSxcbiAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICB0eXBlOiBcImNvbXB1dGVyX3VzZV90b29sX3Jlc3VsdFwiLFxuICAgICAgICAgICAgICBzdGF0dXM6IHBhcnQuc3RhdHVzIHx8IFwiY29tcGxldGVkXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiZmlsZV9zZWFyY2hfY2FsbFwiOiB7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmlkLFxuICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiZmlsZV9zZWFyY2hcIiksXG4gICAgICAgICAgICBpbnB1dDogXCJ7fVwiLFxuICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmlkLFxuICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiZmlsZV9zZWFyY2hcIiksXG4gICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgcXVlcmllczogcGFydC5xdWVyaWVzLFxuICAgICAgICAgICAgICByZXN1bHRzOiAoX3kgPSAoX3ggPSBwYXJ0LnJlc3VsdHMpID09IG51bGwgPyB2b2lkIDAgOiBfeC5tYXAoKHJlc3VsdCkgPT4gKHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiByZXN1bHQuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICBmaWxlSWQ6IHJlc3VsdC5maWxlX2lkLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiByZXN1bHQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc2NvcmU6IHJlc3VsdC5zY29yZSxcbiAgICAgICAgICAgICAgICB0ZXh0OiByZXN1bHQudGV4dFxuICAgICAgICAgICAgICB9KSkpICE9IG51bGwgPyBfeSA6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiY29kZV9pbnRlcnByZXRlcl9jYWxsXCI6IHtcbiAgICAgICAgICBjb250ZW50LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQuaWQsXG4gICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJjb2RlX2ludGVycHJldGVyXCIpLFxuICAgICAgICAgICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgY29kZTogcGFydC5jb2RlLFxuICAgICAgICAgICAgICBjb250YWluZXJJZDogcGFydC5jb250YWluZXJfaWRcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmlkLFxuICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiY29kZV9pbnRlcnByZXRlclwiKSxcbiAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICBvdXRwdXRzOiBwYXJ0Lm91dHB1dHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYXBwbHlfcGF0Y2hfY2FsbFwiOiB7XG4gICAgICAgICAgY29udGVudC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICB0b29sQ2FsbElkOiBwYXJ0LmNhbGxfaWQsXG4gICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJhcHBseV9wYXRjaFwiKSxcbiAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGNhbGxJZDogcGFydC5jYWxsX2lkLFxuICAgICAgICAgICAgICBvcGVyYXRpb246IHBhcnQub3BlcmF0aW9uXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgaXRlbUlkOiBwYXJ0LmlkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm92aWRlck1ldGFkYXRhID0ge1xuICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgIHJlc3BvbnNlSWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgICAuLi5sb2dwcm9icy5sZW5ndGggPiAwID8geyBsb2dwcm9icyB9IDoge30sXG4gICAgICAgIC4uLnR5cGVvZiByZXNwb25zZS5zZXJ2aWNlX3RpZXIgPT09IFwic3RyaW5nXCIgPyB7IHNlcnZpY2VUaWVyOiByZXNwb25zZS5zZXJ2aWNlX3RpZXIgfSA6IHt9XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB1c2FnZSA9IHJlc3BvbnNlLnVzYWdlO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50LFxuICAgICAgZmluaXNoUmVhc29uOiB7XG4gICAgICAgIHVuaWZpZWQ6IG1hcE9wZW5BSVJlc3BvbnNlRmluaXNoUmVhc29uKHtcbiAgICAgICAgICBmaW5pc2hSZWFzb246IChfeiA9IHJlc3BvbnNlLmluY29tcGxldGVfZGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF96LnJlYXNvbixcbiAgICAgICAgICBoYXNGdW5jdGlvbkNhbGxcbiAgICAgICAgfSksXG4gICAgICAgIHJhdzogKF9CID0gKF9BID0gcmVzcG9uc2UuaW5jb21wbGV0ZV9kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX0EucmVhc29uKSAhPSBudWxsID8gX0IgOiB2b2lkIDBcbiAgICAgIH0sXG4gICAgICB1c2FnZTogY29udmVydE9wZW5BSVJlc3BvbnNlc1VzYWdlKHVzYWdlKSxcbiAgICAgIHJlcXVlc3Q6IHsgYm9keSB9LFxuICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKHJlc3BvbnNlLmNyZWF0ZWRfYXQgKiAxZTMpLFxuICAgICAgICBtb2RlbElkOiByZXNwb25zZS5tb2RlbCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBib2R5OiByYXdSZXNwb25zZVxuICAgICAgfSxcbiAgICAgIHByb3ZpZGVyTWV0YWRhdGEsXG4gICAgICB3YXJuaW5nc1xuICAgIH07XG4gIH1cbiAgYXN5bmMgZG9TdHJlYW0ob3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGFyZ3M6IGJvZHksXG4gICAgICB3YXJuaW5ncyxcbiAgICAgIHdlYlNlYXJjaFRvb2xOYW1lLFxuICAgICAgdG9vbE5hbWVNYXBwaW5nLFxuICAgICAgc3RvcmUsXG4gICAgICBwcm92aWRlck9wdGlvbnNOYW1lLFxuICAgICAgaXNTaGVsbFByb3ZpZGVyRXhlY3V0ZWRcbiAgICB9ID0gYXdhaXQgdGhpcy5nZXRBcmdzKG9wdGlvbnMpO1xuICAgIGNvbnN0IHsgcmVzcG9uc2VIZWFkZXJzLCB2YWx1ZTogcmVzcG9uc2UgfSA9IGF3YWl0IHBvc3RKc29uVG9BcGk1KHtcbiAgICAgIHVybDogdGhpcy5jb25maWcudXJsKHtcbiAgICAgICAgcGF0aDogXCIvcmVzcG9uc2VzXCIsXG4gICAgICAgIG1vZGVsSWQ6IHRoaXMubW9kZWxJZFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVyczUodGhpcy5jb25maWcuaGVhZGVycygpLCBvcHRpb25zLmhlYWRlcnMpLFxuICAgICAgYm9keToge1xuICAgICAgICAuLi5ib2R5LFxuICAgICAgICBzdHJlYW06IHRydWVcbiAgICAgIH0sXG4gICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IG9wZW5haUZhaWxlZFJlc3BvbnNlSGFuZGxlcixcbiAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUV2ZW50U291cmNlUmVzcG9uc2VIYW5kbGVyMyhcbiAgICAgICAgb3BlbmFpUmVzcG9uc2VzQ2h1bmtTY2hlbWFcbiAgICAgICksXG4gICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgIH0pO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGFwcHJvdmFsUmVxdWVzdElkVG9EdW1teVRvb2xDYWxsSWRGcm9tUHJvbXB0ID0gZXh0cmFjdEFwcHJvdmFsUmVxdWVzdElkVG9Ub29sQ2FsbElkTWFwcGluZyhvcHRpb25zLnByb21wdCk7XG4gICAgY29uc3QgYXBwcm92YWxSZXF1ZXN0SWRUb0R1bW15VG9vbENhbGxJZEZyb21TdHJlYW0gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGxldCBmaW5pc2hSZWFzb24gPSB7XG4gICAgICB1bmlmaWVkOiBcIm90aGVyXCIsXG4gICAgICByYXc6IHZvaWQgMFxuICAgIH07XG4gICAgbGV0IHVzYWdlID0gdm9pZCAwO1xuICAgIGNvbnN0IGxvZ3Byb2JzID0gW107XG4gICAgbGV0IHJlc3BvbnNlSWQgPSBudWxsO1xuICAgIGNvbnN0IG9uZ29pbmdUb29sQ2FsbHMgPSB7fTtcbiAgICBjb25zdCBvbmdvaW5nQW5ub3RhdGlvbnMgPSBbXTtcbiAgICBsZXQgYWN0aXZlTWVzc2FnZVBoYXNlO1xuICAgIGxldCBoYXNGdW5jdGlvbkNhbGwgPSBmYWxzZTtcbiAgICBjb25zdCBhY3RpdmVSZWFzb25pbmcgPSB7fTtcbiAgICBsZXQgc2VydmljZVRpZXI7XG4gICAgY29uc3QgaG9zdGVkVG9vbFNlYXJjaENhbGxJZHMgPSBbXTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RyZWFtOiByZXNwb25zZS5waXBlVGhyb3VnaChcbiAgICAgICAgbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJzdHJlYW0tc3RhcnRcIiwgd2FybmluZ3MgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9pLCBfaiwgX2ssIF9sLCBfbSwgX24sIF9vLCBfcCwgX3EsIF9yLCBfcywgX3QsIF91LCBfdiwgX3csIF94LCBfeSwgX3osIF9BLCBfQiwgX0MsIF9ELCBfRSwgX0YsIF9HLCBfSCwgX0ksIF9KLCBfSywgX0w7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlUmF3Q2h1bmtzKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwicmF3XCIsIHJhd1ZhbHVlOiBjaHVuay5yYXdWYWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2h1bmsuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBmaW5pc2hSZWFzb24gPSB7IHVuaWZpZWQ6IFwiZXJyb3JcIiwgcmF3OiB2b2lkIDAgfTtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHsgdHlwZTogXCJlcnJvclwiLCBlcnJvcjogY2h1bmsuZXJyb3IgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2h1bmsudmFsdWU7XG4gICAgICAgICAgICBpZiAoaXNSZXNwb25zZU91dHB1dEl0ZW1BZGRlZENodW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgICBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcImZ1bmN0aW9uX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB2YWx1ZS5pdGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmNhbGxfaWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB2YWx1ZS5pdGVtLmNhbGxfaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdmFsdWUuaXRlbS5uYW1lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcImN1c3RvbV90b29sX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xOYW1lID0gdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXG4gICAgICAgICAgICAgICAgICB2YWx1ZS5pdGVtLm5hbWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5jYWxsX2lkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LXN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICBpZDogdmFsdWUuaXRlbS5jYWxsX2lkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwid2ViX3NlYXJjaF9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXG4gICAgICAgICAgICAgICAgICAgIHdlYlNlYXJjaFRvb2xOYW1lICE9IG51bGwgPyB3ZWJTZWFyY2hUb29sTmFtZSA6IFwid2ViX3NlYXJjaFwiXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5pZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1zdGFydFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXG4gICAgICAgICAgICAgICAgICAgIHdlYlNlYXJjaFRvb2xOYW1lICE9IG51bGwgPyB3ZWJTZWFyY2hUb29sTmFtZSA6IFwid2ViX3NlYXJjaFwiXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZW5kXCIsXG4gICAgICAgICAgICAgICAgICBpZDogdmFsdWUuaXRlbS5pZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcbiAgICAgICAgICAgICAgICAgICAgd2ViU2VhcmNoVG9vbE5hbWUgIT0gbnVsbCA/IHdlYlNlYXJjaFRvb2xOYW1lIDogXCJ3ZWJfc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkoe30pLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJjb21wdXRlcl9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJjb21wdXRlcl91c2VcIiksXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmlkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LXN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICBpZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImNvbXB1dGVyX3VzZVwiKSxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiY29kZV9pbnRlcnByZXRlcl9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJjb2RlX2ludGVycHJldGVyXCIpLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIGNvZGVJbnRlcnByZXRlcjoge1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJJZDogdmFsdWUuaXRlbS5jb250YWluZXJfaWRcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiY29kZV9pbnRlcnByZXRlclwiKSxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICBpZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIGRlbHRhOiBge1wiY29udGFpbmVySWRcIjpcIiR7dmFsdWUuaXRlbS5jb250YWluZXJfaWR9XCIsXCJjb2RlXCI6XCJgXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcImZpbGVfc2VhcmNoX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImZpbGVfc2VhcmNoXCIpLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IFwie31cIixcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiaW1hZ2VfZ2VuZXJhdGlvbl9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJpbWFnZV9nZW5lcmF0aW9uXCIpLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IFwie31cIixcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwidG9vbF9zZWFyY2hfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbENhbGxJZCA9IHZhbHVlLml0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcInRvb2xfc2VhcmNoXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSG9zdGVkID0gdmFsdWUuaXRlbS5leGVjdXRpb24gPT09IFwic2VydmVyXCI7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgdG9vbFNlYXJjaEV4ZWN1dGlvbjogKF9hID0gdmFsdWUuaXRlbS5leGVjdXRpb24pICE9IG51bGwgPyBfYSA6IFwic2VydmVyXCJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChpc0hvc3RlZCkge1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LXN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJ0b29sX3NlYXJjaF9vdXRwdXRcIikge1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJtY3BfY2FsbFwiIHx8IHZhbHVlLml0ZW0udHlwZSA9PT0gXCJtY3BfbGlzdF90b29sc1wiIHx8IHZhbHVlLml0ZW0udHlwZSA9PT0gXCJtY3BfYXBwcm92YWxfcmVxdWVzdFwiKSB7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcImFwcGx5X3BhdGNoX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY2FsbF9pZDogY2FsbElkLCBvcGVyYXRpb24gfSA9IHZhbHVlLml0ZW07XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiYXBwbHlfcGF0Y2hcIiksXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBjYWxsSWQsXG4gICAgICAgICAgICAgICAgICBhcHBseVBhdGNoOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZV9maWxlIGRvZXNuJ3QgaGF2ZSBkaWZmXG4gICAgICAgICAgICAgICAgICAgIGhhc0RpZmY6IG9wZXJhdGlvbi50eXBlID09PSBcImRlbGV0ZV9maWxlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVuZEVtaXR0ZWQ6IG9wZXJhdGlvbi50eXBlID09PSBcImRlbGV0ZV9maWxlXCJcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtc3RhcnRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiBjYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJhcHBseV9wYXRjaFwiKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24udHlwZSA9PT0gXCJkZWxldGVfZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbElkLFxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBjYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhOiBpbnB1dFN0cmluZ1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZW5kXCIsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBjYWxsSWRcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNhbGxJZCxcbiAgICAgICAgICAgICAgICAgICAgZGVsdGE6IGB7XCJjYWxsSWRcIjpcIiR7ZXNjYXBlSlNPTkRlbHRhKGNhbGxJZCl9XCIsXCJvcGVyYXRpb25cIjp7XCJ0eXBlXCI6XCIke2VzY2FwZUpTT05EZWx0YShvcGVyYXRpb24udHlwZSl9XCIsXCJwYXRoXCI6XCIke2VzY2FwZUpTT05EZWx0YShvcGVyYXRpb24ucGF0aCl9XCIsXCJkaWZmXCI6XCJgXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcInNoZWxsX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcInNoZWxsXCIpLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5jYWxsX2lkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwic2hlbGxfY2FsbF9vdXRwdXRcIikge1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nQW5ub3RhdGlvbnMuc3BsaWNlKDAsIG9uZ29pbmdBbm5vdGF0aW9ucy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZU1lc3NhZ2VQaGFzZSA9IChfYiA9IHZhbHVlLml0ZW0ucGhhc2UpICE9IG51bGwgPyBfYiA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0LXN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICBpZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlLml0ZW0ucGhhc2UgIT0gbnVsbCAmJiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaGFzZTogdmFsdWUuaXRlbS5waGFzZVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVzcG9uc2VPdXRwdXRJdGVtQWRkZWRDaHVuayh2YWx1ZSkgJiYgdmFsdWUuaXRlbS50eXBlID09PSBcInJlYXNvbmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlUmVhc29uaW5nW3ZhbHVlLml0ZW0uaWRdID0ge1xuICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkQ29udGVudDogdmFsdWUuaXRlbS5lbmNyeXB0ZWRfY29udGVudCxcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnlQYXJ0czogeyAwOiBcImFjdGl2ZVwiIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZy1zdGFydFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IGAke3ZhbHVlLml0ZW0uaWR9OjBgLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgcmVhc29uaW5nRW5jcnlwdGVkQ29udGVudDogKF9jID0gdmFsdWUuaXRlbS5lbmNyeXB0ZWRfY29udGVudCkgIT0gbnVsbCA/IF9jIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZU91dHB1dEl0ZW1Eb25lQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwibWVzc2FnZVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGhhc2UgPSAoX2QgPSB2YWx1ZS5pdGVtLnBoYXNlKSAhPSBudWxsID8gX2QgOiBhY3RpdmVNZXNzYWdlUGhhc2U7XG4gICAgICAgICAgICAgICAgYWN0aXZlTWVzc2FnZVBoYXNlID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRleHQtZW5kXCIsXG4gICAgICAgICAgICAgICAgICBpZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgICAgIC4uLnBoYXNlICE9IG51bGwgJiYgeyBwaGFzZSB9LFxuICAgICAgICAgICAgICAgICAgICAgIC4uLm9uZ29pbmdBbm5vdGF0aW9ucy5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zOiBvbmdvaW5nQW5ub3RhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGhhc0Z1bmN0aW9uQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1lbmRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB2YWx1ZS5pdGVtLmNhbGxfaWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHZhbHVlLml0ZW0uY2FsbF9pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB2YWx1ZS5pdGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogdmFsdWUuaXRlbS5hcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogdmFsdWUuaXRlbS5pZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcImN1c3RvbV90b29sX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBoYXNGdW5jdGlvbkNhbGwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xOYW1lID0gdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXG4gICAgICAgICAgICAgICAgICB2YWx1ZS5pdGVtLm5hbWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZW5kXCIsXG4gICAgICAgICAgICAgICAgICBpZDogdmFsdWUuaXRlbS5jYWxsX2lkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmNhbGxfaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh2YWx1ZS5pdGVtLmlucHV0KSxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiB2YWx1ZS5pdGVtLmlkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwid2ViX3NlYXJjaF9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXG4gICAgICAgICAgICAgICAgICAgIHdlYlNlYXJjaFRvb2xOYW1lICE9IG51bGwgPyB3ZWJTZWFyY2hUb29sTmFtZSA6IFwid2ViX3NlYXJjaFwiXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0OiBtYXBXZWJTZWFyY2hPdXRwdXQodmFsdWUuaXRlbS5hY3Rpb24pXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcImNvbXB1dGVyX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWVuZFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHZhbHVlLml0ZW0uaWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJjb21wdXRlcl91c2VcIiksXG4gICAgICAgICAgICAgICAgICBpbnB1dDogXCJcIixcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcImNvbXB1dGVyX3VzZVwiKSxcbiAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImNvbXB1dGVyX3VzZV90b29sX3Jlc3VsdFwiLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHZhbHVlLml0ZW0uc3RhdHVzIHx8IFwiY29tcGxldGVkXCJcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiZmlsZV9zZWFyY2hfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiZmlsZV9zZWFyY2hcIiksXG4gICAgICAgICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcmllczogdmFsdWUuaXRlbS5xdWVyaWVzLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiAoX2YgPSAoX2UgPSB2YWx1ZS5pdGVtLnJlc3VsdHMpID09IG51bGwgPyB2b2lkIDAgOiBfZS5tYXAoKHJlc3VsdCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiByZXN1bHQuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHJlc3VsdC5maWxlX2lkLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiByZXN1bHQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgc2NvcmU6IHJlc3VsdC5zY29yZSxcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiByZXN1bHQudGV4dFxuICAgICAgICAgICAgICAgICAgICB9KSkpICE9IG51bGwgPyBfZiA6IG51bGxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiY29kZV9pbnRlcnByZXRlcl9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHZhbHVlLml0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJjb2RlX2ludGVycHJldGVyXCIpLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IHZhbHVlLml0ZW0ub3V0cHV0c1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJpbWFnZV9nZW5lcmF0aW9uX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiaW1hZ2VfZ2VuZXJhdGlvblwiKSxcbiAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHZhbHVlLml0ZW0ucmVzdWx0XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcInRvb2xfc2VhcmNoX2NhbGxcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xDYWxsID0gb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSG9zdGVkID0gdmFsdWUuaXRlbS5leGVjdXRpb24gPT09IFwic2VydmVyXCI7XG4gICAgICAgICAgICAgICAgaWYgKHRvb2xDYWxsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xDYWxsSWQgPSBpc0hvc3RlZCA/IHRvb2xDYWxsLnRvb2xDYWxsSWQgOiAoX2cgPSB2YWx1ZS5pdGVtLmNhbGxfaWQpICE9IG51bGwgPyBfZyA6IHZhbHVlLml0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICBpZiAoaXNIb3N0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdGVkVG9vbFNlYXJjaENhbGxJZHMucHVzaCh0b29sQ2FsbElkKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LXN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsLnRvb2xOYW1lXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWVuZFwiLFxuICAgICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGxJZFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbENhbGwudG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzOiB2YWx1ZS5pdGVtLmFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICBjYWxsX2lkOiBpc0hvc3RlZCA/IG51bGwgOiB0b29sQ2FsbElkXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAuLi5pc0hvc3RlZCA/IHsgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZSB9IDoge30sXG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogdmFsdWUuaXRlbS5pZFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwidG9vbF9zZWFyY2hfb3V0cHV0XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29sQ2FsbElkID0gKF9pID0gKF9oID0gdmFsdWUuaXRlbS5jYWxsX2lkKSAhPSBudWxsID8gX2ggOiBob3N0ZWRUb29sU2VhcmNoQ2FsbElkcy5zaGlmdCgpKSAhPSBudWxsID8gX2kgOiB2YWx1ZS5pdGVtLmlkO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwidG9vbF9zZWFyY2hcIiksXG4gICAgICAgICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdG9vbHM6IHZhbHVlLml0ZW0udG9vbHNcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogdmFsdWUuaXRlbS5pZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXRlbS50eXBlID09PSBcIm1jcF9jYWxsXCIpIHtcbiAgICAgICAgICAgICAgICBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgY29uc3QgYXBwcm92YWxSZXF1ZXN0SWQgPSAoX2ogPSB2YWx1ZS5pdGVtLmFwcHJvdmFsX3JlcXVlc3RfaWQpICE9IG51bGwgPyBfaiA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGlhc2VkVG9vbENhbGxJZCA9IGFwcHJvdmFsUmVxdWVzdElkICE9IG51bGwgPyAoX2wgPSAoX2sgPSBhcHByb3ZhbFJlcXVlc3RJZFRvRHVtbXlUb29sQ2FsbElkRnJvbVN0cmVhbS5nZXQoXG4gICAgICAgICAgICAgICAgICBhcHByb3ZhbFJlcXVlc3RJZFxuICAgICAgICAgICAgICAgICkpICE9IG51bGwgPyBfayA6IGFwcHJvdmFsUmVxdWVzdElkVG9EdW1teVRvb2xDYWxsSWRGcm9tUHJvbXB0W2FwcHJvdmFsUmVxdWVzdElkXSkgIT0gbnVsbCA/IF9sIDogdmFsdWUuaXRlbS5pZCA6IHZhbHVlLml0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBgbWNwLiR7dmFsdWUuaXRlbS5uYW1lfWA7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBhbGlhc2VkVG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IHZhbHVlLml0ZW0uYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWM6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLXJlc3VsdFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogYWxpYXNlZFRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImNhbGxcIixcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyTGFiZWw6IHZhbHVlLml0ZW0uc2VydmVyX2xhYmVsLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiB2YWx1ZS5pdGVtLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50czogdmFsdWUuaXRlbS5hcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlLml0ZW0ub3V0cHV0ICE9IG51bGwgPyB7IG91dHB1dDogdmFsdWUuaXRlbS5vdXRwdXQgfSA6IHt9LFxuICAgICAgICAgICAgICAgICAgICAuLi52YWx1ZS5pdGVtLmVycm9yICE9IG51bGwgPyB7IGVycm9yOiB2YWx1ZS5pdGVtLmVycm9yIH0gOiB7fVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiB2YWx1ZS5pdGVtLmlkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwibWNwX2xpc3RfdG9vbHNcIikge1xuICAgICAgICAgICAgICAgIG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwiYXBwbHlfcGF0Y2hfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vbENhbGwgPSBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKCh0b29sQ2FsbCA9PSBudWxsID8gdm9pZCAwIDogdG9vbENhbGwuYXBwbHlQYXRjaCkgJiYgIXRvb2xDYWxsLmFwcGx5UGF0Y2guZW5kRW1pdHRlZCAmJiB2YWx1ZS5pdGVtLm9wZXJhdGlvbi50eXBlICE9PSBcImRlbGV0ZV9maWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGlmICghdG9vbENhbGwuYXBwbHlQYXRjaC5oYXNEaWZmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICAgICAgZGVsdGE6IGVzY2FwZUpTT05EZWx0YSh2YWx1ZS5pdGVtLm9wZXJhdGlvbi5kaWZmKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGwudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgICAgZGVsdGE6ICdcIn19J1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZW5kXCIsXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC50b29sQ2FsbElkXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsLmFwcGx5UGF0Y2guZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0b29sQ2FsbCAmJiB2YWx1ZS5pdGVtLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdG9vbENhbGwudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiYXBwbHlfcGF0Y2hcIiksXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgY2FsbElkOiB2YWx1ZS5pdGVtLmNhbGxfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiB2YWx1ZS5pdGVtLm9wZXJhdGlvblxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiB2YWx1ZS5pdGVtLmlkXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0gdm9pZCAwO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJtY3BfYXBwcm92YWxfcmVxdWVzdFwiKSB7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGR1bW15VG9vbENhbGxJZCA9IChfbyA9IChfbiA9IChfbSA9IHNlbGYuY29uZmlnKS5nZW5lcmF0ZUlkKSA9PSBudWxsID8gdm9pZCAwIDogX24uY2FsbChfbSkpICE9IG51bGwgPyBfbyA6IGdlbmVyYXRlSWQyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXBwcm92YWxSZXF1ZXN0SWQgPSAoX3AgPSB2YWx1ZS5pdGVtLmFwcHJvdmFsX3JlcXVlc3RfaWQpICE9IG51bGwgPyBfcCA6IHZhbHVlLml0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgYXBwcm92YWxSZXF1ZXN0SWRUb0R1bW15VG9vbENhbGxJZEZyb21TdHJlYW0uc2V0KFxuICAgICAgICAgICAgICAgICAgYXBwcm92YWxSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICBkdW1teVRvb2xDYWxsSWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xOYW1lID0gYG1jcC4ke3ZhbHVlLml0ZW0ubmFtZX1gO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogZHVtbXlUb29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogdmFsdWUuaXRlbS5hcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlckV4ZWN1dGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgZHluYW1pYzogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtYXBwcm92YWwtcmVxdWVzdFwiLFxuICAgICAgICAgICAgICAgICAgYXBwcm92YWxJZDogYXBwcm92YWxSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiBkdW1teVRvb2xDYWxsSWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwibG9jYWxfc2hlbGxfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5jYWxsX2lkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwibG9jYWxfc2hlbGxcIiksXG4gICAgICAgICAgICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImV4ZWNcIixcbiAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiB2YWx1ZS5pdGVtLmFjdGlvbi5jb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRNczogdmFsdWUuaXRlbS5hY3Rpb24udGltZW91dF9tcyxcbiAgICAgICAgICAgICAgICAgICAgICB1c2VyOiB2YWx1ZS5pdGVtLmFjdGlvbi51c2VyLFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6IHZhbHVlLml0ZW0uYWN0aW9uLndvcmtpbmdfZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgICAgICAgIGVudjogdmFsdWUuaXRlbS5hY3Rpb24uZW52XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHsgaXRlbUlkOiB2YWx1ZS5pdGVtLmlkIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwic2hlbGxfY2FsbFwiKSB7XG4gICAgICAgICAgICAgICAgb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbS5jYWxsX2lkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwic2hlbGxcIiksXG4gICAgICAgICAgICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kczogdmFsdWUuaXRlbS5hY3Rpb24uY29tbWFuZHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAuLi5pc1NoZWxsUHJvdmlkZXJFeGVjdXRlZCAmJiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRXhlY3V0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXTogeyBpdGVtSWQ6IHZhbHVlLml0ZW0uaWQgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLml0ZW0udHlwZSA9PT0gXCJzaGVsbF9jYWxsX291dHB1dFwiKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1yZXN1bHRcIixcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHZhbHVlLml0ZW0uY2FsbF9pZCxcbiAgICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB0b29sTmFtZU1hcHBpbmcudG9DdXN0b21Ub29sTmFtZShcInNoZWxsXCIpLFxuICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dDogdmFsdWUuaXRlbS5vdXRwdXQubWFwKFxuICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0OiBpdGVtLnN0ZG91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycjogaXRlbS5zdGRlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lOiBpdGVtLm91dGNvbWUudHlwZSA9PT0gXCJleGl0XCIgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXhpdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0Q29kZTogaXRlbS5vdXRjb21lLmV4aXRfY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSA6IHsgdHlwZTogXCJ0aW1lb3V0XCIgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pdGVtLnR5cGUgPT09IFwicmVhc29uaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVSZWFzb25pbmdQYXJ0ID0gYWN0aXZlUmVhc29uaW5nW3ZhbHVlLml0ZW0uaWRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlQYXJ0SW5kaWNlcyA9IE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgICAgICAgYWN0aXZlUmVhc29uaW5nUGFydC5zdW1tYXJ5UGFydHNcbiAgICAgICAgICAgICAgICApLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIChbXywgc3RhdHVzXSkgPT4gc3RhdHVzID09PSBcImFjdGl2ZVwiIHx8IHN0YXR1cyA9PT0gXCJjYW4tY29uY2x1ZGVcIlxuICAgICAgICAgICAgICAgICkubWFwKChbc3VtbWFyeUluZGV4XSkgPT4gc3VtbWFyeUluZGV4KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN1bW1hcnlJbmRleCBvZiBzdW1tYXJ5UGFydEluZGljZXMpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhc29uaW5nLWVuZFwiLFxuICAgICAgICAgICAgICAgICAgICBpZDogYCR7dmFsdWUuaXRlbS5pZH06JHtzdW1tYXJ5SW5kZXh9YCxcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiB2YWx1ZS5pdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uaW5nRW5jcnlwdGVkQ29udGVudDogKF9xID0gdmFsdWUuaXRlbS5lbmNyeXB0ZWRfY29udGVudCkgIT0gbnVsbCA/IF9xIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhY3RpdmVSZWFzb25pbmdbdmFsdWUuaXRlbS5pZF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZUZ1bmN0aW9uQ2FsbEFyZ3VtZW50c0RlbHRhQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvb2xDYWxsID0gb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdO1xuICAgICAgICAgICAgICBpZiAodG9vbENhbGwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgZGVsdGE6IHZhbHVlLmRlbHRhXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZUN1c3RvbVRvb2xDYWxsSW5wdXREZWx0YUNodW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgICBjb25zdCB0b29sQ2FsbCA9IG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XTtcbiAgICAgICAgICAgICAgaWYgKHRvb2xDYWxsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGwudG9vbENhbGxJZCxcbiAgICAgICAgICAgICAgICAgIGRlbHRhOiB2YWx1ZS5kZWx0YVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVzcG9uc2VBcHBseVBhdGNoQ2FsbE9wZXJhdGlvbkRpZmZEZWx0YUNodW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgICBjb25zdCB0b29sQ2FsbCA9IG9uZ29pbmdUb29sQ2FsbHNbdmFsdWUub3V0cHV0X2luZGV4XTtcbiAgICAgICAgICAgICAgaWYgKHRvb2xDYWxsID09IG51bGwgPyB2b2lkIDAgOiB0b29sQ2FsbC5hcHBseVBhdGNoKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1kZWx0YVwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IHRvb2xDYWxsLnRvb2xDYWxsSWQsXG4gICAgICAgICAgICAgICAgICBkZWx0YTogZXNjYXBlSlNPTkRlbHRhKHZhbHVlLmRlbHRhKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRvb2xDYWxsLmFwcGx5UGF0Y2guaGFzRGlmZiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZUFwcGx5UGF0Y2hDYWxsT3BlcmF0aW9uRGlmZkRvbmVDaHVuayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9vbENhbGwgPSBvbmdvaW5nVG9vbENhbGxzW3ZhbHVlLm91dHB1dF9pbmRleF07XG4gICAgICAgICAgICAgIGlmICgodG9vbENhbGwgPT0gbnVsbCA/IHZvaWQgMCA6IHRvb2xDYWxsLmFwcGx5UGF0Y2gpICYmICF0b29sQ2FsbC5hcHBseVBhdGNoLmVuZEVtaXR0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRvb2xDYWxsLmFwcGx5UGF0Y2guaGFzRGlmZikge1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0b29sLWlucHV0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgICBkZWx0YTogZXNjYXBlSlNPTkRlbHRhKHZhbHVlLmRpZmYpXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRvb2xDYWxsLmFwcGx5UGF0Y2guaGFzRGlmZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgZGVsdGE6ICdcIn19J1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZW5kXCIsXG4gICAgICAgICAgICAgICAgICBpZDogdG9vbENhbGwudG9vbENhbGxJZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRvb2xDYWxsLmFwcGx5UGF0Y2guZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZUltYWdlR2VuZXJhdGlvbkNhbGxQYXJ0aWFsSW1hZ2VDaHVuayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgdG9vbENhbGxJZDogdmFsdWUuaXRlbV9pZCxcbiAgICAgICAgICAgICAgICB0b29sTmFtZTogdG9vbE5hbWVNYXBwaW5nLnRvQ3VzdG9tVG9vbE5hbWUoXCJpbWFnZV9nZW5lcmF0aW9uXCIpLFxuICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0OiB2YWx1ZS5wYXJ0aWFsX2ltYWdlX2I2NFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHJlbGltaW5hcnk6IHRydWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVzcG9uc2VDb2RlSW50ZXJwcmV0ZXJDYWxsQ29kZURlbHRhQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvb2xDYWxsID0gb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdO1xuICAgICAgICAgICAgICBpZiAodG9vbENhbGwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgZGVsdGE6IGVzY2FwZUpTT05EZWx0YSh2YWx1ZS5kZWx0YSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1Jlc3BvbnNlQ29kZUludGVycHJldGVyQ2FsbENvZGVEb25lQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvb2xDYWxsID0gb25nb2luZ1Rvb2xDYWxsc1t2YWx1ZS5vdXRwdXRfaW5kZXhdO1xuICAgICAgICAgICAgICBpZiAodG9vbENhbGwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInRvb2wtaW5wdXQtZGVsdGFcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgZGVsdGE6ICdcIn0nXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1pbnB1dC1lbmRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiB0b29sQ2FsbC50b29sQ2FsbElkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgICAgICAgICAgICB0b29sQ2FsbElkOiB0b29sQ2FsbC50b29sQ2FsbElkLFxuICAgICAgICAgICAgICAgICAgdG9vbE5hbWU6IHRvb2xOYW1lTWFwcGluZy50b0N1c3RvbVRvb2xOYW1lKFwiY29kZV9pbnRlcnByZXRlclwiKSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHZhbHVlLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcklkOiB0b29sQ2FsbC5jb2RlSW50ZXJwcmV0ZXIuY29udGFpbmVySWRcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJFeGVjdXRlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVzcG9uc2VDcmVhdGVkQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlSWQgPSB2YWx1ZS5yZXNwb25zZS5pZDtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInJlc3BvbnNlLW1ldGFkYXRhXCIsXG4gICAgICAgICAgICAgICAgaWQ6IHZhbHVlLnJlc3BvbnNlLmlkLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUodmFsdWUucmVzcG9uc2UuY3JlYXRlZF9hdCAqIDFlMyksXG4gICAgICAgICAgICAgICAgbW9kZWxJZDogdmFsdWUucmVzcG9uc2UubW9kZWxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVGV4dERlbHRhQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0LWRlbHRhXCIsXG4gICAgICAgICAgICAgICAgaWQ6IHZhbHVlLml0ZW1faWQsXG4gICAgICAgICAgICAgICAgZGVsdGE6IHZhbHVlLmRlbHRhXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAoKChfcyA9IChfciA9IG9wdGlvbnMucHJvdmlkZXJPcHRpb25zKSA9PSBudWxsID8gdm9pZCAwIDogX3JbcHJvdmlkZXJPcHRpb25zTmFtZV0pID09IG51bGwgPyB2b2lkIDAgOiBfcy5sb2dwcm9icykgJiYgdmFsdWUubG9ncHJvYnMpIHtcbiAgICAgICAgICAgICAgICBsb2dwcm9icy5wdXNoKHZhbHVlLmxvZ3Byb2JzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09PSBcInJlc3BvbnNlLnJlYXNvbmluZ19zdW1tYXJ5X3BhcnQuYWRkZWRcIikge1xuICAgICAgICAgICAgICBpZiAodmFsdWUuc3VtbWFyeV9pbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVSZWFzb25pbmdQYXJ0ID0gYWN0aXZlUmVhc29uaW5nW3ZhbHVlLml0ZW1faWRdO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVJlYXNvbmluZ1BhcnQuc3VtbWFyeVBhcnRzW3ZhbHVlLnN1bW1hcnlfaW5kZXhdID0gXCJhY3RpdmVcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN1bW1hcnlJbmRleCBvZiBPYmplY3Qua2V5cyhcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVJlYXNvbmluZ1BhcnQuc3VtbWFyeVBhcnRzXG4gICAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVJlYXNvbmluZ1BhcnQuc3VtbWFyeVBhcnRzW3N1bW1hcnlJbmRleF0gPT09IFwiY2FuLWNvbmNsdWRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZy1lbmRcIixcbiAgICAgICAgICAgICAgICAgICAgICBpZDogYCR7dmFsdWUuaXRlbV9pZH06JHtzdW1tYXJ5SW5kZXh9YCxcbiAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUlkOiB2YWx1ZS5pdGVtX2lkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlUmVhc29uaW5nUGFydC5zdW1tYXJ5UGFydHNbc3VtbWFyeUluZGV4XSA9IFwiY29uY2x1ZGVkXCI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZy1zdGFydFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IGAke3ZhbHVlLml0ZW1faWR9OiR7dmFsdWUuc3VtbWFyeV9pbmRleH1gLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IHZhbHVlLml0ZW1faWQsXG4gICAgICAgICAgICAgICAgICAgICAgcmVhc29uaW5nRW5jcnlwdGVkQ29udGVudDogKF91ID0gKF90ID0gYWN0aXZlUmVhc29uaW5nW3ZhbHVlLml0ZW1faWRdKSA9PSBudWxsID8gdm9pZCAwIDogX3QuZW5jcnlwdGVkQ29udGVudCkgIT0gbnVsbCA/IF91IDogbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gXCJyZXNwb25zZS5yZWFzb25pbmdfc3VtbWFyeV90ZXh0LmRlbHRhXCIpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInJlYXNvbmluZy1kZWx0YVwiLFxuICAgICAgICAgICAgICAgIGlkOiBgJHt2YWx1ZS5pdGVtX2lkfToke3ZhbHVlLnN1bW1hcnlfaW5kZXh9YCxcbiAgICAgICAgICAgICAgICBkZWx0YTogdmFsdWUuZGVsdGEsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogdmFsdWUuaXRlbV9pZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09IFwicmVzcG9uc2UucmVhc29uaW5nX3N1bW1hcnlfcGFydC5kb25lXCIpIHtcbiAgICAgICAgICAgICAgaWYgKHN0b3JlKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwicmVhc29uaW5nLWVuZFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IGAke3ZhbHVlLml0ZW1faWR9OiR7dmFsdWUuc3VtbWFyeV9pbmRleH1gLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBbcHJvdmlkZXJPcHRpb25zTmFtZV06IHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQ6IHZhbHVlLml0ZW1faWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVJlYXNvbmluZ1t2YWx1ZS5pdGVtX2lkXS5zdW1tYXJ5UGFydHNbdmFsdWUuc3VtbWFyeV9pbmRleF0gPSBcImNvbmNsdWRlZFwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjdGl2ZVJlYXNvbmluZ1t2YWx1ZS5pdGVtX2lkXS5zdW1tYXJ5UGFydHNbdmFsdWUuc3VtbWFyeV9pbmRleF0gPSBcImNhbi1jb25jbHVkZVwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVzcG9uc2VGaW5pc2hlZENodW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgICBmaW5pc2hSZWFzb24gPSB7XG4gICAgICAgICAgICAgICAgdW5pZmllZDogbWFwT3BlbkFJUmVzcG9uc2VGaW5pc2hSZWFzb24oe1xuICAgICAgICAgICAgICAgICAgZmluaXNoUmVhc29uOiAoX3YgPSB2YWx1ZS5yZXNwb25zZS5pbmNvbXBsZXRlX2RldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBfdi5yZWFzb24sXG4gICAgICAgICAgICAgICAgICBoYXNGdW5jdGlvbkNhbGxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICByYXc6IChfeCA9IChfdyA9IHZhbHVlLnJlc3BvbnNlLmluY29tcGxldGVfZGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IF93LnJlYXNvbikgIT0gbnVsbCA/IF94IDogdm9pZCAwXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHVzYWdlID0gdmFsdWUucmVzcG9uc2UudXNhZ2U7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUucmVzcG9uc2Uuc2VydmljZV90aWVyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgc2VydmljZVRpZXIgPSB2YWx1ZS5yZXNwb25zZS5zZXJ2aWNlX3RpZXI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZXNwb25zZUZhaWxlZENodW5rKHZhbHVlKSkge1xuICAgICAgICAgICAgICBjb25zdCBpbmNvbXBsZXRlUmVhc29uID0gKF95ID0gdmFsdWUucmVzcG9uc2UuaW5jb21wbGV0ZV9kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogX3kucmVhc29uO1xuICAgICAgICAgICAgICBmaW5pc2hSZWFzb24gPSB7XG4gICAgICAgICAgICAgICAgdW5pZmllZDogaW5jb21wbGV0ZVJlYXNvbiA/IG1hcE9wZW5BSVJlc3BvbnNlRmluaXNoUmVhc29uKHtcbiAgICAgICAgICAgICAgICAgIGZpbmlzaFJlYXNvbjogaW5jb21wbGV0ZVJlYXNvbixcbiAgICAgICAgICAgICAgICAgIGhhc0Z1bmN0aW9uQ2FsbFxuICAgICAgICAgICAgICAgIH0pIDogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIHJhdzogaW5jb21wbGV0ZVJlYXNvbiAhPSBudWxsID8gaW5jb21wbGV0ZVJlYXNvbiA6IFwiZXJyb3JcIlxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB1c2FnZSA9IChfeiA9IHZhbHVlLnJlc3BvbnNlLnVzYWdlKSAhPSBudWxsID8gX3ogOiB2b2lkIDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVzcG9uc2VBbm5vdGF0aW9uQWRkZWRDaHVuayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgb25nb2luZ0Fubm90YXRpb25zLnB1c2godmFsdWUuYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZS5hbm5vdGF0aW9uLnR5cGUgPT09IFwidXJsX2NpdGF0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgICAgICAgIHNvdXJjZVR5cGU6IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgICBpZDogKF9DID0gKF9CID0gKF9BID0gc2VsZi5jb25maWcpLmdlbmVyYXRlSWQpID09IG51bGwgPyB2b2lkIDAgOiBfQi5jYWxsKF9BKSkgIT0gbnVsbCA/IF9DIDogZ2VuZXJhdGVJZDIoKSxcbiAgICAgICAgICAgICAgICAgIHVybDogdmFsdWUuYW5ub3RhdGlvbi51cmwsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogdmFsdWUuYW5ub3RhdGlvbi50aXRsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmFubm90YXRpb24udHlwZSA9PT0gXCJmaWxlX2NpdGF0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgICAgICAgIHNvdXJjZVR5cGU6IFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiAoX0YgPSAoX0UgPSAoX0QgPSBzZWxmLmNvbmZpZykuZ2VuZXJhdGVJZCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9FLmNhbGwoX0QpKSAhPSBudWxsID8gX0YgOiBnZW5lcmF0ZUlkMigpLFxuICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZS5hbm5vdGF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHZhbHVlLmFubm90YXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHZhbHVlLmFubm90YXRpb24udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHZhbHVlLmFubm90YXRpb24uZmlsZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICBpbmRleDogdmFsdWUuYW5ub3RhdGlvbi5pbmRleFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuYW5ub3RhdGlvbi50eXBlID09PSBcImNvbnRhaW5lcl9maWxlX2NpdGF0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzb3VyY2VcIixcbiAgICAgICAgICAgICAgICAgIHNvdXJjZVR5cGU6IFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICAgIGlkOiAoX0kgPSAoX0ggPSAoX0cgPSBzZWxmLmNvbmZpZykuZ2VuZXJhdGVJZCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ILmNhbGwoX0cpKSAhPSBudWxsID8gX0kgOiBnZW5lcmF0ZUlkMigpLFxuICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZS5hbm5vdGF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHZhbHVlLmFubm90YXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwcm92aWRlck9wdGlvbnNOYW1lXToge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHZhbHVlLmFubm90YXRpb24udHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IHZhbHVlLmFubm90YXRpb24uZmlsZV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJJZDogdmFsdWUuYW5ub3RhdGlvbi5jb250YWluZXJfaWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmFubm90YXRpb24udHlwZSA9PT0gXCJmaWxlX3BhdGhcIikge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgICAgICAgc291cmNlVHlwZTogXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IChfTCA9IChfSyA9IChfSiA9IHNlbGYuY29uZmlnKS5nZW5lcmF0ZUlkKSA9PSBudWxsID8gdm9pZCAwIDogX0suY2FsbChfSikpICE9IG51bGwgPyBfTCA6IGdlbmVyYXRlSWQyKCksXG4gICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogdmFsdWUuYW5ub3RhdGlvbi5maWxlX2lkLFxuICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHZhbHVlLmFubm90YXRpb24uZmlsZV9pZCxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmFsdWUuYW5ub3RhdGlvbi50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVJZDogdmFsdWUuYW5ub3RhdGlvbi5maWxlX2lkLFxuICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiB2YWx1ZS5hbm5vdGF0aW9uLmluZGV4XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Vycm9yQ2h1bmsodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh7IHR5cGU6IFwiZXJyb3JcIiwgZXJyb3I6IHZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmx1c2goY29udHJvbGxlcikge1xuICAgICAgICAgICAgY29uc3QgcHJvdmlkZXJNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgICAgW3Byb3ZpZGVyT3B0aW9uc05hbWVdOiB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VJZCxcbiAgICAgICAgICAgICAgICAuLi5sb2dwcm9icy5sZW5ndGggPiAwID8geyBsb2dwcm9icyB9IDoge30sXG4gICAgICAgICAgICAgICAgLi4uc2VydmljZVRpZXIgIT09IHZvaWQgMCA/IHsgc2VydmljZVRpZXIgfSA6IHt9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoe1xuICAgICAgICAgICAgICB0eXBlOiBcImZpbmlzaFwiLFxuICAgICAgICAgICAgICBmaW5pc2hSZWFzb24sXG4gICAgICAgICAgICAgIHVzYWdlOiBjb252ZXJ0T3BlbkFJUmVzcG9uc2VzVXNhZ2UodXNhZ2UpLFxuICAgICAgICAgICAgICBwcm92aWRlck1ldGFkYXRhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgcmVxdWVzdDogeyBib2R5IH0sXG4gICAgICByZXNwb25zZTogeyBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMgfVxuICAgIH07XG4gIH1cbn07XG5mdW5jdGlvbiBpc1RleHREZWx0YUNodW5rKGNodW5rKSB7XG4gIHJldHVybiBjaHVuay50eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRlbHRhXCI7XG59XG5mdW5jdGlvbiBpc1Jlc3BvbnNlT3V0cHV0SXRlbURvbmVDaHVuayhjaHVuaykge1xuICByZXR1cm4gY2h1bmsudHlwZSA9PT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5kb25lXCI7XG59XG5mdW5jdGlvbiBpc1Jlc3BvbnNlRmluaXNoZWRDaHVuayhjaHVuaykge1xuICByZXR1cm4gY2h1bmsudHlwZSA9PT0gXCJyZXNwb25zZS5jb21wbGV0ZWRcIiB8fCBjaHVuay50eXBlID09PSBcInJlc3BvbnNlLmluY29tcGxldGVcIjtcbn1cbmZ1bmN0aW9uIGlzUmVzcG9uc2VGYWlsZWRDaHVuayhjaHVuaykge1xuICByZXR1cm4gY2h1bmsudHlwZSA9PT0gXCJyZXNwb25zZS5mYWlsZWRcIjtcbn1cbmZ1bmN0aW9uIGlzUmVzcG9uc2VDcmVhdGVkQ2h1bmsoY2h1bmspIHtcbiAgcmV0dXJuIGNodW5rLnR5cGUgPT09IFwicmVzcG9uc2UuY3JlYXRlZFwiO1xufVxuZnVuY3Rpb24gaXNSZXNwb25zZUZ1bmN0aW9uQ2FsbEFyZ3VtZW50c0RlbHRhQ2h1bmsoY2h1bmspIHtcbiAgcmV0dXJuIGNodW5rLnR5cGUgPT09IFwicmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZGVsdGFcIjtcbn1cbmZ1bmN0aW9uIGlzUmVzcG9uc2VDdXN0b21Ub29sQ2FsbElucHV0RGVsdGFDaHVuayhjaHVuaykge1xuICByZXR1cm4gY2h1bmsudHlwZSA9PT0gXCJyZXNwb25zZS5jdXN0b21fdG9vbF9jYWxsX2lucHV0LmRlbHRhXCI7XG59XG5mdW5jdGlvbiBpc1Jlc3BvbnNlSW1hZ2VHZW5lcmF0aW9uQ2FsbFBhcnRpYWxJbWFnZUNodW5rKGNodW5rKSB7XG4gIHJldHVybiBjaHVuay50eXBlID09PSBcInJlc3BvbnNlLmltYWdlX2dlbmVyYXRpb25fY2FsbC5wYXJ0aWFsX2ltYWdlXCI7XG59XG5mdW5jdGlvbiBpc1Jlc3BvbnNlQ29kZUludGVycHJldGVyQ2FsbENvZGVEZWx0YUNodW5rKGNodW5rKSB7XG4gIHJldHVybiBjaHVuay50eXBlID09PSBcInJlc3BvbnNlLmNvZGVfaW50ZXJwcmV0ZXJfY2FsbF9jb2RlLmRlbHRhXCI7XG59XG5mdW5jdGlvbiBpc1Jlc3BvbnNlQ29kZUludGVycHJldGVyQ2FsbENvZGVEb25lQ2h1bmsoY2h1bmspIHtcbiAgcmV0dXJuIGNodW5rLnR5cGUgPT09IFwicmVzcG9uc2UuY29kZV9pbnRlcnByZXRlcl9jYWxsX2NvZGUuZG9uZVwiO1xufVxuZnVuY3Rpb24gaXNSZXNwb25zZUFwcGx5UGF0Y2hDYWxsT3BlcmF0aW9uRGlmZkRlbHRhQ2h1bmsoY2h1bmspIHtcbiAgcmV0dXJuIGNodW5rLnR5cGUgPT09IFwicmVzcG9uc2UuYXBwbHlfcGF0Y2hfY2FsbF9vcGVyYXRpb25fZGlmZi5kZWx0YVwiO1xufVxuZnVuY3Rpb24gaXNSZXNwb25zZUFwcGx5UGF0Y2hDYWxsT3BlcmF0aW9uRGlmZkRvbmVDaHVuayhjaHVuaykge1xuICByZXR1cm4gY2h1bmsudHlwZSA9PT0gXCJyZXNwb25zZS5hcHBseV9wYXRjaF9jYWxsX29wZXJhdGlvbl9kaWZmLmRvbmVcIjtcbn1cbmZ1bmN0aW9uIGlzUmVzcG9uc2VPdXRwdXRJdGVtQWRkZWRDaHVuayhjaHVuaykge1xuICByZXR1cm4gY2h1bmsudHlwZSA9PT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiO1xufVxuZnVuY3Rpb24gaXNSZXNwb25zZUFubm90YXRpb25BZGRlZENodW5rKGNodW5rKSB7XG4gIHJldHVybiBjaHVuay50eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF90ZXh0LmFubm90YXRpb24uYWRkZWRcIjtcbn1cbmZ1bmN0aW9uIGlzRXJyb3JDaHVuayhjaHVuaykge1xuICByZXR1cm4gY2h1bmsudHlwZSA9PT0gXCJlcnJvclwiO1xufVxuZnVuY3Rpb24gbWFwV2ViU2VhcmNoT3V0cHV0KGFjdGlvbikge1xuICB2YXIgX2E7XG4gIGlmIChhY3Rpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBcInNlYXJjaFwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uOiB7IHR5cGU6IFwic2VhcmNoXCIsIHF1ZXJ5OiAoX2EgPSBhY3Rpb24ucXVlcnkpICE9IG51bGwgPyBfYSA6IHZvaWQgMCB9LFxuICAgICAgICAvLyBpbmNsdWRlIHNvdXJjZXMgd2hlbiBwcm92aWRlZCBieSB0aGUgUmVzcG9uc2VzIEFQSSAoYmVoaW5kIGluY2x1ZGUgZmxhZylcbiAgICAgICAgLi4uYWN0aW9uLnNvdXJjZXMgIT0gbnVsbCAmJiB7IHNvdXJjZXM6IGFjdGlvbi5zb3VyY2VzIH1cbiAgICAgIH07XG4gICAgY2FzZSBcIm9wZW5fcGFnZVwiOlxuICAgICAgcmV0dXJuIHsgYWN0aW9uOiB7IHR5cGU6IFwib3BlblBhZ2VcIiwgdXJsOiBhY3Rpb24udXJsIH0gfTtcbiAgICBjYXNlIFwiZmluZF9pbl9wYWdlXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpb246IHtcbiAgICAgICAgICB0eXBlOiBcImZpbmRJblBhZ2VcIixcbiAgICAgICAgICB1cmw6IGFjdGlvbi51cmwsXG4gICAgICAgICAgcGF0dGVybjogYWN0aW9uLnBhdHRlcm5cbiAgICAgICAgfVxuICAgICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZXNjYXBlSlNPTkRlbHRhKGRlbHRhKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShkZWx0YSkuc2xpY2UoMSwgLTEpO1xufVxuXG4vLyBzcmMvc3BlZWNoL29wZW5haS1zcGVlY2gtbW9kZWwudHNcbmltcG9ydCB7XG4gIGNvbWJpbmVIZWFkZXJzIGFzIGNvbWJpbmVIZWFkZXJzNixcbiAgY3JlYXRlQmluYXJ5UmVzcG9uc2VIYW5kbGVyLFxuICBwYXJzZVByb3ZpZGVyT3B0aW9ucyBhcyBwYXJzZVByb3ZpZGVyT3B0aW9uczYsXG4gIHBvc3RKc29uVG9BcGkgYXMgcG9zdEpzb25Ub0FwaTZcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL3NwZWVjaC9vcGVuYWktc3BlZWNoLW9wdGlvbnMudHNcbmltcG9ydCB7IGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTIxLCB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMjEgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6MjMgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgb3BlbmFpU3BlZWNoTW9kZWxPcHRpb25zU2NoZW1hID0gbGF6eVNjaGVtYTIxKFxuICAoKSA9PiB6b2RTY2hlbWEyMShcbiAgICB6MjMub2JqZWN0KHtcbiAgICAgIGluc3RydWN0aW9uczogejIzLnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIHNwZWVkOiB6MjMubnVtYmVyKCkubWluKDAuMjUpLm1heCg0KS5kZWZhdWx0KDEpLm51bGxpc2goKVxuICAgIH0pXG4gIClcbik7XG5cbi8vIHNyYy9zcGVlY2gvb3BlbmFpLXNwZWVjaC1tb2RlbC50c1xudmFyIE9wZW5BSVNwZWVjaE1vZGVsID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihtb2RlbElkLCBjb25maWcpIHtcbiAgICB0aGlzLm1vZGVsSWQgPSBtb2RlbElkO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuc3BlY2lmaWNhdGlvblZlcnNpb24gPSBcInYzXCI7XG4gIH1cbiAgZ2V0IHByb3ZpZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm92aWRlcjtcbiAgfVxuICBhc3luYyBnZXRBcmdzKHtcbiAgICB0ZXh0LFxuICAgIHZvaWNlID0gXCJhbGxveVwiLFxuICAgIG91dHB1dEZvcm1hdCA9IFwibXAzXCIsXG4gICAgc3BlZWQsXG4gICAgaW5zdHJ1Y3Rpb25zLFxuICAgIGxhbmd1YWdlLFxuICAgIHByb3ZpZGVyT3B0aW9uc1xuICB9KSB7XG4gICAgY29uc3Qgd2FybmluZ3MgPSBbXTtcbiAgICBjb25zdCBvcGVuQUlPcHRpb25zID0gYXdhaXQgcGFyc2VQcm92aWRlck9wdGlvbnM2KHtcbiAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgcHJvdmlkZXJPcHRpb25zLFxuICAgICAgc2NoZW1hOiBvcGVuYWlTcGVlY2hNb2RlbE9wdGlvbnNTY2hlbWFcbiAgICB9KTtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgIG1vZGVsOiB0aGlzLm1vZGVsSWQsXG4gICAgICBpbnB1dDogdGV4dCxcbiAgICAgIHZvaWNlLFxuICAgICAgcmVzcG9uc2VfZm9ybWF0OiBcIm1wM1wiLFxuICAgICAgc3BlZWQsXG4gICAgICBpbnN0cnVjdGlvbnNcbiAgICB9O1xuICAgIGlmIChvdXRwdXRGb3JtYXQpIHtcbiAgICAgIGlmIChbXCJtcDNcIiwgXCJvcHVzXCIsIFwiYWFjXCIsIFwiZmxhY1wiLCBcIndhdlwiLCBcInBjbVwiXS5pbmNsdWRlcyhvdXRwdXRGb3JtYXQpKSB7XG4gICAgICAgIHJlcXVlc3RCb2R5LnJlc3BvbnNlX2Zvcm1hdCA9IG91dHB1dEZvcm1hdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwidW5zdXBwb3J0ZWRcIixcbiAgICAgICAgICBmZWF0dXJlOiBcIm91dHB1dEZvcm1hdFwiLFxuICAgICAgICAgIGRldGFpbHM6IGBVbnN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0OiAke291dHB1dEZvcm1hdH0uIFVzaW5nIG1wMyBpbnN0ZWFkLmBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcGVuQUlPcHRpb25zKSB7XG4gICAgICBjb25zdCBzcGVlY2hNb2RlbE9wdGlvbnMgPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNwZWVjaE1vZGVsT3B0aW9ucykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHNwZWVjaE1vZGVsT3B0aW9uc1trZXldO1xuICAgICAgICBpZiAodmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHJlcXVlc3RCb2R5W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGFuZ3VhZ2UpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICB0eXBlOiBcInVuc3VwcG9ydGVkXCIsXG4gICAgICAgIGZlYXR1cmU6IFwibGFuZ3VhZ2VcIixcbiAgICAgICAgZGV0YWlsczogYE9wZW5BSSBzcGVlY2ggbW9kZWxzIGRvIG5vdCBzdXBwb3J0IGxhbmd1YWdlIHNlbGVjdGlvbi4gTGFuZ3VhZ2UgcGFyYW1ldGVyIFwiJHtsYW5ndWFnZX1cIiB3YXMgaWdub3JlZC5gXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVlc3RCb2R5LFxuICAgICAgd2FybmluZ3NcbiAgICB9O1xuICB9XG4gIGFzeW5jIGRvR2VuZXJhdGUob3B0aW9ucykge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gKF9jID0gKF9iID0gKF9hID0gdGhpcy5jb25maWcuX2ludGVybmFsKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY3VycmVudERhdGUpID09IG51bGwgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKSkgIT0gbnVsbCA/IF9jIDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG4gICAgY29uc3QgeyByZXF1ZXN0Qm9keSwgd2FybmluZ3MgfSA9IGF3YWl0IHRoaXMuZ2V0QXJncyhvcHRpb25zKTtcbiAgICBjb25zdCB7XG4gICAgICB2YWx1ZTogYXVkaW8sXG4gICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICByYXdWYWx1ZTogcmF3UmVzcG9uc2VcbiAgICB9ID0gYXdhaXQgcG9zdEpzb25Ub0FwaTYoe1xuICAgICAgdXJsOiB0aGlzLmNvbmZpZy51cmwoe1xuICAgICAgICBwYXRoOiBcIi9hdWRpby9zcGVlY2hcIixcbiAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkXG4gICAgICB9KSxcbiAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzNih0aGlzLmNvbmZpZy5oZWFkZXJzKCksIG9wdGlvbnMuaGVhZGVycyksXG4gICAgICBib2R5OiByZXF1ZXN0Qm9keSxcbiAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogb3BlbmFpRmFpbGVkUmVzcG9uc2VIYW5kbGVyLFxuICAgICAgc3VjY2Vzc2Z1bFJlc3BvbnNlSGFuZGxlcjogY3JlYXRlQmluYXJ5UmVzcG9uc2VIYW5kbGVyKCksXG4gICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBhdWRpbyxcbiAgICAgIHdhcm5pbmdzLFxuICAgICAgcmVxdWVzdDoge1xuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0Qm9keSlcbiAgICAgIH0sXG4gICAgICByZXNwb25zZToge1xuICAgICAgICB0aW1lc3RhbXA6IGN1cnJlbnREYXRlLFxuICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgYm9keTogcmF3UmVzcG9uc2VcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG4vLyBzcmMvdHJhbnNjcmlwdGlvbi9vcGVuYWktdHJhbnNjcmlwdGlvbi1tb2RlbC50c1xuaW1wb3J0IHtcbiAgY29tYmluZUhlYWRlcnMgYXMgY29tYmluZUhlYWRlcnM3LFxuICBjb252ZXJ0QmFzZTY0VG9VaW50OEFycmF5IGFzIGNvbnZlcnRCYXNlNjRUb1VpbnQ4QXJyYXkyLFxuICBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyIGFzIGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXI2LFxuICBtZWRpYVR5cGVUb0V4dGVuc2lvbixcbiAgcGFyc2VQcm92aWRlck9wdGlvbnMgYXMgcGFyc2VQcm92aWRlck9wdGlvbnM3LFxuICBwb3N0Rm9ybURhdGFUb0FwaSBhcyBwb3N0Rm9ybURhdGFUb0FwaTJcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcblxuLy8gc3JjL3RyYW5zY3JpcHRpb24vb3BlbmFpLXRyYW5zY3JpcHRpb24tYXBpLnRzXG5pbXBvcnQgeyBsYXp5U2NoZW1hIGFzIGxhenlTY2hlbWEyMiwgem9kU2NoZW1hIGFzIHpvZFNjaGVtYTIyIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogYXMgejI0IH0gZnJvbSBcInpvZC92NFwiO1xudmFyIG9wZW5haVRyYW5zY3JpcHRpb25SZXNwb25zZVNjaGVtYSA9IGxhenlTY2hlbWEyMihcbiAgKCkgPT4gem9kU2NoZW1hMjIoXG4gICAgejI0Lm9iamVjdCh7XG4gICAgICB0ZXh0OiB6MjQuc3RyaW5nKCksXG4gICAgICBsYW5ndWFnZTogejI0LnN0cmluZygpLm51bGxpc2goKSxcbiAgICAgIGR1cmF0aW9uOiB6MjQubnVtYmVyKCkubnVsbGlzaCgpLFxuICAgICAgd29yZHM6IHoyNC5hcnJheShcbiAgICAgICAgejI0Lm9iamVjdCh7XG4gICAgICAgICAgd29yZDogejI0LnN0cmluZygpLFxuICAgICAgICAgIHN0YXJ0OiB6MjQubnVtYmVyKCksXG4gICAgICAgICAgZW5kOiB6MjQubnVtYmVyKClcbiAgICAgICAgfSlcbiAgICAgICkubnVsbGlzaCgpLFxuICAgICAgc2VnbWVudHM6IHoyNC5hcnJheShcbiAgICAgICAgejI0Lm9iamVjdCh7XG4gICAgICAgICAgaWQ6IHoyNC5udW1iZXIoKSxcbiAgICAgICAgICBzZWVrOiB6MjQubnVtYmVyKCksXG4gICAgICAgICAgc3RhcnQ6IHoyNC5udW1iZXIoKSxcbiAgICAgICAgICBlbmQ6IHoyNC5udW1iZXIoKSxcbiAgICAgICAgICB0ZXh0OiB6MjQuc3RyaW5nKCksXG4gICAgICAgICAgdG9rZW5zOiB6MjQuYXJyYXkoejI0Lm51bWJlcigpKSxcbiAgICAgICAgICB0ZW1wZXJhdHVyZTogejI0Lm51bWJlcigpLFxuICAgICAgICAgIGF2Z19sb2dwcm9iOiB6MjQubnVtYmVyKCksXG4gICAgICAgICAgY29tcHJlc3Npb25fcmF0aW86IHoyNC5udW1iZXIoKSxcbiAgICAgICAgICBub19zcGVlY2hfcHJvYjogejI0Lm51bWJlcigpXG4gICAgICAgIH0pXG4gICAgICApLm51bGxpc2goKVxuICAgIH0pXG4gIClcbik7XG5cbi8vIHNyYy90cmFuc2NyaXB0aW9uL29wZW5haS10cmFuc2NyaXB0aW9uLW9wdGlvbnMudHNcbmltcG9ydCB7IGxhenlTY2hlbWEgYXMgbGF6eVNjaGVtYTIzLCB6b2RTY2hlbWEgYXMgem9kU2NoZW1hMjMgfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgeiBhcyB6MjUgfSBmcm9tIFwiem9kL3Y0XCI7XG52YXIgb3BlbkFJVHJhbnNjcmlwdGlvbk1vZGVsT3B0aW9ucyA9IGxhenlTY2hlbWEyMyhcbiAgKCkgPT4gem9kU2NoZW1hMjMoXG4gICAgejI1Lm9iamVjdCh7XG4gICAgICAvKipcbiAgICAgICAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gaW5jbHVkZSBpbiB0aGUgdHJhbnNjcmlwdGlvbiByZXNwb25zZS5cbiAgICAgICAqL1xuICAgICAgaW5jbHVkZTogejI1LmFycmF5KHoyNS5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGxhbmd1YWdlIG9mIHRoZSBpbnB1dCBhdWRpbyBpbiBJU08tNjM5LTEgZm9ybWF0LlxuICAgICAgICovXG4gICAgICBsYW5ndWFnZTogejI1LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAvKipcbiAgICAgICAqIEFuIG9wdGlvbmFsIHRleHQgdG8gZ3VpZGUgdGhlIG1vZGVsJ3Mgc3R5bGUgb3IgY29udGludWUgYSBwcmV2aW91cyBhdWRpbyBzZWdtZW50LlxuICAgICAgICovXG4gICAgICBwcm9tcHQ6IHoyNS5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgc2FtcGxpbmcgdGVtcGVyYXR1cmUsIGJldHdlZW4gMCBhbmQgMS5cbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGVtcGVyYXR1cmU6IHoyNS5udW1iZXIoKS5taW4oMCkubWF4KDEpLmRlZmF1bHQoMCkub3B0aW9uYWwoKSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHRpbWVzdGFtcCBncmFudWxhcml0aWVzIHRvIHBvcHVsYXRlIGZvciB0aGlzIHRyYW5zY3JpcHRpb24uXG4gICAgICAgKiBAZGVmYXVsdCBbJ3NlZ21lbnQnXVxuICAgICAgICovXG4gICAgICB0aW1lc3RhbXBHcmFudWxhcml0aWVzOiB6MjUuYXJyYXkoejI1LmVudW0oW1wid29yZFwiLCBcInNlZ21lbnRcIl0pKS5kZWZhdWx0KFtcInNlZ21lbnRcIl0pLm9wdGlvbmFsKClcbiAgICB9KVxuICApXG4pO1xuXG4vLyBzcmMvdHJhbnNjcmlwdGlvbi9vcGVuYWktdHJhbnNjcmlwdGlvbi1tb2RlbC50c1xudmFyIGxhbmd1YWdlTWFwID0ge1xuICBhZnJpa2FhbnM6IFwiYWZcIixcbiAgYXJhYmljOiBcImFyXCIsXG4gIGFybWVuaWFuOiBcImh5XCIsXG4gIGF6ZXJiYWlqYW5pOiBcImF6XCIsXG4gIGJlbGFydXNpYW46IFwiYmVcIixcbiAgYm9zbmlhbjogXCJic1wiLFxuICBidWxnYXJpYW46IFwiYmdcIixcbiAgY2F0YWxhbjogXCJjYVwiLFxuICBjaGluZXNlOiBcInpoXCIsXG4gIGNyb2F0aWFuOiBcImhyXCIsXG4gIGN6ZWNoOiBcImNzXCIsXG4gIGRhbmlzaDogXCJkYVwiLFxuICBkdXRjaDogXCJubFwiLFxuICBlbmdsaXNoOiBcImVuXCIsXG4gIGVzdG9uaWFuOiBcImV0XCIsXG4gIGZpbm5pc2g6IFwiZmlcIixcbiAgZnJlbmNoOiBcImZyXCIsXG4gIGdhbGljaWFuOiBcImdsXCIsXG4gIGdlcm1hbjogXCJkZVwiLFxuICBncmVlazogXCJlbFwiLFxuICBoZWJyZXc6IFwiaGVcIixcbiAgaGluZGk6IFwiaGlcIixcbiAgaHVuZ2FyaWFuOiBcImh1XCIsXG4gIGljZWxhbmRpYzogXCJpc1wiLFxuICBpbmRvbmVzaWFuOiBcImlkXCIsXG4gIGl0YWxpYW46IFwiaXRcIixcbiAgamFwYW5lc2U6IFwiamFcIixcbiAga2FubmFkYTogXCJrblwiLFxuICBrYXpha2g6IFwia2tcIixcbiAga29yZWFuOiBcImtvXCIsXG4gIGxhdHZpYW46IFwibHZcIixcbiAgbGl0aHVhbmlhbjogXCJsdFwiLFxuICBtYWNlZG9uaWFuOiBcIm1rXCIsXG4gIG1hbGF5OiBcIm1zXCIsXG4gIG1hcmF0aGk6IFwibXJcIixcbiAgbWFvcmk6IFwibWlcIixcbiAgbmVwYWxpOiBcIm5lXCIsXG4gIG5vcndlZ2lhbjogXCJub1wiLFxuICBwZXJzaWFuOiBcImZhXCIsXG4gIHBvbGlzaDogXCJwbFwiLFxuICBwb3J0dWd1ZXNlOiBcInB0XCIsXG4gIHJvbWFuaWFuOiBcInJvXCIsXG4gIHJ1c3NpYW46IFwicnVcIixcbiAgc2VyYmlhbjogXCJzclwiLFxuICBzbG92YWs6IFwic2tcIixcbiAgc2xvdmVuaWFuOiBcInNsXCIsXG4gIHNwYW5pc2g6IFwiZXNcIixcbiAgc3dhaGlsaTogXCJzd1wiLFxuICBzd2VkaXNoOiBcInN2XCIsXG4gIHRhZ2Fsb2c6IFwidGxcIixcbiAgdGFtaWw6IFwidGFcIixcbiAgdGhhaTogXCJ0aFwiLFxuICB0dXJraXNoOiBcInRyXCIsXG4gIHVrcmFpbmlhbjogXCJ1a1wiLFxuICB1cmR1OiBcInVyXCIsXG4gIHZpZXRuYW1lc2U6IFwidmlcIixcbiAgd2Vsc2g6IFwiY3lcIlxufTtcbnZhciBPcGVuQUlUcmFuc2NyaXB0aW9uTW9kZWwgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKG1vZGVsSWQsIGNvbmZpZykge1xuICAgIHRoaXMubW9kZWxJZCA9IG1vZGVsSWQ7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5zcGVjaWZpY2F0aW9uVmVyc2lvbiA9IFwidjNcIjtcbiAgfVxuICBnZXQgcHJvdmlkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb3ZpZGVyO1xuICB9XG4gIGFzeW5jIGdldEFyZ3Moe1xuICAgIGF1ZGlvLFxuICAgIG1lZGlhVHlwZSxcbiAgICBwcm92aWRlck9wdGlvbnNcbiAgfSkge1xuICAgIGNvbnN0IHdhcm5pbmdzID0gW107XG4gICAgY29uc3Qgb3BlbkFJT3B0aW9ucyA9IGF3YWl0IHBhcnNlUHJvdmlkZXJPcHRpb25zNyh7XG4gICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICAgIHNjaGVtYTogb3BlbkFJVHJhbnNjcmlwdGlvbk1vZGVsT3B0aW9uc1xuICAgIH0pO1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgY29uc3QgYmxvYiA9IGF1ZGlvIGluc3RhbmNlb2YgVWludDhBcnJheSA/IG5ldyBCbG9iKFthdWRpb10pIDogbmV3IEJsb2IoW2NvbnZlcnRCYXNlNjRUb1VpbnQ4QXJyYXkyKGF1ZGlvKV0pO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcIm1vZGVsXCIsIHRoaXMubW9kZWxJZCk7XG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IG1lZGlhVHlwZVRvRXh0ZW5zaW9uKG1lZGlhVHlwZSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgXCJmaWxlXCIsXG4gICAgICBuZXcgRmlsZShbYmxvYl0sIFwiYXVkaW9cIiwgeyB0eXBlOiBtZWRpYVR5cGUgfSksXG4gICAgICBgYXVkaW8uJHtmaWxlRXh0ZW5zaW9ufWBcbiAgICApO1xuICAgIGlmIChvcGVuQUlPcHRpb25zKSB7XG4gICAgICBjb25zdCB0cmFuc2NyaXB0aW9uTW9kZWxPcHRpb25zID0ge1xuICAgICAgICBpbmNsdWRlOiBvcGVuQUlPcHRpb25zLmluY2x1ZGUsXG4gICAgICAgIGxhbmd1YWdlOiBvcGVuQUlPcHRpb25zLmxhbmd1YWdlLFxuICAgICAgICBwcm9tcHQ6IG9wZW5BSU9wdGlvbnMucHJvbXB0LFxuICAgICAgICAvLyBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2F1ZGlvL2NyZWF0ZVRyYW5zY3JpcHRpb24jYXVkaW9fY3JlYXRldHJhbnNjcmlwdGlvbi1yZXNwb25zZV9mb3JtYXRcbiAgICAgICAgLy8gcHJlZmVyIHZlcmJvc2VfanNvbiB0byBnZXQgc2VnbWVudHMgZm9yIG1vZGVscyB0aGF0IHN1cHBvcnQgaXRcbiAgICAgICAgcmVzcG9uc2VfZm9ybWF0OiBbXG4gICAgICAgICAgXCJncHQtNG8tdHJhbnNjcmliZVwiLFxuICAgICAgICAgIFwiZ3B0LTRvLW1pbmktdHJhbnNjcmliZVwiXG4gICAgICAgIF0uaW5jbHVkZXModGhpcy5tb2RlbElkKSA/IFwianNvblwiIDogXCJ2ZXJib3NlX2pzb25cIixcbiAgICAgICAgdGVtcGVyYXR1cmU6IG9wZW5BSU9wdGlvbnMudGVtcGVyYXR1cmUsXG4gICAgICAgIHRpbWVzdGFtcF9ncmFudWxhcml0aWVzOiBvcGVuQUlPcHRpb25zLnRpbWVzdGFtcEdyYW51bGFyaXRpZXNcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0cmFuc2NyaXB0aW9uTW9kZWxPcHRpb25zKSkge1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChgJHtrZXl9W11gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1EYXRhLFxuICAgICAgd2FybmluZ3NcbiAgICB9O1xuICB9XG4gIGFzeW5jIGRvR2VuZXJhdGUob3B0aW9ucykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2g7XG4gICAgY29uc3QgY3VycmVudERhdGUgPSAoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLmNvbmZpZy5faW50ZXJuYWwpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jdXJyZW50RGF0ZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EpKSAhPSBudWxsID8gX2MgOiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTtcbiAgICBjb25zdCB7IGZvcm1EYXRhLCB3YXJuaW5ncyB9ID0gYXdhaXQgdGhpcy5nZXRBcmdzKG9wdGlvbnMpO1xuICAgIGNvbnN0IHtcbiAgICAgIHZhbHVlOiByZXNwb25zZSxcbiAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgIHJhd1ZhbHVlOiByYXdSZXNwb25zZVxuICAgIH0gPSBhd2FpdCBwb3N0Rm9ybURhdGFUb0FwaTIoe1xuICAgICAgdXJsOiB0aGlzLmNvbmZpZy51cmwoe1xuICAgICAgICBwYXRoOiBcIi9hdWRpby90cmFuc2NyaXB0aW9uc1wiLFxuICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWRcbiAgICAgIH0pLFxuICAgICAgaGVhZGVyczogY29tYmluZUhlYWRlcnM3KHRoaXMuY29uZmlnLmhlYWRlcnMoKSwgb3B0aW9ucy5oZWFkZXJzKSxcbiAgICAgIGZvcm1EYXRhLFxuICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBvcGVuYWlGYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyNihcbiAgICAgICAgb3BlbmFpVHJhbnNjcmlwdGlvblJlc3BvbnNlU2NoZW1hXG4gICAgICApLFxuICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2hcbiAgICB9KTtcbiAgICBjb25zdCBsYW5ndWFnZSA9IHJlc3BvbnNlLmxhbmd1YWdlICE9IG51bGwgJiYgcmVzcG9uc2UubGFuZ3VhZ2UgaW4gbGFuZ3VhZ2VNYXAgPyBsYW5ndWFnZU1hcFtyZXNwb25zZS5sYW5ndWFnZV0gOiB2b2lkIDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHJlc3BvbnNlLnRleHQsXG4gICAgICBzZWdtZW50czogKF9nID0gKF9mID0gKF9kID0gcmVzcG9uc2Uuc2VnbWVudHMpID09IG51bGwgPyB2b2lkIDAgOiBfZC5tYXAoKHNlZ21lbnQpID0+ICh7XG4gICAgICAgIHRleHQ6IHNlZ21lbnQudGV4dCxcbiAgICAgICAgc3RhcnRTZWNvbmQ6IHNlZ21lbnQuc3RhcnQsXG4gICAgICAgIGVuZFNlY29uZDogc2VnbWVudC5lbmRcbiAgICAgIH0pKSkgIT0gbnVsbCA/IF9mIDogKF9lID0gcmVzcG9uc2Uud29yZHMpID09IG51bGwgPyB2b2lkIDAgOiBfZS5tYXAoKHdvcmQpID0+ICh7XG4gICAgICAgIHRleHQ6IHdvcmQud29yZCxcbiAgICAgICAgc3RhcnRTZWNvbmQ6IHdvcmQuc3RhcnQsXG4gICAgICAgIGVuZFNlY29uZDogd29yZC5lbmRcbiAgICAgIH0pKSkgIT0gbnVsbCA/IF9nIDogW10sXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIGR1cmF0aW9uSW5TZWNvbmRzOiAoX2ggPSByZXNwb25zZS5kdXJhdGlvbikgIT0gbnVsbCA/IF9oIDogdm9pZCAwLFxuICAgICAgd2FybmluZ3MsXG4gICAgICByZXNwb25zZToge1xuICAgICAgICB0aW1lc3RhbXA6IGN1cnJlbnREYXRlLFxuICAgICAgICBtb2RlbElkOiB0aGlzLm1vZGVsSWQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgYm9keTogcmF3UmVzcG9uc2VcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG4vLyBzcmMvdmVyc2lvbi50c1xudmFyIFZFUlNJT04gPSB0cnVlID8gXCIzLjAuNDlcIiA6IFwiMC4wLjAtdGVzdFwiO1xuXG4vLyBzcmMvb3BlbmFpLXByb3ZpZGVyLnRzXG5mdW5jdGlvbiBjcmVhdGVPcGVuQUkob3B0aW9ucyA9IHt9KSB7XG4gIHZhciBfYSwgX2I7XG4gIGNvbnN0IGJhc2VVUkwgPSAoX2EgPSB3aXRob3V0VHJhaWxpbmdTbGFzaChcbiAgICBsb2FkT3B0aW9uYWxTZXR0aW5nKHtcbiAgICAgIHNldHRpbmdWYWx1ZTogb3B0aW9ucy5iYXNlVVJMLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZU5hbWU6IFwiT1BFTkFJX0JBU0VfVVJMXCJcbiAgICB9KVxuICApKSAhPSBudWxsID8gX2EgOiBcImh0dHBzOi8vYXBpLm9wZW5haS5jb20vdjFcIjtcbiAgY29uc3QgcHJvdmlkZXJOYW1lID0gKF9iID0gb3B0aW9ucy5uYW1lKSAhPSBudWxsID8gX2IgOiBcIm9wZW5haVwiO1xuICBjb25zdCBnZXRIZWFkZXJzID0gKCkgPT4gd2l0aFVzZXJBZ2VudFN1ZmZpeChcbiAgICB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9hZEFwaUtleSh7XG4gICAgICAgIGFwaUtleTogb3B0aW9ucy5hcGlLZXksXG4gICAgICAgIGVudmlyb25tZW50VmFyaWFibGVOYW1lOiBcIk9QRU5BSV9BUElfS0VZXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIk9wZW5BSVwiXG4gICAgICB9KX1gLFxuICAgICAgXCJPcGVuQUktT3JnYW5pemF0aW9uXCI6IG9wdGlvbnMub3JnYW5pemF0aW9uLFxuICAgICAgXCJPcGVuQUktUHJvamVjdFwiOiBvcHRpb25zLnByb2plY3QsXG4gICAgICAuLi5vcHRpb25zLmhlYWRlcnNcbiAgICB9LFxuICAgIGBhaS1zZGsvb3BlbmFpLyR7VkVSU0lPTn1gXG4gICk7XG4gIGNvbnN0IGNyZWF0ZUNoYXRNb2RlbCA9IChtb2RlbElkKSA9PiBuZXcgT3BlbkFJQ2hhdExhbmd1YWdlTW9kZWwobW9kZWxJZCwge1xuICAgIHByb3ZpZGVyOiBgJHtwcm92aWRlck5hbWV9LmNoYXRgLFxuICAgIHVybDogKHsgcGF0aCB9KSA9PiBgJHtiYXNlVVJMfSR7cGF0aH1gLFxuICAgIGhlYWRlcnM6IGdldEhlYWRlcnMsXG4gICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2hcbiAgfSk7XG4gIGNvbnN0IGNyZWF0ZUNvbXBsZXRpb25Nb2RlbCA9IChtb2RlbElkKSA9PiBuZXcgT3BlbkFJQ29tcGxldGlvbkxhbmd1YWdlTW9kZWwobW9kZWxJZCwge1xuICAgIHByb3ZpZGVyOiBgJHtwcm92aWRlck5hbWV9LmNvbXBsZXRpb25gLFxuICAgIHVybDogKHsgcGF0aCB9KSA9PiBgJHtiYXNlVVJMfSR7cGF0aH1gLFxuICAgIGhlYWRlcnM6IGdldEhlYWRlcnMsXG4gICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2hcbiAgfSk7XG4gIGNvbnN0IGNyZWF0ZUVtYmVkZGluZ01vZGVsID0gKG1vZGVsSWQpID0+IG5ldyBPcGVuQUlFbWJlZGRpbmdNb2RlbChtb2RlbElkLCB7XG4gICAgcHJvdmlkZXI6IGAke3Byb3ZpZGVyTmFtZX0uZW1iZWRkaW5nYCxcbiAgICB1cmw6ICh7IHBhdGggfSkgPT4gYCR7YmFzZVVSTH0ke3BhdGh9YCxcbiAgICBoZWFkZXJzOiBnZXRIZWFkZXJzLFxuICAgIGZldGNoOiBvcHRpb25zLmZldGNoXG4gIH0pO1xuICBjb25zdCBjcmVhdGVJbWFnZU1vZGVsID0gKG1vZGVsSWQpID0+IG5ldyBPcGVuQUlJbWFnZU1vZGVsKG1vZGVsSWQsIHtcbiAgICBwcm92aWRlcjogYCR7cHJvdmlkZXJOYW1lfS5pbWFnZWAsXG4gICAgdXJsOiAoeyBwYXRoIH0pID0+IGAke2Jhc2VVUkx9JHtwYXRofWAsXG4gICAgaGVhZGVyczogZ2V0SGVhZGVycyxcbiAgICBmZXRjaDogb3B0aW9ucy5mZXRjaFxuICB9KTtcbiAgY29uc3QgY3JlYXRlVHJhbnNjcmlwdGlvbk1vZGVsID0gKG1vZGVsSWQpID0+IG5ldyBPcGVuQUlUcmFuc2NyaXB0aW9uTW9kZWwobW9kZWxJZCwge1xuICAgIHByb3ZpZGVyOiBgJHtwcm92aWRlck5hbWV9LnRyYW5zY3JpcHRpb25gLFxuICAgIHVybDogKHsgcGF0aCB9KSA9PiBgJHtiYXNlVVJMfSR7cGF0aH1gLFxuICAgIGhlYWRlcnM6IGdldEhlYWRlcnMsXG4gICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2hcbiAgfSk7XG4gIGNvbnN0IGNyZWF0ZVNwZWVjaE1vZGVsID0gKG1vZGVsSWQpID0+IG5ldyBPcGVuQUlTcGVlY2hNb2RlbChtb2RlbElkLCB7XG4gICAgcHJvdmlkZXI6IGAke3Byb3ZpZGVyTmFtZX0uc3BlZWNoYCxcbiAgICB1cmw6ICh7IHBhdGggfSkgPT4gYCR7YmFzZVVSTH0ke3BhdGh9YCxcbiAgICBoZWFkZXJzOiBnZXRIZWFkZXJzLFxuICAgIGZldGNoOiBvcHRpb25zLmZldGNoXG4gIH0pO1xuICBjb25zdCBjcmVhdGVMYW5ndWFnZU1vZGVsID0gKG1vZGVsSWQpID0+IHtcbiAgICBpZiAobmV3LnRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSBPcGVuQUkgbW9kZWwgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcga2V5d29yZC5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVJlc3BvbnNlc01vZGVsKG1vZGVsSWQpO1xuICB9O1xuICBjb25zdCBjcmVhdGVSZXNwb25zZXNNb2RlbCA9IChtb2RlbElkKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBPcGVuQUlSZXNwb25zZXNMYW5ndWFnZU1vZGVsKG1vZGVsSWQsIHtcbiAgICAgIHByb3ZpZGVyOiBgJHtwcm92aWRlck5hbWV9LnJlc3BvbnNlc2AsXG4gICAgICB1cmw6ICh7IHBhdGggfSkgPT4gYCR7YmFzZVVSTH0ke3BhdGh9YCxcbiAgICAgIGhlYWRlcnM6IGdldEhlYWRlcnMsXG4gICAgICBmZXRjaDogb3B0aW9ucy5mZXRjaCxcbiAgICAgIGZpbGVJZFByZWZpeGVzOiBbXCJmaWxlLVwiXVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBwcm92aWRlciA9IGZ1bmN0aW9uKG1vZGVsSWQpIHtcbiAgICByZXR1cm4gY3JlYXRlTGFuZ3VhZ2VNb2RlbChtb2RlbElkKTtcbiAgfTtcbiAgcHJvdmlkZXIuc3BlY2lmaWNhdGlvblZlcnNpb24gPSBcInYzXCI7XG4gIHByb3ZpZGVyLmxhbmd1YWdlTW9kZWwgPSBjcmVhdGVMYW5ndWFnZU1vZGVsO1xuICBwcm92aWRlci5jaGF0ID0gY3JlYXRlQ2hhdE1vZGVsO1xuICBwcm92aWRlci5jb21wbGV0aW9uID0gY3JlYXRlQ29tcGxldGlvbk1vZGVsO1xuICBwcm92aWRlci5yZXNwb25zZXMgPSBjcmVhdGVSZXNwb25zZXNNb2RlbDtcbiAgcHJvdmlkZXIuZW1iZWRkaW5nID0gY3JlYXRlRW1iZWRkaW5nTW9kZWw7XG4gIHByb3ZpZGVyLmVtYmVkZGluZ01vZGVsID0gY3JlYXRlRW1iZWRkaW5nTW9kZWw7XG4gIHByb3ZpZGVyLnRleHRFbWJlZGRpbmcgPSBjcmVhdGVFbWJlZGRpbmdNb2RlbDtcbiAgcHJvdmlkZXIudGV4dEVtYmVkZGluZ01vZGVsID0gY3JlYXRlRW1iZWRkaW5nTW9kZWw7XG4gIHByb3ZpZGVyLmltYWdlID0gY3JlYXRlSW1hZ2VNb2RlbDtcbiAgcHJvdmlkZXIuaW1hZ2VNb2RlbCA9IGNyZWF0ZUltYWdlTW9kZWw7XG4gIHByb3ZpZGVyLnRyYW5zY3JpcHRpb24gPSBjcmVhdGVUcmFuc2NyaXB0aW9uTW9kZWw7XG4gIHByb3ZpZGVyLnRyYW5zY3JpcHRpb25Nb2RlbCA9IGNyZWF0ZVRyYW5zY3JpcHRpb25Nb2RlbDtcbiAgcHJvdmlkZXIuc3BlZWNoID0gY3JlYXRlU3BlZWNoTW9kZWw7XG4gIHByb3ZpZGVyLnNwZWVjaE1vZGVsID0gY3JlYXRlU3BlZWNoTW9kZWw7XG4gIHByb3ZpZGVyLnRvb2xzID0gb3BlbmFpVG9vbHM7XG4gIHJldHVybiBwcm92aWRlcjtcbn1cbnZhciBvcGVuYWkgPSBjcmVhdGVPcGVuQUkoKTtcbmV4cG9ydCB7XG4gIFZFUlNJT04sXG4gIGNyZWF0ZU9wZW5BSSxcbiAgb3BlbmFpXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/.pnpm/@ai-sdk+openai@3.0.49_zod@3.25.76/node_modules/@ai-sdk/openai/dist/index.mjs\n");
|
|
|
|
/***/ })
|
|
|
|
};
|
|
; |