🚨 Active Supply Chain Attack:node-ipc Package Compromised.Learn More
Socket
Book a DemoSign in
Socket

@sentry/node-core

Package Overview
Dependencies
Maintainers
1
Versions
84
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@sentry/node-core - npm Package Compare versions

Comparing version
10.50.0-alpha.0
to
10.50.0
+116
build/cjs/integrations/console.js
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const core = require('@sentry/core');
/**
* Node-specific console integration that captures breadcrumbs and handles
* the AWS Lambda runtime replacing console methods after our patch.
*
* In Lambda, console methods are patched via `Object.defineProperty` so that
* external replacements (by the Lambda runtime) are absorbed as the delegate
* while our wrapper stays in place. Outside Lambda, this delegates entirely
* to the core `consoleIntegration` which uses the simpler `fill`-based patch.
*/
const consoleIntegration = core.defineIntegration((options = {}) => {
return {
name: 'Console',
setup(client) {
if (process.env.LAMBDA_TASK_ROOT) {
core.maybeInstrument('console', instrumentConsoleLambda);
}
// Delegate breadcrumb handling to the core console integration.
const core$1 = core.consoleIntegration(options);
core$1.setup?.(client);
},
};
});
function instrumentConsoleLambda() {
const consoleObj = core.GLOBAL_OBJ?.console;
if (!consoleObj) {
return;
}
core.CONSOLE_LEVELS.forEach((level) => {
if (level in consoleObj) {
patchWithDefineProperty(consoleObj, level);
}
});
}
function patchWithDefineProperty(consoleObj, level) {
const nativeMethod = consoleObj[level] ;
core.originalConsoleMethods[level] = nativeMethod;
let delegate = nativeMethod;
let savedDelegate;
let isExecuting = false;
const wrapper = function (...args) {
if (isExecuting) {
// Re-entrant call: a third party captured `wrapper` via the getter and calls it from inside their replacement. We must
// use `nativeMethod` (not `delegate`) to break the cycle, and we intentionally skip `triggerHandlers` to avoid duplicate
// breadcrumbs. The outer invocation already triggered the handlers for this console call.
nativeMethod.apply(consoleObj, args);
return;
}
isExecuting = true;
try {
core.triggerHandlers('console', { args, level } );
delegate.apply(consoleObj, args);
} finally {
isExecuting = false;
}
};
core.markFunctionWrapped(wrapper , nativeMethod );
// consoleSandbox reads originalConsoleMethods[level] to temporarily bypass instrumentation. We replace it with a distinct reference (.bind creates a
// new function identity) so the setter can tell apart "consoleSandbox bypass" from "external code restoring a native method captured before Sentry init."
const sandboxBypass = nativeMethod.bind(consoleObj);
core.originalConsoleMethods[level] = sandboxBypass;
try {
let current = wrapper;
Object.defineProperty(consoleObj, level, {
configurable: true,
enumerable: true,
get() {
return current;
},
set(newValue) {
if (newValue === wrapper) {
// consoleSandbox restoring the wrapper: recover the saved delegate.
if (savedDelegate !== undefined) {
delegate = savedDelegate;
savedDelegate = undefined;
}
current = wrapper;
} else if (newValue === sandboxBypass) {
// consoleSandbox entering bypass: save delegate, let getter return sandboxBypass directly so calls skip the wrapper entirely.
savedDelegate = delegate;
current = sandboxBypass;
} else if (typeof newValue === 'function' && !(newValue ).__sentry_original__) {
delegate = newValue;
current = wrapper;
} else {
current = newValue;
}
},
});
} catch {
// Fall back to fill-based patching if defineProperty fails
core.fill(consoleObj, level, function (originalConsoleMethod) {
core.originalConsoleMethods[level] = originalConsoleMethod;
return function ( ...args) {
core.triggerHandlers('console', { args, level } );
core.originalConsoleMethods[level]?.apply(this, args);
};
});
}
}
exports.consoleIntegration = consoleIntegration;
//# sourceMappingURL=console.js.map
{"version":3,"file":"console.js","sources":["../../../src/integrations/console.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { ConsoleLevel, HandlerDataConsole, WrappedFunction } from '@sentry/core';\nimport {\n CONSOLE_LEVELS,\n GLOBAL_OBJ,\n consoleIntegration as coreConsoleIntegration,\n defineIntegration,\n fill,\n markFunctionWrapped,\n maybeInstrument,\n originalConsoleMethods,\n triggerHandlers,\n} from '@sentry/core';\n\ninterface ConsoleIntegrationOptions {\n levels: ConsoleLevel[];\n}\n\n/**\n * Node-specific console integration that captures breadcrumbs and handles\n * the AWS Lambda runtime replacing console methods after our patch.\n *\n * In Lambda, console methods are patched via `Object.defineProperty` so that\n * external replacements (by the Lambda runtime) are absorbed as the delegate\n * while our wrapper stays in place. Outside Lambda, this delegates entirely\n * to the core `consoleIntegration` which uses the simpler `fill`-based patch.\n */\nexport const consoleIntegration = defineIntegration((options: Partial<ConsoleIntegrationOptions> = {}) => {\n return {\n name: 'Console',\n setup(client) {\n if (process.env.LAMBDA_TASK_ROOT) {\n maybeInstrument('console', instrumentConsoleLambda);\n }\n\n // Delegate breadcrumb handling to the core console integration.\n const core = coreConsoleIntegration(options);\n core.setup?.(client);\n },\n };\n});\n\nfunction instrumentConsoleLambda(): void {\n const consoleObj = GLOBAL_OBJ?.console;\n if (!consoleObj) {\n return;\n }\n\n CONSOLE_LEVELS.forEach((level: ConsoleLevel) => {\n if (level in consoleObj) {\n patchWithDefineProperty(consoleObj, level);\n }\n });\n}\n\nfunction patchWithDefineProperty(consoleObj: Console, level: ConsoleLevel): void {\n const nativeMethod = consoleObj[level] as (...args: unknown[]) => void;\n originalConsoleMethods[level] = nativeMethod;\n\n let delegate: Function = nativeMethod;\n let savedDelegate: Function | undefined;\n let isExecuting = false;\n\n const wrapper = function (...args: any[]): void {\n if (isExecuting) {\n // Re-entrant call: a third party captured `wrapper` via the getter and calls it from inside their replacement. We must\n // use `nativeMethod` (not `delegate`) to break the cycle, and we intentionally skip `triggerHandlers` to avoid duplicate\n // breadcrumbs. The outer invocation already triggered the handlers for this console call.\n nativeMethod.apply(consoleObj, args);\n return;\n }\n isExecuting = true;\n try {\n triggerHandlers('console', { args, level } as HandlerDataConsole);\n delegate.apply(consoleObj, args);\n } finally {\n isExecuting = false;\n }\n };\n markFunctionWrapped(wrapper as unknown as WrappedFunction, nativeMethod as unknown as WrappedFunction);\n\n // consoleSandbox reads originalConsoleMethods[level] to temporarily bypass instrumentation. We replace it with a distinct reference (.bind creates a\n // new function identity) so the setter can tell apart \"consoleSandbox bypass\" from \"external code restoring a native method captured before Sentry init.\"\n const sandboxBypass = nativeMethod.bind(consoleObj);\n originalConsoleMethods[level] = sandboxBypass;\n\n try {\n let current: any = wrapper;\n\n Object.defineProperty(consoleObj, level, {\n configurable: true,\n enumerable: true,\n get() {\n return current;\n },\n set(newValue) {\n if (newValue === wrapper) {\n // consoleSandbox restoring the wrapper: recover the saved delegate.\n if (savedDelegate !== undefined) {\n delegate = savedDelegate;\n savedDelegate = undefined;\n }\n current = wrapper;\n } else if (newValue === sandboxBypass) {\n // consoleSandbox entering bypass: save delegate, let getter return sandboxBypass directly so calls skip the wrapper entirely.\n savedDelegate = delegate;\n current = sandboxBypass;\n } else if (typeof newValue === 'function' && !(newValue as WrappedFunction).__sentry_original__) {\n delegate = newValue;\n current = wrapper;\n } else {\n current = newValue;\n }\n },\n });\n } catch {\n // Fall back to fill-based patching if defineProperty fails\n fill(consoleObj, level, function (originalConsoleMethod: () => any): Function {\n originalConsoleMethods[level] = originalConsoleMethod;\n\n return function (this: Console, ...args: any[]): void {\n triggerHandlers('console', { args, level } as HandlerDataConsole);\n originalConsoleMethods[level]?.apply(this, args);\n };\n });\n }\n}\n"],"names":["defineIntegration","maybeInstrument","core","coreConsoleIntegration","GLOBAL_OBJ","CONSOLE_LEVELS","originalConsoleMethods","triggerHandlers","markFunctionWrapped","fill"],"mappings":"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"}
import { defineIntegration, maybeInstrument, consoleIntegration as consoleIntegration$1, GLOBAL_OBJ, CONSOLE_LEVELS, originalConsoleMethods, markFunctionWrapped, fill, triggerHandlers } from '@sentry/core';
/**
* Node-specific console integration that captures breadcrumbs and handles
* the AWS Lambda runtime replacing console methods after our patch.
*
* In Lambda, console methods are patched via `Object.defineProperty` so that
* external replacements (by the Lambda runtime) are absorbed as the delegate
* while our wrapper stays in place. Outside Lambda, this delegates entirely
* to the core `consoleIntegration` which uses the simpler `fill`-based patch.
*/
const consoleIntegration = defineIntegration((options = {}) => {
return {
name: 'Console',
setup(client) {
if (process.env.LAMBDA_TASK_ROOT) {
maybeInstrument('console', instrumentConsoleLambda);
}
// Delegate breadcrumb handling to the core console integration.
const core = consoleIntegration$1(options);
core.setup?.(client);
},
};
});
function instrumentConsoleLambda() {
const consoleObj = GLOBAL_OBJ?.console;
if (!consoleObj) {
return;
}
CONSOLE_LEVELS.forEach((level) => {
if (level in consoleObj) {
patchWithDefineProperty(consoleObj, level);
}
});
}
function patchWithDefineProperty(consoleObj, level) {
const nativeMethod = consoleObj[level] ;
originalConsoleMethods[level] = nativeMethod;
let delegate = nativeMethod;
let savedDelegate;
let isExecuting = false;
const wrapper = function (...args) {
if (isExecuting) {
// Re-entrant call: a third party captured `wrapper` via the getter and calls it from inside their replacement. We must
// use `nativeMethod` (not `delegate`) to break the cycle, and we intentionally skip `triggerHandlers` to avoid duplicate
// breadcrumbs. The outer invocation already triggered the handlers for this console call.
nativeMethod.apply(consoleObj, args);
return;
}
isExecuting = true;
try {
triggerHandlers('console', { args, level } );
delegate.apply(consoleObj, args);
} finally {
isExecuting = false;
}
};
markFunctionWrapped(wrapper , nativeMethod );
// consoleSandbox reads originalConsoleMethods[level] to temporarily bypass instrumentation. We replace it with a distinct reference (.bind creates a
// new function identity) so the setter can tell apart "consoleSandbox bypass" from "external code restoring a native method captured before Sentry init."
const sandboxBypass = nativeMethod.bind(consoleObj);
originalConsoleMethods[level] = sandboxBypass;
try {
let current = wrapper;
Object.defineProperty(consoleObj, level, {
configurable: true,
enumerable: true,
get() {
return current;
},
set(newValue) {
if (newValue === wrapper) {
// consoleSandbox restoring the wrapper: recover the saved delegate.
if (savedDelegate !== undefined) {
delegate = savedDelegate;
savedDelegate = undefined;
}
current = wrapper;
} else if (newValue === sandboxBypass) {
// consoleSandbox entering bypass: save delegate, let getter return sandboxBypass directly so calls skip the wrapper entirely.
savedDelegate = delegate;
current = sandboxBypass;
} else if (typeof newValue === 'function' && !(newValue ).__sentry_original__) {
delegate = newValue;
current = wrapper;
} else {
current = newValue;
}
},
});
} catch {
// Fall back to fill-based patching if defineProperty fails
fill(consoleObj, level, function (originalConsoleMethod) {
originalConsoleMethods[level] = originalConsoleMethod;
return function ( ...args) {
triggerHandlers('console', { args, level } );
originalConsoleMethods[level]?.apply(this, args);
};
});
}
}
export { consoleIntegration };
//# sourceMappingURL=console.js.map
{"version":3,"file":"console.js","sources":["../../../src/integrations/console.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { ConsoleLevel, HandlerDataConsole, WrappedFunction } from '@sentry/core';\nimport {\n CONSOLE_LEVELS,\n GLOBAL_OBJ,\n consoleIntegration as coreConsoleIntegration,\n defineIntegration,\n fill,\n markFunctionWrapped,\n maybeInstrument,\n originalConsoleMethods,\n triggerHandlers,\n} from '@sentry/core';\n\ninterface ConsoleIntegrationOptions {\n levels: ConsoleLevel[];\n}\n\n/**\n * Node-specific console integration that captures breadcrumbs and handles\n * the AWS Lambda runtime replacing console methods after our patch.\n *\n * In Lambda, console methods are patched via `Object.defineProperty` so that\n * external replacements (by the Lambda runtime) are absorbed as the delegate\n * while our wrapper stays in place. Outside Lambda, this delegates entirely\n * to the core `consoleIntegration` which uses the simpler `fill`-based patch.\n */\nexport const consoleIntegration = defineIntegration((options: Partial<ConsoleIntegrationOptions> = {}) => {\n return {\n name: 'Console',\n setup(client) {\n if (process.env.LAMBDA_TASK_ROOT) {\n maybeInstrument('console', instrumentConsoleLambda);\n }\n\n // Delegate breadcrumb handling to the core console integration.\n const core = coreConsoleIntegration(options);\n core.setup?.(client);\n },\n };\n});\n\nfunction instrumentConsoleLambda(): void {\n const consoleObj = GLOBAL_OBJ?.console;\n if (!consoleObj) {\n return;\n }\n\n CONSOLE_LEVELS.forEach((level: ConsoleLevel) => {\n if (level in consoleObj) {\n patchWithDefineProperty(consoleObj, level);\n }\n });\n}\n\nfunction patchWithDefineProperty(consoleObj: Console, level: ConsoleLevel): void {\n const nativeMethod = consoleObj[level] as (...args: unknown[]) => void;\n originalConsoleMethods[level] = nativeMethod;\n\n let delegate: Function = nativeMethod;\n let savedDelegate: Function | undefined;\n let isExecuting = false;\n\n const wrapper = function (...args: any[]): void {\n if (isExecuting) {\n // Re-entrant call: a third party captured `wrapper` via the getter and calls it from inside their replacement. We must\n // use `nativeMethod` (not `delegate`) to break the cycle, and we intentionally skip `triggerHandlers` to avoid duplicate\n // breadcrumbs. The outer invocation already triggered the handlers for this console call.\n nativeMethod.apply(consoleObj, args);\n return;\n }\n isExecuting = true;\n try {\n triggerHandlers('console', { args, level } as HandlerDataConsole);\n delegate.apply(consoleObj, args);\n } finally {\n isExecuting = false;\n }\n };\n markFunctionWrapped(wrapper as unknown as WrappedFunction, nativeMethod as unknown as WrappedFunction);\n\n // consoleSandbox reads originalConsoleMethods[level] to temporarily bypass instrumentation. We replace it with a distinct reference (.bind creates a\n // new function identity) so the setter can tell apart \"consoleSandbox bypass\" from \"external code restoring a native method captured before Sentry init.\"\n const sandboxBypass = nativeMethod.bind(consoleObj);\n originalConsoleMethods[level] = sandboxBypass;\n\n try {\n let current: any = wrapper;\n\n Object.defineProperty(consoleObj, level, {\n configurable: true,\n enumerable: true,\n get() {\n return current;\n },\n set(newValue) {\n if (newValue === wrapper) {\n // consoleSandbox restoring the wrapper: recover the saved delegate.\n if (savedDelegate !== undefined) {\n delegate = savedDelegate;\n savedDelegate = undefined;\n }\n current = wrapper;\n } else if (newValue === sandboxBypass) {\n // consoleSandbox entering bypass: save delegate, let getter return sandboxBypass directly so calls skip the wrapper entirely.\n savedDelegate = delegate;\n current = sandboxBypass;\n } else if (typeof newValue === 'function' && !(newValue as WrappedFunction).__sentry_original__) {\n delegate = newValue;\n current = wrapper;\n } else {\n current = newValue;\n }\n },\n });\n } catch {\n // Fall back to fill-based patching if defineProperty fails\n fill(consoleObj, level, function (originalConsoleMethod: () => any): Function {\n originalConsoleMethods[level] = originalConsoleMethod;\n\n return function (this: Console, ...args: any[]): void {\n triggerHandlers('console', { args, level } as HandlerDataConsole);\n originalConsoleMethods[level]?.apply(this, args);\n };\n });\n }\n}\n"],"names":["coreConsoleIntegration"],"mappings":"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"}
import { ConsoleLevel } from '@sentry/core';
interface ConsoleIntegrationOptions {
levels: ConsoleLevel[];
}
/**
* Node-specific console integration that captures breadcrumbs and handles
* the AWS Lambda runtime replacing console methods after our patch.
*
* In Lambda, console methods are patched via `Object.defineProperty` so that
* external replacements (by the Lambda runtime) are absorbed as the delegate
* while our wrapper stays in place. Outside Lambda, this delegates entirely
* to the core `consoleIntegration` which uses the simpler `fill`-based patch.
*/
export declare const consoleIntegration: (options?: Partial<ConsoleIntegrationOptions> | undefined) => import("@sentry/core").Integration;
export {};
//# sourceMappingURL=console.d.ts.map
import type { ConsoleLevel } from '@sentry/core';
interface ConsoleIntegrationOptions {
levels: ConsoleLevel[];
}
/**
* Node-specific console integration that captures breadcrumbs and handles
* the AWS Lambda runtime replacing console methods after our patch.
*
* In Lambda, console methods are patched via `Object.defineProperty` so that
* external replacements (by the Lambda runtime) are absorbed as the delegate
* while our wrapper stays in place. Outside Lambda, this delegates entirely
* to the core `consoleIntegration` which uses the simpler `fill`-based patch.
*/
export declare const consoleIntegration: (options?: Partial<ConsoleIntegrationOptions> | undefined) => import("@sentry/core").Integration;
export {};
//# sourceMappingURL=console.d.ts.map
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/integrations/console.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAuC,MAAM,cAAc,CAAC;AAatF,UAAU,yBAAyB;IACjC,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,kGAa7B,CAAC"}
+2
-1

@@ -33,2 +33,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const pino = require('./integrations/pino.js');
const console = require('./integrations/console.js');
const api = require('./sdk/api.js');

@@ -86,3 +87,2 @@ const module$1 = require('./utils/module.js');

exports.close = core.close;
exports.consoleIntegration = core.consoleIntegration;
exports.consoleLoggingIntegration = core.consoleLoggingIntegration;

@@ -164,2 +164,3 @@ exports.continueTrace = core.continueTrace;

exports.pinoIntegration = pino.pinoIntegration;
exports.consoleIntegration = console.consoleIntegration;
exports.defaultStackParser = api.defaultStackParser;

@@ -166,0 +167,0 @@ exports.getSentryRelease = api.getSentryRelease;

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}

@@ -12,3 +12,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

// This string is a placeholder that gets overwritten with the worker code.
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjUwLjAtYWxwaGEuMCAoOWM1MjA0NCkgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIHR9ZnJvbSJub2RlOmluc3BlY3RvciI7aW1wb3J0e3dvcmtlckRhdGEgYXMgbixwYXJlbnRQb3J0IGFzIGV9ZnJvbSJub2RlOndvcmtlcl90aHJlYWRzIjtpbXBvcnR7cG9zaXggYXMgcixzZXAgYXMgb31mcm9tIm5vZGU6cGF0aCI7aW1wb3J0KmFzIGkgZnJvbSJub2RlOmh0dHAiO2ltcG9ydCphcyBzIGZyb20ibm9kZTpodHRwcyI7aW1wb3J0e1JlYWRhYmxlIGFzIGN9ZnJvbSJub2RlOnN0cmVhbSI7aW1wb3J0e2NyZWF0ZUd6aXAgYXMgdX1mcm9tIm5vZGU6emxpYiI7aW1wb3J0KmFzIGEgZnJvbSJub2RlOm5ldCI7aW1wb3J0KmFzIGYgZnJvbSJub2RlOnRscyI7Y29uc3QgaD0idW5kZWZpbmVkIj09dHlwZW9mIF9fU0VOVFJZX0RFQlVHX198fF9fU0VOVFJZX0RFQlVHX18scD1nbG9iYWxUaGlzLGQ9IjEwLjUwLjAtYWxwaGEuMCI7ZnVuY3Rpb24gbCgpe3JldHVybiBtKHApLHB9ZnVuY3Rpb24gbSh0KXtjb25zdCBuPXQuX19TRU5UUllfXz10Ll9fU0VOVFJZX198fHt9O3JldHVybiBuLnZlcnNpb249bi52ZXJzaW9ufHxkLG5bZF09bltkXXx8e319ZnVuY3Rpb24gZyh0LG4sZT1wKXtjb25zdCByPWUuX19TRU5UUllfXz1lLl9fU0VOVFJZX198fHt9LG89cltkXT1yW2RdfHx7fTtyZXR1cm4gb1t0XXx8KG9bdF09bigpKX1jb25zdCB5PXt9O2Z1bmN0aW9uIGIodCl7aWYoISgiY29uc29sZSJpbiBwKSlyZXR1cm4gdCgpO2NvbnN0IG49cC5jb25zb2xlLGU9e30scj1PYmplY3Qua2V5cyh5KTtyLmZvckVhY2godD0+e2NvbnN0IHI9eVt0XTtlW3RdPW5bdF0sblt0XT1yfSk7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtyLmZvckVhY2godD0+e25bdF09ZVt0XX0pfX1mdW5jdGlvbiB2KCl7cmV0dXJuIHcoKS5lbmFibGVkfWZ1bmN0aW9uIF8odCwuLi5uKXtoJiZ2KCkmJmIoKCk9PntwLmNvbnNvbGVbdF0oYFNlbnRyeSBMb2dnZXIgWyR7dH1dOmAsLi4ubil9KX1mdW5jdGlvbiB3KCl7cmV0dXJuIGg/ZygibG9nZ2VyU2V0dGluZ3MiLCgpPT4oe2VuYWJsZWQ6ITF9KSk6e2VuYWJsZWQ6ITF9fWNvbnN0IFM9e2VuYWJsZTpmdW5jdGlvbigpe3coKS5lbmFibGVkPSEwfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dygpLmVuYWJsZWQ9ITF9LGlzRW5hYmxlZDp2LGxvZzpmdW5jdGlvbiguLi50KXtfKCJsb2ciLC4uLnQpfSx3YXJuOmZ1bmN0aW9uKC4uLnQpe18oIndhcm4iLC4uLnQpfSxlcnJvcjpmdW5jdGlvbiguLi50KXtfKCJlcnJvciIsLi4udCl9fSwkPS9jYXB0dXJlTWVzc2FnZXxjYXB0dXJlRXhjZXB0aW9uLztmdW5jdGlvbiBFKHQpe3JldHVybiB0W3QubGVuZ3RoLTFdfHx7fX1jb25zdCB4PSI8YW5vbnltb3VzPiI7Y29uc3QgTj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIGoodCxuKXtyZXR1cm4gTi5jYWxsKHQpPT09YFtvYmplY3QgJHtufV1gfWZ1bmN0aW9uIEModCl7cmV0dXJuIGoodCwiU3RyaW5nIil9ZnVuY3Rpb24gQSh0KXtyZXR1cm4gaih0LCJPYmplY3QiKX1mdW5jdGlvbiBUKHQpe3JldHVybiBCb29sZWFuKHQ/LnRoZW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW4pfWZ1bmN0aW9uIGsodCxuKXt0cnl7cmV0dXJuIHQgaW5zdGFuY2VvZiBufWNhdGNoe3JldHVybiExfX1jb25zdCBJPXA7ZnVuY3Rpb24gTyh0LG4pe2NvbnN0IGU9dCxyPVtdO2lmKCFlPy50YWdOYW1lKXJldHVybiIiO2lmKEkuSFRNTEVsZW1lbnQmJmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZS5kYXRhc2V0KXtpZihlLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50KXJldHVybiBlLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50O2lmKGUuZGF0YXNldC5zZW50cnlFbGVtZW50KXJldHVybiBlLmRhdGFzZXQuc2VudHJ5RWxlbWVudH1yLnB1c2goZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpO2NvbnN0IG89bj8ubGVuZ3RoP24uZmlsdGVyKHQ9PmUuZ2V0QXR0cmlidXRlKHQpKS5tYXAodD0+W3QsZS5nZXRBdHRyaWJ1dGUodCldKTpudWxsO2lmKG8/Lmxlbmd0aClvLmZvckVhY2godD0+e3IucHVzaChgWyR7dFswXX09IiR7dFsxXX0iXWApfSk7ZWxzZXtlLmlkJiZyLnB1c2goYCMke2UuaWR9YCk7Y29uc3QgdD1lLmNsYXNzTmFtZTtpZih0JiZDKHQpKXtjb25zdCBuPXQuc3BsaXQoL1xzKy8pO2Zvcihjb25zdCB0IG9mIG4pci5wdXNoKGAuJHt0fWApfX1mb3IoY29uc3QgdCBvZlsiYXJpYS1sYWJlbCIsInR5cGUiLCJuYW1lIiwidGl0bGUiLCJhbHQiXSl7Y29uc3Qgbj1lLmdldEF0dHJpYnV0ZSh0KTtuJiZyLnB1c2goYFske3R9PSIke259Il1gKX1yZXR1cm4gci5qb2luKCIiKX1mdW5jdGlvbiBSKHQpe2lmKGZ1bmN0aW9uKHQpe3N3aXRjaChOLmNhbGwodCkpe2Nhc2UiW29iamVjdCBFcnJvcl0iOmNhc2UiW29iamVjdCBFeGNlcHRpb25dIjpjYXNlIltvYmplY3QgRE9NRXhjZXB0aW9uXSI6Y2FzZSJbb2JqZWN0IFdlYkFzc2VtYmx5LkV4Y2VwdGlvbl0iOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuIGsodCxFcnJvcil9fSh0KSlyZXR1cm57bWVzc2FnZTp0Lm1lc3NhZ2UsbmFtZTp0Lm5hbWUsc3RhY2s6dC5zdGFjaywuLi5EKHQpfTtpZihuPXQsInVuZGVmaW5lZCIhPXR5cGVvZiBFdmVudCYmayhuLEV2ZW50KSl7Y29uc3Qgbj17dHlwZTp0LnR5cGUsdGFyZ2V0OlAodC50YXJnZXQpLGN1cnJlbnRUYXJnZXQ6UCh0LmN1cnJlbnRUYXJnZXQpLC4uLkQodCl9O3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQ3VzdG9tRXZlbnQmJmsodCxDdXN0b21FdmVudCkmJihuLmRldGFpbD10LmRldGFpbCksbn1yZXR1cm4gdDt2YXIgbn1mdW5jdGlvbiBQKHQpe3RyeXtyZXR1cm4gbj10LCJ1bmRlZmluZWQiIT10eXBlb2YgRWxlbWVudCYmayhuLEVsZW1lbnQpP2Z1bmN0aW9uKHQsbj17fSl7aWYoIXQpcmV0dXJuIjx1bmtub3duPiI7dHJ5e2xldCBlPXQ7Y29uc3Qgcj01LG89W107bGV0IGk9MCxzPTA7Y29uc3QgYz0iID4gIix1PWMubGVuZ3RoO2xldCBhO2NvbnN0IGY9QXJyYXkuaXNBcnJheShuKT9uOm4ua2V5QXR0cnMsaD0hQXJyYXkuaXNBcnJheShuKSYmbi5tYXhTdHJpbmdMZW5ndGh8fDgwO2Zvcig7ZSYmaSsrPHImJihhPU8oZSxmKSwhKCJodG1sIj09PWF8fGk+MSYmcytvLmxlbmd0aCp1K2EubGVuZ3RoPj1oKSk7KW8ucHVzaChhKSxzKz1hLmxlbmd0aCxlPWUucGFyZW50Tm9kZTtyZXR1cm4gby5yZXZlcnNlKCkuam9pbihjKX1jYXRjaHtyZXR1cm4iPHVua25vd24+In19KHQpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1jYXRjaHtyZXR1cm4iPHVua25vd24+In12YXIgbn1mdW5jdGlvbiBEKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQ/T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpKTp7fX1sZXQgVSxMO2Z1bmN0aW9uIE0odCl7aWYodm9pZCAwIT09VSlyZXR1cm4gVT9VKHQpOnQoKTtjb25zdCBuPVN5bWJvbC5mb3IoIl9fU0VOVFJZX1NBRkVfUkFORE9NX0lEX1dSQVBQRVJfXyIpLGU9cDtyZXR1cm4gbiBpbiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtuXT8oVT1lW25dLFUodCkpOihVPW51bGwsdCgpKX1mdW5jdGlvbiBCKCl7cmV0dXJuIE0oKCk9Pk1hdGgucmFuZG9tKCkpfWZ1bmN0aW9uIFcoKXtyZXR1cm4gTSgoKT0+RGF0ZS5ub3coKSl9ZnVuY3Rpb24geih0LG49MCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0fHwwPT09bnx8dC5sZW5ndGg8PW4/dDpgJHt0LnNsaWNlKDAsbil9Li4uYH1mdW5jdGlvbiBGKHQ9ZnVuY3Rpb24oKXtjb25zdCB0PXA7cmV0dXJuIHQuY3J5cHRvfHx0Lm1zQ3J5cHRvfSgpKXt0cnl7aWYodD8ucmFuZG9tVVVJRClyZXR1cm4gTSgoKT0+dC5yYW5kb21VVUlEKCkpLnJlcGxhY2UoLy0vZywiIil9Y2F0Y2h7fXJldHVybiBMfHwoTD1bMWU3XSsxZTMrNGUzKzhlMysxZTExKSxMLnJlcGxhY2UoL1swMThdL2csdD0+KHReKDE2KkIoKSYxNSk+PnQvNCkudG9TdHJpbmcoMTYpKX1mdW5jdGlvbiBHKCl7cmV0dXJuIFcoKS8xZTN9bGV0IEg7ZnVuY3Rpb24gSigpe3JldHVybihIPz8oSD1mdW5jdGlvbigpe2NvbnN0e3BlcmZvcm1hbmNlOnR9PXA7aWYoIXQ/Lm5vd3x8IXQudGltZU9yaWdpbilyZXR1cm4gRztjb25zdCBuPXQudGltZU9yaWdpbjtyZXR1cm4oKT0+KG4rTSgoKT0+dC5ub3coKSkpLzFlM30oKSkpKCl9ZnVuY3Rpb24gWSh0KXtjb25zdCBuPUooKSxlPXtzaWQ6RigpLGluaXQ6ITAsdGltZXN0YW1wOm4sc3RhcnRlZDpuLGR1cmF0aW9uOjAsc3RhdHVzOiJvayIsZXJyb3JzOjAsaWdub3JlRHVyYXRpb246ITEsdG9KU09OOigpPT5mdW5jdGlvbih0KXtyZXR1cm57c2lkOmAke3Quc2lkfWAsaW5pdDp0LmluaXQsc3RhcnRlZDpuZXcgRGF0ZSgxZTMqdC5zdGFydGVkKS50b0lTT1N0cmluZygpLHRpbWVzdGFtcDpuZXcgRGF0ZSgxZTMqdC50aW1lc3RhbXApLnRvSVNPU3RyaW5nKCksc3RhdHVzOnQuc3RhdHVzLGVycm9yczp0LmVycm9ycyxkaWQ6Im51bWJlciI9PXR5cGVvZiB0LmRpZHx8InN0cmluZyI9PXR5cGVvZiB0LmRpZD9gJHt0LmRpZH1gOnZvaWQgMCxkdXJhdGlvbjp0LmR1cmF0aW9uLGFibm9ybWFsX21lY2hhbmlzbTp0LmFibm9ybWFsX21lY2hhbmlzbSxhdHRyczp7cmVsZWFzZTp0LnJlbGVhc2UsZW52aXJvbm1lbnQ6dC5lbnZpcm9ubWVudCxpcF9hZGRyZXNzOnQuaXBBZGRyZXNzLHVzZXJfYWdlbnQ6dC51c2VyQWdlbnR9fX0oZSl9O3JldHVybiB0JiZWKGUsdCksZX1mdW5jdGlvbiBWKHQsbj17fSl7aWYobi51c2VyJiYoIXQuaXBBZGRyZXNzJiZuLnVzZXIuaXBfYWRkcmVzcyYmKHQuaXBBZGRyZXNzPW4udXNlci5pcF9hZGRyZXNzKSx0LmRpZHx8bi5kaWR8fCh0LmRpZD1uLnVzZXIuaWR8fG4udXNlci5lbWFpbHx8bi51c2VyLnVzZXJuYW1lKSksdC50aW1lc3RhbXA9bi50aW1lc3RhbXB8fEooKSxuLmFibm9ybWFsX21lY2hhbmlzbSYmKHQuYWJub3JtYWxfbWVjaGFuaXNtPW4uYWJub3JtYWxfbWVjaGFuaXNtKSxuLmlnbm9yZUR1cmF0aW9uJiYodC5pZ25vcmVEdXJhdGlvbj1uLmlnbm9yZUR1cmF0aW9uKSxuLnNpZCYmKHQuc2lkPTMyPT09bi5zaWQubGVuZ3RoP24uc2lkOkYoKSksdm9pZCAwIT09bi5pbml0JiYodC5pbml0PW4uaW5pdCksIXQuZGlkJiZuLmRpZCYmKHQuZGlkPWAke24uZGlkfWApLCJudW1iZXIiPT10eXBlb2Ygbi5zdGFydGVkJiYodC5zdGFydGVkPW4uc3RhcnRlZCksdC5pZ25vcmVEdXJhdGlvbil0LmR1cmF0aW9uPXZvaWQgMDtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2Ygbi5kdXJhdGlvbil0LmR1cmF0aW9uPW4uZHVyYXRpb247ZWxzZXtjb25zdCBuPXQudGltZXN0YW1wLXQuc3RhcnRlZDt0LmR1cmF0aW9uPW4+PTA/bjowfW4ucmVsZWFzZSYmKHQucmVsZWFzZT1uLnJlbGVhc2UpLG4uZW52aXJvbm1lbnQmJih0LmVudmlyb25tZW50PW4uZW52aXJvbm1lbnQpLCF0LmlwQWRkcmVzcyYmbi5pcEFkZHJlc3MmJih0LmlwQWRkcmVzcz1uLmlwQWRkcmVzcyksIXQudXNlckFnZW50JiZuLnVzZXJBZ2VudCYmKHQudXNlckFnZW50PW4udXNlckFnZW50KSwibnVtYmVyIj09dHlwZW9mIG4uZXJyb3JzJiYodC5lcnJvcnM9bi5lcnJvcnMpLG4uc3RhdHVzJiYodC5zdGF0dXM9bi5zdGF0dXMpfWZ1bmN0aW9uIEsodCxuLGU9Mil7aWYoIW58fCJvYmplY3QiIT10eXBlb2Ygbnx8ZTw9MClyZXR1cm4gbjtpZih0JiYwPT09T2JqZWN0LmtleXMobikubGVuZ3RoKXJldHVybiB0O2NvbnN0IHI9ey4uLnR9O2Zvcihjb25zdCB0IGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sdCkmJihyW3RdPUsoclt0XSxuW3RdLGUtMSkpO3JldHVybiByfWZ1bmN0aW9uIFooKXtyZXR1cm4gRigpfWZ1bmN0aW9uIHEoKXtyZXR1cm4gRigpLnN1YnN0cmluZygxNil9Y29uc3QgUT0iX3NlbnRyeVNwYW4iO2Z1bmN0aW9uIFgodCxuKXtuP2Z1bmN0aW9uKHQsbixlKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1jYXRjaHtoJiZTLmxvZyhgRmFpbGVkIHRvIGFkZCBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSAiJHtufSIgdG8gb2JqZWN0YCx0KX19KHQsUSxuKTpkZWxldGUgdFtRXX1mdW5jdGlvbiB0dCh0KXtyZXR1cm4gdFtRXX1jbGFzcyBudHtjb25zdHJ1Y3Rvcigpe3RoaXMudD0hMSx0aGlzLm89W10sdGhpcy5pPVtdLHRoaXMudT1bXSx0aGlzLmg9W10sdGhpcy5wPXt9LHRoaXMubD17fSx0aGlzLm09e30sdGhpcy52PXt9LHRoaXMuXz17fSx0aGlzLlM9e30sdGhpcy5OPXt0cmFjZUlkOlooKSxzYW1wbGVSYW5kOkIoKX19Y2xvbmUoKXtjb25zdCB0PW5ldyBudDtyZXR1cm4gdC51PVsuLi50aGlzLnVdLHQubD17Li4udGhpcy5sfSx0Lm09ey4uLnRoaXMubX0sdC52PXsuLi50aGlzLnZ9LHQuXz17Li4udGhpcy5ffSx0aGlzLl8uZmxhZ3MmJih0Ll8uZmxhZ3M9e3ZhbHVlczpbLi4udGhpcy5fLmZsYWdzLnZhbHVlc119KSx0LnA9dGhpcy5wLHQuaj10aGlzLmosdC5DPXRoaXMuQyx0LkE9dGhpcy5BLHQuVD10aGlzLlQsdC5pPVsuLi50aGlzLmldLHQuaD1bLi4udGhpcy5oXSx0LlM9ey4uLnRoaXMuU30sdC5OPXsuLi50aGlzLk59LHQuaz10aGlzLmssdC5JPXRoaXMuSSx0Lk89dGhpcy5PLFgodCx0dCh0aGlzKSksdH1zZXRDbGllbnQodCl7dGhpcy5rPXR9c2V0TGFzdEV2ZW50SWQodCl7dGhpcy5JPXR9Z2V0Q2xpZW50KCl7cmV0dXJuIHRoaXMua31sYXN0RXZlbnRJZCgpe3JldHVybiB0aGlzLkl9YWRkU2NvcGVMaXN0ZW5lcih0KXt0aGlzLm8ucHVzaCh0KX1hZGRFdmVudFByb2Nlc3Nvcih0KXtyZXR1cm4gdGhpcy5pLnB1c2godCksdGhpc31zZXRVc2VyKHQpe3JldHVybiB0aGlzLnA9dHx8e2VtYWlsOnZvaWQgMCxpZDp2b2lkIDAsaXBfYWRkcmVzczp2b2lkIDAsdXNlcm5hbWU6dm9pZCAwfSx0aGlzLkMmJlYodGhpcy5DLHt1c2VyOnR9KSx0aGlzLlIoKSx0aGlzfWdldFVzZXIoKXtyZXR1cm4gdGhpcy5wfXNldENvbnZlcnNhdGlvbklkKHQpe3JldHVybiB0aGlzLk89dHx8dm9pZCAwLHRoaXMuUigpLHRoaXN9c2V0VGFncyh0KXtyZXR1cm4gdGhpcy5sPXsuLi50aGlzLmwsLi4udH0sdGhpcy5SKCksdGhpc31zZXRUYWcodCxuKXtyZXR1cm4gdGhpcy5zZXRUYWdzKHtbdF06bn0pfXNldEF0dHJpYnV0ZXModCl7cmV0dXJuIHRoaXMubT17Li4udGhpcy5tLC4uLnR9LHRoaXMuUigpLHRoaXN9c2V0QXR0cmlidXRlKHQsbil7cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlcyh7W3RdOm59KX1yZW1vdmVBdHRyaWJ1dGUodCl7cmV0dXJuIHQgaW4gdGhpcy5tJiYoZGVsZXRlIHRoaXMubVt0XSx0aGlzLlIoKSksdGhpc31zZXRFeHRyYXModCl7cmV0dXJuIHRoaXMudj17Li4udGhpcy52LC4uLnR9LHRoaXMuUigpLHRoaXN9c2V0RXh0cmEodCxuKXtyZXR1cm4gdGhpcy52PXsuLi50aGlzLnYsW3RdOm59LHRoaXMuUigpLHRoaXN9c2V0RmluZ2VycHJpbnQodCl7cmV0dXJuIHRoaXMuVD10LHRoaXMuUigpLHRoaXN9c2V0TGV2ZWwodCl7cmV0dXJuIHRoaXMuaj10LHRoaXMuUigpLHRoaXN9c2V0VHJhbnNhY3Rpb25OYW1lKHQpe3JldHVybiB0aGlzLkE9dCx0aGlzLlIoKSx0aGlzfXNldENvbnRleHQodCxuKXtyZXR1cm4gbnVsbD09PW4/ZGVsZXRlIHRoaXMuX1t0XTp0aGlzLl9bdF09bix0aGlzLlIoKSx0aGlzfXNldFNlc3Npb24odCl7cmV0dXJuIHQ/dGhpcy5DPXQ6ZGVsZXRlIHRoaXMuQyx0aGlzLlIoKSx0aGlzfWdldFNlc3Npb24oKXtyZXR1cm4gdGhpcy5DfXVwZGF0ZSh0KXtpZighdClyZXR1cm4gdGhpcztjb25zdCBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QodGhpcyk6dCxlPW4gaW5zdGFuY2VvZiBudD9uLmdldFNjb3BlRGF0YSgpOkEobik/dDp2b2lkIDAse3RhZ3M6cixhdHRyaWJ1dGVzOm8sZXh0cmE6aSx1c2VyOnMsY29udGV4dHM6YyxsZXZlbDp1LGZpbmdlcnByaW50OmE9W10scHJvcGFnYXRpb25Db250ZXh0OmYsY29udmVyc2F0aW9uSWQ6aH09ZXx8e307cmV0dXJuIHRoaXMubD17Li4udGhpcy5sLC4uLnJ9LHRoaXMubT17Li4udGhpcy5tLC4uLm99LHRoaXMudj17Li4udGhpcy52LC4uLml9LHRoaXMuXz17Li4udGhpcy5fLC4uLmN9LHMmJk9iamVjdC5rZXlzKHMpLmxlbmd0aCYmKHRoaXMucD1zKSx1JiYodGhpcy5qPXUpLGEubGVuZ3RoJiYodGhpcy5UPWEpLGYmJih0aGlzLk49ZiksaCYmKHRoaXMuTz1oKSx0aGlzfWNsZWFyKCl7cmV0dXJuIHRoaXMudT1bXSx0aGlzLmw9e30sdGhpcy5tPXt9LHRoaXMudj17fSx0aGlzLnA9e30sdGhpcy5fPXt9LHRoaXMuaj12b2lkIDAsdGhpcy5BPXZvaWQgMCx0aGlzLlQ9dm9pZCAwLHRoaXMuQz12b2lkIDAsdGhpcy5PPXZvaWQgMCxYKHRoaXMsdm9pZCAwKSx0aGlzLmg9W10sdGhpcy5zZXRQcm9wYWdhdGlvbkNvbnRleHQoe3RyYWNlSWQ6WigpLHNhbXBsZVJhbmQ6QigpfSksdGhpcy5SKCksdGhpc31hZGRCcmVhZGNydW1iKHQsbil7Y29uc3QgZT0ibnVtYmVyIj09dHlwZW9mIG4/bjoxMDA7aWYoZTw9MClyZXR1cm4gdGhpcztjb25zdCByPXt0aW1lc3RhbXA6RygpLC4uLnQsbWVzc2FnZTp0Lm1lc3NhZ2U/eih0Lm1lc3NhZ2UsMjA0OCk6dC5tZXNzYWdlfTtyZXR1cm4gdGhpcy51LnB1c2gociksdGhpcy51Lmxlbmd0aD5lJiYodGhpcy51PXRoaXMudS5zbGljZSgtZSksdGhpcy5rPy5yZWNvcmREcm9wcGVkRXZlbnQoImJ1ZmZlcl9vdmVyZmxvdyIsImxvZ19pdGVtIikpLHRoaXMuUigpLHRoaXN9Z2V0TGFzdEJyZWFkY3J1bWIoKXtyZXR1cm4gdGhpcy51W3RoaXMudS5sZW5ndGgtMV19Y2xlYXJCcmVhZGNydW1icygpe3JldHVybiB0aGlzLnU9W10sdGhpcy5SKCksdGhpc31hZGRBdHRhY2htZW50KHQpe3JldHVybiB0aGlzLmgucHVzaCh0KSx0aGlzfWNsZWFyQXR0YWNobWVudHMoKXtyZXR1cm4gdGhpcy5oPVtdLHRoaXN9Z2V0U2NvcGVEYXRhKCl7cmV0dXJue2JyZWFkY3J1bWJzOnRoaXMudSxhdHRhY2htZW50czp0aGlzLmgsY29udGV4dHM6dGhpcy5fLHRhZ3M6dGhpcy5sLGF0dHJpYnV0ZXM6dGhpcy5tLGV4dHJhOnRoaXMudix1c2VyOnRoaXMucCxsZXZlbDp0aGlzLmosZmluZ2VycHJpbnQ6dGhpcy5UfHxbXSxldmVudFByb2Nlc3NvcnM6dGhpcy5pLHByb3BhZ2F0aW9uQ29udGV4dDp0aGlzLk4sc2RrUHJvY2Vzc2luZ01ldGFkYXRhOnRoaXMuUyx0cmFuc2FjdGlvbk5hbWU6dGhpcy5BLHNwYW46dHQodGhpcyksY29udmVyc2F0aW9uSWQ6dGhpcy5PfX1zZXRTREtQcm9jZXNzaW5nTWV0YWRhdGEodCl7cmV0dXJuIHRoaXMuUz1LKHRoaXMuUyx0LDIpLHRoaXN9c2V0UHJvcGFnYXRpb25Db250ZXh0KHQpe3JldHVybiB0aGlzLk49dCx0aGlzfWdldFByb3BhZ2F0aW9uQ29udGV4dCgpe3JldHVybiB0aGlzLk59Y2FwdHVyZUV4Y2VwdGlvbih0LG4pe2NvbnN0IGU9bj8uZXZlbnRfaWR8fEYoKTtpZighdGhpcy5rKXJldHVybiBoJiZTLndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBleGNlcHRpb24hIiksZTtjb25zdCByPW5ldyBFcnJvcigiU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbiIpO3JldHVybiB0aGlzLmsuY2FwdHVyZUV4Y2VwdGlvbih0LHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpyLC4uLm4sZXZlbnRfaWQ6ZX0sdGhpcyksZX1jYXB0dXJlTWVzc2FnZSh0LG4sZSl7Y29uc3Qgcj1lPy5ldmVudF9pZHx8RigpO2lmKCF0aGlzLmspcmV0dXJuIGgmJlMud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIG1lc3NhZ2UhIikscjtjb25zdCBvPWU/LnN5bnRoZXRpY0V4Y2VwdGlvbj8/bmV3IEVycm9yKHQpO3JldHVybiB0aGlzLmsuY2FwdHVyZU1lc3NhZ2UodCxuLHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpvLC4uLmUsZXZlbnRfaWQ6cn0sdGhpcykscn1jYXB0dXJlRXZlbnQodCxuKXtjb25zdCBlPXQuZXZlbnRfaWR8fG4/LmV2ZW50X2lkfHxGKCk7cmV0dXJuIHRoaXMuaz8odGhpcy5rLmNhcHR1cmVFdmVudCh0LHsuLi5uLGV2ZW50X2lkOmV9LHRoaXMpLGUpOihoJiZTLndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBldmVudCEiKSxlKX1SKCl7dGhpcy50fHwodGhpcy50PSEwLHRoaXMuby5mb3JFYWNoKHQ9Pnt0KHRoaXMpfSksdGhpcy50PSExKX19Y29uc3QgZXQ9dD0+dCBpbnN0YW5jZW9mIFByb21pc2UmJiF0W3J0XSxydD1TeW1ib2woImNoYWluZWQgUHJvbWlzZUxpa2UiKSxvdD0odCxuKT0+e2xldCBlPSExO2Zvcihjb25zdCByIGluIHQpe2lmKHIgaW4gbiljb250aW51ZTtlPSEwO2NvbnN0IG89dFtyXTsiZnVuY3Rpb24iPT10eXBlb2Ygbz9PYmplY3QuZGVmaW5lUHJvcGVydHkobixyLHt2YWx1ZTooLi4ubik9Pm8uYXBwbHkodCxuKSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm5bcl09b31yZXR1cm4gZSYmT2JqZWN0LmFzc2lnbihuLHtbcnRdOiEwfSksbn07Y2xhc3MgaXR7Y29uc3RydWN0b3IodCxuKXtsZXQgZSxyO2U9dHx8bmV3IG50LHI9bnx8bmV3IG50LHRoaXMuUD1be3Njb3BlOmV9XSx0aGlzLkQ9cn13aXRoU2NvcGUodCl7Y29uc3Qgbj10aGlzLlUoKTtsZXQgZTt0cnl7ZT10KG4pfWNhdGNoKHQpe3Rocm93IHRoaXMuTCgpLHR9cmV0dXJuIFQoZSk/KCh0LG4sZSk9Pntjb25zdCByPXQudGhlbih0PT4obih0KSx0KSx0PT57dGhyb3cgZSh0KSx0fSk7cmV0dXJuIGV0KHIpJiZldCh0KT9yOm90KHQscil9KShlLCgpPT50aGlzLkwoKSwoKT0+dGhpcy5MKCkpOih0aGlzLkwoKSxlKX1nZXRDbGllbnQoKXtyZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLmNsaWVudH1nZXRTY29wZSgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGV9Z2V0SXNvbGF0aW9uU2NvcGUoKXtyZXR1cm4gdGhpcy5EfWdldFN0YWNrVG9wKCl7cmV0dXJuIHRoaXMuUFt0aGlzLlAubGVuZ3RoLTFdfVUoKXtjb25zdCB0PXRoaXMuZ2V0U2NvcGUoKS5jbG9uZSgpO3JldHVybiB0aGlzLlAucHVzaCh7Y2xpZW50OnRoaXMuZ2V0Q2xpZW50KCksc2NvcGU6dH0pLHR9TCgpe3JldHVybiEodGhpcy5QLmxlbmd0aDw9MSkmJiEhdGhpcy5QLnBvcCgpfX1mdW5jdGlvbiBzdCgpe2NvbnN0IHQ9bShsKCkpO3JldHVybiB0LnN0YWNrPXQuc3RhY2t8fG5ldyBpdChnKCJkZWZhdWx0Q3VycmVudFNjb3BlIiwoKT0+bmV3IG50KSxnKCJkZWZhdWx0SXNvbGF0aW9uU2NvcGUiLCgpPT5uZXcgbnQpKX1mdW5jdGlvbiBjdCh0KXtyZXR1cm4gc3QoKS53aXRoU2NvcGUodCl9ZnVuY3Rpb24gdXQodCxuKXtjb25zdCBlPXN0KCk7cmV0dXJuIGUud2l0aFNjb3BlKCgpPT4oZS5nZXRTdGFja1RvcCgpLnNjb3BlPXQsbih0KSkpfWZ1bmN0aW9uIGF0KHQpe3JldHVybiBzdCgpLndpdGhTY29wZSgoKT0+dChzdCgpLmdldElzb2xhdGlvblNjb3BlKCkpKX1mdW5jdGlvbiBmdCh0KXtjb25zdCBuPW0odCk7cmV0dXJuIG4uYWNzP24uYWNzOnt3aXRoSXNvbGF0aW9uU2NvcGU6YXQsd2l0aFNjb3BlOmN0LHdpdGhTZXRTY29wZTp1dCx3aXRoU2V0SXNvbGF0aW9uU2NvcGU6KHQsbik9PmF0KG4pLGdldEN1cnJlbnRTY29wZTooKT0+c3QoKS5nZXRTY29wZSgpLGdldElzb2xhdGlvblNjb3BlOigpPT5zdCgpLmdldElzb2xhdGlvblNjb3BlKCl9fWZ1bmN0aW9uIGh0KCl7cmV0dXJuIGZ0KGwoKSkuZ2V0Q3VycmVudFNjb3BlKCkuZ2V0Q2xpZW50KCl9ZnVuY3Rpb24gcHQodCl7aWYodCl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYiZGVyZWYiaW4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVyZWYpdHJ5e3JldHVybiB0LmRlcmVmKCl9Y2F0Y2h7cmV0dXJufXJldHVybiB0fX1mdW5jdGlvbiBkdCh0KXtjb25zdCBuPXQ7cmV0dXJue3Njb3BlOm4uX3NlbnRyeVNjb3BlLGlzb2xhdGlvblNjb3BlOnB0KG4uX3NlbnRyeUlzb2xhdGlvblNjb3BlKX19Y29uc3QgbHQ9InNlbnRyeS0iO2Z1bmN0aW9uIG10KHQpe2NvbnN0IG49ZnVuY3Rpb24odCl7aWYoIXR8fCFDKHQpJiYhQXJyYXkuaXNBcnJheSh0KSlyZXR1cm47aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdC5yZWR1Y2UoKHQsbik9Pntjb25zdCBlPWd0KG4pO3JldHVybiBPYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKChbbixlXSk9Pnt0W25dPWV9KSx0fSx7fSk7cmV0dXJuIGd0KHQpfSh0KTtpZighbilyZXR1cm47Y29uc3QgZT1PYmplY3QuZW50cmllcyhuKS5yZWR1Y2UoKHQsW24sZV0pPT57aWYobi5zdGFydHNXaXRoKGx0KSl7dFtuLnNsaWNlKDcpXT1lfXJldHVybiB0fSx7fSk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aD4wP2U6dm9pZCAwfWZ1bmN0aW9uIGd0KHQpe3JldHVybiB0LnNwbGl0KCIsIikubWFwKHQ9Pntjb25zdCBuPXQuaW5kZXhPZigiPSIpO2lmKC0xPT09bilyZXR1cm5bXTtyZXR1cm5bdC5zbGljZSgwLG4pLHQuc2xpY2UobisxKV0ubWFwKHQ9Pnt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0LnRyaW0oKSl9Y2F0Y2h7cmV0dXJufX0pfSkucmVkdWNlKCh0LFtuLGVdKT0+KG4mJmUmJih0W25dPWUpLHQpLHt9KX1jb25zdCB5dD0vXm8oXGQrKVwuLztmdW5jdGlvbiBidCh0LG49ITEpe2NvbnN0e2hvc3Q6ZSxwYXRoOnIscGFzczpvLHBvcnQ6aSxwcm9qZWN0SWQ6cyxwcm90b2NvbDpjLHB1YmxpY0tleTp1fT10O3JldHVybmAke2N9Oi8vJHt1fSR7biYmbz9gOiR7b31gOiIifUAke2V9JHtpP2A6JHtpfWA6IiJ9LyR7cj9gJHtyfS9gOnJ9JHtzfWB9ZnVuY3Rpb24gdnQodCl7Y29uc3Qgbj10LmdldE9wdGlvbnMoKSx7aG9zdDplfT10LmdldERzbigpfHx7fTtsZXQgcjtyZXR1cm4gbi5vcmdJZD9yPVN0cmluZyhuLm9yZ0lkKTplJiYocj1mdW5jdGlvbih0KXtjb25zdCBuPXQubWF0Y2goeXQpO3JldHVybiBuPy5bMV19KGUpKSxyfWZ1bmN0aW9uIF90KHQpe2NvbnN0e3NwYW5JZDpuLHRyYWNlSWQ6ZSxpc1JlbW90ZTpyfT10LnNwYW5Db250ZXh0KCksbz1yP246RXQodCkucGFyZW50X3NwYW5faWQsaT1kdCh0KS5zY29wZTtyZXR1cm57cGFyZW50X3NwYW5faWQ6byxzcGFuX2lkOnI/aT8uZ2V0UHJvcGFnYXRpb25Db250ZXh0KCkucHJvcGFnYXRpb25TcGFuSWR8fHEoKTpuLHRyYWNlX2lkOmV9fWZ1bmN0aW9uIHd0KHQpe3JldHVybiB0JiZ0Lmxlbmd0aD4wP3QubWFwKCh7Y29udGV4dDp7c3BhbklkOnQsdHJhY2VJZDpuLHRyYWNlRmxhZ3M6ZSwuLi5yfSxhdHRyaWJ1dGVzOm99KT0+KHtzcGFuX2lkOnQsdHJhY2VfaWQ6bixzYW1wbGVkOjE9PT1lLGF0dHJpYnV0ZXM6bywuLi5yfSkpOnZvaWQgMH1mdW5jdGlvbiBTdCh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/JHQodCk6QXJyYXkuaXNBcnJheSh0KT90WzBdK3RbMV0vMWU5OnQgaW5zdGFuY2VvZiBEYXRlPyR0KHQuZ2V0VGltZSgpKTpKKCl9ZnVuY3Rpb24gJHQodCl7cmV0dXJuIHQ+OTk5OTk5OTk5OT90LzFlMzp0fWZ1bmN0aW9uIEV0KHQpe2lmKGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LmdldFNwYW5KU09OfSh0KSlyZXR1cm4gdC5nZXRTcGFuSlNPTigpO2NvbnN0e3NwYW5JZDpuLHRyYWNlSWQ6ZX09dC5zcGFuQ29udGV4dCgpO2lmKGZ1bmN0aW9uKHQpe2NvbnN0IG49dDtyZXR1cm4hIShuLmF0dHJpYnV0ZXMmJm4uc3RhcnRUaW1lJiZuLm5hbWUmJm4uZW5kVGltZSYmbi5zdGF0dXMpfSh0KSl7Y29uc3R7YXR0cmlidXRlczpyLHN0YXJ0VGltZTpvLG5hbWU6aSxlbmRUaW1lOnMsc3RhdHVzOmMsbGlua3M6dX09dDtyZXR1cm57c3Bhbl9pZDpuLHRyYWNlX2lkOmUsZGF0YTpyLGRlc2NyaXB0aW9uOmkscGFyZW50X3NwYW5faWQ6eHQodCksc3RhcnRfdGltZXN0YW1wOlN0KG8pLHRpbWVzdGFtcDpTdChzKXx8dm9pZCAwLHN0YXR1czpOdChjKSxvcDpyWyJzZW50cnkub3AiXSxvcmlnaW46clsic2VudHJ5Lm9yaWdpbiJdLGxpbmtzOnd0KHUpfX1yZXR1cm57c3Bhbl9pZDpuLHRyYWNlX2lkOmUsc3RhcnRfdGltZXN0YW1wOjAsZGF0YTp7fX19ZnVuY3Rpb24geHQodCl7cmV0dXJuInBhcmVudFNwYW5JZCJpbiB0P3QucGFyZW50U3BhbklkOiJwYXJlbnRTcGFuQ29udGV4dCJpbiB0P3QucGFyZW50U3BhbkNvbnRleHQ/LnNwYW5JZDp2b2lkIDB9ZnVuY3Rpb24gTnQodCl7aWYodCYmMCE9PXQuY29kZSlyZXR1cm4gMT09PXQuY29kZT8ib2siOnQubWVzc2FnZXx8ImludGVybmFsX2Vycm9yIn1jb25zdCBqdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fc2VudHJ5Um9vdFNwYW58fHR9O2Z1bmN0aW9uIEN0KHQpe2NvbnN0IG49aHQoKTtpZighbilyZXR1cm57fTtjb25zdCBlPWp0KHQpLHI9RXQoZSksbz1yLmRhdGEsaT1lLnNwYW5Db250ZXh0KCkudHJhY2VTdGF0ZSxzPWk/LmdldCgic2VudHJ5LnNhbXBsZV9yYXRlIik/P29bInNlbnRyeS5zYW1wbGVfcmF0ZSJdPz9vWyJzZW50cnkucHJldmlvdXNfdHJhY2Vfc2FtcGxlX3JhdGUiXTtmdW5jdGlvbiBjKHQpe3JldHVybiJudW1iZXIiIT10eXBlb2YgcyYmInN0cmluZyIhPXR5cGVvZiBzfHwodC5zYW1wbGVfcmF0ZT1gJHtzfWApLHR9Y29uc3QgdT1lLl9mcm96ZW5Ec2M7aWYodSlyZXR1cm4gYyh1KTtjb25zdCBhPWk/LmdldCgic2VudHJ5LmRzYyIpLGY9YSYmbXQoYSk7aWYoZilyZXR1cm4gYyhmKTtjb25zdCBoPWZ1bmN0aW9uKHQsbil7Y29uc3QgZT1uLmdldE9wdGlvbnMoKSx7cHVibGljS2V5OnJ9PW4uZ2V0RHNuKCl8fHt9LG89e2Vudmlyb25tZW50OmUuZW52aXJvbm1lbnR8fCJwcm9kdWN0aW9uIixyZWxlYXNlOmUucmVsZWFzZSxwdWJsaWNfa2V5OnIsdHJhY2VfaWQ6dCxvcmdfaWQ6dnQobil9O3JldHVybiBuLmVtaXQoImNyZWF0ZURzYyIsbyksb30odC5zcGFuQ29udGV4dCgpLnRyYWNlSWQsbikscD1vWyJzZW50cnkuc291cmNlIl0/P29bInNlbnRyeS5zcGFuLnNvdXJjZSJdLGQ9ci5kZXNjcmlwdGlvbjtyZXR1cm4idXJsIiE9PXAmJmQmJihoLnRyYW5zYWN0aW9uPWQpLGZ1bmN0aW9uKCl7aWYoImJvb2xlYW4iPT10eXBlb2YgX19TRU5UUllfVFJBQ0lOR19fJiYhX19TRU5UUllfVFJBQ0lOR19fKXJldHVybiExO2NvbnN0IHQ9aHQoKT8uZ2V0T3B0aW9ucygpO3JldHVybiEoIXR8fG51bGw9PXQudHJhY2VzU2FtcGxlUmF0ZSYmIXQudHJhY2VzU2FtcGxlcil9KCkmJihoLnNhbXBsZWQ9U3RyaW5nKGZ1bmN0aW9uKHQpe2NvbnN0e3RyYWNlRmxhZ3M6bn09dC5zcGFuQ29udGV4dCgpO3JldHVybiAxPT09bn0oZSkpLGguc2FtcGxlX3JhbmQ9aT8uZ2V0KCJzZW50cnkuc2FtcGxlX3JhbmQiKT8/ZHQoZSkuc2NvcGU/LmdldFByb3BhZ2F0aW9uQ29udGV4dCgpLnNhbXBsZVJhbmQudG9TdHJpbmcoKSksYyhoKSxuLmVtaXQoImNyZWF0ZURzYyIsaCxlKSxofWZ1bmN0aW9uIEF0KHQsbj0xMDAsZT0xLzApe3RyeXtyZXR1cm4gVHQoIiIsdCxuLGUpfWNhdGNoKHQpe3JldHVybntFUlJPUjpgKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH19fWZ1bmN0aW9uIFR0KHQsbixlPTEvMCxyPTEvMCxvPWZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgV2Vha1NldDtmdW5jdGlvbiBuKG4pe3JldHVybiEhdC5oYXMobil8fCh0LmFkZChuKSwhMSl9ZnVuY3Rpb24gZShuKXt0LmRlbGV0ZShuKX1yZXR1cm5bbixlXX0oKSl7Y29uc3RbaSxzXT1vO2lmKG51bGw9PW58fFsiYm9vbGVhbiIsInN0cmluZyJdLmluY2x1ZGVzKHR5cGVvZiBuKXx8Im51bWJlciI9PXR5cGVvZiBuJiZOdW1iZXIuaXNGaW5pdGUobikpcmV0dXJuIG47Y29uc3QgYz1mdW5jdGlvbih0LG4pe3RyeXtpZigiZG9tYWluIj09PXQmJm4mJiJvYmplY3QiPT10eXBlb2YgbiYmbi5NKXJldHVybiJbRG9tYWluXSI7aWYoImRvbWFpbkVtaXR0ZXIiPT09dClyZXR1cm4iW0RvbWFpbkVtaXR0ZXJdIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmbj09PWdsb2JhbClyZXR1cm4iW0dsb2JhbF0iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZuPT09d2luZG93KXJldHVybiJbV2luZG93XSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmbj09PWRvY3VtZW50KXJldHVybiJbRG9jdW1lbnRdIjtpZigib2JqZWN0Ij09dHlwZW9mKGU9bikmJm51bGwhPT1lJiYoZS5fX2lzVnVlfHxlLkJ8fGUuX192X2lzVk5vZGUpKXJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4iX192X2lzVk5vZGUiaW4gdCYmdC5fX3ZfaXNWTm9kZT8iW1Z1ZVZOb2RlXSI6IltWdWVWaWV3TW9kZWxdIn0obik7aWYoZnVuY3Rpb24odCl7cmV0dXJuIEEodCkmJiJuYXRpdmVFdmVudCJpbiB0JiYicHJldmVudERlZmF1bHQiaW4gdCYmInN0b3BQcm9wYWdhdGlvbiJpbiB0fShuKSlyZXR1cm4iW1N5bnRoZXRpY0V2ZW50XSI7aWYoIm51bWJlciI9PXR5cGVvZiBuJiYhTnVtYmVyLmlzRmluaXRlKG4pKXJldHVybmBbJHtufV1gO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXJldHVybmBbRnVuY3Rpb246ICR7ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5uYW1lfHx4fWNhdGNoe3JldHVybiB4fX0obil9XWA7aWYoInN5bWJvbCI9PXR5cGVvZiBuKXJldHVybmBbJHtTdHJpbmcobil9XWA7aWYoImJpZ2ludCI9PXR5cGVvZiBuKXJldHVybmBbQmlnSW50OiAke1N0cmluZyhuKX1dYDtjb25zdCByPWZ1bmN0aW9uKHQpe2NvbnN0IG49T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO3JldHVybiBuPy5jb25zdHJ1Y3Rvcj9uLmNvbnN0cnVjdG9yLm5hbWU6Im51bGwgcHJvdG90eXBlIn0obik7cmV0dXJuL15IVE1MKFx3KilFbGVtZW50JC8udGVzdChyKT9gW0hUTUxFbGVtZW50OiAke3J9XWA6YFtvYmplY3QgJHtyfV1gfWNhdGNoKHQpe3JldHVybmAqKm5vbi1zZXJpYWxpemFibGUqKiAoJHt0fSlgfXZhciBlfSh0LG4pO2lmKCFjLnN0YXJ0c1dpdGgoIltvYmplY3QgIikpcmV0dXJuIGM7aWYobi5fX3NlbnRyeV9za2lwX25vcm1hbGl6YXRpb25fXylyZXR1cm4gbjtjb25zdCB1PSJudW1iZXIiPT10eXBlb2Ygbi5fX3NlbnRyeV9vdmVycmlkZV9ub3JtYWxpemF0aW9uX2RlcHRoX18/bi5fX3NlbnRyeV9vdmVycmlkZV9ub3JtYWxpemF0aW9uX2RlcHRoX186ZTtpZigwPT09dSlyZXR1cm4gYy5yZXBsYWNlKCJvYmplY3QgIiwiIik7aWYoaShuKSlyZXR1cm4iW0NpcmN1bGFyIH5dIjtjb25zdCBhPW47aWYoYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEudG9KU09OKXRyeXtyZXR1cm4gVHQoIiIsYS50b0pTT04oKSx1LTEscixvKX1jYXRjaHt9Y29uc3QgZj1BcnJheS5pc0FycmF5KG4pP1tdOnt9O2xldCBoPTA7Y29uc3QgcD1SKG4pO2Zvcihjb25zdCB0IGluIHApe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCx0KSljb250aW51ZTtpZihoPj1yKXtmW3RdPSJbTWF4UHJvcGVydGllcyB+XSI7YnJlYWt9Y29uc3Qgbj1wW3RdO2ZbdF09VHQodCxuLHUtMSxyLG8pLGgrK31yZXR1cm4gcyhuKSxmfWZ1bmN0aW9uIGt0KHQsbil7Y29uc3QgZT1uLnJlcGxhY2UoL1xcL2csIi8iKS5yZXBsYWNlKC9bfFxce30oKVtcXV4kKyo/Ll0vZywiXFwkJiIpO2xldCByPXQ7dHJ5e3I9ZGVjb2RlVVJJKHQpfWNhdGNoe31yZXR1cm4gci5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSgvd2VicGFjazpcLz8vZywiIikucmVwbGFjZShuZXcgUmVnRXhwKGAoZmlsZTovLyk/Lyoke2V9LypgLCJpZyIpLCJhcHA6Ly8vIil9ZnVuY3Rpb24gSXQodCxuPVtdKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBPdCh0LG4pe2NvbnN0IGU9dFsxXTtmb3IoY29uc3QgdCBvZiBlKXtpZihuKHQsdFswXS50eXBlKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBSdCh0KXtjb25zdCBuPW0ocCk7cmV0dXJuIG4uZW5jb2RlUG9seWZpbGw/bi5lbmNvZGVQb2x5ZmlsbCh0KToobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCl9ZnVuY3Rpb24gUHQodCl7Y29uc3RbbixlXT10O2xldCByPUpTT04uc3RyaW5naWZ5KG4pO2Z1bmN0aW9uIG8odCl7InN0cmluZyI9PXR5cGVvZiByP3I9InN0cmluZyI9PXR5cGVvZiB0P3IrdDpbUnQociksdF06ci5wdXNoKCJzdHJpbmciPT10eXBlb2YgdD9SdCh0KTp0KX1mb3IoY29uc3QgdCBvZiBlKXtjb25zdFtuLGVdPXQ7aWYobyhgXG4ke0pTT04uc3RyaW5naWZ5KG4pfVxuYCksInN0cmluZyI9PXR5cGVvZiBlfHxlIGluc3RhbmNlb2YgVWludDhBcnJheSlvKGUpO2Vsc2V7bGV0IHQ7dHJ5e3Q9SlNPTi5zdHJpbmdpZnkoZSl9Y2F0Y2h7dD1KU09OLnN0cmluZ2lmeShBdChlKSl9byh0KX19cmV0dXJuInN0cmluZyI9PXR5cGVvZiByP3I6ZnVuY3Rpb24odCl7Y29uc3Qgbj10LnJlZHVjZSgodCxuKT0+dCtuLmxlbmd0aCwwKSxlPW5ldyBVaW50OEFycmF5KG4pO2xldCByPTA7Zm9yKGNvbnN0IG4gb2YgdCllLnNldChuLHIpLHIrPW4ubGVuZ3RoO3JldHVybiBlfShyKX1jb25zdCBEdD17c2Vzc2lvbnM6InNlc3Npb24iLGV2ZW50OiJlcnJvciIsY2xpZW50X3JlcG9ydDoiaW50ZXJuYWwiLHVzZXJfcmVwb3J0OiJkZWZhdWx0Iixwcm9maWxlX2NodW5rOiJwcm9maWxlIixyZXBsYXlfZXZlbnQ6InJlcGxheSIscmVwbGF5X3JlY29yZGluZzoicmVwbGF5IixjaGVja19pbjoibW9uaXRvciIscmF3X3NlY3VyaXR5OiJzZWN1cml0eSIsbG9nOiJsb2dfaXRlbSIsdHJhY2VfbWV0cmljOiJtZXRyaWMifTtmdW5jdGlvbiBVdCh0KXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQgaW4gRHR9KHQpP0R0W3RdOnR9ZnVuY3Rpb24gTHQodCl7aWYoIXQ/LnNkaylyZXR1cm47Y29uc3R7bmFtZTpuLHZlcnNpb246ZX09dC5zZGs7cmV0dXJue25hbWU6bix2ZXJzaW9uOmV9fWZ1bmN0aW9uIE10KHQsbixlLHIpe2NvbnN0IG89THQoZSksaT10LnR5cGUmJiJyZXBsYXlfZXZlbnQiIT09dC50eXBlP3QudHlwZToiZXZlbnQiOyFmdW5jdGlvbih0LG4pe2lmKCFuKXJldHVybiB0O2NvbnN0IGU9dC5zZGt8fHt9O3Quc2RrPXsuLi5lLG5hbWU6ZS5uYW1lfHxuLm5hbWUsdmVyc2lvbjplLnZlcnNpb258fG4udmVyc2lvbixpbnRlZ3JhdGlvbnM6Wy4uLnQuc2RrPy5pbnRlZ3JhdGlvbnN8fFtdLC4uLm4uaW50ZWdyYXRpb25zfHxbXV0scGFja2FnZXM6Wy4uLnQuc2RrPy5wYWNrYWdlc3x8W10sLi4ubi5wYWNrYWdlc3x8W11dLHNldHRpbmdzOnQuc2RrPy5zZXR0aW5nc3x8bi5zZXR0aW5ncz97Li4udC5zZGs/LnNldHRpbmdzLC4uLm4uc2V0dGluZ3N9OnZvaWQgMH19KHQsZT8uc2RrKTtjb25zdCBzPWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89dC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE/LmR5bmFtaWNTYW1wbGluZ0NvbnRleHQ7cmV0dXJue2V2ZW50X2lkOnQuZXZlbnRfaWQsc2VudF9hdDoobmV3IERhdGUpLnRvSVNPU3RyaW5nKCksLi4ubiYme3NkazpufSwuLi4hIWUmJnImJntkc246YnQocil9LC4uLm8mJnt0cmFjZTpvfX19KHQsbyxyLG4pO2RlbGV0ZSB0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YTtyZXR1cm4gSXQocyxbW3t0eXBlOml9LHRdXSl9Y29uc3QgQnQ9Il9fU0VOVFJZX1NVUFBSRVNTX1RSQUNJTkdfXyI7ZnVuY3Rpb24gV3QodCl7Y29uc3Qgbj1mdChsKCkpO3JldHVybiBuLnN1cHByZXNzVHJhY2luZz9uLnN1cHByZXNzVHJhY2luZyh0KTpmdW5jdGlvbiguLi50KXtjb25zdCBuPWZ0KGwoKSk7aWYoMj09PXQubGVuZ3RoKXtjb25zdFtlLHJdPXQ7cmV0dXJuIGU/bi53aXRoU2V0U2NvcGUoZSxyKTpuLndpdGhTY29wZShyKX1yZXR1cm4gbi53aXRoU2NvcGUodFswXSl9KG49PntuLnNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh7W0J0XTohMH0pO2NvbnN0IGU9dCgpO3JldHVybiBuLnNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh7W0J0XTp2b2lkIDB9KSxlfSl9ZnVuY3Rpb24genQodCxuKXtjb25zdHtmaW5nZXJwcmludDplLHNwYW46cixicmVhZGNydW1iczpvLHNka1Byb2Nlc3NpbmdNZXRhZGF0YTppfT1uOyFmdW5jdGlvbih0LG4pe2NvbnN0e2V4dHJhOmUsdGFnczpyLHVzZXI6byxjb250ZXh0czppLGxldmVsOnMsdHJhbnNhY3Rpb25OYW1lOmN9PW47T2JqZWN0LmtleXMoZSkubGVuZ3RoJiYodC5leHRyYT17Li4uZSwuLi50LmV4dHJhfSk7T2JqZWN0LmtleXMocikubGVuZ3RoJiYodC50YWdzPXsuLi5yLC4uLnQudGFnc30pO09iamVjdC5rZXlzKG8pLmxlbmd0aCYmKHQudXNlcj17Li4ubywuLi50LnVzZXJ9KTtPYmplY3Qua2V5cyhpKS5sZW5ndGgmJih0LmNvbnRleHRzPXsuLi5pLC4uLnQuY29udGV4dHN9KTtzJiYodC5sZXZlbD1zKTtjJiYidHJhbnNhY3Rpb24iIT09dC50eXBlJiYodC50cmFuc2FjdGlvbj1jKX0odCxuKSxyJiZmdW5jdGlvbih0LG4pe3QuY29udGV4dHM9e3RyYWNlOl90KG4pLC4uLnQuY29udGV4dHN9LHQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhPXtkeW5hbWljU2FtcGxpbmdDb250ZXh0OkN0KG4pLC4uLnQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhfTtjb25zdCBlPWp0KG4pLHI9RXQoZSkuZGVzY3JpcHRpb247ciYmIXQudHJhbnNhY3Rpb24mJiJ0cmFuc2FjdGlvbiI9PT10LnR5cGUmJih0LnRyYW5zYWN0aW9uPXIpfSh0LHIpLGZ1bmN0aW9uKHQsbil7dC5maW5nZXJwcmludD10LmZpbmdlcnByaW50P0FycmF5LmlzQXJyYXkodC5maW5nZXJwcmludCk/dC5maW5nZXJwcmludDpbdC5maW5nZXJwcmludF06W10sbiYmKHQuZmluZ2VycHJpbnQ9dC5maW5nZXJwcmludC5jb25jYXQobikpO3QuZmluZ2VycHJpbnQubGVuZ3RofHxkZWxldGUgdC5maW5nZXJwcmludH0odCxlKSxmdW5jdGlvbih0LG4pe2NvbnN0IGU9Wy4uLnQuYnJlYWRjcnVtYnN8fFtdLC4uLm5dO3QuYnJlYWRjcnVtYnM9ZS5sZW5ndGg/ZTp2b2lkIDB9KHQsbyksZnVuY3Rpb24odCxuKXt0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YT17Li4udC5zZGtQcm9jZXNzaW5nTWV0YWRhdGEsLi4ubn19KHQsaSl9Y2xhc3MgRnR7Y29uc3RydWN0b3IodCl7dGhpcy5XPTAsdGhpcy5GPVtdLHRoaXMuRyh0KX10aGVuKHQsbil7cmV0dXJuIG5ldyBGdCgoZSxyKT0+e3RoaXMuRi5wdXNoKFshMSxuPT57aWYodCl0cnl7ZSh0KG4pKX1jYXRjaCh0KXtyKHQpfWVsc2UgZShuKX0sdD0+e2lmKG4pdHJ5e2Uobih0KSl9Y2F0Y2godCl7cih0KX1lbHNlIHIodCl9XSksdGhpcy5IKCl9KX1jYXRjaCh0KXtyZXR1cm4gdGhpcy50aGVuKHQ9PnQsdCl9ZmluYWxseSh0KXtyZXR1cm4gbmV3IEZ0KChuLGUpPT57bGV0IHIsbztyZXR1cm4gdGhpcy50aGVuKG49PntvPSExLHI9bix0JiZ0KCl9LG49PntvPSEwLHI9bix0JiZ0KCl9KS50aGVuKCgpPT57bz9lKHIpOm4ocil9KX0pfUgoKXtpZigwPT09dGhpcy5XKXJldHVybjtjb25zdCB0PXRoaXMuRi5zbGljZSgpO3RoaXMuRj1bXSx0LmZvckVhY2godD0+e3RbMF18fCgxPT09dGhpcy5XJiZ0WzFdKHRoaXMuSiksMj09PXRoaXMuVyYmdFsyXSh0aGlzLkopLHRbMF09ITApfSl9Ryh0KXtjb25zdCBuPSh0LG4pPT57MD09PXRoaXMuVyYmKFQobik/bi50aGVuKGUscik6KHRoaXMuVz10LHRoaXMuSj1uLHRoaXMuSCgpKSl9LGU9dD0+e24oMSx0KX0scj10PT57bigyLHQpfTt0cnl7dChlLHIpfWNhdGNoKHQpe3IodCl9fX1jb25zdCBHdD1TeW1ib2wuZm9yKCJTZW50cnlCdWZmZXJGdWxsRXJyb3IiKTtmdW5jdGlvbiBIdCh0PTEwMCl7Y29uc3Qgbj1uZXcgU2V0O2Z1bmN0aW9uIGUodCl7bi5kZWxldGUodCl9cmV0dXJue2dldCAkKCl7cmV0dXJuIEFycmF5LmZyb20obil9LGFkZDpmdW5jdGlvbihyKXtpZighKG4uc2l6ZTx0KSlyZXR1cm4gbz1HdCxuZXcgRnQoKHQsbik9PntuKG8pfSk7dmFyIG87Y29uc3QgaT1yKCk7cmV0dXJuIG4uYWRkKGkpLGkudGhlbigoKT0+ZShpKSwoKT0+ZShpKSksaX0sZHJhaW46ZnVuY3Rpb24odCl7aWYoIW4uc2l6ZSlyZXR1cm4gZT0hMCxuZXcgRnQodD0+e3QoZSl9KTt2YXIgZTtjb25zdCByPVByb21pc2UuYWxsU2V0dGxlZChBcnJheS5mcm9tKG4pKS50aGVuKCgpPT4hMCk7aWYoIXQpcmV0dXJuIHI7Y29uc3Qgbz1bcixuZXcgUHJvbWlzZShuPT57cmV0dXJuIm9iamVjdCI9PXR5cGVvZihlPXNldFRpbWVvdXQoKCk9Pm4oITEpLHQpKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudW5yZWYmJmUudW5yZWYoKSxlO3ZhciBlfSldO3JldHVybiBQcm9taXNlLnJhY2Uobyl9fX1mdW5jdGlvbiBKdCh0LHtzdGF0dXNDb2RlOm4saGVhZGVyczplfSxyPVcoKSl7Y29uc3Qgbz17Li4udH0saT1lPy5bIngtc2VudHJ5LXJhdGUtbGltaXRzIl0scz1lPy5bInJldHJ5LWFmdGVyIl07aWYoaSlmb3IoY29uc3QgdCBvZiBpLnRyaW0oKS5zcGxpdCgiLCIpKXtjb25zdFtuLGUsLCxpXT10LnNwbGl0KCI6Iiw1KSxzPXBhcnNlSW50KG4sMTApLGM9MWUzKihpc05hTihzKT82MDpzKTtpZihlKWZvcihjb25zdCB0IG9mIGUuc3BsaXQoIjsiKSkibWV0cmljX2J1Y2tldCI9PT10JiZpJiYhaS5zcGxpdCgiOyIpLmluY2x1ZGVzKCJjdXN0b20iKXx8KG9bdF09citjKTtlbHNlIG8uYWxsPXIrY31lbHNlIHM/by5hbGw9citmdW5jdGlvbih0LG49VygpKXtjb25zdCBlPXBhcnNlSW50KGAke3R9YCwxMCk7aWYoIWlzTmFOKGUpKXJldHVybiAxZTMqZTtjb25zdCByPURhdGUucGFyc2UoYCR7dH1gKTtyZXR1cm4gaXNOYU4ocik/NmU0OnItbn0ocyxyKTo0Mjk9PT1uJiYoby5hbGw9cis2ZTQpO3JldHVybiBvfWZ1bmN0aW9uIFl0KHQsbixlPUh0KHQuYnVmZmVyU2l6ZXx8NjQpKXtsZXQgcj17fTtyZXR1cm57c2VuZDpmdW5jdGlvbih0KXtjb25zdCBvPVtdO2lmKE90KHQsKHQsbik9Pntjb25zdCBlPVV0KG4pOyhmdW5jdGlvbih0LG4sZT1XKCkpe3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiB0W25dfHx0LmFsbHx8MH0odCxuKT5lfSkocixlKXx8by5wdXNoKHQpfSksMD09PW8ubGVuZ3RoKXJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO2NvbnN0IGk9SXQodFswXSxvKSxzPXQ9PnshZnVuY3Rpb24odCxuKXtyZXR1cm4gT3QodCwodCxlKT0+bi5pbmNsdWRlcyhlKSl9KGksWyJjbGllbnRfcmVwb3J0Il0pP090KGksKHQsbik9Pnt9KTpoJiZTLndhcm4oYERyb3BwaW5nIGNsaWVudCByZXBvcnQuIFdpbGwgbm90IHNlbmQgb3V0Y29tZXMgKHJlYXNvbjogJHt0fSkuYCl9O3JldHVybiBlLmFkZCgoKT0+bih7Ym9keTpQdChpKX0pLnRoZW4odD0+NDEzPT09dC5zdGF0dXNDb2RlPyhoJiZTLmVycm9yKCJTZW50cnkgcmVzcG9uZGVkIHdpdGggc3RhdHVzIGNvZGUgNDEzLiBFbnZlbG9wZSB3YXMgZGlzY2FyZGVkIGR1ZSB0byBleGNlZWRpbmcgc2l6ZSBsaW1pdHMuIikscygic2VuZF9lcnJvciIpLHQpOihoJiZ2b2lkIDAhPT10LnN0YXR1c0NvZGUmJih0LnN0YXR1c0NvZGU8MjAwfHx0LnN0YXR1c0NvZGU+PTMwMCkmJlMud2FybihgU2VudHJ5IHJlc3BvbmRlZCB3aXRoIHN0YXR1cyBjb2RlICR7dC5zdGF0dXNDb2RlfSB0byBzZW50IGV2ZW50LmApLHI9SnQocix0KSx0KSx0PT57dGhyb3cgcygibmV0d29ya19lcnJvciIpLGgmJlMuZXJyb3IoIkVuY291bnRlcmVkIGVycm9yIHJ1bm5pbmcgdHJhbnNwb3J0IHJlcXVlc3Q6Iix0KSx0fSkpLnRoZW4odD0+dCx0PT57aWYodD09PUd0KXJldHVybiBoJiZTLmVycm9yKCJTa2lwcGVkIHNlbmRpbmcgZXZlbnQgYmVjYXVzZSBidWZmZXIgaXMgZnVsbC4iKSxzKCJxdWV1ZV9vdmVyZmxvdyIpLFByb21pc2UucmVzb2x2ZSh7fSk7dGhyb3cgdH0pfSxmbHVzaDp0PT5lLmRyYWluKHQpfX1jb25zdCBWdD0vXihcUys6XFx8XC8/KShbXHNcU10qPykoKD86XC57MSwyfXxbXi9cXF0rP3wpKFwuW14uL1xcXSp8KSkoPzpbL1xcXSopJC87ZnVuY3Rpb24gS3QodCl7Y29uc3Qgbj1mdW5jdGlvbih0KXtjb25zdCBuPXQubGVuZ3RoPjEwMjQ/YDx0cnVuY2F0ZWQ+JHt0LnNsaWNlKC0xMDI0KX1gOnQsZT1WdC5leGVjKG4pO3JldHVybiBlP2Uuc2xpY2UoMSk6W119KHQpLGU9blswXXx8IiI7bGV0IHI9blsxXTtyZXR1cm4gZXx8cj8ociYmKHI9ci5zbGljZSgwLHIubGVuZ3RoLTEpKSxlK3IpOiIuIn1mdW5jdGlvbiBadCh0LG49ITEpe3JldHVybiEobnx8dCYmIXQuc3RhcnRzV2l0aCgiLyIpJiYhdC5tYXRjaCgvXltBLVpdOi8pJiYhdC5zdGFydHNXaXRoKCIuIikmJiF0Lm1hdGNoKC9eW2EtekEtWl0oW2EtekEtWjAtOS5cLStdKSo6XC9cLy8pKSYmdm9pZCAwIT09dCYmIXQuaW5jbHVkZXMoIm5vZGVfbW9kdWxlcy8iKX1jb25zdCBxdD1TeW1ib2woIkFnZW50QmFzZUludGVybmFsU3RhdGUiKTtjbGFzcyBRdCBleHRlbmRzIGkuQWdlbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpc1txdF09e319aXNTZWN1cmVFbmRwb2ludCh0KXtpZih0KXtpZigiYm9vbGVhbiI9PXR5cGVvZiB0LnNlY3VyZUVuZHBvaW50KXJldHVybiB0LnNlY3VyZUVuZHBvaW50O2lmKCJzdHJpbmciPT10eXBlb2YgdC5wcm90b2NvbClyZXR1cm4iaHR0cHM6Ij09PXQucHJvdG9jb2x9Y29uc3R7c3RhY2s6bn09bmV3IEVycm9yO3JldHVybiJzdHJpbmciPT10eXBlb2YgbiYmbi5zcGxpdCgiXG4iKS5zb21lKHQ9Pi0xIT09dC5pbmRleE9mKCIoaHR0cHMuanM6Iil8fC0xIT09dC5pbmRleE9mKCJub2RlOmh0dHBzOiIpKX1jcmVhdGVTb2NrZXQodCxuLGUpe2NvbnN0IHI9ey4uLm4sc2VjdXJlRW5kcG9pbnQ6dGhpcy5pc1NlY3VyZUVuZHBvaW50KG4pfTtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT50aGlzLmNvbm5lY3QodCxyKSkudGhlbihvPT57aWYobyBpbnN0YW5jZW9mIGkuQWdlbnQpcmV0dXJuIG8uYWRkUmVxdWVzdCh0LHIpO3RoaXNbcXRdLmN1cnJlbnRTb2NrZXQ9byxzdXBlci5jcmVhdGVTb2NrZXQodCxuLGUpfSxlKX1jcmVhdGVDb25uZWN0aW9uKCl7Y29uc3QgdD10aGlzW3F0XS5jdXJyZW50U29ja2V0O2lmKHRoaXNbcXRdLmN1cnJlbnRTb2NrZXQ9dm9pZCAwLCF0KXRocm93IG5ldyBFcnJvcigiTm8gc29ja2V0IHdhcyByZXR1cm5lZCBpbiB0aGUgYGNvbm5lY3QoKWAgZnVuY3Rpb24iKTtyZXR1cm4gdH1nZXQgZGVmYXVsdFBvcnQoKXtyZXR1cm4gdGhpc1txdF0uZGVmYXVsdFBvcnQ/PygiaHR0cHM6Ij09PXRoaXMucHJvdG9jb2w/NDQzOjgwKX1zZXQgZGVmYXVsdFBvcnQodCl7dGhpc1txdF0mJih0aGlzW3F0XS5kZWZhdWx0UG9ydD10KX1nZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpc1txdF0ucHJvdG9jb2w/Pyh0aGlzLmlzU2VjdXJlRW5kcG9pbnQoKT8iaHR0cHM6IjoiaHR0cDoiKX1zZXQgcHJvdG9jb2wodCl7dGhpc1txdF0mJih0aGlzW3F0XS5wcm90b2NvbD10KX19ZnVuY3Rpb24gWHQoLi4udCl7Uy5sb2coIltodHRwcy1wcm94eS1hZ2VudDpwYXJzZS1wcm94eS1yZXNwb25zZV0iLC4uLnQpfWZ1bmN0aW9uIHRuKHQpe3JldHVybiBuZXcgUHJvbWlzZSgobixlKT0+e2xldCByPTA7Y29uc3Qgbz1bXTtmdW5jdGlvbiBpKCl7Y29uc3QgYz10LnJlYWQoKTtjP2Z1bmN0aW9uKGMpe28ucHVzaChjKSxyKz1jLmxlbmd0aDtjb25zdCB1PUJ1ZmZlci5jb25jYXQobyxyKSxhPXUuaW5kZXhPZigiXHJcblxyXG4iKTtpZigtMT09PWEpcmV0dXJuIFh0KCJoYXZlIG5vdCByZWNlaXZlZCBlbmQgb2YgSFRUUCBoZWFkZXJzIHlldC4uLiIpLHZvaWQgaSgpO2NvbnN0IGY9dS5zdWJhcnJheSgwLGEpLnRvU3RyaW5nKCJhc2NpaSIpLnNwbGl0KCJcclxuIiksaD1mLnNoaWZ0KCk7aWYoIWgpcmV0dXJuIHQuZGVzdHJveSgpLGUobmV3IEVycm9yKCJObyBoZWFkZXIgcmVjZWl2ZWQgZnJvbSBwcm94eSBDT05ORUNUIHJlc3BvbnNlIikpO2NvbnN0IHA9aC5zcGxpdCgiICIpLGQ9KyhwWzFdfHwwKSxsPXAuc2xpY2UoMikuam9pbigiICIpLG09e307Zm9yKGNvbnN0IG4gb2YgZil7aWYoIW4pY29udGludWU7Y29uc3Qgcj1uLmluZGV4T2YoIjoiKTtpZigtMT09PXIpcmV0dXJuIHQuZGVzdHJveSgpLGUobmV3IEVycm9yKGBJbnZhbGlkIGhlYWRlciBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2U6ICIke259ImApKTtjb25zdCBvPW4uc2xpY2UoMCxyKS50b0xvd2VyQ2FzZSgpLGk9bi5zbGljZShyKzEpLnRyaW1TdGFydCgpLHM9bVtvXTsic3RyaW5nIj09dHlwZW9mIHM/bVtvXT1bcyxpXTpBcnJheS5pc0FycmF5KHMpP3MucHVzaChpKTptW29dPWl9WHQoImdvdCBwcm94eSBzZXJ2ZXIgcmVzcG9uc2U6ICVvICVvIixoLG0pLHMoKSxuKHtjb25uZWN0OntzdGF0dXNDb2RlOmQsc3RhdHVzVGV4dDpsLGhlYWRlcnM6bX0sYnVmZmVyZWQ6dX0pfShjKTp0Lm9uY2UoInJlYWRhYmxlIixpKX1mdW5jdGlvbiBzKCl7dC5yZW1vdmVMaXN0ZW5lcigiZW5kIixjKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsdSksdC5yZW1vdmVMaXN0ZW5lcigicmVhZGFibGUiLGkpfWZ1bmN0aW9uIGMoKXtzKCksWHQoIm9uZW5kIiksZShuZXcgRXJyb3IoIlByb3h5IGNvbm5lY3Rpb24gZW5kZWQgYmVmb3JlIHJlY2VpdmluZyBDT05ORUNUIHJlc3BvbnNlIikpfWZ1bmN0aW9uIHUodCl7cygpLFh0KCJvbmVycm9yICVvIix0KSxlKHQpfXQub24oImVycm9yIix1KSx0Lm9uKCJlbmQiLGMpLGkoKX0pfWZ1bmN0aW9uIG5uKC4uLnQpe1MubG9nKCJbaHR0cHMtcHJveHktYWdlbnRdIiwuLi50KX1jbGFzcyBlbiBleHRlbmRzIFF0e3N0YXRpYyBfX2luaXRTdGF0aWMoKXt0aGlzLnByb3RvY29scz1bImh0dHAiLCJodHRwcyJdfWNvbnN0cnVjdG9yKHQsbil7c3VwZXIobiksdGhpcy5vcHRpb25zPXt9LHRoaXMucHJveHk9InN0cmluZyI9PXR5cGVvZiB0P25ldyBVUkwodCk6dCx0aGlzLnByb3h5SGVhZGVycz1uPy5oZWFkZXJzPz97fSxubigiQ3JlYXRpbmcgbmV3IEh0dHBzUHJveHlBZ2VudCBpbnN0YW5jZTogJW8iLHRoaXMucHJveHkuaHJlZik7Y29uc3QgZT0odGhpcy5wcm94eS5ob3N0bmFtZXx8dGhpcy5wcm94eS5ob3N0KS5yZXBsYWNlKC9eXFt8XF0kL2csIiIpLHI9dGhpcy5wcm94eS5wb3J0P3BhcnNlSW50KHRoaXMucHJveHkucG9ydCwxMCk6Imh0dHBzOiI9PT10aGlzLnByb3h5LnByb3RvY29sPzQ0Mzo4MDt0aGlzLmNvbm5lY3RPcHRzPXtBTFBOUHJvdG9jb2xzOlsiaHR0cC8xLjEiXSwuLi5uP29uKG4sImhlYWRlcnMiKTpudWxsLGhvc3Q6ZSxwb3J0OnJ9fWFzeW5jIGNvbm5lY3QodCxuKXtjb25zdHtwcm94eTplfT10aGlzO2lmKCFuLmhvc3QpdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gImhvc3QiIHByb3ZpZGVkJyk7bGV0IHI7aWYoImh0dHBzOiI9PT1lLnByb3RvY29sKXtubigiQ3JlYXRpbmcgYHRscy5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cyk7Y29uc3QgdD10aGlzLmNvbm5lY3RPcHRzLnNlcnZlcm5hbWV8fHRoaXMuY29ubmVjdE9wdHMuaG9zdDtyPWYuY29ubmVjdCh7Li4udGhpcy5jb25uZWN0T3B0cyxzZXJ2ZXJuYW1lOnQmJmEuaXNJUCh0KT92b2lkIDA6dH0pfWVsc2Ugbm4oIkNyZWF0aW5nIGBuZXQuU29ja2V0YDogJW8iLHRoaXMuY29ubmVjdE9wdHMpLHI9YS5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO2NvbnN0IG89ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucHJveHlIZWFkZXJzP3RoaXMucHJveHlIZWFkZXJzKCk6ey4uLnRoaXMucHJveHlIZWFkZXJzfSxpPWEuaXNJUHY2KG4uaG9zdCk/YFske24uaG9zdH1dYDpuLmhvc3Q7bGV0IHM9YENPTk5FQ1QgJHtpfToke24ucG9ydH0gSFRUUC8xLjFcclxuYDtpZihlLnVzZXJuYW1lfHxlLnBhc3N3b3JkKXtjb25zdCB0PWAke2RlY29kZVVSSUNvbXBvbmVudChlLnVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQoZS5wYXNzd29yZCl9YDtvWyJQcm94eS1BdXRob3JpemF0aW9uIl09YEJhc2ljICR7QnVmZmVyLmZyb20odCkudG9TdHJpbmcoImJhc2U2NCIpfWB9by5Ib3N0PWAke2l9OiR7bi5wb3J0fWAsb1siUHJveHktQ29ubmVjdGlvbiJdfHwob1siUHJveHktQ29ubmVjdGlvbiJdPXRoaXMua2VlcEFsaXZlPyJLZWVwLUFsaXZlIjoiY2xvc2UiKTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhvKSlzKz1gJHt0fTogJHtvW3RdfVxyXG5gO2NvbnN0IGM9dG4ocik7ci53cml0ZShgJHtzfVxyXG5gKTtjb25zdHtjb25uZWN0OnUsYnVmZmVyZWQ6aH09YXdhaXQgYztpZih0LmVtaXQoInByb3h5Q29ubmVjdCIsdSksdGhpcy5lbWl0KCJwcm94eUNvbm5lY3QiLHUsdCksMjAwPT09dS5zdGF0dXNDb2RlKXtpZih0Lm9uY2UoInNvY2tldCIscm4pLG4uc2VjdXJlRW5kcG9pbnQpe25uKCJVcGdyYWRpbmcgc29ja2V0IGNvbm5lY3Rpb24gdG8gVExTIik7Y29uc3QgdD1uLnNlcnZlcm5hbWV8fG4uaG9zdDtyZXR1cm4gZi5jb25uZWN0KHsuLi5vbihuLCJob3N0IiwicGF0aCIsInBvcnQiKSxzb2NrZXQ6cixzZXJ2ZXJuYW1lOmEuaXNJUCh0KT92b2lkIDA6dH0pfXJldHVybiByfXIuZGVzdHJveSgpO2NvbnN0IHA9bmV3IGEuU29ja2V0KHt3cml0YWJsZTohMX0pO3JldHVybiBwLnJlYWRhYmxlPSEwLHQub25jZSgic29ja2V0Iix0PT57bm4oIlJlcGxheWluZyBwcm94eSBidWZmZXIgZm9yIGZhaWxlZCByZXF1ZXN0IiksdC5wdXNoKGgpLHQucHVzaChudWxsKX0pLHB9fWZ1bmN0aW9uIHJuKHQpe3QucmVzdW1lKCl9ZnVuY3Rpb24gb24odCwuLi5uKXtjb25zdCBlPXt9O2xldCByO2ZvcihyIGluIHQpbi5pbmNsdWRlcyhyKXx8KGVbcl09dFtyXSk7cmV0dXJuIGV9ZW4uX19pbml0U3RhdGljKCk7ZnVuY3Rpb24gc24odCl7cmV0dXJuIHQucmVwbGFjZSgvXltBLVpdOi8sIiIpLnJlcGxhY2UoL1xcL2csIi8iKX1jb25zdCBjbj1uO2xldCB1bixhbj0wLGZuPXt9O2Z1bmN0aW9uIGhuKHQpe2NuLmRlYnVnJiZjb25zb2xlLmxvZyhgW0FOUiBXb3JrZXJdICR7dH1gKX12YXIgcG4sZG4sbG47Y29uc3QgbW49ZnVuY3Rpb24odCl7bGV0IG47dHJ5e249bmV3IFVSTCh0LnVybCl9Y2F0Y2gobil7cmV0dXJuIGIoKCk9Pntjb25zb2xlLndhcm4oIltAc2VudHJ5L25vZGVdOiBJbnZhbGlkIGRzbiBvciB0dW5uZWwgb3B0aW9uLCB3aWxsIG5vdCBzZW5kIGFueSBldmVudHMuIFRoZSB0dW5uZWwgb3B0aW9uIG11c3QgYmUgYSBmdWxsIFVSTCB3aGVuIHVzZWQuIil9KSxZdCh0LCgpPT5Qcm9taXNlLnJlc29sdmUoe30pKX1jb25zdCBlPSJodHRwczoiPT09bi5wcm90b2NvbCxyPWZ1bmN0aW9uKHQsbil7Y29uc3R7bm9fcHJveHk6ZX09cHJvY2Vzcy5lbnYscj1lPy5zcGxpdCgiLCIpLnNvbWUobj0+dC5ob3N0LmVuZHNXaXRoKG4pfHx0Lmhvc3RuYW1lLmVuZHNXaXRoKG4pKTtyZXR1cm4gcj92b2lkIDA6bn0obix0LnByb3h5fHwoZT9wcm9jZXNzLmVudi5odHRwc19wcm94eTp2b2lkIDApfHxwcm9jZXNzLmVudi5odHRwX3Byb3h5KSxvPWU/czppLGE9dm9pZCAwIT09dC5rZWVwQWxpdmUmJnQua2VlcEFsaXZlLGY9cj9uZXcgZW4ocik6bmV3IG8uQWdlbnQoe2tlZXBBbGl2ZTphLG1heFNvY2tldHM6MzAsdGltZW91dDoyZTN9KSxoPWZ1bmN0aW9uKHQsbixlKXtjb25zdHtob3N0bmFtZTpyLHBhdGhuYW1lOm8scG9ydDppLHByb3RvY29sOnMsc2VhcmNoOmF9PW5ldyBVUkwodC51cmwpO3JldHVybiBmdW5jdGlvbihmKXtyZXR1cm4gbmV3IFByb21pc2UoKGgscCk9PntXdCgoKT0+e2xldCBkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYyh7cmVhZCgpe3RoaXMucHVzaCh0KSx0aGlzLnB1c2gobnVsbCl9fSl9KGYuYm9keSk7Y29uc3QgbD17Li4udC5oZWFkZXJzfTtmLmJvZHkubGVuZ3RoPjMyNzY4JiYobFsiY29udGVudC1lbmNvZGluZyJdPSJnemlwIixkPWQucGlwZSh1KCkpKTtjb25zdCBtPXIuc3RhcnRzV2l0aCgiWyIpLGc9bi5yZXF1ZXN0KHttZXRob2Q6IlBPU1QiLGFnZW50OmUsaGVhZGVyczpsLGhvc3RuYW1lOm0/ci5zbGljZSgxLC0xKTpyLHBhdGg6YCR7b30ke2F9YCxwb3J0OmkscHJvdG9jb2w6cyxjYTp0LmNhQ2VydHN9LHQ9Pnt0Lm9uKCJkYXRhIiwoKT0+e30pLHQub24oImVuZCIsKCk9Pnt9KSx0LnNldEVuY29kaW5nKCJ1dGY4Iik7Y29uc3Qgbj10LmhlYWRlcnNbInJldHJ5LWFmdGVyIl0/P251bGwsZT10LmhlYWRlcnNbIngtc2VudHJ5LXJhdGUtbGltaXRzIl0/P251bGw7aCh7c3RhdHVzQ29kZTp0LnN0YXR1c0NvZGUsaGVhZGVyczp7InJldHJ5LWFmdGVyIjpuLCJ4LXNlbnRyeS1yYXRlLWxpbWl0cyI6QXJyYXkuaXNBcnJheShlKT9lWzBdfHxudWxsOmV9fSl9KTtnLm9uKCJlcnJvciIscCksZC5waXBlKGcpfSl9KX19KHQsdC5odHRwTW9kdWxlPz9vLGYpO3JldHVybiBZdCh0LGgpfSh7dXJsOihwbj1jbi5kc24sZG49Y24udHVubmVsLGxuPWNuLnNka01ldGFkYXRhLnNkayxkbnx8YCR7ZnVuY3Rpb24odCl7cmV0dXJuYCR7ZnVuY3Rpb24odCl7Y29uc3Qgbj10LnByb3RvY29sP2Ake3QucHJvdG9jb2x9OmA6IiIsZT10LnBvcnQ/YDoke3QucG9ydH1gOiIiO3JldHVybmAke259Ly8ke3QuaG9zdH0ke2V9JHt0LnBhdGg/YC8ke3QucGF0aH1gOiIifS9hcGkvYH0odCl9JHt0LnByb2plY3RJZH0vZW52ZWxvcGUvYH0ocG4pfT8ke2Z1bmN0aW9uKHQsbil7Y29uc3QgZT17c2VudHJ5X3ZlcnNpb246IjcifTtyZXR1cm4gdC5wdWJsaWNLZXkmJihlLnNlbnRyeV9rZXk9dC5wdWJsaWNLZXkpLG4mJihlLnNlbnRyeV9jbGllbnQ9YCR7bi5uYW1lfS8ke24udmVyc2lvbn1gKSxuZXcgVVJMU2VhcmNoUGFyYW1zKGUpLnRvU3RyaW5nKCl9KHBuLGxuKX1gKX0pO2FzeW5jIGZ1bmN0aW9uIGduKCl7aWYodW4pe2huKCJTZW5kaW5nIGFibm9ybWFsIHNlc3Npb24iKSxWKHVuLHtzdGF0dXM6ImFibm9ybWFsIixhYm5vcm1hbF9tZWNoYW5pc206ImFucl9mb3JlZ3JvdW5kIixyZWxlYXNlOmNuLnJlbGVhc2UsZW52aXJvbm1lbnQ6Y24uZW52aXJvbm1lbnR9KTtjb25zdCB0PWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89THQoZSk7cmV0dXJuIEl0KHtzZW50X2F0OihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKSwuLi5vJiZ7c2RrOm99LC4uLiEhciYmbiYme2RzbjpidChuKX19LFsiYWdncmVnYXRlcyJpbiB0P1t7dHlwZToic2Vzc2lvbnMifSx0XTpbe3R5cGU6InNlc3Npb24ifSx0LnRvSlNPTigpXV0pfSh1bixjbi5kc24sY24uc2RrTWV0YWRhdGEsY24udHVubmVsKTtobihKU09OLnN0cmluZ2lmeSh0KSksYXdhaXQgbW4uc2VuZCh0KTt0cnl7ZT8ucG9zdE1lc3NhZ2UoInNlc3Npb24tZW5kZWQiKX1jYXRjaHt9fX1mdW5jdGlvbiB5bih0KXtpZighdClyZXR1cm47Y29uc3Qgbj1mdW5jdGlvbih0KXtpZighdC5sZW5ndGgpcmV0dXJuW107Y29uc3Qgbj1BcnJheS5mcm9tKHQpO3JldHVybi9zZW50cnlXcmFwcGVkLy50ZXN0KEUobikuZnVuY3Rpb258fCIiKSYmbi5wb3AoKSxuLnJldmVyc2UoKSwkLnRlc3QoRShuKS5mdW5jdGlvbnx8IiIpJiYobi5wb3AoKSwkLnRlc3QoRShuKS5mdW5jdGlvbnx8IiIpJiZuLnBvcCgpKSxuLnNsaWNlKDAsNTApLm1hcCh0PT4oey4uLnQsZmlsZW5hbWU6dC5maWxlbmFtZXx8RShuKS5maWxlbmFtZSxmdW5jdGlvbjp0LmZ1bmN0aW9ufHwiPyJ9KSl9KHQpO2lmKGNuLmFwcFJvb3RQYXRoKWZvcihjb25zdCB0IG9mIG4pdC5maWxlbmFtZSYmKHQuZmlsZW5hbWU9a3QodC5maWxlbmFtZSxjbi5hcHBSb290UGF0aCkpO3JldHVybiBufWFzeW5jIGZ1bmN0aW9uIGJuKHQsbil7aWYoYW4+PWNuLm1heEFuckV2ZW50cylyZXR1cm47YW4rPTEsYXdhaXQgZ24oKSxobigiU2VuZGluZyBldmVudCIpO2NvbnN0IGU9e2V2ZW50X2lkOkYoKSxjb250ZXh0czpjbi5jb250ZXh0cyxyZWxlYXNlOmNuLnJlbGVhc2UsZW52aXJvbm1lbnQ6Y24uZW52aXJvbm1lbnQsZGlzdDpjbi5kaXN0LHBsYXRmb3JtOiJub2RlIixsZXZlbDoiZXJyb3IiLGV4Y2VwdGlvbjp7dmFsdWVzOlt7dHlwZToiQXBwbGljYXRpb25Ob3RSZXNwb25kaW5nIix2YWx1ZTpgQXBwbGljYXRpb24gTm90IFJlc3BvbmRpbmcgZm9yIGF0IGxlYXN0ICR7Y24uYW5yVGhyZXNob2xkfSBtc2Asc3RhY2t0cmFjZTp7ZnJhbWVzOnluKHQpfSxtZWNoYW5pc206e3R5cGU6IkFOUiJ9fV19LHRhZ3M6Y24uc3RhdGljVGFnc307biYmZnVuY3Rpb24odCxuKXtpZih6dCh0LG4pLCF0LmNvbnRleHRzPy50cmFjZSl7Y29uc3R7dHJhY2VJZDplLHBhcmVudFNwYW5JZDpyLHByb3BhZ2F0aW9uU3BhbklkOm99PW4ucHJvcGFnYXRpb25Db250ZXh0O3QuY29udGV4dHM9e3RyYWNlOnt0cmFjZV9pZDplLHNwYW5faWQ6b3x8cSgpLHBhcmVudF9zcGFuX2lkOnJ9LC4uLnQuY29udGV4dHN9fX0oZSxuKSxmdW5jdGlvbih0KXtpZigwPT09T2JqZWN0LmtleXMoZm4pLmxlbmd0aClyZXR1cm47Y29uc3Qgbj1jbi5hcHBSb290UGF0aD97fTpmbjtpZihjbi5hcHBSb290UGF0aClmb3IoY29uc3RbdCxlXW9mIE9iamVjdC5lbnRyaWVzKGZuKSluW2t0KHQsY24uYXBwUm9vdFBhdGgpXT1lO2NvbnN0IGU9bmV3IE1hcDtmb3IoY29uc3QgciBvZiB0LmV4Y2VwdGlvbj8udmFsdWVzfHxbXSlmb3IoY29uc3QgdCBvZiByLnN0YWNrdHJhY2U/LmZyYW1lc3x8W10pe2NvbnN0IHI9dC5hYnNfcGF0aHx8dC5maWxlbmFtZTtyJiZuW3JdJiZlLnNldChyLG5bcl0pfWlmKGUuc2l6ZT4wKXtjb25zdCBuPVtdO2Zvcihjb25zdFt0LHJdb2YgZS5lbnRyaWVzKCkpbi5wdXNoKHt0eXBlOiJzb3VyY2VtYXAiLGNvZGVfZmlsZTp0LGRlYnVnX2lkOnJ9KTt0LmRlYnVnX21ldGE9e2ltYWdlczpufX19KGUpO2NvbnN0IHI9TXQoZSxjbi5kc24sY24uc2RrTWV0YWRhdGEsY24udHVubmVsKTtobihKU09OLnN0cmluZ2lmeShyKSksYXdhaXQgbW4uc2VuZChyKSxhd2FpdCBtbi5mbHVzaCgyZTMpLGFuPj1jbi5tYXhBbnJFdmVudHMmJnNldFRpbWVvdXQoKCk9Pntwcm9jZXNzLmV4aXQoMCl9LDVlMyl9bGV0IHZuO2lmKGhuKCJTdGFydGVkIiksY24uY2FwdHVyZVN0YWNrVHJhY2Upe2huKCJDb25uZWN0aW5nIHRvIGRlYnVnZ2VyIik7Y29uc3Qgbj1uZXcgdDtuLmNvbm5lY3RUb01haW5UaHJlYWQoKSxobigiQ29ubmVjdGVkIHRvIGRlYnVnZ2VyIik7Y29uc3QgZT1uZXcgTWFwO24ub24oIkRlYnVnZ2VyLnNjcmlwdFBhcnNlZCIsdD0+e2Uuc2V0KHQucGFyYW1zLnNjcmlwdElkLHQucGFyYW1zLnVybCl9KSxuLm9uKCJEZWJ1Z2dlci5wYXVzZWQiLHQ9PntpZigib3RoZXIiPT09dC5wYXJhbXMucmVhc29uKXRyeXtobigiRGVidWdnZXIgcGF1c2VkIik7Y29uc3QgaT1bLi4udC5wYXJhbXMuY2FsbEZyYW1lc10scz1jbi5hcHBSb290UGF0aD9mdW5jdGlvbih0PShwcm9jZXNzLmFyZ3ZbMV0/S3QocHJvY2Vzcy5hcmd2WzFdKTpwcm9jZXNzLmN3ZCgpKSxuPSJcXCI9PT1vKXtjb25zdCBlPW4/c24odCk6dDtyZXR1cm4gdD0+e2lmKCF0KXJldHVybjtjb25zdCBvPW4/c24odCk6dDtsZXR7ZGlyOmksYmFzZTpzLGV4dDpjfT1yLnBhcnNlKG8pOyIuanMiIT09YyYmIi5tanMiIT09YyYmIi5janMiIT09Y3x8KHM9cy5zbGljZSgwLC0xKmMubGVuZ3RoKSk7Y29uc3QgdT1kZWNvZGVVUklDb21wb25lbnQocyk7aXx8KGk9Ii4iKTtjb25zdCBhPWkubGFzdEluZGV4T2YoIi9ub2RlX21vZHVsZXMiKTtpZihhPi0xKXJldHVybmAke2kuc2xpY2UoYSsxNCkucmVwbGFjZSgvXC8vZywiLiIpfToke3V9YDtpZihpLnN0YXJ0c1dpdGgoZSkpe2NvbnN0IHQ9aS5zbGljZShlLmxlbmd0aCsxKS5yZXBsYWNlKC9cLy9nLCIuIik7cmV0dXJuIHQ/YCR7dH06JHt1fWA6dX1yZXR1cm4gdX19KGNuLmFwcFJvb3RQYXRoKTooKT0+e30sYz1pLm1hcCh0PT5mdW5jdGlvbih0LG4sZSl7Y29uc3Qgcj1uP24ucmVwbGFjZSgvXmZpbGU6XC9cLy8sIiIpOnZvaWQgMCxvPXQubG9jYXRpb24uY29sdW1uTnVtYmVyP3QubG9jYXRpb24uY29sdW1uTnVtYmVyKzE6dm9pZCAwLGk9dC5sb2NhdGlvbi5saW5lTnVtYmVyP3QubG9jYXRpb24ubGluZU51bWJlcisxOnZvaWQgMDtyZXR1cm57ZmlsZW5hbWU6cixtb2R1bGU6ZShyKSxmdW5jdGlvbjp0LmZ1bmN0aW9uTmFtZXx8Ij8iLGNvbG5vOm8sbGluZW5vOmksaW5fYXBwOnI/WnQocik6dm9pZCAwfX0odCxlLmdldCh0LmxvY2F0aW9uLnNjcmlwdElkKSxzKSksdT1zZXRUaW1lb3V0KCgpPT57Ym4oYykudGhlbihudWxsLCgpPT57aG4oIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pfSw1ZTMpO24ucG9zdCgiUnVudGltZS5ldmFsdWF0ZSIse2V4cHJlc3Npb246Imdsb2JhbC5fX1NFTlRSWV9HRVRfU0NPUEVTX18oKTsiLHNpbGVudDohMCxyZXR1cm5CeVZhbHVlOiEwfSwodCxlKT0+e3QmJmhuKGBFcnJvciBleGVjdXRpbmcgc2NyaXB0OiAnJHt0Lm1lc3NhZ2V9J2ApLGNsZWFyVGltZW91dCh1KTtjb25zdCByPWU/LnJlc3VsdD9lLnJlc3VsdC52YWx1ZTp2b2lkIDA7bi5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKSxuLnBvc3QoIkRlYnVnZ2VyLmRpc2FibGUiKSxibihjLHIpLnRoZW4obnVsbCwoKT0+e2huKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQuIil9KX0pfWNhdGNoKHQpe3Rocm93IG4ucG9zdCgiRGVidWdnZXIucmVzdW1lIiksbi5wb3N0KCJEZWJ1Z2dlci5kaXNhYmxlIiksdH19KSx2bj0oKT0+e3RyeXtuLnBvc3QoIkRlYnVnZ2VyLmVuYWJsZSIsKCk9PntuLnBvc3QoIkRlYnVnZ2VyLnBhdXNlIil9KX1jYXRjaHt9fX1jb25zdHtwb2xsOl9ufT1mdW5jdGlvbih0LG4sZSxyKXtjb25zdCBvPXQoKTtsZXQgaT0hMSxzPSEwO3JldHVybiBzZXRJbnRlcnZhbCgoKT0+e2NvbnN0IHQ9by5nZXRUaW1lTXMoKTshMT09PWkmJnQ+bitlJiYoaT0hMCxzJiZyKCkpLHQ8bitlJiYoaT0hMSl9LDIwKSx7cG9sbDooKT0+e28ucmVzZXQoKX0sZW5hYmxlZDp0PT57cz10fX19KGZ1bmN0aW9uKCl7bGV0IHQ9cHJvY2Vzcy5ocnRpbWUoKTtyZXR1cm57Z2V0VGltZU1zOigpPT57Y29uc3RbbixlXT1wcm9jZXNzLmhydGltZSh0KTtyZXR1cm4gTWF0aC5mbG9vcigxZTMqbitlLzFlNil9LHJlc2V0OigpPT57dD1wcm9jZXNzLmhydGltZSgpfX19LGNuLnBvbGxJbnRlcnZhbCxjbi5hbnJUaHJlc2hvbGQsZnVuY3Rpb24oKXtobigiV2F0Y2hkb2cgdGltZW91dCIpLHZuPyhobigiUGF1c2luZyBkZWJ1Z2dlciB0byBjYXB0dXJlIHN0YWNrIHRyYWNlIiksdm4oKSk6KGhuKCJDYXB0dXJpbmcgZXZlbnQgd2l0aG91dCBhIHN0YWNrIHRyYWNlIiksYm4oKS50aGVuKG51bGwsKCk9PntobigiU2VuZGluZyBBTlIgZXZlbnQgZmFpbGVkIG9uIHdhdGNoZG9nIHRpbWVvdXQuIil9KSl9KTtlPy5vbigibWVzc2FnZSIsdD0+e3Quc2Vzc2lvbiYmKHVuPVkodC5zZXNzaW9uKSksdC5kZWJ1Z0ltYWdlcyYmKGZuPXQuZGVidWdJbWFnZXMpLF9uKCl9KTs=';
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjUwLjAgKDc4NWU3NTYpIHwgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdCAqLwppbXBvcnR7U2Vzc2lvbiBhcyB0fWZyb20ibm9kZTppbnNwZWN0b3IiO2ltcG9ydHt3b3JrZXJEYXRhIGFzIG4scGFyZW50UG9ydCBhcyBlfWZyb20ibm9kZTp3b3JrZXJfdGhyZWFkcyI7aW1wb3J0e3Bvc2l4IGFzIHIsc2VwIGFzIG99ZnJvbSJub2RlOnBhdGgiO2ltcG9ydCphcyBpIGZyb20ibm9kZTpodHRwIjtpbXBvcnQqYXMgcyBmcm9tIm5vZGU6aHR0cHMiO2ltcG9ydHtSZWFkYWJsZSBhcyBjfWZyb20ibm9kZTpzdHJlYW0iO2ltcG9ydHtjcmVhdGVHemlwIGFzIHV9ZnJvbSJub2RlOnpsaWIiO2ltcG9ydCphcyBhIGZyb20ibm9kZTpuZXQiO2ltcG9ydCphcyBmIGZyb20ibm9kZTp0bHMiO2NvbnN0IGg9InVuZGVmaW5lZCI9PXR5cGVvZiBfX1NFTlRSWV9ERUJVR19ffHxfX1NFTlRSWV9ERUJVR19fLHA9Z2xvYmFsVGhpcyxkPSIxMC41MC4wIjtmdW5jdGlvbiBsKCl7cmV0dXJuIG0ocCkscH1mdW5jdGlvbiBtKHQpe2NvbnN0IG49dC5fX1NFTlRSWV9fPXQuX19TRU5UUllfX3x8e307cmV0dXJuIG4udmVyc2lvbj1uLnZlcnNpb258fGQsbltkXT1uW2RdfHx7fX1mdW5jdGlvbiBnKHQsbixlPXApe2NvbnN0IHI9ZS5fX1NFTlRSWV9fPWUuX19TRU5UUllfX3x8e30sbz1yW2RdPXJbZF18fHt9O3JldHVybiBvW3RdfHwob1t0XT1uKCkpfWNvbnN0IHk9e307ZnVuY3Rpb24gYih0KXtpZighKCJjb25zb2xlImluIHApKXJldHVybiB0KCk7Y29uc3Qgbj1wLmNvbnNvbGUsZT17fSxyPU9iamVjdC5rZXlzKHkpO3IuZm9yRWFjaCh0PT57Y29uc3Qgcj15W3RdO2VbdF09blt0XSxuW3RdPXJ9KTt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e3IuZm9yRWFjaCh0PT57blt0XT1lW3RdfSl9fWZ1bmN0aW9uIHYoKXtyZXR1cm4gdygpLmVuYWJsZWR9ZnVuY3Rpb24gXyh0LC4uLm4pe2gmJnYoKSYmYigoKT0+e3AuY29uc29sZVt0XShgU2VudHJ5IExvZ2dlciBbJHt0fV06YCwuLi5uKX0pfWZ1bmN0aW9uIHcoKXtyZXR1cm4gaD9nKCJsb2dnZXJTZXR0aW5ncyIsKCk9Pih7ZW5hYmxlZDohMX0pKTp7ZW5hYmxlZDohMX19Y29uc3QgUz17ZW5hYmxlOmZ1bmN0aW9uKCl7dygpLmVuYWJsZWQ9ITB9LGRpc2FibGU6ZnVuY3Rpb24oKXt3KCkuZW5hYmxlZD0hMX0saXNFbmFibGVkOnYsbG9nOmZ1bmN0aW9uKC4uLnQpe18oImxvZyIsLi4udCl9LHdhcm46ZnVuY3Rpb24oLi4udCl7Xygid2FybiIsLi4udCl9LGVycm9yOmZ1bmN0aW9uKC4uLnQpe18oImVycm9yIiwuLi50KX19LCQ9L2NhcHR1cmVNZXNzYWdlfGNhcHR1cmVFeGNlcHRpb24vO2Z1bmN0aW9uIEUodCl7cmV0dXJuIHRbdC5sZW5ndGgtMV18fHt9fWNvbnN0IHg9Ijxhbm9ueW1vdXM+Ijtjb25zdCBOPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gaih0LG4pe3JldHVybiBOLmNhbGwodCk9PT1gW29iamVjdCAke259XWB9ZnVuY3Rpb24gQyh0KXtyZXR1cm4gaih0LCJTdHJpbmciKX1mdW5jdGlvbiBBKHQpe3JldHVybiBqKHQsIk9iamVjdCIpfWZ1bmN0aW9uIFQodCl7cmV0dXJuIEJvb2xlYW4odD8udGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbil9ZnVuY3Rpb24gayh0LG4pe3RyeXtyZXR1cm4gdCBpbnN0YW5jZW9mIG59Y2F0Y2h7cmV0dXJuITF9fWNvbnN0IEk9cDtmdW5jdGlvbiBPKHQsbil7Y29uc3QgZT10LHI9W107aWYoIWU/LnRhZ05hbWUpcmV0dXJuIiI7aWYoSS5IVE1MRWxlbWVudCYmZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZlLmRhdGFzZXQpe2lmKGUuZGF0YXNldC5zZW50cnlDb21wb25lbnQpcmV0dXJuIGUuZGF0YXNldC5zZW50cnlDb21wb25lbnQ7aWYoZS5kYXRhc2V0LnNlbnRyeUVsZW1lbnQpcmV0dXJuIGUuZGF0YXNldC5zZW50cnlFbGVtZW50fXIucHVzaChlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7Y29uc3Qgbz1uPy5sZW5ndGg/bi5maWx0ZXIodD0+ZS5nZXRBdHRyaWJ1dGUodCkpLm1hcCh0PT5bdCxlLmdldEF0dHJpYnV0ZSh0KV0pOm51bGw7aWYobz8ubGVuZ3RoKW8uZm9yRWFjaCh0PT57ci5wdXNoKGBbJHt0WzBdfT0iJHt0WzFdfSJdYCl9KTtlbHNle2UuaWQmJnIucHVzaChgIyR7ZS5pZH1gKTtjb25zdCB0PWUuY2xhc3NOYW1lO2lmKHQmJkModCkpe2NvbnN0IG49dC5zcGxpdCgvXHMrLyk7Zm9yKGNvbnN0IHQgb2YgbilyLnB1c2goYC4ke3R9YCl9fWZvcihjb25zdCB0IG9mWyJhcmlhLWxhYmVsIiwidHlwZSIsIm5hbWUiLCJ0aXRsZSIsImFsdCJdKXtjb25zdCBuPWUuZ2V0QXR0cmlidXRlKHQpO24mJnIucHVzaChgWyR7dH09IiR7bn0iXWApfXJldHVybiByLmpvaW4oIiIpfWZ1bmN0aW9uIFIodCl7aWYoZnVuY3Rpb24odCl7c3dpdGNoKE4uY2FsbCh0KSl7Y2FzZSJbb2JqZWN0IEVycm9yXSI6Y2FzZSJbb2JqZWN0IEV4Y2VwdGlvbl0iOmNhc2UiW29iamVjdCBET01FeGNlcHRpb25dIjpjYXNlIltvYmplY3QgV2ViQXNzZW1ibHkuRXhjZXB0aW9uXSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4gayh0LEVycm9yKX19KHQpKXJldHVybnttZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrLC4uLkQodCl9O2lmKG49dCwidW5kZWZpbmVkIiE9dHlwZW9mIEV2ZW50JiZrKG4sRXZlbnQpKXtjb25zdCBuPXt0eXBlOnQudHlwZSx0YXJnZXQ6UCh0LnRhcmdldCksY3VycmVudFRhcmdldDpQKHQuY3VycmVudFRhcmdldCksLi4uRCh0KX07cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBDdXN0b21FdmVudCYmayh0LEN1c3RvbUV2ZW50KSYmKG4uZGV0YWlsPXQuZGV0YWlsKSxufXJldHVybiB0O3ZhciBufWZ1bmN0aW9uIFAodCl7dHJ5e3JldHVybiBuPXQsInVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50JiZrKG4sRWxlbWVudCk/ZnVuY3Rpb24odCxuPXt9KXtpZighdClyZXR1cm4iPHVua25vd24+Ijt0cnl7bGV0IGU9dDtjb25zdCByPTUsbz1bXTtsZXQgaT0wLHM9MDtjb25zdCBjPSIgPiAiLHU9Yy5sZW5ndGg7bGV0IGE7Y29uc3QgZj1BcnJheS5pc0FycmF5KG4pP246bi5rZXlBdHRycyxoPSFBcnJheS5pc0FycmF5KG4pJiZuLm1heFN0cmluZ0xlbmd0aHx8ODA7Zm9yKDtlJiZpKys8ciYmKGE9TyhlLGYpLCEoImh0bWwiPT09YXx8aT4xJiZzK28ubGVuZ3RoKnUrYS5sZW5ndGg+PWgpKTspby5wdXNoKGEpLHMrPWEubGVuZ3RoLGU9ZS5wYXJlbnROb2RlO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGMpfWNhdGNoe3JldHVybiI8dW5rbm93bj4ifX0odCk6T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWNhdGNoe3JldHVybiI8dW5rbm93bj4ifXZhciBufWZ1bmN0aW9uIEQodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dD9PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkpOnt9fWxldCBVLEw7ZnVuY3Rpb24gTSh0KXtpZih2b2lkIDAhPT1VKXJldHVybiBVP1UodCk6dCgpO2NvbnN0IG49U3ltYm9sLmZvcigiX19TRU5UUllfU0FGRV9SQU5ET01fSURfV1JBUFBFUl9fIiksZT1wO3JldHVybiBuIGluIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlW25dPyhVPWVbbl0sVSh0KSk6KFU9bnVsbCx0KCkpfWZ1bmN0aW9uIEIoKXtyZXR1cm4gTSgoKT0+TWF0aC5yYW5kb20oKSl9ZnVuY3Rpb24gVygpe3JldHVybiBNKCgpPT5EYXRlLm5vdygpKX1mdW5jdGlvbiB6KHQsbj0wKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHR8fDA9PT1ufHx0Lmxlbmd0aDw9bj90OmAke3Quc2xpY2UoMCxuKX0uLi5gfWZ1bmN0aW9uIEYodD1mdW5jdGlvbigpe2NvbnN0IHQ9cDtyZXR1cm4gdC5jcnlwdG98fHQubXNDcnlwdG99KCkpe3RyeXtpZih0Py5yYW5kb21VVUlEKXJldHVybiBNKCgpPT50LnJhbmRvbVVVSUQoKSkucmVwbGFjZSgvLS9nLCIiKX1jYXRjaHt9cmV0dXJuIEx8fChMPVsxZTddKzFlMys0ZTMrOGUzKzFlMTEpLEwucmVwbGFjZSgvWzAxOF0vZyx0PT4odF4oMTYqQigpJjE1KT4+dC80KS50b1N0cmluZygxNikpfWZ1bmN0aW9uIEcoKXtyZXR1cm4gVygpLzFlM31sZXQgSDtmdW5jdGlvbiBKKCl7cmV0dXJuKEg/PyhIPWZ1bmN0aW9uKCl7Y29uc3R7cGVyZm9ybWFuY2U6dH09cDtpZighdD8ubm93fHwhdC50aW1lT3JpZ2luKXJldHVybiBHO2NvbnN0IG49dC50aW1lT3JpZ2luO3JldHVybigpPT4obitNKCgpPT50Lm5vdygpKSkvMWUzfSgpKSkoKX1mdW5jdGlvbiBZKHQpe2NvbnN0IG49SigpLGU9e3NpZDpGKCksaW5pdDohMCx0aW1lc3RhbXA6bixzdGFydGVkOm4sZHVyYXRpb246MCxzdGF0dXM6Im9rIixlcnJvcnM6MCxpZ25vcmVEdXJhdGlvbjohMSx0b0pTT046KCk9PmZ1bmN0aW9uKHQpe3JldHVybntzaWQ6YCR7dC5zaWR9YCxpbml0OnQuaW5pdCxzdGFydGVkOm5ldyBEYXRlKDFlMyp0LnN0YXJ0ZWQpLnRvSVNPU3RyaW5nKCksdGltZXN0YW1wOm5ldyBEYXRlKDFlMyp0LnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKSxzdGF0dXM6dC5zdGF0dXMsZXJyb3JzOnQuZXJyb3JzLGRpZDoibnVtYmVyIj09dHlwZW9mIHQuZGlkfHwic3RyaW5nIj09dHlwZW9mIHQuZGlkP2Ake3QuZGlkfWA6dm9pZCAwLGR1cmF0aW9uOnQuZHVyYXRpb24sYWJub3JtYWxfbWVjaGFuaXNtOnQuYWJub3JtYWxfbWVjaGFuaXNtLGF0dHJzOntyZWxlYXNlOnQucmVsZWFzZSxlbnZpcm9ubWVudDp0LmVudmlyb25tZW50LGlwX2FkZHJlc3M6dC5pcEFkZHJlc3MsdXNlcl9hZ2VudDp0LnVzZXJBZ2VudH19fShlKX07cmV0dXJuIHQmJlYoZSx0KSxlfWZ1bmN0aW9uIFYodCxuPXt9KXtpZihuLnVzZXImJighdC5pcEFkZHJlc3MmJm4udXNlci5pcF9hZGRyZXNzJiYodC5pcEFkZHJlc3M9bi51c2VyLmlwX2FkZHJlc3MpLHQuZGlkfHxuLmRpZHx8KHQuZGlkPW4udXNlci5pZHx8bi51c2VyLmVtYWlsfHxuLnVzZXIudXNlcm5hbWUpKSx0LnRpbWVzdGFtcD1uLnRpbWVzdGFtcHx8SigpLG4uYWJub3JtYWxfbWVjaGFuaXNtJiYodC5hYm5vcm1hbF9tZWNoYW5pc209bi5hYm5vcm1hbF9tZWNoYW5pc20pLG4uaWdub3JlRHVyYXRpb24mJih0Lmlnbm9yZUR1cmF0aW9uPW4uaWdub3JlRHVyYXRpb24pLG4uc2lkJiYodC5zaWQ9MzI9PT1uLnNpZC5sZW5ndGg/bi5zaWQ6RigpKSx2b2lkIDAhPT1uLmluaXQmJih0LmluaXQ9bi5pbml0KSwhdC5kaWQmJm4uZGlkJiYodC5kaWQ9YCR7bi5kaWR9YCksIm51bWJlciI9PXR5cGVvZiBuLnN0YXJ0ZWQmJih0LnN0YXJ0ZWQ9bi5zdGFydGVkKSx0Lmlnbm9yZUR1cmF0aW9uKXQuZHVyYXRpb249dm9pZCAwO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBuLmR1cmF0aW9uKXQuZHVyYXRpb249bi5kdXJhdGlvbjtlbHNle2NvbnN0IG49dC50aW1lc3RhbXAtdC5zdGFydGVkO3QuZHVyYXRpb249bj49MD9uOjB9bi5yZWxlYXNlJiYodC5yZWxlYXNlPW4ucmVsZWFzZSksbi5lbnZpcm9ubWVudCYmKHQuZW52aXJvbm1lbnQ9bi5lbnZpcm9ubWVudCksIXQuaXBBZGRyZXNzJiZuLmlwQWRkcmVzcyYmKHQuaXBBZGRyZXNzPW4uaXBBZGRyZXNzKSwhdC51c2VyQWdlbnQmJm4udXNlckFnZW50JiYodC51c2VyQWdlbnQ9bi51c2VyQWdlbnQpLCJudW1iZXIiPT10eXBlb2Ygbi5lcnJvcnMmJih0LmVycm9ycz1uLmVycm9ycyksbi5zdGF0dXMmJih0LnN0YXR1cz1uLnN0YXR1cyl9ZnVuY3Rpb24gSyh0LG4sZT0yKXtpZighbnx8Im9iamVjdCIhPXR5cGVvZiBufHxlPD0wKXJldHVybiBuO2lmKHQmJjA9PT1PYmplY3Qua2V5cyhuKS5sZW5ndGgpcmV0dXJuIHQ7Y29uc3Qgcj17Li4udH07Zm9yKGNvbnN0IHQgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobix0KSYmKHJbdF09SyhyW3RdLG5bdF0sZS0xKSk7cmV0dXJuIHJ9ZnVuY3Rpb24gWigpe3JldHVybiBGKCl9ZnVuY3Rpb24gcSgpe3JldHVybiBGKCkuc3Vic3RyaW5nKDE2KX1jb25zdCBRPSJfc2VudHJ5U3BhbiI7ZnVuY3Rpb24gWCh0LG4pe24/ZnVuY3Rpb24odCxuLGUpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfWNhdGNoe2gmJlMubG9nKGBGYWlsZWQgdG8gYWRkIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5ICIke259IiB0byBvYmplY3RgLHQpfX0odCxRLG4pOmRlbGV0ZSB0W1FdfWZ1bmN0aW9uIHR0KHQpe3JldHVybiB0W1FdfWNsYXNzIG50e2NvbnN0cnVjdG9yKCl7dGhpcy50PSExLHRoaXMubz1bXSx0aGlzLmk9W10sdGhpcy51PVtdLHRoaXMuaD1bXSx0aGlzLnA9e30sdGhpcy5sPXt9LHRoaXMubT17fSx0aGlzLnY9e30sdGhpcy5fPXt9LHRoaXMuUz17fSx0aGlzLk49e3RyYWNlSWQ6WigpLHNhbXBsZVJhbmQ6QigpfX1jbG9uZSgpe2NvbnN0IHQ9bmV3IG50O3JldHVybiB0LnU9Wy4uLnRoaXMudV0sdC5sPXsuLi50aGlzLmx9LHQubT17Li4udGhpcy5tfSx0LnY9ey4uLnRoaXMudn0sdC5fPXsuLi50aGlzLl99LHRoaXMuXy5mbGFncyYmKHQuXy5mbGFncz17dmFsdWVzOlsuLi50aGlzLl8uZmxhZ3MudmFsdWVzXX0pLHQucD10aGlzLnAsdC5qPXRoaXMuaix0LkM9dGhpcy5DLHQuQT10aGlzLkEsdC5UPXRoaXMuVCx0Lmk9Wy4uLnRoaXMuaV0sdC5oPVsuLi50aGlzLmhdLHQuUz17Li4udGhpcy5TfSx0Lk49ey4uLnRoaXMuTn0sdC5rPXRoaXMuayx0Lkk9dGhpcy5JLHQuTz10aGlzLk8sWCh0LHR0KHRoaXMpKSx0fXNldENsaWVudCh0KXt0aGlzLms9dH1zZXRMYXN0RXZlbnRJZCh0KXt0aGlzLkk9dH1nZXRDbGllbnQoKXtyZXR1cm4gdGhpcy5rfWxhc3RFdmVudElkKCl7cmV0dXJuIHRoaXMuSX1hZGRTY29wZUxpc3RlbmVyKHQpe3RoaXMuby5wdXNoKHQpfWFkZEV2ZW50UHJvY2Vzc29yKHQpe3JldHVybiB0aGlzLmkucHVzaCh0KSx0aGlzfXNldFVzZXIodCl7cmV0dXJuIHRoaXMucD10fHx7ZW1haWw6dm9pZCAwLGlkOnZvaWQgMCxpcF9hZGRyZXNzOnZvaWQgMCx1c2VybmFtZTp2b2lkIDB9LHRoaXMuQyYmVih0aGlzLkMse3VzZXI6dH0pLHRoaXMuUigpLHRoaXN9Z2V0VXNlcigpe3JldHVybiB0aGlzLnB9c2V0Q29udmVyc2F0aW9uSWQodCl7cmV0dXJuIHRoaXMuTz10fHx2b2lkIDAsdGhpcy5SKCksdGhpc31zZXRUYWdzKHQpe3JldHVybiB0aGlzLmw9ey4uLnRoaXMubCwuLi50fSx0aGlzLlIoKSx0aGlzfXNldFRhZyh0LG4pe3JldHVybiB0aGlzLnNldFRhZ3Moe1t0XTpufSl9c2V0QXR0cmlidXRlcyh0KXtyZXR1cm4gdGhpcy5tPXsuLi50aGlzLm0sLi4udH0sdGhpcy5SKCksdGhpc31zZXRBdHRyaWJ1dGUodCxuKXtyZXR1cm4gdGhpcy5zZXRBdHRyaWJ1dGVzKHtbdF06bn0pfXJlbW92ZUF0dHJpYnV0ZSh0KXtyZXR1cm4gdCBpbiB0aGlzLm0mJihkZWxldGUgdGhpcy5tW3RdLHRoaXMuUigpKSx0aGlzfXNldEV4dHJhcyh0KXtyZXR1cm4gdGhpcy52PXsuLi50aGlzLnYsLi4udH0sdGhpcy5SKCksdGhpc31zZXRFeHRyYSh0LG4pe3JldHVybiB0aGlzLnY9ey4uLnRoaXMudixbdF06bn0sdGhpcy5SKCksdGhpc31zZXRGaW5nZXJwcmludCh0KXtyZXR1cm4gdGhpcy5UPXQsdGhpcy5SKCksdGhpc31zZXRMZXZlbCh0KXtyZXR1cm4gdGhpcy5qPXQsdGhpcy5SKCksdGhpc31zZXRUcmFuc2FjdGlvbk5hbWUodCl7cmV0dXJuIHRoaXMuQT10LHRoaXMuUigpLHRoaXN9c2V0Q29udGV4dCh0LG4pe3JldHVybiBudWxsPT09bj9kZWxldGUgdGhpcy5fW3RdOnRoaXMuX1t0XT1uLHRoaXMuUigpLHRoaXN9c2V0U2Vzc2lvbih0KXtyZXR1cm4gdD90aGlzLkM9dDpkZWxldGUgdGhpcy5DLHRoaXMuUigpLHRoaXN9Z2V0U2Vzc2lvbigpe3JldHVybiB0aGlzLkN9dXBkYXRlKHQpe2lmKCF0KXJldHVybiB0aGlzO2NvbnN0IG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCh0aGlzKTp0LGU9biBpbnN0YW5jZW9mIG50P24uZ2V0U2NvcGVEYXRhKCk6QShuKT90OnZvaWQgMCx7dGFnczpyLGF0dHJpYnV0ZXM6byxleHRyYTppLHVzZXI6cyxjb250ZXh0czpjLGxldmVsOnUsZmluZ2VycHJpbnQ6YT1bXSxwcm9wYWdhdGlvbkNvbnRleHQ6Zixjb252ZXJzYXRpb25JZDpofT1lfHx7fTtyZXR1cm4gdGhpcy5sPXsuLi50aGlzLmwsLi4ucn0sdGhpcy5tPXsuLi50aGlzLm0sLi4ub30sdGhpcy52PXsuLi50aGlzLnYsLi4uaX0sdGhpcy5fPXsuLi50aGlzLl8sLi4uY30scyYmT2JqZWN0LmtleXMocykubGVuZ3RoJiYodGhpcy5wPXMpLHUmJih0aGlzLmo9dSksYS5sZW5ndGgmJih0aGlzLlQ9YSksZiYmKHRoaXMuTj1mKSxoJiYodGhpcy5PPWgpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy51PVtdLHRoaXMubD17fSx0aGlzLm09e30sdGhpcy52PXt9LHRoaXMucD17fSx0aGlzLl89e30sdGhpcy5qPXZvaWQgMCx0aGlzLkE9dm9pZCAwLHRoaXMuVD12b2lkIDAsdGhpcy5DPXZvaWQgMCx0aGlzLk89dm9pZCAwLFgodGhpcyx2b2lkIDApLHRoaXMuaD1bXSx0aGlzLnNldFByb3BhZ2F0aW9uQ29udGV4dCh7dHJhY2VJZDpaKCksc2FtcGxlUmFuZDpCKCl9KSx0aGlzLlIoKSx0aGlzfWFkZEJyZWFkY3J1bWIodCxuKXtjb25zdCBlPSJudW1iZXIiPT10eXBlb2Ygbj9uOjEwMDtpZihlPD0wKXJldHVybiB0aGlzO2NvbnN0IHI9e3RpbWVzdGFtcDpHKCksLi4udCxtZXNzYWdlOnQubWVzc2FnZT96KHQubWVzc2FnZSwyMDQ4KTp0Lm1lc3NhZ2V9O3JldHVybiB0aGlzLnUucHVzaChyKSx0aGlzLnUubGVuZ3RoPmUmJih0aGlzLnU9dGhpcy51LnNsaWNlKC1lKSx0aGlzLms/LnJlY29yZERyb3BwZWRFdmVudCgiYnVmZmVyX292ZXJmbG93IiwibG9nX2l0ZW0iKSksdGhpcy5SKCksdGhpc31nZXRMYXN0QnJlYWRjcnVtYigpe3JldHVybiB0aGlzLnVbdGhpcy51Lmxlbmd0aC0xXX1jbGVhckJyZWFkY3J1bWJzKCl7cmV0dXJuIHRoaXMudT1bXSx0aGlzLlIoKSx0aGlzfWFkZEF0dGFjaG1lbnQodCl7cmV0dXJuIHRoaXMuaC5wdXNoKHQpLHRoaXN9Y2xlYXJBdHRhY2htZW50cygpe3JldHVybiB0aGlzLmg9W10sdGhpc31nZXRTY29wZURhdGEoKXtyZXR1cm57YnJlYWRjcnVtYnM6dGhpcy51LGF0dGFjaG1lbnRzOnRoaXMuaCxjb250ZXh0czp0aGlzLl8sdGFnczp0aGlzLmwsYXR0cmlidXRlczp0aGlzLm0sZXh0cmE6dGhpcy52LHVzZXI6dGhpcy5wLGxldmVsOnRoaXMuaixmaW5nZXJwcmludDp0aGlzLlR8fFtdLGV2ZW50UHJvY2Vzc29yczp0aGlzLmkscHJvcGFnYXRpb25Db250ZXh0OnRoaXMuTixzZGtQcm9jZXNzaW5nTWV0YWRhdGE6dGhpcy5TLHRyYW5zYWN0aW9uTmFtZTp0aGlzLkEsc3Bhbjp0dCh0aGlzKSxjb252ZXJzYXRpb25JZDp0aGlzLk99fXNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh0KXtyZXR1cm4gdGhpcy5TPUsodGhpcy5TLHQsMiksdGhpc31zZXRQcm9wYWdhdGlvbkNvbnRleHQodCl7cmV0dXJuIHRoaXMuTj10LHRoaXN9Z2V0UHJvcGFnYXRpb25Db250ZXh0KCl7cmV0dXJuIHRoaXMuTn1jYXB0dXJlRXhjZXB0aW9uKHQsbil7Y29uc3QgZT1uPy5ldmVudF9pZHx8RigpO2lmKCF0aGlzLmspcmV0dXJuIGgmJlMud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIGV4Y2VwdGlvbiEiKSxlO2NvbnN0IHI9bmV3IEVycm9yKCJTZW50cnkgc3ludGhldGljRXhjZXB0aW9uIik7cmV0dXJuIHRoaXMuay5jYXB0dXJlRXhjZXB0aW9uKHQse29yaWdpbmFsRXhjZXB0aW9uOnQsc3ludGhldGljRXhjZXB0aW9uOnIsLi4ubixldmVudF9pZDplfSx0aGlzKSxlfWNhcHR1cmVNZXNzYWdlKHQsbixlKXtjb25zdCByPWU/LmV2ZW50X2lkfHxGKCk7aWYoIXRoaXMuaylyZXR1cm4gaCYmUy53YXJuKCJObyBjbGllbnQgY29uZmlndXJlZCBvbiBzY29wZSAtIHdpbGwgbm90IGNhcHR1cmUgbWVzc2FnZSEiKSxyO2NvbnN0IG89ZT8uc3ludGhldGljRXhjZXB0aW9uPz9uZXcgRXJyb3IodCk7cmV0dXJuIHRoaXMuay5jYXB0dXJlTWVzc2FnZSh0LG4se29yaWdpbmFsRXhjZXB0aW9uOnQsc3ludGhldGljRXhjZXB0aW9uOm8sLi4uZSxldmVudF9pZDpyfSx0aGlzKSxyfWNhcHR1cmVFdmVudCh0LG4pe2NvbnN0IGU9dC5ldmVudF9pZHx8bj8uZXZlbnRfaWR8fEYoKTtyZXR1cm4gdGhpcy5rPyh0aGlzLmsuY2FwdHVyZUV2ZW50KHQsey4uLm4sZXZlbnRfaWQ6ZX0sdGhpcyksZSk6KGgmJlMud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIGV2ZW50ISIpLGUpfVIoKXt0aGlzLnR8fCh0aGlzLnQ9ITAsdGhpcy5vLmZvckVhY2godD0+e3QodGhpcyl9KSx0aGlzLnQ9ITEpfX1jb25zdCBldD10PT50IGluc3RhbmNlb2YgUHJvbWlzZSYmIXRbcnRdLHJ0PVN5bWJvbCgiY2hhaW5lZCBQcm9taXNlTGlrZSIpLG90PSh0LG4pPT57bGV0IGU9ITE7Zm9yKGNvbnN0IHIgaW4gdCl7aWYociBpbiBuKWNvbnRpbnVlO2U9ITA7Y29uc3Qgbz10W3JdOyJmdW5jdGlvbiI9PXR5cGVvZiBvP09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse3ZhbHVlOiguLi5uKT0+by5hcHBseSh0LG4pLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6bltyXT1vfXJldHVybiBlJiZPYmplY3QuYXNzaWduKG4se1tydF06ITB9KSxufTtjbGFzcyBpdHtjb25zdHJ1Y3Rvcih0LG4pe2xldCBlLHI7ZT10fHxuZXcgbnQscj1ufHxuZXcgbnQsdGhpcy5QPVt7c2NvcGU6ZX1dLHRoaXMuRD1yfXdpdGhTY29wZSh0KXtjb25zdCBuPXRoaXMuVSgpO2xldCBlO3RyeXtlPXQobil9Y2F0Y2godCl7dGhyb3cgdGhpcy5MKCksdH1yZXR1cm4gVChlKT8oKHQsbixlKT0+e2NvbnN0IHI9dC50aGVuKHQ9PihuKHQpLHQpLHQ9Pnt0aHJvdyBlKHQpLHR9KTtyZXR1cm4gZXQocikmJmV0KHQpP3I6b3QodCxyKX0pKGUsKCk9PnRoaXMuTCgpLCgpPT50aGlzLkwoKSk6KHRoaXMuTCgpLGUpfWdldENsaWVudCgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuY2xpZW50fWdldFNjb3BlKCl7cmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5zY29wZX1nZXRJc29sYXRpb25TY29wZSgpe3JldHVybiB0aGlzLkR9Z2V0U3RhY2tUb3AoKXtyZXR1cm4gdGhpcy5QW3RoaXMuUC5sZW5ndGgtMV19VSgpe2NvbnN0IHQ9dGhpcy5nZXRTY29wZSgpLmNsb25lKCk7cmV0dXJuIHRoaXMuUC5wdXNoKHtjbGllbnQ6dGhpcy5nZXRDbGllbnQoKSxzY29wZTp0fSksdH1MKCl7cmV0dXJuISh0aGlzLlAubGVuZ3RoPD0xKSYmISF0aGlzLlAucG9wKCl9fWZ1bmN0aW9uIHN0KCl7Y29uc3QgdD1tKGwoKSk7cmV0dXJuIHQuc3RhY2s9dC5zdGFja3x8bmV3IGl0KGcoImRlZmF1bHRDdXJyZW50U2NvcGUiLCgpPT5uZXcgbnQpLGcoImRlZmF1bHRJc29sYXRpb25TY29wZSIsKCk9Pm5ldyBudCkpfWZ1bmN0aW9uIGN0KHQpe3JldHVybiBzdCgpLndpdGhTY29wZSh0KX1mdW5jdGlvbiB1dCh0LG4pe2NvbnN0IGU9c3QoKTtyZXR1cm4gZS53aXRoU2NvcGUoKCk9PihlLmdldFN0YWNrVG9wKCkuc2NvcGU9dCxuKHQpKSl9ZnVuY3Rpb24gYXQodCl7cmV0dXJuIHN0KCkud2l0aFNjb3BlKCgpPT50KHN0KCkuZ2V0SXNvbGF0aW9uU2NvcGUoKSkpfWZ1bmN0aW9uIGZ0KHQpe2NvbnN0IG49bSh0KTtyZXR1cm4gbi5hY3M/bi5hY3M6e3dpdGhJc29sYXRpb25TY29wZTphdCx3aXRoU2NvcGU6Y3Qsd2l0aFNldFNjb3BlOnV0LHdpdGhTZXRJc29sYXRpb25TY29wZToodCxuKT0+YXQobiksZ2V0Q3VycmVudFNjb3BlOigpPT5zdCgpLmdldFNjb3BlKCksZ2V0SXNvbGF0aW9uU2NvcGU6KCk9PnN0KCkuZ2V0SXNvbGF0aW9uU2NvcGUoKX19ZnVuY3Rpb24gaHQoKXtyZXR1cm4gZnQobCgpKS5nZXRDdXJyZW50U2NvcGUoKS5nZXRDbGllbnQoKX1mdW5jdGlvbiBwdCh0KXtpZih0KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJiJkZXJlZiJpbiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXJlZil0cnl7cmV0dXJuIHQuZGVyZWYoKX1jYXRjaHtyZXR1cm59cmV0dXJuIHR9fWZ1bmN0aW9uIGR0KHQpe2NvbnN0IG49dDtyZXR1cm57c2NvcGU6bi5fc2VudHJ5U2NvcGUsaXNvbGF0aW9uU2NvcGU6cHQobi5fc2VudHJ5SXNvbGF0aW9uU2NvcGUpfX1jb25zdCBsdD0ic2VudHJ5LSI7ZnVuY3Rpb24gbXQodCl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZighdHx8IUModCkmJiFBcnJheS5pc0FycmF5KHQpKXJldHVybjtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0LnJlZHVjZSgodCxuKT0+e2NvbnN0IGU9Z3Qobik7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKFtuLGVdKT0+e3Rbbl09ZX0pLHR9LHt9KTtyZXR1cm4gZ3QodCl9KHQpO2lmKCFuKXJldHVybjtjb25zdCBlPU9iamVjdC5lbnRyaWVzKG4pLnJlZHVjZSgodCxbbixlXSk9PntpZihuLnN0YXJ0c1dpdGgobHQpKXt0W24uc2xpY2UoNyldPWV9cmV0dXJuIHR9LHt9KTtyZXR1cm4gT2JqZWN0LmtleXMoZSkubGVuZ3RoPjA/ZTp2b2lkIDB9ZnVuY3Rpb24gZ3QodCl7cmV0dXJuIHQuc3BsaXQoIiwiKS5tYXAodD0+e2NvbnN0IG49dC5pbmRleE9mKCI9Iik7aWYoLTE9PT1uKXJldHVybltdO3JldHVyblt0LnNsaWNlKDAsbiksdC5zbGljZShuKzEpXS5tYXAodD0+e3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQudHJpbSgpKX1jYXRjaHtyZXR1cm59fSl9KS5yZWR1Y2UoKHQsW24sZV0pPT4obiYmZSYmKHRbbl09ZSksdCkse30pfWNvbnN0IHl0PS9ebyhcZCspXC4vO2Z1bmN0aW9uIGJ0KHQsbj0hMSl7Y29uc3R7aG9zdDplLHBhdGg6cixwYXNzOm8scG9ydDppLHByb2plY3RJZDpzLHByb3RvY29sOmMscHVibGljS2V5OnV9PXQ7cmV0dXJuYCR7Y306Ly8ke3V9JHtuJiZvP2A6JHtvfWA6IiJ9QCR7ZX0ke2k/YDoke2l9YDoiIn0vJHtyP2Ake3J9L2A6cn0ke3N9YH1mdW5jdGlvbiB2dCh0KXtjb25zdCBuPXQuZ2V0T3B0aW9ucygpLHtob3N0OmV9PXQuZ2V0RHNuKCl8fHt9O2xldCByO3JldHVybiBuLm9yZ0lkP3I9U3RyaW5nKG4ub3JnSWQpOmUmJihyPWZ1bmN0aW9uKHQpe2NvbnN0IG49dC5tYXRjaCh5dCk7cmV0dXJuIG4/LlsxXX0oZSkpLHJ9ZnVuY3Rpb24gX3QodCl7Y29uc3R7c3BhbklkOm4sdHJhY2VJZDplLGlzUmVtb3RlOnJ9PXQuc3BhbkNvbnRleHQoKSxvPXI/bjpFdCh0KS5wYXJlbnRfc3Bhbl9pZCxpPWR0KHQpLnNjb3BlO3JldHVybntwYXJlbnRfc3Bhbl9pZDpvLHNwYW5faWQ6cj9pPy5nZXRQcm9wYWdhdGlvbkNvbnRleHQoKS5wcm9wYWdhdGlvblNwYW5JZHx8cSgpOm4sdHJhY2VfaWQ6ZX19ZnVuY3Rpb24gd3QodCl7cmV0dXJuIHQmJnQubGVuZ3RoPjA/dC5tYXAoKHtjb250ZXh0OntzcGFuSWQ6dCx0cmFjZUlkOm4sdHJhY2VGbGFnczplLC4uLnJ9LGF0dHJpYnV0ZXM6b30pPT4oe3NwYW5faWQ6dCx0cmFjZV9pZDpuLHNhbXBsZWQ6MT09PWUsYXR0cmlidXRlczpvLC4uLnJ9KSk6dm9pZCAwfWZ1bmN0aW9uIFN0KHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD8kdCh0KTpBcnJheS5pc0FycmF5KHQpP3RbMF0rdFsxXS8xZTk6dCBpbnN0YW5jZW9mIERhdGU/JHQodC5nZXRUaW1lKCkpOkooKX1mdW5jdGlvbiAkdCh0KXtyZXR1cm4gdD45OTk5OTk5OTk5P3QvMWUzOnR9ZnVuY3Rpb24gRXQodCl7aWYoZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0U3BhbkpTT059KHQpKXJldHVybiB0LmdldFNwYW5KU09OKCk7Y29uc3R7c3BhbklkOm4sdHJhY2VJZDplfT10LnNwYW5Db250ZXh0KCk7aWYoZnVuY3Rpb24odCl7Y29uc3Qgbj10O3JldHVybiEhKG4uYXR0cmlidXRlcyYmbi5zdGFydFRpbWUmJm4ubmFtZSYmbi5lbmRUaW1lJiZuLnN0YXR1cyl9KHQpKXtjb25zdHthdHRyaWJ1dGVzOnIsc3RhcnRUaW1lOm8sbmFtZTppLGVuZFRpbWU6cyxzdGF0dXM6YyxsaW5rczp1fT10O3JldHVybntzcGFuX2lkOm4sdHJhY2VfaWQ6ZSxkYXRhOnIsZGVzY3JpcHRpb246aSxwYXJlbnRfc3Bhbl9pZDp4dCh0KSxzdGFydF90aW1lc3RhbXA6U3QobyksdGltZXN0YW1wOlN0KHMpfHx2b2lkIDAsc3RhdHVzOk50KGMpLG9wOnJbInNlbnRyeS5vcCJdLG9yaWdpbjpyWyJzZW50cnkub3JpZ2luIl0sbGlua3M6d3QodSl9fXJldHVybntzcGFuX2lkOm4sdHJhY2VfaWQ6ZSxzdGFydF90aW1lc3RhbXA6MCxkYXRhOnt9fX1mdW5jdGlvbiB4dCh0KXtyZXR1cm4icGFyZW50U3BhbklkImluIHQ/dC5wYXJlbnRTcGFuSWQ6InBhcmVudFNwYW5Db250ZXh0ImluIHQ/dC5wYXJlbnRTcGFuQ29udGV4dD8uc3BhbklkOnZvaWQgMH1mdW5jdGlvbiBOdCh0KXtpZih0JiYwIT09dC5jb2RlKXJldHVybiAxPT09dC5jb2RlPyJvayI6dC5tZXNzYWdlfHwiaW50ZXJuYWxfZXJyb3IifWNvbnN0IGp0PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9zZW50cnlSb290U3Bhbnx8dH07ZnVuY3Rpb24gQ3QodCl7Y29uc3Qgbj1odCgpO2lmKCFuKXJldHVybnt9O2NvbnN0IGU9anQodCkscj1FdChlKSxvPXIuZGF0YSxpPWUuc3BhbkNvbnRleHQoKS50cmFjZVN0YXRlLHM9aT8uZ2V0KCJzZW50cnkuc2FtcGxlX3JhdGUiKT8/b1sic2VudHJ5LnNhbXBsZV9yYXRlIl0/P29bInNlbnRyeS5wcmV2aW91c190cmFjZV9zYW1wbGVfcmF0ZSJdO2Z1bmN0aW9uIGModCl7cmV0dXJuIm51bWJlciIhPXR5cGVvZiBzJiYic3RyaW5nIiE9dHlwZW9mIHN8fCh0LnNhbXBsZV9yYXRlPWAke3N9YCksdH1jb25zdCB1PWUuX2Zyb3plbkRzYztpZih1KXJldHVybiBjKHUpO2NvbnN0IGE9aT8uZ2V0KCJzZW50cnkuZHNjIiksZj1hJiZtdChhKTtpZihmKXJldHVybiBjKGYpO2NvbnN0IGg9ZnVuY3Rpb24odCxuKXtjb25zdCBlPW4uZ2V0T3B0aW9ucygpLHtwdWJsaWNLZXk6cn09bi5nZXREc24oKXx8e30sbz17ZW52aXJvbm1lbnQ6ZS5lbnZpcm9ubWVudHx8InByb2R1Y3Rpb24iLHJlbGVhc2U6ZS5yZWxlYXNlLHB1YmxpY19rZXk6cix0cmFjZV9pZDp0LG9yZ19pZDp2dChuKX07cmV0dXJuIG4uZW1pdCgiY3JlYXRlRHNjIixvKSxvfSh0LnNwYW5Db250ZXh0KCkudHJhY2VJZCxuKSxwPW9bInNlbnRyeS5zb3VyY2UiXT8/b1sic2VudHJ5LnNwYW4uc291cmNlIl0sZD1yLmRlc2NyaXB0aW9uO3JldHVybiJ1cmwiIT09cCYmZCYmKGgudHJhbnNhY3Rpb249ZCksZnVuY3Rpb24oKXtpZigiYm9vbGVhbiI9PXR5cGVvZiBfX1NFTlRSWV9UUkFDSU5HX18mJiFfX1NFTlRSWV9UUkFDSU5HX18pcmV0dXJuITE7Y29uc3QgdD1odCgpPy5nZXRPcHRpb25zKCk7cmV0dXJuISghdHx8bnVsbD09dC50cmFjZXNTYW1wbGVSYXRlJiYhdC50cmFjZXNTYW1wbGVyKX0oKSYmKGguc2FtcGxlZD1TdHJpbmcoZnVuY3Rpb24odCl7Y29uc3R7dHJhY2VGbGFnczpufT10LnNwYW5Db250ZXh0KCk7cmV0dXJuIDE9PT1ufShlKSksaC5zYW1wbGVfcmFuZD1pPy5nZXQoInNlbnRyeS5zYW1wbGVfcmFuZCIpPz9kdChlKS5zY29wZT8uZ2V0UHJvcGFnYXRpb25Db250ZXh0KCkuc2FtcGxlUmFuZC50b1N0cmluZygpKSxjKGgpLG4uZW1pdCgiY3JlYXRlRHNjIixoLGUpLGh9ZnVuY3Rpb24gQXQodCxuPTEwMCxlPTEvMCl7dHJ5e3JldHVybiBUdCgiIix0LG4sZSl9Y2F0Y2godCl7cmV0dXJue0VSUk9SOmAqKm5vbi1zZXJpYWxpemFibGUqKiAoJHt0fSlgfX19ZnVuY3Rpb24gVHQodCxuLGU9MS8wLHI9MS8wLG89ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBXZWFrU2V0O2Z1bmN0aW9uIG4obil7cmV0dXJuISF0LmhhcyhuKXx8KHQuYWRkKG4pLCExKX1mdW5jdGlvbiBlKG4pe3QuZGVsZXRlKG4pfXJldHVybltuLGVdfSgpKXtjb25zdFtpLHNdPW87aWYobnVsbD09bnx8WyJib29sZWFuIiwic3RyaW5nIl0uaW5jbHVkZXModHlwZW9mIG4pfHwibnVtYmVyIj09dHlwZW9mIG4mJk51bWJlci5pc0Zpbml0ZShuKSlyZXR1cm4gbjtjb25zdCBjPWZ1bmN0aW9uKHQsbil7dHJ5e2lmKCJkb21haW4iPT09dCYmbiYmIm9iamVjdCI9PXR5cGVvZiBuJiZuLk0pcmV0dXJuIltEb21haW5dIjtpZigiZG9tYWluRW1pdHRlciI9PT10KXJldHVybiJbRG9tYWluRW1pdHRlcl0iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZuPT09Z2xvYmFsKXJldHVybiJbR2xvYmFsXSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJm49PT13aW5kb3cpcmV0dXJuIltXaW5kb3ddIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZuPT09ZG9jdW1lbnQpcmV0dXJuIltEb2N1bWVudF0iO2lmKCJvYmplY3QiPT10eXBlb2YoZT1uKSYmbnVsbCE9PWUmJihlLl9faXNWdWV8fGUuQnx8ZS5fX3ZfaXNWTm9kZSkpcmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiJfX3ZfaXNWTm9kZSJpbiB0JiZ0Ll9fdl9pc1ZOb2RlPyJbVnVlVk5vZGVdIjoiW1Z1ZVZpZXdNb2RlbF0ifShuKTtpZihmdW5jdGlvbih0KXtyZXR1cm4gQSh0KSYmIm5hdGl2ZUV2ZW50ImluIHQmJiJwcmV2ZW50RGVmYXVsdCJpbiB0JiYic3RvcFByb3BhZ2F0aW9uImluIHR9KG4pKXJldHVybiJbU3ludGhldGljRXZlbnRdIjtpZigibnVtYmVyIj09dHlwZW9mIG4mJiFOdW1iZXIuaXNGaW5pdGUobikpcmV0dXJuYFske259XWA7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pcmV0dXJuYFtGdW5jdGlvbjogJHtmdW5jdGlvbih0KXt0cnl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0Lm5hbWV8fHh9Y2F0Y2h7cmV0dXJuIHh9fShuKX1dYDtpZigic3ltYm9sIj09dHlwZW9mIG4pcmV0dXJuYFske1N0cmluZyhuKX1dYDtpZigiYmlnaW50Ij09dHlwZW9mIG4pcmV0dXJuYFtCaWdJbnQ6ICR7U3RyaW5nKG4pfV1gO2NvbnN0IHI9ZnVuY3Rpb24odCl7Y29uc3Qgbj1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7cmV0dXJuIG4/LmNvbnN0cnVjdG9yP24uY29uc3RydWN0b3IubmFtZToibnVsbCBwcm90b3R5cGUifShuKTtyZXR1cm4vXkhUTUwoXHcqKUVsZW1lbnQkLy50ZXN0KHIpP2BbSFRNTEVsZW1lbnQ6ICR7cn1dYDpgW29iamVjdCAke3J9XWB9Y2F0Y2godCl7cmV0dXJuYCoqbm9uLXNlcmlhbGl6YWJsZSoqICgke3R9KWB9dmFyIGV9KHQsbik7aWYoIWMuc3RhcnRzV2l0aCgiW29iamVjdCAiKSlyZXR1cm4gYztpZihuLl9fc2VudHJ5X3NraXBfbm9ybWFsaXphdGlvbl9fKXJldHVybiBuO2NvbnN0IHU9Im51bWJlciI9PXR5cGVvZiBuLl9fc2VudHJ5X292ZXJyaWRlX25vcm1hbGl6YXRpb25fZGVwdGhfXz9uLl9fc2VudHJ5X292ZXJyaWRlX25vcm1hbGl6YXRpb25fZGVwdGhfXzplO2lmKDA9PT11KXJldHVybiBjLnJlcGxhY2UoIm9iamVjdCAiLCIiKTtpZihpKG4pKXJldHVybiJbQ2lyY3VsYXIgfl0iO2NvbnN0IGE9bjtpZihhJiYiZnVuY3Rpb24iPT10eXBlb2YgYS50b0pTT04pdHJ5e3JldHVybiBUdCgiIixhLnRvSlNPTigpLHUtMSxyLG8pfWNhdGNoe31jb25zdCBmPUFycmF5LmlzQXJyYXkobik/W106e307bGV0IGg9MDtjb25zdCBwPVIobik7Zm9yKGNvbnN0IHQgaW4gcCl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwLHQpKWNvbnRpbnVlO2lmKGg+PXIpe2ZbdF09IltNYXhQcm9wZXJ0aWVzIH5dIjticmVha31jb25zdCBuPXBbdF07Zlt0XT1UdCh0LG4sdS0xLHIsbyksaCsrfXJldHVybiBzKG4pLGZ9ZnVuY3Rpb24ga3QodCxuKXtjb25zdCBlPW4ucmVwbGFjZSgvXFwvZywiLyIpLnJlcGxhY2UoL1t8XFx7fSgpW1xdXiQrKj8uXS9nLCJcXCQmIik7bGV0IHI9dDt0cnl7cj1kZWNvZGVVUkkodCl9Y2F0Y2h7fXJldHVybiByLnJlcGxhY2UoL1xcL2csIi8iKS5yZXBsYWNlKC93ZWJwYWNrOlwvPy9nLCIiKS5yZXBsYWNlKG5ldyBSZWdFeHAoYChmaWxlOi8vKT8vKiR7ZX0vKmAsImlnIiksImFwcDovLy8iKX1mdW5jdGlvbiBJdCh0LG49W10pe3JldHVyblt0LG5dfWZ1bmN0aW9uIE90KHQsbil7Y29uc3QgZT10WzFdO2Zvcihjb25zdCB0IG9mIGUpe2lmKG4odCx0WzBdLnR5cGUpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFJ0KHQpe2NvbnN0IG49bShwKTtyZXR1cm4gbi5lbmNvZGVQb2x5ZmlsbD9uLmVuY29kZVBvbHlmaWxsKHQpOihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh0KX1mdW5jdGlvbiBQdCh0KXtjb25zdFtuLGVdPXQ7bGV0IHI9SlNPTi5zdHJpbmdpZnkobik7ZnVuY3Rpb24gbyh0KXsic3RyaW5nIj09dHlwZW9mIHI/cj0ic3RyaW5nIj09dHlwZW9mIHQ/cit0OltSdChyKSx0XTpyLnB1c2goInN0cmluZyI9PXR5cGVvZiB0P1J0KHQpOnQpfWZvcihjb25zdCB0IG9mIGUpe2NvbnN0W24sZV09dDtpZihvKGBcbiR7SlNPTi5zdHJpbmdpZnkobil9XG5gKSwic3RyaW5nIj09dHlwZW9mIGV8fGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KW8oZSk7ZWxzZXtsZXQgdDt0cnl7dD1KU09OLnN0cmluZ2lmeShlKX1jYXRjaHt0PUpTT04uc3RyaW5naWZ5KEF0KGUpKX1vKHQpfX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHI/cjpmdW5jdGlvbih0KXtjb25zdCBuPXQucmVkdWNlKCh0LG4pPT50K24ubGVuZ3RoLDApLGU9bmV3IFVpbnQ4QXJyYXkobik7bGV0IHI9MDtmb3IoY29uc3QgbiBvZiB0KWUuc2V0KG4scikscis9bi5sZW5ndGg7cmV0dXJuIGV9KHIpfWNvbnN0IER0PXtzZXNzaW9uczoic2Vzc2lvbiIsZXZlbnQ6ImVycm9yIixjbGllbnRfcmVwb3J0OiJpbnRlcm5hbCIsdXNlcl9yZXBvcnQ6ImRlZmF1bHQiLHByb2ZpbGVfY2h1bms6InByb2ZpbGUiLHJlcGxheV9ldmVudDoicmVwbGF5IixyZXBsYXlfcmVjb3JkaW5nOiJyZXBsYXkiLGNoZWNrX2luOiJtb25pdG9yIixyYXdfc2VjdXJpdHk6InNlY3VyaXR5Iixsb2c6ImxvZ19pdGVtIix0cmFjZV9tZXRyaWM6Im1ldHJpYyJ9O2Z1bmN0aW9uIFV0KHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdCBpbiBEdH0odCk/RHRbdF06dH1mdW5jdGlvbiBMdCh0KXtpZighdD8uc2RrKXJldHVybjtjb25zdHtuYW1lOm4sdmVyc2lvbjplfT10LnNkaztyZXR1cm57bmFtZTpuLHZlcnNpb246ZX19ZnVuY3Rpb24gTXQodCxuLGUscil7Y29uc3Qgbz1MdChlKSxpPXQudHlwZSYmInJlcGxheV9ldmVudCIhPT10LnR5cGU/dC50eXBlOiJldmVudCI7IWZ1bmN0aW9uKHQsbil7aWYoIW4pcmV0dXJuIHQ7Y29uc3QgZT10LnNka3x8e307dC5zZGs9ey4uLmUsbmFtZTplLm5hbWV8fG4ubmFtZSx2ZXJzaW9uOmUudmVyc2lvbnx8bi52ZXJzaW9uLGludGVncmF0aW9uczpbLi4udC5zZGs/LmludGVncmF0aW9uc3x8W10sLi4ubi5pbnRlZ3JhdGlvbnN8fFtdXSxwYWNrYWdlczpbLi4udC5zZGs/LnBhY2thZ2VzfHxbXSwuLi5uLnBhY2thZ2VzfHxbXV0sc2V0dGluZ3M6dC5zZGs/LnNldHRpbmdzfHxuLnNldHRpbmdzP3suLi50LnNkaz8uc2V0dGluZ3MsLi4ubi5zZXR0aW5nc306dm9pZCAwfX0odCxlPy5zZGspO2NvbnN0IHM9ZnVuY3Rpb24odCxuLGUscil7Y29uc3Qgbz10LnNka1Byb2Nlc3NpbmdNZXRhZGF0YT8uZHluYW1pY1NhbXBsaW5nQ29udGV4dDtyZXR1cm57ZXZlbnRfaWQ6dC5ldmVudF9pZCxzZW50X2F0OihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKSwuLi5uJiZ7c2RrOm59LC4uLiEhZSYmciYme2RzbjpidChyKX0sLi4ubyYme3RyYWNlOm99fX0odCxvLHIsbik7ZGVsZXRlIHQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhO3JldHVybiBJdChzLFtbe3R5cGU6aX0sdF1dKX1jb25zdCBCdD0iX19TRU5UUllfU1VQUFJFU1NfVFJBQ0lOR19fIjtmdW5jdGlvbiBXdCh0KXtjb25zdCBuPWZ0KGwoKSk7cmV0dXJuIG4uc3VwcHJlc3NUcmFjaW5nP24uc3VwcHJlc3NUcmFjaW5nKHQpOmZ1bmN0aW9uKC4uLnQpe2NvbnN0IG49ZnQobCgpKTtpZigyPT09dC5sZW5ndGgpe2NvbnN0W2Uscl09dDtyZXR1cm4gZT9uLndpdGhTZXRTY29wZShlLHIpOm4ud2l0aFNjb3BlKHIpfXJldHVybiBuLndpdGhTY29wZSh0WzBdKX0obj0+e24uc2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHtbQnRdOiEwfSk7Y29uc3QgZT10KCk7cmV0dXJuIG4uc2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHtbQnRdOnZvaWQgMH0pLGV9KX1mdW5jdGlvbiB6dCh0LG4pe2NvbnN0e2ZpbmdlcnByaW50OmUsc3BhbjpyLGJyZWFkY3J1bWJzOm8sc2RrUHJvY2Vzc2luZ01ldGFkYXRhOml9PW47IWZ1bmN0aW9uKHQsbil7Y29uc3R7ZXh0cmE6ZSx0YWdzOnIsdXNlcjpvLGNvbnRleHRzOmksbGV2ZWw6cyx0cmFuc2FjdGlvbk5hbWU6Y309bjtPYmplY3Qua2V5cyhlKS5sZW5ndGgmJih0LmV4dHJhPXsuLi5lLC4uLnQuZXh0cmF9KTtPYmplY3Qua2V5cyhyKS5sZW5ndGgmJih0LnRhZ3M9ey4uLnIsLi4udC50YWdzfSk7T2JqZWN0LmtleXMobykubGVuZ3RoJiYodC51c2VyPXsuLi5vLC4uLnQudXNlcn0pO09iamVjdC5rZXlzKGkpLmxlbmd0aCYmKHQuY29udGV4dHM9ey4uLmksLi4udC5jb250ZXh0c30pO3MmJih0LmxldmVsPXMpO2MmJiJ0cmFuc2FjdGlvbiIhPT10LnR5cGUmJih0LnRyYW5zYWN0aW9uPWMpfSh0LG4pLHImJmZ1bmN0aW9uKHQsbil7dC5jb250ZXh0cz17dHJhY2U6X3QobiksLi4udC5jb250ZXh0c30sdC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE9e2R5bmFtaWNTYW1wbGluZ0NvbnRleHQ6Q3QobiksLi4udC5zZGtQcm9jZXNzaW5nTWV0YWRhdGF9O2NvbnN0IGU9anQobikscj1FdChlKS5kZXNjcmlwdGlvbjtyJiYhdC50cmFuc2FjdGlvbiYmInRyYW5zYWN0aW9uIj09PXQudHlwZSYmKHQudHJhbnNhY3Rpb249cil9KHQsciksZnVuY3Rpb24odCxuKXt0LmZpbmdlcnByaW50PXQuZmluZ2VycHJpbnQ/QXJyYXkuaXNBcnJheSh0LmZpbmdlcnByaW50KT90LmZpbmdlcnByaW50Olt0LmZpbmdlcnByaW50XTpbXSxuJiYodC5maW5nZXJwcmludD10LmZpbmdlcnByaW50LmNvbmNhdChuKSk7dC5maW5nZXJwcmludC5sZW5ndGh8fGRlbGV0ZSB0LmZpbmdlcnByaW50fSh0LGUpLGZ1bmN0aW9uKHQsbil7Y29uc3QgZT1bLi4udC5icmVhZGNydW1ic3x8W10sLi4ubl07dC5icmVhZGNydW1icz1lLmxlbmd0aD9lOnZvaWQgMH0odCxvKSxmdW5jdGlvbih0LG4pe3Quc2RrUHJvY2Vzc2luZ01ldGFkYXRhPXsuLi50LnNka1Byb2Nlc3NpbmdNZXRhZGF0YSwuLi5ufX0odCxpKX1jbGFzcyBGdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLlc9MCx0aGlzLkY9W10sdGhpcy5HKHQpfXRoZW4odCxuKXtyZXR1cm4gbmV3IEZ0KChlLHIpPT57dGhpcy5GLnB1c2goWyExLG49PntpZih0KXRyeXtlKHQobikpfWNhdGNoKHQpe3IodCl9ZWxzZSBlKG4pfSx0PT57aWYobil0cnl7ZShuKHQpKX1jYXRjaCh0KXtyKHQpfWVsc2Ugcih0KX1dKSx0aGlzLkgoKX0pfWNhdGNoKHQpe3JldHVybiB0aGlzLnRoZW4odD0+dCx0KX1maW5hbGx5KHQpe3JldHVybiBuZXcgRnQoKG4sZSk9PntsZXQgcixvO3JldHVybiB0aGlzLnRoZW4obj0+e289ITEscj1uLHQmJnQoKX0sbj0+e289ITAscj1uLHQmJnQoKX0pLnRoZW4oKCk9PntvP2Uocik6bihyKX0pfSl9SCgpe2lmKDA9PT10aGlzLlcpcmV0dXJuO2NvbnN0IHQ9dGhpcy5GLnNsaWNlKCk7dGhpcy5GPVtdLHQuZm9yRWFjaCh0PT57dFswXXx8KDE9PT10aGlzLlcmJnRbMV0odGhpcy5KKSwyPT09dGhpcy5XJiZ0WzJdKHRoaXMuSiksdFswXT0hMCl9KX1HKHQpe2NvbnN0IG49KHQsbik9PnswPT09dGhpcy5XJiYoVChuKT9uLnRoZW4oZSxyKToodGhpcy5XPXQsdGhpcy5KPW4sdGhpcy5IKCkpKX0sZT10PT57bigxLHQpfSxyPXQ9PntuKDIsdCl9O3RyeXt0KGUscil9Y2F0Y2godCl7cih0KX19fWNvbnN0IEd0PVN5bWJvbC5mb3IoIlNlbnRyeUJ1ZmZlckZ1bGxFcnJvciIpO2Z1bmN0aW9uIEh0KHQ9MTAwKXtjb25zdCBuPW5ldyBTZXQ7ZnVuY3Rpb24gZSh0KXtuLmRlbGV0ZSh0KX1yZXR1cm57Z2V0ICQoKXtyZXR1cm4gQXJyYXkuZnJvbShuKX0sYWRkOmZ1bmN0aW9uKHIpe2lmKCEobi5zaXplPHQpKXJldHVybiBvPUd0LG5ldyBGdCgodCxuKT0+e24obyl9KTt2YXIgbztjb25zdCBpPXIoKTtyZXR1cm4gbi5hZGQoaSksaS50aGVuKCgpPT5lKGkpLCgpPT5lKGkpKSxpfSxkcmFpbjpmdW5jdGlvbih0KXtpZighbi5zaXplKXJldHVybiBlPSEwLG5ldyBGdCh0PT57dChlKX0pO3ZhciBlO2NvbnN0IHI9UHJvbWlzZS5hbGxTZXR0bGVkKEFycmF5LmZyb20obikpLnRoZW4oKCk9PiEwKTtpZighdClyZXR1cm4gcjtjb25zdCBvPVtyLG5ldyBQcm9taXNlKG49PntyZXR1cm4ib2JqZWN0Ij09dHlwZW9mKGU9c2V0VGltZW91dCgoKT0+bighMSksdCkpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS51bnJlZiYmZS51bnJlZigpLGU7dmFyIGV9KV07cmV0dXJuIFByb21pc2UucmFjZShvKX19fWZ1bmN0aW9uIEp0KHQse3N0YXR1c0NvZGU6bixoZWFkZXJzOmV9LHI9VygpKXtjb25zdCBvPXsuLi50fSxpPWU/LlsieC1zZW50cnktcmF0ZS1saW1pdHMiXSxzPWU/LlsicmV0cnktYWZ0ZXIiXTtpZihpKWZvcihjb25zdCB0IG9mIGkudHJpbSgpLnNwbGl0KCIsIikpe2NvbnN0W24sZSwsLGldPXQuc3BsaXQoIjoiLDUpLHM9cGFyc2VJbnQobiwxMCksYz0xZTMqKGlzTmFOKHMpPzYwOnMpO2lmKGUpZm9yKGNvbnN0IHQgb2YgZS5zcGxpdCgiOyIpKSJtZXRyaWNfYnVja2V0Ij09PXQmJmkmJiFpLnNwbGl0KCI7IikuaW5jbHVkZXMoImN1c3RvbSIpfHwob1t0XT1yK2MpO2Vsc2Ugby5hbGw9citjfWVsc2Ugcz9vLmFsbD1yK2Z1bmN0aW9uKHQsbj1XKCkpe2NvbnN0IGU9cGFyc2VJbnQoYCR7dH1gLDEwKTtpZighaXNOYU4oZSkpcmV0dXJuIDFlMyplO2NvbnN0IHI9RGF0ZS5wYXJzZShgJHt0fWApO3JldHVybiBpc05hTihyKT82ZTQ6ci1ufShzLHIpOjQyOT09PW4mJihvLmFsbD1yKzZlNCk7cmV0dXJuIG99ZnVuY3Rpb24gWXQodCxuLGU9SHQodC5idWZmZXJTaXplfHw2NCkpe2xldCByPXt9O3JldHVybntzZW5kOmZ1bmN0aW9uKHQpe2NvbnN0IG89W107aWYoT3QodCwodCxuKT0+e2NvbnN0IGU9VXQobik7KGZ1bmN0aW9uKHQsbixlPVcoKSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbbl18fHQuYWxsfHwwfSh0LG4pPmV9KShyLGUpfHxvLnB1c2godCl9KSwwPT09by5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7Y29uc3QgaT1JdCh0WzBdLG8pLHM9dD0+eyFmdW5jdGlvbih0LG4pe3JldHVybiBPdCh0LCh0LGUpPT5uLmluY2x1ZGVzKGUpKX0oaSxbImNsaWVudF9yZXBvcnQiXSk/T3QoaSwodCxuKT0+e30pOmgmJlMud2FybihgRHJvcHBpbmcgY2xpZW50IHJlcG9ydC4gV2lsbCBub3Qgc2VuZCBvdXRjb21lcyAocmVhc29uOiAke3R9KS5gKX07cmV0dXJuIGUuYWRkKCgpPT5uKHtib2R5OlB0KGkpfSkudGhlbih0PT40MTM9PT10LnN0YXR1c0NvZGU/KGgmJlMuZXJyb3IoIlNlbnRyeSByZXNwb25kZWQgd2l0aCBzdGF0dXMgY29kZSA0MTMuIEVudmVsb3BlIHdhcyBkaXNjYXJkZWQgZHVlIHRvIGV4Y2VlZGluZyBzaXplIGxpbWl0cy4iKSxzKCJzZW5kX2Vycm9yIiksdCk6KGgmJnZvaWQgMCE9PXQuc3RhdHVzQ29kZSYmKHQuc3RhdHVzQ29kZTwyMDB8fHQuc3RhdHVzQ29kZT49MzAwKSYmUy53YXJuKGBTZW50cnkgcmVzcG9uZGVkIHdpdGggc3RhdHVzIGNvZGUgJHt0LnN0YXR1c0NvZGV9IHRvIHNlbnQgZXZlbnQuYCkscj1KdChyLHQpLHQpLHQ9Pnt0aHJvdyBzKCJuZXR3b3JrX2Vycm9yIiksaCYmUy5lcnJvcigiRW5jb3VudGVyZWQgZXJyb3IgcnVubmluZyB0cmFuc3BvcnQgcmVxdWVzdDoiLHQpLHR9KSkudGhlbih0PT50LHQ9PntpZih0PT09R3QpcmV0dXJuIGgmJlMuZXJyb3IoIlNraXBwZWQgc2VuZGluZyBldmVudCBiZWNhdXNlIGJ1ZmZlciBpcyBmdWxsLiIpLHMoInF1ZXVlX292ZXJmbG93IiksUHJvbWlzZS5yZXNvbHZlKHt9KTt0aHJvdyB0fSl9LGZsdXNoOnQ9PmUuZHJhaW4odCl9fWNvbnN0IFZ0PS9eKFxTKzpcXHxcLz8pKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteL1xcXSs/fCkoXC5bXi4vXFxdKnwpKSg/OlsvXFxdKikkLztmdW5jdGlvbiBLdCh0KXtjb25zdCBuPWZ1bmN0aW9uKHQpe2NvbnN0IG49dC5sZW5ndGg+MTAyND9gPHRydW5jYXRlZD4ke3Quc2xpY2UoLTEwMjQpfWA6dCxlPVZ0LmV4ZWMobik7cmV0dXJuIGU/ZS5zbGljZSgxKTpbXX0odCksZT1uWzBdfHwiIjtsZXQgcj1uWzFdO3JldHVybiBlfHxyPyhyJiYocj1yLnNsaWNlKDAsci5sZW5ndGgtMSkpLGUrcik6Ii4ifWZ1bmN0aW9uIFp0KHQsbj0hMSl7cmV0dXJuIShufHx0JiYhdC5zdGFydHNXaXRoKCIvIikmJiF0Lm1hdGNoKC9eW0EtWl06LykmJiF0LnN0YXJ0c1dpdGgoIi4iKSYmIXQubWF0Y2goL15bYS16QS1aXShbYS16QS1aMC05LlwtK10pKjpcL1wvLykpJiZ2b2lkIDAhPT10JiYhdC5pbmNsdWRlcygibm9kZV9tb2R1bGVzLyIpfWNvbnN0IHF0PVN5bWJvbCgiQWdlbnRCYXNlSW50ZXJuYWxTdGF0ZSIpO2NsYXNzIFF0IGV4dGVuZHMgaS5BZ2VudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzW3F0XT17fX1pc1NlY3VyZUVuZHBvaW50KHQpe2lmKHQpe2lmKCJib29sZWFuIj09dHlwZW9mIHQuc2VjdXJlRW5kcG9pbnQpcmV0dXJuIHQuc2VjdXJlRW5kcG9pbnQ7aWYoInN0cmluZyI9PXR5cGVvZiB0LnByb3RvY29sKXJldHVybiJodHRwczoiPT09dC5wcm90b2NvbH1jb25zdHtzdGFjazpufT1uZXcgRXJyb3I7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuJiZuLnNwbGl0KCJcbiIpLnNvbWUodD0+LTEhPT10LmluZGV4T2YoIihodHRwcy5qczoiKXx8LTEhPT10LmluZGV4T2YoIm5vZGU6aHR0cHM6IikpfWNyZWF0ZVNvY2tldCh0LG4sZSl7Y29uc3Qgcj17Li4ubixzZWN1cmVFbmRwb2ludDp0aGlzLmlzU2VjdXJlRW5kcG9pbnQobil9O1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PnRoaXMuY29ubmVjdCh0LHIpKS50aGVuKG89PntpZihvIGluc3RhbmNlb2YgaS5BZ2VudClyZXR1cm4gby5hZGRSZXF1ZXN0KHQscik7dGhpc1txdF0uY3VycmVudFNvY2tldD1vLHN1cGVyLmNyZWF0ZVNvY2tldCh0LG4sZSl9LGUpfWNyZWF0ZUNvbm5lY3Rpb24oKXtjb25zdCB0PXRoaXNbcXRdLmN1cnJlbnRTb2NrZXQ7aWYodGhpc1txdF0uY3VycmVudFNvY2tldD12b2lkIDAsIXQpdGhyb3cgbmV3IEVycm9yKCJObyBzb2NrZXQgd2FzIHJldHVybmVkIGluIHRoZSBgY29ubmVjdCgpYCBmdW5jdGlvbiIpO3JldHVybiB0fWdldCBkZWZhdWx0UG9ydCgpe3JldHVybiB0aGlzW3F0XS5kZWZhdWx0UG9ydD8/KCJodHRwczoiPT09dGhpcy5wcm90b2NvbD80NDM6ODApfXNldCBkZWZhdWx0UG9ydCh0KXt0aGlzW3F0XSYmKHRoaXNbcXRdLmRlZmF1bHRQb3J0PXQpfWdldCBwcm90b2NvbCgpe3JldHVybiB0aGlzW3F0XS5wcm90b2NvbD8/KHRoaXMuaXNTZWN1cmVFbmRwb2ludCgpPyJodHRwczoiOiJodHRwOiIpfXNldCBwcm90b2NvbCh0KXt0aGlzW3F0XSYmKHRoaXNbcXRdLnByb3RvY29sPXQpfX1mdW5jdGlvbiBYdCguLi50KXtTLmxvZygiW2h0dHBzLXByb3h5LWFnZW50OnBhcnNlLXByb3h5LXJlc3BvbnNlXSIsLi4udCl9ZnVuY3Rpb24gdG4odCl7cmV0dXJuIG5ldyBQcm9taXNlKChuLGUpPT57bGV0IHI9MDtjb25zdCBvPVtdO2Z1bmN0aW9uIGkoKXtjb25zdCBjPXQucmVhZCgpO2M/ZnVuY3Rpb24oYyl7by5wdXNoKGMpLHIrPWMubGVuZ3RoO2NvbnN0IHU9QnVmZmVyLmNvbmNhdChvLHIpLGE9dS5pbmRleE9mKCJcclxuXHJcbiIpO2lmKC0xPT09YSlyZXR1cm4gWHQoImhhdmUgbm90IHJlY2VpdmVkIGVuZCBvZiBIVFRQIGhlYWRlcnMgeWV0Li4uIiksdm9pZCBpKCk7Y29uc3QgZj11LnN1YmFycmF5KDAsYSkudG9TdHJpbmcoImFzY2lpIikuc3BsaXQoIlxyXG4iKSxoPWYuc2hpZnQoKTtpZighaClyZXR1cm4gdC5kZXN0cm95KCksZShuZXcgRXJyb3IoIk5vIGhlYWRlciByZWNlaXZlZCBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2UiKSk7Y29uc3QgcD1oLnNwbGl0KCIgIiksZD0rKHBbMV18fDApLGw9cC5zbGljZSgyKS5qb2luKCIgIiksbT17fTtmb3IoY29uc3QgbiBvZiBmKXtpZighbiljb250aW51ZTtjb25zdCByPW4uaW5kZXhPZigiOiIpO2lmKC0xPT09cilyZXR1cm4gdC5kZXN0cm95KCksZShuZXcgRXJyb3IoYEludmFsaWQgaGVhZGVyIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZTogIiR7bn0iYCkpO2NvbnN0IG89bi5zbGljZSgwLHIpLnRvTG93ZXJDYXNlKCksaT1uLnNsaWNlKHIrMSkudHJpbVN0YXJ0KCkscz1tW29dOyJzdHJpbmciPT10eXBlb2Ygcz9tW29dPVtzLGldOkFycmF5LmlzQXJyYXkocyk/cy5wdXNoKGkpOm1bb109aX1YdCgiZ290IHByb3h5IHNlcnZlciByZXNwb25zZTogJW8gJW8iLGgsbSkscygpLG4oe2Nvbm5lY3Q6e3N0YXR1c0NvZGU6ZCxzdGF0dXNUZXh0OmwsaGVhZGVyczptfSxidWZmZXJlZDp1fSl9KGMpOnQub25jZSgicmVhZGFibGUiLGkpfWZ1bmN0aW9uIHMoKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLGMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIix1KSx0LnJlbW92ZUxpc3RlbmVyKCJyZWFkYWJsZSIsaSl9ZnVuY3Rpb24gYygpe3MoKSxYdCgib25lbmQiKSxlKG5ldyBFcnJvcigiUHJveHkgY29ubmVjdGlvbiBlbmRlZCBiZWZvcmUgcmVjZWl2aW5nIENPTk5FQ1QgcmVzcG9uc2UiKSl9ZnVuY3Rpb24gdSh0KXtzKCksWHQoIm9uZXJyb3IgJW8iLHQpLGUodCl9dC5vbigiZXJyb3IiLHUpLHQub24oImVuZCIsYyksaSgpfSl9ZnVuY3Rpb24gbm4oLi4udCl7Uy5sb2coIltodHRwcy1wcm94eS1hZ2VudF0iLC4uLnQpfWNsYXNzIGVuIGV4dGVuZHMgUXR7c3RhdGljIF9faW5pdFN0YXRpYygpe3RoaXMucHJvdG9jb2xzPVsiaHR0cCIsImh0dHBzIl19Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLm9wdGlvbnM9e30sdGhpcy5wcm94eT0ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFVSTCh0KTp0LHRoaXMucHJveHlIZWFkZXJzPW4/LmhlYWRlcnM/P3t9LG5uKCJDcmVhdGluZyBuZXcgSHR0cHNQcm94eUFnZW50IGluc3RhbmNlOiAlbyIsdGhpcy5wcm94eS5ocmVmKTtjb25zdCBlPSh0aGlzLnByb3h5Lmhvc3RuYW1lfHx0aGlzLnByb3h5Lmhvc3QpLnJlcGxhY2UoL15cW3xcXSQvZywiIikscj10aGlzLnByb3h5LnBvcnQ/cGFyc2VJbnQodGhpcy5wcm94eS5wb3J0LDEwKToiaHR0cHM6Ij09PXRoaXMucHJveHkucHJvdG9jb2w/NDQzOjgwO3RoaXMuY29ubmVjdE9wdHM9e0FMUE5Qcm90b2NvbHM6WyJodHRwLzEuMSJdLC4uLm4/b24obiwiaGVhZGVycyIpOm51bGwsaG9zdDplLHBvcnQ6cn19YXN5bmMgY29ubmVjdCh0LG4pe2NvbnN0e3Byb3h5OmV9PXRoaXM7aWYoIW4uaG9zdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyAiaG9zdCIgcHJvdmlkZWQnKTtsZXQgcjtpZigiaHR0cHM6Ij09PWUucHJvdG9jb2wpe25uKCJDcmVhdGluZyBgdGxzLlNvY2tldGA6ICVvIix0aGlzLmNvbm5lY3RPcHRzKTtjb25zdCB0PXRoaXMuY29ubmVjdE9wdHMuc2VydmVybmFtZXx8dGhpcy5jb25uZWN0T3B0cy5ob3N0O3I9Zi5jb25uZWN0KHsuLi50aGlzLmNvbm5lY3RPcHRzLHNlcnZlcm5hbWU6dCYmYS5pc0lQKHQpP3ZvaWQgMDp0fSl9ZWxzZSBubigiQ3JlYXRpbmcgYG5ldC5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cykscj1hLmNvbm5lY3QodGhpcy5jb25uZWN0T3B0cyk7Y29uc3Qgbz0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wcm94eUhlYWRlcnM/dGhpcy5wcm94eUhlYWRlcnMoKTp7Li4udGhpcy5wcm94eUhlYWRlcnN9LGk9YS5pc0lQdjYobi5ob3N0KT9gWyR7bi5ob3N0fV1gOm4uaG9zdDtsZXQgcz1gQ09OTkVDVCAke2l9OiR7bi5wb3J0fSBIVFRQLzEuMVxyXG5gO2lmKGUudXNlcm5hbWV8fGUucGFzc3dvcmQpe2NvbnN0IHQ9YCR7ZGVjb2RlVVJJQ29tcG9uZW50KGUudXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChlLnBhc3N3b3JkKX1gO29bIlByb3h5LUF1dGhvcml6YXRpb24iXT1gQmFzaWMgJHtCdWZmZXIuZnJvbSh0KS50b1N0cmluZygiYmFzZTY0Iil9YH1vLkhvc3Q9YCR7aX06JHtuLnBvcnR9YCxvWyJQcm94eS1Db25uZWN0aW9uIl18fChvWyJQcm94eS1Db25uZWN0aW9uIl09dGhpcy5rZWVwQWxpdmU/IktlZXAtQWxpdmUiOiJjbG9zZSIpO2Zvcihjb25zdCB0IG9mIE9iamVjdC5rZXlzKG8pKXMrPWAke3R9OiAke29bdF19XHJcbmA7Y29uc3QgYz10bihyKTtyLndyaXRlKGAke3N9XHJcbmApO2NvbnN0e2Nvbm5lY3Q6dSxidWZmZXJlZDpofT1hd2FpdCBjO2lmKHQuZW1pdCgicHJveHlDb25uZWN0Iix1KSx0aGlzLmVtaXQoInByb3h5Q29ubmVjdCIsdSx0KSwyMDA9PT11LnN0YXR1c0NvZGUpe2lmKHQub25jZSgic29ja2V0Iixybiksbi5zZWN1cmVFbmRwb2ludCl7bm4oIlVwZ3JhZGluZyBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMiKTtjb25zdCB0PW4uc2VydmVybmFtZXx8bi5ob3N0O3JldHVybiBmLmNvbm5lY3Qoey4uLm9uKG4sImhvc3QiLCJwYXRoIiwicG9ydCIpLHNvY2tldDpyLHNlcnZlcm5hbWU6YS5pc0lQKHQpP3ZvaWQgMDp0fSl9cmV0dXJuIHJ9ci5kZXN0cm95KCk7Y29uc3QgcD1uZXcgYS5Tb2NrZXQoe3dyaXRhYmxlOiExfSk7cmV0dXJuIHAucmVhZGFibGU9ITAsdC5vbmNlKCJzb2NrZXQiLHQ9PntubigiUmVwbGF5aW5nIHByb3h5IGJ1ZmZlciBmb3IgZmFpbGVkIHJlcXVlc3QiKSx0LnB1c2goaCksdC5wdXNoKG51bGwpfSkscH19ZnVuY3Rpb24gcm4odCl7dC5yZXN1bWUoKX1mdW5jdGlvbiBvbih0LC4uLm4pe2NvbnN0IGU9e307bGV0IHI7Zm9yKHIgaW4gdCluLmluY2x1ZGVzKHIpfHwoZVtyXT10W3JdKTtyZXR1cm4gZX1lbi5fX2luaXRTdGF0aWMoKTtmdW5jdGlvbiBzbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9eW0EtWl06LywiIikucmVwbGFjZSgvXFwvZywiLyIpfWNvbnN0IGNuPW47bGV0IHVuLGFuPTAsZm49e307ZnVuY3Rpb24gaG4odCl7Y24uZGVidWcmJmNvbnNvbGUubG9nKGBbQU5SIFdvcmtlcl0gJHt0fWApfXZhciBwbixkbixsbjtjb25zdCBtbj1mdW5jdGlvbih0KXtsZXQgbjt0cnl7bj1uZXcgVVJMKHQudXJsKX1jYXRjaChuKXtyZXR1cm4gYigoKT0+e2NvbnNvbGUud2FybigiW0BzZW50cnkvbm9kZV06IEludmFsaWQgZHNuIG9yIHR1bm5lbCBvcHRpb24sIHdpbGwgbm90IHNlbmQgYW55IGV2ZW50cy4gVGhlIHR1bm5lbCBvcHRpb24gbXVzdCBiZSBhIGZ1bGwgVVJMIHdoZW4gdXNlZC4iKX0pLFl0KHQsKCk9PlByb21pc2UucmVzb2x2ZSh7fSkpfWNvbnN0IGU9Imh0dHBzOiI9PT1uLnByb3RvY29sLHI9ZnVuY3Rpb24odCxuKXtjb25zdHtub19wcm94eTplfT1wcm9jZXNzLmVudixyPWU/LnNwbGl0KCIsIikuc29tZShuPT50Lmhvc3QuZW5kc1dpdGgobil8fHQuaG9zdG5hbWUuZW5kc1dpdGgobikpO3JldHVybiByP3ZvaWQgMDpufShuLHQucHJveHl8fChlP3Byb2Nlc3MuZW52Lmh0dHBzX3Byb3h5OnZvaWQgMCl8fHByb2Nlc3MuZW52Lmh0dHBfcHJveHkpLG89ZT9zOmksYT12b2lkIDAhPT10LmtlZXBBbGl2ZSYmdC5rZWVwQWxpdmUsZj1yP25ldyBlbihyKTpuZXcgby5BZ2VudCh7a2VlcEFsaXZlOmEsbWF4U29ja2V0czozMCx0aW1lb3V0OjJlM30pLGg9ZnVuY3Rpb24odCxuLGUpe2NvbnN0e2hvc3RuYW1lOnIscGF0aG5hbWU6byxwb3J0OmkscHJvdG9jb2w6cyxzZWFyY2g6YX09bmV3IFVSTCh0LnVybCk7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBuZXcgUHJvbWlzZSgoaCxwKT0+e1d0KCgpPT57bGV0IGQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKHtyZWFkKCl7dGhpcy5wdXNoKHQpLHRoaXMucHVzaChudWxsKX19KX0oZi5ib2R5KTtjb25zdCBsPXsuLi50LmhlYWRlcnN9O2YuYm9keS5sZW5ndGg+MzI3NjgmJihsWyJjb250ZW50LWVuY29kaW5nIl09Imd6aXAiLGQ9ZC5waXBlKHUoKSkpO2NvbnN0IG09ci5zdGFydHNXaXRoKCJbIiksZz1uLnJlcXVlc3Qoe21ldGhvZDoiUE9TVCIsYWdlbnQ6ZSxoZWFkZXJzOmwsaG9zdG5hbWU6bT9yLnNsaWNlKDEsLTEpOnIscGF0aDpgJHtvfSR7YX1gLHBvcnQ6aSxwcm90b2NvbDpzLGNhOnQuY2FDZXJ0c30sdD0+e3Qub24oImRhdGEiLCgpPT57fSksdC5vbigiZW5kIiwoKT0+e30pLHQuc2V0RW5jb2RpbmcoInV0ZjgiKTtjb25zdCBuPXQuaGVhZGVyc1sicmV0cnktYWZ0ZXIiXT8/bnVsbCxlPXQuaGVhZGVyc1sieC1zZW50cnktcmF0ZS1saW1pdHMiXT8/bnVsbDtoKHtzdGF0dXNDb2RlOnQuc3RhdHVzQ29kZSxoZWFkZXJzOnsicmV0cnktYWZ0ZXIiOm4sIngtc2VudHJ5LXJhdGUtbGltaXRzIjpBcnJheS5pc0FycmF5KGUpP2VbMF18fG51bGw6ZX19KX0pO2cub24oImVycm9yIixwKSxkLnBpcGUoZyl9KX0pfX0odCx0Lmh0dHBNb2R1bGU/P28sZik7cmV0dXJuIFl0KHQsaCl9KHt1cmw6KHBuPWNuLmRzbixkbj1jbi50dW5uZWwsbG49Y24uc2RrTWV0YWRhdGEuc2RrLGRufHxgJHtmdW5jdGlvbih0KXtyZXR1cm5gJHtmdW5jdGlvbih0KXtjb25zdCBuPXQucHJvdG9jb2w/YCR7dC5wcm90b2NvbH06YDoiIixlPXQucG9ydD9gOiR7dC5wb3J0fWA6IiI7cmV0dXJuYCR7bn0vLyR7dC5ob3N0fSR7ZX0ke3QucGF0aD9gLyR7dC5wYXRofWA6IiJ9L2FwaS9gfSh0KX0ke3QucHJvamVjdElkfS9lbnZlbG9wZS9gfShwbil9PyR7ZnVuY3Rpb24odCxuKXtjb25zdCBlPXtzZW50cnlfdmVyc2lvbjoiNyJ9O3JldHVybiB0LnB1YmxpY0tleSYmKGUuc2VudHJ5X2tleT10LnB1YmxpY0tleSksbiYmKGUuc2VudHJ5X2NsaWVudD1gJHtuLm5hbWV9LyR7bi52ZXJzaW9ufWApLG5ldyBVUkxTZWFyY2hQYXJhbXMoZSkudG9TdHJpbmcoKX0ocG4sbG4pfWApfSk7YXN5bmMgZnVuY3Rpb24gZ24oKXtpZih1bil7aG4oIlNlbmRpbmcgYWJub3JtYWwgc2Vzc2lvbiIpLFYodW4se3N0YXR1czoiYWJub3JtYWwiLGFibm9ybWFsX21lY2hhbmlzbToiYW5yX2ZvcmVncm91bmQiLHJlbGVhc2U6Y24ucmVsZWFzZSxlbnZpcm9ubWVudDpjbi5lbnZpcm9ubWVudH0pO2NvbnN0IHQ9ZnVuY3Rpb24odCxuLGUscil7Y29uc3Qgbz1MdChlKTtyZXR1cm4gSXQoe3NlbnRfYXQ6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLC4uLm8mJntzZGs6b30sLi4uISFyJiZuJiZ7ZHNuOmJ0KG4pfX0sWyJhZ2dyZWdhdGVzImluIHQ/W3t0eXBlOiJzZXNzaW9ucyJ9LHRdOlt7dHlwZToic2Vzc2lvbiJ9LHQudG9KU09OKCldXSl9KHVuLGNuLmRzbixjbi5zZGtNZXRhZGF0YSxjbi50dW5uZWwpO2huKEpTT04uc3RyaW5naWZ5KHQpKSxhd2FpdCBtbi5zZW5kKHQpO3RyeXtlPy5wb3N0TWVzc2FnZSgic2Vzc2lvbi1lbmRlZCIpfWNhdGNoe319fWZ1bmN0aW9uIHluKHQpe2lmKCF0KXJldHVybjtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKCF0Lmxlbmd0aClyZXR1cm5bXTtjb25zdCBuPUFycmF5LmZyb20odCk7cmV0dXJuL3NlbnRyeVdyYXBwZWQvLnRlc3QoRShuKS5mdW5jdGlvbnx8IiIpJiZuLnBvcCgpLG4ucmV2ZXJzZSgpLCQudGVzdChFKG4pLmZ1bmN0aW9ufHwiIikmJihuLnBvcCgpLCQudGVzdChFKG4pLmZ1bmN0aW9ufHwiIikmJm4ucG9wKCkpLG4uc2xpY2UoMCw1MCkubWFwKHQ9Pih7Li4udCxmaWxlbmFtZTp0LmZpbGVuYW1lfHxFKG4pLmZpbGVuYW1lLGZ1bmN0aW9uOnQuZnVuY3Rpb258fCI/In0pKX0odCk7aWYoY24uYXBwUm9vdFBhdGgpZm9yKGNvbnN0IHQgb2Ygbil0LmZpbGVuYW1lJiYodC5maWxlbmFtZT1rdCh0LmZpbGVuYW1lLGNuLmFwcFJvb3RQYXRoKSk7cmV0dXJuIG59YXN5bmMgZnVuY3Rpb24gYm4odCxuKXtpZihhbj49Y24ubWF4QW5yRXZlbnRzKXJldHVybjthbis9MSxhd2FpdCBnbigpLGhuKCJTZW5kaW5nIGV2ZW50Iik7Y29uc3QgZT17ZXZlbnRfaWQ6RigpLGNvbnRleHRzOmNuLmNvbnRleHRzLHJlbGVhc2U6Y24ucmVsZWFzZSxlbnZpcm9ubWVudDpjbi5lbnZpcm9ubWVudCxkaXN0OmNuLmRpc3QscGxhdGZvcm06Im5vZGUiLGxldmVsOiJlcnJvciIsZXhjZXB0aW9uOnt2YWx1ZXM6W3t0eXBlOiJBcHBsaWNhdGlvbk5vdFJlc3BvbmRpbmciLHZhbHVlOmBBcHBsaWNhdGlvbiBOb3QgUmVzcG9uZGluZyBmb3IgYXQgbGVhc3QgJHtjbi5hbnJUaHJlc2hvbGR9IG1zYCxzdGFja3RyYWNlOntmcmFtZXM6eW4odCl9LG1lY2hhbmlzbTp7dHlwZToiQU5SIn19XX0sdGFnczpjbi5zdGF0aWNUYWdzfTtuJiZmdW5jdGlvbih0LG4pe2lmKHp0KHQsbiksIXQuY29udGV4dHM/LnRyYWNlKXtjb25zdHt0cmFjZUlkOmUscGFyZW50U3BhbklkOnIscHJvcGFnYXRpb25TcGFuSWQ6b309bi5wcm9wYWdhdGlvbkNvbnRleHQ7dC5jb250ZXh0cz17dHJhY2U6e3RyYWNlX2lkOmUsc3Bhbl9pZDpvfHxxKCkscGFyZW50X3NwYW5faWQ6cn0sLi4udC5jb250ZXh0c319fShlLG4pLGZ1bmN0aW9uKHQpe2lmKDA9PT1PYmplY3Qua2V5cyhmbikubGVuZ3RoKXJldHVybjtjb25zdCBuPWNuLmFwcFJvb3RQYXRoP3t9OmZuO2lmKGNuLmFwcFJvb3RQYXRoKWZvcihjb25zdFt0LGVdb2YgT2JqZWN0LmVudHJpZXMoZm4pKW5ba3QodCxjbi5hcHBSb290UGF0aCldPWU7Y29uc3QgZT1uZXcgTWFwO2Zvcihjb25zdCByIG9mIHQuZXhjZXB0aW9uPy52YWx1ZXN8fFtdKWZvcihjb25zdCB0IG9mIHIuc3RhY2t0cmFjZT8uZnJhbWVzfHxbXSl7Y29uc3Qgcj10LmFic19wYXRofHx0LmZpbGVuYW1lO3ImJm5bcl0mJmUuc2V0KHIsbltyXSl9aWYoZS5zaXplPjApe2NvbnN0IG49W107Zm9yKGNvbnN0W3Qscl1vZiBlLmVudHJpZXMoKSluLnB1c2goe3R5cGU6InNvdXJjZW1hcCIsY29kZV9maWxlOnQsZGVidWdfaWQ6cn0pO3QuZGVidWdfbWV0YT17aW1hZ2VzOm59fX0oZSk7Y29uc3Qgcj1NdChlLGNuLmRzbixjbi5zZGtNZXRhZGF0YSxjbi50dW5uZWwpO2huKEpTT04uc3RyaW5naWZ5KHIpKSxhd2FpdCBtbi5zZW5kKHIpLGF3YWl0IG1uLmZsdXNoKDJlMyksYW4+PWNuLm1heEFuckV2ZW50cyYmc2V0VGltZW91dCgoKT0+e3Byb2Nlc3MuZXhpdCgwKX0sNWUzKX1sZXQgdm47aWYoaG4oIlN0YXJ0ZWQiKSxjbi5jYXB0dXJlU3RhY2tUcmFjZSl7aG4oIkNvbm5lY3RpbmcgdG8gZGVidWdnZXIiKTtjb25zdCBuPW5ldyB0O24uY29ubmVjdFRvTWFpblRocmVhZCgpLGhuKCJDb25uZWN0ZWQgdG8gZGVidWdnZXIiKTtjb25zdCBlPW5ldyBNYXA7bi5vbigiRGVidWdnZXIuc2NyaXB0UGFyc2VkIix0PT57ZS5zZXQodC5wYXJhbXMuc2NyaXB0SWQsdC5wYXJhbXMudXJsKX0pLG4ub24oIkRlYnVnZ2VyLnBhdXNlZCIsdD0+e2lmKCJvdGhlciI9PT10LnBhcmFtcy5yZWFzb24pdHJ5e2huKCJEZWJ1Z2dlciBwYXVzZWQiKTtjb25zdCBpPVsuLi50LnBhcmFtcy5jYWxsRnJhbWVzXSxzPWNuLmFwcFJvb3RQYXRoP2Z1bmN0aW9uKHQ9KHByb2Nlc3MuYXJndlsxXT9LdChwcm9jZXNzLmFyZ3ZbMV0pOnByb2Nlc3MuY3dkKCkpLG49IlxcIj09PW8pe2NvbnN0IGU9bj9zbih0KTp0O3JldHVybiB0PT57aWYoIXQpcmV0dXJuO2NvbnN0IG89bj9zbih0KTp0O2xldHtkaXI6aSxiYXNlOnMsZXh0OmN9PXIucGFyc2Uobyk7Ii5qcyIhPT1jJiYiLm1qcyIhPT1jJiYiLmNqcyIhPT1jfHwocz1zLnNsaWNlKDAsLTEqYy5sZW5ndGgpKTtjb25zdCB1PWRlY29kZVVSSUNvbXBvbmVudChzKTtpfHwoaT0iLiIpO2NvbnN0IGE9aS5sYXN0SW5kZXhPZigiL25vZGVfbW9kdWxlcyIpO2lmKGE+LTEpcmV0dXJuYCR7aS5zbGljZShhKzE0KS5yZXBsYWNlKC9cLy9nLCIuIil9OiR7dX1gO2lmKGkuc3RhcnRzV2l0aChlKSl7Y29uc3QgdD1pLnNsaWNlKGUubGVuZ3RoKzEpLnJlcGxhY2UoL1wvL2csIi4iKTtyZXR1cm4gdD9gJHt0fToke3V9YDp1fXJldHVybiB1fX0oY24uYXBwUm9vdFBhdGgpOigpPT57fSxjPWkubWFwKHQ9PmZ1bmN0aW9uKHQsbixlKXtjb25zdCByPW4/bi5yZXBsYWNlKC9eZmlsZTpcL1wvLywiIik6dm9pZCAwLG89dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXI/dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXIrMTp2b2lkIDAsaT10LmxvY2F0aW9uLmxpbmVOdW1iZXI/dC5sb2NhdGlvbi5saW5lTnVtYmVyKzE6dm9pZCAwO3JldHVybntmaWxlbmFtZTpyLG1vZHVsZTplKHIpLGZ1bmN0aW9uOnQuZnVuY3Rpb25OYW1lfHwiPyIsY29sbm86byxsaW5lbm86aSxpbl9hcHA6cj9adChyKTp2b2lkIDB9fSh0LGUuZ2V0KHQubG9jYXRpb24uc2NyaXB0SWQpLHMpKSx1PXNldFRpbWVvdXQoKCk9PntibihjKS50aGVuKG51bGwsKCk9PntobigiU2VuZGluZyBBTlIgZXZlbnQgZmFpbGVkLiIpfSl9LDVlMyk7bi5wb3N0KCJSdW50aW1lLmV2YWx1YXRlIix7ZXhwcmVzc2lvbjoiZ2xvYmFsLl9fU0VOVFJZX0dFVF9TQ09QRVNfXygpOyIsc2lsZW50OiEwLHJldHVybkJ5VmFsdWU6ITB9LCh0LGUpPT57dCYmaG4oYEVycm9yIGV4ZWN1dGluZyBzY3JpcHQ6ICcke3QubWVzc2FnZX0nYCksY2xlYXJUaW1lb3V0KHUpO2NvbnN0IHI9ZT8ucmVzdWx0P2UucmVzdWx0LnZhbHVlOnZvaWQgMDtuLnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLG4ucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLGJuKGMscikudGhlbihudWxsLCgpPT57aG4oIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pfSl9Y2F0Y2godCl7dGhyb3cgbi5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKSxuLnBvc3QoIkRlYnVnZ2VyLmRpc2FibGUiKSx0fX0pLHZuPSgpPT57dHJ5e24ucG9zdCgiRGVidWdnZXIuZW5hYmxlIiwoKT0+e24ucG9zdCgiRGVidWdnZXIucGF1c2UiKX0pfWNhdGNoe319fWNvbnN0e3BvbGw6X259PWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89dCgpO2xldCBpPSExLHM9ITA7cmV0dXJuIHNldEludGVydmFsKCgpPT57Y29uc3QgdD1vLmdldFRpbWVNcygpOyExPT09aSYmdD5uK2UmJihpPSEwLHMmJnIoKSksdDxuK2UmJihpPSExKX0sMjApLHtwb2xsOigpPT57by5yZXNldCgpfSxlbmFibGVkOnQ9PntzPXR9fX0oZnVuY3Rpb24oKXtsZXQgdD1wcm9jZXNzLmhydGltZSgpO3JldHVybntnZXRUaW1lTXM6KCk9Pntjb25zdFtuLGVdPXByb2Nlc3MuaHJ0aW1lKHQpO3JldHVybiBNYXRoLmZsb29yKDFlMypuK2UvMWU2KX0scmVzZXQ6KCk9Pnt0PXByb2Nlc3MuaHJ0aW1lKCl9fX0sY24ucG9sbEludGVydmFsLGNuLmFuclRocmVzaG9sZCxmdW5jdGlvbigpe2huKCJXYXRjaGRvZyB0aW1lb3V0Iiksdm4/KGhuKCJQYXVzaW5nIGRlYnVnZ2VyIHRvIGNhcHR1cmUgc3RhY2sgdHJhY2UiKSx2bigpKTooaG4oIkNhcHR1cmluZyBldmVudCB3aXRob3V0IGEgc3RhY2sgdHJhY2UiKSxibigpLnRoZW4obnVsbCwoKT0+e2huKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQgb24gd2F0Y2hkb2cgdGltZW91dC4iKX0pKX0pO2U/Lm9uKCJtZXNzYWdlIix0PT57dC5zZXNzaW9uJiYodW49WSh0LnNlc3Npb24pKSx0LmRlYnVnSW1hZ2VzJiYoZm49dC5kZWJ1Z0ltYWdlcyksX24oKX0pOw==';

@@ -15,0 +15,0 @@ const DEFAULT_INTERVAL = 50;

@@ -307,6 +307,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

/**
* Exported for testing purposes.
*/
function _getOutgoingRequestEndedSpanData(response) {
const { statusCode, statusMessage, httpVersion, socket } = response;
const transport = httpVersion.toUpperCase() !== 'QUIC' ? 'ip_tcp' : 'ip_udp';
// httpVersion can be undefined in some cases and we seem to have encountered this before:
// https://github.com/getsentry/sentry-javascript/blob/ec8c8c64cde6001123db0199a8ca017b8863eac8/packages/node-core/src/integrations/http/httpServerSpansIntegration.ts#L158
// see: #20415
const transport = httpVersion?.toUpperCase() !== 'QUIC' ? 'ip_tcp' : 'ip_udp';

@@ -375,2 +381,3 @@ const additionalAttributes = {

exports.SentryHttpInstrumentation = SentryHttpInstrumentation;
exports._getOutgoingRequestEndedSpanData = _getOutgoingRequestEndedSpanData;
//# sourceMappingURL=SentryHttpInstrumentation.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"SentryHttpInstrumentation.js","sources":["../../../../src/integrations/http/SentryHttpInstrumentation.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport type { ChannelListener } from 'node:diagnostics_channel';\nimport { subscribe, unsubscribe } from 'node:diagnostics_channel';\nimport { errorMonitor } from 'node:events';\nimport type * as http from 'node:http';\nimport type * as https from 'node:https';\nimport { context, SpanStatusCode, trace } from '@opentelemetry/api';\nimport { isTracingSuppressed } from '@opentelemetry/core';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';\nimport {\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_NETWORK_PEER_ADDRESS,\n ATTR_NETWORK_PEER_PORT,\n ATTR_NETWORK_PROTOCOL_VERSION,\n ATTR_NETWORK_TRANSPORT,\n ATTR_URL_FULL,\n ATTR_USER_AGENT_ORIGINAL,\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH,\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED,\n} from '@opentelemetry/semantic-conventions';\nimport type { Span, SpanAttributes, SpanStatus } from '@sentry/core';\nimport {\n debug,\n getHttpSpanDetailsFromUrlObject,\n getSpanStatusFromHttpCode,\n LRUMap,\n parseStringToURLObject,\n SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n startInactiveSpan,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { INSTRUMENTATION_NAME } from './constants';\nimport {\n addRequestBreadcrumb,\n addTracePropagationHeadersToOutgoingRequest,\n getClientRequestUrl,\n getRequestOptions,\n} from './outgoing-requests';\n\ntype Http = typeof http;\ntype Https = typeof https;\ntype IncomingHttpHeaders = http.IncomingHttpHeaders;\ntype OutgoingHttpHeaders = http.OutgoingHttpHeaders;\n\nexport type SentryHttpInstrumentationOptions = InstrumentationConfig & {\n /**\n * Whether breadcrumbs should be recorded for outgoing requests.\n *\n * @default `true`\n */\n breadcrumbs?: boolean;\n\n /**\n * Whether to propagate Sentry trace headers in outgoing requests.\n * By default this is done by the HttpInstrumentation, but if that is not added (e.g. because tracing is disabled)\n * then this instrumentation can take over.\n *\n * @default `false`\n */\n propagateTraceInOutgoingRequests?: boolean;\n\n /**\n * Whether to enable the capability to create spans for outgoing requests via diagnostic channels.\n * If enabled, spans will only be created if the `spans` option is also enabled (default: true).\n *\n * This is a feature flag that should be enabled by SDKs when the runtime supports it (Node 22.12+).\n * Individual users should not need to configure this directly.\n *\n * @default `false`\n */\n createSpansForOutgoingRequests?: boolean;\n\n /**\n * Whether to create spans for outgoing requests (user preference).\n * This only takes effect if `createSpansForOutgoingRequests` is also enabled.\n * If `createSpansForOutgoingRequests` is not enabled, this option is ignored.\n *\n * @default `true`\n */\n spans?: boolean;\n\n /**\n * Do not capture breadcrumbs for outgoing HTTP requests to URLs where the given callback returns `true`.\n * For the scope of this instrumentation, this callback only controls breadcrumb creation.\n * The same option can be passed to the top-level httpIntegration where it controls both, breadcrumb and\n * span creation.\n *\n * @param url Contains the entire URL, including query string (if any), protocol, host, etc. of the outgoing request.\n * @param request Contains the {@type RequestOptions} object used to make the outgoing request.\n */\n ignoreOutgoingRequests?: (url: string, request: http.RequestOptions) => boolean;\n\n /**\n * Hooks for outgoing request spans, called when `createSpansForOutgoingRequests` is enabled.\n * These mirror the OTEL HttpInstrumentation hooks for backwards compatibility.\n */\n outgoingRequestHook?: (span: Span, request: http.ClientRequest) => void;\n outgoingResponseHook?: (span: Span, response: http.IncomingMessage) => void;\n outgoingRequestApplyCustomAttributes?: (\n span: Span,\n request: http.ClientRequest,\n response: http.IncomingMessage,\n ) => void;\n\n // All options below do not do anything anymore in this instrumentation, and will be removed in the future.\n // They are only kept here for backwards compatibility - the respective functionality is now handled by the httpServerIntegration/httpServerSpansIntegration.\n\n /**\n * @depreacted This no longer does anything.\n */\n extractIncomingTraceFromHeader?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreStaticAssets?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n disableIncomingRequestSpans?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreSpansForIncomingRequests?: (urlPath: string, request: http.IncomingMessage) => boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreIncomingRequestBody?: (url: string, request: http.RequestOptions) => boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n maxIncomingRequestBodySize?: 'none' | 'small' | 'medium' | 'always';\n\n /**\n * @deprecated This no longer does anything.\n */\n trackIncomingRequestsAsSessions?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n instrumentation?: {\n requestHook?: (span: Span, req: http.ClientRequest | http.IncomingMessage) => void;\n responseHook?: (span: Span, response: http.IncomingMessage | http.ServerResponse) => void;\n applyCustomAttributesOnSpan?: (\n span: Span,\n request: http.ClientRequest | http.IncomingMessage,\n response: http.IncomingMessage | http.ServerResponse,\n ) => void;\n };\n\n /**\n * @deprecated This no longer does anything.\n */\n sessionFlushingDelayMS?: number;\n};\n\n/**\n * This custom HTTP instrumentation handles outgoing HTTP requests.\n *\n * It provides:\n * - Breadcrumbs for all outgoing requests\n * - Trace propagation headers (when enabled)\n * - Span creation for outgoing requests (when createSpansForOutgoingRequests is enabled)\n *\n * Span creation requires Node 22+ and uses diagnostic channels to avoid monkey-patching.\n * By default, this is only enabled in the node SDK, not in node-core or other runtime SDKs.\n *\n * Important note: Contrary to other OTEL instrumentation, this one cannot be unwrapped.\n *\n * This is heavily inspired & adapted from:\n * https://github.com/open-telemetry/opentelemetry-js/blob/f8ab5592ddea5cba0a3b33bf8d74f27872c0367f/experimental/packages/opentelemetry-instrumentation-http/src/http.ts\n */\nexport class SentryHttpInstrumentation extends InstrumentationBase<SentryHttpInstrumentationOptions> {\n private _propagationDecisionMap: LRUMap<string, boolean>;\n private _ignoreOutgoingRequestsMap: WeakMap<http.ClientRequest, boolean>;\n\n public constructor(config: SentryHttpInstrumentationOptions = {}) {\n super(INSTRUMENTATION_NAME, SDK_VERSION, config);\n\n this._propagationDecisionMap = new LRUMap<string, boolean>(100);\n this._ignoreOutgoingRequestsMap = new WeakMap<http.ClientRequest, boolean>();\n }\n\n /** @inheritdoc */\n public init(): [InstrumentationNodeModuleDefinition, InstrumentationNodeModuleDefinition] {\n // We register handlers when either http or https is instrumented\n // but we only want to register them once, whichever is loaded first\n let hasRegisteredHandlers = false;\n\n const onHttpClientResponseFinish = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest; response: http.IncomingMessage };\n this._onOutgoingRequestFinish(data.request, data.response);\n }) satisfies ChannelListener;\n\n const onHttpClientRequestError = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest };\n this._onOutgoingRequestFinish(data.request, undefined);\n }) satisfies ChannelListener;\n\n const onHttpClientRequestCreated = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest };\n this._onOutgoingRequestCreated(data.request);\n }) satisfies ChannelListener;\n\n const wrap = <T extends Http | Https>(moduleExports: T): T => {\n if (hasRegisteredHandlers) {\n return moduleExports;\n }\n\n hasRegisteredHandlers = true;\n\n subscribe('http.client.response.finish', onHttpClientResponseFinish);\n\n // When an error happens, we still want to have a breadcrumb\n // In this case, `http.client.response.finish` is not triggered\n subscribe('http.client.request.error', onHttpClientRequestError);\n\n // NOTE: This channel only exists since Node 22.12+\n // Before that, outgoing requests are not patched\n // and trace headers are not propagated, sadly.\n if (this.getConfig().propagateTraceInOutgoingRequests || this.getConfig().createSpansForOutgoingRequests) {\n subscribe('http.client.request.created', onHttpClientRequestCreated);\n }\n return moduleExports;\n };\n\n const unwrap = (): void => {\n unsubscribe('http.client.response.finish', onHttpClientResponseFinish);\n unsubscribe('http.client.request.error', onHttpClientRequestError);\n unsubscribe('http.client.request.created', onHttpClientRequestCreated);\n };\n\n /**\n * You may be wondering why we register these diagnostics-channel listeners\n * in such a convoluted way (as InstrumentationNodeModuleDefinition...)˝,\n * instead of simply subscribing to the events once in here.\n * The reason for this is timing semantics: These functions are called once the http or https module is loaded.\n * If we'd subscribe before that, there seem to be conflicts with the OTEL native instrumentation in some scenarios,\n * especially the \"import-on-top\" pattern of setting up ESM applications.\n */\n return [\n new InstrumentationNodeModuleDefinition('http', ['*'], wrap, unwrap),\n new InstrumentationNodeModuleDefinition('https', ['*'], wrap, unwrap),\n ];\n }\n\n /**\n * Start a span for an outgoing request.\n * The span wraps the callback of the request, and ends when the response is finished.\n */\n private _startSpanForOutgoingRequest(request: http.ClientRequest): Span {\n // We monkey-patch `req.once('response'), which is used to trigger the callback of the request\n // eslint-disable-next-line @typescript-eslint/unbound-method, deprecation/deprecation\n const originalOnce = request.once;\n\n const [name, attributes] = _getOutgoingRequestSpanData(request);\n\n const span = startInactiveSpan({\n name,\n attributes,\n onlyIfParent: true,\n });\n\n this.getConfig().outgoingRequestHook?.(span, request);\n\n const newOnce = new Proxy(originalOnce, {\n apply(target, thisArg, args: Parameters<typeof originalOnce>) {\n const [event] = args;\n if (event !== 'response') {\n return target.apply(thisArg, args);\n }\n\n const parentContext = context.active();\n const requestContext = trace.setSpan(parentContext, span);\n\n return context.with(requestContext, () => {\n return target.apply(thisArg, args);\n });\n },\n });\n\n // eslint-disable-next-line deprecation/deprecation\n request.once = newOnce;\n\n /**\n * Determines if the request has errored or the response has ended/errored.\n */\n let responseFinished = false;\n\n const endSpan = (status: SpanStatus): void => {\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n\n span.setStatus(status);\n span.end();\n };\n\n request.prependListener('response', response => {\n if (request.listenerCount('response') <= 1) {\n response.resume();\n }\n\n context.bind(context.active(), response);\n\n const additionalAttributes = _getOutgoingRequestEndedSpanData(response);\n span.setAttributes(additionalAttributes);\n\n this.getConfig().outgoingResponseHook?.(span, response);\n this.getConfig().outgoingRequestApplyCustomAttributes?.(span, request, response);\n\n const endHandler = (forceError: boolean = false): void => {\n this._diag.debug('outgoingRequest on end()');\n\n const status =\n // eslint-disable-next-line deprecation/deprecation\n forceError || typeof response.statusCode !== 'number' || (response.aborted && !response.complete)\n ? { code: SpanStatusCode.ERROR }\n : getSpanStatusFromHttpCode(response.statusCode);\n\n endSpan(status);\n };\n\n response.on('end', () => {\n endHandler();\n });\n response.on(errorMonitor, error => {\n this._diag.debug('outgoingRequest on response error()', error);\n endHandler(true);\n });\n });\n\n // Fallback if proper response end handling above fails\n request.on('close', () => {\n endSpan({ code: SpanStatusCode.UNSET });\n });\n request.on(errorMonitor, error => {\n this._diag.debug('outgoingRequest on request error()', error);\n endSpan({ code: SpanStatusCode.ERROR });\n });\n\n return span;\n }\n\n /**\n * This is triggered when an outgoing request finishes.\n * It has access to the final request and response objects.\n */\n private _onOutgoingRequestFinish(request: http.ClientRequest, response?: http.IncomingMessage): void {\n DEBUG_BUILD && debug.log(INSTRUMENTATION_NAME, 'Handling finished outgoing request');\n\n const _breadcrumbs = this.getConfig().breadcrumbs;\n const breadCrumbsEnabled = typeof _breadcrumbs === 'undefined' ? true : _breadcrumbs;\n\n // Note: We cannot rely on the map being set by `_onOutgoingRequestCreated`, because that is not run in Node <22\n const shouldIgnore = this._ignoreOutgoingRequestsMap.get(request) ?? this._shouldIgnoreOutgoingRequest(request);\n this._ignoreOutgoingRequestsMap.set(request, shouldIgnore);\n\n if (breadCrumbsEnabled && !shouldIgnore) {\n addRequestBreadcrumb(request, response);\n }\n }\n\n /**\n * This is triggered when an outgoing request is created.\n * It creates a span (if enabled) and propagates trace headers within the span's context,\n * so downstream services link to the outgoing HTTP span rather than its parent.\n */\n private _onOutgoingRequestCreated(request: http.ClientRequest): void {\n DEBUG_BUILD && debug.log(INSTRUMENTATION_NAME, 'Handling outgoing request created');\n\n const shouldIgnore = this._ignoreOutgoingRequestsMap.get(request) ?? this._shouldIgnoreOutgoingRequest(request);\n this._ignoreOutgoingRequestsMap.set(request, shouldIgnore);\n\n if (shouldIgnore) {\n return;\n }\n\n const shouldCreateSpan = this.getConfig().createSpansForOutgoingRequests && (this.getConfig().spans ?? true);\n const shouldPropagate = this.getConfig().propagateTraceInOutgoingRequests;\n\n if (shouldCreateSpan) {\n const span = this._startSpanForOutgoingRequest(request);\n\n // Propagate headers within the span's context so the sentry-trace header\n // contains the outgoing span's ID, not the parent span's ID.\n // Only do this if the span is recording (has a parent) - otherwise the non-recording\n // span would produce all-zero trace IDs instead of using the scope's propagation context.\n if (shouldPropagate && span.isRecording()) {\n const requestContext = trace.setSpan(context.active(), span);\n context.with(requestContext, () => {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n });\n } else if (shouldPropagate) {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n }\n } else if (shouldPropagate) {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n }\n }\n\n /**\n * Check if the given outgoing request should be ignored.\n */\n private _shouldIgnoreOutgoingRequest(request: http.ClientRequest): boolean {\n if (isTracingSuppressed(context.active())) {\n return true;\n }\n\n const ignoreOutgoingRequests = this.getConfig().ignoreOutgoingRequests;\n\n if (!ignoreOutgoingRequests) {\n return false;\n }\n\n const options = getRequestOptions(request);\n const url = getClientRequestUrl(request);\n return ignoreOutgoingRequests(url, options);\n }\n}\n\nfunction _getOutgoingRequestSpanData(request: http.ClientRequest): [string, SpanAttributes] {\n const url = getClientRequestUrl(request);\n\n const [name, attributes] = getHttpSpanDetailsFromUrlObject(\n parseStringToURLObject(url),\n 'client',\n 'auto.http.otel.http',\n request,\n );\n\n const userAgent = request.getHeader('user-agent');\n\n return [\n name,\n {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.client',\n 'otel.kind': 'CLIENT',\n [ATTR_USER_AGENT_ORIGINAL]: userAgent,\n [ATTR_URL_FULL]: url,\n 'http.url': url,\n 'http.method': request.method,\n 'http.target': request.path || '/',\n 'net.peer.name': request.host,\n 'http.host': request.getHeader('host'),\n ...attributes,\n },\n ];\n}\n\nfunction _getOutgoingRequestEndedSpanData(response: http.IncomingMessage): SpanAttributes {\n const { statusCode, statusMessage, httpVersion, socket } = response;\n\n const transport = httpVersion.toUpperCase() !== 'QUIC' ? 'ip_tcp' : 'ip_udp';\n\n const additionalAttributes: SpanAttributes = {\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: statusCode,\n [ATTR_NETWORK_PROTOCOL_VERSION]: httpVersion,\n 'http.flavor': httpVersion,\n [ATTR_NETWORK_TRANSPORT]: transport,\n 'net.transport': transport,\n ['http.status_text']: statusMessage?.toUpperCase(),\n 'http.status_code': statusCode,\n ...getResponseContentLengthAttributes(response),\n };\n\n if (socket) {\n const { remoteAddress, remotePort } = socket;\n\n additionalAttributes[ATTR_NETWORK_PEER_ADDRESS] = remoteAddress;\n additionalAttributes[ATTR_NETWORK_PEER_PORT] = remotePort;\n additionalAttributes['net.peer.ip'] = remoteAddress;\n additionalAttributes['net.peer.port'] = remotePort;\n }\n\n return additionalAttributes;\n}\n\nfunction getResponseContentLengthAttributes(response: http.IncomingMessage): SpanAttributes {\n const length = getContentLength(response.headers);\n if (length == null) {\n return {};\n }\n\n if (isCompressed(response.headers)) {\n // eslint-disable-next-line deprecation/deprecation\n return { [SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH]: length };\n } else {\n // eslint-disable-next-line deprecation/deprecation\n return { [SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED]: length };\n }\n}\n\nfunction getContentLength(headers: http.OutgoingHttpHeaders | http.IncomingHttpHeaders): number | undefined {\n const contentLengthHeader = headers['content-length'];\n if (typeof contentLengthHeader === 'number') {\n return contentLengthHeader;\n }\n if (typeof contentLengthHeader !== 'string') {\n return undefined;\n }\n\n const contentLength = parseInt(contentLengthHeader, 10);\n if (isNaN(contentLength)) {\n return undefined;\n }\n\n return contentLength;\n}\n\nfunction isCompressed(headers: OutgoingHttpHeaders | IncomingHttpHeaders): boolean {\n const encoding = headers['content-encoding'];\n\n return !!encoding && encoding !== 'identity';\n}\n"],"names":["InstrumentationBase","INSTRUMENTATION_NAME","SDK_VERSION","LRUMap","subscribe","unsubscribe","InstrumentationNodeModuleDefinition","startInactiveSpan","context","trace","SpanStatusCode","getSpanStatusFromHttpCode","errorMonitor","DEBUG_BUILD","debug","addRequestBreadcrumb","addTracePropagationHeadersToOutgoingRequest","isTracingSuppressed","getRequestOptions","getClientRequestUrl","getHttpSpanDetailsFromUrlObject","parseStringToURLObject","SEMANTIC_ATTRIBUTE_SENTRY_OP","ATTR_USER_AGENT_ORIGINAL","ATTR_URL_FULL","ATTR_HTTP_RESPONSE_STATUS_CODE","ATTR_NETWORK_PROTOCOL_VERSION","ATTR_NETWORK_TRANSPORT","ATTR_NETWORK_PEER_ADDRESS","ATTR_NETWORK_PEER_PORT","SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH","SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED"],"mappings":"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"}
{"version":3,"file":"SentryHttpInstrumentation.js","sources":["../../../../src/integrations/http/SentryHttpInstrumentation.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport type { ChannelListener } from 'node:diagnostics_channel';\nimport { subscribe, unsubscribe } from 'node:diagnostics_channel';\nimport { errorMonitor } from 'node:events';\nimport type * as http from 'node:http';\nimport type * as https from 'node:https';\nimport { context, SpanStatusCode, trace } from '@opentelemetry/api';\nimport { isTracingSuppressed } from '@opentelemetry/core';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';\nimport {\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_NETWORK_PEER_ADDRESS,\n ATTR_NETWORK_PEER_PORT,\n ATTR_NETWORK_PROTOCOL_VERSION,\n ATTR_NETWORK_TRANSPORT,\n ATTR_URL_FULL,\n ATTR_USER_AGENT_ORIGINAL,\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH,\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED,\n} from '@opentelemetry/semantic-conventions';\nimport type { Span, SpanAttributes, SpanStatus } from '@sentry/core';\nimport {\n debug,\n getHttpSpanDetailsFromUrlObject,\n getSpanStatusFromHttpCode,\n LRUMap,\n parseStringToURLObject,\n SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n startInactiveSpan,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { INSTRUMENTATION_NAME } from './constants';\nimport {\n addRequestBreadcrumb,\n addTracePropagationHeadersToOutgoingRequest,\n getClientRequestUrl,\n getRequestOptions,\n} from './outgoing-requests';\n\ntype Http = typeof http;\ntype Https = typeof https;\ntype IncomingHttpHeaders = http.IncomingHttpHeaders;\ntype OutgoingHttpHeaders = http.OutgoingHttpHeaders;\n\nexport type SentryHttpInstrumentationOptions = InstrumentationConfig & {\n /**\n * Whether breadcrumbs should be recorded for outgoing requests.\n *\n * @default `true`\n */\n breadcrumbs?: boolean;\n\n /**\n * Whether to propagate Sentry trace headers in outgoing requests.\n * By default this is done by the HttpInstrumentation, but if that is not added (e.g. because tracing is disabled)\n * then this instrumentation can take over.\n *\n * @default `false`\n */\n propagateTraceInOutgoingRequests?: boolean;\n\n /**\n * Whether to enable the capability to create spans for outgoing requests via diagnostic channels.\n * If enabled, spans will only be created if the `spans` option is also enabled (default: true).\n *\n * This is a feature flag that should be enabled by SDKs when the runtime supports it (Node 22.12+).\n * Individual users should not need to configure this directly.\n *\n * @default `false`\n */\n createSpansForOutgoingRequests?: boolean;\n\n /**\n * Whether to create spans for outgoing requests (user preference).\n * This only takes effect if `createSpansForOutgoingRequests` is also enabled.\n * If `createSpansForOutgoingRequests` is not enabled, this option is ignored.\n *\n * @default `true`\n */\n spans?: boolean;\n\n /**\n * Do not capture breadcrumbs for outgoing HTTP requests to URLs where the given callback returns `true`.\n * For the scope of this instrumentation, this callback only controls breadcrumb creation.\n * The same option can be passed to the top-level httpIntegration where it controls both, breadcrumb and\n * span creation.\n *\n * @param url Contains the entire URL, including query string (if any), protocol, host, etc. of the outgoing request.\n * @param request Contains the {@type RequestOptions} object used to make the outgoing request.\n */\n ignoreOutgoingRequests?: (url: string, request: http.RequestOptions) => boolean;\n\n /**\n * Hooks for outgoing request spans, called when `createSpansForOutgoingRequests` is enabled.\n * These mirror the OTEL HttpInstrumentation hooks for backwards compatibility.\n */\n outgoingRequestHook?: (span: Span, request: http.ClientRequest) => void;\n outgoingResponseHook?: (span: Span, response: http.IncomingMessage) => void;\n outgoingRequestApplyCustomAttributes?: (\n span: Span,\n request: http.ClientRequest,\n response: http.IncomingMessage,\n ) => void;\n\n // All options below do not do anything anymore in this instrumentation, and will be removed in the future.\n // They are only kept here for backwards compatibility - the respective functionality is now handled by the httpServerIntegration/httpServerSpansIntegration.\n\n /**\n * @depreacted This no longer does anything.\n */\n extractIncomingTraceFromHeader?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreStaticAssets?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n disableIncomingRequestSpans?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreSpansForIncomingRequests?: (urlPath: string, request: http.IncomingMessage) => boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreIncomingRequestBody?: (url: string, request: http.RequestOptions) => boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n maxIncomingRequestBodySize?: 'none' | 'small' | 'medium' | 'always';\n\n /**\n * @deprecated This no longer does anything.\n */\n trackIncomingRequestsAsSessions?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n instrumentation?: {\n requestHook?: (span: Span, req: http.ClientRequest | http.IncomingMessage) => void;\n responseHook?: (span: Span, response: http.IncomingMessage | http.ServerResponse) => void;\n applyCustomAttributesOnSpan?: (\n span: Span,\n request: http.ClientRequest | http.IncomingMessage,\n response: http.IncomingMessage | http.ServerResponse,\n ) => void;\n };\n\n /**\n * @deprecated This no longer does anything.\n */\n sessionFlushingDelayMS?: number;\n};\n\n/**\n * This custom HTTP instrumentation handles outgoing HTTP requests.\n *\n * It provides:\n * - Breadcrumbs for all outgoing requests\n * - Trace propagation headers (when enabled)\n * - Span creation for outgoing requests (when createSpansForOutgoingRequests is enabled)\n *\n * Span creation requires Node 22+ and uses diagnostic channels to avoid monkey-patching.\n * By default, this is only enabled in the node SDK, not in node-core or other runtime SDKs.\n *\n * Important note: Contrary to other OTEL instrumentation, this one cannot be unwrapped.\n *\n * This is heavily inspired & adapted from:\n * https://github.com/open-telemetry/opentelemetry-js/blob/f8ab5592ddea5cba0a3b33bf8d74f27872c0367f/experimental/packages/opentelemetry-instrumentation-http/src/http.ts\n */\nexport class SentryHttpInstrumentation extends InstrumentationBase<SentryHttpInstrumentationOptions> {\n private _propagationDecisionMap: LRUMap<string, boolean>;\n private _ignoreOutgoingRequestsMap: WeakMap<http.ClientRequest, boolean>;\n\n public constructor(config: SentryHttpInstrumentationOptions = {}) {\n super(INSTRUMENTATION_NAME, SDK_VERSION, config);\n\n this._propagationDecisionMap = new LRUMap<string, boolean>(100);\n this._ignoreOutgoingRequestsMap = new WeakMap<http.ClientRequest, boolean>();\n }\n\n /** @inheritdoc */\n public init(): [InstrumentationNodeModuleDefinition, InstrumentationNodeModuleDefinition] {\n // We register handlers when either http or https is instrumented\n // but we only want to register them once, whichever is loaded first\n let hasRegisteredHandlers = false;\n\n const onHttpClientResponseFinish = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest; response: http.IncomingMessage };\n this._onOutgoingRequestFinish(data.request, data.response);\n }) satisfies ChannelListener;\n\n const onHttpClientRequestError = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest };\n this._onOutgoingRequestFinish(data.request, undefined);\n }) satisfies ChannelListener;\n\n const onHttpClientRequestCreated = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest };\n this._onOutgoingRequestCreated(data.request);\n }) satisfies ChannelListener;\n\n const wrap = <T extends Http | Https>(moduleExports: T): T => {\n if (hasRegisteredHandlers) {\n return moduleExports;\n }\n\n hasRegisteredHandlers = true;\n\n subscribe('http.client.response.finish', onHttpClientResponseFinish);\n\n // When an error happens, we still want to have a breadcrumb\n // In this case, `http.client.response.finish` is not triggered\n subscribe('http.client.request.error', onHttpClientRequestError);\n\n // NOTE: This channel only exists since Node 22.12+\n // Before that, outgoing requests are not patched\n // and trace headers are not propagated, sadly.\n if (this.getConfig().propagateTraceInOutgoingRequests || this.getConfig().createSpansForOutgoingRequests) {\n subscribe('http.client.request.created', onHttpClientRequestCreated);\n }\n return moduleExports;\n };\n\n const unwrap = (): void => {\n unsubscribe('http.client.response.finish', onHttpClientResponseFinish);\n unsubscribe('http.client.request.error', onHttpClientRequestError);\n unsubscribe('http.client.request.created', onHttpClientRequestCreated);\n };\n\n /**\n * You may be wondering why we register these diagnostics-channel listeners\n * in such a convoluted way (as InstrumentationNodeModuleDefinition...)˝,\n * instead of simply subscribing to the events once in here.\n * The reason for this is timing semantics: These functions are called once the http or https module is loaded.\n * If we'd subscribe before that, there seem to be conflicts with the OTEL native instrumentation in some scenarios,\n * especially the \"import-on-top\" pattern of setting up ESM applications.\n */\n return [\n new InstrumentationNodeModuleDefinition('http', ['*'], wrap, unwrap),\n new InstrumentationNodeModuleDefinition('https', ['*'], wrap, unwrap),\n ];\n }\n\n /**\n * Start a span for an outgoing request.\n * The span wraps the callback of the request, and ends when the response is finished.\n */\n private _startSpanForOutgoingRequest(request: http.ClientRequest): Span {\n // We monkey-patch `req.once('response'), which is used to trigger the callback of the request\n // eslint-disable-next-line @typescript-eslint/unbound-method, deprecation/deprecation\n const originalOnce = request.once;\n\n const [name, attributes] = _getOutgoingRequestSpanData(request);\n\n const span = startInactiveSpan({\n name,\n attributes,\n onlyIfParent: true,\n });\n\n this.getConfig().outgoingRequestHook?.(span, request);\n\n const newOnce = new Proxy(originalOnce, {\n apply(target, thisArg, args: Parameters<typeof originalOnce>) {\n const [event] = args;\n if (event !== 'response') {\n return target.apply(thisArg, args);\n }\n\n const parentContext = context.active();\n const requestContext = trace.setSpan(parentContext, span);\n\n return context.with(requestContext, () => {\n return target.apply(thisArg, args);\n });\n },\n });\n\n // eslint-disable-next-line deprecation/deprecation\n request.once = newOnce;\n\n /**\n * Determines if the request has errored or the response has ended/errored.\n */\n let responseFinished = false;\n\n const endSpan = (status: SpanStatus): void => {\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n\n span.setStatus(status);\n span.end();\n };\n\n request.prependListener('response', response => {\n if (request.listenerCount('response') <= 1) {\n response.resume();\n }\n\n context.bind(context.active(), response);\n\n const additionalAttributes = _getOutgoingRequestEndedSpanData(response);\n span.setAttributes(additionalAttributes);\n\n this.getConfig().outgoingResponseHook?.(span, response);\n this.getConfig().outgoingRequestApplyCustomAttributes?.(span, request, response);\n\n const endHandler = (forceError: boolean = false): void => {\n this._diag.debug('outgoingRequest on end()');\n\n const status =\n // eslint-disable-next-line deprecation/deprecation\n forceError || typeof response.statusCode !== 'number' || (response.aborted && !response.complete)\n ? { code: SpanStatusCode.ERROR }\n : getSpanStatusFromHttpCode(response.statusCode);\n\n endSpan(status);\n };\n\n response.on('end', () => {\n endHandler();\n });\n response.on(errorMonitor, error => {\n this._diag.debug('outgoingRequest on response error()', error);\n endHandler(true);\n });\n });\n\n // Fallback if proper response end handling above fails\n request.on('close', () => {\n endSpan({ code: SpanStatusCode.UNSET });\n });\n request.on(errorMonitor, error => {\n this._diag.debug('outgoingRequest on request error()', error);\n endSpan({ code: SpanStatusCode.ERROR });\n });\n\n return span;\n }\n\n /**\n * This is triggered when an outgoing request finishes.\n * It has access to the final request and response objects.\n */\n private _onOutgoingRequestFinish(request: http.ClientRequest, response?: http.IncomingMessage): void {\n DEBUG_BUILD && debug.log(INSTRUMENTATION_NAME, 'Handling finished outgoing request');\n\n const _breadcrumbs = this.getConfig().breadcrumbs;\n const breadCrumbsEnabled = typeof _breadcrumbs === 'undefined' ? true : _breadcrumbs;\n\n // Note: We cannot rely on the map being set by `_onOutgoingRequestCreated`, because that is not run in Node <22\n const shouldIgnore = this._ignoreOutgoingRequestsMap.get(request) ?? this._shouldIgnoreOutgoingRequest(request);\n this._ignoreOutgoingRequestsMap.set(request, shouldIgnore);\n\n if (breadCrumbsEnabled && !shouldIgnore) {\n addRequestBreadcrumb(request, response);\n }\n }\n\n /**\n * This is triggered when an outgoing request is created.\n * It creates a span (if enabled) and propagates trace headers within the span's context,\n * so downstream services link to the outgoing HTTP span rather than its parent.\n */\n private _onOutgoingRequestCreated(request: http.ClientRequest): void {\n DEBUG_BUILD && debug.log(INSTRUMENTATION_NAME, 'Handling outgoing request created');\n\n const shouldIgnore = this._ignoreOutgoingRequestsMap.get(request) ?? this._shouldIgnoreOutgoingRequest(request);\n this._ignoreOutgoingRequestsMap.set(request, shouldIgnore);\n\n if (shouldIgnore) {\n return;\n }\n\n const shouldCreateSpan = this.getConfig().createSpansForOutgoingRequests && (this.getConfig().spans ?? true);\n const shouldPropagate = this.getConfig().propagateTraceInOutgoingRequests;\n\n if (shouldCreateSpan) {\n const span = this._startSpanForOutgoingRequest(request);\n\n // Propagate headers within the span's context so the sentry-trace header\n // contains the outgoing span's ID, not the parent span's ID.\n // Only do this if the span is recording (has a parent) - otherwise the non-recording\n // span would produce all-zero trace IDs instead of using the scope's propagation context.\n if (shouldPropagate && span.isRecording()) {\n const requestContext = trace.setSpan(context.active(), span);\n context.with(requestContext, () => {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n });\n } else if (shouldPropagate) {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n }\n } else if (shouldPropagate) {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n }\n }\n\n /**\n * Check if the given outgoing request should be ignored.\n */\n private _shouldIgnoreOutgoingRequest(request: http.ClientRequest): boolean {\n if (isTracingSuppressed(context.active())) {\n return true;\n }\n\n const ignoreOutgoingRequests = this.getConfig().ignoreOutgoingRequests;\n\n if (!ignoreOutgoingRequests) {\n return false;\n }\n\n const options = getRequestOptions(request);\n const url = getClientRequestUrl(request);\n return ignoreOutgoingRequests(url, options);\n }\n}\n\nfunction _getOutgoingRequestSpanData(request: http.ClientRequest): [string, SpanAttributes] {\n const url = getClientRequestUrl(request);\n\n const [name, attributes] = getHttpSpanDetailsFromUrlObject(\n parseStringToURLObject(url),\n 'client',\n 'auto.http.otel.http',\n request,\n );\n\n const userAgent = request.getHeader('user-agent');\n\n return [\n name,\n {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.client',\n 'otel.kind': 'CLIENT',\n [ATTR_USER_AGENT_ORIGINAL]: userAgent,\n [ATTR_URL_FULL]: url,\n 'http.url': url,\n 'http.method': request.method,\n 'http.target': request.path || '/',\n 'net.peer.name': request.host,\n 'http.host': request.getHeader('host'),\n ...attributes,\n },\n ];\n}\n\n/**\n * Exported for testing purposes.\n */\nexport function _getOutgoingRequestEndedSpanData(response: http.IncomingMessage): SpanAttributes {\n const { statusCode, statusMessage, httpVersion, socket } = response;\n\n // httpVersion can be undefined in some cases and we seem to have encountered this before:\n // https://github.com/getsentry/sentry-javascript/blob/ec8c8c64cde6001123db0199a8ca017b8863eac8/packages/node-core/src/integrations/http/httpServerSpansIntegration.ts#L158\n // see: #20415\n const transport = httpVersion?.toUpperCase() !== 'QUIC' ? 'ip_tcp' : 'ip_udp';\n\n const additionalAttributes: SpanAttributes = {\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: statusCode,\n [ATTR_NETWORK_PROTOCOL_VERSION]: httpVersion,\n 'http.flavor': httpVersion,\n [ATTR_NETWORK_TRANSPORT]: transport,\n 'net.transport': transport,\n ['http.status_text']: statusMessage?.toUpperCase(),\n 'http.status_code': statusCode,\n ...getResponseContentLengthAttributes(response),\n };\n\n if (socket) {\n const { remoteAddress, remotePort } = socket;\n\n additionalAttributes[ATTR_NETWORK_PEER_ADDRESS] = remoteAddress;\n additionalAttributes[ATTR_NETWORK_PEER_PORT] = remotePort;\n additionalAttributes['net.peer.ip'] = remoteAddress;\n additionalAttributes['net.peer.port'] = remotePort;\n }\n\n return additionalAttributes;\n}\n\nfunction getResponseContentLengthAttributes(response: http.IncomingMessage): SpanAttributes {\n const length = getContentLength(response.headers);\n if (length == null) {\n return {};\n }\n\n if (isCompressed(response.headers)) {\n // eslint-disable-next-line deprecation/deprecation\n return { [SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH]: length };\n } else {\n // eslint-disable-next-line deprecation/deprecation\n return { [SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED]: length };\n }\n}\n\nfunction getContentLength(headers: http.OutgoingHttpHeaders | http.IncomingHttpHeaders): number | undefined {\n const contentLengthHeader = headers['content-length'];\n if (typeof contentLengthHeader === 'number') {\n return contentLengthHeader;\n }\n if (typeof contentLengthHeader !== 'string') {\n return undefined;\n }\n\n const contentLength = parseInt(contentLengthHeader, 10);\n if (isNaN(contentLength)) {\n return undefined;\n }\n\n return contentLength;\n}\n\nfunction isCompressed(headers: OutgoingHttpHeaders | IncomingHttpHeaders): boolean {\n const encoding = headers['content-encoding'];\n\n return !!encoding && encoding !== 'identity';\n}\n"],"names":["InstrumentationBase","INSTRUMENTATION_NAME","SDK_VERSION","LRUMap","subscribe","unsubscribe","InstrumentationNodeModuleDefinition","startInactiveSpan","context","trace","SpanStatusCode","getSpanStatusFromHttpCode","errorMonitor","DEBUG_BUILD","debug","addRequestBreadcrumb","addTracePropagationHeadersToOutgoingRequest","isTracingSuppressed","getRequestOptions","getClientRequestUrl","getHttpSpanDetailsFromUrlObject","parseStringToURLObject","SEMANTIC_ATTRIBUTE_SENTRY_OP","ATTR_USER_AGENT_ORIGINAL","ATTR_URL_FULL","ATTR_HTTP_RESPONSE_STATUS_CODE","ATTR_NETWORK_PROTOCOL_VERSION","ATTR_NETWORK_TRANSPORT","ATTR_NETWORK_PEER_ADDRESS","ATTR_NETWORK_PEER_PORT","SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH","SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED"],"mappings":"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"}

@@ -9,3 +9,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

// This string is a placeholder that gets overwritten with the worker code.
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjUwLjAtYWxwaGEuMCAoOWM1MjA0NCkgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIGV9ZnJvbSJub2RlOmluc3BlY3Rvci9wcm9taXNlcyI7aW1wb3J0e3dvcmtlckRhdGEgYXMgdH1mcm9tIm5vZGU6d29ya2VyX3RocmVhZHMiO2NvbnN0IG49Z2xvYmFsVGhpcyxpPXt9O2NvbnN0IG89Il9fU0VOVFJZX0VSUk9SX0xPQ0FMX1ZBUklBQkxFU19fIjtjb25zdCBhPXQ7ZnVuY3Rpb24gcyguLi5lKXthLmRlYnVnJiZmdW5jdGlvbihlKXtpZighKCJjb25zb2xlImluIG4pKXJldHVybiBlKCk7Y29uc3QgdD1uLmNvbnNvbGUsbz17fSxhPU9iamVjdC5rZXlzKGkpO2EuZm9yRWFjaChlPT57Y29uc3Qgbj1pW2VdO29bZV09dFtlXSx0W2VdPW59KTt0cnl7cmV0dXJuIGUoKX1maW5hbGx5e2EuZm9yRWFjaChlPT57dFtlXT1vW2VdfSl9fSgoKT0+Y29uc29sZS5sb2coIltMb2NhbFZhcmlhYmxlcyBXb3JrZXJdIiwuLi5lKSl9YXN5bmMgZnVuY3Rpb24gYyhlLHQsbixpKXtjb25zdCBvPWF3YWl0IGUucG9zdCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIix7b2JqZWN0SWQ6dCxvd25Qcm9wZXJ0aWVzOiEwfSk7aVtuXT1vLnJlc3VsdC5maWx0ZXIoZT0+Imxlbmd0aCIhPT1lLm5hbWUmJiFpc05hTihwYXJzZUludChlLm5hbWUsMTApKSkuc29ydCgoZSx0KT0+cGFyc2VJbnQoZS5uYW1lLDEwKS1wYXJzZUludCh0Lm5hbWUsMTApKS5tYXAoZT0+ZS52YWx1ZT8udmFsdWUpfWFzeW5jIGZ1bmN0aW9uIHIoZSx0LG4saSl7Y29uc3Qgbz1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOnQsb3duUHJvcGVydGllczohMH0pO2lbbl09by5yZXN1bHQubWFwKGU9PltlLm5hbWUsZS52YWx1ZT8udmFsdWVdKS5yZWR1Y2UoKGUsW3Qsbl0pPT4oZVt0XT1uLGUpLHt9KX1mdW5jdGlvbiB1KGUsdCl7ZS52YWx1ZSYmKCJ2YWx1ZSJpbiBlLnZhbHVlP3ZvaWQgMD09PWUudmFsdWUudmFsdWV8fG51bGw9PT1lLnZhbHVlLnZhbHVlP3RbZS5uYW1lXT1gPCR7ZS52YWx1ZS52YWx1ZX0+YDp0W2UubmFtZV09ZS52YWx1ZS52YWx1ZToiZGVzY3JpcHRpb24iaW4gZS52YWx1ZSYmImZ1bmN0aW9uIiE9PWUudmFsdWUudHlwZT90W2UubmFtZV09YDwke2UudmFsdWUuZGVzY3JpcHRpb259PmA6InVuZGVmaW5lZCI9PT1lLnZhbHVlLnR5cGUmJih0W2UubmFtZV09Ijx1bmRlZmluZWQ+IikpfWFzeW5jIGZ1bmN0aW9uIGwoZSx0KXtjb25zdCBuPWF3YWl0IGUucG9zdCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIix7b2JqZWN0SWQ6dCxvd25Qcm9wZXJ0aWVzOiEwfSksaT17fTtmb3IoY29uc3QgdCBvZiBuLnJlc3VsdClpZih0LnZhbHVlPy5vYmplY3RJZCYmIkFycmF5Ij09PXQudmFsdWUuY2xhc3NOYW1lKXtjb25zdCBuPXQudmFsdWUub2JqZWN0SWQ7YXdhaXQgYyhlLG4sdC5uYW1lLGkpfWVsc2UgaWYodC52YWx1ZT8ub2JqZWN0SWQmJiJPYmplY3QiPT09dC52YWx1ZS5jbGFzc05hbWUpe2NvbnN0IG49dC52YWx1ZS5vYmplY3RJZDthd2FpdCByKGUsbix0Lm5hbWUsaSl9ZWxzZSB0LnZhbHVlJiZ1KHQsaSk7cmV0dXJuIGl9bGV0IGY7KGFzeW5jIGZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgZTt0LmNvbm5lY3RUb01haW5UaHJlYWQoKSxzKCJDb25uZWN0ZWQgdG8gbWFpbiB0aHJlYWQiKTtsZXQgbj0hMTt0Lm9uKCJEZWJ1Z2dlci5yZXN1bWVkIiwoKT0+e249ITF9KSx0Lm9uKCJEZWJ1Z2dlci5wYXVzZWQiLGU9PntuPSEwLGFzeW5jIGZ1bmN0aW9uKGUse3JlYXNvbjp0LGRhdGE6e29iamVjdElkOm59LGNhbGxGcmFtZXM6aX0pe2lmKCJleGNlcHRpb24iIT09dCYmInByb21pc2VSZWplY3Rpb24iIT09dClyZXR1cm47aWYoZj8uKCksbnVsbD09bilyZXR1cm47Y29uc3QgYT1bXTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7Y29uc3R7c2NvcGVDaGFpbjpuLGZ1bmN0aW9uTmFtZTpvLHRoaXM6c309aVt0XSxjPW4uZmluZChlPT4ibG9jYWwiPT09ZS50eXBlKSxyPSJnbG9iYWwiIT09cy5jbGFzc05hbWUmJnMuY2xhc3NOYW1lP2Ake3MuY2xhc3NOYW1lfS4ke299YDpvO2lmKHZvaWQgMD09PWM/Lm9iamVjdC5vYmplY3RJZClhW3RdPXtmdW5jdGlvbjpyfTtlbHNle2NvbnN0IG49YXdhaXQgbChlLGMub2JqZWN0Lm9iamVjdElkKTthW3RdPXtmdW5jdGlvbjpyLHZhcnM6bn19fWF3YWl0IGUucG9zdCgiUnVudGltZS5jYWxsRnVuY3Rpb25PbiIse2Z1bmN0aW9uRGVjbGFyYXRpb246YGZ1bmN0aW9uKCkgeyB0aGlzLiR7b30gPSB0aGlzLiR7b30gfHwgJHtKU09OLnN0cmluZ2lmeShhKX07IH1gLHNpbGVudDohMCxvYmplY3RJZDpufSksYXdhaXQgZS5wb3N0KCJSdW50aW1lLnJlbGVhc2VPYmplY3QiLHtvYmplY3RJZDpufSl9KHQsZS5wYXJhbXMpLnRoZW4oYXN5bmMoKT0+e24mJmF3YWl0IHQucG9zdCgiRGVidWdnZXIucmVzdW1lIil9LGFzeW5jIGU9PntuJiZhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpfSl9KSxhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLmVuYWJsZSIpO2NvbnN0IGk9ITEhPT1hLmNhcHR1cmVBbGxFeGNlcHRpb25zO2lmKGF3YWl0IHQucG9zdCgiRGVidWdnZXIuc2V0UGF1c2VPbkV4Y2VwdGlvbnMiLHtzdGF0ZTppPyJhbGwiOiJ1bmNhdWdodCJ9KSxpKXtjb25zdCBlPWEubWF4RXhjZXB0aW9uc1BlclNlY29uZHx8NTA7Zj1mdW5jdGlvbihlLHQsbil7bGV0IGk9MCxvPTUsYT0wO3JldHVybiBzZXRJbnRlcnZhbCgoKT0+ezA9PT1hP2k+ZSYmKG8qPTIsbihvKSxvPjg2NDAwJiYobz04NjQwMCksYT1vKTooYS09MSwwPT09YSYmdCgpKSxpPTB9LDFlMykudW5yZWYoKSwoKT0+e2krPTF9fShlLGFzeW5jKCk9PntzKCJSYXRlLWxpbWl0IGxpZnRlZC4iKSxhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6ImFsbCJ9KX0sYXN5bmMgZT0+e3MoYFJhdGUtbGltaXQgZXhjZWVkZWQuIERpc2FibGluZyBjYXB0dXJpbmcgb2YgY2F1Z2h0IGV4Y2VwdGlvbnMgZm9yICR7ZX0gc2Vjb25kcy5gKSxhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6InVuY2F1Z2h0In0pfSl9fSkoKS5jYXRjaChlPT57cygiRmFpbGVkIHRvIHN0YXJ0IGRlYnVnZ2VyIixlKX0pLHNldEludGVydmFsKCgpPT57fSwxZTQpOw==';
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjUwLjAgKDc4NWU3NTYpIHwgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdCAqLwppbXBvcnR7U2Vzc2lvbiBhcyBlfWZyb20ibm9kZTppbnNwZWN0b3IvcHJvbWlzZXMiO2ltcG9ydHt3b3JrZXJEYXRhIGFzIHR9ZnJvbSJub2RlOndvcmtlcl90aHJlYWRzIjtjb25zdCBuPWdsb2JhbFRoaXMsaT17fTtjb25zdCBvPSJfX1NFTlRSWV9FUlJPUl9MT0NBTF9WQVJJQUJMRVNfXyI7Y29uc3QgYT10O2Z1bmN0aW9uIHMoLi4uZSl7YS5kZWJ1ZyYmZnVuY3Rpb24oZSl7aWYoISgiY29uc29sZSJpbiBuKSlyZXR1cm4gZSgpO2NvbnN0IHQ9bi5jb25zb2xlLG89e30sYT1PYmplY3Qua2V5cyhpKTthLmZvckVhY2goZT0+e2NvbnN0IG49aVtlXTtvW2VdPXRbZV0sdFtlXT1ufSk7dHJ5e3JldHVybiBlKCl9ZmluYWxseXthLmZvckVhY2goZT0+e3RbZV09b1tlXX0pfX0oKCk9PmNvbnNvbGUubG9nKCJbTG9jYWxWYXJpYWJsZXMgV29ya2VyXSIsLi4uZSkpfWFzeW5jIGZ1bmN0aW9uIGMoZSx0LG4saSl7Y29uc3Qgbz1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOnQsb3duUHJvcGVydGllczohMH0pO2lbbl09by5yZXN1bHQuZmlsdGVyKGU9PiJsZW5ndGgiIT09ZS5uYW1lJiYhaXNOYU4ocGFyc2VJbnQoZS5uYW1lLDEwKSkpLnNvcnQoKGUsdCk9PnBhcnNlSW50KGUubmFtZSwxMCktcGFyc2VJbnQodC5uYW1lLDEwKSkubWFwKGU9PmUudmFsdWU/LnZhbHVlKX1hc3luYyBmdW5jdGlvbiByKGUsdCxuLGkpe2NvbnN0IG89YXdhaXQgZS5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLHtvYmplY3RJZDp0LG93blByb3BlcnRpZXM6ITB9KTtpW25dPW8ucmVzdWx0Lm1hcChlPT5bZS5uYW1lLGUudmFsdWU/LnZhbHVlXSkucmVkdWNlKChlLFt0LG5dKT0+KGVbdF09bixlKSx7fSl9ZnVuY3Rpb24gdShlLHQpe2UudmFsdWUmJigidmFsdWUiaW4gZS52YWx1ZT92b2lkIDA9PT1lLnZhbHVlLnZhbHVlfHxudWxsPT09ZS52YWx1ZS52YWx1ZT90W2UubmFtZV09YDwke2UudmFsdWUudmFsdWV9PmA6dFtlLm5hbWVdPWUudmFsdWUudmFsdWU6ImRlc2NyaXB0aW9uImluIGUudmFsdWUmJiJmdW5jdGlvbiIhPT1lLnZhbHVlLnR5cGU/dFtlLm5hbWVdPWA8JHtlLnZhbHVlLmRlc2NyaXB0aW9ufT5gOiJ1bmRlZmluZWQiPT09ZS52YWx1ZS50eXBlJiYodFtlLm5hbWVdPSI8dW5kZWZpbmVkPiIpKX1hc3luYyBmdW5jdGlvbiBsKGUsdCl7Y29uc3Qgbj1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOnQsb3duUHJvcGVydGllczohMH0pLGk9e307Zm9yKGNvbnN0IHQgb2Ygbi5yZXN1bHQpaWYodC52YWx1ZT8ub2JqZWN0SWQmJiJBcnJheSI9PT10LnZhbHVlLmNsYXNzTmFtZSl7Y29uc3Qgbj10LnZhbHVlLm9iamVjdElkO2F3YWl0IGMoZSxuLHQubmFtZSxpKX1lbHNlIGlmKHQudmFsdWU/Lm9iamVjdElkJiYiT2JqZWN0Ij09PXQudmFsdWUuY2xhc3NOYW1lKXtjb25zdCBuPXQudmFsdWUub2JqZWN0SWQ7YXdhaXQgcihlLG4sdC5uYW1lLGkpfWVsc2UgdC52YWx1ZSYmdSh0LGkpO3JldHVybiBpfWxldCBmOyhhc3luYyBmdW5jdGlvbigpe2NvbnN0IHQ9bmV3IGU7dC5jb25uZWN0VG9NYWluVGhyZWFkKCkscygiQ29ubmVjdGVkIHRvIG1haW4gdGhyZWFkIik7bGV0IG49ITE7dC5vbigiRGVidWdnZXIucmVzdW1lZCIsKCk9PntuPSExfSksdC5vbigiRGVidWdnZXIucGF1c2VkIixlPT57bj0hMCxhc3luYyBmdW5jdGlvbihlLHtyZWFzb246dCxkYXRhOntvYmplY3RJZDpufSxjYWxsRnJhbWVzOml9KXtpZigiZXhjZXB0aW9uIiE9PXQmJiJwcm9taXNlUmVqZWN0aW9uIiE9PXQpcmV0dXJuO2lmKGY/LigpLG51bGw9PW4pcmV0dXJuO2NvbnN0IGE9W107Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0e3Njb3BlQ2hhaW46bixmdW5jdGlvbk5hbWU6byx0aGlzOnN9PWlbdF0sYz1uLmZpbmQoZT0+ImxvY2FsIj09PWUudHlwZSkscj0iZ2xvYmFsIiE9PXMuY2xhc3NOYW1lJiZzLmNsYXNzTmFtZT9gJHtzLmNsYXNzTmFtZX0uJHtvfWA6bztpZih2b2lkIDA9PT1jPy5vYmplY3Qub2JqZWN0SWQpYVt0XT17ZnVuY3Rpb246cn07ZWxzZXtjb25zdCBuPWF3YWl0IGwoZSxjLm9iamVjdC5vYmplY3RJZCk7YVt0XT17ZnVuY3Rpb246cix2YXJzOm59fX1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuY2FsbEZ1bmN0aW9uT24iLHtmdW5jdGlvbkRlY2xhcmF0aW9uOmBmdW5jdGlvbigpIHsgdGhpcy4ke299ID0gdGhpcy4ke299IHx8ICR7SlNPTi5zdHJpbmdpZnkoYSl9OyB9YCxzaWxlbnQ6ITAsb2JqZWN0SWQ6bn0pLGF3YWl0IGUucG9zdCgiUnVudGltZS5yZWxlYXNlT2JqZWN0Iix7b2JqZWN0SWQ6bn0pfSh0LGUucGFyYW1zKS50aGVuKGFzeW5jKCk9PntuJiZhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpfSxhc3luYyBlPT57biYmYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKX0pfSksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5lbmFibGUiKTtjb25zdCBpPSExIT09YS5jYXB0dXJlQWxsRXhjZXB0aW9ucztpZihhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6aT8iYWxsIjoidW5jYXVnaHQifSksaSl7Y29uc3QgZT1hLm1heEV4Y2VwdGlvbnNQZXJTZWNvbmR8fDUwO2Y9ZnVuY3Rpb24oZSx0LG4pe2xldCBpPTAsbz01LGE9MDtyZXR1cm4gc2V0SW50ZXJ2YWwoKCk9PnswPT09YT9pPmUmJihvKj0yLG4obyksbz44NjQwMCYmKG89ODY0MDApLGE9byk6KGEtPTEsMD09PWEmJnQoKSksaT0wfSwxZTMpLnVucmVmKCksKCk9PntpKz0xfX0oZSxhc3luYygpPT57cygiUmF0ZS1saW1pdCBsaWZ0ZWQuIiksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOiJhbGwifSl9LGFzeW5jIGU9PntzKGBSYXRlLWxpbWl0IGV4Y2VlZGVkLiBEaXNhYmxpbmcgY2FwdHVyaW5nIG9mIGNhdWdodCBleGNlcHRpb25zIGZvciAke2V9IHNlY29uZHMuYCksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOiJ1bmNhdWdodCJ9KX0pfX0pKCkuY2F0Y2goZT0+e3MoIkZhaWxlZCB0byBzdGFydCBkZWJ1Z2dlciIsZSl9KSxzZXRJbnRlcnZhbCgoKT0+e30sMWU0KTs=';

@@ -12,0 +12,0 @@ function log(...args) {

@@ -21,2 +21,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const pino = require('../integrations/pino.js');
const console = require('../integrations/console.js');
const api = require('../sdk/api.js');

@@ -57,2 +58,3 @@ const module$1 = require('../utils/module.js');

exports.pinoIntegration = pino.pinoIntegration;
exports.consoleIntegration = console.consoleIntegration;
exports.defaultStackParser = api.defaultStackParser;

@@ -86,3 +88,2 @@ exports.getSentryRelease = api.getSentryRelease;

exports.close = core.close;
exports.consoleIntegration = core.consoleIntegration;
exports.consoleLoggingIntegration = core.consoleLoggingIntegration;

@@ -89,0 +90,0 @@ exports.continueTrace = core.continueTrace;

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}

@@ -14,2 +14,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const spotlight = require('../integrations/spotlight.js');
const console$1 = require('../integrations/console.js');
const systemError = require('../integrations/systemError.js');

@@ -37,3 +38,3 @@ const api = require('../sdk/api.js');

// Native Wrappers
core.consoleIntegration(),
console$1.consoleIntegration(),
httpIntegration.httpIntegration(),

@@ -40,0 +41,0 @@ nativeNodeFetchIntegration.nativeNodeFetchIntegration(),

@@ -1,1 +0,1 @@

{"version":3,"file":"sdk.js","sources":["../../../src/light/sdk.ts"],"sourcesContent":["import type { Integration, Options } from '@sentry/core';\nimport {\n applySdkMetadata,\n consoleIntegration,\n consoleSandbox,\n debug,\n envToBool,\n eventFiltersIntegration,\n functionToStringIntegration,\n getCurrentScope,\n getIntegrationsToSetup,\n linkedErrorsIntegration,\n propagationContextFromHeaders,\n requestDataIntegration,\n spanStreamingIntegration,\n stackParserFromStackParserOptions,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { childProcessIntegration } from '../integrations/childProcess';\nimport { nodeContextIntegration } from '../integrations/context';\nimport { contextLinesIntegration } from '../integrations/contextlines';\nimport { localVariablesIntegration } from '../integrations/local-variables';\nimport { modulesIntegration } from '../integrations/modules';\nimport { onUncaughtExceptionIntegration } from '../integrations/onuncaughtexception';\nimport { onUnhandledRejectionIntegration } from '../integrations/onunhandledrejection';\nimport { processSessionIntegration } from '../integrations/processSession';\nimport { INTEGRATION_NAME as SPOTLIGHT_INTEGRATION_NAME, spotlightIntegration } from '../integrations/spotlight';\nimport { systemErrorIntegration } from '../integrations/systemError';\nimport { defaultStackParser, getSentryRelease } from '../sdk/api';\nimport { makeNodeTransport } from '../transports';\nimport type { NodeClientOptions, NodeOptions } from '../types';\nimport { isCjs } from '../utils/detection';\nimport { getSpotlightConfig } from '../utils/spotlight';\nimport { setAsyncLocalStorageAsyncContextStrategy } from './asyncLocalStorageStrategy';\nimport { LightNodeClient } from './client';\nimport { httpIntegration } from './integrations/httpIntegration';\nimport { nativeNodeFetchIntegration } from './integrations/nativeNodeFetchIntegration';\n\n/**\n * Get default integrations for the Light Node-Core SDK.\n */\nexport function getDefaultIntegrations(): Integration[] {\n return [\n // Common\n eventFiltersIntegration(),\n functionToStringIntegration(),\n linkedErrorsIntegration(),\n requestDataIntegration(),\n systemErrorIntegration(),\n // Native Wrappers\n consoleIntegration(),\n httpIntegration(),\n nativeNodeFetchIntegration(),\n // Global Handlers\n onUncaughtExceptionIntegration(),\n onUnhandledRejectionIntegration(),\n // Event Info\n contextLinesIntegration(),\n localVariablesIntegration(),\n nodeContextIntegration(),\n childProcessIntegration(),\n processSessionIntegration(),\n modulesIntegration(),\n ];\n}\n\n/**\n * Initialize Sentry for Node in light mode (without OpenTelemetry).\n */\nexport function init(options: NodeOptions | undefined = {}): LightNodeClient | undefined {\n return _init(options, getDefaultIntegrations);\n}\n\n/**\n * Initialize Sentry for Node in light mode, without any integrations added by default.\n */\nexport function initWithoutDefaultIntegrations(options: NodeOptions | undefined = {}): LightNodeClient {\n return _init(options, () => []);\n}\n\n/**\n * Initialize Sentry for Node in light mode.\n */\nfunction _init(\n _options: NodeOptions | undefined = {},\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): LightNodeClient {\n const options = getClientOptions(_options, getDefaultIntegrationsImpl);\n\n if (options.debug === true) {\n if (DEBUG_BUILD) {\n debug.enable();\n } else {\n // use `console.warn` rather than `debug.warn` since by non-debug bundles have all `debug.x` statements stripped\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n });\n }\n }\n\n // Use AsyncLocalStorage-based context strategy instead of OpenTelemetry\n setAsyncLocalStorageAsyncContextStrategy();\n\n const scope = getCurrentScope();\n scope.update(options.initialScope);\n\n if (options.spotlight && !options.integrations.some(({ name }) => name === SPOTLIGHT_INTEGRATION_NAME)) {\n options.integrations.push(\n spotlightIntegration({\n sidecarUrl: typeof options.spotlight === 'string' ? options.spotlight : undefined,\n }),\n );\n }\n\n applySdkMetadata(options, 'node-light', ['node-core']);\n\n const client = new LightNodeClient(options);\n // The client is on the current scope, from where it generally is inherited\n getCurrentScope().setClient(client);\n\n client.init();\n\n debug.log(`SDK initialized from ${isCjs() ? 'CommonJS' : 'ESM'} (light mode)`);\n\n client.startClientReportTracking();\n\n updateScopeFromEnvVariables();\n\n // Ensure we flush events when vercel functions are ended\n // See: https://vercel.com/docs/functions/functions-api-reference#sigterm-signal\n if (process.env.VERCEL) {\n process.on('SIGTERM', async () => {\n // We have 500ms for processing here, so we try to make sure to have enough time to send the events\n await client.flush(200);\n });\n }\n\n return client;\n}\n\nfunction getClientOptions(\n options: NodeOptions,\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClientOptions {\n const release = getRelease(options.release);\n const spotlight = getSpotlightConfig(options.spotlight);\n const tracesSampleRate = getTracesSampleRate(options.tracesSampleRate);\n\n const mergedOptions = {\n ...options,\n dsn: options.dsn ?? process.env.SENTRY_DSN,\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT,\n sendClientReports: options.sendClientReports ?? true,\n transport: options.transport ?? makeNodeTransport,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n release,\n tracesSampleRate,\n spotlight,\n debug: envToBool(options.debug ?? process.env.SENTRY_DEBUG),\n };\n\n const integrations = options.integrations;\n const defaultIntegrations = options.defaultIntegrations ?? getDefaultIntegrationsImpl(mergedOptions);\n\n const resolvedIntegrations = getIntegrationsToSetup({\n defaultIntegrations,\n integrations,\n });\n\n if (mergedOptions.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) {\n resolvedIntegrations.push(spanStreamingIntegration());\n }\n\n return {\n ...mergedOptions,\n integrations: resolvedIntegrations,\n };\n}\n\nfunction getRelease(release: NodeOptions['release']): string | undefined {\n if (release !== undefined) {\n return release;\n }\n\n const detectedRelease = getSentryRelease();\n if (detectedRelease !== undefined) {\n return detectedRelease;\n }\n\n return undefined;\n}\n\nfunction getTracesSampleRate(tracesSampleRate: NodeOptions['tracesSampleRate']): number | undefined {\n if (tracesSampleRate !== undefined) {\n return tracesSampleRate;\n }\n\n const sampleRateFromEnv = process.env.SENTRY_TRACES_SAMPLE_RATE;\n if (!sampleRateFromEnv) {\n return undefined;\n }\n\n const parsed = parseFloat(sampleRateFromEnv);\n return isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Update scope and propagation context based on environmental variables.\n *\n * See https://github.com/getsentry/rfcs/blob/main/text/0071-continue-trace-over-process-boundaries.md\n * for more details.\n */\nfunction updateScopeFromEnvVariables(): void {\n if (envToBool(process.env.SENTRY_USE_ENVIRONMENT) !== false) {\n const sentryTraceEnv = process.env.SENTRY_TRACE;\n const baggageEnv = process.env.SENTRY_BAGGAGE;\n const propagationContext = propagationContextFromHeaders(sentryTraceEnv, baggageEnv);\n getCurrentScope().setPropagationContext(propagationContext);\n }\n}\n"],"names":["eventFiltersIntegration","functionToStringIntegration","linkedErrorsIntegration","requestDataIntegration","systemErrorIntegration","consoleIntegration","httpIntegration","nativeNodeFetchIntegration","onUncaughtExceptionIntegration","onUnhandledRejectionIntegration","contextLinesIntegration","localVariablesIntegration","nodeContextIntegration","childProcessIntegration","processSessionIntegration","modulesIntegration","DEBUG_BUILD","debug","consoleSandbox","setAsyncLocalStorageAsyncContextStrategy","getCurrentScope","SPOTLIGHT_INTEGRATION_NAME","spotlightIntegration","applySdkMetadata","client","LightNodeClient","isCjs","getSpotlightConfig","makeNodeTransport","stackParserFromStackParserOptions","defaultStackParser","envToBool","getIntegrationsToSetup","spanStreamingIntegration","getSentryRelease","propagationContextFromHeaders"],"mappings":"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"}
{"version":3,"file":"sdk.js","sources":["../../../src/light/sdk.ts"],"sourcesContent":["import type { Integration, Options } from '@sentry/core';\nimport {\n applySdkMetadata,\n consoleSandbox,\n debug,\n envToBool,\n eventFiltersIntegration,\n functionToStringIntegration,\n getCurrentScope,\n getIntegrationsToSetup,\n linkedErrorsIntegration,\n propagationContextFromHeaders,\n requestDataIntegration,\n spanStreamingIntegration,\n stackParserFromStackParserOptions,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { childProcessIntegration } from '../integrations/childProcess';\nimport { nodeContextIntegration } from '../integrations/context';\nimport { contextLinesIntegration } from '../integrations/contextlines';\nimport { localVariablesIntegration } from '../integrations/local-variables';\nimport { modulesIntegration } from '../integrations/modules';\nimport { onUncaughtExceptionIntegration } from '../integrations/onuncaughtexception';\nimport { onUnhandledRejectionIntegration } from '../integrations/onunhandledrejection';\nimport { processSessionIntegration } from '../integrations/processSession';\nimport { INTEGRATION_NAME as SPOTLIGHT_INTEGRATION_NAME, spotlightIntegration } from '../integrations/spotlight';\nimport { consoleIntegration } from '../integrations/console';\nimport { systemErrorIntegration } from '../integrations/systemError';\nimport { defaultStackParser, getSentryRelease } from '../sdk/api';\nimport { makeNodeTransport } from '../transports';\nimport type { NodeClientOptions, NodeOptions } from '../types';\nimport { isCjs } from '../utils/detection';\nimport { getSpotlightConfig } from '../utils/spotlight';\nimport { setAsyncLocalStorageAsyncContextStrategy } from './asyncLocalStorageStrategy';\nimport { LightNodeClient } from './client';\nimport { httpIntegration } from './integrations/httpIntegration';\nimport { nativeNodeFetchIntegration } from './integrations/nativeNodeFetchIntegration';\n\n/**\n * Get default integrations for the Light Node-Core SDK.\n */\nexport function getDefaultIntegrations(): Integration[] {\n return [\n // Common\n eventFiltersIntegration(),\n functionToStringIntegration(),\n linkedErrorsIntegration(),\n requestDataIntegration(),\n systemErrorIntegration(),\n // Native Wrappers\n consoleIntegration(),\n httpIntegration(),\n nativeNodeFetchIntegration(),\n // Global Handlers\n onUncaughtExceptionIntegration(),\n onUnhandledRejectionIntegration(),\n // Event Info\n contextLinesIntegration(),\n localVariablesIntegration(),\n nodeContextIntegration(),\n childProcessIntegration(),\n processSessionIntegration(),\n modulesIntegration(),\n ];\n}\n\n/**\n * Initialize Sentry for Node in light mode (without OpenTelemetry).\n */\nexport function init(options: NodeOptions | undefined = {}): LightNodeClient | undefined {\n return _init(options, getDefaultIntegrations);\n}\n\n/**\n * Initialize Sentry for Node in light mode, without any integrations added by default.\n */\nexport function initWithoutDefaultIntegrations(options: NodeOptions | undefined = {}): LightNodeClient {\n return _init(options, () => []);\n}\n\n/**\n * Initialize Sentry for Node in light mode.\n */\nfunction _init(\n _options: NodeOptions | undefined = {},\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): LightNodeClient {\n const options = getClientOptions(_options, getDefaultIntegrationsImpl);\n\n if (options.debug === true) {\n if (DEBUG_BUILD) {\n debug.enable();\n } else {\n // use `console.warn` rather than `debug.warn` since by non-debug bundles have all `debug.x` statements stripped\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n });\n }\n }\n\n // Use AsyncLocalStorage-based context strategy instead of OpenTelemetry\n setAsyncLocalStorageAsyncContextStrategy();\n\n const scope = getCurrentScope();\n scope.update(options.initialScope);\n\n if (options.spotlight && !options.integrations.some(({ name }) => name === SPOTLIGHT_INTEGRATION_NAME)) {\n options.integrations.push(\n spotlightIntegration({\n sidecarUrl: typeof options.spotlight === 'string' ? options.spotlight : undefined,\n }),\n );\n }\n\n applySdkMetadata(options, 'node-light', ['node-core']);\n\n const client = new LightNodeClient(options);\n // The client is on the current scope, from where it generally is inherited\n getCurrentScope().setClient(client);\n\n client.init();\n\n debug.log(`SDK initialized from ${isCjs() ? 'CommonJS' : 'ESM'} (light mode)`);\n\n client.startClientReportTracking();\n\n updateScopeFromEnvVariables();\n\n // Ensure we flush events when vercel functions are ended\n // See: https://vercel.com/docs/functions/functions-api-reference#sigterm-signal\n if (process.env.VERCEL) {\n process.on('SIGTERM', async () => {\n // We have 500ms for processing here, so we try to make sure to have enough time to send the events\n await client.flush(200);\n });\n }\n\n return client;\n}\n\nfunction getClientOptions(\n options: NodeOptions,\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClientOptions {\n const release = getRelease(options.release);\n const spotlight = getSpotlightConfig(options.spotlight);\n const tracesSampleRate = getTracesSampleRate(options.tracesSampleRate);\n\n const mergedOptions = {\n ...options,\n dsn: options.dsn ?? process.env.SENTRY_DSN,\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT,\n sendClientReports: options.sendClientReports ?? true,\n transport: options.transport ?? makeNodeTransport,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n release,\n tracesSampleRate,\n spotlight,\n debug: envToBool(options.debug ?? process.env.SENTRY_DEBUG),\n };\n\n const integrations = options.integrations;\n const defaultIntegrations = options.defaultIntegrations ?? getDefaultIntegrationsImpl(mergedOptions);\n\n const resolvedIntegrations = getIntegrationsToSetup({\n defaultIntegrations,\n integrations,\n });\n\n if (mergedOptions.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) {\n resolvedIntegrations.push(spanStreamingIntegration());\n }\n\n return {\n ...mergedOptions,\n integrations: resolvedIntegrations,\n };\n}\n\nfunction getRelease(release: NodeOptions['release']): string | undefined {\n if (release !== undefined) {\n return release;\n }\n\n const detectedRelease = getSentryRelease();\n if (detectedRelease !== undefined) {\n return detectedRelease;\n }\n\n return undefined;\n}\n\nfunction getTracesSampleRate(tracesSampleRate: NodeOptions['tracesSampleRate']): number | undefined {\n if (tracesSampleRate !== undefined) {\n return tracesSampleRate;\n }\n\n const sampleRateFromEnv = process.env.SENTRY_TRACES_SAMPLE_RATE;\n if (!sampleRateFromEnv) {\n return undefined;\n }\n\n const parsed = parseFloat(sampleRateFromEnv);\n return isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Update scope and propagation context based on environmental variables.\n *\n * See https://github.com/getsentry/rfcs/blob/main/text/0071-continue-trace-over-process-boundaries.md\n * for more details.\n */\nfunction updateScopeFromEnvVariables(): void {\n if (envToBool(process.env.SENTRY_USE_ENVIRONMENT) !== false) {\n const sentryTraceEnv = process.env.SENTRY_TRACE;\n const baggageEnv = process.env.SENTRY_BAGGAGE;\n const propagationContext = propagationContextFromHeaders(sentryTraceEnv, baggageEnv);\n getCurrentScope().setPropagationContext(propagationContext);\n }\n}\n"],"names":["eventFiltersIntegration","functionToStringIntegration","linkedErrorsIntegration","requestDataIntegration","systemErrorIntegration","consoleIntegration","httpIntegration","nativeNodeFetchIntegration","onUncaughtExceptionIntegration","onUnhandledRejectionIntegration","contextLinesIntegration","localVariablesIntegration","nodeContextIntegration","childProcessIntegration","processSessionIntegration","modulesIntegration","DEBUG_BUILD","debug","consoleSandbox","setAsyncLocalStorageAsyncContextStrategy","getCurrentScope","SPOTLIGHT_INTEGRATION_NAME","spotlightIntegration","applySdkMetadata","client","LightNodeClient","isCjs","getSpotlightConfig","makeNodeTransport","stackParserFromStackParserOptions","defaultStackParser","envToBool","getIntegrationsToSetup","spanStreamingIntegration","getSentryRelease","propagationContextFromHeaders"],"mappings":"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"}

@@ -17,2 +17,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const spotlight = require('../integrations/spotlight.js');
const console$1 = require('../integrations/console.js');
const systemError = require('../integrations/systemError.js');

@@ -41,3 +42,3 @@ const http = require('../transports/http.js');

// Native Wrappers
core.consoleIntegration(),
console$1.consoleIntegration(),
index.httpIntegration(),

@@ -44,0 +45,0 @@ index$1.nativeNodeFetchIntegration(),

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../../../src/sdk/index.ts"],"sourcesContent":["import type { Integration, Options } from '@sentry/core';\nimport {\n applySdkMetadata,\n consoleIntegration,\n consoleSandbox,\n conversationIdIntegration,\n debug,\n envToBool,\n functionToStringIntegration,\n getCurrentScope,\n getIntegrationsToSetup,\n hasSpansEnabled,\n inboundFiltersIntegration,\n linkedErrorsIntegration,\n propagationContextFromHeaders,\n requestDataIntegration,\n spanStreamingIntegration,\n stackParserFromStackParserOptions,\n} from '@sentry/core';\nimport {\n enhanceDscWithOpenTelemetryRootSpanName,\n openTelemetrySetupCheck,\n setOpenTelemetryContextAsyncContextStrategy,\n setupEventContextTrace,\n} from '@sentry/opentelemetry';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { childProcessIntegration } from '../integrations/childProcess';\nimport { nodeContextIntegration } from '../integrations/context';\nimport { contextLinesIntegration } from '../integrations/contextlines';\nimport { httpIntegration } from '../integrations/http';\nimport { localVariablesIntegration } from '../integrations/local-variables';\nimport { modulesIntegration } from '../integrations/modules';\nimport { nativeNodeFetchIntegration } from '../integrations/node-fetch';\nimport { onUncaughtExceptionIntegration } from '../integrations/onuncaughtexception';\nimport { onUnhandledRejectionIntegration } from '../integrations/onunhandledrejection';\nimport { processSessionIntegration } from '../integrations/processSession';\nimport { INTEGRATION_NAME as SPOTLIGHT_INTEGRATION_NAME, spotlightIntegration } from '../integrations/spotlight';\nimport { systemErrorIntegration } from '../integrations/systemError';\nimport { makeNodeTransport } from '../transports';\nimport type { NodeClientOptions, NodeOptions } from '../types';\nimport { isCjs } from '../utils/detection';\nimport { getSpotlightConfig } from '../utils/spotlight';\nimport { defaultStackParser, getSentryRelease } from './api';\nimport { NodeClient } from './client';\nimport { initializeEsmLoader } from './esmLoader';\n\n/**\n * Get default integrations for the Node-Core SDK.\n */\nexport function getDefaultIntegrations(): Integration[] {\n return [\n // Common\n // TODO(v11): Replace with `eventFiltersIntegration` once we remove the deprecated `inboundFiltersIntegration`\n // eslint-disable-next-line deprecation/deprecation\n inboundFiltersIntegration(),\n functionToStringIntegration(),\n linkedErrorsIntegration(),\n requestDataIntegration(),\n systemErrorIntegration(),\n conversationIdIntegration(),\n // Native Wrappers\n consoleIntegration(),\n httpIntegration(),\n nativeNodeFetchIntegration(),\n // Global Handlers\n onUncaughtExceptionIntegration(),\n onUnhandledRejectionIntegration(),\n // Event Info\n contextLinesIntegration(),\n localVariablesIntegration(),\n nodeContextIntegration(),\n childProcessIntegration(),\n processSessionIntegration(),\n modulesIntegration(),\n ];\n}\n\n/**\n * Initialize Sentry for Node.\n */\nexport function init(options: NodeOptions | undefined = {}): NodeClient | undefined {\n return _init(options, getDefaultIntegrations);\n}\n\n/**\n * Initialize Sentry for Node, without any integrations added by default.\n */\nexport function initWithoutDefaultIntegrations(options: NodeOptions | undefined = {}): NodeClient {\n return _init(options, () => []);\n}\n\n/**\n * Initialize Sentry for Node, without performance instrumentation.\n */\nfunction _init(\n _options: NodeOptions | undefined = {},\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClient {\n const options = getClientOptions(_options, getDefaultIntegrationsImpl);\n\n if (options.debug === true) {\n if (DEBUG_BUILD) {\n debug.enable();\n } else {\n // use `console.warn` rather than `debug.warn` since by non-debug bundles have all `debug.x` statements stripped\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n });\n }\n }\n\n if (options.registerEsmLoaderHooks !== false) {\n initializeEsmLoader();\n }\n\n setOpenTelemetryContextAsyncContextStrategy();\n\n const scope = getCurrentScope();\n scope.update(options.initialScope);\n\n if (options.spotlight && !options.integrations.some(({ name }) => name === SPOTLIGHT_INTEGRATION_NAME)) {\n options.integrations.push(\n spotlightIntegration({\n sidecarUrl: typeof options.spotlight === 'string' ? options.spotlight : undefined,\n }),\n );\n }\n\n applySdkMetadata(options, 'node-core');\n\n const client = new NodeClient(options);\n // The client is on the current scope, from where it generally is inherited\n getCurrentScope().setClient(client);\n\n client.init();\n\n debug.log(`SDK initialized from ${isCjs() ? 'CommonJS' : 'ESM'}`);\n\n client.startClientReportTracking();\n\n updateScopeFromEnvVariables();\n\n enhanceDscWithOpenTelemetryRootSpanName(client);\n setupEventContextTrace(client);\n\n // Ensure we flush events when vercel functions are ended\n // See: https://vercel.com/docs/functions/functions-api-reference#sigterm-signal\n if (process.env.VERCEL) {\n process.on('SIGTERM', async () => {\n // We have 500ms for processing here, so we try to make sure to have enough time to send the events\n await client.flush(200);\n });\n }\n\n return client;\n}\n\n/**\n * Validate that your OpenTelemetry setup is correct.\n */\nexport function validateOpenTelemetrySetup(): void {\n if (!DEBUG_BUILD) {\n return;\n }\n\n const setup = openTelemetrySetupCheck();\n\n const required: ReturnType<typeof openTelemetrySetupCheck> = ['SentryContextManager', 'SentryPropagator'];\n\n if (hasSpansEnabled()) {\n required.push('SentrySpanProcessor');\n }\n\n for (const k of required) {\n if (!setup.includes(k)) {\n debug.error(\n `You have to set up the ${k}. Without this, the OpenTelemetry & Sentry integration will not work properly.`,\n );\n }\n }\n\n if (!setup.includes('SentrySampler')) {\n debug.warn(\n 'You have to set up the SentrySampler. Without this, the OpenTelemetry & Sentry integration may still work, but sample rates set for the Sentry SDK will not be respected. If you use a custom sampler, make sure to use `wrapSamplingDecision`.',\n );\n }\n}\n\nfunction getClientOptions(\n options: NodeOptions,\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClientOptions {\n const release = getRelease(options.release);\n\n const spotlight = getSpotlightConfig(options.spotlight);\n\n const tracesSampleRate = getTracesSampleRate(options.tracesSampleRate);\n\n const mergedOptions = {\n ...options,\n dsn: options.dsn ?? process.env.SENTRY_DSN,\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT,\n sendClientReports: options.sendClientReports ?? true,\n transport: options.transport ?? makeNodeTransport,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n release,\n tracesSampleRate,\n spotlight,\n debug: envToBool(options.debug ?? process.env.SENTRY_DEBUG),\n };\n\n const integrations = options.integrations;\n const defaultIntegrations = options.defaultIntegrations ?? getDefaultIntegrationsImpl(mergedOptions);\n\n const resolvedIntegrations = getIntegrationsToSetup({\n defaultIntegrations,\n integrations,\n });\n\n if (mergedOptions.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) {\n resolvedIntegrations.push(spanStreamingIntegration());\n }\n\n return {\n ...mergedOptions,\n integrations: resolvedIntegrations,\n };\n}\n\nfunction getRelease(release: NodeOptions['release']): string | undefined {\n if (release !== undefined) {\n return release;\n }\n\n const detectedRelease = getSentryRelease();\n if (detectedRelease !== undefined) {\n return detectedRelease;\n }\n\n return undefined;\n}\n\nfunction getTracesSampleRate(tracesSampleRate: NodeOptions['tracesSampleRate']): number | undefined {\n if (tracesSampleRate !== undefined) {\n return tracesSampleRate;\n }\n\n const sampleRateFromEnv = process.env.SENTRY_TRACES_SAMPLE_RATE;\n if (!sampleRateFromEnv) {\n return undefined;\n }\n\n const parsed = parseFloat(sampleRateFromEnv);\n return isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Update scope and propagation context based on environmental variables.\n *\n * See https://github.com/getsentry/rfcs/blob/main/text/0071-continue-trace-over-process-boundaries.md\n * for more details.\n */\nfunction updateScopeFromEnvVariables(): void {\n if (envToBool(process.env.SENTRY_USE_ENVIRONMENT) !== false) {\n const sentryTraceEnv = process.env.SENTRY_TRACE;\n const baggageEnv = process.env.SENTRY_BAGGAGE;\n const propagationContext = propagationContextFromHeaders(sentryTraceEnv, baggageEnv);\n getCurrentScope().setPropagationContext(propagationContext);\n }\n}\n"],"names":["inboundFiltersIntegration","functionToStringIntegration","linkedErrorsIntegration","requestDataIntegration","systemErrorIntegration","conversationIdIntegration","consoleIntegration","httpIntegration","nativeNodeFetchIntegration","onUncaughtExceptionIntegration","onUnhandledRejectionIntegration","contextLinesIntegration","localVariablesIntegration","nodeContextIntegration","childProcessIntegration","processSessionIntegration","modulesIntegration","DEBUG_BUILD","debug","consoleSandbox","initializeEsmLoader","setOpenTelemetryContextAsyncContextStrategy","getCurrentScope","SPOTLIGHT_INTEGRATION_NAME","spotlightIntegration","applySdkMetadata","client","NodeClient","isCjs","enhanceDscWithOpenTelemetryRootSpanName","setupEventContextTrace","openTelemetrySetupCheck","hasSpansEnabled","getSpotlightConfig","makeNodeTransport","stackParserFromStackParserOptions","defaultStackParser","envToBool","getIntegrationsToSetup","spanStreamingIntegration","getSentryRelease","propagationContextFromHeaders"],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../../../src/sdk/index.ts"],"sourcesContent":["import type { Integration, Options } from '@sentry/core';\nimport {\n applySdkMetadata,\n consoleSandbox,\n conversationIdIntegration,\n debug,\n envToBool,\n functionToStringIntegration,\n getCurrentScope,\n getIntegrationsToSetup,\n hasSpansEnabled,\n inboundFiltersIntegration,\n linkedErrorsIntegration,\n propagationContextFromHeaders,\n requestDataIntegration,\n spanStreamingIntegration,\n stackParserFromStackParserOptions,\n} from '@sentry/core';\nimport {\n enhanceDscWithOpenTelemetryRootSpanName,\n openTelemetrySetupCheck,\n setOpenTelemetryContextAsyncContextStrategy,\n setupEventContextTrace,\n} from '@sentry/opentelemetry';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { childProcessIntegration } from '../integrations/childProcess';\nimport { nodeContextIntegration } from '../integrations/context';\nimport { contextLinesIntegration } from '../integrations/contextlines';\nimport { httpIntegration } from '../integrations/http';\nimport { localVariablesIntegration } from '../integrations/local-variables';\nimport { modulesIntegration } from '../integrations/modules';\nimport { nativeNodeFetchIntegration } from '../integrations/node-fetch';\nimport { onUncaughtExceptionIntegration } from '../integrations/onuncaughtexception';\nimport { onUnhandledRejectionIntegration } from '../integrations/onunhandledrejection';\nimport { processSessionIntegration } from '../integrations/processSession';\nimport { INTEGRATION_NAME as SPOTLIGHT_INTEGRATION_NAME, spotlightIntegration } from '../integrations/spotlight';\nimport { consoleIntegration } from '../integrations/console';\nimport { systemErrorIntegration } from '../integrations/systemError';\nimport { makeNodeTransport } from '../transports';\nimport type { NodeClientOptions, NodeOptions } from '../types';\nimport { isCjs } from '../utils/detection';\nimport { getSpotlightConfig } from '../utils/spotlight';\nimport { defaultStackParser, getSentryRelease } from './api';\nimport { NodeClient } from './client';\nimport { initializeEsmLoader } from './esmLoader';\n\n/**\n * Get default integrations for the Node-Core SDK.\n */\nexport function getDefaultIntegrations(): Integration[] {\n return [\n // Common\n // TODO(v11): Replace with `eventFiltersIntegration` once we remove the deprecated `inboundFiltersIntegration`\n // eslint-disable-next-line deprecation/deprecation\n inboundFiltersIntegration(),\n functionToStringIntegration(),\n linkedErrorsIntegration(),\n requestDataIntegration(),\n systemErrorIntegration(),\n conversationIdIntegration(),\n // Native Wrappers\n consoleIntegration(),\n httpIntegration(),\n nativeNodeFetchIntegration(),\n // Global Handlers\n onUncaughtExceptionIntegration(),\n onUnhandledRejectionIntegration(),\n // Event Info\n contextLinesIntegration(),\n localVariablesIntegration(),\n nodeContextIntegration(),\n childProcessIntegration(),\n processSessionIntegration(),\n modulesIntegration(),\n ];\n}\n\n/**\n * Initialize Sentry for Node.\n */\nexport function init(options: NodeOptions | undefined = {}): NodeClient | undefined {\n return _init(options, getDefaultIntegrations);\n}\n\n/**\n * Initialize Sentry for Node, without any integrations added by default.\n */\nexport function initWithoutDefaultIntegrations(options: NodeOptions | undefined = {}): NodeClient {\n return _init(options, () => []);\n}\n\n/**\n * Initialize Sentry for Node, without performance instrumentation.\n */\nfunction _init(\n _options: NodeOptions | undefined = {},\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClient {\n const options = getClientOptions(_options, getDefaultIntegrationsImpl);\n\n if (options.debug === true) {\n if (DEBUG_BUILD) {\n debug.enable();\n } else {\n // use `console.warn` rather than `debug.warn` since by non-debug bundles have all `debug.x` statements stripped\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n });\n }\n }\n\n if (options.registerEsmLoaderHooks !== false) {\n initializeEsmLoader();\n }\n\n setOpenTelemetryContextAsyncContextStrategy();\n\n const scope = getCurrentScope();\n scope.update(options.initialScope);\n\n if (options.spotlight && !options.integrations.some(({ name }) => name === SPOTLIGHT_INTEGRATION_NAME)) {\n options.integrations.push(\n spotlightIntegration({\n sidecarUrl: typeof options.spotlight === 'string' ? options.spotlight : undefined,\n }),\n );\n }\n\n applySdkMetadata(options, 'node-core');\n\n const client = new NodeClient(options);\n // The client is on the current scope, from where it generally is inherited\n getCurrentScope().setClient(client);\n\n client.init();\n\n debug.log(`SDK initialized from ${isCjs() ? 'CommonJS' : 'ESM'}`);\n\n client.startClientReportTracking();\n\n updateScopeFromEnvVariables();\n\n enhanceDscWithOpenTelemetryRootSpanName(client);\n setupEventContextTrace(client);\n\n // Ensure we flush events when vercel functions are ended\n // See: https://vercel.com/docs/functions/functions-api-reference#sigterm-signal\n if (process.env.VERCEL) {\n process.on('SIGTERM', async () => {\n // We have 500ms for processing here, so we try to make sure to have enough time to send the events\n await client.flush(200);\n });\n }\n\n return client;\n}\n\n/**\n * Validate that your OpenTelemetry setup is correct.\n */\nexport function validateOpenTelemetrySetup(): void {\n if (!DEBUG_BUILD) {\n return;\n }\n\n const setup = openTelemetrySetupCheck();\n\n const required: ReturnType<typeof openTelemetrySetupCheck> = ['SentryContextManager', 'SentryPropagator'];\n\n if (hasSpansEnabled()) {\n required.push('SentrySpanProcessor');\n }\n\n for (const k of required) {\n if (!setup.includes(k)) {\n debug.error(\n `You have to set up the ${k}. Without this, the OpenTelemetry & Sentry integration will not work properly.`,\n );\n }\n }\n\n if (!setup.includes('SentrySampler')) {\n debug.warn(\n 'You have to set up the SentrySampler. Without this, the OpenTelemetry & Sentry integration may still work, but sample rates set for the Sentry SDK will not be respected. If you use a custom sampler, make sure to use `wrapSamplingDecision`.',\n );\n }\n}\n\nfunction getClientOptions(\n options: NodeOptions,\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClientOptions {\n const release = getRelease(options.release);\n\n const spotlight = getSpotlightConfig(options.spotlight);\n\n const tracesSampleRate = getTracesSampleRate(options.tracesSampleRate);\n\n const mergedOptions = {\n ...options,\n dsn: options.dsn ?? process.env.SENTRY_DSN,\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT,\n sendClientReports: options.sendClientReports ?? true,\n transport: options.transport ?? makeNodeTransport,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n release,\n tracesSampleRate,\n spotlight,\n debug: envToBool(options.debug ?? process.env.SENTRY_DEBUG),\n };\n\n const integrations = options.integrations;\n const defaultIntegrations = options.defaultIntegrations ?? getDefaultIntegrationsImpl(mergedOptions);\n\n const resolvedIntegrations = getIntegrationsToSetup({\n defaultIntegrations,\n integrations,\n });\n\n if (mergedOptions.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) {\n resolvedIntegrations.push(spanStreamingIntegration());\n }\n\n return {\n ...mergedOptions,\n integrations: resolvedIntegrations,\n };\n}\n\nfunction getRelease(release: NodeOptions['release']): string | undefined {\n if (release !== undefined) {\n return release;\n }\n\n const detectedRelease = getSentryRelease();\n if (detectedRelease !== undefined) {\n return detectedRelease;\n }\n\n return undefined;\n}\n\nfunction getTracesSampleRate(tracesSampleRate: NodeOptions['tracesSampleRate']): number | undefined {\n if (tracesSampleRate !== undefined) {\n return tracesSampleRate;\n }\n\n const sampleRateFromEnv = process.env.SENTRY_TRACES_SAMPLE_RATE;\n if (!sampleRateFromEnv) {\n return undefined;\n }\n\n const parsed = parseFloat(sampleRateFromEnv);\n return isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Update scope and propagation context based on environmental variables.\n *\n * See https://github.com/getsentry/rfcs/blob/main/text/0071-continue-trace-over-process-boundaries.md\n * for more details.\n */\nfunction updateScopeFromEnvVariables(): void {\n if (envToBool(process.env.SENTRY_USE_ENVIRONMENT) !== false) {\n const sentryTraceEnv = process.env.SENTRY_TRACE;\n const baggageEnv = process.env.SENTRY_BAGGAGE;\n const propagationContext = propagationContextFromHeaders(sentryTraceEnv, baggageEnv);\n getCurrentScope().setPropagationContext(propagationContext);\n }\n}\n"],"names":["inboundFiltersIntegration","functionToStringIntegration","linkedErrorsIntegration","requestDataIntegration","systemErrorIntegration","conversationIdIntegration","consoleIntegration","httpIntegration","nativeNodeFetchIntegration","onUncaughtExceptionIntegration","onUnhandledRejectionIntegration","contextLinesIntegration","localVariablesIntegration","nodeContextIntegration","childProcessIntegration","processSessionIntegration","modulesIntegration","DEBUG_BUILD","debug","consoleSandbox","initializeEsmLoader","setOpenTelemetryContextAsyncContextStrategy","getCurrentScope","SPOTLIGHT_INTEGRATION_NAME","spotlightIntegration","applySdkMetadata","client","NodeClient","isCjs","enhanceDscWithOpenTelemetryRootSpanName","setupEventContextTrace","openTelemetrySetupCheck","hasSpansEnabled","getSpotlightConfig","makeNodeTransport","stackParserFromStackParserOptions","defaultStackParser","envToBool","getIntegrationsToSetup","spanStreamingIntegration","getSentryRelease","propagationContextFromHeaders"],"mappings":"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"}

@@ -37,3 +37,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const requestHeaders = Array.isArray(request.headers) ? request.headers : stringToArrayHeaders(request.headers);
// Undici can expose headers either as a raw string (v5-style) or as a flat array of pairs (v6-style).
// In the array form, even indices are header names and odd indices are values; in undici v6 a value
// may be `string | string[]` when a header has multiple values. The helpers below (_deduplicateArrayHeader,
// push, etc.) expect each value slot to be a single string, so we normalize array headers first.
const requestHeaders = Array.isArray(request.headers)
? normalizeUndiciHeaderPairs(request.headers)
: stringToArrayHeaders(request.headers);

@@ -80,4 +86,7 @@ // OTel's UndiciInstrumentation calls propagation.inject() which unconditionally

if (!Array.isArray(request.headers)) {
// For original string request headers, we need to write them back to the request
if (Array.isArray(request.headers)) {
// Replace contents in place so we keep the same array reference undici/fetch still holds.
// `requestHeaders` is already normalized (string pairs only); splice writes them back.
request.headers.splice(0, request.headers.length, ...requestHeaders);
} else {
request.headers = arrayToStringHeaders(requestHeaders);

@@ -87,2 +96,24 @@ }

/**
* Convert undici’s header array into `[name, value, name, value, ...]` where every value is a string.
*
* Undici v6 uses this shape: `[k1, v1, k2, v2, ...]`. Types allow each `v` to be `string | string[]` when
* that header has multiple values. Sentry’s dedupe/merge helpers expect one string per value slot, so
* multi-value arrays are joined with `', '`. Missing value slots become `''`.
*/
function normalizeUndiciHeaderPairs(headers) {
const out = [];
for (let i = 0; i < headers.length; i++) {
const entry = headers[i];
if (i % 2 === 0) {
// Header name (should always be a string; coerce defensively).
out.push(typeof entry === 'string' ? entry : String(entry));
} else {
// Header value: flatten `string[]` to a single string for downstream string-only helpers.
out.push(Array.isArray(entry) ? entry.join(', ') : (entry ?? ''));
}
}
return out;
}
function stringToArrayHeaders(requestHeaders) {

@@ -89,0 +120,0 @@ const headersArray = requestHeaders.split('\r\n');

@@ -1,1 +0,1 @@

{"version":3,"file":"outgoingFetchRequest.js","sources":["../../../src/utils/outgoingFetchRequest.ts"],"sourcesContent":["import type { LRUMap, SanitizedRequestData } from '@sentry/core';\nimport {\n addBreadcrumb,\n getBreadcrumbLogLevelFromHttpStatusCode,\n getClient,\n getSanitizedUrlString,\n getTraceData,\n parseUrl,\n shouldPropagateTraceForUrl,\n} from '@sentry/core';\nimport type { UndiciRequest, UndiciResponse } from '../integrations/node-fetch/types';\nimport { mergeBaggageHeaders } from './baggage';\nimport { debug } from '@sentry/core';\nconst SENTRY_TRACE_HEADER = 'sentry-trace';\nconst SENTRY_BAGGAGE_HEADER = 'baggage';\nconst W3C_TRACEPARENT_HEADER = 'traceparent';\n/**\n * Add trace propagation headers to an outgoing fetch/undici request.\n *\n * Checks if the request URL matches trace propagation targets,\n * then injects sentry-trace, traceparent, and baggage headers.\n */\n// eslint-disable-next-line complexity\nexport function addTracePropagationHeadersToFetchRequest(\n request: UndiciRequest,\n propagationDecisionMap: LRUMap<string, boolean>,\n): void {\n const url = getAbsoluteUrl(request.origin, request.path);\n\n // Manually add the trace headers, if it applies\n // Note: We do not use `propagation.inject()` here, because our propagator relies on an active span\n // Which we do not have in this case\n // The propagator _may_ overwrite this, but this should be fine as it is the same data\n const { tracePropagationTargets, propagateTraceparent } = getClient()?.getOptions() || {};\n const addedHeaders = shouldPropagateTraceForUrl(url, tracePropagationTargets, propagationDecisionMap)\n ? getTraceData({ propagateTraceparent })\n : undefined;\n\n if (!addedHeaders) {\n return;\n }\n\n const { 'sentry-trace': sentryTrace, baggage, traceparent } = addedHeaders;\n\n const requestHeaders = Array.isArray(request.headers) ? request.headers : stringToArrayHeaders(request.headers);\n\n // OTel's UndiciInstrumentation calls propagation.inject() which unconditionally\n // appends headers to the request. When the user also sets headers via getTraceData(),\n // this results in duplicate sentry-trace and baggage (and optionally traceparent) entries.\n // We clean these up before applying our own logic.\n _deduplicateArrayHeader(requestHeaders, SENTRY_TRACE_HEADER);\n _deduplicateArrayHeader(requestHeaders, SENTRY_BAGGAGE_HEADER);\n if (propagateTraceparent) {\n _deduplicateArrayHeader(requestHeaders, W3C_TRACEPARENT_HEADER);\n }\n\n // We do not want to overwrite existing headers here\n // If the core UndiciInstrumentation is registered, it will already have set the headers\n // We do not want to add any then\n const hasExistingSentryTraceHeader = _findExistingHeaderIndex(requestHeaders, SENTRY_TRACE_HEADER) !== -1;\n\n // We do not want to set any headers if we already have an existing sentry-trace header.\n // sentry-trace is still the source of truth, otherwise we risk mixing up baggage and sentry-trace values.\n if (!hasExistingSentryTraceHeader) {\n if (sentryTrace) {\n requestHeaders.push(SENTRY_TRACE_HEADER, sentryTrace);\n }\n\n if (traceparent && _findExistingHeaderIndex(requestHeaders, 'traceparent') === -1) {\n requestHeaders.push('traceparent', traceparent);\n }\n\n // For baggage, we make sure to merge this into a possibly existing header\n const existingBaggageIndex = _findExistingHeaderIndex(requestHeaders, SENTRY_BAGGAGE_HEADER);\n if (baggage && existingBaggageIndex === -1) {\n requestHeaders.push(SENTRY_BAGGAGE_HEADER, baggage);\n } else if (baggage) {\n // headers in format [key_0, value_0, key_1, value_1, ...], hence the +1 here\n const existingBaggageValue = requestHeaders[existingBaggageIndex + 1];\n const merged = mergeBaggageHeaders(existingBaggageValue, baggage);\n if (merged) {\n requestHeaders[existingBaggageIndex + 1] = merged;\n }\n }\n }\n\n if (!Array.isArray(request.headers)) {\n // For original string request headers, we need to write them back to the request\n request.headers = arrayToStringHeaders(requestHeaders);\n }\n}\n\nfunction stringToArrayHeaders(requestHeaders: string): string[] {\n const headersArray = requestHeaders.split('\\r\\n');\n const headers: string[] = [];\n for (const header of headersArray) {\n try {\n const colonIndex = header.indexOf(':');\n if (colonIndex === -1) {\n continue;\n }\n const key = header.slice(0, colonIndex).trim();\n const value = header.slice(colonIndex + 1).trim();\n if (key) {\n headers.push(key, value);\n }\n } catch {\n debug.warn(`Failed to convert string request header to array header: ${header}`);\n }\n }\n return headers;\n}\n\nfunction arrayToStringHeaders(headers: string[]): string {\n const headerPairs: string[] = [];\n\n for (let i = 0; i < headers.length; i += 2) {\n const key = headers[i];\n const value = headers[i + 1];\n if (!key || value == null) {\n // skip falsy keys but only null/undefined values\n continue;\n }\n headerPairs.push(`${key}: ${value}`);\n }\n\n if (!headerPairs.length) {\n return '';\n }\n\n return headerPairs.join('\\r\\n').concat('\\r\\n');\n}\n\n/**\n * For a given header name, if there are multiple entries in the [key, value, key, value, ...] array,\n * keep the first entry and remove the rest.\n * For baggage, values are merged to preserve all entries but to dedupe sentry- values, and always\n * keep the first occurrence of them\n */\nfunction _deduplicateArrayHeader(headers: string[], headerName: string): void {\n let firstIndex = -1;\n for (let i = 0; i < headers.length; i += 2) {\n if (headers[i] !== headerName) {\n continue;\n }\n\n if (firstIndex === -1) {\n firstIndex = i;\n continue;\n }\n\n const firstHeaderValue = headers[firstIndex + 1];\n if (headerName === SENTRY_BAGGAGE_HEADER && firstHeaderValue) {\n // mergeBaggageHeaders always takes sentry- values from the new baggage (2nd param) and merges\n // it with the existing one (1st param). Here, we want to keep the first header's existing\n // sentry- values in favor of the new ones. Hence we swap the parameters.\n const merged = mergeBaggageHeaders(headers[i + 1], firstHeaderValue);\n if (merged) {\n headers[firstIndex + 1] = merged;\n }\n }\n headers.splice(i, 2);\n i -= 2;\n }\n}\n\n/**\n * Find the index of an existing header in an array of headers.\n * Only take even indices, because headers are in format [key_0, value_0, key_1, value_1, ...]\n * otherwise we could match a header _value_ with @param name\n */\nfunction _findExistingHeaderIndex(headers: string[], name: string): number {\n return headers.findIndex((header, i) => i % 2 === 0 && header === name);\n}\n\n/** Add a breadcrumb for an outgoing fetch/undici request. */\nexport function addFetchRequestBreadcrumb(request: UndiciRequest, response: UndiciResponse): void {\n const data = getBreadcrumbData(request);\n\n const statusCode = response.statusCode;\n const level = getBreadcrumbLogLevelFromHttpStatusCode(statusCode);\n\n addBreadcrumb(\n {\n category: 'http',\n data: {\n status_code: statusCode,\n ...data,\n },\n type: 'http',\n level,\n },\n {\n event: 'response',\n request,\n response,\n },\n );\n}\n\nfunction getBreadcrumbData(request: UndiciRequest): Partial<SanitizedRequestData> {\n try {\n const url = getAbsoluteUrl(request.origin, request.path);\n const parsedUrl = parseUrl(url);\n\n const data: Partial<SanitizedRequestData> = {\n url: getSanitizedUrlString(parsedUrl),\n 'http.method': request.method || 'GET',\n };\n\n if (parsedUrl.search) {\n data['http.query'] = parsedUrl.search;\n }\n if (parsedUrl.hash) {\n data['http.fragment'] = parsedUrl.hash;\n }\n\n return data;\n } catch {\n return {};\n }\n}\n\n/** Get the absolute URL from an origin and path. */\nexport function getAbsoluteUrl(origin: string, path: string = '/'): string {\n try {\n const url = new URL(path, origin);\n return url.toString();\n } catch {\n // fallback: Construct it on our own\n const url = `${origin}`;\n\n if (url.endsWith('/') && path.startsWith('/')) {\n return `${url}${path.slice(1)}`;\n }\n\n if (!url.endsWith('/') && !path.startsWith('/')) {\n return `${url}/${path}`;\n }\n\n return `${url}${path}`;\n }\n}\n"],"names":["getClient","shouldPropagateTraceForUrl","getTraceData","baggage","mergeBaggageHeaders","debug","getBreadcrumbLogLevelFromHttpStatusCode","addBreadcrumb","parseUrl","getSanitizedUrlString"],"mappings":"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"}
{"version":3,"file":"outgoingFetchRequest.js","sources":["../../../src/utils/outgoingFetchRequest.ts"],"sourcesContent":["import type { LRUMap, SanitizedRequestData } from '@sentry/core';\nimport {\n addBreadcrumb,\n getBreadcrumbLogLevelFromHttpStatusCode,\n getClient,\n getSanitizedUrlString,\n getTraceData,\n parseUrl,\n shouldPropagateTraceForUrl,\n} from '@sentry/core';\nimport type { UndiciRequest, UndiciResponse } from '../integrations/node-fetch/types';\nimport { mergeBaggageHeaders } from './baggage';\nimport { debug } from '@sentry/core';\nconst SENTRY_TRACE_HEADER = 'sentry-trace';\nconst SENTRY_BAGGAGE_HEADER = 'baggage';\nconst W3C_TRACEPARENT_HEADER = 'traceparent';\n/**\n * Add trace propagation headers to an outgoing fetch/undici request.\n *\n * Checks if the request URL matches trace propagation targets,\n * then injects sentry-trace, traceparent, and baggage headers.\n */\n// eslint-disable-next-line complexity\nexport function addTracePropagationHeadersToFetchRequest(\n request: UndiciRequest,\n propagationDecisionMap: LRUMap<string, boolean>,\n): void {\n const url = getAbsoluteUrl(request.origin, request.path);\n\n // Manually add the trace headers, if it applies\n // Note: We do not use `propagation.inject()` here, because our propagator relies on an active span\n // Which we do not have in this case\n // The propagator _may_ overwrite this, but this should be fine as it is the same data\n const { tracePropagationTargets, propagateTraceparent } = getClient()?.getOptions() || {};\n const addedHeaders = shouldPropagateTraceForUrl(url, tracePropagationTargets, propagationDecisionMap)\n ? getTraceData({ propagateTraceparent })\n : undefined;\n\n if (!addedHeaders) {\n return;\n }\n\n const { 'sentry-trace': sentryTrace, baggage, traceparent } = addedHeaders;\n\n // Undici can expose headers either as a raw string (v5-style) or as a flat array of pairs (v6-style).\n // In the array form, even indices are header names and odd indices are values; in undici v6 a value\n // may be `string | string[]` when a header has multiple values. The helpers below (_deduplicateArrayHeader,\n // push, etc.) expect each value slot to be a single string, so we normalize array headers first.\n const requestHeaders: string[] = Array.isArray(request.headers)\n ? normalizeUndiciHeaderPairs(request.headers)\n : stringToArrayHeaders(request.headers);\n\n // OTel's UndiciInstrumentation calls propagation.inject() which unconditionally\n // appends headers to the request. When the user also sets headers via getTraceData(),\n // this results in duplicate sentry-trace and baggage (and optionally traceparent) entries.\n // We clean these up before applying our own logic.\n _deduplicateArrayHeader(requestHeaders, SENTRY_TRACE_HEADER);\n _deduplicateArrayHeader(requestHeaders, SENTRY_BAGGAGE_HEADER);\n if (propagateTraceparent) {\n _deduplicateArrayHeader(requestHeaders, W3C_TRACEPARENT_HEADER);\n }\n\n // We do not want to overwrite existing headers here\n // If the core UndiciInstrumentation is registered, it will already have set the headers\n // We do not want to add any then\n const hasExistingSentryTraceHeader = _findExistingHeaderIndex(requestHeaders, SENTRY_TRACE_HEADER) !== -1;\n\n // We do not want to set any headers if we already have an existing sentry-trace header.\n // sentry-trace is still the source of truth, otherwise we risk mixing up baggage and sentry-trace values.\n if (!hasExistingSentryTraceHeader) {\n if (sentryTrace) {\n requestHeaders.push(SENTRY_TRACE_HEADER, sentryTrace);\n }\n\n if (traceparent && _findExistingHeaderIndex(requestHeaders, 'traceparent') === -1) {\n requestHeaders.push('traceparent', traceparent);\n }\n\n // For baggage, we make sure to merge this into a possibly existing header\n const existingBaggageIndex = _findExistingHeaderIndex(requestHeaders, SENTRY_BAGGAGE_HEADER);\n if (baggage && existingBaggageIndex === -1) {\n requestHeaders.push(SENTRY_BAGGAGE_HEADER, baggage);\n } else if (baggage) {\n // headers in format [key_0, value_0, key_1, value_1, ...], hence the +1 here\n const existingBaggageValue = requestHeaders[existingBaggageIndex + 1];\n const merged = mergeBaggageHeaders(existingBaggageValue, baggage);\n if (merged) {\n requestHeaders[existingBaggageIndex + 1] = merged;\n }\n }\n }\n\n if (Array.isArray(request.headers)) {\n // Replace contents in place so we keep the same array reference undici/fetch still holds.\n // `requestHeaders` is already normalized (string pairs only); splice writes them back.\n request.headers.splice(0, request.headers.length, ...requestHeaders);\n } else {\n request.headers = arrayToStringHeaders(requestHeaders);\n }\n}\n\n/**\n * Convert undici’s header array into `[name, value, name, value, ...]` where every value is a string.\n *\n * Undici v6 uses this shape: `[k1, v1, k2, v2, ...]`. Types allow each `v` to be `string | string[]` when\n * that header has multiple values. Sentry’s dedupe/merge helpers expect one string per value slot, so\n * multi-value arrays are joined with `', '`. Missing value slots become `''`.\n */\nfunction normalizeUndiciHeaderPairs(headers: (string | string[])[]): string[] {\n const out: string[] = [];\n for (let i = 0; i < headers.length; i++) {\n const entry = headers[i];\n if (i % 2 === 0) {\n // Header name (should always be a string; coerce defensively).\n out.push(typeof entry === 'string' ? entry : String(entry));\n } else {\n // Header value: flatten `string[]` to a single string for downstream string-only helpers.\n out.push(Array.isArray(entry) ? entry.join(', ') : (entry ?? ''));\n }\n }\n return out;\n}\n\nfunction stringToArrayHeaders(requestHeaders: string): string[] {\n const headersArray = requestHeaders.split('\\r\\n');\n const headers: string[] = [];\n for (const header of headersArray) {\n try {\n const colonIndex = header.indexOf(':');\n if (colonIndex === -1) {\n continue;\n }\n const key = header.slice(0, colonIndex).trim();\n const value = header.slice(colonIndex + 1).trim();\n if (key) {\n headers.push(key, value);\n }\n } catch {\n debug.warn(`Failed to convert string request header to array header: ${header}`);\n }\n }\n return headers;\n}\n\nfunction arrayToStringHeaders(headers: string[]): string {\n const headerPairs: string[] = [];\n\n for (let i = 0; i < headers.length; i += 2) {\n const key = headers[i];\n const value = headers[i + 1];\n if (!key || value == null) {\n // skip falsy keys but only null/undefined values\n continue;\n }\n headerPairs.push(`${key}: ${value}`);\n }\n\n if (!headerPairs.length) {\n return '';\n }\n\n return headerPairs.join('\\r\\n').concat('\\r\\n');\n}\n\n/**\n * For a given header name, if there are multiple entries in the [key, value, key, value, ...] array,\n * keep the first entry and remove the rest.\n * For baggage, values are merged to preserve all entries but to dedupe sentry- values, and always\n * keep the first occurrence of them\n */\nfunction _deduplicateArrayHeader(headers: string[], headerName: string): void {\n let firstIndex = -1;\n for (let i = 0; i < headers.length; i += 2) {\n if (headers[i] !== headerName) {\n continue;\n }\n\n if (firstIndex === -1) {\n firstIndex = i;\n continue;\n }\n\n const firstHeaderValue = headers[firstIndex + 1];\n if (headerName === SENTRY_BAGGAGE_HEADER && firstHeaderValue) {\n // mergeBaggageHeaders always takes sentry- values from the new baggage (2nd param) and merges\n // it with the existing one (1st param). Here, we want to keep the first header's existing\n // sentry- values in favor of the new ones. Hence we swap the parameters.\n const merged = mergeBaggageHeaders(headers[i + 1], firstHeaderValue);\n if (merged) {\n headers[firstIndex + 1] = merged;\n }\n }\n headers.splice(i, 2);\n i -= 2;\n }\n}\n\n/**\n * Find the index of an existing header in an array of headers.\n * Only take even indices, because headers are in format [key_0, value_0, key_1, value_1, ...]\n * otherwise we could match a header _value_ with @param name\n */\nfunction _findExistingHeaderIndex(headers: string[], name: string): number {\n return headers.findIndex((header, i) => i % 2 === 0 && header === name);\n}\n\n/** Add a breadcrumb for an outgoing fetch/undici request. */\nexport function addFetchRequestBreadcrumb(request: UndiciRequest, response: UndiciResponse): void {\n const data = getBreadcrumbData(request);\n\n const statusCode = response.statusCode;\n const level = getBreadcrumbLogLevelFromHttpStatusCode(statusCode);\n\n addBreadcrumb(\n {\n category: 'http',\n data: {\n status_code: statusCode,\n ...data,\n },\n type: 'http',\n level,\n },\n {\n event: 'response',\n request,\n response,\n },\n );\n}\n\nfunction getBreadcrumbData(request: UndiciRequest): Partial<SanitizedRequestData> {\n try {\n const url = getAbsoluteUrl(request.origin, request.path);\n const parsedUrl = parseUrl(url);\n\n const data: Partial<SanitizedRequestData> = {\n url: getSanitizedUrlString(parsedUrl),\n 'http.method': request.method || 'GET',\n };\n\n if (parsedUrl.search) {\n data['http.query'] = parsedUrl.search;\n }\n if (parsedUrl.hash) {\n data['http.fragment'] = parsedUrl.hash;\n }\n\n return data;\n } catch {\n return {};\n }\n}\n\n/** Get the absolute URL from an origin and path. */\nexport function getAbsoluteUrl(origin: string, path: string = '/'): string {\n try {\n const url = new URL(path, origin);\n return url.toString();\n } catch {\n // fallback: Construct it on our own\n const url = `${origin}`;\n\n if (url.endsWith('/') && path.startsWith('/')) {\n return `${url}${path.slice(1)}`;\n }\n\n if (!url.endsWith('/') && !path.startsWith('/')) {\n return `${url}/${path}`;\n }\n\n return `${url}${path}`;\n }\n}\n"],"names":["getClient","shouldPropagateTraceForUrl","getTraceData","baggage","mergeBaggageHeaders","debug","getBreadcrumbLogLevelFromHttpStatusCode","addBreadcrumb","parseUrl","getSanitizedUrlString"],"mappings":"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"}

@@ -17,3 +17,3 @@ export { httpIntegration } from './integrations/http/index.js';

export { anrIntegration, disableAnrDetectionForCallback } from './integrations/anr/index.js';
export { SDK_VERSION, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, Scope, addBreadcrumb, addEventProcessor, addIntegration, captureCheckIn, captureConsoleIntegration, captureEvent, captureException, captureFeedback, captureMessage, captureSession, close, consoleIntegration, consoleLoggingIntegration, continueTrace, createConsolaReporter, createTransport, dedupeIntegration, endSession, envToBool, eventFiltersIntegration, extraErrorDataIntegration, featureFlagsIntegration, flush, functionToStringIntegration, getActiveSpan, getClient, getCurrentScope, getGlobalScope, getIsolationScope, getRootSpan, getSpanDescendants, getSpanStatusFromHttpCode, getTraceData, getTraceMetaTags, inboundFiltersIntegration, instrumentSupabaseClient, isEnabled, isInitialized, lastEventId, linkedErrorsIntegration, metrics, parameterize, profiler, requestDataIntegration, rewriteFramesIntegration, setContext, setCurrentClient, setExtra, setExtras, setHttpStatus, setMeasurement, setTag, setTags, setUser, spanStreamingIntegration, spanToBaggageHeader, spanToJSON, spanToTraceHeader, startInactiveSpan, startNewTrace, startSession, startSpan, startSpanManual, supabaseIntegration, suppressTracing, trpcMiddleware, updateSpanName, withActiveSpan, withIsolationScope, withMonitor, withScope, withStreamedSpan, wrapMcpServerWithSentry, zodErrorsIntegration } from '@sentry/core';
export { SDK_VERSION, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, Scope, addBreadcrumb, addEventProcessor, addIntegration, captureCheckIn, captureConsoleIntegration, captureEvent, captureException, captureFeedback, captureMessage, captureSession, close, consoleLoggingIntegration, continueTrace, createConsolaReporter, createTransport, dedupeIntegration, endSession, envToBool, eventFiltersIntegration, extraErrorDataIntegration, featureFlagsIntegration, flush, functionToStringIntegration, getActiveSpan, getClient, getCurrentScope, getGlobalScope, getIsolationScope, getRootSpan, getSpanDescendants, getSpanStatusFromHttpCode, getTraceData, getTraceMetaTags, inboundFiltersIntegration, instrumentSupabaseClient, isEnabled, isInitialized, lastEventId, linkedErrorsIntegration, metrics, parameterize, profiler, requestDataIntegration, rewriteFramesIntegration, setContext, setCurrentClient, setExtra, setExtras, setHttpStatus, setMeasurement, setTag, setTags, setUser, spanStreamingIntegration, spanToBaggageHeader, spanToJSON, spanToTraceHeader, startInactiveSpan, startNewTrace, startSession, startSpan, startSpanManual, supabaseIntegration, suppressTracing, trpcMiddleware, updateSpanName, withActiveSpan, withIsolationScope, withMonitor, withScope, withStreamedSpan, wrapMcpServerWithSentry, zodErrorsIntegration } from '@sentry/core';
import * as _exports from './logs/exports.js';

@@ -33,2 +33,3 @@ export { _exports as logger };

export { pinoIntegration } from './integrations/pino.js';
export { consoleIntegration } from './integrations/console.js';
export { defaultStackParser, getSentryRelease } from './sdk/api.js';

@@ -35,0 +36,0 @@ export { createGetModuleFromFilename } from './utils/module.js';

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}

@@ -10,3 +10,3 @@ import { types } from 'node:util';

// This string is a placeholder that gets overwritten with the worker code.
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjUwLjAtYWxwaGEuMCAoOWM1MjA0NCkgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIHR9ZnJvbSJub2RlOmluc3BlY3RvciI7aW1wb3J0e3dvcmtlckRhdGEgYXMgbixwYXJlbnRQb3J0IGFzIGV9ZnJvbSJub2RlOndvcmtlcl90aHJlYWRzIjtpbXBvcnR7cG9zaXggYXMgcixzZXAgYXMgb31mcm9tIm5vZGU6cGF0aCI7aW1wb3J0KmFzIGkgZnJvbSJub2RlOmh0dHAiO2ltcG9ydCphcyBzIGZyb20ibm9kZTpodHRwcyI7aW1wb3J0e1JlYWRhYmxlIGFzIGN9ZnJvbSJub2RlOnN0cmVhbSI7aW1wb3J0e2NyZWF0ZUd6aXAgYXMgdX1mcm9tIm5vZGU6emxpYiI7aW1wb3J0KmFzIGEgZnJvbSJub2RlOm5ldCI7aW1wb3J0KmFzIGYgZnJvbSJub2RlOnRscyI7Y29uc3QgaD0idW5kZWZpbmVkIj09dHlwZW9mIF9fU0VOVFJZX0RFQlVHX198fF9fU0VOVFJZX0RFQlVHX18scD1nbG9iYWxUaGlzLGQ9IjEwLjUwLjAtYWxwaGEuMCI7ZnVuY3Rpb24gbCgpe3JldHVybiBtKHApLHB9ZnVuY3Rpb24gbSh0KXtjb25zdCBuPXQuX19TRU5UUllfXz10Ll9fU0VOVFJZX198fHt9O3JldHVybiBuLnZlcnNpb249bi52ZXJzaW9ufHxkLG5bZF09bltkXXx8e319ZnVuY3Rpb24gZyh0LG4sZT1wKXtjb25zdCByPWUuX19TRU5UUllfXz1lLl9fU0VOVFJZX198fHt9LG89cltkXT1yW2RdfHx7fTtyZXR1cm4gb1t0XXx8KG9bdF09bigpKX1jb25zdCB5PXt9O2Z1bmN0aW9uIGIodCl7aWYoISgiY29uc29sZSJpbiBwKSlyZXR1cm4gdCgpO2NvbnN0IG49cC5jb25zb2xlLGU9e30scj1PYmplY3Qua2V5cyh5KTtyLmZvckVhY2godD0+e2NvbnN0IHI9eVt0XTtlW3RdPW5bdF0sblt0XT1yfSk7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtyLmZvckVhY2godD0+e25bdF09ZVt0XX0pfX1mdW5jdGlvbiB2KCl7cmV0dXJuIHcoKS5lbmFibGVkfWZ1bmN0aW9uIF8odCwuLi5uKXtoJiZ2KCkmJmIoKCk9PntwLmNvbnNvbGVbdF0oYFNlbnRyeSBMb2dnZXIgWyR7dH1dOmAsLi4ubil9KX1mdW5jdGlvbiB3KCl7cmV0dXJuIGg/ZygibG9nZ2VyU2V0dGluZ3MiLCgpPT4oe2VuYWJsZWQ6ITF9KSk6e2VuYWJsZWQ6ITF9fWNvbnN0IFM9e2VuYWJsZTpmdW5jdGlvbigpe3coKS5lbmFibGVkPSEwfSxkaXNhYmxlOmZ1bmN0aW9uKCl7dygpLmVuYWJsZWQ9ITF9LGlzRW5hYmxlZDp2LGxvZzpmdW5jdGlvbiguLi50KXtfKCJsb2ciLC4uLnQpfSx3YXJuOmZ1bmN0aW9uKC4uLnQpe18oIndhcm4iLC4uLnQpfSxlcnJvcjpmdW5jdGlvbiguLi50KXtfKCJlcnJvciIsLi4udCl9fSwkPS9jYXB0dXJlTWVzc2FnZXxjYXB0dXJlRXhjZXB0aW9uLztmdW5jdGlvbiBFKHQpe3JldHVybiB0W3QubGVuZ3RoLTFdfHx7fX1jb25zdCB4PSI8YW5vbnltb3VzPiI7Y29uc3QgTj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIGoodCxuKXtyZXR1cm4gTi5jYWxsKHQpPT09YFtvYmplY3QgJHtufV1gfWZ1bmN0aW9uIEModCl7cmV0dXJuIGoodCwiU3RyaW5nIil9ZnVuY3Rpb24gQSh0KXtyZXR1cm4gaih0LCJPYmplY3QiKX1mdW5jdGlvbiBUKHQpe3JldHVybiBCb29sZWFuKHQ/LnRoZW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRoZW4pfWZ1bmN0aW9uIGsodCxuKXt0cnl7cmV0dXJuIHQgaW5zdGFuY2VvZiBufWNhdGNoe3JldHVybiExfX1jb25zdCBJPXA7ZnVuY3Rpb24gTyh0LG4pe2NvbnN0IGU9dCxyPVtdO2lmKCFlPy50YWdOYW1lKXJldHVybiIiO2lmKEkuSFRNTEVsZW1lbnQmJmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZS5kYXRhc2V0KXtpZihlLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50KXJldHVybiBlLmRhdGFzZXQuc2VudHJ5Q29tcG9uZW50O2lmKGUuZGF0YXNldC5zZW50cnlFbGVtZW50KXJldHVybiBlLmRhdGFzZXQuc2VudHJ5RWxlbWVudH1yLnB1c2goZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpO2NvbnN0IG89bj8ubGVuZ3RoP24uZmlsdGVyKHQ9PmUuZ2V0QXR0cmlidXRlKHQpKS5tYXAodD0+W3QsZS5nZXRBdHRyaWJ1dGUodCldKTpudWxsO2lmKG8/Lmxlbmd0aClvLmZvckVhY2godD0+e3IucHVzaChgWyR7dFswXX09IiR7dFsxXX0iXWApfSk7ZWxzZXtlLmlkJiZyLnB1c2goYCMke2UuaWR9YCk7Y29uc3QgdD1lLmNsYXNzTmFtZTtpZih0JiZDKHQpKXtjb25zdCBuPXQuc3BsaXQoL1xzKy8pO2Zvcihjb25zdCB0IG9mIG4pci5wdXNoKGAuJHt0fWApfX1mb3IoY29uc3QgdCBvZlsiYXJpYS1sYWJlbCIsInR5cGUiLCJuYW1lIiwidGl0bGUiLCJhbHQiXSl7Y29uc3Qgbj1lLmdldEF0dHJpYnV0ZSh0KTtuJiZyLnB1c2goYFske3R9PSIke259Il1gKX1yZXR1cm4gci5qb2luKCIiKX1mdW5jdGlvbiBSKHQpe2lmKGZ1bmN0aW9uKHQpe3N3aXRjaChOLmNhbGwodCkpe2Nhc2UiW29iamVjdCBFcnJvcl0iOmNhc2UiW29iamVjdCBFeGNlcHRpb25dIjpjYXNlIltvYmplY3QgRE9NRXhjZXB0aW9uXSI6Y2FzZSJbb2JqZWN0IFdlYkFzc2VtYmx5LkV4Y2VwdGlvbl0iOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuIGsodCxFcnJvcil9fSh0KSlyZXR1cm57bWVzc2FnZTp0Lm1lc3NhZ2UsbmFtZTp0Lm5hbWUsc3RhY2s6dC5zdGFjaywuLi5EKHQpfTtpZihuPXQsInVuZGVmaW5lZCIhPXR5cGVvZiBFdmVudCYmayhuLEV2ZW50KSl7Y29uc3Qgbj17dHlwZTp0LnR5cGUsdGFyZ2V0OlAodC50YXJnZXQpLGN1cnJlbnRUYXJnZXQ6UCh0LmN1cnJlbnRUYXJnZXQpLC4uLkQodCl9O3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQ3VzdG9tRXZlbnQmJmsodCxDdXN0b21FdmVudCkmJihuLmRldGFpbD10LmRldGFpbCksbn1yZXR1cm4gdDt2YXIgbn1mdW5jdGlvbiBQKHQpe3RyeXtyZXR1cm4gbj10LCJ1bmRlZmluZWQiIT10eXBlb2YgRWxlbWVudCYmayhuLEVsZW1lbnQpP2Z1bmN0aW9uKHQsbj17fSl7aWYoIXQpcmV0dXJuIjx1bmtub3duPiI7dHJ5e2xldCBlPXQ7Y29uc3Qgcj01LG89W107bGV0IGk9MCxzPTA7Y29uc3QgYz0iID4gIix1PWMubGVuZ3RoO2xldCBhO2NvbnN0IGY9QXJyYXkuaXNBcnJheShuKT9uOm4ua2V5QXR0cnMsaD0hQXJyYXkuaXNBcnJheShuKSYmbi5tYXhTdHJpbmdMZW5ndGh8fDgwO2Zvcig7ZSYmaSsrPHImJihhPU8oZSxmKSwhKCJodG1sIj09PWF8fGk+MSYmcytvLmxlbmd0aCp1K2EubGVuZ3RoPj1oKSk7KW8ucHVzaChhKSxzKz1hLmxlbmd0aCxlPWUucGFyZW50Tm9kZTtyZXR1cm4gby5yZXZlcnNlKCkuam9pbihjKX1jYXRjaHtyZXR1cm4iPHVua25vd24+In19KHQpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1jYXRjaHtyZXR1cm4iPHVua25vd24+In12YXIgbn1mdW5jdGlvbiBEKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQ/T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpKTp7fX1sZXQgVSxMO2Z1bmN0aW9uIE0odCl7aWYodm9pZCAwIT09VSlyZXR1cm4gVT9VKHQpOnQoKTtjb25zdCBuPVN5bWJvbC5mb3IoIl9fU0VOVFJZX1NBRkVfUkFORE9NX0lEX1dSQVBQRVJfXyIpLGU9cDtyZXR1cm4gbiBpbiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZVtuXT8oVT1lW25dLFUodCkpOihVPW51bGwsdCgpKX1mdW5jdGlvbiBCKCl7cmV0dXJuIE0oKCk9Pk1hdGgucmFuZG9tKCkpfWZ1bmN0aW9uIFcoKXtyZXR1cm4gTSgoKT0+RGF0ZS5ub3coKSl9ZnVuY3Rpb24geih0LG49MCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0fHwwPT09bnx8dC5sZW5ndGg8PW4/dDpgJHt0LnNsaWNlKDAsbil9Li4uYH1mdW5jdGlvbiBGKHQ9ZnVuY3Rpb24oKXtjb25zdCB0PXA7cmV0dXJuIHQuY3J5cHRvfHx0Lm1zQ3J5cHRvfSgpKXt0cnl7aWYodD8ucmFuZG9tVVVJRClyZXR1cm4gTSgoKT0+dC5yYW5kb21VVUlEKCkpLnJlcGxhY2UoLy0vZywiIil9Y2F0Y2h7fXJldHVybiBMfHwoTD1bMWU3XSsxZTMrNGUzKzhlMysxZTExKSxMLnJlcGxhY2UoL1swMThdL2csdD0+KHReKDE2KkIoKSYxNSk+PnQvNCkudG9TdHJpbmcoMTYpKX1mdW5jdGlvbiBHKCl7cmV0dXJuIFcoKS8xZTN9bGV0IEg7ZnVuY3Rpb24gSigpe3JldHVybihIPz8oSD1mdW5jdGlvbigpe2NvbnN0e3BlcmZvcm1hbmNlOnR9PXA7aWYoIXQ/Lm5vd3x8IXQudGltZU9yaWdpbilyZXR1cm4gRztjb25zdCBuPXQudGltZU9yaWdpbjtyZXR1cm4oKT0+KG4rTSgoKT0+dC5ub3coKSkpLzFlM30oKSkpKCl9ZnVuY3Rpb24gWSh0KXtjb25zdCBuPUooKSxlPXtzaWQ6RigpLGluaXQ6ITAsdGltZXN0YW1wOm4sc3RhcnRlZDpuLGR1cmF0aW9uOjAsc3RhdHVzOiJvayIsZXJyb3JzOjAsaWdub3JlRHVyYXRpb246ITEsdG9KU09OOigpPT5mdW5jdGlvbih0KXtyZXR1cm57c2lkOmAke3Quc2lkfWAsaW5pdDp0LmluaXQsc3RhcnRlZDpuZXcgRGF0ZSgxZTMqdC5zdGFydGVkKS50b0lTT1N0cmluZygpLHRpbWVzdGFtcDpuZXcgRGF0ZSgxZTMqdC50aW1lc3RhbXApLnRvSVNPU3RyaW5nKCksc3RhdHVzOnQuc3RhdHVzLGVycm9yczp0LmVycm9ycyxkaWQ6Im51bWJlciI9PXR5cGVvZiB0LmRpZHx8InN0cmluZyI9PXR5cGVvZiB0LmRpZD9gJHt0LmRpZH1gOnZvaWQgMCxkdXJhdGlvbjp0LmR1cmF0aW9uLGFibm9ybWFsX21lY2hhbmlzbTp0LmFibm9ybWFsX21lY2hhbmlzbSxhdHRyczp7cmVsZWFzZTp0LnJlbGVhc2UsZW52aXJvbm1lbnQ6dC5lbnZpcm9ubWVudCxpcF9hZGRyZXNzOnQuaXBBZGRyZXNzLHVzZXJfYWdlbnQ6dC51c2VyQWdlbnR9fX0oZSl9O3JldHVybiB0JiZWKGUsdCksZX1mdW5jdGlvbiBWKHQsbj17fSl7aWYobi51c2VyJiYoIXQuaXBBZGRyZXNzJiZuLnVzZXIuaXBfYWRkcmVzcyYmKHQuaXBBZGRyZXNzPW4udXNlci5pcF9hZGRyZXNzKSx0LmRpZHx8bi5kaWR8fCh0LmRpZD1uLnVzZXIuaWR8fG4udXNlci5lbWFpbHx8bi51c2VyLnVzZXJuYW1lKSksdC50aW1lc3RhbXA9bi50aW1lc3RhbXB8fEooKSxuLmFibm9ybWFsX21lY2hhbmlzbSYmKHQuYWJub3JtYWxfbWVjaGFuaXNtPW4uYWJub3JtYWxfbWVjaGFuaXNtKSxuLmlnbm9yZUR1cmF0aW9uJiYodC5pZ25vcmVEdXJhdGlvbj1uLmlnbm9yZUR1cmF0aW9uKSxuLnNpZCYmKHQuc2lkPTMyPT09bi5zaWQubGVuZ3RoP24uc2lkOkYoKSksdm9pZCAwIT09bi5pbml0JiYodC5pbml0PW4uaW5pdCksIXQuZGlkJiZuLmRpZCYmKHQuZGlkPWAke24uZGlkfWApLCJudW1iZXIiPT10eXBlb2Ygbi5zdGFydGVkJiYodC5zdGFydGVkPW4uc3RhcnRlZCksdC5pZ25vcmVEdXJhdGlvbil0LmR1cmF0aW9uPXZvaWQgMDtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2Ygbi5kdXJhdGlvbil0LmR1cmF0aW9uPW4uZHVyYXRpb247ZWxzZXtjb25zdCBuPXQudGltZXN0YW1wLXQuc3RhcnRlZDt0LmR1cmF0aW9uPW4+PTA/bjowfW4ucmVsZWFzZSYmKHQucmVsZWFzZT1uLnJlbGVhc2UpLG4uZW52aXJvbm1lbnQmJih0LmVudmlyb25tZW50PW4uZW52aXJvbm1lbnQpLCF0LmlwQWRkcmVzcyYmbi5pcEFkZHJlc3MmJih0LmlwQWRkcmVzcz1uLmlwQWRkcmVzcyksIXQudXNlckFnZW50JiZuLnVzZXJBZ2VudCYmKHQudXNlckFnZW50PW4udXNlckFnZW50KSwibnVtYmVyIj09dHlwZW9mIG4uZXJyb3JzJiYodC5lcnJvcnM9bi5lcnJvcnMpLG4uc3RhdHVzJiYodC5zdGF0dXM9bi5zdGF0dXMpfWZ1bmN0aW9uIEsodCxuLGU9Mil7aWYoIW58fCJvYmplY3QiIT10eXBlb2Ygbnx8ZTw9MClyZXR1cm4gbjtpZih0JiYwPT09T2JqZWN0LmtleXMobikubGVuZ3RoKXJldHVybiB0O2NvbnN0IHI9ey4uLnR9O2Zvcihjb25zdCB0IGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sdCkmJihyW3RdPUsoclt0XSxuW3RdLGUtMSkpO3JldHVybiByfWZ1bmN0aW9uIFooKXtyZXR1cm4gRigpfWZ1bmN0aW9uIHEoKXtyZXR1cm4gRigpLnN1YnN0cmluZygxNil9Y29uc3QgUT0iX3NlbnRyeVNwYW4iO2Z1bmN0aW9uIFgodCxuKXtuP2Z1bmN0aW9uKHQsbixlKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1jYXRjaHtoJiZTLmxvZyhgRmFpbGVkIHRvIGFkZCBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSAiJHtufSIgdG8gb2JqZWN0YCx0KX19KHQsUSxuKTpkZWxldGUgdFtRXX1mdW5jdGlvbiB0dCh0KXtyZXR1cm4gdFtRXX1jbGFzcyBudHtjb25zdHJ1Y3Rvcigpe3RoaXMudD0hMSx0aGlzLm89W10sdGhpcy5pPVtdLHRoaXMudT1bXSx0aGlzLmg9W10sdGhpcy5wPXt9LHRoaXMubD17fSx0aGlzLm09e30sdGhpcy52PXt9LHRoaXMuXz17fSx0aGlzLlM9e30sdGhpcy5OPXt0cmFjZUlkOlooKSxzYW1wbGVSYW5kOkIoKX19Y2xvbmUoKXtjb25zdCB0PW5ldyBudDtyZXR1cm4gdC51PVsuLi50aGlzLnVdLHQubD17Li4udGhpcy5sfSx0Lm09ey4uLnRoaXMubX0sdC52PXsuLi50aGlzLnZ9LHQuXz17Li4udGhpcy5ffSx0aGlzLl8uZmxhZ3MmJih0Ll8uZmxhZ3M9e3ZhbHVlczpbLi4udGhpcy5fLmZsYWdzLnZhbHVlc119KSx0LnA9dGhpcy5wLHQuaj10aGlzLmosdC5DPXRoaXMuQyx0LkE9dGhpcy5BLHQuVD10aGlzLlQsdC5pPVsuLi50aGlzLmldLHQuaD1bLi4udGhpcy5oXSx0LlM9ey4uLnRoaXMuU30sdC5OPXsuLi50aGlzLk59LHQuaz10aGlzLmssdC5JPXRoaXMuSSx0Lk89dGhpcy5PLFgodCx0dCh0aGlzKSksdH1zZXRDbGllbnQodCl7dGhpcy5rPXR9c2V0TGFzdEV2ZW50SWQodCl7dGhpcy5JPXR9Z2V0Q2xpZW50KCl7cmV0dXJuIHRoaXMua31sYXN0RXZlbnRJZCgpe3JldHVybiB0aGlzLkl9YWRkU2NvcGVMaXN0ZW5lcih0KXt0aGlzLm8ucHVzaCh0KX1hZGRFdmVudFByb2Nlc3Nvcih0KXtyZXR1cm4gdGhpcy5pLnB1c2godCksdGhpc31zZXRVc2VyKHQpe3JldHVybiB0aGlzLnA9dHx8e2VtYWlsOnZvaWQgMCxpZDp2b2lkIDAsaXBfYWRkcmVzczp2b2lkIDAsdXNlcm5hbWU6dm9pZCAwfSx0aGlzLkMmJlYodGhpcy5DLHt1c2VyOnR9KSx0aGlzLlIoKSx0aGlzfWdldFVzZXIoKXtyZXR1cm4gdGhpcy5wfXNldENvbnZlcnNhdGlvbklkKHQpe3JldHVybiB0aGlzLk89dHx8dm9pZCAwLHRoaXMuUigpLHRoaXN9c2V0VGFncyh0KXtyZXR1cm4gdGhpcy5sPXsuLi50aGlzLmwsLi4udH0sdGhpcy5SKCksdGhpc31zZXRUYWcodCxuKXtyZXR1cm4gdGhpcy5zZXRUYWdzKHtbdF06bn0pfXNldEF0dHJpYnV0ZXModCl7cmV0dXJuIHRoaXMubT17Li4udGhpcy5tLC4uLnR9LHRoaXMuUigpLHRoaXN9c2V0QXR0cmlidXRlKHQsbil7cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlcyh7W3RdOm59KX1yZW1vdmVBdHRyaWJ1dGUodCl7cmV0dXJuIHQgaW4gdGhpcy5tJiYoZGVsZXRlIHRoaXMubVt0XSx0aGlzLlIoKSksdGhpc31zZXRFeHRyYXModCl7cmV0dXJuIHRoaXMudj17Li4udGhpcy52LC4uLnR9LHRoaXMuUigpLHRoaXN9c2V0RXh0cmEodCxuKXtyZXR1cm4gdGhpcy52PXsuLi50aGlzLnYsW3RdOm59LHRoaXMuUigpLHRoaXN9c2V0RmluZ2VycHJpbnQodCl7cmV0dXJuIHRoaXMuVD10LHRoaXMuUigpLHRoaXN9c2V0TGV2ZWwodCl7cmV0dXJuIHRoaXMuaj10LHRoaXMuUigpLHRoaXN9c2V0VHJhbnNhY3Rpb25OYW1lKHQpe3JldHVybiB0aGlzLkE9dCx0aGlzLlIoKSx0aGlzfXNldENvbnRleHQodCxuKXtyZXR1cm4gbnVsbD09PW4/ZGVsZXRlIHRoaXMuX1t0XTp0aGlzLl9bdF09bix0aGlzLlIoKSx0aGlzfXNldFNlc3Npb24odCl7cmV0dXJuIHQ/dGhpcy5DPXQ6ZGVsZXRlIHRoaXMuQyx0aGlzLlIoKSx0aGlzfWdldFNlc3Npb24oKXtyZXR1cm4gdGhpcy5DfXVwZGF0ZSh0KXtpZighdClyZXR1cm4gdGhpcztjb25zdCBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QodGhpcyk6dCxlPW4gaW5zdGFuY2VvZiBudD9uLmdldFNjb3BlRGF0YSgpOkEobik/dDp2b2lkIDAse3RhZ3M6cixhdHRyaWJ1dGVzOm8sZXh0cmE6aSx1c2VyOnMsY29udGV4dHM6YyxsZXZlbDp1LGZpbmdlcnByaW50OmE9W10scHJvcGFnYXRpb25Db250ZXh0OmYsY29udmVyc2F0aW9uSWQ6aH09ZXx8e307cmV0dXJuIHRoaXMubD17Li4udGhpcy5sLC4uLnJ9LHRoaXMubT17Li4udGhpcy5tLC4uLm99LHRoaXMudj17Li4udGhpcy52LC4uLml9LHRoaXMuXz17Li4udGhpcy5fLC4uLmN9LHMmJk9iamVjdC5rZXlzKHMpLmxlbmd0aCYmKHRoaXMucD1zKSx1JiYodGhpcy5qPXUpLGEubGVuZ3RoJiYodGhpcy5UPWEpLGYmJih0aGlzLk49ZiksaCYmKHRoaXMuTz1oKSx0aGlzfWNsZWFyKCl7cmV0dXJuIHRoaXMudT1bXSx0aGlzLmw9e30sdGhpcy5tPXt9LHRoaXMudj17fSx0aGlzLnA9e30sdGhpcy5fPXt9LHRoaXMuaj12b2lkIDAsdGhpcy5BPXZvaWQgMCx0aGlzLlQ9dm9pZCAwLHRoaXMuQz12b2lkIDAsdGhpcy5PPXZvaWQgMCxYKHRoaXMsdm9pZCAwKSx0aGlzLmg9W10sdGhpcy5zZXRQcm9wYWdhdGlvbkNvbnRleHQoe3RyYWNlSWQ6WigpLHNhbXBsZVJhbmQ6QigpfSksdGhpcy5SKCksdGhpc31hZGRCcmVhZGNydW1iKHQsbil7Y29uc3QgZT0ibnVtYmVyIj09dHlwZW9mIG4/bjoxMDA7aWYoZTw9MClyZXR1cm4gdGhpcztjb25zdCByPXt0aW1lc3RhbXA6RygpLC4uLnQsbWVzc2FnZTp0Lm1lc3NhZ2U/eih0Lm1lc3NhZ2UsMjA0OCk6dC5tZXNzYWdlfTtyZXR1cm4gdGhpcy51LnB1c2gociksdGhpcy51Lmxlbmd0aD5lJiYodGhpcy51PXRoaXMudS5zbGljZSgtZSksdGhpcy5rPy5yZWNvcmREcm9wcGVkRXZlbnQoImJ1ZmZlcl9vdmVyZmxvdyIsImxvZ19pdGVtIikpLHRoaXMuUigpLHRoaXN9Z2V0TGFzdEJyZWFkY3J1bWIoKXtyZXR1cm4gdGhpcy51W3RoaXMudS5sZW5ndGgtMV19Y2xlYXJCcmVhZGNydW1icygpe3JldHVybiB0aGlzLnU9W10sdGhpcy5SKCksdGhpc31hZGRBdHRhY2htZW50KHQpe3JldHVybiB0aGlzLmgucHVzaCh0KSx0aGlzfWNsZWFyQXR0YWNobWVudHMoKXtyZXR1cm4gdGhpcy5oPVtdLHRoaXN9Z2V0U2NvcGVEYXRhKCl7cmV0dXJue2JyZWFkY3J1bWJzOnRoaXMudSxhdHRhY2htZW50czp0aGlzLmgsY29udGV4dHM6dGhpcy5fLHRhZ3M6dGhpcy5sLGF0dHJpYnV0ZXM6dGhpcy5tLGV4dHJhOnRoaXMudix1c2VyOnRoaXMucCxsZXZlbDp0aGlzLmosZmluZ2VycHJpbnQ6dGhpcy5UfHxbXSxldmVudFByb2Nlc3NvcnM6dGhpcy5pLHByb3BhZ2F0aW9uQ29udGV4dDp0aGlzLk4sc2RrUHJvY2Vzc2luZ01ldGFkYXRhOnRoaXMuUyx0cmFuc2FjdGlvbk5hbWU6dGhpcy5BLHNwYW46dHQodGhpcyksY29udmVyc2F0aW9uSWQ6dGhpcy5PfX1zZXRTREtQcm9jZXNzaW5nTWV0YWRhdGEodCl7cmV0dXJuIHRoaXMuUz1LKHRoaXMuUyx0LDIpLHRoaXN9c2V0UHJvcGFnYXRpb25Db250ZXh0KHQpe3JldHVybiB0aGlzLk49dCx0aGlzfWdldFByb3BhZ2F0aW9uQ29udGV4dCgpe3JldHVybiB0aGlzLk59Y2FwdHVyZUV4Y2VwdGlvbih0LG4pe2NvbnN0IGU9bj8uZXZlbnRfaWR8fEYoKTtpZighdGhpcy5rKXJldHVybiBoJiZTLndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBleGNlcHRpb24hIiksZTtjb25zdCByPW5ldyBFcnJvcigiU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbiIpO3JldHVybiB0aGlzLmsuY2FwdHVyZUV4Y2VwdGlvbih0LHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpyLC4uLm4sZXZlbnRfaWQ6ZX0sdGhpcyksZX1jYXB0dXJlTWVzc2FnZSh0LG4sZSl7Y29uc3Qgcj1lPy5ldmVudF9pZHx8RigpO2lmKCF0aGlzLmspcmV0dXJuIGgmJlMud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIG1lc3NhZ2UhIikscjtjb25zdCBvPWU/LnN5bnRoZXRpY0V4Y2VwdGlvbj8/bmV3IEVycm9yKHQpO3JldHVybiB0aGlzLmsuY2FwdHVyZU1lc3NhZ2UodCxuLHtvcmlnaW5hbEV4Y2VwdGlvbjp0LHN5bnRoZXRpY0V4Y2VwdGlvbjpvLC4uLmUsZXZlbnRfaWQ6cn0sdGhpcykscn1jYXB0dXJlRXZlbnQodCxuKXtjb25zdCBlPXQuZXZlbnRfaWR8fG4/LmV2ZW50X2lkfHxGKCk7cmV0dXJuIHRoaXMuaz8odGhpcy5rLmNhcHR1cmVFdmVudCh0LHsuLi5uLGV2ZW50X2lkOmV9LHRoaXMpLGUpOihoJiZTLndhcm4oIk5vIGNsaWVudCBjb25maWd1cmVkIG9uIHNjb3BlIC0gd2lsbCBub3QgY2FwdHVyZSBldmVudCEiKSxlKX1SKCl7dGhpcy50fHwodGhpcy50PSEwLHRoaXMuby5mb3JFYWNoKHQ9Pnt0KHRoaXMpfSksdGhpcy50PSExKX19Y29uc3QgZXQ9dD0+dCBpbnN0YW5jZW9mIFByb21pc2UmJiF0W3J0XSxydD1TeW1ib2woImNoYWluZWQgUHJvbWlzZUxpa2UiKSxvdD0odCxuKT0+e2xldCBlPSExO2Zvcihjb25zdCByIGluIHQpe2lmKHIgaW4gbiljb250aW51ZTtlPSEwO2NvbnN0IG89dFtyXTsiZnVuY3Rpb24iPT10eXBlb2Ygbz9PYmplY3QuZGVmaW5lUHJvcGVydHkobixyLHt2YWx1ZTooLi4ubik9Pm8uYXBwbHkodCxuKSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm5bcl09b31yZXR1cm4gZSYmT2JqZWN0LmFzc2lnbihuLHtbcnRdOiEwfSksbn07Y2xhc3MgaXR7Y29uc3RydWN0b3IodCxuKXtsZXQgZSxyO2U9dHx8bmV3IG50LHI9bnx8bmV3IG50LHRoaXMuUD1be3Njb3BlOmV9XSx0aGlzLkQ9cn13aXRoU2NvcGUodCl7Y29uc3Qgbj10aGlzLlUoKTtsZXQgZTt0cnl7ZT10KG4pfWNhdGNoKHQpe3Rocm93IHRoaXMuTCgpLHR9cmV0dXJuIFQoZSk/KCh0LG4sZSk9Pntjb25zdCByPXQudGhlbih0PT4obih0KSx0KSx0PT57dGhyb3cgZSh0KSx0fSk7cmV0dXJuIGV0KHIpJiZldCh0KT9yOm90KHQscil9KShlLCgpPT50aGlzLkwoKSwoKT0+dGhpcy5MKCkpOih0aGlzLkwoKSxlKX1nZXRDbGllbnQoKXtyZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLmNsaWVudH1nZXRTY29wZSgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGV9Z2V0SXNvbGF0aW9uU2NvcGUoKXtyZXR1cm4gdGhpcy5EfWdldFN0YWNrVG9wKCl7cmV0dXJuIHRoaXMuUFt0aGlzLlAubGVuZ3RoLTFdfVUoKXtjb25zdCB0PXRoaXMuZ2V0U2NvcGUoKS5jbG9uZSgpO3JldHVybiB0aGlzLlAucHVzaCh7Y2xpZW50OnRoaXMuZ2V0Q2xpZW50KCksc2NvcGU6dH0pLHR9TCgpe3JldHVybiEodGhpcy5QLmxlbmd0aDw9MSkmJiEhdGhpcy5QLnBvcCgpfX1mdW5jdGlvbiBzdCgpe2NvbnN0IHQ9bShsKCkpO3JldHVybiB0LnN0YWNrPXQuc3RhY2t8fG5ldyBpdChnKCJkZWZhdWx0Q3VycmVudFNjb3BlIiwoKT0+bmV3IG50KSxnKCJkZWZhdWx0SXNvbGF0aW9uU2NvcGUiLCgpPT5uZXcgbnQpKX1mdW5jdGlvbiBjdCh0KXtyZXR1cm4gc3QoKS53aXRoU2NvcGUodCl9ZnVuY3Rpb24gdXQodCxuKXtjb25zdCBlPXN0KCk7cmV0dXJuIGUud2l0aFNjb3BlKCgpPT4oZS5nZXRTdGFja1RvcCgpLnNjb3BlPXQsbih0KSkpfWZ1bmN0aW9uIGF0KHQpe3JldHVybiBzdCgpLndpdGhTY29wZSgoKT0+dChzdCgpLmdldElzb2xhdGlvblNjb3BlKCkpKX1mdW5jdGlvbiBmdCh0KXtjb25zdCBuPW0odCk7cmV0dXJuIG4uYWNzP24uYWNzOnt3aXRoSXNvbGF0aW9uU2NvcGU6YXQsd2l0aFNjb3BlOmN0LHdpdGhTZXRTY29wZTp1dCx3aXRoU2V0SXNvbGF0aW9uU2NvcGU6KHQsbik9PmF0KG4pLGdldEN1cnJlbnRTY29wZTooKT0+c3QoKS5nZXRTY29wZSgpLGdldElzb2xhdGlvblNjb3BlOigpPT5zdCgpLmdldElzb2xhdGlvblNjb3BlKCl9fWZ1bmN0aW9uIGh0KCl7cmV0dXJuIGZ0KGwoKSkuZ2V0Q3VycmVudFNjb3BlKCkuZ2V0Q2xpZW50KCl9ZnVuY3Rpb24gcHQodCl7aWYodCl7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiYiZGVyZWYiaW4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVyZWYpdHJ5e3JldHVybiB0LmRlcmVmKCl9Y2F0Y2h7cmV0dXJufXJldHVybiB0fX1mdW5jdGlvbiBkdCh0KXtjb25zdCBuPXQ7cmV0dXJue3Njb3BlOm4uX3NlbnRyeVNjb3BlLGlzb2xhdGlvblNjb3BlOnB0KG4uX3NlbnRyeUlzb2xhdGlvblNjb3BlKX19Y29uc3QgbHQ9InNlbnRyeS0iO2Z1bmN0aW9uIG10KHQpe2NvbnN0IG49ZnVuY3Rpb24odCl7aWYoIXR8fCFDKHQpJiYhQXJyYXkuaXNBcnJheSh0KSlyZXR1cm47aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdC5yZWR1Y2UoKHQsbik9Pntjb25zdCBlPWd0KG4pO3JldHVybiBPYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKChbbixlXSk9Pnt0W25dPWV9KSx0fSx7fSk7cmV0dXJuIGd0KHQpfSh0KTtpZighbilyZXR1cm47Y29uc3QgZT1PYmplY3QuZW50cmllcyhuKS5yZWR1Y2UoKHQsW24sZV0pPT57aWYobi5zdGFydHNXaXRoKGx0KSl7dFtuLnNsaWNlKDcpXT1lfXJldHVybiB0fSx7fSk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aD4wP2U6dm9pZCAwfWZ1bmN0aW9uIGd0KHQpe3JldHVybiB0LnNwbGl0KCIsIikubWFwKHQ9Pntjb25zdCBuPXQuaW5kZXhPZigiPSIpO2lmKC0xPT09bilyZXR1cm5bXTtyZXR1cm5bdC5zbGljZSgwLG4pLHQuc2xpY2UobisxKV0ubWFwKHQ9Pnt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0LnRyaW0oKSl9Y2F0Y2h7cmV0dXJufX0pfSkucmVkdWNlKCh0LFtuLGVdKT0+KG4mJmUmJih0W25dPWUpLHQpLHt9KX1jb25zdCB5dD0vXm8oXGQrKVwuLztmdW5jdGlvbiBidCh0LG49ITEpe2NvbnN0e2hvc3Q6ZSxwYXRoOnIscGFzczpvLHBvcnQ6aSxwcm9qZWN0SWQ6cyxwcm90b2NvbDpjLHB1YmxpY0tleTp1fT10O3JldHVybmAke2N9Oi8vJHt1fSR7biYmbz9gOiR7b31gOiIifUAke2V9JHtpP2A6JHtpfWA6IiJ9LyR7cj9gJHtyfS9gOnJ9JHtzfWB9ZnVuY3Rpb24gdnQodCl7Y29uc3Qgbj10LmdldE9wdGlvbnMoKSx7aG9zdDplfT10LmdldERzbigpfHx7fTtsZXQgcjtyZXR1cm4gbi5vcmdJZD9yPVN0cmluZyhuLm9yZ0lkKTplJiYocj1mdW5jdGlvbih0KXtjb25zdCBuPXQubWF0Y2goeXQpO3JldHVybiBuPy5bMV19KGUpKSxyfWZ1bmN0aW9uIF90KHQpe2NvbnN0e3NwYW5JZDpuLHRyYWNlSWQ6ZSxpc1JlbW90ZTpyfT10LnNwYW5Db250ZXh0KCksbz1yP246RXQodCkucGFyZW50X3NwYW5faWQsaT1kdCh0KS5zY29wZTtyZXR1cm57cGFyZW50X3NwYW5faWQ6byxzcGFuX2lkOnI/aT8uZ2V0UHJvcGFnYXRpb25Db250ZXh0KCkucHJvcGFnYXRpb25TcGFuSWR8fHEoKTpuLHRyYWNlX2lkOmV9fWZ1bmN0aW9uIHd0KHQpe3JldHVybiB0JiZ0Lmxlbmd0aD4wP3QubWFwKCh7Y29udGV4dDp7c3BhbklkOnQsdHJhY2VJZDpuLHRyYWNlRmxhZ3M6ZSwuLi5yfSxhdHRyaWJ1dGVzOm99KT0+KHtzcGFuX2lkOnQsdHJhY2VfaWQ6bixzYW1wbGVkOjE9PT1lLGF0dHJpYnV0ZXM6bywuLi5yfSkpOnZvaWQgMH1mdW5jdGlvbiBTdCh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/JHQodCk6QXJyYXkuaXNBcnJheSh0KT90WzBdK3RbMV0vMWU5OnQgaW5zdGFuY2VvZiBEYXRlPyR0KHQuZ2V0VGltZSgpKTpKKCl9ZnVuY3Rpb24gJHQodCl7cmV0dXJuIHQ+OTk5OTk5OTk5OT90LzFlMzp0fWZ1bmN0aW9uIEV0KHQpe2lmKGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LmdldFNwYW5KU09OfSh0KSlyZXR1cm4gdC5nZXRTcGFuSlNPTigpO2NvbnN0e3NwYW5JZDpuLHRyYWNlSWQ6ZX09dC5zcGFuQ29udGV4dCgpO2lmKGZ1bmN0aW9uKHQpe2NvbnN0IG49dDtyZXR1cm4hIShuLmF0dHJpYnV0ZXMmJm4uc3RhcnRUaW1lJiZuLm5hbWUmJm4uZW5kVGltZSYmbi5zdGF0dXMpfSh0KSl7Y29uc3R7YXR0cmlidXRlczpyLHN0YXJ0VGltZTpvLG5hbWU6aSxlbmRUaW1lOnMsc3RhdHVzOmMsbGlua3M6dX09dDtyZXR1cm57c3Bhbl9pZDpuLHRyYWNlX2lkOmUsZGF0YTpyLGRlc2NyaXB0aW9uOmkscGFyZW50X3NwYW5faWQ6eHQodCksc3RhcnRfdGltZXN0YW1wOlN0KG8pLHRpbWVzdGFtcDpTdChzKXx8dm9pZCAwLHN0YXR1czpOdChjKSxvcDpyWyJzZW50cnkub3AiXSxvcmlnaW46clsic2VudHJ5Lm9yaWdpbiJdLGxpbmtzOnd0KHUpfX1yZXR1cm57c3Bhbl9pZDpuLHRyYWNlX2lkOmUsc3RhcnRfdGltZXN0YW1wOjAsZGF0YTp7fX19ZnVuY3Rpb24geHQodCl7cmV0dXJuInBhcmVudFNwYW5JZCJpbiB0P3QucGFyZW50U3BhbklkOiJwYXJlbnRTcGFuQ29udGV4dCJpbiB0P3QucGFyZW50U3BhbkNvbnRleHQ/LnNwYW5JZDp2b2lkIDB9ZnVuY3Rpb24gTnQodCl7aWYodCYmMCE9PXQuY29kZSlyZXR1cm4gMT09PXQuY29kZT8ib2siOnQubWVzc2FnZXx8ImludGVybmFsX2Vycm9yIn1jb25zdCBqdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5fc2VudHJ5Um9vdFNwYW58fHR9O2Z1bmN0aW9uIEN0KHQpe2NvbnN0IG49aHQoKTtpZighbilyZXR1cm57fTtjb25zdCBlPWp0KHQpLHI9RXQoZSksbz1yLmRhdGEsaT1lLnNwYW5Db250ZXh0KCkudHJhY2VTdGF0ZSxzPWk/LmdldCgic2VudHJ5LnNhbXBsZV9yYXRlIik/P29bInNlbnRyeS5zYW1wbGVfcmF0ZSJdPz9vWyJzZW50cnkucHJldmlvdXNfdHJhY2Vfc2FtcGxlX3JhdGUiXTtmdW5jdGlvbiBjKHQpe3JldHVybiJudW1iZXIiIT10eXBlb2YgcyYmInN0cmluZyIhPXR5cGVvZiBzfHwodC5zYW1wbGVfcmF0ZT1gJHtzfWApLHR9Y29uc3QgdT1lLl9mcm96ZW5Ec2M7aWYodSlyZXR1cm4gYyh1KTtjb25zdCBhPWk/LmdldCgic2VudHJ5LmRzYyIpLGY9YSYmbXQoYSk7aWYoZilyZXR1cm4gYyhmKTtjb25zdCBoPWZ1bmN0aW9uKHQsbil7Y29uc3QgZT1uLmdldE9wdGlvbnMoKSx7cHVibGljS2V5OnJ9PW4uZ2V0RHNuKCl8fHt9LG89e2Vudmlyb25tZW50OmUuZW52aXJvbm1lbnR8fCJwcm9kdWN0aW9uIixyZWxlYXNlOmUucmVsZWFzZSxwdWJsaWNfa2V5OnIsdHJhY2VfaWQ6dCxvcmdfaWQ6dnQobil9O3JldHVybiBuLmVtaXQoImNyZWF0ZURzYyIsbyksb30odC5zcGFuQ29udGV4dCgpLnRyYWNlSWQsbikscD1vWyJzZW50cnkuc291cmNlIl0/P29bInNlbnRyeS5zcGFuLnNvdXJjZSJdLGQ9ci5kZXNjcmlwdGlvbjtyZXR1cm4idXJsIiE9PXAmJmQmJihoLnRyYW5zYWN0aW9uPWQpLGZ1bmN0aW9uKCl7aWYoImJvb2xlYW4iPT10eXBlb2YgX19TRU5UUllfVFJBQ0lOR19fJiYhX19TRU5UUllfVFJBQ0lOR19fKXJldHVybiExO2NvbnN0IHQ9aHQoKT8uZ2V0T3B0aW9ucygpO3JldHVybiEoIXR8fG51bGw9PXQudHJhY2VzU2FtcGxlUmF0ZSYmIXQudHJhY2VzU2FtcGxlcil9KCkmJihoLnNhbXBsZWQ9U3RyaW5nKGZ1bmN0aW9uKHQpe2NvbnN0e3RyYWNlRmxhZ3M6bn09dC5zcGFuQ29udGV4dCgpO3JldHVybiAxPT09bn0oZSkpLGguc2FtcGxlX3JhbmQ9aT8uZ2V0KCJzZW50cnkuc2FtcGxlX3JhbmQiKT8/ZHQoZSkuc2NvcGU/LmdldFByb3BhZ2F0aW9uQ29udGV4dCgpLnNhbXBsZVJhbmQudG9TdHJpbmcoKSksYyhoKSxuLmVtaXQoImNyZWF0ZURzYyIsaCxlKSxofWZ1bmN0aW9uIEF0KHQsbj0xMDAsZT0xLzApe3RyeXtyZXR1cm4gVHQoIiIsdCxuLGUpfWNhdGNoKHQpe3JldHVybntFUlJPUjpgKipub24tc2VyaWFsaXphYmxlKiogKCR7dH0pYH19fWZ1bmN0aW9uIFR0KHQsbixlPTEvMCxyPTEvMCxvPWZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgV2Vha1NldDtmdW5jdGlvbiBuKG4pe3JldHVybiEhdC5oYXMobil8fCh0LmFkZChuKSwhMSl9ZnVuY3Rpb24gZShuKXt0LmRlbGV0ZShuKX1yZXR1cm5bbixlXX0oKSl7Y29uc3RbaSxzXT1vO2lmKG51bGw9PW58fFsiYm9vbGVhbiIsInN0cmluZyJdLmluY2x1ZGVzKHR5cGVvZiBuKXx8Im51bWJlciI9PXR5cGVvZiBuJiZOdW1iZXIuaXNGaW5pdGUobikpcmV0dXJuIG47Y29uc3QgYz1mdW5jdGlvbih0LG4pe3RyeXtpZigiZG9tYWluIj09PXQmJm4mJiJvYmplY3QiPT10eXBlb2YgbiYmbi5NKXJldHVybiJbRG9tYWluXSI7aWYoImRvbWFpbkVtaXR0ZXIiPT09dClyZXR1cm4iW0RvbWFpbkVtaXR0ZXJdIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmbj09PWdsb2JhbClyZXR1cm4iW0dsb2JhbF0iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZuPT09d2luZG93KXJldHVybiJbV2luZG93XSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmbj09PWRvY3VtZW50KXJldHVybiJbRG9jdW1lbnRdIjtpZigib2JqZWN0Ij09dHlwZW9mKGU9bikmJm51bGwhPT1lJiYoZS5fX2lzVnVlfHxlLkJ8fGUuX192X2lzVk5vZGUpKXJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4iX192X2lzVk5vZGUiaW4gdCYmdC5fX3ZfaXNWTm9kZT8iW1Z1ZVZOb2RlXSI6IltWdWVWaWV3TW9kZWxdIn0obik7aWYoZnVuY3Rpb24odCl7cmV0dXJuIEEodCkmJiJuYXRpdmVFdmVudCJpbiB0JiYicHJldmVudERlZmF1bHQiaW4gdCYmInN0b3BQcm9wYWdhdGlvbiJpbiB0fShuKSlyZXR1cm4iW1N5bnRoZXRpY0V2ZW50XSI7aWYoIm51bWJlciI9PXR5cGVvZiBuJiYhTnVtYmVyLmlzRmluaXRlKG4pKXJldHVybmBbJHtufV1gO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXJldHVybmBbRnVuY3Rpb246ICR7ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5uYW1lfHx4fWNhdGNoe3JldHVybiB4fX0obil9XWA7aWYoInN5bWJvbCI9PXR5cGVvZiBuKXJldHVybmBbJHtTdHJpbmcobil9XWA7aWYoImJpZ2ludCI9PXR5cGVvZiBuKXJldHVybmBbQmlnSW50OiAke1N0cmluZyhuKX1dYDtjb25zdCByPWZ1bmN0aW9uKHQpe2NvbnN0IG49T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO3JldHVybiBuPy5jb25zdHJ1Y3Rvcj9uLmNvbnN0cnVjdG9yLm5hbWU6Im51bGwgcHJvdG90eXBlIn0obik7cmV0dXJuL15IVE1MKFx3KilFbGVtZW50JC8udGVzdChyKT9gW0hUTUxFbGVtZW50OiAke3J9XWA6YFtvYmplY3QgJHtyfV1gfWNhdGNoKHQpe3JldHVybmAqKm5vbi1zZXJpYWxpemFibGUqKiAoJHt0fSlgfXZhciBlfSh0LG4pO2lmKCFjLnN0YXJ0c1dpdGgoIltvYmplY3QgIikpcmV0dXJuIGM7aWYobi5fX3NlbnRyeV9za2lwX25vcm1hbGl6YXRpb25fXylyZXR1cm4gbjtjb25zdCB1PSJudW1iZXIiPT10eXBlb2Ygbi5fX3NlbnRyeV9vdmVycmlkZV9ub3JtYWxpemF0aW9uX2RlcHRoX18/bi5fX3NlbnRyeV9vdmVycmlkZV9ub3JtYWxpemF0aW9uX2RlcHRoX186ZTtpZigwPT09dSlyZXR1cm4gYy5yZXBsYWNlKCJvYmplY3QgIiwiIik7aWYoaShuKSlyZXR1cm4iW0NpcmN1bGFyIH5dIjtjb25zdCBhPW47aWYoYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEudG9KU09OKXRyeXtyZXR1cm4gVHQoIiIsYS50b0pTT04oKSx1LTEscixvKX1jYXRjaHt9Y29uc3QgZj1BcnJheS5pc0FycmF5KG4pP1tdOnt9O2xldCBoPTA7Y29uc3QgcD1SKG4pO2Zvcihjb25zdCB0IGluIHApe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCx0KSljb250aW51ZTtpZihoPj1yKXtmW3RdPSJbTWF4UHJvcGVydGllcyB+XSI7YnJlYWt9Y29uc3Qgbj1wW3RdO2ZbdF09VHQodCxuLHUtMSxyLG8pLGgrK31yZXR1cm4gcyhuKSxmfWZ1bmN0aW9uIGt0KHQsbil7Y29uc3QgZT1uLnJlcGxhY2UoL1xcL2csIi8iKS5yZXBsYWNlKC9bfFxce30oKVtcXV4kKyo/Ll0vZywiXFwkJiIpO2xldCByPXQ7dHJ5e3I9ZGVjb2RlVVJJKHQpfWNhdGNoe31yZXR1cm4gci5yZXBsYWNlKC9cXC9nLCIvIikucmVwbGFjZSgvd2VicGFjazpcLz8vZywiIikucmVwbGFjZShuZXcgUmVnRXhwKGAoZmlsZTovLyk/Lyoke2V9LypgLCJpZyIpLCJhcHA6Ly8vIil9ZnVuY3Rpb24gSXQodCxuPVtdKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBPdCh0LG4pe2NvbnN0IGU9dFsxXTtmb3IoY29uc3QgdCBvZiBlKXtpZihuKHQsdFswXS50eXBlKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBSdCh0KXtjb25zdCBuPW0ocCk7cmV0dXJuIG4uZW5jb2RlUG9seWZpbGw/bi5lbmNvZGVQb2x5ZmlsbCh0KToobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCl9ZnVuY3Rpb24gUHQodCl7Y29uc3RbbixlXT10O2xldCByPUpTT04uc3RyaW5naWZ5KG4pO2Z1bmN0aW9uIG8odCl7InN0cmluZyI9PXR5cGVvZiByP3I9InN0cmluZyI9PXR5cGVvZiB0P3IrdDpbUnQociksdF06ci5wdXNoKCJzdHJpbmciPT10eXBlb2YgdD9SdCh0KTp0KX1mb3IoY29uc3QgdCBvZiBlKXtjb25zdFtuLGVdPXQ7aWYobyhgXG4ke0pTT04uc3RyaW5naWZ5KG4pfVxuYCksInN0cmluZyI9PXR5cGVvZiBlfHxlIGluc3RhbmNlb2YgVWludDhBcnJheSlvKGUpO2Vsc2V7bGV0IHQ7dHJ5e3Q9SlNPTi5zdHJpbmdpZnkoZSl9Y2F0Y2h7dD1KU09OLnN0cmluZ2lmeShBdChlKSl9byh0KX19cmV0dXJuInN0cmluZyI9PXR5cGVvZiByP3I6ZnVuY3Rpb24odCl7Y29uc3Qgbj10LnJlZHVjZSgodCxuKT0+dCtuLmxlbmd0aCwwKSxlPW5ldyBVaW50OEFycmF5KG4pO2xldCByPTA7Zm9yKGNvbnN0IG4gb2YgdCllLnNldChuLHIpLHIrPW4ubGVuZ3RoO3JldHVybiBlfShyKX1jb25zdCBEdD17c2Vzc2lvbnM6InNlc3Npb24iLGV2ZW50OiJlcnJvciIsY2xpZW50X3JlcG9ydDoiaW50ZXJuYWwiLHVzZXJfcmVwb3J0OiJkZWZhdWx0Iixwcm9maWxlX2NodW5rOiJwcm9maWxlIixyZXBsYXlfZXZlbnQ6InJlcGxheSIscmVwbGF5X3JlY29yZGluZzoicmVwbGF5IixjaGVja19pbjoibW9uaXRvciIscmF3X3NlY3VyaXR5OiJzZWN1cml0eSIsbG9nOiJsb2dfaXRlbSIsdHJhY2VfbWV0cmljOiJtZXRyaWMifTtmdW5jdGlvbiBVdCh0KXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQgaW4gRHR9KHQpP0R0W3RdOnR9ZnVuY3Rpb24gTHQodCl7aWYoIXQ/LnNkaylyZXR1cm47Y29uc3R7bmFtZTpuLHZlcnNpb246ZX09dC5zZGs7cmV0dXJue25hbWU6bix2ZXJzaW9uOmV9fWZ1bmN0aW9uIE10KHQsbixlLHIpe2NvbnN0IG89THQoZSksaT10LnR5cGUmJiJyZXBsYXlfZXZlbnQiIT09dC50eXBlP3QudHlwZToiZXZlbnQiOyFmdW5jdGlvbih0LG4pe2lmKCFuKXJldHVybiB0O2NvbnN0IGU9dC5zZGt8fHt9O3Quc2RrPXsuLi5lLG5hbWU6ZS5uYW1lfHxuLm5hbWUsdmVyc2lvbjplLnZlcnNpb258fG4udmVyc2lvbixpbnRlZ3JhdGlvbnM6Wy4uLnQuc2RrPy5pbnRlZ3JhdGlvbnN8fFtdLC4uLm4uaW50ZWdyYXRpb25zfHxbXV0scGFja2FnZXM6Wy4uLnQuc2RrPy5wYWNrYWdlc3x8W10sLi4ubi5wYWNrYWdlc3x8W11dLHNldHRpbmdzOnQuc2RrPy5zZXR0aW5nc3x8bi5zZXR0aW5ncz97Li4udC5zZGs/LnNldHRpbmdzLC4uLm4uc2V0dGluZ3N9OnZvaWQgMH19KHQsZT8uc2RrKTtjb25zdCBzPWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89dC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE/LmR5bmFtaWNTYW1wbGluZ0NvbnRleHQ7cmV0dXJue2V2ZW50X2lkOnQuZXZlbnRfaWQsc2VudF9hdDoobmV3IERhdGUpLnRvSVNPU3RyaW5nKCksLi4ubiYme3NkazpufSwuLi4hIWUmJnImJntkc246YnQocil9LC4uLm8mJnt0cmFjZTpvfX19KHQsbyxyLG4pO2RlbGV0ZSB0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YTtyZXR1cm4gSXQocyxbW3t0eXBlOml9LHRdXSl9Y29uc3QgQnQ9Il9fU0VOVFJZX1NVUFBSRVNTX1RSQUNJTkdfXyI7ZnVuY3Rpb24gV3QodCl7Y29uc3Qgbj1mdChsKCkpO3JldHVybiBuLnN1cHByZXNzVHJhY2luZz9uLnN1cHByZXNzVHJhY2luZyh0KTpmdW5jdGlvbiguLi50KXtjb25zdCBuPWZ0KGwoKSk7aWYoMj09PXQubGVuZ3RoKXtjb25zdFtlLHJdPXQ7cmV0dXJuIGU/bi53aXRoU2V0U2NvcGUoZSxyKTpuLndpdGhTY29wZShyKX1yZXR1cm4gbi53aXRoU2NvcGUodFswXSl9KG49PntuLnNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh7W0J0XTohMH0pO2NvbnN0IGU9dCgpO3JldHVybiBuLnNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh7W0J0XTp2b2lkIDB9KSxlfSl9ZnVuY3Rpb24genQodCxuKXtjb25zdHtmaW5nZXJwcmludDplLHNwYW46cixicmVhZGNydW1iczpvLHNka1Byb2Nlc3NpbmdNZXRhZGF0YTppfT1uOyFmdW5jdGlvbih0LG4pe2NvbnN0e2V4dHJhOmUsdGFnczpyLHVzZXI6byxjb250ZXh0czppLGxldmVsOnMsdHJhbnNhY3Rpb25OYW1lOmN9PW47T2JqZWN0LmtleXMoZSkubGVuZ3RoJiYodC5leHRyYT17Li4uZSwuLi50LmV4dHJhfSk7T2JqZWN0LmtleXMocikubGVuZ3RoJiYodC50YWdzPXsuLi5yLC4uLnQudGFnc30pO09iamVjdC5rZXlzKG8pLmxlbmd0aCYmKHQudXNlcj17Li4ubywuLi50LnVzZXJ9KTtPYmplY3Qua2V5cyhpKS5sZW5ndGgmJih0LmNvbnRleHRzPXsuLi5pLC4uLnQuY29udGV4dHN9KTtzJiYodC5sZXZlbD1zKTtjJiYidHJhbnNhY3Rpb24iIT09dC50eXBlJiYodC50cmFuc2FjdGlvbj1jKX0odCxuKSxyJiZmdW5jdGlvbih0LG4pe3QuY29udGV4dHM9e3RyYWNlOl90KG4pLC4uLnQuY29udGV4dHN9LHQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhPXtkeW5hbWljU2FtcGxpbmdDb250ZXh0OkN0KG4pLC4uLnQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhfTtjb25zdCBlPWp0KG4pLHI9RXQoZSkuZGVzY3JpcHRpb247ciYmIXQudHJhbnNhY3Rpb24mJiJ0cmFuc2FjdGlvbiI9PT10LnR5cGUmJih0LnRyYW5zYWN0aW9uPXIpfSh0LHIpLGZ1bmN0aW9uKHQsbil7dC5maW5nZXJwcmludD10LmZpbmdlcnByaW50P0FycmF5LmlzQXJyYXkodC5maW5nZXJwcmludCk/dC5maW5nZXJwcmludDpbdC5maW5nZXJwcmludF06W10sbiYmKHQuZmluZ2VycHJpbnQ9dC5maW5nZXJwcmludC5jb25jYXQobikpO3QuZmluZ2VycHJpbnQubGVuZ3RofHxkZWxldGUgdC5maW5nZXJwcmludH0odCxlKSxmdW5jdGlvbih0LG4pe2NvbnN0IGU9Wy4uLnQuYnJlYWRjcnVtYnN8fFtdLC4uLm5dO3QuYnJlYWRjcnVtYnM9ZS5sZW5ndGg/ZTp2b2lkIDB9KHQsbyksZnVuY3Rpb24odCxuKXt0LnNka1Byb2Nlc3NpbmdNZXRhZGF0YT17Li4udC5zZGtQcm9jZXNzaW5nTWV0YWRhdGEsLi4ubn19KHQsaSl9Y2xhc3MgRnR7Y29uc3RydWN0b3IodCl7dGhpcy5XPTAsdGhpcy5GPVtdLHRoaXMuRyh0KX10aGVuKHQsbil7cmV0dXJuIG5ldyBGdCgoZSxyKT0+e3RoaXMuRi5wdXNoKFshMSxuPT57aWYodCl0cnl7ZSh0KG4pKX1jYXRjaCh0KXtyKHQpfWVsc2UgZShuKX0sdD0+e2lmKG4pdHJ5e2Uobih0KSl9Y2F0Y2godCl7cih0KX1lbHNlIHIodCl9XSksdGhpcy5IKCl9KX1jYXRjaCh0KXtyZXR1cm4gdGhpcy50aGVuKHQ9PnQsdCl9ZmluYWxseSh0KXtyZXR1cm4gbmV3IEZ0KChuLGUpPT57bGV0IHIsbztyZXR1cm4gdGhpcy50aGVuKG49PntvPSExLHI9bix0JiZ0KCl9LG49PntvPSEwLHI9bix0JiZ0KCl9KS50aGVuKCgpPT57bz9lKHIpOm4ocil9KX0pfUgoKXtpZigwPT09dGhpcy5XKXJldHVybjtjb25zdCB0PXRoaXMuRi5zbGljZSgpO3RoaXMuRj1bXSx0LmZvckVhY2godD0+e3RbMF18fCgxPT09dGhpcy5XJiZ0WzFdKHRoaXMuSiksMj09PXRoaXMuVyYmdFsyXSh0aGlzLkopLHRbMF09ITApfSl9Ryh0KXtjb25zdCBuPSh0LG4pPT57MD09PXRoaXMuVyYmKFQobik/bi50aGVuKGUscik6KHRoaXMuVz10LHRoaXMuSj1uLHRoaXMuSCgpKSl9LGU9dD0+e24oMSx0KX0scj10PT57bigyLHQpfTt0cnl7dChlLHIpfWNhdGNoKHQpe3IodCl9fX1jb25zdCBHdD1TeW1ib2wuZm9yKCJTZW50cnlCdWZmZXJGdWxsRXJyb3IiKTtmdW5jdGlvbiBIdCh0PTEwMCl7Y29uc3Qgbj1uZXcgU2V0O2Z1bmN0aW9uIGUodCl7bi5kZWxldGUodCl9cmV0dXJue2dldCAkKCl7cmV0dXJuIEFycmF5LmZyb20obil9LGFkZDpmdW5jdGlvbihyKXtpZighKG4uc2l6ZTx0KSlyZXR1cm4gbz1HdCxuZXcgRnQoKHQsbik9PntuKG8pfSk7dmFyIG87Y29uc3QgaT1yKCk7cmV0dXJuIG4uYWRkKGkpLGkudGhlbigoKT0+ZShpKSwoKT0+ZShpKSksaX0sZHJhaW46ZnVuY3Rpb24odCl7aWYoIW4uc2l6ZSlyZXR1cm4gZT0hMCxuZXcgRnQodD0+e3QoZSl9KTt2YXIgZTtjb25zdCByPVByb21pc2UuYWxsU2V0dGxlZChBcnJheS5mcm9tKG4pKS50aGVuKCgpPT4hMCk7aWYoIXQpcmV0dXJuIHI7Y29uc3Qgbz1bcixuZXcgUHJvbWlzZShuPT57cmV0dXJuIm9iamVjdCI9PXR5cGVvZihlPXNldFRpbWVvdXQoKCk9Pm4oITEpLHQpKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudW5yZWYmJmUudW5yZWYoKSxlO3ZhciBlfSldO3JldHVybiBQcm9taXNlLnJhY2Uobyl9fX1mdW5jdGlvbiBKdCh0LHtzdGF0dXNDb2RlOm4saGVhZGVyczplfSxyPVcoKSl7Y29uc3Qgbz17Li4udH0saT1lPy5bIngtc2VudHJ5LXJhdGUtbGltaXRzIl0scz1lPy5bInJldHJ5LWFmdGVyIl07aWYoaSlmb3IoY29uc3QgdCBvZiBpLnRyaW0oKS5zcGxpdCgiLCIpKXtjb25zdFtuLGUsLCxpXT10LnNwbGl0KCI6Iiw1KSxzPXBhcnNlSW50KG4sMTApLGM9MWUzKihpc05hTihzKT82MDpzKTtpZihlKWZvcihjb25zdCB0IG9mIGUuc3BsaXQoIjsiKSkibWV0cmljX2J1Y2tldCI9PT10JiZpJiYhaS5zcGxpdCgiOyIpLmluY2x1ZGVzKCJjdXN0b20iKXx8KG9bdF09citjKTtlbHNlIG8uYWxsPXIrY31lbHNlIHM/by5hbGw9citmdW5jdGlvbih0LG49VygpKXtjb25zdCBlPXBhcnNlSW50KGAke3R9YCwxMCk7aWYoIWlzTmFOKGUpKXJldHVybiAxZTMqZTtjb25zdCByPURhdGUucGFyc2UoYCR7dH1gKTtyZXR1cm4gaXNOYU4ocik/NmU0OnItbn0ocyxyKTo0Mjk9PT1uJiYoby5hbGw9cis2ZTQpO3JldHVybiBvfWZ1bmN0aW9uIFl0KHQsbixlPUh0KHQuYnVmZmVyU2l6ZXx8NjQpKXtsZXQgcj17fTtyZXR1cm57c2VuZDpmdW5jdGlvbih0KXtjb25zdCBvPVtdO2lmKE90KHQsKHQsbik9Pntjb25zdCBlPVV0KG4pOyhmdW5jdGlvbih0LG4sZT1XKCkpe3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiB0W25dfHx0LmFsbHx8MH0odCxuKT5lfSkocixlKXx8by5wdXNoKHQpfSksMD09PW8ubGVuZ3RoKXJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO2NvbnN0IGk9SXQodFswXSxvKSxzPXQ9PnshZnVuY3Rpb24odCxuKXtyZXR1cm4gT3QodCwodCxlKT0+bi5pbmNsdWRlcyhlKSl9KGksWyJjbGllbnRfcmVwb3J0Il0pP090KGksKHQsbik9Pnt9KTpoJiZTLndhcm4oYERyb3BwaW5nIGNsaWVudCByZXBvcnQuIFdpbGwgbm90IHNlbmQgb3V0Y29tZXMgKHJlYXNvbjogJHt0fSkuYCl9O3JldHVybiBlLmFkZCgoKT0+bih7Ym9keTpQdChpKX0pLnRoZW4odD0+NDEzPT09dC5zdGF0dXNDb2RlPyhoJiZTLmVycm9yKCJTZW50cnkgcmVzcG9uZGVkIHdpdGggc3RhdHVzIGNvZGUgNDEzLiBFbnZlbG9wZSB3YXMgZGlzY2FyZGVkIGR1ZSB0byBleGNlZWRpbmcgc2l6ZSBsaW1pdHMuIikscygic2VuZF9lcnJvciIpLHQpOihoJiZ2b2lkIDAhPT10LnN0YXR1c0NvZGUmJih0LnN0YXR1c0NvZGU8MjAwfHx0LnN0YXR1c0NvZGU+PTMwMCkmJlMud2FybihgU2VudHJ5IHJlc3BvbmRlZCB3aXRoIHN0YXR1cyBjb2RlICR7dC5zdGF0dXNDb2RlfSB0byBzZW50IGV2ZW50LmApLHI9SnQocix0KSx0KSx0PT57dGhyb3cgcygibmV0d29ya19lcnJvciIpLGgmJlMuZXJyb3IoIkVuY291bnRlcmVkIGVycm9yIHJ1bm5pbmcgdHJhbnNwb3J0IHJlcXVlc3Q6Iix0KSx0fSkpLnRoZW4odD0+dCx0PT57aWYodD09PUd0KXJldHVybiBoJiZTLmVycm9yKCJTa2lwcGVkIHNlbmRpbmcgZXZlbnQgYmVjYXVzZSBidWZmZXIgaXMgZnVsbC4iKSxzKCJxdWV1ZV9vdmVyZmxvdyIpLFByb21pc2UucmVzb2x2ZSh7fSk7dGhyb3cgdH0pfSxmbHVzaDp0PT5lLmRyYWluKHQpfX1jb25zdCBWdD0vXihcUys6XFx8XC8/KShbXHNcU10qPykoKD86XC57MSwyfXxbXi9cXF0rP3wpKFwuW14uL1xcXSp8KSkoPzpbL1xcXSopJC87ZnVuY3Rpb24gS3QodCl7Y29uc3Qgbj1mdW5jdGlvbih0KXtjb25zdCBuPXQubGVuZ3RoPjEwMjQ/YDx0cnVuY2F0ZWQ+JHt0LnNsaWNlKC0xMDI0KX1gOnQsZT1WdC5leGVjKG4pO3JldHVybiBlP2Uuc2xpY2UoMSk6W119KHQpLGU9blswXXx8IiI7bGV0IHI9blsxXTtyZXR1cm4gZXx8cj8ociYmKHI9ci5zbGljZSgwLHIubGVuZ3RoLTEpKSxlK3IpOiIuIn1mdW5jdGlvbiBadCh0LG49ITEpe3JldHVybiEobnx8dCYmIXQuc3RhcnRzV2l0aCgiLyIpJiYhdC5tYXRjaCgvXltBLVpdOi8pJiYhdC5zdGFydHNXaXRoKCIuIikmJiF0Lm1hdGNoKC9eW2EtekEtWl0oW2EtekEtWjAtOS5cLStdKSo6XC9cLy8pKSYmdm9pZCAwIT09dCYmIXQuaW5jbHVkZXMoIm5vZGVfbW9kdWxlcy8iKX1jb25zdCBxdD1TeW1ib2woIkFnZW50QmFzZUludGVybmFsU3RhdGUiKTtjbGFzcyBRdCBleHRlbmRzIGkuQWdlbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpc1txdF09e319aXNTZWN1cmVFbmRwb2ludCh0KXtpZih0KXtpZigiYm9vbGVhbiI9PXR5cGVvZiB0LnNlY3VyZUVuZHBvaW50KXJldHVybiB0LnNlY3VyZUVuZHBvaW50O2lmKCJzdHJpbmciPT10eXBlb2YgdC5wcm90b2NvbClyZXR1cm4iaHR0cHM6Ij09PXQucHJvdG9jb2x9Y29uc3R7c3RhY2s6bn09bmV3IEVycm9yO3JldHVybiJzdHJpbmciPT10eXBlb2YgbiYmbi5zcGxpdCgiXG4iKS5zb21lKHQ9Pi0xIT09dC5pbmRleE9mKCIoaHR0cHMuanM6Iil8fC0xIT09dC5pbmRleE9mKCJub2RlOmh0dHBzOiIpKX1jcmVhdGVTb2NrZXQodCxuLGUpe2NvbnN0IHI9ey4uLm4sc2VjdXJlRW5kcG9pbnQ6dGhpcy5pc1NlY3VyZUVuZHBvaW50KG4pfTtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT50aGlzLmNvbm5lY3QodCxyKSkudGhlbihvPT57aWYobyBpbnN0YW5jZW9mIGkuQWdlbnQpcmV0dXJuIG8uYWRkUmVxdWVzdCh0LHIpO3RoaXNbcXRdLmN1cnJlbnRTb2NrZXQ9byxzdXBlci5jcmVhdGVTb2NrZXQodCxuLGUpfSxlKX1jcmVhdGVDb25uZWN0aW9uKCl7Y29uc3QgdD10aGlzW3F0XS5jdXJyZW50U29ja2V0O2lmKHRoaXNbcXRdLmN1cnJlbnRTb2NrZXQ9dm9pZCAwLCF0KXRocm93IG5ldyBFcnJvcigiTm8gc29ja2V0IHdhcyByZXR1cm5lZCBpbiB0aGUgYGNvbm5lY3QoKWAgZnVuY3Rpb24iKTtyZXR1cm4gdH1nZXQgZGVmYXVsdFBvcnQoKXtyZXR1cm4gdGhpc1txdF0uZGVmYXVsdFBvcnQ/PygiaHR0cHM6Ij09PXRoaXMucHJvdG9jb2w/NDQzOjgwKX1zZXQgZGVmYXVsdFBvcnQodCl7dGhpc1txdF0mJih0aGlzW3F0XS5kZWZhdWx0UG9ydD10KX1nZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpc1txdF0ucHJvdG9jb2w/Pyh0aGlzLmlzU2VjdXJlRW5kcG9pbnQoKT8iaHR0cHM6IjoiaHR0cDoiKX1zZXQgcHJvdG9jb2wodCl7dGhpc1txdF0mJih0aGlzW3F0XS5wcm90b2NvbD10KX19ZnVuY3Rpb24gWHQoLi4udCl7Uy5sb2coIltodHRwcy1wcm94eS1hZ2VudDpwYXJzZS1wcm94eS1yZXNwb25zZV0iLC4uLnQpfWZ1bmN0aW9uIHRuKHQpe3JldHVybiBuZXcgUHJvbWlzZSgobixlKT0+e2xldCByPTA7Y29uc3Qgbz1bXTtmdW5jdGlvbiBpKCl7Y29uc3QgYz10LnJlYWQoKTtjP2Z1bmN0aW9uKGMpe28ucHVzaChjKSxyKz1jLmxlbmd0aDtjb25zdCB1PUJ1ZmZlci5jb25jYXQobyxyKSxhPXUuaW5kZXhPZigiXHJcblxyXG4iKTtpZigtMT09PWEpcmV0dXJuIFh0KCJoYXZlIG5vdCByZWNlaXZlZCBlbmQgb2YgSFRUUCBoZWFkZXJzIHlldC4uLiIpLHZvaWQgaSgpO2NvbnN0IGY9dS5zdWJhcnJheSgwLGEpLnRvU3RyaW5nKCJhc2NpaSIpLnNwbGl0KCJcclxuIiksaD1mLnNoaWZ0KCk7aWYoIWgpcmV0dXJuIHQuZGVzdHJveSgpLGUobmV3IEVycm9yKCJObyBoZWFkZXIgcmVjZWl2ZWQgZnJvbSBwcm94eSBDT05ORUNUIHJlc3BvbnNlIikpO2NvbnN0IHA9aC5zcGxpdCgiICIpLGQ9KyhwWzFdfHwwKSxsPXAuc2xpY2UoMikuam9pbigiICIpLG09e307Zm9yKGNvbnN0IG4gb2YgZil7aWYoIW4pY29udGludWU7Y29uc3Qgcj1uLmluZGV4T2YoIjoiKTtpZigtMT09PXIpcmV0dXJuIHQuZGVzdHJveSgpLGUobmV3IEVycm9yKGBJbnZhbGlkIGhlYWRlciBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2U6ICIke259ImApKTtjb25zdCBvPW4uc2xpY2UoMCxyKS50b0xvd2VyQ2FzZSgpLGk9bi5zbGljZShyKzEpLnRyaW1TdGFydCgpLHM9bVtvXTsic3RyaW5nIj09dHlwZW9mIHM/bVtvXT1bcyxpXTpBcnJheS5pc0FycmF5KHMpP3MucHVzaChpKTptW29dPWl9WHQoImdvdCBwcm94eSBzZXJ2ZXIgcmVzcG9uc2U6ICVvICVvIixoLG0pLHMoKSxuKHtjb25uZWN0OntzdGF0dXNDb2RlOmQsc3RhdHVzVGV4dDpsLGhlYWRlcnM6bX0sYnVmZmVyZWQ6dX0pfShjKTp0Lm9uY2UoInJlYWRhYmxlIixpKX1mdW5jdGlvbiBzKCl7dC5yZW1vdmVMaXN0ZW5lcigiZW5kIixjKSx0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsdSksdC5yZW1vdmVMaXN0ZW5lcigicmVhZGFibGUiLGkpfWZ1bmN0aW9uIGMoKXtzKCksWHQoIm9uZW5kIiksZShuZXcgRXJyb3IoIlByb3h5IGNvbm5lY3Rpb24gZW5kZWQgYmVmb3JlIHJlY2VpdmluZyBDT05ORUNUIHJlc3BvbnNlIikpfWZ1bmN0aW9uIHUodCl7cygpLFh0KCJvbmVycm9yICVvIix0KSxlKHQpfXQub24oImVycm9yIix1KSx0Lm9uKCJlbmQiLGMpLGkoKX0pfWZ1bmN0aW9uIG5uKC4uLnQpe1MubG9nKCJbaHR0cHMtcHJveHktYWdlbnRdIiwuLi50KX1jbGFzcyBlbiBleHRlbmRzIFF0e3N0YXRpYyBfX2luaXRTdGF0aWMoKXt0aGlzLnByb3RvY29scz1bImh0dHAiLCJodHRwcyJdfWNvbnN0cnVjdG9yKHQsbil7c3VwZXIobiksdGhpcy5vcHRpb25zPXt9LHRoaXMucHJveHk9InN0cmluZyI9PXR5cGVvZiB0P25ldyBVUkwodCk6dCx0aGlzLnByb3h5SGVhZGVycz1uPy5oZWFkZXJzPz97fSxubigiQ3JlYXRpbmcgbmV3IEh0dHBzUHJveHlBZ2VudCBpbnN0YW5jZTogJW8iLHRoaXMucHJveHkuaHJlZik7Y29uc3QgZT0odGhpcy5wcm94eS5ob3N0bmFtZXx8dGhpcy5wcm94eS5ob3N0KS5yZXBsYWNlKC9eXFt8XF0kL2csIiIpLHI9dGhpcy5wcm94eS5wb3J0P3BhcnNlSW50KHRoaXMucHJveHkucG9ydCwxMCk6Imh0dHBzOiI9PT10aGlzLnByb3h5LnByb3RvY29sPzQ0Mzo4MDt0aGlzLmNvbm5lY3RPcHRzPXtBTFBOUHJvdG9jb2xzOlsiaHR0cC8xLjEiXSwuLi5uP29uKG4sImhlYWRlcnMiKTpudWxsLGhvc3Q6ZSxwb3J0OnJ9fWFzeW5jIGNvbm5lY3QodCxuKXtjb25zdHtwcm94eTplfT10aGlzO2lmKCFuLmhvc3QpdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gImhvc3QiIHByb3ZpZGVkJyk7bGV0IHI7aWYoImh0dHBzOiI9PT1lLnByb3RvY29sKXtubigiQ3JlYXRpbmcgYHRscy5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cyk7Y29uc3QgdD10aGlzLmNvbm5lY3RPcHRzLnNlcnZlcm5hbWV8fHRoaXMuY29ubmVjdE9wdHMuaG9zdDtyPWYuY29ubmVjdCh7Li4udGhpcy5jb25uZWN0T3B0cyxzZXJ2ZXJuYW1lOnQmJmEuaXNJUCh0KT92b2lkIDA6dH0pfWVsc2Ugbm4oIkNyZWF0aW5nIGBuZXQuU29ja2V0YDogJW8iLHRoaXMuY29ubmVjdE9wdHMpLHI9YS5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO2NvbnN0IG89ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucHJveHlIZWFkZXJzP3RoaXMucHJveHlIZWFkZXJzKCk6ey4uLnRoaXMucHJveHlIZWFkZXJzfSxpPWEuaXNJUHY2KG4uaG9zdCk/YFske24uaG9zdH1dYDpuLmhvc3Q7bGV0IHM9YENPTk5FQ1QgJHtpfToke24ucG9ydH0gSFRUUC8xLjFcclxuYDtpZihlLnVzZXJuYW1lfHxlLnBhc3N3b3JkKXtjb25zdCB0PWAke2RlY29kZVVSSUNvbXBvbmVudChlLnVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQoZS5wYXNzd29yZCl9YDtvWyJQcm94eS1BdXRob3JpemF0aW9uIl09YEJhc2ljICR7QnVmZmVyLmZyb20odCkudG9TdHJpbmcoImJhc2U2NCIpfWB9by5Ib3N0PWAke2l9OiR7bi5wb3J0fWAsb1siUHJveHktQ29ubmVjdGlvbiJdfHwob1siUHJveHktQ29ubmVjdGlvbiJdPXRoaXMua2VlcEFsaXZlPyJLZWVwLUFsaXZlIjoiY2xvc2UiKTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhvKSlzKz1gJHt0fTogJHtvW3RdfVxyXG5gO2NvbnN0IGM9dG4ocik7ci53cml0ZShgJHtzfVxyXG5gKTtjb25zdHtjb25uZWN0OnUsYnVmZmVyZWQ6aH09YXdhaXQgYztpZih0LmVtaXQoInByb3h5Q29ubmVjdCIsdSksdGhpcy5lbWl0KCJwcm94eUNvbm5lY3QiLHUsdCksMjAwPT09dS5zdGF0dXNDb2RlKXtpZih0Lm9uY2UoInNvY2tldCIscm4pLG4uc2VjdXJlRW5kcG9pbnQpe25uKCJVcGdyYWRpbmcgc29ja2V0IGNvbm5lY3Rpb24gdG8gVExTIik7Y29uc3QgdD1uLnNlcnZlcm5hbWV8fG4uaG9zdDtyZXR1cm4gZi5jb25uZWN0KHsuLi5vbihuLCJob3N0IiwicGF0aCIsInBvcnQiKSxzb2NrZXQ6cixzZXJ2ZXJuYW1lOmEuaXNJUCh0KT92b2lkIDA6dH0pfXJldHVybiByfXIuZGVzdHJveSgpO2NvbnN0IHA9bmV3IGEuU29ja2V0KHt3cml0YWJsZTohMX0pO3JldHVybiBwLnJlYWRhYmxlPSEwLHQub25jZSgic29ja2V0Iix0PT57bm4oIlJlcGxheWluZyBwcm94eSBidWZmZXIgZm9yIGZhaWxlZCByZXF1ZXN0IiksdC5wdXNoKGgpLHQucHVzaChudWxsKX0pLHB9fWZ1bmN0aW9uIHJuKHQpe3QucmVzdW1lKCl9ZnVuY3Rpb24gb24odCwuLi5uKXtjb25zdCBlPXt9O2xldCByO2ZvcihyIGluIHQpbi5pbmNsdWRlcyhyKXx8KGVbcl09dFtyXSk7cmV0dXJuIGV9ZW4uX19pbml0U3RhdGljKCk7ZnVuY3Rpb24gc24odCl7cmV0dXJuIHQucmVwbGFjZSgvXltBLVpdOi8sIiIpLnJlcGxhY2UoL1xcL2csIi8iKX1jb25zdCBjbj1uO2xldCB1bixhbj0wLGZuPXt9O2Z1bmN0aW9uIGhuKHQpe2NuLmRlYnVnJiZjb25zb2xlLmxvZyhgW0FOUiBXb3JrZXJdICR7dH1gKX12YXIgcG4sZG4sbG47Y29uc3QgbW49ZnVuY3Rpb24odCl7bGV0IG47dHJ5e249bmV3IFVSTCh0LnVybCl9Y2F0Y2gobil7cmV0dXJuIGIoKCk9Pntjb25zb2xlLndhcm4oIltAc2VudHJ5L25vZGVdOiBJbnZhbGlkIGRzbiBvciB0dW5uZWwgb3B0aW9uLCB3aWxsIG5vdCBzZW5kIGFueSBldmVudHMuIFRoZSB0dW5uZWwgb3B0aW9uIG11c3QgYmUgYSBmdWxsIFVSTCB3aGVuIHVzZWQuIil9KSxZdCh0LCgpPT5Qcm9taXNlLnJlc29sdmUoe30pKX1jb25zdCBlPSJodHRwczoiPT09bi5wcm90b2NvbCxyPWZ1bmN0aW9uKHQsbil7Y29uc3R7bm9fcHJveHk6ZX09cHJvY2Vzcy5lbnYscj1lPy5zcGxpdCgiLCIpLnNvbWUobj0+dC5ob3N0LmVuZHNXaXRoKG4pfHx0Lmhvc3RuYW1lLmVuZHNXaXRoKG4pKTtyZXR1cm4gcj92b2lkIDA6bn0obix0LnByb3h5fHwoZT9wcm9jZXNzLmVudi5odHRwc19wcm94eTp2b2lkIDApfHxwcm9jZXNzLmVudi5odHRwX3Byb3h5KSxvPWU/czppLGE9dm9pZCAwIT09dC5rZWVwQWxpdmUmJnQua2VlcEFsaXZlLGY9cj9uZXcgZW4ocik6bmV3IG8uQWdlbnQoe2tlZXBBbGl2ZTphLG1heFNvY2tldHM6MzAsdGltZW91dDoyZTN9KSxoPWZ1bmN0aW9uKHQsbixlKXtjb25zdHtob3N0bmFtZTpyLHBhdGhuYW1lOm8scG9ydDppLHByb3RvY29sOnMsc2VhcmNoOmF9PW5ldyBVUkwodC51cmwpO3JldHVybiBmdW5jdGlvbihmKXtyZXR1cm4gbmV3IFByb21pc2UoKGgscCk9PntXdCgoKT0+e2xldCBkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYyh7cmVhZCgpe3RoaXMucHVzaCh0KSx0aGlzLnB1c2gobnVsbCl9fSl9KGYuYm9keSk7Y29uc3QgbD17Li4udC5oZWFkZXJzfTtmLmJvZHkubGVuZ3RoPjMyNzY4JiYobFsiY29udGVudC1lbmNvZGluZyJdPSJnemlwIixkPWQucGlwZSh1KCkpKTtjb25zdCBtPXIuc3RhcnRzV2l0aCgiWyIpLGc9bi5yZXF1ZXN0KHttZXRob2Q6IlBPU1QiLGFnZW50OmUsaGVhZGVyczpsLGhvc3RuYW1lOm0/ci5zbGljZSgxLC0xKTpyLHBhdGg6YCR7b30ke2F9YCxwb3J0OmkscHJvdG9jb2w6cyxjYTp0LmNhQ2VydHN9LHQ9Pnt0Lm9uKCJkYXRhIiwoKT0+e30pLHQub24oImVuZCIsKCk9Pnt9KSx0LnNldEVuY29kaW5nKCJ1dGY4Iik7Y29uc3Qgbj10LmhlYWRlcnNbInJldHJ5LWFmdGVyIl0/P251bGwsZT10LmhlYWRlcnNbIngtc2VudHJ5LXJhdGUtbGltaXRzIl0/P251bGw7aCh7c3RhdHVzQ29kZTp0LnN0YXR1c0NvZGUsaGVhZGVyczp7InJldHJ5LWFmdGVyIjpuLCJ4LXNlbnRyeS1yYXRlLWxpbWl0cyI6QXJyYXkuaXNBcnJheShlKT9lWzBdfHxudWxsOmV9fSl9KTtnLm9uKCJlcnJvciIscCksZC5waXBlKGcpfSl9KX19KHQsdC5odHRwTW9kdWxlPz9vLGYpO3JldHVybiBZdCh0LGgpfSh7dXJsOihwbj1jbi5kc24sZG49Y24udHVubmVsLGxuPWNuLnNka01ldGFkYXRhLnNkayxkbnx8YCR7ZnVuY3Rpb24odCl7cmV0dXJuYCR7ZnVuY3Rpb24odCl7Y29uc3Qgbj10LnByb3RvY29sP2Ake3QucHJvdG9jb2x9OmA6IiIsZT10LnBvcnQ/YDoke3QucG9ydH1gOiIiO3JldHVybmAke259Ly8ke3QuaG9zdH0ke2V9JHt0LnBhdGg/YC8ke3QucGF0aH1gOiIifS9hcGkvYH0odCl9JHt0LnByb2plY3RJZH0vZW52ZWxvcGUvYH0ocG4pfT8ke2Z1bmN0aW9uKHQsbil7Y29uc3QgZT17c2VudHJ5X3ZlcnNpb246IjcifTtyZXR1cm4gdC5wdWJsaWNLZXkmJihlLnNlbnRyeV9rZXk9dC5wdWJsaWNLZXkpLG4mJihlLnNlbnRyeV9jbGllbnQ9YCR7bi5uYW1lfS8ke24udmVyc2lvbn1gKSxuZXcgVVJMU2VhcmNoUGFyYW1zKGUpLnRvU3RyaW5nKCl9KHBuLGxuKX1gKX0pO2FzeW5jIGZ1bmN0aW9uIGduKCl7aWYodW4pe2huKCJTZW5kaW5nIGFibm9ybWFsIHNlc3Npb24iKSxWKHVuLHtzdGF0dXM6ImFibm9ybWFsIixhYm5vcm1hbF9tZWNoYW5pc206ImFucl9mb3JlZ3JvdW5kIixyZWxlYXNlOmNuLnJlbGVhc2UsZW52aXJvbm1lbnQ6Y24uZW52aXJvbm1lbnR9KTtjb25zdCB0PWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89THQoZSk7cmV0dXJuIEl0KHtzZW50X2F0OihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKSwuLi5vJiZ7c2RrOm99LC4uLiEhciYmbiYme2RzbjpidChuKX19LFsiYWdncmVnYXRlcyJpbiB0P1t7dHlwZToic2Vzc2lvbnMifSx0XTpbe3R5cGU6InNlc3Npb24ifSx0LnRvSlNPTigpXV0pfSh1bixjbi5kc24sY24uc2RrTWV0YWRhdGEsY24udHVubmVsKTtobihKU09OLnN0cmluZ2lmeSh0KSksYXdhaXQgbW4uc2VuZCh0KTt0cnl7ZT8ucG9zdE1lc3NhZ2UoInNlc3Npb24tZW5kZWQiKX1jYXRjaHt9fX1mdW5jdGlvbiB5bih0KXtpZighdClyZXR1cm47Y29uc3Qgbj1mdW5jdGlvbih0KXtpZighdC5sZW5ndGgpcmV0dXJuW107Y29uc3Qgbj1BcnJheS5mcm9tKHQpO3JldHVybi9zZW50cnlXcmFwcGVkLy50ZXN0KEUobikuZnVuY3Rpb258fCIiKSYmbi5wb3AoKSxuLnJldmVyc2UoKSwkLnRlc3QoRShuKS5mdW5jdGlvbnx8IiIpJiYobi5wb3AoKSwkLnRlc3QoRShuKS5mdW5jdGlvbnx8IiIpJiZuLnBvcCgpKSxuLnNsaWNlKDAsNTApLm1hcCh0PT4oey4uLnQsZmlsZW5hbWU6dC5maWxlbmFtZXx8RShuKS5maWxlbmFtZSxmdW5jdGlvbjp0LmZ1bmN0aW9ufHwiPyJ9KSl9KHQpO2lmKGNuLmFwcFJvb3RQYXRoKWZvcihjb25zdCB0IG9mIG4pdC5maWxlbmFtZSYmKHQuZmlsZW5hbWU9a3QodC5maWxlbmFtZSxjbi5hcHBSb290UGF0aCkpO3JldHVybiBufWFzeW5jIGZ1bmN0aW9uIGJuKHQsbil7aWYoYW4+PWNuLm1heEFuckV2ZW50cylyZXR1cm47YW4rPTEsYXdhaXQgZ24oKSxobigiU2VuZGluZyBldmVudCIpO2NvbnN0IGU9e2V2ZW50X2lkOkYoKSxjb250ZXh0czpjbi5jb250ZXh0cyxyZWxlYXNlOmNuLnJlbGVhc2UsZW52aXJvbm1lbnQ6Y24uZW52aXJvbm1lbnQsZGlzdDpjbi5kaXN0LHBsYXRmb3JtOiJub2RlIixsZXZlbDoiZXJyb3IiLGV4Y2VwdGlvbjp7dmFsdWVzOlt7dHlwZToiQXBwbGljYXRpb25Ob3RSZXNwb25kaW5nIix2YWx1ZTpgQXBwbGljYXRpb24gTm90IFJlc3BvbmRpbmcgZm9yIGF0IGxlYXN0ICR7Y24uYW5yVGhyZXNob2xkfSBtc2Asc3RhY2t0cmFjZTp7ZnJhbWVzOnluKHQpfSxtZWNoYW5pc206e3R5cGU6IkFOUiJ9fV19LHRhZ3M6Y24uc3RhdGljVGFnc307biYmZnVuY3Rpb24odCxuKXtpZih6dCh0LG4pLCF0LmNvbnRleHRzPy50cmFjZSl7Y29uc3R7dHJhY2VJZDplLHBhcmVudFNwYW5JZDpyLHByb3BhZ2F0aW9uU3BhbklkOm99PW4ucHJvcGFnYXRpb25Db250ZXh0O3QuY29udGV4dHM9e3RyYWNlOnt0cmFjZV9pZDplLHNwYW5faWQ6b3x8cSgpLHBhcmVudF9zcGFuX2lkOnJ9LC4uLnQuY29udGV4dHN9fX0oZSxuKSxmdW5jdGlvbih0KXtpZigwPT09T2JqZWN0LmtleXMoZm4pLmxlbmd0aClyZXR1cm47Y29uc3Qgbj1jbi5hcHBSb290UGF0aD97fTpmbjtpZihjbi5hcHBSb290UGF0aClmb3IoY29uc3RbdCxlXW9mIE9iamVjdC5lbnRyaWVzKGZuKSluW2t0KHQsY24uYXBwUm9vdFBhdGgpXT1lO2NvbnN0IGU9bmV3IE1hcDtmb3IoY29uc3QgciBvZiB0LmV4Y2VwdGlvbj8udmFsdWVzfHxbXSlmb3IoY29uc3QgdCBvZiByLnN0YWNrdHJhY2U/LmZyYW1lc3x8W10pe2NvbnN0IHI9dC5hYnNfcGF0aHx8dC5maWxlbmFtZTtyJiZuW3JdJiZlLnNldChyLG5bcl0pfWlmKGUuc2l6ZT4wKXtjb25zdCBuPVtdO2Zvcihjb25zdFt0LHJdb2YgZS5lbnRyaWVzKCkpbi5wdXNoKHt0eXBlOiJzb3VyY2VtYXAiLGNvZGVfZmlsZTp0LGRlYnVnX2lkOnJ9KTt0LmRlYnVnX21ldGE9e2ltYWdlczpufX19KGUpO2NvbnN0IHI9TXQoZSxjbi5kc24sY24uc2RrTWV0YWRhdGEsY24udHVubmVsKTtobihKU09OLnN0cmluZ2lmeShyKSksYXdhaXQgbW4uc2VuZChyKSxhd2FpdCBtbi5mbHVzaCgyZTMpLGFuPj1jbi5tYXhBbnJFdmVudHMmJnNldFRpbWVvdXQoKCk9Pntwcm9jZXNzLmV4aXQoMCl9LDVlMyl9bGV0IHZuO2lmKGhuKCJTdGFydGVkIiksY24uY2FwdHVyZVN0YWNrVHJhY2Upe2huKCJDb25uZWN0aW5nIHRvIGRlYnVnZ2VyIik7Y29uc3Qgbj1uZXcgdDtuLmNvbm5lY3RUb01haW5UaHJlYWQoKSxobigiQ29ubmVjdGVkIHRvIGRlYnVnZ2VyIik7Y29uc3QgZT1uZXcgTWFwO24ub24oIkRlYnVnZ2VyLnNjcmlwdFBhcnNlZCIsdD0+e2Uuc2V0KHQucGFyYW1zLnNjcmlwdElkLHQucGFyYW1zLnVybCl9KSxuLm9uKCJEZWJ1Z2dlci5wYXVzZWQiLHQ9PntpZigib3RoZXIiPT09dC5wYXJhbXMucmVhc29uKXRyeXtobigiRGVidWdnZXIgcGF1c2VkIik7Y29uc3QgaT1bLi4udC5wYXJhbXMuY2FsbEZyYW1lc10scz1jbi5hcHBSb290UGF0aD9mdW5jdGlvbih0PShwcm9jZXNzLmFyZ3ZbMV0/S3QocHJvY2Vzcy5hcmd2WzFdKTpwcm9jZXNzLmN3ZCgpKSxuPSJcXCI9PT1vKXtjb25zdCBlPW4/c24odCk6dDtyZXR1cm4gdD0+e2lmKCF0KXJldHVybjtjb25zdCBvPW4/c24odCk6dDtsZXR7ZGlyOmksYmFzZTpzLGV4dDpjfT1yLnBhcnNlKG8pOyIuanMiIT09YyYmIi5tanMiIT09YyYmIi5janMiIT09Y3x8KHM9cy5zbGljZSgwLC0xKmMubGVuZ3RoKSk7Y29uc3QgdT1kZWNvZGVVUklDb21wb25lbnQocyk7aXx8KGk9Ii4iKTtjb25zdCBhPWkubGFzdEluZGV4T2YoIi9ub2RlX21vZHVsZXMiKTtpZihhPi0xKXJldHVybmAke2kuc2xpY2UoYSsxNCkucmVwbGFjZSgvXC8vZywiLiIpfToke3V9YDtpZihpLnN0YXJ0c1dpdGgoZSkpe2NvbnN0IHQ9aS5zbGljZShlLmxlbmd0aCsxKS5yZXBsYWNlKC9cLy9nLCIuIik7cmV0dXJuIHQ/YCR7dH06JHt1fWA6dX1yZXR1cm4gdX19KGNuLmFwcFJvb3RQYXRoKTooKT0+e30sYz1pLm1hcCh0PT5mdW5jdGlvbih0LG4sZSl7Y29uc3Qgcj1uP24ucmVwbGFjZSgvXmZpbGU6XC9cLy8sIiIpOnZvaWQgMCxvPXQubG9jYXRpb24uY29sdW1uTnVtYmVyP3QubG9jYXRpb24uY29sdW1uTnVtYmVyKzE6dm9pZCAwLGk9dC5sb2NhdGlvbi5saW5lTnVtYmVyP3QubG9jYXRpb24ubGluZU51bWJlcisxOnZvaWQgMDtyZXR1cm57ZmlsZW5hbWU6cixtb2R1bGU6ZShyKSxmdW5jdGlvbjp0LmZ1bmN0aW9uTmFtZXx8Ij8iLGNvbG5vOm8sbGluZW5vOmksaW5fYXBwOnI/WnQocik6dm9pZCAwfX0odCxlLmdldCh0LmxvY2F0aW9uLnNjcmlwdElkKSxzKSksdT1zZXRUaW1lb3V0KCgpPT57Ym4oYykudGhlbihudWxsLCgpPT57aG4oIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pfSw1ZTMpO24ucG9zdCgiUnVudGltZS5ldmFsdWF0ZSIse2V4cHJlc3Npb246Imdsb2JhbC5fX1NFTlRSWV9HRVRfU0NPUEVTX18oKTsiLHNpbGVudDohMCxyZXR1cm5CeVZhbHVlOiEwfSwodCxlKT0+e3QmJmhuKGBFcnJvciBleGVjdXRpbmcgc2NyaXB0OiAnJHt0Lm1lc3NhZ2V9J2ApLGNsZWFyVGltZW91dCh1KTtjb25zdCByPWU/LnJlc3VsdD9lLnJlc3VsdC52YWx1ZTp2b2lkIDA7bi5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKSxuLnBvc3QoIkRlYnVnZ2VyLmRpc2FibGUiKSxibihjLHIpLnRoZW4obnVsbCwoKT0+e2huKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQuIil9KX0pfWNhdGNoKHQpe3Rocm93IG4ucG9zdCgiRGVidWdnZXIucmVzdW1lIiksbi5wb3N0KCJEZWJ1Z2dlci5kaXNhYmxlIiksdH19KSx2bj0oKT0+e3RyeXtuLnBvc3QoIkRlYnVnZ2VyLmVuYWJsZSIsKCk9PntuLnBvc3QoIkRlYnVnZ2VyLnBhdXNlIil9KX1jYXRjaHt9fX1jb25zdHtwb2xsOl9ufT1mdW5jdGlvbih0LG4sZSxyKXtjb25zdCBvPXQoKTtsZXQgaT0hMSxzPSEwO3JldHVybiBzZXRJbnRlcnZhbCgoKT0+e2NvbnN0IHQ9by5nZXRUaW1lTXMoKTshMT09PWkmJnQ+bitlJiYoaT0hMCxzJiZyKCkpLHQ8bitlJiYoaT0hMSl9LDIwKSx7cG9sbDooKT0+e28ucmVzZXQoKX0sZW5hYmxlZDp0PT57cz10fX19KGZ1bmN0aW9uKCl7bGV0IHQ9cHJvY2Vzcy5ocnRpbWUoKTtyZXR1cm57Z2V0VGltZU1zOigpPT57Y29uc3RbbixlXT1wcm9jZXNzLmhydGltZSh0KTtyZXR1cm4gTWF0aC5mbG9vcigxZTMqbitlLzFlNil9LHJlc2V0OigpPT57dD1wcm9jZXNzLmhydGltZSgpfX19LGNuLnBvbGxJbnRlcnZhbCxjbi5hbnJUaHJlc2hvbGQsZnVuY3Rpb24oKXtobigiV2F0Y2hkb2cgdGltZW91dCIpLHZuPyhobigiUGF1c2luZyBkZWJ1Z2dlciB0byBjYXB0dXJlIHN0YWNrIHRyYWNlIiksdm4oKSk6KGhuKCJDYXB0dXJpbmcgZXZlbnQgd2l0aG91dCBhIHN0YWNrIHRyYWNlIiksYm4oKS50aGVuKG51bGwsKCk9PntobigiU2VuZGluZyBBTlIgZXZlbnQgZmFpbGVkIG9uIHdhdGNoZG9nIHRpbWVvdXQuIil9KSl9KTtlPy5vbigibWVzc2FnZSIsdD0+e3Quc2Vzc2lvbiYmKHVuPVkodC5zZXNzaW9uKSksdC5kZWJ1Z0ltYWdlcyYmKGZuPXQuZGVidWdJbWFnZXMpLF9uKCl9KTs=';
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjUwLjAgKDc4NWU3NTYpIHwgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdCAqLwppbXBvcnR7U2Vzc2lvbiBhcyB0fWZyb20ibm9kZTppbnNwZWN0b3IiO2ltcG9ydHt3b3JrZXJEYXRhIGFzIG4scGFyZW50UG9ydCBhcyBlfWZyb20ibm9kZTp3b3JrZXJfdGhyZWFkcyI7aW1wb3J0e3Bvc2l4IGFzIHIsc2VwIGFzIG99ZnJvbSJub2RlOnBhdGgiO2ltcG9ydCphcyBpIGZyb20ibm9kZTpodHRwIjtpbXBvcnQqYXMgcyBmcm9tIm5vZGU6aHR0cHMiO2ltcG9ydHtSZWFkYWJsZSBhcyBjfWZyb20ibm9kZTpzdHJlYW0iO2ltcG9ydHtjcmVhdGVHemlwIGFzIHV9ZnJvbSJub2RlOnpsaWIiO2ltcG9ydCphcyBhIGZyb20ibm9kZTpuZXQiO2ltcG9ydCphcyBmIGZyb20ibm9kZTp0bHMiO2NvbnN0IGg9InVuZGVmaW5lZCI9PXR5cGVvZiBfX1NFTlRSWV9ERUJVR19ffHxfX1NFTlRSWV9ERUJVR19fLHA9Z2xvYmFsVGhpcyxkPSIxMC41MC4wIjtmdW5jdGlvbiBsKCl7cmV0dXJuIG0ocCkscH1mdW5jdGlvbiBtKHQpe2NvbnN0IG49dC5fX1NFTlRSWV9fPXQuX19TRU5UUllfX3x8e307cmV0dXJuIG4udmVyc2lvbj1uLnZlcnNpb258fGQsbltkXT1uW2RdfHx7fX1mdW5jdGlvbiBnKHQsbixlPXApe2NvbnN0IHI9ZS5fX1NFTlRSWV9fPWUuX19TRU5UUllfX3x8e30sbz1yW2RdPXJbZF18fHt9O3JldHVybiBvW3RdfHwob1t0XT1uKCkpfWNvbnN0IHk9e307ZnVuY3Rpb24gYih0KXtpZighKCJjb25zb2xlImluIHApKXJldHVybiB0KCk7Y29uc3Qgbj1wLmNvbnNvbGUsZT17fSxyPU9iamVjdC5rZXlzKHkpO3IuZm9yRWFjaCh0PT57Y29uc3Qgcj15W3RdO2VbdF09blt0XSxuW3RdPXJ9KTt0cnl7cmV0dXJuIHQoKX1maW5hbGx5e3IuZm9yRWFjaCh0PT57blt0XT1lW3RdfSl9fWZ1bmN0aW9uIHYoKXtyZXR1cm4gdygpLmVuYWJsZWR9ZnVuY3Rpb24gXyh0LC4uLm4pe2gmJnYoKSYmYigoKT0+e3AuY29uc29sZVt0XShgU2VudHJ5IExvZ2dlciBbJHt0fV06YCwuLi5uKX0pfWZ1bmN0aW9uIHcoKXtyZXR1cm4gaD9nKCJsb2dnZXJTZXR0aW5ncyIsKCk9Pih7ZW5hYmxlZDohMX0pKTp7ZW5hYmxlZDohMX19Y29uc3QgUz17ZW5hYmxlOmZ1bmN0aW9uKCl7dygpLmVuYWJsZWQ9ITB9LGRpc2FibGU6ZnVuY3Rpb24oKXt3KCkuZW5hYmxlZD0hMX0saXNFbmFibGVkOnYsbG9nOmZ1bmN0aW9uKC4uLnQpe18oImxvZyIsLi4udCl9LHdhcm46ZnVuY3Rpb24oLi4udCl7Xygid2FybiIsLi4udCl9LGVycm9yOmZ1bmN0aW9uKC4uLnQpe18oImVycm9yIiwuLi50KX19LCQ9L2NhcHR1cmVNZXNzYWdlfGNhcHR1cmVFeGNlcHRpb24vO2Z1bmN0aW9uIEUodCl7cmV0dXJuIHRbdC5sZW5ndGgtMV18fHt9fWNvbnN0IHg9Ijxhbm9ueW1vdXM+Ijtjb25zdCBOPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gaih0LG4pe3JldHVybiBOLmNhbGwodCk9PT1gW29iamVjdCAke259XWB9ZnVuY3Rpb24gQyh0KXtyZXR1cm4gaih0LCJTdHJpbmciKX1mdW5jdGlvbiBBKHQpe3JldHVybiBqKHQsIk9iamVjdCIpfWZ1bmN0aW9uIFQodCl7cmV0dXJuIEJvb2xlYW4odD8udGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbil9ZnVuY3Rpb24gayh0LG4pe3RyeXtyZXR1cm4gdCBpbnN0YW5jZW9mIG59Y2F0Y2h7cmV0dXJuITF9fWNvbnN0IEk9cDtmdW5jdGlvbiBPKHQsbil7Y29uc3QgZT10LHI9W107aWYoIWU/LnRhZ05hbWUpcmV0dXJuIiI7aWYoSS5IVE1MRWxlbWVudCYmZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZlLmRhdGFzZXQpe2lmKGUuZGF0YXNldC5zZW50cnlDb21wb25lbnQpcmV0dXJuIGUuZGF0YXNldC5zZW50cnlDb21wb25lbnQ7aWYoZS5kYXRhc2V0LnNlbnRyeUVsZW1lbnQpcmV0dXJuIGUuZGF0YXNldC5zZW50cnlFbGVtZW50fXIucHVzaChlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7Y29uc3Qgbz1uPy5sZW5ndGg/bi5maWx0ZXIodD0+ZS5nZXRBdHRyaWJ1dGUodCkpLm1hcCh0PT5bdCxlLmdldEF0dHJpYnV0ZSh0KV0pOm51bGw7aWYobz8ubGVuZ3RoKW8uZm9yRWFjaCh0PT57ci5wdXNoKGBbJHt0WzBdfT0iJHt0WzFdfSJdYCl9KTtlbHNle2UuaWQmJnIucHVzaChgIyR7ZS5pZH1gKTtjb25zdCB0PWUuY2xhc3NOYW1lO2lmKHQmJkModCkpe2NvbnN0IG49dC5zcGxpdCgvXHMrLyk7Zm9yKGNvbnN0IHQgb2YgbilyLnB1c2goYC4ke3R9YCl9fWZvcihjb25zdCB0IG9mWyJhcmlhLWxhYmVsIiwidHlwZSIsIm5hbWUiLCJ0aXRsZSIsImFsdCJdKXtjb25zdCBuPWUuZ2V0QXR0cmlidXRlKHQpO24mJnIucHVzaChgWyR7dH09IiR7bn0iXWApfXJldHVybiByLmpvaW4oIiIpfWZ1bmN0aW9uIFIodCl7aWYoZnVuY3Rpb24odCl7c3dpdGNoKE4uY2FsbCh0KSl7Y2FzZSJbb2JqZWN0IEVycm9yXSI6Y2FzZSJbb2JqZWN0IEV4Y2VwdGlvbl0iOmNhc2UiW29iamVjdCBET01FeGNlcHRpb25dIjpjYXNlIltvYmplY3QgV2ViQXNzZW1ibHkuRXhjZXB0aW9uXSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4gayh0LEVycm9yKX19KHQpKXJldHVybnttZXNzYWdlOnQubWVzc2FnZSxuYW1lOnQubmFtZSxzdGFjazp0LnN0YWNrLC4uLkQodCl9O2lmKG49dCwidW5kZWZpbmVkIiE9dHlwZW9mIEV2ZW50JiZrKG4sRXZlbnQpKXtjb25zdCBuPXt0eXBlOnQudHlwZSx0YXJnZXQ6UCh0LnRhcmdldCksY3VycmVudFRhcmdldDpQKHQuY3VycmVudFRhcmdldCksLi4uRCh0KX07cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBDdXN0b21FdmVudCYmayh0LEN1c3RvbUV2ZW50KSYmKG4uZGV0YWlsPXQuZGV0YWlsKSxufXJldHVybiB0O3ZhciBufWZ1bmN0aW9uIFAodCl7dHJ5e3JldHVybiBuPXQsInVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50JiZrKG4sRWxlbWVudCk/ZnVuY3Rpb24odCxuPXt9KXtpZighdClyZXR1cm4iPHVua25vd24+Ijt0cnl7bGV0IGU9dDtjb25zdCByPTUsbz1bXTtsZXQgaT0wLHM9MDtjb25zdCBjPSIgPiAiLHU9Yy5sZW5ndGg7bGV0IGE7Y29uc3QgZj1BcnJheS5pc0FycmF5KG4pP246bi5rZXlBdHRycyxoPSFBcnJheS5pc0FycmF5KG4pJiZuLm1heFN0cmluZ0xlbmd0aHx8ODA7Zm9yKDtlJiZpKys8ciYmKGE9TyhlLGYpLCEoImh0bWwiPT09YXx8aT4xJiZzK28ubGVuZ3RoKnUrYS5sZW5ndGg+PWgpKTspby5wdXNoKGEpLHMrPWEubGVuZ3RoLGU9ZS5wYXJlbnROb2RlO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGMpfWNhdGNoe3JldHVybiI8dW5rbm93bj4ifX0odCk6T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWNhdGNoe3JldHVybiI8dW5rbm93bj4ifXZhciBufWZ1bmN0aW9uIEQodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dD9PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkpOnt9fWxldCBVLEw7ZnVuY3Rpb24gTSh0KXtpZih2b2lkIDAhPT1VKXJldHVybiBVP1UodCk6dCgpO2NvbnN0IG49U3ltYm9sLmZvcigiX19TRU5UUllfU0FGRV9SQU5ET01fSURfV1JBUFBFUl9fIiksZT1wO3JldHVybiBuIGluIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlW25dPyhVPWVbbl0sVSh0KSk6KFU9bnVsbCx0KCkpfWZ1bmN0aW9uIEIoKXtyZXR1cm4gTSgoKT0+TWF0aC5yYW5kb20oKSl9ZnVuY3Rpb24gVygpe3JldHVybiBNKCgpPT5EYXRlLm5vdygpKX1mdW5jdGlvbiB6KHQsbj0wKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHR8fDA9PT1ufHx0Lmxlbmd0aDw9bj90OmAke3Quc2xpY2UoMCxuKX0uLi5gfWZ1bmN0aW9uIEYodD1mdW5jdGlvbigpe2NvbnN0IHQ9cDtyZXR1cm4gdC5jcnlwdG98fHQubXNDcnlwdG99KCkpe3RyeXtpZih0Py5yYW5kb21VVUlEKXJldHVybiBNKCgpPT50LnJhbmRvbVVVSUQoKSkucmVwbGFjZSgvLS9nLCIiKX1jYXRjaHt9cmV0dXJuIEx8fChMPVsxZTddKzFlMys0ZTMrOGUzKzFlMTEpLEwucmVwbGFjZSgvWzAxOF0vZyx0PT4odF4oMTYqQigpJjE1KT4+dC80KS50b1N0cmluZygxNikpfWZ1bmN0aW9uIEcoKXtyZXR1cm4gVygpLzFlM31sZXQgSDtmdW5jdGlvbiBKKCl7cmV0dXJuKEg/PyhIPWZ1bmN0aW9uKCl7Y29uc3R7cGVyZm9ybWFuY2U6dH09cDtpZighdD8ubm93fHwhdC50aW1lT3JpZ2luKXJldHVybiBHO2NvbnN0IG49dC50aW1lT3JpZ2luO3JldHVybigpPT4obitNKCgpPT50Lm5vdygpKSkvMWUzfSgpKSkoKX1mdW5jdGlvbiBZKHQpe2NvbnN0IG49SigpLGU9e3NpZDpGKCksaW5pdDohMCx0aW1lc3RhbXA6bixzdGFydGVkOm4sZHVyYXRpb246MCxzdGF0dXM6Im9rIixlcnJvcnM6MCxpZ25vcmVEdXJhdGlvbjohMSx0b0pTT046KCk9PmZ1bmN0aW9uKHQpe3JldHVybntzaWQ6YCR7dC5zaWR9YCxpbml0OnQuaW5pdCxzdGFydGVkOm5ldyBEYXRlKDFlMyp0LnN0YXJ0ZWQpLnRvSVNPU3RyaW5nKCksdGltZXN0YW1wOm5ldyBEYXRlKDFlMyp0LnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKSxzdGF0dXM6dC5zdGF0dXMsZXJyb3JzOnQuZXJyb3JzLGRpZDoibnVtYmVyIj09dHlwZW9mIHQuZGlkfHwic3RyaW5nIj09dHlwZW9mIHQuZGlkP2Ake3QuZGlkfWA6dm9pZCAwLGR1cmF0aW9uOnQuZHVyYXRpb24sYWJub3JtYWxfbWVjaGFuaXNtOnQuYWJub3JtYWxfbWVjaGFuaXNtLGF0dHJzOntyZWxlYXNlOnQucmVsZWFzZSxlbnZpcm9ubWVudDp0LmVudmlyb25tZW50LGlwX2FkZHJlc3M6dC5pcEFkZHJlc3MsdXNlcl9hZ2VudDp0LnVzZXJBZ2VudH19fShlKX07cmV0dXJuIHQmJlYoZSx0KSxlfWZ1bmN0aW9uIFYodCxuPXt9KXtpZihuLnVzZXImJighdC5pcEFkZHJlc3MmJm4udXNlci5pcF9hZGRyZXNzJiYodC5pcEFkZHJlc3M9bi51c2VyLmlwX2FkZHJlc3MpLHQuZGlkfHxuLmRpZHx8KHQuZGlkPW4udXNlci5pZHx8bi51c2VyLmVtYWlsfHxuLnVzZXIudXNlcm5hbWUpKSx0LnRpbWVzdGFtcD1uLnRpbWVzdGFtcHx8SigpLG4uYWJub3JtYWxfbWVjaGFuaXNtJiYodC5hYm5vcm1hbF9tZWNoYW5pc209bi5hYm5vcm1hbF9tZWNoYW5pc20pLG4uaWdub3JlRHVyYXRpb24mJih0Lmlnbm9yZUR1cmF0aW9uPW4uaWdub3JlRHVyYXRpb24pLG4uc2lkJiYodC5zaWQ9MzI9PT1uLnNpZC5sZW5ndGg/bi5zaWQ6RigpKSx2b2lkIDAhPT1uLmluaXQmJih0LmluaXQ9bi5pbml0KSwhdC5kaWQmJm4uZGlkJiYodC5kaWQ9YCR7bi5kaWR9YCksIm51bWJlciI9PXR5cGVvZiBuLnN0YXJ0ZWQmJih0LnN0YXJ0ZWQ9bi5zdGFydGVkKSx0Lmlnbm9yZUR1cmF0aW9uKXQuZHVyYXRpb249dm9pZCAwO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBuLmR1cmF0aW9uKXQuZHVyYXRpb249bi5kdXJhdGlvbjtlbHNle2NvbnN0IG49dC50aW1lc3RhbXAtdC5zdGFydGVkO3QuZHVyYXRpb249bj49MD9uOjB9bi5yZWxlYXNlJiYodC5yZWxlYXNlPW4ucmVsZWFzZSksbi5lbnZpcm9ubWVudCYmKHQuZW52aXJvbm1lbnQ9bi5lbnZpcm9ubWVudCksIXQuaXBBZGRyZXNzJiZuLmlwQWRkcmVzcyYmKHQuaXBBZGRyZXNzPW4uaXBBZGRyZXNzKSwhdC51c2VyQWdlbnQmJm4udXNlckFnZW50JiYodC51c2VyQWdlbnQ9bi51c2VyQWdlbnQpLCJudW1iZXIiPT10eXBlb2Ygbi5lcnJvcnMmJih0LmVycm9ycz1uLmVycm9ycyksbi5zdGF0dXMmJih0LnN0YXR1cz1uLnN0YXR1cyl9ZnVuY3Rpb24gSyh0LG4sZT0yKXtpZighbnx8Im9iamVjdCIhPXR5cGVvZiBufHxlPD0wKXJldHVybiBuO2lmKHQmJjA9PT1PYmplY3Qua2V5cyhuKS5sZW5ndGgpcmV0dXJuIHQ7Y29uc3Qgcj17Li4udH07Zm9yKGNvbnN0IHQgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobix0KSYmKHJbdF09SyhyW3RdLG5bdF0sZS0xKSk7cmV0dXJuIHJ9ZnVuY3Rpb24gWigpe3JldHVybiBGKCl9ZnVuY3Rpb24gcSgpe3JldHVybiBGKCkuc3Vic3RyaW5nKDE2KX1jb25zdCBRPSJfc2VudHJ5U3BhbiI7ZnVuY3Rpb24gWCh0LG4pe24/ZnVuY3Rpb24odCxuLGUpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfWNhdGNoe2gmJlMubG9nKGBGYWlsZWQgdG8gYWRkIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5ICIke259IiB0byBvYmplY3RgLHQpfX0odCxRLG4pOmRlbGV0ZSB0W1FdfWZ1bmN0aW9uIHR0KHQpe3JldHVybiB0W1FdfWNsYXNzIG50e2NvbnN0cnVjdG9yKCl7dGhpcy50PSExLHRoaXMubz1bXSx0aGlzLmk9W10sdGhpcy51PVtdLHRoaXMuaD1bXSx0aGlzLnA9e30sdGhpcy5sPXt9LHRoaXMubT17fSx0aGlzLnY9e30sdGhpcy5fPXt9LHRoaXMuUz17fSx0aGlzLk49e3RyYWNlSWQ6WigpLHNhbXBsZVJhbmQ6QigpfX1jbG9uZSgpe2NvbnN0IHQ9bmV3IG50O3JldHVybiB0LnU9Wy4uLnRoaXMudV0sdC5sPXsuLi50aGlzLmx9LHQubT17Li4udGhpcy5tfSx0LnY9ey4uLnRoaXMudn0sdC5fPXsuLi50aGlzLl99LHRoaXMuXy5mbGFncyYmKHQuXy5mbGFncz17dmFsdWVzOlsuLi50aGlzLl8uZmxhZ3MudmFsdWVzXX0pLHQucD10aGlzLnAsdC5qPXRoaXMuaix0LkM9dGhpcy5DLHQuQT10aGlzLkEsdC5UPXRoaXMuVCx0Lmk9Wy4uLnRoaXMuaV0sdC5oPVsuLi50aGlzLmhdLHQuUz17Li4udGhpcy5TfSx0Lk49ey4uLnRoaXMuTn0sdC5rPXRoaXMuayx0Lkk9dGhpcy5JLHQuTz10aGlzLk8sWCh0LHR0KHRoaXMpKSx0fXNldENsaWVudCh0KXt0aGlzLms9dH1zZXRMYXN0RXZlbnRJZCh0KXt0aGlzLkk9dH1nZXRDbGllbnQoKXtyZXR1cm4gdGhpcy5rfWxhc3RFdmVudElkKCl7cmV0dXJuIHRoaXMuSX1hZGRTY29wZUxpc3RlbmVyKHQpe3RoaXMuby5wdXNoKHQpfWFkZEV2ZW50UHJvY2Vzc29yKHQpe3JldHVybiB0aGlzLmkucHVzaCh0KSx0aGlzfXNldFVzZXIodCl7cmV0dXJuIHRoaXMucD10fHx7ZW1haWw6dm9pZCAwLGlkOnZvaWQgMCxpcF9hZGRyZXNzOnZvaWQgMCx1c2VybmFtZTp2b2lkIDB9LHRoaXMuQyYmVih0aGlzLkMse3VzZXI6dH0pLHRoaXMuUigpLHRoaXN9Z2V0VXNlcigpe3JldHVybiB0aGlzLnB9c2V0Q29udmVyc2F0aW9uSWQodCl7cmV0dXJuIHRoaXMuTz10fHx2b2lkIDAsdGhpcy5SKCksdGhpc31zZXRUYWdzKHQpe3JldHVybiB0aGlzLmw9ey4uLnRoaXMubCwuLi50fSx0aGlzLlIoKSx0aGlzfXNldFRhZyh0LG4pe3JldHVybiB0aGlzLnNldFRhZ3Moe1t0XTpufSl9c2V0QXR0cmlidXRlcyh0KXtyZXR1cm4gdGhpcy5tPXsuLi50aGlzLm0sLi4udH0sdGhpcy5SKCksdGhpc31zZXRBdHRyaWJ1dGUodCxuKXtyZXR1cm4gdGhpcy5zZXRBdHRyaWJ1dGVzKHtbdF06bn0pfXJlbW92ZUF0dHJpYnV0ZSh0KXtyZXR1cm4gdCBpbiB0aGlzLm0mJihkZWxldGUgdGhpcy5tW3RdLHRoaXMuUigpKSx0aGlzfXNldEV4dHJhcyh0KXtyZXR1cm4gdGhpcy52PXsuLi50aGlzLnYsLi4udH0sdGhpcy5SKCksdGhpc31zZXRFeHRyYSh0LG4pe3JldHVybiB0aGlzLnY9ey4uLnRoaXMudixbdF06bn0sdGhpcy5SKCksdGhpc31zZXRGaW5nZXJwcmludCh0KXtyZXR1cm4gdGhpcy5UPXQsdGhpcy5SKCksdGhpc31zZXRMZXZlbCh0KXtyZXR1cm4gdGhpcy5qPXQsdGhpcy5SKCksdGhpc31zZXRUcmFuc2FjdGlvbk5hbWUodCl7cmV0dXJuIHRoaXMuQT10LHRoaXMuUigpLHRoaXN9c2V0Q29udGV4dCh0LG4pe3JldHVybiBudWxsPT09bj9kZWxldGUgdGhpcy5fW3RdOnRoaXMuX1t0XT1uLHRoaXMuUigpLHRoaXN9c2V0U2Vzc2lvbih0KXtyZXR1cm4gdD90aGlzLkM9dDpkZWxldGUgdGhpcy5DLHRoaXMuUigpLHRoaXN9Z2V0U2Vzc2lvbigpe3JldHVybiB0aGlzLkN9dXBkYXRlKHQpe2lmKCF0KXJldHVybiB0aGlzO2NvbnN0IG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCh0aGlzKTp0LGU9biBpbnN0YW5jZW9mIG50P24uZ2V0U2NvcGVEYXRhKCk6QShuKT90OnZvaWQgMCx7dGFnczpyLGF0dHJpYnV0ZXM6byxleHRyYTppLHVzZXI6cyxjb250ZXh0czpjLGxldmVsOnUsZmluZ2VycHJpbnQ6YT1bXSxwcm9wYWdhdGlvbkNvbnRleHQ6Zixjb252ZXJzYXRpb25JZDpofT1lfHx7fTtyZXR1cm4gdGhpcy5sPXsuLi50aGlzLmwsLi4ucn0sdGhpcy5tPXsuLi50aGlzLm0sLi4ub30sdGhpcy52PXsuLi50aGlzLnYsLi4uaX0sdGhpcy5fPXsuLi50aGlzLl8sLi4uY30scyYmT2JqZWN0LmtleXMocykubGVuZ3RoJiYodGhpcy5wPXMpLHUmJih0aGlzLmo9dSksYS5sZW5ndGgmJih0aGlzLlQ9YSksZiYmKHRoaXMuTj1mKSxoJiYodGhpcy5PPWgpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy51PVtdLHRoaXMubD17fSx0aGlzLm09e30sdGhpcy52PXt9LHRoaXMucD17fSx0aGlzLl89e30sdGhpcy5qPXZvaWQgMCx0aGlzLkE9dm9pZCAwLHRoaXMuVD12b2lkIDAsdGhpcy5DPXZvaWQgMCx0aGlzLk89dm9pZCAwLFgodGhpcyx2b2lkIDApLHRoaXMuaD1bXSx0aGlzLnNldFByb3BhZ2F0aW9uQ29udGV4dCh7dHJhY2VJZDpaKCksc2FtcGxlUmFuZDpCKCl9KSx0aGlzLlIoKSx0aGlzfWFkZEJyZWFkY3J1bWIodCxuKXtjb25zdCBlPSJudW1iZXIiPT10eXBlb2Ygbj9uOjEwMDtpZihlPD0wKXJldHVybiB0aGlzO2NvbnN0IHI9e3RpbWVzdGFtcDpHKCksLi4udCxtZXNzYWdlOnQubWVzc2FnZT96KHQubWVzc2FnZSwyMDQ4KTp0Lm1lc3NhZ2V9O3JldHVybiB0aGlzLnUucHVzaChyKSx0aGlzLnUubGVuZ3RoPmUmJih0aGlzLnU9dGhpcy51LnNsaWNlKC1lKSx0aGlzLms/LnJlY29yZERyb3BwZWRFdmVudCgiYnVmZmVyX292ZXJmbG93IiwibG9nX2l0ZW0iKSksdGhpcy5SKCksdGhpc31nZXRMYXN0QnJlYWRjcnVtYigpe3JldHVybiB0aGlzLnVbdGhpcy51Lmxlbmd0aC0xXX1jbGVhckJyZWFkY3J1bWJzKCl7cmV0dXJuIHRoaXMudT1bXSx0aGlzLlIoKSx0aGlzfWFkZEF0dGFjaG1lbnQodCl7cmV0dXJuIHRoaXMuaC5wdXNoKHQpLHRoaXN9Y2xlYXJBdHRhY2htZW50cygpe3JldHVybiB0aGlzLmg9W10sdGhpc31nZXRTY29wZURhdGEoKXtyZXR1cm57YnJlYWRjcnVtYnM6dGhpcy51LGF0dGFjaG1lbnRzOnRoaXMuaCxjb250ZXh0czp0aGlzLl8sdGFnczp0aGlzLmwsYXR0cmlidXRlczp0aGlzLm0sZXh0cmE6dGhpcy52LHVzZXI6dGhpcy5wLGxldmVsOnRoaXMuaixmaW5nZXJwcmludDp0aGlzLlR8fFtdLGV2ZW50UHJvY2Vzc29yczp0aGlzLmkscHJvcGFnYXRpb25Db250ZXh0OnRoaXMuTixzZGtQcm9jZXNzaW5nTWV0YWRhdGE6dGhpcy5TLHRyYW5zYWN0aW9uTmFtZTp0aGlzLkEsc3Bhbjp0dCh0aGlzKSxjb252ZXJzYXRpb25JZDp0aGlzLk99fXNldFNES1Byb2Nlc3NpbmdNZXRhZGF0YSh0KXtyZXR1cm4gdGhpcy5TPUsodGhpcy5TLHQsMiksdGhpc31zZXRQcm9wYWdhdGlvbkNvbnRleHQodCl7cmV0dXJuIHRoaXMuTj10LHRoaXN9Z2V0UHJvcGFnYXRpb25Db250ZXh0KCl7cmV0dXJuIHRoaXMuTn1jYXB0dXJlRXhjZXB0aW9uKHQsbil7Y29uc3QgZT1uPy5ldmVudF9pZHx8RigpO2lmKCF0aGlzLmspcmV0dXJuIGgmJlMud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIGV4Y2VwdGlvbiEiKSxlO2NvbnN0IHI9bmV3IEVycm9yKCJTZW50cnkgc3ludGhldGljRXhjZXB0aW9uIik7cmV0dXJuIHRoaXMuay5jYXB0dXJlRXhjZXB0aW9uKHQse29yaWdpbmFsRXhjZXB0aW9uOnQsc3ludGhldGljRXhjZXB0aW9uOnIsLi4ubixldmVudF9pZDplfSx0aGlzKSxlfWNhcHR1cmVNZXNzYWdlKHQsbixlKXtjb25zdCByPWU/LmV2ZW50X2lkfHxGKCk7aWYoIXRoaXMuaylyZXR1cm4gaCYmUy53YXJuKCJObyBjbGllbnQgY29uZmlndXJlZCBvbiBzY29wZSAtIHdpbGwgbm90IGNhcHR1cmUgbWVzc2FnZSEiKSxyO2NvbnN0IG89ZT8uc3ludGhldGljRXhjZXB0aW9uPz9uZXcgRXJyb3IodCk7cmV0dXJuIHRoaXMuay5jYXB0dXJlTWVzc2FnZSh0LG4se29yaWdpbmFsRXhjZXB0aW9uOnQsc3ludGhldGljRXhjZXB0aW9uOm8sLi4uZSxldmVudF9pZDpyfSx0aGlzKSxyfWNhcHR1cmVFdmVudCh0LG4pe2NvbnN0IGU9dC5ldmVudF9pZHx8bj8uZXZlbnRfaWR8fEYoKTtyZXR1cm4gdGhpcy5rPyh0aGlzLmsuY2FwdHVyZUV2ZW50KHQsey4uLm4sZXZlbnRfaWQ6ZX0sdGhpcyksZSk6KGgmJlMud2FybigiTm8gY2xpZW50IGNvbmZpZ3VyZWQgb24gc2NvcGUgLSB3aWxsIG5vdCBjYXB0dXJlIGV2ZW50ISIpLGUpfVIoKXt0aGlzLnR8fCh0aGlzLnQ9ITAsdGhpcy5vLmZvckVhY2godD0+e3QodGhpcyl9KSx0aGlzLnQ9ITEpfX1jb25zdCBldD10PT50IGluc3RhbmNlb2YgUHJvbWlzZSYmIXRbcnRdLHJ0PVN5bWJvbCgiY2hhaW5lZCBQcm9taXNlTGlrZSIpLG90PSh0LG4pPT57bGV0IGU9ITE7Zm9yKGNvbnN0IHIgaW4gdCl7aWYociBpbiBuKWNvbnRpbnVlO2U9ITA7Y29uc3Qgbz10W3JdOyJmdW5jdGlvbiI9PXR5cGVvZiBvP09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse3ZhbHVlOiguLi5uKT0+by5hcHBseSh0LG4pLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6bltyXT1vfXJldHVybiBlJiZPYmplY3QuYXNzaWduKG4se1tydF06ITB9KSxufTtjbGFzcyBpdHtjb25zdHJ1Y3Rvcih0LG4pe2xldCBlLHI7ZT10fHxuZXcgbnQscj1ufHxuZXcgbnQsdGhpcy5QPVt7c2NvcGU6ZX1dLHRoaXMuRD1yfXdpdGhTY29wZSh0KXtjb25zdCBuPXRoaXMuVSgpO2xldCBlO3RyeXtlPXQobil9Y2F0Y2godCl7dGhyb3cgdGhpcy5MKCksdH1yZXR1cm4gVChlKT8oKHQsbixlKT0+e2NvbnN0IHI9dC50aGVuKHQ9PihuKHQpLHQpLHQ9Pnt0aHJvdyBlKHQpLHR9KTtyZXR1cm4gZXQocikmJmV0KHQpP3I6b3QodCxyKX0pKGUsKCk9PnRoaXMuTCgpLCgpPT50aGlzLkwoKSk6KHRoaXMuTCgpLGUpfWdldENsaWVudCgpe3JldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuY2xpZW50fWdldFNjb3BlKCl7cmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5zY29wZX1nZXRJc29sYXRpb25TY29wZSgpe3JldHVybiB0aGlzLkR9Z2V0U3RhY2tUb3AoKXtyZXR1cm4gdGhpcy5QW3RoaXMuUC5sZW5ndGgtMV19VSgpe2NvbnN0IHQ9dGhpcy5nZXRTY29wZSgpLmNsb25lKCk7cmV0dXJuIHRoaXMuUC5wdXNoKHtjbGllbnQ6dGhpcy5nZXRDbGllbnQoKSxzY29wZTp0fSksdH1MKCl7cmV0dXJuISh0aGlzLlAubGVuZ3RoPD0xKSYmISF0aGlzLlAucG9wKCl9fWZ1bmN0aW9uIHN0KCl7Y29uc3QgdD1tKGwoKSk7cmV0dXJuIHQuc3RhY2s9dC5zdGFja3x8bmV3IGl0KGcoImRlZmF1bHRDdXJyZW50U2NvcGUiLCgpPT5uZXcgbnQpLGcoImRlZmF1bHRJc29sYXRpb25TY29wZSIsKCk9Pm5ldyBudCkpfWZ1bmN0aW9uIGN0KHQpe3JldHVybiBzdCgpLndpdGhTY29wZSh0KX1mdW5jdGlvbiB1dCh0LG4pe2NvbnN0IGU9c3QoKTtyZXR1cm4gZS53aXRoU2NvcGUoKCk9PihlLmdldFN0YWNrVG9wKCkuc2NvcGU9dCxuKHQpKSl9ZnVuY3Rpb24gYXQodCl7cmV0dXJuIHN0KCkud2l0aFNjb3BlKCgpPT50KHN0KCkuZ2V0SXNvbGF0aW9uU2NvcGUoKSkpfWZ1bmN0aW9uIGZ0KHQpe2NvbnN0IG49bSh0KTtyZXR1cm4gbi5hY3M/bi5hY3M6e3dpdGhJc29sYXRpb25TY29wZTphdCx3aXRoU2NvcGU6Y3Qsd2l0aFNldFNjb3BlOnV0LHdpdGhTZXRJc29sYXRpb25TY29wZToodCxuKT0+YXQobiksZ2V0Q3VycmVudFNjb3BlOigpPT5zdCgpLmdldFNjb3BlKCksZ2V0SXNvbGF0aW9uU2NvcGU6KCk9PnN0KCkuZ2V0SXNvbGF0aW9uU2NvcGUoKX19ZnVuY3Rpb24gaHQoKXtyZXR1cm4gZnQobCgpKS5nZXRDdXJyZW50U2NvcGUoKS5nZXRDbGllbnQoKX1mdW5jdGlvbiBwdCh0KXtpZih0KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJiJkZXJlZiJpbiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXJlZil0cnl7cmV0dXJuIHQuZGVyZWYoKX1jYXRjaHtyZXR1cm59cmV0dXJuIHR9fWZ1bmN0aW9uIGR0KHQpe2NvbnN0IG49dDtyZXR1cm57c2NvcGU6bi5fc2VudHJ5U2NvcGUsaXNvbGF0aW9uU2NvcGU6cHQobi5fc2VudHJ5SXNvbGF0aW9uU2NvcGUpfX1jb25zdCBsdD0ic2VudHJ5LSI7ZnVuY3Rpb24gbXQodCl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZighdHx8IUModCkmJiFBcnJheS5pc0FycmF5KHQpKXJldHVybjtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0LnJlZHVjZSgodCxuKT0+e2NvbnN0IGU9Z3Qobik7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKFtuLGVdKT0+e3Rbbl09ZX0pLHR9LHt9KTtyZXR1cm4gZ3QodCl9KHQpO2lmKCFuKXJldHVybjtjb25zdCBlPU9iamVjdC5lbnRyaWVzKG4pLnJlZHVjZSgodCxbbixlXSk9PntpZihuLnN0YXJ0c1dpdGgobHQpKXt0W24uc2xpY2UoNyldPWV9cmV0dXJuIHR9LHt9KTtyZXR1cm4gT2JqZWN0LmtleXMoZSkubGVuZ3RoPjA/ZTp2b2lkIDB9ZnVuY3Rpb24gZ3QodCl7cmV0dXJuIHQuc3BsaXQoIiwiKS5tYXAodD0+e2NvbnN0IG49dC5pbmRleE9mKCI9Iik7aWYoLTE9PT1uKXJldHVybltdO3JldHVyblt0LnNsaWNlKDAsbiksdC5zbGljZShuKzEpXS5tYXAodD0+e3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQudHJpbSgpKX1jYXRjaHtyZXR1cm59fSl9KS5yZWR1Y2UoKHQsW24sZV0pPT4obiYmZSYmKHRbbl09ZSksdCkse30pfWNvbnN0IHl0PS9ebyhcZCspXC4vO2Z1bmN0aW9uIGJ0KHQsbj0hMSl7Y29uc3R7aG9zdDplLHBhdGg6cixwYXNzOm8scG9ydDppLHByb2plY3RJZDpzLHByb3RvY29sOmMscHVibGljS2V5OnV9PXQ7cmV0dXJuYCR7Y306Ly8ke3V9JHtuJiZvP2A6JHtvfWA6IiJ9QCR7ZX0ke2k/YDoke2l9YDoiIn0vJHtyP2Ake3J9L2A6cn0ke3N9YH1mdW5jdGlvbiB2dCh0KXtjb25zdCBuPXQuZ2V0T3B0aW9ucygpLHtob3N0OmV9PXQuZ2V0RHNuKCl8fHt9O2xldCByO3JldHVybiBuLm9yZ0lkP3I9U3RyaW5nKG4ub3JnSWQpOmUmJihyPWZ1bmN0aW9uKHQpe2NvbnN0IG49dC5tYXRjaCh5dCk7cmV0dXJuIG4/LlsxXX0oZSkpLHJ9ZnVuY3Rpb24gX3QodCl7Y29uc3R7c3BhbklkOm4sdHJhY2VJZDplLGlzUmVtb3RlOnJ9PXQuc3BhbkNvbnRleHQoKSxvPXI/bjpFdCh0KS5wYXJlbnRfc3Bhbl9pZCxpPWR0KHQpLnNjb3BlO3JldHVybntwYXJlbnRfc3Bhbl9pZDpvLHNwYW5faWQ6cj9pPy5nZXRQcm9wYWdhdGlvbkNvbnRleHQoKS5wcm9wYWdhdGlvblNwYW5JZHx8cSgpOm4sdHJhY2VfaWQ6ZX19ZnVuY3Rpb24gd3QodCl7cmV0dXJuIHQmJnQubGVuZ3RoPjA/dC5tYXAoKHtjb250ZXh0OntzcGFuSWQ6dCx0cmFjZUlkOm4sdHJhY2VGbGFnczplLC4uLnJ9LGF0dHJpYnV0ZXM6b30pPT4oe3NwYW5faWQ6dCx0cmFjZV9pZDpuLHNhbXBsZWQ6MT09PWUsYXR0cmlidXRlczpvLC4uLnJ9KSk6dm9pZCAwfWZ1bmN0aW9uIFN0KHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD8kdCh0KTpBcnJheS5pc0FycmF5KHQpP3RbMF0rdFsxXS8xZTk6dCBpbnN0YW5jZW9mIERhdGU/JHQodC5nZXRUaW1lKCkpOkooKX1mdW5jdGlvbiAkdCh0KXtyZXR1cm4gdD45OTk5OTk5OTk5P3QvMWUzOnR9ZnVuY3Rpb24gRXQodCl7aWYoZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0U3BhbkpTT059KHQpKXJldHVybiB0LmdldFNwYW5KU09OKCk7Y29uc3R7c3BhbklkOm4sdHJhY2VJZDplfT10LnNwYW5Db250ZXh0KCk7aWYoZnVuY3Rpb24odCl7Y29uc3Qgbj10O3JldHVybiEhKG4uYXR0cmlidXRlcyYmbi5zdGFydFRpbWUmJm4ubmFtZSYmbi5lbmRUaW1lJiZuLnN0YXR1cyl9KHQpKXtjb25zdHthdHRyaWJ1dGVzOnIsc3RhcnRUaW1lOm8sbmFtZTppLGVuZFRpbWU6cyxzdGF0dXM6YyxsaW5rczp1fT10O3JldHVybntzcGFuX2lkOm4sdHJhY2VfaWQ6ZSxkYXRhOnIsZGVzY3JpcHRpb246aSxwYXJlbnRfc3Bhbl9pZDp4dCh0KSxzdGFydF90aW1lc3RhbXA6U3QobyksdGltZXN0YW1wOlN0KHMpfHx2b2lkIDAsc3RhdHVzOk50KGMpLG9wOnJbInNlbnRyeS5vcCJdLG9yaWdpbjpyWyJzZW50cnkub3JpZ2luIl0sbGlua3M6d3QodSl9fXJldHVybntzcGFuX2lkOm4sdHJhY2VfaWQ6ZSxzdGFydF90aW1lc3RhbXA6MCxkYXRhOnt9fX1mdW5jdGlvbiB4dCh0KXtyZXR1cm4icGFyZW50U3BhbklkImluIHQ/dC5wYXJlbnRTcGFuSWQ6InBhcmVudFNwYW5Db250ZXh0ImluIHQ/dC5wYXJlbnRTcGFuQ29udGV4dD8uc3BhbklkOnZvaWQgMH1mdW5jdGlvbiBOdCh0KXtpZih0JiYwIT09dC5jb2RlKXJldHVybiAxPT09dC5jb2RlPyJvayI6dC5tZXNzYWdlfHwiaW50ZXJuYWxfZXJyb3IifWNvbnN0IGp0PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9zZW50cnlSb290U3Bhbnx8dH07ZnVuY3Rpb24gQ3QodCl7Y29uc3Qgbj1odCgpO2lmKCFuKXJldHVybnt9O2NvbnN0IGU9anQodCkscj1FdChlKSxvPXIuZGF0YSxpPWUuc3BhbkNvbnRleHQoKS50cmFjZVN0YXRlLHM9aT8uZ2V0KCJzZW50cnkuc2FtcGxlX3JhdGUiKT8/b1sic2VudHJ5LnNhbXBsZV9yYXRlIl0/P29bInNlbnRyeS5wcmV2aW91c190cmFjZV9zYW1wbGVfcmF0ZSJdO2Z1bmN0aW9uIGModCl7cmV0dXJuIm51bWJlciIhPXR5cGVvZiBzJiYic3RyaW5nIiE9dHlwZW9mIHN8fCh0LnNhbXBsZV9yYXRlPWAke3N9YCksdH1jb25zdCB1PWUuX2Zyb3plbkRzYztpZih1KXJldHVybiBjKHUpO2NvbnN0IGE9aT8uZ2V0KCJzZW50cnkuZHNjIiksZj1hJiZtdChhKTtpZihmKXJldHVybiBjKGYpO2NvbnN0IGg9ZnVuY3Rpb24odCxuKXtjb25zdCBlPW4uZ2V0T3B0aW9ucygpLHtwdWJsaWNLZXk6cn09bi5nZXREc24oKXx8e30sbz17ZW52aXJvbm1lbnQ6ZS5lbnZpcm9ubWVudHx8InByb2R1Y3Rpb24iLHJlbGVhc2U6ZS5yZWxlYXNlLHB1YmxpY19rZXk6cix0cmFjZV9pZDp0LG9yZ19pZDp2dChuKX07cmV0dXJuIG4uZW1pdCgiY3JlYXRlRHNjIixvKSxvfSh0LnNwYW5Db250ZXh0KCkudHJhY2VJZCxuKSxwPW9bInNlbnRyeS5zb3VyY2UiXT8/b1sic2VudHJ5LnNwYW4uc291cmNlIl0sZD1yLmRlc2NyaXB0aW9uO3JldHVybiJ1cmwiIT09cCYmZCYmKGgudHJhbnNhY3Rpb249ZCksZnVuY3Rpb24oKXtpZigiYm9vbGVhbiI9PXR5cGVvZiBfX1NFTlRSWV9UUkFDSU5HX18mJiFfX1NFTlRSWV9UUkFDSU5HX18pcmV0dXJuITE7Y29uc3QgdD1odCgpPy5nZXRPcHRpb25zKCk7cmV0dXJuISghdHx8bnVsbD09dC50cmFjZXNTYW1wbGVSYXRlJiYhdC50cmFjZXNTYW1wbGVyKX0oKSYmKGguc2FtcGxlZD1TdHJpbmcoZnVuY3Rpb24odCl7Y29uc3R7dHJhY2VGbGFnczpufT10LnNwYW5Db250ZXh0KCk7cmV0dXJuIDE9PT1ufShlKSksaC5zYW1wbGVfcmFuZD1pPy5nZXQoInNlbnRyeS5zYW1wbGVfcmFuZCIpPz9kdChlKS5zY29wZT8uZ2V0UHJvcGFnYXRpb25Db250ZXh0KCkuc2FtcGxlUmFuZC50b1N0cmluZygpKSxjKGgpLG4uZW1pdCgiY3JlYXRlRHNjIixoLGUpLGh9ZnVuY3Rpb24gQXQodCxuPTEwMCxlPTEvMCl7dHJ5e3JldHVybiBUdCgiIix0LG4sZSl9Y2F0Y2godCl7cmV0dXJue0VSUk9SOmAqKm5vbi1zZXJpYWxpemFibGUqKiAoJHt0fSlgfX19ZnVuY3Rpb24gVHQodCxuLGU9MS8wLHI9MS8wLG89ZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBXZWFrU2V0O2Z1bmN0aW9uIG4obil7cmV0dXJuISF0LmhhcyhuKXx8KHQuYWRkKG4pLCExKX1mdW5jdGlvbiBlKG4pe3QuZGVsZXRlKG4pfXJldHVybltuLGVdfSgpKXtjb25zdFtpLHNdPW87aWYobnVsbD09bnx8WyJib29sZWFuIiwic3RyaW5nIl0uaW5jbHVkZXModHlwZW9mIG4pfHwibnVtYmVyIj09dHlwZW9mIG4mJk51bWJlci5pc0Zpbml0ZShuKSlyZXR1cm4gbjtjb25zdCBjPWZ1bmN0aW9uKHQsbil7dHJ5e2lmKCJkb21haW4iPT09dCYmbiYmIm9iamVjdCI9PXR5cGVvZiBuJiZuLk0pcmV0dXJuIltEb21haW5dIjtpZigiZG9tYWluRW1pdHRlciI9PT10KXJldHVybiJbRG9tYWluRW1pdHRlcl0iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZuPT09Z2xvYmFsKXJldHVybiJbR2xvYmFsXSI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJm49PT13aW5kb3cpcmV0dXJuIltXaW5kb3ddIjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZuPT09ZG9jdW1lbnQpcmV0dXJuIltEb2N1bWVudF0iO2lmKCJvYmplY3QiPT10eXBlb2YoZT1uKSYmbnVsbCE9PWUmJihlLl9faXNWdWV8fGUuQnx8ZS5fX3ZfaXNWTm9kZSkpcmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiJfX3ZfaXNWTm9kZSJpbiB0JiZ0Ll9fdl9pc1ZOb2RlPyJbVnVlVk5vZGVdIjoiW1Z1ZVZpZXdNb2RlbF0ifShuKTtpZihmdW5jdGlvbih0KXtyZXR1cm4gQSh0KSYmIm5hdGl2ZUV2ZW50ImluIHQmJiJwcmV2ZW50RGVmYXVsdCJpbiB0JiYic3RvcFByb3BhZ2F0aW9uImluIHR9KG4pKXJldHVybiJbU3ludGhldGljRXZlbnRdIjtpZigibnVtYmVyIj09dHlwZW9mIG4mJiFOdW1iZXIuaXNGaW5pdGUobikpcmV0dXJuYFske259XWA7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pcmV0dXJuYFtGdW5jdGlvbjogJHtmdW5jdGlvbih0KXt0cnl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0Lm5hbWV8fHh9Y2F0Y2h7cmV0dXJuIHh9fShuKX1dYDtpZigic3ltYm9sIj09dHlwZW9mIG4pcmV0dXJuYFske1N0cmluZyhuKX1dYDtpZigiYmlnaW50Ij09dHlwZW9mIG4pcmV0dXJuYFtCaWdJbnQ6ICR7U3RyaW5nKG4pfV1gO2NvbnN0IHI9ZnVuY3Rpb24odCl7Y29uc3Qgbj1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7cmV0dXJuIG4/LmNvbnN0cnVjdG9yP24uY29uc3RydWN0b3IubmFtZToibnVsbCBwcm90b3R5cGUifShuKTtyZXR1cm4vXkhUTUwoXHcqKUVsZW1lbnQkLy50ZXN0KHIpP2BbSFRNTEVsZW1lbnQ6ICR7cn1dYDpgW29iamVjdCAke3J9XWB9Y2F0Y2godCl7cmV0dXJuYCoqbm9uLXNlcmlhbGl6YWJsZSoqICgke3R9KWB9dmFyIGV9KHQsbik7aWYoIWMuc3RhcnRzV2l0aCgiW29iamVjdCAiKSlyZXR1cm4gYztpZihuLl9fc2VudHJ5X3NraXBfbm9ybWFsaXphdGlvbl9fKXJldHVybiBuO2NvbnN0IHU9Im51bWJlciI9PXR5cGVvZiBuLl9fc2VudHJ5X292ZXJyaWRlX25vcm1hbGl6YXRpb25fZGVwdGhfXz9uLl9fc2VudHJ5X292ZXJyaWRlX25vcm1hbGl6YXRpb25fZGVwdGhfXzplO2lmKDA9PT11KXJldHVybiBjLnJlcGxhY2UoIm9iamVjdCAiLCIiKTtpZihpKG4pKXJldHVybiJbQ2lyY3VsYXIgfl0iO2NvbnN0IGE9bjtpZihhJiYiZnVuY3Rpb24iPT10eXBlb2YgYS50b0pTT04pdHJ5e3JldHVybiBUdCgiIixhLnRvSlNPTigpLHUtMSxyLG8pfWNhdGNoe31jb25zdCBmPUFycmF5LmlzQXJyYXkobik/W106e307bGV0IGg9MDtjb25zdCBwPVIobik7Zm9yKGNvbnN0IHQgaW4gcCl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwLHQpKWNvbnRpbnVlO2lmKGg+PXIpe2ZbdF09IltNYXhQcm9wZXJ0aWVzIH5dIjticmVha31jb25zdCBuPXBbdF07Zlt0XT1UdCh0LG4sdS0xLHIsbyksaCsrfXJldHVybiBzKG4pLGZ9ZnVuY3Rpb24ga3QodCxuKXtjb25zdCBlPW4ucmVwbGFjZSgvXFwvZywiLyIpLnJlcGxhY2UoL1t8XFx7fSgpW1xdXiQrKj8uXS9nLCJcXCQmIik7bGV0IHI9dDt0cnl7cj1kZWNvZGVVUkkodCl9Y2F0Y2h7fXJldHVybiByLnJlcGxhY2UoL1xcL2csIi8iKS5yZXBsYWNlKC93ZWJwYWNrOlwvPy9nLCIiKS5yZXBsYWNlKG5ldyBSZWdFeHAoYChmaWxlOi8vKT8vKiR7ZX0vKmAsImlnIiksImFwcDovLy8iKX1mdW5jdGlvbiBJdCh0LG49W10pe3JldHVyblt0LG5dfWZ1bmN0aW9uIE90KHQsbil7Y29uc3QgZT10WzFdO2Zvcihjb25zdCB0IG9mIGUpe2lmKG4odCx0WzBdLnR5cGUpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFJ0KHQpe2NvbnN0IG49bShwKTtyZXR1cm4gbi5lbmNvZGVQb2x5ZmlsbD9uLmVuY29kZVBvbHlmaWxsKHQpOihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh0KX1mdW5jdGlvbiBQdCh0KXtjb25zdFtuLGVdPXQ7bGV0IHI9SlNPTi5zdHJpbmdpZnkobik7ZnVuY3Rpb24gbyh0KXsic3RyaW5nIj09dHlwZW9mIHI/cj0ic3RyaW5nIj09dHlwZW9mIHQ/cit0OltSdChyKSx0XTpyLnB1c2goInN0cmluZyI9PXR5cGVvZiB0P1J0KHQpOnQpfWZvcihjb25zdCB0IG9mIGUpe2NvbnN0W24sZV09dDtpZihvKGBcbiR7SlNPTi5zdHJpbmdpZnkobil9XG5gKSwic3RyaW5nIj09dHlwZW9mIGV8fGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KW8oZSk7ZWxzZXtsZXQgdDt0cnl7dD1KU09OLnN0cmluZ2lmeShlKX1jYXRjaHt0PUpTT04uc3RyaW5naWZ5KEF0KGUpKX1vKHQpfX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIHI/cjpmdW5jdGlvbih0KXtjb25zdCBuPXQucmVkdWNlKCh0LG4pPT50K24ubGVuZ3RoLDApLGU9bmV3IFVpbnQ4QXJyYXkobik7bGV0IHI9MDtmb3IoY29uc3QgbiBvZiB0KWUuc2V0KG4scikscis9bi5sZW5ndGg7cmV0dXJuIGV9KHIpfWNvbnN0IER0PXtzZXNzaW9uczoic2Vzc2lvbiIsZXZlbnQ6ImVycm9yIixjbGllbnRfcmVwb3J0OiJpbnRlcm5hbCIsdXNlcl9yZXBvcnQ6ImRlZmF1bHQiLHByb2ZpbGVfY2h1bms6InByb2ZpbGUiLHJlcGxheV9ldmVudDoicmVwbGF5IixyZXBsYXlfcmVjb3JkaW5nOiJyZXBsYXkiLGNoZWNrX2luOiJtb25pdG9yIixyYXdfc2VjdXJpdHk6InNlY3VyaXR5Iixsb2c6ImxvZ19pdGVtIix0cmFjZV9tZXRyaWM6Im1ldHJpYyJ9O2Z1bmN0aW9uIFV0KHQpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdCBpbiBEdH0odCk/RHRbdF06dH1mdW5jdGlvbiBMdCh0KXtpZighdD8uc2RrKXJldHVybjtjb25zdHtuYW1lOm4sdmVyc2lvbjplfT10LnNkaztyZXR1cm57bmFtZTpuLHZlcnNpb246ZX19ZnVuY3Rpb24gTXQodCxuLGUscil7Y29uc3Qgbz1MdChlKSxpPXQudHlwZSYmInJlcGxheV9ldmVudCIhPT10LnR5cGU/dC50eXBlOiJldmVudCI7IWZ1bmN0aW9uKHQsbil7aWYoIW4pcmV0dXJuIHQ7Y29uc3QgZT10LnNka3x8e307dC5zZGs9ey4uLmUsbmFtZTplLm5hbWV8fG4ubmFtZSx2ZXJzaW9uOmUudmVyc2lvbnx8bi52ZXJzaW9uLGludGVncmF0aW9uczpbLi4udC5zZGs/LmludGVncmF0aW9uc3x8W10sLi4ubi5pbnRlZ3JhdGlvbnN8fFtdXSxwYWNrYWdlczpbLi4udC5zZGs/LnBhY2thZ2VzfHxbXSwuLi5uLnBhY2thZ2VzfHxbXV0sc2V0dGluZ3M6dC5zZGs/LnNldHRpbmdzfHxuLnNldHRpbmdzP3suLi50LnNkaz8uc2V0dGluZ3MsLi4ubi5zZXR0aW5nc306dm9pZCAwfX0odCxlPy5zZGspO2NvbnN0IHM9ZnVuY3Rpb24odCxuLGUscil7Y29uc3Qgbz10LnNka1Byb2Nlc3NpbmdNZXRhZGF0YT8uZHluYW1pY1NhbXBsaW5nQ29udGV4dDtyZXR1cm57ZXZlbnRfaWQ6dC5ldmVudF9pZCxzZW50X2F0OihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKSwuLi5uJiZ7c2RrOm59LC4uLiEhZSYmciYme2RzbjpidChyKX0sLi4ubyYme3RyYWNlOm99fX0odCxvLHIsbik7ZGVsZXRlIHQuc2RrUHJvY2Vzc2luZ01ldGFkYXRhO3JldHVybiBJdChzLFtbe3R5cGU6aX0sdF1dKX1jb25zdCBCdD0iX19TRU5UUllfU1VQUFJFU1NfVFJBQ0lOR19fIjtmdW5jdGlvbiBXdCh0KXtjb25zdCBuPWZ0KGwoKSk7cmV0dXJuIG4uc3VwcHJlc3NUcmFjaW5nP24uc3VwcHJlc3NUcmFjaW5nKHQpOmZ1bmN0aW9uKC4uLnQpe2NvbnN0IG49ZnQobCgpKTtpZigyPT09dC5sZW5ndGgpe2NvbnN0W2Uscl09dDtyZXR1cm4gZT9uLndpdGhTZXRTY29wZShlLHIpOm4ud2l0aFNjb3BlKHIpfXJldHVybiBuLndpdGhTY29wZSh0WzBdKX0obj0+e24uc2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHtbQnRdOiEwfSk7Y29uc3QgZT10KCk7cmV0dXJuIG4uc2V0U0RLUHJvY2Vzc2luZ01ldGFkYXRhKHtbQnRdOnZvaWQgMH0pLGV9KX1mdW5jdGlvbiB6dCh0LG4pe2NvbnN0e2ZpbmdlcnByaW50OmUsc3BhbjpyLGJyZWFkY3J1bWJzOm8sc2RrUHJvY2Vzc2luZ01ldGFkYXRhOml9PW47IWZ1bmN0aW9uKHQsbil7Y29uc3R7ZXh0cmE6ZSx0YWdzOnIsdXNlcjpvLGNvbnRleHRzOmksbGV2ZWw6cyx0cmFuc2FjdGlvbk5hbWU6Y309bjtPYmplY3Qua2V5cyhlKS5sZW5ndGgmJih0LmV4dHJhPXsuLi5lLC4uLnQuZXh0cmF9KTtPYmplY3Qua2V5cyhyKS5sZW5ndGgmJih0LnRhZ3M9ey4uLnIsLi4udC50YWdzfSk7T2JqZWN0LmtleXMobykubGVuZ3RoJiYodC51c2VyPXsuLi5vLC4uLnQudXNlcn0pO09iamVjdC5rZXlzKGkpLmxlbmd0aCYmKHQuY29udGV4dHM9ey4uLmksLi4udC5jb250ZXh0c30pO3MmJih0LmxldmVsPXMpO2MmJiJ0cmFuc2FjdGlvbiIhPT10LnR5cGUmJih0LnRyYW5zYWN0aW9uPWMpfSh0LG4pLHImJmZ1bmN0aW9uKHQsbil7dC5jb250ZXh0cz17dHJhY2U6X3QobiksLi4udC5jb250ZXh0c30sdC5zZGtQcm9jZXNzaW5nTWV0YWRhdGE9e2R5bmFtaWNTYW1wbGluZ0NvbnRleHQ6Q3QobiksLi4udC5zZGtQcm9jZXNzaW5nTWV0YWRhdGF9O2NvbnN0IGU9anQobikscj1FdChlKS5kZXNjcmlwdGlvbjtyJiYhdC50cmFuc2FjdGlvbiYmInRyYW5zYWN0aW9uIj09PXQudHlwZSYmKHQudHJhbnNhY3Rpb249cil9KHQsciksZnVuY3Rpb24odCxuKXt0LmZpbmdlcnByaW50PXQuZmluZ2VycHJpbnQ/QXJyYXkuaXNBcnJheSh0LmZpbmdlcnByaW50KT90LmZpbmdlcnByaW50Olt0LmZpbmdlcnByaW50XTpbXSxuJiYodC5maW5nZXJwcmludD10LmZpbmdlcnByaW50LmNvbmNhdChuKSk7dC5maW5nZXJwcmludC5sZW5ndGh8fGRlbGV0ZSB0LmZpbmdlcnByaW50fSh0LGUpLGZ1bmN0aW9uKHQsbil7Y29uc3QgZT1bLi4udC5icmVhZGNydW1ic3x8W10sLi4ubl07dC5icmVhZGNydW1icz1lLmxlbmd0aD9lOnZvaWQgMH0odCxvKSxmdW5jdGlvbih0LG4pe3Quc2RrUHJvY2Vzc2luZ01ldGFkYXRhPXsuLi50LnNka1Byb2Nlc3NpbmdNZXRhZGF0YSwuLi5ufX0odCxpKX1jbGFzcyBGdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLlc9MCx0aGlzLkY9W10sdGhpcy5HKHQpfXRoZW4odCxuKXtyZXR1cm4gbmV3IEZ0KChlLHIpPT57dGhpcy5GLnB1c2goWyExLG49PntpZih0KXRyeXtlKHQobikpfWNhdGNoKHQpe3IodCl9ZWxzZSBlKG4pfSx0PT57aWYobil0cnl7ZShuKHQpKX1jYXRjaCh0KXtyKHQpfWVsc2Ugcih0KX1dKSx0aGlzLkgoKX0pfWNhdGNoKHQpe3JldHVybiB0aGlzLnRoZW4odD0+dCx0KX1maW5hbGx5KHQpe3JldHVybiBuZXcgRnQoKG4sZSk9PntsZXQgcixvO3JldHVybiB0aGlzLnRoZW4obj0+e289ITEscj1uLHQmJnQoKX0sbj0+e289ITAscj1uLHQmJnQoKX0pLnRoZW4oKCk9PntvP2Uocik6bihyKX0pfSl9SCgpe2lmKDA9PT10aGlzLlcpcmV0dXJuO2NvbnN0IHQ9dGhpcy5GLnNsaWNlKCk7dGhpcy5GPVtdLHQuZm9yRWFjaCh0PT57dFswXXx8KDE9PT10aGlzLlcmJnRbMV0odGhpcy5KKSwyPT09dGhpcy5XJiZ0WzJdKHRoaXMuSiksdFswXT0hMCl9KX1HKHQpe2NvbnN0IG49KHQsbik9PnswPT09dGhpcy5XJiYoVChuKT9uLnRoZW4oZSxyKToodGhpcy5XPXQsdGhpcy5KPW4sdGhpcy5IKCkpKX0sZT10PT57bigxLHQpfSxyPXQ9PntuKDIsdCl9O3RyeXt0KGUscil9Y2F0Y2godCl7cih0KX19fWNvbnN0IEd0PVN5bWJvbC5mb3IoIlNlbnRyeUJ1ZmZlckZ1bGxFcnJvciIpO2Z1bmN0aW9uIEh0KHQ9MTAwKXtjb25zdCBuPW5ldyBTZXQ7ZnVuY3Rpb24gZSh0KXtuLmRlbGV0ZSh0KX1yZXR1cm57Z2V0ICQoKXtyZXR1cm4gQXJyYXkuZnJvbShuKX0sYWRkOmZ1bmN0aW9uKHIpe2lmKCEobi5zaXplPHQpKXJldHVybiBvPUd0LG5ldyBGdCgodCxuKT0+e24obyl9KTt2YXIgbztjb25zdCBpPXIoKTtyZXR1cm4gbi5hZGQoaSksaS50aGVuKCgpPT5lKGkpLCgpPT5lKGkpKSxpfSxkcmFpbjpmdW5jdGlvbih0KXtpZighbi5zaXplKXJldHVybiBlPSEwLG5ldyBGdCh0PT57dChlKX0pO3ZhciBlO2NvbnN0IHI9UHJvbWlzZS5hbGxTZXR0bGVkKEFycmF5LmZyb20obikpLnRoZW4oKCk9PiEwKTtpZighdClyZXR1cm4gcjtjb25zdCBvPVtyLG5ldyBQcm9taXNlKG49PntyZXR1cm4ib2JqZWN0Ij09dHlwZW9mKGU9c2V0VGltZW91dCgoKT0+bighMSksdCkpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS51bnJlZiYmZS51bnJlZigpLGU7dmFyIGV9KV07cmV0dXJuIFByb21pc2UucmFjZShvKX19fWZ1bmN0aW9uIEp0KHQse3N0YXR1c0NvZGU6bixoZWFkZXJzOmV9LHI9VygpKXtjb25zdCBvPXsuLi50fSxpPWU/LlsieC1zZW50cnktcmF0ZS1saW1pdHMiXSxzPWU/LlsicmV0cnktYWZ0ZXIiXTtpZihpKWZvcihjb25zdCB0IG9mIGkudHJpbSgpLnNwbGl0KCIsIikpe2NvbnN0W24sZSwsLGldPXQuc3BsaXQoIjoiLDUpLHM9cGFyc2VJbnQobiwxMCksYz0xZTMqKGlzTmFOKHMpPzYwOnMpO2lmKGUpZm9yKGNvbnN0IHQgb2YgZS5zcGxpdCgiOyIpKSJtZXRyaWNfYnVja2V0Ij09PXQmJmkmJiFpLnNwbGl0KCI7IikuaW5jbHVkZXMoImN1c3RvbSIpfHwob1t0XT1yK2MpO2Vsc2Ugby5hbGw9citjfWVsc2Ugcz9vLmFsbD1yK2Z1bmN0aW9uKHQsbj1XKCkpe2NvbnN0IGU9cGFyc2VJbnQoYCR7dH1gLDEwKTtpZighaXNOYU4oZSkpcmV0dXJuIDFlMyplO2NvbnN0IHI9RGF0ZS5wYXJzZShgJHt0fWApO3JldHVybiBpc05hTihyKT82ZTQ6ci1ufShzLHIpOjQyOT09PW4mJihvLmFsbD1yKzZlNCk7cmV0dXJuIG99ZnVuY3Rpb24gWXQodCxuLGU9SHQodC5idWZmZXJTaXplfHw2NCkpe2xldCByPXt9O3JldHVybntzZW5kOmZ1bmN0aW9uKHQpe2NvbnN0IG89W107aWYoT3QodCwodCxuKT0+e2NvbnN0IGU9VXQobik7KGZ1bmN0aW9uKHQsbixlPVcoKSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbbl18fHQuYWxsfHwwfSh0LG4pPmV9KShyLGUpfHxvLnB1c2godCl9KSwwPT09by5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7Y29uc3QgaT1JdCh0WzBdLG8pLHM9dD0+eyFmdW5jdGlvbih0LG4pe3JldHVybiBPdCh0LCh0LGUpPT5uLmluY2x1ZGVzKGUpKX0oaSxbImNsaWVudF9yZXBvcnQiXSk/T3QoaSwodCxuKT0+e30pOmgmJlMud2FybihgRHJvcHBpbmcgY2xpZW50IHJlcG9ydC4gV2lsbCBub3Qgc2VuZCBvdXRjb21lcyAocmVhc29uOiAke3R9KS5gKX07cmV0dXJuIGUuYWRkKCgpPT5uKHtib2R5OlB0KGkpfSkudGhlbih0PT40MTM9PT10LnN0YXR1c0NvZGU/KGgmJlMuZXJyb3IoIlNlbnRyeSByZXNwb25kZWQgd2l0aCBzdGF0dXMgY29kZSA0MTMuIEVudmVsb3BlIHdhcyBkaXNjYXJkZWQgZHVlIHRvIGV4Y2VlZGluZyBzaXplIGxpbWl0cy4iKSxzKCJzZW5kX2Vycm9yIiksdCk6KGgmJnZvaWQgMCE9PXQuc3RhdHVzQ29kZSYmKHQuc3RhdHVzQ29kZTwyMDB8fHQuc3RhdHVzQ29kZT49MzAwKSYmUy53YXJuKGBTZW50cnkgcmVzcG9uZGVkIHdpdGggc3RhdHVzIGNvZGUgJHt0LnN0YXR1c0NvZGV9IHRvIHNlbnQgZXZlbnQuYCkscj1KdChyLHQpLHQpLHQ9Pnt0aHJvdyBzKCJuZXR3b3JrX2Vycm9yIiksaCYmUy5lcnJvcigiRW5jb3VudGVyZWQgZXJyb3IgcnVubmluZyB0cmFuc3BvcnQgcmVxdWVzdDoiLHQpLHR9KSkudGhlbih0PT50LHQ9PntpZih0PT09R3QpcmV0dXJuIGgmJlMuZXJyb3IoIlNraXBwZWQgc2VuZGluZyBldmVudCBiZWNhdXNlIGJ1ZmZlciBpcyBmdWxsLiIpLHMoInF1ZXVlX292ZXJmbG93IiksUHJvbWlzZS5yZXNvbHZlKHt9KTt0aHJvdyB0fSl9LGZsdXNoOnQ9PmUuZHJhaW4odCl9fWNvbnN0IFZ0PS9eKFxTKzpcXHxcLz8pKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteL1xcXSs/fCkoXC5bXi4vXFxdKnwpKSg/OlsvXFxdKikkLztmdW5jdGlvbiBLdCh0KXtjb25zdCBuPWZ1bmN0aW9uKHQpe2NvbnN0IG49dC5sZW5ndGg+MTAyND9gPHRydW5jYXRlZD4ke3Quc2xpY2UoLTEwMjQpfWA6dCxlPVZ0LmV4ZWMobik7cmV0dXJuIGU/ZS5zbGljZSgxKTpbXX0odCksZT1uWzBdfHwiIjtsZXQgcj1uWzFdO3JldHVybiBlfHxyPyhyJiYocj1yLnNsaWNlKDAsci5sZW5ndGgtMSkpLGUrcik6Ii4ifWZ1bmN0aW9uIFp0KHQsbj0hMSl7cmV0dXJuIShufHx0JiYhdC5zdGFydHNXaXRoKCIvIikmJiF0Lm1hdGNoKC9eW0EtWl06LykmJiF0LnN0YXJ0c1dpdGgoIi4iKSYmIXQubWF0Y2goL15bYS16QS1aXShbYS16QS1aMC05LlwtK10pKjpcL1wvLykpJiZ2b2lkIDAhPT10JiYhdC5pbmNsdWRlcygibm9kZV9tb2R1bGVzLyIpfWNvbnN0IHF0PVN5bWJvbCgiQWdlbnRCYXNlSW50ZXJuYWxTdGF0ZSIpO2NsYXNzIFF0IGV4dGVuZHMgaS5BZ2VudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzW3F0XT17fX1pc1NlY3VyZUVuZHBvaW50KHQpe2lmKHQpe2lmKCJib29sZWFuIj09dHlwZW9mIHQuc2VjdXJlRW5kcG9pbnQpcmV0dXJuIHQuc2VjdXJlRW5kcG9pbnQ7aWYoInN0cmluZyI9PXR5cGVvZiB0LnByb3RvY29sKXJldHVybiJodHRwczoiPT09dC5wcm90b2NvbH1jb25zdHtzdGFjazpufT1uZXcgRXJyb3I7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuJiZuLnNwbGl0KCJcbiIpLnNvbWUodD0+LTEhPT10LmluZGV4T2YoIihodHRwcy5qczoiKXx8LTEhPT10LmluZGV4T2YoIm5vZGU6aHR0cHM6IikpfWNyZWF0ZVNvY2tldCh0LG4sZSl7Y29uc3Qgcj17Li4ubixzZWN1cmVFbmRwb2ludDp0aGlzLmlzU2VjdXJlRW5kcG9pbnQobil9O1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PnRoaXMuY29ubmVjdCh0LHIpKS50aGVuKG89PntpZihvIGluc3RhbmNlb2YgaS5BZ2VudClyZXR1cm4gby5hZGRSZXF1ZXN0KHQscik7dGhpc1txdF0uY3VycmVudFNvY2tldD1vLHN1cGVyLmNyZWF0ZVNvY2tldCh0LG4sZSl9LGUpfWNyZWF0ZUNvbm5lY3Rpb24oKXtjb25zdCB0PXRoaXNbcXRdLmN1cnJlbnRTb2NrZXQ7aWYodGhpc1txdF0uY3VycmVudFNvY2tldD12b2lkIDAsIXQpdGhyb3cgbmV3IEVycm9yKCJObyBzb2NrZXQgd2FzIHJldHVybmVkIGluIHRoZSBgY29ubmVjdCgpYCBmdW5jdGlvbiIpO3JldHVybiB0fWdldCBkZWZhdWx0UG9ydCgpe3JldHVybiB0aGlzW3F0XS5kZWZhdWx0UG9ydD8/KCJodHRwczoiPT09dGhpcy5wcm90b2NvbD80NDM6ODApfXNldCBkZWZhdWx0UG9ydCh0KXt0aGlzW3F0XSYmKHRoaXNbcXRdLmRlZmF1bHRQb3J0PXQpfWdldCBwcm90b2NvbCgpe3JldHVybiB0aGlzW3F0XS5wcm90b2NvbD8/KHRoaXMuaXNTZWN1cmVFbmRwb2ludCgpPyJodHRwczoiOiJodHRwOiIpfXNldCBwcm90b2NvbCh0KXt0aGlzW3F0XSYmKHRoaXNbcXRdLnByb3RvY29sPXQpfX1mdW5jdGlvbiBYdCguLi50KXtTLmxvZygiW2h0dHBzLXByb3h5LWFnZW50OnBhcnNlLXByb3h5LXJlc3BvbnNlXSIsLi4udCl9ZnVuY3Rpb24gdG4odCl7cmV0dXJuIG5ldyBQcm9taXNlKChuLGUpPT57bGV0IHI9MDtjb25zdCBvPVtdO2Z1bmN0aW9uIGkoKXtjb25zdCBjPXQucmVhZCgpO2M/ZnVuY3Rpb24oYyl7by5wdXNoKGMpLHIrPWMubGVuZ3RoO2NvbnN0IHU9QnVmZmVyLmNvbmNhdChvLHIpLGE9dS5pbmRleE9mKCJcclxuXHJcbiIpO2lmKC0xPT09YSlyZXR1cm4gWHQoImhhdmUgbm90IHJlY2VpdmVkIGVuZCBvZiBIVFRQIGhlYWRlcnMgeWV0Li4uIiksdm9pZCBpKCk7Y29uc3QgZj11LnN1YmFycmF5KDAsYSkudG9TdHJpbmcoImFzY2lpIikuc3BsaXQoIlxyXG4iKSxoPWYuc2hpZnQoKTtpZighaClyZXR1cm4gdC5kZXN0cm95KCksZShuZXcgRXJyb3IoIk5vIGhlYWRlciByZWNlaXZlZCBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2UiKSk7Y29uc3QgcD1oLnNwbGl0KCIgIiksZD0rKHBbMV18fDApLGw9cC5zbGljZSgyKS5qb2luKCIgIiksbT17fTtmb3IoY29uc3QgbiBvZiBmKXtpZighbiljb250aW51ZTtjb25zdCByPW4uaW5kZXhPZigiOiIpO2lmKC0xPT09cilyZXR1cm4gdC5kZXN0cm95KCksZShuZXcgRXJyb3IoYEludmFsaWQgaGVhZGVyIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZTogIiR7bn0iYCkpO2NvbnN0IG89bi5zbGljZSgwLHIpLnRvTG93ZXJDYXNlKCksaT1uLnNsaWNlKHIrMSkudHJpbVN0YXJ0KCkscz1tW29dOyJzdHJpbmciPT10eXBlb2Ygcz9tW29dPVtzLGldOkFycmF5LmlzQXJyYXkocyk/cy5wdXNoKGkpOm1bb109aX1YdCgiZ290IHByb3h5IHNlcnZlciByZXNwb25zZTogJW8gJW8iLGgsbSkscygpLG4oe2Nvbm5lY3Q6e3N0YXR1c0NvZGU6ZCxzdGF0dXNUZXh0OmwsaGVhZGVyczptfSxidWZmZXJlZDp1fSl9KGMpOnQub25jZSgicmVhZGFibGUiLGkpfWZ1bmN0aW9uIHMoKXt0LnJlbW92ZUxpc3RlbmVyKCJlbmQiLGMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIix1KSx0LnJlbW92ZUxpc3RlbmVyKCJyZWFkYWJsZSIsaSl9ZnVuY3Rpb24gYygpe3MoKSxYdCgib25lbmQiKSxlKG5ldyBFcnJvcigiUHJveHkgY29ubmVjdGlvbiBlbmRlZCBiZWZvcmUgcmVjZWl2aW5nIENPTk5FQ1QgcmVzcG9uc2UiKSl9ZnVuY3Rpb24gdSh0KXtzKCksWHQoIm9uZXJyb3IgJW8iLHQpLGUodCl9dC5vbigiZXJyb3IiLHUpLHQub24oImVuZCIsYyksaSgpfSl9ZnVuY3Rpb24gbm4oLi4udCl7Uy5sb2coIltodHRwcy1wcm94eS1hZ2VudF0iLC4uLnQpfWNsYXNzIGVuIGV4dGVuZHMgUXR7c3RhdGljIF9faW5pdFN0YXRpYygpe3RoaXMucHJvdG9jb2xzPVsiaHR0cCIsImh0dHBzIl19Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLm9wdGlvbnM9e30sdGhpcy5wcm94eT0ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFVSTCh0KTp0LHRoaXMucHJveHlIZWFkZXJzPW4/LmhlYWRlcnM/P3t9LG5uKCJDcmVhdGluZyBuZXcgSHR0cHNQcm94eUFnZW50IGluc3RhbmNlOiAlbyIsdGhpcy5wcm94eS5ocmVmKTtjb25zdCBlPSh0aGlzLnByb3h5Lmhvc3RuYW1lfHx0aGlzLnByb3h5Lmhvc3QpLnJlcGxhY2UoL15cW3xcXSQvZywiIikscj10aGlzLnByb3h5LnBvcnQ/cGFyc2VJbnQodGhpcy5wcm94eS5wb3J0LDEwKToiaHR0cHM6Ij09PXRoaXMucHJveHkucHJvdG9jb2w/NDQzOjgwO3RoaXMuY29ubmVjdE9wdHM9e0FMUE5Qcm90b2NvbHM6WyJodHRwLzEuMSJdLC4uLm4/b24obiwiaGVhZGVycyIpOm51bGwsaG9zdDplLHBvcnQ6cn19YXN5bmMgY29ubmVjdCh0LG4pe2NvbnN0e3Byb3h5OmV9PXRoaXM7aWYoIW4uaG9zdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyAiaG9zdCIgcHJvdmlkZWQnKTtsZXQgcjtpZigiaHR0cHM6Ij09PWUucHJvdG9jb2wpe25uKCJDcmVhdGluZyBgdGxzLlNvY2tldGA6ICVvIix0aGlzLmNvbm5lY3RPcHRzKTtjb25zdCB0PXRoaXMuY29ubmVjdE9wdHMuc2VydmVybmFtZXx8dGhpcy5jb25uZWN0T3B0cy5ob3N0O3I9Zi5jb25uZWN0KHsuLi50aGlzLmNvbm5lY3RPcHRzLHNlcnZlcm5hbWU6dCYmYS5pc0lQKHQpP3ZvaWQgMDp0fSl9ZWxzZSBubigiQ3JlYXRpbmcgYG5ldC5Tb2NrZXRgOiAlbyIsdGhpcy5jb25uZWN0T3B0cykscj1hLmNvbm5lY3QodGhpcy5jb25uZWN0T3B0cyk7Y29uc3Qgbz0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wcm94eUhlYWRlcnM/dGhpcy5wcm94eUhlYWRlcnMoKTp7Li4udGhpcy5wcm94eUhlYWRlcnN9LGk9YS5pc0lQdjYobi5ob3N0KT9gWyR7bi5ob3N0fV1gOm4uaG9zdDtsZXQgcz1gQ09OTkVDVCAke2l9OiR7bi5wb3J0fSBIVFRQLzEuMVxyXG5gO2lmKGUudXNlcm5hbWV8fGUucGFzc3dvcmQpe2NvbnN0IHQ9YCR7ZGVjb2RlVVJJQ29tcG9uZW50KGUudXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChlLnBhc3N3b3JkKX1gO29bIlByb3h5LUF1dGhvcml6YXRpb24iXT1gQmFzaWMgJHtCdWZmZXIuZnJvbSh0KS50b1N0cmluZygiYmFzZTY0Iil9YH1vLkhvc3Q9YCR7aX06JHtuLnBvcnR9YCxvWyJQcm94eS1Db25uZWN0aW9uIl18fChvWyJQcm94eS1Db25uZWN0aW9uIl09dGhpcy5rZWVwQWxpdmU/IktlZXAtQWxpdmUiOiJjbG9zZSIpO2Zvcihjb25zdCB0IG9mIE9iamVjdC5rZXlzKG8pKXMrPWAke3R9OiAke29bdF19XHJcbmA7Y29uc3QgYz10bihyKTtyLndyaXRlKGAke3N9XHJcbmApO2NvbnN0e2Nvbm5lY3Q6dSxidWZmZXJlZDpofT1hd2FpdCBjO2lmKHQuZW1pdCgicHJveHlDb25uZWN0Iix1KSx0aGlzLmVtaXQoInByb3h5Q29ubmVjdCIsdSx0KSwyMDA9PT11LnN0YXR1c0NvZGUpe2lmKHQub25jZSgic29ja2V0Iixybiksbi5zZWN1cmVFbmRwb2ludCl7bm4oIlVwZ3JhZGluZyBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMiKTtjb25zdCB0PW4uc2VydmVybmFtZXx8bi5ob3N0O3JldHVybiBmLmNvbm5lY3Qoey4uLm9uKG4sImhvc3QiLCJwYXRoIiwicG9ydCIpLHNvY2tldDpyLHNlcnZlcm5hbWU6YS5pc0lQKHQpP3ZvaWQgMDp0fSl9cmV0dXJuIHJ9ci5kZXN0cm95KCk7Y29uc3QgcD1uZXcgYS5Tb2NrZXQoe3dyaXRhYmxlOiExfSk7cmV0dXJuIHAucmVhZGFibGU9ITAsdC5vbmNlKCJzb2NrZXQiLHQ9PntubigiUmVwbGF5aW5nIHByb3h5IGJ1ZmZlciBmb3IgZmFpbGVkIHJlcXVlc3QiKSx0LnB1c2goaCksdC5wdXNoKG51bGwpfSkscH19ZnVuY3Rpb24gcm4odCl7dC5yZXN1bWUoKX1mdW5jdGlvbiBvbih0LC4uLm4pe2NvbnN0IGU9e307bGV0IHI7Zm9yKHIgaW4gdCluLmluY2x1ZGVzKHIpfHwoZVtyXT10W3JdKTtyZXR1cm4gZX1lbi5fX2luaXRTdGF0aWMoKTtmdW5jdGlvbiBzbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9eW0EtWl06LywiIikucmVwbGFjZSgvXFwvZywiLyIpfWNvbnN0IGNuPW47bGV0IHVuLGFuPTAsZm49e307ZnVuY3Rpb24gaG4odCl7Y24uZGVidWcmJmNvbnNvbGUubG9nKGBbQU5SIFdvcmtlcl0gJHt0fWApfXZhciBwbixkbixsbjtjb25zdCBtbj1mdW5jdGlvbih0KXtsZXQgbjt0cnl7bj1uZXcgVVJMKHQudXJsKX1jYXRjaChuKXtyZXR1cm4gYigoKT0+e2NvbnNvbGUud2FybigiW0BzZW50cnkvbm9kZV06IEludmFsaWQgZHNuIG9yIHR1bm5lbCBvcHRpb24sIHdpbGwgbm90IHNlbmQgYW55IGV2ZW50cy4gVGhlIHR1bm5lbCBvcHRpb24gbXVzdCBiZSBhIGZ1bGwgVVJMIHdoZW4gdXNlZC4iKX0pLFl0KHQsKCk9PlByb21pc2UucmVzb2x2ZSh7fSkpfWNvbnN0IGU9Imh0dHBzOiI9PT1uLnByb3RvY29sLHI9ZnVuY3Rpb24odCxuKXtjb25zdHtub19wcm94eTplfT1wcm9jZXNzLmVudixyPWU/LnNwbGl0KCIsIikuc29tZShuPT50Lmhvc3QuZW5kc1dpdGgobil8fHQuaG9zdG5hbWUuZW5kc1dpdGgobikpO3JldHVybiByP3ZvaWQgMDpufShuLHQucHJveHl8fChlP3Byb2Nlc3MuZW52Lmh0dHBzX3Byb3h5OnZvaWQgMCl8fHByb2Nlc3MuZW52Lmh0dHBfcHJveHkpLG89ZT9zOmksYT12b2lkIDAhPT10LmtlZXBBbGl2ZSYmdC5rZWVwQWxpdmUsZj1yP25ldyBlbihyKTpuZXcgby5BZ2VudCh7a2VlcEFsaXZlOmEsbWF4U29ja2V0czozMCx0aW1lb3V0OjJlM30pLGg9ZnVuY3Rpb24odCxuLGUpe2NvbnN0e2hvc3RuYW1lOnIscGF0aG5hbWU6byxwb3J0OmkscHJvdG9jb2w6cyxzZWFyY2g6YX09bmV3IFVSTCh0LnVybCk7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBuZXcgUHJvbWlzZSgoaCxwKT0+e1d0KCgpPT57bGV0IGQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKHtyZWFkKCl7dGhpcy5wdXNoKHQpLHRoaXMucHVzaChudWxsKX19KX0oZi5ib2R5KTtjb25zdCBsPXsuLi50LmhlYWRlcnN9O2YuYm9keS5sZW5ndGg+MzI3NjgmJihsWyJjb250ZW50LWVuY29kaW5nIl09Imd6aXAiLGQ9ZC5waXBlKHUoKSkpO2NvbnN0IG09ci5zdGFydHNXaXRoKCJbIiksZz1uLnJlcXVlc3Qoe21ldGhvZDoiUE9TVCIsYWdlbnQ6ZSxoZWFkZXJzOmwsaG9zdG5hbWU6bT9yLnNsaWNlKDEsLTEpOnIscGF0aDpgJHtvfSR7YX1gLHBvcnQ6aSxwcm90b2NvbDpzLGNhOnQuY2FDZXJ0c30sdD0+e3Qub24oImRhdGEiLCgpPT57fSksdC5vbigiZW5kIiwoKT0+e30pLHQuc2V0RW5jb2RpbmcoInV0ZjgiKTtjb25zdCBuPXQuaGVhZGVyc1sicmV0cnktYWZ0ZXIiXT8/bnVsbCxlPXQuaGVhZGVyc1sieC1zZW50cnktcmF0ZS1saW1pdHMiXT8/bnVsbDtoKHtzdGF0dXNDb2RlOnQuc3RhdHVzQ29kZSxoZWFkZXJzOnsicmV0cnktYWZ0ZXIiOm4sIngtc2VudHJ5LXJhdGUtbGltaXRzIjpBcnJheS5pc0FycmF5KGUpP2VbMF18fG51bGw6ZX19KX0pO2cub24oImVycm9yIixwKSxkLnBpcGUoZyl9KX0pfX0odCx0Lmh0dHBNb2R1bGU/P28sZik7cmV0dXJuIFl0KHQsaCl9KHt1cmw6KHBuPWNuLmRzbixkbj1jbi50dW5uZWwsbG49Y24uc2RrTWV0YWRhdGEuc2RrLGRufHxgJHtmdW5jdGlvbih0KXtyZXR1cm5gJHtmdW5jdGlvbih0KXtjb25zdCBuPXQucHJvdG9jb2w/YCR7dC5wcm90b2NvbH06YDoiIixlPXQucG9ydD9gOiR7dC5wb3J0fWA6IiI7cmV0dXJuYCR7bn0vLyR7dC5ob3N0fSR7ZX0ke3QucGF0aD9gLyR7dC5wYXRofWA6IiJ9L2FwaS9gfSh0KX0ke3QucHJvamVjdElkfS9lbnZlbG9wZS9gfShwbil9PyR7ZnVuY3Rpb24odCxuKXtjb25zdCBlPXtzZW50cnlfdmVyc2lvbjoiNyJ9O3JldHVybiB0LnB1YmxpY0tleSYmKGUuc2VudHJ5X2tleT10LnB1YmxpY0tleSksbiYmKGUuc2VudHJ5X2NsaWVudD1gJHtuLm5hbWV9LyR7bi52ZXJzaW9ufWApLG5ldyBVUkxTZWFyY2hQYXJhbXMoZSkudG9TdHJpbmcoKX0ocG4sbG4pfWApfSk7YXN5bmMgZnVuY3Rpb24gZ24oKXtpZih1bil7aG4oIlNlbmRpbmcgYWJub3JtYWwgc2Vzc2lvbiIpLFYodW4se3N0YXR1czoiYWJub3JtYWwiLGFibm9ybWFsX21lY2hhbmlzbToiYW5yX2ZvcmVncm91bmQiLHJlbGVhc2U6Y24ucmVsZWFzZSxlbnZpcm9ubWVudDpjbi5lbnZpcm9ubWVudH0pO2NvbnN0IHQ9ZnVuY3Rpb24odCxuLGUscil7Y29uc3Qgbz1MdChlKTtyZXR1cm4gSXQoe3NlbnRfYXQ6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLC4uLm8mJntzZGs6b30sLi4uISFyJiZuJiZ7ZHNuOmJ0KG4pfX0sWyJhZ2dyZWdhdGVzImluIHQ/W3t0eXBlOiJzZXNzaW9ucyJ9LHRdOlt7dHlwZToic2Vzc2lvbiJ9LHQudG9KU09OKCldXSl9KHVuLGNuLmRzbixjbi5zZGtNZXRhZGF0YSxjbi50dW5uZWwpO2huKEpTT04uc3RyaW5naWZ5KHQpKSxhd2FpdCBtbi5zZW5kKHQpO3RyeXtlPy5wb3N0TWVzc2FnZSgic2Vzc2lvbi1lbmRlZCIpfWNhdGNoe319fWZ1bmN0aW9uIHluKHQpe2lmKCF0KXJldHVybjtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKCF0Lmxlbmd0aClyZXR1cm5bXTtjb25zdCBuPUFycmF5LmZyb20odCk7cmV0dXJuL3NlbnRyeVdyYXBwZWQvLnRlc3QoRShuKS5mdW5jdGlvbnx8IiIpJiZuLnBvcCgpLG4ucmV2ZXJzZSgpLCQudGVzdChFKG4pLmZ1bmN0aW9ufHwiIikmJihuLnBvcCgpLCQudGVzdChFKG4pLmZ1bmN0aW9ufHwiIikmJm4ucG9wKCkpLG4uc2xpY2UoMCw1MCkubWFwKHQ9Pih7Li4udCxmaWxlbmFtZTp0LmZpbGVuYW1lfHxFKG4pLmZpbGVuYW1lLGZ1bmN0aW9uOnQuZnVuY3Rpb258fCI/In0pKX0odCk7aWYoY24uYXBwUm9vdFBhdGgpZm9yKGNvbnN0IHQgb2Ygbil0LmZpbGVuYW1lJiYodC5maWxlbmFtZT1rdCh0LmZpbGVuYW1lLGNuLmFwcFJvb3RQYXRoKSk7cmV0dXJuIG59YXN5bmMgZnVuY3Rpb24gYm4odCxuKXtpZihhbj49Y24ubWF4QW5yRXZlbnRzKXJldHVybjthbis9MSxhd2FpdCBnbigpLGhuKCJTZW5kaW5nIGV2ZW50Iik7Y29uc3QgZT17ZXZlbnRfaWQ6RigpLGNvbnRleHRzOmNuLmNvbnRleHRzLHJlbGVhc2U6Y24ucmVsZWFzZSxlbnZpcm9ubWVudDpjbi5lbnZpcm9ubWVudCxkaXN0OmNuLmRpc3QscGxhdGZvcm06Im5vZGUiLGxldmVsOiJlcnJvciIsZXhjZXB0aW9uOnt2YWx1ZXM6W3t0eXBlOiJBcHBsaWNhdGlvbk5vdFJlc3BvbmRpbmciLHZhbHVlOmBBcHBsaWNhdGlvbiBOb3QgUmVzcG9uZGluZyBmb3IgYXQgbGVhc3QgJHtjbi5hbnJUaHJlc2hvbGR9IG1zYCxzdGFja3RyYWNlOntmcmFtZXM6eW4odCl9LG1lY2hhbmlzbTp7dHlwZToiQU5SIn19XX0sdGFnczpjbi5zdGF0aWNUYWdzfTtuJiZmdW5jdGlvbih0LG4pe2lmKHp0KHQsbiksIXQuY29udGV4dHM/LnRyYWNlKXtjb25zdHt0cmFjZUlkOmUscGFyZW50U3BhbklkOnIscHJvcGFnYXRpb25TcGFuSWQ6b309bi5wcm9wYWdhdGlvbkNvbnRleHQ7dC5jb250ZXh0cz17dHJhY2U6e3RyYWNlX2lkOmUsc3Bhbl9pZDpvfHxxKCkscGFyZW50X3NwYW5faWQ6cn0sLi4udC5jb250ZXh0c319fShlLG4pLGZ1bmN0aW9uKHQpe2lmKDA9PT1PYmplY3Qua2V5cyhmbikubGVuZ3RoKXJldHVybjtjb25zdCBuPWNuLmFwcFJvb3RQYXRoP3t9OmZuO2lmKGNuLmFwcFJvb3RQYXRoKWZvcihjb25zdFt0LGVdb2YgT2JqZWN0LmVudHJpZXMoZm4pKW5ba3QodCxjbi5hcHBSb290UGF0aCldPWU7Y29uc3QgZT1uZXcgTWFwO2Zvcihjb25zdCByIG9mIHQuZXhjZXB0aW9uPy52YWx1ZXN8fFtdKWZvcihjb25zdCB0IG9mIHIuc3RhY2t0cmFjZT8uZnJhbWVzfHxbXSl7Y29uc3Qgcj10LmFic19wYXRofHx0LmZpbGVuYW1lO3ImJm5bcl0mJmUuc2V0KHIsbltyXSl9aWYoZS5zaXplPjApe2NvbnN0IG49W107Zm9yKGNvbnN0W3Qscl1vZiBlLmVudHJpZXMoKSluLnB1c2goe3R5cGU6InNvdXJjZW1hcCIsY29kZV9maWxlOnQsZGVidWdfaWQ6cn0pO3QuZGVidWdfbWV0YT17aW1hZ2VzOm59fX0oZSk7Y29uc3Qgcj1NdChlLGNuLmRzbixjbi5zZGtNZXRhZGF0YSxjbi50dW5uZWwpO2huKEpTT04uc3RyaW5naWZ5KHIpKSxhd2FpdCBtbi5zZW5kKHIpLGF3YWl0IG1uLmZsdXNoKDJlMyksYW4+PWNuLm1heEFuckV2ZW50cyYmc2V0VGltZW91dCgoKT0+e3Byb2Nlc3MuZXhpdCgwKX0sNWUzKX1sZXQgdm47aWYoaG4oIlN0YXJ0ZWQiKSxjbi5jYXB0dXJlU3RhY2tUcmFjZSl7aG4oIkNvbm5lY3RpbmcgdG8gZGVidWdnZXIiKTtjb25zdCBuPW5ldyB0O24uY29ubmVjdFRvTWFpblRocmVhZCgpLGhuKCJDb25uZWN0ZWQgdG8gZGVidWdnZXIiKTtjb25zdCBlPW5ldyBNYXA7bi5vbigiRGVidWdnZXIuc2NyaXB0UGFyc2VkIix0PT57ZS5zZXQodC5wYXJhbXMuc2NyaXB0SWQsdC5wYXJhbXMudXJsKX0pLG4ub24oIkRlYnVnZ2VyLnBhdXNlZCIsdD0+e2lmKCJvdGhlciI9PT10LnBhcmFtcy5yZWFzb24pdHJ5e2huKCJEZWJ1Z2dlciBwYXVzZWQiKTtjb25zdCBpPVsuLi50LnBhcmFtcy5jYWxsRnJhbWVzXSxzPWNuLmFwcFJvb3RQYXRoP2Z1bmN0aW9uKHQ9KHByb2Nlc3MuYXJndlsxXT9LdChwcm9jZXNzLmFyZ3ZbMV0pOnByb2Nlc3MuY3dkKCkpLG49IlxcIj09PW8pe2NvbnN0IGU9bj9zbih0KTp0O3JldHVybiB0PT57aWYoIXQpcmV0dXJuO2NvbnN0IG89bj9zbih0KTp0O2xldHtkaXI6aSxiYXNlOnMsZXh0OmN9PXIucGFyc2Uobyk7Ii5qcyIhPT1jJiYiLm1qcyIhPT1jJiYiLmNqcyIhPT1jfHwocz1zLnNsaWNlKDAsLTEqYy5sZW5ndGgpKTtjb25zdCB1PWRlY29kZVVSSUNvbXBvbmVudChzKTtpfHwoaT0iLiIpO2NvbnN0IGE9aS5sYXN0SW5kZXhPZigiL25vZGVfbW9kdWxlcyIpO2lmKGE+LTEpcmV0dXJuYCR7aS5zbGljZShhKzE0KS5yZXBsYWNlKC9cLy9nLCIuIil9OiR7dX1gO2lmKGkuc3RhcnRzV2l0aChlKSl7Y29uc3QgdD1pLnNsaWNlKGUubGVuZ3RoKzEpLnJlcGxhY2UoL1wvL2csIi4iKTtyZXR1cm4gdD9gJHt0fToke3V9YDp1fXJldHVybiB1fX0oY24uYXBwUm9vdFBhdGgpOigpPT57fSxjPWkubWFwKHQ9PmZ1bmN0aW9uKHQsbixlKXtjb25zdCByPW4/bi5yZXBsYWNlKC9eZmlsZTpcL1wvLywiIik6dm9pZCAwLG89dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXI/dC5sb2NhdGlvbi5jb2x1bW5OdW1iZXIrMTp2b2lkIDAsaT10LmxvY2F0aW9uLmxpbmVOdW1iZXI/dC5sb2NhdGlvbi5saW5lTnVtYmVyKzE6dm9pZCAwO3JldHVybntmaWxlbmFtZTpyLG1vZHVsZTplKHIpLGZ1bmN0aW9uOnQuZnVuY3Rpb25OYW1lfHwiPyIsY29sbm86byxsaW5lbm86aSxpbl9hcHA6cj9adChyKTp2b2lkIDB9fSh0LGUuZ2V0KHQubG9jYXRpb24uc2NyaXB0SWQpLHMpKSx1PXNldFRpbWVvdXQoKCk9PntibihjKS50aGVuKG51bGwsKCk9PntobigiU2VuZGluZyBBTlIgZXZlbnQgZmFpbGVkLiIpfSl9LDVlMyk7bi5wb3N0KCJSdW50aW1lLmV2YWx1YXRlIix7ZXhwcmVzc2lvbjoiZ2xvYmFsLl9fU0VOVFJZX0dFVF9TQ09QRVNfXygpOyIsc2lsZW50OiEwLHJldHVybkJ5VmFsdWU6ITB9LCh0LGUpPT57dCYmaG4oYEVycm9yIGV4ZWN1dGluZyBzY3JpcHQ6ICcke3QubWVzc2FnZX0nYCksY2xlYXJUaW1lb3V0KHUpO2NvbnN0IHI9ZT8ucmVzdWx0P2UucmVzdWx0LnZhbHVlOnZvaWQgMDtuLnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpLG4ucG9zdCgiRGVidWdnZXIuZGlzYWJsZSIpLGJuKGMscikudGhlbihudWxsLCgpPT57aG4oIlNlbmRpbmcgQU5SIGV2ZW50IGZhaWxlZC4iKX0pfSl9Y2F0Y2godCl7dGhyb3cgbi5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKSxuLnBvc3QoIkRlYnVnZ2VyLmRpc2FibGUiKSx0fX0pLHZuPSgpPT57dHJ5e24ucG9zdCgiRGVidWdnZXIuZW5hYmxlIiwoKT0+e24ucG9zdCgiRGVidWdnZXIucGF1c2UiKX0pfWNhdGNoe319fWNvbnN0e3BvbGw6X259PWZ1bmN0aW9uKHQsbixlLHIpe2NvbnN0IG89dCgpO2xldCBpPSExLHM9ITA7cmV0dXJuIHNldEludGVydmFsKCgpPT57Y29uc3QgdD1vLmdldFRpbWVNcygpOyExPT09aSYmdD5uK2UmJihpPSEwLHMmJnIoKSksdDxuK2UmJihpPSExKX0sMjApLHtwb2xsOigpPT57by5yZXNldCgpfSxlbmFibGVkOnQ9PntzPXR9fX0oZnVuY3Rpb24oKXtsZXQgdD1wcm9jZXNzLmhydGltZSgpO3JldHVybntnZXRUaW1lTXM6KCk9Pntjb25zdFtuLGVdPXByb2Nlc3MuaHJ0aW1lKHQpO3JldHVybiBNYXRoLmZsb29yKDFlMypuK2UvMWU2KX0scmVzZXQ6KCk9Pnt0PXByb2Nlc3MuaHJ0aW1lKCl9fX0sY24ucG9sbEludGVydmFsLGNuLmFuclRocmVzaG9sZCxmdW5jdGlvbigpe2huKCJXYXRjaGRvZyB0aW1lb3V0Iiksdm4/KGhuKCJQYXVzaW5nIGRlYnVnZ2VyIHRvIGNhcHR1cmUgc3RhY2sgdHJhY2UiKSx2bigpKTooaG4oIkNhcHR1cmluZyBldmVudCB3aXRob3V0IGEgc3RhY2sgdHJhY2UiKSxibigpLnRoZW4obnVsbCwoKT0+e2huKCJTZW5kaW5nIEFOUiBldmVudCBmYWlsZWQgb24gd2F0Y2hkb2cgdGltZW91dC4iKX0pKX0pO2U/Lm9uKCJtZXNzYWdlIix0PT57dC5zZXNzaW9uJiYodW49WSh0LnNlc3Npb24pKSx0LmRlYnVnSW1hZ2VzJiYoZm49dC5kZWJ1Z0ltYWdlcyksX24oKX0pOw==';

@@ -13,0 +13,0 @@ const DEFAULT_INTERVAL = 50;

@@ -1,2 +0,2 @@

/*! @sentry/node-core 10.50.0-alpha.0 (9c52044) | https://github.com/getsentry/sentry-javascript */
import{Session as t}from"node:inspector";import{workerData as n,parentPort as e}from"node:worker_threads";import{posix as r,sep as o}from"node:path";import*as i from"node:http";import*as s from"node:https";import{Readable as c}from"node:stream";import{createGzip as u}from"node:zlib";import*as a from"node:net";import*as f from"node:tls";const h="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__,p=globalThis,d="10.50.0-alpha.0";function l(){return m(p),p}function m(t){const n=t.__SENTRY__=t.__SENTRY__||{};return n.version=n.version||d,n[d]=n[d]||{}}function g(t,n,e=p){const r=e.__SENTRY__=e.__SENTRY__||{},o=r[d]=r[d]||{};return o[t]||(o[t]=n())}const y={};function b(t){if(!("console"in p))return t();const n=p.console,e={},r=Object.keys(y);r.forEach(t=>{const r=y[t];e[t]=n[t],n[t]=r});try{return t()}finally{r.forEach(t=>{n[t]=e[t]})}}function v(){return w().enabled}function _(t,...n){h&&v()&&b(()=>{p.console[t](`Sentry Logger [${t}]:`,...n)})}function w(){return h?g("loggerSettings",()=>({enabled:!1})):{enabled:!1}}const S={enable:function(){w().enabled=!0},disable:function(){w().enabled=!1},isEnabled:v,log:function(...t){_("log",...t)},warn:function(...t){_("warn",...t)},error:function(...t){_("error",...t)}},$=/captureMessage|captureException/;function E(t){return t[t.length-1]||{}}const x="<anonymous>";const N=Object.prototype.toString;function j(t,n){return N.call(t)===`[object ${n}]`}function C(t){return j(t,"String")}function A(t){return j(t,"Object")}function T(t){return Boolean(t?.then&&"function"==typeof t.then)}function k(t,n){try{return t instanceof n}catch{return!1}}const I=p;function O(t,n){const e=t,r=[];if(!e?.tagName)return"";if(I.HTMLElement&&e instanceof HTMLElement&&e.dataset){if(e.dataset.sentryComponent)return e.dataset.sentryComponent;if(e.dataset.sentryElement)return e.dataset.sentryElement}r.push(e.tagName.toLowerCase());const o=n?.length?n.filter(t=>e.getAttribute(t)).map(t=>[t,e.getAttribute(t)]):null;if(o?.length)o.forEach(t=>{r.push(`[${t[0]}="${t[1]}"]`)});else{e.id&&r.push(`#${e.id}`);const t=e.className;if(t&&C(t)){const n=t.split(/\s+/);for(const t of n)r.push(`.${t}`)}}for(const t of["aria-label","type","name","title","alt"]){const n=e.getAttribute(t);n&&r.push(`[${t}="${n}"]`)}return r.join("")}function R(t){if(function(t){switch(N.call(t)){case"[object Error]":case"[object Exception]":case"[object DOMException]":case"[object WebAssembly.Exception]":return!0;default:return k(t,Error)}}(t))return{message:t.message,name:t.name,stack:t.stack,...D(t)};if(n=t,"undefined"!=typeof Event&&k(n,Event)){const n={type:t.type,target:P(t.target),currentTarget:P(t.currentTarget),...D(t)};return"undefined"!=typeof CustomEvent&&k(t,CustomEvent)&&(n.detail=t.detail),n}return t;var n}function P(t){try{return n=t,"undefined"!=typeof Element&&k(n,Element)?function(t,n={}){if(!t)return"<unknown>";try{let e=t;const r=5,o=[];let i=0,s=0;const c=" > ",u=c.length;let a;const f=Array.isArray(n)?n:n.keyAttrs,h=!Array.isArray(n)&&n.maxStringLength||80;for(;e&&i++<r&&(a=O(e,f),!("html"===a||i>1&&s+o.length*u+a.length>=h));)o.push(a),s+=a.length,e=e.parentNode;return o.reverse().join(c)}catch{return"<unknown>"}}(t):Object.prototype.toString.call(t)}catch{return"<unknown>"}var n}function D(t){return"object"==typeof t&&null!==t?Object.fromEntries(Object.entries(t)):{}}let U,L;function M(t){if(void 0!==U)return U?U(t):t();const n=Symbol.for("__SENTRY_SAFE_RANDOM_ID_WRAPPER__"),e=p;return n in e&&"function"==typeof e[n]?(U=e[n],U(t)):(U=null,t())}function B(){return M(()=>Math.random())}function W(){return M(()=>Date.now())}function z(t,n=0){return"string"!=typeof t||0===n||t.length<=n?t:`${t.slice(0,n)}...`}function F(t=function(){const t=p;return t.crypto||t.msCrypto}()){try{if(t?.randomUUID)return M(()=>t.randomUUID()).replace(/-/g,"")}catch{}return L||(L=[1e7]+1e3+4e3+8e3+1e11),L.replace(/[018]/g,t=>(t^(16*B()&15)>>t/4).toString(16))}function G(){return W()/1e3}let H;function J(){return(H??(H=function(){const{performance:t}=p;if(!t?.now||!t.timeOrigin)return G;const n=t.timeOrigin;return()=>(n+M(()=>t.now()))/1e3}()))()}function Y(t){const n=J(),e={sid:F(),init:!0,timestamp:n,started:n,duration:0,status:"ok",errors:0,ignoreDuration:!1,toJSON:()=>function(t){return{sid:`${t.sid}`,init:t.init,started:new Date(1e3*t.started).toISOString(),timestamp:new Date(1e3*t.timestamp).toISOString(),status:t.status,errors:t.errors,did:"number"==typeof t.did||"string"==typeof t.did?`${t.did}`:void 0,duration:t.duration,abnormal_mechanism:t.abnormal_mechanism,attrs:{release:t.release,environment:t.environment,ip_address:t.ipAddress,user_agent:t.userAgent}}}(e)};return t&&V(e,t),e}function V(t,n={}){if(n.user&&(!t.ipAddress&&n.user.ip_address&&(t.ipAddress=n.user.ip_address),t.did||n.did||(t.did=n.user.id||n.user.email||n.user.username)),t.timestamp=n.timestamp||J(),n.abnormal_mechanism&&(t.abnormal_mechanism=n.abnormal_mechanism),n.ignoreDuration&&(t.ignoreDuration=n.ignoreDuration),n.sid&&(t.sid=32===n.sid.length?n.sid:F()),void 0!==n.init&&(t.init=n.init),!t.did&&n.did&&(t.did=`${n.did}`),"number"==typeof n.started&&(t.started=n.started),t.ignoreDuration)t.duration=void 0;else if("number"==typeof n.duration)t.duration=n.duration;else{const n=t.timestamp-t.started;t.duration=n>=0?n:0}n.release&&(t.release=n.release),n.environment&&(t.environment=n.environment),!t.ipAddress&&n.ipAddress&&(t.ipAddress=n.ipAddress),!t.userAgent&&n.userAgent&&(t.userAgent=n.userAgent),"number"==typeof n.errors&&(t.errors=n.errors),n.status&&(t.status=n.status)}function K(t,n,e=2){if(!n||"object"!=typeof n||e<=0)return n;if(t&&0===Object.keys(n).length)return t;const r={...t};for(const t in n)Object.prototype.hasOwnProperty.call(n,t)&&(r[t]=K(r[t],n[t],e-1));return r}function Z(){return F()}function q(){return F().substring(16)}const Q="_sentrySpan";function X(t,n){n?function(t,n,e){try{Object.defineProperty(t,n,{value:e,writable:!0,configurable:!0})}catch{h&&S.log(`Failed to add non-enumerable property "${n}" to object`,t)}}(t,Q,n):delete t[Q]}function tt(t){return t[Q]}class nt{constructor(){this.t=!1,this.o=[],this.i=[],this.u=[],this.h=[],this.p={},this.l={},this.m={},this.v={},this._={},this.S={},this.N={traceId:Z(),sampleRand:B()}}clone(){const t=new nt;return t.u=[...this.u],t.l={...this.l},t.m={...this.m},t.v={...this.v},t._={...this._},this._.flags&&(t._.flags={values:[...this._.flags.values]}),t.p=this.p,t.j=this.j,t.C=this.C,t.A=this.A,t.T=this.T,t.i=[...this.i],t.h=[...this.h],t.S={...this.S},t.N={...this.N},t.k=this.k,t.I=this.I,t.O=this.O,X(t,tt(this)),t}setClient(t){this.k=t}setLastEventId(t){this.I=t}getClient(){return this.k}lastEventId(){return this.I}addScopeListener(t){this.o.push(t)}addEventProcessor(t){return this.i.push(t),this}setUser(t){return this.p=t||{email:void 0,id:void 0,ip_address:void 0,username:void 0},this.C&&V(this.C,{user:t}),this.R(),this}getUser(){return this.p}setConversationId(t){return this.O=t||void 0,this.R(),this}setTags(t){return this.l={...this.l,...t},this.R(),this}setTag(t,n){return this.setTags({[t]:n})}setAttributes(t){return this.m={...this.m,...t},this.R(),this}setAttribute(t,n){return this.setAttributes({[t]:n})}removeAttribute(t){return t in this.m&&(delete this.m[t],this.R()),this}setExtras(t){return this.v={...this.v,...t},this.R(),this}setExtra(t,n){return this.v={...this.v,[t]:n},this.R(),this}setFingerprint(t){return this.T=t,this.R(),this}setLevel(t){return this.j=t,this.R(),this}setTransactionName(t){return this.A=t,this.R(),this}setContext(t,n){return null===n?delete this._[t]:this._[t]=n,this.R(),this}setSession(t){return t?this.C=t:delete this.C,this.R(),this}getSession(){return this.C}update(t){if(!t)return this;const n="function"==typeof t?t(this):t,e=n instanceof nt?n.getScopeData():A(n)?t:void 0,{tags:r,attributes:o,extra:i,user:s,contexts:c,level:u,fingerprint:a=[],propagationContext:f,conversationId:h}=e||{};return this.l={...this.l,...r},this.m={...this.m,...o},this.v={...this.v,...i},this._={...this._,...c},s&&Object.keys(s).length&&(this.p=s),u&&(this.j=u),a.length&&(this.T=a),f&&(this.N=f),h&&(this.O=h),this}clear(){return this.u=[],this.l={},this.m={},this.v={},this.p={},this._={},this.j=void 0,this.A=void 0,this.T=void 0,this.C=void 0,this.O=void 0,X(this,void 0),this.h=[],this.setPropagationContext({traceId:Z(),sampleRand:B()}),this.R(),this}addBreadcrumb(t,n){const e="number"==typeof n?n:100;if(e<=0)return this;const r={timestamp:G(),...t,message:t.message?z(t.message,2048):t.message};return this.u.push(r),this.u.length>e&&(this.u=this.u.slice(-e),this.k?.recordDroppedEvent("buffer_overflow","log_item")),this.R(),this}getLastBreadcrumb(){return this.u[this.u.length-1]}clearBreadcrumbs(){return this.u=[],this.R(),this}addAttachment(t){return this.h.push(t),this}clearAttachments(){return this.h=[],this}getScopeData(){return{breadcrumbs:this.u,attachments:this.h,contexts:this._,tags:this.l,attributes:this.m,extra:this.v,user:this.p,level:this.j,fingerprint:this.T||[],eventProcessors:this.i,propagationContext:this.N,sdkProcessingMetadata:this.S,transactionName:this.A,span:tt(this),conversationId:this.O}}setSDKProcessingMetadata(t){return this.S=K(this.S,t,2),this}setPropagationContext(t){return this.N=t,this}getPropagationContext(){return this.N}captureException(t,n){const e=n?.event_id||F();if(!this.k)return h&&S.warn("No client configured on scope - will not capture exception!"),e;const r=new Error("Sentry syntheticException");return this.k.captureException(t,{originalException:t,syntheticException:r,...n,event_id:e},this),e}captureMessage(t,n,e){const r=e?.event_id||F();if(!this.k)return h&&S.warn("No client configured on scope - will not capture message!"),r;const o=e?.syntheticException??new Error(t);return this.k.captureMessage(t,n,{originalException:t,syntheticException:o,...e,event_id:r},this),r}captureEvent(t,n){const e=t.event_id||n?.event_id||F();return this.k?(this.k.captureEvent(t,{...n,event_id:e},this),e):(h&&S.warn("No client configured on scope - will not capture event!"),e)}R(){this.t||(this.t=!0,this.o.forEach(t=>{t(this)}),this.t=!1)}}const et=t=>t instanceof Promise&&!t[rt],rt=Symbol("chained PromiseLike"),ot=(t,n)=>{let e=!1;for(const r in t){if(r in n)continue;e=!0;const o=t[r];"function"==typeof o?Object.defineProperty(n,r,{value:(...n)=>o.apply(t,n),enumerable:!0,configurable:!0,writable:!0}):n[r]=o}return e&&Object.assign(n,{[rt]:!0}),n};class it{constructor(t,n){let e,r;e=t||new nt,r=n||new nt,this.P=[{scope:e}],this.D=r}withScope(t){const n=this.U();let e;try{e=t(n)}catch(t){throw this.L(),t}return T(e)?((t,n,e)=>{const r=t.then(t=>(n(t),t),t=>{throw e(t),t});return et(r)&&et(t)?r:ot(t,r)})(e,()=>this.L(),()=>this.L()):(this.L(),e)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this.D}getStackTop(){return this.P[this.P.length-1]}U(){const t=this.getScope().clone();return this.P.push({client:this.getClient(),scope:t}),t}L(){return!(this.P.length<=1)&&!!this.P.pop()}}function st(){const t=m(l());return t.stack=t.stack||new it(g("defaultCurrentScope",()=>new nt),g("defaultIsolationScope",()=>new nt))}function ct(t){return st().withScope(t)}function ut(t,n){const e=st();return e.withScope(()=>(e.getStackTop().scope=t,n(t)))}function at(t){return st().withScope(()=>t(st().getIsolationScope()))}function ft(t){const n=m(t);return n.acs?n.acs:{withIsolationScope:at,withScope:ct,withSetScope:ut,withSetIsolationScope:(t,n)=>at(n),getCurrentScope:()=>st().getScope(),getIsolationScope:()=>st().getIsolationScope()}}function ht(){return ft(l()).getCurrentScope().getClient()}function pt(t){if(t){if("object"==typeof t&&"deref"in t&&"function"==typeof t.deref)try{return t.deref()}catch{return}return t}}function dt(t){const n=t;return{scope:n._sentryScope,isolationScope:pt(n._sentryIsolationScope)}}const lt="sentry-";function mt(t){const n=function(t){if(!t||!C(t)&&!Array.isArray(t))return;if(Array.isArray(t))return t.reduce((t,n)=>{const e=gt(n);return Object.entries(e).forEach(([n,e])=>{t[n]=e}),t},{});return gt(t)}(t);if(!n)return;const e=Object.entries(n).reduce((t,[n,e])=>{if(n.startsWith(lt)){t[n.slice(7)]=e}return t},{});return Object.keys(e).length>0?e:void 0}function gt(t){return t.split(",").map(t=>{const n=t.indexOf("=");if(-1===n)return[];return[t.slice(0,n),t.slice(n+1)].map(t=>{try{return decodeURIComponent(t.trim())}catch{return}})}).reduce((t,[n,e])=>(n&&e&&(t[n]=e),t),{})}const yt=/^o(\d+)\./;function bt(t,n=!1){const{host:e,path:r,pass:o,port:i,projectId:s,protocol:c,publicKey:u}=t;return`${c}://${u}${n&&o?`:${o}`:""}@${e}${i?`:${i}`:""}/${r?`${r}/`:r}${s}`}function vt(t){const n=t.getOptions(),{host:e}=t.getDsn()||{};let r;return n.orgId?r=String(n.orgId):e&&(r=function(t){const n=t.match(yt);return n?.[1]}(e)),r}function _t(t){const{spanId:n,traceId:e,isRemote:r}=t.spanContext(),o=r?n:Et(t).parent_span_id,i=dt(t).scope;return{parent_span_id:o,span_id:r?i?.getPropagationContext().propagationSpanId||q():n,trace_id:e}}function wt(t){return t&&t.length>0?t.map(({context:{spanId:t,traceId:n,traceFlags:e,...r},attributes:o})=>({span_id:t,trace_id:n,sampled:1===e,attributes:o,...r})):void 0}function St(t){return"number"==typeof t?$t(t):Array.isArray(t)?t[0]+t[1]/1e9:t instanceof Date?$t(t.getTime()):J()}function $t(t){return t>9999999999?t/1e3:t}function Et(t){if(function(t){return"function"==typeof t.getSpanJSON}(t))return t.getSpanJSON();const{spanId:n,traceId:e}=t.spanContext();if(function(t){const n=t;return!!(n.attributes&&n.startTime&&n.name&&n.endTime&&n.status)}(t)){const{attributes:r,startTime:o,name:i,endTime:s,status:c,links:u}=t;return{span_id:n,trace_id:e,data:r,description:i,parent_span_id:xt(t),start_timestamp:St(o),timestamp:St(s)||void 0,status:Nt(c),op:r["sentry.op"],origin:r["sentry.origin"],links:wt(u)}}return{span_id:n,trace_id:e,start_timestamp:0,data:{}}}function xt(t){return"parentSpanId"in t?t.parentSpanId:"parentSpanContext"in t?t.parentSpanContext?.spanId:void 0}function Nt(t){if(t&&0!==t.code)return 1===t.code?"ok":t.message||"internal_error"}const jt=function(t){return t._sentryRootSpan||t};function Ct(t){const n=ht();if(!n)return{};const e=jt(t),r=Et(e),o=r.data,i=e.spanContext().traceState,s=i?.get("sentry.sample_rate")??o["sentry.sample_rate"]??o["sentry.previous_trace_sample_rate"];function c(t){return"number"!=typeof s&&"string"!=typeof s||(t.sample_rate=`${s}`),t}const u=e._frozenDsc;if(u)return c(u);const a=i?.get("sentry.dsc"),f=a&&mt(a);if(f)return c(f);const h=function(t,n){const e=n.getOptions(),{publicKey:r}=n.getDsn()||{},o={environment:e.environment||"production",release:e.release,public_key:r,trace_id:t,org_id:vt(n)};return n.emit("createDsc",o),o}(t.spanContext().traceId,n),p=o["sentry.source"]??o["sentry.span.source"],d=r.description;return"url"!==p&&d&&(h.transaction=d),function(){if("boolean"==typeof __SENTRY_TRACING__&&!__SENTRY_TRACING__)return!1;const t=ht()?.getOptions();return!(!t||null==t.tracesSampleRate&&!t.tracesSampler)}()&&(h.sampled=String(function(t){const{traceFlags:n}=t.spanContext();return 1===n}(e)),h.sample_rand=i?.get("sentry.sample_rand")??dt(e).scope?.getPropagationContext().sampleRand.toString()),c(h),n.emit("createDsc",h,e),h}function At(t,n=100,e=1/0){try{return Tt("",t,n,e)}catch(t){return{ERROR:`**non-serializable** (${t})`}}}function Tt(t,n,e=1/0,r=1/0,o=function(){const t=new WeakSet;function n(n){return!!t.has(n)||(t.add(n),!1)}function e(n){t.delete(n)}return[n,e]}()){const[i,s]=o;if(null==n||["boolean","string"].includes(typeof n)||"number"==typeof n&&Number.isFinite(n))return n;const c=function(t,n){try{if("domain"===t&&n&&"object"==typeof n&&n.M)return"[Domain]";if("domainEmitter"===t)return"[DomainEmitter]";if("undefined"!=typeof global&&n===global)return"[Global]";if("undefined"!=typeof window&&n===window)return"[Window]";if("undefined"!=typeof document&&n===document)return"[Document]";if("object"==typeof(e=n)&&null!==e&&(e.__isVue||e.B||e.__v_isVNode))return function(t){return"__v_isVNode"in t&&t.__v_isVNode?"[VueVNode]":"[VueViewModel]"}(n);if(function(t){return A(t)&&"nativeEvent"in t&&"preventDefault"in t&&"stopPropagation"in t}(n))return"[SyntheticEvent]";if("number"==typeof n&&!Number.isFinite(n))return`[${n}]`;if("function"==typeof n)return`[Function: ${function(t){try{return t&&"function"==typeof t&&t.name||x}catch{return x}}(n)}]`;if("symbol"==typeof n)return`[${String(n)}]`;if("bigint"==typeof n)return`[BigInt: ${String(n)}]`;const r=function(t){const n=Object.getPrototypeOf(t);return n?.constructor?n.constructor.name:"null prototype"}(n);return/^HTML(\w*)Element$/.test(r)?`[HTMLElement: ${r}]`:`[object ${r}]`}catch(t){return`**non-serializable** (${t})`}var e}(t,n);if(!c.startsWith("[object "))return c;if(n.__sentry_skip_normalization__)return n;const u="number"==typeof n.__sentry_override_normalization_depth__?n.__sentry_override_normalization_depth__:e;if(0===u)return c.replace("object ","");if(i(n))return"[Circular ~]";const a=n;if(a&&"function"==typeof a.toJSON)try{return Tt("",a.toJSON(),u-1,r,o)}catch{}const f=Array.isArray(n)?[]:{};let h=0;const p=R(n);for(const t in p){if(!Object.prototype.hasOwnProperty.call(p,t))continue;if(h>=r){f[t]="[MaxProperties ~]";break}const n=p[t];f[t]=Tt(t,n,u-1,r,o),h++}return s(n),f}function kt(t,n){const e=n.replace(/\\/g,"/").replace(/[|\\{}()[\]^$+*?.]/g,"\\$&");let r=t;try{r=decodeURI(t)}catch{}return r.replace(/\\/g,"/").replace(/webpack:\/?/g,"").replace(new RegExp(`(file://)?/*${e}/*`,"ig"),"app:///")}function It(t,n=[]){return[t,n]}function Ot(t,n){const e=t[1];for(const t of e){if(n(t,t[0].type))return!0}return!1}function Rt(t){const n=m(p);return n.encodePolyfill?n.encodePolyfill(t):(new TextEncoder).encode(t)}function Pt(t){const[n,e]=t;let r=JSON.stringify(n);function o(t){"string"==typeof r?r="string"==typeof t?r+t:[Rt(r),t]:r.push("string"==typeof t?Rt(t):t)}for(const t of e){const[n,e]=t;if(o(`\n${JSON.stringify(n)}\n`),"string"==typeof e||e instanceof Uint8Array)o(e);else{let t;try{t=JSON.stringify(e)}catch{t=JSON.stringify(At(e))}o(t)}}return"string"==typeof r?r:function(t){const n=t.reduce((t,n)=>t+n.length,0),e=new Uint8Array(n);let r=0;for(const n of t)e.set(n,r),r+=n.length;return e}(r)}const Dt={sessions:"session",event:"error",client_report:"internal",user_report:"default",profile_chunk:"profile",replay_event:"replay",replay_recording:"replay",check_in:"monitor",raw_security:"security",log:"log_item",trace_metric:"metric"};function Ut(t){return function(t){return t in Dt}(t)?Dt[t]:t}function Lt(t){if(!t?.sdk)return;const{name:n,version:e}=t.sdk;return{name:n,version:e}}function Mt(t,n,e,r){const o=Lt(e),i=t.type&&"replay_event"!==t.type?t.type:"event";!function(t,n){if(!n)return t;const e=t.sdk||{};t.sdk={...e,name:e.name||n.name,version:e.version||n.version,integrations:[...t.sdk?.integrations||[],...n.integrations||[]],packages:[...t.sdk?.packages||[],...n.packages||[]],settings:t.sdk?.settings||n.settings?{...t.sdk?.settings,...n.settings}:void 0}}(t,e?.sdk);const s=function(t,n,e,r){const o=t.sdkProcessingMetadata?.dynamicSamplingContext;return{event_id:t.event_id,sent_at:(new Date).toISOString(),...n&&{sdk:n},...!!e&&r&&{dsn:bt(r)},...o&&{trace:o}}}(t,o,r,n);delete t.sdkProcessingMetadata;return It(s,[[{type:i},t]])}const Bt="__SENTRY_SUPPRESS_TRACING__";function Wt(t){const n=ft(l());return n.suppressTracing?n.suppressTracing(t):function(...t){const n=ft(l());if(2===t.length){const[e,r]=t;return e?n.withSetScope(e,r):n.withScope(r)}return n.withScope(t[0])}(n=>{n.setSDKProcessingMetadata({[Bt]:!0});const e=t();return n.setSDKProcessingMetadata({[Bt]:void 0}),e})}function zt(t,n){const{fingerprint:e,span:r,breadcrumbs:o,sdkProcessingMetadata:i}=n;!function(t,n){const{extra:e,tags:r,user:o,contexts:i,level:s,transactionName:c}=n;Object.keys(e).length&&(t.extra={...e,...t.extra});Object.keys(r).length&&(t.tags={...r,...t.tags});Object.keys(o).length&&(t.user={...o,...t.user});Object.keys(i).length&&(t.contexts={...i,...t.contexts});s&&(t.level=s);c&&"transaction"!==t.type&&(t.transaction=c)}(t,n),r&&function(t,n){t.contexts={trace:_t(n),...t.contexts},t.sdkProcessingMetadata={dynamicSamplingContext:Ct(n),...t.sdkProcessingMetadata};const e=jt(n),r=Et(e).description;r&&!t.transaction&&"transaction"===t.type&&(t.transaction=r)}(t,r),function(t,n){t.fingerprint=t.fingerprint?Array.isArray(t.fingerprint)?t.fingerprint:[t.fingerprint]:[],n&&(t.fingerprint=t.fingerprint.concat(n));t.fingerprint.length||delete t.fingerprint}(t,e),function(t,n){const e=[...t.breadcrumbs||[],...n];t.breadcrumbs=e.length?e:void 0}(t,o),function(t,n){t.sdkProcessingMetadata={...t.sdkProcessingMetadata,...n}}(t,i)}class Ft{constructor(t){this.W=0,this.F=[],this.G(t)}then(t,n){return new Ft((e,r)=>{this.F.push([!1,n=>{if(t)try{e(t(n))}catch(t){r(t)}else e(n)},t=>{if(n)try{e(n(t))}catch(t){r(t)}else r(t)}]),this.H()})}catch(t){return this.then(t=>t,t)}finally(t){return new Ft((n,e)=>{let r,o;return this.then(n=>{o=!1,r=n,t&&t()},n=>{o=!0,r=n,t&&t()}).then(()=>{o?e(r):n(r)})})}H(){if(0===this.W)return;const t=this.F.slice();this.F=[],t.forEach(t=>{t[0]||(1===this.W&&t[1](this.J),2===this.W&&t[2](this.J),t[0]=!0)})}G(t){const n=(t,n)=>{0===this.W&&(T(n)?n.then(e,r):(this.W=t,this.J=n,this.H()))},e=t=>{n(1,t)},r=t=>{n(2,t)};try{t(e,r)}catch(t){r(t)}}}const Gt=Symbol.for("SentryBufferFullError");function Ht(t=100){const n=new Set;function e(t){n.delete(t)}return{get $(){return Array.from(n)},add:function(r){if(!(n.size<t))return o=Gt,new Ft((t,n)=>{n(o)});var o;const i=r();return n.add(i),i.then(()=>e(i),()=>e(i)),i},drain:function(t){if(!n.size)return e=!0,new Ft(t=>{t(e)});var e;const r=Promise.allSettled(Array.from(n)).then(()=>!0);if(!t)return r;const o=[r,new Promise(n=>{return"object"==typeof(e=setTimeout(()=>n(!1),t))&&"function"==typeof e.unref&&e.unref(),e;var e})];return Promise.race(o)}}}function Jt(t,{statusCode:n,headers:e},r=W()){const o={...t},i=e?.["x-sentry-rate-limits"],s=e?.["retry-after"];if(i)for(const t of i.trim().split(",")){const[n,e,,,i]=t.split(":",5),s=parseInt(n,10),c=1e3*(isNaN(s)?60:s);if(e)for(const t of e.split(";"))"metric_bucket"===t&&i&&!i.split(";").includes("custom")||(o[t]=r+c);else o.all=r+c}else s?o.all=r+function(t,n=W()){const e=parseInt(`${t}`,10);if(!isNaN(e))return 1e3*e;const r=Date.parse(`${t}`);return isNaN(r)?6e4:r-n}(s,r):429===n&&(o.all=r+6e4);return o}function Yt(t,n,e=Ht(t.bufferSize||64)){let r={};return{send:function(t){const o=[];if(Ot(t,(t,n)=>{const e=Ut(n);(function(t,n,e=W()){return function(t,n){return t[n]||t.all||0}(t,n)>e})(r,e)||o.push(t)}),0===o.length)return Promise.resolve({});const i=It(t[0],o),s=t=>{!function(t,n){return Ot(t,(t,e)=>n.includes(e))}(i,["client_report"])?Ot(i,(t,n)=>{}):h&&S.warn(`Dropping client report. Will not send outcomes (reason: ${t}).`)};return e.add(()=>n({body:Pt(i)}).then(t=>413===t.statusCode?(h&&S.error("Sentry responded with status code 413. Envelope was discarded due to exceeding size limits."),s("send_error"),t):(h&&void 0!==t.statusCode&&(t.statusCode<200||t.statusCode>=300)&&S.warn(`Sentry responded with status code ${t.statusCode} to sent event.`),r=Jt(r,t),t),t=>{throw s("network_error"),h&&S.error("Encountered error running transport request:",t),t})).then(t=>t,t=>{if(t===Gt)return h&&S.error("Skipped sending event because buffer is full."),s("queue_overflow"),Promise.resolve({});throw t})},flush:t=>e.drain(t)}}const Vt=/^(\S+:\\|\/?)([\s\S]*?)((?:\.{1,2}|[^/\\]+?|)(\.[^./\\]*|))(?:[/\\]*)$/;function Kt(t){const n=function(t){const n=t.length>1024?`<truncated>${t.slice(-1024)}`:t,e=Vt.exec(n);return e?e.slice(1):[]}(t),e=n[0]||"";let r=n[1];return e||r?(r&&(r=r.slice(0,r.length-1)),e+r):"."}function Zt(t,n=!1){return!(n||t&&!t.startsWith("/")&&!t.match(/^[A-Z]:/)&&!t.startsWith(".")&&!t.match(/^[a-zA-Z]([a-zA-Z0-9.\-+])*:\/\//))&&void 0!==t&&!t.includes("node_modules/")}const qt=Symbol("AgentBaseInternalState");class Qt extends i.Agent{constructor(t){super(t),this[qt]={}}isSecureEndpoint(t){if(t){if("boolean"==typeof t.secureEndpoint)return t.secureEndpoint;if("string"==typeof t.protocol)return"https:"===t.protocol}const{stack:n}=new Error;return"string"==typeof n&&n.split("\n").some(t=>-1!==t.indexOf("(https.js:")||-1!==t.indexOf("node:https:"))}createSocket(t,n,e){const r={...n,secureEndpoint:this.isSecureEndpoint(n)};Promise.resolve().then(()=>this.connect(t,r)).then(o=>{if(o instanceof i.Agent)return o.addRequest(t,r);this[qt].currentSocket=o,super.createSocket(t,n,e)},e)}createConnection(){const t=this[qt].currentSocket;if(this[qt].currentSocket=void 0,!t)throw new Error("No socket was returned in the `connect()` function");return t}get defaultPort(){return this[qt].defaultPort??("https:"===this.protocol?443:80)}set defaultPort(t){this[qt]&&(this[qt].defaultPort=t)}get protocol(){return this[qt].protocol??(this.isSecureEndpoint()?"https:":"http:")}set protocol(t){this[qt]&&(this[qt].protocol=t)}}function Xt(...t){S.log("[https-proxy-agent:parse-proxy-response]",...t)}function tn(t){return new Promise((n,e)=>{let r=0;const o=[];function i(){const c=t.read();c?function(c){o.push(c),r+=c.length;const u=Buffer.concat(o,r),a=u.indexOf("\r\n\r\n");if(-1===a)return Xt("have not received end of HTTP headers yet..."),void i();const f=u.subarray(0,a).toString("ascii").split("\r\n"),h=f.shift();if(!h)return t.destroy(),e(new Error("No header received from proxy CONNECT response"));const p=h.split(" "),d=+(p[1]||0),l=p.slice(2).join(" "),m={};for(const n of f){if(!n)continue;const r=n.indexOf(":");if(-1===r)return t.destroy(),e(new Error(`Invalid header from proxy CONNECT response: "${n}"`));const o=n.slice(0,r).toLowerCase(),i=n.slice(r+1).trimStart(),s=m[o];"string"==typeof s?m[o]=[s,i]:Array.isArray(s)?s.push(i):m[o]=i}Xt("got proxy server response: %o %o",h,m),s(),n({connect:{statusCode:d,statusText:l,headers:m},buffered:u})}(c):t.once("readable",i)}function s(){t.removeListener("end",c),t.removeListener("error",u),t.removeListener("readable",i)}function c(){s(),Xt("onend"),e(new Error("Proxy connection ended before receiving CONNECT response"))}function u(t){s(),Xt("onerror %o",t),e(t)}t.on("error",u),t.on("end",c),i()})}function nn(...t){S.log("[https-proxy-agent]",...t)}class en extends Qt{static __initStatic(){this.protocols=["http","https"]}constructor(t,n){super(n),this.options={},this.proxy="string"==typeof t?new URL(t):t,this.proxyHeaders=n?.headers??{},nn("Creating new HttpsProxyAgent instance: %o",this.proxy.href);const e=(this.proxy.hostname||this.proxy.host).replace(/^\[|\]$/g,""),r=this.proxy.port?parseInt(this.proxy.port,10):"https:"===this.proxy.protocol?443:80;this.connectOpts={ALPNProtocols:["http/1.1"],...n?on(n,"headers"):null,host:e,port:r}}async connect(t,n){const{proxy:e}=this;if(!n.host)throw new TypeError('No "host" provided');let r;if("https:"===e.protocol){nn("Creating `tls.Socket`: %o",this.connectOpts);const t=this.connectOpts.servername||this.connectOpts.host;r=f.connect({...this.connectOpts,servername:t&&a.isIP(t)?void 0:t})}else nn("Creating `net.Socket`: %o",this.connectOpts),r=a.connect(this.connectOpts);const o="function"==typeof this.proxyHeaders?this.proxyHeaders():{...this.proxyHeaders},i=a.isIPv6(n.host)?`[${n.host}]`:n.host;let s=`CONNECT ${i}:${n.port} HTTP/1.1\r\n`;if(e.username||e.password){const t=`${decodeURIComponent(e.username)}:${decodeURIComponent(e.password)}`;o["Proxy-Authorization"]=`Basic ${Buffer.from(t).toString("base64")}`}o.Host=`${i}:${n.port}`,o["Proxy-Connection"]||(o["Proxy-Connection"]=this.keepAlive?"Keep-Alive":"close");for(const t of Object.keys(o))s+=`${t}: ${o[t]}\r\n`;const c=tn(r);r.write(`${s}\r\n`);const{connect:u,buffered:h}=await c;if(t.emit("proxyConnect",u),this.emit("proxyConnect",u,t),200===u.statusCode){if(t.once("socket",rn),n.secureEndpoint){nn("Upgrading socket connection to TLS");const t=n.servername||n.host;return f.connect({...on(n,"host","path","port"),socket:r,servername:a.isIP(t)?void 0:t})}return r}r.destroy();const p=new a.Socket({writable:!1});return p.readable=!0,t.once("socket",t=>{nn("Replaying proxy buffer for failed request"),t.push(h),t.push(null)}),p}}function rn(t){t.resume()}function on(t,...n){const e={};let r;for(r in t)n.includes(r)||(e[r]=t[r]);return e}en.__initStatic();function sn(t){return t.replace(/^[A-Z]:/,"").replace(/\\/g,"/")}const cn=n;let un,an=0,fn={};function hn(t){cn.debug&&console.log(`[ANR Worker] ${t}`)}var pn,dn,ln;const mn=function(t){let n;try{n=new URL(t.url)}catch(n){return b(()=>{console.warn("[@sentry/node]: Invalid dsn or tunnel option, will not send any events. The tunnel option must be a full URL when used.")}),Yt(t,()=>Promise.resolve({}))}const e="https:"===n.protocol,r=function(t,n){const{no_proxy:e}=process.env,r=e?.split(",").some(n=>t.host.endsWith(n)||t.hostname.endsWith(n));return r?void 0:n}(n,t.proxy||(e?process.env.https_proxy:void 0)||process.env.http_proxy),o=e?s:i,a=void 0!==t.keepAlive&&t.keepAlive,f=r?new en(r):new o.Agent({keepAlive:a,maxSockets:30,timeout:2e3}),h=function(t,n,e){const{hostname:r,pathname:o,port:i,protocol:s,search:a}=new URL(t.url);return function(f){return new Promise((h,p)=>{Wt(()=>{let d=function(t){return new c({read(){this.push(t),this.push(null)}})}(f.body);const l={...t.headers};f.body.length>32768&&(l["content-encoding"]="gzip",d=d.pipe(u()));const m=r.startsWith("["),g=n.request({method:"POST",agent:e,headers:l,hostname:m?r.slice(1,-1):r,path:`${o}${a}`,port:i,protocol:s,ca:t.caCerts},t=>{t.on("data",()=>{}),t.on("end",()=>{}),t.setEncoding("utf8");const n=t.headers["retry-after"]??null,e=t.headers["x-sentry-rate-limits"]??null;h({statusCode:t.statusCode,headers:{"retry-after":n,"x-sentry-rate-limits":Array.isArray(e)?e[0]||null:e}})});g.on("error",p),d.pipe(g)})})}}(t,t.httpModule??o,f);return Yt(t,h)}({url:(pn=cn.dsn,dn=cn.tunnel,ln=cn.sdkMetadata.sdk,dn||`${function(t){return`${function(t){const n=t.protocol?`${t.protocol}:`:"",e=t.port?`:${t.port}`:"";return`${n}//${t.host}${e}${t.path?`/${t.path}`:""}/api/`}(t)}${t.projectId}/envelope/`}(pn)}?${function(t,n){const e={sentry_version:"7"};return t.publicKey&&(e.sentry_key=t.publicKey),n&&(e.sentry_client=`${n.name}/${n.version}`),new URLSearchParams(e).toString()}(pn,ln)}`)});async function gn(){if(un){hn("Sending abnormal session"),V(un,{status:"abnormal",abnormal_mechanism:"anr_foreground",release:cn.release,environment:cn.environment});const t=function(t,n,e,r){const o=Lt(e);return It({sent_at:(new Date).toISOString(),...o&&{sdk:o},...!!r&&n&&{dsn:bt(n)}},["aggregates"in t?[{type:"sessions"},t]:[{type:"session"},t.toJSON()]])}(un,cn.dsn,cn.sdkMetadata,cn.tunnel);hn(JSON.stringify(t)),await mn.send(t);try{e?.postMessage("session-ended")}catch{}}}function yn(t){if(!t)return;const n=function(t){if(!t.length)return[];const n=Array.from(t);return/sentryWrapped/.test(E(n).function||"")&&n.pop(),n.reverse(),$.test(E(n).function||"")&&(n.pop(),$.test(E(n).function||"")&&n.pop()),n.slice(0,50).map(t=>({...t,filename:t.filename||E(n).filename,function:t.function||"?"}))}(t);if(cn.appRootPath)for(const t of n)t.filename&&(t.filename=kt(t.filename,cn.appRootPath));return n}async function bn(t,n){if(an>=cn.maxAnrEvents)return;an+=1,await gn(),hn("Sending event");const e={event_id:F(),contexts:cn.contexts,release:cn.release,environment:cn.environment,dist:cn.dist,platform:"node",level:"error",exception:{values:[{type:"ApplicationNotResponding",value:`Application Not Responding for at least ${cn.anrThreshold} ms`,stacktrace:{frames:yn(t)},mechanism:{type:"ANR"}}]},tags:cn.staticTags};n&&function(t,n){if(zt(t,n),!t.contexts?.trace){const{traceId:e,parentSpanId:r,propagationSpanId:o}=n.propagationContext;t.contexts={trace:{trace_id:e,span_id:o||q(),parent_span_id:r},...t.contexts}}}(e,n),function(t){if(0===Object.keys(fn).length)return;const n=cn.appRootPath?{}:fn;if(cn.appRootPath)for(const[t,e]of Object.entries(fn))n[kt(t,cn.appRootPath)]=e;const e=new Map;for(const r of t.exception?.values||[])for(const t of r.stacktrace?.frames||[]){const r=t.abs_path||t.filename;r&&n[r]&&e.set(r,n[r])}if(e.size>0){const n=[];for(const[t,r]of e.entries())n.push({type:"sourcemap",code_file:t,debug_id:r});t.debug_meta={images:n}}}(e);const r=Mt(e,cn.dsn,cn.sdkMetadata,cn.tunnel);hn(JSON.stringify(r)),await mn.send(r),await mn.flush(2e3),an>=cn.maxAnrEvents&&setTimeout(()=>{process.exit(0)},5e3)}let vn;if(hn("Started"),cn.captureStackTrace){hn("Connecting to debugger");const n=new t;n.connectToMainThread(),hn("Connected to debugger");const e=new Map;n.on("Debugger.scriptParsed",t=>{e.set(t.params.scriptId,t.params.url)}),n.on("Debugger.paused",t=>{if("other"===t.params.reason)try{hn("Debugger paused");const i=[...t.params.callFrames],s=cn.appRootPath?function(t=(process.argv[1]?Kt(process.argv[1]):process.cwd()),n="\\"===o){const e=n?sn(t):t;return t=>{if(!t)return;const o=n?sn(t):t;let{dir:i,base:s,ext:c}=r.parse(o);".js"!==c&&".mjs"!==c&&".cjs"!==c||(s=s.slice(0,-1*c.length));const u=decodeURIComponent(s);i||(i=".");const a=i.lastIndexOf("/node_modules");if(a>-1)return`${i.slice(a+14).replace(/\//g,".")}:${u}`;if(i.startsWith(e)){const t=i.slice(e.length+1).replace(/\//g,".");return t?`${t}:${u}`:u}return u}}(cn.appRootPath):()=>{},c=i.map(t=>function(t,n,e){const r=n?n.replace(/^file:\/\//,""):void 0,o=t.location.columnNumber?t.location.columnNumber+1:void 0,i=t.location.lineNumber?t.location.lineNumber+1:void 0;return{filename:r,module:e(r),function:t.functionName||"?",colno:o,lineno:i,in_app:r?Zt(r):void 0}}(t,e.get(t.location.scriptId),s)),u=setTimeout(()=>{bn(c).then(null,()=>{hn("Sending ANR event failed.")})},5e3);n.post("Runtime.evaluate",{expression:"global.__SENTRY_GET_SCOPES__();",silent:!0,returnByValue:!0},(t,e)=>{t&&hn(`Error executing script: '${t.message}'`),clearTimeout(u);const r=e?.result?e.result.value:void 0;n.post("Debugger.resume"),n.post("Debugger.disable"),bn(c,r).then(null,()=>{hn("Sending ANR event failed.")})})}catch(t){throw n.post("Debugger.resume"),n.post("Debugger.disable"),t}}),vn=()=>{try{n.post("Debugger.enable",()=>{n.post("Debugger.pause")})}catch{}}}const{poll:_n}=function(t,n,e,r){const o=t();let i=!1,s=!0;return setInterval(()=>{const t=o.getTimeMs();!1===i&&t>n+e&&(i=!0,s&&r()),t<n+e&&(i=!1)},20),{poll:()=>{o.reset()},enabled:t=>{s=t}}}(function(){let t=process.hrtime();return{getTimeMs:()=>{const[n,e]=process.hrtime(t);return Math.floor(1e3*n+e/1e6)},reset:()=>{t=process.hrtime()}}},cn.pollInterval,cn.anrThreshold,function(){hn("Watchdog timeout"),vn?(hn("Pausing debugger to capture stack trace"),vn()):(hn("Capturing event without a stack trace"),bn().then(null,()=>{hn("Sending ANR event failed on watchdog timeout.")}))});e?.on("message",t=>{t.session&&(un=Y(t.session)),t.debugImages&&(fn=t.debugImages),_n()});
/*! @sentry/node-core 10.50.0 (785e756) | https://github.com/getsentry/sentry-javascript */
import{Session as t}from"node:inspector";import{workerData as n,parentPort as e}from"node:worker_threads";import{posix as r,sep as o}from"node:path";import*as i from"node:http";import*as s from"node:https";import{Readable as c}from"node:stream";import{createGzip as u}from"node:zlib";import*as a from"node:net";import*as f from"node:tls";const h="undefined"==typeof __SENTRY_DEBUG__||__SENTRY_DEBUG__,p=globalThis,d="10.50.0";function l(){return m(p),p}function m(t){const n=t.__SENTRY__=t.__SENTRY__||{};return n.version=n.version||d,n[d]=n[d]||{}}function g(t,n,e=p){const r=e.__SENTRY__=e.__SENTRY__||{},o=r[d]=r[d]||{};return o[t]||(o[t]=n())}const y={};function b(t){if(!("console"in p))return t();const n=p.console,e={},r=Object.keys(y);r.forEach(t=>{const r=y[t];e[t]=n[t],n[t]=r});try{return t()}finally{r.forEach(t=>{n[t]=e[t]})}}function v(){return w().enabled}function _(t,...n){h&&v()&&b(()=>{p.console[t](`Sentry Logger [${t}]:`,...n)})}function w(){return h?g("loggerSettings",()=>({enabled:!1})):{enabled:!1}}const S={enable:function(){w().enabled=!0},disable:function(){w().enabled=!1},isEnabled:v,log:function(...t){_("log",...t)},warn:function(...t){_("warn",...t)},error:function(...t){_("error",...t)}},$=/captureMessage|captureException/;function E(t){return t[t.length-1]||{}}const x="<anonymous>";const N=Object.prototype.toString;function j(t,n){return N.call(t)===`[object ${n}]`}function C(t){return j(t,"String")}function A(t){return j(t,"Object")}function T(t){return Boolean(t?.then&&"function"==typeof t.then)}function k(t,n){try{return t instanceof n}catch{return!1}}const I=p;function O(t,n){const e=t,r=[];if(!e?.tagName)return"";if(I.HTMLElement&&e instanceof HTMLElement&&e.dataset){if(e.dataset.sentryComponent)return e.dataset.sentryComponent;if(e.dataset.sentryElement)return e.dataset.sentryElement}r.push(e.tagName.toLowerCase());const o=n?.length?n.filter(t=>e.getAttribute(t)).map(t=>[t,e.getAttribute(t)]):null;if(o?.length)o.forEach(t=>{r.push(`[${t[0]}="${t[1]}"]`)});else{e.id&&r.push(`#${e.id}`);const t=e.className;if(t&&C(t)){const n=t.split(/\s+/);for(const t of n)r.push(`.${t}`)}}for(const t of["aria-label","type","name","title","alt"]){const n=e.getAttribute(t);n&&r.push(`[${t}="${n}"]`)}return r.join("")}function R(t){if(function(t){switch(N.call(t)){case"[object Error]":case"[object Exception]":case"[object DOMException]":case"[object WebAssembly.Exception]":return!0;default:return k(t,Error)}}(t))return{message:t.message,name:t.name,stack:t.stack,...D(t)};if(n=t,"undefined"!=typeof Event&&k(n,Event)){const n={type:t.type,target:P(t.target),currentTarget:P(t.currentTarget),...D(t)};return"undefined"!=typeof CustomEvent&&k(t,CustomEvent)&&(n.detail=t.detail),n}return t;var n}function P(t){try{return n=t,"undefined"!=typeof Element&&k(n,Element)?function(t,n={}){if(!t)return"<unknown>";try{let e=t;const r=5,o=[];let i=0,s=0;const c=" > ",u=c.length;let a;const f=Array.isArray(n)?n:n.keyAttrs,h=!Array.isArray(n)&&n.maxStringLength||80;for(;e&&i++<r&&(a=O(e,f),!("html"===a||i>1&&s+o.length*u+a.length>=h));)o.push(a),s+=a.length,e=e.parentNode;return o.reverse().join(c)}catch{return"<unknown>"}}(t):Object.prototype.toString.call(t)}catch{return"<unknown>"}var n}function D(t){return"object"==typeof t&&null!==t?Object.fromEntries(Object.entries(t)):{}}let U,L;function M(t){if(void 0!==U)return U?U(t):t();const n=Symbol.for("__SENTRY_SAFE_RANDOM_ID_WRAPPER__"),e=p;return n in e&&"function"==typeof e[n]?(U=e[n],U(t)):(U=null,t())}function B(){return M(()=>Math.random())}function W(){return M(()=>Date.now())}function z(t,n=0){return"string"!=typeof t||0===n||t.length<=n?t:`${t.slice(0,n)}...`}function F(t=function(){const t=p;return t.crypto||t.msCrypto}()){try{if(t?.randomUUID)return M(()=>t.randomUUID()).replace(/-/g,"")}catch{}return L||(L=[1e7]+1e3+4e3+8e3+1e11),L.replace(/[018]/g,t=>(t^(16*B()&15)>>t/4).toString(16))}function G(){return W()/1e3}let H;function J(){return(H??(H=function(){const{performance:t}=p;if(!t?.now||!t.timeOrigin)return G;const n=t.timeOrigin;return()=>(n+M(()=>t.now()))/1e3}()))()}function Y(t){const n=J(),e={sid:F(),init:!0,timestamp:n,started:n,duration:0,status:"ok",errors:0,ignoreDuration:!1,toJSON:()=>function(t){return{sid:`${t.sid}`,init:t.init,started:new Date(1e3*t.started).toISOString(),timestamp:new Date(1e3*t.timestamp).toISOString(),status:t.status,errors:t.errors,did:"number"==typeof t.did||"string"==typeof t.did?`${t.did}`:void 0,duration:t.duration,abnormal_mechanism:t.abnormal_mechanism,attrs:{release:t.release,environment:t.environment,ip_address:t.ipAddress,user_agent:t.userAgent}}}(e)};return t&&V(e,t),e}function V(t,n={}){if(n.user&&(!t.ipAddress&&n.user.ip_address&&(t.ipAddress=n.user.ip_address),t.did||n.did||(t.did=n.user.id||n.user.email||n.user.username)),t.timestamp=n.timestamp||J(),n.abnormal_mechanism&&(t.abnormal_mechanism=n.abnormal_mechanism),n.ignoreDuration&&(t.ignoreDuration=n.ignoreDuration),n.sid&&(t.sid=32===n.sid.length?n.sid:F()),void 0!==n.init&&(t.init=n.init),!t.did&&n.did&&(t.did=`${n.did}`),"number"==typeof n.started&&(t.started=n.started),t.ignoreDuration)t.duration=void 0;else if("number"==typeof n.duration)t.duration=n.duration;else{const n=t.timestamp-t.started;t.duration=n>=0?n:0}n.release&&(t.release=n.release),n.environment&&(t.environment=n.environment),!t.ipAddress&&n.ipAddress&&(t.ipAddress=n.ipAddress),!t.userAgent&&n.userAgent&&(t.userAgent=n.userAgent),"number"==typeof n.errors&&(t.errors=n.errors),n.status&&(t.status=n.status)}function K(t,n,e=2){if(!n||"object"!=typeof n||e<=0)return n;if(t&&0===Object.keys(n).length)return t;const r={...t};for(const t in n)Object.prototype.hasOwnProperty.call(n,t)&&(r[t]=K(r[t],n[t],e-1));return r}function Z(){return F()}function q(){return F().substring(16)}const Q="_sentrySpan";function X(t,n){n?function(t,n,e){try{Object.defineProperty(t,n,{value:e,writable:!0,configurable:!0})}catch{h&&S.log(`Failed to add non-enumerable property "${n}" to object`,t)}}(t,Q,n):delete t[Q]}function tt(t){return t[Q]}class nt{constructor(){this.t=!1,this.o=[],this.i=[],this.u=[],this.h=[],this.p={},this.l={},this.m={},this.v={},this._={},this.S={},this.N={traceId:Z(),sampleRand:B()}}clone(){const t=new nt;return t.u=[...this.u],t.l={...this.l},t.m={...this.m},t.v={...this.v},t._={...this._},this._.flags&&(t._.flags={values:[...this._.flags.values]}),t.p=this.p,t.j=this.j,t.C=this.C,t.A=this.A,t.T=this.T,t.i=[...this.i],t.h=[...this.h],t.S={...this.S},t.N={...this.N},t.k=this.k,t.I=this.I,t.O=this.O,X(t,tt(this)),t}setClient(t){this.k=t}setLastEventId(t){this.I=t}getClient(){return this.k}lastEventId(){return this.I}addScopeListener(t){this.o.push(t)}addEventProcessor(t){return this.i.push(t),this}setUser(t){return this.p=t||{email:void 0,id:void 0,ip_address:void 0,username:void 0},this.C&&V(this.C,{user:t}),this.R(),this}getUser(){return this.p}setConversationId(t){return this.O=t||void 0,this.R(),this}setTags(t){return this.l={...this.l,...t},this.R(),this}setTag(t,n){return this.setTags({[t]:n})}setAttributes(t){return this.m={...this.m,...t},this.R(),this}setAttribute(t,n){return this.setAttributes({[t]:n})}removeAttribute(t){return t in this.m&&(delete this.m[t],this.R()),this}setExtras(t){return this.v={...this.v,...t},this.R(),this}setExtra(t,n){return this.v={...this.v,[t]:n},this.R(),this}setFingerprint(t){return this.T=t,this.R(),this}setLevel(t){return this.j=t,this.R(),this}setTransactionName(t){return this.A=t,this.R(),this}setContext(t,n){return null===n?delete this._[t]:this._[t]=n,this.R(),this}setSession(t){return t?this.C=t:delete this.C,this.R(),this}getSession(){return this.C}update(t){if(!t)return this;const n="function"==typeof t?t(this):t,e=n instanceof nt?n.getScopeData():A(n)?t:void 0,{tags:r,attributes:o,extra:i,user:s,contexts:c,level:u,fingerprint:a=[],propagationContext:f,conversationId:h}=e||{};return this.l={...this.l,...r},this.m={...this.m,...o},this.v={...this.v,...i},this._={...this._,...c},s&&Object.keys(s).length&&(this.p=s),u&&(this.j=u),a.length&&(this.T=a),f&&(this.N=f),h&&(this.O=h),this}clear(){return this.u=[],this.l={},this.m={},this.v={},this.p={},this._={},this.j=void 0,this.A=void 0,this.T=void 0,this.C=void 0,this.O=void 0,X(this,void 0),this.h=[],this.setPropagationContext({traceId:Z(),sampleRand:B()}),this.R(),this}addBreadcrumb(t,n){const e="number"==typeof n?n:100;if(e<=0)return this;const r={timestamp:G(),...t,message:t.message?z(t.message,2048):t.message};return this.u.push(r),this.u.length>e&&(this.u=this.u.slice(-e),this.k?.recordDroppedEvent("buffer_overflow","log_item")),this.R(),this}getLastBreadcrumb(){return this.u[this.u.length-1]}clearBreadcrumbs(){return this.u=[],this.R(),this}addAttachment(t){return this.h.push(t),this}clearAttachments(){return this.h=[],this}getScopeData(){return{breadcrumbs:this.u,attachments:this.h,contexts:this._,tags:this.l,attributes:this.m,extra:this.v,user:this.p,level:this.j,fingerprint:this.T||[],eventProcessors:this.i,propagationContext:this.N,sdkProcessingMetadata:this.S,transactionName:this.A,span:tt(this),conversationId:this.O}}setSDKProcessingMetadata(t){return this.S=K(this.S,t,2),this}setPropagationContext(t){return this.N=t,this}getPropagationContext(){return this.N}captureException(t,n){const e=n?.event_id||F();if(!this.k)return h&&S.warn("No client configured on scope - will not capture exception!"),e;const r=new Error("Sentry syntheticException");return this.k.captureException(t,{originalException:t,syntheticException:r,...n,event_id:e},this),e}captureMessage(t,n,e){const r=e?.event_id||F();if(!this.k)return h&&S.warn("No client configured on scope - will not capture message!"),r;const o=e?.syntheticException??new Error(t);return this.k.captureMessage(t,n,{originalException:t,syntheticException:o,...e,event_id:r},this),r}captureEvent(t,n){const e=t.event_id||n?.event_id||F();return this.k?(this.k.captureEvent(t,{...n,event_id:e},this),e):(h&&S.warn("No client configured on scope - will not capture event!"),e)}R(){this.t||(this.t=!0,this.o.forEach(t=>{t(this)}),this.t=!1)}}const et=t=>t instanceof Promise&&!t[rt],rt=Symbol("chained PromiseLike"),ot=(t,n)=>{let e=!1;for(const r in t){if(r in n)continue;e=!0;const o=t[r];"function"==typeof o?Object.defineProperty(n,r,{value:(...n)=>o.apply(t,n),enumerable:!0,configurable:!0,writable:!0}):n[r]=o}return e&&Object.assign(n,{[rt]:!0}),n};class it{constructor(t,n){let e,r;e=t||new nt,r=n||new nt,this.P=[{scope:e}],this.D=r}withScope(t){const n=this.U();let e;try{e=t(n)}catch(t){throw this.L(),t}return T(e)?((t,n,e)=>{const r=t.then(t=>(n(t),t),t=>{throw e(t),t});return et(r)&&et(t)?r:ot(t,r)})(e,()=>this.L(),()=>this.L()):(this.L(),e)}getClient(){return this.getStackTop().client}getScope(){return this.getStackTop().scope}getIsolationScope(){return this.D}getStackTop(){return this.P[this.P.length-1]}U(){const t=this.getScope().clone();return this.P.push({client:this.getClient(),scope:t}),t}L(){return!(this.P.length<=1)&&!!this.P.pop()}}function st(){const t=m(l());return t.stack=t.stack||new it(g("defaultCurrentScope",()=>new nt),g("defaultIsolationScope",()=>new nt))}function ct(t){return st().withScope(t)}function ut(t,n){const e=st();return e.withScope(()=>(e.getStackTop().scope=t,n(t)))}function at(t){return st().withScope(()=>t(st().getIsolationScope()))}function ft(t){const n=m(t);return n.acs?n.acs:{withIsolationScope:at,withScope:ct,withSetScope:ut,withSetIsolationScope:(t,n)=>at(n),getCurrentScope:()=>st().getScope(),getIsolationScope:()=>st().getIsolationScope()}}function ht(){return ft(l()).getCurrentScope().getClient()}function pt(t){if(t){if("object"==typeof t&&"deref"in t&&"function"==typeof t.deref)try{return t.deref()}catch{return}return t}}function dt(t){const n=t;return{scope:n._sentryScope,isolationScope:pt(n._sentryIsolationScope)}}const lt="sentry-";function mt(t){const n=function(t){if(!t||!C(t)&&!Array.isArray(t))return;if(Array.isArray(t))return t.reduce((t,n)=>{const e=gt(n);return Object.entries(e).forEach(([n,e])=>{t[n]=e}),t},{});return gt(t)}(t);if(!n)return;const e=Object.entries(n).reduce((t,[n,e])=>{if(n.startsWith(lt)){t[n.slice(7)]=e}return t},{});return Object.keys(e).length>0?e:void 0}function gt(t){return t.split(",").map(t=>{const n=t.indexOf("=");if(-1===n)return[];return[t.slice(0,n),t.slice(n+1)].map(t=>{try{return decodeURIComponent(t.trim())}catch{return}})}).reduce((t,[n,e])=>(n&&e&&(t[n]=e),t),{})}const yt=/^o(\d+)\./;function bt(t,n=!1){const{host:e,path:r,pass:o,port:i,projectId:s,protocol:c,publicKey:u}=t;return`${c}://${u}${n&&o?`:${o}`:""}@${e}${i?`:${i}`:""}/${r?`${r}/`:r}${s}`}function vt(t){const n=t.getOptions(),{host:e}=t.getDsn()||{};let r;return n.orgId?r=String(n.orgId):e&&(r=function(t){const n=t.match(yt);return n?.[1]}(e)),r}function _t(t){const{spanId:n,traceId:e,isRemote:r}=t.spanContext(),o=r?n:Et(t).parent_span_id,i=dt(t).scope;return{parent_span_id:o,span_id:r?i?.getPropagationContext().propagationSpanId||q():n,trace_id:e}}function wt(t){return t&&t.length>0?t.map(({context:{spanId:t,traceId:n,traceFlags:e,...r},attributes:o})=>({span_id:t,trace_id:n,sampled:1===e,attributes:o,...r})):void 0}function St(t){return"number"==typeof t?$t(t):Array.isArray(t)?t[0]+t[1]/1e9:t instanceof Date?$t(t.getTime()):J()}function $t(t){return t>9999999999?t/1e3:t}function Et(t){if(function(t){return"function"==typeof t.getSpanJSON}(t))return t.getSpanJSON();const{spanId:n,traceId:e}=t.spanContext();if(function(t){const n=t;return!!(n.attributes&&n.startTime&&n.name&&n.endTime&&n.status)}(t)){const{attributes:r,startTime:o,name:i,endTime:s,status:c,links:u}=t;return{span_id:n,trace_id:e,data:r,description:i,parent_span_id:xt(t),start_timestamp:St(o),timestamp:St(s)||void 0,status:Nt(c),op:r["sentry.op"],origin:r["sentry.origin"],links:wt(u)}}return{span_id:n,trace_id:e,start_timestamp:0,data:{}}}function xt(t){return"parentSpanId"in t?t.parentSpanId:"parentSpanContext"in t?t.parentSpanContext?.spanId:void 0}function Nt(t){if(t&&0!==t.code)return 1===t.code?"ok":t.message||"internal_error"}const jt=function(t){return t._sentryRootSpan||t};function Ct(t){const n=ht();if(!n)return{};const e=jt(t),r=Et(e),o=r.data,i=e.spanContext().traceState,s=i?.get("sentry.sample_rate")??o["sentry.sample_rate"]??o["sentry.previous_trace_sample_rate"];function c(t){return"number"!=typeof s&&"string"!=typeof s||(t.sample_rate=`${s}`),t}const u=e._frozenDsc;if(u)return c(u);const a=i?.get("sentry.dsc"),f=a&&mt(a);if(f)return c(f);const h=function(t,n){const e=n.getOptions(),{publicKey:r}=n.getDsn()||{},o={environment:e.environment||"production",release:e.release,public_key:r,trace_id:t,org_id:vt(n)};return n.emit("createDsc",o),o}(t.spanContext().traceId,n),p=o["sentry.source"]??o["sentry.span.source"],d=r.description;return"url"!==p&&d&&(h.transaction=d),function(){if("boolean"==typeof __SENTRY_TRACING__&&!__SENTRY_TRACING__)return!1;const t=ht()?.getOptions();return!(!t||null==t.tracesSampleRate&&!t.tracesSampler)}()&&(h.sampled=String(function(t){const{traceFlags:n}=t.spanContext();return 1===n}(e)),h.sample_rand=i?.get("sentry.sample_rand")??dt(e).scope?.getPropagationContext().sampleRand.toString()),c(h),n.emit("createDsc",h,e),h}function At(t,n=100,e=1/0){try{return Tt("",t,n,e)}catch(t){return{ERROR:`**non-serializable** (${t})`}}}function Tt(t,n,e=1/0,r=1/0,o=function(){const t=new WeakSet;function n(n){return!!t.has(n)||(t.add(n),!1)}function e(n){t.delete(n)}return[n,e]}()){const[i,s]=o;if(null==n||["boolean","string"].includes(typeof n)||"number"==typeof n&&Number.isFinite(n))return n;const c=function(t,n){try{if("domain"===t&&n&&"object"==typeof n&&n.M)return"[Domain]";if("domainEmitter"===t)return"[DomainEmitter]";if("undefined"!=typeof global&&n===global)return"[Global]";if("undefined"!=typeof window&&n===window)return"[Window]";if("undefined"!=typeof document&&n===document)return"[Document]";if("object"==typeof(e=n)&&null!==e&&(e.__isVue||e.B||e.__v_isVNode))return function(t){return"__v_isVNode"in t&&t.__v_isVNode?"[VueVNode]":"[VueViewModel]"}(n);if(function(t){return A(t)&&"nativeEvent"in t&&"preventDefault"in t&&"stopPropagation"in t}(n))return"[SyntheticEvent]";if("number"==typeof n&&!Number.isFinite(n))return`[${n}]`;if("function"==typeof n)return`[Function: ${function(t){try{return t&&"function"==typeof t&&t.name||x}catch{return x}}(n)}]`;if("symbol"==typeof n)return`[${String(n)}]`;if("bigint"==typeof n)return`[BigInt: ${String(n)}]`;const r=function(t){const n=Object.getPrototypeOf(t);return n?.constructor?n.constructor.name:"null prototype"}(n);return/^HTML(\w*)Element$/.test(r)?`[HTMLElement: ${r}]`:`[object ${r}]`}catch(t){return`**non-serializable** (${t})`}var e}(t,n);if(!c.startsWith("[object "))return c;if(n.__sentry_skip_normalization__)return n;const u="number"==typeof n.__sentry_override_normalization_depth__?n.__sentry_override_normalization_depth__:e;if(0===u)return c.replace("object ","");if(i(n))return"[Circular ~]";const a=n;if(a&&"function"==typeof a.toJSON)try{return Tt("",a.toJSON(),u-1,r,o)}catch{}const f=Array.isArray(n)?[]:{};let h=0;const p=R(n);for(const t in p){if(!Object.prototype.hasOwnProperty.call(p,t))continue;if(h>=r){f[t]="[MaxProperties ~]";break}const n=p[t];f[t]=Tt(t,n,u-1,r,o),h++}return s(n),f}function kt(t,n){const e=n.replace(/\\/g,"/").replace(/[|\\{}()[\]^$+*?.]/g,"\\$&");let r=t;try{r=decodeURI(t)}catch{}return r.replace(/\\/g,"/").replace(/webpack:\/?/g,"").replace(new RegExp(`(file://)?/*${e}/*`,"ig"),"app:///")}function It(t,n=[]){return[t,n]}function Ot(t,n){const e=t[1];for(const t of e){if(n(t,t[0].type))return!0}return!1}function Rt(t){const n=m(p);return n.encodePolyfill?n.encodePolyfill(t):(new TextEncoder).encode(t)}function Pt(t){const[n,e]=t;let r=JSON.stringify(n);function o(t){"string"==typeof r?r="string"==typeof t?r+t:[Rt(r),t]:r.push("string"==typeof t?Rt(t):t)}for(const t of e){const[n,e]=t;if(o(`\n${JSON.stringify(n)}\n`),"string"==typeof e||e instanceof Uint8Array)o(e);else{let t;try{t=JSON.stringify(e)}catch{t=JSON.stringify(At(e))}o(t)}}return"string"==typeof r?r:function(t){const n=t.reduce((t,n)=>t+n.length,0),e=new Uint8Array(n);let r=0;for(const n of t)e.set(n,r),r+=n.length;return e}(r)}const Dt={sessions:"session",event:"error",client_report:"internal",user_report:"default",profile_chunk:"profile",replay_event:"replay",replay_recording:"replay",check_in:"monitor",raw_security:"security",log:"log_item",trace_metric:"metric"};function Ut(t){return function(t){return t in Dt}(t)?Dt[t]:t}function Lt(t){if(!t?.sdk)return;const{name:n,version:e}=t.sdk;return{name:n,version:e}}function Mt(t,n,e,r){const o=Lt(e),i=t.type&&"replay_event"!==t.type?t.type:"event";!function(t,n){if(!n)return t;const e=t.sdk||{};t.sdk={...e,name:e.name||n.name,version:e.version||n.version,integrations:[...t.sdk?.integrations||[],...n.integrations||[]],packages:[...t.sdk?.packages||[],...n.packages||[]],settings:t.sdk?.settings||n.settings?{...t.sdk?.settings,...n.settings}:void 0}}(t,e?.sdk);const s=function(t,n,e,r){const o=t.sdkProcessingMetadata?.dynamicSamplingContext;return{event_id:t.event_id,sent_at:(new Date).toISOString(),...n&&{sdk:n},...!!e&&r&&{dsn:bt(r)},...o&&{trace:o}}}(t,o,r,n);delete t.sdkProcessingMetadata;return It(s,[[{type:i},t]])}const Bt="__SENTRY_SUPPRESS_TRACING__";function Wt(t){const n=ft(l());return n.suppressTracing?n.suppressTracing(t):function(...t){const n=ft(l());if(2===t.length){const[e,r]=t;return e?n.withSetScope(e,r):n.withScope(r)}return n.withScope(t[0])}(n=>{n.setSDKProcessingMetadata({[Bt]:!0});const e=t();return n.setSDKProcessingMetadata({[Bt]:void 0}),e})}function zt(t,n){const{fingerprint:e,span:r,breadcrumbs:o,sdkProcessingMetadata:i}=n;!function(t,n){const{extra:e,tags:r,user:o,contexts:i,level:s,transactionName:c}=n;Object.keys(e).length&&(t.extra={...e,...t.extra});Object.keys(r).length&&(t.tags={...r,...t.tags});Object.keys(o).length&&(t.user={...o,...t.user});Object.keys(i).length&&(t.contexts={...i,...t.contexts});s&&(t.level=s);c&&"transaction"!==t.type&&(t.transaction=c)}(t,n),r&&function(t,n){t.contexts={trace:_t(n),...t.contexts},t.sdkProcessingMetadata={dynamicSamplingContext:Ct(n),...t.sdkProcessingMetadata};const e=jt(n),r=Et(e).description;r&&!t.transaction&&"transaction"===t.type&&(t.transaction=r)}(t,r),function(t,n){t.fingerprint=t.fingerprint?Array.isArray(t.fingerprint)?t.fingerprint:[t.fingerprint]:[],n&&(t.fingerprint=t.fingerprint.concat(n));t.fingerprint.length||delete t.fingerprint}(t,e),function(t,n){const e=[...t.breadcrumbs||[],...n];t.breadcrumbs=e.length?e:void 0}(t,o),function(t,n){t.sdkProcessingMetadata={...t.sdkProcessingMetadata,...n}}(t,i)}class Ft{constructor(t){this.W=0,this.F=[],this.G(t)}then(t,n){return new Ft((e,r)=>{this.F.push([!1,n=>{if(t)try{e(t(n))}catch(t){r(t)}else e(n)},t=>{if(n)try{e(n(t))}catch(t){r(t)}else r(t)}]),this.H()})}catch(t){return this.then(t=>t,t)}finally(t){return new Ft((n,e)=>{let r,o;return this.then(n=>{o=!1,r=n,t&&t()},n=>{o=!0,r=n,t&&t()}).then(()=>{o?e(r):n(r)})})}H(){if(0===this.W)return;const t=this.F.slice();this.F=[],t.forEach(t=>{t[0]||(1===this.W&&t[1](this.J),2===this.W&&t[2](this.J),t[0]=!0)})}G(t){const n=(t,n)=>{0===this.W&&(T(n)?n.then(e,r):(this.W=t,this.J=n,this.H()))},e=t=>{n(1,t)},r=t=>{n(2,t)};try{t(e,r)}catch(t){r(t)}}}const Gt=Symbol.for("SentryBufferFullError");function Ht(t=100){const n=new Set;function e(t){n.delete(t)}return{get $(){return Array.from(n)},add:function(r){if(!(n.size<t))return o=Gt,new Ft((t,n)=>{n(o)});var o;const i=r();return n.add(i),i.then(()=>e(i),()=>e(i)),i},drain:function(t){if(!n.size)return e=!0,new Ft(t=>{t(e)});var e;const r=Promise.allSettled(Array.from(n)).then(()=>!0);if(!t)return r;const o=[r,new Promise(n=>{return"object"==typeof(e=setTimeout(()=>n(!1),t))&&"function"==typeof e.unref&&e.unref(),e;var e})];return Promise.race(o)}}}function Jt(t,{statusCode:n,headers:e},r=W()){const o={...t},i=e?.["x-sentry-rate-limits"],s=e?.["retry-after"];if(i)for(const t of i.trim().split(",")){const[n,e,,,i]=t.split(":",5),s=parseInt(n,10),c=1e3*(isNaN(s)?60:s);if(e)for(const t of e.split(";"))"metric_bucket"===t&&i&&!i.split(";").includes("custom")||(o[t]=r+c);else o.all=r+c}else s?o.all=r+function(t,n=W()){const e=parseInt(`${t}`,10);if(!isNaN(e))return 1e3*e;const r=Date.parse(`${t}`);return isNaN(r)?6e4:r-n}(s,r):429===n&&(o.all=r+6e4);return o}function Yt(t,n,e=Ht(t.bufferSize||64)){let r={};return{send:function(t){const o=[];if(Ot(t,(t,n)=>{const e=Ut(n);(function(t,n,e=W()){return function(t,n){return t[n]||t.all||0}(t,n)>e})(r,e)||o.push(t)}),0===o.length)return Promise.resolve({});const i=It(t[0],o),s=t=>{!function(t,n){return Ot(t,(t,e)=>n.includes(e))}(i,["client_report"])?Ot(i,(t,n)=>{}):h&&S.warn(`Dropping client report. Will not send outcomes (reason: ${t}).`)};return e.add(()=>n({body:Pt(i)}).then(t=>413===t.statusCode?(h&&S.error("Sentry responded with status code 413. Envelope was discarded due to exceeding size limits."),s("send_error"),t):(h&&void 0!==t.statusCode&&(t.statusCode<200||t.statusCode>=300)&&S.warn(`Sentry responded with status code ${t.statusCode} to sent event.`),r=Jt(r,t),t),t=>{throw s("network_error"),h&&S.error("Encountered error running transport request:",t),t})).then(t=>t,t=>{if(t===Gt)return h&&S.error("Skipped sending event because buffer is full."),s("queue_overflow"),Promise.resolve({});throw t})},flush:t=>e.drain(t)}}const Vt=/^(\S+:\\|\/?)([\s\S]*?)((?:\.{1,2}|[^/\\]+?|)(\.[^./\\]*|))(?:[/\\]*)$/;function Kt(t){const n=function(t){const n=t.length>1024?`<truncated>${t.slice(-1024)}`:t,e=Vt.exec(n);return e?e.slice(1):[]}(t),e=n[0]||"";let r=n[1];return e||r?(r&&(r=r.slice(0,r.length-1)),e+r):"."}function Zt(t,n=!1){return!(n||t&&!t.startsWith("/")&&!t.match(/^[A-Z]:/)&&!t.startsWith(".")&&!t.match(/^[a-zA-Z]([a-zA-Z0-9.\-+])*:\/\//))&&void 0!==t&&!t.includes("node_modules/")}const qt=Symbol("AgentBaseInternalState");class Qt extends i.Agent{constructor(t){super(t),this[qt]={}}isSecureEndpoint(t){if(t){if("boolean"==typeof t.secureEndpoint)return t.secureEndpoint;if("string"==typeof t.protocol)return"https:"===t.protocol}const{stack:n}=new Error;return"string"==typeof n&&n.split("\n").some(t=>-1!==t.indexOf("(https.js:")||-1!==t.indexOf("node:https:"))}createSocket(t,n,e){const r={...n,secureEndpoint:this.isSecureEndpoint(n)};Promise.resolve().then(()=>this.connect(t,r)).then(o=>{if(o instanceof i.Agent)return o.addRequest(t,r);this[qt].currentSocket=o,super.createSocket(t,n,e)},e)}createConnection(){const t=this[qt].currentSocket;if(this[qt].currentSocket=void 0,!t)throw new Error("No socket was returned in the `connect()` function");return t}get defaultPort(){return this[qt].defaultPort??("https:"===this.protocol?443:80)}set defaultPort(t){this[qt]&&(this[qt].defaultPort=t)}get protocol(){return this[qt].protocol??(this.isSecureEndpoint()?"https:":"http:")}set protocol(t){this[qt]&&(this[qt].protocol=t)}}function Xt(...t){S.log("[https-proxy-agent:parse-proxy-response]",...t)}function tn(t){return new Promise((n,e)=>{let r=0;const o=[];function i(){const c=t.read();c?function(c){o.push(c),r+=c.length;const u=Buffer.concat(o,r),a=u.indexOf("\r\n\r\n");if(-1===a)return Xt("have not received end of HTTP headers yet..."),void i();const f=u.subarray(0,a).toString("ascii").split("\r\n"),h=f.shift();if(!h)return t.destroy(),e(new Error("No header received from proxy CONNECT response"));const p=h.split(" "),d=+(p[1]||0),l=p.slice(2).join(" "),m={};for(const n of f){if(!n)continue;const r=n.indexOf(":");if(-1===r)return t.destroy(),e(new Error(`Invalid header from proxy CONNECT response: "${n}"`));const o=n.slice(0,r).toLowerCase(),i=n.slice(r+1).trimStart(),s=m[o];"string"==typeof s?m[o]=[s,i]:Array.isArray(s)?s.push(i):m[o]=i}Xt("got proxy server response: %o %o",h,m),s(),n({connect:{statusCode:d,statusText:l,headers:m},buffered:u})}(c):t.once("readable",i)}function s(){t.removeListener("end",c),t.removeListener("error",u),t.removeListener("readable",i)}function c(){s(),Xt("onend"),e(new Error("Proxy connection ended before receiving CONNECT response"))}function u(t){s(),Xt("onerror %o",t),e(t)}t.on("error",u),t.on("end",c),i()})}function nn(...t){S.log("[https-proxy-agent]",...t)}class en extends Qt{static __initStatic(){this.protocols=["http","https"]}constructor(t,n){super(n),this.options={},this.proxy="string"==typeof t?new URL(t):t,this.proxyHeaders=n?.headers??{},nn("Creating new HttpsProxyAgent instance: %o",this.proxy.href);const e=(this.proxy.hostname||this.proxy.host).replace(/^\[|\]$/g,""),r=this.proxy.port?parseInt(this.proxy.port,10):"https:"===this.proxy.protocol?443:80;this.connectOpts={ALPNProtocols:["http/1.1"],...n?on(n,"headers"):null,host:e,port:r}}async connect(t,n){const{proxy:e}=this;if(!n.host)throw new TypeError('No "host" provided');let r;if("https:"===e.protocol){nn("Creating `tls.Socket`: %o",this.connectOpts);const t=this.connectOpts.servername||this.connectOpts.host;r=f.connect({...this.connectOpts,servername:t&&a.isIP(t)?void 0:t})}else nn("Creating `net.Socket`: %o",this.connectOpts),r=a.connect(this.connectOpts);const o="function"==typeof this.proxyHeaders?this.proxyHeaders():{...this.proxyHeaders},i=a.isIPv6(n.host)?`[${n.host}]`:n.host;let s=`CONNECT ${i}:${n.port} HTTP/1.1\r\n`;if(e.username||e.password){const t=`${decodeURIComponent(e.username)}:${decodeURIComponent(e.password)}`;o["Proxy-Authorization"]=`Basic ${Buffer.from(t).toString("base64")}`}o.Host=`${i}:${n.port}`,o["Proxy-Connection"]||(o["Proxy-Connection"]=this.keepAlive?"Keep-Alive":"close");for(const t of Object.keys(o))s+=`${t}: ${o[t]}\r\n`;const c=tn(r);r.write(`${s}\r\n`);const{connect:u,buffered:h}=await c;if(t.emit("proxyConnect",u),this.emit("proxyConnect",u,t),200===u.statusCode){if(t.once("socket",rn),n.secureEndpoint){nn("Upgrading socket connection to TLS");const t=n.servername||n.host;return f.connect({...on(n,"host","path","port"),socket:r,servername:a.isIP(t)?void 0:t})}return r}r.destroy();const p=new a.Socket({writable:!1});return p.readable=!0,t.once("socket",t=>{nn("Replaying proxy buffer for failed request"),t.push(h),t.push(null)}),p}}function rn(t){t.resume()}function on(t,...n){const e={};let r;for(r in t)n.includes(r)||(e[r]=t[r]);return e}en.__initStatic();function sn(t){return t.replace(/^[A-Z]:/,"").replace(/\\/g,"/")}const cn=n;let un,an=0,fn={};function hn(t){cn.debug&&console.log(`[ANR Worker] ${t}`)}var pn,dn,ln;const mn=function(t){let n;try{n=new URL(t.url)}catch(n){return b(()=>{console.warn("[@sentry/node]: Invalid dsn or tunnel option, will not send any events. The tunnel option must be a full URL when used.")}),Yt(t,()=>Promise.resolve({}))}const e="https:"===n.protocol,r=function(t,n){const{no_proxy:e}=process.env,r=e?.split(",").some(n=>t.host.endsWith(n)||t.hostname.endsWith(n));return r?void 0:n}(n,t.proxy||(e?process.env.https_proxy:void 0)||process.env.http_proxy),o=e?s:i,a=void 0!==t.keepAlive&&t.keepAlive,f=r?new en(r):new o.Agent({keepAlive:a,maxSockets:30,timeout:2e3}),h=function(t,n,e){const{hostname:r,pathname:o,port:i,protocol:s,search:a}=new URL(t.url);return function(f){return new Promise((h,p)=>{Wt(()=>{let d=function(t){return new c({read(){this.push(t),this.push(null)}})}(f.body);const l={...t.headers};f.body.length>32768&&(l["content-encoding"]="gzip",d=d.pipe(u()));const m=r.startsWith("["),g=n.request({method:"POST",agent:e,headers:l,hostname:m?r.slice(1,-1):r,path:`${o}${a}`,port:i,protocol:s,ca:t.caCerts},t=>{t.on("data",()=>{}),t.on("end",()=>{}),t.setEncoding("utf8");const n=t.headers["retry-after"]??null,e=t.headers["x-sentry-rate-limits"]??null;h({statusCode:t.statusCode,headers:{"retry-after":n,"x-sentry-rate-limits":Array.isArray(e)?e[0]||null:e}})});g.on("error",p),d.pipe(g)})})}}(t,t.httpModule??o,f);return Yt(t,h)}({url:(pn=cn.dsn,dn=cn.tunnel,ln=cn.sdkMetadata.sdk,dn||`${function(t){return`${function(t){const n=t.protocol?`${t.protocol}:`:"",e=t.port?`:${t.port}`:"";return`${n}//${t.host}${e}${t.path?`/${t.path}`:""}/api/`}(t)}${t.projectId}/envelope/`}(pn)}?${function(t,n){const e={sentry_version:"7"};return t.publicKey&&(e.sentry_key=t.publicKey),n&&(e.sentry_client=`${n.name}/${n.version}`),new URLSearchParams(e).toString()}(pn,ln)}`)});async function gn(){if(un){hn("Sending abnormal session"),V(un,{status:"abnormal",abnormal_mechanism:"anr_foreground",release:cn.release,environment:cn.environment});const t=function(t,n,e,r){const o=Lt(e);return It({sent_at:(new Date).toISOString(),...o&&{sdk:o},...!!r&&n&&{dsn:bt(n)}},["aggregates"in t?[{type:"sessions"},t]:[{type:"session"},t.toJSON()]])}(un,cn.dsn,cn.sdkMetadata,cn.tunnel);hn(JSON.stringify(t)),await mn.send(t);try{e?.postMessage("session-ended")}catch{}}}function yn(t){if(!t)return;const n=function(t){if(!t.length)return[];const n=Array.from(t);return/sentryWrapped/.test(E(n).function||"")&&n.pop(),n.reverse(),$.test(E(n).function||"")&&(n.pop(),$.test(E(n).function||"")&&n.pop()),n.slice(0,50).map(t=>({...t,filename:t.filename||E(n).filename,function:t.function||"?"}))}(t);if(cn.appRootPath)for(const t of n)t.filename&&(t.filename=kt(t.filename,cn.appRootPath));return n}async function bn(t,n){if(an>=cn.maxAnrEvents)return;an+=1,await gn(),hn("Sending event");const e={event_id:F(),contexts:cn.contexts,release:cn.release,environment:cn.environment,dist:cn.dist,platform:"node",level:"error",exception:{values:[{type:"ApplicationNotResponding",value:`Application Not Responding for at least ${cn.anrThreshold} ms`,stacktrace:{frames:yn(t)},mechanism:{type:"ANR"}}]},tags:cn.staticTags};n&&function(t,n){if(zt(t,n),!t.contexts?.trace){const{traceId:e,parentSpanId:r,propagationSpanId:o}=n.propagationContext;t.contexts={trace:{trace_id:e,span_id:o||q(),parent_span_id:r},...t.contexts}}}(e,n),function(t){if(0===Object.keys(fn).length)return;const n=cn.appRootPath?{}:fn;if(cn.appRootPath)for(const[t,e]of Object.entries(fn))n[kt(t,cn.appRootPath)]=e;const e=new Map;for(const r of t.exception?.values||[])for(const t of r.stacktrace?.frames||[]){const r=t.abs_path||t.filename;r&&n[r]&&e.set(r,n[r])}if(e.size>0){const n=[];for(const[t,r]of e.entries())n.push({type:"sourcemap",code_file:t,debug_id:r});t.debug_meta={images:n}}}(e);const r=Mt(e,cn.dsn,cn.sdkMetadata,cn.tunnel);hn(JSON.stringify(r)),await mn.send(r),await mn.flush(2e3),an>=cn.maxAnrEvents&&setTimeout(()=>{process.exit(0)},5e3)}let vn;if(hn("Started"),cn.captureStackTrace){hn("Connecting to debugger");const n=new t;n.connectToMainThread(),hn("Connected to debugger");const e=new Map;n.on("Debugger.scriptParsed",t=>{e.set(t.params.scriptId,t.params.url)}),n.on("Debugger.paused",t=>{if("other"===t.params.reason)try{hn("Debugger paused");const i=[...t.params.callFrames],s=cn.appRootPath?function(t=(process.argv[1]?Kt(process.argv[1]):process.cwd()),n="\\"===o){const e=n?sn(t):t;return t=>{if(!t)return;const o=n?sn(t):t;let{dir:i,base:s,ext:c}=r.parse(o);".js"!==c&&".mjs"!==c&&".cjs"!==c||(s=s.slice(0,-1*c.length));const u=decodeURIComponent(s);i||(i=".");const a=i.lastIndexOf("/node_modules");if(a>-1)return`${i.slice(a+14).replace(/\//g,".")}:${u}`;if(i.startsWith(e)){const t=i.slice(e.length+1).replace(/\//g,".");return t?`${t}:${u}`:u}return u}}(cn.appRootPath):()=>{},c=i.map(t=>function(t,n,e){const r=n?n.replace(/^file:\/\//,""):void 0,o=t.location.columnNumber?t.location.columnNumber+1:void 0,i=t.location.lineNumber?t.location.lineNumber+1:void 0;return{filename:r,module:e(r),function:t.functionName||"?",colno:o,lineno:i,in_app:r?Zt(r):void 0}}(t,e.get(t.location.scriptId),s)),u=setTimeout(()=>{bn(c).then(null,()=>{hn("Sending ANR event failed.")})},5e3);n.post("Runtime.evaluate",{expression:"global.__SENTRY_GET_SCOPES__();",silent:!0,returnByValue:!0},(t,e)=>{t&&hn(`Error executing script: '${t.message}'`),clearTimeout(u);const r=e?.result?e.result.value:void 0;n.post("Debugger.resume"),n.post("Debugger.disable"),bn(c,r).then(null,()=>{hn("Sending ANR event failed.")})})}catch(t){throw n.post("Debugger.resume"),n.post("Debugger.disable"),t}}),vn=()=>{try{n.post("Debugger.enable",()=>{n.post("Debugger.pause")})}catch{}}}const{poll:_n}=function(t,n,e,r){const o=t();let i=!1,s=!0;return setInterval(()=>{const t=o.getTimeMs();!1===i&&t>n+e&&(i=!0,s&&r()),t<n+e&&(i=!1)},20),{poll:()=>{o.reset()},enabled:t=>{s=t}}}(function(){let t=process.hrtime();return{getTimeMs:()=>{const[n,e]=process.hrtime(t);return Math.floor(1e3*n+e/1e6)},reset:()=>{t=process.hrtime()}}},cn.pollInterval,cn.anrThreshold,function(){hn("Watchdog timeout"),vn?(hn("Pausing debugger to capture stack trace"),vn()):(hn("Capturing event without a stack trace"),bn().then(null,()=>{hn("Sending ANR event failed on watchdog timeout.")}))});e?.on("message",t=>{t.session&&(un=Y(t.session)),t.debugImages&&(fn=t.debugImages),_n()});

@@ -305,6 +305,12 @@ import { subscribe, unsubscribe } from 'node:diagnostics_channel';

/**
* Exported for testing purposes.
*/
function _getOutgoingRequestEndedSpanData(response) {
const { statusCode, statusMessage, httpVersion, socket } = response;
const transport = httpVersion.toUpperCase() !== 'QUIC' ? 'ip_tcp' : 'ip_udp';
// httpVersion can be undefined in some cases and we seem to have encountered this before:
// https://github.com/getsentry/sentry-javascript/blob/ec8c8c64cde6001123db0199a8ca017b8863eac8/packages/node-core/src/integrations/http/httpServerSpansIntegration.ts#L158
// see: #20415
const transport = httpVersion?.toUpperCase() !== 'QUIC' ? 'ip_tcp' : 'ip_udp';

@@ -372,3 +378,3 @@ const additionalAttributes = {

export { SentryHttpInstrumentation };
export { SentryHttpInstrumentation, _getOutgoingRequestEndedSpanData };
//# sourceMappingURL=SentryHttpInstrumentation.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"SentryHttpInstrumentation.js","sources":["../../../../src/integrations/http/SentryHttpInstrumentation.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport type { ChannelListener } from 'node:diagnostics_channel';\nimport { subscribe, unsubscribe } from 'node:diagnostics_channel';\nimport { errorMonitor } from 'node:events';\nimport type * as http from 'node:http';\nimport type * as https from 'node:https';\nimport { context, SpanStatusCode, trace } from '@opentelemetry/api';\nimport { isTracingSuppressed } from '@opentelemetry/core';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';\nimport {\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_NETWORK_PEER_ADDRESS,\n ATTR_NETWORK_PEER_PORT,\n ATTR_NETWORK_PROTOCOL_VERSION,\n ATTR_NETWORK_TRANSPORT,\n ATTR_URL_FULL,\n ATTR_USER_AGENT_ORIGINAL,\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH,\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED,\n} from '@opentelemetry/semantic-conventions';\nimport type { Span, SpanAttributes, SpanStatus } from '@sentry/core';\nimport {\n debug,\n getHttpSpanDetailsFromUrlObject,\n getSpanStatusFromHttpCode,\n LRUMap,\n parseStringToURLObject,\n SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n startInactiveSpan,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { INSTRUMENTATION_NAME } from './constants';\nimport {\n addRequestBreadcrumb,\n addTracePropagationHeadersToOutgoingRequest,\n getClientRequestUrl,\n getRequestOptions,\n} from './outgoing-requests';\n\ntype Http = typeof http;\ntype Https = typeof https;\ntype IncomingHttpHeaders = http.IncomingHttpHeaders;\ntype OutgoingHttpHeaders = http.OutgoingHttpHeaders;\n\nexport type SentryHttpInstrumentationOptions = InstrumentationConfig & {\n /**\n * Whether breadcrumbs should be recorded for outgoing requests.\n *\n * @default `true`\n */\n breadcrumbs?: boolean;\n\n /**\n * Whether to propagate Sentry trace headers in outgoing requests.\n * By default this is done by the HttpInstrumentation, but if that is not added (e.g. because tracing is disabled)\n * then this instrumentation can take over.\n *\n * @default `false`\n */\n propagateTraceInOutgoingRequests?: boolean;\n\n /**\n * Whether to enable the capability to create spans for outgoing requests via diagnostic channels.\n * If enabled, spans will only be created if the `spans` option is also enabled (default: true).\n *\n * This is a feature flag that should be enabled by SDKs when the runtime supports it (Node 22.12+).\n * Individual users should not need to configure this directly.\n *\n * @default `false`\n */\n createSpansForOutgoingRequests?: boolean;\n\n /**\n * Whether to create spans for outgoing requests (user preference).\n * This only takes effect if `createSpansForOutgoingRequests` is also enabled.\n * If `createSpansForOutgoingRequests` is not enabled, this option is ignored.\n *\n * @default `true`\n */\n spans?: boolean;\n\n /**\n * Do not capture breadcrumbs for outgoing HTTP requests to URLs where the given callback returns `true`.\n * For the scope of this instrumentation, this callback only controls breadcrumb creation.\n * The same option can be passed to the top-level httpIntegration where it controls both, breadcrumb and\n * span creation.\n *\n * @param url Contains the entire URL, including query string (if any), protocol, host, etc. of the outgoing request.\n * @param request Contains the {@type RequestOptions} object used to make the outgoing request.\n */\n ignoreOutgoingRequests?: (url: string, request: http.RequestOptions) => boolean;\n\n /**\n * Hooks for outgoing request spans, called when `createSpansForOutgoingRequests` is enabled.\n * These mirror the OTEL HttpInstrumentation hooks for backwards compatibility.\n */\n outgoingRequestHook?: (span: Span, request: http.ClientRequest) => void;\n outgoingResponseHook?: (span: Span, response: http.IncomingMessage) => void;\n outgoingRequestApplyCustomAttributes?: (\n span: Span,\n request: http.ClientRequest,\n response: http.IncomingMessage,\n ) => void;\n\n // All options below do not do anything anymore in this instrumentation, and will be removed in the future.\n // They are only kept here for backwards compatibility - the respective functionality is now handled by the httpServerIntegration/httpServerSpansIntegration.\n\n /**\n * @depreacted This no longer does anything.\n */\n extractIncomingTraceFromHeader?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreStaticAssets?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n disableIncomingRequestSpans?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreSpansForIncomingRequests?: (urlPath: string, request: http.IncomingMessage) => boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreIncomingRequestBody?: (url: string, request: http.RequestOptions) => boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n maxIncomingRequestBodySize?: 'none' | 'small' | 'medium' | 'always';\n\n /**\n * @deprecated This no longer does anything.\n */\n trackIncomingRequestsAsSessions?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n instrumentation?: {\n requestHook?: (span: Span, req: http.ClientRequest | http.IncomingMessage) => void;\n responseHook?: (span: Span, response: http.IncomingMessage | http.ServerResponse) => void;\n applyCustomAttributesOnSpan?: (\n span: Span,\n request: http.ClientRequest | http.IncomingMessage,\n response: http.IncomingMessage | http.ServerResponse,\n ) => void;\n };\n\n /**\n * @deprecated This no longer does anything.\n */\n sessionFlushingDelayMS?: number;\n};\n\n/**\n * This custom HTTP instrumentation handles outgoing HTTP requests.\n *\n * It provides:\n * - Breadcrumbs for all outgoing requests\n * - Trace propagation headers (when enabled)\n * - Span creation for outgoing requests (when createSpansForOutgoingRequests is enabled)\n *\n * Span creation requires Node 22+ and uses diagnostic channels to avoid monkey-patching.\n * By default, this is only enabled in the node SDK, not in node-core or other runtime SDKs.\n *\n * Important note: Contrary to other OTEL instrumentation, this one cannot be unwrapped.\n *\n * This is heavily inspired & adapted from:\n * https://github.com/open-telemetry/opentelemetry-js/blob/f8ab5592ddea5cba0a3b33bf8d74f27872c0367f/experimental/packages/opentelemetry-instrumentation-http/src/http.ts\n */\nexport class SentryHttpInstrumentation extends InstrumentationBase<SentryHttpInstrumentationOptions> {\n private _propagationDecisionMap: LRUMap<string, boolean>;\n private _ignoreOutgoingRequestsMap: WeakMap<http.ClientRequest, boolean>;\n\n public constructor(config: SentryHttpInstrumentationOptions = {}) {\n super(INSTRUMENTATION_NAME, SDK_VERSION, config);\n\n this._propagationDecisionMap = new LRUMap<string, boolean>(100);\n this._ignoreOutgoingRequestsMap = new WeakMap<http.ClientRequest, boolean>();\n }\n\n /** @inheritdoc */\n public init(): [InstrumentationNodeModuleDefinition, InstrumentationNodeModuleDefinition] {\n // We register handlers when either http or https is instrumented\n // but we only want to register them once, whichever is loaded first\n let hasRegisteredHandlers = false;\n\n const onHttpClientResponseFinish = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest; response: http.IncomingMessage };\n this._onOutgoingRequestFinish(data.request, data.response);\n }) satisfies ChannelListener;\n\n const onHttpClientRequestError = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest };\n this._onOutgoingRequestFinish(data.request, undefined);\n }) satisfies ChannelListener;\n\n const onHttpClientRequestCreated = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest };\n this._onOutgoingRequestCreated(data.request);\n }) satisfies ChannelListener;\n\n const wrap = <T extends Http | Https>(moduleExports: T): T => {\n if (hasRegisteredHandlers) {\n return moduleExports;\n }\n\n hasRegisteredHandlers = true;\n\n subscribe('http.client.response.finish', onHttpClientResponseFinish);\n\n // When an error happens, we still want to have a breadcrumb\n // In this case, `http.client.response.finish` is not triggered\n subscribe('http.client.request.error', onHttpClientRequestError);\n\n // NOTE: This channel only exists since Node 22.12+\n // Before that, outgoing requests are not patched\n // and trace headers are not propagated, sadly.\n if (this.getConfig().propagateTraceInOutgoingRequests || this.getConfig().createSpansForOutgoingRequests) {\n subscribe('http.client.request.created', onHttpClientRequestCreated);\n }\n return moduleExports;\n };\n\n const unwrap = (): void => {\n unsubscribe('http.client.response.finish', onHttpClientResponseFinish);\n unsubscribe('http.client.request.error', onHttpClientRequestError);\n unsubscribe('http.client.request.created', onHttpClientRequestCreated);\n };\n\n /**\n * You may be wondering why we register these diagnostics-channel listeners\n * in such a convoluted way (as InstrumentationNodeModuleDefinition...)˝,\n * instead of simply subscribing to the events once in here.\n * The reason for this is timing semantics: These functions are called once the http or https module is loaded.\n * If we'd subscribe before that, there seem to be conflicts with the OTEL native instrumentation in some scenarios,\n * especially the \"import-on-top\" pattern of setting up ESM applications.\n */\n return [\n new InstrumentationNodeModuleDefinition('http', ['*'], wrap, unwrap),\n new InstrumentationNodeModuleDefinition('https', ['*'], wrap, unwrap),\n ];\n }\n\n /**\n * Start a span for an outgoing request.\n * The span wraps the callback of the request, and ends when the response is finished.\n */\n private _startSpanForOutgoingRequest(request: http.ClientRequest): Span {\n // We monkey-patch `req.once('response'), which is used to trigger the callback of the request\n // eslint-disable-next-line @typescript-eslint/unbound-method, deprecation/deprecation\n const originalOnce = request.once;\n\n const [name, attributes] = _getOutgoingRequestSpanData(request);\n\n const span = startInactiveSpan({\n name,\n attributes,\n onlyIfParent: true,\n });\n\n this.getConfig().outgoingRequestHook?.(span, request);\n\n const newOnce = new Proxy(originalOnce, {\n apply(target, thisArg, args: Parameters<typeof originalOnce>) {\n const [event] = args;\n if (event !== 'response') {\n return target.apply(thisArg, args);\n }\n\n const parentContext = context.active();\n const requestContext = trace.setSpan(parentContext, span);\n\n return context.with(requestContext, () => {\n return target.apply(thisArg, args);\n });\n },\n });\n\n // eslint-disable-next-line deprecation/deprecation\n request.once = newOnce;\n\n /**\n * Determines if the request has errored or the response has ended/errored.\n */\n let responseFinished = false;\n\n const endSpan = (status: SpanStatus): void => {\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n\n span.setStatus(status);\n span.end();\n };\n\n request.prependListener('response', response => {\n if (request.listenerCount('response') <= 1) {\n response.resume();\n }\n\n context.bind(context.active(), response);\n\n const additionalAttributes = _getOutgoingRequestEndedSpanData(response);\n span.setAttributes(additionalAttributes);\n\n this.getConfig().outgoingResponseHook?.(span, response);\n this.getConfig().outgoingRequestApplyCustomAttributes?.(span, request, response);\n\n const endHandler = (forceError: boolean = false): void => {\n this._diag.debug('outgoingRequest on end()');\n\n const status =\n // eslint-disable-next-line deprecation/deprecation\n forceError || typeof response.statusCode !== 'number' || (response.aborted && !response.complete)\n ? { code: SpanStatusCode.ERROR }\n : getSpanStatusFromHttpCode(response.statusCode);\n\n endSpan(status);\n };\n\n response.on('end', () => {\n endHandler();\n });\n response.on(errorMonitor, error => {\n this._diag.debug('outgoingRequest on response error()', error);\n endHandler(true);\n });\n });\n\n // Fallback if proper response end handling above fails\n request.on('close', () => {\n endSpan({ code: SpanStatusCode.UNSET });\n });\n request.on(errorMonitor, error => {\n this._diag.debug('outgoingRequest on request error()', error);\n endSpan({ code: SpanStatusCode.ERROR });\n });\n\n return span;\n }\n\n /**\n * This is triggered when an outgoing request finishes.\n * It has access to the final request and response objects.\n */\n private _onOutgoingRequestFinish(request: http.ClientRequest, response?: http.IncomingMessage): void {\n DEBUG_BUILD && debug.log(INSTRUMENTATION_NAME, 'Handling finished outgoing request');\n\n const _breadcrumbs = this.getConfig().breadcrumbs;\n const breadCrumbsEnabled = typeof _breadcrumbs === 'undefined' ? true : _breadcrumbs;\n\n // Note: We cannot rely on the map being set by `_onOutgoingRequestCreated`, because that is not run in Node <22\n const shouldIgnore = this._ignoreOutgoingRequestsMap.get(request) ?? this._shouldIgnoreOutgoingRequest(request);\n this._ignoreOutgoingRequestsMap.set(request, shouldIgnore);\n\n if (breadCrumbsEnabled && !shouldIgnore) {\n addRequestBreadcrumb(request, response);\n }\n }\n\n /**\n * This is triggered when an outgoing request is created.\n * It creates a span (if enabled) and propagates trace headers within the span's context,\n * so downstream services link to the outgoing HTTP span rather than its parent.\n */\n private _onOutgoingRequestCreated(request: http.ClientRequest): void {\n DEBUG_BUILD && debug.log(INSTRUMENTATION_NAME, 'Handling outgoing request created');\n\n const shouldIgnore = this._ignoreOutgoingRequestsMap.get(request) ?? this._shouldIgnoreOutgoingRequest(request);\n this._ignoreOutgoingRequestsMap.set(request, shouldIgnore);\n\n if (shouldIgnore) {\n return;\n }\n\n const shouldCreateSpan = this.getConfig().createSpansForOutgoingRequests && (this.getConfig().spans ?? true);\n const shouldPropagate = this.getConfig().propagateTraceInOutgoingRequests;\n\n if (shouldCreateSpan) {\n const span = this._startSpanForOutgoingRequest(request);\n\n // Propagate headers within the span's context so the sentry-trace header\n // contains the outgoing span's ID, not the parent span's ID.\n // Only do this if the span is recording (has a parent) - otherwise the non-recording\n // span would produce all-zero trace IDs instead of using the scope's propagation context.\n if (shouldPropagate && span.isRecording()) {\n const requestContext = trace.setSpan(context.active(), span);\n context.with(requestContext, () => {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n });\n } else if (shouldPropagate) {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n }\n } else if (shouldPropagate) {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n }\n }\n\n /**\n * Check if the given outgoing request should be ignored.\n */\n private _shouldIgnoreOutgoingRequest(request: http.ClientRequest): boolean {\n if (isTracingSuppressed(context.active())) {\n return true;\n }\n\n const ignoreOutgoingRequests = this.getConfig().ignoreOutgoingRequests;\n\n if (!ignoreOutgoingRequests) {\n return false;\n }\n\n const options = getRequestOptions(request);\n const url = getClientRequestUrl(request);\n return ignoreOutgoingRequests(url, options);\n }\n}\n\nfunction _getOutgoingRequestSpanData(request: http.ClientRequest): [string, SpanAttributes] {\n const url = getClientRequestUrl(request);\n\n const [name, attributes] = getHttpSpanDetailsFromUrlObject(\n parseStringToURLObject(url),\n 'client',\n 'auto.http.otel.http',\n request,\n );\n\n const userAgent = request.getHeader('user-agent');\n\n return [\n name,\n {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.client',\n 'otel.kind': 'CLIENT',\n [ATTR_USER_AGENT_ORIGINAL]: userAgent,\n [ATTR_URL_FULL]: url,\n 'http.url': url,\n 'http.method': request.method,\n 'http.target': request.path || '/',\n 'net.peer.name': request.host,\n 'http.host': request.getHeader('host'),\n ...attributes,\n },\n ];\n}\n\nfunction _getOutgoingRequestEndedSpanData(response: http.IncomingMessage): SpanAttributes {\n const { statusCode, statusMessage, httpVersion, socket } = response;\n\n const transport = httpVersion.toUpperCase() !== 'QUIC' ? 'ip_tcp' : 'ip_udp';\n\n const additionalAttributes: SpanAttributes = {\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: statusCode,\n [ATTR_NETWORK_PROTOCOL_VERSION]: httpVersion,\n 'http.flavor': httpVersion,\n [ATTR_NETWORK_TRANSPORT]: transport,\n 'net.transport': transport,\n ['http.status_text']: statusMessage?.toUpperCase(),\n 'http.status_code': statusCode,\n ...getResponseContentLengthAttributes(response),\n };\n\n if (socket) {\n const { remoteAddress, remotePort } = socket;\n\n additionalAttributes[ATTR_NETWORK_PEER_ADDRESS] = remoteAddress;\n additionalAttributes[ATTR_NETWORK_PEER_PORT] = remotePort;\n additionalAttributes['net.peer.ip'] = remoteAddress;\n additionalAttributes['net.peer.port'] = remotePort;\n }\n\n return additionalAttributes;\n}\n\nfunction getResponseContentLengthAttributes(response: http.IncomingMessage): SpanAttributes {\n const length = getContentLength(response.headers);\n if (length == null) {\n return {};\n }\n\n if (isCompressed(response.headers)) {\n // eslint-disable-next-line deprecation/deprecation\n return { [SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH]: length };\n } else {\n // eslint-disable-next-line deprecation/deprecation\n return { [SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED]: length };\n }\n}\n\nfunction getContentLength(headers: http.OutgoingHttpHeaders | http.IncomingHttpHeaders): number | undefined {\n const contentLengthHeader = headers['content-length'];\n if (typeof contentLengthHeader === 'number') {\n return contentLengthHeader;\n }\n if (typeof contentLengthHeader !== 'string') {\n return undefined;\n }\n\n const contentLength = parseInt(contentLengthHeader, 10);\n if (isNaN(contentLength)) {\n return undefined;\n }\n\n return contentLength;\n}\n\nfunction isCompressed(headers: OutgoingHttpHeaders | IncomingHttpHeaders): boolean {\n const encoding = headers['content-encoding'];\n\n return !!encoding && encoding !== 'identity';\n}\n"],"names":[],"mappings":"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"}
{"version":3,"file":"SentryHttpInstrumentation.js","sources":["../../../../src/integrations/http/SentryHttpInstrumentation.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport type { ChannelListener } from 'node:diagnostics_channel';\nimport { subscribe, unsubscribe } from 'node:diagnostics_channel';\nimport { errorMonitor } from 'node:events';\nimport type * as http from 'node:http';\nimport type * as https from 'node:https';\nimport { context, SpanStatusCode, trace } from '@opentelemetry/api';\nimport { isTracingSuppressed } from '@opentelemetry/core';\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';\nimport {\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_NETWORK_PEER_ADDRESS,\n ATTR_NETWORK_PEER_PORT,\n ATTR_NETWORK_PROTOCOL_VERSION,\n ATTR_NETWORK_TRANSPORT,\n ATTR_URL_FULL,\n ATTR_USER_AGENT_ORIGINAL,\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH,\n SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED,\n} from '@opentelemetry/semantic-conventions';\nimport type { Span, SpanAttributes, SpanStatus } from '@sentry/core';\nimport {\n debug,\n getHttpSpanDetailsFromUrlObject,\n getSpanStatusFromHttpCode,\n LRUMap,\n parseStringToURLObject,\n SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n startInactiveSpan,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { INSTRUMENTATION_NAME } from './constants';\nimport {\n addRequestBreadcrumb,\n addTracePropagationHeadersToOutgoingRequest,\n getClientRequestUrl,\n getRequestOptions,\n} from './outgoing-requests';\n\ntype Http = typeof http;\ntype Https = typeof https;\ntype IncomingHttpHeaders = http.IncomingHttpHeaders;\ntype OutgoingHttpHeaders = http.OutgoingHttpHeaders;\n\nexport type SentryHttpInstrumentationOptions = InstrumentationConfig & {\n /**\n * Whether breadcrumbs should be recorded for outgoing requests.\n *\n * @default `true`\n */\n breadcrumbs?: boolean;\n\n /**\n * Whether to propagate Sentry trace headers in outgoing requests.\n * By default this is done by the HttpInstrumentation, but if that is not added (e.g. because tracing is disabled)\n * then this instrumentation can take over.\n *\n * @default `false`\n */\n propagateTraceInOutgoingRequests?: boolean;\n\n /**\n * Whether to enable the capability to create spans for outgoing requests via diagnostic channels.\n * If enabled, spans will only be created if the `spans` option is also enabled (default: true).\n *\n * This is a feature flag that should be enabled by SDKs when the runtime supports it (Node 22.12+).\n * Individual users should not need to configure this directly.\n *\n * @default `false`\n */\n createSpansForOutgoingRequests?: boolean;\n\n /**\n * Whether to create spans for outgoing requests (user preference).\n * This only takes effect if `createSpansForOutgoingRequests` is also enabled.\n * If `createSpansForOutgoingRequests` is not enabled, this option is ignored.\n *\n * @default `true`\n */\n spans?: boolean;\n\n /**\n * Do not capture breadcrumbs for outgoing HTTP requests to URLs where the given callback returns `true`.\n * For the scope of this instrumentation, this callback only controls breadcrumb creation.\n * The same option can be passed to the top-level httpIntegration where it controls both, breadcrumb and\n * span creation.\n *\n * @param url Contains the entire URL, including query string (if any), protocol, host, etc. of the outgoing request.\n * @param request Contains the {@type RequestOptions} object used to make the outgoing request.\n */\n ignoreOutgoingRequests?: (url: string, request: http.RequestOptions) => boolean;\n\n /**\n * Hooks for outgoing request spans, called when `createSpansForOutgoingRequests` is enabled.\n * These mirror the OTEL HttpInstrumentation hooks for backwards compatibility.\n */\n outgoingRequestHook?: (span: Span, request: http.ClientRequest) => void;\n outgoingResponseHook?: (span: Span, response: http.IncomingMessage) => void;\n outgoingRequestApplyCustomAttributes?: (\n span: Span,\n request: http.ClientRequest,\n response: http.IncomingMessage,\n ) => void;\n\n // All options below do not do anything anymore in this instrumentation, and will be removed in the future.\n // They are only kept here for backwards compatibility - the respective functionality is now handled by the httpServerIntegration/httpServerSpansIntegration.\n\n /**\n * @depreacted This no longer does anything.\n */\n extractIncomingTraceFromHeader?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreStaticAssets?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n disableIncomingRequestSpans?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreSpansForIncomingRequests?: (urlPath: string, request: http.IncomingMessage) => boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n ignoreIncomingRequestBody?: (url: string, request: http.RequestOptions) => boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n maxIncomingRequestBodySize?: 'none' | 'small' | 'medium' | 'always';\n\n /**\n * @deprecated This no longer does anything.\n */\n trackIncomingRequestsAsSessions?: boolean;\n\n /**\n * @deprecated This no longer does anything.\n */\n instrumentation?: {\n requestHook?: (span: Span, req: http.ClientRequest | http.IncomingMessage) => void;\n responseHook?: (span: Span, response: http.IncomingMessage | http.ServerResponse) => void;\n applyCustomAttributesOnSpan?: (\n span: Span,\n request: http.ClientRequest | http.IncomingMessage,\n response: http.IncomingMessage | http.ServerResponse,\n ) => void;\n };\n\n /**\n * @deprecated This no longer does anything.\n */\n sessionFlushingDelayMS?: number;\n};\n\n/**\n * This custom HTTP instrumentation handles outgoing HTTP requests.\n *\n * It provides:\n * - Breadcrumbs for all outgoing requests\n * - Trace propagation headers (when enabled)\n * - Span creation for outgoing requests (when createSpansForOutgoingRequests is enabled)\n *\n * Span creation requires Node 22+ and uses diagnostic channels to avoid monkey-patching.\n * By default, this is only enabled in the node SDK, not in node-core or other runtime SDKs.\n *\n * Important note: Contrary to other OTEL instrumentation, this one cannot be unwrapped.\n *\n * This is heavily inspired & adapted from:\n * https://github.com/open-telemetry/opentelemetry-js/blob/f8ab5592ddea5cba0a3b33bf8d74f27872c0367f/experimental/packages/opentelemetry-instrumentation-http/src/http.ts\n */\nexport class SentryHttpInstrumentation extends InstrumentationBase<SentryHttpInstrumentationOptions> {\n private _propagationDecisionMap: LRUMap<string, boolean>;\n private _ignoreOutgoingRequestsMap: WeakMap<http.ClientRequest, boolean>;\n\n public constructor(config: SentryHttpInstrumentationOptions = {}) {\n super(INSTRUMENTATION_NAME, SDK_VERSION, config);\n\n this._propagationDecisionMap = new LRUMap<string, boolean>(100);\n this._ignoreOutgoingRequestsMap = new WeakMap<http.ClientRequest, boolean>();\n }\n\n /** @inheritdoc */\n public init(): [InstrumentationNodeModuleDefinition, InstrumentationNodeModuleDefinition] {\n // We register handlers when either http or https is instrumented\n // but we only want to register them once, whichever is loaded first\n let hasRegisteredHandlers = false;\n\n const onHttpClientResponseFinish = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest; response: http.IncomingMessage };\n this._onOutgoingRequestFinish(data.request, data.response);\n }) satisfies ChannelListener;\n\n const onHttpClientRequestError = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest };\n this._onOutgoingRequestFinish(data.request, undefined);\n }) satisfies ChannelListener;\n\n const onHttpClientRequestCreated = ((_data: unknown) => {\n const data = _data as { request: http.ClientRequest };\n this._onOutgoingRequestCreated(data.request);\n }) satisfies ChannelListener;\n\n const wrap = <T extends Http | Https>(moduleExports: T): T => {\n if (hasRegisteredHandlers) {\n return moduleExports;\n }\n\n hasRegisteredHandlers = true;\n\n subscribe('http.client.response.finish', onHttpClientResponseFinish);\n\n // When an error happens, we still want to have a breadcrumb\n // In this case, `http.client.response.finish` is not triggered\n subscribe('http.client.request.error', onHttpClientRequestError);\n\n // NOTE: This channel only exists since Node 22.12+\n // Before that, outgoing requests are not patched\n // and trace headers are not propagated, sadly.\n if (this.getConfig().propagateTraceInOutgoingRequests || this.getConfig().createSpansForOutgoingRequests) {\n subscribe('http.client.request.created', onHttpClientRequestCreated);\n }\n return moduleExports;\n };\n\n const unwrap = (): void => {\n unsubscribe('http.client.response.finish', onHttpClientResponseFinish);\n unsubscribe('http.client.request.error', onHttpClientRequestError);\n unsubscribe('http.client.request.created', onHttpClientRequestCreated);\n };\n\n /**\n * You may be wondering why we register these diagnostics-channel listeners\n * in such a convoluted way (as InstrumentationNodeModuleDefinition...)˝,\n * instead of simply subscribing to the events once in here.\n * The reason for this is timing semantics: These functions are called once the http or https module is loaded.\n * If we'd subscribe before that, there seem to be conflicts with the OTEL native instrumentation in some scenarios,\n * especially the \"import-on-top\" pattern of setting up ESM applications.\n */\n return [\n new InstrumentationNodeModuleDefinition('http', ['*'], wrap, unwrap),\n new InstrumentationNodeModuleDefinition('https', ['*'], wrap, unwrap),\n ];\n }\n\n /**\n * Start a span for an outgoing request.\n * The span wraps the callback of the request, and ends when the response is finished.\n */\n private _startSpanForOutgoingRequest(request: http.ClientRequest): Span {\n // We monkey-patch `req.once('response'), which is used to trigger the callback of the request\n // eslint-disable-next-line @typescript-eslint/unbound-method, deprecation/deprecation\n const originalOnce = request.once;\n\n const [name, attributes] = _getOutgoingRequestSpanData(request);\n\n const span = startInactiveSpan({\n name,\n attributes,\n onlyIfParent: true,\n });\n\n this.getConfig().outgoingRequestHook?.(span, request);\n\n const newOnce = new Proxy(originalOnce, {\n apply(target, thisArg, args: Parameters<typeof originalOnce>) {\n const [event] = args;\n if (event !== 'response') {\n return target.apply(thisArg, args);\n }\n\n const parentContext = context.active();\n const requestContext = trace.setSpan(parentContext, span);\n\n return context.with(requestContext, () => {\n return target.apply(thisArg, args);\n });\n },\n });\n\n // eslint-disable-next-line deprecation/deprecation\n request.once = newOnce;\n\n /**\n * Determines if the request has errored or the response has ended/errored.\n */\n let responseFinished = false;\n\n const endSpan = (status: SpanStatus): void => {\n if (responseFinished) {\n return;\n }\n responseFinished = true;\n\n span.setStatus(status);\n span.end();\n };\n\n request.prependListener('response', response => {\n if (request.listenerCount('response') <= 1) {\n response.resume();\n }\n\n context.bind(context.active(), response);\n\n const additionalAttributes = _getOutgoingRequestEndedSpanData(response);\n span.setAttributes(additionalAttributes);\n\n this.getConfig().outgoingResponseHook?.(span, response);\n this.getConfig().outgoingRequestApplyCustomAttributes?.(span, request, response);\n\n const endHandler = (forceError: boolean = false): void => {\n this._diag.debug('outgoingRequest on end()');\n\n const status =\n // eslint-disable-next-line deprecation/deprecation\n forceError || typeof response.statusCode !== 'number' || (response.aborted && !response.complete)\n ? { code: SpanStatusCode.ERROR }\n : getSpanStatusFromHttpCode(response.statusCode);\n\n endSpan(status);\n };\n\n response.on('end', () => {\n endHandler();\n });\n response.on(errorMonitor, error => {\n this._diag.debug('outgoingRequest on response error()', error);\n endHandler(true);\n });\n });\n\n // Fallback if proper response end handling above fails\n request.on('close', () => {\n endSpan({ code: SpanStatusCode.UNSET });\n });\n request.on(errorMonitor, error => {\n this._diag.debug('outgoingRequest on request error()', error);\n endSpan({ code: SpanStatusCode.ERROR });\n });\n\n return span;\n }\n\n /**\n * This is triggered when an outgoing request finishes.\n * It has access to the final request and response objects.\n */\n private _onOutgoingRequestFinish(request: http.ClientRequest, response?: http.IncomingMessage): void {\n DEBUG_BUILD && debug.log(INSTRUMENTATION_NAME, 'Handling finished outgoing request');\n\n const _breadcrumbs = this.getConfig().breadcrumbs;\n const breadCrumbsEnabled = typeof _breadcrumbs === 'undefined' ? true : _breadcrumbs;\n\n // Note: We cannot rely on the map being set by `_onOutgoingRequestCreated`, because that is not run in Node <22\n const shouldIgnore = this._ignoreOutgoingRequestsMap.get(request) ?? this._shouldIgnoreOutgoingRequest(request);\n this._ignoreOutgoingRequestsMap.set(request, shouldIgnore);\n\n if (breadCrumbsEnabled && !shouldIgnore) {\n addRequestBreadcrumb(request, response);\n }\n }\n\n /**\n * This is triggered when an outgoing request is created.\n * It creates a span (if enabled) and propagates trace headers within the span's context,\n * so downstream services link to the outgoing HTTP span rather than its parent.\n */\n private _onOutgoingRequestCreated(request: http.ClientRequest): void {\n DEBUG_BUILD && debug.log(INSTRUMENTATION_NAME, 'Handling outgoing request created');\n\n const shouldIgnore = this._ignoreOutgoingRequestsMap.get(request) ?? this._shouldIgnoreOutgoingRequest(request);\n this._ignoreOutgoingRequestsMap.set(request, shouldIgnore);\n\n if (shouldIgnore) {\n return;\n }\n\n const shouldCreateSpan = this.getConfig().createSpansForOutgoingRequests && (this.getConfig().spans ?? true);\n const shouldPropagate = this.getConfig().propagateTraceInOutgoingRequests;\n\n if (shouldCreateSpan) {\n const span = this._startSpanForOutgoingRequest(request);\n\n // Propagate headers within the span's context so the sentry-trace header\n // contains the outgoing span's ID, not the parent span's ID.\n // Only do this if the span is recording (has a parent) - otherwise the non-recording\n // span would produce all-zero trace IDs instead of using the scope's propagation context.\n if (shouldPropagate && span.isRecording()) {\n const requestContext = trace.setSpan(context.active(), span);\n context.with(requestContext, () => {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n });\n } else if (shouldPropagate) {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n }\n } else if (shouldPropagate) {\n addTracePropagationHeadersToOutgoingRequest(request, this._propagationDecisionMap);\n }\n }\n\n /**\n * Check if the given outgoing request should be ignored.\n */\n private _shouldIgnoreOutgoingRequest(request: http.ClientRequest): boolean {\n if (isTracingSuppressed(context.active())) {\n return true;\n }\n\n const ignoreOutgoingRequests = this.getConfig().ignoreOutgoingRequests;\n\n if (!ignoreOutgoingRequests) {\n return false;\n }\n\n const options = getRequestOptions(request);\n const url = getClientRequestUrl(request);\n return ignoreOutgoingRequests(url, options);\n }\n}\n\nfunction _getOutgoingRequestSpanData(request: http.ClientRequest): [string, SpanAttributes] {\n const url = getClientRequestUrl(request);\n\n const [name, attributes] = getHttpSpanDetailsFromUrlObject(\n parseStringToURLObject(url),\n 'client',\n 'auto.http.otel.http',\n request,\n );\n\n const userAgent = request.getHeader('user-agent');\n\n return [\n name,\n {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.client',\n 'otel.kind': 'CLIENT',\n [ATTR_USER_AGENT_ORIGINAL]: userAgent,\n [ATTR_URL_FULL]: url,\n 'http.url': url,\n 'http.method': request.method,\n 'http.target': request.path || '/',\n 'net.peer.name': request.host,\n 'http.host': request.getHeader('host'),\n ...attributes,\n },\n ];\n}\n\n/**\n * Exported for testing purposes.\n */\nexport function _getOutgoingRequestEndedSpanData(response: http.IncomingMessage): SpanAttributes {\n const { statusCode, statusMessage, httpVersion, socket } = response;\n\n // httpVersion can be undefined in some cases and we seem to have encountered this before:\n // https://github.com/getsentry/sentry-javascript/blob/ec8c8c64cde6001123db0199a8ca017b8863eac8/packages/node-core/src/integrations/http/httpServerSpansIntegration.ts#L158\n // see: #20415\n const transport = httpVersion?.toUpperCase() !== 'QUIC' ? 'ip_tcp' : 'ip_udp';\n\n const additionalAttributes: SpanAttributes = {\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: statusCode,\n [ATTR_NETWORK_PROTOCOL_VERSION]: httpVersion,\n 'http.flavor': httpVersion,\n [ATTR_NETWORK_TRANSPORT]: transport,\n 'net.transport': transport,\n ['http.status_text']: statusMessage?.toUpperCase(),\n 'http.status_code': statusCode,\n ...getResponseContentLengthAttributes(response),\n };\n\n if (socket) {\n const { remoteAddress, remotePort } = socket;\n\n additionalAttributes[ATTR_NETWORK_PEER_ADDRESS] = remoteAddress;\n additionalAttributes[ATTR_NETWORK_PEER_PORT] = remotePort;\n additionalAttributes['net.peer.ip'] = remoteAddress;\n additionalAttributes['net.peer.port'] = remotePort;\n }\n\n return additionalAttributes;\n}\n\nfunction getResponseContentLengthAttributes(response: http.IncomingMessage): SpanAttributes {\n const length = getContentLength(response.headers);\n if (length == null) {\n return {};\n }\n\n if (isCompressed(response.headers)) {\n // eslint-disable-next-line deprecation/deprecation\n return { [SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH]: length };\n } else {\n // eslint-disable-next-line deprecation/deprecation\n return { [SEMATTRS_HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED]: length };\n }\n}\n\nfunction getContentLength(headers: http.OutgoingHttpHeaders | http.IncomingHttpHeaders): number | undefined {\n const contentLengthHeader = headers['content-length'];\n if (typeof contentLengthHeader === 'number') {\n return contentLengthHeader;\n }\n if (typeof contentLengthHeader !== 'string') {\n return undefined;\n }\n\n const contentLength = parseInt(contentLengthHeader, 10);\n if (isNaN(contentLength)) {\n return undefined;\n }\n\n return contentLength;\n}\n\nfunction isCompressed(headers: OutgoingHttpHeaders | IncomingHttpHeaders): boolean {\n const encoding = headers['content-encoding'];\n\n return !!encoding && encoding !== 'identity';\n}\n"],"names":[],"mappings":"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"}

@@ -7,3 +7,3 @@ import { Worker } from 'node:worker_threads';

// This string is a placeholder that gets overwritten with the worker code.
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjUwLjAtYWxwaGEuMCAoOWM1MjA0NCkgfCBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0ICovCmltcG9ydHtTZXNzaW9uIGFzIGV9ZnJvbSJub2RlOmluc3BlY3Rvci9wcm9taXNlcyI7aW1wb3J0e3dvcmtlckRhdGEgYXMgdH1mcm9tIm5vZGU6d29ya2VyX3RocmVhZHMiO2NvbnN0IG49Z2xvYmFsVGhpcyxpPXt9O2NvbnN0IG89Il9fU0VOVFJZX0VSUk9SX0xPQ0FMX1ZBUklBQkxFU19fIjtjb25zdCBhPXQ7ZnVuY3Rpb24gcyguLi5lKXthLmRlYnVnJiZmdW5jdGlvbihlKXtpZighKCJjb25zb2xlImluIG4pKXJldHVybiBlKCk7Y29uc3QgdD1uLmNvbnNvbGUsbz17fSxhPU9iamVjdC5rZXlzKGkpO2EuZm9yRWFjaChlPT57Y29uc3Qgbj1pW2VdO29bZV09dFtlXSx0W2VdPW59KTt0cnl7cmV0dXJuIGUoKX1maW5hbGx5e2EuZm9yRWFjaChlPT57dFtlXT1vW2VdfSl9fSgoKT0+Y29uc29sZS5sb2coIltMb2NhbFZhcmlhYmxlcyBXb3JrZXJdIiwuLi5lKSl9YXN5bmMgZnVuY3Rpb24gYyhlLHQsbixpKXtjb25zdCBvPWF3YWl0IGUucG9zdCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIix7b2JqZWN0SWQ6dCxvd25Qcm9wZXJ0aWVzOiEwfSk7aVtuXT1vLnJlc3VsdC5maWx0ZXIoZT0+Imxlbmd0aCIhPT1lLm5hbWUmJiFpc05hTihwYXJzZUludChlLm5hbWUsMTApKSkuc29ydCgoZSx0KT0+cGFyc2VJbnQoZS5uYW1lLDEwKS1wYXJzZUludCh0Lm5hbWUsMTApKS5tYXAoZT0+ZS52YWx1ZT8udmFsdWUpfWFzeW5jIGZ1bmN0aW9uIHIoZSx0LG4saSl7Y29uc3Qgbz1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOnQsb3duUHJvcGVydGllczohMH0pO2lbbl09by5yZXN1bHQubWFwKGU9PltlLm5hbWUsZS52YWx1ZT8udmFsdWVdKS5yZWR1Y2UoKGUsW3Qsbl0pPT4oZVt0XT1uLGUpLHt9KX1mdW5jdGlvbiB1KGUsdCl7ZS52YWx1ZSYmKCJ2YWx1ZSJpbiBlLnZhbHVlP3ZvaWQgMD09PWUudmFsdWUudmFsdWV8fG51bGw9PT1lLnZhbHVlLnZhbHVlP3RbZS5uYW1lXT1gPCR7ZS52YWx1ZS52YWx1ZX0+YDp0W2UubmFtZV09ZS52YWx1ZS52YWx1ZToiZGVzY3JpcHRpb24iaW4gZS52YWx1ZSYmImZ1bmN0aW9uIiE9PWUudmFsdWUudHlwZT90W2UubmFtZV09YDwke2UudmFsdWUuZGVzY3JpcHRpb259PmA6InVuZGVmaW5lZCI9PT1lLnZhbHVlLnR5cGUmJih0W2UubmFtZV09Ijx1bmRlZmluZWQ+IikpfWFzeW5jIGZ1bmN0aW9uIGwoZSx0KXtjb25zdCBuPWF3YWl0IGUucG9zdCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIix7b2JqZWN0SWQ6dCxvd25Qcm9wZXJ0aWVzOiEwfSksaT17fTtmb3IoY29uc3QgdCBvZiBuLnJlc3VsdClpZih0LnZhbHVlPy5vYmplY3RJZCYmIkFycmF5Ij09PXQudmFsdWUuY2xhc3NOYW1lKXtjb25zdCBuPXQudmFsdWUub2JqZWN0SWQ7YXdhaXQgYyhlLG4sdC5uYW1lLGkpfWVsc2UgaWYodC52YWx1ZT8ub2JqZWN0SWQmJiJPYmplY3QiPT09dC52YWx1ZS5jbGFzc05hbWUpe2NvbnN0IG49dC52YWx1ZS5vYmplY3RJZDthd2FpdCByKGUsbix0Lm5hbWUsaSl9ZWxzZSB0LnZhbHVlJiZ1KHQsaSk7cmV0dXJuIGl9bGV0IGY7KGFzeW5jIGZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgZTt0LmNvbm5lY3RUb01haW5UaHJlYWQoKSxzKCJDb25uZWN0ZWQgdG8gbWFpbiB0aHJlYWQiKTtsZXQgbj0hMTt0Lm9uKCJEZWJ1Z2dlci5yZXN1bWVkIiwoKT0+e249ITF9KSx0Lm9uKCJEZWJ1Z2dlci5wYXVzZWQiLGU9PntuPSEwLGFzeW5jIGZ1bmN0aW9uKGUse3JlYXNvbjp0LGRhdGE6e29iamVjdElkOm59LGNhbGxGcmFtZXM6aX0pe2lmKCJleGNlcHRpb24iIT09dCYmInByb21pc2VSZWplY3Rpb24iIT09dClyZXR1cm47aWYoZj8uKCksbnVsbD09bilyZXR1cm47Y29uc3QgYT1bXTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7Y29uc3R7c2NvcGVDaGFpbjpuLGZ1bmN0aW9uTmFtZTpvLHRoaXM6c309aVt0XSxjPW4uZmluZChlPT4ibG9jYWwiPT09ZS50eXBlKSxyPSJnbG9iYWwiIT09cy5jbGFzc05hbWUmJnMuY2xhc3NOYW1lP2Ake3MuY2xhc3NOYW1lfS4ke299YDpvO2lmKHZvaWQgMD09PWM/Lm9iamVjdC5vYmplY3RJZClhW3RdPXtmdW5jdGlvbjpyfTtlbHNle2NvbnN0IG49YXdhaXQgbChlLGMub2JqZWN0Lm9iamVjdElkKTthW3RdPXtmdW5jdGlvbjpyLHZhcnM6bn19fWF3YWl0IGUucG9zdCgiUnVudGltZS5jYWxsRnVuY3Rpb25PbiIse2Z1bmN0aW9uRGVjbGFyYXRpb246YGZ1bmN0aW9uKCkgeyB0aGlzLiR7b30gPSB0aGlzLiR7b30gfHwgJHtKU09OLnN0cmluZ2lmeShhKX07IH1gLHNpbGVudDohMCxvYmplY3RJZDpufSksYXdhaXQgZS5wb3N0KCJSdW50aW1lLnJlbGVhc2VPYmplY3QiLHtvYmplY3RJZDpufSl9KHQsZS5wYXJhbXMpLnRoZW4oYXN5bmMoKT0+e24mJmF3YWl0IHQucG9zdCgiRGVidWdnZXIucmVzdW1lIil9LGFzeW5jIGU9PntuJiZhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpfSl9KSxhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLmVuYWJsZSIpO2NvbnN0IGk9ITEhPT1hLmNhcHR1cmVBbGxFeGNlcHRpb25zO2lmKGF3YWl0IHQucG9zdCgiRGVidWdnZXIuc2V0UGF1c2VPbkV4Y2VwdGlvbnMiLHtzdGF0ZTppPyJhbGwiOiJ1bmNhdWdodCJ9KSxpKXtjb25zdCBlPWEubWF4RXhjZXB0aW9uc1BlclNlY29uZHx8NTA7Zj1mdW5jdGlvbihlLHQsbil7bGV0IGk9MCxvPTUsYT0wO3JldHVybiBzZXRJbnRlcnZhbCgoKT0+ezA9PT1hP2k+ZSYmKG8qPTIsbihvKSxvPjg2NDAwJiYobz04NjQwMCksYT1vKTooYS09MSwwPT09YSYmdCgpKSxpPTB9LDFlMykudW5yZWYoKSwoKT0+e2krPTF9fShlLGFzeW5jKCk9PntzKCJSYXRlLWxpbWl0IGxpZnRlZC4iKSxhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6ImFsbCJ9KX0sYXN5bmMgZT0+e3MoYFJhdGUtbGltaXQgZXhjZWVkZWQuIERpc2FibGluZyBjYXB0dXJpbmcgb2YgY2F1Z2h0IGV4Y2VwdGlvbnMgZm9yICR7ZX0gc2Vjb25kcy5gKSxhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6InVuY2F1Z2h0In0pfSl9fSkoKS5jYXRjaChlPT57cygiRmFpbGVkIHRvIHN0YXJ0IGRlYnVnZ2VyIixlKX0pLHNldEludGVydmFsKCgpPT57fSwxZTQpOw==';
const base64WorkerScript = 'LyohIEBzZW50cnkvbm9kZS1jb3JlIDEwLjUwLjAgKDc4NWU3NTYpIHwgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdCAqLwppbXBvcnR7U2Vzc2lvbiBhcyBlfWZyb20ibm9kZTppbnNwZWN0b3IvcHJvbWlzZXMiO2ltcG9ydHt3b3JrZXJEYXRhIGFzIHR9ZnJvbSJub2RlOndvcmtlcl90aHJlYWRzIjtjb25zdCBuPWdsb2JhbFRoaXMsaT17fTtjb25zdCBvPSJfX1NFTlRSWV9FUlJPUl9MT0NBTF9WQVJJQUJMRVNfXyI7Y29uc3QgYT10O2Z1bmN0aW9uIHMoLi4uZSl7YS5kZWJ1ZyYmZnVuY3Rpb24oZSl7aWYoISgiY29uc29sZSJpbiBuKSlyZXR1cm4gZSgpO2NvbnN0IHQ9bi5jb25zb2xlLG89e30sYT1PYmplY3Qua2V5cyhpKTthLmZvckVhY2goZT0+e2NvbnN0IG49aVtlXTtvW2VdPXRbZV0sdFtlXT1ufSk7dHJ5e3JldHVybiBlKCl9ZmluYWxseXthLmZvckVhY2goZT0+e3RbZV09b1tlXX0pfX0oKCk9PmNvbnNvbGUubG9nKCJbTG9jYWxWYXJpYWJsZXMgV29ya2VyXSIsLi4uZSkpfWFzeW5jIGZ1bmN0aW9uIGMoZSx0LG4saSl7Y29uc3Qgbz1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOnQsb3duUHJvcGVydGllczohMH0pO2lbbl09by5yZXN1bHQuZmlsdGVyKGU9PiJsZW5ndGgiIT09ZS5uYW1lJiYhaXNOYU4ocGFyc2VJbnQoZS5uYW1lLDEwKSkpLnNvcnQoKGUsdCk9PnBhcnNlSW50KGUubmFtZSwxMCktcGFyc2VJbnQodC5uYW1lLDEwKSkubWFwKGU9PmUudmFsdWU/LnZhbHVlKX1hc3luYyBmdW5jdGlvbiByKGUsdCxuLGkpe2NvbnN0IG89YXdhaXQgZS5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLHtvYmplY3RJZDp0LG93blByb3BlcnRpZXM6ITB9KTtpW25dPW8ucmVzdWx0Lm1hcChlPT5bZS5uYW1lLGUudmFsdWU/LnZhbHVlXSkucmVkdWNlKChlLFt0LG5dKT0+KGVbdF09bixlKSx7fSl9ZnVuY3Rpb24gdShlLHQpe2UudmFsdWUmJigidmFsdWUiaW4gZS52YWx1ZT92b2lkIDA9PT1lLnZhbHVlLnZhbHVlfHxudWxsPT09ZS52YWx1ZS52YWx1ZT90W2UubmFtZV09YDwke2UudmFsdWUudmFsdWV9PmA6dFtlLm5hbWVdPWUudmFsdWUudmFsdWU6ImRlc2NyaXB0aW9uImluIGUudmFsdWUmJiJmdW5jdGlvbiIhPT1lLnZhbHVlLnR5cGU/dFtlLm5hbWVdPWA8JHtlLnZhbHVlLmRlc2NyaXB0aW9ufT5gOiJ1bmRlZmluZWQiPT09ZS52YWx1ZS50eXBlJiYodFtlLm5hbWVdPSI8dW5kZWZpbmVkPiIpKX1hc3luYyBmdW5jdGlvbiBsKGUsdCl7Y29uc3Qgbj1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuZ2V0UHJvcGVydGllcyIse29iamVjdElkOnQsb3duUHJvcGVydGllczohMH0pLGk9e307Zm9yKGNvbnN0IHQgb2Ygbi5yZXN1bHQpaWYodC52YWx1ZT8ub2JqZWN0SWQmJiJBcnJheSI9PT10LnZhbHVlLmNsYXNzTmFtZSl7Y29uc3Qgbj10LnZhbHVlLm9iamVjdElkO2F3YWl0IGMoZSxuLHQubmFtZSxpKX1lbHNlIGlmKHQudmFsdWU/Lm9iamVjdElkJiYiT2JqZWN0Ij09PXQudmFsdWUuY2xhc3NOYW1lKXtjb25zdCBuPXQudmFsdWUub2JqZWN0SWQ7YXdhaXQgcihlLG4sdC5uYW1lLGkpfWVsc2UgdC52YWx1ZSYmdSh0LGkpO3JldHVybiBpfWxldCBmOyhhc3luYyBmdW5jdGlvbigpe2NvbnN0IHQ9bmV3IGU7dC5jb25uZWN0VG9NYWluVGhyZWFkKCkscygiQ29ubmVjdGVkIHRvIG1haW4gdGhyZWFkIik7bGV0IG49ITE7dC5vbigiRGVidWdnZXIucmVzdW1lZCIsKCk9PntuPSExfSksdC5vbigiRGVidWdnZXIucGF1c2VkIixlPT57bj0hMCxhc3luYyBmdW5jdGlvbihlLHtyZWFzb246dCxkYXRhOntvYmplY3RJZDpufSxjYWxsRnJhbWVzOml9KXtpZigiZXhjZXB0aW9uIiE9PXQmJiJwcm9taXNlUmVqZWN0aW9uIiE9PXQpcmV0dXJuO2lmKGY/LigpLG51bGw9PW4pcmV0dXJuO2NvbnN0IGE9W107Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0e3Njb3BlQ2hhaW46bixmdW5jdGlvbk5hbWU6byx0aGlzOnN9PWlbdF0sYz1uLmZpbmQoZT0+ImxvY2FsIj09PWUudHlwZSkscj0iZ2xvYmFsIiE9PXMuY2xhc3NOYW1lJiZzLmNsYXNzTmFtZT9gJHtzLmNsYXNzTmFtZX0uJHtvfWA6bztpZih2b2lkIDA9PT1jPy5vYmplY3Qub2JqZWN0SWQpYVt0XT17ZnVuY3Rpb246cn07ZWxzZXtjb25zdCBuPWF3YWl0IGwoZSxjLm9iamVjdC5vYmplY3RJZCk7YVt0XT17ZnVuY3Rpb246cix2YXJzOm59fX1hd2FpdCBlLnBvc3QoIlJ1bnRpbWUuY2FsbEZ1bmN0aW9uT24iLHtmdW5jdGlvbkRlY2xhcmF0aW9uOmBmdW5jdGlvbigpIHsgdGhpcy4ke299ID0gdGhpcy4ke299IHx8ICR7SlNPTi5zdHJpbmdpZnkoYSl9OyB9YCxzaWxlbnQ6ITAsb2JqZWN0SWQ6bn0pLGF3YWl0IGUucG9zdCgiUnVudGltZS5yZWxlYXNlT2JqZWN0Iix7b2JqZWN0SWQ6bn0pfSh0LGUucGFyYW1zKS50aGVuKGFzeW5jKCk9PntuJiZhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnJlc3VtZSIpfSxhc3luYyBlPT57biYmYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5yZXN1bWUiKX0pfSksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5lbmFibGUiKTtjb25zdCBpPSExIT09YS5jYXB0dXJlQWxsRXhjZXB0aW9ucztpZihhd2FpdCB0LnBvc3QoIkRlYnVnZ2VyLnNldFBhdXNlT25FeGNlcHRpb25zIix7c3RhdGU6aT8iYWxsIjoidW5jYXVnaHQifSksaSl7Y29uc3QgZT1hLm1heEV4Y2VwdGlvbnNQZXJTZWNvbmR8fDUwO2Y9ZnVuY3Rpb24oZSx0LG4pe2xldCBpPTAsbz01LGE9MDtyZXR1cm4gc2V0SW50ZXJ2YWwoKCk9PnswPT09YT9pPmUmJihvKj0yLG4obyksbz44NjQwMCYmKG89ODY0MDApLGE9byk6KGEtPTEsMD09PWEmJnQoKSksaT0wfSwxZTMpLnVucmVmKCksKCk9PntpKz0xfX0oZSxhc3luYygpPT57cygiUmF0ZS1saW1pdCBsaWZ0ZWQuIiksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOiJhbGwifSl9LGFzeW5jIGU9PntzKGBSYXRlLWxpbWl0IGV4Y2VlZGVkLiBEaXNhYmxpbmcgY2FwdHVyaW5nIG9mIGNhdWdodCBleGNlcHRpb25zIGZvciAke2V9IHNlY29uZHMuYCksYXdhaXQgdC5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIse3N0YXRlOiJ1bmNhdWdodCJ9KX0pfX0pKCkuY2F0Y2goZT0+e3MoIkZhaWxlZCB0byBzdGFydCBkZWJ1Z2dlciIsZSl9KSxzZXRJbnRlcnZhbCgoKT0+e30sMWU0KTs=';

@@ -10,0 +10,0 @@ function log(...args) {

@@ -1,2 +0,2 @@

/*! @sentry/node-core 10.50.0-alpha.0 (9c52044) | https://github.com/getsentry/sentry-javascript */
/*! @sentry/node-core 10.50.0 (785e756) | https://github.com/getsentry/sentry-javascript */
import{Session as e}from"node:inspector/promises";import{workerData as t}from"node:worker_threads";const n=globalThis,i={};const o="__SENTRY_ERROR_LOCAL_VARIABLES__";const a=t;function s(...e){a.debug&&function(e){if(!("console"in n))return e();const t=n.console,o={},a=Object.keys(i);a.forEach(e=>{const n=i[e];o[e]=t[e],t[e]=n});try{return e()}finally{a.forEach(e=>{t[e]=o[e]})}}(()=>console.log("[LocalVariables Worker]",...e))}async function c(e,t,n,i){const o=await e.post("Runtime.getProperties",{objectId:t,ownProperties:!0});i[n]=o.result.filter(e=>"length"!==e.name&&!isNaN(parseInt(e.name,10))).sort((e,t)=>parseInt(e.name,10)-parseInt(t.name,10)).map(e=>e.value?.value)}async function r(e,t,n,i){const o=await e.post("Runtime.getProperties",{objectId:t,ownProperties:!0});i[n]=o.result.map(e=>[e.name,e.value?.value]).reduce((e,[t,n])=>(e[t]=n,e),{})}function u(e,t){e.value&&("value"in e.value?void 0===e.value.value||null===e.value.value?t[e.name]=`<${e.value.value}>`:t[e.name]=e.value.value:"description"in e.value&&"function"!==e.value.type?t[e.name]=`<${e.value.description}>`:"undefined"===e.value.type&&(t[e.name]="<undefined>"))}async function l(e,t){const n=await e.post("Runtime.getProperties",{objectId:t,ownProperties:!0}),i={};for(const t of n.result)if(t.value?.objectId&&"Array"===t.value.className){const n=t.value.objectId;await c(e,n,t.name,i)}else if(t.value?.objectId&&"Object"===t.value.className){const n=t.value.objectId;await r(e,n,t.name,i)}else t.value&&u(t,i);return i}let f;(async function(){const t=new e;t.connectToMainThread(),s("Connected to main thread");let n=!1;t.on("Debugger.resumed",()=>{n=!1}),t.on("Debugger.paused",e=>{n=!0,async function(e,{reason:t,data:{objectId:n},callFrames:i}){if("exception"!==t&&"promiseRejection"!==t)return;if(f?.(),null==n)return;const a=[];for(let t=0;t<i.length;t++){const{scopeChain:n,functionName:o,this:s}=i[t],c=n.find(e=>"local"===e.type),r="global"!==s.className&&s.className?`${s.className}.${o}`:o;if(void 0===c?.object.objectId)a[t]={function:r};else{const n=await l(e,c.object.objectId);a[t]={function:r,vars:n}}}await e.post("Runtime.callFunctionOn",{functionDeclaration:`function() { this.${o} = this.${o} || ${JSON.stringify(a)}; }`,silent:!0,objectId:n}),await e.post("Runtime.releaseObject",{objectId:n})}(t,e.params).then(async()=>{n&&await t.post("Debugger.resume")},async e=>{n&&await t.post("Debugger.resume")})}),await t.post("Debugger.enable");const i=!1!==a.captureAllExceptions;if(await t.post("Debugger.setPauseOnExceptions",{state:i?"all":"uncaught"}),i){const e=a.maxExceptionsPerSecond||50;f=function(e,t,n){let i=0,o=5,a=0;return setInterval(()=>{0===a?i>e&&(o*=2,n(o),o>86400&&(o=86400),a=o):(a-=1,0===a&&t()),i=0},1e3).unref(),()=>{i+=1}}(e,async()=>{s("Rate-limit lifted."),await t.post("Debugger.setPauseOnExceptions",{state:"all"})},async e=>{s(`Rate-limit exceeded. Disabling capturing of caught exceptions for ${e} seconds.`),await t.post("Debugger.setPauseOnExceptions",{state:"uncaught"})})}})().catch(e=>{s("Failed to start debugger",e)}),setInterval(()=>{},1e4);

@@ -20,2 +20,3 @@ export { LightNodeClient } from './client.js';

export { pinoIntegration } from '../integrations/pino.js';
export { consoleIntegration } from '../integrations/console.js';
export { defaultStackParser, getSentryRelease } from '../sdk/api.js';

@@ -31,3 +32,3 @@ export { createGetModuleFromFilename } from '../utils/module.js';

export { NODE_VERSION } from '../nodeVersion.js';
export { SDK_VERSION, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, Scope, addBreadcrumb, addEventProcessor, addIntegration, captureCheckIn, captureConsoleIntegration, captureEvent, captureException, captureFeedback, captureMessage, captureSession, close, consoleIntegration, consoleLoggingIntegration, continueTrace, createConsolaReporter, createTransport, dedupeIntegration, endSession, envToBool, eventFiltersIntegration, extraErrorDataIntegration, featureFlagsIntegration, flush, functionToStringIntegration, getActiveSpan, getClient, getCurrentScope, getGlobalScope, getIsolationScope, getRootSpan, getSpanDescendants, getSpanStatusFromHttpCode, getTraceData, getTraceMetaTags, instrumentSupabaseClient, isEnabled, isInitialized, lastEventId, linkedErrorsIntegration, metrics, parameterize, profiler, requestDataIntegration, rewriteFramesIntegration, setContext, setCurrentClient, setExtra, setExtras, setHttpStatus, setMeasurement, setTag, setTags, setUser, spanStreamingIntegration, spanToBaggageHeader, spanToJSON, spanToTraceHeader, startInactiveSpan, startNewTrace, startSession, startSpan, startSpanManual, supabaseIntegration, suppressTracing, trpcMiddleware, updateSpanName, withActiveSpan, withIsolationScope, withMonitor, withScope, withStreamedSpan, wrapMcpServerWithSentry, zodErrorsIntegration } from '@sentry/core';
export { SDK_VERSION, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, Scope, addBreadcrumb, addEventProcessor, addIntegration, captureCheckIn, captureConsoleIntegration, captureEvent, captureException, captureFeedback, captureMessage, captureSession, close, consoleLoggingIntegration, continueTrace, createConsolaReporter, createTransport, dedupeIntegration, endSession, envToBool, eventFiltersIntegration, extraErrorDataIntegration, featureFlagsIntegration, flush, functionToStringIntegration, getActiveSpan, getClient, getCurrentScope, getGlobalScope, getIsolationScope, getRootSpan, getSpanDescendants, getSpanStatusFromHttpCode, getTraceData, getTraceMetaTags, instrumentSupabaseClient, isEnabled, isInitialized, lastEventId, linkedErrorsIntegration, metrics, parameterize, profiler, requestDataIntegration, rewriteFramesIntegration, setContext, setCurrentClient, setExtra, setExtras, setHttpStatus, setMeasurement, setTag, setTags, setUser, spanStreamingIntegration, spanToBaggageHeader, spanToJSON, spanToTraceHeader, startInactiveSpan, startNewTrace, startSession, startSpan, startSpanManual, supabaseIntegration, suppressTracing, trpcMiddleware, updateSpanName, withActiveSpan, withIsolationScope, withMonitor, withScope, withStreamedSpan, wrapMcpServerWithSentry, zodErrorsIntegration } from '@sentry/core';
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}

@@ -1,2 +0,2 @@

import { eventFiltersIntegration, functionToStringIntegration, linkedErrorsIntegration, requestDataIntegration, consoleIntegration, debug, consoleSandbox, getCurrentScope, applySdkMetadata, envToBool, stackParserFromStackParserOptions, getIntegrationsToSetup, spanStreamingIntegration, propagationContextFromHeaders } from '@sentry/core';
import { eventFiltersIntegration, functionToStringIntegration, linkedErrorsIntegration, requestDataIntegration, debug, consoleSandbox, getCurrentScope, applySdkMetadata, envToBool, stackParserFromStackParserOptions, getIntegrationsToSetup, spanStreamingIntegration, propagationContextFromHeaders } from '@sentry/core';
import { DEBUG_BUILD } from '../debug-build.js';

@@ -12,2 +12,3 @@ import { childProcessIntegration } from '../integrations/childProcess.js';

import { INTEGRATION_NAME, spotlightIntegration } from '../integrations/spotlight.js';
import { consoleIntegration } from '../integrations/console.js';
import { systemErrorIntegration } from '../integrations/systemError.js';

@@ -14,0 +15,0 @@ import { defaultStackParser, getSentryRelease } from '../sdk/api.js';

@@ -1,1 +0,1 @@

{"version":3,"file":"sdk.js","sources":["../../../src/light/sdk.ts"],"sourcesContent":["import type { Integration, Options } from '@sentry/core';\nimport {\n applySdkMetadata,\n consoleIntegration,\n consoleSandbox,\n debug,\n envToBool,\n eventFiltersIntegration,\n functionToStringIntegration,\n getCurrentScope,\n getIntegrationsToSetup,\n linkedErrorsIntegration,\n propagationContextFromHeaders,\n requestDataIntegration,\n spanStreamingIntegration,\n stackParserFromStackParserOptions,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { childProcessIntegration } from '../integrations/childProcess';\nimport { nodeContextIntegration } from '../integrations/context';\nimport { contextLinesIntegration } from '../integrations/contextlines';\nimport { localVariablesIntegration } from '../integrations/local-variables';\nimport { modulesIntegration } from '../integrations/modules';\nimport { onUncaughtExceptionIntegration } from '../integrations/onuncaughtexception';\nimport { onUnhandledRejectionIntegration } from '../integrations/onunhandledrejection';\nimport { processSessionIntegration } from '../integrations/processSession';\nimport { INTEGRATION_NAME as SPOTLIGHT_INTEGRATION_NAME, spotlightIntegration } from '../integrations/spotlight';\nimport { systemErrorIntegration } from '../integrations/systemError';\nimport { defaultStackParser, getSentryRelease } from '../sdk/api';\nimport { makeNodeTransport } from '../transports';\nimport type { NodeClientOptions, NodeOptions } from '../types';\nimport { isCjs } from '../utils/detection';\nimport { getSpotlightConfig } from '../utils/spotlight';\nimport { setAsyncLocalStorageAsyncContextStrategy } from './asyncLocalStorageStrategy';\nimport { LightNodeClient } from './client';\nimport { httpIntegration } from './integrations/httpIntegration';\nimport { nativeNodeFetchIntegration } from './integrations/nativeNodeFetchIntegration';\n\n/**\n * Get default integrations for the Light Node-Core SDK.\n */\nexport function getDefaultIntegrations(): Integration[] {\n return [\n // Common\n eventFiltersIntegration(),\n functionToStringIntegration(),\n linkedErrorsIntegration(),\n requestDataIntegration(),\n systemErrorIntegration(),\n // Native Wrappers\n consoleIntegration(),\n httpIntegration(),\n nativeNodeFetchIntegration(),\n // Global Handlers\n onUncaughtExceptionIntegration(),\n onUnhandledRejectionIntegration(),\n // Event Info\n contextLinesIntegration(),\n localVariablesIntegration(),\n nodeContextIntegration(),\n childProcessIntegration(),\n processSessionIntegration(),\n modulesIntegration(),\n ];\n}\n\n/**\n * Initialize Sentry for Node in light mode (without OpenTelemetry).\n */\nexport function init(options: NodeOptions | undefined = {}): LightNodeClient | undefined {\n return _init(options, getDefaultIntegrations);\n}\n\n/**\n * Initialize Sentry for Node in light mode, without any integrations added by default.\n */\nexport function initWithoutDefaultIntegrations(options: NodeOptions | undefined = {}): LightNodeClient {\n return _init(options, () => []);\n}\n\n/**\n * Initialize Sentry for Node in light mode.\n */\nfunction _init(\n _options: NodeOptions | undefined = {},\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): LightNodeClient {\n const options = getClientOptions(_options, getDefaultIntegrationsImpl);\n\n if (options.debug === true) {\n if (DEBUG_BUILD) {\n debug.enable();\n } else {\n // use `console.warn` rather than `debug.warn` since by non-debug bundles have all `debug.x` statements stripped\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n });\n }\n }\n\n // Use AsyncLocalStorage-based context strategy instead of OpenTelemetry\n setAsyncLocalStorageAsyncContextStrategy();\n\n const scope = getCurrentScope();\n scope.update(options.initialScope);\n\n if (options.spotlight && !options.integrations.some(({ name }) => name === SPOTLIGHT_INTEGRATION_NAME)) {\n options.integrations.push(\n spotlightIntegration({\n sidecarUrl: typeof options.spotlight === 'string' ? options.spotlight : undefined,\n }),\n );\n }\n\n applySdkMetadata(options, 'node-light', ['node-core']);\n\n const client = new LightNodeClient(options);\n // The client is on the current scope, from where it generally is inherited\n getCurrentScope().setClient(client);\n\n client.init();\n\n debug.log(`SDK initialized from ${isCjs() ? 'CommonJS' : 'ESM'} (light mode)`);\n\n client.startClientReportTracking();\n\n updateScopeFromEnvVariables();\n\n // Ensure we flush events when vercel functions are ended\n // See: https://vercel.com/docs/functions/functions-api-reference#sigterm-signal\n if (process.env.VERCEL) {\n process.on('SIGTERM', async () => {\n // We have 500ms for processing here, so we try to make sure to have enough time to send the events\n await client.flush(200);\n });\n }\n\n return client;\n}\n\nfunction getClientOptions(\n options: NodeOptions,\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClientOptions {\n const release = getRelease(options.release);\n const spotlight = getSpotlightConfig(options.spotlight);\n const tracesSampleRate = getTracesSampleRate(options.tracesSampleRate);\n\n const mergedOptions = {\n ...options,\n dsn: options.dsn ?? process.env.SENTRY_DSN,\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT,\n sendClientReports: options.sendClientReports ?? true,\n transport: options.transport ?? makeNodeTransport,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n release,\n tracesSampleRate,\n spotlight,\n debug: envToBool(options.debug ?? process.env.SENTRY_DEBUG),\n };\n\n const integrations = options.integrations;\n const defaultIntegrations = options.defaultIntegrations ?? getDefaultIntegrationsImpl(mergedOptions);\n\n const resolvedIntegrations = getIntegrationsToSetup({\n defaultIntegrations,\n integrations,\n });\n\n if (mergedOptions.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) {\n resolvedIntegrations.push(spanStreamingIntegration());\n }\n\n return {\n ...mergedOptions,\n integrations: resolvedIntegrations,\n };\n}\n\nfunction getRelease(release: NodeOptions['release']): string | undefined {\n if (release !== undefined) {\n return release;\n }\n\n const detectedRelease = getSentryRelease();\n if (detectedRelease !== undefined) {\n return detectedRelease;\n }\n\n return undefined;\n}\n\nfunction getTracesSampleRate(tracesSampleRate: NodeOptions['tracesSampleRate']): number | undefined {\n if (tracesSampleRate !== undefined) {\n return tracesSampleRate;\n }\n\n const sampleRateFromEnv = process.env.SENTRY_TRACES_SAMPLE_RATE;\n if (!sampleRateFromEnv) {\n return undefined;\n }\n\n const parsed = parseFloat(sampleRateFromEnv);\n return isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Update scope and propagation context based on environmental variables.\n *\n * See https://github.com/getsentry/rfcs/blob/main/text/0071-continue-trace-over-process-boundaries.md\n * for more details.\n */\nfunction updateScopeFromEnvVariables(): void {\n if (envToBool(process.env.SENTRY_USE_ENVIRONMENT) !== false) {\n const sentryTraceEnv = process.env.SENTRY_TRACE;\n const baggageEnv = process.env.SENTRY_BAGGAGE;\n const propagationContext = propagationContextFromHeaders(sentryTraceEnv, baggageEnv);\n getCurrentScope().setPropagationContext(propagationContext);\n }\n}\n"],"names":["SPOTLIGHT_INTEGRATION_NAME"],"mappings":"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"}
{"version":3,"file":"sdk.js","sources":["../../../src/light/sdk.ts"],"sourcesContent":["import type { Integration, Options } from '@sentry/core';\nimport {\n applySdkMetadata,\n consoleSandbox,\n debug,\n envToBool,\n eventFiltersIntegration,\n functionToStringIntegration,\n getCurrentScope,\n getIntegrationsToSetup,\n linkedErrorsIntegration,\n propagationContextFromHeaders,\n requestDataIntegration,\n spanStreamingIntegration,\n stackParserFromStackParserOptions,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { childProcessIntegration } from '../integrations/childProcess';\nimport { nodeContextIntegration } from '../integrations/context';\nimport { contextLinesIntegration } from '../integrations/contextlines';\nimport { localVariablesIntegration } from '../integrations/local-variables';\nimport { modulesIntegration } from '../integrations/modules';\nimport { onUncaughtExceptionIntegration } from '../integrations/onuncaughtexception';\nimport { onUnhandledRejectionIntegration } from '../integrations/onunhandledrejection';\nimport { processSessionIntegration } from '../integrations/processSession';\nimport { INTEGRATION_NAME as SPOTLIGHT_INTEGRATION_NAME, spotlightIntegration } from '../integrations/spotlight';\nimport { consoleIntegration } from '../integrations/console';\nimport { systemErrorIntegration } from '../integrations/systemError';\nimport { defaultStackParser, getSentryRelease } from '../sdk/api';\nimport { makeNodeTransport } from '../transports';\nimport type { NodeClientOptions, NodeOptions } from '../types';\nimport { isCjs } from '../utils/detection';\nimport { getSpotlightConfig } from '../utils/spotlight';\nimport { setAsyncLocalStorageAsyncContextStrategy } from './asyncLocalStorageStrategy';\nimport { LightNodeClient } from './client';\nimport { httpIntegration } from './integrations/httpIntegration';\nimport { nativeNodeFetchIntegration } from './integrations/nativeNodeFetchIntegration';\n\n/**\n * Get default integrations for the Light Node-Core SDK.\n */\nexport function getDefaultIntegrations(): Integration[] {\n return [\n // Common\n eventFiltersIntegration(),\n functionToStringIntegration(),\n linkedErrorsIntegration(),\n requestDataIntegration(),\n systemErrorIntegration(),\n // Native Wrappers\n consoleIntegration(),\n httpIntegration(),\n nativeNodeFetchIntegration(),\n // Global Handlers\n onUncaughtExceptionIntegration(),\n onUnhandledRejectionIntegration(),\n // Event Info\n contextLinesIntegration(),\n localVariablesIntegration(),\n nodeContextIntegration(),\n childProcessIntegration(),\n processSessionIntegration(),\n modulesIntegration(),\n ];\n}\n\n/**\n * Initialize Sentry for Node in light mode (without OpenTelemetry).\n */\nexport function init(options: NodeOptions | undefined = {}): LightNodeClient | undefined {\n return _init(options, getDefaultIntegrations);\n}\n\n/**\n * Initialize Sentry for Node in light mode, without any integrations added by default.\n */\nexport function initWithoutDefaultIntegrations(options: NodeOptions | undefined = {}): LightNodeClient {\n return _init(options, () => []);\n}\n\n/**\n * Initialize Sentry for Node in light mode.\n */\nfunction _init(\n _options: NodeOptions | undefined = {},\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): LightNodeClient {\n const options = getClientOptions(_options, getDefaultIntegrationsImpl);\n\n if (options.debug === true) {\n if (DEBUG_BUILD) {\n debug.enable();\n } else {\n // use `console.warn` rather than `debug.warn` since by non-debug bundles have all `debug.x` statements stripped\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n });\n }\n }\n\n // Use AsyncLocalStorage-based context strategy instead of OpenTelemetry\n setAsyncLocalStorageAsyncContextStrategy();\n\n const scope = getCurrentScope();\n scope.update(options.initialScope);\n\n if (options.spotlight && !options.integrations.some(({ name }) => name === SPOTLIGHT_INTEGRATION_NAME)) {\n options.integrations.push(\n spotlightIntegration({\n sidecarUrl: typeof options.spotlight === 'string' ? options.spotlight : undefined,\n }),\n );\n }\n\n applySdkMetadata(options, 'node-light', ['node-core']);\n\n const client = new LightNodeClient(options);\n // The client is on the current scope, from where it generally is inherited\n getCurrentScope().setClient(client);\n\n client.init();\n\n debug.log(`SDK initialized from ${isCjs() ? 'CommonJS' : 'ESM'} (light mode)`);\n\n client.startClientReportTracking();\n\n updateScopeFromEnvVariables();\n\n // Ensure we flush events when vercel functions are ended\n // See: https://vercel.com/docs/functions/functions-api-reference#sigterm-signal\n if (process.env.VERCEL) {\n process.on('SIGTERM', async () => {\n // We have 500ms for processing here, so we try to make sure to have enough time to send the events\n await client.flush(200);\n });\n }\n\n return client;\n}\n\nfunction getClientOptions(\n options: NodeOptions,\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClientOptions {\n const release = getRelease(options.release);\n const spotlight = getSpotlightConfig(options.spotlight);\n const tracesSampleRate = getTracesSampleRate(options.tracesSampleRate);\n\n const mergedOptions = {\n ...options,\n dsn: options.dsn ?? process.env.SENTRY_DSN,\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT,\n sendClientReports: options.sendClientReports ?? true,\n transport: options.transport ?? makeNodeTransport,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n release,\n tracesSampleRate,\n spotlight,\n debug: envToBool(options.debug ?? process.env.SENTRY_DEBUG),\n };\n\n const integrations = options.integrations;\n const defaultIntegrations = options.defaultIntegrations ?? getDefaultIntegrationsImpl(mergedOptions);\n\n const resolvedIntegrations = getIntegrationsToSetup({\n defaultIntegrations,\n integrations,\n });\n\n if (mergedOptions.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) {\n resolvedIntegrations.push(spanStreamingIntegration());\n }\n\n return {\n ...mergedOptions,\n integrations: resolvedIntegrations,\n };\n}\n\nfunction getRelease(release: NodeOptions['release']): string | undefined {\n if (release !== undefined) {\n return release;\n }\n\n const detectedRelease = getSentryRelease();\n if (detectedRelease !== undefined) {\n return detectedRelease;\n }\n\n return undefined;\n}\n\nfunction getTracesSampleRate(tracesSampleRate: NodeOptions['tracesSampleRate']): number | undefined {\n if (tracesSampleRate !== undefined) {\n return tracesSampleRate;\n }\n\n const sampleRateFromEnv = process.env.SENTRY_TRACES_SAMPLE_RATE;\n if (!sampleRateFromEnv) {\n return undefined;\n }\n\n const parsed = parseFloat(sampleRateFromEnv);\n return isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Update scope and propagation context based on environmental variables.\n *\n * See https://github.com/getsentry/rfcs/blob/main/text/0071-continue-trace-over-process-boundaries.md\n * for more details.\n */\nfunction updateScopeFromEnvVariables(): void {\n if (envToBool(process.env.SENTRY_USE_ENVIRONMENT) !== false) {\n const sentryTraceEnv = process.env.SENTRY_TRACE;\n const baggageEnv = process.env.SENTRY_BAGGAGE;\n const propagationContext = propagationContextFromHeaders(sentryTraceEnv, baggageEnv);\n getCurrentScope().setPropagationContext(propagationContext);\n }\n}\n"],"names":["SPOTLIGHT_INTEGRATION_NAME"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"type":"module","version":"10.50.0-alpha.0","sideEffects":false}
{"type":"module","version":"10.50.0","sideEffects":false}

@@ -1,2 +0,2 @@

import { debug, consoleSandbox, getCurrentScope, applySdkMetadata, envToBool, stackParserFromStackParserOptions, getIntegrationsToSetup, spanStreamingIntegration, propagationContextFromHeaders, inboundFiltersIntegration, functionToStringIntegration, linkedErrorsIntegration, requestDataIntegration, conversationIdIntegration, consoleIntegration, hasSpansEnabled } from '@sentry/core';
import { debug, consoleSandbox, getCurrentScope, applySdkMetadata, envToBool, stackParserFromStackParserOptions, getIntegrationsToSetup, spanStreamingIntegration, propagationContextFromHeaders, inboundFiltersIntegration, functionToStringIntegration, linkedErrorsIntegration, requestDataIntegration, conversationIdIntegration, hasSpansEnabled } from '@sentry/core';
import { setOpenTelemetryContextAsyncContextStrategy, enhanceDscWithOpenTelemetryRootSpanName, setupEventContextTrace, openTelemetrySetupCheck } from '@sentry/opentelemetry';

@@ -15,2 +15,3 @@ import { DEBUG_BUILD } from '../debug-build.js';

import { INTEGRATION_NAME, spotlightIntegration } from '../integrations/spotlight.js';
import { consoleIntegration } from '../integrations/console.js';
import { systemErrorIntegration } from '../integrations/systemError.js';

@@ -17,0 +18,0 @@ import { makeNodeTransport } from '../transports/http.js';

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../../../src/sdk/index.ts"],"sourcesContent":["import type { Integration, Options } from '@sentry/core';\nimport {\n applySdkMetadata,\n consoleIntegration,\n consoleSandbox,\n conversationIdIntegration,\n debug,\n envToBool,\n functionToStringIntegration,\n getCurrentScope,\n getIntegrationsToSetup,\n hasSpansEnabled,\n inboundFiltersIntegration,\n linkedErrorsIntegration,\n propagationContextFromHeaders,\n requestDataIntegration,\n spanStreamingIntegration,\n stackParserFromStackParserOptions,\n} from '@sentry/core';\nimport {\n enhanceDscWithOpenTelemetryRootSpanName,\n openTelemetrySetupCheck,\n setOpenTelemetryContextAsyncContextStrategy,\n setupEventContextTrace,\n} from '@sentry/opentelemetry';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { childProcessIntegration } from '../integrations/childProcess';\nimport { nodeContextIntegration } from '../integrations/context';\nimport { contextLinesIntegration } from '../integrations/contextlines';\nimport { httpIntegration } from '../integrations/http';\nimport { localVariablesIntegration } from '../integrations/local-variables';\nimport { modulesIntegration } from '../integrations/modules';\nimport { nativeNodeFetchIntegration } from '../integrations/node-fetch';\nimport { onUncaughtExceptionIntegration } from '../integrations/onuncaughtexception';\nimport { onUnhandledRejectionIntegration } from '../integrations/onunhandledrejection';\nimport { processSessionIntegration } from '../integrations/processSession';\nimport { INTEGRATION_NAME as SPOTLIGHT_INTEGRATION_NAME, spotlightIntegration } from '../integrations/spotlight';\nimport { systemErrorIntegration } from '../integrations/systemError';\nimport { makeNodeTransport } from '../transports';\nimport type { NodeClientOptions, NodeOptions } from '../types';\nimport { isCjs } from '../utils/detection';\nimport { getSpotlightConfig } from '../utils/spotlight';\nimport { defaultStackParser, getSentryRelease } from './api';\nimport { NodeClient } from './client';\nimport { initializeEsmLoader } from './esmLoader';\n\n/**\n * Get default integrations for the Node-Core SDK.\n */\nexport function getDefaultIntegrations(): Integration[] {\n return [\n // Common\n // TODO(v11): Replace with `eventFiltersIntegration` once we remove the deprecated `inboundFiltersIntegration`\n // eslint-disable-next-line deprecation/deprecation\n inboundFiltersIntegration(),\n functionToStringIntegration(),\n linkedErrorsIntegration(),\n requestDataIntegration(),\n systemErrorIntegration(),\n conversationIdIntegration(),\n // Native Wrappers\n consoleIntegration(),\n httpIntegration(),\n nativeNodeFetchIntegration(),\n // Global Handlers\n onUncaughtExceptionIntegration(),\n onUnhandledRejectionIntegration(),\n // Event Info\n contextLinesIntegration(),\n localVariablesIntegration(),\n nodeContextIntegration(),\n childProcessIntegration(),\n processSessionIntegration(),\n modulesIntegration(),\n ];\n}\n\n/**\n * Initialize Sentry for Node.\n */\nexport function init(options: NodeOptions | undefined = {}): NodeClient | undefined {\n return _init(options, getDefaultIntegrations);\n}\n\n/**\n * Initialize Sentry for Node, without any integrations added by default.\n */\nexport function initWithoutDefaultIntegrations(options: NodeOptions | undefined = {}): NodeClient {\n return _init(options, () => []);\n}\n\n/**\n * Initialize Sentry for Node, without performance instrumentation.\n */\nfunction _init(\n _options: NodeOptions | undefined = {},\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClient {\n const options = getClientOptions(_options, getDefaultIntegrationsImpl);\n\n if (options.debug === true) {\n if (DEBUG_BUILD) {\n debug.enable();\n } else {\n // use `console.warn` rather than `debug.warn` since by non-debug bundles have all `debug.x` statements stripped\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n });\n }\n }\n\n if (options.registerEsmLoaderHooks !== false) {\n initializeEsmLoader();\n }\n\n setOpenTelemetryContextAsyncContextStrategy();\n\n const scope = getCurrentScope();\n scope.update(options.initialScope);\n\n if (options.spotlight && !options.integrations.some(({ name }) => name === SPOTLIGHT_INTEGRATION_NAME)) {\n options.integrations.push(\n spotlightIntegration({\n sidecarUrl: typeof options.spotlight === 'string' ? options.spotlight : undefined,\n }),\n );\n }\n\n applySdkMetadata(options, 'node-core');\n\n const client = new NodeClient(options);\n // The client is on the current scope, from where it generally is inherited\n getCurrentScope().setClient(client);\n\n client.init();\n\n debug.log(`SDK initialized from ${isCjs() ? 'CommonJS' : 'ESM'}`);\n\n client.startClientReportTracking();\n\n updateScopeFromEnvVariables();\n\n enhanceDscWithOpenTelemetryRootSpanName(client);\n setupEventContextTrace(client);\n\n // Ensure we flush events when vercel functions are ended\n // See: https://vercel.com/docs/functions/functions-api-reference#sigterm-signal\n if (process.env.VERCEL) {\n process.on('SIGTERM', async () => {\n // We have 500ms for processing here, so we try to make sure to have enough time to send the events\n await client.flush(200);\n });\n }\n\n return client;\n}\n\n/**\n * Validate that your OpenTelemetry setup is correct.\n */\nexport function validateOpenTelemetrySetup(): void {\n if (!DEBUG_BUILD) {\n return;\n }\n\n const setup = openTelemetrySetupCheck();\n\n const required: ReturnType<typeof openTelemetrySetupCheck> = ['SentryContextManager', 'SentryPropagator'];\n\n if (hasSpansEnabled()) {\n required.push('SentrySpanProcessor');\n }\n\n for (const k of required) {\n if (!setup.includes(k)) {\n debug.error(\n `You have to set up the ${k}. Without this, the OpenTelemetry & Sentry integration will not work properly.`,\n );\n }\n }\n\n if (!setup.includes('SentrySampler')) {\n debug.warn(\n 'You have to set up the SentrySampler. Without this, the OpenTelemetry & Sentry integration may still work, but sample rates set for the Sentry SDK will not be respected. If you use a custom sampler, make sure to use `wrapSamplingDecision`.',\n );\n }\n}\n\nfunction getClientOptions(\n options: NodeOptions,\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClientOptions {\n const release = getRelease(options.release);\n\n const spotlight = getSpotlightConfig(options.spotlight);\n\n const tracesSampleRate = getTracesSampleRate(options.tracesSampleRate);\n\n const mergedOptions = {\n ...options,\n dsn: options.dsn ?? process.env.SENTRY_DSN,\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT,\n sendClientReports: options.sendClientReports ?? true,\n transport: options.transport ?? makeNodeTransport,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n release,\n tracesSampleRate,\n spotlight,\n debug: envToBool(options.debug ?? process.env.SENTRY_DEBUG),\n };\n\n const integrations = options.integrations;\n const defaultIntegrations = options.defaultIntegrations ?? getDefaultIntegrationsImpl(mergedOptions);\n\n const resolvedIntegrations = getIntegrationsToSetup({\n defaultIntegrations,\n integrations,\n });\n\n if (mergedOptions.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) {\n resolvedIntegrations.push(spanStreamingIntegration());\n }\n\n return {\n ...mergedOptions,\n integrations: resolvedIntegrations,\n };\n}\n\nfunction getRelease(release: NodeOptions['release']): string | undefined {\n if (release !== undefined) {\n return release;\n }\n\n const detectedRelease = getSentryRelease();\n if (detectedRelease !== undefined) {\n return detectedRelease;\n }\n\n return undefined;\n}\n\nfunction getTracesSampleRate(tracesSampleRate: NodeOptions['tracesSampleRate']): number | undefined {\n if (tracesSampleRate !== undefined) {\n return tracesSampleRate;\n }\n\n const sampleRateFromEnv = process.env.SENTRY_TRACES_SAMPLE_RATE;\n if (!sampleRateFromEnv) {\n return undefined;\n }\n\n const parsed = parseFloat(sampleRateFromEnv);\n return isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Update scope and propagation context based on environmental variables.\n *\n * See https://github.com/getsentry/rfcs/blob/main/text/0071-continue-trace-over-process-boundaries.md\n * for more details.\n */\nfunction updateScopeFromEnvVariables(): void {\n if (envToBool(process.env.SENTRY_USE_ENVIRONMENT) !== false) {\n const sentryTraceEnv = process.env.SENTRY_TRACE;\n const baggageEnv = process.env.SENTRY_BAGGAGE;\n const propagationContext = propagationContextFromHeaders(sentryTraceEnv, baggageEnv);\n getCurrentScope().setPropagationContext(propagationContext);\n }\n}\n"],"names":["SPOTLIGHT_INTEGRATION_NAME"],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../../../src/sdk/index.ts"],"sourcesContent":["import type { Integration, Options } from '@sentry/core';\nimport {\n applySdkMetadata,\n consoleSandbox,\n conversationIdIntegration,\n debug,\n envToBool,\n functionToStringIntegration,\n getCurrentScope,\n getIntegrationsToSetup,\n hasSpansEnabled,\n inboundFiltersIntegration,\n linkedErrorsIntegration,\n propagationContextFromHeaders,\n requestDataIntegration,\n spanStreamingIntegration,\n stackParserFromStackParserOptions,\n} from '@sentry/core';\nimport {\n enhanceDscWithOpenTelemetryRootSpanName,\n openTelemetrySetupCheck,\n setOpenTelemetryContextAsyncContextStrategy,\n setupEventContextTrace,\n} from '@sentry/opentelemetry';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { childProcessIntegration } from '../integrations/childProcess';\nimport { nodeContextIntegration } from '../integrations/context';\nimport { contextLinesIntegration } from '../integrations/contextlines';\nimport { httpIntegration } from '../integrations/http';\nimport { localVariablesIntegration } from '../integrations/local-variables';\nimport { modulesIntegration } from '../integrations/modules';\nimport { nativeNodeFetchIntegration } from '../integrations/node-fetch';\nimport { onUncaughtExceptionIntegration } from '../integrations/onuncaughtexception';\nimport { onUnhandledRejectionIntegration } from '../integrations/onunhandledrejection';\nimport { processSessionIntegration } from '../integrations/processSession';\nimport { INTEGRATION_NAME as SPOTLIGHT_INTEGRATION_NAME, spotlightIntegration } from '../integrations/spotlight';\nimport { consoleIntegration } from '../integrations/console';\nimport { systemErrorIntegration } from '../integrations/systemError';\nimport { makeNodeTransport } from '../transports';\nimport type { NodeClientOptions, NodeOptions } from '../types';\nimport { isCjs } from '../utils/detection';\nimport { getSpotlightConfig } from '../utils/spotlight';\nimport { defaultStackParser, getSentryRelease } from './api';\nimport { NodeClient } from './client';\nimport { initializeEsmLoader } from './esmLoader';\n\n/**\n * Get default integrations for the Node-Core SDK.\n */\nexport function getDefaultIntegrations(): Integration[] {\n return [\n // Common\n // TODO(v11): Replace with `eventFiltersIntegration` once we remove the deprecated `inboundFiltersIntegration`\n // eslint-disable-next-line deprecation/deprecation\n inboundFiltersIntegration(),\n functionToStringIntegration(),\n linkedErrorsIntegration(),\n requestDataIntegration(),\n systemErrorIntegration(),\n conversationIdIntegration(),\n // Native Wrappers\n consoleIntegration(),\n httpIntegration(),\n nativeNodeFetchIntegration(),\n // Global Handlers\n onUncaughtExceptionIntegration(),\n onUnhandledRejectionIntegration(),\n // Event Info\n contextLinesIntegration(),\n localVariablesIntegration(),\n nodeContextIntegration(),\n childProcessIntegration(),\n processSessionIntegration(),\n modulesIntegration(),\n ];\n}\n\n/**\n * Initialize Sentry for Node.\n */\nexport function init(options: NodeOptions | undefined = {}): NodeClient | undefined {\n return _init(options, getDefaultIntegrations);\n}\n\n/**\n * Initialize Sentry for Node, without any integrations added by default.\n */\nexport function initWithoutDefaultIntegrations(options: NodeOptions | undefined = {}): NodeClient {\n return _init(options, () => []);\n}\n\n/**\n * Initialize Sentry for Node, without performance instrumentation.\n */\nfunction _init(\n _options: NodeOptions | undefined = {},\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClient {\n const options = getClientOptions(_options, getDefaultIntegrationsImpl);\n\n if (options.debug === true) {\n if (DEBUG_BUILD) {\n debug.enable();\n } else {\n // use `console.warn` rather than `debug.warn` since by non-debug bundles have all `debug.x` statements stripped\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n });\n }\n }\n\n if (options.registerEsmLoaderHooks !== false) {\n initializeEsmLoader();\n }\n\n setOpenTelemetryContextAsyncContextStrategy();\n\n const scope = getCurrentScope();\n scope.update(options.initialScope);\n\n if (options.spotlight && !options.integrations.some(({ name }) => name === SPOTLIGHT_INTEGRATION_NAME)) {\n options.integrations.push(\n spotlightIntegration({\n sidecarUrl: typeof options.spotlight === 'string' ? options.spotlight : undefined,\n }),\n );\n }\n\n applySdkMetadata(options, 'node-core');\n\n const client = new NodeClient(options);\n // The client is on the current scope, from where it generally is inherited\n getCurrentScope().setClient(client);\n\n client.init();\n\n debug.log(`SDK initialized from ${isCjs() ? 'CommonJS' : 'ESM'}`);\n\n client.startClientReportTracking();\n\n updateScopeFromEnvVariables();\n\n enhanceDscWithOpenTelemetryRootSpanName(client);\n setupEventContextTrace(client);\n\n // Ensure we flush events when vercel functions are ended\n // See: https://vercel.com/docs/functions/functions-api-reference#sigterm-signal\n if (process.env.VERCEL) {\n process.on('SIGTERM', async () => {\n // We have 500ms for processing here, so we try to make sure to have enough time to send the events\n await client.flush(200);\n });\n }\n\n return client;\n}\n\n/**\n * Validate that your OpenTelemetry setup is correct.\n */\nexport function validateOpenTelemetrySetup(): void {\n if (!DEBUG_BUILD) {\n return;\n }\n\n const setup = openTelemetrySetupCheck();\n\n const required: ReturnType<typeof openTelemetrySetupCheck> = ['SentryContextManager', 'SentryPropagator'];\n\n if (hasSpansEnabled()) {\n required.push('SentrySpanProcessor');\n }\n\n for (const k of required) {\n if (!setup.includes(k)) {\n debug.error(\n `You have to set up the ${k}. Without this, the OpenTelemetry & Sentry integration will not work properly.`,\n );\n }\n }\n\n if (!setup.includes('SentrySampler')) {\n debug.warn(\n 'You have to set up the SentrySampler. Without this, the OpenTelemetry & Sentry integration may still work, but sample rates set for the Sentry SDK will not be respected. If you use a custom sampler, make sure to use `wrapSamplingDecision`.',\n );\n }\n}\n\nfunction getClientOptions(\n options: NodeOptions,\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClientOptions {\n const release = getRelease(options.release);\n\n const spotlight = getSpotlightConfig(options.spotlight);\n\n const tracesSampleRate = getTracesSampleRate(options.tracesSampleRate);\n\n const mergedOptions = {\n ...options,\n dsn: options.dsn ?? process.env.SENTRY_DSN,\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT,\n sendClientReports: options.sendClientReports ?? true,\n transport: options.transport ?? makeNodeTransport,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n release,\n tracesSampleRate,\n spotlight,\n debug: envToBool(options.debug ?? process.env.SENTRY_DEBUG),\n };\n\n const integrations = options.integrations;\n const defaultIntegrations = options.defaultIntegrations ?? getDefaultIntegrationsImpl(mergedOptions);\n\n const resolvedIntegrations = getIntegrationsToSetup({\n defaultIntegrations,\n integrations,\n });\n\n if (mergedOptions.traceLifecycle === 'stream' && !resolvedIntegrations.some(i => i.name === 'SpanStreaming')) {\n resolvedIntegrations.push(spanStreamingIntegration());\n }\n\n return {\n ...mergedOptions,\n integrations: resolvedIntegrations,\n };\n}\n\nfunction getRelease(release: NodeOptions['release']): string | undefined {\n if (release !== undefined) {\n return release;\n }\n\n const detectedRelease = getSentryRelease();\n if (detectedRelease !== undefined) {\n return detectedRelease;\n }\n\n return undefined;\n}\n\nfunction getTracesSampleRate(tracesSampleRate: NodeOptions['tracesSampleRate']): number | undefined {\n if (tracesSampleRate !== undefined) {\n return tracesSampleRate;\n }\n\n const sampleRateFromEnv = process.env.SENTRY_TRACES_SAMPLE_RATE;\n if (!sampleRateFromEnv) {\n return undefined;\n }\n\n const parsed = parseFloat(sampleRateFromEnv);\n return isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Update scope and propagation context based on environmental variables.\n *\n * See https://github.com/getsentry/rfcs/blob/main/text/0071-continue-trace-over-process-boundaries.md\n * for more details.\n */\nfunction updateScopeFromEnvVariables(): void {\n if (envToBool(process.env.SENTRY_USE_ENVIRONMENT) !== false) {\n const sentryTraceEnv = process.env.SENTRY_TRACE;\n const baggageEnv = process.env.SENTRY_BAGGAGE;\n const propagationContext = propagationContextFromHeaders(sentryTraceEnv, baggageEnv);\n getCurrentScope().setPropagationContext(propagationContext);\n }\n}\n"],"names":["SPOTLIGHT_INTEGRATION_NAME"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA8CA;AACA;AACA;AACO,SAAS,sBAAsB,GAAkB;AACxD,EAAE,OAAO;AACT;AACA;AACA;AACA,IAAI,yBAAyB,EAAE;AAC/B,IAAI,2BAA2B,EAAE;AACjC,IAAI,uBAAuB,EAAE;AAC7B,IAAI,sBAAsB,EAAE;AAC5B,IAAI,sBAAsB,EAAE;AAC5B,IAAI,yBAAyB,EAAE;AAC/B;AACA,IAAI,kBAAkB,EAAE;AACxB,IAAI,eAAe,EAAE;AACrB,IAAI,0BAA0B,EAAE;AAChC;AACA,IAAI,8BAA8B,EAAE;AACpC,IAAI,+BAA+B,EAAE;AACrC;AACA,IAAI,uBAAuB,EAAE;AAC7B,IAAI,yBAAyB,EAAE;AAC/B,IAAI,sBAAsB,EAAE;AAC5B,IAAI,uBAAuB,EAAE;AAC7B,IAAI,yBAAyB,EAAE;AAC/B,IAAI,kBAAkB,EAAE;AACxB,GAAG;AACH;;AAEA;AACA;AACA;AACO,SAAS,IAAI,CAAC,OAAO,GAA4B,EAAE,EAA0B;AACpF,EAAE,OAAO,KAAK,CAAC,OAAO,EAAE,sBAAsB,CAAC;AAC/C;;AAEA;AACA;AACA;AACO,SAAS,8BAA8B,CAAC,OAAO,GAA4B,EAAE,EAAc;AAClG,EAAE,OAAO,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;AACjC;;AAEA;AACA;AACA;AACA,SAAS,KAAK;AACd,EAAE,QAAQ,GAA4B,EAAE;AACxC,EAAE,0BAA0B;AAC5B,EAAc;AACd,EAAE,MAAM,UAAU,gBAAgB,CAAC,QAAQ,EAAE,0BAA0B,CAAC;;AAExE,EAAE,IAAI,OAAO,CAAC,KAAA,KAAU,IAAI,EAAE;AAC9B,IAAI,IAAI,WAAW,EAAE;AACrB,MAAM,KAAK,CAAC,MAAM,EAAE;AACpB,IAAI,OAAO;AACX;AACA,MAAM,cAAc,CAAC,MAAM;AAC3B;AACA,QAAQ,OAAO,CAAC,IAAI,CAAC,8EAA8E,CAAC;AACpG,MAAM,CAAC,CAAC;AACR,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,OAAO,CAAC,sBAAA,KAA2B,KAAK,EAAE;AAChD,IAAI,mBAAmB,EAAE;AACzB,EAAE;;AAEF,EAAE,2CAA2C,EAAE;;AAE/C,EAAE,MAAM,KAAA,GAAQ,eAAe,EAAE;AACjC,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;;AAEpC,EAAE,IAAI,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,IAAA,EAAM,KAAK,IAAA,KAASA,gBAA0B,CAAC,EAAE;AAC1G,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI;AAC7B,MAAM,oBAAoB,CAAC;AAC3B,QAAQ,UAAU,EAAE,OAAO,OAAO,CAAC,SAAA,KAAc,QAAA,GAAW,OAAO,CAAC,SAAA,GAAY,SAAS;AACzF,OAAO,CAAC;AACR,KAAK;AACL,EAAE;;AAEF,EAAE,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;;AAExC,EAAE,MAAM,MAAA,GAAS,IAAI,UAAU,CAAC,OAAO,CAAC;AACxC;AACA,EAAE,eAAe,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC;;AAErC,EAAE,MAAM,CAAC,IAAI,EAAE;;AAEf,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,qBAAqB,EAAE,KAAK,KAAK,UAAA,GAAa,KAAK,CAAC,CAAA,CAAA;;AAEA,EAAA,MAAA,CAAA,yBAAA,EAAA;;AAEA,EAAA,2BAAA,EAAA;;AAEA,EAAA,uCAAA,CAAA,MAAA,CAAA;AACA,EAAA,sBAAA,CAAA,MAAA,CAAA;;AAEA;AACA;AACA,EAAA,IAAA,OAAA,CAAA,GAAA,CAAA,MAAA,EAAA;AACA,IAAA,OAAA,CAAA,EAAA,CAAA,SAAA,EAAA,YAAA;AACA;AACA,MAAA,MAAA,MAAA,CAAA,KAAA,CAAA,GAAA,CAAA;AACA,IAAA,CAAA,CAAA;AACA,EAAA;;AAEA,EAAA,OAAA,MAAA;AACA;;AAEA;AACA;AACA;AACA,SAAA,0BAAA,GAAA;AACA,EAAA,IAAA,CAAA,WAAA,EAAA;AACA,IAAA;AACA,EAAA;;AAEA,EAAA,MAAA,KAAA,GAAA,uBAAA,EAAA;;AAEA,EAAA,MAAA,QAAA,GAAA,CAAA,sBAAA,EAAA,kBAAA,CAAA;;AAEA,EAAA,IAAA,eAAA,EAAA,EAAA;AACA,IAAA,QAAA,CAAA,IAAA,CAAA,qBAAA,CAAA;AACA,EAAA;;AAEA,EAAA,KAAA,MAAA,CAAA,IAAA,QAAA,EAAA;AACA,IAAA,IAAA,CAAA,KAAA,CAAA,QAAA,CAAA,CAAA,CAAA,EAAA;AACA,MAAA,KAAA,CAAA,KAAA;AACA,QAAA,CAAA,uBAAA,EAAA,CAAA,CAAA,8EAAA,CAAA;AACA,OAAA;AACA,IAAA;AACA,EAAA;;AAEA,EAAA,IAAA,CAAA,KAAA,CAAA,QAAA,CAAA,eAAA,CAAA,EAAA;AACA,IAAA,KAAA,CAAA,IAAA;AACA,MAAA,iPAAA;AACA,KAAA;AACA,EAAA;AACA;;AAEA,SAAA,gBAAA;AACA,EAAA,OAAA;AACA,EAAA,0BAAA;AACA,EAAA;AACA,EAAA,MAAA,OAAA,GAAA,UAAA,CAAA,OAAA,CAAA,OAAA,CAAA;;AAEA,EAAA,MAAA,SAAA,GAAA,kBAAA,CAAA,OAAA,CAAA,SAAA,CAAA;;AAEA,EAAA,MAAA,gBAAA,GAAA,mBAAA,CAAA,OAAA,CAAA,gBAAA,CAAA;;AAEA,EAAA,MAAA,aAAA,GAAA;AACA,IAAA,GAAA,OAAA;AACA,IAAA,GAAA,EAAA,OAAA,CAAA,GAAA,IAAA,OAAA,CAAA,GAAA,CAAA,UAAA;AACA,IAAA,WAAA,EAAA,OAAA,CAAA,WAAA,IAAA,OAAA,CAAA,GAAA,CAAA,kBAAA;AACA,IAAA,iBAAA,EAAA,OAAA,CAAA,iBAAA,IAAA,IAAA;AACA,IAAA,SAAA,EAAA,OAAA,CAAA,SAAA,IAAA,iBAAA;AACA,IAAA,WAAA,EAAA,iCAAA,CAAA,OAAA,CAAA,WAAA,IAAA,kBAAA,CAAA;AACA,IAAA,OAAA;AACA,IAAA,gBAAA;AACA,IAAA,SAAA;AACA,IAAA,KAAA,EAAA,SAAA,CAAA,OAAA,CAAA,KAAA,IAAA,OAAA,CAAA,GAAA,CAAA,YAAA,CAAA;AACA,GAAA;;AAEA,EAAA,MAAA,YAAA,GAAA,OAAA,CAAA,YAAA;AACA,EAAA,MAAA,mBAAA,GAAA,OAAA,CAAA,mBAAA,IAAA,0BAAA,CAAA,aAAA,CAAA;;AAEA,EAAA,MAAA,oBAAA,GAAA,sBAAA,CAAA;AACA,IAAA,mBAAA;AACA,IAAA,YAAA;AACA,GAAA,CAAA;;AAEA,EAAA,IAAA,aAAA,CAAA,cAAA,KAAA,QAAA,IAAA,CAAA,oBAAA,CAAA,IAAA,CAAA,CAAA,IAAA,CAAA,CAAA,IAAA,KAAA,eAAA,CAAA,EAAA;AACA,IAAA,oBAAA,CAAA,IAAA,CAAA,wBAAA,EAAA,CAAA;AACA,EAAA;;AAEA,EAAA,OAAA;AACA,IAAA,GAAA,aAAA;AACA,IAAA,YAAA,EAAA,oBAAA;AACA,GAAA;AACA;;AAEA,SAAA,UAAA,CAAA,OAAA,EAAA;AACA,EAAA,IAAA,OAAA,KAAA,SAAA,EAAA;AACA,IAAA,OAAA,OAAA;AACA,EAAA;;AAEA,EAAA,MAAA,eAAA,GAAA,gBAAA,EAAA;AACA,EAAA,IAAA,eAAA,KAAA,SAAA,EAAA;AACA,IAAA,OAAA,eAAA;AACA,EAAA;;AAEA,EAAA,OAAA,SAAA;AACA;;AAEA,SAAA,mBAAA,CAAA,gBAAA,EAAA;AACA,EAAA,IAAA,gBAAA,KAAA,SAAA,EAAA;AACA,IAAA,OAAA,gBAAA;AACA,EAAA;;AAEA,EAAA,MAAA,iBAAA,GAAA,OAAA,CAAA,GAAA,CAAA,yBAAA;AACA,EAAA,IAAA,CAAA,iBAAA,EAAA;AACA,IAAA,OAAA,SAAA;AACA,EAAA;;AAEA,EAAA,MAAA,MAAA,GAAA,UAAA,CAAA,iBAAA,CAAA;AACA,EAAA,OAAA,QAAA,CAAA,MAAA,CAAA,GAAA,MAAA,GAAA,SAAA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,2BAAA,GAAA;AACA,EAAA,IAAA,SAAA,CAAA,OAAA,CAAA,GAAA,CAAA,sBAAA,CAAA,KAAA,KAAA,EAAA;AACA,IAAA,MAAA,cAAA,GAAA,OAAA,CAAA,GAAA,CAAA,YAAA;AACA,IAAA,MAAA,UAAA,GAAA,OAAA,CAAA,GAAA,CAAA,cAAA;AACA,IAAA,MAAA,kBAAA,GAAA,6BAAA,CAAA,cAAA,EAAA,UAAA,CAAA;AACA,IAAA,eAAA,EAAA,CAAA,qBAAA,CAAA,kBAAA,CAAA;AACA,EAAA;AACA;;;;"}

@@ -35,3 +35,9 @@ import { getClient, shouldPropagateTraceForUrl, getTraceData, getBreadcrumbLogLevelFromHttpStatusCode, addBreadcrumb, debug, parseUrl, getSanitizedUrlString } from '@sentry/core';

const requestHeaders = Array.isArray(request.headers) ? request.headers : stringToArrayHeaders(request.headers);
// Undici can expose headers either as a raw string (v5-style) or as a flat array of pairs (v6-style).
// In the array form, even indices are header names and odd indices are values; in undici v6 a value
// may be `string | string[]` when a header has multiple values. The helpers below (_deduplicateArrayHeader,
// push, etc.) expect each value slot to be a single string, so we normalize array headers first.
const requestHeaders = Array.isArray(request.headers)
? normalizeUndiciHeaderPairs(request.headers)
: stringToArrayHeaders(request.headers);

@@ -78,4 +84,7 @@ // OTel's UndiciInstrumentation calls propagation.inject() which unconditionally

if (!Array.isArray(request.headers)) {
// For original string request headers, we need to write them back to the request
if (Array.isArray(request.headers)) {
// Replace contents in place so we keep the same array reference undici/fetch still holds.
// `requestHeaders` is already normalized (string pairs only); splice writes them back.
request.headers.splice(0, request.headers.length, ...requestHeaders);
} else {
request.headers = arrayToStringHeaders(requestHeaders);

@@ -85,2 +94,24 @@ }

/**
* Convert undici’s header array into `[name, value, name, value, ...]` where every value is a string.
*
* Undici v6 uses this shape: `[k1, v1, k2, v2, ...]`. Types allow each `v` to be `string | string[]` when
* that header has multiple values. Sentry’s dedupe/merge helpers expect one string per value slot, so
* multi-value arrays are joined with `', '`. Missing value slots become `''`.
*/
function normalizeUndiciHeaderPairs(headers) {
const out = [];
for (let i = 0; i < headers.length; i++) {
const entry = headers[i];
if (i % 2 === 0) {
// Header name (should always be a string; coerce defensively).
out.push(typeof entry === 'string' ? entry : String(entry));
} else {
// Header value: flatten `string[]` to a single string for downstream string-only helpers.
out.push(Array.isArray(entry) ? entry.join(', ') : (entry ?? ''));
}
}
return out;
}
function stringToArrayHeaders(requestHeaders) {

@@ -87,0 +118,0 @@ const headersArray = requestHeaders.split('\r\n');

@@ -1,1 +0,1 @@

{"version":3,"file":"outgoingFetchRequest.js","sources":["../../../src/utils/outgoingFetchRequest.ts"],"sourcesContent":["import type { LRUMap, SanitizedRequestData } from '@sentry/core';\nimport {\n addBreadcrumb,\n getBreadcrumbLogLevelFromHttpStatusCode,\n getClient,\n getSanitizedUrlString,\n getTraceData,\n parseUrl,\n shouldPropagateTraceForUrl,\n} from '@sentry/core';\nimport type { UndiciRequest, UndiciResponse } from '../integrations/node-fetch/types';\nimport { mergeBaggageHeaders } from './baggage';\nimport { debug } from '@sentry/core';\nconst SENTRY_TRACE_HEADER = 'sentry-trace';\nconst SENTRY_BAGGAGE_HEADER = 'baggage';\nconst W3C_TRACEPARENT_HEADER = 'traceparent';\n/**\n * Add trace propagation headers to an outgoing fetch/undici request.\n *\n * Checks if the request URL matches trace propagation targets,\n * then injects sentry-trace, traceparent, and baggage headers.\n */\n// eslint-disable-next-line complexity\nexport function addTracePropagationHeadersToFetchRequest(\n request: UndiciRequest,\n propagationDecisionMap: LRUMap<string, boolean>,\n): void {\n const url = getAbsoluteUrl(request.origin, request.path);\n\n // Manually add the trace headers, if it applies\n // Note: We do not use `propagation.inject()` here, because our propagator relies on an active span\n // Which we do not have in this case\n // The propagator _may_ overwrite this, but this should be fine as it is the same data\n const { tracePropagationTargets, propagateTraceparent } = getClient()?.getOptions() || {};\n const addedHeaders = shouldPropagateTraceForUrl(url, tracePropagationTargets, propagationDecisionMap)\n ? getTraceData({ propagateTraceparent })\n : undefined;\n\n if (!addedHeaders) {\n return;\n }\n\n const { 'sentry-trace': sentryTrace, baggage, traceparent } = addedHeaders;\n\n const requestHeaders = Array.isArray(request.headers) ? request.headers : stringToArrayHeaders(request.headers);\n\n // OTel's UndiciInstrumentation calls propagation.inject() which unconditionally\n // appends headers to the request. When the user also sets headers via getTraceData(),\n // this results in duplicate sentry-trace and baggage (and optionally traceparent) entries.\n // We clean these up before applying our own logic.\n _deduplicateArrayHeader(requestHeaders, SENTRY_TRACE_HEADER);\n _deduplicateArrayHeader(requestHeaders, SENTRY_BAGGAGE_HEADER);\n if (propagateTraceparent) {\n _deduplicateArrayHeader(requestHeaders, W3C_TRACEPARENT_HEADER);\n }\n\n // We do not want to overwrite existing headers here\n // If the core UndiciInstrumentation is registered, it will already have set the headers\n // We do not want to add any then\n const hasExistingSentryTraceHeader = _findExistingHeaderIndex(requestHeaders, SENTRY_TRACE_HEADER) !== -1;\n\n // We do not want to set any headers if we already have an existing sentry-trace header.\n // sentry-trace is still the source of truth, otherwise we risk mixing up baggage and sentry-trace values.\n if (!hasExistingSentryTraceHeader) {\n if (sentryTrace) {\n requestHeaders.push(SENTRY_TRACE_HEADER, sentryTrace);\n }\n\n if (traceparent && _findExistingHeaderIndex(requestHeaders, 'traceparent') === -1) {\n requestHeaders.push('traceparent', traceparent);\n }\n\n // For baggage, we make sure to merge this into a possibly existing header\n const existingBaggageIndex = _findExistingHeaderIndex(requestHeaders, SENTRY_BAGGAGE_HEADER);\n if (baggage && existingBaggageIndex === -1) {\n requestHeaders.push(SENTRY_BAGGAGE_HEADER, baggage);\n } else if (baggage) {\n // headers in format [key_0, value_0, key_1, value_1, ...], hence the +1 here\n const existingBaggageValue = requestHeaders[existingBaggageIndex + 1];\n const merged = mergeBaggageHeaders(existingBaggageValue, baggage);\n if (merged) {\n requestHeaders[existingBaggageIndex + 1] = merged;\n }\n }\n }\n\n if (!Array.isArray(request.headers)) {\n // For original string request headers, we need to write them back to the request\n request.headers = arrayToStringHeaders(requestHeaders);\n }\n}\n\nfunction stringToArrayHeaders(requestHeaders: string): string[] {\n const headersArray = requestHeaders.split('\\r\\n');\n const headers: string[] = [];\n for (const header of headersArray) {\n try {\n const colonIndex = header.indexOf(':');\n if (colonIndex === -1) {\n continue;\n }\n const key = header.slice(0, colonIndex).trim();\n const value = header.slice(colonIndex + 1).trim();\n if (key) {\n headers.push(key, value);\n }\n } catch {\n debug.warn(`Failed to convert string request header to array header: ${header}`);\n }\n }\n return headers;\n}\n\nfunction arrayToStringHeaders(headers: string[]): string {\n const headerPairs: string[] = [];\n\n for (let i = 0; i < headers.length; i += 2) {\n const key = headers[i];\n const value = headers[i + 1];\n if (!key || value == null) {\n // skip falsy keys but only null/undefined values\n continue;\n }\n headerPairs.push(`${key}: ${value}`);\n }\n\n if (!headerPairs.length) {\n return '';\n }\n\n return headerPairs.join('\\r\\n').concat('\\r\\n');\n}\n\n/**\n * For a given header name, if there are multiple entries in the [key, value, key, value, ...] array,\n * keep the first entry and remove the rest.\n * For baggage, values are merged to preserve all entries but to dedupe sentry- values, and always\n * keep the first occurrence of them\n */\nfunction _deduplicateArrayHeader(headers: string[], headerName: string): void {\n let firstIndex = -1;\n for (let i = 0; i < headers.length; i += 2) {\n if (headers[i] !== headerName) {\n continue;\n }\n\n if (firstIndex === -1) {\n firstIndex = i;\n continue;\n }\n\n const firstHeaderValue = headers[firstIndex + 1];\n if (headerName === SENTRY_BAGGAGE_HEADER && firstHeaderValue) {\n // mergeBaggageHeaders always takes sentry- values from the new baggage (2nd param) and merges\n // it with the existing one (1st param). Here, we want to keep the first header's existing\n // sentry- values in favor of the new ones. Hence we swap the parameters.\n const merged = mergeBaggageHeaders(headers[i + 1], firstHeaderValue);\n if (merged) {\n headers[firstIndex + 1] = merged;\n }\n }\n headers.splice(i, 2);\n i -= 2;\n }\n}\n\n/**\n * Find the index of an existing header in an array of headers.\n * Only take even indices, because headers are in format [key_0, value_0, key_1, value_1, ...]\n * otherwise we could match a header _value_ with @param name\n */\nfunction _findExistingHeaderIndex(headers: string[], name: string): number {\n return headers.findIndex((header, i) => i % 2 === 0 && header === name);\n}\n\n/** Add a breadcrumb for an outgoing fetch/undici request. */\nexport function addFetchRequestBreadcrumb(request: UndiciRequest, response: UndiciResponse): void {\n const data = getBreadcrumbData(request);\n\n const statusCode = response.statusCode;\n const level = getBreadcrumbLogLevelFromHttpStatusCode(statusCode);\n\n addBreadcrumb(\n {\n category: 'http',\n data: {\n status_code: statusCode,\n ...data,\n },\n type: 'http',\n level,\n },\n {\n event: 'response',\n request,\n response,\n },\n );\n}\n\nfunction getBreadcrumbData(request: UndiciRequest): Partial<SanitizedRequestData> {\n try {\n const url = getAbsoluteUrl(request.origin, request.path);\n const parsedUrl = parseUrl(url);\n\n const data: Partial<SanitizedRequestData> = {\n url: getSanitizedUrlString(parsedUrl),\n 'http.method': request.method || 'GET',\n };\n\n if (parsedUrl.search) {\n data['http.query'] = parsedUrl.search;\n }\n if (parsedUrl.hash) {\n data['http.fragment'] = parsedUrl.hash;\n }\n\n return data;\n } catch {\n return {};\n }\n}\n\n/** Get the absolute URL from an origin and path. */\nexport function getAbsoluteUrl(origin: string, path: string = '/'): string {\n try {\n const url = new URL(path, origin);\n return url.toString();\n } catch {\n // fallback: Construct it on our own\n const url = `${origin}`;\n\n if (url.endsWith('/') && path.startsWith('/')) {\n return `${url}${path.slice(1)}`;\n }\n\n if (!url.endsWith('/') && !path.startsWith('/')) {\n return `${url}/${path}`;\n }\n\n return `${url}${path}`;\n }\n}\n"],"names":[],"mappings":"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"}
{"version":3,"file":"outgoingFetchRequest.js","sources":["../../../src/utils/outgoingFetchRequest.ts"],"sourcesContent":["import type { LRUMap, SanitizedRequestData } from '@sentry/core';\nimport {\n addBreadcrumb,\n getBreadcrumbLogLevelFromHttpStatusCode,\n getClient,\n getSanitizedUrlString,\n getTraceData,\n parseUrl,\n shouldPropagateTraceForUrl,\n} from '@sentry/core';\nimport type { UndiciRequest, UndiciResponse } from '../integrations/node-fetch/types';\nimport { mergeBaggageHeaders } from './baggage';\nimport { debug } from '@sentry/core';\nconst SENTRY_TRACE_HEADER = 'sentry-trace';\nconst SENTRY_BAGGAGE_HEADER = 'baggage';\nconst W3C_TRACEPARENT_HEADER = 'traceparent';\n/**\n * Add trace propagation headers to an outgoing fetch/undici request.\n *\n * Checks if the request URL matches trace propagation targets,\n * then injects sentry-trace, traceparent, and baggage headers.\n */\n// eslint-disable-next-line complexity\nexport function addTracePropagationHeadersToFetchRequest(\n request: UndiciRequest,\n propagationDecisionMap: LRUMap<string, boolean>,\n): void {\n const url = getAbsoluteUrl(request.origin, request.path);\n\n // Manually add the trace headers, if it applies\n // Note: We do not use `propagation.inject()` here, because our propagator relies on an active span\n // Which we do not have in this case\n // The propagator _may_ overwrite this, but this should be fine as it is the same data\n const { tracePropagationTargets, propagateTraceparent } = getClient()?.getOptions() || {};\n const addedHeaders = shouldPropagateTraceForUrl(url, tracePropagationTargets, propagationDecisionMap)\n ? getTraceData({ propagateTraceparent })\n : undefined;\n\n if (!addedHeaders) {\n return;\n }\n\n const { 'sentry-trace': sentryTrace, baggage, traceparent } = addedHeaders;\n\n // Undici can expose headers either as a raw string (v5-style) or as a flat array of pairs (v6-style).\n // In the array form, even indices are header names and odd indices are values; in undici v6 a value\n // may be `string | string[]` when a header has multiple values. The helpers below (_deduplicateArrayHeader,\n // push, etc.) expect each value slot to be a single string, so we normalize array headers first.\n const requestHeaders: string[] = Array.isArray(request.headers)\n ? normalizeUndiciHeaderPairs(request.headers)\n : stringToArrayHeaders(request.headers);\n\n // OTel's UndiciInstrumentation calls propagation.inject() which unconditionally\n // appends headers to the request. When the user also sets headers via getTraceData(),\n // this results in duplicate sentry-trace and baggage (and optionally traceparent) entries.\n // We clean these up before applying our own logic.\n _deduplicateArrayHeader(requestHeaders, SENTRY_TRACE_HEADER);\n _deduplicateArrayHeader(requestHeaders, SENTRY_BAGGAGE_HEADER);\n if (propagateTraceparent) {\n _deduplicateArrayHeader(requestHeaders, W3C_TRACEPARENT_HEADER);\n }\n\n // We do not want to overwrite existing headers here\n // If the core UndiciInstrumentation is registered, it will already have set the headers\n // We do not want to add any then\n const hasExistingSentryTraceHeader = _findExistingHeaderIndex(requestHeaders, SENTRY_TRACE_HEADER) !== -1;\n\n // We do not want to set any headers if we already have an existing sentry-trace header.\n // sentry-trace is still the source of truth, otherwise we risk mixing up baggage and sentry-trace values.\n if (!hasExistingSentryTraceHeader) {\n if (sentryTrace) {\n requestHeaders.push(SENTRY_TRACE_HEADER, sentryTrace);\n }\n\n if (traceparent && _findExistingHeaderIndex(requestHeaders, 'traceparent') === -1) {\n requestHeaders.push('traceparent', traceparent);\n }\n\n // For baggage, we make sure to merge this into a possibly existing header\n const existingBaggageIndex = _findExistingHeaderIndex(requestHeaders, SENTRY_BAGGAGE_HEADER);\n if (baggage && existingBaggageIndex === -1) {\n requestHeaders.push(SENTRY_BAGGAGE_HEADER, baggage);\n } else if (baggage) {\n // headers in format [key_0, value_0, key_1, value_1, ...], hence the +1 here\n const existingBaggageValue = requestHeaders[existingBaggageIndex + 1];\n const merged = mergeBaggageHeaders(existingBaggageValue, baggage);\n if (merged) {\n requestHeaders[existingBaggageIndex + 1] = merged;\n }\n }\n }\n\n if (Array.isArray(request.headers)) {\n // Replace contents in place so we keep the same array reference undici/fetch still holds.\n // `requestHeaders` is already normalized (string pairs only); splice writes them back.\n request.headers.splice(0, request.headers.length, ...requestHeaders);\n } else {\n request.headers = arrayToStringHeaders(requestHeaders);\n }\n}\n\n/**\n * Convert undici’s header array into `[name, value, name, value, ...]` where every value is a string.\n *\n * Undici v6 uses this shape: `[k1, v1, k2, v2, ...]`. Types allow each `v` to be `string | string[]` when\n * that header has multiple values. Sentry’s dedupe/merge helpers expect one string per value slot, so\n * multi-value arrays are joined with `', '`. Missing value slots become `''`.\n */\nfunction normalizeUndiciHeaderPairs(headers: (string | string[])[]): string[] {\n const out: string[] = [];\n for (let i = 0; i < headers.length; i++) {\n const entry = headers[i];\n if (i % 2 === 0) {\n // Header name (should always be a string; coerce defensively).\n out.push(typeof entry === 'string' ? entry : String(entry));\n } else {\n // Header value: flatten `string[]` to a single string for downstream string-only helpers.\n out.push(Array.isArray(entry) ? entry.join(', ') : (entry ?? ''));\n }\n }\n return out;\n}\n\nfunction stringToArrayHeaders(requestHeaders: string): string[] {\n const headersArray = requestHeaders.split('\\r\\n');\n const headers: string[] = [];\n for (const header of headersArray) {\n try {\n const colonIndex = header.indexOf(':');\n if (colonIndex === -1) {\n continue;\n }\n const key = header.slice(0, colonIndex).trim();\n const value = header.slice(colonIndex + 1).trim();\n if (key) {\n headers.push(key, value);\n }\n } catch {\n debug.warn(`Failed to convert string request header to array header: ${header}`);\n }\n }\n return headers;\n}\n\nfunction arrayToStringHeaders(headers: string[]): string {\n const headerPairs: string[] = [];\n\n for (let i = 0; i < headers.length; i += 2) {\n const key = headers[i];\n const value = headers[i + 1];\n if (!key || value == null) {\n // skip falsy keys but only null/undefined values\n continue;\n }\n headerPairs.push(`${key}: ${value}`);\n }\n\n if (!headerPairs.length) {\n return '';\n }\n\n return headerPairs.join('\\r\\n').concat('\\r\\n');\n}\n\n/**\n * For a given header name, if there are multiple entries in the [key, value, key, value, ...] array,\n * keep the first entry and remove the rest.\n * For baggage, values are merged to preserve all entries but to dedupe sentry- values, and always\n * keep the first occurrence of them\n */\nfunction _deduplicateArrayHeader(headers: string[], headerName: string): void {\n let firstIndex = -1;\n for (let i = 0; i < headers.length; i += 2) {\n if (headers[i] !== headerName) {\n continue;\n }\n\n if (firstIndex === -1) {\n firstIndex = i;\n continue;\n }\n\n const firstHeaderValue = headers[firstIndex + 1];\n if (headerName === SENTRY_BAGGAGE_HEADER && firstHeaderValue) {\n // mergeBaggageHeaders always takes sentry- values from the new baggage (2nd param) and merges\n // it with the existing one (1st param). Here, we want to keep the first header's existing\n // sentry- values in favor of the new ones. Hence we swap the parameters.\n const merged = mergeBaggageHeaders(headers[i + 1], firstHeaderValue);\n if (merged) {\n headers[firstIndex + 1] = merged;\n }\n }\n headers.splice(i, 2);\n i -= 2;\n }\n}\n\n/**\n * Find the index of an existing header in an array of headers.\n * Only take even indices, because headers are in format [key_0, value_0, key_1, value_1, ...]\n * otherwise we could match a header _value_ with @param name\n */\nfunction _findExistingHeaderIndex(headers: string[], name: string): number {\n return headers.findIndex((header, i) => i % 2 === 0 && header === name);\n}\n\n/** Add a breadcrumb for an outgoing fetch/undici request. */\nexport function addFetchRequestBreadcrumb(request: UndiciRequest, response: UndiciResponse): void {\n const data = getBreadcrumbData(request);\n\n const statusCode = response.statusCode;\n const level = getBreadcrumbLogLevelFromHttpStatusCode(statusCode);\n\n addBreadcrumb(\n {\n category: 'http',\n data: {\n status_code: statusCode,\n ...data,\n },\n type: 'http',\n level,\n },\n {\n event: 'response',\n request,\n response,\n },\n );\n}\n\nfunction getBreadcrumbData(request: UndiciRequest): Partial<SanitizedRequestData> {\n try {\n const url = getAbsoluteUrl(request.origin, request.path);\n const parsedUrl = parseUrl(url);\n\n const data: Partial<SanitizedRequestData> = {\n url: getSanitizedUrlString(parsedUrl),\n 'http.method': request.method || 'GET',\n };\n\n if (parsedUrl.search) {\n data['http.query'] = parsedUrl.search;\n }\n if (parsedUrl.hash) {\n data['http.fragment'] = parsedUrl.hash;\n }\n\n return data;\n } catch {\n return {};\n }\n}\n\n/** Get the absolute URL from an origin and path. */\nexport function getAbsoluteUrl(origin: string, path: string = '/'): string {\n try {\n const url = new URL(path, origin);\n return url.toString();\n } catch {\n // fallback: Construct it on our own\n const url = `${origin}`;\n\n if (url.endsWith('/') && path.startsWith('/')) {\n return `${url}${path.slice(1)}`;\n }\n\n if (!url.endsWith('/') && !path.startsWith('/')) {\n return `${url}/${path}`;\n }\n\n return `${url}${path}`;\n }\n}\n"],"names":[],"mappings":";;;AAaA,MAAM,mBAAA,GAAsB,cAAc;AAC1C,MAAM,qBAAA,GAAwB,SAAS;AACvC,MAAM,sBAAA,GAAyB,aAAa;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,wCAAwC;AACxD,EAAE,OAAO;AACT,EAAE,sBAAsB;AACxB,EAAQ;AACR,EAAE,MAAM,GAAA,GAAM,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;;AAE1D;AACA;AACA;AACA;AACA,EAAE,MAAM,EAAE,uBAAuB,EAAE,oBAAA,KAAyB,SAAS,EAAE,EAAE,UAAU,EAAC,IAAK,EAAE;AAC3F,EAAE,MAAM,eAAe,0BAA0B,CAAC,GAAG,EAAE,uBAAuB,EAAE,sBAAsB;AACtG,MAAM,YAAY,CAAC,EAAE,sBAAsB;AAC3C,MAAM,SAAS;;AAEf,EAAE,IAAI,CAAC,YAAY,EAAE;AACrB,IAAI;AACJ,EAAE;;AAEF,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,WAAA,EAAY,GAAI,YAAY;;AAE5E;AACA;AACA;AACA;AACA,EAAE,MAAM,cAAc,GAAa,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;AAChE,MAAM,0BAA0B,CAAC,OAAO,CAAC,OAAO;AAChD,MAAM,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC;;AAE3C;AACA;AACA;AACA;AACA,EAAE,uBAAuB,CAAC,cAAc,EAAE,mBAAmB,CAAC;AAC9D,EAAE,uBAAuB,CAAC,cAAc,EAAE,qBAAqB,CAAC;AAChE,EAAE,IAAI,oBAAoB,EAAE;AAC5B,IAAI,uBAAuB,CAAC,cAAc,EAAE,sBAAsB,CAAC;AACnE,EAAE;;AAEF;AACA;AACA;AACA,EAAE,MAAM,4BAAA,GAA+B,wBAAwB,CAAC,cAAc,EAAE,mBAAmB,CAAA,KAAM,EAAE;;AAE3G;AACA;AACA,EAAE,IAAI,CAAC,4BAA4B,EAAE;AACrC,IAAI,IAAI,WAAW,EAAE;AACrB,MAAM,cAAc,CAAC,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC;AAC3D,IAAI;;AAEJ,IAAI,IAAI,WAAA,IAAe,wBAAwB,CAAC,cAAc,EAAE,aAAa,CAAA,KAAM,EAAE,EAAE;AACvF,MAAM,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC;AACrD,IAAI;;AAEJ;AACA,IAAI,MAAM,uBAAuB,wBAAwB,CAAC,cAAc,EAAE,qBAAqB,CAAC;AAChG,IAAI,IAAI,OAAA,IAAW,yBAAyB,EAAE,EAAE;AAChD,MAAM,cAAc,CAAC,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC;AACzD,IAAI,CAAA,MAAO,IAAI,OAAO,EAAE;AACxB;AACA,MAAM,MAAM,uBAAuB,cAAc,CAAC,oBAAA,GAAuB,CAAC,CAAC;AAC3E,MAAM,MAAM,SAAS,mBAAmB,CAAC,oBAAoB,EAAE,OAAO,CAAC;AACvE,MAAM,IAAI,MAAM,EAAE;AAClB,QAAQ,cAAc,CAAC,oBAAA,GAAuB,CAAC,CAAA,GAAI,MAAM;AACzD,MAAM;AACN,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACtC;AACA;AACA,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,cAAc,CAAC;AACxE,EAAE,OAAO;AACT,IAAI,OAAO,CAAC,OAAA,GAAU,oBAAoB,CAAC,cAAc,CAAC;AAC1D,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,0BAA0B,CAAC,OAAO,EAAmC;AAC9E,EAAE,MAAM,GAAG,GAAa,EAAE;AAC1B,EAAE,KAAK,IAAI,CAAA,GAAI,CAAC,EAAE,CAAA,GAAI,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,IAAI,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAC,CAAC;AAC5B,IAAI,IAAI,CAAA,GAAI,CAAA,KAAM,CAAC,EAAE;AACrB;AACA,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,IAAI,OAAO;AACX;AACA,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAA,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAA,IAAK,KAAA,IAAS,EAAE,CAAC,CAAC;AACvE,IAAI;AACJ,EAAE;AACF,EAAE,OAAO,GAAG;AACZ;;AAEA,SAAS,oBAAoB,CAAC,cAAc,EAAoB;AAChE,EAAE,MAAM,eAAe,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;AACnD,EAAE,MAAM,OAAO,GAAa,EAAE;AAC9B,EAAE,KAAK,MAAM,MAAA,IAAU,YAAY,EAAE;AACrC,IAAI,IAAI;AACR,MAAM,MAAM,aAAa,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;AAC5C,MAAM,IAAI,UAAA,KAAe,CAAC,CAAC,EAAE;AAC7B,QAAQ;AACR,MAAM;AACN,MAAM,MAAM,GAAA,GAAM,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE;AACpD,MAAM,MAAM,KAAA,GAAQ,MAAM,CAAC,KAAK,CAAC,UAAA,GAAa,CAAC,CAAC,CAAC,IAAI,EAAE;AACvD,MAAM,IAAI,GAAG,EAAE;AACf,QAAQ,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;AAChC,MAAM;AACN,IAAI,EAAE,MAAM;AACZ,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,yDAAyD,EAAE,MAAM,CAAC,CAAA,CAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA,OAAA,OAAA;AACA;;AAEA,SAAA,oBAAA,CAAA,OAAA,EAAA;AACA,EAAA,MAAA,WAAA,GAAA,EAAA;;AAEA,EAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,GAAA,OAAA,CAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA;AACA,IAAA,MAAA,GAAA,GAAA,OAAA,CAAA,CAAA,CAAA;AACA,IAAA,MAAA,KAAA,GAAA,OAAA,CAAA,CAAA,GAAA,CAAA,CAAA;AACA,IAAA,IAAA,CAAA,GAAA,IAAA,KAAA,IAAA,IAAA,EAAA;AACA;AACA,MAAA;AACA,IAAA;AACA,IAAA,WAAA,CAAA,IAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AACA,EAAA;;AAEA,EAAA,IAAA,CAAA,WAAA,CAAA,MAAA,EAAA;AACA,IAAA,OAAA,EAAA;AACA,EAAA;;AAEA,EAAA,OAAA,WAAA,CAAA,IAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CAAA,MAAA,CAAA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,uBAAA,CAAA,OAAA,EAAA,UAAA,EAAA;AACA,EAAA,IAAA,UAAA,GAAA,EAAA;AACA,EAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,GAAA,OAAA,CAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA;AACA,IAAA,IAAA,OAAA,CAAA,CAAA,CAAA,KAAA,UAAA,EAAA;AACA,MAAA;AACA,IAAA;;AAEA,IAAA,IAAA,UAAA,KAAA,EAAA,EAAA;AACA,MAAA,UAAA,GAAA,CAAA;AACA,MAAA;AACA,IAAA;;AAEA,IAAA,MAAA,gBAAA,GAAA,OAAA,CAAA,UAAA,GAAA,CAAA,CAAA;AACA,IAAA,IAAA,UAAA,KAAA,qBAAA,IAAA,gBAAA,EAAA;AACA;AACA;AACA;AACA,MAAA,MAAA,MAAA,GAAA,mBAAA,CAAA,OAAA,CAAA,CAAA,GAAA,CAAA,CAAA,EAAA,gBAAA,CAAA;AACA,MAAA,IAAA,MAAA,EAAA;AACA,QAAA,OAAA,CAAA,UAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA,OAAA,CAAA,MAAA,CAAA,CAAA,EAAA,CAAA,CAAA;AACA,IAAA,CAAA,IAAA,CAAA;AACA,EAAA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAA,wBAAA,CAAA,OAAA,EAAA,IAAA,EAAA;AACA,EAAA,OAAA,OAAA,CAAA,SAAA,CAAA,CAAA,MAAA,EAAA,CAAA,KAAA,CAAA,GAAA,CAAA,KAAA,CAAA,IAAA,MAAA,KAAA,IAAA,CAAA;AACA;;AAEA;AACA,SAAA,yBAAA,CAAA,OAAA,EAAA,QAAA,EAAA;AACA,EAAA,MAAA,IAAA,GAAA,iBAAA,CAAA,OAAA,CAAA;;AAEA,EAAA,MAAA,UAAA,GAAA,QAAA,CAAA,UAAA;AACA,EAAA,MAAA,KAAA,GAAA,uCAAA,CAAA,UAAA,CAAA;;AAEA,EAAA,aAAA;AACA,IAAA;AACA,MAAA,QAAA,EAAA,MAAA;AACA,MAAA,IAAA,EAAA;AACA,QAAA,WAAA,EAAA,UAAA;AACA,QAAA,GAAA,IAAA;AACA,OAAA;AACA,MAAA,IAAA,EAAA,MAAA;AACA,MAAA,KAAA;AACA,KAAA;AACA,IAAA;AACA,MAAA,KAAA,EAAA,UAAA;AACA,MAAA,OAAA;AACA,MAAA,QAAA;AACA,KAAA;AACA,GAAA;AACA;;AAEA,SAAA,iBAAA,CAAA,OAAA,EAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,GAAA,GAAA,cAAA,CAAA,OAAA,CAAA,MAAA,EAAA,OAAA,CAAA,IAAA,CAAA;AACA,IAAA,MAAA,SAAA,GAAA,QAAA,CAAA,GAAA,CAAA;;AAEA,IAAA,MAAA,IAAA,GAAA;AACA,MAAA,GAAA,EAAA,qBAAA,CAAA,SAAA,CAAA;AACA,MAAA,aAAA,EAAA,OAAA,CAAA,MAAA,IAAA,KAAA;AACA,KAAA;;AAEA,IAAA,IAAA,SAAA,CAAA,MAAA,EAAA;AACA,MAAA,IAAA,CAAA,YAAA,CAAA,GAAA,SAAA,CAAA,MAAA;AACA,IAAA;AACA,IAAA,IAAA,SAAA,CAAA,IAAA,EAAA;AACA,MAAA,IAAA,CAAA,eAAA,CAAA,GAAA,SAAA,CAAA,IAAA;AACA,IAAA;;AAEA,IAAA,OAAA,IAAA;AACA,EAAA,CAAA,CAAA,MAAA;AACA,IAAA,OAAA,EAAA;AACA,EAAA;AACA;;AAEA;AACA,SAAA,cAAA,CAAA,MAAA,EAAA,IAAA,GAAA,GAAA,EAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,GAAA,GAAA,IAAA,GAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AACA,IAAA,OAAA,GAAA,CAAA,QAAA,EAAA;AACA,EAAA,CAAA,CAAA,MAAA;AACA;AACA,IAAA,MAAA,GAAA,GAAA,CAAA,EAAA,MAAA,CAAA,CAAA;;AAEA,IAAA,IAAA,GAAA,CAAA,QAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,UAAA,CAAA,GAAA,CAAA,EAAA;AACA,MAAA,OAAA,CAAA,EAAA,GAAA,CAAA,EAAA,IAAA,CAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,IAAA;;AAEA,IAAA,IAAA,CAAA,GAAA,CAAA,QAAA,CAAA,GAAA,CAAA,IAAA,CAAA,IAAA,CAAA,UAAA,CAAA,GAAA,CAAA,EAAA;AACA,MAAA,OAAA,CAAA,EAAA,GAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA;AACA,IAAA;;AAEA,IAAA,OAAA,CAAA,EAAA,GAAA,CAAA,EAAA,IAAA,CAAA,CAAA;AACA,EAAA;AACA;;;;"}

@@ -24,2 +24,3 @@ /**

export { pinoIntegration } from './integrations/pino';
export { consoleIntegration } from './integrations/console';
export { getSentryRelease, defaultStackParser } from './sdk/api';

@@ -37,5 +38,5 @@ export { createGetModuleFromFilename } from './utils/module';

export { NodeOptions } from './types';
export { addBreadcrumb, isInitialized, isEnabled, getGlobalScope, lastEventId, close, createTransport, flush, SDK_VERSION, getSpanStatusFromHttpCode, setHttpStatus, captureCheckIn, withMonitor, requestDataIntegration, functionToStringIntegration, eventFiltersIntegration, linkedErrorsIntegration, addEventProcessor, setContext, setExtra, setExtras, setTag, setTags, setUser, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, setCurrentClient, Scope, setMeasurement, getSpanDescendants, parameterize, getClient, getCurrentScope, getIsolationScope, getTraceData, getTraceMetaTags, continueTrace, withScope, withIsolationScope, captureException, captureEvent, captureMessage, captureFeedback, captureConsoleIntegration, dedupeIntegration, extraErrorDataIntegration, rewriteFramesIntegration, startSession, captureSession, endSession, addIntegration, startSpan, startSpanManual, startInactiveSpan, startNewTrace, suppressTracing, getActiveSpan, withActiveSpan, getRootSpan, spanToJSON, spanToTraceHeader, spanToBaggageHeader, trpcMiddleware, updateSpanName, supabaseIntegration, instrumentSupabaseClient, zodErrorsIntegration, profiler, consoleLoggingIntegration, createConsolaReporter, consoleIntegration, wrapMcpServerWithSentry, featureFlagsIntegration, spanStreamingIntegration, withStreamedSpan, metrics, envToBool, } from '@sentry/core';
export { addBreadcrumb, isInitialized, isEnabled, getGlobalScope, lastEventId, close, createTransport, flush, SDK_VERSION, getSpanStatusFromHttpCode, setHttpStatus, captureCheckIn, withMonitor, requestDataIntegration, functionToStringIntegration, eventFiltersIntegration, linkedErrorsIntegration, addEventProcessor, setContext, setExtra, setExtras, setTag, setTags, setUser, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, setCurrentClient, Scope, setMeasurement, getSpanDescendants, parameterize, getClient, getCurrentScope, getIsolationScope, getTraceData, getTraceMetaTags, continueTrace, withScope, withIsolationScope, captureException, captureEvent, captureMessage, captureFeedback, captureConsoleIntegration, dedupeIntegration, extraErrorDataIntegration, rewriteFramesIntegration, startSession, captureSession, endSession, addIntegration, startSpan, startSpanManual, startInactiveSpan, startNewTrace, suppressTracing, getActiveSpan, withActiveSpan, getRootSpan, spanToJSON, spanToTraceHeader, spanToBaggageHeader, trpcMiddleware, updateSpanName, supabaseIntegration, instrumentSupabaseClient, zodErrorsIntegration, profiler, consoleLoggingIntegration, createConsolaReporter, wrapMcpServerWithSentry, featureFlagsIntegration, spanStreamingIntegration, withStreamedSpan, metrics, envToBool, } from '@sentry/core';
export { Breadcrumb, BreadcrumbHint, PolymorphicRequest, RequestEventData, SdkInfo, Event, EventHint, ErrorEvent, Exception, Session, SeverityLevel, StackFrame, Stacktrace, Thread, User, Span, FeatureFlagsIntegration, } from '@sentry/core';
export { logger };
//# sourceMappingURL=common-exports.d.ts.map
import * as http from 'node:http';
import { InstrumentationConfig } from '@opentelemetry/instrumentation';
import { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';
import { Span } from '@sentry/core';
import { Span, SpanAttributes } from '@sentry/core';
export type SentryHttpInstrumentationOptions = InstrumentationConfig & {

@@ -142,2 +142,6 @@ /**

}
/**
* Exported for testing purposes.
*/
export declare function _getOutgoingRequestEndedSpanData(response: http.IncomingMessage): SpanAttributes;
//# sourceMappingURL=SentryHttpInstrumentation.d.ts.map
/**
* Vendored from https://github.com/open-telemetry/opentelemetry-js-contrib/blob/28e209a9da36bc4e1f8c2b0db7360170ed46cb80/plugins/node/instrumentation-undici/src/types.ts
* Aligned with upstream Undici request shape; see `packages/node/.../node-fetch/vendored/types.ts`
* (vendored from `@opentelemetry/instrumentation-undici`).
*/

@@ -10,5 +11,5 @@ export interface UndiciRequest {

* Serialized string of headers in the form `name: value\r\n` for v5
* Array of strings v6
* Array of strings `[key1, value1, ...]` for v6 (values may be `string | string[]`)
*/
headers: string | string[];
headers: string | (string | string[])[];
/**

@@ -15,0 +16,0 @@ * Helper method to add headers (from v6)

@@ -24,2 +24,3 @@ /**

export { pinoIntegration } from './integrations/pino';
export { consoleIntegration } from './integrations/console';
export { getSentryRelease, defaultStackParser } from './sdk/api';

@@ -37,5 +38,5 @@ export { createGetModuleFromFilename } from './utils/module';

export type { NodeOptions } from './types';
export { addBreadcrumb, isInitialized, isEnabled, getGlobalScope, lastEventId, close, createTransport, flush, SDK_VERSION, getSpanStatusFromHttpCode, setHttpStatus, captureCheckIn, withMonitor, requestDataIntegration, functionToStringIntegration, eventFiltersIntegration, linkedErrorsIntegration, addEventProcessor, setContext, setExtra, setExtras, setTag, setTags, setUser, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, setCurrentClient, Scope, setMeasurement, getSpanDescendants, parameterize, getClient, getCurrentScope, getIsolationScope, getTraceData, getTraceMetaTags, continueTrace, withScope, withIsolationScope, captureException, captureEvent, captureMessage, captureFeedback, captureConsoleIntegration, dedupeIntegration, extraErrorDataIntegration, rewriteFramesIntegration, startSession, captureSession, endSession, addIntegration, startSpan, startSpanManual, startInactiveSpan, startNewTrace, suppressTracing, getActiveSpan, withActiveSpan, getRootSpan, spanToJSON, spanToTraceHeader, spanToBaggageHeader, trpcMiddleware, updateSpanName, supabaseIntegration, instrumentSupabaseClient, zodErrorsIntegration, profiler, consoleLoggingIntegration, createConsolaReporter, consoleIntegration, wrapMcpServerWithSentry, featureFlagsIntegration, spanStreamingIntegration, withStreamedSpan, metrics, envToBool, } from '@sentry/core';
export { addBreadcrumb, isInitialized, isEnabled, getGlobalScope, lastEventId, close, createTransport, flush, SDK_VERSION, getSpanStatusFromHttpCode, setHttpStatus, captureCheckIn, withMonitor, requestDataIntegration, functionToStringIntegration, eventFiltersIntegration, linkedErrorsIntegration, addEventProcessor, setContext, setExtra, setExtras, setTag, setTags, setUser, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, setCurrentClient, Scope, setMeasurement, getSpanDescendants, parameterize, getClient, getCurrentScope, getIsolationScope, getTraceData, getTraceMetaTags, continueTrace, withScope, withIsolationScope, captureException, captureEvent, captureMessage, captureFeedback, captureConsoleIntegration, dedupeIntegration, extraErrorDataIntegration, rewriteFramesIntegration, startSession, captureSession, endSession, addIntegration, startSpan, startSpanManual, startInactiveSpan, startNewTrace, suppressTracing, getActiveSpan, withActiveSpan, getRootSpan, spanToJSON, spanToTraceHeader, spanToBaggageHeader, trpcMiddleware, updateSpanName, supabaseIntegration, instrumentSupabaseClient, zodErrorsIntegration, profiler, consoleLoggingIntegration, createConsolaReporter, wrapMcpServerWithSentry, featureFlagsIntegration, spanStreamingIntegration, withStreamedSpan, metrics, envToBool, } from '@sentry/core';
export type { Breadcrumb, BreadcrumbHint, PolymorphicRequest, RequestEventData, SdkInfo, Event, EventHint, ErrorEvent, Exception, Session, SeverityLevel, StackFrame, Stacktrace, Thread, User, Span, FeatureFlagsIntegration, } from '@sentry/core';
export { logger };
//# sourceMappingURL=common-exports.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"common-exports.d.ts","sourceRoot":"","sources":["../../src/common-exports.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"common-exports.d.ts","sourceRoot":"","sources":["../../src/common-exports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,6BAA6B,EAC7B,KAAK,yBAAyB,EAC9B,qCAAqC,GACtC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,+BAA+B,EAAE,MAAM,qCAAqC,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,mCAAmC,EAAE,MAAM,6CAA6C,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC5E,YAAY,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,OAAO,EACL,aAAa,EACb,aAAa,EACb,SAAS,EACT,cAAc,EACd,WAAW,EACX,KAAK,EACL,eAAe,EACf,KAAK,EACL,WAAW,EACX,yBAAyB,EACzB,aAAa,EACb,cAAc,EACd,WAAW,EACX,sBAAsB,EACtB,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,UAAU,EACV,QAAQ,EACR,SAAS,EACT,MAAM,EACN,OAAO,EACP,OAAO,EACP,4BAA4B,EAC5B,gCAAgC,EAChC,gCAAgC,EAChC,qCAAqC,EACrC,gBAAgB,EAChB,KAAK,EACL,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,cAAc,EACd,UAAU,EACV,cAAc,EACd,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,cAAc,EACd,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,QAAQ,EACR,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EAChB,OAAO,EACP,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,EACP,KAAK,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,OAAO,EACP,aAAa,EACb,UAAU,EACV,UAAU,EACV,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,MAAM,EAAE,CAAC"}
import type * as http from 'node:http';
import type { InstrumentationConfig } from '@opentelemetry/instrumentation';
import { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';
import type { Span } from '@sentry/core';
import type { Span, SpanAttributes } from '@sentry/core';
export type SentryHttpInstrumentationOptions = InstrumentationConfig & {

@@ -139,2 +139,6 @@ /**

}
/**
* Exported for testing purposes.
*/
export declare function _getOutgoingRequestEndedSpanData(response: http.IncomingMessage): SpanAttributes;
//# sourceMappingURL=SentryHttpInstrumentation.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"SentryHttpInstrumentation.d.ts","sourceRoot":"","sources":["../../../../src/integrations/http/SentryHttpInstrumentation.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"SentryHttpInstrumentation.d.ts","sourceRoot":"","sources":["../../../../src/integrations/http/SentryHttpInstrumentation.ts"],"names":[],"mappings":"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"}
/**
* Vendored from https://github.com/open-telemetry/opentelemetry-js-contrib/blob/28e209a9da36bc4e1f8c2b0db7360170ed46cb80/plugins/node/instrumentation-undici/src/types.ts
* Aligned with upstream Undici request shape; see `packages/node/.../node-fetch/vendored/types.ts`
* (vendored from `@opentelemetry/instrumentation-undici`).
*/

@@ -10,5 +11,5 @@ export interface UndiciRequest {

* Serialized string of headers in the form `name: value\r\n` for v5
* Array of strings v6
* Array of strings `[key1, value1, ...]` for v6 (values may be `string | string[]`)
*/
headers: string | string[];
headers: string | (string | string[])[];
/**

@@ -15,0 +16,0 @@ * Helper method to add headers (from v6)

@@ -1,1 +0,1 @@

{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/integrations/node-fetch/types.ts"],"names":[],"mappings":"AAgBA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B;;OAEG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB"}
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/integrations/node-fetch/types.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC;IACxC;;OAEG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB"}

@@ -1,1 +0,1 @@

{"version":3,"file":"outgoingFetchRequest.d.ts","sourceRoot":"","sources":["../../../src/utils/outgoingFetchRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAwB,MAAM,cAAc,CAAC;AAUjE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAMtF;;;;;GAKG;AAEH,wBAAgB,wCAAwC,CACtD,OAAO,EAAE,aAAa,EACtB,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9C,IAAI,CAgEN;AAqFD,6DAA6D;AAC7D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAsBhG;AAyBD,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAY,GAAG,MAAM,CAkBzE"}
{"version":3,"file":"outgoingFetchRequest.d.ts","sourceRoot":"","sources":["../../../src/utils/outgoingFetchRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAwB,MAAM,cAAc,CAAC;AAUjE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAMtF;;;;;GAKG;AAEH,wBAAgB,wCAAwC,CACtD,OAAO,EAAE,aAAa,EACtB,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9C,IAAI,CAyEN;AA2GD,6DAA6D;AAC7D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAsBhG;AAyBD,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAY,GAAG,MAAM,CAkBzE"}
{
"name": "@sentry/node-core",
"version": "10.50.0-alpha.0",
"version": "10.50.0",
"description": "Sentry Node-Core SDK",

@@ -108,4 +108,4 @@ "repository": "git://github.com/getsentry/sentry-javascript.git",

"dependencies": {
"@sentry/core": "10.50.0-alpha.0",
"@sentry/opentelemetry": "10.50.0-alpha.0",
"@sentry/core": "10.50.0",
"@sentry/opentelemetry": "10.50.0",
"import-in-the-middle": "^3.0.0"

@@ -112,0 +112,0 @@ },