{"version":3,"file":"session.cjs","names":["readRegistry","isPidAlive","Effect","ServiceDescriptorMap","DevRuntimeConfig","DevRenderer","getProcessStates","isDebug","getProcessEnv","createDevLogger","reapGroup","Deferred","isAuthMirrorPluginEntry","Clock","resolveLogLevel","createLogPipeline","probePortBindable","ownerOfPort","DateTime","formatLogLine","makeDevProcess","Layer","ServiceDescriptorMapLive","DevRuntimeConfigLive","DevGeneratedEnvLive","ShellEnvLive","Exit"],"sources":["../../../src/services/dev/session.ts"],"sourcesContent":["import { Clock, DateTime, Deferred, Effect, Exit, Layer } from \"effect\";\nimport { getProcessEnv } from \"../../env/process-env\";\nimport { ShellEnvLive } from \"../../env/project-env\";\nimport { ownerOfPort } from \"../../infra/port-ownership\";\nimport { probePortBindable } from \"../../infra/ports\";\nimport type { RuntimeConfig } from \"../../types\";\nimport { reapGroup } from \"../processes/kill\";\nimport {\n  isPidAlive,\n  readRegistry,\n  registerStandalone,\n  unregisterPid,\n  updateChildPids,\n  writeRegistry,\n} from \"../processes/registry\";\nimport {\n  createDevLogger,\n  createLogPipeline,\n  formatLogLine,\n  isDebug,\n  type LogEvent,\n  resolveLogLevel,\n} from \"./logs\";\nimport {\n  getProcessStates,\n  makeDevProcess,\n  markForceExitInFlight,\n  type ProcessCallbacks,\n  type ProcessHandle,\n} from \"./orchestrator\";\nimport { type DevProcessState, DevRenderer, type DevRendererHandle } from \"./render\";\nimport {\n  type AppOrchestrator,\n  DevGeneratedEnvLive,\n  DevRuntimeConfig,\n  DevRuntimeConfigLive,\n  isAuthMirrorPluginEntry,\n  type ServiceDescriptor,\n  ServiceDescriptorMap,\n  ServiceDescriptorMapLive,\n} from \"./service-descriptor\";\n\nconst adoptOrphanedChildren = (configDir: string): void => {\n  try {\n    const entries = readRegistry().filter(\n      (entry) => entry.pid > 1 && entry.configDir === configDir && !isPidAlive(entry.pid),\n    );\n    if (entries.length === 0) return;\n    const reaped: number[] = [];\n    for (const entry of entries) {\n      for (const childPid of entry.childPids ?? []) {\n        if (childPid === process.pid) continue;\n        if (isPidAlive(childPid)) {\n          reapGroup(childPid);\n          reaped.push(childPid);\n        }\n      }\n    }\n    if (reaped.length > 0) {\n      console.error(\n        `[Dev] Reaped ${reaped.length} orphaned child process(es) from dead session(s): ${reaped.join(\", \")}`,\n      );\n    }\n    const deadPids = new Set(entries.map((entry) => entry.pid));\n    writeRegistry(readRegistry().filter((entry) => !deadPids.has(entry.pid)));\n  } catch {\n    // best-effort; registry hygiene is non-critical for the running session\n  }\n};\n\nconst isInteractiveSupported = (): boolean => {\n  return process.stdin.isTTY === true && process.stdout.isTTY === true;\n};\n\nconst STARTUP_ORDER = [\"ui\", \"auth\", \"api\", \"plugin\", \"host-build\", \"host\"];\n\nconst sortByOrder = (packages: string[]): string[] => {\n  return [...packages].sort((a, b) => {\n    const aIdx = a.startsWith(\"plugin:\")\n      ? STARTUP_ORDER.indexOf(\"plugin\")\n      : STARTUP_ORDER.indexOf(a);\n    const bIdx = b.startsWith(\"plugin:\")\n      ? STARTUP_ORDER.indexOf(\"plugin\")\n      : STARTUP_ORDER.indexOf(b);\n    if (aIdx === -1 && bIdx === -1) return 0;\n    if (aIdx === -1) return 1;\n    if (bIdx === -1) return -1;\n    return aIdx - bIdx;\n  });\n};\n\nexport interface DevSessionHandle {\n  shutdown: (mode: \"graceful\" | \"force\") => void;\n}\n\nexport interface DevSessionDeps {\n  exit?: (code: number) => void;\n  forceTimeoutMs?: number;\n  reap?: (pid: number) => void;\n  ppid?: () => number;\n}\n\nexport const runDevSession = (\n  configDir: string,\n  orchestrator: AppOrchestrator,\n  onSessionReady?: (handle: DevSessionHandle) => void,\n  deps: DevSessionDeps = {},\n) =>\n  Effect.gen(function* () {\n    adoptOrphanedChildren(configDir);\n    const services = yield* ServiceDescriptorMap;\n    const runtimeConfig = yield* DevRuntimeConfig;\n    const renderer = yield* DevRenderer;\n    const orderedPackages = sortByOrder(orchestrator.packages);\n    const initialProcesses: DevProcessState[] = getProcessStates(\n      orderedPackages,\n      services,\n      orchestrator.port,\n    );\n\n    if (isDebug(getProcessEnv(\"DEBUG\"))) {\n      yield* Effect.logError(\n        `[DEBUG session] orchestrator.packages: ${orchestrator.packages.join(\", \")}`,\n      );\n      yield* Effect.logError(`[DEBUG session] orderedPackages: ${orderedPackages.join(\", \")}`);\n      yield* Effect.logError(`[DEBUG session] services keys: ${[...services.keys()].join(\", \")}`);\n      yield* Effect.logError(\n        `[DEBUG session] initialProcesses: ${initialProcesses.map((p) => `${p.name}=${p.source}`).join(\", \")}`,\n      );\n    }\n\n    const logger = yield* Effect.promise(() =>\n      createDevLogger(configDir, orchestrator.description),\n    );\n\n    const exit = deps.exit ?? ((code: number) => process.exit(code));\n    const reap = deps.reap ?? reapGroup;\n    const forceTimeoutMs = deps.forceTimeoutMs ?? 5000;\n    const ppidNow = deps.ppid ?? (() => process.ppid);\n\n    const shutdown = yield* Deferred.make<void>();\n\n    const effectContext = yield* Effect.context();\n\n    const isWorkspaceChild = getProcessEnv(\"BOS_WORKSPACE_CHILD\") === \"1\";\n    let ownedPorts: number[] = [];\n    if (!isWorkspaceChild) {\n      const regPorts: Record<string, number> = {};\n      const addPort = (key: string, value: number | undefined | null) => {\n        if (value != null) regPorts[key] = value;\n      };\n      addPort(\"host\", runtimeConfig.host.port);\n      addPort(\"api\", runtimeConfig.api.port);\n      addPort(\"ui\", runtimeConfig.ui.port);\n      addPort(\"auth\", runtimeConfig.auth?.port);\n      if (runtimeConfig.plugins) {\n        for (const [id, plugin] of Object.entries(runtimeConfig.plugins)) {\n          if (!isAuthMirrorPluginEntry(runtimeConfig.auth, id, plugin)) {\n            addPort(`plugin:${id}`, plugin.port);\n          }\n          addPort(`plugin-ui:${id}`, plugin.ui?.port);\n        }\n      }\n      registerStandalone({\n        pid: process.pid,\n        configDir,\n        ports: regPorts,\n        startedAt: yield* Clock.currentTimeMillis,\n        description: orchestrator.description,\n      });\n      ownedPorts = Object.values(regPorts);\n    }\n\n    let view: DevRendererHandle | null = null;\n    let shouldExportLogs = false;\n\n    const logLevel = resolveLogLevel();\n    const allLogs: LogEvent[] = [];\n    const spawned: ProcessHandle[] = [];\n    const pipeline = createLogPipeline({\n      level: logLevel,\n      sinks: {\n        display: (event) => {\n          view?.addLog(event.source, event.line, event.level === \"error\");\n        },\n        file: (event) => {\n          if (orchestrator.noLogs) return;\n          void logger.write(event);\n        },\n        export: (event) => {\n          allLogs.push(event);\n        },\n      },\n    });\n\n    const useInteractive = isInteractiveSupported() && orchestrator.interactive !== false;\n    const restoreView = () => {\n      if (useInteractive) view?.unmount();\n    };\n    let handleRef: DevSessionHandle | null = null;\n    view = renderer.create(\n      initialProcesses,\n      orchestrator.description,\n      orchestrator.env,\n      () => handleRef?.shutdown(\"graceful\"),\n      () => {\n        shouldExportLogs = true;\n        handleRef?.shutdown(\"graceful\");\n      },\n      { interactive: useInteractive, onForceExit: () => handleRef?.shutdown(\"force\") },\n    );\n\n    const force = () => {\n      markForceExitInFlight();\n      try {\n        restoreView();\n      } catch {}\n      try {\n        pipeline.flush();\n      } catch {}\n      console.log(\"\\n[Dev] Force exit\");\n      for (const handle of spawned) {\n        if (handle.pid === undefined) continue;\n        try {\n          reap(handle.pid);\n        } catch {}\n      }\n      if (!isWorkspaceChild) {\n        try {\n          unregisterPid(process.pid);\n        } catch {}\n      }\n      void Effect.runPromiseWith(effectContext)(Deferred.succeed(shutdown, undefined));\n      exit(0);\n    };\n\n    let gracefulCount = 0;\n    let forceTimer: ReturnType<typeof setTimeout> | null = null;\n    const armForce = () => {\n      if (forceTimer) clearTimeout(forceTimer);\n      forceTimer = setTimeout(force, forceTimeoutMs);\n      forceTimer.unref?.();\n    };\n    const disarmForce = () => {\n      if (forceTimer) clearTimeout(forceTimer);\n      forceTimer = null;\n    };\n\n    const sessionHandle: DevSessionHandle = {\n      shutdown: (mode) => {\n        if (mode === \"force\") {\n          force();\n          return;\n        }\n        gracefulCount++;\n        if (gracefulCount > 1) {\n          force();\n          return;\n        }\n        restoreView();\n        console.log(\"\\n[Dev] Shutting down...\");\n        armForce();\n        void Effect.runPromiseWith(effectContext)(Deferred.succeed(shutdown, undefined));\n      },\n    };\n    handleRef = sessionHandle;\n\n    yield* Effect.addFinalizer(() => Effect.sync(disarmForce));\n\n    yield* Effect.addFinalizer(() =>\n      Effect.gen(function* () {\n        armForce();\n\n        yield* Effect.forEach(spawned, (h) => h.kill.pipe(Effect.ignore), {\n          concurrency: \"unbounded\",\n        });\n\n        yield* Effect.sleep(\"200 millis\");\n\n        for (const port of ownedPorts) {\n          const bindable = yield* probePortBindable(port);\n          if (!bindable) {\n            const owner = yield* ownerOfPort(port);\n            yield* Effect.logError(\n              `[Dev] Port ${port} still bound after teardown${\n                owner\n                  ? ` — pid ${owner.pid} (${owner.command})`\n                  : \" — owner unknown (lsof unavailable)\"\n              }`,\n            );\n          }\n        }\n\n        if (!isWorkspaceChild) {\n          yield* Effect.sync(() => {\n            try {\n              unregisterPid(process.pid);\n            } catch {\n              // best-effort; pruneDead cleans stale entries on next ps/kill\n            }\n          });\n        }\n\n        pipeline.flush();\n\n        view?.unmount();\n\n        if (shouldExportLogs) {\n          const now = yield* Clock.currentTimeMillis;\n          const startedMs = allLogs[0]?.timestamp || now;\n          yield* Effect.log(\"\");\n          yield* Effect.log(\"═\".repeat(70));\n          yield* Effect.log(`  SESSION LOGS: ${orchestrator.description}`);\n          yield* Effect.log(`  Started: ${DateTime.formatIso(DateTime.makeUnsafe(startedMs))}`);\n          yield* Effect.log(`  Filtered entries: ${allLogs.length} (level: ${logLevel})`);\n          yield* Effect.log(\"═\".repeat(70));\n          yield* Effect.log(\"\");\n          for (const event of allLogs) {\n            yield* Effect.log(formatLogLine(event));\n          }\n          yield* Effect.log(\"\");\n          yield* Effect.log(\"═\".repeat(70));\n          yield* Effect.log(`  Full logs saved to: ${logger.logFile}`);\n          yield* Effect.log(\"═\".repeat(70));\n          yield* Effect.log(\"\");\n        }\n      }),\n    );\n\n    const callbacks: ProcessCallbacks = {\n      onStatus: (name, status, message) => {\n        // An error-status flip is the failure boundary — the failure message\n        // logged just before it is still held in the pipeline's pending\n        // multi-line buffer (events complete one line late). Drain it now so\n        // the cause reaches the display tail and the log file even if the\n        // process is SIGKILLed before the session finalizer can flush.\n        if (status === \"error\") pipeline.flushSource(name);\n        view?.updateProcess(name, status, message);\n      },\n      onLog: (name, line, isError) => {\n        pipeline.ingest({ source: name, line, isError });\n      },\n    };\n\n    yield* Effect.forkScoped(\n      Effect.gen(function* () {\n        const initialPpid = ppidNow();\n        while (true) {\n          yield* Effect.sleep(\"200 millis\");\n          if (ppidNow() === initialPpid) continue;\n          console.error(\"\\n[Dev] Parent process died — force exiting (orphaned service tree)\");\n          force();\n        }\n      }),\n    );\n\n    onSessionReady?.(sessionHandle);\n\n    const startProcess = (pkg: string) => {\n      const portOverride = pkg === \"host\" ? orchestrator.port : undefined;\n      return makeDevProcess(pkg, callbacks, portOverride).pipe(\n        Effect.tap((handle) => Effect.sync(() => spawned.push(handle))),\n        Effect.flatMap((handle) =>\n          Effect.acquireRelease(Effect.succeed(handle), () => handle.kill.pipe(Effect.ignore)),\n        ),\n        Effect.tapError((err) =>\n          Effect.sync(() => {\n            callbacks.onLog(pkg, `Failed to start: ${String(err)}`, true);\n            callbacks.onStatus(pkg, \"error\");\n          }),\n        ),\n        Effect.orElseSucceed(\n          () =>\n            ({\n              name: pkg,\n              pid: undefined,\n              kill: Effect.void,\n              waitForReady: Effect.void,\n              waitForExit: Effect.never,\n            }) satisfies ProcessHandle,\n        ),\n      );\n    };\n\n    const startGroup = (packages: string[]) =>\n      Effect.forEach(packages, startProcess, { concurrency: \"unbounded\" });\n\n    const awaitReady = (pkg: string, handle: ProcessHandle) =>\n      handle.waitForReady.pipe(\n        Effect.timeout(\"120 seconds\"),\n        Effect.catch((err) =>\n          Effect.sync(() => {\n            callbacks.onLog(\n              pkg,\n              `Timed out or failed: ${err instanceof Error ? err.message : String(err)}`,\n              true,\n            );\n          }),\n        ),\n      );\n\n    const nonHostPackages = orderedPackages.filter((pkg) => pkg !== \"host\");\n    const hostPackages = orderedPackages.filter((pkg) => pkg === \"host\");\n\n    const startupPhase = Effect.gen(function* () {\n      const nonHostHandles = yield* startGroup(nonHostPackages);\n\n      yield* Effect.forEach(\n        nonHostHandles.map((handle, index) => ({\n          handle,\n          pkg: nonHostPackages[index] ?? handle.name,\n        })),\n        ({ handle, pkg }) => awaitReady(pkg, handle),\n        { concurrency: \"unbounded\" },\n      );\n\n      const hostHandles = yield* startGroup(hostPackages);\n\n      yield* Effect.forEach(\n        hostHandles.map((handle, index) => ({\n          handle,\n          pkg: hostPackages[index] ?? handle.name,\n        })),\n        ({ handle, pkg }) => awaitReady(pkg, handle),\n        { concurrency: \"unbounded\" },\n      );\n\n      return { nonHostHandles, hostHandles };\n    });\n\n    const startup = yield* Effect.raceFirst(\n      startupPhase,\n      Deferred.await(shutdown).pipe(Effect.as(null)),\n    );\n\n    if (startup === null) return;\n\n    const allHandles = [...startup.nonHostHandles, ...startup.hostHandles];\n\n    const childPids = allHandles\n      .map((handle) => Number(handle.pid))\n      .filter((pid) => Number.isFinite(pid) && pid > 1 && pid !== process.pid);\n\n    if (!isWorkspaceChild && childPids.length > 0) {\n      yield* Effect.sync(() => {\n        try {\n          updateChildPids(process.pid, childPids);\n        } catch {\n          // best-effort; registry hygiene is non-critical for the running session\n        }\n      });\n    }\n\n    yield* Deferred.await(shutdown);\n  });\n\nconst runApp = (\n  configDir: string,\n  data: DevSessionData,\n  rendererLayer: Layer.Layer<DevRenderer>,\n) => {\n  let handle: DevSessionHandle | null = null;\n  const trigger = (mode: \"graceful\" | \"force\") => {\n    if (handle) {\n      handle.shutdown(mode);\n      return;\n    }\n    process.exit(0);\n  };\n\n  process.on(\"SIGINT\", () => trigger(\"graceful\"));\n  process.on(\"SIGTERM\", () => trigger(\"graceful\"));\n\n  const program = Effect.scoped(\n    runDevSession(configDir, data.orchestrator, (sessionHandle) => {\n      handle = sessionHandle;\n    }),\n  ).pipe(\n    Effect.provide(\n      Layer.mergeAll(\n        ServiceDescriptorMapLive(data.services),\n        DevRuntimeConfigLive(data.runtimeConfig),\n        DevGeneratedEnvLive(data.envGenerated),\n        ShellEnvLive(data.shellEnv),\n        rendererLayer,\n      ),\n    ),\n    Effect.catchDefect((defect) =>\n      Effect.logError(\"[Dev] Unhandled defect in orchestrator:\", defect).pipe(\n        Effect.andThen(Effect.die(defect)),\n      ),\n    ),\n  );\n\n  void Effect.runPromiseExit(program)\n    .then((exit) => {\n      process.exit(Exit.isSuccess(exit) ? 0 : 1);\n    })\n    .catch((error: unknown) => {\n      console.error(\"[Dev] Failed to observe application exit:\", error);\n      process.exit(1);\n    });\n};\n\nexport const devApp = runApp;\n\nexport interface DevSessionData {\n  orchestrator: AppOrchestrator;\n  services: Map<string, ServiceDescriptor>;\n  runtimeConfig: RuntimeConfig;\n  /** The generated infra env tier — required so a start session can never silently run with an empty tier. */\n  envGenerated: Record<string, string>;\n  shellEnv: Record<string, string>;\n}\n\nexport interface StartSummary {\n  configSource: string;\n  configSourceHttp?: string;\n  account: string;\n  domain?: string;\n  modules: { host?: string; ui?: string; api?: string; auth?: string };\n  warnings: string[];\n}\n"],"mappings":";;;;;;;;;;;;;AA0CA,MAAM,yBAAyB,cAA4B;CACzD,IAAI;EACF,MAAM,UAAUA,8BAAa,CAAC,CAAC,QAC5B,UAAU,MAAM,MAAM,KAAK,MAAM,cAAc,aAAa,CAACC,4BAAW,MAAM,GAAG,CACpF;EACA,IAAI,QAAQ,WAAW,GAAG;EAC1B,MAAM,SAAmB,CAAC;EAC1B,KAAK,MAAM,SAAS,SAClB,KAAK,MAAM,YAAY,MAAM,aAAa,CAAC,GAAG;GAC5C,IAAI,aAAa,QAAQ,KAAK;GAC9B,IAAIA,4BAAW,QAAQ,GAAG;IACxB,uBAAU,QAAQ;IAClB,OAAO,KAAK,QAAQ;GACtB;EACF;EAEF,IAAI,OAAO,SAAS,GAClB,QAAQ,MACN,gBAAgB,OAAO,OAAO,oDAAoD,OAAO,KAAK,IAAI,GACpG;EAEF,MAAM,WAAW,IAAI,IAAI,QAAQ,KAAK,UAAU,MAAM,GAAG,CAAC;EAC1D,+BAAcD,8BAAa,CAAC,CAAC,QAAQ,UAAU,CAAC,SAAS,IAAI,MAAM,GAAG,CAAC,CAAC;CAC1E,QAAQ,CAER;AACF;AAEA,MAAM,+BAAwC;CAC5C,OAAO,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,UAAU;AAClE;AAEA,MAAM,gBAAgB;CAAC;CAAM;CAAQ;CAAO;CAAU;CAAc;AAAM;AAE1E,MAAM,eAAe,aAAiC;CACpD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,GAAG,MAAM;EAClC,MAAM,OAAO,EAAE,WAAW,SAAS,IAC/B,cAAc,QAAQ,QAAQ,IAC9B,cAAc,QAAQ,CAAC;EAC3B,MAAM,OAAO,EAAE,WAAW,SAAS,IAC/B,cAAc,QAAQ,QAAQ,IAC9B,cAAc,QAAQ,CAAC;EAC3B,IAAI,SAAS,MAAM,SAAS,IAAI,OAAO;EACvC,IAAI,SAAS,IAAI,OAAO;EACxB,IAAI,SAAS,IAAI,OAAO;EACxB,OAAO,OAAO;CAChB,CAAC;AACH;AAaA,MAAa,iBACX,WACA,cACA,gBACA,OAAuB,CAAC,MAExBE,cAAO,IAAI,aAAa;CACtB,sBAAsB,SAAS;CAC/B,MAAM,WAAW,OAAOC;CACxB,MAAM,gBAAgB,OAAOC;CAC7B,MAAM,WAAW,OAAOC;CACxB,MAAM,kBAAkB,YAAY,aAAa,QAAQ;CACzD,MAAM,mBAAsCC,sCAC1C,iBACA,UACA,aAAa,IACf;CAEA,IAAIC,qBAAQC,kCAAc,OAAO,CAAC,GAAG;EACnC,OAAON,cAAO,SACZ,0CAA0C,aAAa,SAAS,KAAK,IAAI,GAC3E;EACA,OAAOA,cAAO,SAAS,oCAAoC,gBAAgB,KAAK,IAAI,GAAG;EACvF,OAAOA,cAAO,SAAS,kCAAkC,CAAC,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG;EAC1F,OAAOA,cAAO,SACZ,qCAAqC,iBAAiB,KAAK,MAAM,GAAG,EAAE,KAAK,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,IAAI,GACrG;CACF;CAEA,MAAM,SAAS,OAAOA,cAAO,cAC3BO,6BAAgB,WAAW,aAAa,WAAW,CACrD;CAEA,MAAM,OAAO,KAAK,UAAU,SAAiB,QAAQ,KAAK,IAAI;CAC9D,MAAM,OAAO,KAAK,QAAQC;CAC1B,MAAM,iBAAiB,KAAK,kBAAkB;CAC9C,MAAM,UAAU,KAAK,eAAe,QAAQ;CAE5C,MAAM,WAAW,OAAOC,gBAAS,KAAW;CAE5C,MAAM,gBAAgB,OAAOT,cAAO,QAAQ;CAE5C,MAAM,mBAAmBM,kCAAc,qBAAqB,MAAM;CAClE,IAAI,aAAuB,CAAC;CAC5B,IAAI,CAAC,kBAAkB;EACrB,MAAM,WAAmC,CAAC;EAC1C,MAAM,WAAW,KAAa,UAAqC;GACjE,IAAI,SAAS,MAAM,SAAS,OAAO;EACrC;EACA,QAAQ,QAAQ,cAAc,KAAK,IAAI;EACvC,QAAQ,OAAO,cAAc,IAAI,IAAI;EACrC,QAAQ,MAAM,cAAc,GAAG,IAAI;EACnC,QAAQ,QAAQ,cAAc,MAAM,IAAI;EACxC,IAAI,cAAc,SAChB,KAAK,MAAM,CAAC,IAAI,WAAW,OAAO,QAAQ,cAAc,OAAO,GAAG;GAChE,IAAI,CAACI,mDAAwB,cAAc,MAAM,IAAI,MAAM,GACzD,QAAQ,UAAU,MAAM,OAAO,IAAI;GAErC,QAAQ,aAAa,MAAM,OAAO,IAAI,IAAI;EAC5C;EAEF,oCAAmB;GACjB,KAAK,QAAQ;GACb;GACA,OAAO;GACP,WAAW,OAAOC,aAAM;GACxB,aAAa,aAAa;EAC5B,CAAC;EACD,aAAa,OAAO,OAAO,QAAQ;CACrC;CAEA,IAAI,OAAiC;CACrC,IAAI,mBAAmB;CAEvB,MAAM,WAAWC,6BAAgB;CACjC,MAAM,UAAsB,CAAC;CAC7B,MAAM,UAA2B,CAAC;CAClC,MAAM,WAAWC,+BAAkB;EACjC,OAAO;EACP,OAAO;GACL,UAAU,UAAU;IAClB,MAAM,OAAO,MAAM,QAAQ,MAAM,MAAM,MAAM,UAAU,OAAO;GAChE;GACA,OAAO,UAAU;IACf,IAAI,aAAa,QAAQ;IACzB,AAAK,OAAO,MAAM,KAAK;GACzB;GACA,SAAS,UAAU;IACjB,QAAQ,KAAK,KAAK;GACpB;EACF;CACF,CAAC;CAED,MAAM,iBAAiB,uBAAuB,KAAK,aAAa,gBAAgB;CAChF,MAAM,oBAAoB;EACxB,IAAI,gBAAgB,MAAM,QAAQ;CACpC;CACA,IAAI,YAAqC;CACzC,OAAO,SAAS,OACd,kBACA,aAAa,aACb,aAAa,WACP,WAAW,SAAS,UAAU,SAC9B;EACJ,mBAAmB;EACnB,WAAW,SAAS,UAAU;CAChC,GACA;EAAE,aAAa;EAAgB,mBAAmB,WAAW,SAAS,OAAO;CAAE,CACjF;CAEA,MAAM,cAAc;EAClB,2CAAsB;EACtB,IAAI;GACF,YAAY;EACd,QAAQ,CAAC;EACT,IAAI;GACF,SAAS,MAAM;EACjB,QAAQ,CAAC;EACT,QAAQ,IAAI,oBAAoB;EAChC,KAAK,MAAM,UAAU,SAAS;GAC5B,IAAI,OAAO,QAAQ,QAAW;GAC9B,IAAI;IACF,KAAK,OAAO,GAAG;GACjB,QAAQ,CAAC;EACX;EACA,IAAI,CAAC,kBACH,IAAI;GACF,+BAAc,QAAQ,GAAG;EAC3B,QAAQ,CAAC;EAEX,AAAKb,cAAO,eAAe,aAAa,CAAC,CAACS,gBAAS,QAAQ,UAAU,MAAS,CAAC;EAC/E,KAAK,CAAC;CACR;CAEA,IAAI,gBAAgB;CACpB,IAAI,aAAmD;CACvD,MAAM,iBAAiB;EACrB,IAAI,YAAY,aAAa,UAAU;EACvC,aAAa,WAAW,OAAO,cAAc;EAC7C,WAAW,QAAQ;CACrB;CACA,MAAM,oBAAoB;EACxB,IAAI,YAAY,aAAa,UAAU;EACvC,aAAa;CACf;CAEA,MAAM,gBAAkC,EACtC,WAAW,SAAS;EAClB,IAAI,SAAS,SAAS;GACpB,MAAM;GACN;EACF;EACA;EACA,IAAI,gBAAgB,GAAG;GACrB,MAAM;GACN;EACF;EACA,YAAY;EACZ,QAAQ,IAAI,0BAA0B;EACtC,SAAS;EACT,AAAKT,cAAO,eAAe,aAAa,CAAC,CAACS,gBAAS,QAAQ,UAAU,MAAS,CAAC;CACjF,EACF;CACA,YAAY;CAEZ,OAAOT,cAAO,mBAAmBA,cAAO,KAAK,WAAW,CAAC;CAEzD,OAAOA,cAAO,mBACZA,cAAO,IAAI,aAAa;EACtB,SAAS;EAET,OAAOA,cAAO,QAAQ,UAAU,MAAM,EAAE,KAAK,KAAKA,cAAO,MAAM,GAAG,EAChE,aAAa,YACf,CAAC;EAED,OAAOA,cAAO,MAAM,YAAY;EAEhC,KAAK,MAAM,QAAQ,YAEjB,IAAI,EAAC,OADmBc,gCAAkB,IAAI,IAC/B;GACb,MAAM,QAAQ,OAAOC,mCAAY,IAAI;GACrC,OAAOf,cAAO,SACZ,cAAc,KAAK,6BACjB,QACI,UAAU,MAAM,IAAI,IAAI,MAAM,QAAQ,KACtC,uCAER;EACF;EAGF,IAAI,CAAC,kBACH,OAAOA,cAAO,WAAW;GACvB,IAAI;IACF,+BAAc,QAAQ,GAAG;GAC3B,QAAQ,CAER;EACF,CAAC;EAGH,SAAS,MAAM;EAEf,MAAM,QAAQ;EAEd,IAAI,kBAAkB;GACpB,MAAM,MAAM,OAAOW,aAAM;GACzB,MAAM,YAAY,QAAQ,EAAE,EAAE,aAAa;GAC3C,OAAOX,cAAO,IAAI,EAAE;GACpB,OAAOA,cAAO,IAAI,IAAI,OAAO,EAAE,CAAC;GAChC,OAAOA,cAAO,IAAI,mBAAmB,aAAa,aAAa;GAC/D,OAAOA,cAAO,IAAI,cAAcgB,gBAAS,UAAUA,gBAAS,WAAW,SAAS,CAAC,GAAG;GACpF,OAAOhB,cAAO,IAAI,uBAAuB,QAAQ,OAAO,WAAW,SAAS,EAAE;GAC9E,OAAOA,cAAO,IAAI,IAAI,OAAO,EAAE,CAAC;GAChC,OAAOA,cAAO,IAAI,EAAE;GACpB,KAAK,MAAM,SAAS,SAClB,OAAOA,cAAO,IAAIiB,2BAAc,KAAK,CAAC;GAExC,OAAOjB,cAAO,IAAI,EAAE;GACpB,OAAOA,cAAO,IAAI,IAAI,OAAO,EAAE,CAAC;GAChC,OAAOA,cAAO,IAAI,yBAAyB,OAAO,SAAS;GAC3D,OAAOA,cAAO,IAAI,IAAI,OAAO,EAAE,CAAC;GAChC,OAAOA,cAAO,IAAI,EAAE;EACtB;CACF,CAAC,CACH;CAEA,MAAM,YAA8B;EAClC,WAAW,MAAM,QAAQ,YAAY;GAMnC,IAAI,WAAW,SAAS,SAAS,YAAY,IAAI;GACjD,MAAM,cAAc,MAAM,QAAQ,OAAO;EAC3C;EACA,QAAQ,MAAM,MAAM,YAAY;GAC9B,SAAS,OAAO;IAAE,QAAQ;IAAM;IAAM;GAAQ,CAAC;EACjD;CACF;CAEA,OAAOA,cAAO,WACZA,cAAO,IAAI,aAAa;EACtB,MAAM,cAAc,QAAQ;EAC5B,OAAO,MAAM;GACX,OAAOA,cAAO,MAAM,YAAY;GAChC,IAAI,QAAQ,MAAM,aAAa;GAC/B,QAAQ,MAAM,qEAAqE;GACnF,MAAM;EACR;CACF,CAAC,CACH;CAEA,iBAAiB,aAAa;CAE9B,MAAM,gBAAgB,QAAgB;EACpC,MAAM,eAAe,QAAQ,SAAS,aAAa,OAAO;EAC1D,OAAOkB,oCAAe,KAAK,WAAW,YAAY,CAAC,CAAC,KAClDlB,cAAO,KAAK,WAAWA,cAAO,WAAW,QAAQ,KAAK,MAAM,CAAC,CAAC,GAC9DA,cAAO,SAAS,WACdA,cAAO,eAAeA,cAAO,QAAQ,MAAM,SAAS,OAAO,KAAK,KAAKA,cAAO,MAAM,CAAC,CACrF,GACAA,cAAO,UAAU,QACfA,cAAO,WAAW;GAChB,UAAU,MAAM,KAAK,oBAAoB,OAAO,GAAG,KAAK,IAAI;GAC5D,UAAU,SAAS,KAAK,OAAO;EACjC,CAAC,CACH,GACAA,cAAO,qBAEF;GACC,MAAM;GACN,KAAK;GACL,MAAMA,cAAO;GACb,cAAcA,cAAO;GACrB,aAAaA,cAAO;EACtB,EACJ,CACF;CACF;CAEA,MAAM,cAAc,aAClBA,cAAO,QAAQ,UAAU,cAAc,EAAE,aAAa,YAAY,CAAC;CAErE,MAAM,cAAc,KAAa,WAC/B,OAAO,aAAa,KAClBA,cAAO,QAAQ,aAAa,GAC5BA,cAAO,OAAO,QACZA,cAAO,WAAW;EAChB,UAAU,MACR,KACA,wBAAwB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,KACvE,IACF;CACF,CAAC,CACH,CACF;CAEF,MAAM,kBAAkB,gBAAgB,QAAQ,QAAQ,QAAQ,MAAM;CACtE,MAAM,eAAe,gBAAgB,QAAQ,QAAQ,QAAQ,MAAM;CAEnE,MAAM,eAAeA,cAAO,IAAI,aAAa;EAC3C,MAAM,iBAAiB,OAAO,WAAW,eAAe;EAExD,OAAOA,cAAO,QACZ,eAAe,KAAK,QAAQ,WAAW;GACrC;GACA,KAAK,gBAAgB,UAAU,OAAO;EACxC,EAAE,IACD,EAAE,QAAQ,UAAU,WAAW,KAAK,MAAM,GAC3C,EAAE,aAAa,YAAY,CAC7B;EAEA,MAAM,cAAc,OAAO,WAAW,YAAY;EAElD,OAAOA,cAAO,QACZ,YAAY,KAAK,QAAQ,WAAW;GAClC;GACA,KAAK,aAAa,UAAU,OAAO;EACrC,EAAE,IACD,EAAE,QAAQ,UAAU,WAAW,KAAK,MAAM,GAC3C,EAAE,aAAa,YAAY,CAC7B;EAEA,OAAO;GAAE;GAAgB;EAAY;CACvC,CAAC;CAED,MAAM,UAAU,OAAOA,cAAO,UAC5B,cACAS,gBAAS,MAAM,QAAQ,CAAC,CAAC,KAAKT,cAAO,GAAG,IAAI,CAAC,CAC/C;CAEA,IAAI,YAAY,MAAM;CAItB,MAAM,YAAY,CAFE,GAAG,QAAQ,gBAAgB,GAAG,QAAQ,WAE/B,CAAC,CACzB,KAAK,WAAW,OAAO,OAAO,GAAG,CAAC,CAAC,CACnC,QAAQ,QAAQ,OAAO,SAAS,GAAG,KAAK,MAAM,KAAK,QAAQ,QAAQ,GAAG;CAEzE,IAAI,CAAC,oBAAoB,UAAU,SAAS,GAC1C,OAAOA,cAAO,WAAW;EACvB,IAAI;GACF,iCAAgB,QAAQ,KAAK,SAAS;EACxC,QAAQ,CAER;CACF,CAAC;CAGH,OAAOS,gBAAS,MAAM,QAAQ;AAChC,CAAC;AAEH,MAAM,UACJ,WACA,MACA,kBACG;CACH,IAAI,SAAkC;CACtC,MAAM,WAAW,SAA+B;EAC9C,IAAI,QAAQ;GACV,OAAO,SAAS,IAAI;GACpB;EACF;EACA,QAAQ,KAAK,CAAC;CAChB;CAEA,QAAQ,GAAG,gBAAgB,QAAQ,UAAU,CAAC;CAC9C,QAAQ,GAAG,iBAAiB,QAAQ,UAAU,CAAC;CAE/C,MAAM,UAAUT,cAAO,OACrB,cAAc,WAAW,KAAK,eAAe,kBAAkB;EAC7D,SAAS;CACX,CAAC,CACH,CAAC,CAAC,KACAA,cAAO,QACLmB,aAAM,SACJC,oDAAyB,KAAK,QAAQ,GACtCC,gDAAqB,KAAK,aAAa,GACvCC,+CAAoB,KAAK,YAAY,GACrCC,iCAAa,KAAK,QAAQ,GAC1B,aACF,CACF,GACAvB,cAAO,aAAa,WAClBA,cAAO,SAAS,2CAA2C,MAAM,CAAC,CAAC,KACjEA,cAAO,QAAQA,cAAO,IAAI,MAAM,CAAC,CACnC,CACF,CACF;CAEA,AAAKA,cAAO,eAAe,OAAO,CAAC,CAChC,MAAM,SAAS;EACd,QAAQ,KAAKwB,YAAK,UAAU,IAAI,IAAI,IAAI,CAAC;CAC3C,CAAC,CAAC,CACD,OAAO,UAAmB;EACzB,QAAQ,MAAM,6CAA6C,KAAK;EAChE,QAAQ,KAAK,CAAC;CAChB,CAAC;AACL;AAEA,MAAa,SAAS"}