__vite_ssr_exportName__("ConnectionDriver", () => { try { return ConnectionDriver } catch {} });
__vite_ssr_exportName__("connectOverRoutes", () => { try { return connectOverRoutes } catch {} });
__vite_ssr_exportName__("make", () => { try { return make } catch {} });
__vite_ssr_exportName__("layer", () => { try { return layer } catch {} });
const __vite_ssr_import_0__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Context.js");
const __vite_ssr_import_1__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Effect.js");
const __vite_ssr_import_2__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Exit.js");
const __vite_ssr_import_3__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Fiber.js");
const __vite_ssr_import_4__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Layer.js");
const __vite_ssr_import_5__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Scope.js");
const __vite_ssr_import_6__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/http/HttpClient.js");
const __vite_ssr_import_7__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/model.ts", {"importedNames":["ConnectionTransientError"]});
const __vite_ssr_import_8__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/resolver.ts");
const __vite_ssr_import_9__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/connection/routes.ts", {"importedNames":["connectionRoutes","routeEntry","routeHttpBaseUrl","sendsTokenInClear","usableRoutes"]});
const __vite_ssr_import_10__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/rpc/session.ts");
const __vite_ssr_import_11__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/environment/descriptor.ts", {"importedNames":["fetchRemoteEnvironmentDescriptor"]});












