diff --git a/apps/control-plane/package.json b/apps/control-plane/package.json index 1fd282e..1619254 100644 --- a/apps/control-plane/package.json +++ b/apps/control-plane/package.json @@ -22,6 +22,7 @@ "@hono/oidc-auth": "^1.8.1", "@hono/zod-openapi": "1.2.3", "@paws/credentials": "workspace:*", + "@paws/domain-agent": "workspace:*", "@paws/domain-audit": "workspace:*", "@paws/domain-browser": "workspace:*", "@paws/domain-common": "workspace:*", @@ -29,6 +30,7 @@ "@paws/domain-fleet": "workspace:*", "@paws/domain-mcp": "workspace:*", "@paws/domain-network": "workspace:*", + "@paws/domain-policy": "workspace:*", "@paws/domain-session": "workspace:*", "@paws/domain-snapshot": "workspace:*", "@paws/integrations": "workspace:*", diff --git a/apps/control-plane/src/app.ts b/apps/control-plane/src/app.ts index d92be68..41b7aa1 100644 --- a/apps/control-plane/src/app.ts +++ b/apps/control-plane/src/app.ts @@ -29,10 +29,10 @@ import { listDaemonsRoute, updateDaemonRoute, receiveWebhookRoute, - createGovernanceChecker, createDaemonStore, type DaemonStore, } from '@paws/domain-daemon'; +import { createGovernanceChecker } from '@paws/domain-policy'; import { selectWorker, costSummaryRoute, @@ -86,7 +86,7 @@ import { createWorkerClient } from './worker-client.js'; import type { CredentialStore } from '@paws/credentials'; import type { PawsDatabase } from './db/index.js'; import type { WorkerDiscovery } from './discovery/index.js'; -import type { GovernanceChecker } from '@paws/domain-daemon'; +import type { GovernanceChecker } from '@paws/domain-policy'; import type { WorkerClient } from './worker-client.js'; export interface ControlPlaneDeps { @@ -1067,7 +1067,7 @@ export async function createControlPlaneApp(deps: ControlPlaneDeps) { // Generate workload from agent config or use the explicit workload let workload; if (daemon.agent) { - const { generateAgentScript } = await import('@paws/domain-daemon'); + const { generateAgentScript } = await import('@paws/domain-agent'); workload = { type: 'script' as const, script: generateAgentScript(daemon.agent), diff --git a/apps/control-plane/src/governance.test.ts b/apps/control-plane/src/governance.test.ts index 8c7f50c..916ac7f 100644 --- a/apps/control-plane/src/governance.test.ts +++ b/apps/control-plane/src/governance.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from 'vitest'; -import { createGovernanceChecker } from '@paws/domain-daemon'; +import { createGovernanceChecker } from '@paws/domain-policy'; describe('createGovernanceChecker', () => { test('allows actions when no rate limit configured', () => { diff --git a/apps/control-plane/src/index.ts b/apps/control-plane/src/index.ts index 44bcb83..2233540 100644 --- a/apps/control-plane/src/index.ts +++ b/apps/control-plane/src/index.ts @@ -1,8 +1,8 @@ export { createControlPlaneApp } from './app.js'; export type { ControlPlaneDeps } from './app.js'; export { ControlPlaneError, controlPlaneError } from './errors.js'; -export { createGovernanceChecker } from '@paws/domain-daemon'; -export type { GovernanceChecker } from '@paws/domain-daemon'; +export { createGovernanceChecker } from '@paws/domain-policy'; +export type { GovernanceChecker } from '@paws/domain-policy'; export { authMiddleware } from './middleware/auth.js'; export { createDaemonStore } from '@paws/domain-daemon'; export type { DaemonStore, StoredDaemon } from '@paws/domain-daemon'; diff --git a/apps/control-plane/src/store/daemons.ts b/apps/control-plane/src/store/daemons.ts index 9066353..838378d 100644 --- a/apps/control-plane/src/store/daemons.ts +++ b/apps/control-plane/src/store/daemons.ts @@ -1,12 +1,8 @@ import { eq } from 'drizzle-orm'; -import type { - AgentConfig, - CreateDaemonRequest, - DaemonStatus, - Governance, - Trigger, -} from '@paws/domain-daemon'; +import type { AgentConfig } from '@paws/domain-agent'; +import type { CreateDaemonRequest, DaemonStatus, Trigger } from '@paws/domain-daemon'; +import type { Governance } from '@paws/domain-policy'; import type { NetworkConfig } from '@paws/domain-network'; import type { Resources, Workload } from '@paws/domain-session'; diff --git a/apps/worker/package.json b/apps/worker/package.json index abfa63d..fc76e08 100644 --- a/apps/worker/package.json +++ b/apps/worker/package.json @@ -25,6 +25,8 @@ "@paws/firecracker": "workspace:*", "@paws/logger": "workspace:*", "@paws/proxy": "workspace:*", + "@paws/runtime": "workspace:*", + "@paws/runtime-firecracker": "workspace:*", "@paws/snapshot-store": "workspace:*", "hono": "^4.7.0", "neverthrow": "^8.2.0", diff --git a/apps/worker/src/routes.ts b/apps/worker/src/routes.ts index 126e082..7159a9e 100644 --- a/apps/worker/src/routes.ts +++ b/apps/worker/src/routes.ts @@ -72,7 +72,7 @@ export function createSessionApp(deps: AppDeps) { queued: semaphore.queued, available: semaphore.available, }, - pool: executor.poolStats, + runtime: executor.capabilities.fullLinux ? 'firecracker' : 'lightweight', snapshot: { syncEnabled: !!syncLoop, currentVersion: syncStatus?.currentVersion ?? 0, @@ -114,6 +114,7 @@ export function createSessionApp(deps: AppDeps) { const sessionId = randomUUID(); // Fire-and-forget — execute in background, track results + const sessionStartTime = Date.now(); executor.execute(sessionId, parsed.data).then( (result) => { const status = result.exitCode === 0 ? 'completed' : 'failed'; @@ -135,7 +136,7 @@ export function createSessionApp(deps: AppDeps) { stdout: '', stderr: err instanceof Error ? err.message : String(err), output: undefined, - durationMs: Date.now() - Date.now(), + durationMs: Date.now() - sessionStartTime, completedAt: new Date().toISOString(), }); }, @@ -156,14 +157,7 @@ export function createSessionApp(deps: AppDeps) { status: 'running', startedAt: active.startedAt.toISOString(), worker: workerName, - exposedPorts: active.exposedTunnels?.map((t) => ({ - port: t.port, - url: t.publicUrl, - label: t.label, - access: t.access, - pin: t.pin, - shareLink: t.shareLink, - })), + exposedPorts: active.exposedPorts, }); } diff --git a/apps/worker/src/server.ts b/apps/worker/src/server.ts index 00c10e8..d15ca7a 100644 --- a/apps/worker/src/server.ts +++ b/apps/worker/src/server.ts @@ -1,5 +1,7 @@ import { createLogger } from '@paws/logger'; import { createPortPool } from '@paws/firecracker'; +import { createFirecrackerRuntime } from '@paws/runtime-firecracker'; +import { createRuntimeRegistry } from '@paws/runtime'; import { createCallHome } from './call-home.js'; import { createSessionApp } from './routes.js'; @@ -9,6 +11,7 @@ import { createSyncLoop } from './sync/sync-loop.js'; import type { SyncLoop } from './sync/sync-loop.js'; import { createPangolinResourceManager } from './tunnel/pangolin-resources.js'; import type { PangolinResourceManager } from './tunnel/pangolin-resources.js'; +import { createPangolinPortExposure } from './tunnel/port-exposure.js'; // Read version from env (Docker) or VERSION file (bare metal) const PAWS_VERSION = @@ -100,16 +103,31 @@ const llmGateway = } : undefined; -const executor = createExecutor({ +// --- Runtime setup --- +// Create the Firecracker runtime adapter (owns all VM lifecycle) +const firecrackerRuntime = createFirecrackerRuntime({ snapshotDir: SNAPSHOT_DIR, snapshotBaseDir: SNAPSHOT_BASE_DIR, vmBaseDir: VM_BASE_DIR, sshKeyPath: SSH_KEY_PATH, - semaphore, - workerName: WORKER_NAME, + maxConcurrent: MAX_CONCURRENT, portPool, - pangolinResources, workerExternalUrl: WORKER_EXTERNAL_URL || undefined, +}); + +// Register in the runtime registry (future: support multiple runtimes) +const runtimeRegistry = createRuntimeRegistry(); +runtimeRegistry.register(firecrackerRuntime); + +// Port exposure provider (Pangolin tunnels) +const portExposure = pangolinResources ? createPangolinPortExposure(pangolinResources) : undefined; + +// Create the executor (thin wrapper around runtime) +const executor = createExecutor({ + runtime: runtimeRegistry.resolve(), + semaphore, + workerName: WORKER_NAME, + portExposure, llmGateway, }); @@ -187,12 +205,15 @@ const portExposureStatus = pangolinResources ? `direct (${WORKER_EXTERNAL_URL})` : 'disabled'; +const runtimeName = runtimeRegistry.resolve().name; + console.log(` /\\_/\\ ( o.o ) paws worker v${PAWS_VERSION} > ^ < Listening on :${PORT} +Runtime: ${runtimeName} Max concurrent VMs: ${MAX_CONCURRENT} Max queued: ${MAX_QUEUED} Snapshot: ${SNAPSHOT_DIR} diff --git a/apps/worker/src/session/executor.ts b/apps/worker/src/session/executor.ts index 5586836..b71302d 100644 --- a/apps/worker/src/session/executor.ts +++ b/apps/worker/src/session/executor.ts @@ -1,52 +1,15 @@ import type { CreateSessionRequest } from '@paws/domain-session'; -import type { NetworkAllocation, NetworkConfig } from '@paws/domain-network'; -import { - createIpPool, - createTap, - deleteTap, - restoreVm, - setupIptables, - setupInboundPort, - stopVm, - teardownIptables, - teardownInboundPort, -} from '@paws/firecracker'; -import type { PortPool, VmHandle } from '@paws/firecracker'; -import { createProxy, generateSessionCa } from '@paws/proxy'; -import type { ProxyInstance, SessionCa } from '@paws/proxy'; +import type { NetworkConfig } from '@paws/domain-network'; +import type { + RuntimeAdapter, + RuntimeSessionRequest, + ResolvedCredentials, + SessionResult, + ExposedPortResult, + PortExposureProvider, +} from '@paws/runtime'; -import { WorkerError, WorkerErrorCode } from '../errors.js'; -import { sshExec, sshReadFile, sshWriteFile, waitForSsh } from '../ssh/client.js'; import type { Semaphore } from '../semaphore.js'; -import type { ExposedTunnel, PangolinResourceManager } from '../tunnel/pangolin-resources.js'; - -/** Configuration for the session executor */ -export interface ExecutorConfig { - /** Path to snapshot directory (default snapshot) */ - snapshotDir: string; - /** Base directory containing all snapshots (for multi-snapshot support) */ - snapshotBaseDir?: string; - /** Base directory for VM working directories */ - vmBaseDir: string; - /** Path to SSH private key for VM access */ - sshKeyPath: string; - /** Concurrency semaphore */ - semaphore: Semaphore; - /** Max IP pool slots (default: 256) */ - maxSlots?: number; - /** Path to firecracker binary */ - firecrackerBin?: string; - /** Worker name for session tracking */ - workerName: string; - /** Port pool for inbound port exposure (optional — needed for port exposure) */ - portPool?: PortPool | undefined; - /** Pangolin resource manager for tunnel URLs (optional — needed for port exposure) */ - pangolinResources?: PangolinResourceManager | undefined; - /** Fallback worker URL when Pangolin is not configured (e.g., "http://65.108.10.170") */ - workerExternalUrl?: string | undefined; - /** LLM gateway — routes provider API calls through an external proxy (LiteLLM, OpenRouter, etc.) */ - llmGateway?: LlmGateway | undefined; -} /** LLM gateway plugin — intercepts LLM API calls and routes through an external proxy */ export interface LlmGateway { @@ -60,340 +23,72 @@ export interface LlmGateway { domains: string[]; } -/** Result of a completed session */ -export interface SessionResult { - exitCode: number; - stdout: string; - stderr: string; - output: unknown; - durationMs: number; - exposedPorts?: - | Array<{ - port: number; - url: string; - label?: string | undefined; - access?: string | undefined; - pin?: string | undefined; - shareLink?: string | undefined; - }> - | undefined; +/** Configuration for the session executor */ +export interface ExecutorConfig { + /** Runtime adapter for session execution */ + runtime: RuntimeAdapter; + /** Concurrency semaphore */ + semaphore: Semaphore; + /** Worker name for session tracking */ + workerName: string; + /** Port exposure provider (optional — needed for tunnel-based port exposure) */ + portExposure?: PortExposureProvider; + /** LLM gateway — routes provider API calls through an external proxy */ + llmGateway?: LlmGateway; } +/** Result of a completed session (re-exported from runtime for convenience) */ +export type { SessionResult } from '@paws/runtime'; + /** Active session state for tracking */ export interface ActiveSession { sessionId: string; status: 'running' | 'stopping'; startedAt: Date; - allocation?: NetworkAllocation; - vmHandle?: VmHandle; - proxyHandle?: ProxyInstance; - ca?: SessionCa; - /** Pangolin tunnels for exposed ports */ - exposedTunnels?: ExposedTunnel[] | undefined; - /** Allocated host ports for inbound DNAT */ - inboundPorts?: Array<{ hostPort: number; guestPort: number }> | undefined; -} - -/** Resolve a snapshot ID to a local directory path */ -function resolveSnapshotDir(config: ExecutorConfig, snapshotId: string): string { - if (config.snapshotBaseDir) { - // Multi-snapshot: look for the snapshot in the base directory - const resolved = `${config.snapshotBaseDir}/${snapshotId}`; - // Fall back to default if the specific snapshot doesn't exist - try { - const stat = Bun.file(`${resolved}/vmstate.snap`); - if (stat.size > 0) return resolved; - } catch { - // Snapshot not found, fall back - } - } - // Single-snapshot: always use the configured default - return config.snapshotDir; + exposedPorts?: ExposedPortResult[]; } -/** Create the session executor that orchestrates the full VM lifecycle */ +/** Create the session executor — thin wrapper around a RuntimeAdapter */ export function createExecutor(config: ExecutorConfig) { - const ipPool = createIpPool(config.maxSlots ?? 256); const sessions = new Map(); return { /** - * Execute a session through the full VM lifecycle: - * 1. Acquire semaphore slot - * 2. Allocate network (/30 subnet) - * 3. Create TAP device - * 4. Generate session CA - * 5. Setup iptables rules - * 6. Spawn TLS proxy - * 7. Restore VM from snapshot - * 8. Wait for SSH - * 9. Inject CA cert into VM trust store - * 10. Write and execute workload script - * 11. Collect results - * 12. Cleanup (always runs): stop VM, kill proxy, teardown network + * Execute a session through the runtime adapter. + * + * The executor handles: + * - Semaphore-based concurrency control + * - Converting CreateSessionRequest → RuntimeSessionRequest + ResolvedCredentials + * - Delegating execution to the runtime adapter + * - Session lifecycle tracking + * + * The runtime adapter handles the actual execution (VM lifecycle, networking, etc.) */ async execute(sessionId: string, request: CreateSessionRequest): Promise { - const startedAt = new Date(); - const network: NetworkConfig = request.network ?? { - allowOut: [], - credentials: {}, - expose: [], - }; - const session: ActiveSession = { sessionId, status: 'running', startedAt }; + const session: ActiveSession = { sessionId, status: 'running', startedAt: new Date() }; sessions.set(sessionId, session); - let allocation: NetworkAllocation | undefined; - let vmHandle: VmHandle | undefined; - let proxyHandle: ProxyInstance | undefined; - let ca: SessionCa | undefined; - try { - // 1. Acquire semaphore slot + // Acquire semaphore slot await config.semaphore.acquire(); - // 2. Allocate network - const allocResult = ipPool.allocate(); - if (allocResult.isErr()) { - throw new WorkerError( - WorkerErrorCode.CAPACITY_EXHAUSTED, - allocResult.error.message, - allocResult.error, - ); - } - allocation = allocResult.value; - session.allocation = allocation; - - const vmDir = `${config.vmBaseDir}/${sessionId}`; - - // 3. Create TAP device - const tapResult = await createTap(allocation); - if (tapResult.isErr()) { - throw new WorkerError( - WorkerErrorCode.EXECUTION_FAILED, - `TAP creation failed: ${tapResult.error.message}`, - tapResult.error, - ); - } - - // 4. Generate session CA - const caResult = await generateSessionCa({ dir: `${vmDir}/ca` }); - if (caResult.isErr()) throw caResult.error; - ca = caResult.value; - session.ca = ca; + // Convert domain request to runtime-agnostic format + const runtimeRequest = toRuntimeRequest(request); + const credentials = resolveCredentials(request.network, config.llmGateway); - // 5. Setup iptables rules - const iptResult = await setupIptables(allocation); - if (iptResult.isErr()) { - throw new WorkerError( - WorkerErrorCode.EXECUTION_FAILED, - `iptables setup failed: ${iptResult.error.message}`, - iptResult.error, - ); - } - - // 6. Spawn TLS proxy - proxyHandle = createProxy({ - listen: { host: allocation.hostIp, port: 8080 }, - domains: networkConfigToDomains(network, config.llmGateway), - ca: { cert: ca.cert, key: ca.key }, + // Delegate to runtime adapter + const result = await config.runtime.execute(sessionId, runtimeRequest, credentials, { + portExposure: config.portExposure, }); - await proxyHandle.start(); - session.proxyHandle = proxyHandle; - - // 7. Restore VM from snapshot (resolve snapshot ID → directory) - const snapshotDir = resolveSnapshotDir(config, request.snapshot); - const restoreOpts = { - snapshotDir, - vmDir, - ...(config.firecrackerBin ? { firecrackerBin: config.firecrackerBin } : {}), - }; - const restoreResult = await restoreVm(restoreOpts); - if (restoreResult.isErr()) { - throw new WorkerError( - WorkerErrorCode.EXECUTION_FAILED, - `VM restore failed: ${restoreResult.error.message}`, - restoreResult.error, - ); - } - vmHandle = restoreResult.value; - session.vmHandle = vmHandle; - - // 8. Wait for SSH - const sshOpts = { - host: allocation.guestIp, - keyPath: config.sshKeyPath, - }; - - const sshResult = await waitForSsh(sshOpts); - if (sshResult.isErr()) throw sshResult.error; - - // 9. Inject CA cert into VM trust store - const injectCaResult = await sshWriteFile( - sshOpts, - '/usr/local/share/ca-certificates/paws-session.crt', - ca.cert, - ); - if (injectCaResult.isErr()) throw injectCaResult.error; - - const updateCaResult = await sshExec(sshOpts, 'update-ca-certificates 2>/dev/null || true'); - if (updateCaResult.isErr()) throw updateCaResult.error; - - // 9.5. Set up port exposure (if configured) - const exposePorts = network.expose ?? []; - let exposedPortUrls: SessionResult['exposedPorts']; - - if (exposePorts.length > 0 && config.portPool) { - const portResult = config.portPool.allocate(exposePorts.length); - if (portResult.isErr()) { - throw new WorkerError( - WorkerErrorCode.CAPACITY_EXHAUSTED, - `Port allocation failed: ${portResult.error.message}`, - portResult.error, - ); - } - const hostPorts = portResult.value; - session.inboundPorts = exposePorts.map((ep, i) => ({ - hostPort: hostPorts[i]!, - guestPort: ep.port, - })); - - // Set up inbound iptables rules - for (const mapping of session.inboundPorts) { - const iptResult = await setupInboundPort( - allocation, - mapping.hostPort, - mapping.guestPort, - ); - if (iptResult.isErr()) { - throw new WorkerError( - WorkerErrorCode.EXECUTION_FAILED, - `Inbound iptables failed: ${iptResult.error.message}`, - iptResult.error, - ); - } - } - - // Create Pangolin tunnels (if configured) or use direct URLs - if (config.pangolinResources) { - const tunnels = await config.pangolinResources.expose( - sessionId, - exposePorts, - hostPorts, - ); - session.exposedTunnels = tunnels; - exposedPortUrls = tunnels.map((t) => ({ - port: t.port, - url: t.publicUrl, - label: t.label, - access: t.access, - pin: t.pin, - shareLink: t.shareLink, - })); - } else if (config.workerExternalUrl) { - // Fallback: direct host port URLs - exposedPortUrls = exposePorts.map((ep, i) => ({ - port: ep.port, - url: `${config.workerExternalUrl}:${hostPorts[i]}`, - label: ep.label, - })); - } - } - - // 10. Write and execute workload script - const envExports = Object.entries(request.workload.env) - .map(([k, v]) => `export ${k}=${shellEscape(v)}`) - .join('\n'); - - const script = [ - '#!/bin/bash', - 'set -euo pipefail', - envExports, - request.workload.script, - ].join('\n'); - - const writeResult = await sshWriteFile(sshOpts, '/tmp/workload.sh', script); - if (writeResult.isErr()) throw writeResult.error; - - await sshExec(sshOpts, 'chmod +x /tmp/workload.sh'); - // Execute with timeout - const timeoutSecs = Math.ceil(request.timeoutMs / 1000); - const execResult = await sshExec( - sshOpts, - `timeout ${timeoutSecs} /tmp/workload.sh 2>/tmp/stderr.log || echo "EXIT:$?" > /tmp/exit_code`, - ); - - // 11. Collect results - let stdout = ''; - let stderr = ''; - let exitCode = 0; - let output: unknown = undefined; - - if (execResult.isOk()) { - stdout = execResult.value.stdout; + if (result.isErr()) { + throw result.error; } - // Read stderr - const stderrResult = await sshReadFile(sshOpts, '/tmp/stderr.log'); - if (stderrResult.isOk()) { - stderr = stderrResult.value; - } - - // Check for non-zero exit code - const exitCodeResult = await sshReadFile(sshOpts, '/tmp/exit_code'); - if (exitCodeResult.isOk()) { - const match = exitCodeResult.value.match(/EXIT:(\d+)/); - if (match?.[1]) { - exitCode = parseInt(match[1], 10); - } - } - - // Try to read structured output - const outputResult = await sshReadFile(sshOpts, '/output/result.json'); - if (outputResult.isOk()) { - try { - output = JSON.parse(outputResult.value); - } catch { - // Not valid JSON — ignore - } - } - - const durationMs = Date.now() - startedAt.getTime(); - - return { exitCode, stdout, stderr, output, durationMs, exposedPorts: exposedPortUrls }; + session.exposedPorts = result.value.exposedPorts; + return result.value; } finally { - // Cleanup — always runs session.status = 'stopping'; - - // Clean up Pangolin resources - if (session.exposedTunnels?.length && config.pangolinResources) { - await config.pangolinResources.cleanup(session.exposedTunnels); - } - - // Clean up inbound iptables rules and release host ports - if (session.inboundPorts?.length && allocation) { - for (const mapping of session.inboundPorts) { - await teardownInboundPort(allocation, mapping.hostPort, mapping.guestPort); - } - if (config.portPool) { - config.portPool.release(session.inboundPorts.map((m) => m.hostPort)); - } - } - - if (vmHandle) { - await stopVm(vmHandle); - } - - if (proxyHandle) { - await proxyHandle.stop(); - } - - if (allocation) { - await teardownIptables(allocation); - await deleteTap(allocation.tapDevice); - ipPool.release(allocation.subnetIndex); - } - config.semaphore.release(); sessions.delete(sessionId); } @@ -404,59 +99,71 @@ export function createExecutor(config: ExecutorConfig) { return sessions; }, - /** IP pool stats */ - get poolStats() { - return { - allocated: ipPool.size, - available: ipPool.available, - }; + /** Runtime capabilities */ + get capabilities() { + return config.runtime.capabilities; }, }; } export type Executor = ReturnType; -/** Convert NetworkConfig (from @paws/domain-network) to proxy-native domains map */ -function networkConfigToDomains( - network: NetworkConfig, +/** Convert CreateSessionRequest to RuntimeSessionRequest */ +function toRuntimeRequest(request: CreateSessionRequest): RuntimeSessionRequest { + return { + snapshot: request.snapshot, + workload: { + type: request.workload.type, + script: request.workload.script, + env: request.workload.env, + }, + resources: request.resources, + timeoutMs: request.timeoutMs, + exposePorts: request.network?.expose?.map((ep) => ({ + port: ep.port, + protocol: ep.protocol, + label: ep.label, + access: ep.access, + allowedEmails: ep.allowedEmails, + })), + }; +} + +/** Resolve credentials from NetworkConfig into runtime-agnostic format */ +function resolveCredentials( + network: NetworkConfig | undefined, gateway?: LlmGateway, -): Record { - const domains: Record = {}; +): ResolvedCredentials { + const domains: ResolvedCredentials['domains'] = {}; + const allowlist: string[] = []; + + if (!network) { + return { domains, allowlist }; + } // Add credential-bearing domains for (const [domain, cred] of Object.entries(network.credentials)) { domains[domain] = { headers: cred.headers }; } - // Add allowOut domains (no credentials) — skip if already in credentials + // Add allowOut domains (no credentials) for (const domain of network.allowOut) { - if (!(domain in domains)) { - domains[domain] = {}; - } + if (domain in domains) continue; + allowlist.push(domain); } - // If an LLM gateway is configured, override matching domains to route through it. - // The proxy terminates TLS from the VM, then forwards to the gateway URL instead - // of the real provider. The gateway handles model routing, cost tracking, etc. + // If an LLM gateway is configured, override matching domains to route through it if (gateway) { for (const domain of gateway.domains) { domains[domain] = { headers: { - Authorization: `Bearer ${gateway.apiKey}`, - // Preserve existing credential headers (merged, gateway key takes priority) ...(domains[domain]?.headers ?? {}), - // Override Authorization with gateway key - ...(gateway.apiKey ? { Authorization: `Bearer ${gateway.apiKey}` } : {}), + Authorization: `Bearer ${gateway.apiKey}`, }, target: gateway.url, }; } } - return domains; -} - -/** Escape a value for safe shell interpolation */ -function shellEscape(s: string): string { - return `'${s.replace(/'/g, "'\\''")}'`; + return { domains, allowlist }; } diff --git a/apps/worker/src/tunnel/port-exposure.ts b/apps/worker/src/tunnel/port-exposure.ts new file mode 100644 index 0000000..c81579b --- /dev/null +++ b/apps/worker/src/tunnel/port-exposure.ts @@ -0,0 +1,39 @@ +import type { PortExposureProvider, ExposedPortResult } from '@paws/runtime'; + +import type { PangolinResourceManager } from './pangolin-resources.js'; + +/** + * Adapt PangolinResourceManager to the runtime's PortExposureProvider interface. + * + * This bridges the worker's Pangolin tunnel integration with the runtime adapter's + * generic port exposure contract. + */ +export function createPangolinPortExposure( + pangolinResources: PangolinResourceManager, +): PortExposureProvider { + // Track tunnels per session for cleanup + const sessionTunnels = new Map>>(); + + return { + async expose(sessionId, ports, hostPorts): Promise { + const tunnels = await pangolinResources.expose(sessionId, ports, hostPorts); + sessionTunnels.set(sessionId, tunnels); + return tunnels.map((t) => ({ + port: t.port, + url: t.publicUrl, + label: t.label, + access: t.access, + pin: t.pin, + shareLink: t.shareLink, + })); + }, + + async cleanup(sessionId, _tunnels) { + const tunnels = sessionTunnels.get(sessionId); + if (tunnels?.length) { + await pangolinResources.cleanup(tunnels); + sessionTunnels.delete(sessionId); + } + }, + }; +} diff --git a/bun.lock b/bun.lock index 7d8d591..66556ff 100644 --- a/bun.lock +++ b/bun.lock @@ -30,6 +30,7 @@ "@hono/oidc-auth": "^1.8.1", "@hono/zod-openapi": "1.2.3", "@paws/credentials": "workspace:*", + "@paws/domain-agent": "workspace:*", "@paws/domain-audit": "workspace:*", "@paws/domain-browser": "workspace:*", "@paws/domain-common": "workspace:*", @@ -37,6 +38,7 @@ "@paws/domain-fleet": "workspace:*", "@paws/domain-mcp": "workspace:*", "@paws/domain-network": "workspace:*", + "@paws/domain-policy": "workspace:*", "@paws/domain-session": "workspace:*", "@paws/domain-snapshot": "workspace:*", "@paws/integrations": "workspace:*", @@ -129,6 +131,8 @@ "@paws/firecracker": "workspace:*", "@paws/logger": "workspace:*", "@paws/proxy": "workspace:*", + "@paws/runtime": "workspace:*", + "@paws/runtime-firecracker": "workspace:*", "@paws/snapshot-store": "workspace:*", "hono": "^4.7.0", "neverthrow": "^8.2.0", @@ -167,6 +171,26 @@ "vitest": "^4.1.2", }, }, + "packages/domains/access": { + "name": "@paws/domain-access", + "version": "0.1.0", + "dependencies": { + "zod": "^4.3.6", + }, + "devDependencies": { + "vitest": "^4.1.2", + }, + }, + "packages/domains/agent": { + "name": "@paws/domain-agent", + "version": "0.1.0", + "dependencies": { + "zod": "^4.3.6", + }, + "devDependencies": { + "vitest": "^4.1.2", + }, + }, "packages/domains/audit": { "name": "@paws/domain-audit", "version": "0.1.0", @@ -201,13 +225,25 @@ "vitest": "^4.1.2", }, }, + "packages/domains/credential": { + "name": "@paws/domain-credential", + "version": "0.1.0", + "dependencies": { + "zod": "^4.3.6", + }, + "devDependencies": { + "vitest": "^4.1.2", + }, + }, "packages/domains/daemon": { "name": "@paws/domain-daemon", "version": "0.1.0", "dependencies": { "@hono/zod-openapi": "^1.2.3", + "@paws/domain-agent": "workspace:*", "@paws/domain-common": "workspace:*", "@paws/domain-network": "workspace:*", + "@paws/domain-policy": "workspace:*", "@paws/domain-session": "workspace:*", "zod": "^4.3.6", }, @@ -247,6 +283,16 @@ "vitest": "^4.1.2", }, }, + "packages/domains/policy": { + "name": "@paws/domain-policy", + "version": "0.1.0", + "dependencies": { + "zod": "^4.3.6", + }, + "devDependencies": { + "vitest": "^4.1.2", + }, + }, "packages/domains/session": { "name": "@paws/domain-session", "version": "0.1.0", @@ -357,6 +403,31 @@ "vitest": "^4.1.2", }, }, + "packages/runtime": { + "name": "@paws/runtime", + "version": "0.1.0", + "dependencies": { + "neverthrow": "^8.2.0", + }, + "devDependencies": { + "vitest": "^4.1.2", + }, + }, + "packages/runtime-firecracker": { + "name": "@paws/runtime-firecracker", + "version": "0.1.0", + "dependencies": { + "@paws/firecracker": "workspace:*", + "@paws/logger": "workspace:*", + "@paws/proxy": "workspace:*", + "@paws/runtime": "workspace:*", + "neverthrow": "^8.2.0", + }, + "devDependencies": { + "bun-types": "^1.3.11", + "vitest": "^4.1.2", + }, + }, "packages/sdk": { "name": "@paws/sdk", "version": "0.1.0", @@ -385,10 +456,6 @@ "vitest": "^4.1.2", }, }, - "packages/typescript-config": { - "name": "@paws/typescript-config", - "version": "0.0.0", - }, "providers/aws-ec2": { "name": "@paws/provider-aws-ec2", "version": "0.1.0", @@ -1060,12 +1127,18 @@ "@paws/dashboard": ["@paws/dashboard@workspace:apps/dashboard"], + "@paws/domain-access": ["@paws/domain-access@workspace:packages/domains/access"], + + "@paws/domain-agent": ["@paws/domain-agent@workspace:packages/domains/agent"], + "@paws/domain-audit": ["@paws/domain-audit@workspace:packages/domains/audit"], "@paws/domain-browser": ["@paws/domain-browser@workspace:packages/domains/browser"], "@paws/domain-common": ["@paws/domain-common@workspace:packages/domains/common"], + "@paws/domain-credential": ["@paws/domain-credential@workspace:packages/domains/credential"], + "@paws/domain-daemon": ["@paws/domain-daemon@workspace:packages/domains/daemon"], "@paws/domain-fleet": ["@paws/domain-fleet@workspace:packages/domains/fleet"], @@ -1074,6 +1147,8 @@ "@paws/domain-network": ["@paws/domain-network@workspace:packages/domains/network"], + "@paws/domain-policy": ["@paws/domain-policy@workspace:packages/domains/policy"], + "@paws/domain-session": ["@paws/domain-session@workspace:packages/domains/session"], "@paws/domain-snapshot": ["@paws/domain-snapshot@workspace:packages/domains/snapshot"], @@ -1098,12 +1173,14 @@ "@paws/proxy": ["@paws/proxy@workspace:packages/proxy"], + "@paws/runtime": ["@paws/runtime@workspace:packages/runtime"], + + "@paws/runtime-firecracker": ["@paws/runtime-firecracker@workspace:packages/runtime-firecracker"], + "@paws/sdk": ["@paws/sdk@workspace:packages/sdk"], "@paws/snapshot-store": ["@paws/snapshot-store@workspace:packages/snapshot-store"], - "@paws/typescript-config": ["@paws/typescript-config@workspace:packages/typescript-config"], - "@paws/worker": ["@paws/worker@workspace:apps/worker"], "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], diff --git a/packages/domains/access/package.json b/packages/domains/access/package.json new file mode 100644 index 0000000..c8c26a2 --- /dev/null +++ b/packages/domains/access/package.json @@ -0,0 +1,24 @@ +{ + "name": "@paws/domain-access", + "version": "0.1.0", + "private": true, + "description": "Port exposure and access control — generic port exposure without tunnel coupling", + "type": "module", + "exports": { + ".": { + "types": "./src/index.ts", + "import": "./src/index.ts" + } + }, + "scripts": { + "build": "bun build ./src/index.ts --outdir dist --target bun", + "test": "vitest run --passWithNoTests", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "zod": "^4.3.6" + }, + "devDependencies": { + "vitest": "^4.1.2" + } +} diff --git a/packages/domains/access/src/index.ts b/packages/domains/access/src/index.ts new file mode 100644 index 0000000..ff725af --- /dev/null +++ b/packages/domains/access/src/index.ts @@ -0,0 +1,2 @@ +export { ExposedPortSchema, ExposedPortWithAccessSchema } from './types.js'; +export type { ExposedPort, ExposedPortWithAccess } from './types.js'; diff --git a/packages/domains/access/src/types.ts b/packages/domains/access/src/types.ts new file mode 100644 index 0000000..5a27600 --- /dev/null +++ b/packages/domains/access/src/types.ts @@ -0,0 +1,28 @@ +import { z } from 'zod'; + +/** Generic exposed port result (no tunnel-provider coupling) */ +export const ExposedPortSchema = z.object({ + /** Port number inside the runtime */ + port: z.number().int().min(1).max(65535), + /** Public URL to access this port */ + url: z.string().url(), + /** Human-readable label */ + label: z.string().optional(), +}); + +export type ExposedPort = z.infer; + +/** + * Extended exposed port with access control fields. + * Used when a tunnel provider (e.g., Pangolin) adds authentication. + */ +export const ExposedPortWithAccessSchema = ExposedPortSchema.extend({ + /** Access control mode used for this port */ + access: z.enum(['sso', 'pin', 'email']).optional(), + /** Auto-generated PIN (only present when access is 'pin') */ + pin: z.string().optional(), + /** Time-limited shareable link */ + shareLink: z.string().url().optional(), +}); + +export type ExposedPortWithAccess = z.infer; diff --git a/packages/domains/access/tsconfig.json b/packages/domains/access/tsconfig.json new file mode 100644 index 0000000..c6af81f --- /dev/null +++ b/packages/domains/access/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "composite": true, + "outDir": "dist", + "rootDir": "src", + "types": [] + }, + "include": ["src"] +} diff --git a/packages/domains/agent/package.json b/packages/domains/agent/package.json new file mode 100644 index 0000000..d7d3d98 --- /dev/null +++ b/packages/domains/agent/package.json @@ -0,0 +1,24 @@ +{ + "name": "@paws/domain-agent", + "version": "0.1.0", + "private": true, + "description": "Agent framework configuration — framework-agnostic agent definitions", + "type": "module", + "exports": { + ".": { + "types": "./src/index.ts", + "import": "./src/index.ts" + } + }, + "scripts": { + "build": "bun build ./src/index.ts --outdir dist --target bun", + "test": "vitest run --passWithNoTests", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "zod": "^4.3.6" + }, + "devDependencies": { + "vitest": "^4.1.2" + } +} diff --git a/packages/domains/agent/src/index.ts b/packages/domains/agent/src/index.ts new file mode 100644 index 0000000..de2f3ec --- /dev/null +++ b/packages/domains/agent/src/index.ts @@ -0,0 +1,4 @@ +export { AgentFramework, AgentConfigSchema } from './types.js'; +export type { AgentConfig } from './types.js'; + +export { generateAgentScript } from './script.js'; diff --git a/packages/domains/daemon/src/agent.ts b/packages/domains/agent/src/script.ts similarity index 55% rename from packages/domains/daemon/src/agent.ts rename to packages/domains/agent/src/script.ts index b6a0f64..015f135 100644 --- a/packages/domains/daemon/src/agent.ts +++ b/packages/domains/agent/src/script.ts @@ -1,35 +1,4 @@ -import { z } from 'zod'; - -/** Supported agent frameworks */ -export const AgentFramework = z.enum(['claude-code']); - -export type AgentFramework = z.infer; - -/** Agent configuration for a daemon */ -export const AgentConfigSchema = z.object({ - /** Which agent framework to use */ - framework: AgentFramework, - - /** The prompt/task for the agent. Supports $TRIGGER_PAYLOAD placeholder. */ - prompt: z.string().default('$TRIGGER_PAYLOAD'), - - /** Max turns / iterations the agent can take */ - maxTurns: z.number().int().positive().optional(), - - /** Max budget in USD */ - maxBudgetUsd: z.number().positive().optional(), - - /** Allowed tools (e.g., ["Read", "Edit", "Bash"]) */ - allowedTools: z.array(z.string()).optional(), - - /** Model to use (e.g., "sonnet", "opus") */ - model: z.string().optional(), - - /** Additional CLI flags passed to the agent */ - extraArgs: z.array(z.string()).optional(), -}); - -export type AgentConfig = z.infer; +import type { AgentConfig } from './types.js'; /** * Generate a workload script for a given agent config. @@ -57,43 +26,33 @@ function generateClaudeCodeScript(agent: AgentConfig): string { '', ]; - // Build the claude command const args: string[] = ['-p']; - // Prompt — default to $TRIGGER_PAYLOAD const prompt = agent.prompt || '$TRIGGER_PAYLOAD'; args.push(`"${prompt}"`); - // Always use bare mode for headless args.push('--bare'); - // Allowed tools if (agent.allowedTools?.length) { args.push(`--allowedTools "${agent.allowedTools.join(',')}"`); } else { - // Default: allow common tools args.push('--allowedTools "Read,Edit,Bash,Write"'); } - // Max turns if (agent.maxTurns) { args.push(`--max-turns ${agent.maxTurns}`); } - // Max budget if (agent.maxBudgetUsd) { args.push(`--max-budget-usd ${agent.maxBudgetUsd}`); } - // Model if (agent.model) { args.push(`--model ${agent.model}`); } - // Output as JSON for structured results args.push('--output-format json'); - // Extra args if (agent.extraArgs?.length) { args.push(...agent.extraArgs); } diff --git a/packages/domains/agent/src/types.ts b/packages/domains/agent/src/types.ts new file mode 100644 index 0000000..08735f7 --- /dev/null +++ b/packages/domains/agent/src/types.ts @@ -0,0 +1,32 @@ +import { z } from 'zod'; + +/** Supported agent frameworks */ +export const AgentFramework = z.enum(['claude-code']); + +export type AgentFramework = z.infer; + +/** Agent configuration for a daemon */ +export const AgentConfigSchema = z.object({ + /** Which agent framework to use */ + framework: AgentFramework, + + /** The prompt/task for the agent. Supports $TRIGGER_PAYLOAD placeholder. */ + prompt: z.string().default('$TRIGGER_PAYLOAD'), + + /** Max turns / iterations the agent can take */ + maxTurns: z.number().int().positive().optional(), + + /** Max budget in USD */ + maxBudgetUsd: z.number().positive().optional(), + + /** Allowed tools (e.g., ["Read", "Edit", "Bash"]) */ + allowedTools: z.array(z.string()).optional(), + + /** Model to use (e.g., "sonnet", "opus") */ + model: z.string().optional(), + + /** Additional CLI flags passed to the agent */ + extraArgs: z.array(z.string()).optional(), +}); + +export type AgentConfig = z.infer; diff --git a/packages/domains/agent/tsconfig.json b/packages/domains/agent/tsconfig.json new file mode 100644 index 0000000..c6af81f --- /dev/null +++ b/packages/domains/agent/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "composite": true, + "outDir": "dist", + "rootDir": "src", + "types": [] + }, + "include": ["src"] +} diff --git a/packages/domains/common/src/errors.ts b/packages/domains/common/src/errors.ts index f8d4cd9..d99f4e0 100644 --- a/packages/domains/common/src/errors.ts +++ b/packages/domains/common/src/errors.ts @@ -1,20 +1,21 @@ import { z } from 'zod'; -/** All known paws error codes */ +/** Generic paws error codes (domain-specific codes live in their own packages) */ export const ErrorCode = z.enum([ 'UNAUTHORIZED', 'FORBIDDEN', 'NOT_FOUND', 'CONFLICT', + 'CAPACITY_EXHAUSTED', + 'RATE_LIMITED', + 'VALIDATION_ERROR', + 'INTERNAL_ERROR', + // Domain-specific codes kept for backward compatibility (prefer domain-specific errors) 'SESSION_NOT_FOUND', 'DAEMON_NOT_FOUND', 'DAEMON_ALREADY_EXISTS', 'SNAPSHOT_NOT_FOUND', 'WORKER_NOT_FOUND', - 'CAPACITY_EXHAUSTED', - 'RATE_LIMITED', - 'VALIDATION_ERROR', - 'INTERNAL_ERROR', ]); export type ErrorCode = z.infer; diff --git a/packages/domains/credential/package.json b/packages/domains/credential/package.json new file mode 100644 index 0000000..c18e51a --- /dev/null +++ b/packages/domains/credential/package.json @@ -0,0 +1,24 @@ +{ + "name": "@paws/domain-credential", + "version": "0.1.0", + "private": true, + "description": "Credential types and transformer interfaces — extensible credential injection", + "type": "module", + "exports": { + ".": { + "types": "./src/index.ts", + "import": "./src/index.ts" + } + }, + "scripts": { + "build": "bun build ./src/index.ts --outdir dist --target bun", + "test": "vitest run --passWithNoTests", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "zod": "^4.3.6" + }, + "devDependencies": { + "vitest": "^4.1.2" + } +} diff --git a/packages/domains/credential/src/index.ts b/packages/domains/credential/src/index.ts new file mode 100644 index 0000000..0176ae4 --- /dev/null +++ b/packages/domains/credential/src/index.ts @@ -0,0 +1,14 @@ +export { + CredentialProviderSchema, + DomainCredentialSchema, + CredentialInjectionType, +} from './types.js'; +export type { + CredentialProvider, + DomainCredential, + CredentialInjection, + HeaderCredentialInjection, + OAuthCredentialInjection, + MtlsCredentialInjection, + CredentialTransformer, +} from './types.js'; diff --git a/packages/domains/credential/src/types.ts b/packages/domains/credential/src/types.ts new file mode 100644 index 0000000..f9a6284 --- /dev/null +++ b/packages/domains/credential/src/types.ts @@ -0,0 +1,53 @@ +import { z } from 'zod'; + +/** Credential provider identifier (extensible — not a hardcoded enum) */ +export const CredentialProviderSchema = z.string().min(1); + +export type CredentialProvider = z.infer; + +/** Per-domain credential injection config (headers-based) */ +export const DomainCredentialSchema = z.object({ + headers: z.record(z.string(), z.string()), +}); + +export type DomainCredential = z.infer; + +/** Credential injection type discriminator */ +export const CredentialInjectionType = z.enum(['headers', 'oauth', 'mtls']); + +export type CredentialInjectionType = z.infer; + +/** Header-based credential injection */ +export interface HeaderCredentialInjection { + type: 'headers'; + headers: Record; +} + +/** OAuth token-based credential injection (future) */ +export interface OAuthCredentialInjection { + type: 'oauth'; + tokenEndpoint: string; + clientId: string; + clientSecret: string; +} + +/** Mutual TLS credential injection (future) */ +export interface MtlsCredentialInjection { + type: 'mtls'; + cert: string; + key: string; +} + +/** Polymorphic credential injection result */ +export type CredentialInjection = + | HeaderCredentialInjection + | OAuthCredentialInjection + | MtlsCredentialInjection; + +/** Interface for transforming stored credentials into injection payloads */ +export interface CredentialTransformer { + /** Credential injection type this transformer produces */ + readonly type: CredentialInjectionType; + /** Transform a stored credential value into an injection payload */ + transform(provider: string, value: string): CredentialInjection; +} diff --git a/packages/domains/credential/tsconfig.json b/packages/domains/credential/tsconfig.json new file mode 100644 index 0000000..c6af81f --- /dev/null +++ b/packages/domains/credential/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "composite": true, + "outDir": "dist", + "rootDir": "src", + "types": [] + }, + "include": ["src"] +} diff --git a/packages/domains/daemon/package.json b/packages/domains/daemon/package.json index bd6313d..c7725a6 100644 --- a/packages/domains/daemon/package.json +++ b/packages/domains/daemon/package.json @@ -2,7 +2,7 @@ "name": "@paws/domain-daemon", "version": "0.1.0", "private": true, - "description": "Daemon domain — Daemon, Trigger, AgentConfig, Governance, DaemonStore, routes", + "description": "Daemon domain — Daemon, Trigger, DaemonStore, routes", "type": "module", "exports": { ".": { @@ -17,8 +17,10 @@ }, "dependencies": { "@hono/zod-openapi": "^1.2.3", + "@paws/domain-agent": "workspace:*", "@paws/domain-common": "workspace:*", "@paws/domain-network": "workspace:*", + "@paws/domain-policy": "workspace:*", "@paws/domain-session": "workspace:*", "zod": "^4.3.6" }, diff --git a/packages/domains/daemon/src/index.ts b/packages/domains/daemon/src/index.ts index 8b5abe4..3c8a522 100644 --- a/packages/domains/daemon/src/index.ts +++ b/packages/domains/daemon/src/index.ts @@ -1,6 +1,3 @@ -export { AgentConfigSchema, AgentFramework, generateAgentScript } from './agent.js'; -export type { AgentConfig } from './agent.js'; - export { CreateDaemonRequestSchema, CreateDaemonResponseSchema, @@ -11,7 +8,6 @@ export { DaemonStatsSchema, DaemonStatus, GitHubTriggerSchema, - GovernanceSchema, ScheduleTriggerSchema, TriggerSchema, UpdateDaemonRequestSchema, @@ -28,15 +24,11 @@ export type { DaemonListResponse, DaemonSessionSummary, DaemonStats, - Governance, Trigger, UpdateDaemonRequest, WebhookTriggerResponse, } from './types.js'; -export { createGovernanceChecker } from './governance.js'; -export type { GovernanceChecker } from './governance.js'; - export { createDaemonStore } from './store.js'; export type { DaemonStore, StoredDaemon } from './store.js'; diff --git a/packages/domains/daemon/src/store.ts b/packages/domains/daemon/src/store.ts index 8af26f4..1bcd019 100644 --- a/packages/domains/daemon/src/store.ts +++ b/packages/domains/daemon/src/store.ts @@ -1,7 +1,8 @@ +import type { AgentConfig } from '@paws/domain-agent'; import type { NetworkConfig } from '@paws/domain-network'; +import type { Governance } from '@paws/domain-policy'; import type { Resources, Workload } from '@paws/domain-session'; -import type { AgentConfig } from './agent.js'; -import type { CreateDaemonRequest, DaemonStatus, Governance, Trigger } from './types.js'; +import type { CreateDaemonRequest, DaemonStatus, Trigger } from './types.js'; export interface StoredDaemon { role: string; diff --git a/packages/domains/daemon/src/types.ts b/packages/domains/daemon/src/types.ts index 593f0ea..811c7eb 100644 --- a/packages/domains/daemon/src/types.ts +++ b/packages/domains/daemon/src/types.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { AgentConfigSchema } from './agent.js'; +import { AgentConfigSchema } from '@paws/domain-agent'; import { DurationMsSchema, IdSchema, @@ -8,6 +8,7 @@ import { TimestampSchema, } from '@paws/domain-common'; import { NetworkConfigSchema } from '@paws/domain-network'; +import { GovernanceSchema } from '@paws/domain-policy'; import { ResourcesSchema, SessionStatus, WorkloadSchema } from '@paws/domain-session'; /** Daemon status */ @@ -53,15 +54,6 @@ export const TriggerSchema = z.discriminatedUnion('type', [ export type Trigger = z.infer; -/** Governance policy */ -export const GovernanceSchema = z.object({ - maxActionsPerHour: z.number().int().positive().optional(), - requiresApproval: z.array(z.string()).default([]), - auditLog: z.boolean().default(true), -}); - -export type Governance = z.infer; - /** Daemon invocation stats */ export const DaemonStatsSchema = z.object({ totalInvocations: z.number().int().nonnegative(), diff --git a/packages/domains/fleet/src/worker.ts b/packages/domains/fleet/src/worker.ts index 8ac3eb9..37f6c72 100644 --- a/packages/domains/fleet/src/worker.ts +++ b/packages/domains/fleet/src/worker.ts @@ -26,12 +26,22 @@ export const WorkerSnapshotInfoSchema = z.object({ export type WorkerSnapshotInfo = z.infer; +/** Worker runtime type */ +export const WorkerType = z + .enum(['firecracker', 'container', 'lightweight']) + .default('firecracker'); + +export type WorkerType = z.infer; + /** Worker node info */ export const WorkerSchema = z.object({ name: NonEmptyStringSchema, status: WorkerStatus, + /** Runtime type this worker supports */ + type: WorkerType, capacity: WorkerCapacitySchema, - snapshot: WorkerSnapshotInfoSchema, + /** Snapshot info (optional — not all runtime types use snapshots) */ + snapshot: WorkerSnapshotInfoSchema.optional(), uptime: z.number().int().nonnegative(), }); diff --git a/packages/domains/network/src/types.ts b/packages/domains/network/src/types.ts index 60125d6..a33cbf2 100644 --- a/packages/domains/network/src/types.ts +++ b/packages/domains/network/src/types.ts @@ -12,7 +12,7 @@ export const PortAccessSchema = z.enum(['sso', 'pin', 'email']).default('sso'); export type PortAccess = z.infer; -/** Port to expose publicly from the VM via Pangolin tunnel */ +/** Port to expose publicly from the runtime */ export const PortExposureSchema = z.object({ /** Port inside the VM to expose */ port: z.number().int().min(1).max(65535), @@ -34,7 +34,7 @@ export const NetworkConfigSchema = z.object({ allowOut: z.array(z.string()).default([]), /** Per-domain credential injection */ credentials: z.record(z.string(), DomainCredentialSchema).default({}), - /** Ports to expose publicly via Pangolin tunnel */ + /** Ports to expose publicly from the runtime */ expose: z.array(PortExposureSchema).default([]), /** MCP servers this session/daemon can access (by name) */ mcp: z.object({ servers: z.array(z.string()) }).optional(), @@ -42,15 +42,13 @@ export const NetworkConfigSchema = z.object({ export type NetworkConfig = z.infer; -/** /30 subnet allocation for a VM's TAP device */ +/** /30 subnet allocation for a runtime's network interface */ export const NetworkAllocationSchema = z.object({ - /** TAP device name (e.g. "tap0") */ - tapDevice: z.string(), /** Subnet index (0-based, used to compute IPs) */ subnetIndex: z.number().int().nonnegative(), /** Host-side IP (where proxy listens) */ hostIp: z.ipv4(), - /** Guest-side IP (VM's address) */ + /** Guest-side IP (runtime's address) */ guestIp: z.ipv4(), /** CIDR notation for the /30 subnet */ subnet: z.string(), diff --git a/packages/domains/policy/package.json b/packages/domains/policy/package.json new file mode 100644 index 0000000..d1dcecb --- /dev/null +++ b/packages/domains/policy/package.json @@ -0,0 +1,24 @@ +{ + "name": "@paws/domain-policy", + "version": "0.1.0", + "private": true, + "description": "Governance and policy enforcement — rate limits, approval gates, audit policies", + "type": "module", + "exports": { + ".": { + "types": "./src/index.ts", + "import": "./src/index.ts" + } + }, + "scripts": { + "build": "bun build ./src/index.ts --outdir dist --target bun", + "test": "vitest run --passWithNoTests", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "zod": "^4.3.6" + }, + "devDependencies": { + "vitest": "^4.1.2" + } +} diff --git a/packages/domains/daemon/src/governance.ts b/packages/domains/policy/src/checker.ts similarity index 90% rename from packages/domains/daemon/src/governance.ts rename to packages/domains/policy/src/checker.ts index e9e0fd1..309080f 100644 --- a/packages/domains/daemon/src/governance.ts +++ b/packages/domains/policy/src/checker.ts @@ -6,7 +6,9 @@ interface RateWindow { } export interface GovernanceChecker { + /** Check if an action is allowed under the governance policy */ checkRateLimit(role: string, governance: Governance): boolean; + /** Record an action for rate limiting */ recordAction(role: string): void; } diff --git a/packages/domains/policy/src/index.ts b/packages/domains/policy/src/index.ts new file mode 100644 index 0000000..72a4ea7 --- /dev/null +++ b/packages/domains/policy/src/index.ts @@ -0,0 +1,5 @@ +export { GovernanceSchema } from './types.js'; +export type { Governance } from './types.js'; + +export { createGovernanceChecker } from './checker.js'; +export type { GovernanceChecker } from './checker.js'; diff --git a/packages/domains/policy/src/types.ts b/packages/domains/policy/src/types.ts new file mode 100644 index 0000000..90df191 --- /dev/null +++ b/packages/domains/policy/src/types.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; + +/** Governance policy — rate limits, approval gates, audit configuration */ +export const GovernanceSchema = z.object({ + maxActionsPerHour: z.number().int().positive().optional(), + requiresApproval: z.array(z.string()).default([]), + auditLog: z.boolean().default(true), +}); + +export type Governance = z.infer; diff --git a/packages/domains/policy/tsconfig.json b/packages/domains/policy/tsconfig.json new file mode 100644 index 0000000..c6af81f --- /dev/null +++ b/packages/domains/policy/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "composite": true, + "outDir": "dist", + "rootDir": "src", + "types": [] + }, + "include": ["src"] +} diff --git a/packages/domains/session/src/types.ts b/packages/domains/session/src/types.ts index 0708f0e..86c352d 100644 --- a/packages/domains/session/src/types.ts +++ b/packages/domains/session/src/types.ts @@ -65,19 +65,24 @@ export const CreateSessionResponseSchema = z.object({ export type CreateSessionResponse = z.infer; -/** A port exposed from the VM via Pangolin tunnel */ +/** + * A port exposed from the session's runtime. + * + * Base fields are generic; access control fields (access, pin, shareLink) + * are present when a tunnel provider (e.g., Pangolin) adds authentication. + */ export const ExposedPortSchema = z.object({ - /** Port number inside the VM */ + /** Port number inside the runtime */ port: z.number().int().min(1).max(65535), /** Public URL to access this port */ url: z.string().url(), /** Human-readable label */ label: z.string().optional(), - /** Access control mode used for this port */ + /** Access control mode (provider-specific, e.g., Pangolin SSO/PIN/email) */ access: z.enum(['sso', 'pin', 'email']).optional(), /** Auto-generated PIN (only present when access is 'pin') */ pin: z.string().optional(), - /** Time-limited shareable link (always generated) */ + /** Time-limited shareable link */ shareLink: z.string().url().optional(), }); diff --git a/packages/domains/snapshot/src/types.ts b/packages/domains/snapshot/src/types.ts index a44c62a..da91fd1 100644 --- a/packages/domains/snapshot/src/types.ts +++ b/packages/domains/snapshot/src/types.ts @@ -20,7 +20,8 @@ export type SnapshotBuildStatus = z.infer; /** Snapshot size information */ export const SnapshotSizeSchema = z.object({ disk: z.string(), - memory: z.string(), + /** Memory snapshot size (only for VM-based runtimes like Firecracker) */ + memory: z.string().optional(), total: z.string(), }); diff --git a/packages/firecracker/src/index.ts b/packages/firecracker/src/index.ts index e34a322..5878e30 100644 --- a/packages/firecracker/src/index.ts +++ b/packages/firecracker/src/index.ts @@ -16,6 +16,7 @@ export type { // Network export { allocateSubnet, createIpPool } from './network/ip-pool.js'; +export type { FirecrackerAllocation } from './network/ip-pool.js'; export { createPortPool } from './network/port-pool.js'; export type { PortPool } from './network/port-pool.js'; export { createTap, deleteTap } from './network/tap.js'; diff --git a/packages/firecracker/src/network/ip-pool.ts b/packages/firecracker/src/network/ip-pool.ts index ac04446..d9f0aac 100644 --- a/packages/firecracker/src/network/ip-pool.ts +++ b/packages/firecracker/src/network/ip-pool.ts @@ -5,6 +5,11 @@ import type { Result } from 'neverthrow'; import { FirecrackerError, FirecrackerErrorCode } from '../errors.js'; +/** Firecracker-specific network allocation with TAP device */ +export interface FirecrackerAllocation extends NetworkAllocation { + tapDevice: string; +} + /** * Base network for VM subnets: 172.16.0.0/16 * Each VM gets a /30 subnet with 4 addresses: @@ -34,7 +39,7 @@ function offsetToOctets(offset: number): [number, number] { } /** Allocate a /30 subnet for the given index */ -export function allocateSubnet(index: number): Result { +export function allocateSubnet(index: number): Result { if (!Number.isInteger(index) || index < 0 || index > MAX_SUBNET_INDEX) { return err( new FirecrackerError( @@ -68,7 +73,7 @@ export function createIpPool(maxSlots: number = MAX_SUBNET_INDEX + 1) { return { /** Allocate the next available subnet */ - allocate(): Result { + allocate(): Result { if (allocated.size >= maxSlots) { return err( new FirecrackerError( diff --git a/packages/proxy/src/server.ts b/packages/proxy/src/server.ts index 9a4c0b2..e19653f 100644 --- a/packages/proxy/src/server.ts +++ b/packages/proxy/src/server.ts @@ -66,13 +66,19 @@ export function createProxy(config: ProxyConfig): ProxyInstance { body: req.body, redirect: 'manual', }), - ).then((upstream) => { - return new Response(upstream.body, { - status: upstream.status, - statusText: upstream.statusText, - headers: upstream.headers, - }); - }); + ).then( + (upstream) => { + return new Response(upstream.body, { + status: upstream.status, + statusText: upstream.statusText, + headers: upstream.headers, + }); + }, + (_err) => { + // Catch fetch errors to prevent credential headers from leaking in stack traces + return new Response(`Upstream connection failed for ${hostname}`, { status: 502 }); + }, + ); } const instance: ProxyInstance = { diff --git a/packages/runtime-firecracker/package.json b/packages/runtime-firecracker/package.json new file mode 100644 index 0000000..46b43d5 --- /dev/null +++ b/packages/runtime-firecracker/package.json @@ -0,0 +1,29 @@ +{ + "name": "@paws/runtime-firecracker", + "version": "0.1.0", + "private": true, + "description": "Firecracker runtime adapter — KVM-isolated VM execution with TLS MITM credential injection", + "type": "module", + "exports": { + ".": { + "types": "./src/index.ts", + "import": "./src/index.ts" + } + }, + "scripts": { + "build": "bun build ./src/index.ts --outdir dist --target bun", + "test": "vitest run --passWithNoTests", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@paws/firecracker": "workspace:*", + "@paws/logger": "workspace:*", + "@paws/proxy": "workspace:*", + "@paws/runtime": "workspace:*", + "neverthrow": "^8.2.0" + }, + "devDependencies": { + "bun-types": "^1.3.11", + "vitest": "^4.1.2" + } +} diff --git a/packages/runtime-firecracker/src/adapter.ts b/packages/runtime-firecracker/src/adapter.ts new file mode 100644 index 0000000..6c0c112 --- /dev/null +++ b/packages/runtime-firecracker/src/adapter.ts @@ -0,0 +1,432 @@ +import { + createIpPool, + createTap, + deleteTap, + restoreVm, + setupIptables, + setupInboundPort, + stopVm, + teardownIptables, + teardownInboundPort, +} from '@paws/firecracker'; +import type { FirecrackerAllocation, PortPool, VmHandle } from '@paws/firecracker'; +import { createProxy, generateSessionCa } from '@paws/proxy'; +import type { DomainEntry, ProxyInstance, SessionCa } from '@paws/proxy'; +import { createLogger } from '@paws/logger'; +import { RuntimeError, RuntimeErrorCode } from '@paws/runtime'; +import type { + RuntimeAdapter, + RuntimeCapabilities, + RuntimeSessionRequest, + ResolvedCredentials, + SessionResult, + ExposedPortResult, + ExecuteOptions, +} from '@paws/runtime'; +import { ResultAsync, okAsync, errAsync } from 'neverthrow'; + +import { sshExec, sshReadFile, sshWriteFile, waitForSsh } from './ssh.js'; + +const log = createLogger('runtime-firecracker'); + +/** Configuration for the Firecracker runtime adapter */ +export interface FirecrackerRuntimeConfig { + /** Path to default snapshot directory */ + snapshotDir: string; + /** Base directory containing all snapshots (for multi-snapshot support) */ + snapshotBaseDir?: string; + /** Base directory for VM working directories */ + vmBaseDir: string; + /** Path to SSH private key for VM access */ + sshKeyPath: string; + /** Max concurrent VMs (default: 5) */ + maxConcurrent?: number; + /** Max IP pool slots (default: 256) */ + maxSlots?: number; + /** Path to firecracker binary */ + firecrackerBin?: string; + /** Port pool for inbound port exposure */ + portPool?: PortPool; + /** Fallback worker URL when tunnels are not configured */ + workerExternalUrl?: string; +} + +/** Active session tracking for the Firecracker runtime */ +interface FirecrackerSession { + sessionId: string; + allocation?: FirecrackerAllocation; + vmHandle?: VmHandle; + proxyHandle?: ProxyInstance; + ca?: SessionCa; + inboundPorts?: Array<{ hostPort: number; guestPort: number }>; + exposedPortResults?: ExposedPortResult[]; +} + +/** + * Create a Firecracker runtime adapter. + * + * This adapter owns the full VM lifecycle: + * 1. Allocate /30 subnet from IP pool + * 2. Create TAP device + * 3. Generate ephemeral session CA (ECDSA P-256) + * 4. Setup iptables DNAT rules + * 5. Spawn TLS MITM credential injection proxy + * 6. Restore VM from Firecracker snapshot + * 7. Wait for SSH + * 8. Inject CA cert into VM trust store + * 9. Setup port exposure (if requested) + * 10. Write and execute workload script + * 11. Collect results (stdout, stderr, exit code, structured output) + * 12. Cleanup: stop VM, kill proxy, teardown network (guaranteed via finally) + */ +export function createFirecrackerRuntime(config: FirecrackerRuntimeConfig): RuntimeAdapter { + const ipPool = createIpPool(config.maxSlots ?? 256); + const activeSessions = new Map(); + + return { + name: 'firecracker', + + capabilities: { + fullLinux: true, + hardwareIsolation: true, + transparentCredentialInjection: true, + coldStartMs: 800, + maxConcurrentSessions: config.maxConcurrent ?? 5, + }, + + execute( + sessionId: string, + request: RuntimeSessionRequest, + credentials: ResolvedCredentials, + options?: ExecuteOptions, + ): ResultAsync { + return ResultAsync.fromPromise( + executeSession(config, ipPool, activeSessions, sessionId, request, credentials, options), + (e) => { + if (e instanceof RuntimeError) return e; + return new RuntimeError( + RuntimeErrorCode.EXECUTION_FAILED, + `Session ${sessionId} failed: ${e instanceof Error ? e.message : String(e)}`, + e, + ); + }, + ); + }, + + async dispose() { + // Stop any lingering sessions + for (const [sid, session] of activeSessions) { + log.warn('Disposing lingering session', { sessionId: sid }); + await cleanupSession(config, ipPool, session); + } + activeSessions.clear(); + }, + }; +} + +/** Resolve a snapshot ID to a local directory path */ +function resolveSnapshotDir(config: FirecrackerRuntimeConfig, snapshotId: string): string { + if (config.snapshotBaseDir) { + const resolved = `${config.snapshotBaseDir}/${snapshotId}`; + try { + const stat = Bun.file(`${resolved}/vmstate.snap`); + if (stat.size > 0) return resolved; + } catch { + // Fall back to default + } + } + return config.snapshotDir; +} + +/** Build proxy domain config from resolved credentials */ +function credentialsToDomains(credentials: ResolvedCredentials): Record { + const domains: Record = {}; + + for (const [domain, config] of Object.entries(credentials.domains)) { + domains[domain] = { + headers: config.headers, + target: config.target, + }; + } + + for (const domain of credentials.allowlist) { + if (!(domain in domains)) { + domains[domain] = {}; + } + } + + return domains; +} + +/** The main 12-step session execution choreography */ +async function executeSession( + config: FirecrackerRuntimeConfig, + ipPool: ReturnType, + activeSessions: Map, + sessionId: string, + request: RuntimeSessionRequest, + credentials: ResolvedCredentials, + options?: ExecuteOptions, +): Promise { + const startedAt = Date.now(); + const session: FirecrackerSession = { sessionId }; + activeSessions.set(sessionId, session); + + try { + // 1. Allocate network (/30 subnet) + const allocResult = ipPool.allocate(); + if (allocResult.isErr()) { + throw new RuntimeError( + RuntimeErrorCode.CAPACITY_EXHAUSTED, + `IP pool exhausted: ${allocResult.error.message}`, + allocResult.error, + ); + } + session.allocation = allocResult.value; + + const vmDir = `${config.vmBaseDir}/${sessionId}`; + + // 2. Create TAP device + const tapResult = await createTap(session.allocation); + if (tapResult.isErr()) { + throw new RuntimeError( + RuntimeErrorCode.NETWORK_SETUP_FAILED, + `TAP creation failed: ${tapResult.error.message}`, + tapResult.error, + ); + } + + // 3. Generate session CA + const caResult = await generateSessionCa({ dir: `${vmDir}/ca` }); + if (caResult.isErr()) { + throw new RuntimeError( + RuntimeErrorCode.CA_GENERATION_FAILED, + `CA generation failed: ${caResult.error.message}`, + caResult.error, + ); + } + session.ca = caResult.value; + + // 4. Setup iptables rules + const iptResult = await setupIptables(session.allocation); + if (iptResult.isErr()) { + throw new RuntimeError( + RuntimeErrorCode.NETWORK_SETUP_FAILED, + `iptables setup failed: ${iptResult.error.message}`, + iptResult.error, + ); + } + + // 5. Spawn TLS proxy + session.proxyHandle = createProxy({ + listen: { host: session.allocation.hostIp, port: 8080 }, + domains: credentialsToDomains(credentials), + ca: { cert: session.ca.cert, key: session.ca.key }, + }); + await session.proxyHandle.start(); + + // 6. Restore VM from snapshot + const snapshotDir = resolveSnapshotDir(config, request.snapshot); + const restoreResult = await restoreVm({ + snapshotDir, + vmDir, + ...(config.firecrackerBin ? { firecrackerBin: config.firecrackerBin } : {}), + }); + if (restoreResult.isErr()) { + throw new RuntimeError( + RuntimeErrorCode.VM_RESTORE_FAILED, + `VM restore failed: ${restoreResult.error.message}`, + restoreResult.error, + ); + } + session.vmHandle = restoreResult.value; + + // 7. Wait for SSH + const sshOpts = { + host: session.allocation.guestIp, + keyPath: config.sshKeyPath, + }; + + const sshResult = await waitForSsh(sshOpts); + if (sshResult.isErr()) { + throw new RuntimeError( + RuntimeErrorCode.SSH_FAILED, + `SSH wait failed: ${sshResult.error.message}`, + sshResult.error, + ); + } + + // 8. Inject CA cert into VM trust store + const injectCaResult = await sshWriteFile( + sshOpts, + '/usr/local/share/ca-certificates/paws-session.crt', + session.ca.cert, + ); + if (injectCaResult.isErr()) { + throw new RuntimeError( + RuntimeErrorCode.SSH_FAILED, + `CA injection failed: ${injectCaResult.error.message}`, + injectCaResult.error, + ); + } + + const updateCaResult = await sshExec(sshOpts, 'update-ca-certificates 2>/dev/null || true'); + if (updateCaResult.isErr()) { + throw new RuntimeError( + RuntimeErrorCode.SSH_FAILED, + `CA update failed: ${updateCaResult.error.message}`, + updateCaResult.error, + ); + } + + // 9. Setup port exposure (if configured) + const exposePorts = request.exposePorts ?? []; + let exposedPortResults: ExposedPortResult[] | undefined; + + if (exposePorts.length > 0 && config.portPool) { + const portResult = config.portPool.allocate(exposePorts.length); + if (portResult.isErr()) { + throw new RuntimeError( + RuntimeErrorCode.CAPACITY_EXHAUSTED, + `Port allocation failed: ${portResult.error.message}`, + portResult.error, + ); + } + const hostPorts = portResult.value; + session.inboundPorts = exposePorts.map((ep, i) => ({ + hostPort: hostPorts[i]!, + guestPort: ep.port, + })); + + for (const mapping of session.inboundPorts) { + const iptRes = await setupInboundPort( + session.allocation, + mapping.hostPort, + mapping.guestPort, + ); + if (iptRes.isErr()) { + throw new RuntimeError( + RuntimeErrorCode.NETWORK_SETUP_FAILED, + `Inbound iptables failed: ${iptRes.error.message}`, + iptRes.error, + ); + } + } + + // Port exposure via provider or direct URLs + if (options?.portExposure) { + const tunnelResults = await options.portExposure.expose(sessionId, exposePorts, hostPorts); + exposedPortResults = tunnelResults; + session.exposedPortResults = tunnelResults; + } else if (config.workerExternalUrl) { + exposedPortResults = exposePorts.map((ep, i) => ({ + port: ep.port, + url: `${config.workerExternalUrl}:${hostPorts[i]}`, + label: ep.label, + })); + } + } + + // 10. Write and execute workload script + const envExports = Object.entries(request.workload.env) + .map(([k, v]) => `export ${k}=${shellEscape(v)}`) + .join('\n'); + + const script = ['#!/bin/bash', 'set -euo pipefail', envExports, request.workload.script].join( + '\n', + ); + + const writeResult = await sshWriteFile(sshOpts, '/tmp/workload.sh', script); + if (writeResult.isErr()) { + throw new RuntimeError( + RuntimeErrorCode.SSH_FAILED, + `Script write failed: ${writeResult.error.message}`, + writeResult.error, + ); + } + + await sshExec(sshOpts, 'chmod +x /tmp/workload.sh'); + + const timeoutSecs = Math.ceil(request.timeoutMs / 1000); + const execResult = await sshExec( + sshOpts, + `timeout ${timeoutSecs} /tmp/workload.sh 2>/tmp/stderr.log || echo "EXIT:$?" > /tmp/exit_code`, + ); + + // 11. Collect results + let stdout = ''; + let stderr = ''; + let exitCode = 0; + let output: unknown = undefined; + + if (execResult.isOk()) { + stdout = execResult.value.stdout; + } + + const stderrResult = await sshReadFile(sshOpts, '/tmp/stderr.log'); + if (stderrResult.isOk()) { + stderr = stderrResult.value; + } + + const exitCodeResult = await sshReadFile(sshOpts, '/tmp/exit_code'); + if (exitCodeResult.isOk()) { + const match = exitCodeResult.value.match(/EXIT:(\d+)/); + if (match?.[1]) { + exitCode = parseInt(match[1], 10); + } + } + + const outputResult = await sshReadFile(sshOpts, '/output/result.json'); + if (outputResult.isOk()) { + try { + output = JSON.parse(outputResult.value); + } catch { + // Not valid JSON — ignore + } + } + + const durationMs = Date.now() - startedAt; + + return { exitCode, stdout, stderr, output, durationMs, exposedPorts: exposedPortResults }; + } finally { + // 12. Cleanup — always runs + await cleanupSession(config, ipPool, session); + activeSessions.delete(sessionId); + } +} + +/** Cleanup all resources for a session */ +async function cleanupSession( + config: FirecrackerRuntimeConfig, + ipPool: ReturnType, + session: FirecrackerSession, +): Promise { + // Clean up inbound iptables rules and release host ports + if (session.inboundPorts?.length && session.allocation) { + for (const mapping of session.inboundPorts) { + await teardownInboundPort(session.allocation, mapping.hostPort, mapping.guestPort); + } + if (config.portPool) { + config.portPool.release(session.inboundPorts.map((m) => m.hostPort)); + } + } + + if (session.vmHandle) { + await stopVm(session.vmHandle); + } + + if (session.proxyHandle) { + await session.proxyHandle.stop(); + } + + if (session.allocation) { + await teardownIptables(session.allocation); + await deleteTap(session.allocation.tapDevice); + ipPool.release(session.allocation.subnetIndex); + } +} + +/** Escape a value for safe shell interpolation */ +function shellEscape(s: string): string { + return `'${s.replace(/'/g, "'\\''")}'`; +} diff --git a/packages/runtime-firecracker/src/index.ts b/packages/runtime-firecracker/src/index.ts new file mode 100644 index 0000000..0a9a4ae --- /dev/null +++ b/packages/runtime-firecracker/src/index.ts @@ -0,0 +1,2 @@ +export { createFirecrackerRuntime } from './adapter.js'; +export type { FirecrackerRuntimeConfig } from './adapter.js'; diff --git a/packages/runtime-firecracker/src/ssh.ts b/packages/runtime-firecracker/src/ssh.ts new file mode 100644 index 0000000..be77f77 --- /dev/null +++ b/packages/runtime-firecracker/src/ssh.ts @@ -0,0 +1,160 @@ +import { ResultAsync } from 'neverthrow'; + +import type { ExecFn } from '@paws/firecracker'; +import { RuntimeError, RuntimeErrorCode } from '@paws/runtime'; + +/** Result of a command executed over SSH */ +export interface SshExecResult { + stdout: string; + stderr: string; + exitCode: number; +} + +/** Options for SSH operations */ +export interface SshOptions { + host: string; + port?: number; + keyPath: string; + user?: string; + connectTimeoutSecs?: number; + exec?: ExecFn; +} + +const DEFAULT_SSH_PORT = 22; +const DEFAULT_SSH_USER = 'root'; +const DEFAULT_CONNECT_TIMEOUT = 30; + +function baseSshArgs(opts: SshOptions): string[] { + const port = opts.port ?? DEFAULT_SSH_PORT; + const timeout = opts.connectTimeoutSecs ?? DEFAULT_CONNECT_TIMEOUT; + return [ + '-o', + 'StrictHostKeyChecking=no', + '-o', + 'UserKnownHostsFile=/dev/null', + '-o', + `ConnectTimeout=${timeout}`, + '-o', + 'LogLevel=ERROR', + '-i', + opts.keyPath, + '-p', + String(port), + ]; +} + +/** Wait for SSH to become available on the guest */ +export function waitForSsh( + opts: SshOptions, + maxAttempts: number = 60, + intervalMs: number = 500, +): ResultAsync { + const exec = opts.exec ?? defaultExecFn; + const user = opts.user ?? DEFAULT_SSH_USER; + + return ResultAsync.fromPromise( + (async () => { + for (let i = 0; i < maxAttempts; i++) { + try { + await exec('ssh', [...baseSshArgs(opts), `${user}@${opts.host}`, 'true']); + return; + } catch { + await new Promise((resolve) => setTimeout(resolve, intervalMs)); + } + } + throw new Error(`SSH not available after ${maxAttempts * intervalMs}ms`); + })(), + (e) => + new RuntimeError( + RuntimeErrorCode.SSH_FAILED, + `SSH connection to ${opts.host} timed out: ${e}`, + e, + ), + ); +} + +/** Execute a command over SSH */ +export function sshExec( + opts: SshOptions, + command: string, +): ResultAsync { + const exec = opts.exec ?? defaultExecFn; + const user = opts.user ?? DEFAULT_SSH_USER; + + return ResultAsync.fromPromise( + (async () => { + const result = await exec('ssh', [...baseSshArgs(opts), `${user}@${opts.host}`, command]); + return { stdout: result.stdout, stderr: result.stderr, exitCode: 0 }; + })(), + (e) => + new RuntimeError(RuntimeErrorCode.SSH_FAILED, `SSH command failed on ${opts.host}: ${e}`, e), + ); +} + +/** Write content to a file on the guest via SSH */ +export function sshWriteFile( + opts: SshOptions, + remotePath: string, + content: string, +): ResultAsync { + const user = opts.user ?? DEFAULT_SSH_USER; + const port = opts.port ?? DEFAULT_SSH_PORT; + const timeout = opts.connectTimeoutSecs ?? DEFAULT_CONNECT_TIMEOUT; + + return ResultAsync.fromPromise( + (async () => { + const proc = Bun.spawn( + [ + 'ssh', + '-o', + 'StrictHostKeyChecking=no', + '-o', + 'UserKnownHostsFile=/dev/null', + '-o', + `ConnectTimeout=${timeout}`, + '-o', + 'LogLevel=ERROR', + '-i', + opts.keyPath, + '-p', + String(port), + `${user}@${opts.host}`, + `cat > ${remotePath}`, + ], + { stdin: new TextEncoder().encode(content) }, + ); + const exitCode = await proc.exited; + if (exitCode !== 0) { + throw new Error(`SSH write to ${remotePath} failed with exit code ${exitCode}`); + } + })(), + (e) => + new RuntimeError( + RuntimeErrorCode.SSH_FAILED, + `Failed to write ${remotePath} on ${opts.host}: ${e}`, + e, + ), + ); +} + +/** Read a file from the guest via SSH */ +export function sshReadFile( + opts: SshOptions, + remotePath: string, +): ResultAsync { + return sshExec(opts, `cat ${remotePath}`).map((r) => r.stdout); +} + +/** Default exec using Bun.spawn with captured output */ +const defaultExecFn: ExecFn = async (cmd, args) => { + const proc = Bun.spawn([cmd, ...args], { stdout: 'pipe', stderr: 'pipe' }); + const exitCode = await proc.exited; + const stdout = await new Response(proc.stdout).text(); + const stderr = await new Response(proc.stderr).text(); + if (exitCode !== 0) { + const err = new Error(`${cmd} exited with ${exitCode}: ${stderr}`); + Object.assign(err, { exitCode }); + throw err; + } + return { stdout, stderr }; +}; diff --git a/packages/runtime-firecracker/tsconfig.json b/packages/runtime-firecracker/tsconfig.json new file mode 100644 index 0000000..10d8c76 --- /dev/null +++ b/packages/runtime-firecracker/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "outDir": "dist", + "rootDir": "src", + "types": ["bun-types"] + }, + "include": ["src"] +} diff --git a/packages/runtime-firecracker/tsconfig.tsbuildinfo b/packages/runtime-firecracker/tsconfig.tsbuildinfo new file mode 100644 index 0000000..9451af3 --- /dev/null +++ b/packages/runtime-firecracker/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.collection.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.float16.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.iterator.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.regexp.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.full.d.ts","../firecracker/src/errors.ts","../firecracker/src/types.ts","../../node_modules/.bun/neverthrow@8.2.0/node_modules/neverthrow/dist/index.d.ts","../firecracker/src/client.ts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/json-schema.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/standard-schema.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/registries.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/to-json-schema.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/util.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/versions.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/schemas.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/checks.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/errors.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/core.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/parse.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/regexes.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ar.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/az.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/be.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/bg.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ca.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/cs.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/da.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/de.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/en.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/eo.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/es.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/fa.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/fi.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/fr.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/fr-ca.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/he.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/hu.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/hy.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/id.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/is.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/it.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ja.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ka.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/kh.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/km.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ko.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/lt.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/mk.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ms.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/nl.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/no.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ota.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ps.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/pl.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/pt.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ru.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/sl.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/sv.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ta.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/th.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/tr.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ua.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/uk.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/ur.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/uz.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/vi.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/zh-cn.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/zh-tw.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/yo.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/locales/index.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/doc.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/api.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/json-schema-processors.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/json-schema-generator.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/core/index.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/classic/errors.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/classic/parse.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/classic/schemas.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/classic/checks.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/classic/compat.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/classic/from-json-schema.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/classic/iso.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/classic/coerce.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/v4/classic/external.d.cts","../../node_modules/.bun/zod@4.3.6/node_modules/zod/index.d.cts","../domains/network/src/types.ts","../domains/network/src/index.ts","../firecracker/src/network/ip-pool.ts","../firecracker/src/network/port-pool.ts","../firecracker/src/network/exec.ts","../firecracker/src/network/tap.ts","../firecracker/src/network/iptables.ts","../firecracker/src/vm/restore.ts","../firecracker/src/vm/stop.ts","../firecracker/src/index.ts","../proxy/src/types.ts","../proxy/src/errors.ts","../proxy/src/ca.ts","../proxy/src/domain-match.ts","../proxy/src/server.ts","../proxy/src/index.ts","../logger/src/logger.ts","../logger/src/index.ts","../runtime/src/errors.ts","../runtime/src/types.ts","../runtime/src/registry.ts","../runtime/src/index.ts","./src/ssh.ts","./src/adapter.ts","./src/index.ts","../../node_modules/.bun/buffer@5.6.0/node_modules/buffer/index.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/compatibility/index.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/globals.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/assert.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/buffer.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/child_process.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/cluster.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/console.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/constants.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/crypto.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/dgram.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/dns.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/domain.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/events.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/fs.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/http.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/http2.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/https.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/inspector.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/module.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/net.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/os.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/process.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/punycode.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/querystring.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/readline.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/repl.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/sea.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/sqlite.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/stream.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/stream/web.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/test.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/timers.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/tls.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/trace_events.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/tty.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/url.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/util.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/v8.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/vm.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/wasi.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/zlib.d.ts","../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/index.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/globals.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/s3.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/fetch.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/jsx.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/bun.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/extensions.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/devserver.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/ffi.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/html-rewriter.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/jsc.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/sqlite.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/vendor/expect-type/utils.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/vendor/expect-type/overloads.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/vendor/expect-type/branding.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/vendor/expect-type/messages.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/vendor/expect-type/index.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/test.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/wasm.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/overrides.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/deprecated.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/redis.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/shell.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/serve.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/sql.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/security.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/bundle.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/bun.ns.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/globals.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/blob.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/console.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/crypto.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/encoding.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/events.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/utility.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/header.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/readable.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/fetch.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/formdata.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/connector.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/client-stats.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/client.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/errors.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/global-origin.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/pool.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/handlers.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/round-robin-pool.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/h2c-client.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/agent.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/mock-call-history.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/mock-client.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/snapshot-agent.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/api.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/interceptors.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/util.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/cookies.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/patch.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/websocket.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/eventsource.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/content-type.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/cache.d.ts","../../node_modules/.bun/undici-types@7.18.2/node_modules/undici-types/index.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/importmeta.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/messaging.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/performance.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/timers.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/url.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/assert.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/buffer.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/child_process.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/cluster.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/console.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/constants.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/crypto.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/dgram.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/dns.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/domain.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/events.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/fs.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/http.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/http2.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/https.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/inspector.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/inspector.generated.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/inspector/promises.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/module.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/net.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/os.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path/posix.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path/win32.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/process.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/punycode.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/querystring.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/quic.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/readline.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/repl.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/sea.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/sqlite.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/stream.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/stream/web.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/test.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/test/reporters.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/timers.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/tls.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/trace_events.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/tty.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/url.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/util.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/util/types.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/v8.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/vm.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/wasi.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/zlib.d.ts","../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/index.d.ts","../../node_modules/.bun/bun-types@1.3.11/node_modules/bun-types/index.d.ts"],"fileIdsList":[[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[193,194,195,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,294,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,374,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,322,323,324,325,326,327,328,329,330,331,332,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,294,295,296,297,298,301,302,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,294,295,296,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,294,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,300,301,302,303,304,305,311,312,313,314,315,316,317,318,319,320,321,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443],[13,198,199,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,314,315,316,317,318,319,324,328,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,305,312,313,314,315,316,317,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,310,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,306,307,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,306,307,308,309,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,306,308,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,306,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,266,270,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,266,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,261,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,263,266,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[191,192,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,262,265,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,266,273,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[191,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,264,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,266,287,288,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,262,266,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,287,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,261,262,263,264,265,266,267,268,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,288,289,290,291,292,293,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,266,281,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,266,273,274,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,264,266,274,275,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,265,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[191,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,261,266,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,266,270,274,275,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,270,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,264,266,269,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[191,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,263,266,273,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,266,287,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,339,342,345,346,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,342,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,342,346,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,336,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,340,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,338,339,342,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,295,296,297,299,301,312,313,314,315,316,317,318,319,324,336,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,338,342,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,333,334,335,337,341,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,342,351,359,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,334,340,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,342,368,369,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,295,296,297,299,301,312,313,314,315,316,317,318,319,324,334,337,342,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,333,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,336,337,338,340,341,342,343,344,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,369,370,371,372,373,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,342,361,364,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,342,351,352,353,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,340,342,352,354,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,341,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,334,336,342,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,342,346,352,354,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,346,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,340,342,345,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,334,338,342,351,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,342,361,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,354,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,295,296,297,299,301,312,313,314,315,316,317,318,319,324,336,342,368,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[163,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[154,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[154,157,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[149,152,154,155,156,157,158,159,160,161,162,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[88,90,157,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[154,155,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[89,154,156,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[90,92,94,95,96,97,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[92,94,96,97,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[92,94,96,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[89,92,94,95,97,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[88,90,91,92,93,94,95,96,97,98,99,149,150,151,152,153,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[88,90,91,94,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[90,91,94,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[94,97,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[88,89,91,92,93,95,96,97,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[88,89,90,94,154,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[94,95,96,97,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[96,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[165,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[164,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[84,85,86,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[84,85,87,167,168,170,171,172,173,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[84,85,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[84,86,166,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[84,85,86,166,169,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[84,86,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[84,85,86,87,169,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[84,85,86,169,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[181,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[86,175,176,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[175,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[175,176,177,178,179,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[175,178,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[86,174,180,182,186,187,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[188,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[86,174,186,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[183,184,185,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[183,184,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442],[86,183,198,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,295,296,297,299,301,312,313,314,315,316,317,318,319,324,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"1e9332c23e9a907175e0ffc6a49e236f97b48838cc8aec9ce7e4cec21e544b65","impliedFormat":1},{"version":"3753fbc1113dc511214802a2342280a8b284ab9094f6420e7aa171e868679f91","impliedFormat":1},{"version":"999ca32883495a866aa5737fe1babc764a469e4cde6ee6b136a4b9ae68853e4b","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"2a2de5b9459b3fc44decd9ce6100b72f1b002ef523126c1d3d8b2a4a63d74d78","affectsGlobalScope":true,"impliedFormat":1},{"version":"f13f4b465c99041e912db5c44129a94588e1aafee35a50eab51044833f50b4ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd714129fca875f7d4c477a1a392200b0bcd13fb2e80928cd334b63830ea047","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2c9037ae6cd2c52d80ceef0b3c5ffdb488627d71529cf4f63776daf11161c9a","affectsGlobalScope":true,"impliedFormat":1},{"version":"135d5cf4d345f59f1a9caadfafcd858d3d9cc68290db616cc85797224448cccc","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc238c3f81c2984751932b6aab223cd5b830e0ac6cad76389e5e9d2ffc03287d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a07f9b76d361f572620927e5735b77d6d2101c23cdd94383eb5b706e7b36357","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c4e8dc6ab834cc6baa0227e030606d29e3e8449a9f67cdf5605ea5493c4db29","affectsGlobalScope":true,"impliedFormat":1},{"version":"de7ba0fd02e06cd9a5bd4ab441ed0e122735786e67dde1e849cced1cd8b46b78","affectsGlobalScope":true,"impliedFormat":1},{"version":"6148e4e88d720a06855071c3db02069434142a8332cf9c182cda551adedf3156","affectsGlobalScope":true,"impliedFormat":1},{"version":"d63dba625b108316a40c95a4425f8d4294e0deeccfd6c7e59d819efa19e23409","affectsGlobalScope":true,"impliedFormat":1},{"version":"0568d6befee03dd435bed4fc25c4e46865b24bdcb8c563fdc21f580a2c301904","affectsGlobalScope":true,"impliedFormat":1},{"version":"30d62269b05b584741f19a5369852d5d34895aa2ac4fd948956f886d15f9cc0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ffbe6d7b295306b2ba88030f65b74c107d8d99bdcf596ea99c62a02f606108b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"996fb27b15277369c68a4ba46ed138b4e9e839a02fb4ec756f7997629242fd9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"79b712591b270d4778c89706ca2cfc56ddb8c3f895840e477388f1710dc5eda9","affectsGlobalScope":true,"impliedFormat":1},{"version":"20884846cef428b992b9bd032e70a4ef88e349263f63aeddf04dda837a7dba26","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"e03da518b01b46a4c99a1f88cd727ee98ddf14492c43dae1ae7a63e992971bab","impliedFormat":1},"d98baa9ad070f2cc6c30a7891c147f8bac91a0b43e241060e8190710f610055b","b7a4fdca1f1b705903e330d2a6871f57ab23244c169a6463a8d9d166a96a3dde",{"version":"578f25fcaeefc5b5fb071db12ccda89d4d3ef193f0c46a783e2bb42ef160a318","impliedFormat":1},"e631b9e11c873842b78c5de3ba0bca5d06bbe80418b0f50f7a9b9cbaebd10399",{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"82919acbb38870fcf5786ec1292f0f5afe490f9b3060123e48675831bd947192","impliedFormat":1},{"version":"e222701788ec77bd57c28facbbd142eadf5c749a74d586bc2f317db7e33544b1","impliedFormat":1},{"version":"09154713fae0ed7befacdad783e5bd1970c06fc41a5f866f7f933b96312ce764","impliedFormat":1},{"version":"8d67b13da77316a8a2fabc21d340866ddf8a4b99e76a6c951cc45189142df652","impliedFormat":1},{"version":"a91c8d28d10fee7fe717ddf3743f287b68770c813c98f796b6e38d5d164bd459","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"f6f827cd43e92685f194002d6b52a9408309cda1cec46fb7ca8489a95cbd2fd4","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"a270a1a893d1aee5a3c1c8c276cd2778aa970a2741ee2ccf29cc3210d7da80f5","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8926594ee895917e90701d8cbb5fdf77fc238b266ac540f929c7253f8ad6233d","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"ed8763205f02fb65e84eff7432155258df7f93b7d938f01785cb447d043d53f3","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"d4a5b1d2ff02c37643e18db302488cd64c342b00e2786e65caac4e12bda9219b","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},"3b4bc7d3856cc3573a38c71f1f9822f837e2a991836693eec1e99dd3834bc650","e145edf1b7777a99f9fe4f004b1199a8e84205c7fb7c96831ecebb711166cc15","749ddacedf7bc01db8bcbc54e8ecf722e16ed8d8564c7b4c32e44ad8992652ed","dfddfc7bd043c822f8de2d84cfb0f95e7d52aa8dddaccb974b83b06586f65662","006047702d461a0d35259da816477f30c375ae2b5b687841483634fe144cf2df","fc982d0b798dbeec9e5494abe2d3ecfdfe82235d65c44a8622462736e28c3f50","d387787cfa10bbc03b3b27bb6a137a78f31b811986af35d92518d7f00234d2fb","e0ed1005a3b381ae265110364c307454465e3f21add86d719479656a523cd257","98a694f49764559a278fd88375edcfe4e4fd1ee07348bf2623e3f6ac79120ae0","571aebfd8a2428642d6afca56b4048c9dbf82da31949d20f5fe5f3b5f54b1ca0","dac197b7b7bc9c14a8f1a58cd6e71e3055724bb7a9ae78b518cd4f3a6930bac6","6c1734d749328275d1b30c1ab4fef2c72fb33e56aa323bfef9a8db8d827cec45","29abd71a4b26b558b06de3da701bcf15c8e74c0ff81895af6328cb2193536cbd","d266d40e210a965171220561dbf2031f32dcb93dc5d84ec5496d3b862ad340c8","084eab9333b26a1976a827ebebeeb157bec0bbe70ea7c7436edffb4cb379acf1","89c9bffac1aee3d04ecf47d3457c2d02288892842eed53ade6a6095fbe2f1b1a","84ce348e51329e755b4c07e78cce23aeb3446a470f2dfb65d6480001c0d7ea3f","bf077ef3a553d0b0556a75b4f5612a22034a364d1bead2797cad36898ccd12c4","59dc703036b8f209246bb5865f55bcf176fa247e1253096363856d553bcdb045","8b669f7856af4903bc40e125ad25819b27e6240c976e80323a0caffbc08a4dc6","ec1d8c908a5149de70c299f0dc5c57e0d309151dc783fe475cd3828fdc5195e9","4830b2876252d78fc53df09b5dcf1c28b66adcb5e3bef4912a722e0d5127c273","8b1d282987493c522b51a177693e32bec3828bc55a2df2a064edc64729fdec51","26e7248c7fe71b403b1fe09b0661a5ae325b90597091bc69f3dbae5a1f8a9d25","671808477b35dfc2601ee6fdeb909f8055398a34c0fb36922a15899f30625941",{"version":"ef18cbf1d8374576e3db03ff33c2c7499845972eb0c4adf87392949709c5e160","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"6e215dac8b234548d91b718f9c07d5b09473cd5cabb29053fcd8be0af190acb6","affectsGlobalScope":true,"impliedFormat":1},{"version":"0d759cc99e081cacd0352467a0c24e979a6ef748329aa6ddea2d789664580201","impliedFormat":1},{"version":"f3d3e999a323c85c8a63ce90c6e4624ff89fe137a0e2508fddc08e0556d08abf","impliedFormat":1},{"version":"314607151cc203975193d5f44765f38597be3b0a43f466d3c1bfb17176dd3bd3","impliedFormat":1},{"version":"5beb6b7c030620fbc8cb339028593127dd0cf02bdc079fd94baf6d794a83e3d8","impliedFormat":1},{"version":"f40aad6c91017f20fc542f5701ec41e0f6aeba63c61bbf7aa13266ec29a50a3b","impliedFormat":1},{"version":"fc9e630f9302d0414ccd6c8ed2706659cff5ae454a56560c6122fa4a3fac5bbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"aa0a44af370a2d7c1aac988a17836f57910a6c52689f52f5b3ac1d4c6cadcb23","impliedFormat":1},{"version":"0ac74c7586880e26b6a599c710b59284a284e084a2bbc82cd40fb3fbfdea71ae","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce12357dadbb8efc4e4ec4dab709c8071bf992722fc9adfea2fe0bd5b50923f","impliedFormat":1},{"version":"b5a907deaba678e5083ccdd7cc063a3a8c3413c688098f6de29d6e4cefabc85f","impliedFormat":1},{"version":"ffd344731abee98a0a85a735b19052817afd2156d97d1410819cd9bcd1bd575e","impliedFormat":1},{"version":"475e07c959f4766f90678425b45cf58ac9b95e50de78367759c1e5118e85d5c3","impliedFormat":1},{"version":"a524ae401b30a1b0814f1bbcdae459da97fa30ae6e22476e506bb3f82e3d9456","impliedFormat":1},{"version":"7375e803c033425e27cb33bae21917c106cb37b508fd242cccd978ef2ee244c7","impliedFormat":1},{"version":"eeb890c7e9218afdad2f30ad8a76b0b0b5161d11ce13b6723879de408e6bc47a","impliedFormat":1},{"version":"998da6b85ebace9ebea67040dd1a640f0156064e3d28dbe9bd9c0229b6f72347","impliedFormat":1},{"version":"dfbcc400ac6d20b941ccc7bd9031b9d9f54e4d495dd79117334e771959df4805","affectsGlobalScope":true,"impliedFormat":1},{"version":"944d65951e33a13068be5cd525ec42bf9bc180263ba0b723fa236970aa21f611","affectsGlobalScope":true,"impliedFormat":1},{"version":"6b386c7b6ce6f369d18246904fa5eac73566167c88fb6508feba74fa7501a384","affectsGlobalScope":true,"impliedFormat":1},{"version":"592a109e67b907ffd2078cd6f727d5c326e06eaada169eef8fb18546d96f6797","impliedFormat":1},{"version":"f2eb1e35cae499d57e34b4ac3650248776fe7dbd9a3ec34b23754cfd8c22fceb","impliedFormat":1},{"version":"fbed43a6fcf5b675f5ec6fc960328114777862b58a2bb19c109e8fc1906caa09","impliedFormat":1},{"version":"9e98bd421e71f70c75dae7029e316745c89fa7b8bc8b43a91adf9b82c206099c","impliedFormat":1},{"version":"fc803e6b01f4365f71f51f9ce13f71396766848204d4f7a1b2b6154434b84b15","impliedFormat":1},{"version":"f3afcc0d6f77a9ca2d2c5c92eb4b89cd38d6fa4bdc1410d626bd701760a977ec","impliedFormat":1},{"version":"c8109fe76467db6e801d0edfbc50e6826934686467c9418ce6b246232ce7f109","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"074de5b2fdead0165a2757e3aaef20f27a6347b1c36adea27d51456795b37682","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"24371e69a38fc33e268d4a8716dbcda430d6c2c414a99ff9669239c4b8f40dea","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"3e11fce78ad8c0e1d1db4ba5f0652285509be3acdd519529bc8fcef85f7dafd9","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","impliedFormat":1},{"version":"e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","impliedFormat":1},{"version":"7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"c63b9ada8c72f95aac5db92aea07e5e87ec810353cdf63b2d78f49a58662cf6c","impliedFormat":1},{"version":"1cc2a09e1a61a5222d4174ab358a9f9de5e906afe79dbf7363d871a7edda3955","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"b64d4d1c5f877f9c666e98e833f0205edb9384acc46e98a1fef344f64d6aba44","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"c9381908473a1c92cb8c516b184e75f4d226dad95c3a85a5af35f670064d9a2f","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fad5618174d74a34ee006406d4eb37e8d07dd62eb1315dbf52f48d31a337547","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b50a819485ffe0d237bf0d131e92178d14d11e2aa873d73615a9ec578b341f5","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"1d024184fb57c58c5c91823f9d10b4915a4867b7934e89115fd0d861a9df27c8","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"12d602a8fe4c2f2ba4f7804f5eda8ba07e0c83bf5cf0cda8baffa2e9967bfb77","affectsGlobalScope":true,"impliedFormat":1},{"version":"a856ab781967b62b288dfd85b860bef0e62f005ed4b1b8fa25c53ce17856acaf","impliedFormat":1},{"version":"cc25940cfb27aa538e60d465f98bb5068d4d7d33131861ace43f04fe6947d68f","impliedFormat":1},{"version":"8db46b61a690f15b245cf16270db044dc047dce9f93b103a59f50262f677ea1f","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"757227c8b345c57d76f7f0e3bbad7a91ffca23f1b2547cbed9e10025816c9cb7","impliedFormat":1},{"version":"959d0327c96dd9bb5521f3ed6af0c435996504cc8dd46baa8e12cb3b3518cef1","impliedFormat":1},{"version":"e1c1a0b4d1ead0de9eca52203aeb1f771f21e6238d6fcd15aa56ac2a02f1b7bf","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"266bee0a41e9c3ba335583e21e9277ae03822402cf5e8e1d99f5196853613b98","affectsGlobalScope":true,"impliedFormat":1},{"version":"386606f8a297988535cb1401959041cfa7f59d54b8a9ed09738e65c98684c976","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"e236b5eba291f51bdf32c231673e6cab81b5410850e61f51a7a524dddadc0f95","impliedFormat":1},{"version":"ce8653341224f8b45ff46d2a06f2cacb96f841f768a886c9d8dd8ec0878b11bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"90a278f5fab7557e69e97056c0841adf269c42697194f0bd5c5e69152637d4b3","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"f263485c9ca90df9fe7bb3a906db9701997dc6cae86ace1f8106ac8d2f7f677b","impliedFormat":1},{"version":"1edcf2f36fc332615846bde6dcc71a8fe526065505bc5e3dcfd65a14becdf698","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"1dbca38aa4b0db1f4f9e6edacc2780af7e028b733d2a98dd3598cd235ca0c97d","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"19143c930aef7ccf248549f3e78992f2f1049118ec5d4622e95025057d8e392b","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"cca8917838a876e2d7016c9b6af57cbf11fdf903c5fdd8e613fa31840b2957bf","impliedFormat":1},{"version":"d91ae55e4282c22b9c21bc26bd3ef637d3fe132507b10529ae68bf76f5de785b","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"7e8a671604329e178bb479c8f387715ebd40a091fc4a7552a0a75c2f3a21c65c","impliedFormat":1},{"version":"41ef7992c555671a8fe54db302788adefa191ded810a50329b79d20a6772d14c","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"4c5e90ddbcd177ad3f2ffc909ae217c87820f1e968f6959e4b6ba38a8cec935e","impliedFormat":1},{"version":"b70dd9a44e1ac42f030bb12e7d79117eac7cb74170d72d381a1e7913320af23a","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1},{"version":"e6f803e4e45915d58e721c04ec17830c6e6678d1e3e00e28edf3d52720909cea","affectsGlobalScope":true,"impliedFormat":1}],"root":[[187,189]],"options":{"composite":true,"outDir":"./dist","rootDir":"./src"},"referencedMap":[[206,1],[207,1],[208,1],[198,2],[209,1],[210,1],[211,1],[193,1],[196,3],[194,1],[195,1],[212,1],[213,1],[214,1],[215,1],[216,1],[217,1],[218,1],[219,1],[220,1],[221,1],[222,1],[199,1],[197,1],[223,4],[224,1],[225,1],[259,5],[226,1],[227,1],[228,1],[229,1],[230,1],[231,1],[232,1],[233,1],[234,1],[235,1],[236,1],[237,1],[238,1],[239,6],[240,7],[241,1],[243,1],[242,1],[244,1],[245,1],[246,1],[247,1],[248,1],[249,1],[250,1],[251,1],[252,1],[253,1],[254,1],[255,1],[256,1],[200,1],[201,1],[202,1],[203,4],[204,1],[205,1],[257,4],[258,1],[384,1],[385,1],[386,1],[324,8],[387,1],[388,1],[389,1],[322,1],[390,1],[391,1],[392,1],[393,1],[394,1],[395,1],[396,1],[397,1],[398,1],[399,1],[400,1],[325,1],[323,1],[401,9],[402,1],[403,1],[443,10],[404,1],[405,11],[406,1],[407,1],[408,1],[409,1],[410,1],[411,12],[412,13],[413,1],[414,14],[415,1],[416,1],[417,1],[418,1],[419,1],[420,1],[421,15],[422,16],[423,1],[424,1],[425,1],[426,1],[427,1],[428,17],[429,18],[430,1],[431,1],[432,1],[433,1],[434,1],[435,1],[436,1],[437,1],[438,1],[439,1],[440,1],[326,1],[327,1],[328,1],[329,1],[330,1],[331,1],[332,1],[375,9],[376,1],[377,1],[378,1],[379,1],[380,1],[381,1],[382,1],[383,1],[441,9],[442,1],[190,1],[299,19],[321,1],[320,1],[314,20],[301,21],[300,1],[297,22],[302,1],[295,23],[303,1],[444,24],[304,1],[298,1],[313,25],[315,26],[296,27],[319,28],[317,29],[316,30],[318,31],[305,1],[311,32],[308,33],[310,34],[309,35],[307,36],[306,1],[312,37],[86,1],[81,1],[82,1],[15,1],[13,1],[14,1],[19,1],[18,1],[2,1],[20,1],[21,1],[22,1],[23,1],[24,1],[25,1],[26,1],[27,1],[3,1],[28,1],[29,1],[4,1],[30,1],[34,1],[31,1],[32,1],[33,1],[35,1],[36,1],[37,1],[5,1],[38,1],[39,1],[40,1],[41,1],[6,1],[45,1],[42,1],[43,1],[44,1],[46,1],[7,1],[47,1],[52,1],[53,1],[48,1],[49,1],[50,1],[51,1],[8,1],[57,1],[54,1],[55,1],[56,1],[58,1],[9,1],[59,1],[60,1],[61,1],[63,1],[62,1],[64,1],[65,1],[10,1],[66,1],[67,1],[68,1],[11,1],[69,1],[70,1],[71,1],[72,1],[73,1],[74,1],[12,1],[75,1],[83,1],[76,1],[77,1],[78,1],[79,1],[1,1],[80,1],[17,1],[16,1],[273,38],[283,39],[272,38],[293,40],[264,41],[263,1],[292,42],[286,43],[291,41],[266,44],[280,45],[265,46],[289,47],[261,48],[260,42],[290,49],[262,50],[267,39],[268,1],[271,39],[191,1],[294,51],[284,52],[275,53],[276,54],[278,55],[274,56],[277,57],[287,42],[269,58],[270,59],[279,60],[192,1],[282,52],[281,39],[285,1],[288,61],[351,62],[363,63],[348,64],[364,1],[373,65],[339,66],[340,67],[338,1],[372,42],[367,68],[371,69],[342,70],[360,71],[341,72],[370,73],[336,74],[337,68],[343,63],[344,1],[350,69],[347,63],[334,75],[374,76],[365,77],[354,78],[353,63],[355,79],[358,80],[352,81],[356,82],[368,42],[345,83],[346,84],[359,85],[335,1],[362,86],[361,63],[349,84],[357,87],[366,1],[333,1],[369,88],[164,89],[158,90],[162,91],[159,91],[155,90],[163,92],[160,93],[161,91],[156,94],[157,95],[151,96],[95,97],[97,98],[150,1],[96,99],[154,100],[153,101],[152,102],[88,1],[98,97],[99,1],[90,103],[94,104],[89,1],[91,105],[92,106],[93,1],[100,107],[101,107],[102,107],[103,107],[104,107],[105,107],[106,107],[107,107],[108,107],[109,107],[110,107],[111,107],[112,107],[114,107],[113,107],[115,107],[116,107],[117,107],[118,107],[149,108],[119,107],[120,107],[121,107],[122,107],[123,107],[124,107],[125,107],[126,107],[127,107],[128,107],[129,107],[130,107],[131,107],[133,107],[132,107],[134,107],[135,107],[136,107],[137,107],[138,107],[139,107],[140,107],[141,107],[142,107],[143,107],[144,107],[145,107],[148,107],[146,107],[147,107],[166,109],[165,110],[87,111],[84,1],[174,112],[169,113],[167,114],[171,115],[168,116],[170,115],[85,1],[172,117],[173,118],[182,119],[181,1],[177,120],[178,121],[176,1],[180,122],[179,123],[175,1],[188,124],[189,125],[187,126],[183,1],[186,127],[185,128],[184,129]],"semanticDiagnosticsPerFile":[[13,[{"start":2217969,"length":22,"code":2430,"category":1,"messageText":{"messageText":"Interface 'WebAssembly.ModuleExportDescriptor' incorrectly extends interface 'Bun.WebAssembly.ModuleExportDescriptor'.","category":1,"code":2430,"next":[{"messageText":"Types of property 'kind' are incompatible.","category":1,"code":2326,"next":[{"messageText":"Type 'WebAssembly.ImportExportKind' is not assignable to type 'Bun.WebAssembly.ImportExportKind'.","category":1,"code":2322,"next":[{"messageText":"Type '\"tag\"' is not assignable to type 'ImportExportKind'.","category":1,"code":2322}]}]}]}},{"start":2218069,"length":22,"code":2430,"category":1,"messageText":{"messageText":"Interface 'WebAssembly.ModuleImportDescriptor' incorrectly extends interface 'Bun.WebAssembly.ModuleImportDescriptor'.","category":1,"code":2430,"next":[{"messageText":"Types of property 'kind' are incompatible.","category":1,"code":2326,"next":[{"messageText":"Type 'WebAssembly.ImportExportKind' is not assignable to type 'Bun.WebAssembly.ImportExportKind'.","category":1,"code":2322,"next":[{"messageText":"Type '\"tag\"' is not assignable to type 'ImportExportKind'.","category":1,"code":2322}]}]}]}}]],[170,[{"start":623,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":764,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":852,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":1013,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."}]],[171,[{"start":1253,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":1575,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":1870,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":2096,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":2339,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":2507,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":3928,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":4969,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":5601,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":5721,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":5954,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":6168,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":6463,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."},{"start":6775,"length":9,"code":2339,"category":1,"messageText":"Property 'tapDevice' does not exist on type '{ subnetIndex: number; hostIp: string; guestIp: string; subnet: string; }'."}]],[195,[{"start":728,"length":8,"messageText":"All declarations of 'Iterator' must have identical type parameters.","category":1,"code":2428},{"start":820,"length":13,"messageText":"All declarations of 'AsyncIterator' must have identical type parameters.","category":1,"code":2428},{"start":1024,"length":21,"messageText":"Duplicate identifier 'BuiltinIteratorReturn'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/compatibility/iterators.d.ts","start":1154,"length":21,"messageText":"'BuiltinIteratorReturn' was also declared here.","category":3,"code":6203}]}]],[197,[{"start":0,"length":6,"messageText":"Definitions of the following identifiers conflict with those in another file: TypedArray, ArrayBufferView, NonSharedUint8Array, NonSharedUint8ClampedArray, NonSharedUint16Array, NonSharedUint32Array, NonSharedInt8Array, NonSharedInt16Array, NonSharedInt32Array, NonSharedBigUint64Array, NonSharedBigInt64Array, NonSharedFloat32Array, NonSharedFloat64Array, NonSharedDataView, NonSharedTypedArray, NonSharedArrayBufferView","category":1,"code":6200,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/globals.typedarray.d.ts","start":0,"length":6,"messageText":"Conflicts are in this file.","category":3,"code":6201}]}]],[198,[{"start":22304,"length":15,"messageText":"Duplicate identifier 'NonSharedBuffer'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/buffer.buffer.d.ts","start":22309,"length":15,"messageText":"'NonSharedBuffer' was also declared here.","category":3,"code":6203}]},{"start":22545,"length":17,"messageText":"Duplicate identifier 'AllowSharedBuffer'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/buffer.buffer.d.ts","start":22550,"length":17,"messageText":"'AllowSharedBuffer' was also declared here.","category":3,"code":6203}]}]],[199,[{"start":4784,"length":29,"messageText":"Duplicate index signature for type 'string'.","category":1,"code":2374},{"start":4861,"length":38,"messageText":"Duplicate index signature for type 'string'.","category":1,"code":2374},{"start":4916,"length":14,"messageText":"Duplicate identifier 'PartialOptions'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/globals.d.ts","start":3753,"length":14,"messageText":"'PartialOptions' was also declared here.","category":3,"code":6203}]},{"start":5588,"length":8,"messageText":"All declarations of 'Iterator' must have identical type parameters.","category":1,"code":2428},{"start":5937,"length":13,"messageText":"All declarations of 'AsyncIterator' must have identical type parameters.","category":1,"code":2428}]],[206,[{"start":45167,"length":6,"messageText":"Duplicate identifier 'assert'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/assert.d.ts","start":39988,"length":6,"messageText":"'assert' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/assert.d.ts","start":40081,"length":6,"messageText":"and here.","category":3,"code":6204}]},{"start":45260,"length":6,"messageText":"Duplicate identifier 'assert'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/assert.d.ts","start":39988,"length":6,"messageText":"'assert' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/assert.d.ts","start":40081,"length":6,"messageText":"and here.","category":3,"code":6204}]}]],[207,[{"start":2886,"length":6,"messageText":"Duplicate identifier 'strict'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/assert/strict.d.ts","start":2711,"length":6,"messageText":"'strict' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/assert/strict.d.ts","start":2818,"length":6,"messageText":"and here.","category":3,"code":6204}]},{"start":2993,"length":6,"messageText":"Duplicate identifier 'strict'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/assert/strict.d.ts","start":2711,"length":6,"messageText":"'strict' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/assert/strict.d.ts","start":2818,"length":6,"messageText":"and here.","category":3,"code":6204}]}]],[209,[{"start":9820,"length":14,"messageText":"Duplicate identifier 'BufferEncoding'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/buffer.d.ts","start":5625,"length":14,"messageText":"'BufferEncoding' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/buffer.d.ts","start":5690,"length":14,"messageText":"and here.","category":3,"code":6204}]},{"start":9885,"length":14,"messageText":"Duplicate identifier 'BufferEncoding'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/buffer.d.ts","start":5625,"length":14,"messageText":"'BufferEncoding' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/buffer.d.ts","start":5690,"length":14,"messageText":"and here.","category":3,"code":6204}]}]],[211,[{"start":27861,"length":9,"messageText":"Module '\"cluster\"' uses 'export =' and cannot be used with 'export *'.","category":1,"code":2498}]],[212,[{"start":2594,"length":7,"messageText":"Duplicate identifier 'console'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/console.d.ts","start":6650,"length":7,"messageText":"'console' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/console.d.ts","start":6747,"length":7,"messageText":"and here.","category":3,"code":6204}]},{"start":20936,"length":28,"messageText":"Duplicate identifier 'console'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/console.d.ts","start":6650,"length":7,"messageText":"'console' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/console.d.ts","start":6747,"length":7,"messageText":"and here.","category":3,"code":6204}]}]],[213,[{"start":697,"length":9,"messageText":"Duplicate identifier 'constants'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/constants.d.ts","start":702,"length":9,"messageText":"'constants' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/constants.d.ts","start":807,"length":9,"messageText":"and here.","category":3,"code":6204}]},{"start":803,"length":9,"messageText":"Duplicate identifier 'constants'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/constants.d.ts","start":702,"length":9,"messageText":"'constants' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/constants.d.ts","start":807,"length":9,"messageText":"and here.","category":3,"code":6204}]}]],[220,[{"start":27270,"length":12,"messageText":"All declarations of 'EventEmitter' must have identical type parameters.","category":1,"code":2428},{"start":44143,"length":12,"messageText":"Duplicate identifier 'events'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/events.d.ts","start":48908,"length":6,"messageText":"'events' was also declared here.","category":3,"code":6203}]},{"start":44242,"length":6,"messageText":"Duplicate identifier 'EventEmitter'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/events.d.ts","start":48809,"length":12,"messageText":"'EventEmitter' was also declared here.","category":3,"code":6203}]}]],[225,[{"start":1692,"length":6,"code":2320,"category":1,"messageText":{"messageText":"Interface 'Server' cannot simultaneously extend types 'Server' and 'Server'.","category":1,"code":2320,"next":[{"messageText":"Named property 'listenerCount' of types 'Server' and 'Server' are not identical.","category":1,"code":2319}]}}]],[228,[{"start":40156,"length":6,"messageText":"Duplicate identifier 'module'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/module.d.ts","start":34421,"length":6,"messageText":"'module' was also declared here.","category":3,"code":6203}]},{"start":40249,"length":6,"messageText":"Duplicate identifier 'Module'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/module.d.ts","start":34328,"length":6,"messageText":"'Module' was also declared here.","category":3,"code":6203}]}]],[231,[{"start":78,"length":4,"messageText":"Duplicate identifier 'export='.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path/posix.d.ts","start":79,"length":20,"messageText":"'export=' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path/posix.d.ts","start":171,"length":20,"messageText":"and here.","category":3,"code":6204}]},{"start":164,"length":4,"messageText":"Duplicate identifier 'export='.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path/win32.d.ts","start":79,"length":20,"messageText":"'export=' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path/win32.d.ts","start":171,"length":20,"messageText":"and here.","category":3,"code":6204}]},{"start":8046,"length":4,"messageText":"Duplicate identifier 'path'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path.d.ts","start":7795,"length":4,"messageText":"'path' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path.d.ts","start":7880,"length":4,"messageText":"and here.","category":3,"code":6204}]},{"start":8131,"length":4,"messageText":"Duplicate identifier 'path'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path.d.ts","start":7795,"length":4,"messageText":"'path' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path.d.ts","start":7880,"length":4,"messageText":"and here.","category":3,"code":6204}]},{"start":8228,"length":4,"messageText":"Duplicate identifier 'export='.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path/posix.d.ts","start":79,"length":20,"messageText":"'export=' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path/posix.d.ts","start":171,"length":20,"messageText":"and here.","category":3,"code":6204}]},{"start":8325,"length":4,"messageText":"Duplicate identifier 'export='.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path/win32.d.ts","start":79,"length":20,"messageText":"'export=' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/path/win32.d.ts","start":171,"length":20,"messageText":"and here.","category":3,"code":6204}]}]],[233,[{"start":0,"length":7,"messageText":"Definitions of the following identifiers conflict with those in another file: process, Platform, Architecture, Signals, UncaughtExceptionOrigin, BeforeExitListener, DisconnectListener, ExitListener, MessageListener, RejectionHandledListener, SignalsListener, UncaughtExceptionListener, UnhandledRejectionListener, WarningListener, WorkerListener","category":1,"code":6200,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/process.d.ts","start":0,"length":7,"messageText":"Conflicts are in this file.","category":3,"code":6201}]}]],[239,[{"start":4630,"length":8,"messageText":"Duplicate identifier 'AssetKey'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/sea.d.ts","start":4630,"length":8,"messageText":"'AssetKey' was also declared here.","category":3,"code":6203}]}]],[240,[{"start":1411,"length":7,"messageText":"Definitions of the following identifiers conflict with those in another file: SQLInputValue, SQLOutputValue, DatabaseSync, StatementSync, SQLITE_CHANGESET_DATA, SQLITE_CHANGESET_NOTFOUND, SQLITE_CHANGESET_CONFLICT, SQLITE_CHANGESET_FOREIGN_KEY, SQLITE_CHANGESET_OMIT, SQLITE_CHANGESET_REPLACE, SQLITE_CHANGESET_ABORT","category":1,"code":6200,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/sqlite.d.ts","start":1411,"length":7,"messageText":"Conflicts are in this file.","category":3,"code":6201}]}]],[241,[{"start":85140,"length":6,"messageText":"Duplicate identifier 'stream'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/stream.d.ts","start":88352,"length":6,"messageText":"'stream' was also declared here.","category":3,"code":6203}]},{"start":85233,"length":6,"messageText":"Duplicate identifier 'Stream'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/stream.d.ts","start":88259,"length":6,"messageText":"'Stream' was also declared here.","category":3,"code":6203}]}]],[246,[{"start":98339,"length":4,"messageText":"Duplicate identifier 'test'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/test.d.ts","start":104421,"length":4,"messageText":"'test' was also declared here.","category":3,"code":6203}]},{"start":101398,"length":3,"messageText":"Duplicate identifier 'dot'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/test/reporters.d.ts","start":4002,"length":3,"messageText":"'dot' was also declared here.","category":3,"code":6203}]},{"start":101403,"length":5,"messageText":"Duplicate identifier 'junit'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/test/reporters.d.ts","start":4007,"length":5,"messageText":"'junit' was also declared here.","category":3,"code":6203}]},{"start":101410,"length":4,"messageText":"Duplicate identifier 'lcov'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/test/reporters.d.ts","start":4014,"length":4,"messageText":"'lcov' was also declared here.","category":3,"code":6203}]},{"start":101416,"length":4,"messageText":"Duplicate identifier 'spec'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/test/reporters.d.ts","start":4020,"length":4,"messageText":"'spec' was also declared here.","category":3,"code":6203}]},{"start":101422,"length":3,"messageText":"Duplicate identifier 'tap'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/test/reporters.d.ts","start":4026,"length":3,"messageText":"'tap' was also declared here.","category":3,"code":6203}]},{"start":101427,"length":9,"messageText":"Duplicate identifier 'TestEvent'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/test/reporters.d.ts","start":4031,"length":9,"messageText":"'TestEvent' was also declared here.","category":3,"code":6203}]}]],[247,[{"start":9246,"length":13,"messageText":"Duplicate identifier '__promisify__'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/timers.d.ts","start":722,"length":13,"messageText":"'__promisify__' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/timers.d.ts","start":1218,"length":13,"messageText":"and here.","category":3,"code":6204}]},{"start":12444,"length":13,"messageText":"Duplicate identifier '__promisify__'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/timers.d.ts","start":722,"length":13,"messageText":"'__promisify__' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@25.5.0/node_modules/@types/node/web-globals/timers.d.ts","start":1218,"length":13,"messageText":"and here.","category":3,"code":6204}]}]],[312,[{"start":5267,"length":8,"messageText":"Subsequent variable declarations must have the same type. Variable 'Instance' must be of type '{ new (module: Module, importObject?: Imports | undefined): Instance; prototype: Instance; }', but here has type '{ new (module: Module, importObject?: Imports | undefined): Instance; prototype: Instance; }'.","category":1,"code":2403,"relatedInformation":[{"file":"../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.dom.d.ts","start":2211474,"length":8,"messageText":"'Instance' was also declared here.","category":3,"code":6203}]}]],[322,[{"start":858,"length":8,"messageText":"All declarations of 'Iterator' must have identical type parameters.","category":1,"code":2428},{"start":950,"length":13,"messageText":"All declarations of 'AsyncIterator' must have identical type parameters.","category":1,"code":2428},{"start":1154,"length":21,"messageText":"Duplicate identifier 'BuiltinIteratorReturn'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/compatibility/iterators.d.ts","start":1024,"length":21,"messageText":"'BuiltinIteratorReturn' was also declared here.","category":3,"code":6203}]}]],[323,[{"start":0,"length":6,"messageText":"Definitions of the following identifiers conflict with those in another file: TypedArray, ArrayBufferView, NonSharedUint8Array, NonSharedUint8ClampedArray, NonSharedUint16Array, NonSharedUint32Array, NonSharedInt8Array, NonSharedInt16Array, NonSharedInt32Array, NonSharedBigUint64Array, NonSharedBigInt64Array, NonSharedFloat32Array, NonSharedFloat64Array, NonSharedDataView, NonSharedTypedArray, NonSharedArrayBufferView","category":1,"code":6200,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/globals.typedarray.d.ts","start":0,"length":6,"messageText":"Conflicts are in this file.","category":3,"code":6201}]}]],[324,[{"start":22309,"length":15,"messageText":"Duplicate identifier 'NonSharedBuffer'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/buffer.buffer.d.ts","start":22304,"length":15,"messageText":"'NonSharedBuffer' was also declared here.","category":3,"code":6203}]},{"start":22550,"length":17,"messageText":"Duplicate identifier 'AllowSharedBuffer'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/buffer.buffer.d.ts","start":22545,"length":17,"messageText":"'AllowSharedBuffer' was also declared here.","category":3,"code":6203}]}]],[325,[{"start":3621,"length":29,"messageText":"Duplicate index signature for type 'string'.","category":1,"code":2374},{"start":3698,"length":38,"messageText":"Duplicate index signature for type 'string'.","category":1,"code":2374},{"start":3753,"length":14,"messageText":"Duplicate identifier 'PartialOptions'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/globals.d.ts","start":4916,"length":14,"messageText":"'PartialOptions' was also declared here.","category":3,"code":6203}]},{"start":4318,"length":8,"messageText":"All declarations of 'Iterator' must have identical type parameters.","category":1,"code":2428},{"start":4561,"length":13,"messageText":"All declarations of 'AsyncIterator' must have identical type parameters.","category":1,"code":2428}]],[326,[{"start":21,"length":34,"messageText":"Module '\"node:events\"' has no exported member 'InternalEventTargetEventProperties'.","category":1,"code":2305}]],[382,[{"start":722,"length":13,"messageText":"Duplicate identifier '__promisify__'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/timers.d.ts","start":9246,"length":13,"messageText":"'__promisify__' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/timers.d.ts","start":12444,"length":13,"messageText":"and here.","category":3,"code":6204}]},{"start":1218,"length":13,"messageText":"Duplicate identifier '__promisify__'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/timers.d.ts","start":9246,"length":13,"messageText":"'__promisify__' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/timers.d.ts","start":12444,"length":13,"messageText":"and here.","category":3,"code":6204}]}]],[384,[{"start":39988,"length":6,"messageText":"Duplicate identifier 'assert'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/assert.d.ts","start":45260,"length":6,"messageText":"'assert' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/assert.d.ts","start":45167,"length":6,"messageText":"and here.","category":3,"code":6204}]},{"start":40081,"length":6,"messageText":"Duplicate identifier 'assert'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/assert.d.ts","start":45260,"length":6,"messageText":"'assert' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/assert.d.ts","start":45167,"length":6,"messageText":"and here.","category":3,"code":6204}]}]],[385,[{"start":2711,"length":6,"messageText":"Duplicate identifier 'strict'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/assert/strict.d.ts","start":2993,"length":6,"messageText":"'strict' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/assert/strict.d.ts","start":2886,"length":6,"messageText":"and here.","category":3,"code":6204}]},{"start":2818,"length":6,"messageText":"Duplicate identifier 'strict'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/assert/strict.d.ts","start":2993,"length":6,"messageText":"'strict' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/assert/strict.d.ts","start":2886,"length":6,"messageText":"and here.","category":3,"code":6204}]}]],[387,[{"start":5625,"length":14,"messageText":"Duplicate identifier 'BufferEncoding'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/buffer.d.ts","start":9820,"length":14,"messageText":"'BufferEncoding' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/buffer.d.ts","start":9885,"length":14,"messageText":"and here.","category":3,"code":6204}]},{"start":5690,"length":14,"messageText":"Duplicate identifier 'BufferEncoding'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/buffer.d.ts","start":9820,"length":14,"messageText":"'BufferEncoding' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/buffer.d.ts","start":9885,"length":14,"messageText":"and here.","category":3,"code":6204}]}]],[388,[{"start":3798,"length":20,"messageText":"Module '\"node:events\"' has no exported member 'InternalEventEmitter'.","category":1,"code":2305},{"start":4792,"length":12,"code":2720,"category":1,"messageText":{"messageText":"Class 'ChildProcess' incorrectly implements class 'EventEmitter'. Did you mean to extend 'EventEmitter' and inherit its members as a subclass?","category":1,"code":2720,"next":[{"messageText":"Type 'ChildProcess' is missing the following properties from type 'EventEmitter': addListener, on, once, removeListener, and 11 more.","category":1,"code":2740}]}}]],[389,[{"start":1801,"length":20,"messageText":"Module '\"node:events\"' has no exported member 'InternalEventEmitter'.","category":1,"code":2305},{"start":1854,"length":6,"code":2720,"category":1,"messageText":{"messageText":"Class 'Worker' incorrectly implements class 'EventEmitter'. Did you mean to extend 'EventEmitter' and inherit its members as a subclass?","category":1,"code":2720,"next":[{"messageText":"Type 'Worker' is missing the following properties from type 'EventEmitter': addListener, on, once, removeListener, and 11 more.","category":1,"code":2740}]}},{"start":21093,"length":17,"messageText":"An export assignment cannot be used in a module with other exported elements.","category":1,"code":2309},{"start":21190,"length":17,"messageText":"An export assignment cannot be used in a module with other exported elements.","category":1,"code":2309}]],[390,[{"start":6650,"length":7,"messageText":"Duplicate identifier 'console'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/console.d.ts","start":20936,"length":28,"messageText":"'console' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/console.d.ts","start":2594,"length":7,"messageText":"and here.","category":3,"code":6204}]},{"start":6747,"length":7,"messageText":"Duplicate identifier 'console'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/console.d.ts","start":20936,"length":28,"messageText":"'console' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/console.d.ts","start":2594,"length":7,"messageText":"and here.","category":3,"code":6204}]}]],[391,[{"start":702,"length":9,"messageText":"Duplicate identifier 'constants'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/constants.d.ts","start":803,"length":9,"messageText":"'constants' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/constants.d.ts","start":697,"length":9,"messageText":"and here.","category":3,"code":6204}]},{"start":807,"length":9,"messageText":"Duplicate identifier 'constants'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/constants.d.ts","start":803,"length":9,"messageText":"'constants' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/constants.d.ts","start":697,"length":9,"messageText":"and here.","category":3,"code":6204}]}]],[393,[{"start":889,"length":20,"messageText":"Module '\"node:events\"' has no exported member 'InternalEventEmitter'.","category":1,"code":2305},{"start":3961,"length":6,"code":2720,"category":1,"messageText":{"messageText":"Class 'Socket' incorrectly implements class 'EventEmitter'. Did you mean to extend 'EventEmitter' and inherit its members as a subclass?","category":1,"code":2720,"next":[{"messageText":"Type 'Socket' is missing the following properties from type 'EventEmitter': addListener, on, once, removeListener, and 11 more.","category":1,"code":2740}]}}]],[398,[{"start":3993,"length":12,"messageText":"All declarations of 'EventEmitter' must have identical type parameters.","category":1,"code":2428},{"start":5557,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":5583,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":7573,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":7580,"length":19,"messageText":"A rest parameter must be of an array type.","category":1,"code":2370},{"start":7594,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":9290,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":9337,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":9939,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":9956,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":10165,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":10191,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":11895,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":11921,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":13436,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":13462,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":14485,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":14511,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":15416,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":15462,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":17079,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":17096,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":17809,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":21953,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":21979,"length":1,"code":2344,"category":1,"messageText":{"messageText":"Type 'T' does not satisfy the constraint 'EventMap'.","category":1,"code":2344,"next":[{"messageText":"Type 'EventMap' is not assignable to type 'EventMap'. Two different types with this name exist, but they are unrelated.","category":1,"code":2719,"next":[{"messageText":"Type 'DefaultEventMap' is not assignable to type 'EventMap'.","category":1,"code":2322}]}]}},{"start":48809,"length":12,"messageText":"Duplicate identifier 'EventEmitter'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/events.d.ts","start":44242,"length":6,"messageText":"'EventEmitter' was also declared here.","category":3,"code":6203}]},{"start":48908,"length":6,"messageText":"Duplicate identifier 'events'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/events.d.ts","start":44143,"length":12,"messageText":"'events' was also declared here.","category":3,"code":6203}]}]],[399,[{"start":659,"length":20,"messageText":"Module '\"node:events\"' has no exported member 'InternalEventEmitter'.","category":1,"code":2305},{"start":13966,"length":16,"messageText":"Namespace 'Stream' has no exported member 'ReadableEventMap'.","category":1,"code":2694},{"start":21392,"length":10,"code":2720,"category":1,"messageText":{"messageText":"Class 'Utf8Stream' incorrectly implements class 'EventEmitter'. Did you mean to extend 'EventEmitter' and inherit its members as a subclass?","category":1,"code":2720,"next":[{"messageText":"Type 'Utf8Stream' is missing the following properties from type 'EventEmitter': addListener, on, once, removeListener, and 11 more.","category":1,"code":2740}]}},{"start":24908,"length":16,"messageText":"Namespace 'Stream' has no exported member 'WritableEventMap'.","category":1,"code":2694}]],[401,[{"start":26432,"length":16,"messageText":"Namespace 'Stream' has no exported member 'WritableEventMap'.","category":1,"code":2694},{"start":45083,"length":16,"messageText":"Namespace 'Stream' has no exported member 'WritableEventMap'.","category":1,"code":2694},{"start":55127,"length":16,"messageText":"Namespace 'Stream' has no exported member 'ReadableEventMap'.","category":1,"code":2694}]],[402,[{"start":392,"length":20,"messageText":"Module '\"node:events\"' has no exported member 'InternalEventEmitter'.","category":1,"code":2305},{"start":2238,"length":14,"messageText":"Namespace 'Stream' has no exported member 'DuplexEventMap'.","category":1,"code":2694},{"start":73089,"length":16,"messageText":"Namespace 'Stream' has no exported member 'ReadableEventMap'.","category":1,"code":2694}]],[405,[{"start":170348,"length":19,"messageText":"Namespace '\"inspector\".Network' has no exported member 'EnableParameterType'.","category":1,"code":2694},{"start":180808,"length":29,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketCreatedEventDataType'.","category":1,"code":2694},{"start":181027,"length":28,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketClosedEventDataType'.","category":1,"code":2694},{"start":181291,"length":47,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketHandshakeResponseReceivedEventDataType'.","category":1,"code":2694},{"start":187592,"length":29,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketCreatedEventDataType'.","category":1,"code":2694},{"start":187720,"length":28,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketClosedEventDataType'.","category":1,"code":2694},{"start":187866,"length":47,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketHandshakeResponseReceivedEventDataType'.","category":1,"code":2694},{"start":195496,"length":29,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketCreatedEventDataType'.","category":1,"code":2694},{"start":195706,"length":28,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketClosedEventDataType'.","category":1,"code":2694},{"start":195961,"length":47,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketHandshakeResponseReceivedEventDataType'.","category":1,"code":2694},{"start":204847,"length":29,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketCreatedEventDataType'.","category":1,"code":2694},{"start":205059,"length":28,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketClosedEventDataType'.","category":1,"code":2694},{"start":205316,"length":47,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketHandshakeResponseReceivedEventDataType'.","category":1,"code":2694},{"start":214536,"length":29,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketCreatedEventDataType'.","category":1,"code":2694},{"start":214759,"length":28,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketClosedEventDataType'.","category":1,"code":2694},{"start":215027,"length":47,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketHandshakeResponseReceivedEventDataType'.","category":1,"code":2694},{"start":224502,"length":29,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketCreatedEventDataType'.","category":1,"code":2694},{"start":224729,"length":28,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketClosedEventDataType'.","category":1,"code":2694},{"start":225001,"length":47,"messageText":"Namespace '\"inspector\".Network' has no exported member 'WebSocketHandshakeResponseReceivedEventDataType'.","category":1,"code":2694}]],[407,[{"start":34328,"length":6,"messageText":"Duplicate identifier 'Module'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/module.d.ts","start":40249,"length":6,"messageText":"'Module' was also declared here.","category":3,"code":6203}]},{"start":34421,"length":6,"messageText":"Duplicate identifier 'module'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/module.d.ts","start":40156,"length":6,"messageText":"'module' was also declared here.","category":3,"code":6203}]}]],[408,[{"start":523,"length":20,"messageText":"Module '\"node:events\"' has no exported member 'InternalEventEmitter'.","category":1,"code":2305},{"start":2621,"length":14,"messageText":"Namespace 'Stream' has no exported member 'DuplexEventMap'.","category":1,"code":2694},{"start":22510,"length":6,"code":2720,"category":1,"messageText":{"messageText":"Class 'Server' incorrectly implements class 'EventEmitter'. Did you mean to extend 'EventEmitter' and inherit its members as a subclass?","category":1,"code":2720,"next":[{"messageText":"Type 'Server' is missing the following properties from type 'EventEmitter': addListener, on, once, removeListener, and 11 more.","category":1,"code":2740}]}}]],[410,[{"start":7795,"length":4,"messageText":"Duplicate identifier 'path'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":8131,"length":4,"messageText":"'path' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":8046,"length":4,"messageText":"and here.","category":3,"code":6204}]},{"start":7880,"length":4,"messageText":"Duplicate identifier 'path'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":8131,"length":4,"messageText":"'path' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":8046,"length":4,"messageText":"and here.","category":3,"code":6204}]}]],[411,[{"start":79,"length":20,"messageText":"Duplicate identifier 'export='.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":8228,"length":4,"messageText":"'export=' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":78,"length":4,"messageText":"and here.","category":3,"code":6204}]},{"start":171,"length":20,"messageText":"Duplicate identifier 'export='.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":8228,"length":4,"messageText":"'export=' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":78,"length":4,"messageText":"and here.","category":3,"code":6204}]}]],[412,[{"start":79,"length":20,"messageText":"Duplicate identifier 'export='.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":8325,"length":4,"messageText":"'export=' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":164,"length":4,"messageText":"and here.","category":3,"code":6204}]},{"start":171,"length":20,"messageText":"Duplicate identifier 'export='.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":8325,"length":4,"messageText":"'export=' was also declared here.","category":3,"code":6203},{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/path.d.ts","start":164,"length":4,"messageText":"and here.","category":3,"code":6204}]}]],[413,[{"start":1205,"length":34,"messageText":"Module '\"node:events\"' has no exported member 'InternalEventTargetEventProperties'.","category":1,"code":2305}]],[414,[{"start":0,"length":7,"messageText":"Definitions of the following identifiers conflict with those in another file: process, Platform, Architecture, Signals, UncaughtExceptionOrigin, BeforeExitListener, DisconnectListener, ExitListener, MessageListener, RejectionHandledListener, SignalsListener, UncaughtExceptionListener, UnhandledRejectionListener, WarningListener, WorkerListener","category":1,"code":6200,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/process.d.ts","start":0,"length":7,"messageText":"Conflicts are in this file.","category":3,"code":6201}]},{"start":96379,"length":10,"messageText":"Overload signatures must all be optional or required.","category":1,"code":2386}]],[418,[{"start":1309,"length":20,"messageText":"Module '\"node:events\"' has no exported member 'InternalEventEmitter'.","category":1,"code":2305},{"start":2390,"length":9,"code":2720,"category":1,"messageText":{"messageText":"Class 'Interface' incorrectly implements class 'EventEmitter'. Did you mean to extend 'EventEmitter' and inherit its members as a subclass?","category":1,"code":2720,"next":[{"messageText":"Type 'Interface' is missing the following properties from type 'EventEmitter': addListener, on, once, removeListener, and 11 more.","category":1,"code":2740}]}}]],[421,[{"start":4630,"length":8,"messageText":"Duplicate identifier 'AssetKey'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/sea.d.ts","start":4630,"length":8,"messageText":"'AssetKey' was also declared here.","category":3,"code":6203}]}]],[422,[{"start":1411,"length":7,"messageText":"Definitions of the following identifiers conflict with those in another file: SQLInputValue, SQLOutputValue, DatabaseSync, StatementSync, SQLITE_CHANGESET_DATA, SQLITE_CHANGESET_NOTFOUND, SQLITE_CHANGESET_CONFLICT, SQLITE_CHANGESET_FOREIGN_KEY, SQLITE_CHANGESET_OMIT, SQLITE_CHANGESET_REPLACE, SQLITE_CHANGESET_ABORT","category":1,"code":6200,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/sqlite.d.ts","start":1411,"length":7,"messageText":"Conflicts are in this file.","category":3,"code":6201}]}]],[423,[{"start":88259,"length":6,"messageText":"Duplicate identifier 'Stream'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/stream.d.ts","start":85233,"length":6,"messageText":"'Stream' was also declared here.","category":3,"code":6203}]},{"start":88352,"length":6,"messageText":"Duplicate identifier 'stream'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/stream.d.ts","start":85140,"length":6,"messageText":"'stream' was also declared here.","category":3,"code":6203}]}]],[428,[{"start":2805,"length":16,"messageText":"Module '\"node:stream\"' has no exported member 'ReadableEventMap'.","category":1,"code":2305},{"start":104421,"length":4,"messageText":"Duplicate identifier 'test'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/test.d.ts","start":98339,"length":4,"messageText":"'test' was also declared here.","category":3,"code":6203}]}]],[429,[{"start":4002,"length":3,"messageText":"Duplicate identifier 'dot'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/test.d.ts","start":101398,"length":3,"messageText":"'dot' was also declared here.","category":3,"code":6203}]},{"start":4007,"length":5,"messageText":"Duplicate identifier 'junit'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/test.d.ts","start":101403,"length":5,"messageText":"'junit' was also declared here.","category":3,"code":6203}]},{"start":4014,"length":4,"messageText":"Duplicate identifier 'lcov'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/test.d.ts","start":101410,"length":4,"messageText":"'lcov' was also declared here.","category":3,"code":6203}]},{"start":4020,"length":4,"messageText":"Duplicate identifier 'spec'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/test.d.ts","start":101416,"length":4,"messageText":"'spec' was also declared here.","category":3,"code":6203}]},{"start":4026,"length":3,"messageText":"Duplicate identifier 'tap'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/test.d.ts","start":101422,"length":3,"messageText":"'tap' was also declared here.","category":3,"code":6203}]},{"start":4031,"length":9,"messageText":"Duplicate identifier 'TestEvent'.","category":1,"code":2300,"relatedInformation":[{"file":"../../node_modules/.bun/@types+node@22.19.15/node_modules/@types/node/test.d.ts","start":101427,"length":9,"messageText":"'TestEvent' was also declared here.","category":3,"code":6203}]}]],[439,[{"start":1359,"length":11,"messageText":"Module '\"node:module\"' has no exported member 'ImportPhase'.","category":1,"code":2305}]],[441,[{"start":2242,"length":20,"messageText":"Module '\"node:events\"' has no exported member 'InternalEventEmitter'.","category":1,"code":2305},{"start":2272,"length":34,"messageText":"Module '\"node:events\"' has no exported member 'InternalEventTargetEventProperties'.","category":1,"code":2305},{"start":9083,"length":6,"code":2720,"category":1,"messageText":{"messageText":"Class 'Worker' incorrectly implements class 'EventEmitter'. Did you mean to extend 'EventEmitter' and inherit its members as a subclass?","category":1,"code":2720,"next":[{"messageText":"Type 'Worker' is missing the following properties from type 'EventEmitter': addListener, on, once, removeListener, and 11 more.","category":1,"code":2740}]}}]]],"affectedFilesPendingEmit":[188,189,187],"emitSignatures":[187,188,189],"version":"6.0.2"} \ No newline at end of file diff --git a/packages/runtime/package.json b/packages/runtime/package.json new file mode 100644 index 0000000..e23ddbb --- /dev/null +++ b/packages/runtime/package.json @@ -0,0 +1,24 @@ +{ + "name": "@paws/runtime", + "version": "0.1.0", + "private": true, + "description": "Runtime adapter interface — pluggable execution backends for paws sessions", + "type": "module", + "exports": { + ".": { + "types": "./src/index.ts", + "import": "./src/index.ts" + } + }, + "scripts": { + "build": "bun build ./src/index.ts --outdir dist --target bun", + "test": "vitest run --passWithNoTests", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "neverthrow": "^8.2.0" + }, + "devDependencies": { + "vitest": "^4.1.2" + } +} diff --git a/packages/runtime/src/errors.ts b/packages/runtime/src/errors.ts new file mode 100644 index 0000000..9c7fb2a --- /dev/null +++ b/packages/runtime/src/errors.ts @@ -0,0 +1,38 @@ +/** Base error class for all paws errors */ +export class PawsError extends Error { + readonly code: string; + override readonly cause?: unknown; + + constructor(code: string, message: string, cause?: unknown) { + super(message); + this.name = this.constructor.name; + this.code = code; + this.cause = cause; + } +} + +/** Runtime error codes */ +export const RuntimeErrorCode = { + NO_RUNTIME: 'NO_RUNTIME', + CAPACITY_EXHAUSTED: 'CAPACITY_EXHAUSTED', + NETWORK_SETUP_FAILED: 'NETWORK_SETUP_FAILED', + PROXY_FAILED: 'PROXY_FAILED', + VM_RESTORE_FAILED: 'VM_RESTORE_FAILED', + SSH_FAILED: 'SSH_FAILED', + EXECUTION_FAILED: 'EXECUTION_FAILED', + CLEANUP_FAILED: 'CLEANUP_FAILED', + CA_GENERATION_FAILED: 'CA_GENERATION_FAILED', + TIMEOUT: 'TIMEOUT', +} as const; + +export type RuntimeErrorCode = (typeof RuntimeErrorCode)[keyof typeof RuntimeErrorCode]; + +/** Error thrown by runtime adapters */ +export class RuntimeError extends PawsError { + override readonly code: RuntimeErrorCode; + + constructor(code: RuntimeErrorCode, message: string, cause?: unknown) { + super(code, message, cause); + this.code = code; + } +} diff --git a/packages/runtime/src/index.ts b/packages/runtime/src/index.ts new file mode 100644 index 0000000..6055dd9 --- /dev/null +++ b/packages/runtime/src/index.ts @@ -0,0 +1,16 @@ +export { PawsError, RuntimeError, RuntimeErrorCode } from './errors.js'; +export type { RuntimeErrorCode as RuntimeErrorCodeType } from './errors.js'; + +export { createRuntimeRegistry } from './registry.js'; +export type { RuntimeRegistry } from './registry.js'; + +export type { + RuntimeAdapter, + RuntimeCapabilities, + RuntimeSessionRequest, + ResolvedCredentials, + SessionResult, + ExposedPortResult, + ExecuteOptions, + PortExposureProvider, +} from './types.js'; diff --git a/packages/runtime/src/registry.ts b/packages/runtime/src/registry.ts new file mode 100644 index 0000000..47b1e37 --- /dev/null +++ b/packages/runtime/src/registry.ts @@ -0,0 +1,60 @@ +import { RuntimeError, RuntimeErrorCode } from './errors.js'; +import type { RuntimeAdapter, RuntimeSessionRequest } from './types.js'; + +/** Registry for pluggable runtime adapters */ +export interface RuntimeRegistry { + /** Register a runtime adapter */ + register(adapter: RuntimeAdapter): void; + + /** Get a runtime by name */ + get(name: string): RuntimeAdapter | undefined; + + /** + * Resolve the best runtime for a session request. + * For now, returns the first (and likely only) registered runtime. + * Future: select based on request requirements and runtime capabilities. + */ + resolve(request?: RuntimeSessionRequest): RuntimeAdapter; + + /** List all registered runtimes */ + list(): RuntimeAdapter[]; + + /** Dispose all registered runtimes */ + disposeAll(): Promise; +} + +/** Create a runtime registry */ +export function createRuntimeRegistry(): RuntimeRegistry { + const runtimes = new Map(); + + return { + register(adapter) { + runtimes.set(adapter.name, adapter); + }, + + get(name) { + return runtimes.get(name); + }, + + resolve(_request) { + const first = runtimes.values().next(); + if (first.done) { + throw new RuntimeError( + RuntimeErrorCode.NO_RUNTIME, + 'No runtime adapter registered. Configure at least one runtime (e.g., firecracker).', + ); + } + return first.value; + }, + + list() { + return [...runtimes.values()]; + }, + + async disposeAll() { + const adapters = [...runtimes.values()]; + runtimes.clear(); + await Promise.allSettled(adapters.map((a) => a.dispose())); + }, + }; +} diff --git a/packages/runtime/src/types.ts b/packages/runtime/src/types.ts new file mode 100644 index 0000000..99ee610 --- /dev/null +++ b/packages/runtime/src/types.ts @@ -0,0 +1,124 @@ +import type { ResultAsync } from 'neverthrow'; + +import type { RuntimeError } from './errors.js'; + +/** Capabilities declared by a runtime adapter */ +export interface RuntimeCapabilities { + /** Can run arbitrary Linux binaries (compilers, Docker, etc.) */ + fullLinux: boolean; + /** Uses hardware-level isolation (KVM) */ + hardwareIsolation: boolean; + /** Injects credentials transparently at network layer (MITM proxy) */ + transparentCredentialInjection: boolean; + /** Approximate cold start time in milliseconds */ + coldStartMs: number; + /** Max concurrent sessions this runtime supports */ + maxConcurrentSessions: number; +} + +/** Resolved credentials ready for injection */ +export interface ResolvedCredentials { + /** Domain -> headers to inject */ + domains: Record; target?: string }>; + /** Domains allowed without credentials */ + allowlist: string[]; +} + +/** Result of a completed session */ +export interface SessionResult { + exitCode: number; + stdout: string; + stderr: string; + output?: unknown; + durationMs: number; + exposedPorts?: ExposedPortResult[]; +} + +/** A port exposed during session execution */ +export interface ExposedPortResult { + port: number; + url: string; + label?: string; + access?: string; + pin?: string; + shareLink?: string; +} + +/** Options for session execution */ +export interface ExecuteOptions { + signal?: AbortSignal; + onStatusChange?: (status: string) => void; + portExposure?: PortExposureProvider; +} + +/** Provider for exposing ports from the runtime to the outside world */ +export interface PortExposureProvider { + expose( + sessionId: string, + ports: Array<{ port: number; protocol?: string; label?: string }>, + hostPorts: number[], + ): Promise; + cleanup(sessionId: string, tunnels: ExposedPortResult[]): Promise; +} + +/** Session execution request (runtime-agnostic subset of CreateSessionRequest) */ +export interface RuntimeSessionRequest { + /** Snapshot/image identifier */ + snapshot: string; + /** Workload to execute */ + workload: { + type: string; + script: string; + env: Record; + }; + /** Resource allocation */ + resources?: { + vcpus: number; + memoryMB: number; + }; + /** Timeout in milliseconds */ + timeoutMs: number; + /** Port exposure requests */ + exposePorts?: Array<{ + port: number; + protocol?: string; + label?: string; + access?: string; + allowedEmails?: string[]; + }>; +} + +/** + * Runtime adapter interface. + * + * Each adapter owns the full session lifecycle: network setup, credential injection, + * VM/container/isolate management, workload execution, result collection, and cleanup. + * + * Cleanup MUST be guaranteed even on failure (use finally blocks). + */ +export interface RuntimeAdapter { + /** Unique runtime name (e.g., 'firecracker', 'agent-os', 'docker') */ + readonly name: string; + + /** Capabilities this runtime provides */ + readonly capabilities: RuntimeCapabilities; + + /** + * Execute a session from start to finish. + * + * @param sessionId - Unique session identifier + * @param request - Runtime-agnostic session request + * @param credentials - Resolved credentials for injection + * @param options - Optional execution options (abort signal, port exposure) + * @returns Session result or error + */ + execute( + sessionId: string, + request: RuntimeSessionRequest, + credentials: ResolvedCredentials, + options?: ExecuteOptions, + ): ResultAsync; + + /** Release all resources held by this runtime */ + dispose(): Promise; +} diff --git a/packages/runtime/tsconfig.json b/packages/runtime/tsconfig.json new file mode 100644 index 0000000..bd96c2d --- /dev/null +++ b/packages/runtime/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "outDir": "dist", + "rootDir": "src", + "types": [] + }, + "include": ["src"] +} diff --git a/packages/runtime/tsconfig.tsbuildinfo b/packages/runtime/tsconfig.tsbuildinfo new file mode 100644 index 0000000..303445f --- /dev/null +++ b/packages/runtime/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.collection.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.float16.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.intl.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.iterator.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.promise.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.regexp.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.bun/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.full.d.ts","./src/errors.ts","../../node_modules/.bun/neverthrow@8.2.0/node_modules/neverthrow/dist/index.d.ts","./src/types.ts","./src/registry.ts","./src/index.ts"],"fileIdsList":[[83,85,86],[83,85],[83,84]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"1e9332c23e9a907175e0ffc6a49e236f97b48838cc8aec9ce7e4cec21e544b65","impliedFormat":1},{"version":"3753fbc1113dc511214802a2342280a8b284ab9094f6420e7aa171e868679f91","impliedFormat":1},{"version":"999ca32883495a866aa5737fe1babc764a469e4cde6ee6b136a4b9ae68853e4b","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"2a2de5b9459b3fc44decd9ce6100b72f1b002ef523126c1d3d8b2a4a63d74d78","affectsGlobalScope":true,"impliedFormat":1},{"version":"f13f4b465c99041e912db5c44129a94588e1aafee35a50eab51044833f50b4ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd714129fca875f7d4c477a1a392200b0bcd13fb2e80928cd334b63830ea047","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2c9037ae6cd2c52d80ceef0b3c5ffdb488627d71529cf4f63776daf11161c9a","affectsGlobalScope":true,"impliedFormat":1},{"version":"135d5cf4d345f59f1a9caadfafcd858d3d9cc68290db616cc85797224448cccc","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc238c3f81c2984751932b6aab223cd5b830e0ac6cad76389e5e9d2ffc03287d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a07f9b76d361f572620927e5735b77d6d2101c23cdd94383eb5b706e7b36357","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c4e8dc6ab834cc6baa0227e030606d29e3e8449a9f67cdf5605ea5493c4db29","affectsGlobalScope":true,"impliedFormat":1},{"version":"de7ba0fd02e06cd9a5bd4ab441ed0e122735786e67dde1e849cced1cd8b46b78","affectsGlobalScope":true,"impliedFormat":1},{"version":"6148e4e88d720a06855071c3db02069434142a8332cf9c182cda551adedf3156","affectsGlobalScope":true,"impliedFormat":1},{"version":"d63dba625b108316a40c95a4425f8d4294e0deeccfd6c7e59d819efa19e23409","affectsGlobalScope":true,"impliedFormat":1},{"version":"0568d6befee03dd435bed4fc25c4e46865b24bdcb8c563fdc21f580a2c301904","affectsGlobalScope":true,"impliedFormat":1},{"version":"30d62269b05b584741f19a5369852d5d34895aa2ac4fd948956f886d15f9cc0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ffbe6d7b295306b2ba88030f65b74c107d8d99bdcf596ea99c62a02f606108b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"996fb27b15277369c68a4ba46ed138b4e9e839a02fb4ec756f7997629242fd9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"79b712591b270d4778c89706ca2cfc56ddb8c3f895840e477388f1710dc5eda9","affectsGlobalScope":true,"impliedFormat":1},{"version":"20884846cef428b992b9bd032e70a4ef88e349263f63aeddf04dda837a7dba26","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"e03da518b01b46a4c99a1f88cd727ee98ddf14492c43dae1ae7a63e992971bab","impliedFormat":1},"59dc703036b8f209246bb5865f55bcf176fa247e1253096363856d553bcdb045",{"version":"578f25fcaeefc5b5fb071db12ccda89d4d3ef193f0c46a783e2bb42ef160a318","impliedFormat":1},"8b669f7856af4903bc40e125ad25819b27e6240c976e80323a0caffbc08a4dc6","ec1d8c908a5149de70c299f0dc5c57e0d309151dc783fe475cd3828fdc5195e9","4830b2876252d78fc53df09b5dcf1c28b66adcb5e3bef4912a722e0d5127c273"],"root":[83,[85,87]],"options":{"composite":true,"outDir":"./dist","rootDir":"./src"},"referencedMap":[[87,1],[86,2],[85,3]],"affectedFilesPendingEmit":[[83,17],[87,17],[86,17],[85,17]],"emitSignatures":[83,85,86,87],"version":"6.0.2"} \ No newline at end of file