__vite_ssr_exportName__("DEFAULT_MOBILE_THEME_ID", () => { try { return DEFAULT_MOBILE_THEME_ID } catch {} });
__vite_ssr_exportName__("MOBILE_THEME_IDS", () => { try { return MOBILE_THEME_IDS } catch {} });
__vite_ssr_exportName__("MOBILE_THEME_OPTIONS", () => { try { return MOBILE_THEME_OPTIONS } catch {} });
__vite_ssr_exportName__("normalizeMobileThemeId", () => { try { return normalizeMobileThemeId } catch {} });
__vite_ssr_exportName__("normalizeMobileThemeMode", () => { try { return normalizeMobileThemeMode } catch {} });
__vite_ssr_exportName__("resolveMobileThemeIds", () => { try { return resolveMobileThemeIds } catch {} });
__vite_ssr_exportName__("createMobileThemeSelectionPatch", () => { try { return createMobileThemeSelectionPatch } catch {} });
__vite_ssr_exportName__("createMobileThemePairPatch", () => { try { return createMobileThemePairPatch } catch {} });
__vite_ssr_exportName__("themeColorToNativeColor", () => { try { return themeColorToNativeColor } catch {} });
__vite_ssr_exportName__("nativeColors", () => { try { return nativeColors } catch {} });
__vite_ssr_exportName__("flattenThemeColor", () => { try { return flattenThemeColor } catch {} });
__vite_ssr_exportName__("isDarkThemeColor", () => { try { return isDarkThemeColor } catch {} });
__vite_ssr_exportName__("themeColorWithContrast", () => { try { return themeColorWithContrast } catch {} });
__vite_ssr_exportName__("themeAccentWithContrast", () => { try { return themeAccentWithContrast } catch {} });
__vite_ssr_exportName__("themeColorWithAlpha", () => { try { return themeColorWithAlpha } catch {} });
__vite_ssr_exportName__("createMobileThemeVariables", () => { try { return createMobileThemeVariables } catch {} });
__vite_ssr_exportName__("MOBILE_THEME_VARIABLE_NAMES", () => { try { return MOBILE_THEME_VARIABLE_NAMES } catch {} });
__vite_ssr_exportName__("getMobileThemeColors", () => { try { return getMobileThemeColors } catch {} });
__vite_ssr_exportName__("getMobileThemeVariables", () => { try { return getMobileThemeVariables } catch {} });
__vite_ssr_exportName__("getMobileThemePreviewColors", () => { try { return getMobileThemePreviewColors } catch {} });
const __vite_ssr_import_0__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/shared/src/themePalettes.ts", {"importedNames":["BUILT_IN_THEMES","T3_CHAT_THEME","T3_CODE_LIGHT_THEME_COLORS","T3_CODE_DARK_THEME_COLORS","getThemeColorsForAppearance","MOBILE_DEFAULT_THEME_ID","MOBILE_THEME_IDS"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/shared/src/themePreview.ts", {"importedNames":["STANDARD_THEME_PREVIEW_COLORS"]});


