{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/vite/index.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, relative, resolve } from \"node:path\";\nimport type { Plugin, Connect, ViteDevServer } from \"vite\";\nimport { scanRoutes } from \"../router/route-scanner.js\";\nimport { scanActions, actionNames, type ActionRegistry } from \"../action/scan.js\";\nimport { handleActionRequest, type ActionSecurityOptions } from \"../action/server.js\";\nimport { scanIslands } from \"../island/scan.js\";\nimport { buildEntrySource } from \"../island/generate-entry.js\";\nimport { matchApiRoute, matchRoute } from \"../ssr/match.js\";\nimport { renderPage, renderErrorPage } from \"../ssr/render.js\";\nimport { setContentRoot, clearContentCache } from \"../content/collections.js\";\nimport { loadMiddleware, matchesMiddleware, runMiddleware, type LoadedMiddleware } from \"../middleware/index.js\";\nimport { nixJsInterpolationPlugin, shouldUseLegacyInterpolation, type InterpolationMode } from \"./interpolation-plugin.js\";\nimport { incomingMessageToRequest } from \"../runtime/node-http.js\";\n\nexport interface NixJsKitViteOptions {\n  /** App directory relative to Vite root (default: src/app). */\n  appDir?: string;\n  /** Islands directory relative to Vite root (default: src/islands). */\n  islandsDir?: string;\n  /** Content directory relative to Vite root (default: src/content). */\n  contentDir?: string;\n  /** Where to write the generated client entry (default: .nix-js/entry-client.ts). */\n  generatedEntry?: string;\n  /** Public path for the client entry module (default: /_nix-js/entry-client.js). */\n  clientEntry?: string;\n  /** HTML lang attribute (default: es). */\n  lang?: string;\n  /** Import specifier for hydrateIslands in the generated entry. */\n  hydrateImport?: string;\n  /** Import specifier for startClientRouter in the generated entry. */\n  routerImport?: string;\n  /** CSRF / origin policy applied to the server actions endpoint in dev. */\n  actionSecurity?: ActionSecurityOptions;\n  /**\n   * How the legacy interpolation transform is handled (default: \"auto\").\n   * With a Nix.js core that supports partial attribute interpolation natively\n   * the transform is not applied; use \"legacy\" for migrations against older\n   * cores and \"off\" to never transform.\n   */\n  interpolation?: InterpolationMode;\n}\n\n/**\n * Official Vite plugin for nix-js-kit.\n *\n * In dev mode it generates the islands entry and renders every page via SSR.\n * In production builds it can be combined with `nix-js-kit build` to generate\n * static HTML files.\n */\nexport function nixJsKit(options: NixJsKitViteOptions = {}): Plugin[] {\n  const appDir = options.appDir ?? \"src/app\";\n  const islandsDir = options.islandsDir ?? \"src/islands\";\n  const contentDir = options.contentDir ?? \"src/content\";\n  const generatedEntry = options.generatedEntry ?? \".nix-js/entry-client.ts\";\n  const clientEntry = options.clientEntry ?? \"/_nix-js/entry-client.js\";\n  const lang = options.lang ?? \"es\";\n  const hydrateImport = options.hydrateImport ?? \"@deijose/nix-js-kit/island\";\n  const routerImport = options.routerImport ?? \"@deijose/nix-js-kit/router\";\n\n  let routes: Awaited<ReturnType<typeof scanRoutes>> | null = null;\n  let actions: ActionRegistry = {};\n  let root: string = \".\";\n  let middleware: LoadedMiddleware | null = null;\n\n  const mainPlugin: Plugin = {\n    name: \"nix-js-kit\",\n    enforce: \"pre\",\n\n    async configResolved(config) {\n      root = config.root;\n      const entryPath = resolve(root, generatedEntry);\n      const islands = await scanIslands(resolve(root, islandsDir));\n      const source = buildEntrySource(islands, entryPath, hydrateImport, routerImport);\n      await mkdir(dirname(entryPath), { recursive: true });\n      await writeFile(entryPath, source, \"utf8\");\n\n      const appDirPath = resolve(root, appDir);\n      routes = await scanRoutes(appDirPath);\n      actions = await scanActions(appDirPath);\n\n      // Wire up the content layer root so getCollection/getEntry resolve\n      // from the user's src/content directory.\n      setContentRoot(resolve(root, contentDir));\n\n      // Load user middleware (src/middleware.ts) if it exists.\n      middleware = await loadMiddleware(root);\n    },\n\n    configureServer(server) {\n      const ssrLoad = createSsrLoader(server, root);\n      const resolveAction = createActionResolver(() => actions, () => routes, ssrLoad);\n\n      const appDirPath = resolve(root, appDir);\n      const islandsDirPath = resolve(root, islandsDir);\n      const contentDirPath = resolve(root, contentDir);\n      setupHmr(server, appDirPath, islandsDirPath, contentDirPath, root, generatedEntry, hydrateImport, routerImport, () => {\n        routes = null;\n        actions = {};\n        clearContentCache();\n      });\n\n      server.middlewares.use(async (req, res, next) => {\n        const requestUrl = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n        const urlPath = requestUrl.pathname;\n\n        // Server actions endpoint.\n        if (urlPath === \"/__nix-js/actions\" && req.method === \"POST\") {\n          try {\n            const body = await readRequestBody(req);\n            const request = incomingMessageToRequest(req, body);\n            const response = await handleActionRequest(request, resolveAction, options.actionSecurity);\n            res.writeHead(response.status, Object.fromEntries(response.headers.entries()));\n            res.end(await response.text());\n          } catch (err) {\n            console.error(\"[nix-js-kit] action error:\", err);\n            res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n            res.end(String(err));\n          }\n          return;\n        }\n\n        if (urlPath.startsWith(\"/_nix-js/entry-client.js\")) {\n          const transformed = await server.transformRequest(\n            \"/.nix-js/entry-client.ts\",\n          );\n          if (transformed) {\n            res.writeHead(200, {\n              \"Content-Type\": \"application/javascript; charset=utf-8\",\n              \"Cache-Control\": \"no-store, must-revalidate\",\n            });\n            res.end(transformed.code);\n            return;\n          }\n        }\n\n        const currentRoutes = routes ?? (routes = await scanRoutes(appDirPath));\n        const currentActions = Object.keys(actions).length ? actions : (actions = await scanActions(appDirPath));\n\n        // Render endpoint used by the SPA router and streaming boundaries.\n        if (urlPath === \"/__nix-js/render\") {\n          const { renderPageBody, RouteNotFoundError } = await import(\"../ssr/stream.js\");\n          try {\n            const page = requestUrl.searchParams.get(\"page\") ?? \"/\";\n            const search = requestUrl.searchParams.get(\"search\") ?? \"\";\n            const wantsJson = (req.headers[\"accept\"] ?? \"\").includes(\"application/json\");\n            const request = incomingMessageToRequest(req);\n            const { body, title, head, clearActionErrorCookie } = await renderPageBody({\n              routes: currentRoutes,\n              pathname: page,\n              searchParams: new URLSearchParams(search),\n              config: { lang, clientEntry },\n              actions: actionNames(currentActions),\n              importer: ssrLoad,\n              request,\n            });\n            if (wantsJson) {\n              const headers: Record<string, string> = { \"Content-Type\": \"application/json; charset=utf-8\" };\n              if (clearActionErrorCookie) headers[\"X-Nix-Action-Clear-Cookie\"] = clearActionErrorCookie;\n              res.writeHead(200, headers);\n              res.end(JSON.stringify({ title, body, head, clearActionErrorCookie }));\n            } else {\n              const headers: Record<string, string> = { \"Content-Type\": \"text/html; charset=utf-8\" };\n              if (clearActionErrorCookie) headers[\"Set-Cookie\"] = clearActionErrorCookie;\n              res.writeHead(200, headers);\n              res.end(body);\n            }\n            return;\n          } catch (err) {\n            if (err instanceof RouteNotFoundError) {\n              res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n              res.end(\"Not Found\");\n              return;\n            }\n            console.error(\"[nix-js-kit] render endpoint error:\", err);\n            res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n            res.end(String(err));\n            return;\n          }\n        }\n\n        if (!urlPath.startsWith(\"/@\") && !urlPath.startsWith(\"/node_modules/\") && !urlPath.includes(\".\")) {\n          const apiMatch = matchApiRoute(urlPath, currentRoutes.api);\n          if (apiMatch) {\n            try {\n              const mod = (await ssrLoad(apiMatch.route.routePath)) as Record<\n                string,\n                (request: Request, context?: { params: Record<string, string | string[]> }) => unknown\n              >;\n              const handler = mod[req.method ?? \"GET\"];\n              if (typeof handler !== \"function\") {\n                res.writeHead(405, { \"Content-Type\": \"text/plain\" });\n                res.end(`Method not allowed: ${req.method}`);\n                return;\n              }\n              const body = req.method && req.method !== \"GET\" && req.method !== \"HEAD\" ? await readRequestBody(req) : undefined;\n              const request = incomingMessageToRequest(req, body);\n              const response = (await handler(request, { params: apiMatch.params })) as Response;\n              res.writeHead(response.status, Object.fromEntries(response.headers.entries()));\n              res.end(Buffer.from(await response.arrayBuffer()));\n            } catch (err) {\n              console.error(\"[nix-js-kit] API route error:\", err);\n              res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n              res.end(String(err));\n            }\n            return;\n          }\n        }\n\n        // Run middleware before SSR rendering.\n        let middlewareHeaders: Record<string, string> | undefined;\n        if (middleware && matchesMiddleware(urlPath, middleware.config)) {\n          const mwResult = await runMiddleware(middleware, incomingMessageToRequest(req));\n          if (mwResult.kind === \"response\") {\n            res.writeHead(mwResult.response.status, Object.fromEntries(mwResult.response.headers.entries()));\n            res.end(Buffer.from(await mwResult.response.arrayBuffer()));\n            return;\n          }\n          middlewareHeaders = mwResult.headers;\n        }\n\n        const handled = await handleSsrRequest(req, res, next, {\n          routes: currentRoutes,\n          actions: currentActions,\n          clientEntry,\n          lang,\n          ssrLoad,\n          middlewareHeaders,\n        });\n        if (!handled) next();\n      });\n    },\n  };\n\n  return shouldUseLegacyInterpolation(options.interpolation ?? \"auto\")\n    ? [mainPlugin, nixJsInterpolationPlugin({ appDir, islandsDir })]\n    : [mainPlugin];\n}\n\nexport { nixJsInterpolationPlugin, type InterpolationPluginOptions } from \"./interpolation-plugin.js\";\nexport type { InterpolationMode } from \"./interpolation-plugin.js\";\nexport { coreSupportsPartialInterpolation, shouldUseLegacyInterpolation } from \"./interpolation-plugin.js\";\n\nfunction setupHmr(\n  server: ViteDevServer,\n  appDirPath: string,\n  islandsDirPath: string,\n  contentDirPath: string,\n  root: string,\n  generatedEntry: string,\n  hydrateImport: string,\n  routerImport: string,\n  invalidate: () => void,\n) {\n  const isRelevant = (path: string) =>\n    path.startsWith(appDirPath) || path.startsWith(islandsDirPath) || path.startsWith(contentDirPath);\n\n  async function regenerateIslandEntry() {\n    const islands = await scanIslands(islandsDirPath);\n    const entryPath = resolve(root, generatedEntry);\n    const source = buildEntrySource(islands, entryPath, hydrateImport, routerImport);\n    await mkdir(dirname(entryPath), { recursive: true });\n    await writeFile(entryPath, source, \"utf8\");\n    const entryMod = server.moduleGraph.getModuleById(entryPath);\n    if (entryMod) server.moduleGraph.invalidateModule(entryMod);\n  }\n\n  server.watcher.on(\"change\", async (path) => {\n    if (!isRelevant(path)) return;\n    invalidate();\n    const mod = server.moduleGraph.getModuleById(path);\n    if (mod) server.moduleGraph.invalidateModule(mod);\n    if (path.startsWith(islandsDirPath)) {\n      await regenerateIslandEntry();\n      console.log(\"[nix-js-kit] HMR reload islands after change:\", path);\n    } else if (path.startsWith(contentDirPath) && path.endsWith(\".md\")) {\n      console.log(\"[nix-js-kit] HMR content changed:\", path);\n    } else if (path.includes(\".action.ts\") || path.includes(\".data.ts\") || path.includes(\"page.ts\") || path.includes(\"layout.ts\")) {\n      console.log(\"[nix-js-kit] HMR reload routes/actions after change:\", path);\n    }\n  });\n\n  server.watcher.on(\"add\", async (path) => {\n    if (!isRelevant(path)) return;\n    invalidate();\n    if (path.startsWith(islandsDirPath)) {\n      await regenerateIslandEntry();\n    }\n    console.log(\"[nix-js-kit] HMR new file detected:\", path);\n  });\n\n  server.watcher.on(\"unlink\", async (path) => {\n    if (!isRelevant(path)) return;\n    invalidate();\n    const mod = server.moduleGraph.getModuleById(path);\n    if (mod) server.moduleGraph.invalidateModule(mod);\n    if (path.startsWith(islandsDirPath)) {\n      await regenerateIslandEntry();\n    }\n    console.log(\"[nix-js-kit] HMR file removed:\", path);\n  });\n}\n\nfunction createSsrLoader(server: ViteDevServer, root: string) {\n  return (filePath: string) => {\n    const rel = relative(root, filePath);\n    const url = \"/\" + rel.split(\"\\\\\").join(\"/\");\n    return server.ssrLoadModule(url);\n  };\n}\n\nfunction createActionResolver(\n  getActions: () => import(\"../action/scan.js\").ActionRegistry,\n  getRoutes: () => Awaited<ReturnType<typeof scanRoutes>> | null,\n  ssrLoad: (path: string) => Promise<unknown>,\n) {\n  return async (name: string, page?: string) => {\n    const actions = getActions();\n    const routes = getRoutes();\n    let pageKey: string | undefined;\n    if (page && routes) {\n      pageKey = routes.pages.some((route) => route.path === page)\n        ? page\n        : (matchRoute(page, routes.pages)?.route.path ?? page);\n    }\n    const pageActions = pageKey ? actions[pageKey] : Object.values(actions).find((p) => p[name]) ?? undefined;\n    const actionPath = pageActions ? pageActions[name] : undefined;\n    if (!actionPath) return undefined;\n    const mod = (await ssrLoad(actionPath)) as Record<string, unknown>;\n    const action = mod[name];\n    if (typeof action === \"function\") {\n      return action as (...args: unknown[]) => unknown;\n    }\n    return undefined;\n  };\n}\n\nfunction readRequestBody(req: Connect.IncomingMessage): Promise<string> {\n  return new Promise((resolve, reject) => {\n    let body = \"\";\n    req.setEncoding(\"utf8\");\n    req.on(\"data\", (chunk) => {\n      body += chunk;\n    });\n    req.on(\"end\", () => resolve(body));\n    req.on(\"error\", reject);\n  });\n}\n\ninterface SsrHandlerOptions {\n  routes: Awaited<ReturnType<typeof scanRoutes>> | null;\n  actions: ActionRegistry;\n  clientEntry: string;\n  lang: string;\n  ssrLoad: (path: string) => Promise<unknown>;\n  middlewareHeaders?: Record<string, string>;\n}\n\nasync function handleSsrRequest(\n  req: Connect.IncomingMessage,\n  res: import(\"node:http\").ServerResponse,\n  _next: Connect.NextFunction,\n  options: SsrHandlerOptions,\n): Promise<boolean> {\n  if (!options.routes) return false;\n  const publicActions = actionNames(options.actions);\n\n  let urlPath = req.url ?? \"/\";\n  if (urlPath.includes(\"?\")) urlPath = urlPath.split(\"?\")[0];\n\n  // Let Vite handle its own internals and assets.\n  if (urlPath.startsWith(\"/@\") || urlPath.startsWith(\"/node_modules/\")) {\n    return false;\n  }\n\n  // Skip explicit file requests.\n  if (urlPath.includes(\".\")) return false;\n\n  const config = { lang: options.lang, clientEntry: options.clientEntry };\n  const match = matchRoute(urlPath, options.routes.pages);\n  if (match) {\n    try {\n      const request = incomingMessageToRequest(req);\n      if (options.middlewareHeaders) {\n        for (const [name, value] of Object.entries(options.middlewareHeaders)) request.headers.set(name, value);\n      }\n      const { html, clearActionErrorCookie } = await renderPage({\n        route: match.route,\n        params: match.params,\n        searchParams: new URLSearchParams(req.url?.split(\"?\")[1] ?? \"\"),\n        config,\n        importer: options.ssrLoad,\n        actions: publicActions,\n        request,\n      });\n      const responseHeaders: Record<string, string> = {\n        \"Content-Type\": \"text/html; charset=utf-8\",\n        \"Cache-Control\": \"no-store, must-revalidate\",\n      };\n      if (clearActionErrorCookie) responseHeaders[\"Set-Cookie\"] = clearActionErrorCookie;\n      res.writeHead(200, responseHeaders);\n      res.end(html);\n      return true;\n    } catch (err) {\n      console.error(\"[nix-js-kit] SSR render error:\", err);\n      const errorResult = await renderErrorPage({\n        routes: options.routes,\n        status: 500,\n        error: err,\n        config,\n        actions: publicActions,\n        importer: options.ssrLoad,\n      });\n      if (errorResult) {\n        res.writeHead(errorResult.status, {\n          \"Content-Type\": \"text/html; charset=utf-8\",\n          \"Cache-Control\": \"no-store, must-revalidate\",\n        });\n        res.end(errorResult.html);\n      } else {\n        res.writeHead(500, {\n          \"Content-Type\": \"text/plain; charset=utf-8\",\n          \"Cache-Control\": \"no-store, must-revalidate\",\n        });\n        res.end(String(err));\n      }\n      return true;\n    }\n  }\n\n  const errorResult = await renderErrorPage({\n    routes: options.routes,\n    status: 404,\n    config,\n    actions: publicActions,\n    importer: options.ssrLoad,\n  });\n  if (errorResult) {\n    res.writeHead(errorResult.status, {\n      \"Content-Type\": \"text/html; charset=utf-8\",\n      \"Cache-Control\": \"no-store, must-revalidate\",\n    });\n    res.end(errorResult.html);\n    return true;\n  }\n\n  return false;\n}\n"],"mappings":"mXAkDA,SAAgB,EAAS,EAA+B,CAAC,EAAa,CACpE,IAAM,EAAS,EAAQ,QAAU,UAC3B,EAAa,EAAQ,YAAc,cACnC,EAAa,EAAQ,YAAc,cACnC,EAAiB,EAAQ,gBAAkB,0BAC3C,EAAc,EAAQ,aAAe,2BACrC,EAAO,EAAQ,MAAQ,KACvB,EAAgB,EAAQ,eAAiB,6BACzC,EAAe,EAAQ,cAAgB,6BAEzC,EAAwD,KACxD,EAA0B,CAAC,EAC3B,EAAe,IACf,EAAsC,KAEpC,EAAqB,CACzB,KAAM,aACN,QAAS,MAET,MAAM,eAAe,EAAQ,CAC3B,EAAO,EAAO,KACd,IAAM,GAAA,EAAY,EAAA,QAAA,CAAQ,EAAM,CAAc,EACxC,EAAU,MAAM,EAAA,GAAA,EAAY,EAAA,QAAA,CAAQ,EAAM,CAAU,CAAC,EACrD,EAAS,EAAA,EAAiB,EAAS,EAAW,EAAe,CAAY,EAC/E,MAAA,EAAM,EAAA,MAAA,EAAA,EAAM,EAAA,QAAA,CAAQ,CAAS,EAAG,CAAE,UAAW,EAAK,CAAC,EACnD,MAAA,EAAM,EAAA,UAAA,CAAU,EAAW,EAAQ,MAAM,EAEzC,IAAM,GAAA,EAAa,EAAA,QAAA,CAAQ,EAAM,CAAM,EACvC,EAAS,MAAM,EAAA,EAAW,CAAU,EACpC,EAAU,MAAM,EAAA,EAAY,CAAU,EAItC,EAAA,GAAA,EAAe,EAAA,QAAA,CAAQ,EAAM,CAAU,CAAC,EAGxC,EAAa,MAAM,EAAA,EAAe,CAAI,CACxC,EAEA,gBAAgB,EAAQ,CACtB,IAAM,EAAU,EAAgB,EAAQ,CAAI,EACtC,EAAgB,MAA2B,MAAe,EAAQ,CAAO,EAEzE,GAAA,EAAa,EAAA,QAAA,CAAQ,EAAM,CAAM,EAGvC,EAAS,EAAQ,GAAA,EAFM,EAAA,QAAA,CAAQ,EAAM,CAER,GAAA,EADN,EAAA,QAAA,CAAQ,EAAM,CACQ,EAAgB,EAAM,EAAgB,EAAe,MAAoB,CACpH,EAAS,KACT,EAAU,CAAC,EACX,EAAA,EAAkB,CACpB,CAAC,EAED,EAAO,YAAY,IAAI,MAAO,EAAK,EAAK,IAAS,CAC/C,IAAM,EAAa,IAAI,IAAI,EAAI,KAAO,IAAK,UAAU,EAAI,QAAQ,MAAQ,aAAa,EAChF,EAAU,EAAW,SAG3B,GAAI,IAAY,qBAAuB,EAAI,SAAW,OAAQ,CAC5D,GAAI,CACF,IAAM,EAAO,MAAM,EAAgB,CAAG,EAChC,EAAU,EAAA,EAAyB,EAAK,CAAI,EAC5C,EAAW,MAAM,EAAA,EAAoB,EAAS,EAAe,EAAQ,cAAc,EACzF,EAAI,UAAU,EAAS,OAAQ,OAAO,YAAY,EAAS,QAAQ,QAAQ,CAAC,CAAC,EAC7E,EAAI,IAAI,MAAM,EAAS,KAAK,CAAC,CAC/B,OAAS,EAAK,CACZ,QAAQ,MAAM,6BAA8B,CAAG,EAC/C,EAAI,UAAU,IAAK,CAAE,eAAgB,2BAA4B,CAAC,EAClE,EAAI,IAAI,OAAO,CAAG,CAAC,CACrB,CACA,MACF,CAEA,GAAI,EAAQ,WAAW,0BAA0B,EAAG,CAClD,IAAM,EAAc,MAAM,EAAO,iBAC/B,0BACF,EACA,GAAI,EAAa,CACf,EAAI,UAAU,IAAK,CACjB,eAAgB,wCAChB,gBAAiB,2BACnB,CAAC,EACD,EAAI,IAAI,EAAY,IAAI,EACxB,MACF,CACF,CAEA,IAAM,EAAgB,AAAW,IAAS,MAAM,EAAA,EAAW,CAAU,EAC/D,EAAiB,OAAO,KAAK,CAAO,CAAC,CAAC,OAAS,EAAW,EAAU,MAAM,EAAA,EAAY,CAAU,EAGtG,GAAI,IAAY,mBAAoB,CAClC,GAAM,CAAE,iBAAgB,sBAAuB,MAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAM,wBAAA,CAAA,CAAA,CAAA,KAAA,GAAA,EAAA,CAAA,EACrD,GAAI,CACF,IAAM,EAAO,EAAW,aAAa,IAAI,MAAM,GAAK,IAC9C,EAAS,EAAW,aAAa,IAAI,QAAQ,GAAK,GAClD,GAAa,EAAI,QAAQ,QAAa,GAAA,CAAI,SAAS,kBAAkB,EACrE,EAAU,EAAA,EAAyB,CAAG,EACtC,CAAE,OAAM,QAAO,OAAM,0BAA2B,MAAM,EAAe,CACzE,OAAQ,EACR,SAAU,EACV,aAAc,IAAI,gBAAgB,CAAM,EACxC,OAAQ,CAAE,OAAM,aAAY,EAC5B,QAAS,EAAA,EAAY,CAAc,EACnC,SAAU,EACV,SACF,CAAC,EACD,GAAI,EAAW,CACb,IAAM,EAAkC,CAAE,eAAgB,iCAAkC,EACxF,IAAwB,EAAQ,6BAA+B,GACnE,EAAI,UAAU,IAAK,CAAO,EAC1B,EAAI,IAAI,KAAK,UAAU,CAAE,QAAO,OAAM,OAAM,wBAAuB,CAAC,CAAC,CACvE,KAAO,CACL,IAAM,EAAkC,CAAE,eAAgB,0BAA2B,EACjF,IAAwB,EAAQ,cAAgB,GACpD,EAAI,UAAU,IAAK,CAAO,EAC1B,EAAI,IAAI,CAAI,CACd,CACA,MACF,OAAS,EAAK,CACZ,GAAI,aAAe,EAAoB,CACrC,EAAI,UAAU,IAAK,CAAE,eAAgB,2BAA4B,CAAC,EAClE,EAAI,IAAI,WAAW,EACnB,MACF,CACA,QAAQ,MAAM,sCAAuC,CAAG,EACxD,EAAI,UAAU,IAAK,CAAE,eAAgB,2BAA4B,CAAC,EAClE,EAAI,IAAI,OAAO,CAAG,CAAC,EACnB,MACF,CACF,CAEA,GAAI,CAAC,EAAQ,WAAW,IAAI,GAAK,CAAC,EAAQ,WAAW,gBAAgB,GAAK,CAAC,EAAQ,SAAS,GAAG,EAAG,CAChG,IAAM,EAAW,EAAA,EAAc,EAAS,EAAc,GAAG,EACzD,GAAI,EAAU,CACZ,GAAI,CAKF,IAAM,GAAU,MAJG,EAAQ,EAAS,MAAM,SAAS,EAAA,CAI/B,EAAI,QAAU,OAClC,GAAI,OAAO,GAAY,WAAY,CACjC,EAAI,UAAU,IAAK,CAAE,eAAgB,YAAa,CAAC,EACnD,EAAI,IAAI,uBAAuB,EAAI,QAAQ,EAC3C,MACF,CACA,IAAM,EAAO,EAAI,QAAU,EAAI,SAAW,OAAS,EAAI,SAAW,OAAS,MAAM,EAAgB,CAAG,EAAI,IAAA,GAElG,EAAY,MAAM,EADR,EAAA,EAAyB,EAAK,CACd,EAAS,CAAE,OAAQ,EAAS,MAAO,CAAC,EACpE,EAAI,UAAU,EAAS,OAAQ,OAAO,YAAY,EAAS,QAAQ,QAAQ,CAAC,CAAC,EAC7E,EAAI,IAAI,OAAO,KAAK,MAAM,EAAS,YAAY,CAAC,CAAC,CACnD,OAAS,EAAK,CACZ,QAAQ,MAAM,gCAAiC,CAAG,EAClD,EAAI,UAAU,IAAK,CAAE,eAAgB,2BAA4B,CAAC,EAClE,EAAI,IAAI,OAAO,CAAG,CAAC,CACrB,CACA,MACF,CACF,CAGA,IAAI,EACJ,GAAI,GAAc,EAAA,EAAkB,EAAS,EAAW,MAAM,EAAG,CAC/D,IAAM,EAAW,MAAM,EAAA,EAAc,EAAY,EAAA,EAAyB,CAAG,CAAC,EAC9E,GAAI,EAAS,OAAS,WAAY,CAChC,EAAI,UAAU,EAAS,SAAS,OAAQ,OAAO,YAAY,EAAS,SAAS,QAAQ,QAAQ,CAAC,CAAC,EAC/F,EAAI,IAAI,OAAO,KAAK,MAAM,EAAS,SAAS,YAAY,CAAC,CAAC,EAC1D,MACF,CACA,EAAoB,EAAS,OAC/B,CAUK,MARiB,EAAiB,EAAK,EAAK,EAAM,CACrD,OAAQ,EACR,QAAS,EACT,cACA,OACA,UACA,mBACF,CAAC,GACa,EAAK,CACrB,CAAC,CACH,CACF,EAEA,OAAO,EAAA,EAA6B,EAAQ,eAAiB,MAAM,EAC/D,CAAC,EAAY,EAAA,EAAyB,CAAE,SAAQ,YAAW,CAAC,CAAC,EAC7D,CAAC,CAAU,CACjB,CAMA,SAAS,EACP,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACA,IAAM,EAAc,GAClB,EAAK,WAAW,CAAU,GAAK,EAAK,WAAW,CAAc,GAAK,EAAK,WAAW,CAAc,EAElG,eAAe,GAAwB,CACrC,IAAM,EAAU,MAAM,EAAA,EAAY,CAAc,EAC1C,GAAA,EAAY,EAAA,QAAA,CAAQ,EAAM,CAAc,EACxC,EAAS,EAAA,EAAiB,EAAS,EAAW,EAAe,CAAY,EAC/E,MAAA,EAAM,EAAA,MAAA,EAAA,EAAM,EAAA,QAAA,CAAQ,CAAS,EAAG,CAAE,UAAW,EAAK,CAAC,EACnD,MAAA,EAAM,EAAA,UAAA,CAAU,EAAW,EAAQ,MAAM,EACzC,IAAM,EAAW,EAAO,YAAY,cAAc,CAAS,EACvD,GAAU,EAAO,YAAY,iBAAiB,CAAQ,CAC5D,CAEA,EAAO,QAAQ,GAAG,SAAU,KAAO,IAAS,CAC1C,GAAI,CAAC,EAAW,CAAI,EAAG,OACvB,EAAW,EACX,IAAM,EAAM,EAAO,YAAY,cAAc,CAAI,EAC7C,GAAK,EAAO,YAAY,iBAAiB,CAAG,EAC5C,EAAK,WAAW,CAAc,GAChC,MAAM,EAAsB,EAC5B,QAAQ,IAAI,gDAAiD,CAAI,GACxD,EAAK,WAAW,CAAc,GAAK,EAAK,SAAS,KAAK,EAC/D,QAAQ,IAAI,oCAAqC,CAAI,GAC5C,EAAK,SAAS,YAAY,GAAK,EAAK,SAAS,UAAU,GAAK,EAAK,SAAS,SAAS,GAAK,EAAK,SAAS,WAAW,IAC1H,QAAQ,IAAI,uDAAwD,CAAI,CAE5E,CAAC,EAED,EAAO,QAAQ,GAAG,MAAO,KAAO,IAAS,CAClC,EAAW,CAAI,IACpB,EAAW,EACP,EAAK,WAAW,CAAc,GAChC,MAAM,EAAsB,EAE9B,QAAQ,IAAI,sCAAuC,CAAI,EACzD,CAAC,EAED,EAAO,QAAQ,GAAG,SAAU,KAAO,IAAS,CAC1C,GAAI,CAAC,EAAW,CAAI,EAAG,OACvB,EAAW,EACX,IAAM,EAAM,EAAO,YAAY,cAAc,CAAI,EAC7C,GAAK,EAAO,YAAY,iBAAiB,CAAG,EAC5C,EAAK,WAAW,CAAc,GAChC,MAAM,EAAsB,EAE9B,QAAQ,IAAI,iCAAkC,CAAI,CACpD,CAAC,CACH,CAEA,SAAS,EAAgB,EAAuB,EAAc,CAC5D,MAAQ,IAAqB,CAE3B,IAAM,EAAM,KAAA,EADA,EAAA,SAAA,CAAS,EAAM,CACT,CAAA,CAAI,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG,EAC1C,OAAO,EAAO,cAAc,CAAG,CACjC,CACF,CAEA,SAAS,EACP,EACA,EACA,EACA,CACA,OAAO,MAAO,EAAc,IAAkB,CAC5C,IAAM,EAAU,EAAW,EACrB,EAAS,EAAU,EACrB,EACA,GAAQ,IACV,EAAU,EAAO,MAAM,KAAM,GAAU,EAAM,OAAS,CAAI,EACtD,EACC,EAAA,EAAW,EAAM,EAAO,KAAK,CAAC,EAAE,MAAM,MAAQ,GAErD,IAAM,EAAc,EAAU,EAAQ,GAAW,OAAO,OAAO,CAAO,CAAC,CAAC,KAAM,GAAM,EAAE,EAAK,GAAK,IAAA,GAC1F,EAAa,EAAc,EAAY,GAAQ,IAAA,GACrD,GAAI,CAAC,EAAY,OAEjB,IAAM,GAAS,MADI,EAAQ,CAAU,EAAA,CAClB,GACnB,GAAI,OAAO,GAAW,WACpB,OAAO,CAGX,CACF,CAEA,SAAS,EAAgB,EAA+C,CACtE,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,IAAI,EAAO,GACX,EAAI,YAAY,MAAM,EACtB,EAAI,GAAG,OAAS,GAAU,CACxB,GAAQ,CACV,CAAC,EACD,EAAI,GAAG,UAAa,EAAQ,CAAI,CAAC,EACjC,EAAI,GAAG,QAAS,CAAM,CACxB,CAAC,CACH,CAWA,eAAe,EACb,EACA,EACA,EACA,EACkB,CAClB,GAAI,CAAC,EAAQ,OAAQ,MAAO,GAC5B,IAAM,EAAgB,EAAA,EAAY,EAAQ,OAAO,EAE7C,EAAU,EAAI,KAAO,IASzB,GARI,EAAQ,SAAS,GAAG,IAAG,EAAU,EAAQ,MAAM,GAAG,CAAC,CAAC,IAGpD,EAAQ,WAAW,IAAI,GAAK,EAAQ,WAAW,gBAAgB,GAK/D,EAAQ,SAAS,GAAG,EAAG,MAAO,GAElC,IAAM,EAAS,CAAE,KAAM,EAAQ,KAAM,YAAa,EAAQ,WAAY,EAChE,EAAQ,EAAA,EAAW,EAAS,EAAQ,OAAO,KAAK,EACtD,GAAI,EACF,GAAI,CACF,IAAM,EAAU,EAAA,EAAyB,CAAG,EAC5C,GAAI,EAAQ,kBACV,IAAK,GAAM,CAAC,EAAM,KAAU,OAAO,QAAQ,EAAQ,iBAAiB,EAAG,EAAQ,QAAQ,IAAI,EAAM,CAAK,EAExG,GAAM,CAAE,OAAM,0BAA2B,MAAM,EAAA,EAAW,CACxD,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,aAAc,IAAI,gBAAgB,EAAI,KAAK,MAAM,GAAG,CAAC,CAAC,IAAM,EAAE,EAC9D,SACA,SAAU,EAAQ,QAClB,QAAS,EACT,SACF,CAAC,EACK,EAA0C,CAC9C,eAAgB,2BAChB,gBAAiB,2BACnB,EAIA,OAHI,IAAwB,EAAgB,cAAgB,GAC5D,EAAI,UAAU,IAAK,CAAe,EAClC,EAAI,IAAI,CAAI,EACL,EACT,OAAS,EAAK,CACZ,QAAQ,MAAM,iCAAkC,CAAG,EACnD,IAAM,EAAc,MAAM,EAAA,EAAgB,CACxC,OAAQ,EAAQ,OAChB,OAAQ,IACR,MAAO,EACP,SACA,QAAS,EACT,SAAU,EAAQ,OACpB,CAAC,EAcD,OAbI,GACF,EAAI,UAAU,EAAY,OAAQ,CAChC,eAAgB,2BAChB,gBAAiB,2BACnB,CAAC,EACD,EAAI,IAAI,EAAY,IAAI,IAExB,EAAI,UAAU,IAAK,CACjB,eAAgB,4BAChB,gBAAiB,2BACnB,CAAC,EACD,EAAI,IAAI,OAAO,CAAG,CAAC,GAEd,EACT,CAGF,IAAM,EAAc,MAAM,EAAA,EAAgB,CACxC,OAAQ,EAAQ,OAChB,OAAQ,IACR,SACA,QAAS,EACT,SAAU,EAAQ,OACpB,CAAC,EAUD,OATI,GACF,EAAI,UAAU,EAAY,OAAQ,CAChC,eAAgB,2BAChB,gBAAiB,2BACnB,CAAC,EACD,EAAI,IAAI,EAAY,IAAI,EACjB,IAGF,EACT"}