const ROUTE_CHECK_TIMEOUT_MS = 2500;
// Preferred direct routes share one head start, so a relay connection does not
// wait the full probe timeout for a LAN the device has already left. A route
// that misses it connects over relay, then upgrades with a second reconnect.
const ROUTE_CHECK_HEAD_START_MS = 500;
class ConnectionDriver extends __vite_ssr_import_0__.Service()("@t3tools/client-runtime/connection/driver/ConnectionDriver") {};
const connectOverRoutes = __vite_ssr_import_1__.fn("ConnectionDriver.connectOverRoutes")(function* (entry, checkRoute, connectRoute) {
	const routes = (0,__vite_ssr_import_9__.usableRoutes)(entry);
	const checks = routes.length === 1 ? [] : yield* __vite_ssr_import_1__.forEach(routes, (route) => __vite_ssr_import_1__.forkChild(checkRoute(route)));
	const headStart = yield* __vite_ssr_import_1__.forkChild(__vite_ssr_import_1__.sleep(ROUTE_CHECK_HEAD_START_MS));
	const attemptScope = yield* __vite_ssr_import_5__.Scope;
	let transient;
	let blocked;
	// Each route gets its own scope so a half-open session closes before the next try.
	const attempt = __vite_ssr_import_1__.fnUntraced(function* (route) {
		const routeScope = yield* __vite_ssr_import_5__.fork(attemptScope);
		const result = yield* connectRoute(route).pipe(__vite_ssr_import_5__.provide(routeScope), __vite_ssr_import_1__.onExit((exit) => __vite_ssr_import_2__.isSuccess(exit) ? __vite_ssr_import_1__.void : __vite_ssr_import_5__.close(routeScope, exit)), __vite_ssr_import_1__.result);
		if (result._tag === "Failure") {
			if (result.failure._tag === "ConnectionTransientError") transient ??= result.failure;
			else blocked ??= result.failure;
		};
		return result;
	});
	const silent = [];
	for (const [index, route] of routes.entries()) {
		const check = checks.length === 0 ? "unchecked" : yield* __vite_ssr_import_1__.raceFirst(__vite_ssr_import_3__.join(checks[index]), __vite_ssr_import_3__.join(headStart).pipe(__vite_ssr_import_1__.as("silent")));
		if (check === "silent") {
			silent.push({
				route,
				index
			});
			continue;
		};
		const result = yield* attempt(route);
		if (result._tag === "Success") return result.success;
		// An incompatible server is the same server on every route.
		if (result.failure.reason === "unsupported") return yield* result.failure;
	};
	// A slow route that answered after the head start goes before one that is
	// still dead, which can hold an attempt open far longer than its probe.
	const late = yield* __vite_ssr_import_1__.forEach(silent, ({ index }) => __vite_ssr_import_3__.join(checks[index]), { concurrency: "unbounded" });
	const retry = [...silent.filter((_, position) => late[position] !== "silent"), ...silent.filter((_, position) => late[position] === "silent")];
	for (const { route } of retry) {
		const result = yield* attempt(route);
		if (result._tag === "Success") return result.success;
		if (result.failure.reason === "unsupported") return yield* result.failure;
	};
	return yield* transient ?? blocked ?? new __vite_ssr_import_7__.ConnectionTransientError({
		reason: "endpoint-unavailable",
		detail: `${entry.target.label} did not answer on any saved route.`
	});
});
/** @public */
const make = __vite_ssr_import_1__.gen(function* () {
	const resolver = yield* __vite_ssr_import_8__.ConnectionResolver;
	const sessions = yield* __vite_ssr_import_10__.RpcSessionFactory;
	const httpClient = yield* __vite_ssr_import_6__.HttpClient;
	const checkRoute = (entry, route) => {
		const httpBaseUrl = (0,__vite_ssr_import_9__.routeHttpBaseUrl)(route);
		if (httpBaseUrl === null) return __vite_ssr_import_1__.succeed("unchecked");
		// The descriptor is public, so this sends no credential to whatever
		// answers at a saved LAN address on a different network.
		return (0,__vite_ssr_import_11__.fetchRemoteEnvironmentDescriptor)({
			httpBaseUrl,
			timeoutMs: ROUTE_CHECK_TIMEOUT_MS
		}).pipe(__vite_ssr_import_1__.map((descriptor) => descriptor.environmentId === entry.target.environmentId ? "answered" : "silent"), __vite_ssr_import_1__.orElseSucceed(() => "silent"), __vite_ssr_import_1__.provideService(__vite_ssr_import_6__.HttpClient, httpClient), __vite_ssr_import_1__.withSpan("ConnectionDriver.checkRoute", { attributes: { "connection.target.kind": route.target._tag } }));
	};
	const connect = __vite_ssr_import_1__.fn("ConnectionDriver.connect")(function* (entry, reportProgress) {
		const target = entry.target;
		yield* __vite_ssr_import_1__.annotateCurrentSpan({
			"connection.environment.id": target.environmentId,
			"connection.target.kind": target._tag,
			"connection.route.count": (0,__vite_ssr_import_9__.connectionRoutes)(entry).length
		});
		yield* reportProgress({ stage: "preparing" });
		return yield* connectOverRoutes(entry, (route) => checkRoute(entry, route), __vite_ssr_import_1__.fnUntraced(function* (route) {
			const prepared = yield* resolver.prepare((0,__vite_ssr_import_9__.routeEntry)(entry, route));
			yield* reportProgress({
				stage: "opening",
				prepared
			});
			const session = yield* sessions.connect(prepared);
			yield* reportProgress({
				stage: "synchronizing",
				prepared
			});
			yield* session.ready;
			return {
				prepared,
				session
			};
		}));
	});
	const preflight = (entry, route) => ((0,__vite_ssr_import_9__.sendsTokenInClear)((0,__vite_ssr_import_9__.connectionRoutes)(entry), route) ? __vite_ssr_import_1__.succeed("silent") : checkRoute(entry, route)).pipe(__vite_ssr_import_1__.flatMap((check) => check === "answered" ? resolver.prepare((0,__vite_ssr_import_9__.routeEntry)(entry, route)).pipe(__vite_ssr_import_1__.as(true), __vite_ssr_import_1__.orElseSucceed(() => false)) : __vite_ssr_import_1__.succeed(false)), __vite_ssr_import_1__.withSpan("ConnectionDriver.preflight"));
	return ConnectionDriver.of({
		connect,
		checkRoute,
		preflight
	});
});
const layer = __vite_ssr_import_4__.effect(ConnectionDriver, make);
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,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Q0FFRCxNQUFNLGFBQWEsT0FBK0IsV0FDL0MsNENBQWtCLDJDQUFpQixLQUFLLEdBQUcsS0FBSyxJQUM3QyxzQkFBTyxRQUFRLFFBQWlCLElBQ2hDLFdBQVcsT0FBTyxLQUFLLEVBQUMsQ0FDMUIsS0FDQSxzQkFBTyxTQUFTLFVBQ2QsVUFBVSxhQUNOLFNBQVMsUUFBUSxxQ0FBVyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FDekMsc0JBQU8sR0FBRyxJQUFJLEdBQ2Qsc0JBQU8sb0JBQW9CLEtBQUssQ0FDbEMsSUFDQSxzQkFBTyxRQUFRLEtBQUssQ0FDMUIsR0FDQSxzQkFBTyxTQUFTLDRCQUE0QixDQUM5QztDQUVGLE9BQU8saUJBQWlCLEdBQUc7RUFBRTtFQUFTO0VBQVk7Q0FBVSxDQUFDO0FBQy9ELENBQUM7QUFFTSxNQUFNLFFBQVEsc0JBQU0sT0FBTyxrQkFBa0IsSUFBSSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiZHJpdmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIENvbnRleHQgZnJvbSBcImVmZmVjdC9Db250ZXh0XCI7XG5pbXBvcnQgKiBhcyBFZmZlY3QgZnJvbSBcImVmZmVjdC9FZmZlY3RcIjtcbmltcG9ydCAqIGFzIEV4aXQgZnJvbSBcImVmZmVjdC9FeGl0XCI7XG5pbXBvcnQgKiBhcyBGaWJlciBmcm9tIFwiZWZmZWN0L0ZpYmVyXCI7XG5pbXBvcnQgKiBhcyBMYXllciBmcm9tIFwiZWZmZWN0L0xheWVyXCI7XG5pbXBvcnQgKiBhcyBTY29wZSBmcm9tIFwiZWZmZWN0L1Njb3BlXCI7XG5pbXBvcnQgKiBhcyBIdHRwQ2xpZW50IGZyb20gXCJlZmZlY3QvaHR0cC9IdHRwQ2xpZW50XCI7XG5cbmltcG9ydCB0eXBlIHsgQ29ubmVjdGlvbkNhdGFsb2dFbnRyeSwgQ29ubmVjdGlvblJvdXRlIH0gZnJvbSBcIi4vY2F0YWxvZy50c1wiO1xuaW1wb3J0IHR5cGUge1xuICBDb25uZWN0aW9uQXR0ZW1wdEVycm9yLFxuICBDb25uZWN0aW9uQXR0ZW1wdFN0YWdlLFxuICBQcmVwYXJlZENvbm5lY3Rpb24sXG59IGZyb20gXCIuL21vZGVsLnRzXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uVHJhbnNpZW50RXJyb3IgfSBmcm9tIFwiLi9tb2RlbC50c1wiO1xuaW1wb3J0ICogYXMgQ29ubmVjdGlvblJlc29sdmVyIGZyb20gXCIuL3Jlc29sdmVyLnRzXCI7XG5pbXBvcnQge1xuICBjb25uZWN0aW9uUm91dGVzLFxuICByb3V0ZUVudHJ5LFxuICByb3V0ZUh0dHBCYXNlVXJsLFxuICBzZW5kc1Rva2VuSW5DbGVhcixcbiAgdXNhYmxlUm91dGVzLFxufSBmcm9tIFwiLi9yb3V0ZXMudHNcIjtcbmltcG9ydCAqIGFzIFJwY1Nlc3Npb24gZnJvbSBcIi4uL3JwYy9zZXNzaW9uLnRzXCI7XG5pbXBvcnQgeyBmZXRjaFJlbW90ZUVudmlyb25tZW50RGVzY3JpcHRvciB9IGZyb20gXCIuLi9lbnZpcm9ubWVudC9kZXNjcmlwdG9yLnRzXCI7XG5cbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25Ecml2ZXJQcm9ncmVzcyA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgc3RhZ2U6IFwicHJlcGFyaW5nXCI7XG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHN0YWdlOiBFeGNsdWRlPENvbm5lY3Rpb25BdHRlbXB0U3RhZ2UsIFwicHJlcGFyaW5nXCI+O1xuICAgICAgcmVhZG9ubHkgcHJlcGFyZWQ6IFByZXBhcmVkQ29ubmVjdGlvbjtcbiAgICB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50Q29ubmVjdGlvbkxlYXNlIHtcbiAgcmVhZG9ubHkgcHJlcGFyZWQ6IFByZXBhcmVkQ29ubmVjdGlvbjtcbiAgcmVhZG9ubHkgc2Vzc2lvbjogUnBjU2Vzc2lvbi5ScGNTZXNzaW9uO1xufVxuXG5leHBvcnQgdHlwZSBSb3V0ZUNoZWNrID0gXCJhbnN3ZXJlZFwiIHwgXCJzaWxlbnRcIiB8IFwidW5jaGVja2VkXCI7XG5cbmNvbnN0IFJPVVRFX0NIRUNLX1RJTUVPVVRfTVMgPSAyXzUwMDtcbi8vIFByZWZlcnJlZCBkaXJlY3Qgcm91dGVzIHNoYXJlIG9uZSBoZWFkIHN0YXJ0LCBzbyBhIHJlbGF5IGNvbm5lY3Rpb24gZG9lcyBub3Rcbi8vIHdhaXQgdGhlIGZ1bGwgcHJvYmUgdGltZW91dCBmb3IgYSBMQU4gdGhlIGRldmljZSBoYXMgYWxyZWFkeSBsZWZ0LiBBIHJvdXRlXG4vLyB0aGF0IG1pc3NlcyBpdCBjb25uZWN0cyBvdmVyIHJlbGF5LCB0aGVuIHVwZ3JhZGVzIHdpdGggYSBzZWNvbmQgcmVjb25uZWN0LlxuY29uc3QgUk9VVEVfQ0hFQ0tfSEVBRF9TVEFSVF9NUyA9IDUwMDtcblxuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25Ecml2ZXIgZXh0ZW5kcyBDb250ZXh0LlNlcnZpY2U8XG4gIENvbm5lY3Rpb25Ecml2ZXIsXG4gIHtcbiAgICByZWFkb25seSBjb25uZWN0OiAoXG4gICAgICBlbnRyeTogQ29ubmVjdGlvbkNhdGFsb2dFbnRyeSxcbiAgICAgIHJlcG9ydFByb2dyZXNzOiAocHJvZ3Jlc3M6IENvbm5lY3Rpb25Ecml2ZXJQcm9ncmVzcykgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPixcbiAgICApID0+IEVmZmVjdC5FZmZlY3Q8RW52aXJvbm1lbnRDb25uZWN0aW9uTGVhc2UsIENvbm5lY3Rpb25BdHRlbXB0RXJyb3IsIFNjb3BlLlNjb3BlPjtcbiAgICByZWFkb25seSBjaGVja1JvdXRlOiAoXG4gICAgICBlbnRyeTogQ29ubmVjdGlvbkNhdGFsb2dFbnRyeSxcbiAgICAgIHJvdXRlOiBDb25uZWN0aW9uUm91dGUsXG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PFJvdXRlQ2hlY2s+O1xuICAgIHJlYWRvbmx5IHByZWZsaWdodDogKFxuICAgICAgZW50cnk6IENvbm5lY3Rpb25DYXRhbG9nRW50cnksXG4gICAgICByb3V0ZTogQ29ubmVjdGlvblJvdXRlLFxuICAgICkgPT4gRWZmZWN0LkVmZmVjdDxib29sZWFuPjtcbiAgfVxuPigpKFwiQHQzdG9vbHMvY2xpZW50LXJ1bnRpbWUvY29ubmVjdGlvbi9kcml2ZXIvQ29ubmVjdGlvbkRyaXZlclwiKSB7fVxuXG5leHBvcnQgY29uc3QgY29ubmVjdE92ZXJSb3V0ZXMgPSBFZmZlY3QuZm4oXCJDb25uZWN0aW9uRHJpdmVyLmNvbm5lY3RPdmVyUm91dGVzXCIpKGZ1bmN0aW9uKiA8Uj4oXG4gIGVudHJ5OiBDb25uZWN0aW9uQ2F0YWxvZ0VudHJ5LFxuICBjaGVja1JvdXRlOiAocm91dGU6IENvbm5lY3Rpb25Sb3V0ZSkgPT4gRWZmZWN0LkVmZmVjdDxSb3V0ZUNoZWNrPixcbiAgY29ubmVjdFJvdXRlOiAoXG4gICAgcm91dGU6IENvbm5lY3Rpb25Sb3V0ZSxcbiAgKSA9PiBFZmZlY3QuRWZmZWN0PEVudmlyb25tZW50Q29ubmVjdGlvbkxlYXNlLCBDb25uZWN0aW9uQXR0ZW1wdEVycm9yLCBSIHwgU2NvcGUuU2NvcGU+LFxuKSB7XG4gIGNvbnN0IHJvdXRlcyA9IHVzYWJsZVJvdXRlcyhlbnRyeSk7XG4gIGNvbnN0IGNoZWNrcyA9XG4gICAgcm91dGVzLmxlbmd0aCA9PT0gMVxuICAgICAgPyBbXVxuICAgICAgOiB5aWVsZCogRWZmZWN0LmZvckVhY2gocm91dGVzLCAocm91dGUpID0+IEVmZmVjdC5mb3JrQ2hpbGQoY2hlY2tSb3V0ZShyb3V0ZSkpKTtcbiAgY29uc3QgaGVhZFN0YXJ0ID0geWllbGQqIEVmZmVjdC5mb3JrQ2hpbGQoRWZmZWN0LnNsZWVwKFJPVVRFX0NIRUNLX0hFQURfU1RBUlRfTVMpKTtcbiAgY29uc3QgYXR0ZW1wdFNjb3BlID0geWllbGQqIFNjb3BlLlNjb3BlO1xuICBsZXQgdHJhbnNpZW50OiBDb25uZWN0aW9uQXR0ZW1wdEVycm9yIHwgdW5kZWZpbmVkO1xuICBsZXQgYmxvY2tlZDogQ29ubmVjdGlvbkF0dGVtcHRFcnJvciB8IHVuZGVmaW5lZDtcbiAgLy8gRWFjaCByb3V0ZSBnZXRzIGl0cyBvd24gc2NvcGUgc28gYSBoYWxmLW9wZW4gc2Vzc2lvbiBjbG9zZXMgYmVmb3JlIHRoZSBuZXh0IHRyeS5cbiAgY29uc3QgYXR0ZW1wdCA9IEVmZmVjdC5mblVudHJhY2VkKGZ1bmN0aW9uKiAocm91dGU6IENvbm5lY3Rpb25Sb3V0ZSkge1xuICAgIGNvbnN0IHJvdXRlU2NvcGUgPSB5aWVsZCogU2NvcGUuZm9yayhhdHRlbXB0U2NvcGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkKiBjb25uZWN0Um91dGUocm91dGUpLnBpcGUoXG4gICAgICBTY29wZS5wcm92aWRlKHJvdXRlU2NvcGUpLFxuICAgICAgRWZmZWN0Lm9uRXhpdCgoZXhpdCkgPT4gKEV4aXQuaXNTdWNjZXNzKGV4aXQpID8gRWZmZWN0LnZvaWQgOiBTY29wZS5jbG9zZShyb3V0ZVNjb3BlLCBleGl0KSkpLFxuICAgICAgRWZmZWN0LnJlc3VsdCxcbiAgICApO1xuICAgIGlmIChyZXN1bHQuX3RhZyA9PT0gXCJGYWlsdXJlXCIpIHtcbiAgICAgIGlmIChyZXN1bHQuZmFpbHVyZS5fdGFnID09PSBcIkNvbm5lY3Rpb25UcmFuc2llbnRFcnJvclwiKSB0cmFuc2llbnQgPz89IHJlc3VsdC5mYWlsdXJlO1xuICAgICAgZWxzZSBibG9ja2VkID8/PSByZXN1bHQuZmFpbHVyZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG4gIGNvbnN0IHNpbGVudDogQXJyYXk8eyByZWFkb25seSByb3V0ZTogQ29ubmVjdGlvblJvdXRlOyByZWFkb25seSBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCByb3V0ZV0gb2Ygcm91dGVzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGNoZWNrID1cbiAgICAgIGNoZWNrcy5sZW5ndGggPT09IDBcbiAgICAgICAgPyBcInVuY2hlY2tlZFwiXG4gICAgICAgIDogeWllbGQqIEVmZmVjdC5yYWNlRmlyc3QoXG4gICAgICAgICAgICBGaWJlci5qb2luKGNoZWNrc1tpbmRleF0hKSxcbiAgICAgICAgICAgIEZpYmVyLmpvaW4oaGVhZFN0YXJ0KS5waXBlKEVmZmVjdC5hczxSb3V0ZUNoZWNrPihcInNpbGVudFwiKSksXG4gICAgICAgICAgKTtcbiAgICBpZiAoY2hlY2sgPT09IFwic2lsZW50XCIpIHtcbiAgICAgIHNpbGVudC5wdXNoKHsgcm91dGUsIGluZGV4IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkKiBhdHRlbXB0KHJvdXRlKTtcbiAgICBpZiAocmVzdWx0Ll90YWcgPT09IFwiU3VjY2Vzc1wiKSByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7XG4gICAgLy8gQW4gaW5jb21wYXRpYmxlIHNlcnZlciBpcyB0aGUgc2FtZSBzZXJ2ZXIgb24gZXZlcnkgcm91dGUuXG4gICAgaWYgKHJlc3VsdC5mYWlsdXJlLnJlYXNvbiA9PT0gXCJ1bnN1cHBvcnRlZFwiKSByZXR1cm4geWllbGQqIHJlc3VsdC5mYWlsdXJlO1xuICB9XG4gIC8vIEEgc2xvdyByb3V0ZSB0aGF0IGFuc3dlcmVkIGFmdGVyIHRoZSBoZWFkIHN0YXJ0IGdvZXMgYmVmb3JlIG9uZSB0aGF0IGlzXG4gIC8vIHN0aWxsIGRlYWQsIHdoaWNoIGNhbiBob2xkIGFuIGF0dGVtcHQgb3BlbiBmYXIgbG9uZ2VyIHRoYW4gaXRzIHByb2JlLlxuICBjb25zdCBsYXRlID0geWllbGQqIEVmZmVjdC5mb3JFYWNoKHNpbGVudCwgKHsgaW5kZXggfSkgPT4gRmliZXIuam9pbihjaGVja3NbaW5kZXhdISksIHtcbiAgICBjb25jdXJyZW5jeTogXCJ1bmJvdW5kZWRcIixcbiAgfSk7XG4gIGNvbnN0IHJldHJ5ID0gW1xuICAgIC4uLnNpbGVudC5maWx0ZXIoKF8sIHBvc2l0aW9uKSA9PiBsYXRlW3Bvc2l0aW9uXSAhPT0gXCJzaWxlbnRcIiksXG4gICAgLi4uc2lsZW50LmZpbHRlcigoXywgcG9zaXRpb24pID0+IGxhdGVbcG9zaXRpb25dID09PSBcInNpbGVudFwiKSxcbiAgXTtcbiAgZm9yIChjb25zdCB7IHJvdXRlIH0gb2YgcmV0cnkpIHtcbiAgICBjb25zdCByZXN1bHQgPSB5aWVsZCogYXR0ZW1wdChyb3V0ZSk7XG4gICAgaWYgKHJlc3VsdC5fdGFnID09PSBcIlN1Y2Nlc3NcIikgcmV0dXJuIHJlc3VsdC5zdWNjZXNzO1xuICAgIGlmIChyZXN1bHQuZmFpbHVyZS5yZWFzb24gPT09IFwidW5zdXBwb3J0ZWRcIikgcmV0dXJuIHlpZWxkKiByZXN1bHQuZmFpbHVyZTtcbiAgfVxuICByZXR1cm4geWllbGQqIChcbiAgICB0cmFuc2llbnQgPz9cbiAgICAgIGJsb2NrZWQgPz9cbiAgICAgIG5ldyBDb25uZWN0aW9uVHJhbnNpZW50RXJyb3Ioe1xuICAgICAgICByZWFzb246IFwiZW5kcG9pbnQtdW5hdmFpbGFibGVcIixcbiAgICAgICAgZGV0YWlsOiBgJHtlbnRyeS50YXJnZXQubGFiZWx9IGRpZCBub3QgYW5zd2VyIG9uIGFueSBzYXZlZCByb3V0ZS5gLFxuICAgICAgfSlcbiAgKTtcbn0pO1xuXG4vKiogQHB1YmxpYyAqL1xuZXhwb3J0IGNvbnN0IG1ha2UgPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gIGNvbnN0IHJlc29sdmVyID0geWllbGQqIENvbm5lY3Rpb25SZXNvbHZlci5Db25uZWN0aW9uUmVzb2x2ZXI7XG4gIGNvbnN0IHNlc3Npb25zID0geWllbGQqIFJwY1Nlc3Npb24uUnBjU2Vzc2lvbkZhY3Rvcnk7XG4gIGNvbnN0IGh0dHBDbGllbnQgPSB5aWVsZCogSHR0cENsaWVudC5IdHRwQ2xpZW50O1xuXG4gIGNvbnN0IGNoZWNrUm91dGUgPSAoZW50cnk6IENvbm5lY3Rpb25DYXRhbG9nRW50cnksIHJvdXRlOiBDb25uZWN0aW9uUm91dGUpID0+IHtcbiAgICBjb25zdCBodHRwQmFzZVVybCA9IHJvdXRlSHR0cEJhc2VVcmwocm91dGUpO1xuICAgIGlmIChodHRwQmFzZVVybCA9PT0gbnVsbCkgcmV0dXJuIEVmZmVjdC5zdWNjZWVkPFJvdXRlQ2hlY2s+KFwidW5jaGVja2VkXCIpO1xuICAgIC8vIFRoZSBkZXNjcmlwdG9yIGlzIHB1YmxpYywgc28gdGhpcyBzZW5kcyBubyBjcmVkZW50aWFsIHRvIHdoYXRldmVyXG4gICAgLy8gYW5zd2VycyBhdCBhIHNhdmVkIExBTiBhZGRyZXNzIG9uIGEgZGlmZmVyZW50IG5ldHdvcmsuXG4gICAgcmV0dXJuIGZldGNoUmVtb3RlRW52aXJvbm1lbnREZXNjcmlwdG9yKHtcbiAgICAgIGh0dHBCYXNlVXJsLFxuICAgICAgdGltZW91dE1zOiBST1VURV9DSEVDS19USU1FT1VUX01TLFxuICAgIH0pLnBpcGUoXG4gICAgICBFZmZlY3QubWFwKChkZXNjcmlwdG9yKTogUm91dGVDaGVjayA9PlxuICAgICAgICBkZXNjcmlwdG9yLmVudmlyb25tZW50SWQgPT09IGVudHJ5LnRhcmdldC5lbnZpcm9ubWVudElkID8gXCJhbnN3ZXJlZFwiIDogXCJzaWxlbnRcIixcbiAgICAgICksXG4gICAgICBFZmZlY3Qub3JFbHNlU3VjY2VlZCgoKTogUm91dGVDaGVjayA9PiBcInNpbGVudFwiKSxcbiAgICAgIEVmZmVjdC5wcm92aWRlU2VydmljZShIdHRwQ2xpZW50Lkh0dHBDbGllbnQsIGh0dHBDbGllbnQpLFxuICAgICAgRWZmZWN0LndpdGhTcGFuKFwiQ29ubmVjdGlvbkRyaXZlci5jaGVja1JvdXRlXCIsIHtcbiAgICAgICAgYXR0cmlidXRlczogeyBcImNvbm5lY3Rpb24udGFyZ2V0LmtpbmRcIjogcm91dGUudGFyZ2V0Ll90YWcgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgY29ubmVjdCA9IEVmZmVjdC5mbihcIkNvbm5lY3Rpb25Ecml2ZXIuY29ubmVjdFwiKShmdW5jdGlvbiogKFxuICAgIGVudHJ5OiBDb25uZWN0aW9uQ2F0YWxvZ0VudHJ5LFxuICAgIHJlcG9ydFByb2dyZXNzOiAocHJvZ3Jlc3M6IENvbm5lY3Rpb25Ecml2ZXJQcm9ncmVzcykgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPixcbiAgKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZW50cnkudGFyZ2V0O1xuICAgIHlpZWxkKiBFZmZlY3QuYW5ub3RhdGVDdXJyZW50U3Bhbih7XG4gICAgICBcImNvbm5lY3Rpb24uZW52aXJvbm1lbnQuaWRcIjogdGFyZ2V0LmVudmlyb25tZW50SWQsXG4gICAgICBcImNvbm5lY3Rpb24udGFyZ2V0LmtpbmRcIjogdGFyZ2V0Ll90YWcsXG4gICAgICBcImNvbm5lY3Rpb24ucm91dGUuY291bnRcIjogY29ubmVjdGlvblJvdXRlcyhlbnRyeSkubGVuZ3RoLFxuICAgIH0pO1xuICAgIHlpZWxkKiByZXBvcnRQcm9ncmVzcyh7IHN0YWdlOiBcInByZXBhcmluZ1wiIH0pO1xuICAgIHJldHVybiB5aWVsZCogY29ubmVjdE92ZXJSb3V0ZXMoXG4gICAgICBlbnRyeSxcbiAgICAgIChyb3V0ZSkgPT4gY2hlY2tSb3V0ZShlbnRyeSwgcm91dGUpLFxuICAgICAgRWZmZWN0LmZuVW50cmFjZWQoZnVuY3Rpb24qIChyb3V0ZSkge1xuICAgICAgICBjb25zdCBwcmVwYXJlZCA9IHlpZWxkKiByZXNvbHZlci5wcmVwYXJlKHJvdXRlRW50cnkoZW50cnksIHJvdXRlKSk7XG4gICAgICAgIHlpZWxkKiByZXBvcnRQcm9ncmVzcyh7IHN0YWdlOiBcIm9wZW5pbmdcIiwgcHJlcGFyZWQgfSk7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB5aWVsZCogc2Vzc2lvbnMuY29ubmVjdChwcmVwYXJlZCk7XG4gICAgICAgIHlpZWxkKiByZXBvcnRQcm9ncmVzcyh7IHN0YWdlOiBcInN5bmNocm9uaXppbmdcIiwgcHJlcGFyZWQgfSk7XG4gICAgICAgIHlpZWxkKiBzZXNzaW9uLnJlYWR5O1xuICAgICAgICByZXR1cm4geyBwcmVwYXJlZCwgc2Vzc2lvbiB9IHNhdGlzZmllcyBFbnZpcm9ubWVudENvbm5lY3Rpb25MZWFzZTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IHByZWZsaWdodCA9IChlbnRyeTogQ29ubmVjdGlvbkNhdGFsb2dFbnRyeSwgcm91dGU6IENvbm5lY3Rpb25Sb3V0ZSkgPT5cbiAgICAoc2VuZHNUb2tlbkluQ2xlYXIoY29ubmVjdGlvblJvdXRlcyhlbnRyeSksIHJvdXRlKVxuICAgICAgPyBFZmZlY3Quc3VjY2VlZChcInNpbGVudFwiIGFzIGNvbnN0KVxuICAgICAgOiBjaGVja1JvdXRlKGVudHJ5LCByb3V0ZSlcbiAgICApLnBpcGUoXG4gICAgICBFZmZlY3QuZmxhdE1hcCgoY2hlY2spID0+XG4gICAgICAgIGNoZWNrID09PSBcImFuc3dlcmVkXCJcbiAgICAgICAgICA/IHJlc29sdmVyLnByZXBhcmUocm91dGVFbnRyeShlbnRyeSwgcm91dGUpKS5waXBlKFxuICAgICAgICAgICAgICBFZmZlY3QuYXModHJ1ZSksXG4gICAgICAgICAgICAgIEVmZmVjdC5vckVsc2VTdWNjZWVkKCgpID0+IGZhbHNlKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IEVmZmVjdC5zdWNjZWVkKGZhbHNlKSxcbiAgICAgICksXG4gICAgICBFZmZlY3Qud2l0aFNwYW4oXCJDb25uZWN0aW9uRHJpdmVyLnByZWZsaWdodFwiKSxcbiAgICApO1xuXG4gIHJldHVybiBDb25uZWN0aW9uRHJpdmVyLm9mKHsgY29ubmVjdCwgY2hlY2tSb3V0ZSwgcHJlZmxpZ2h0IH0pO1xufSk7XG5cbmV4cG9ydCBjb25zdCBsYXllciA9IExheWVyLmVmZmVjdChDb25uZWN0aW9uRHJpdmVyLCBtYWtlKTtcbiJdLCJmaWxlIjoiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvY29ubmVjdGlvbi9kcml2ZXIudHMifQ==

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL2Nvbm5lY3Rpb24vZHJpdmVyLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvY29ubmVjdGlvbi9kcml2ZXIudHMiLHsidXJscyI6IjYiLCJpZHMiOiI3In0sWyI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5Il0sW10sWyI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5Il0se30sIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvQ29udGV4dC5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvRWZmZWN0LmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9FeGl0LmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9GaWJlci5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvTGF5ZXIuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L1Njb3BlLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9odHRwL0h0dHBDbGllbnQuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9jb25uZWN0aW9uL21vZGVsLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvY29ubmVjdGlvbi9yZXNvbHZlci50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL2Nvbm5lY3Rpb24vcm91dGVzLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9jbGllbnQtcnVudGltZS9zcmMvcnBjL3Nlc3Npb24udHMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9lbnZpcm9ubWVudC9kZXNjcmlwdG9yLnRzIl0=