const DEFAULT_MOBILE_THEME_ID = __vite_ssr_import_0__.MOBILE_DEFAULT_THEME_ID;
const MOBILE_THEME_IDS = [...__vite_ssr_import_0__.MOBILE_THEME_IDS, "material-you"];
const MOBILE_THEME_OPTIONS = [
	{
		id: DEFAULT_MOBILE_THEME_ID,
		label: "T3 Code"
	},
	{
		id: "material-you",
		label: "Material You"
	},
	...__vite_ssr_import_0__.BUILT_IN_THEMES.map((theme) => ({
		id: theme.id,
		label: theme.label
	}))
];
function normalizeMobileThemeId(value) {
	return typeof value === "string" && MOBILE_THEME_IDS.includes(value) ? value : DEFAULT_MOBILE_THEME_ID;
};
function normalizeMobileThemeMode(value) {
	return value === "light" || value === "dark" || value === "system" ? value : "system";
};
function resolveMobileThemeIds(preferences) {
	const legacyThemeId = normalizeMobileThemeId(preferences.themeId);
	return {
		light: preferences.lightThemeId === undefined ? legacyThemeId : normalizeMobileThemeId(preferences.lightThemeId),
		dark: preferences.darkThemeId === undefined ? legacyThemeId : normalizeMobileThemeId(preferences.darkThemeId)
	};
};
function createMobileThemeSelectionPatch(themeIds, activeAppearance, selectedAppearance, value) {
	const nextThemeIds = {
		light: selectedAppearance === "light" ? value : themeIds.light,
		dark: selectedAppearance === "dark" ? value : themeIds.dark
	};
	return {
		lightThemeId: nextThemeIds.light,
		darkThemeId: nextThemeIds.dark,
		themeId: nextThemeIds[activeAppearance]
	};
};
function createMobileThemePairPatch(value) {
	return {
		lightThemeId: value,
		darkThemeId: value,
		themeId: value
	};
};
const OKLCH_PATTERN = /^oklch\(\s*([\d.]+)\s+([\d.]+)\s+(-?[\d.]+)(?:\s*\/\s*([\d.]+))?\s*\)$/;
function linearToSrgb(value) {
	const converted = value <= .0031308 ? 12.92 * value : 1.055 * value ** (1 / 2.4) - .055;
	return Math.round(Math.min(1, Math.max(0, converted)) * 255);
}
function oklabToLinearSrgb(lightness, a, b) {
	const l = (lightness + .3963377774 * a + .2158037573 * b) ** 3;
	const m = (lightness - .1055613458 * a - .0638541728 * b) ** 3;
	const s = (lightness - .0894841775 * a - 1.291485548 * b) ** 3;
	return [
		4.0767416621 * l - 3.3077115913 * m + .2309699292 * s,
		-1.2684380046 * l + 2.6097574011 * m - .3413193965 * s,
		-.0041960863 * l - .7034186147 * m + 1.707614701 * s
	];
}
function oklabToSrgb(lightness, a, b) {
	const [red, green, blue] = oklabToLinearSrgb(lightness, a, b);
	return [
		linearToSrgb(red),
		linearToSrgb(green),
		linearToSrgb(blue)
	];
}
/** React Native does not accept OKLCH ColorValues, so palettes cross the app boundary as sRGB. */
function themeColorToNativeColor(value) {
	const match = OKLCH_PATTERN.exec(value);
	if (!match) return value;
	const lightness = Number(match[1]);
	const chroma = Number(match[2]);
	const hue = Number(match[3]) * Math.PI / 180;
	const alpha = match[4] === undefined ? 1 : Number(match[4]);
	const [red, green, blue] = oklabToSrgb(lightness, chroma * Math.cos(hue), chroma * Math.sin(hue));
	return alpha < 1 ? `rgba(${red}, ${green}, ${blue}, ${Number(alpha.toFixed(4))})` : `#${[
		red,
		green,
		blue
	].map((channel) => channel.toString(16).padStart(2, "0")).join("")}`;
};
function nativeColors(colors) {
	return Object.fromEntries(Object.entries(colors).map(([role, color]) => [role, themeColorToNativeColor(color)]));
};
function withAlpha(color, alpha) {
	const hex = color.startsWith("#") ? color.slice(1) : "";
	if (hex.length !== 6) return color;
	const [red, green, blue] = [
		0,
		2,
		4
	].map((offset) => Number.parseInt(hex.slice(offset, offset + 2), 16));
	return `rgba(${red}, ${green}, ${blue}, ${alpha})`;
}
function rgbChannels(color) {
	const match = /^#([\da-f]{2})([\da-f]{2})([\da-f]{2})(?:[\da-f]{2})?$/i.exec(color);
	if (!match) return null;
	const [, red = "0", green = "0", blue = "0"] = match;
	return [
		Number.parseInt(red, 16),
		Number.parseInt(green, 16),
		Number.parseInt(blue, 16)
	];
}
/** Native chips require opaque hex; flatten translucent roles. */
function flattenThemeColor(color, surface) {
	const alphaHex = /^#([\da-f]{6})([\da-f]{2})$/i.exec(color);
	if (alphaHex) {
		const channels = rgbChannels(color);
		return flattenThemeColor(`rgba(${channels[0]}, ${channels[1]}, ${channels[2]}, ${Number.parseInt(alphaHex[2], 16) / 255})`, surface);
	};
	const match = /^rgba?\(\s*(\d+)[,\s]+(\d+)[,\s]+(\d+)(?:[,\s/]+([\d.]+))?\s*\)$/i.exec(color.trim());
	if (!match) return color;
	const alpha = match[4] === undefined ? 1 : Number(match[4]);
	const behind = rgbChannels(surface) ?? [
		0,
		0,
		0
	];
	const channels = [
		match[1],
		match[2],
		match[3]
	].map((channel, index) => Math.max(0, Math.min(255, Math.round(Number(channel) * alpha + behind[index] * (1 - alpha)))));
	return `#${channels.map((channel) => channel.toString(16).padStart(2, "0")).join("")}`;
};
function srgbToLinear(channel) {
	const value = channel / 255;
	return value <= .04045 ? value / 12.92 : ((value + .055) / 1.055) ** 2.4;
}
function srgbToOklab(channels) {
	const [red = 0, green = 0, blue = 0] = channels.map(srgbToLinear);
	const l = Math.cbrt(.4122214708 * red + .5363325363 * green + .0514459929 * blue);
	const m = Math.cbrt(.2119034982 * red + .6806995451 * green + .1073969566 * blue);
	const s = Math.cbrt(.0883024619 * red + .2817188376 * green + .6299787005 * blue);
	return [
		.2104542553 * l + .793617785 * m - .0040720468 * s,
		1.9779984951 * l - 2.428592205 * m + .4505937099 * s,
		.0259040371 * l + .7827717662 * m - .808675766 * s
	];
}
function relativeLuminance(channels) {
	const [red, green, blue] = channels.map(srgbToLinear);
	return .2126 * red + .7152 * green + .0722 * blue;
}
function isDarkThemeColor(color) {
	const channels = rgbChannels(color);
	return channels !== null && relativeLuminance(channels) < .18;
};
function contrastRatio(first, second) {
	const firstLuminance = relativeLuminance(first);
	const secondLuminance = relativeLuminance(second);
	return (Math.max(firstLuminance, secondLuminance) + .05) / (Math.min(firstLuminance, secondLuminance) + .05);
}
function themeColorWithContrast(accent, surface, minimum = 4.5) {
	const accentChannels = rgbChannels(accent);
	const surfaceChannels = (typeof surface === "string" ? [surface] : surface).map(rgbChannels).filter((channels) => channels !== null);
	const minimumContrast = (channels) => Math.min(...surfaceChannels.map((surface) => contrastRatio(channels, surface)));
	if (!accentChannels || surfaceChannels.length === 0 || minimumContrast(accentChannels) >= minimum) {
		return accent;
	};
	const black = [
		0,
		0,
		0
	];
	const white = [
		255,
		255,
		255
	];
	const target = minimumContrast(black) >= minimumContrast(white) ? black : white;
	let readable = target;
	let lowerAmount = 0;
	let upperAmount = 1;
	for (let index = 0; index < 12; index += 1) {
		const amount = (lowerAmount + upperAmount) / 2;
		const candidate = [
			Math.round(accentChannels[0] + (target[0] - accentChannels[0]) * amount),
			Math.round(accentChannels[1] + (target[1] - accentChannels[1]) * amount),
			Math.round(accentChannels[2] + (target[2] - accentChannels[2]) * amount)
		];
		if (minimumContrast(candidate) >= minimum) {
			readable = candidate;
			upperAmount = amount;
		} else {
			lowerAmount = amount;
		}
	};
	return `#${readable.map((channel) => channel.toString(16).padStart(2, "0")).join("")}`;
};
/**
* Unlike `themeColorWithContrast`, which blends toward black or white and greys the color out,
* this moves only OKLCH lightness and takes the most chroma sRGB allows at each step, so a vivid
* accent stays vivid at the contrast it needs.
*/
function themeAccentWithContrast(accent, surfaces, minimum = 4.5) {
	const accentChannels = rgbChannels(accent);
	const surfaceChannels = surfaces.map(rgbChannels).filter((channels) => channels !== null);
	const minimumContrast = (channels) => Math.min(...surfaceChannels.map((surface) => contrastRatio(channels, surface)));
	if (!accentChannels || surfaceChannels.length === 0 || minimumContrast(accentChannels) >= minimum) {
		return accent;
	};
	const [lightness, a, b] = srgbToOklab(accentChannels);
	const hue = Math.atan2(b, a);
	const inGamut = (channels) => channels.every((channel) => channel >= -1e-4 && channel <= 1 + 1e-4);
	const mostVivid = (stepLightness) => {
		let chroma = 0;
		let lower = 0;
		let upper = Math.max(Math.hypot(a, b), .2);
		for (let index = 0; index < 20; index += 1) {
			const candidate = (lower + upper) / 2;
			if (inGamut(oklabToLinearSrgb(stepLightness, candidate * Math.cos(hue), candidate * Math.sin(hue)))) {
				chroma = candidate;
				lower = candidate;
			} else {
				upper = candidate;
			}
		};
		return oklabToSrgb(stepLightness, chroma * Math.cos(hue), chroma * Math.sin(hue));
	};
	const lighten = minimumContrast([
		255,
		255,
		255
	]) >= minimumContrast([
		0,
		0,
		0
	]);
	const step = lighten ? .002 : -.002;
	for (let next = lightness; lighten ? next <= 1 : next >= 0; next += step) {
		const candidate = mostVivid(next);
		if (minimumContrast(candidate) >= minimum) {
			return `#${candidate.map((channel) => channel.toString(16).padStart(2, "0")).join("")}`;
		}
	};
	return lighten ? "#ffffff" : "#000000";
};
function themeColorWithAlpha(color, alpha) {
	const channels = rgbChannels(color);
	if (channels) {
		return `rgba(${channels[0]}, ${channels[1]}, ${channels[2]}, ${alpha})`;
	};
	const rgb = /^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/.exec(color);
	return rgb ? `rgba(${rgb[1]}, ${rgb[2]}, ${rgb[3]}, ${alpha})` : color;
};
function createMobileThemeVariables(colors, appearance, groupedCardColor = colors.surface, prominentAction = [colors.text, colors.canvas]) {
	const c = nativeColors(colors);
	const groupedCard = themeColorToNativeColor(groupedCardColor);
	const textSurfaces = [
		c.canvas,
		c.surface,
		c.surfaceRaised,
		c.chrome,
		c.sidebar,
		c.secondary,
		groupedCard
	];
	return {
		"--color-screen": c.canvas,
		"--color-sheet": withAlpha(c.chrome, .98),
		"--color-sheet-solid": c.chrome,
		"--color-card": c.surface,
		"--color-grouped-card": groupedCard,
		"--color-card-alt": c.surfaceRaised,
		"--color-card-translucent": withAlpha(c.surface, .8),
		"--color-thread-canvas": c.canvas,
		"--color-thread-selected": c.sidebarRowActive,
		"--color-thread-selected-foreground": c.sidebarForeground,
		"--color-thread-selected-foreground-muted": themeColorWithContrast(c.sidebarMutedForeground, c.sidebarRowActive),
		"--color-thread-hover": c.sidebarRowHover,
		"--color-row-hover": c.toolbarControlHover,
		"--color-composer-panel": themeColorWithAlpha(c.canvas, appearance === "dark" ? .92 : .88),
		"--color-composer-surface": themeColorWithAlpha(groupedCard, appearance === "dark" ? .9 : .94),
		"--color-composer-border": themeColorWithAlpha(c.border, groupedCard === c.surface ? appearance === "dark" ? .46 : .54 : .8),
		"--color-foreground": c.text,
		"--color-foreground-secondary": themeColorWithContrast(c.textMuted, textSurfaces),
		"--color-foreground-muted": themeColorWithContrast(c.mutedForeground, textSurfaces),
		"--color-foreground-tertiary": c.secondaryLabel,
		"--color-border": c.border,
		"--color-focus": c.focus,
		"--color-border-subtle": withAlpha(c.border, .7),
		"--color-separator": withAlpha(c.border, .55),
		"--color-subtle": c.muted,
		"--color-subtle-strong": c.secondary,
		"--color-inline-skill-background": c.accentSurface,
		"--color-inline-skill-border": withAlpha(c.accent, .42),
		"--color-inline-skill-foreground": c.accentSurfaceForeground,
		"--color-primary": c.messageAction,
		"--color-prominent-action": themeColorToNativeColor(prominentAction[0]),
		"--color-prominent-action-foreground": themeColorToNativeColor(prominentAction[1]),
		"--color-primary-foreground": c.messageActionForeground,
		"--color-primary-text": themeColorWithContrast(c.messageAction, textSurfaces),
		"--color-primary-shadow": "#000000",
		"--color-secondary": c.secondary,
		"--color-secondary-foreground": c.secondaryForeground,
		"--color-secondary-border": c.border,
		"--color-switch-active-track": c.messageAction,
		"--color-switch-active-thumb": c.messageActionForeground,
		"--color-switch-inactive-track": c.secondary,
		"--color-switch-inactive-thumb": c.mutedForeground,
		"--color-warning": c.warningSurface,
		"--color-warning-border": withAlpha(c.warning, .32),
		"--color-warning-foreground": c.warningForeground,
		"--color-danger": c.errorSurface,
		"--color-danger-border": withAlpha(c.error, .32),
		"--color-danger-foreground": c.errorForeground,
		"--color-update": c.updateSurface,
		"--color-update-foreground": c.updateForeground,
		"--color-input": c.surface,
		"--color-input-border": c.input,
		"--color-sidebar-search": c.sidebarControlSurface,
		"--color-placeholder": themeColorWithContrast(c.placeholder, textSurfaces),
		"--color-icon": c.text,
		"--color-icon-muted": c.iconMuted,
		"--color-icon-subtle": c.secondaryLabel,
		"--color-header": withAlpha(c.toolbar, .97),
		"--color-header-foreground": c.toolbarForeground,
		"--color-header-border": c.toolbarBorder,
		"--color-glass-surface": withAlpha(c.surfaceOverlay, .74),
		"--color-glass-fallback": themeColorWithAlpha(groupedCard, appearance === "dark" ? .9 : .94),
		"--color-glass-tint": withAlpha(c.surfaceOverlay, .22),
		"--color-status-bar": c.canvas,
		"--color-md-body": c.text,
		"--color-md-strong": c.text,
		"--color-md-link": themeColorWithContrast(c.messageAction, c.canvas),
		"--color-md-blockquote-border": c.border,
		"--color-md-blockquote-bg": c.muted,
		"--color-md-code-bg": c.codeBackground,
		"--color-md-code-text": c.codeForeground,
		"--color-md-user-code-bg": withAlpha(c.messageForeground, .18),
		"--color-md-user-code-text": c.messageForeground,
		"--color-md-user-fence-bg": withAlpha("#000000", appearance === "dark" ? .28 : .16),
		"--color-md-user-fence-text": c.messageForeground,
		"--color-md-hr": c.border,
		"--color-user-bubble": c.messageSurface,
		"--color-user-bubble-foreground": c.messageForeground,
		"--color-user-bubble-foreground-muted": withAlpha(c.messageForeground, .78),
		"--color-user-bubble-skill-foreground": themeColorWithContrast(c.messageAction, c.messageSurface),
		"--color-backdrop": withAlpha("#000000", appearance === "dark" ? .48 : .22),
		"--color-drawer": c.sidebar,
		"--color-drawer-foreground": c.sidebarForeground,
		"--color-drawer-foreground-muted": themeColorWithContrast(c.sidebarMutedForeground, [c.sidebar, c.sidebarRowHover]),
		"--color-drawer-border": c.sidebarBorder,
		"--color-drawer-shadow": withAlpha("#000000", appearance === "dark" ? .32 : .12),
		"--color-dot-separator": withAlpha(c.textMuted, .35),
		"--color-wordmark": c.text,
		"--color-chevron": withAlpha(c.textMuted, .42)
	};
};
const MOBILE_THEME_VARIABLE_NAMES = Object.keys(createMobileThemeVariables(__vite_ssr_import_0__.T3_CHAT_THEME.colors, "light"));
function getMobileThemeColors(themeId, appearance) {
	if (themeId === DEFAULT_MOBILE_THEME_ID) {
		return appearance === "dark" ? __vite_ssr_import_0__.T3_CODE_DARK_THEME_COLORS : __vite_ssr_import_0__.T3_CODE_LIGHT_THEME_COLORS;
	};
	const theme = __vite_ssr_import_0__.BUILT_IN_THEMES.find((candidate) => candidate.id === themeId) ?? __vite_ssr_import_0__.T3_CHAT_THEME;
	return (0,__vite_ssr_import_0__.getThemeColorsForAppearance)(theme, appearance) ?? theme.colors;
};
function getMobileThemeVariables(themeId, appearance, overrides = null) {
	const colors = getMobileThemeColors(themeId, appearance);
	const groupedCard = themeId === DEFAULT_MOBILE_THEME_ID ? appearance === "light" ? colors.toolbarControlHover : colors.sidebarRowActive : themeId === "t3-chat" ? appearance === "light" ? colors.toolbarControl : colors.surface : colors.muted;
	const mobileColors = themeId === DEFAULT_MOBILE_THEME_ID ? {
		...colors,
		messageSurface: flattenThemeColor(themeColorWithAlpha(appearance === "dark" ? colors.sidebarRowActive : colors.border, .3), colors.messageSurface)
	} : colors;
	const baseVariables = createMobileThemeVariables(mobileColors, appearance, groupedCard, themeId === "t3-chat" && appearance === "dark" ? [colors.messageActionForeground, colors.messageAction] : themeId !== DEFAULT_MOBILE_THEME_ID && themeId !== "t3-chat" ? [colors.messageAction, colors.messageActionForeground] : undefined);
	return overrides ? {
		...baseVariables,
		...overrides
	} : baseVariables;
};
function getMobileThemePreviewColors(themeId, appearance) {
	if (themeId === DEFAULT_MOBILE_THEME_ID || themeId === "material-you") return __vite_ssr_import_1__.STANDARD_THEME_PREVIEW_COLORS[appearance];
	const theme = __vite_ssr_import_0__.BUILT_IN_THEMES.find((candidate) => candidate.id === themeId) ?? __vite_ssr_import_0__.T3_CHAT_THEME;
	const colors = (0,__vite_ssr_import_0__.getThemeColorsForAppearance)(theme, appearance) ?? theme.colors;
	return {
		canvas: themeColorToNativeColor(colors.canvas),
		accent: themeColorToNativeColor(colors.accent),
		messageAction: themeColorToNativeColor(colors.messageAction)
	};
}
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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QVMsc0RBQTRCLE9BQU8sVUFBVSxLQUFLLE1BQU07Q0FDdkUsT0FBTztFQUNMLFFBQVEsd0JBQXdCLE9BQU8sTUFBTTtFQUM3QyxRQUFRLHdCQUF3QixPQUFPLE1BQU07RUFDN0MsZUFBZSx3QkFBd0IsT0FBTyxhQUFhO0NBQzdEO0FBQ0YiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIm1vYmlsZVRoZW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJVSUxUX0lOX1RIRU1FUyxcbiAgVDNfQ0hBVF9USEVNRSxcbiAgVDNfQ09ERV9MSUdIVF9USEVNRV9DT0xPUlMsXG4gIFQzX0NPREVfREFSS19USEVNRV9DT0xPUlMsXG4gIGdldFRoZW1lQ29sb3JzRm9yQXBwZWFyYW5jZSxcbiAgTU9CSUxFX0RFRkFVTFRfVEhFTUVfSUQsXG4gIE1PQklMRV9USEVNRV9JRFMgYXMgU0hBUkVEX01PQklMRV9USEVNRV9JRFMsXG4gIHR5cGUgTW9iaWxlVGhlbWVJZCBhcyBTaGFyZWRNb2JpbGVUaGVtZUlkLFxuICB0eXBlIFRoZW1lQXBwZWFyYW5jZSxcbiAgdHlwZSBUaGVtZUNvbG9ycyxcbn0gZnJvbSBcIkB0M3Rvb2xzL3NoYXJlZC90aGVtZVBhbGV0dGVzXCI7XG5pbXBvcnQge1xuICBTVEFOREFSRF9USEVNRV9QUkVWSUVXX0NPTE9SUyxcbiAgdHlwZSBUaGVtZVByZXZpZXdDb2xvcnMsXG59IGZyb20gXCJAdDN0b29scy9zaGFyZWQvdGhlbWVQcmV2aWV3XCI7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PQklMRV9USEVNRV9JRCA9IE1PQklMRV9ERUZBVUxUX1RIRU1FX0lEO1xuZXhwb3J0IGNvbnN0IE1PQklMRV9USEVNRV9JRFMgPSBbLi4uU0hBUkVEX01PQklMRV9USEVNRV9JRFMsIFwibWF0ZXJpYWwteW91XCJdIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgTW9iaWxlVGhlbWVJZCA9IFNoYXJlZE1vYmlsZVRoZW1lSWQgfCBcIm1hdGVyaWFsLXlvdVwiO1xuZXhwb3J0IHR5cGUgTW9iaWxlVGhlbWVBcHBlYXJhbmNlID0gVGhlbWVBcHBlYXJhbmNlO1xuZXhwb3J0IHR5cGUgTW9iaWxlVGhlbWVNb2RlID0gTW9iaWxlVGhlbWVBcHBlYXJhbmNlIHwgXCJzeXN0ZW1cIjtcbmV4cG9ydCB0eXBlIE1vYmlsZVRoZW1lSWRzID0gUmVhZG9ubHk8UmVjb3JkPE1vYmlsZVRoZW1lQXBwZWFyYW5jZSwgTW9iaWxlVGhlbWVJZD4+O1xuXG5leHBvcnQgY29uc3QgTU9CSUxFX1RIRU1FX09QVElPTlM6IFJlYWRvbmx5QXJyYXk8e1xuICByZWFkb25seSBpZDogTW9iaWxlVGhlbWVJZDtcbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcbn0+ID0gW1xuICB7IGlkOiBERUZBVUxUX01PQklMRV9USEVNRV9JRCwgbGFiZWw6IFwiVDMgQ29kZVwiIH0sXG4gIHsgaWQ6IFwibWF0ZXJpYWwteW91XCIsIGxhYmVsOiBcIk1hdGVyaWFsIFlvdVwiIH0sXG4gIC4uLkJVSUxUX0lOX1RIRU1FUy5tYXAoKHRoZW1lKSA9PiAoeyBpZDogdGhlbWUuaWQgYXMgTW9iaWxlVGhlbWVJZCwgbGFiZWw6IHRoZW1lLmxhYmVsIH0pKSxcbl07XG5cbmV4cG9ydCB0eXBlIE1vYmlsZVRoZW1lVmFyaWFibGUgPSBrZXlvZiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVNb2JpbGVUaGVtZVZhcmlhYmxlcz47XG5leHBvcnQgdHlwZSBNb2JpbGVUaGVtZVZhcmlhYmxlcyA9IFJlYWRvbmx5PFJlY29yZDxNb2JpbGVUaGVtZVZhcmlhYmxlLCBzdHJpbmc+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU1vYmlsZVRoZW1lSWQodmFsdWU6IHVua25vd24pOiBNb2JpbGVUaGVtZUlkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAoTU9CSUxFX1RIRU1FX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpXG4gICAgPyAodmFsdWUgYXMgTW9iaWxlVGhlbWVJZClcbiAgICA6IERFRkFVTFRfTU9CSUxFX1RIRU1FX0lEO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTW9iaWxlVGhlbWVNb2RlKHZhbHVlOiB1bmtub3duKTogTW9iaWxlVGhlbWVNb2RlIHtcbiAgcmV0dXJuIHZhbHVlID09PSBcImxpZ2h0XCIgfHwgdmFsdWUgPT09IFwiZGFya1wiIHx8IHZhbHVlID09PSBcInN5c3RlbVwiID8gdmFsdWUgOiBcInN5c3RlbVwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1vYmlsZVRoZW1lSWRzKHByZWZlcmVuY2VzOiB7XG4gIHJlYWRvbmx5IHRoZW1lSWQ/OiB1bmtub3duO1xuICByZWFkb25seSBsaWdodFRoZW1lSWQ/OiB1bmtub3duO1xuICByZWFkb25seSBkYXJrVGhlbWVJZD86IHVua25vd247XG59KTogTW9iaWxlVGhlbWVJZHMge1xuICBjb25zdCBsZWdhY3lUaGVtZUlkID0gbm9ybWFsaXplTW9iaWxlVGhlbWVJZChwcmVmZXJlbmNlcy50aGVtZUlkKTtcbiAgcmV0dXJuIHtcbiAgICBsaWdodDpcbiAgICAgIHByZWZlcmVuY2VzLmxpZ2h0VGhlbWVJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gbGVnYWN5VGhlbWVJZFxuICAgICAgICA6IG5vcm1hbGl6ZU1vYmlsZVRoZW1lSWQocHJlZmVyZW5jZXMubGlnaHRUaGVtZUlkKSxcbiAgICBkYXJrOlxuICAgICAgcHJlZmVyZW5jZXMuZGFya1RoZW1lSWQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGxlZ2FjeVRoZW1lSWRcbiAgICAgICAgOiBub3JtYWxpemVNb2JpbGVUaGVtZUlkKHByZWZlcmVuY2VzLmRhcmtUaGVtZUlkKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vYmlsZVRoZW1lU2VsZWN0aW9uUGF0Y2goXG4gIHRoZW1lSWRzOiBNb2JpbGVUaGVtZUlkcyxcbiAgYWN0aXZlQXBwZWFyYW5jZTogTW9iaWxlVGhlbWVBcHBlYXJhbmNlLFxuICBzZWxlY3RlZEFwcGVhcmFuY2U6IE1vYmlsZVRoZW1lQXBwZWFyYW5jZSxcbiAgdmFsdWU6IE1vYmlsZVRoZW1lSWQsXG4pIHtcbiAgY29uc3QgbmV4dFRoZW1lSWRzOiBNb2JpbGVUaGVtZUlkcyA9IHtcbiAgICBsaWdodDogc2VsZWN0ZWRBcHBlYXJhbmNlID09PSBcImxpZ2h0XCIgPyB2YWx1ZSA6IHRoZW1lSWRzLmxpZ2h0LFxuICAgIGRhcms6IHNlbGVjdGVkQXBwZWFyYW5jZSA9PT0gXCJkYXJrXCIgPyB2YWx1ZSA6IHRoZW1lSWRzLmRhcmssXG4gIH07XG4gIHJldHVybiB7XG4gICAgbGlnaHRUaGVtZUlkOiBuZXh0VGhlbWVJZHMubGlnaHQsXG4gICAgZGFya1RoZW1lSWQ6IG5leHRUaGVtZUlkcy5kYXJrLFxuICAgIHRoZW1lSWQ6IG5leHRUaGVtZUlkc1thY3RpdmVBcHBlYXJhbmNlXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vYmlsZVRoZW1lUGFpclBhdGNoKHZhbHVlOiBNb2JpbGVUaGVtZUlkKSB7XG4gIHJldHVybiB7XG4gICAgbGlnaHRUaGVtZUlkOiB2YWx1ZSxcbiAgICBkYXJrVGhlbWVJZDogdmFsdWUsXG4gICAgdGhlbWVJZDogdmFsdWUsXG4gIH07XG59XG5cbmNvbnN0IE9LTENIX1BBVFRFUk4gPSAvXm9rbGNoXFwoXFxzKihbXFxkLl0rKVxccysoW1xcZC5dKylcXHMrKC0/W1xcZC5dKykoPzpcXHMqXFwvXFxzKihbXFxkLl0rKSk/XFxzKlxcKSQvO1xuXG5mdW5jdGlvbiBsaW5lYXJUb1NyZ2IodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGNvbnZlcnRlZCA9IHZhbHVlIDw9IDAuMDAzMTMwOCA/IDEyLjkyICogdmFsdWUgOiAxLjA1NSAqIHZhbHVlICoqICgxIC8gMi40KSAtIDAuMDU1O1xuICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBjb252ZXJ0ZWQpKSAqIDI1NSk7XG59XG5cbmZ1bmN0aW9uIG9rbGFiVG9MaW5lYXJTcmdiKGxpZ2h0bmVzczogbnVtYmVyLCBhOiBudW1iZXIsIGI6IG51bWJlcikge1xuICBjb25zdCBsID0gKGxpZ2h0bmVzcyArIDAuMzk2MzM3Nzc3NCAqIGEgKyAwLjIxNTgwMzc1NzMgKiBiKSAqKiAzO1xuICBjb25zdCBtID0gKGxpZ2h0bmVzcyAtIDAuMTA1NTYxMzQ1OCAqIGEgLSAwLjA2Mzg1NDE3MjggKiBiKSAqKiAzO1xuICBjb25zdCBzID0gKGxpZ2h0bmVzcyAtIDAuMDg5NDg0MTc3NSAqIGEgLSAxLjI5MTQ4NTU0OCAqIGIpICoqIDM7XG4gIHJldHVybiBbXG4gICAgNC4wNzY3NDE2NjIxICogbCAtIDMuMzA3NzExNTkxMyAqIG0gKyAwLjIzMDk2OTkyOTIgKiBzLFxuICAgIC0xLjI2ODQzODAwNDYgKiBsICsgMi42MDk3NTc0MDExICogbSAtIDAuMzQxMzE5Mzk2NSAqIHMsXG4gICAgLTAuMDA0MTk2MDg2MyAqIGwgLSAwLjcwMzQxODYxNDcgKiBtICsgMS43MDc2MTQ3MDEgKiBzLFxuICBdIGFzIGNvbnN0O1xufVxuXG5mdW5jdGlvbiBva2xhYlRvU3JnYihsaWdodG5lc3M6IG51bWJlciwgYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgY29uc3QgW3JlZCwgZ3JlZW4sIGJsdWVdID0gb2tsYWJUb0xpbmVhclNyZ2IobGlnaHRuZXNzLCBhLCBiKTtcbiAgcmV0dXJuIFtsaW5lYXJUb1NyZ2IocmVkKSwgbGluZWFyVG9TcmdiKGdyZWVuKSwgbGluZWFyVG9TcmdiKGJsdWUpXSBhcyBjb25zdDtcbn1cblxuLyoqIFJlYWN0IE5hdGl2ZSBkb2VzIG5vdCBhY2NlcHQgT0tMQ0ggQ29sb3JWYWx1ZXMsIHNvIHBhbGV0dGVzIGNyb3NzIHRoZSBhcHAgYm91bmRhcnkgYXMgc1JHQi4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aGVtZUNvbG9yVG9OYXRpdmVDb2xvcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbWF0Y2ggPSBPS0xDSF9QQVRURVJOLmV4ZWModmFsdWUpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gdmFsdWU7XG5cbiAgY29uc3QgbGlnaHRuZXNzID0gTnVtYmVyKG1hdGNoWzFdKTtcbiAgY29uc3QgY2hyb21hID0gTnVtYmVyKG1hdGNoWzJdKTtcbiAgY29uc3QgaHVlID0gKE51bWJlcihtYXRjaFszXSkgKiBNYXRoLlBJKSAvIDE4MDtcbiAgY29uc3QgYWxwaGEgPSBtYXRjaFs0XSA9PT0gdW5kZWZpbmVkID8gMSA6IE51bWJlcihtYXRjaFs0XSk7XG4gIGNvbnN0IFtyZWQsIGdyZWVuLCBibHVlXSA9IG9rbGFiVG9TcmdiKGxpZ2h0bmVzcywgY2hyb21hICogTWF0aC5jb3MoaHVlKSwgY2hyb21hICogTWF0aC5zaW4oaHVlKSk7XG5cbiAgcmV0dXJuIGFscGhhIDwgMVxuICAgID8gYHJnYmEoJHtyZWR9LCAke2dyZWVufSwgJHtibHVlfSwgJHtOdW1iZXIoYWxwaGEudG9GaXhlZCg0KSl9KWBcbiAgICA6IGAjJHtbcmVkLCBncmVlbiwgYmx1ZV0ubWFwKChjaGFubmVsKSA9PiBjaGFubmVsLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpLmpvaW4oXCJcIil9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUNvbG9ycyhjb2xvcnM6IFRoZW1lQ29sb3JzKTogVGhlbWVDb2xvcnMge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGNvbG9ycykubWFwKChbcm9sZSwgY29sb3JdKSA9PiBbcm9sZSwgdGhlbWVDb2xvclRvTmF0aXZlQ29sb3IoY29sb3IpXSksXG4gICkgYXMgVGhlbWVDb2xvcnM7XG59XG5cbmZ1bmN0aW9uIHdpdGhBbHBoYShjb2xvcjogc3RyaW5nLCBhbHBoYTogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaGV4ID0gY29sb3Iuc3RhcnRzV2l0aChcIiNcIikgPyBjb2xvci5zbGljZSgxKSA6IFwiXCI7XG4gIGlmIChoZXgubGVuZ3RoICE9PSA2KSByZXR1cm4gY29sb3I7XG4gIGNvbnN0IFtyZWQsIGdyZWVuLCBibHVlXSA9IFswLCAyLCA0XS5tYXAoKG9mZnNldCkgPT5cbiAgICBOdW1iZXIucGFyc2VJbnQoaGV4LnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgMiksIDE2KSxcbiAgKTtcbiAgcmV0dXJuIGByZ2JhKCR7cmVkfSwgJHtncmVlbn0sICR7Ymx1ZX0sICR7YWxwaGF9KWA7XG59XG5cbmZ1bmN0aW9uIHJnYkNoYW5uZWxzKGNvbG9yOiBzdHJpbmcpOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudWxsIHtcbiAgY29uc3QgbWF0Y2ggPSAvXiMoW1xcZGEtZl17Mn0pKFtcXGRhLWZdezJ9KShbXFxkYS1mXXsyfSkoPzpbXFxkYS1mXXsyfSk/JC9pLmV4ZWMoY29sb3IpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgWywgcmVkID0gXCIwXCIsIGdyZWVuID0gXCIwXCIsIGJsdWUgPSBcIjBcIl0gPSBtYXRjaDtcbiAgcmV0dXJuIFtOdW1iZXIucGFyc2VJbnQocmVkLCAxNiksIE51bWJlci5wYXJzZUludChncmVlbiwgMTYpLCBOdW1iZXIucGFyc2VJbnQoYmx1ZSwgMTYpXTtcbn1cblxuLyoqIE5hdGl2ZSBjaGlwcyByZXF1aXJlIG9wYXF1ZSBoZXg7IGZsYXR0ZW4gdHJhbnNsdWNlbnQgcm9sZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlblRoZW1lQ29sb3IoY29sb3I6IHN0cmluZywgc3VyZmFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYWxwaGFIZXggPSAvXiMoW1xcZGEtZl17Nn0pKFtcXGRhLWZdezJ9KSQvaS5leGVjKGNvbG9yKTtcbiAgaWYgKGFscGhhSGV4KSB7XG4gICAgY29uc3QgY2hhbm5lbHMgPSByZ2JDaGFubmVscyhjb2xvcikhO1xuICAgIHJldHVybiBmbGF0dGVuVGhlbWVDb2xvcihcbiAgICAgIGByZ2JhKCR7Y2hhbm5lbHNbMF19LCAke2NoYW5uZWxzWzFdfSwgJHtjaGFubmVsc1syXX0sICR7TnVtYmVyLnBhcnNlSW50KGFscGhhSGV4WzJdISwgMTYpIC8gMjU1fSlgLFxuICAgICAgc3VyZmFjZSxcbiAgICApO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gL15yZ2JhP1xcKFxccyooXFxkKylbLFxcc10rKFxcZCspWyxcXHNdKyhcXGQrKSg/OlssXFxzL10rKFtcXGQuXSspKT9cXHMqXFwpJC9pLmV4ZWMoXG4gICAgY29sb3IudHJpbSgpLFxuICApO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gY29sb3I7XG4gIGNvbnN0IGFscGhhID0gbWF0Y2hbNF0gPT09IHVuZGVmaW5lZCA/IDEgOiBOdW1iZXIobWF0Y2hbNF0pO1xuICBjb25zdCBiZWhpbmQgPSByZ2JDaGFubmVscyhzdXJmYWNlKSA/PyBbMCwgMCwgMF07XG4gIGNvbnN0IGNoYW5uZWxzID0gW21hdGNoWzFdLCBtYXRjaFsyXSwgbWF0Y2hbM11dLm1hcCgoY2hhbm5lbCwgaW5kZXgpID0+XG4gICAgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKE51bWJlcihjaGFubmVsKSAqIGFscGhhICsgYmVoaW5kW2luZGV4XSEgKiAoMSAtIGFscGhhKSkpKSxcbiAgKTtcbiAgcmV0dXJuIGAjJHtjaGFubmVscy5tYXAoKGNoYW5uZWwpID0+IGNoYW5uZWwudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSkuam9pbihcIlwiKX1gO1xufVxuXG5mdW5jdGlvbiBzcmdiVG9MaW5lYXIoY2hhbm5lbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgdmFsdWUgPSBjaGFubmVsIC8gMjU1O1xuICByZXR1cm4gdmFsdWUgPD0gMC4wNDA0NSA/IHZhbHVlIC8gMTIuOTIgOiAoKHZhbHVlICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNDtcbn1cblxuZnVuY3Rpb24gc3JnYlRvT2tsYWIoY2hhbm5lbHM6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICBjb25zdCBbcmVkID0gMCwgZ3JlZW4gPSAwLCBibHVlID0gMF0gPSBjaGFubmVscy5tYXAoc3JnYlRvTGluZWFyKTtcbiAgY29uc3QgbCA9IE1hdGguY2JydCgwLjQxMjIyMTQ3MDggKiByZWQgKyAwLjUzNjMzMjUzNjMgKiBncmVlbiArIDAuMDUxNDQ1OTkyOSAqIGJsdWUpO1xuICBjb25zdCBtID0gTWF0aC5jYnJ0KDAuMjExOTAzNDk4MiAqIHJlZCArIDAuNjgwNjk5NTQ1MSAqIGdyZWVuICsgMC4xMDczOTY5NTY2ICogYmx1ZSk7XG4gIGNvbnN0IHMgPSBNYXRoLmNicnQoMC4wODgzMDI0NjE5ICogcmVkICsgMC4yODE3MTg4Mzc2ICogZ3JlZW4gKyAwLjYyOTk3ODcwMDUgKiBibHVlKTtcbiAgcmV0dXJuIFtcbiAgICAwLjIxMDQ1NDI1NTMgKiBsICsgMC43OTM2MTc3ODUgKiBtIC0gMC4wMDQwNzIwNDY4ICogcyxcbiAgICAxLjk3Nzk5ODQ5NTEgKiBsIC0gMi40Mjg1OTIyMDUgKiBtICsgMC40NTA1OTM3MDk5ICogcyxcbiAgICAwLjAyNTkwNDAzNzEgKiBsICsgMC43ODI3NzE3NjYyICogbSAtIDAuODA4Njc1NzY2ICogcyxcbiAgXSBhcyBjb25zdDtcbn1cblxuZnVuY3Rpb24gcmVsYXRpdmVMdW1pbmFuY2UoY2hhbm5lbHM6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IG51bWJlciB7XG4gIGNvbnN0IFtyZWQsIGdyZWVuLCBibHVlXSA9IGNoYW5uZWxzLm1hcChzcmdiVG9MaW5lYXIpO1xuICByZXR1cm4gMC4yMTI2ICogcmVkISArIDAuNzE1MiAqIGdyZWVuISArIDAuMDcyMiAqIGJsdWUhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXJrVGhlbWVDb2xvcihjb2xvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNoYW5uZWxzID0gcmdiQ2hhbm5lbHMoY29sb3IpO1xuICByZXR1cm4gY2hhbm5lbHMgIT09IG51bGwgJiYgcmVsYXRpdmVMdW1pbmFuY2UoY2hhbm5lbHMpIDwgMC4xODtcbn1cblxuZnVuY3Rpb24gY29udHJhc3RSYXRpbyhcbiAgZmlyc3Q6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgc2Vjb25kOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4pOiBudW1iZXIge1xuICBjb25zdCBmaXJzdEx1bWluYW5jZSA9IHJlbGF0aXZlTHVtaW5hbmNlKGZpcnN0KTtcbiAgY29uc3Qgc2Vjb25kTHVtaW5hbmNlID0gcmVsYXRpdmVMdW1pbmFuY2Uoc2Vjb25kKTtcbiAgcmV0dXJuIChcbiAgICAoTWF0aC5tYXgoZmlyc3RMdW1pbmFuY2UsIHNlY29uZEx1bWluYW5jZSkgKyAwLjA1KSAvXG4gICAgKE1hdGgubWluKGZpcnN0THVtaW5hbmNlLCBzZWNvbmRMdW1pbmFuY2UpICsgMC4wNSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRoZW1lQ29sb3JXaXRoQ29udHJhc3QoXG4gIGFjY2VudDogc3RyaW5nLFxuICBzdXJmYWNlOiBzdHJpbmcgfCBSZWFkb25seUFycmF5PHN0cmluZz4sXG4gIG1pbmltdW0gPSA0LjUsXG4pOiBzdHJpbmcge1xuICBjb25zdCBhY2NlbnRDaGFubmVscyA9IHJnYkNoYW5uZWxzKGFjY2VudCk7XG4gIGNvbnN0IHN1cmZhY2VDaGFubmVscyA9ICh0eXBlb2Ygc3VyZmFjZSA9PT0gXCJzdHJpbmdcIiA/IFtzdXJmYWNlXSA6IHN1cmZhY2UpXG4gICAgLm1hcChyZ2JDaGFubmVscylcbiAgICAuZmlsdGVyKChjaGFubmVscykgPT4gY2hhbm5lbHMgIT09IG51bGwpO1xuICBjb25zdCBtaW5pbXVtQ29udHJhc3QgPSAoY2hhbm5lbHM6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSkgPT5cbiAgICBNYXRoLm1pbiguLi5zdXJmYWNlQ2hhbm5lbHMubWFwKChzdXJmYWNlKSA9PiBjb250cmFzdFJhdGlvKGNoYW5uZWxzLCBzdXJmYWNlKSkpO1xuICBpZiAoXG4gICAgIWFjY2VudENoYW5uZWxzIHx8XG4gICAgc3VyZmFjZUNoYW5uZWxzLmxlbmd0aCA9PT0gMCB8fFxuICAgIG1pbmltdW1Db250cmFzdChhY2NlbnRDaGFubmVscykgPj0gbWluaW11bVxuICApIHtcbiAgICByZXR1cm4gYWNjZW50O1xuICB9XG5cbiAgY29uc3QgYmxhY2sgPSBbMCwgMCwgMF0gYXMgY29uc3Q7XG4gIGNvbnN0IHdoaXRlID0gWzI1NSwgMjU1LCAyNTVdIGFzIGNvbnN0O1xuICBjb25zdCB0YXJnZXQgPSBtaW5pbXVtQ29udHJhc3QoYmxhY2spID49IG1pbmltdW1Db250cmFzdCh3aGl0ZSkgPyBibGFjayA6IHdoaXRlO1xuICBsZXQgcmVhZGFibGU6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IHRhcmdldDtcbiAgbGV0IGxvd2VyQW1vdW50ID0gMDtcbiAgbGV0IHVwcGVyQW1vdW50ID0gMTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDEyOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgYW1vdW50ID0gKGxvd2VyQW1vdW50ICsgdXBwZXJBbW91bnQpIC8gMjtcbiAgICBjb25zdCBjYW5kaWRhdGU6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFtcbiAgICAgIE1hdGgucm91bmQoYWNjZW50Q2hhbm5lbHNbMF0gKyAodGFyZ2V0WzBdIC0gYWNjZW50Q2hhbm5lbHNbMF0pICogYW1vdW50KSxcbiAgICAgIE1hdGgucm91bmQoYWNjZW50Q2hhbm5lbHNbMV0gKyAodGFyZ2V0WzFdIC0gYWNjZW50Q2hhbm5lbHNbMV0pICogYW1vdW50KSxcbiAgICAgIE1hdGgucm91bmQoYWNjZW50Q2hhbm5lbHNbMl0gKyAodGFyZ2V0WzJdIC0gYWNjZW50Q2hhbm5lbHNbMl0pICogYW1vdW50KSxcbiAgICBdO1xuICAgIGlmIChtaW5pbXVtQ29udHJhc3QoY2FuZGlkYXRlKSA+PSBtaW5pbXVtKSB7XG4gICAgICByZWFkYWJsZSA9IGNhbmRpZGF0ZTtcbiAgICAgIHVwcGVyQW1vdW50ID0gYW1vdW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBsb3dlckFtb3VudCA9IGFtb3VudDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAjJHtyZWFkYWJsZS5tYXAoKGNoYW5uZWwpID0+IGNoYW5uZWwudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSkuam9pbihcIlwiKX1gO1xufVxuXG4vKipcbiAqIFVubGlrZSBgdGhlbWVDb2xvcldpdGhDb250cmFzdGAsIHdoaWNoIGJsZW5kcyB0b3dhcmQgYmxhY2sgb3Igd2hpdGUgYW5kIGdyZXlzIHRoZSBjb2xvciBvdXQsXG4gKiB0aGlzIG1vdmVzIG9ubHkgT0tMQ0ggbGlnaHRuZXNzIGFuZCB0YWtlcyB0aGUgbW9zdCBjaHJvbWEgc1JHQiBhbGxvd3MgYXQgZWFjaCBzdGVwLCBzbyBhIHZpdmlkXG4gKiBhY2NlbnQgc3RheXMgdml2aWQgYXQgdGhlIGNvbnRyYXN0IGl0IG5lZWRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWVBY2NlbnRXaXRoQ29udHJhc3QoXG4gIGFjY2VudDogc3RyaW5nLFxuICBzdXJmYWNlczogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICBtaW5pbXVtID0gNC41LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgYWNjZW50Q2hhbm5lbHMgPSByZ2JDaGFubmVscyhhY2NlbnQpO1xuICBjb25zdCBzdXJmYWNlQ2hhbm5lbHMgPSBzdXJmYWNlcy5tYXAocmdiQ2hhbm5lbHMpLmZpbHRlcigoY2hhbm5lbHMpID0+IGNoYW5uZWxzICE9PSBudWxsKTtcbiAgY29uc3QgbWluaW11bUNvbnRyYXN0ID0gKGNoYW5uZWxzOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pID0+XG4gICAgTWF0aC5taW4oLi4uc3VyZmFjZUNoYW5uZWxzLm1hcCgoc3VyZmFjZSkgPT4gY29udHJhc3RSYXRpbyhjaGFubmVscywgc3VyZmFjZSkpKTtcbiAgaWYgKFxuICAgICFhY2NlbnRDaGFubmVscyB8fFxuICAgIHN1cmZhY2VDaGFubmVscy5sZW5ndGggPT09IDAgfHxcbiAgICBtaW5pbXVtQ29udHJhc3QoYWNjZW50Q2hhbm5lbHMpID49IG1pbmltdW1cbiAgKSB7XG4gICAgcmV0dXJuIGFjY2VudDtcbiAgfVxuXG4gIGNvbnN0IFtsaWdodG5lc3MsIGEsIGJdID0gc3JnYlRvT2tsYWIoYWNjZW50Q2hhbm5lbHMpO1xuICBjb25zdCBodWUgPSBNYXRoLmF0YW4yKGIsIGEpO1xuICBjb25zdCBpbkdhbXV0ID0gKGNoYW5uZWxzOiBSZWFkb25seUFycmF5PG51bWJlcj4pID0+XG4gICAgY2hhbm5lbHMuZXZlcnkoKGNoYW5uZWwpID0+IGNoYW5uZWwgPj0gLTFlLTQgJiYgY2hhbm5lbCA8PSAxICsgMWUtNCk7XG4gIGNvbnN0IG1vc3RWaXZpZCA9IChzdGVwTGlnaHRuZXNzOiBudW1iZXIpID0+IHtcbiAgICBsZXQgY2hyb21hID0gMDtcbiAgICBsZXQgbG93ZXIgPSAwO1xuICAgIGxldCB1cHBlciA9IE1hdGgubWF4KE1hdGguaHlwb3QoYSwgYiksIDAuMik7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDIwOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSAobG93ZXIgKyB1cHBlcikgLyAyO1xuICAgICAgaWYgKFxuICAgICAgICBpbkdhbXV0KFxuICAgICAgICAgIG9rbGFiVG9MaW5lYXJTcmdiKHN0ZXBMaWdodG5lc3MsIGNhbmRpZGF0ZSAqIE1hdGguY29zKGh1ZSksIGNhbmRpZGF0ZSAqIE1hdGguc2luKGh1ZSkpLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgY2hyb21hID0gY2FuZGlkYXRlO1xuICAgICAgICBsb3dlciA9IGNhbmRpZGF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwcGVyID0gY2FuZGlkYXRlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2tsYWJUb1NyZ2Ioc3RlcExpZ2h0bmVzcywgY2hyb21hICogTWF0aC5jb3MoaHVlKSwgY2hyb21hICogTWF0aC5zaW4oaHVlKSk7XG4gIH07XG5cbiAgY29uc3QgbGlnaHRlbiA9IG1pbmltdW1Db250cmFzdChbMjU1LCAyNTUsIDI1NV0pID49IG1pbmltdW1Db250cmFzdChbMCwgMCwgMF0pO1xuICBjb25zdCBzdGVwID0gbGlnaHRlbiA/IDAuMDAyIDogLTAuMDAyO1xuICBmb3IgKGxldCBuZXh0ID0gbGlnaHRuZXNzOyBsaWdodGVuID8gbmV4dCA8PSAxIDogbmV4dCA+PSAwOyBuZXh0ICs9IHN0ZXApIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBtb3N0Vml2aWQobmV4dCk7XG4gICAgaWYgKG1pbmltdW1Db250cmFzdChjYW5kaWRhdGUpID49IG1pbmltdW0pIHtcbiAgICAgIHJldHVybiBgIyR7Y2FuZGlkYXRlLm1hcCgoY2hhbm5lbCkgPT4gY2hhbm5lbC50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKS5qb2luKFwiXCIpfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBsaWdodGVuID8gXCIjZmZmZmZmXCIgOiBcIiMwMDAwMDBcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRoZW1lQ29sb3JXaXRoQWxwaGEoY29sb3I6IHN0cmluZywgYWxwaGE6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNoYW5uZWxzID0gcmdiQ2hhbm5lbHMoY29sb3IpO1xuICBpZiAoY2hhbm5lbHMpIHtcbiAgICByZXR1cm4gYHJnYmEoJHtjaGFubmVsc1swXX0sICR7Y2hhbm5lbHNbMV19LCAke2NoYW5uZWxzWzJdfSwgJHthbHBoYX0pYDtcbiAgfVxuICBjb25zdCByZ2IgPSAvXnJnYmE/XFwoXFxzKihbXFxkLl0rKVxccyosXFxzKihbXFxkLl0rKVxccyosXFxzKihbXFxkLl0rKS8uZXhlYyhjb2xvcik7XG4gIHJldHVybiByZ2IgPyBgcmdiYSgke3JnYlsxXX0sICR7cmdiWzJdfSwgJHtyZ2JbM119LCAke2FscGhhfSlgIDogY29sb3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2JpbGVUaGVtZVZhcmlhYmxlcyhcbiAgY29sb3JzOiBUaGVtZUNvbG9ycyxcbiAgYXBwZWFyYW5jZTogTW9iaWxlVGhlbWVBcHBlYXJhbmNlLFxuICBncm91cGVkQ2FyZENvbG9yID0gY29sb3JzLnN1cmZhY2UsXG4gIHByb21pbmVudEFjdGlvbjogcmVhZG9ubHkgW3N0cmluZywgc3RyaW5nXSA9IFtjb2xvcnMudGV4dCwgY29sb3JzLmNhbnZhc10sXG4pIHtcbiAgY29uc3QgYyA9IG5hdGl2ZUNvbG9ycyhjb2xvcnMpO1xuICBjb25zdCBncm91cGVkQ2FyZCA9IHRoZW1lQ29sb3JUb05hdGl2ZUNvbG9yKGdyb3VwZWRDYXJkQ29sb3IpO1xuICBjb25zdCB0ZXh0U3VyZmFjZXMgPSBbXG4gICAgYy5jYW52YXMsXG4gICAgYy5zdXJmYWNlLFxuICAgIGMuc3VyZmFjZVJhaXNlZCxcbiAgICBjLmNocm9tZSxcbiAgICBjLnNpZGViYXIsXG4gICAgYy5zZWNvbmRhcnksXG4gICAgZ3JvdXBlZENhcmQsXG4gIF07XG4gIHJldHVybiB7XG4gICAgXCItLWNvbG9yLXNjcmVlblwiOiBjLmNhbnZhcyxcbiAgICBcIi0tY29sb3Itc2hlZXRcIjogd2l0aEFscGhhKGMuY2hyb21lLCAwLjk4KSxcbiAgICBcIi0tY29sb3Itc2hlZXQtc29saWRcIjogYy5jaHJvbWUsXG4gICAgXCItLWNvbG9yLWNhcmRcIjogYy5zdXJmYWNlLFxuICAgIFwiLS1jb2xvci1ncm91cGVkLWNhcmRcIjogZ3JvdXBlZENhcmQsXG4gICAgXCItLWNvbG9yLWNhcmQtYWx0XCI6IGMuc3VyZmFjZVJhaXNlZCxcbiAgICBcIi0tY29sb3ItY2FyZC10cmFuc2x1Y2VudFwiOiB3aXRoQWxwaGEoYy5zdXJmYWNlLCAwLjgpLFxuICAgIFwiLS1jb2xvci10aHJlYWQtY2FudmFzXCI6IGMuY2FudmFzLFxuICAgIFwiLS1jb2xvci10aHJlYWQtc2VsZWN0ZWRcIjogYy5zaWRlYmFyUm93QWN0aXZlLFxuICAgIFwiLS1jb2xvci10aHJlYWQtc2VsZWN0ZWQtZm9yZWdyb3VuZFwiOiBjLnNpZGViYXJGb3JlZ3JvdW5kLFxuICAgIFwiLS1jb2xvci10aHJlYWQtc2VsZWN0ZWQtZm9yZWdyb3VuZC1tdXRlZFwiOiB0aGVtZUNvbG9yV2l0aENvbnRyYXN0KFxuICAgICAgYy5zaWRlYmFyTXV0ZWRGb3JlZ3JvdW5kLFxuICAgICAgYy5zaWRlYmFyUm93QWN0aXZlLFxuICAgICksXG4gICAgXCItLWNvbG9yLXRocmVhZC1ob3ZlclwiOiBjLnNpZGViYXJSb3dIb3ZlcixcbiAgICBcIi0tY29sb3Itcm93LWhvdmVyXCI6IGMudG9vbGJhckNvbnRyb2xIb3ZlcixcbiAgICBcIi0tY29sb3ItY29tcG9zZXItcGFuZWxcIjogdGhlbWVDb2xvcldpdGhBbHBoYShjLmNhbnZhcywgYXBwZWFyYW5jZSA9PT0gXCJkYXJrXCIgPyAwLjkyIDogMC44OCksXG4gICAgXCItLWNvbG9yLWNvbXBvc2VyLXN1cmZhY2VcIjogdGhlbWVDb2xvcldpdGhBbHBoYShcbiAgICAgIGdyb3VwZWRDYXJkLFxuICAgICAgYXBwZWFyYW5jZSA9PT0gXCJkYXJrXCIgPyAwLjkgOiAwLjk0LFxuICAgICksXG4gICAgXCItLWNvbG9yLWNvbXBvc2VyLWJvcmRlclwiOiB0aGVtZUNvbG9yV2l0aEFscGhhKFxuICAgICAgYy5ib3JkZXIsXG4gICAgICBncm91cGVkQ2FyZCA9PT0gYy5zdXJmYWNlID8gKGFwcGVhcmFuY2UgPT09IFwiZGFya1wiID8gMC40NiA6IDAuNTQpIDogMC44LFxuICAgICksXG4gICAgXCItLWNvbG9yLWZvcmVncm91bmRcIjogYy50ZXh0LFxuICAgIFwiLS1jb2xvci1mb3JlZ3JvdW5kLXNlY29uZGFyeVwiOiB0aGVtZUNvbG9yV2l0aENvbnRyYXN0KGMudGV4dE11dGVkLCB0ZXh0U3VyZmFjZXMpLFxuICAgIFwiLS1jb2xvci1mb3JlZ3JvdW5kLW11dGVkXCI6IHRoZW1lQ29sb3JXaXRoQ29udHJhc3QoYy5tdXRlZEZvcmVncm91bmQsIHRleHRTdXJmYWNlcyksXG4gICAgXCItLWNvbG9yLWZvcmVncm91bmQtdGVydGlhcnlcIjogYy5zZWNvbmRhcnlMYWJlbCxcbiAgICBcIi0tY29sb3ItYm9yZGVyXCI6IGMuYm9yZGVyLFxuICAgIFwiLS1jb2xvci1mb2N1c1wiOiBjLmZvY3VzLFxuICAgIFwiLS1jb2xvci1ib3JkZXItc3VidGxlXCI6IHdpdGhBbHBoYShjLmJvcmRlciwgMC43KSxcbiAgICBcIi0tY29sb3Itc2VwYXJhdG9yXCI6IHdpdGhBbHBoYShjLmJvcmRlciwgMC41NSksXG4gICAgXCItLWNvbG9yLXN1YnRsZVwiOiBjLm11dGVkLFxuICAgIFwiLS1jb2xvci1zdWJ0bGUtc3Ryb25nXCI6IGMuc2Vjb25kYXJ5LFxuICAgIFwiLS1jb2xvci1pbmxpbmUtc2tpbGwtYmFja2dyb3VuZFwiOiBjLmFjY2VudFN1cmZhY2UsXG4gICAgXCItLWNvbG9yLWlubGluZS1za2lsbC1ib3JkZXJcIjogd2l0aEFscGhhKGMuYWNjZW50LCAwLjQyKSxcbiAgICBcIi0tY29sb3ItaW5saW5lLXNraWxsLWZvcmVncm91bmRcIjogYy5hY2NlbnRTdXJmYWNlRm9yZWdyb3VuZCxcbiAgICBcIi0tY29sb3ItcHJpbWFyeVwiOiBjLm1lc3NhZ2VBY3Rpb24sXG4gICAgXCItLWNvbG9yLXByb21pbmVudC1hY3Rpb25cIjogdGhlbWVDb2xvclRvTmF0aXZlQ29sb3IocHJvbWluZW50QWN0aW9uWzBdKSxcbiAgICBcIi0tY29sb3ItcHJvbWluZW50LWFjdGlvbi1mb3JlZ3JvdW5kXCI6IHRoZW1lQ29sb3JUb05hdGl2ZUNvbG9yKHByb21pbmVudEFjdGlvblsxXSksXG4gICAgXCItLWNvbG9yLXByaW1hcnktZm9yZWdyb3VuZFwiOiBjLm1lc3NhZ2VBY3Rpb25Gb3JlZ3JvdW5kLFxuICAgIFwiLS1jb2xvci1wcmltYXJ5LXRleHRcIjogdGhlbWVDb2xvcldpdGhDb250cmFzdChjLm1lc3NhZ2VBY3Rpb24sIHRleHRTdXJmYWNlcyksXG4gICAgXCItLWNvbG9yLXByaW1hcnktc2hhZG93XCI6IFwiIzAwMDAwMFwiLFxuICAgIFwiLS1jb2xvci1zZWNvbmRhcnlcIjogYy5zZWNvbmRhcnksXG4gICAgXCItLWNvbG9yLXNlY29uZGFyeS1mb3JlZ3JvdW5kXCI6IGMuc2Vjb25kYXJ5Rm9yZWdyb3VuZCxcbiAgICBcIi0tY29sb3Itc2Vjb25kYXJ5LWJvcmRlclwiOiBjLmJvcmRlcixcbiAgICBcIi0tY29sb3Itc3dpdGNoLWFjdGl2ZS10cmFja1wiOiBjLm1lc3NhZ2VBY3Rpb24sXG4gICAgXCItLWNvbG9yLXN3aXRjaC1hY3RpdmUtdGh1bWJcIjogYy5tZXNzYWdlQWN0aW9uRm9yZWdyb3VuZCxcbiAgICBcIi0tY29sb3Itc3dpdGNoLWluYWN0aXZlLXRyYWNrXCI6IGMuc2Vjb25kYXJ5LFxuICAgIFwiLS1jb2xvci1zd2l0Y2gtaW5hY3RpdmUtdGh1bWJcIjogYy5tdXRlZEZvcmVncm91bmQsXG4gICAgXCItLWNvbG9yLXdhcm5pbmdcIjogYy53YXJuaW5nU3VyZmFjZSxcbiAgICBcIi0tY29sb3Itd2FybmluZy1ib3JkZXJcIjogd2l0aEFscGhhKGMud2FybmluZywgMC4zMiksXG4gICAgXCItLWNvbG9yLXdhcm5pbmctZm9yZWdyb3VuZFwiOiBjLndhcm5pbmdGb3JlZ3JvdW5kLFxuICAgIFwiLS1jb2xvci1kYW5nZXJcIjogYy5lcnJvclN1cmZhY2UsXG4gICAgXCItLWNvbG9yLWRhbmdlci1ib3JkZXJcIjogd2l0aEFscGhhKGMuZXJyb3IsIDAuMzIpLFxuICAgIFwiLS1jb2xvci1kYW5nZXItZm9yZWdyb3VuZFwiOiBjLmVycm9yRm9yZWdyb3VuZCxcbiAgICBcIi0tY29sb3ItdXBkYXRlXCI6IGMudXBkYXRlU3VyZmFjZSxcbiAgICBcIi0tY29sb3ItdXBkYXRlLWZvcmVncm91bmRcIjogYy51cGRhdGVGb3JlZ3JvdW5kLFxuICAgIFwiLS1jb2xvci1pbnB1dFwiOiBjLnN1cmZhY2UsXG4gICAgXCItLWNvbG9yLWlucHV0LWJvcmRlclwiOiBjLmlucHV0LFxuICAgIFwiLS1jb2xvci1zaWRlYmFyLXNlYXJjaFwiOiBjLnNpZGViYXJDb250cm9sU3VyZmFjZSxcbiAgICBcIi0tY29sb3ItcGxhY2Vob2xkZXJcIjogdGhlbWVDb2xvcldpdGhDb250cmFzdChjLnBsYWNlaG9sZGVyLCB0ZXh0U3VyZmFjZXMpLFxuICAgIFwiLS1jb2xvci1pY29uXCI6IGMudGV4dCxcbiAgICBcIi0tY29sb3ItaWNvbi1tdXRlZFwiOiBjLmljb25NdXRlZCxcbiAgICBcIi0tY29sb3ItaWNvbi1zdWJ0bGVcIjogYy5zZWNvbmRhcnlMYWJlbCxcbiAgICBcIi0tY29sb3ItaGVhZGVyXCI6IHdpdGhBbHBoYShjLnRvb2xiYXIsIDAuOTcpLFxuICAgIFwiLS1jb2xvci1oZWFkZXItZm9yZWdyb3VuZFwiOiBjLnRvb2xiYXJGb3JlZ3JvdW5kLFxuICAgIFwiLS1jb2xvci1oZWFkZXItYm9yZGVyXCI6IGMudG9vbGJhckJvcmRlcixcbiAgICBcIi0tY29sb3ItZ2xhc3Mtc3VyZmFjZVwiOiB3aXRoQWxwaGEoYy5zdXJmYWNlT3ZlcmxheSwgMC43NCksXG4gICAgXCItLWNvbG9yLWdsYXNzLWZhbGxiYWNrXCI6IHRoZW1lQ29sb3JXaXRoQWxwaGEoZ3JvdXBlZENhcmQsIGFwcGVhcmFuY2UgPT09IFwiZGFya1wiID8gMC45IDogMC45NCksXG4gICAgXCItLWNvbG9yLWdsYXNzLXRpbnRcIjogd2l0aEFscGhhKGMuc3VyZmFjZU92ZXJsYXksIDAuMjIpLFxuICAgIFwiLS1jb2xvci1zdGF0dXMtYmFyXCI6IGMuY2FudmFzLFxuICAgIFwiLS1jb2xvci1tZC1ib2R5XCI6IGMudGV4dCxcbiAgICBcIi0tY29sb3ItbWQtc3Ryb25nXCI6IGMudGV4dCxcbiAgICBcIi0tY29sb3ItbWQtbGlua1wiOiB0aGVtZUNvbG9yV2l0aENvbnRyYXN0KGMubWVzc2FnZUFjdGlvbiwgYy5jYW52YXMpLFxuICAgIFwiLS1jb2xvci1tZC1ibG9ja3F1b3RlLWJvcmRlclwiOiBjLmJvcmRlcixcbiAgICBcIi0tY29sb3ItbWQtYmxvY2txdW90ZS1iZ1wiOiBjLm11dGVkLFxuICAgIFwiLS1jb2xvci1tZC1jb2RlLWJnXCI6IGMuY29kZUJhY2tncm91bmQsXG4gICAgXCItLWNvbG9yLW1kLWNvZGUtdGV4dFwiOiBjLmNvZGVGb3JlZ3JvdW5kLFxuICAgIFwiLS1jb2xvci1tZC11c2VyLWNvZGUtYmdcIjogd2l0aEFscGhhKGMubWVzc2FnZUZvcmVncm91bmQsIDAuMTgpLFxuICAgIFwiLS1jb2xvci1tZC11c2VyLWNvZGUtdGV4dFwiOiBjLm1lc3NhZ2VGb3JlZ3JvdW5kLFxuICAgIFwiLS1jb2xvci1tZC11c2VyLWZlbmNlLWJnXCI6IHdpdGhBbHBoYShcIiMwMDAwMDBcIiwgYXBwZWFyYW5jZSA9PT0gXCJkYXJrXCIgPyAwLjI4IDogMC4xNiksXG4gICAgXCItLWNvbG9yLW1kLXVzZXItZmVuY2UtdGV4dFwiOiBjLm1lc3NhZ2VGb3JlZ3JvdW5kLFxuICAgIFwiLS1jb2xvci1tZC1oclwiOiBjLmJvcmRlcixcbiAgICBcIi0tY29sb3ItdXNlci1idWJibGVcIjogYy5tZXNzYWdlU3VyZmFjZSxcbiAgICBcIi0tY29sb3ItdXNlci1idWJibGUtZm9yZWdyb3VuZFwiOiBjLm1lc3NhZ2VGb3JlZ3JvdW5kLFxuICAgIFwiLS1jb2xvci11c2VyLWJ1YmJsZS1mb3JlZ3JvdW5kLW11dGVkXCI6IHdpdGhBbHBoYShjLm1lc3NhZ2VGb3JlZ3JvdW5kLCAwLjc4KSxcbiAgICBcIi0tY29sb3ItdXNlci1idWJibGUtc2tpbGwtZm9yZWdyb3VuZFwiOiB0aGVtZUNvbG9yV2l0aENvbnRyYXN0KFxuICAgICAgYy5tZXNzYWdlQWN0aW9uLFxuICAgICAgYy5tZXNzYWdlU3VyZmFjZSxcbiAgICApLFxuICAgIFwiLS1jb2xvci1iYWNrZHJvcFwiOiB3aXRoQWxwaGEoXCIjMDAwMDAwXCIsIGFwcGVhcmFuY2UgPT09IFwiZGFya1wiID8gMC40OCA6IDAuMjIpLFxuICAgIFwiLS1jb2xvci1kcmF3ZXJcIjogYy5zaWRlYmFyLFxuICAgIFwiLS1jb2xvci1kcmF3ZXItZm9yZWdyb3VuZFwiOiBjLnNpZGViYXJGb3JlZ3JvdW5kLFxuICAgIFwiLS1jb2xvci1kcmF3ZXItZm9yZWdyb3VuZC1tdXRlZFwiOiB0aGVtZUNvbG9yV2l0aENvbnRyYXN0KGMuc2lkZWJhck11dGVkRm9yZWdyb3VuZCwgW1xuICAgICAgYy5zaWRlYmFyLFxuICAgICAgYy5zaWRlYmFyUm93SG92ZXIsXG4gICAgXSksXG4gICAgXCItLWNvbG9yLWRyYXdlci1ib3JkZXJcIjogYy5zaWRlYmFyQm9yZGVyLFxuICAgIFwiLS1jb2xvci1kcmF3ZXItc2hhZG93XCI6IHdpdGhBbHBoYShcIiMwMDAwMDBcIiwgYXBwZWFyYW5jZSA9PT0gXCJkYXJrXCIgPyAwLjMyIDogMC4xMiksXG4gICAgXCItLWNvbG9yLWRvdC1zZXBhcmF0b3JcIjogd2l0aEFscGhhKGMudGV4dE11dGVkLCAwLjM1KSxcbiAgICBcIi0tY29sb3Itd29yZG1hcmtcIjogYy50ZXh0LFxuICAgIFwiLS1jb2xvci1jaGV2cm9uXCI6IHdpdGhBbHBoYShjLnRleHRNdXRlZCwgMC40MiksXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBNT0JJTEVfVEhFTUVfVkFSSUFCTEVfTkFNRVMgPSBPYmplY3Qua2V5cyhcbiAgY3JlYXRlTW9iaWxlVGhlbWVWYXJpYWJsZXMoVDNfQ0hBVF9USEVNRS5jb2xvcnMsIFwibGlnaHRcIiksXG4pIGFzIFJlYWRvbmx5QXJyYXk8TW9iaWxlVGhlbWVWYXJpYWJsZT47XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2JpbGVUaGVtZUNvbG9ycyhcbiAgdGhlbWVJZDogU2hhcmVkTW9iaWxlVGhlbWVJZCxcbiAgYXBwZWFyYW5jZTogTW9iaWxlVGhlbWVBcHBlYXJhbmNlLFxuKTogVGhlbWVDb2xvcnMge1xuICBpZiAodGhlbWVJZCA9PT0gREVGQVVMVF9NT0JJTEVfVEhFTUVfSUQpIHtcbiAgICByZXR1cm4gYXBwZWFyYW5jZSA9PT0gXCJkYXJrXCIgPyBUM19DT0RFX0RBUktfVEhFTUVfQ09MT1JTIDogVDNfQ09ERV9MSUdIVF9USEVNRV9DT0xPUlM7XG4gIH1cbiAgY29uc3QgdGhlbWUgPSBCVUlMVF9JTl9USEVNRVMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHRoZW1lSWQpID8/IFQzX0NIQVRfVEhFTUU7XG4gIHJldHVybiBnZXRUaGVtZUNvbG9yc0ZvckFwcGVhcmFuY2UodGhlbWUsIGFwcGVhcmFuY2UpID8/IHRoZW1lLmNvbG9ycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vYmlsZVRoZW1lVmFyaWFibGVzKFxuICB0aGVtZUlkOiBTaGFyZWRNb2JpbGVUaGVtZUlkLFxuICBhcHBlYXJhbmNlOiBNb2JpbGVUaGVtZUFwcGVhcmFuY2UsXG4gIG92ZXJyaWRlczogUGFydGlhbDxNb2JpbGVUaGVtZVZhcmlhYmxlcz4gfCBudWxsID0gbnVsbCxcbik6IE1vYmlsZVRoZW1lVmFyaWFibGVzIHtcbiAgY29uc3QgY29sb3JzID0gZ2V0TW9iaWxlVGhlbWVDb2xvcnModGhlbWVJZCwgYXBwZWFyYW5jZSk7XG4gIGNvbnN0IGdyb3VwZWRDYXJkID1cbiAgICB0aGVtZUlkID09PSBERUZBVUxUX01PQklMRV9USEVNRV9JRFxuICAgICAgPyBhcHBlYXJhbmNlID09PSBcImxpZ2h0XCJcbiAgICAgICAgPyBjb2xvcnMudG9vbGJhckNvbnRyb2xIb3ZlclxuICAgICAgICA6IGNvbG9ycy5zaWRlYmFyUm93QWN0aXZlXG4gICAgICA6IHRoZW1lSWQgPT09IFwidDMtY2hhdFwiXG4gICAgICAgID8gYXBwZWFyYW5jZSA9PT0gXCJsaWdodFwiXG4gICAgICAgICAgPyBjb2xvcnMudG9vbGJhckNvbnRyb2xcbiAgICAgICAgICA6IGNvbG9ycy5zdXJmYWNlXG4gICAgICAgIDogY29sb3JzLm11dGVkO1xuICBjb25zdCBtb2JpbGVDb2xvcnMgPVxuICAgIHRoZW1lSWQgPT09IERFRkFVTFRfTU9CSUxFX1RIRU1FX0lEXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5jb2xvcnMsXG4gICAgICAgICAgbWVzc2FnZVN1cmZhY2U6IGZsYXR0ZW5UaGVtZUNvbG9yKFxuICAgICAgICAgICAgdGhlbWVDb2xvcldpdGhBbHBoYShcbiAgICAgICAgICAgICAgYXBwZWFyYW5jZSA9PT0gXCJkYXJrXCIgPyBjb2xvcnMuc2lkZWJhclJvd0FjdGl2ZSA6IGNvbG9ycy5ib3JkZXIsXG4gICAgICAgICAgICAgIDAuMyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjb2xvcnMubWVzc2FnZVN1cmZhY2UsXG4gICAgICAgICAgKSxcbiAgICAgICAgfVxuICAgICAgOiBjb2xvcnM7XG4gIGNvbnN0IGJhc2VWYXJpYWJsZXMgPSBjcmVhdGVNb2JpbGVUaGVtZVZhcmlhYmxlcyhcbiAgICBtb2JpbGVDb2xvcnMsXG4gICAgYXBwZWFyYW5jZSxcbiAgICBncm91cGVkQ2FyZCxcbiAgICB0aGVtZUlkID09PSBcInQzLWNoYXRcIiAmJiBhcHBlYXJhbmNlID09PSBcImRhcmtcIlxuICAgICAgPyBbY29sb3JzLm1lc3NhZ2VBY3Rpb25Gb3JlZ3JvdW5kLCBjb2xvcnMubWVzc2FnZUFjdGlvbl1cbiAgICAgIDogdGhlbWVJZCAhPT0gREVGQVVMVF9NT0JJTEVfVEhFTUVfSUQgJiYgdGhlbWVJZCAhPT0gXCJ0My1jaGF0XCJcbiAgICAgICAgPyBbY29sb3JzLm1lc3NhZ2VBY3Rpb24sIGNvbG9ycy5tZXNzYWdlQWN0aW9uRm9yZWdyb3VuZF1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICk7XG5cbiAgcmV0dXJuIG92ZXJyaWRlcyA/ICh7IC4uLmJhc2VWYXJpYWJsZXMsIC4uLm92ZXJyaWRlcyB9IGFzIE1vYmlsZVRoZW1lVmFyaWFibGVzKSA6IGJhc2VWYXJpYWJsZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2JpbGVUaGVtZVByZXZpZXdDb2xvcnMoXG4gIHRoZW1lSWQ6IE1vYmlsZVRoZW1lSWQsXG4gIGFwcGVhcmFuY2U6IE1vYmlsZVRoZW1lQXBwZWFyYW5jZSxcbik6IFRoZW1lUHJldmlld0NvbG9ycyB7XG4gIGlmICh0aGVtZUlkID09PSBERUZBVUxUX01PQklMRV9USEVNRV9JRCB8fCB0aGVtZUlkID09PSBcIm1hdGVyaWFsLXlvdVwiKVxuICAgIHJldHVybiBTVEFOREFSRF9USEVNRV9QUkVWSUVXX0NPTE9SU1thcHBlYXJhbmNlXTtcbiAgY29uc3QgdGhlbWUgPSBCVUlMVF9JTl9USEVNRVMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHRoZW1lSWQpID8/IFQzX0NIQVRfVEhFTUU7XG4gIGNvbnN0IGNvbG9ycyA9IGdldFRoZW1lQ29sb3JzRm9yQXBwZWFyYW5jZSh0aGVtZSwgYXBwZWFyYW5jZSkgPz8gdGhlbWUuY29sb3JzO1xuICByZXR1cm4ge1xuICAgIGNhbnZhczogdGhlbWVDb2xvclRvTmF0aXZlQ29sb3IoY29sb3JzLmNhbnZhcyksXG4gICAgYWNjZW50OiB0aGVtZUNvbG9yVG9OYXRpdmVDb2xvcihjb2xvcnMuYWNjZW50KSxcbiAgICBtZXNzYWdlQWN0aW9uOiB0aGVtZUNvbG9yVG9OYXRpdmVDb2xvcihjb2xvcnMubWVzc2FnZUFjdGlvbiksXG4gIH07XG59XG4iXSwiZmlsZSI6Ii9zcmMvbGliL21vYmlsZVRoZW1lLnRzIn0=

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvYXBwcy9tb2JpbGUvc3JjL2xpYi9tb2JpbGVUaGVtZS50cyIsIi9zcmMvbGliL21vYmlsZVRoZW1lLnRzIix7InVybHMiOiI2IiwiaWRzIjoiNyJ9LFsiOCIsIjkiXSxbXSxbIjgiLCI5Il0se30sIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvc2hhcmVkL3NyYy90aGVtZVBhbGV0dGVzLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9zaGFyZWQvc3JjL3RoZW1lUHJldmlldy50cyJd