@fhevm/sdk 1.1.0-alpha.1 → 1.1.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_cjs/core/_version.js +1 -1
- package/_cjs/core/actions/base/{canReadPublicValue.js → canDecryptPublicValue.js} +3 -3
- package/_cjs/core/actions/base/canDecryptPublicValue.js.map +1 -0
- package/_cjs/core/actions/base/{canReadPublicValues.js → canDecryptPublicValues.js} +3 -3
- package/_cjs/core/actions/base/canDecryptPublicValues.js.map +1 -0
- package/_cjs/core/actions/base/{readPublicValue.js → decryptPublicValue.js} +4 -4
- package/_cjs/core/actions/base/decryptPublicValue.js.map +1 -0
- package/_cjs/core/actions/base/{readPublicValues.js → decryptPublicValues.js} +4 -4
- package/_cjs/core/actions/base/decryptPublicValues.js.map +1 -0
- package/_cjs/core/actions/base/{readPublicValuesWithSignatures.js → decryptPublicValuesWithSignatures.js} +4 -4
- package/_cjs/core/actions/base/decryptPublicValuesWithSignatures.js.map +1 -0
- package/_cjs/core/actions/base/index.js +11 -11
- package/_cjs/core/actions/base/index.js.map +1 -1
- package/_cjs/core/clients/decorators/base.js +6 -6
- package/_cjs/core/clients/decorators/base.js.map +1 -1
- package/_cjs/core/modules/decrypt/module/api-p.js +1 -2
- package/_cjs/core/modules/decrypt/module/api-p.js.map +1 -1
- package/_cjs/core/modules/relayer/module/guards/RelayerUserDecryptSucceeded.js +8 -0
- package/_cjs/core/modules/relayer/module/guards/RelayerUserDecryptSucceeded.js.map +1 -1
- package/_cjs/wasm/tfhe/TfheApi.d.ts +13 -12
- package/_cjs/wasm/tfhe/loadTfheLib.js +1 -1
- package/_cjs/wasm/tfhe/loadTfheLib.js.map +2 -2
- package/_cjs/wasm/tfhe/v1.5.3/startWorkers.js +3 -3
- package/_cjs/wasm/tfhe/v1.5.3/startWorkers.js.map +2 -2
- package/_cjs/wasm/tfhe/v1.6.1/startWorkers.js +3 -3
- package/_cjs/wasm/tfhe/v1.6.1/startWorkers.js.map +2 -2
- package/_cjs/wasm/tkms/KmsLibApi.d.ts +1 -0
- package/_cjs/wasm/tkms/loadKmsLib.js +1 -1
- package/_cjs/wasm/tkms/loadKmsLib.js.map +2 -2
- package/_esm/core/_version.js +1 -1
- package/_esm/core/actions/base/{canReadPublicValue.js → canDecryptPublicValue.js} +2 -2
- package/_esm/core/actions/base/canDecryptPublicValue.js.map +1 -0
- package/_esm/core/actions/base/{canReadPublicValues.js → canDecryptPublicValues.js} +2 -2
- package/_esm/core/actions/base/canDecryptPublicValues.js.map +1 -0
- package/_esm/core/actions/base/{readPublicValue.js → decryptPublicValue.js} +3 -3
- package/_esm/core/actions/base/decryptPublicValue.js.map +1 -0
- package/_esm/core/actions/base/{readPublicValues.js → decryptPublicValues.js} +3 -3
- package/_esm/core/actions/base/decryptPublicValues.js.map +1 -0
- package/_esm/core/actions/base/{readPublicValuesWithSignatures.js → decryptPublicValuesWithSignatures.js} +3 -3
- package/_esm/core/actions/base/decryptPublicValuesWithSignatures.js.map +1 -0
- package/_esm/core/actions/base/index.js +5 -5
- package/_esm/core/actions/base/index.js.map +1 -1
- package/_esm/core/clients/decorators/base.js +6 -6
- package/_esm/core/clients/decorators/base.js.map +1 -1
- package/_esm/core/modules/decrypt/module/api-p.js +18 -2
- package/_esm/core/modules/decrypt/module/api-p.js.map +1 -1
- package/_esm/core/modules/relayer/module/guards/RelayerUserDecryptSucceeded.js +10 -0
- package/_esm/core/modules/relayer/module/guards/RelayerUserDecryptSucceeded.js.map +1 -1
- package/_esm/wasm/tfhe/TfheApi.d.ts +13 -12
- package/_esm/wasm/tfhe/loadTfheLib.js +1 -1
- package/_esm/wasm/tfhe/v1.5.3/startWorkers.js +4 -3
- package/_esm/wasm/tfhe/v1.6.1/startWorkers.js +4 -3
- package/_esm/wasm/tkms/KmsLibApi.d.ts +1 -0
- package/_esm/wasm/tkms/loadKmsLib.js +1 -1
- package/_types/core/actions/base/canDecryptPublicValue.d.ts +9 -0
- package/_types/core/actions/base/canDecryptPublicValue.d.ts.map +1 -0
- package/_types/core/actions/base/canDecryptPublicValues.d.ts +9 -0
- package/_types/core/actions/base/canDecryptPublicValues.d.ts.map +1 -0
- package/_types/core/actions/base/{readPublicValue.d.ts → decryptPublicValue.d.ts} +4 -4
- package/_types/core/actions/base/decryptPublicValue.d.ts.map +1 -0
- package/_types/core/actions/base/{readPublicValues.d.ts → decryptPublicValues.d.ts} +4 -4
- package/_types/core/actions/base/decryptPublicValues.d.ts.map +1 -0
- package/_types/core/actions/base/{readPublicValuesWithSignatures.d.ts → decryptPublicValuesWithSignatures.d.ts} +4 -4
- package/_types/core/actions/base/decryptPublicValuesWithSignatures.d.ts.map +1 -0
- package/_types/core/actions/base/index.d.ts +5 -5
- package/_types/core/actions/base/index.d.ts.map +1 -1
- package/_types/core/clients/decorators/base.d.ts +16 -16
- package/_types/core/clients/decorators/base.d.ts.map +1 -1
- package/_types/core/modules/decrypt/module/api-p.d.ts.map +1 -1
- package/_types/core/modules/relayer/module/guards/RelayerUserDecryptSucceeded.d.ts.map +1 -1
- package/_types/wasm/tfhe/TfheApi.d.ts +13 -12
- package/_types/wasm/tkms/KmsLibApi.d.ts +1 -0
- package/core/_version.ts +1 -1
- package/core/actions/base/{canReadPublicValue.ts → canDecryptPublicValue.ts} +5 -5
- package/core/actions/base/{canReadPublicValues.ts → canDecryptPublicValues.ts} +5 -5
- package/core/actions/base/{readPublicValue.ts → decryptPublicValue.ts} +6 -6
- package/core/actions/base/{readPublicValues.ts → decryptPublicValues.ts} +6 -6
- package/core/actions/base/{readPublicValuesWithSignatures.ts → decryptPublicValuesWithSignatures.ts} +6 -6
- package/core/actions/base/index.ts +21 -17
- package/core/clients/decorators/base.ts +30 -30
- package/core/modules/decrypt/module/api-p.ts +20 -3
- package/core/modules/relayer/module/guards/RelayerUserDecryptSucceeded.ts +15 -0
- package/package.json +1 -1
- package/wasm/tfhe/TfheApi.d.ts +13 -12
- package/wasm/tfhe/loadTfheLib.js +1 -1
- package/wasm/tfhe/v1.5.3/startWorkers.js +4 -3
- package/wasm/tfhe/v1.6.0-dev/startWorkers.js +4 -3
- package/wasm/tfhe/v1.6.1/startWorkers.js +4 -3
- package/wasm/tkms/KmsLibApi.d.ts +1 -0
- package/wasm/tkms/loadKmsLib.js +1 -1
- package/_cjs/core/actions/base/canReadPublicValue.js.map +0 -1
- package/_cjs/core/actions/base/canReadPublicValues.js.map +0 -1
- package/_cjs/core/actions/base/readPublicValue.js.map +0 -1
- package/_cjs/core/actions/base/readPublicValues.js.map +0 -1
- package/_cjs/core/actions/base/readPublicValuesWithSignatures.js.map +0 -1
- package/_esm/core/actions/base/canReadPublicValue.js.map +0 -1
- package/_esm/core/actions/base/canReadPublicValues.js.map +0 -1
- package/_esm/core/actions/base/readPublicValue.js.map +0 -1
- package/_esm/core/actions/base/readPublicValues.js.map +0 -1
- package/_esm/core/actions/base/readPublicValuesWithSignatures.js.map +0 -1
- package/_types/core/actions/base/canReadPublicValue.d.ts +0 -9
- package/_types/core/actions/base/canReadPublicValue.d.ts.map +0 -1
- package/_types/core/actions/base/canReadPublicValues.d.ts +0 -9
- package/_types/core/actions/base/canReadPublicValues.d.ts.map +0 -1
- package/_types/core/actions/base/readPublicValue.d.ts.map +0 -1
- package/_types/core/actions/base/readPublicValues.d.ts.map +0 -1
- package/_types/core/actions/base/readPublicValuesWithSignatures.d.ts.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../wasm/tfhe/v1.6.1/startWorkers.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Auto-generated from scripts/wasm/tfhe/startWorkers.template.js.\n * Embedded worker base64 payload SHA-256: c6beb212e48e93e3813f82c35f96125dae236d4369aed0b3992adcb4c925cb52\n */\n\n/**\n * Worker load mode security guarantees:\n *\n * embedded-base64 Integrity: build-time. Inherits the JS bundle's integrity.\n * verified-blob Integrity: runtime SHA-256 of fetched bytes; executed bytes\n * are the verified bytes themselves.\n * precheck-direct-url No integrity guarantee. The SDK fetches the URL once and\n * validates SHA-256, then the runtime fetches the URL a\n * second time and executes those (unverified) bytes. Use\n * for fail-fast on misconfigured URLs / wrong builds, not\n * for protection against on-path or CDN-edge tampering.\n * trusted-direct-url No integrity check. Use only when the URL is fully trusted\n * (e.g., same-origin static asset).\n * auto Tries verified-blob if workerUrl is set, falls back to\n * embedded-base64 on any non-SHA-256 error. SHA-256 mismatch\n * is always fatal and never falls back.\n */\n\n/**\n * Module invariants.\n *\n * Lifecycle (one-shot, no retry):\n * - setWorkerUrlConfig() and startWorkers() each at most once.\n * - A failed startWorkers() locks the module; no retry, no reconfigure.\n * - terminateWorkers() throws while startWorkers() is in flight; idempotent after.\n *\n * Concurrency:\n * - _started and _starting are check-and-set without intervening await.\n * - Parallel workers dedupe to a single fetch+verify (cached promise).\n *\n * Security:\n * - SHA-256 mismatch (Sha256MismatchError) is always fatal \u2014 never falls back.\n * - Hash is the build-time constant \"348fe6c2e77bafe0cbfb9c0a512af99b5f97de1119ceadf07cc34620dbc5690e\".\n * - auto silently falls back to embedded-base64 on any non-SHA-256 error.\n * - precheck-direct-url's SHA-256 check is informational; the runtime refetches.\n *\n * Errors:\n * - Partial worker-pool failure: successful workers are terminated before throw.\n * - Concurrent failures: only the first error is surfaced.\n * - __waitForMsgType has no timeout \u2014 a silent worker hangs startWorkers().\n *\n * Resources:\n * - Blob URLs are revoked on both success and synchronous-constructor failure.\n * - _verifiedWorkerUrlBytesPromise is cleared in startWorkers()'s finally.\n * - _workers is a strong reference (owns the shared WebAssembly memory).\n * - __waitForMsgType listeners are not removed if the worker never replies.\n *\n * Caller contract:\n * - workerUrl: URL instance (required for verified/checked/trusted-direct-url).\n * - logger: must expose debug(message) and error(message, cause).\n * - wasmAssetLoadMode: one of __wasmAssetLoadModes.\n */\n\n////////////////////////////////////////////////////////////////////////////////\n// Runtime detection and load modes\n////////////////////////////////////////////////////////////////////////////////\n\nfunction __isBrowserLike() {\n return (\n typeof Bun === 'undefined' &&\n typeof process === 'undefined' &&\n typeof addEventListener === 'function' &&\n typeof removeEventListener === 'function'\n );\n}\n\nconst __wasmAssetLoadModes = ['embedded-base64', 'verified-blob', 'precheck-direct-url', 'trusted-direct-url', 'auto'];\n\nfunction __isWasmAssetLoadMode(value) {\n return __wasmAssetLoadModes.includes(value);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// SHA-256 verification\n////////////////////////////////////////////////////////////////////////////////\n\nfunction __bytesToHex(bytes) {\n return [...bytes].map((b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Computes the SHA-256 digest of worker bytes and returns it as lowercase hex.\n * @param {ArrayBuffer | Uint8Array} bytes Worker bytes to hash.\n * @returns {Promise<string>} Lowercase hexadecimal SHA-256 digest without a `0x` prefix.\n */\nasync function __sha256(bytes) {\n if (__isBrowserLike()) {\n if (typeof crypto === 'undefined' || !crypto.subtle || typeof crypto.subtle.digest !== 'function') {\n throw new Error('Web Crypto SHA-256 digest is not available');\n }\n\n const hash = await crypto.subtle.digest('SHA-256', bytes);\n return __bytesToHex(new Uint8Array(hash));\n }\n\n const nodeModuleName = 'crypto';\n const nodeModuleId = `node:${nodeModuleName}`;\n const { createHash } = await import(/* @vite-ignore */ nodeModuleId);\n return createHash('sha256').update(new Uint8Array(bytes)).digest('hex');\n}\n\n/**\n * Verifies that worker bytes match the expected SHA-256 digest.\n * @param {ArrayBuffer | Uint8Array} bytes Worker bytes to verify.\n * @param {string} expectedSha256 Expected lowercase hex digest without a `0x` prefix.\n * @returns {Promise<void>} Resolves when the digest matches.\n * @throws {Error} Throws a `Sha256MismatchError` when the digest does not match.\n */\nasync function __verifySha256(bytes, expectedSha256) {\n const actualSha256 = await __sha256(bytes);\n\n if (actualSha256 !== expectedSha256) {\n const error = new Error(`SHA-256 mismatch: expected ${expectedSha256}, got ${actualSha256}`);\n error.name = 'Sha256MismatchError';\n throw error;\n }\n}\n\nfunction __isSha256MismatchError(error) {\n return error?.name === 'Sha256MismatchError';\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker URL byte loading\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Reads worker script bytes from a URL and verifies their SHA-256 digest.\n * @param {URL} url Worker script URL.\n * @param {string} expectedSha256 Expected lowercase hex digest without a `0x` prefix.\n * @returns {Promise<ArrayBuffer | Uint8Array>} Verified worker script bytes.\n */\nasync function __fetchAndVerifyWorkerUrlBytes(url, expectedSha256) {\n const bytes = await __readWorkerUrlBytes(url);\n\n await __verifySha256(bytes, expectedSha256);\n\n return bytes;\n}\n\n/**\n * Reads worker script bytes from a URL.\n * Uses the filesystem for Node `file:` URLs, otherwise falls back to `fetch`.\n * Assumes `fetch` exists for non-`file:` URLs.\n * @param {URL} url Worker script URL.\n * @returns {Promise<ArrayBuffer | Uint8Array>} Raw worker script bytes.\n */\nasync function __readWorkerUrlBytes(url) {\n if (!__isBrowserLike() && url.protocol === 'file:') {\n const fsModuleName = 'fs/promises';\n const fsModuleId = `node:${fsModuleName}`;\n const urlModuleName = 'url';\n const urlModuleId = `node:${urlModuleName}`;\n const { readFile } = await import(/* @vite-ignore */ fsModuleId);\n const { fileURLToPath } = await import(/* @vite-ignore */ urlModuleId);\n return await readFile(fileURLToPath(url));\n }\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch worker: ${response.status} ${response.statusText}`);\n }\n\n return await response.arrayBuffer();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker construction primitives\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Creates a browser module Worker from a Blob.\n * Browser-only: creates a Blob URL and returns it so the caller can revoke it after worker startup.\n * @param {Blob} blob JavaScript worker source Blob.\n * @returns {Promise<{ worker: Worker, blobUrl: string }>} Created browser worker and Blob URL to revoke.\n */\nasync function __newBrowserWorkerFromBlob(blob) {\n const blobUrl = URL.createObjectURL(blob);\n\n try {\n const worker = new Worker(blobUrl, {\n type: 'module',\n name: 'wasm_bindgen_worker',\n });\n\n return { worker, blobUrl };\n } catch (e) {\n URL.revokeObjectURL(blobUrl);\n throw e;\n }\n}\n\n/**\n * Creates a module Worker that loads its script directly from a URL object, isomorphically.\n * Browsers use the global Worker; Node uses worker_threads' Worker.\n * @param {URL} url Worker script URL.\n * @returns {Promise<Worker>} Created worker.\n */\nasync function __newIsomorphicWorkerFromUrl(url) {\n if (__isBrowserLike()) {\n return new Worker(url, {\n type: 'module',\n name: 'wasm_bindgen_worker',\n });\n }\n\n const nodeModuleName = 'worker_threads';\n const nodeModuleId = `node:${nodeModuleName}`;\n const { Worker: NodeWorker } = await import(/* @vite-ignore */ nodeModuleId);\n return new NodeWorker(url);\n}\n\nasync function __newNodeWorkerFromJsCode(jsCode) {\n const nodeModuleName = 'worker_threads';\n const nodeModuleId = `node:${nodeModuleName}`;\n const { Worker: NodeWorker } = await import(/* @vite-ignore */ nodeModuleId);\n return { worker: new NodeWorker(jsCode, { eval: true }), blobUrl: undefined };\n}\n\n/**\n * Creates a worker from already verified JavaScript source bytes.\n * 1. Caller must provide bytes returned by the SHA-256 verification path.\n * 2. In browsers, wrap the verified bytes in a Blob URL and create a module Worker.\n * 3. In Node, decode the verified bytes as UTF-8 JavaScript and create a worker_threads eval Worker.\n * @param {ArrayBuffer | Uint8Array} verifiedJsCodeBytes SHA-256 verified JavaScript source bytes.\n * @returns {Promise<{ worker: Worker, blobUrl: string | undefined }>} Created worker and optional Blob URL to revoke.\n */\nasync function __newIsomorphicWorkerFromVerifiedJsCodeBytes(verifiedJsCodeBytes) {\n if (__isBrowserLike()) {\n return await __newBrowserWorkerFromBlob(\n new Blob([verifiedJsCodeBytes], {\n type: 'application/javascript',\n }),\n );\n }\n\n return await __newNodeWorkerFromJsCode(Buffer.from(verifiedJsCodeBytes).toString('utf-8'));\n}\n\n/**\n * Creates a worker from the SDK-embedded base64 JavaScript source.\n * 1. In browsers, decode the base64 source into a Blob URL and create a module Worker.\n * 2. In Node, decode the base64 source into UTF-8 JavaScript and create a worker_threads eval Worker.\n * @param {string} jsCodeBase64 Base64-encoded JavaScript worker source.\n * @returns {Promise<{ worker: Worker, blobUrl: string | undefined }>} Created worker and optional Blob URL to revoke.\n */\nasync function __newWorkerFromJsCodeBase64(jsCodeBase64) {\n if (__isBrowserLike()) {\n const blob = new Blob([atob(jsCodeBase64)], {\n type: 'application/javascript',\n });\n\n const blobUrl = URL.createObjectURL(blob);\n\n try {\n const worker = new Worker(blobUrl, {\n type: 'module',\n name: 'wasm_bindgen_worker',\n });\n\n return { worker, blobUrl };\n } catch (e) {\n URL.revokeObjectURL(blobUrl);\n throw e;\n }\n }\n\n const code = Buffer.from(jsCodeBase64, 'base64').toString('utf-8');\n return await __newNodeWorkerFromJsCode(code);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker message protocol\n////////////////////////////////////////////////////////////////////////////////\n\nfunction __waitForMsgType(target, type) {\n return new Promise((resolve, reject) => {\n function cleanup() {\n if (typeof target.removeEventListener === 'function') {\n target.removeEventListener('message', onBrowserMsg);\n target.removeEventListener('error', onBrowserError);\n } else {\n target.off('message', onNodeMsg);\n target.off('error', onNodeError);\n target.off('exit', onNodeExit);\n }\n }\n\n function onBrowserMsg({ data }) {\n if (data?.type !== type) return;\n cleanup();\n resolve(data);\n }\n\n function onBrowserError(e) {\n cleanup();\n reject(e.error || new Error('Worker error'));\n }\n\n function onNodeMsg(data) {\n if (data?.type !== type) return;\n cleanup();\n resolve(data);\n }\n\n function onNodeError(err) {\n cleanup();\n reject(err);\n }\n\n function onNodeExit(code) {\n cleanup();\n reject(new Error(`Worker exited with code ${code}`));\n }\n\n if (typeof target.removeEventListener === 'function') {\n target.addEventListener('message', onBrowserMsg);\n target.addEventListener('error', onBrowserError);\n } else {\n target.on('message', onNodeMsg);\n target.on('error', onNodeError);\n target.on('exit', onNodeExit);\n }\n });\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Module state\n////////////////////////////////////////////////////////////////////////////////\n\nlet _terminating;\nlet _configSet = false;\nlet _workerUrl = undefined;\nlet _wasmAssetLoadMode = 'auto';\nconst _workerUrlSha256 = \"348fe6c2e77bafe0cbfb9c0a512af99b5f97de1119ceadf07cc34620dbc5690e\";\nlet _verifiedWorkerUrlBytesPromise = undefined;\nlet _logger = undefined;\nlet _started = false;\n// True only while the body of startWorkers() is executing.\n// Reset by the try/finally in startWorkers, so a failed start still allows\n// terminateWorkers() to be called (and become a no-op when _workers is unset).\nlet _starting = false;\n\n// Keep workers strongly referenced while they own shared WebAssembly memory.\nlet _workers;\n\nfunction getTfheWorkers() {\n return _workers;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Configuration API\n////////////////////////////////////////////////////////////////////////////////\n\nfunction __assertLogger(logger) {\n if (logger === undefined) {\n return;\n }\n\n if (typeof logger.debug !== 'function' || typeof logger.error !== 'function') {\n throw new TypeError('logger must expose debug(message) and error(message, cause) functions');\n }\n}\n\nfunction setWorkerUrlConfig(parameters = {}) {\n if (_configSet) {\n throw new Error('Cannot set worker URL config: config was already set');\n }\n\n if (_started) {\n throw new Error('Cannot set worker URL config after workers have started');\n }\n\n if (parameters === null || typeof parameters !== 'object') {\n throw new TypeError('setWorkerUrlConfig parameters must be an object');\n }\n\n const { workerUrl = undefined, wasmAssetLoadMode = 'auto', logger = undefined } = parameters;\n\n // Check `wasmAssetLoadMode`\n if (!__isWasmAssetLoadMode(wasmAssetLoadMode)) {\n throw new TypeError(`wasmAssetLoadMode must be one of: ${__wasmAssetLoadModes.join(', ')}`);\n }\n\n // Check `workerUrl`\n if (workerUrl !== undefined) {\n if (!(workerUrl instanceof URL)) {\n throw new TypeError('workerUrl must be a URL');\n }\n _workerUrl = workerUrl;\n } else {\n if (\n wasmAssetLoadMode === 'verified-blob' ||\n wasmAssetLoadMode === 'precheck-direct-url' ||\n wasmAssetLoadMode === 'trusted-direct-url'\n ) {\n throw new Error(`workerUrl is required when wasmAssetLoadMode is \"${wasmAssetLoadMode}\"`);\n }\n }\n\n // Check `logger`\n __assertLogger(logger);\n\n _wasmAssetLoadMode = wasmAssetLoadMode;\n _logger = logger;\n _configSet = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker source strategies\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Returns the cached verification promise for the configured worker URL.\n * The first call reads `_workerUrl` and verifies it against `_workerUrlSha256`; later calls reuse the same promise\n * so parallel workers do not refetch or rehash the script.\n * @returns {Promise<ArrayBuffer | Uint8Array>} Verified worker script bytes.\n * @throws {Error} If no worker URL is configured.\n */\nfunction __getVerifiedWorkerUrlBytesPromise() {\n const workerUrl = _workerUrl;\n\n if (workerUrl === undefined) {\n throw new Error('workerUrl is required to verify worker URL bytes');\n }\n\n if (_verifiedWorkerUrlBytesPromise !== undefined) {\n return _verifiedWorkerUrlBytesPromise;\n }\n\n _verifiedWorkerUrlBytesPromise = __fetchAndVerifyWorkerUrlBytes(workerUrl, _workerUrlSha256);\n return _verifiedWorkerUrlBytesPromise;\n}\n\n/**\n * Creates a worker from the configured URL after SHA-256 verification.\n * 1. Reuse cached verified bytes.\n * 2. Execute those exact bytes as a Blob worker in browsers.\n * 3. Execute those exact bytes as an eval worker in Node.\n * @returns {Promise<{ worker: Worker, blobUrl: string | undefined }>} Created worker and optional Blob URL to revoke.\n */\nasync function __createWorkerFromVerifiedWorkerUrl() {\n const verifiedWorkerBytes = await __getVerifiedWorkerUrlBytesPromise();\n return await __newIsomorphicWorkerFromVerifiedJsCodeBytes(verifiedWorkerBytes);\n}\n\n/**\n * Creates a worker by passing the configured URL directly to the runtime.\n * 1. Require a configured worker URL.\n * 2. Do not perform SDK byte verification.\n * 3. Let the browser or Node runtime load and execute the URL directly.\n * @returns {Promise<{ worker: Worker, blobUrl: undefined }>} Created worker with no Blob URL to revoke.\n */\nasync function __createWorkerFromTrustedDirectWorkerUrl() {\n if (_workerUrl === undefined) {\n throw new Error('workerUrl is required to create a trusted direct worker');\n }\n\n return { worker: await __newIsomorphicWorkerFromUrl(_workerUrl), blobUrl: undefined };\n}\n\n/**\n * Creates a worker by passing the configured URL directly to the runtime, after a pre-flight SHA-256 probe.\n *\n * IMPORTANT: this is NOT an integrity check. The SDK fetches the URL once to validate\n * the hash, then hands the URL to the runtime, which fetches it a SECOND time and\n * executes those bytes. The two fetches are independent \u2014 the executed bytes are\n * never verified. Use only for fail-fast on misconfigured URLs / build mismatches.\n *\n * For an actual integrity guarantee, use `verified-blob` (requires CSP allowing blob: workers).\n *\n * 1. Fetch the URL and verify its SHA-256 against \"348fe6c2e77bafe0cbfb9c0a512af99b5f97de1119ceadf07cc34620dbc5690e\" \u2014 fails fast on mismatch.\n * 2. Discard the verified bytes.\n * 3. Let the runtime fetch the same URL again and execute it (no verification on this fetch).\n * @returns {Promise<{ worker: Worker, blobUrl: undefined }>} Created worker with no Blob URL to revoke.\n */\nasync function __createWorkerFromCheckedDirectWorkerUrl() {\n await __getVerifiedWorkerUrlBytesPromise();\n return await __createWorkerFromTrustedDirectWorkerUrl();\n}\n\n/**\n * Creates a worker from the SDK-embedded base64 worker source.\n * 1. Read the base64-encoded JavaScript source baked into this module.\n * 2. Decode into a Blob URL and create a module Worker in browsers.\n * 3. Decode into UTF-8 JavaScript and create a worker_threads eval Worker in Node.\n * @returns {Promise<{ worker: Worker, blobUrl: string | undefined }>} Created worker and optional Blob URL to revoke.\n */\nasync function __createWorkerFromBase64() {\n const workerBase64 = \"ZnVuY3Rpb24gX19faXNCcm93c2VyTGlrZSgpIHsKICByZXR1cm4gKAogICAgdHlwZW9mIGFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiYKICAgIHR5cGVvZiByZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nCiAgKTsKfQoKYXN5bmMgZnVuY3Rpb24gX19fZ2V0VGFyZ2V0KCkgewogIGlmIChfX19pc0Jyb3dzZXJMaWtlKCkpIHJldHVybiBzZWxmOwogIGNvbnN0IG5vZGVNb2R1bGVOYW1lID0gJ3dvcmtlcl90aHJlYWRzJzsKICBjb25zdCBub2RlTW9kdWxlSWQgPSBgbm9kZToke25vZGVNb2R1bGVOYW1lfWA7CiAgY29uc3QgeyBwYXJlbnRQb3J0IH0gPSBhd2FpdCBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIG5vZGVNb2R1bGVJZCk7CiAgcmV0dXJuIHBhcmVudFBvcnQ7Cn0KCmZ1bmN0aW9uIF9fX3dhaXRGb3JNc2dUeXBlKHRhcmdldCwgdHlwZSkgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaWYgKHR5cGVvZiB0YXJnZXQub24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgLy8gTm9kZTogRXZlbnRFbWl0dGVyLCBkYXRhIHBhc3NlZCBkaXJlY3RseQogICAgICB0YXJnZXQub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiBvbk1zZyhkYXRhKSB7CiAgICAgICAgaWYgKGRhdGE/LnR5cGUgIT09IHR5cGUpIHJldHVybjsKICAgICAgICB0YXJnZXQub2ZmKCdtZXNzYWdlJywgb25Nc2cpOwogICAgICAgIHJlc29sdmUoZGF0YSk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgLy8gQnJvd3NlcjogRE9NIGV2ZW50cywgZGF0YSB3cmFwcGVkIGluIE1lc3NhZ2VFdmVudAogICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIG9uTXNnKHsgZGF0YSB9KSB7CiAgICAgICAgaWYgKGRhdGE/LnR5cGUgIT09IHR5cGUpIHJldHVybjsKICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTXNnKTsKICAgICAgICByZXNvbHZlKGRhdGEpOwogICAgICB9KTsKICAgIH0KICB9KTsKfQoKX19fZ2V0VGFyZ2V0KCkudGhlbigodGFyZ2V0KSA9PgogIF9fX3dhaXRGb3JNc2dUeXBlKHRhcmdldCwgJ3dhc21fYmluZGdlbl93b3JrZXJfaW5pdCcpLnRoZW4oCiAgICBhc3luYyAoeyBpbml0LCByZWNlaXZlciB9KSA9PiB7CiAgICAgIGNvbnN0IHBrZyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0ZmhlOwogICAgICB9KTsKICAgICAgYXdhaXQgcGtnLmRlZmF1bHQoaW5pdCk7CiAgICAgIHRhcmdldC5wb3N0TWVzc2FnZSh7IHR5cGU6ICd3YXNtX2JpbmRnZW5fd29ya2VyX3JlYWR5JyB9KTsKICAgICAgcGtnLndiZ19yYXlvbl9zdGFydF93b3JrZXIocmVjZWl2ZXIpOwogICAgfSwKICApLAopOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSByZWNlaXZlcgogKi8KZnVuY3Rpb24gd2JnX3JheW9uX3N0YXJ0X3dvcmtlcihyZWNlaXZlcikgewogIHdhc20ud2JnX3JheW9uX3N0YXJ0X3dvcmtlcihyZWNlaXZlcik7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIEludGVybmFsIHdhc21iaW5kZ2VuIHRvb2xzCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBJbXBvcnRzOgovLyBfX3diZ19nZXRfaW1wb3J0cwovLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZnVuY3Rpb24gX193YmdfZ2V0X2ltcG9ydHMobWVtb3J5KSB7CiAgICBjb25zdCBpbXBvcnQwID0gewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICBfX3diZ19CaWdJbnRfNjViY2VhMjUxZTc4ODA4MzogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gQmlnSW50KGFyZzApOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfQmlnSW50X2NjYmNhNzkzZjQ1NmU1ODI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBCaWdJbnQoYXJnMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICB9LCBhcmd1bWVudHMpOwogICAgICAgIH0sCiAgICAgICAgX193YmdfRXJyb3JfOTYwYzE1NWQzZDQ5ZTRjMjogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX19fd2JpbmRnZW5fYmlnaW50X2dldF9hc19pNjRfM2QzYWJhNWQ2MTZjNmE1MTogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3QgdiA9IGFyZzE7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IHR5cGVvZiAodikgPT09ICdiaWdpbnQnID8gdiA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0QmlnSW50NjQoYXJnMCArIDggKiAxLCBpc0xpa2VOb25lKHJldCkgPyBCaWdJbnQoMCkgOiByZXQsIHRydWUpOwogICAgICAgICAgICBnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwICsgNCAqIDAsICFpc0xpa2VOb25lKHJldCksIHRydWUpOwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9iaXRfYW5kXzk2ZjY5NmM1NmI0OTUwZDU6IGZ1bmN0aW9uIChhcmcwLCBhcmcxKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAgJiBhcmcxOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9iaXRfb3JfZDU2NGMyNzUxZmRhYzZjOTogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMCB8IGFyZzE7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX2RlYnVnX3N0cmluZ19hYjRiMzRkMjNkNjc3OGJkOiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICBjb25zdCByZXQgPSBkZWJ1Z1N0cmluZyhhcmcxKTsKICAgICAgICAgICAgY29uc3QgcHRyMSA9IHBhc3NTdHJpbmdUb1dhc20wKHJldCwgd2FzbS5fX3diaW5kZ2VuX21hbGxvYywgd2FzbS5fX3diaW5kZ2VuX3JlYWxsb2MpOwogICAgICAgICAgICBjb25zdCBsZW4xID0gV0FTTV9WRUNUT1JfTEVOOwogICAgICAgICAgICBnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwICsgNCAqIDEsIGxlbjEsIHRydWUpOwogICAgICAgICAgICBnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwICsgNCAqIDAsIHB0cjEsIHRydWUpOwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9pc19mdW5jdGlvbl8zYmFhOWRiMWE5ODdmNDdkOiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICBjb25zdCByZXQgPSB0eXBlb2YgKGFyZzApID09PSAnZnVuY3Rpb24nOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9pc19vYmplY3RfNjMzMjJlYzBjZDZlYTRlZjogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgY29uc3QgdmFsID0gYXJnMDsKICAgICAgICAgICAgY29uc3QgcmV0ID0gdHlwZW9mICh2YWwpID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGw7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX2lzX3N0cmluZ182ZGYzYmY3ZWYxMTY0ZWQzOiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICBjb25zdCByZXQgPSB0eXBlb2YgKGFyZzApID09PSAnc3RyaW5nJzsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX19fd2JpbmRnZW5faXNfdW5kZWZpbmVkXzI5YTQzYjRkNDI5MjBhYmQ6IGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAgPT09IHVuZGVmaW5lZDsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX19fd2JpbmRnZW5fanN2YWxfZXFfZDM0NjVkOGEwNzY5NzIyODogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMCA9PT0gYXJnMTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX19fd2JpbmRnZW5fbHRfNzhiYWIzODI2MjhmYjQ4ZjogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMCA8IGFyZzE7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX21lbW9yeV9kZmExMjA5NmY0MDBjOWJkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IHdhc20ubWVtb3J5OwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9tb2R1bGVfYjVlNmZiOTVkYmRiN2Q3ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBjb25zdCByZXQgPSB3YXNtTW9kdWxlOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9uZWdfOGQzOWQyM2VmNjVjOWZkYjogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gLWFyZzA7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX3NobF9jN2VhNDE3MzM4N2ExNjY5OiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICBjb25zdCByZXQgPSBhcmcwIDw8IGFyZzE7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX3Nocl80MzY1NTNjYmFlZjQxYTY2OiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICBjb25zdCByZXQgPSBhcmcwID4+IGFyZzE7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX3N0cmluZ19nZXRfN2VkNTMyMjk5MWNhYWVjNTogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3Qgb2JqID0gYXJnMTsKICAgICAgICAgICAgY29uc3QgcmV0ID0gdHlwZW9mIChvYmopID09PSAnc3RyaW5nJyA/IG9iaiA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgdmFyIHB0cjEgPSBpc0xpa2VOb25lKHJldCkgPyAwIDogcGFzc1N0cmluZ1RvV2FzbTAocmV0LCB3YXNtLl9fd2JpbmRnZW5fbWFsbG9jLCB3YXNtLl9fd2JpbmRnZW5fcmVhbGxvYyk7CiAgICAgICAgICAgIHZhciBsZW4xID0gV0FTTV9WRUNUT1JfTEVOOwogICAgICAgICAgICBnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwICsgNCAqIDEsIGxlbjEsIHRydWUpOwogICAgICAgICAgICBnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwICsgNCAqIDAsIHB0cjEsIHRydWUpOwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl90aHJvd182YjY0NDQ5YjliOWVkMzNjOiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICAgICAgICB9LAogICAgICAgIF9fd2JnX2NhbGxfYTI0NTkyYTZmMzQ5YTk3ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24gKGFyZzAsIGFyZzEsIGFyZzIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAuY2FsbChhcmcxLCBhcmcyKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgIH0sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19jcnlwdG9fMzhkZjJiYWIxMjZiNjNkYzogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMC5jcnlwdG87CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19lcnJvcl9hNmZhMjAyYjU4YWExY2QzOiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICBsZXQgZGVmZXJyZWQwXzA7CiAgICAgICAgICAgIGxldCBkZWZlcnJlZDBfMTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGRlZmVycmVkMF8wID0gYXJnMDsKICAgICAgICAgICAgICAgIGRlZmVycmVkMF8xID0gYXJnMTsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIHdhc20uX193YmluZGdlbl9mcmVlKGRlZmVycmVkMF8wLCBkZWZlcnJlZDBfMSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIF9fd2JnX2dldFJhbmRvbVZhbHVlc19jNDRhNTBkOGNmZGFlYmViOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICAgICAgYXJnMC5nZXRSYW5kb21WYWx1ZXMoYXJnMSk7CiAgICAgICAgICAgIH0sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19nZXRUaW1lX2RhN2M1NWY1MmI3MWU4YzY6IGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAuZ2V0VGltZSgpOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfaW5zdGFuY2VvZl9XaW5kb3dfY2M2NGM4NmM4ZWY5ZTAyYjogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFyZzAgaW5zdGFuY2VvZiBXaW5kb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKF8pIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJldCA9IHJlc3VsdDsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX2xlbmd0aF85ZjE3NzUyMjRjZjFkODE1OiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICBjb25zdCByZXQgPSBhcmcwLmxlbmd0aDsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX21zQ3J5cHRvX2JkNWEwMzRhZjk2YmNiYTY6IGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAubXNDcnlwdG87CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19uZXdfMF80ZDY1NzIwMWNlZDE0ZGUzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19uZXdfMjI3ZDdjMDU0MTRlYjg2MTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBjb25zdCByZXQgPSBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX25ld193aXRoX2xlbmd0aF84Yzg1NGU0MWVhNGRhZTliOiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICBjb25zdCByZXQgPSBuZXcgVWludDhBcnJheShhcmcwID4+PiAwKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX25vZGVfODRlYTg3NTQxMTI1NGRiMTogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMC5ub2RlOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfcHJvY2Vzc180NGM3YTE0ZTExZTlmNjllOiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICBjb25zdCByZXQgPSBhcmcwLnByb2Nlc3M7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19wcm90b3R5cGVzZXRjYWxsX2E2YjAyZWIwMGIwZjRjZTI6IGZ1bmN0aW9uIChhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGdldEFycmF5VThGcm9tV2FzbTAoYXJnMCwgYXJnMSksIGFyZzIpOwogICAgICAgIH0sCiAgICAgICAgX193YmdfcmFuZG9tRmlsbFN5bmNfNmMyNWVhYzk4NjllYjUzYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgICAgIGFyZzAucmFuZG9tRmlsbFN5bmMoYXJnMSk7CiAgICAgICAgICAgIH0sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19yZXF1aXJlX2I0ZWRiZGNmM2UyYTFlZjA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IG1vZHVsZS5yZXF1aXJlOwogICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgfSwgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIF9fd2JnX3N0YWNrXzNiMGQ5NzRiYmYzMWU0NGY6IGZ1bmN0aW9uIChhcmcwLCBhcmcxKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzEuc3RhY2s7CiAgICAgICAgICAgIGNvbnN0IHB0cjEgPSBwYXNzU3RyaW5nVG9XYXNtMChyZXQsIHdhc20uX193YmluZGdlbl9tYWxsb2MsIHdhc20uX193YmluZGdlbl9yZWFsbG9jKTsKICAgICAgICAgICAgY29uc3QgbGVuMSA9IFdBU01fVkVDVE9SX0xFTjsKICAgICAgICAgICAgZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCArIDQgKiAxLCBsZW4xLCB0cnVlKTsKICAgICAgICAgICAgZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCArIDQgKiAwLCBwdHIxLCB0cnVlKTsKICAgICAgICB9LAogICAgICAgIF9fd2JnX3N0YXJ0V29ya2Vyc184YjU4MmQ1N2U5MmJkMmQ0OiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMikgewogICAgICAgICAgICBoYW5kbGVFcnJvcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0V29ya2VycyBub3Qgc3VwcG9ydGVkIGZyb20gYSB3b3JrZXIgdGhyZWFkJyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBjb25zdCByZXQgPSBzdGFydFdvcmtlcnMoYXJnMCwgYXJnMSwgd2JnX3JheW9uX1Bvb2xCdWlsZGVyLl9fd3JhcChhcmcyKSk7CiAgICAgICAgICAgIC8vIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMXzhjZmFkYzg3YTI5N2NhMDI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gdHlwZW9mIGdsb2JhbCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogZ2xvYmFsOwogICAgICAgICAgICByZXR1cm4gaXNMaWtlTm9uZShyZXQpID8gMCA6IGFkZFRvRXh0ZXJucmVmVGFibGUwKHJldCk7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMX1RISVNfNjAyMjU2YWU1YzhmNDJjZjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBjb25zdCByZXQgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogZ2xvYmFsVGhpczsKICAgICAgICAgICAgcmV0dXJuIGlzTGlrZU5vbmUocmV0KSA/IDAgOiBhZGRUb0V4dGVybnJlZlRhYmxlMChyZXQpOwogICAgICAgIH0sCiAgICAgICAgX193Ymdfc3RhdGljX2FjY2Vzc29yX1NFTEZfZTQ0NWMxYzc0ODRhZWNjMzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBjb25zdCByZXQgPSB0eXBlb2Ygc2VsZiA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogc2VsZjsKICAgICAgICAgICAgcmV0dXJuIGlzTGlrZU5vbmUocmV0KSA/IDAgOiBhZGRUb0V4dGVybnJlZlRhYmxlMChyZXQpOwogICAgICAgIH0sCiAgICAgICAgX193Ymdfc3RhdGljX2FjY2Vzc29yX1dJTkRPV19mMjBlODU3NmVmMWUwZjE3OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHdpbmRvdzsKICAgICAgICAgICAgcmV0dXJuIGlzTGlrZU5vbmUocmV0KSA/IDAgOiBhZGRUb0V4dGVybnJlZlRhYmxlMChyZXQpOwogICAgICAgIH0sCiAgICAgICAgX193Ymdfc3ViYXJyYXlfZjhjYTQ2YTI1YjFmNWUwZDogZnVuY3Rpb24gKGFyZzAsIGFyZzEsIGFyZzIpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMC5zdWJhcnJheShhcmcxID4+PiAwLCBhcmcyID4+PiAwKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX3RvU3RyaW5nXzZkYzFhOTRlMGJkYmEzNzg6IGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAudG9TdHJpbmcoKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX3RvU3RyaW5nX2M5NmRjNzZkNTU0N2E3MTU6IGZ1bmN0aW9uIChhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzEudG9TdHJpbmcoYXJnMik7CiAgICAgICAgICAgIGNvbnN0IHB0cjEgPSBwYXNzU3RyaW5nVG9XYXNtMChyZXQsIHdhc20uX193YmluZGdlbl9tYWxsb2MsIHdhc20uX193YmluZGdlbl9yZWFsbG9jKTsKICAgICAgICAgICAgY29uc3QgbGVuMSA9IFdBU01fVkVDVE9SX0xFTjsKICAgICAgICAgICAgZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCArIDQgKiAxLCBsZW4xLCB0cnVlKTsKICAgICAgICAgICAgZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCArIDQgKiAwLCBwdHIxLCB0cnVlKTsKICAgICAgICB9LAogICAgICAgIF9fd2JnX3ZlcnNpb25zXzI3NmIyNzk1YjFjNmEyMTk6IGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAudmVyc2lvbnM7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMTogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgLy8gQ2FzdCBpbnRyaW5zaWMgZm9yIGBGNjQgLT4gRXh0ZXJucmVmYC4KICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMDsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAyOiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICAvLyBDYXN0IGludHJpbnNpYyBmb3IgYEkxMjggLT4gRXh0ZXJucmVmYC4KICAgICAgICAgICAgY29uc3QgcmV0ID0gKEJpZ0ludC5hc1VpbnROKDY0LCBhcmcwKSB8IChhcmcxIDw8IEJpZ0ludCg2NCkpKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAzOiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICAvLyBDYXN0IGludHJpbnNpYyBmb3IgYEk2NCAtPiBFeHRlcm5yZWZgLgogICAgICAgICAgICBjb25zdCByZXQgPSBhcmcwOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDQ6IGZ1bmN0aW9uIChhcmcwLCBhcmcxKSB7CiAgICAgICAgICAgIC8vIENhc3QgaW50cmluc2ljIGZvciBgUmVmKFNsaWNlKFU4KSkgLT4gTmFtZWRFeHRlcm5yZWYoIlVpbnQ4QXJyYXkiKWAuCiAgICAgICAgICAgIGNvbnN0IHJldCA9IGdldEFycmF5VThGcm9tV2FzbTAoYXJnMCwgYXJnMSk7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNTogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgLy8gQ2FzdCBpbnRyaW5zaWMgZm9yIGBSZWYoU3RyaW5nKSAtPiBFeHRlcm5yZWZgLgogICAgICAgICAgICBjb25zdCByZXQgPSBnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCwgYXJnMSk7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNjogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgLy8gQ2FzdCBpbnRyaW5zaWMgZm9yIGBVMTI4IC0+IEV4dGVybnJlZmAuCiAgICAgICAgICAgIGNvbnN0IHJldCA9IChCaWdJbnQuYXNVaW50Tig2NCwgYXJnMCkgfCAoQmlnSW50LmFzVWludE4oNjQsIGFyZzEpIDw8IEJpZ0ludCg2NCkpKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA3OiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICAvLyBDYXN0IGludHJpbnNpYyBmb3IgYFU2NCAtPiBFeHRlcm5yZWZgLgogICAgICAgICAgICBjb25zdCByZXQgPSBCaWdJbnQuYXNVaW50Tig2NCwgYXJnMCk7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diaW5kZ2VuX2luaXRfZXh0ZXJucmVmX3RhYmxlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gd2FzbS5fX3diaW5kZ2VuX2V4dGVybnJlZnM7CiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRhYmxlLmdyb3coNCk7CiAgICAgICAgICAgIHRhYmxlLnNldCgwLCB1bmRlZmluZWQpOwogICAgICAgICAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMCwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgdGFibGUuc2V0KG9mZnNldCArIDEsIG51bGwpOwogICAgICAgICAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMiwgdHJ1ZSk7CiAgICAgICAgICAgIHRhYmxlLnNldChvZmZzZXQgKyAzLCBmYWxzZSk7CiAgICAgICAgfSwKICAgICAgICBtZW1vcnk6IG1lbW9yeSB8fCBuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHsgaW5pdGlhbDogMjEsIG1heGltdW06IDE2Mzg0LCBzaGFyZWQ6IHRydWUgfSksCiAgICB9OwogICAgcmV0dXJuIHsKICAgICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgICAgIi4vdGZoZV9iZy5qcyI6IGltcG9ydDAsCiAgICB9Owp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBhZGRUb0V4dGVybnJlZlRhYmxlMAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZnVuY3Rpb24gYWRkVG9FeHRlcm5yZWZUYWJsZTAob2JqKSB7CiAgICBjb25zdCBpZHggPSB3YXNtLl9fZXh0ZXJucmVmX3RhYmxlX2FsbG9jKCk7CiAgICB3YXNtLl9fd2JpbmRnZW5fZXh0ZXJucmVmcy5zZXQoaWR4LCBvYmopOwogICAgcmV0dXJuIGlkeDsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gZGVidWdTdHJpbmcKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmZ1bmN0aW9uIGRlYnVnU3RyaW5nKHZhbCkgewogICAgLy8gcHJpbWl0aXZlIHR5cGVzCiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDsKICAgIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nIHx8IHZhbCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGAke3ZhbH1gOwogICAgfQogICAgaWYgKHR5cGUgPT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gYCIke3ZhbH0iYDsKICAgIH0KICAgIGlmICh0eXBlID09ICdzeW1ib2wnKSB7CiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB2YWwuZGVzY3JpcHRpb247CiAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICdTeW1ib2wnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGBTeW1ib2woJHtkZXNjcmlwdGlvbn0pYDsKICAgICAgICB9CiAgICB9CiAgICBpZiAodHlwZSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgY29uc3QgbmFtZSA9IHZhbC5uYW1lOwogICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJyAmJiBuYW1lLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIGBGdW5jdGlvbigke25hbWV9KWA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJ0Z1bmN0aW9uJzsKICAgICAgICB9CiAgICB9CiAgICAvLyBvYmplY3RzCiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsLmxlbmd0aDsKICAgICAgICBsZXQgZGVidWcgPSAnWyc7CiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgICAgICAgZGVidWcgKz0gZGVidWdTdHJpbmcodmFsWzBdKTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICBkZWJ1ZyArPSAnLCAnICsgZGVidWdTdHJpbmcodmFsW2ldKTsKICAgICAgICB9CiAgICAgICAgZGVidWcgKz0gJ10nOwogICAgICAgIHJldHVybiBkZWJ1ZzsKICAgIH0KICAgIC8vIFRlc3QgZm9yIGJ1aWx0LWluCiAgICBjb25zdCBidWlsdEluTWF0Y2hlcyA9IC9cW29iamVjdCAoW15cXV0rKVxdLy5leGVjKHRvU3RyaW5nLmNhbGwodmFsKSk7CiAgICBsZXQgY2xhc3NOYW1lOwogICAgaWYgKGJ1aWx0SW5NYXRjaGVzICYmIGJ1aWx0SW5NYXRjaGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICBjbGFzc05hbWUgPSBidWlsdEluTWF0Y2hlc1sxXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8vIEZhaWxlZCB0byBtYXRjaCB0aGUgc3RhbmRhcmQgJ1tvYmplY3QgQ2xhc3NOYW1lXScKICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpOwogICAgfQogICAgaWYgKGNsYXNzTmFtZSA9PSAnT2JqZWN0JykgewogICAgICAgIC8vIHdlJ3JlIGEgdXNlciBkZWZpbmVkIGNsYXNzIG9yIE9iamVjdAogICAgICAgIC8vIEpTT04uc3RyaW5naWZ5IGF2b2lkcyBwcm9ibGVtcyB3aXRoIGN5Y2xlcywgYW5kIGlzIGdlbmVyYWxseSBtdWNoCiAgICAgICAgLy8gZWFzaWVyIHRoYW4gbG9vcGluZyB0aHJvdWdoIG93blByb3BlcnRpZXMgb2YgYHZhbGAuCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuICdPYmplY3QoJyArIEpTT04uc3RyaW5naWZ5KHZhbCkgKyAnKSc7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChfKSB7CiAgICAgICAgICAgIHJldHVybiAnT2JqZWN0JzsKICAgICAgICB9CiAgICB9CiAgICAvLyBlcnJvcnMKICAgIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgIHJldHVybiBgJHt2YWwubmFtZX06ICR7dmFsLm1lc3NhZ2V9XG4ke3ZhbC5zdGFja31gOwogICAgfQogICAgLy8gVE9ETyB3ZSBjb3VsZCB0ZXN0IGZvciBtb3JlIHRoaW5ncyBoZXJlLCBsaWtlIGBTZXRgcyBhbmQgYE1hcGBzLgogICAgcmV0dXJuIGNsYXNzTmFtZTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gZ2V0QXJyYXlVOEZyb21XYXNtMAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZnVuY3Rpb24gZ2V0QXJyYXlVOEZyb21XYXNtMChwdHIsIGxlbikgewogICAgcHRyID0gcHRyID4+PiAwOwogICAgcmV0dXJuIGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc3ViYXJyYXkocHRyIC8gMSwgcHRyIC8gMSArIGxlbik7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIGNhY2hlZERhdGFWaWV3TWVtb3J5MAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKbGV0IGNhY2hlZERhdGFWaWV3TWVtb3J5MCA9IG51bGw7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBnZXREYXRhVmlld01lbW9yeTAKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmZ1bmN0aW9uIGdldERhdGFWaWV3TWVtb3J5MCgpIHsKICAgIGlmIChjYWNoZWREYXRhVmlld01lbW9yeTAgPT09IG51bGwgfHwgY2FjaGVkRGF0YVZpZXdNZW1vcnkwLmJ1ZmZlciAhPT0gd2FzbS5tZW1vcnkuYnVmZmVyKSB7CiAgICAgICAgY2FjaGVkRGF0YVZpZXdNZW1vcnkwID0gbmV3IERhdGFWaWV3KHdhc20ubWVtb3J5LmJ1ZmZlcik7CiAgICB9CiAgICByZXR1cm4gY2FjaGVkRGF0YVZpZXdNZW1vcnkwOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBnZXRTdHJpbmdGcm9tV2FzbTAKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmZ1bmN0aW9uIGdldFN0cmluZ0Zyb21XYXNtMChwdHIsIGxlbikgewogICAgcHRyID0gcHRyID4+PiAwOwogICAgcmV0dXJuIGRlY29kZVRleHQocHRyLCBsZW4pOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBjYWNoZWRVaW50OEFycmF5TWVtb3J5MAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKbGV0IGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwID0gbnVsbDsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIGdldFVpbnQ4QXJyYXlNZW1vcnkwCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpmdW5jdGlvbiBnZXRVaW50OEFycmF5TWVtb3J5MCgpIHsKICAgIGlmIChjYWNoZWRVaW50OEFycmF5TWVtb3J5MCA9PT0gbnVsbCB8fCBjYWNoZWRVaW50OEFycmF5TWVtb3J5MC5idWZmZXIgIT09IHdhc20ubWVtb3J5LmJ1ZmZlcikgewogICAgICAgIGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwID0gbmV3IFVpbnQ4QXJyYXkod2FzbS5tZW1vcnkuYnVmZmVyKTsKICAgIH0KICAgIHJldHVybiBjYWNoZWRVaW50OEFycmF5TWVtb3J5MDsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gaGFuZGxlRXJyb3IKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmZ1bmN0aW9uIGhhbmRsZUVycm9yKGYsIGFyZ3MpIHsKICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJncyk7CiAgICB9CiAgICBjYXRjaCAoZSkgewogICAgICAgIGNvbnN0IGlkeCA9IGFkZFRvRXh0ZXJucmVmVGFibGUwKGUpOwogICAgICAgIHdhc20uX193YmluZGdlbl9leG5fc3RvcmUoaWR4KTsKICAgIH0KfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gaXNMaWtlTm9uZQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZnVuY3Rpb24gaXNMaWtlTm9uZSh4KSB7CiAgICByZXR1cm4geCA9PT0gdW5kZWZpbmVkIHx8IHggPT09IG51bGw7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIHBhc3NTdHJpbmdUb1dhc20wCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpmdW5jdGlvbiBwYXNzU3RyaW5nVG9XYXNtMChhcmcsIG1hbGxvYywgcmVhbGxvYykgewogICAgaWYgKHJlYWxsb2MgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnN0IGJ1ZiA9IGNhY2hlZFRleHRFbmNvZGVyLmVuY29kZShhcmcpOwogICAgICAgIGNvbnN0IHB0ciA9IG1hbGxvYyhidWYubGVuZ3RoLCAxKSA+Pj4gMDsKICAgICAgICBnZXRVaW50OEFycmF5TWVtb3J5MCgpLnN1YmFycmF5KHB0ciwgcHRyICsgYnVmLmxlbmd0aCkuc2V0KGJ1Zik7CiAgICAgICAgV0FTTV9WRUNUT1JfTEVOID0gYnVmLmxlbmd0aDsKICAgICAgICByZXR1cm4gcHRyOwogICAgfQogICAgbGV0IGxlbiA9IGFyZy5sZW5ndGg7CiAgICBsZXQgcHRyID0gbWFsbG9jKGxlbiwgMSkgPj4+IDA7CiAgICBjb25zdCBtZW0gPSBnZXRVaW50OEFycmF5TWVtb3J5MCgpOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKDsgb2Zmc2V0IDwgbGVuOyBvZmZzZXQrKykgewogICAgICAgIGNvbnN0IGNvZGUgPSBhcmcuY2hhckNvZGVBdChvZmZzZXQpOwogICAgICAgIGlmIChjb2RlID4gMHg3RikKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgbWVtW3B0ciArIG9mZnNldF0gPSBjb2RlOwogICAgfQogICAgaWYgKG9mZnNldCAhPT0gbGVuKSB7CiAgICAgICAgaWYgKG9mZnNldCAhPT0gMCkgewogICAgICAgICAgICBhcmcgPSBhcmcuc2xpY2Uob2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgcHRyID0gcmVhbGxvYyhwdHIsIGxlbiwgbGVuID0gb2Zmc2V0ICsgYXJnLmxlbmd0aCAqIDMsIDEpID4+PiAwOwogICAgICAgIGNvbnN0IHZpZXcgPSBnZXRVaW50OEFycmF5TWVtb3J5MCgpLnN1YmFycmF5KHB0ciArIG9mZnNldCwgcHRyICsgbGVuKTsKICAgICAgICBjb25zdCByZXQgPSBjYWNoZWRUZXh0RW5jb2Rlci5lbmNvZGVJbnRvKGFyZywgdmlldyk7CiAgICAgICAgb2Zmc2V0ICs9IHJldC53cml0dGVuOwogICAgICAgIHB0ciA9IHJlYWxsb2MocHRyLCBsZW4sIG9mZnNldCwgMSkgPj4+IDA7CiAgICB9CiAgICBXQVNNX1ZFQ1RPUl9MRU4gPSBvZmZzZXQ7CiAgICByZXR1cm4gcHRyOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBjYWNoZWRUZXh0RGVjb2RlcgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKbGV0IGNhY2hlZFRleHREZWNvZGVyID0gKHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JywgeyBpZ25vcmVCT006IHRydWUsIGZhdGFsOiB0cnVlIH0pIDogdW5kZWZpbmVkKTsKCmlmIChjYWNoZWRUZXh0RGVjb2RlcikKICAgIGNhY2hlZFRleHREZWNvZGVyLmRlY29kZSgpOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gTUFYX1NBRkFSSV9ERUNPREVfQllURVMKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmNvbnN0IE1BWF9TQUZBUklfREVDT0RFX0JZVEVTID0gMjE0NjQzNTA3MjsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIG51bUJ5dGVzRGVjb2RlZAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKbGV0IG51bUJ5dGVzRGVjb2RlZCA9IDA7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBkZWNvZGVUZXh0Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpmdW5jdGlvbiBkZWNvZGVUZXh0KHB0ciwgbGVuKSB7CiAgICBudW1CeXRlc0RlY29kZWQgKz0gbGVuOwogICAgaWYgKG51bUJ5dGVzRGVjb2RlZCA+PSBNQVhfU0FGQVJJX0RFQ09ERV9CWVRFUykgewogICAgICAgIGNhY2hlZFRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcsIHsgaWdub3JlQk9NOiB0cnVlLCBmYXRhbDogdHJ1ZSB9KTsKICAgICAgICBjYWNoZWRUZXh0RGVjb2Rlci5kZWNvZGUoKTsKICAgICAgICBudW1CeXRlc0RlY29kZWQgPSBsZW47CiAgICB9CiAgICByZXR1cm4gY2FjaGVkVGV4dERlY29kZXIuZGVjb2RlKGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc2xpY2UocHRyLCBwdHIgKyBsZW4pKTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gY2FjaGVkVGV4dEVuY29kZXIKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmNvbnN0IGNhY2hlZFRleHRFbmNvZGVyID0gKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgVGV4dEVuY29kZXIoKSA6IHVuZGVmaW5lZCk7CgppZiAoY2FjaGVkVGV4dEVuY29kZXIpIHsKICAgIGNhY2hlZFRleHRFbmNvZGVyLmVuY29kZUludG8gPSBmdW5jdGlvbiAoYXJnLCB2aWV3KSB7CiAgICAgICAgY29uc3QgYnVmID0gY2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlKGFyZyk7CiAgICAgICAgdmlldy5zZXQoYnVmKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZWFkOiBhcmcubGVuZ3RoLAogICAgICAgICAgICB3cml0dGVuOiBidWYubGVuZ3RoCiAgICAgICAgfTsKICAgIH07Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFdBU01fVkVDVE9SX0xFTiBpcyBhIG1vZHVsZS1sZXZlbCB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgYnl0ZSBsZW5ndGggb2YKLy8gdGhlIGRhdGEganVzdCB3cml0dGVuIGludG8gV0FTTSBtZW1vcnkuIEl0IGFjdHMgYXMgYW4gb3V0LXBhcmFtZXRlci4KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmxldCBXQVNNX1ZFQ1RPUl9MRU4gPSAwOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gV0FTTSBtb2R1bGUgc3RhdGUKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmxldCB3YXNtTW9kdWxlLCB3YXNtOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gSW5pdDoKLy8gX193YmdfZmluYWxpemVfaW5pdAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZnVuY3Rpb24gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSwgbW9kdWxlLCB0aHJlYWRfc3RhY2tfc2l6ZSkgewogICAgd2FzbSA9IGluc3RhbmNlLmV4cG9ydHM7CiAgICB3YXNtTW9kdWxlID0gbW9kdWxlOwogICAgY2FjaGVkRGF0YVZpZXdNZW1vcnkwID0gbnVsbDsKICAgIGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwID0gbnVsbDsKICAgIGlmICh0eXBlb2YgdGhyZWFkX3N0YWNrX3NpemUgIT09ICd1bmRlZmluZWQnICYmICh0eXBlb2YgdGhyZWFkX3N0YWNrX3NpemUgIT09ICdudW1iZXInIHx8IHRocmVhZF9zdGFja19zaXplID09PSAwIHx8IHRocmVhZF9zdGFja19zaXplICUgNjU1MzYgIT09IDApKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHN0YWNrIHNpemUnKTsKICAgIH0KICAgIHdhc20uX193YmluZGdlbl9zdGFydCh0aHJlYWRfc3RhY2tfc2l6ZSk7CiAgICByZXR1cm4gd2FzbTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gSW5pdDoKLy8gX193YmdfbG9hZAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKYXN5bmMgZnVuY3Rpb24gX193YmdfbG9hZChtb2R1bGUsIGltcG9ydHMpIHsKICAgIGlmICh0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbicgJiYgbW9kdWxlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHsKICAgICAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcobW9kdWxlLCBpbXBvcnRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29uc3QgdmFsaWRSZXNwb25zZSA9IG1vZHVsZS5vayAmJiBleHBlY3RlZFJlc3BvbnNlVHlwZShtb2R1bGUudHlwZSk7CiAgICAgICAgICAgICAgICBpZiAodmFsaWRSZXNwb25zZSAmJiBtb2R1bGUuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpICE9PSAnYXBwbGljYXRpb24vd2FzbScpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oImBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ2AgZmFpbGVkIGJlY2F1c2UgeW91ciBzZXJ2ZXIgZG9lcyBub3Qgc2VydmUgV2FzbSB3aXRoIGBhcHBsaWNhdGlvbi93YXNtYCBNSU1FIHR5cGUuIEZhbGxpbmcgYmFjayB0byBgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVgIHdoaWNoIGlzIHNsb3dlci4gT3JpZ2luYWwgZXJyb3I6XG4iLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBtb2R1bGUuYXJyYXlCdWZmZXIoKTsKICAgICAgICByZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYnl0ZXMsIGltcG9ydHMpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShtb2R1bGUsIGltcG9ydHMpOwogICAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lkluc3RhbmNlKSB7CiAgICAgICAgICAgIHJldHVybiB7IGluc3RhbmNlLCBtb2R1bGUgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBleHBlY3RlZFJlc3BvbnNlVHlwZSh0eXBlKSB7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ2Jhc2ljJzoKICAgICAgICAgICAgY2FzZSAnY29ycyc6CiAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHQnOiByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBJbml0OgovLyBfX3diZ19pbml0Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgphc3luYyBmdW5jdGlvbiBfX3diZ19pbml0KG1vZHVsZV9vcl9wYXRoLCBtZW1vcnkpIHsKICAgIGlmICh3YXNtICE9PSB1bmRlZmluZWQpCiAgICAgICAgcmV0dXJuIHdhc207CiAgICBsZXQgdGhyZWFkX3N0YWNrX3NpemU7CiAgICBpZiAobW9kdWxlX29yX3BhdGggIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kdWxlX29yX3BhdGgpID09PSBPYmplY3QucHJvdG90eXBlKSB7CiAgICAgICAgICAgICh7IG1vZHVsZV9vcl9wYXRoLCBtZW1vcnksIHRocmVhZF9zdGFja19zaXplIH0gPSBtb2R1bGVfb3JfcGF0aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBjb25zb2xlLndhcm4oJ3VzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkJyk7CiAgICAgICAgfQogICAgfQogICAgLy8gICBpZiAobW9kdWxlX29yX3BhdGggPT09IHVuZGVmaW5lZCkgewogICAgLy8gICAgIG1vZHVsZV9vcl9wYXRoID0gbmV3IFVSTCgndGZoZV9iZy53YXNtJywgaW1wb3J0Lm1ldGEudXJsKTsKICAgIC8vICAgfQogICAgY29uc3QgaW1wb3J0cyA9IF9fd2JnX2dldF9pbXBvcnRzKG1lbW9yeSk7CiAgICAvLyAgIGlmICgKICAgIC8vICAgICB0eXBlb2YgbW9kdWxlX29yX3BhdGggPT09ICdzdHJpbmcnIHx8CiAgICAvLyAgICAgKHR5cGVvZiBSZXF1ZXN0ID09PSAnZnVuY3Rpb24nICYmIG1vZHVsZV9vcl9wYXRoIGluc3RhbmNlb2YgUmVxdWVzdCkgfHwKICAgIC8vICAgICAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJyAmJiBtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFVSTCkKICAgIC8vICAgKSB7CiAgICAvLyAgICAgbW9kdWxlX29yX3BhdGggPSBmZXRjaChtb2R1bGVfb3JfcGF0aCk7CiAgICAvLyAgIH0KICAgIGNvbnN0IHsgaW5zdGFuY2UsIG1vZHVsZSB9ID0gYXdhaXQgX193YmdfbG9hZChhd2FpdCBtb2R1bGVfb3JfcGF0aCwgaW1wb3J0cyk7CiAgICByZXR1cm4gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSwgbW9kdWxlLCB0aHJlYWRfc3RhY2tfc2l6ZSk7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vIFRoZSAndGZoZScgZ2xvYmFsIG9iamVjdAovLyA9PT09PT09PT09PT09PT09PT09PT09PT0KLy8gRmluYWwgdGZoZSBvYmplY3QgZ2xvYmFsIGRlY2xhcmF0aW9uIGNhbGxlZCBieSAnd2FpdEZvck1zZ1R5cGUnIG9ubHkKLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCnZhciB0ZmhlID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHsKICBfX3Byb3RvX186IG51bGwsCiAgZGVmYXVsdDogX193YmdfaW5pdCwKICB3YmdfcmF5b25fc3RhcnRfd29ya2VyOiB3YmdfcmF5b25fc3RhcnRfd29ya2VyLAp9KTsKCg==\";\n return await __newWorkerFromJsCodeBase64(workerBase64);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker initialization helpers\n////////////////////////////////////////////////////////////////////////////////\n\nasync function __createAndInitWorker(createWorker, workerInit, workerIndex, label) {\n let blobUrl = undefined;\n let worker = undefined;\n\n try {\n const result = await createWorker();\n worker = result.worker;\n blobUrl = result.blobUrl;\n\n _logger?.debug(`[Worker #${workerIndex}] - created with ${label}`);\n worker.postMessage(workerInit);\n await __waitForMsgType(worker, 'wasm_bindgen_worker_ready');\n\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n blobUrl = undefined;\n }\n\n _logger?.debug(`[Worker #${workerIndex}] - ready`);\n return worker;\n } catch (e) {\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n }\n\n if (worker) {\n try {\n await worker.terminate();\n } catch {\n // Preserve the worker creation/init error that triggered cleanup.\n }\n }\n\n throw e;\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Mode: `embedded-base64`\n */\nasync function __createAndInitWorkerFromEmbeddedBase64(workerInit, workerIndex) {\n return await __createAndInitWorker(\n () => __createWorkerFromBase64(),\n workerInit,\n workerIndex,\n 'embedded base64 worker',\n );\n}\n\n/**\n * Mode: `verified-blob`\n */\nasync function __createAndInitWorkerFromVerifiedBlob(workerInit, workerIndex) {\n return await __createAndInitWorker(\n () => __createWorkerFromVerifiedWorkerUrl(),\n workerInit,\n workerIndex,\n 'verified worker URL',\n );\n}\n\n/**\n * Mode: `trusted-direct-url`\n */\nasync function __createAndInitWorkerFromTrustedDirectUrl(workerInit, workerIndex) {\n return await __createAndInitWorker(\n () => __createWorkerFromTrustedDirectWorkerUrl(),\n workerInit,\n workerIndex,\n 'trusted direct worker URL',\n );\n}\n\n/**\n * Mode: `precheck-direct-url`\n */\nasync function __createAndInitWorkerFromCheckedDirectUrl(workerInit, workerIndex) {\n return await __createAndInitWorker(\n () => __createWorkerFromCheckedDirectWorkerUrl(),\n workerInit,\n workerIndex,\n 'checked direct worker URL',\n );\n}\n\n/**\n * Mode: `auto`\n */\nasync function __createAndInitWorkerAuto(workerInit, workerIndex) {\n if (_workerUrl) {\n try {\n /**\n * Mode: `verified-blob`\n */\n return await __createAndInitWorkerFromVerifiedBlob(workerInit, workerIndex);\n } catch (e) {\n if (__isSha256MismatchError(e)) {\n throw e;\n }\n\n _logger?.error(`[Worker #${workerIndex}] - verified worker URL failed; falling back to embedded base64`, e);\n }\n }\n\n try {\n /**\n * Mode: `embedded-base64`\n */\n return await __createAndInitWorkerFromEmbeddedBase64(workerInit, workerIndex);\n } catch (e) {\n throw new Error('All worker creation methods failed. Check CSP, COOP/COEP headers, and cross-origin policies.', {\n cause: e,\n });\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker load mode dispatcher\n////////////////////////////////////////////////////////////////////////////////\n\nasync function __createAndInitConfiguredWorker(workerInit, workerIndex) {\n switch (_wasmAssetLoadMode) {\n case 'embedded-base64':\n return await __createAndInitWorkerFromEmbeddedBase64(workerInit, workerIndex);\n\n case 'verified-blob':\n return await __createAndInitWorkerFromVerifiedBlob(workerInit, workerIndex);\n\n case 'precheck-direct-url':\n return await __createAndInitWorkerFromCheckedDirectUrl(workerInit, workerIndex);\n\n case 'trusted-direct-url':\n return await __createAndInitWorkerFromTrustedDirectUrl(workerInit, workerIndex);\n\n case 'auto':\n return await __createAndInitWorkerAuto(workerInit, workerIndex);\n\n default:\n throw new Error(`Unsupported wasmAssetLoadMode: ${_wasmAssetLoadMode}`);\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker pool lifecycle\n////////////////////////////////////////////////////////////////////////////////\n\nasync function startWorkers(module, memory, builder) {\n if (_started) {\n throw new Error('Already started');\n }\n\n _started = true;\n _starting = true;\n\n try {\n if (_terminating) {\n throw new Error('Cannot start workers while termination is in progress');\n }\n\n if (builder.numThreads() === 0) {\n throw new Error(`num_threads must be > 0.`);\n }\n\n const workerInit = {\n type: 'wasm_bindgen_worker_init',\n init: { module_or_path: module, memory },\n receiver: builder.receiver(),\n };\n const results = await Promise.allSettled(\n Array.from({ length: builder.numThreads() }, async (_, workerIndex) => {\n return await __createAndInitConfiguredWorker(workerInit, workerIndex);\n }),\n );\n\n const workers = [];\n const errors = [];\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n workers.push(result.value);\n } else {\n errors.push(result.reason);\n }\n }\n\n if (errors.length > 0) {\n await Promise.allSettled(workers.map((w) => w.terminate()));\n throw errors[0];\n }\n\n _workers = workers;\n builder.build();\n } finally {\n _starting = false;\n // Drop the verified-bytes cache: each spawned worker now holds its own copy\n // of the script (via Blob URL or eval source), so the SDK no longer needs\n // to keep the bytes around. On failure the module is one-shot anyway, so\n // the cache would never be reused.\n _verifiedWorkerUrlBytesPromise = undefined;\n }\n}\n\nasync function terminateWorkers() {\n if (_starting) {\n throw new Error('Cannot terminate while startWorkers() is in progress. Await the startWorkers() promise first.');\n }\n\n if (_terminating) {\n return _terminating;\n }\n\n if (!_workers) {\n return;\n }\n\n const workers = _workers;\n _workers = undefined;\n _terminating = Promise.allSettled(workers.map((w) => w.terminate()));\n\n return _terminating;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Public exports\n////////////////////////////////////////////////////////////////////////////////\n\nexport { getTfheWorkers, startWorkers, terminateWorkers, setWorkerUrlConfig };\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8DA,SAAS,kBAAkB;AACzB,SACE,OAAO,QAAQ,eACf,OAAO,YAAY,eACnB,OAAO,qBAAqB,cAC5B,OAAO,wBAAwB;AAEnC;AAEA,MAAM,uBAAuB,CAAC,mBAAmB,iBAAiB,uBAAuB,sBAAsB,MAAM;AAErH,SAAS,sBAAsB,OAAO;AACpC,SAAO,qBAAqB,SAAS,KAAK;AAC5C;AAMA,SAAS,aAAa,OAAO;AAC3B,SAAO,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACvE;AAOA,eAAe,SAAS,OAAO;AAC7B,MAAI,gBAAgB,GAAG;AACrB,QAAI,OAAO,WAAW,eAAe,CAAC,OAAO,UAAU,OAAO,OAAO,OAAO,WAAW,YAAY;AACjG,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAEA,UAAM,OAAO,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AACxD,WAAO,aAAa,IAAI,WAAW,IAAI,CAAC;AAAA,EAC1C;AAEA,QAAM,iBAAiB;AACvB,QAAM,eAAe,QAAQ,cAAc;AAC3C,QAAM,EAAE,WAAW,IAAI,MAAM;AAAA;AAAA,IAA0B;AAAA;AACvD,SAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,WAAW,KAAK,CAAC,EAAE,OAAO,KAAK;AACxE;
|
|
4
|
+
"sourcesContent": ["/**\n * Auto-generated from scripts/wasm/tfhe/startWorkers.template.js.\n * Embedded worker base64 payload SHA-256: c6beb212e48e93e3813f82c35f96125dae236d4369aed0b3992adcb4c925cb52\n */\n\n/**\n * Worker load mode security guarantees:\n *\n * embedded-base64 Integrity: build-time. Inherits the JS bundle's integrity.\n * verified-blob Integrity: runtime SHA-256 of fetched bytes; executed bytes\n * are the verified bytes themselves.\n * precheck-direct-url No integrity guarantee. The SDK fetches the URL once and\n * validates SHA-256, then the runtime fetches the URL a\n * second time and executes those (unverified) bytes. Use\n * for fail-fast on misconfigured URLs / wrong builds, not\n * for protection against on-path or CDN-edge tampering.\n * trusted-direct-url No integrity check. Use only when the URL is fully trusted\n * (e.g., same-origin static asset).\n * auto Tries verified-blob if workerUrl is set, falls back to\n * embedded-base64 on any non-SHA-256 error. SHA-256 mismatch\n * is always fatal and never falls back.\n */\n\n/**\n * Module invariants.\n *\n * Lifecycle (one-shot, no retry):\n * - setWorkerUrlConfig() and startWorkers() each at most once.\n * - A failed startWorkers() locks the module; no retry, no reconfigure.\n * - terminateWorkers() throws while startWorkers() is in flight; idempotent after.\n *\n * Concurrency:\n * - _started and _starting are check-and-set without intervening await.\n * - Parallel workers dedupe to a single fetch+verify (cached promise).\n *\n * Security:\n * - SHA-256 mismatch (Sha256MismatchError) is always fatal \u2014 never falls back.\n * - Hash is the build-time constant \"348fe6c2e77bafe0cbfb9c0a512af99b5f97de1119ceadf07cc34620dbc5690e\".\n * - auto silently falls back to embedded-base64 on any non-SHA-256 error.\n * - precheck-direct-url's SHA-256 check is informational; the runtime refetches.\n *\n * Errors:\n * - Partial worker-pool failure: successful workers are terminated before throw.\n * - Concurrent failures: only the first error is surfaced.\n * - __waitForMsgType has no timeout \u2014 a silent worker hangs startWorkers().\n *\n * Resources:\n * - Blob URLs are revoked on both success and synchronous-constructor failure.\n * - _verifiedWorkerUrlBytesPromise is cleared in startWorkers()'s finally.\n * - _workers is a strong reference (owns the shared WebAssembly memory).\n * - __waitForMsgType listeners are not removed if the worker never replies.\n *\n * Caller contract:\n * - workerUrl: URL instance (required for verified/checked/trusted-direct-url).\n * - logger: must expose debug(message) and error(message, cause).\n * - wasmAssetLoadMode: one of __wasmAssetLoadModes.\n */\n\n////////////////////////////////////////////////////////////////////////////////\n// Runtime detection and load modes\n////////////////////////////////////////////////////////////////////////////////\n\nfunction __isBrowserLike() {\n return (\n typeof Bun === 'undefined' &&\n typeof process === 'undefined' &&\n typeof addEventListener === 'function' &&\n typeof removeEventListener === 'function'\n );\n}\n\nconst __wasmAssetLoadModes = ['embedded-base64', 'verified-blob', 'precheck-direct-url', 'trusted-direct-url', 'auto'];\n\nfunction __isWasmAssetLoadMode(value) {\n return __wasmAssetLoadModes.includes(value);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// SHA-256 verification\n////////////////////////////////////////////////////////////////////////////////\n\nfunction __bytesToHex(bytes) {\n return [...bytes].map((b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Computes the SHA-256 digest of worker bytes and returns it as lowercase hex.\n * @param {ArrayBuffer | Uint8Array} bytes Worker bytes to hash.\n * @returns {Promise<string>} Lowercase hexadecimal SHA-256 digest without a `0x` prefix.\n */\nasync function __sha256(bytes) {\n if (__isBrowserLike()) {\n if (typeof crypto === 'undefined' || !crypto.subtle || typeof crypto.subtle.digest !== 'function') {\n throw new Error('Web Crypto SHA-256 digest is not available');\n }\n\n const hash = await crypto.subtle.digest('SHA-256', bytes);\n return __bytesToHex(new Uint8Array(hash));\n }\n\n const nodeModuleName = 'crypto';\n const nodeModuleId = `node:${nodeModuleName}`;\n const { createHash } = await import(/* @vite-ignore */ nodeModuleId);\n return createHash('sha256').update(new Uint8Array(bytes)).digest('hex');\n}\n\n/**\n * Verifies that worker bytes match the expected SHA-256 digest.\n * @param {ArrayBuffer | Uint8Array} bytes Worker bytes to verify.\n * @param {string} expectedSha256 Expected lowercase hex digest without a `0x` prefix.\n * @param {string} url Url to verify.\n * @returns {Promise<void>} Resolves when the digest matches.\n * @throws {Error} Throws a `Sha256MismatchError` when the digest does not match.\n */\nasync function __verifySha256(bytes, expectedSha256, url) {\n const actualSha256 = await __sha256(bytes);\n\n if (actualSha256 !== expectedSha256) {\n const error = new Error(`SHA-256 mismatch: expected ${expectedSha256}, got ${actualSha256}. url=${url}`);\n error.name = 'Sha256MismatchError';\n throw error;\n }\n}\n\nfunction __isSha256MismatchError(error) {\n return error?.name === 'Sha256MismatchError';\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker URL byte loading\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Reads worker script bytes from a URL and verifies their SHA-256 digest.\n * @param {URL} url Worker script URL.\n * @param {string} expectedSha256 Expected lowercase hex digest without a `0x` prefix.\n * @returns {Promise<ArrayBuffer | Uint8Array>} Verified worker script bytes.\n */\nasync function __fetchAndVerifyWorkerUrlBytes(url, expectedSha256) {\n const bytes = await __readWorkerUrlBytes(url);\n\n await __verifySha256(bytes, expectedSha256, url);\n\n return bytes;\n}\n\n/**\n * Reads worker script bytes from a URL.\n * Uses the filesystem for Node `file:` URLs, otherwise falls back to `fetch`.\n * Assumes `fetch` exists for non-`file:` URLs.\n * @param {URL} url Worker script URL.\n * @returns {Promise<ArrayBuffer | Uint8Array>} Raw worker script bytes.\n */\nasync function __readWorkerUrlBytes(url) {\n if (!__isBrowserLike() && url.protocol === 'file:') {\n const fsModuleName = 'fs/promises';\n const fsModuleId = `node:${fsModuleName}`;\n const urlModuleName = 'url';\n const urlModuleId = `node:${urlModuleName}`;\n const { readFile } = await import(/* @vite-ignore */ fsModuleId);\n const { fileURLToPath } = await import(/* @vite-ignore */ urlModuleId);\n return await readFile(fileURLToPath(url));\n }\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch worker: ${response.status} ${response.statusText}`);\n }\n\n return await response.arrayBuffer();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker construction primitives\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Creates a browser module Worker from a Blob.\n * Browser-only: creates a Blob URL and returns it so the caller can revoke it after worker startup.\n * @param {Blob} blob JavaScript worker source Blob.\n * @returns {Promise<{ worker: Worker, blobUrl: string }>} Created browser worker and Blob URL to revoke.\n */\nasync function __newBrowserWorkerFromBlob(blob) {\n const blobUrl = URL.createObjectURL(blob);\n\n try {\n const worker = new Worker(blobUrl, {\n type: 'module',\n name: 'wasm_bindgen_worker',\n });\n\n return { worker, blobUrl };\n } catch (e) {\n URL.revokeObjectURL(blobUrl);\n throw e;\n }\n}\n\n/**\n * Creates a module Worker that loads its script directly from a URL object, isomorphically.\n * Browsers use the global Worker; Node uses worker_threads' Worker.\n * @param {URL} url Worker script URL.\n * @returns {Promise<Worker>} Created worker.\n */\nasync function __newIsomorphicWorkerFromUrl(url) {\n if (__isBrowserLike()) {\n return new Worker(url, {\n type: 'module',\n name: 'wasm_bindgen_worker',\n });\n }\n\n const nodeModuleName = 'worker_threads';\n const nodeModuleId = `node:${nodeModuleName}`;\n const { Worker: NodeWorker } = await import(/* @vite-ignore */ nodeModuleId);\n return new NodeWorker(url);\n}\n\nasync function __newNodeWorkerFromJsCode(jsCode) {\n const nodeModuleName = 'worker_threads';\n const nodeModuleId = `node:${nodeModuleName}`;\n const { Worker: NodeWorker } = await import(/* @vite-ignore */ nodeModuleId);\n return { worker: new NodeWorker(jsCode, { eval: true }), blobUrl: undefined };\n}\n\n/**\n * Creates a worker from already verified JavaScript source bytes.\n * 1. Caller must provide bytes returned by the SHA-256 verification path.\n * 2. In browsers, wrap the verified bytes in a Blob URL and create a module Worker.\n * 3. In Node, decode the verified bytes as UTF-8 JavaScript and create a worker_threads eval Worker.\n * @param {ArrayBuffer | Uint8Array} verifiedJsCodeBytes SHA-256 verified JavaScript source bytes.\n * @returns {Promise<{ worker: Worker, blobUrl: string | undefined }>} Created worker and optional Blob URL to revoke.\n */\nasync function __newIsomorphicWorkerFromVerifiedJsCodeBytes(verifiedJsCodeBytes) {\n if (__isBrowserLike()) {\n return await __newBrowserWorkerFromBlob(\n new Blob([verifiedJsCodeBytes], {\n type: 'application/javascript',\n }),\n );\n }\n\n return await __newNodeWorkerFromJsCode(Buffer.from(verifiedJsCodeBytes).toString('utf-8'));\n}\n\n/**\n * Creates a worker from the SDK-embedded base64 JavaScript source.\n * 1. In browsers, decode the base64 source into a Blob URL and create a module Worker.\n * 2. In Node, decode the base64 source into UTF-8 JavaScript and create a worker_threads eval Worker.\n * @param {string} jsCodeBase64 Base64-encoded JavaScript worker source.\n * @returns {Promise<{ worker: Worker, blobUrl: string | undefined }>} Created worker and optional Blob URL to revoke.\n */\nasync function __newWorkerFromJsCodeBase64(jsCodeBase64) {\n if (__isBrowserLike()) {\n const blob = new Blob([atob(jsCodeBase64)], {\n type: 'application/javascript',\n });\n\n const blobUrl = URL.createObjectURL(blob);\n\n try {\n const worker = new Worker(blobUrl, {\n type: 'module',\n name: 'wasm_bindgen_worker',\n });\n\n return { worker, blobUrl };\n } catch (e) {\n URL.revokeObjectURL(blobUrl);\n throw e;\n }\n }\n\n const code = Buffer.from(jsCodeBase64, 'base64').toString('utf-8');\n return await __newNodeWorkerFromJsCode(code);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker message protocol\n////////////////////////////////////////////////////////////////////////////////\n\nfunction __waitForMsgType(target, type) {\n return new Promise((resolve, reject) => {\n function cleanup() {\n if (typeof target.removeEventListener === 'function') {\n target.removeEventListener('message', onBrowserMsg);\n target.removeEventListener('error', onBrowserError);\n } else {\n target.off('message', onNodeMsg);\n target.off('error', onNodeError);\n target.off('exit', onNodeExit);\n }\n }\n\n function onBrowserMsg({ data }) {\n if (data?.type !== type) return;\n cleanup();\n resolve(data);\n }\n\n function onBrowserError(e) {\n cleanup();\n reject(e.error || new Error('Worker error'));\n }\n\n function onNodeMsg(data) {\n if (data?.type !== type) return;\n cleanup();\n resolve(data);\n }\n\n function onNodeError(err) {\n cleanup();\n reject(err);\n }\n\n function onNodeExit(code) {\n cleanup();\n reject(new Error(`Worker exited with code ${code}`));\n }\n\n if (typeof target.removeEventListener === 'function') {\n target.addEventListener('message', onBrowserMsg);\n target.addEventListener('error', onBrowserError);\n } else {\n target.on('message', onNodeMsg);\n target.on('error', onNodeError);\n target.on('exit', onNodeExit);\n }\n });\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Module state\n////////////////////////////////////////////////////////////////////////////////\n\nlet _terminating;\nlet _configSet = false;\nlet _workerUrl = undefined;\nlet _wasmAssetLoadMode = 'auto';\nconst _workerUrlSha256 = \"348fe6c2e77bafe0cbfb9c0a512af99b5f97de1119ceadf07cc34620dbc5690e\";\nlet _verifiedWorkerUrlBytesPromise = undefined;\nlet _logger = undefined;\nlet _started = false;\n// True only while the body of startWorkers() is executing.\n// Reset by the try/finally in startWorkers, so a failed start still allows\n// terminateWorkers() to be called (and become a no-op when _workers is unset).\nlet _starting = false;\n\n// Keep workers strongly referenced while they own shared WebAssembly memory.\nlet _workers;\n\nfunction getTfheWorkers() {\n return _workers;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Configuration API\n////////////////////////////////////////////////////////////////////////////////\n\nfunction __assertLogger(logger) {\n if (logger === undefined) {\n return;\n }\n\n if (typeof logger.debug !== 'function' || typeof logger.error !== 'function') {\n throw new TypeError('logger must expose debug(message) and error(message, cause) functions');\n }\n}\n\nfunction setWorkerUrlConfig(parameters = {}) {\n if (_configSet) {\n throw new Error('Cannot set worker URL config: config was already set');\n }\n\n if (_started) {\n throw new Error('Cannot set worker URL config after workers have started');\n }\n\n if (parameters === null || typeof parameters !== 'object') {\n throw new TypeError('setWorkerUrlConfig parameters must be an object');\n }\n\n const { workerUrl = undefined, wasmAssetLoadMode = 'auto', logger = undefined } = parameters;\n\n // Check `wasmAssetLoadMode`\n if (!__isWasmAssetLoadMode(wasmAssetLoadMode)) {\n throw new TypeError(`wasmAssetLoadMode must be one of: ${__wasmAssetLoadModes.join(', ')}`);\n }\n\n // Check `workerUrl`\n if (workerUrl !== undefined) {\n if (!(workerUrl instanceof URL)) {\n throw new TypeError('workerUrl must be a URL');\n }\n _workerUrl = workerUrl;\n } else {\n if (\n wasmAssetLoadMode === 'verified-blob' ||\n wasmAssetLoadMode === 'precheck-direct-url' ||\n wasmAssetLoadMode === 'trusted-direct-url'\n ) {\n throw new Error(`workerUrl is required when wasmAssetLoadMode is \"${wasmAssetLoadMode}\"`);\n }\n }\n\n // Check `logger`\n __assertLogger(logger);\n\n _wasmAssetLoadMode = wasmAssetLoadMode;\n _logger = logger;\n _configSet = true;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker source strategies\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Returns the cached verification promise for the configured worker URL.\n * The first call reads `_workerUrl` and verifies it against `_workerUrlSha256`; later calls reuse the same promise\n * so parallel workers do not refetch or rehash the script.\n * @returns {Promise<ArrayBuffer | Uint8Array>} Verified worker script bytes.\n * @throws {Error} If no worker URL is configured.\n */\nfunction __getVerifiedWorkerUrlBytesPromise() {\n const workerUrl = _workerUrl;\n\n if (workerUrl === undefined) {\n throw new Error('workerUrl is required to verify worker URL bytes');\n }\n\n if (_verifiedWorkerUrlBytesPromise !== undefined) {\n return _verifiedWorkerUrlBytesPromise;\n }\n\n _verifiedWorkerUrlBytesPromise = __fetchAndVerifyWorkerUrlBytes(workerUrl, _workerUrlSha256);\n return _verifiedWorkerUrlBytesPromise;\n}\n\n/**\n * Creates a worker from the configured URL after SHA-256 verification.\n * 1. Reuse cached verified bytes.\n * 2. Execute those exact bytes as a Blob worker in browsers.\n * 3. Execute those exact bytes as an eval worker in Node.\n * @returns {Promise<{ worker: Worker, blobUrl: string | undefined }>} Created worker and optional Blob URL to revoke.\n */\nasync function __createWorkerFromVerifiedWorkerUrl() {\n const verifiedWorkerBytes = await __getVerifiedWorkerUrlBytesPromise();\n return await __newIsomorphicWorkerFromVerifiedJsCodeBytes(verifiedWorkerBytes);\n}\n\n/**\n * Creates a worker by passing the configured URL directly to the runtime.\n * 1. Require a configured worker URL.\n * 2. Do not perform SDK byte verification.\n * 3. Let the browser or Node runtime load and execute the URL directly.\n * @returns {Promise<{ worker: Worker, blobUrl: undefined }>} Created worker with no Blob URL to revoke.\n */\nasync function __createWorkerFromTrustedDirectWorkerUrl() {\n if (_workerUrl === undefined) {\n throw new Error('workerUrl is required to create a trusted direct worker');\n }\n\n return { worker: await __newIsomorphicWorkerFromUrl(_workerUrl), blobUrl: undefined };\n}\n\n/**\n * Creates a worker by passing the configured URL directly to the runtime, after a pre-flight SHA-256 probe.\n *\n * IMPORTANT: this is NOT an integrity check. The SDK fetches the URL once to validate\n * the hash, then hands the URL to the runtime, which fetches it a SECOND time and\n * executes those bytes. The two fetches are independent \u2014 the executed bytes are\n * never verified. Use only for fail-fast on misconfigured URLs / build mismatches.\n *\n * For an actual integrity guarantee, use `verified-blob` (requires CSP allowing blob: workers).\n *\n * 1. Fetch the URL and verify its SHA-256 against \"348fe6c2e77bafe0cbfb9c0a512af99b5f97de1119ceadf07cc34620dbc5690e\" \u2014 fails fast on mismatch.\n * 2. Discard the verified bytes.\n * 3. Let the runtime fetch the same URL again and execute it (no verification on this fetch).\n * @returns {Promise<{ worker: Worker, blobUrl: undefined }>} Created worker with no Blob URL to revoke.\n */\nasync function __createWorkerFromCheckedDirectWorkerUrl() {\n await __getVerifiedWorkerUrlBytesPromise();\n return await __createWorkerFromTrustedDirectWorkerUrl();\n}\n\n/**\n * Creates a worker from the SDK-embedded base64 worker source.\n * 1. Read the base64-encoded JavaScript source baked into this module.\n * 2. Decode into a Blob URL and create a module Worker in browsers.\n * 3. Decode into UTF-8 JavaScript and create a worker_threads eval Worker in Node.\n * @returns {Promise<{ worker: Worker, blobUrl: string | undefined }>} Created worker and optional Blob URL to revoke.\n */\nasync function __createWorkerFromBase64() {\n const workerBase64 = \"ZnVuY3Rpb24gX19faXNCcm93c2VyTGlrZSgpIHsKICByZXR1cm4gKAogICAgdHlwZW9mIGFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiYKICAgIHR5cGVvZiByZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nCiAgKTsKfQoKYXN5bmMgZnVuY3Rpb24gX19fZ2V0VGFyZ2V0KCkgewogIGlmIChfX19pc0Jyb3dzZXJMaWtlKCkpIHJldHVybiBzZWxmOwogIGNvbnN0IG5vZGVNb2R1bGVOYW1lID0gJ3dvcmtlcl90aHJlYWRzJzsKICBjb25zdCBub2RlTW9kdWxlSWQgPSBgbm9kZToke25vZGVNb2R1bGVOYW1lfWA7CiAgY29uc3QgeyBwYXJlbnRQb3J0IH0gPSBhd2FpdCBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIG5vZGVNb2R1bGVJZCk7CiAgcmV0dXJuIHBhcmVudFBvcnQ7Cn0KCmZ1bmN0aW9uIF9fX3dhaXRGb3JNc2dUeXBlKHRhcmdldCwgdHlwZSkgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaWYgKHR5cGVvZiB0YXJnZXQub24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgLy8gTm9kZTogRXZlbnRFbWl0dGVyLCBkYXRhIHBhc3NlZCBkaXJlY3RseQogICAgICB0YXJnZXQub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiBvbk1zZyhkYXRhKSB7CiAgICAgICAgaWYgKGRhdGE/LnR5cGUgIT09IHR5cGUpIHJldHVybjsKICAgICAgICB0YXJnZXQub2ZmKCdtZXNzYWdlJywgb25Nc2cpOwogICAgICAgIHJlc29sdmUoZGF0YSk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgLy8gQnJvd3NlcjogRE9NIGV2ZW50cywgZGF0YSB3cmFwcGVkIGluIE1lc3NhZ2VFdmVudAogICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIG9uTXNnKHsgZGF0YSB9KSB7CiAgICAgICAgaWYgKGRhdGE/LnR5cGUgIT09IHR5cGUpIHJldHVybjsKICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTXNnKTsKICAgICAgICByZXNvbHZlKGRhdGEpOwogICAgICB9KTsKICAgIH0KICB9KTsKfQoKX19fZ2V0VGFyZ2V0KCkudGhlbigodGFyZ2V0KSA9PgogIF9fX3dhaXRGb3JNc2dUeXBlKHRhcmdldCwgJ3dhc21fYmluZGdlbl93b3JrZXJfaW5pdCcpLnRoZW4oCiAgICBhc3luYyAoeyBpbml0LCByZWNlaXZlciB9KSA9PiB7CiAgICAgIGNvbnN0IHBrZyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0ZmhlOwogICAgICB9KTsKICAgICAgYXdhaXQgcGtnLmRlZmF1bHQoaW5pdCk7CiAgICAgIHRhcmdldC5wb3N0TWVzc2FnZSh7IHR5cGU6ICd3YXNtX2JpbmRnZW5fd29ya2VyX3JlYWR5JyB9KTsKICAgICAgcGtnLndiZ19yYXlvbl9zdGFydF93b3JrZXIocmVjZWl2ZXIpOwogICAgfSwKICApLAopOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSByZWNlaXZlcgogKi8KZnVuY3Rpb24gd2JnX3JheW9uX3N0YXJ0X3dvcmtlcihyZWNlaXZlcikgewogIHdhc20ud2JnX3JheW9uX3N0YXJ0X3dvcmtlcihyZWNlaXZlcik7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIEludGVybmFsIHdhc21iaW5kZ2VuIHRvb2xzCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBJbXBvcnRzOgovLyBfX3diZ19nZXRfaW1wb3J0cwovLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZnVuY3Rpb24gX193YmdfZ2V0X2ltcG9ydHMobWVtb3J5KSB7CiAgICBjb25zdCBpbXBvcnQwID0gewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICBfX3diZ19CaWdJbnRfNjViY2VhMjUxZTc4ODA4MzogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gQmlnSW50KGFyZzApOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfQmlnSW50X2NjYmNhNzkzZjQ1NmU1ODI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBCaWdJbnQoYXJnMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICB9LCBhcmd1bWVudHMpOwogICAgICAgIH0sCiAgICAgICAgX193YmdfRXJyb3JfOTYwYzE1NWQzZDQ5ZTRjMjogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX19fd2JpbmRnZW5fYmlnaW50X2dldF9hc19pNjRfM2QzYWJhNWQ2MTZjNmE1MTogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3QgdiA9IGFyZzE7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IHR5cGVvZiAodikgPT09ICdiaWdpbnQnID8gdiA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0QmlnSW50NjQoYXJnMCArIDggKiAxLCBpc0xpa2VOb25lKHJldCkgPyBCaWdJbnQoMCkgOiByZXQsIHRydWUpOwogICAgICAgICAgICBnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwICsgNCAqIDAsICFpc0xpa2VOb25lKHJldCksIHRydWUpOwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9iaXRfYW5kXzk2ZjY5NmM1NmI0OTUwZDU6IGZ1bmN0aW9uIChhcmcwLCBhcmcxKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAgJiBhcmcxOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9iaXRfb3JfZDU2NGMyNzUxZmRhYzZjOTogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMCB8IGFyZzE7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX2RlYnVnX3N0cmluZ19hYjRiMzRkMjNkNjc3OGJkOiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICBjb25zdCByZXQgPSBkZWJ1Z1N0cmluZyhhcmcxKTsKICAgICAgICAgICAgY29uc3QgcHRyMSA9IHBhc3NTdHJpbmdUb1dhc20wKHJldCwgd2FzbS5fX3diaW5kZ2VuX21hbGxvYywgd2FzbS5fX3diaW5kZ2VuX3JlYWxsb2MpOwogICAgICAgICAgICBjb25zdCBsZW4xID0gV0FTTV9WRUNUT1JfTEVOOwogICAgICAgICAgICBnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwICsgNCAqIDEsIGxlbjEsIHRydWUpOwogICAgICAgICAgICBnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwICsgNCAqIDAsIHB0cjEsIHRydWUpOwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9pc19mdW5jdGlvbl8zYmFhOWRiMWE5ODdmNDdkOiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICBjb25zdCByZXQgPSB0eXBlb2YgKGFyZzApID09PSAnZnVuY3Rpb24nOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9pc19vYmplY3RfNjMzMjJlYzBjZDZlYTRlZjogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgY29uc3QgdmFsID0gYXJnMDsKICAgICAgICAgICAgY29uc3QgcmV0ID0gdHlwZW9mICh2YWwpID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGw7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX2lzX3N0cmluZ182ZGYzYmY3ZWYxMTY0ZWQzOiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICBjb25zdCByZXQgPSB0eXBlb2YgKGFyZzApID09PSAnc3RyaW5nJzsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX19fd2JpbmRnZW5faXNfdW5kZWZpbmVkXzI5YTQzYjRkNDI5MjBhYmQ6IGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAgPT09IHVuZGVmaW5lZDsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX19fd2JpbmRnZW5fanN2YWxfZXFfZDM0NjVkOGEwNzY5NzIyODogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMCA9PT0gYXJnMTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX19fd2JpbmRnZW5fbHRfNzhiYWIzODI2MjhmYjQ4ZjogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMCA8IGFyZzE7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX21lbW9yeV9kZmExMjA5NmY0MDBjOWJkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IHdhc20ubWVtb3J5OwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9tb2R1bGVfYjVlNmZiOTVkYmRiN2Q3ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBjb25zdCByZXQgPSB3YXNtTW9kdWxlOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl9uZWdfOGQzOWQyM2VmNjVjOWZkYjogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gLWFyZzA7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX3NobF9jN2VhNDE3MzM4N2ExNjY5OiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICBjb25zdCByZXQgPSBhcmcwIDw8IGFyZzE7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX3Nocl80MzY1NTNjYmFlZjQxYTY2OiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICBjb25zdCByZXQgPSBhcmcwID4+IGFyZzE7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19fX3diaW5kZ2VuX3N0cmluZ19nZXRfN2VkNTMyMjk5MWNhYWVjNTogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgY29uc3Qgb2JqID0gYXJnMTsKICAgICAgICAgICAgY29uc3QgcmV0ID0gdHlwZW9mIChvYmopID09PSAnc3RyaW5nJyA/IG9iaiA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgdmFyIHB0cjEgPSBpc0xpa2VOb25lKHJldCkgPyAwIDogcGFzc1N0cmluZ1RvV2FzbTAocmV0LCB3YXNtLl9fd2JpbmRnZW5fbWFsbG9jLCB3YXNtLl9fd2JpbmRnZW5fcmVhbGxvYyk7CiAgICAgICAgICAgIHZhciBsZW4xID0gV0FTTV9WRUNUT1JfTEVOOwogICAgICAgICAgICBnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwICsgNCAqIDEsIGxlbjEsIHRydWUpOwogICAgICAgICAgICBnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwICsgNCAqIDAsIHB0cjEsIHRydWUpOwogICAgICAgIH0sCiAgICAgICAgX193YmdfX193YmluZGdlbl90aHJvd182YjY0NDQ5YjliOWVkMzNjOiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICAgICAgICB9LAogICAgICAgIF9fd2JnX2NhbGxfYTI0NTkyYTZmMzQ5YTk3ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24gKGFyZzAsIGFyZzEsIGFyZzIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAuY2FsbChhcmcxLCBhcmcyKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgIH0sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19jcnlwdG9fMzhkZjJiYWIxMjZiNjNkYzogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMC5jcnlwdG87CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19lcnJvcl9hNmZhMjAyYjU4YWExY2QzOiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICBsZXQgZGVmZXJyZWQwXzA7CiAgICAgICAgICAgIGxldCBkZWZlcnJlZDBfMTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGRlZmVycmVkMF8wID0gYXJnMDsKICAgICAgICAgICAgICAgIGRlZmVycmVkMF8xID0gYXJnMTsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIHdhc20uX193YmluZGdlbl9mcmVlKGRlZmVycmVkMF8wLCBkZWZlcnJlZDBfMSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIF9fd2JnX2dldFJhbmRvbVZhbHVlc19jNDRhNTBkOGNmZGFlYmViOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICAgICAgYXJnMC5nZXRSYW5kb21WYWx1ZXMoYXJnMSk7CiAgICAgICAgICAgIH0sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19nZXRUaW1lX2RhN2M1NWY1MmI3MWU4YzY6IGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAuZ2V0VGltZSgpOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfaW5zdGFuY2VvZl9XaW5kb3dfY2M2NGM4NmM4ZWY5ZTAyYjogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFyZzAgaW5zdGFuY2VvZiBXaW5kb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKF8pIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJldCA9IHJlc3VsdDsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX2xlbmd0aF85ZjE3NzUyMjRjZjFkODE1OiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICBjb25zdCByZXQgPSBhcmcwLmxlbmd0aDsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX21zQ3J5cHRvX2JkNWEwMzRhZjk2YmNiYTY6IGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAubXNDcnlwdG87CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19uZXdfMF80ZDY1NzIwMWNlZDE0ZGUzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19uZXdfMjI3ZDdjMDU0MTRlYjg2MTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBjb25zdCByZXQgPSBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX25ld193aXRoX2xlbmd0aF84Yzg1NGU0MWVhNGRhZTliOiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICBjb25zdCByZXQgPSBuZXcgVWludDhBcnJheShhcmcwID4+PiAwKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX25vZGVfODRlYTg3NTQxMTI1NGRiMTogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMC5ub2RlOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmdfcHJvY2Vzc180NGM3YTE0ZTExZTlmNjllOiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICBjb25zdCByZXQgPSBhcmcwLnByb2Nlc3M7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19wcm90b3R5cGVzZXRjYWxsX2E2YjAyZWIwMGIwZjRjZTI6IGZ1bmN0aW9uIChhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGdldEFycmF5VThGcm9tV2FzbTAoYXJnMCwgYXJnMSksIGFyZzIpOwogICAgICAgIH0sCiAgICAgICAgX193YmdfcmFuZG9tRmlsbFN5bmNfNmMyNWVhYzk4NjllYjUzYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgICAgIGFyZzAucmFuZG9tRmlsbFN5bmMoYXJnMSk7CiAgICAgICAgICAgIH0sIGFyZ3VtZW50cyk7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19yZXF1aXJlX2I0ZWRiZGNmM2UyYTFlZjA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IG1vZHVsZS5yZXF1aXJlOwogICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgfSwgYXJndW1lbnRzKTsKICAgICAgICB9LAogICAgICAgIF9fd2JnX3N0YWNrXzNiMGQ5NzRiYmYzMWU0NGY6IGZ1bmN0aW9uIChhcmcwLCBhcmcxKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzEuc3RhY2s7CiAgICAgICAgICAgIGNvbnN0IHB0cjEgPSBwYXNzU3RyaW5nVG9XYXNtMChyZXQsIHdhc20uX193YmluZGdlbl9tYWxsb2MsIHdhc20uX193YmluZGdlbl9yZWFsbG9jKTsKICAgICAgICAgICAgY29uc3QgbGVuMSA9IFdBU01fVkVDVE9SX0xFTjsKICAgICAgICAgICAgZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCArIDQgKiAxLCBsZW4xLCB0cnVlKTsKICAgICAgICAgICAgZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCArIDQgKiAwLCBwdHIxLCB0cnVlKTsKICAgICAgICB9LAogICAgICAgIF9fd2JnX3N0YXJ0V29ya2Vyc184YjU4MmQ1N2U5MmJkMmQ0OiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMikgewogICAgICAgICAgICBoYW5kbGVFcnJvcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0V29ya2VycyBub3Qgc3VwcG9ydGVkIGZyb20gYSB3b3JrZXIgdGhyZWFkJyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBjb25zdCByZXQgPSBzdGFydFdvcmtlcnMoYXJnMCwgYXJnMSwgd2JnX3JheW9uX1Bvb2xCdWlsZGVyLl9fd3JhcChhcmcyKSk7CiAgICAgICAgICAgIC8vIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMXzhjZmFkYzg3YTI5N2NhMDI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gdHlwZW9mIGdsb2JhbCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogZ2xvYmFsOwogICAgICAgICAgICByZXR1cm4gaXNMaWtlTm9uZShyZXQpID8gMCA6IGFkZFRvRXh0ZXJucmVmVGFibGUwKHJldCk7CiAgICAgICAgfSwKICAgICAgICBfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMX1RISVNfNjAyMjU2YWU1YzhmNDJjZjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBjb25zdCByZXQgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogZ2xvYmFsVGhpczsKICAgICAgICAgICAgcmV0dXJuIGlzTGlrZU5vbmUocmV0KSA/IDAgOiBhZGRUb0V4dGVybnJlZlRhYmxlMChyZXQpOwogICAgICAgIH0sCiAgICAgICAgX193Ymdfc3RhdGljX2FjY2Vzc29yX1NFTEZfZTQ0NWMxYzc0ODRhZWNjMzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBjb25zdCByZXQgPSB0eXBlb2Ygc2VsZiA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogc2VsZjsKICAgICAgICAgICAgcmV0dXJuIGlzTGlrZU5vbmUocmV0KSA/IDAgOiBhZGRUb0V4dGVybnJlZlRhYmxlMChyZXQpOwogICAgICAgIH0sCiAgICAgICAgX193Ymdfc3RhdGljX2FjY2Vzc29yX1dJTkRPV19mMjBlODU3NmVmMWUwZjE3OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHdpbmRvdzsKICAgICAgICAgICAgcmV0dXJuIGlzTGlrZU5vbmUocmV0KSA/IDAgOiBhZGRUb0V4dGVybnJlZlRhYmxlMChyZXQpOwogICAgICAgIH0sCiAgICAgICAgX193Ymdfc3ViYXJyYXlfZjhjYTQ2YTI1YjFmNWUwZDogZnVuY3Rpb24gKGFyZzAsIGFyZzEsIGFyZzIpIHsKICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMC5zdWJhcnJheShhcmcxID4+PiAwLCBhcmcyID4+PiAwKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX3RvU3RyaW5nXzZkYzFhOTRlMGJkYmEzNzg6IGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAudG9TdHJpbmcoKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JnX3RvU3RyaW5nX2M5NmRjNzZkNTU0N2E3MTU6IGZ1bmN0aW9uIChhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzEudG9TdHJpbmcoYXJnMik7CiAgICAgICAgICAgIGNvbnN0IHB0cjEgPSBwYXNzU3RyaW5nVG9XYXNtMChyZXQsIHdhc20uX193YmluZGdlbl9tYWxsb2MsIHdhc20uX193YmluZGdlbl9yZWFsbG9jKTsKICAgICAgICAgICAgY29uc3QgbGVuMSA9IFdBU01fVkVDVE9SX0xFTjsKICAgICAgICAgICAgZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCArIDQgKiAxLCBsZW4xLCB0cnVlKTsKICAgICAgICAgICAgZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCArIDQgKiAwLCBwdHIxLCB0cnVlKTsKICAgICAgICB9LAogICAgICAgIF9fd2JnX3ZlcnNpb25zXzI3NmIyNzk1YjFjNmEyMTk6IGZ1bmN0aW9uIChhcmcwKSB7CiAgICAgICAgICAgIGNvbnN0IHJldCA9IGFyZzAudmVyc2lvbnM7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMTogZnVuY3Rpb24gKGFyZzApIHsKICAgICAgICAgICAgLy8gQ2FzdCBpbnRyaW5zaWMgZm9yIGBGNjQgLT4gRXh0ZXJucmVmYC4KICAgICAgICAgICAgY29uc3QgcmV0ID0gYXJnMDsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAyOiBmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgICAvLyBDYXN0IGludHJpbnNpYyBmb3IgYEkxMjggLT4gRXh0ZXJucmVmYC4KICAgICAgICAgICAgY29uc3QgcmV0ID0gKEJpZ0ludC5hc1VpbnROKDY0LCBhcmcwKSB8IChhcmcxIDw8IEJpZ0ludCg2NCkpKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAzOiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICAvLyBDYXN0IGludHJpbnNpYyBmb3IgYEk2NCAtPiBFeHRlcm5yZWZgLgogICAgICAgICAgICBjb25zdCByZXQgPSBhcmcwOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDQ6IGZ1bmN0aW9uIChhcmcwLCBhcmcxKSB7CiAgICAgICAgICAgIC8vIENhc3QgaW50cmluc2ljIGZvciBgUmVmKFNsaWNlKFU4KSkgLT4gTmFtZWRFeHRlcm5yZWYoIlVpbnQ4QXJyYXkiKWAuCiAgICAgICAgICAgIGNvbnN0IHJldCA9IGdldEFycmF5VThGcm9tV2FzbTAoYXJnMCwgYXJnMSk7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNTogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgLy8gQ2FzdCBpbnRyaW5zaWMgZm9yIGBSZWYoU3RyaW5nKSAtPiBFeHRlcm5yZWZgLgogICAgICAgICAgICBjb25zdCByZXQgPSBnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCwgYXJnMSk7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNjogZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgICAgICAgICAgLy8gQ2FzdCBpbnRyaW5zaWMgZm9yIGBVMTI4IC0+IEV4dGVybnJlZmAuCiAgICAgICAgICAgIGNvbnN0IHJldCA9IChCaWdJbnQuYXNVaW50Tig2NCwgYXJnMCkgfCAoQmlnSW50LmFzVWludE4oNjQsIGFyZzEpIDw8IEJpZ0ludCg2NCkpKTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9LAogICAgICAgIF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA3OiBmdW5jdGlvbiAoYXJnMCkgewogICAgICAgICAgICAvLyBDYXN0IGludHJpbnNpYyBmb3IgYFU2NCAtPiBFeHRlcm5yZWZgLgogICAgICAgICAgICBjb25zdCByZXQgPSBCaWdJbnQuYXNVaW50Tig2NCwgYXJnMCk7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBfX3diaW5kZ2VuX2luaXRfZXh0ZXJucmVmX3RhYmxlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gd2FzbS5fX3diaW5kZ2VuX2V4dGVybnJlZnM7CiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRhYmxlLmdyb3coNCk7CiAgICAgICAgICAgIHRhYmxlLnNldCgwLCB1bmRlZmluZWQpOwogICAgICAgICAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMCwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgdGFibGUuc2V0KG9mZnNldCArIDEsIG51bGwpOwogICAgICAgICAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMiwgdHJ1ZSk7CiAgICAgICAgICAgIHRhYmxlLnNldChvZmZzZXQgKyAzLCBmYWxzZSk7CiAgICAgICAgfSwKICAgICAgICBtZW1vcnk6IG1lbW9yeSB8fCBuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHsgaW5pdGlhbDogMjEsIG1heGltdW06IDE2Mzg0LCBzaGFyZWQ6IHRydWUgfSksCiAgICB9OwogICAgcmV0dXJuIHsKICAgICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgICAgIi4vdGZoZV9iZy5qcyI6IGltcG9ydDAsCiAgICB9Owp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBhZGRUb0V4dGVybnJlZlRhYmxlMAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZnVuY3Rpb24gYWRkVG9FeHRlcm5yZWZUYWJsZTAob2JqKSB7CiAgICBjb25zdCBpZHggPSB3YXNtLl9fZXh0ZXJucmVmX3RhYmxlX2FsbG9jKCk7CiAgICB3YXNtLl9fd2JpbmRnZW5fZXh0ZXJucmVmcy5zZXQoaWR4LCBvYmopOwogICAgcmV0dXJuIGlkeDsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gZGVidWdTdHJpbmcKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmZ1bmN0aW9uIGRlYnVnU3RyaW5nKHZhbCkgewogICAgLy8gcHJpbWl0aXZlIHR5cGVzCiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDsKICAgIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nIHx8IHZhbCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGAke3ZhbH1gOwogICAgfQogICAgaWYgKHR5cGUgPT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gYCIke3ZhbH0iYDsKICAgIH0KICAgIGlmICh0eXBlID09ICdzeW1ib2wnKSB7CiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB2YWwuZGVzY3JpcHRpb247CiAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICdTeW1ib2wnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGBTeW1ib2woJHtkZXNjcmlwdGlvbn0pYDsKICAgICAgICB9CiAgICB9CiAgICBpZiAodHlwZSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgY29uc3QgbmFtZSA9IHZhbC5uYW1lOwogICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJyAmJiBuYW1lLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIGBGdW5jdGlvbigke25hbWV9KWA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJ0Z1bmN0aW9uJzsKICAgICAgICB9CiAgICB9CiAgICAvLyBvYmplY3RzCiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsLmxlbmd0aDsKICAgICAgICBsZXQgZGVidWcgPSAnWyc7CiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKICAgICAgICAgICAgZGVidWcgKz0gZGVidWdTdHJpbmcodmFsWzBdKTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICBkZWJ1ZyArPSAnLCAnICsgZGVidWdTdHJpbmcodmFsW2ldKTsKICAgICAgICB9CiAgICAgICAgZGVidWcgKz0gJ10nOwogICAgICAgIHJldHVybiBkZWJ1ZzsKICAgIH0KICAgIC8vIFRlc3QgZm9yIGJ1aWx0LWluCiAgICBjb25zdCBidWlsdEluTWF0Y2hlcyA9IC9cW29iamVjdCAoW15cXV0rKVxdLy5leGVjKHRvU3RyaW5nLmNhbGwodmFsKSk7CiAgICBsZXQgY2xhc3NOYW1lOwogICAgaWYgKGJ1aWx0SW5NYXRjaGVzICYmIGJ1aWx0SW5NYXRjaGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICBjbGFzc05hbWUgPSBidWlsdEluTWF0Y2hlc1sxXTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8vIEZhaWxlZCB0byBtYXRjaCB0aGUgc3RhbmRhcmQgJ1tvYmplY3QgQ2xhc3NOYW1lXScKICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpOwogICAgfQogICAgaWYgKGNsYXNzTmFtZSA9PSAnT2JqZWN0JykgewogICAgICAgIC8vIHdlJ3JlIGEgdXNlciBkZWZpbmVkIGNsYXNzIG9yIE9iamVjdAogICAgICAgIC8vIEpTT04uc3RyaW5naWZ5IGF2b2lkcyBwcm9ibGVtcyB3aXRoIGN5Y2xlcywgYW5kIGlzIGdlbmVyYWxseSBtdWNoCiAgICAgICAgLy8gZWFzaWVyIHRoYW4gbG9vcGluZyB0aHJvdWdoIG93blByb3BlcnRpZXMgb2YgYHZhbGAuCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuICdPYmplY3QoJyArIEpTT04uc3RyaW5naWZ5KHZhbCkgKyAnKSc7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChfKSB7CiAgICAgICAgICAgIHJldHVybiAnT2JqZWN0JzsKICAgICAgICB9CiAgICB9CiAgICAvLyBlcnJvcnMKICAgIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgIHJldHVybiBgJHt2YWwubmFtZX06ICR7dmFsLm1lc3NhZ2V9XG4ke3ZhbC5zdGFja31gOwogICAgfQogICAgLy8gVE9ETyB3ZSBjb3VsZCB0ZXN0IGZvciBtb3JlIHRoaW5ncyBoZXJlLCBsaWtlIGBTZXRgcyBhbmQgYE1hcGBzLgogICAgcmV0dXJuIGNsYXNzTmFtZTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gZ2V0QXJyYXlVOEZyb21XYXNtMAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZnVuY3Rpb24gZ2V0QXJyYXlVOEZyb21XYXNtMChwdHIsIGxlbikgewogICAgcHRyID0gcHRyID4+PiAwOwogICAgcmV0dXJuIGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc3ViYXJyYXkocHRyIC8gMSwgcHRyIC8gMSArIGxlbik7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIGNhY2hlZERhdGFWaWV3TWVtb3J5MAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKbGV0IGNhY2hlZERhdGFWaWV3TWVtb3J5MCA9IG51bGw7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBnZXREYXRhVmlld01lbW9yeTAKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmZ1bmN0aW9uIGdldERhdGFWaWV3TWVtb3J5MCgpIHsKICAgIGlmIChjYWNoZWREYXRhVmlld01lbW9yeTAgPT09IG51bGwgfHwgY2FjaGVkRGF0YVZpZXdNZW1vcnkwLmJ1ZmZlciAhPT0gd2FzbS5tZW1vcnkuYnVmZmVyKSB7CiAgICAgICAgY2FjaGVkRGF0YVZpZXdNZW1vcnkwID0gbmV3IERhdGFWaWV3KHdhc20ubWVtb3J5LmJ1ZmZlcik7CiAgICB9CiAgICByZXR1cm4gY2FjaGVkRGF0YVZpZXdNZW1vcnkwOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBnZXRTdHJpbmdGcm9tV2FzbTAKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmZ1bmN0aW9uIGdldFN0cmluZ0Zyb21XYXNtMChwdHIsIGxlbikgewogICAgcHRyID0gcHRyID4+PiAwOwogICAgcmV0dXJuIGRlY29kZVRleHQocHRyLCBsZW4pOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBjYWNoZWRVaW50OEFycmF5TWVtb3J5MAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKbGV0IGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwID0gbnVsbDsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIGdldFVpbnQ4QXJyYXlNZW1vcnkwCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpmdW5jdGlvbiBnZXRVaW50OEFycmF5TWVtb3J5MCgpIHsKICAgIGlmIChjYWNoZWRVaW50OEFycmF5TWVtb3J5MCA9PT0gbnVsbCB8fCBjYWNoZWRVaW50OEFycmF5TWVtb3J5MC5idWZmZXIgIT09IHdhc20ubWVtb3J5LmJ1ZmZlcikgewogICAgICAgIGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwID0gbmV3IFVpbnQ4QXJyYXkod2FzbS5tZW1vcnkuYnVmZmVyKTsKICAgIH0KICAgIHJldHVybiBjYWNoZWRVaW50OEFycmF5TWVtb3J5MDsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gaGFuZGxlRXJyb3IKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmZ1bmN0aW9uIGhhbmRsZUVycm9yKGYsIGFyZ3MpIHsKICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJncyk7CiAgICB9CiAgICBjYXRjaCAoZSkgewogICAgICAgIGNvbnN0IGlkeCA9IGFkZFRvRXh0ZXJucmVmVGFibGUwKGUpOwogICAgICAgIHdhc20uX193YmluZGdlbl9leG5fc3RvcmUoaWR4KTsKICAgIH0KfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gaXNMaWtlTm9uZQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZnVuY3Rpb24gaXNMaWtlTm9uZSh4KSB7CiAgICByZXR1cm4geCA9PT0gdW5kZWZpbmVkIHx8IHggPT09IG51bGw7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIHBhc3NTdHJpbmdUb1dhc20wCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpmdW5jdGlvbiBwYXNzU3RyaW5nVG9XYXNtMChhcmcsIG1hbGxvYywgcmVhbGxvYykgewogICAgaWYgKHJlYWxsb2MgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnN0IGJ1ZiA9IGNhY2hlZFRleHRFbmNvZGVyLmVuY29kZShhcmcpOwogICAgICAgIGNvbnN0IHB0ciA9IG1hbGxvYyhidWYubGVuZ3RoLCAxKSA+Pj4gMDsKICAgICAgICBnZXRVaW50OEFycmF5TWVtb3J5MCgpLnN1YmFycmF5KHB0ciwgcHRyICsgYnVmLmxlbmd0aCkuc2V0KGJ1Zik7CiAgICAgICAgV0FTTV9WRUNUT1JfTEVOID0gYnVmLmxlbmd0aDsKICAgICAgICByZXR1cm4gcHRyOwogICAgfQogICAgbGV0IGxlbiA9IGFyZy5sZW5ndGg7CiAgICBsZXQgcHRyID0gbWFsbG9jKGxlbiwgMSkgPj4+IDA7CiAgICBjb25zdCBtZW0gPSBnZXRVaW50OEFycmF5TWVtb3J5MCgpOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKDsgb2Zmc2V0IDwgbGVuOyBvZmZzZXQrKykgewogICAgICAgIGNvbnN0IGNvZGUgPSBhcmcuY2hhckNvZGVBdChvZmZzZXQpOwogICAgICAgIGlmIChjb2RlID4gMHg3RikKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgbWVtW3B0ciArIG9mZnNldF0gPSBjb2RlOwogICAgfQogICAgaWYgKG9mZnNldCAhPT0gbGVuKSB7CiAgICAgICAgaWYgKG9mZnNldCAhPT0gMCkgewogICAgICAgICAgICBhcmcgPSBhcmcuc2xpY2Uob2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgcHRyID0gcmVhbGxvYyhwdHIsIGxlbiwgbGVuID0gb2Zmc2V0ICsgYXJnLmxlbmd0aCAqIDMsIDEpID4+PiAwOwogICAgICAgIGNvbnN0IHZpZXcgPSBnZXRVaW50OEFycmF5TWVtb3J5MCgpLnN1YmFycmF5KHB0ciArIG9mZnNldCwgcHRyICsgbGVuKTsKICAgICAgICBjb25zdCByZXQgPSBjYWNoZWRUZXh0RW5jb2Rlci5lbmNvZGVJbnRvKGFyZywgdmlldyk7CiAgICAgICAgb2Zmc2V0ICs9IHJldC53cml0dGVuOwogICAgICAgIHB0ciA9IHJlYWxsb2MocHRyLCBsZW4sIG9mZnNldCwgMSkgPj4+IDA7CiAgICB9CiAgICBXQVNNX1ZFQ1RPUl9MRU4gPSBvZmZzZXQ7CiAgICByZXR1cm4gcHRyOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBjYWNoZWRUZXh0RGVjb2RlcgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKbGV0IGNhY2hlZFRleHREZWNvZGVyID0gKHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JywgeyBpZ25vcmVCT006IHRydWUsIGZhdGFsOiB0cnVlIH0pIDogdW5kZWZpbmVkKTsKCmlmIChjYWNoZWRUZXh0RGVjb2RlcikKICAgIGNhY2hlZFRleHREZWNvZGVyLmRlY29kZSgpOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gTUFYX1NBRkFSSV9ERUNPREVfQllURVMKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmNvbnN0IE1BWF9TQUZBUklfREVDT0RFX0JZVEVTID0gMjE0NjQzNTA3MjsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIG51bUJ5dGVzRGVjb2RlZAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKbGV0IG51bUJ5dGVzRGVjb2RlZCA9IDA7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBkZWNvZGVUZXh0Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpmdW5jdGlvbiBkZWNvZGVUZXh0KHB0ciwgbGVuKSB7CiAgICBudW1CeXRlc0RlY29kZWQgKz0gbGVuOwogICAgaWYgKG51bUJ5dGVzRGVjb2RlZCA+PSBNQVhfU0FGQVJJX0RFQ09ERV9CWVRFUykgewogICAgICAgIGNhY2hlZFRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcsIHsgaWdub3JlQk9NOiB0cnVlLCBmYXRhbDogdHJ1ZSB9KTsKICAgICAgICBjYWNoZWRUZXh0RGVjb2Rlci5kZWNvZGUoKTsKICAgICAgICBudW1CeXRlc0RlY29kZWQgPSBsZW47CiAgICB9CiAgICByZXR1cm4gY2FjaGVkVGV4dERlY29kZXIuZGVjb2RlKGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc2xpY2UocHRyLCBwdHIgKyBsZW4pKTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gY2FjaGVkVGV4dEVuY29kZXIKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmNvbnN0IGNhY2hlZFRleHRFbmNvZGVyID0gKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgVGV4dEVuY29kZXIoKSA6IHVuZGVmaW5lZCk7CgppZiAoY2FjaGVkVGV4dEVuY29kZXIpIHsKICAgIGNhY2hlZFRleHRFbmNvZGVyLmVuY29kZUludG8gPSBmdW5jdGlvbiAoYXJnLCB2aWV3KSB7CiAgICAgICAgY29uc3QgYnVmID0gY2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlKGFyZyk7CiAgICAgICAgdmlldy5zZXQoYnVmKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZWFkOiBhcmcubGVuZ3RoLAogICAgICAgICAgICB3cml0dGVuOiBidWYubGVuZ3RoCiAgICAgICAgfTsKICAgIH07Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFdBU01fVkVDVE9SX0xFTiBpcyBhIG1vZHVsZS1sZXZlbCB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgYnl0ZSBsZW5ndGggb2YKLy8gdGhlIGRhdGEganVzdCB3cml0dGVuIGludG8gV0FTTSBtZW1vcnkuIEl0IGFjdHMgYXMgYW4gb3V0LXBhcmFtZXRlci4KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmxldCBXQVNNX1ZFQ1RPUl9MRU4gPSAwOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gV0FTTSBtb2R1bGUgc3RhdGUKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmxldCB3YXNtTW9kdWxlLCB3YXNtOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gSW5pdDoKLy8gX193YmdfZmluYWxpemVfaW5pdAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZnVuY3Rpb24gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSwgbW9kdWxlLCB0aHJlYWRfc3RhY2tfc2l6ZSkgewogICAgd2FzbSA9IGluc3RhbmNlLmV4cG9ydHM7CiAgICB3YXNtTW9kdWxlID0gbW9kdWxlOwogICAgY2FjaGVkRGF0YVZpZXdNZW1vcnkwID0gbnVsbDsKICAgIGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwID0gbnVsbDsKICAgIGlmICh0eXBlb2YgdGhyZWFkX3N0YWNrX3NpemUgIT09ICd1bmRlZmluZWQnICYmICh0eXBlb2YgdGhyZWFkX3N0YWNrX3NpemUgIT09ICdudW1iZXInIHx8IHRocmVhZF9zdGFja19zaXplID09PSAwIHx8IHRocmVhZF9zdGFja19zaXplICUgNjU1MzYgIT09IDApKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHN0YWNrIHNpemUnKTsKICAgIH0KICAgIHdhc20uX193YmluZGdlbl9zdGFydCh0aHJlYWRfc3RhY2tfc2l6ZSk7CiAgICByZXR1cm4gd2FzbTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gSW5pdDoKLy8gX193YmdfbG9hZAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKYXN5bmMgZnVuY3Rpb24gX193YmdfbG9hZChtb2R1bGUsIGltcG9ydHMpIHsKICAgIGlmICh0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbicgJiYgbW9kdWxlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHsKICAgICAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcobW9kdWxlLCBpbXBvcnRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29uc3QgdmFsaWRSZXNwb25zZSA9IG1vZHVsZS5vayAmJiBleHBlY3RlZFJlc3BvbnNlVHlwZShtb2R1bGUudHlwZSk7CiAgICAgICAgICAgICAgICBpZiAodmFsaWRSZXNwb25zZSAmJiBtb2R1bGUuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpICE9PSAnYXBwbGljYXRpb24vd2FzbScpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oImBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ2AgZmFpbGVkIGJlY2F1c2UgeW91ciBzZXJ2ZXIgZG9lcyBub3Qgc2VydmUgV2FzbSB3aXRoIGBhcHBsaWNhdGlvbi93YXNtYCBNSU1FIHR5cGUuIEZhbGxpbmcgYmFjayB0byBgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVgIHdoaWNoIGlzIHNsb3dlci4gT3JpZ2luYWwgZXJyb3I6XG4iLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBtb2R1bGUuYXJyYXlCdWZmZXIoKTsKICAgICAgICByZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYnl0ZXMsIGltcG9ydHMpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShtb2R1bGUsIGltcG9ydHMpOwogICAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lkluc3RhbmNlKSB7CiAgICAgICAgICAgIHJldHVybiB7IGluc3RhbmNlLCBtb2R1bGUgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBleHBlY3RlZFJlc3BvbnNlVHlwZSh0eXBlKSB7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ2Jhc2ljJzoKICAgICAgICAgICAgY2FzZSAnY29ycyc6CiAgICAgICAgICAgIGNhc2UgJ2RlZmF1bHQnOiByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBJbml0OgovLyBfX3diZ19pbml0Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgphc3luYyBmdW5jdGlvbiBfX3diZ19pbml0KG1vZHVsZV9vcl9wYXRoLCBtZW1vcnkpIHsKICAgIGlmICh3YXNtICE9PSB1bmRlZmluZWQpCiAgICAgICAgcmV0dXJuIHdhc207CiAgICBsZXQgdGhyZWFkX3N0YWNrX3NpemU7CiAgICBpZiAobW9kdWxlX29yX3BhdGggIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kdWxlX29yX3BhdGgpID09PSBPYmplY3QucHJvdG90eXBlKSB7CiAgICAgICAgICAgICh7IG1vZHVsZV9vcl9wYXRoLCBtZW1vcnksIHRocmVhZF9zdGFja19zaXplIH0gPSBtb2R1bGVfb3JfcGF0aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBjb25zb2xlLndhcm4oJ3VzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkJyk7CiAgICAgICAgfQogICAgfQogICAgLy8gICBpZiAobW9kdWxlX29yX3BhdGggPT09IHVuZGVmaW5lZCkgewogICAgLy8gICAgIG1vZHVsZV9vcl9wYXRoID0gbmV3IFVSTCgndGZoZV9iZy53YXNtJywgaW1wb3J0Lm1ldGEudXJsKTsKICAgIC8vICAgfQogICAgY29uc3QgaW1wb3J0cyA9IF9fd2JnX2dldF9pbXBvcnRzKG1lbW9yeSk7CiAgICAvLyAgIGlmICgKICAgIC8vICAgICB0eXBlb2YgbW9kdWxlX29yX3BhdGggPT09ICdzdHJpbmcnIHx8CiAgICAvLyAgICAgKHR5cGVvZiBSZXF1ZXN0ID09PSAnZnVuY3Rpb24nICYmIG1vZHVsZV9vcl9wYXRoIGluc3RhbmNlb2YgUmVxdWVzdCkgfHwKICAgIC8vICAgICAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJyAmJiBtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFVSTCkKICAgIC8vICAgKSB7CiAgICAvLyAgICAgbW9kdWxlX29yX3BhdGggPSBmZXRjaChtb2R1bGVfb3JfcGF0aCk7CiAgICAvLyAgIH0KICAgIGNvbnN0IHsgaW5zdGFuY2UsIG1vZHVsZSB9ID0gYXdhaXQgX193YmdfbG9hZChhd2FpdCBtb2R1bGVfb3JfcGF0aCwgaW1wb3J0cyk7CiAgICByZXR1cm4gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSwgbW9kdWxlLCB0aHJlYWRfc3RhY2tfc2l6ZSk7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vIFRoZSAndGZoZScgZ2xvYmFsIG9iamVjdAovLyA9PT09PT09PT09PT09PT09PT09PT09PT0KLy8gRmluYWwgdGZoZSBvYmplY3QgZ2xvYmFsIGRlY2xhcmF0aW9uIGNhbGxlZCBieSAnd2FpdEZvck1zZ1R5cGUnIG9ubHkKLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCnZhciB0ZmhlID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHsKICBfX3Byb3RvX186IG51bGwsCiAgZGVmYXVsdDogX193YmdfaW5pdCwKICB3YmdfcmF5b25fc3RhcnRfd29ya2VyOiB3YmdfcmF5b25fc3RhcnRfd29ya2VyLAp9KTsKCg==\";\n return await __newWorkerFromJsCodeBase64(workerBase64);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker initialization helpers\n////////////////////////////////////////////////////////////////////////////////\n\nasync function __createAndInitWorker(createWorker, workerInit, workerIndex, label) {\n let blobUrl = undefined;\n let worker = undefined;\n\n try {\n const result = await createWorker();\n worker = result.worker;\n blobUrl = result.blobUrl;\n\n _logger?.debug(`[Worker #${workerIndex}] - created with ${label}`);\n worker.postMessage(workerInit);\n await __waitForMsgType(worker, 'wasm_bindgen_worker_ready');\n\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n blobUrl = undefined;\n }\n\n _logger?.debug(`[Worker #${workerIndex}] - ready`);\n return worker;\n } catch (e) {\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n }\n\n if (worker) {\n try {\n await worker.terminate();\n } catch {\n // Preserve the worker creation/init error that triggered cleanup.\n }\n }\n\n throw e;\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Mode: `embedded-base64`\n */\nasync function __createAndInitWorkerFromEmbeddedBase64(workerInit, workerIndex) {\n return await __createAndInitWorker(\n () => __createWorkerFromBase64(),\n workerInit,\n workerIndex,\n 'embedded base64 worker',\n );\n}\n\n/**\n * Mode: `verified-blob`\n */\nasync function __createAndInitWorkerFromVerifiedBlob(workerInit, workerIndex) {\n return await __createAndInitWorker(\n () => __createWorkerFromVerifiedWorkerUrl(),\n workerInit,\n workerIndex,\n 'verified worker URL',\n );\n}\n\n/**\n * Mode: `trusted-direct-url`\n */\nasync function __createAndInitWorkerFromTrustedDirectUrl(workerInit, workerIndex) {\n return await __createAndInitWorker(\n () => __createWorkerFromTrustedDirectWorkerUrl(),\n workerInit,\n workerIndex,\n 'trusted direct worker URL',\n );\n}\n\n/**\n * Mode: `precheck-direct-url`\n */\nasync function __createAndInitWorkerFromCheckedDirectUrl(workerInit, workerIndex) {\n return await __createAndInitWorker(\n () => __createWorkerFromCheckedDirectWorkerUrl(),\n workerInit,\n workerIndex,\n 'checked direct worker URL',\n );\n}\n\n/**\n * Mode: `auto`\n */\nasync function __createAndInitWorkerAuto(workerInit, workerIndex) {\n if (_workerUrl) {\n try {\n /**\n * Mode: `verified-blob`\n */\n return await __createAndInitWorkerFromVerifiedBlob(workerInit, workerIndex);\n } catch (e) {\n if (__isSha256MismatchError(e)) {\n throw e;\n }\n\n _logger?.error(`[Worker #${workerIndex}] - verified worker URL failed; falling back to embedded base64`, e);\n }\n }\n\n try {\n /**\n * Mode: `embedded-base64`\n */\n return await __createAndInitWorkerFromEmbeddedBase64(workerInit, workerIndex);\n } catch (e) {\n throw new Error('All worker creation methods failed. Check CSP, COOP/COEP headers, and cross-origin policies.', {\n cause: e,\n });\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker load mode dispatcher\n////////////////////////////////////////////////////////////////////////////////\n\nasync function __createAndInitConfiguredWorker(workerInit, workerIndex) {\n switch (_wasmAssetLoadMode) {\n case 'embedded-base64':\n return await __createAndInitWorkerFromEmbeddedBase64(workerInit, workerIndex);\n\n case 'verified-blob':\n return await __createAndInitWorkerFromVerifiedBlob(workerInit, workerIndex);\n\n case 'precheck-direct-url':\n return await __createAndInitWorkerFromCheckedDirectUrl(workerInit, workerIndex);\n\n case 'trusted-direct-url':\n return await __createAndInitWorkerFromTrustedDirectUrl(workerInit, workerIndex);\n\n case 'auto':\n return await __createAndInitWorkerAuto(workerInit, workerIndex);\n\n default:\n throw new Error(`Unsupported wasmAssetLoadMode: ${_wasmAssetLoadMode}`);\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Worker pool lifecycle\n////////////////////////////////////////////////////////////////////////////////\n\nasync function startWorkers(module, memory, builder) {\n if (_started) {\n throw new Error('Already started');\n }\n\n _started = true;\n _starting = true;\n\n try {\n if (_terminating) {\n throw new Error('Cannot start workers while termination is in progress');\n }\n\n if (builder.numThreads() === 0) {\n throw new Error(`num_threads must be > 0.`);\n }\n\n const workerInit = {\n type: 'wasm_bindgen_worker_init',\n init: { module_or_path: module, memory },\n receiver: builder.receiver(),\n };\n const results = await Promise.allSettled(\n Array.from({ length: builder.numThreads() }, async (_, workerIndex) => {\n return await __createAndInitConfiguredWorker(workerInit, workerIndex);\n }),\n );\n\n const workers = [];\n const errors = [];\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n workers.push(result.value);\n } else {\n errors.push(result.reason);\n }\n }\n\n if (errors.length > 0) {\n await Promise.allSettled(workers.map((w) => w.terminate()));\n throw errors[0];\n }\n\n _workers = workers;\n builder.build();\n } finally {\n _starting = false;\n // Drop the verified-bytes cache: each spawned worker now holds its own copy\n // of the script (via Blob URL or eval source), so the SDK no longer needs\n // to keep the bytes around. On failure the module is one-shot anyway, so\n // the cache would never be reused.\n _verifiedWorkerUrlBytesPromise = undefined;\n }\n}\n\nasync function terminateWorkers() {\n if (_starting) {\n throw new Error('Cannot terminate while startWorkers() is in progress. Await the startWorkers() promise first.');\n }\n\n if (_terminating) {\n return _terminating;\n }\n\n if (!_workers) {\n return;\n }\n\n const workers = _workers;\n _workers = undefined;\n _terminating = Promise.allSettled(workers.map((w) => w.terminate()));\n\n return _terminating;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Public exports\n////////////////////////////////////////////////////////////////////////////////\n\nexport { getTfheWorkers, startWorkers, terminateWorkers, setWorkerUrlConfig };\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8DA,SAAS,kBAAkB;AACzB,SACE,OAAO,QAAQ,eACf,OAAO,YAAY,eACnB,OAAO,qBAAqB,cAC5B,OAAO,wBAAwB;AAEnC;AAEA,MAAM,uBAAuB,CAAC,mBAAmB,iBAAiB,uBAAuB,sBAAsB,MAAM;AAErH,SAAS,sBAAsB,OAAO;AACpC,SAAO,qBAAqB,SAAS,KAAK;AAC5C;AAMA,SAAS,aAAa,OAAO;AAC3B,SAAO,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACvE;AAOA,eAAe,SAAS,OAAO;AAC7B,MAAI,gBAAgB,GAAG;AACrB,QAAI,OAAO,WAAW,eAAe,CAAC,OAAO,UAAU,OAAO,OAAO,OAAO,WAAW,YAAY;AACjG,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAEA,UAAM,OAAO,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AACxD,WAAO,aAAa,IAAI,WAAW,IAAI,CAAC;AAAA,EAC1C;AAEA,QAAM,iBAAiB;AACvB,QAAM,eAAe,QAAQ,cAAc;AAC3C,QAAM,EAAE,WAAW,IAAI,MAAM;AAAA;AAAA,IAA0B;AAAA;AACvD,SAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,WAAW,KAAK,CAAC,EAAE,OAAO,KAAK;AACxE;AAUA,eAAe,eAAe,OAAO,gBAAgB,KAAK;AACxD,QAAM,eAAe,MAAM,SAAS,KAAK;AAEzC,MAAI,iBAAiB,gBAAgB;AACnC,UAAM,QAAQ,IAAI,MAAM,8BAA8B,cAAc,SAAS,YAAY,SAAS,GAAG,EAAE;AACvG,UAAM,OAAO;AACb,UAAM;AAAA,EACR;AACF;AAEA,SAAS,wBAAwB,OAAO;AACtC,SAAO,OAAO,SAAS;AACzB;AAYA,eAAe,+BAA+B,KAAK,gBAAgB;AACjE,QAAM,QAAQ,MAAM,qBAAqB,GAAG;AAE5C,QAAM,eAAe,OAAO,gBAAgB,GAAG;AAE/C,SAAO;AACT;AASA,eAAe,qBAAqB,KAAK;AACvC,MAAI,CAAC,gBAAgB,KAAK,IAAI,aAAa,SAAS;AAClD,UAAM,eAAe;AACrB,UAAM,aAAa,QAAQ,YAAY;AACvC,UAAM,gBAAgB;AACtB,UAAM,cAAc,QAAQ,aAAa;AACzC,UAAM,EAAE,SAAS,IAAI,MAAM;AAAA;AAAA,MAA0B;AAAA;AACrD,UAAM,EAAE,cAAc,IAAI,MAAM;AAAA;AAAA,MAA0B;AAAA;AAC1D,WAAO,MAAM,SAAS,cAAc,GAAG,CAAC;AAAA,EAC1C;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EACrF;AAEA,SAAO,MAAM,SAAS,YAAY;AACpC;AAYA,eAAe,2BAA2B,MAAM;AAC9C,QAAM,UAAU,IAAI,gBAAgB,IAAI;AAExC,MAAI;AACF,UAAM,SAAS,IAAI,OAAO,SAAS;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAED,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B,SAAS,GAAG;AACV,QAAI,gBAAgB,OAAO;AAC3B,UAAM;AAAA,EACR;AACF;AAQA,eAAe,6BAA6B,KAAK;AAC/C,MAAI,gBAAgB,GAAG;AACrB,WAAO,IAAI,OAAO,KAAK;AAAA,MACrB,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB;AACvB,QAAM,eAAe,QAAQ,cAAc;AAC3C,QAAM,EAAE,QAAQ,WAAW,IAAI,MAAM;AAAA;AAAA,IAA0B;AAAA;AAC/D,SAAO,IAAI,WAAW,GAAG;AAC3B;AAEA,eAAe,0BAA0B,QAAQ;AAC/C,QAAM,iBAAiB;AACvB,QAAM,eAAe,QAAQ,cAAc;AAC3C,QAAM,EAAE,QAAQ,WAAW,IAAI,MAAM;AAAA;AAAA,IAA0B;AAAA;AAC/D,SAAO,EAAE,QAAQ,IAAI,WAAW,QAAQ,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,OAAU;AAC9E;AAUA,eAAe,6CAA6C,qBAAqB;AAC/E,MAAI,gBAAgB,GAAG;AACrB,WAAO,MAAM;AAAA,MACX,IAAI,KAAK,CAAC,mBAAmB,GAAG;AAAA,QAC9B,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,MAAM,0BAA0B,OAAO,KAAK,mBAAmB,EAAE,SAAS,OAAO,CAAC;AAC3F;AASA,eAAe,4BAA4B,cAAc;AACvD,MAAI,gBAAgB,GAAG;AACrB,UAAM,OAAO,IAAI,KAAK,CAAC,KAAK,YAAY,CAAC,GAAG;AAAA,MAC1C,MAAM;AAAA,IACR,CAAC;AAED,UAAM,UAAU,IAAI,gBAAgB,IAAI;AAExC,QAAI;AACF,YAAM,SAAS,IAAI,OAAO,SAAS;AAAA,QACjC,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAED,aAAO,EAAE,QAAQ,QAAQ;AAAA,IAC3B,SAAS,GAAG;AACV,UAAI,gBAAgB,OAAO;AAC3B,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,KAAK,cAAc,QAAQ,EAAE,SAAS,OAAO;AACjE,SAAO,MAAM,0BAA0B,IAAI;AAC7C;AAMA,SAAS,iBAAiB,QAAQ,MAAM;AACtC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,aAAS,UAAU;AACjB,UAAI,OAAO,OAAO,wBAAwB,YAAY;AACpD,eAAO,oBAAoB,WAAW,YAAY;AAClD,eAAO,oBAAoB,SAAS,cAAc;AAAA,MACpD,OAAO;AACL,eAAO,IAAI,WAAW,SAAS;AAC/B,eAAO,IAAI,SAAS,WAAW;AAC/B,eAAO,IAAI,QAAQ,UAAU;AAAA,MAC/B;AAAA,IACF;AAEA,aAAS,aAAa,EAAE,KAAK,GAAG;AAC9B,UAAI,MAAM,SAAS,KAAM;AACzB,cAAQ;AACR,cAAQ,IAAI;AAAA,IACd;AAEA,aAAS,eAAe,GAAG;AACzB,cAAQ;AACR,aAAO,EAAE,SAAS,IAAI,MAAM,cAAc,CAAC;AAAA,IAC7C;AAEA,aAAS,UAAU,MAAM;AACvB,UAAI,MAAM,SAAS,KAAM;AACzB,cAAQ;AACR,cAAQ,IAAI;AAAA,IACd;AAEA,aAAS,YAAY,KAAK;AACxB,cAAQ;AACR,aAAO,GAAG;AAAA,IACZ;AAEA,aAAS,WAAW,MAAM;AACxB,cAAQ;AACR,aAAO,IAAI,MAAM,2BAA2B,IAAI,EAAE,CAAC;AAAA,IACrD;AAEA,QAAI,OAAO,OAAO,wBAAwB,YAAY;AACpD,aAAO,iBAAiB,WAAW,YAAY;AAC/C,aAAO,iBAAiB,SAAS,cAAc;AAAA,IACjD,OAAO;AACL,aAAO,GAAG,WAAW,SAAS;AAC9B,aAAO,GAAG,SAAS,WAAW;AAC9B,aAAO,GAAG,QAAQ,UAAU;AAAA,IAC9B;AAAA,EACF,CAAC;AACH;AAMA,IAAI;AACJ,IAAI,aAAa;AACjB,IAAI,aAAa;AACjB,IAAI,qBAAqB;AACzB,MAAM,mBAAmB;AACzB,IAAI,iCAAiC;AACrC,IAAI,UAAU;AACd,IAAI,WAAW;AAIf,IAAI,YAAY;AAGhB,IAAI;AAEJ,SAAS,iBAAiB;AACxB,SAAO;AACT;AAMA,SAAS,eAAe,QAAQ;AAC9B,MAAI,WAAW,QAAW;AACxB;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,UAAU,cAAc,OAAO,OAAO,UAAU,YAAY;AAC5E,UAAM,IAAI,UAAU,uEAAuE;AAAA,EAC7F;AACF;AAEA,SAAS,mBAAmB,aAAa,CAAC,GAAG;AAC3C,MAAI,YAAY;AACd,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAEA,MAAI,UAAU;AACZ,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,MAAI,eAAe,QAAQ,OAAO,eAAe,UAAU;AACzD,UAAM,IAAI,UAAU,iDAAiD;AAAA,EACvE;AAEA,QAAM,EAAE,YAAY,QAAW,oBAAoB,QAAQ,SAAS,OAAU,IAAI;AAGlF,MAAI,CAAC,sBAAsB,iBAAiB,GAAG;AAC7C,UAAM,IAAI,UAAU,qCAAqC,qBAAqB,KAAK,IAAI,CAAC,EAAE;AAAA,EAC5F;AAGA,MAAI,cAAc,QAAW;AAC3B,QAAI,EAAE,qBAAqB,MAAM;AAC/B,YAAM,IAAI,UAAU,yBAAyB;AAAA,IAC/C;AACA,iBAAa;AAAA,EACf,OAAO;AACL,QACE,sBAAsB,mBACtB,sBAAsB,yBACtB,sBAAsB,sBACtB;AACA,YAAM,IAAI,MAAM,oDAAoD,iBAAiB,GAAG;AAAA,IAC1F;AAAA,EACF;AAGA,iBAAe,MAAM;AAErB,uBAAqB;AACrB,YAAU;AACV,eAAa;AACf;AAaA,SAAS,qCAAqC;AAC5C,QAAM,YAAY;AAElB,MAAI,cAAc,QAAW;AAC3B,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,MAAI,mCAAmC,QAAW;AAChD,WAAO;AAAA,EACT;AAEA,mCAAiC,+BAA+B,WAAW,gBAAgB;AAC3F,SAAO;AACT;AASA,eAAe,sCAAsC;AACnD,QAAM,sBAAsB,MAAM,mCAAmC;AACrE,SAAO,MAAM,6CAA6C,mBAAmB;AAC/E;AASA,eAAe,2CAA2C;AACxD,MAAI,eAAe,QAAW;AAC5B,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,SAAO,EAAE,QAAQ,MAAM,6BAA6B,UAAU,GAAG,SAAS,OAAU;AACtF;AAiBA,eAAe,2CAA2C;AACxD,QAAM,mCAAmC;AACzC,SAAO,MAAM,yCAAyC;AACxD;AASA,eAAe,2BAA2B;AACxC,QAAM,eAAe;AACrB,SAAO,MAAM,4BAA4B,YAAY;AACvD;AAMA,eAAe,sBAAsB,cAAc,YAAY,aAAa,OAAO;AACjF,MAAI,UAAU;AACd,MAAI,SAAS;AAEb,MAAI;AACF,UAAM,SAAS,MAAM,aAAa;AAClC,aAAS,OAAO;AAChB,cAAU,OAAO;AAEjB,aAAS,MAAM,YAAY,WAAW,oBAAoB,KAAK,EAAE;AACjE,WAAO,YAAY,UAAU;AAC7B,UAAM,iBAAiB,QAAQ,2BAA2B;AAE1D,QAAI,SAAS;AACX,UAAI,gBAAgB,OAAO;AAC3B,gBAAU;AAAA,IACZ;AAEA,aAAS,MAAM,YAAY,WAAW,WAAW;AACjD,WAAO;AAAA,EACT,SAAS,GAAG;AACV,QAAI,SAAS;AACX,UAAI,gBAAgB,OAAO;AAAA,IAC7B;AAEA,QAAI,QAAQ;AACV,UAAI;AACF,cAAM,OAAO,UAAU;AAAA,MACzB,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AACF;AAOA,eAAe,wCAAwC,YAAY,aAAa;AAC9E,SAAO,MAAM;AAAA,IACX,MAAM,yBAAyB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAe,sCAAsC,YAAY,aAAa;AAC5E,SAAO,MAAM;AAAA,IACX,MAAM,oCAAoC;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAe,0CAA0C,YAAY,aAAa;AAChF,SAAO,MAAM;AAAA,IACX,MAAM,yCAAyC;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAe,0CAA0C,YAAY,aAAa;AAChF,SAAO,MAAM;AAAA,IACX,MAAM,yCAAyC;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAe,0BAA0B,YAAY,aAAa;AAChE,MAAI,YAAY;AACd,QAAI;AAIF,aAAO,MAAM,sCAAsC,YAAY,WAAW;AAAA,IAC5E,SAAS,GAAG;AACV,UAAI,wBAAwB,CAAC,GAAG;AAC9B,cAAM;AAAA,MACR;AAEA,eAAS,MAAM,YAAY,WAAW,mEAAmE,CAAC;AAAA,IAC5G;AAAA,EACF;AAEA,MAAI;AAIF,WAAO,MAAM,wCAAwC,YAAY,WAAW;AAAA,EAC9E,SAAS,GAAG;AACV,UAAM,IAAI,MAAM,gGAAgG;AAAA,MAC9G,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAMA,eAAe,gCAAgC,YAAY,aAAa;AACtE,UAAQ,oBAAoB;AAAA,IAC1B,KAAK;AACH,aAAO,MAAM,wCAAwC,YAAY,WAAW;AAAA,IAE9E,KAAK;AACH,aAAO,MAAM,sCAAsC,YAAY,WAAW;AAAA,IAE5E,KAAK;AACH,aAAO,MAAM,0CAA0C,YAAY,WAAW;AAAA,IAEhF,KAAK;AACH,aAAO,MAAM,0CAA0C,YAAY,WAAW;AAAA,IAEhF,KAAK;AACH,aAAO,MAAM,0BAA0B,YAAY,WAAW;AAAA,IAEhE;AACE,YAAM,IAAI,MAAM,kCAAkC,kBAAkB,EAAE;AAAA,EAC1E;AACF;AAMA,eAAe,aAAaA,SAAQ,QAAQ,SAAS;AACnD,MAAI,UAAU;AACZ,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAEA,aAAW;AACX,cAAY;AAEZ,MAAI;AACF,QAAI,cAAc;AAChB,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,QAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,aAAa;AAAA,MACjB,MAAM;AAAA,MACN,MAAM,EAAE,gBAAgBA,SAAQ,OAAO;AAAA,MACvC,UAAU,QAAQ,SAAS;AAAA,IAC7B;AACA,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,MAAM,KAAK,EAAE,QAAQ,QAAQ,WAAW,EAAE,GAAG,OAAO,GAAG,gBAAgB;AACrE,eAAO,MAAM,gCAAgC,YAAY,WAAW;AAAA,MACtE,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,CAAC;AACjB,UAAM,SAAS,CAAC;AAEhB,eAAW,UAAU,SAAS;AAC5B,UAAI,OAAO,WAAW,aAAa;AACjC,gBAAQ,KAAK,OAAO,KAAK;AAAA,MAC3B,OAAO;AACL,eAAO,KAAK,OAAO,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,QAAQ,WAAW,QAAQ,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAC1D,YAAM,OAAO,CAAC;AAAA,IAChB;AAEA,eAAW;AACX,YAAQ,MAAM;AAAA,EAChB,UAAE;AACA,gBAAY;AAKZ,qCAAiC;AAAA,EACnC;AACF;AAEA,eAAe,mBAAmB;AAChC,MAAI,WAAW;AACb,UAAM,IAAI,MAAM,+FAA+F;AAAA,EACjH;AAEA,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,UAAU;AACb;AAAA,EACF;AAEA,QAAM,UAAU;AAChB,aAAW;AACX,iBAAe,QAAQ,WAAW,QAAQ,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEnE,SAAO;AACT;",
|
|
6
6
|
"names": ["module"]
|
|
7
7
|
}
|
|
@@ -35,7 +35,7 @@ __export(loadKmsLib_exports, {
|
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(loadKmsLib_exports);
|
|
37
37
|
const KMS_VERSIONS = Object.freeze(["0.13.10", "0.13.20-0"]);
|
|
38
|
-
const DEFAULT_TKMS_VERSION = "0.13.
|
|
38
|
+
const DEFAULT_TKMS_VERSION = "0.13.20-0";
|
|
39
39
|
const _loaders = {
|
|
40
40
|
"0.13.10": () => import("./v0.13.10/kms_lib.js"),
|
|
41
41
|
"0.13.20-0": () => import("./v0.13.20-0/kms_lib.js")
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../../../../../../tmp/fhevm-loaders-
|
|
4
|
-
"sourcesContent": ["// AUTO-GENERATED FROM versionsManifest.js - DO NOT EDIT.\n// Generator: scripts/build/codegen-loaders.mjs\n// Profile: prod\n//\n// Version-selective TKMS loader. Authored as plain ESM .js (not .ts) so the\n// published artifact is byte-identical to source. Types live in the sibling\n// loadKmsLib.d.ts.\n\n////////////////////////////////////////////////////////////////////////////////\n\nexport const KMS_VERSIONS = Object.freeze(['0.13.10', '0.13.20-0']);\nexport const DEFAULT_TKMS_VERSION = '0.13.
|
|
3
|
+
"sources": ["../../../../../../../../../../../tmp/fhevm-loaders-4413-1780043976133/tkms/loadKmsLib.js"],
|
|
4
|
+
"sourcesContent": ["// AUTO-GENERATED FROM versionsManifest.js - DO NOT EDIT.\n// Generator: scripts/build/codegen-loaders.mjs\n// Profile: prod\n//\n// Version-selective TKMS loader. Authored as plain ESM .js (not .ts) so the\n// published artifact is byte-identical to source. Types live in the sibling\n// loadKmsLib.d.ts.\n\n////////////////////////////////////////////////////////////////////////////////\n\nexport const KMS_VERSIONS = Object.freeze(['0.13.10', '0.13.20-0']);\nexport const DEFAULT_TKMS_VERSION = '0.13.20-0';\n\nconst _loaders = {\n '0.13.10': () => import('./v0.13.10/kms_lib.js'),\n '0.13.20-0': () => import('./v0.13.20-0/kms_lib.js'),\n};\n\n////////////////////////////////////////////////////////////////////////////////\n\nconst _wasmBase64Loaders = {\n '0.13.10': () => import('./v0.13.10/kms_lib_bg.wasm.base64.js'),\n '0.13.20-0': () => import('./v0.13.20-0/kms_lib_bg.wasm.base64.js'),\n};\n\n////////////////////////////////////////////////////////////////////////////////\n\nconst _assets = Object.freeze({\n '0.13.10': Object.freeze({\n wasm: Object.freeze({\n filename: 'kms_lib_bg.v0.13.10.wasm',\n localRelativePath: './v0.13.10/kms_lib_bg.wasm',\n sha256: '31cfb31392445ae2630f560b961edd21c72e40d58cb20c455f9fc4d4750bb9a0',\n }),\n }),\n '0.13.20-0': Object.freeze({\n wasm: Object.freeze({\n filename: 'kms_lib_bg.v0.13.20-0.wasm',\n localRelativePath: './v0.13.20-0/kms_lib_bg.wasm',\n sha256: 'be54c8f11daf048b897b41cf6e6735895490cdca77f2a01c01be0d6fbf369c81',\n }),\n }),\n});\n\n////////////////////////////////////////////////////////////////////////////////\n\nexport function kmsAssetsWithVersion(version) {\n const assets = _assets[version];\n if (!assets) throw new Error(`unsupported tkms version: ${version}`);\n return assets;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nexport async function loadKmsLib(version) {\n const loader = _loaders[version];\n if (!loader) throw new Error(`unsupported tkms version: ${version}`);\n return loader();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n\nexport async function loadKmsWasmBase64(version) {\n const loader = _wasmBase64Loaders[version];\n if (!loader) throw new Error(`unsupported tkms version: ${version}`);\n return loader();\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUO,MAAM,eAAe,OAAO,OAAO,CAAC,WAAW,WAAW,CAAC;AAC3D,MAAM,uBAAuB;AAEpC,MAAM,WAAW;AAAA,EACf,WAAW,MAAM,OAAO,uBAAuB;AAAA,EAC/C,aAAa,MAAM,OAAO,yBAAyB;AACrD;AAIA,MAAM,qBAAqB;AAAA,EACzB,WAAW,MAAM,OAAO,sCAAsC;AAAA,EAC9D,aAAa,MAAM,OAAO,wCAAwC;AACpE;AAIA,MAAM,UAAU,OAAO,OAAO;AAAA,EAC5B,WAAW,OAAO,OAAO;AAAA,IACvB,MAAM,OAAO,OAAO;AAAA,MAClB,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AAAA,EACD,aAAa,OAAO,OAAO;AAAA,IACzB,MAAM,OAAO,OAAO;AAAA,MAClB,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAIM,SAAS,qBAAqB,SAAS;AAC5C,QAAM,SAAS,QAAQ,OAAO;AAC9B,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,6BAA6B,OAAO,EAAE;AACnE,SAAO;AACT;AAIA,eAAsB,WAAW,SAAS;AACxC,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,6BAA6B,OAAO,EAAE;AACnE,SAAO,OAAO;AAChB;AAIA,eAAsB,kBAAkB,SAAS;AAC/C,QAAM,SAAS,mBAAmB,OAAO;AACzC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,6BAA6B,OAAO,EAAE;AACnE,SAAO,OAAO;AAChB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/_esm/core/_version.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { isAllowedForDecryption } from '../../host-contracts/isAllowedForDecryption.js';
|
|
2
2
|
import { toFhevmHandle } from '../../handle/FhevmHandle.js';
|
|
3
3
|
////////////////////////////////////////////////////////////////////////////////
|
|
4
|
-
export async function
|
|
4
|
+
export async function canDecryptPublicValue(fhevm, parameters) {
|
|
5
5
|
const results = await isAllowedForDecryption(fhevm, {
|
|
6
6
|
address: fhevm.chain.fhevm.contracts.acl.address,
|
|
7
7
|
handles: [toFhevmHandle(parameters.encryptedValue)],
|
|
8
8
|
});
|
|
9
9
|
return results[0] === true;
|
|
10
10
|
}
|
|
11
|
-
//# sourceMappingURL=
|
|
11
|
+
//# sourceMappingURL=canDecryptPublicValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canDecryptPublicValue.js","sourceRoot":"","sources":["../../../../core/actions/base/canDecryptPublicValue.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAU5D,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAwB,EACxB,UAA2C;IAE3C,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,KAAK,EAAE;QAClD,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,OAA6B;QACtE,OAAO,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;KACpD,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAC7B,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { isAllowedForDecryption } from '../../host-contracts/isAllowedForDecryption.js';
|
|
2
2
|
import { toFhevmHandle } from '../../handle/FhevmHandle.js';
|
|
3
3
|
////////////////////////////////////////////////////////////////////////////////
|
|
4
|
-
export async function
|
|
4
|
+
export async function canDecryptPublicValues(fhevm, parameters) {
|
|
5
5
|
const handles = parameters.encryptedValues.map(toFhevmHandle);
|
|
6
6
|
return isAllowedForDecryption(fhevm, {
|
|
7
7
|
address: fhevm.chain.fhevm.contracts.acl.address,
|
|
8
8
|
handles,
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
|
-
//# sourceMappingURL=
|
|
11
|
+
//# sourceMappingURL=canDecryptPublicValues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canDecryptPublicValues.js","sourceRoot":"","sources":["../../../../core/actions/base/canDecryptPublicValues.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAU5D,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAwB,EACxB,UAA4C;IAE5C,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE9D,OAAO,sBAAsB,CAAC,KAAK,EAAE;QACnC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,OAA6B;QACtE,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -2,10 +2,10 @@ import { toFhevmHandle } from '../../handle/FhevmHandle.js';
|
|
|
2
2
|
import { publicDecrypt as publicDecrypt_ } from '../../kms/publicDecrypt.js';
|
|
3
3
|
import { clearValueToTypedValue } from '../../handle/ClearValue.js';
|
|
4
4
|
////////////////////////////////////////////////////////////////////////////////
|
|
5
|
-
export async function
|
|
5
|
+
export async function decryptPublicValue(fhevm, parameters) {
|
|
6
6
|
const handle = toFhevmHandle(parameters.encryptedValue);
|
|
7
|
-
const originToken = Symbol('
|
|
7
|
+
const originToken = Symbol('decryptPublicValues');
|
|
8
8
|
const res = await publicDecrypt_(fhevm, { ...parameters, handles: [handle], originToken });
|
|
9
9
|
return clearValueToTypedValue(res.orderedClearValues[0], originToken);
|
|
10
10
|
}
|
|
11
|
-
//# sourceMappingURL=
|
|
11
|
+
//# sourceMappingURL=decryptPublicValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decryptPublicValue.js","sourceRoot":"","sources":["../../../../core/actions/base/decryptPublicValue.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAWpE,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAwB,EACxB,UAAwC;IAExC,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAExD,MAAM,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAE3F,OAAO,sBAAsB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -2,10 +2,10 @@ import { toFhevmHandle } from '../../handle/FhevmHandle.js';
|
|
|
2
2
|
import { publicDecrypt as publicDecrypt_ } from '../../kms/publicDecrypt.js';
|
|
3
3
|
import { clearValueToTypedValue } from '../../handle/ClearValue.js';
|
|
4
4
|
////////////////////////////////////////////////////////////////////////////////
|
|
5
|
-
export async function
|
|
5
|
+
export async function decryptPublicValues(fhevm, parameters) {
|
|
6
6
|
const handles = parameters.encryptedValues.map(toFhevmHandle);
|
|
7
|
-
const originToken = Symbol('
|
|
7
|
+
const originToken = Symbol('decryptPublicValues');
|
|
8
8
|
const res = await publicDecrypt_(fhevm, { ...parameters, handles, originToken });
|
|
9
9
|
return res.orderedClearValues.map((cv) => clearValueToTypedValue(cv, originToken));
|
|
10
10
|
}
|
|
11
|
-
//# sourceMappingURL=
|
|
11
|
+
//# sourceMappingURL=decryptPublicValues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decryptPublicValues.js","sourceRoot":"","sources":["../../../../core/actions/base/decryptPublicValues.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAWpE,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAwB,EACxB,UAAyC;IAEzC,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE9D,MAAM,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAEjF,OAAO,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,sBAAsB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;AACrF,CAAC"}
|
|
@@ -2,9 +2,9 @@ import { toFhevmHandle } from '../../handle/FhevmHandle.js';
|
|
|
2
2
|
import { publicDecrypt as publicDecrypt_ } from '../../kms/publicDecrypt.js';
|
|
3
3
|
import { clearValueToTypedValue } from '../../handle/ClearValue.js';
|
|
4
4
|
////////////////////////////////////////////////////////////////////////////////
|
|
5
|
-
export async function
|
|
5
|
+
export async function decryptPublicValuesWithSignatures(fhevm, parameters) {
|
|
6
6
|
const handles = parameters.encryptedValues.map(toFhevmHandle);
|
|
7
|
-
const originToken = Symbol('
|
|
7
|
+
const originToken = Symbol('decryptPublicValues');
|
|
8
8
|
const res = await publicDecrypt_(fhevm, { ...parameters, handles, originToken });
|
|
9
9
|
const typedValues = res.orderedClearValues.map((cv) => clearValueToTypedValue(cv, originToken));
|
|
10
10
|
return Object.freeze({
|
|
@@ -16,4 +16,4 @@ export async function readPublicValuesWithSignatures(fhevm, parameters) {
|
|
|
16
16
|
}),
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
|
-
//# sourceMappingURL=
|
|
19
|
+
//# sourceMappingURL=decryptPublicValuesWithSignatures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decryptPublicValuesWithSignatures.js","sourceRoot":"","sources":["../../../../core/actions/base/decryptPublicValuesWithSignatures.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAkBpE,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,KAAwB,EACxB,UAAuD;IAEvD,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE9D,MAAM,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAEjF,MAAM,WAAW,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CACpD,sBAAsB,CAAC,EAAE,EAAE,WAAW,CAAC,CACQ,CAAC;IAElD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,WAAW,EAAE,WAAW;QACxB,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC;YACjC,WAAW,EAAE,MAAM,CAAC,MAAM,CACxB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CACqB;YACvD,oBAAoB,EAAE,GAAG,CAAC,4BAA4B;YACtD,eAAe,EAAE,GAAG,CAAC,eAAe;SACrC,CAAC;KACH,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export { readKmsSignersContext } from './readKmsSignersContext.js';
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
2
|
+
export { decryptPublicValue, } from './decryptPublicValue.js';
|
|
3
|
+
export { decryptPublicValues, } from './decryptPublicValues.js';
|
|
4
|
+
export { decryptPublicValuesWithSignatures, } from './decryptPublicValuesWithSignatures.js';
|
|
5
|
+
export { canDecryptPublicValue, } from './canDecryptPublicValue.js';
|
|
6
|
+
export { canDecryptPublicValues, } from './canDecryptPublicValues.js';
|
|
7
7
|
export { createVerifiedInputProofFromRawBytes, } from './createVerifiedInputProofFromRawBytes.js';
|
|
8
8
|
export { readCoprocessorSignersContext, } from './readCoprocessorSignersContext.js';
|
|
9
9
|
export { verifyInputProof, } from './verifyInputProof.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../core/actions/base/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEzG,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../core/actions/base/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEzG,OAAO,EAGL,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAGL,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAGL,iCAAiC,GAClC,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAGL,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAGL,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAGL,oCAAoC,GACrC,MAAM,2CAA2C,CAAC;AAEnD,OAAO,EAEL,6BAA6B,GAC9B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAGL,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAGL,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAGL,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAEL,kCAAkC,GACnC,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAIL,2BAA2B,GAC5B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAEL,kCAAkC,GACnC,MAAM,yCAAyC,CAAC"}
|