@koderlabs/tasks-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +179 -0
- package/README.md +9 -0
- package/dist/index.cjs +1045 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +10 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +1011 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/api.ts","../src/config.ts","../src/commands/upload-sourcemaps.ts","../src/commands/releases.ts","../src/commands/doctor.ts","../src/commands/sourcemap-upload.ts","../src/commands/symbols-upload.ts","../src/commands/init.ts","../src/commands/events-tail.ts"],"sourcesContent":["import { Command } from 'commander';\nimport pc from 'picocolors';\n\nimport { ApiClient, ApiError } from './api.js';\nimport { resolveConfig } from './config.js';\nimport { uploadSourcemaps } from './commands/upload-sourcemaps.js';\nimport { createRelease } from './commands/releases.js';\nimport { doctor } from './commands/doctor.js';\nimport { sourcemapUpload } from './commands/sourcemap-upload.js';\nimport { uploadIos, uploadAndroid } from './commands/symbols-upload.js';\nimport { initScaffold, SUPPORTED_PLATFORMS, type InitPlatform } from './commands/init.js';\nimport { eventsTail, parseSince } from './commands/events-tail.js';\n\nconst VERSION = '0.0.0';\n\n/**\n * Builds the commander program. Exported separately so tests can drive it\n * without spawning a child process.\n */\nexport function buildProgram(): Command {\n const program = new Command();\n program\n .name('tasks')\n .description('InstantTasks CLI — doctor, source maps, symbols, init, events tail')\n .version(VERSION);\n\n // ── doctor ──────────────────────────────────────────────────────────\n program\n .command('doctor')\n .description('Validate config + connectivity (CI-friendly; non-zero on failure)')\n .option('--api-url <url>', 'API base URL (defaults to env / .tasksrc.json)')\n .option('--key <key>', 'Ingest or management key')\n .option('--project <id>', 'Project ID')\n .action(async (opts: Record<string, string>) => {\n const result = await doctor({\n apiUrl: opts.apiUrl,\n key: opts.key,\n projectId: opts.project,\n });\n if (!result.ok) process.exit(1);\n });\n\n // ── sourcemap upload ────────────────────────────────────────────────\n const sourcemap = program.command('sourcemap').description('Source-map utilities');\n sourcemap\n .command('upload <dist>')\n .description('Recursively upload .map files from a dist directory')\n .option('--release <sha>', 'Release name / version (associates maps with a release)')\n .option('--environment <env>', 'Release environment', 'production')\n .option('--max-size <bytes>', 'Per-file size cap in bytes', String(50 * 1024 * 1024))\n .option('--no-strict', 'Do not exit non-zero on individual file failures')\n .option('--api-url <url>', 'API base URL')\n .option('--key <key>', 'Management key (sk_live_...)')\n .action(async (dist: string, opts: Record<string, string | boolean>) => {\n const cfg = resolveConfig({\n apiUrl: opts.apiUrl as string | undefined,\n key: opts.key as string | undefined,\n });\n await sourcemapUpload({\n dist,\n apiUrl: cfg.apiUrl,\n key: cfg.key,\n release: opts.release as string | undefined,\n environment: opts.environment as string,\n maxBytes: Number(opts.maxSize),\n strict: opts.strict !== false,\n });\n });\n\n // ── symbols upload-ios / upload-android ─────────────────────────────\n const symbols = program.command('symbols').description('Native symbol uploads (iOS dSYM, Android ProGuard)');\n symbols\n .command('upload-ios <dsym>')\n .description('Upload DWARF files from a .dSYM bundle')\n .option('--release <sha>', 'Release name / version')\n .option('--api-url <url>')\n .option('--key <key>')\n .action(async (dsym: string, opts: Record<string, string>) => {\n const cfg = resolveConfig({ apiUrl: opts.apiUrl, key: opts.key });\n await uploadIos(dsym, {\n apiUrl: cfg.apiUrl,\n key: cfg.key,\n release: opts.release,\n });\n });\n symbols\n .command('upload-android <mapping>')\n .description('Upload an Android ProGuard mapping.txt')\n .option('--release <sha>', 'Release name / version')\n .option('--api-url <url>')\n .option('--key <key>')\n .action(async (mapping: string, opts: Record<string, string>) => {\n const cfg = resolveConfig({ apiUrl: opts.apiUrl, key: opts.key });\n await uploadAndroid(mapping, {\n apiUrl: cfg.apiUrl,\n key: cfg.key,\n release: opts.release,\n });\n });\n\n // ── init <platform> ─────────────────────────────────────────────────\n program\n .command('init <platform>')\n .description(`Scaffold .tasksrc.json + init snippet (platforms: ${SUPPORTED_PLATFORMS.join(', ')})`)\n .option('--dry-run', 'Print files that would be written but do not write them')\n .option('--force', 'Overwrite existing files')\n .action(async (platform: string, opts: Record<string, boolean>) => {\n if (!SUPPORTED_PLATFORMS.includes(platform as InitPlatform)) {\n throw new Error(\n `Unsupported platform \"${platform}\". Pick one of: ${SUPPORTED_PLATFORMS.join(', ')}`,\n );\n }\n await initScaffold({\n platform: platform as InitPlatform,\n dryRun: opts.dryRun,\n force: opts.force,\n });\n });\n\n // ── events tail ─────────────────────────────────────────────────────\n const events = program.command('events').description('Event utilities');\n events\n .command('tail')\n .description('Stream recent SDK events (long-poll fallback until WebSocket lands)')\n .option('--filter <kv...>', 'Filter, e.g. project=<id>')\n .option('--since <duration>', 'Lookback window (e.g. 10m, 1h)')\n .option('--interval <ms>', 'Poll interval in ms', '5000')\n .option('--api-url <url>')\n .option('--key <key>')\n .option('--project <id>')\n .action(async (opts: Record<string, string | string[]>) => {\n const cfg = resolveConfig({\n apiUrl: opts.apiUrl as string | undefined,\n key: opts.key as string | undefined,\n projectId: opts.project as string | undefined,\n });\n const filter: Record<string, string> = {};\n const rawFilters = Array.isArray(opts.filter) ? opts.filter : opts.filter ? [opts.filter] : [];\n for (const kv of rawFilters) {\n const [k, v] = String(kv).split('=');\n if (k && v) filter[k] = v;\n }\n const controller = new AbortController();\n const onSig = () => {\n console.log(pc.dim('\\n (exiting)'));\n controller.abort();\n };\n process.once('SIGINT', onSig);\n process.once('SIGTERM', onSig);\n await eventsTail({\n apiUrl: cfg.apiUrl,\n key: cfg.key,\n projectId: cfg.projectId,\n since: parseSince(opts.since as string | undefined),\n intervalMs: Number(opts.interval) || 5000,\n filter,\n signal: controller.signal,\n });\n });\n\n // ── legacy commands (preserved for backwards compat) ────────────────\n program\n .command('upload-sourcemaps')\n .description('[legacy] Upload .js.map files in a directory to a release')\n .requiredOption('--release <name>', 'Release name / version')\n .requiredOption('--dir <path>', 'Directory to walk for *.js.map files')\n .option('--environment <env>', 'Release environment', 'production')\n .option('--url-prefix <prefix>', 'Public URL prefix for source files')\n .option('--project <projectId>')\n .option('--api-url <url>')\n .option('--key <key>')\n .action(async (opts: Record<string, string>) => {\n const cfg = resolveConfig({ apiUrl: opts.apiUrl, key: opts.key, projectId: opts.project });\n const client = new ApiClient({ apiUrl: cfg.apiUrl, key: cfg.key });\n await uploadSourcemaps({\n release: opts.release,\n dir: opts.dir,\n environment: opts.environment,\n urlPrefix: opts.urlPrefix,\n apiClient: client,\n });\n });\n\n program\n .command('create-release')\n .description('Create (or upsert) a release on the server')\n .requiredOption('--name <name>', 'Release name / version')\n .option('--environment <env>', 'Release environment', 'production')\n .option('--project <projectId>')\n .option('--api-url <url>')\n .option('--key <key>')\n .action(async (opts: Record<string, string>) => {\n const cfg = resolveConfig({ apiUrl: opts.apiUrl, key: opts.key, projectId: opts.project });\n const client = new ApiClient({ apiUrl: cfg.apiUrl, key: cfg.key });\n await createRelease({\n name: opts.name,\n environment: opts.environment,\n apiClient: client,\n });\n });\n\n return program;\n}\n\nexport async function main(argv: string[] = process.argv): Promise<number> {\n const program = buildProgram();\n program.exitOverride();\n try {\n await program.parseAsync(argv);\n return 0;\n } catch (err) {\n if (err instanceof ApiError) {\n console.error(pc.red(`API error (${err.status}): ${err.message}`));\n return 1;\n }\n const anyErr = err as { code?: string; exitCode?: number; message?: string };\n if (anyErr && typeof anyErr === 'object' && 'code' in anyErr) {\n if (anyErr.code === 'commander.helpDisplayed' || anyErr.code === 'commander.version') return 0;\n if (anyErr.code === 'commander.help') return 0;\n }\n console.error(pc.red((err as Error).message || String(err)));\n return 1;\n }\n}\n\n// Auto-run when this module is the process entry. The bin alias may be\n// `tasks` or `instanttasks-cli` — match both, plus dist file names.\nconst isEntry = (() => {\n try {\n const argv1 = process.argv[1] ?? '';\n return /(?:^|[\\\\/])(tasks|instanttasks-cli|index\\.[mc]?js)$/.test(argv1);\n } catch {\n return false;\n }\n})();\n\nif (isEntry) {\n main().then((code) => process.exit(code));\n}\n","/**\n * Thin HTTP client over the InstantTasks SDK ingest endpoints.\n *\n * Endpoint: POST {apiUrl}/sdk/source-maps?version=<v>&environment=<env>\n * Auth: Authorization: Bearer sk_live_...\n * Body: multipart/form-data, files[] field\n *\n * Releases are upserted server-side when source maps are uploaded — there is no\n * separate \"create release\" endpoint. `createRelease` therefore POSTs to the\n * same path with an empty files list, which the API handles cleanly.\n */\nexport interface ApiClientOptions {\n apiUrl: string;\n key: string;\n /** Override for tests. Defaults to global `fetch`. */\n fetchImpl?: typeof fetch;\n /** Max retries for transient failures (429, 5xx). Default 3. */\n maxRetries?: number;\n /** Initial backoff in ms; doubles each retry. Default 500. */\n retryBaseMs?: number;\n}\n\nexport interface UploadFile {\n filename: string;\n /** Source URL the .js this map corresponds to is served from (informational; future server use). */\n url?: string;\n content: Buffer | Uint8Array;\n}\n\nexport interface UploadResult {\n release: { id: string; version: string; environment: string };\n uploaded: Array<{ filename: string; sha256: string; sizeBytes: number }>;\n}\n\nexport class ApiError extends Error {\n constructor(public status: number, message: string, public body?: unknown) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nexport class ApiClient {\n private readonly apiUrl: string;\n private readonly key: string;\n private readonly fetchImpl: typeof fetch;\n private readonly maxRetries: number;\n private readonly retryBaseMs: number;\n\n constructor(opts: ApiClientOptions) {\n this.apiUrl = opts.apiUrl.replace(/\\/+$/, '');\n this.key = opts.key;\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n this.maxRetries = opts.maxRetries ?? 3;\n this.retryBaseMs = opts.retryBaseMs ?? 500;\n if (!this.fetchImpl) {\n throw new Error('No fetch implementation available. Use Node >= 18.');\n }\n }\n\n /** Upload one or more source-map artifacts to a release. */\n async uploadSourceMaps(\n version: string,\n environment: string,\n files: UploadFile[],\n ): Promise<UploadResult> {\n const url = `${this.apiUrl}/sdk/source-maps?version=${encodeURIComponent(version)}&environment=${encodeURIComponent(environment)}`;\n const form = new FormData();\n for (const f of files) {\n // Force a binary mime type; the server reads `.endsWith('.map')` for kind.\n const bytes = toUint8(f.content);\n // Cast to BlobPart — TS lib for Node mixes ArrayBuffer/SharedArrayBuffer\n // unions awkwardly; this is safe at runtime under Node 18+.\n const blob = new Blob([bytes as unknown as ArrayBuffer], { type: 'application/json' });\n form.append('files', blob, f.filename);\n }\n return this.request<UploadResult>('POST', url, form);\n }\n\n /** Create (or upsert) a release without uploading any artifacts. */\n async createRelease(version: string, environment: string): Promise<UploadResult> {\n return this.uploadSourceMaps(version, environment, []);\n }\n\n private async request<T>(method: string, url: string, body: FormData): Promise<T> {\n let attempt = 0;\n let lastErr: unknown;\n while (attempt <= this.maxRetries) {\n try {\n const res = await this.fetchImpl(url, {\n method,\n headers: { authorization: `Bearer ${this.key}` },\n body,\n });\n if (res.status === 401 || res.status === 403) {\n const txt = await safeText(res);\n throw new ApiError(\n res.status,\n `Authentication failed (HTTP ${res.status}). Check your management key. ${txt}`.trim(),\n txt,\n );\n }\n if (res.status === 429 || res.status >= 500) {\n // Retryable\n const retryAfter = parseRetryAfter(res.headers.get('retry-after'));\n if (attempt < this.maxRetries) {\n const wait = retryAfter ?? this.retryBaseMs * Math.pow(2, attempt);\n await sleep(wait);\n attempt++;\n continue;\n }\n const txt = await safeText(res);\n throw new ApiError(res.status, `HTTP ${res.status} after ${attempt + 1} attempts. ${txt}`.trim(), txt);\n }\n if (!res.ok) {\n const txt = await safeText(res);\n throw new ApiError(res.status, `HTTP ${res.status}: ${txt}`.trim(), txt);\n }\n const json = (await res.json()) as { data?: T } & T;\n // Server wraps in { data: ... } via success() helper; unwrap if present.\n return (json && typeof json === 'object' && 'data' in json ? (json.data as T) : (json as T));\n } catch (err) {\n if (err instanceof ApiError && err.status !== 429 && err.status < 500) throw err;\n lastErr = err;\n if (attempt >= this.maxRetries) throw err;\n await sleep(this.retryBaseMs * Math.pow(2, attempt));\n attempt++;\n }\n }\n throw lastErr ?? new Error('Unreachable');\n }\n}\n\nfunction toUint8(content: Buffer | Uint8Array): Uint8Array {\n if (content instanceof Uint8Array) return content;\n return new Uint8Array(content);\n}\n\nasync function safeText(res: Response): Promise<string> {\n try {\n return await res.text();\n } catch {\n return '';\n }\n}\n\nfunction parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const n = Number(header);\n if (Number.isFinite(n) && n >= 0) return n * 1000;\n const date = Date.parse(header);\n if (Number.isFinite(date)) return Math.max(0, date - Date.now());\n return null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","/**\n * Resolves runtime configuration from a combination of CLI flags, environment\n * variables, and an optional `.tasksrc.json` file in the current working\n * directory (or any ancestor up to filesystem root). Precedence:\n *\n * CLI flag > env var > .tasksrc.json > built-in default\n *\n * Recognized env vars (with legacy aliases kept for backwards compatibility):\n * INSTANTTASKS_ENDPOINT (preferred) — base URL incl. /api/v1\n * INSTANTTASKS_API_URL (legacy alias)\n * INSTANTTASKS_INGEST_KEY (preferred) — pk_ or sk_ key\n * INSTANTTASKS_MANAGEMENT_KEY (legacy alias) — sk_ key for management ops\n * INSTANTTASKS_PROJECT_ID\n */\nimport { existsSync, readFileSync } from 'node:fs';\nimport * as path from 'node:path';\n\nexport interface CliConfigInput {\n apiUrl?: string;\n key?: string;\n projectId?: string;\n /** When true, do not throw if key is missing — return empty string. */\n optionalKey?: boolean;\n /** Override starting directory for .tasksrc.json lookup (tests). */\n cwd?: string;\n}\n\nexport interface ResolvedCliConfig {\n apiUrl: string;\n key: string;\n projectId: string | undefined;\n /** Path of the rc file that contributed values, if any. */\n rcFile?: string;\n}\n\nconst DEFAULT_API_URL = 'http://localhost:11002/api/v1';\nconst RC_FILENAME = '.tasksrc.json';\n\ninterface RcFile {\n endpoint?: string;\n apiUrl?: string;\n ingestKey?: string;\n key?: string;\n projectId?: string;\n}\n\n/** Walk up from `start` looking for `.tasksrc.json`. */\nexport function findRcFile(start: string): string | undefined {\n let dir = path.resolve(start);\n while (true) {\n const candidate = path.join(dir, RC_FILENAME);\n if (existsSync(candidate)) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\nfunction loadRc(start: string): { file?: string; data: RcFile } {\n const file = findRcFile(start);\n if (!file) return { data: {} };\n try {\n const data = JSON.parse(readFileSync(file, 'utf-8')) as RcFile;\n return { file, data };\n } catch {\n return { file, data: {} };\n }\n}\n\nexport function resolveConfig(\n input: CliConfigInput = {},\n env: NodeJS.ProcessEnv = process.env,\n): ResolvedCliConfig {\n const { file: rcFile, data: rc } = loadRc(input.cwd ?? process.cwd());\n\n const apiUrl = (\n input.apiUrl ??\n env.INSTANTTASKS_ENDPOINT ??\n env.INSTANTTASKS_API_URL ??\n rc.endpoint ??\n rc.apiUrl ??\n DEFAULT_API_URL\n ).replace(/\\/+$/, '');\n\n const key =\n input.key ??\n env.INSTANTTASKS_INGEST_KEY ??\n env.INSTANTTASKS_MANAGEMENT_KEY ??\n rc.ingestKey ??\n rc.key ??\n '';\n\n const projectId = input.projectId ?? env.INSTANTTASKS_PROJECT_ID ?? rc.projectId;\n\n if (!key && !input.optionalKey) {\n throw new Error(\n 'Missing key. Pass --key sk_live_... / pk_live_..., set INSTANTTASKS_INGEST_KEY, or add it to .tasksrc.json.',\n );\n }\n if (key && !/^(sk|pk)_/.test(key)) {\n throw new Error(\n `Invalid key format: expected sk_live_... / pk_live_..., got \"${key.slice(0, 6)}…\".`,\n );\n }\n\n return { apiUrl, key, projectId, rcFile };\n}\n","import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport pc from 'picocolors';\n\nimport { ApiClient, type UploadFile } from '../api.js';\n\nexport interface UploadSourcemapsOptions {\n release: string;\n dir: string;\n environment?: string;\n urlPrefix?: string;\n apiClient: ApiClient;\n /** Optional logger; defaults to console. */\n log?: (line: string) => void;\n}\n\n/**\n * Recursively walks `dir` looking for `*.js.map` files, then uploads each one\n * to the API as part of `release`. Returns the number of files uploaded.\n */\nexport async function uploadSourcemaps(opts: UploadSourcemapsOptions): Promise<number> {\n const log = opts.log ?? ((s: string) => console.log(s));\n const env = opts.environment ?? 'production';\n const root = path.resolve(opts.dir);\n\n const maps = await walkForMaps(root);\n if (maps.length === 0) {\n log(pc.yellow(`No .js.map files found under ${root}`));\n return 0;\n }\n\n log(pc.cyan(`Uploading ${maps.length} source map(s) to release ${opts.release} (${env})…`));\n\n const files: UploadFile[] = [];\n for (const absPath of maps) {\n const rel = path.relative(root, absPath).split(path.sep).join('/');\n const url = opts.urlPrefix ? joinUrl(opts.urlPrefix, rel.replace(/\\.map$/, '')) : undefined;\n const content = await fs.readFile(absPath);\n files.push({ filename: path.basename(absPath), url, content });\n log(` ${pc.dim('→')} ${rel}${url ? pc.dim(` (${url})`) : ''}`);\n }\n\n const result = await opts.apiClient.uploadSourceMaps(opts.release, env, files);\n log(pc.green(`Done. Release ${result.release.version} now has ${result.uploaded.length} artifact(s).`));\n return result.uploaded.length;\n}\n\nasync function walkForMaps(dir: string): Promise<string[]> {\n const out: string[] = [];\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch (err) {\n throw new Error(`Cannot read directory ${dir}: ${(err as Error).message}`);\n }\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n const nested = await walkForMaps(full);\n out.push(...nested);\n } else if (entry.isFile() && entry.name.endsWith('.js.map')) {\n out.push(full);\n }\n }\n return out.sort();\n}\n\nfunction joinUrl(prefix: string, rel: string): string {\n const left = prefix.replace(/\\/+$/, '');\n const right = rel.replace(/^\\/+/, '');\n return `${left}/${right}`;\n}\n","import pc from 'picocolors';\nimport { ApiClient } from '../api.js';\n\nexport interface CreateReleaseOptions {\n name: string;\n environment?: string;\n apiClient: ApiClient;\n log?: (line: string) => void;\n}\n\n/**\n * Creates (upserts) a release on the server. The server has no dedicated\n * release-create endpoint, so this routes through the source-map upload\n * endpoint with zero files, which upserts the release row.\n */\nexport async function createRelease(opts: CreateReleaseOptions): Promise<string> {\n const log = opts.log ?? ((s: string) => console.log(s));\n const env = opts.environment ?? 'production';\n log(pc.cyan(`Creating release ${opts.name} (${env})…`));\n const result = await opts.apiClient.createRelease(opts.name, env);\n log(pc.green(`Release ${result.release.version} ready (id=${result.release.id}).`));\n return result.release.id;\n}\n","import pc from 'picocolors';\nimport { resolveConfig } from '../config.js';\n\nexport interface DoctorOptions {\n apiUrl?: string;\n key?: string;\n projectId?: string;\n fetchImpl?: typeof fetch;\n log?: (line: string) => void;\n}\n\nexport interface DoctorResult {\n ok: boolean;\n checks: Array<{ name: string; ok: boolean; detail: string }>;\n}\n\n/**\n * Validates config + connectivity. CI-friendly: returns a result that the\n * caller maps to a process exit code (0 if all green, 1 if any failure).\n */\nexport async function doctor(opts: DoctorOptions = {}): Promise<DoctorResult> {\n const log = opts.log ?? ((s: string) => console.log(s));\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const checks: DoctorResult['checks'] = [];\n\n // 1. Config resolution\n let cfg: ReturnType<typeof resolveConfig>;\n try {\n cfg = resolveConfig({ apiUrl: opts.apiUrl, key: opts.key, projectId: opts.projectId });\n checks.push({\n name: 'config',\n ok: true,\n detail: `endpoint=${cfg.apiUrl}${cfg.rcFile ? ` (rc=${cfg.rcFile})` : ''}`,\n });\n } catch (err) {\n checks.push({ name: 'config', ok: false, detail: (err as Error).message });\n return finish(checks, log);\n }\n\n if (!cfg.projectId) {\n checks.push({\n name: 'projectId',\n ok: false,\n detail: 'INSTANTTASKS_PROJECT_ID not set (some commands require it).',\n });\n } else {\n checks.push({ name: 'projectId', ok: true, detail: cfg.projectId });\n }\n\n // 2. Endpoint reachable — GET /sdk/v1/config with Bearer\n const configUrl = `${cfg.apiUrl}/sdk/v1/config`;\n try {\n const res = await fetchImpl(configUrl, {\n method: 'GET',\n headers: { authorization: `Bearer ${cfg.key}` },\n });\n if (res.ok) {\n checks.push({ name: 'endpoint', ok: true, detail: `${configUrl} → ${res.status}` });\n checks.push({ name: 'ingestKey', ok: true, detail: 'authenticated' });\n } else if (res.status === 401 || res.status === 403) {\n checks.push({ name: 'endpoint', ok: true, detail: `${configUrl} reachable (${res.status})` });\n checks.push({\n name: 'ingestKey',\n ok: false,\n detail: `key rejected (HTTP ${res.status}) — check INSTANTTASKS_INGEST_KEY`,\n });\n } else {\n checks.push({\n name: 'endpoint',\n ok: false,\n detail: `${configUrl} → HTTP ${res.status}`,\n });\n }\n } catch (err) {\n checks.push({\n name: 'endpoint',\n ok: false,\n detail: `cannot reach ${configUrl}: ${(err as Error).message}`,\n });\n }\n\n // 3. Sourcemap upload permission — best-effort OPTIONS / empty POST\n // The server upserts releases on POST with no files, so we only check the\n // key shape — sk_ keys can upload, pk_ keys cannot.\n if (cfg.key.startsWith('pk_')) {\n checks.push({\n name: 'sourcemapPermission',\n ok: false,\n detail: 'pk_ keys cannot upload source maps — use sk_live_... for CI uploads',\n });\n } else if (cfg.key.startsWith('sk_')) {\n checks.push({\n name: 'sourcemapPermission',\n ok: true,\n detail: 'sk_ key has upload role',\n });\n }\n\n return finish(checks, log);\n}\n\nfunction finish(\n checks: DoctorResult['checks'],\n log: (s: string) => void,\n): DoctorResult {\n for (const c of checks) {\n const mark = c.ok ? pc.green('✓') : pc.red('✗');\n log(` ${mark} ${pc.bold(c.name.padEnd(20))} ${c.ok ? pc.dim(c.detail) : pc.yellow(c.detail)}`);\n }\n const ok = checks.every((c) => c.ok);\n log('');\n log(ok ? pc.green('All checks passed.') : pc.red('One or more checks failed.'));\n return { ok, checks };\n}\n","import { promises as fs, type Dirent } from 'node:fs';\nimport * as path from 'node:path';\nimport pc from 'picocolors';\n\nexport interface SourcemapUploadOptions {\n dist: string;\n apiUrl: string;\n key: string;\n release?: string;\n environment?: string;\n /** Per-file byte cap. Default 50MB. */\n maxBytes?: number;\n /** When false, do not fail the process on individual file errors. Default true. */\n strict?: boolean;\n fetchImpl?: typeof fetch;\n log?: (line: string) => void;\n}\n\nexport interface SourcemapUploadResult {\n uploaded: number;\n failed: number;\n skipped: number;\n}\n\nconst DEFAULT_MAX_BYTES = 50 * 1024 * 1024;\nconst MAX_RETRIES = 3;\nconst RETRY_BASE_MS = 500;\n\n/**\n * Generic source-map uploader. Walks `<dist>` recursively for *.map files,\n * defends against path-traversal/symlinks (mirrors sdk-nextjs plugin), then\n * POSTs each to `/sdk/source-maps` with exponential backoff on 5xx.\n *\n * Returns counts; caller decides exit code based on `strict`.\n */\nexport async function sourcemapUpload(\n opts: SourcemapUploadOptions,\n): Promise<SourcemapUploadResult> {\n const log = opts.log ?? ((s: string) => console.log(s));\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const maxBytes = opts.maxBytes ?? DEFAULT_MAX_BYTES;\n const strict = opts.strict !== false;\n const root = path.resolve(opts.dist);\n\n const maps = await walk(root);\n if (maps.length === 0) {\n log(pc.yellow(`No .map files found under ${root}`));\n return { uploaded: 0, failed: 0, skipped: 0 };\n }\n\n log(\n pc.cyan(\n `Uploading ${maps.length} source map(s)${opts.release ? ` for release ${opts.release}` : ''}…`,\n ),\n );\n\n let uploaded = 0;\n let failed = 0;\n let skipped = 0;\n\n for (const absPath of maps) {\n const safe = safeRelative(root, absPath);\n if (!safe) {\n log(pc.red(` ✗ ${absPath} — path escapes dist root`));\n failed++;\n continue;\n }\n\n const stat = await fs.stat(absPath);\n if (stat.size > maxBytes) {\n log(pc.yellow(` ⚠ ${safe} — ${stat.size} bytes exceeds cap ${maxBytes}, skipping`));\n skipped++;\n continue;\n }\n\n const content = await fs.readFile(absPath, 'utf-8');\n const ok = await postWithRetry(fetchImpl, opts.apiUrl, opts.key, {\n path: safe,\n content,\n release: opts.release,\n environment: opts.environment,\n });\n if (ok.ok) {\n log(` ${pc.green('✓')} ${safe}`);\n uploaded++;\n } else {\n log(pc.red(` ✗ ${safe} — ${ok.detail}`));\n failed++;\n }\n }\n\n log('');\n log(\n `${pc.bold('Summary:')} ${pc.green(`${uploaded} uploaded`)}, ${\n failed ? pc.red(`${failed} failed`) : `${failed} failed`\n }, ${skipped} skipped.`,\n );\n\n if (failed > 0 && strict) {\n throw new Error(`${failed} source-map upload(s) failed (use --no-strict to ignore).`);\n }\n return { uploaded, failed, skipped };\n}\n\n/**\n * Returns the path relative to `root` only when it is genuinely contained\n * inside `root`. Refuses absolute paths, \"../\" climbs, and symlinks must be\n * filtered upstream (see walk()).\n */\nexport function safeRelative(root: string, abs: string): string | null {\n const resolvedRoot = path.resolve(root);\n const resolved = path.resolve(abs);\n if (!resolved.startsWith(resolvedRoot + path.sep) && resolved !== resolvedRoot) return null;\n const rel = path.relative(resolvedRoot, resolved);\n if (!rel || rel.startsWith('..') || path.isAbsolute(rel)) return null;\n return rel.split(path.sep).join('/');\n}\n\nasync function walk(dir: string): Promise<string[]> {\n const out: string[] = [];\n let entries: Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return out;\n }\n for (const entry of entries) {\n // Refuse to follow symlinks — they could point outside dist root.\n if (entry.isSymbolicLink()) continue;\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n out.push(...(await walk(full)));\n } else if (entry.isFile() && entry.name.endsWith('.map')) {\n out.push(full);\n }\n }\n return out.sort();\n}\n\ninterface UploadBody {\n path: string;\n content: string;\n release?: string;\n environment?: string;\n}\n\nasync function postWithRetry(\n fetchImpl: typeof fetch,\n apiUrl: string,\n key: string,\n body: UploadBody,\n): Promise<{ ok: boolean; detail: string }> {\n const url = `${apiUrl.replace(/\\/+$/, '')}/sdk/source-maps`;\n let lastDetail = 'unknown';\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${key}` },\n body: JSON.stringify(body),\n });\n if (res.ok) return { ok: true, detail: `HTTP ${res.status}` };\n lastDetail = `HTTP ${res.status}`;\n // Only retry transient 5xx (and 429 just in case).\n if (res.status !== 429 && (res.status < 500 || res.status >= 600)) {\n return { ok: false, detail: lastDetail };\n }\n } catch (err) {\n lastDetail = (err as Error).message;\n }\n if (attempt < MAX_RETRIES) {\n await new Promise((r) => setTimeout(r, RETRY_BASE_MS * Math.pow(2, attempt)));\n }\n }\n return { ok: false, detail: lastDetail };\n}\n","import { promises as fs, type Dirent } from 'node:fs';\nimport * as path from 'node:path';\nimport pc from 'picocolors';\n\nexport interface SymbolsUploadOptions {\n apiUrl: string;\n key: string;\n release?: string;\n fetchImpl?: typeof fetch;\n log?: (line: string) => void;\n}\n\nexport interface SymbolsUploadResult {\n uploaded: number;\n failed: number;\n endpointMissing: boolean;\n}\n\nconst NATIVE_SYMBOLS_PATH = '/sdk/native-symbols';\n\n/**\n * Walks a .dSYM bundle for DWARF files and posts each to the native-symbols\n * endpoint. The backend resolver may not yet exist — when the endpoint\n * returns 404 we surface a clear \"backend pending\" warning instead of\n * failing the build, and the caller can act accordingly.\n */\nexport async function uploadIos(\n dsymPath: string,\n opts: SymbolsUploadOptions,\n): Promise<SymbolsUploadResult> {\n const log = opts.log ?? ((s: string) => console.log(s));\n const root = path.resolve(dsymPath);\n if (!root.endsWith('.dSYM')) {\n log(pc.yellow(`Warning: ${root} does not end in .dSYM — proceeding anyway.`));\n }\n const dwarfRoot = path.join(root, 'Contents', 'Resources', 'DWARF');\n const files = await listFiles(dwarfRoot);\n if (files.length === 0) {\n log(pc.yellow(`No DWARF files found under ${dwarfRoot}`));\n return { uploaded: 0, failed: 0, endpointMissing: false };\n }\n log(pc.cyan(`Uploading ${files.length} iOS symbol file(s)…`));\n return uploadAll(files, 'ios', opts, log);\n}\n\n/**\n * Reads ProGuard mapping.txt and posts to the native-symbols endpoint.\n */\nexport async function uploadAndroid(\n mappingPath: string,\n opts: SymbolsUploadOptions,\n): Promise<SymbolsUploadResult> {\n const log = opts.log ?? ((s: string) => console.log(s));\n const resolved = path.resolve(mappingPath);\n const stat = await fs.stat(resolved).catch(() => null);\n if (!stat?.isFile()) {\n throw new Error(`mapping.txt not found at ${resolved}`);\n }\n log(pc.cyan(`Uploading Android mapping ${resolved}…`));\n return uploadAll([resolved], 'android', opts, log);\n}\n\nasync function uploadAll(\n files: string[],\n platform: 'ios' | 'android',\n opts: SymbolsUploadOptions,\n log: (s: string) => void,\n): Promise<SymbolsUploadResult> {\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const url = `${opts.apiUrl.replace(/\\/+$/, '')}${NATIVE_SYMBOLS_PATH}`;\n let uploaded = 0;\n let failed = 0;\n let endpointMissing = false;\n\n for (const file of files) {\n const content = await fs.readFile(file);\n const body = {\n platform,\n filename: path.basename(file),\n release: opts.release,\n // Base64-encoded so binary DWARFs survive JSON transport.\n contentBase64: content.toString('base64'),\n };\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${opts.key}` },\n body: JSON.stringify(body),\n });\n if (res.status === 404) {\n endpointMissing = true;\n log(pc.yellow(` ⚠ ${path.basename(file)} — endpoint pending (${NATIVE_SYMBOLS_PATH} returned 404)`));\n } else if (res.ok) {\n log(` ${pc.green('✓')} ${path.basename(file)}`);\n uploaded++;\n } else {\n log(pc.red(` ✗ ${path.basename(file)} — HTTP ${res.status}`));\n failed++;\n }\n } catch (err) {\n log(pc.red(` ✗ ${path.basename(file)} — ${(err as Error).message}`));\n failed++;\n }\n }\n\n if (endpointMissing) {\n log('');\n log(\n pc.yellow(\n `Backend resolver pending: ${NATIVE_SYMBOLS_PATH} is not yet implemented. ` +\n `Symbol files were prepared but not stored server-side.`,\n ),\n );\n }\n return { uploaded, failed, endpointMissing };\n}\n\nasync function listFiles(dir: string): Promise<string[]> {\n const out: string[] = [];\n let entries: Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return out;\n }\n for (const entry of entries) {\n if (entry.isSymbolicLink()) continue;\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n out.push(...(await listFiles(full)));\n } else if (entry.isFile()) {\n out.push(full);\n }\n }\n return out;\n}\n","import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport pc from 'picocolors';\n\nexport type InitPlatform = 'web' | 'react' | 'nextjs' | 'vue' | 'rn' | 'nestjs';\n\nexport const SUPPORTED_PLATFORMS: InitPlatform[] = [\n 'web',\n 'react',\n 'nextjs',\n 'vue',\n 'rn',\n 'nestjs',\n];\n\nexport interface InitOptions {\n platform: InitPlatform;\n cwd?: string;\n dryRun?: boolean;\n force?: boolean;\n log?: (line: string) => void;\n}\n\nexport interface InitFile {\n filepath: string;\n contents: string;\n}\n\nexport interface InitResult {\n files: InitFile[];\n written: string[];\n skipped: string[];\n}\n\nconst RC_TEMPLATE = `{\n \"endpoint\": \"https://tasks.koderlabs.net/api/v1\",\n \"ingestKey\": \"pk_live_REPLACE_ME\",\n \"projectId\": \"REPLACE_WITH_PROJECT_UUID\"\n}\n`;\n\nconst README_SNIPPET = `\\n## InstantTasks SDK\\n\\nRun \\`npx @koderlabs/tasks-cli doctor\\` to verify your setup.\\n\\nUpload source maps in CI:\\n\\n\\`\\`\\`sh\\nnpx @koderlabs/tasks-cli sourcemap upload ./dist --release \"$GIT_SHA\"\\n\\`\\`\\`\\n`;\n\n/** Returns the set of files a given platform's init writes. */\nexport function planInit(platform: InitPlatform): InitFile[] {\n const files: InitFile[] = [\n { filepath: '.tasksrc.json', contents: RC_TEMPLATE },\n { filepath: 'INSTANTTASKS.md', contents: README_SNIPPET.trim() + '\\n' },\n ];\n files.push({ filepath: snippetPath(platform), contents: snippetFor(platform) });\n return files;\n}\n\nfunction snippetPath(platform: InitPlatform): string {\n switch (platform) {\n case 'web':\n return 'src/tasks-sdk.ts';\n case 'react':\n return 'src/tasks-sdk.ts';\n case 'nextjs':\n return 'instrumentation.ts';\n case 'vue':\n return 'src/tasks-sdk.ts';\n case 'rn':\n return 'src/tasks-sdk.ts';\n case 'nestjs':\n return 'src/tasks-sdk.ts';\n }\n}\n\nfunction snippetFor(platform: InitPlatform): string {\n switch (platform) {\n case 'web':\n case 'react':\n case 'vue':\n return `import { init } from '@koderlabs/tasks-sdk-browser';\\n\\ninit({\\n endpoint: import.meta.env.VITE_TASKS_ENDPOINT,\\n ingestKey: import.meta.env.VITE_TASKS_INGEST_KEY,\\n release: import.meta.env.VITE_RELEASE,\\n});\\n`;\n case 'nextjs':\n return `// Next.js 13+ instrumentation hook — auto-loaded once per process.\\nexport async function register() {\\n const { init } = await import('@koderlabs/tasks-sdk-nextjs');\\n init({\\n endpoint: process.env.NEXT_PUBLIC_TASKS_ENDPOINT!,\\n ingestKey: process.env.NEXT_PUBLIC_TASKS_INGEST_KEY!,\\n release: process.env.NEXT_PUBLIC_RELEASE,\\n });\\n}\\n`;\n case 'rn':\n return `import { init } from '@koderlabs/tasks-sdk-rn';\\n\\ninit({\\n endpoint: process.env.EXPO_PUBLIC_TASKS_ENDPOINT!,\\n ingestKey: process.env.EXPO_PUBLIC_TASKS_INGEST_KEY!,\\n release: process.env.EXPO_PUBLIC_RELEASE,\\n});\\n`;\n case 'nestjs':\n return `import { init } from '@koderlabs/tasks-sdk-node';\\n\\ninit({\\n endpoint: process.env.INSTANTTASKS_ENDPOINT!,\\n ingestKey: process.env.INSTANTTASKS_INGEST_KEY!,\\n release: process.env.RELEASE,\\n});\\n`;\n }\n}\n\nexport async function initScaffold(opts: InitOptions): Promise<InitResult> {\n const log = opts.log ?? ((s: string) => console.log(s));\n const cwd = path.resolve(opts.cwd ?? process.cwd());\n const files = planInit(opts.platform);\n const written: string[] = [];\n const skipped: string[] = [];\n\n log(pc.cyan(`Scaffolding InstantTasks for ${pc.bold(opts.platform)}…`));\n\n for (const f of files) {\n const abs = path.join(cwd, f.filepath);\n const exists = await fs\n .stat(abs)\n .then(() => true)\n .catch(() => false);\n\n if (opts.dryRun) {\n log(pc.dim(` [dry-run] would write ${f.filepath}${exists ? ' (overwrite)' : ''}`));\n log(pc.dim(' ┌─'));\n for (const line of f.contents.split('\\n')) log(pc.dim(` │ ${line}`));\n log(pc.dim(' └─'));\n continue;\n }\n\n if (exists && !opts.force) {\n log(pc.yellow(` ⚠ ${f.filepath} exists — skipping (pass --force to overwrite)`));\n skipped.push(f.filepath);\n continue;\n }\n\n await fs.mkdir(path.dirname(abs), { recursive: true });\n await fs.writeFile(abs, f.contents, 'utf-8');\n log(` ${pc.green('✓')} ${f.filepath}`);\n written.push(f.filepath);\n }\n\n if (!opts.dryRun) {\n log('');\n log(pc.green('Done. Edit .tasksrc.json with your project credentials, then run:'));\n log(` ${pc.bold('npx @koderlabs/tasks-cli doctor')}`);\n }\n\n return { files, written, skipped };\n}\n","import pc from 'picocolors';\n\nexport interface EventsTailOptions {\n apiUrl: string;\n key: string;\n projectId?: string;\n /** Initial timestamp to poll from (ms epoch). Defaults to \"now\". */\n since?: number;\n /** Poll interval in ms. Default 5000. */\n intervalMs?: number;\n /** Filter object — currently only `project=<id>` is documented. */\n filter?: Record<string, string>;\n fetchImpl?: typeof fetch;\n log?: (line: string) => void;\n /** Internal: stop signal for tests + Ctrl-C. */\n signal?: AbortSignal;\n}\n\ninterface EventRow {\n ts: string | number;\n kind?: string;\n message?: string;\n url?: string;\n}\n\n/**\n * Polls `/sdk/v1/events?since=<ts>` on an interval until aborted. Designed to\n * be replaced with WebSocket once the backend ships a stream endpoint —\n * surface area is identical (one row per event to stdout).\n *\n * Degrades gracefully when the endpoint is missing: surfaces a one-time\n * warning and stops the loop instead of spamming retries.\n */\nexport async function eventsTail(opts: EventsTailOptions): Promise<void> {\n const log = opts.log ?? ((s: string) => console.log(s));\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const interval = opts.intervalMs ?? 5000;\n let since = opts.since ?? Date.now();\n\n log(pc.cyan(`Tailing events (poll every ${interval}ms). Ctrl-C to exit.`));\n\n while (!opts.signal?.aborted) {\n const params = new URLSearchParams({ since: String(since) });\n if (opts.projectId) params.set('projectId', opts.projectId);\n for (const [k, v] of Object.entries(opts.filter ?? {})) params.set(k, v);\n const url = `${opts.apiUrl.replace(/\\/+$/, '')}/sdk/v1/events?${params.toString()}`;\n\n try {\n const res = await fetchImpl(url, {\n method: 'GET',\n headers: { authorization: `Bearer ${opts.key}` },\n signal: opts.signal,\n });\n if (res.status === 404) {\n log(\n pc.yellow(\n `events endpoint not available yet (404). Backend needs to ship /sdk/v1/events — exiting tail loop.`,\n ),\n );\n return;\n }\n if (res.ok) {\n const body = (await res.json()) as { data?: EventRow[] } & EventRow[];\n const rows: EventRow[] = Array.isArray(body) ? body : Array.isArray(body?.data) ? body.data : [];\n for (const row of rows) {\n const ts = typeof row.ts === 'number' ? new Date(row.ts).toISOString() : String(row.ts);\n const kind = row.kind ?? 'event';\n const message = row.message ?? '';\n const url = row.url ? pc.dim(` ${row.url}`) : '';\n log(`${pc.dim(ts)} | ${pc.bold(kind.padEnd(12))} | ${message}${url}`);\n // Advance the cursor past this event.\n if (typeof row.ts === 'number') since = Math.max(since, row.ts + 1);\n }\n if (rows.length === 0) {\n since = Date.now();\n }\n } else {\n log(pc.yellow(`poll failed: HTTP ${res.status}`));\n }\n } catch (err) {\n if ((err as Error).name === 'AbortError') return;\n log(pc.yellow(`poll error: ${(err as Error).message}`));\n }\n\n await wait(interval, opts.signal);\n }\n}\n\nfunction wait(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const t = setTimeout(resolve, ms);\n signal?.addEventListener('abort', () => {\n clearTimeout(t);\n resolve();\n });\n });\n}\n\n/** Parses `--since 10m / 1h / 30s` style durations to absolute epoch ms. */\nexport function parseSince(input: string | undefined, now = Date.now()): number {\n if (!input) return now;\n const match = input.match(/^(\\d+)([smhd])$/);\n if (!match) {\n const n = Number(input);\n return Number.isFinite(n) ? n : now;\n }\n const value = parseInt(match[1], 10);\n const unit = match[2];\n const mult = unit === 's' ? 1_000 : unit === 'm' ? 60_000 : unit === 'h' ? 3_600_000 : 86_400_000;\n return now - value * mult;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;uBAAwB;AACxB,IAAAA,qBAAe;;;ACiCR,IAAMC,WAAN,cAAuBC,MAAAA;EAlC9B,OAkC8BA;;;;;EAC5B,YAAmBC,QAAgBC,SAAwBC,MAAgB;AACzE,UAAMD,OAAAA,GAAAA,KADWD,SAAAA,QAAAA,KAAwCE,OAAAA;AAEzD,SAAKC,OAAO;EACd;AACF;AAEO,IAAMC,YAAN,MAAMA;EAzCb,OAyCaA;;;EACMC;EACAC;EACAC;EACAC;EACAC;EAEjB,YAAYC,MAAwB;AAClC,SAAKL,SAASK,KAAKL,OAAOM,QAAQ,QAAQ,EAAA;AAC1C,SAAKL,MAAMI,KAAKJ;AAChB,SAAKC,YAAYG,KAAKH,aAAaK,WAAWC;AAC9C,SAAKL,aAAaE,KAAKF,cAAc;AACrC,SAAKC,cAAcC,KAAKD,eAAe;AACvC,QAAI,CAAC,KAAKF,WAAW;AACnB,YAAM,IAAIR,MAAM,oDAAA;IAClB;EACF;;EAGA,MAAMe,iBACJC,SACAC,aACAC,OACuB;AACvB,UAAMC,MAAM,GAAG,KAAKb,MAAM,4BAA4Bc,mBAAmBJ,OAAAA,CAAAA,gBAAwBI,mBAAmBH,WAAAA,CAAAA;AACpH,UAAMI,OAAO,IAAIC,SAAAA;AACjB,eAAWC,KAAKL,OAAO;AAErB,YAAMM,QAAQC,QAAQF,EAAEG,OAAO;AAG/B,YAAMC,OAAO,IAAIC,KAAK;QAACJ;SAAkC;QAAEK,MAAM;MAAmB,CAAA;AACpFR,WAAKS,OAAO,SAASH,MAAMJ,EAAEQ,QAAQ;IACvC;AACA,WAAO,KAAKC,QAAsB,QAAQb,KAAKE,IAAAA;EACjD;;EAGA,MAAMY,cAAcjB,SAAiBC,aAA4C;AAC/E,WAAO,KAAKF,iBAAiBC,SAASC,aAAa,CAAA,CAAE;EACvD;EAEA,MAAce,QAAWE,QAAgBf,KAAahB,MAA4B;AAChF,QAAIgC,UAAU;AACd,QAAIC;AACJ,WAAOD,WAAW,KAAK1B,YAAY;AACjC,UAAI;AACF,cAAM4B,MAAM,MAAM,KAAK7B,UAAUW,KAAK;UACpCe;UACAI,SAAS;YAAEC,eAAe,UAAU,KAAKhC,GAAG;UAAG;UAC/CJ;QACF,CAAA;AACA,YAAIkC,IAAIpC,WAAW,OAAOoC,IAAIpC,WAAW,KAAK;AAC5C,gBAAMuC,MAAM,MAAMC,SAASJ,GAAAA;AAC3B,gBAAM,IAAItC,SACRsC,IAAIpC,QACJ,+BAA+BoC,IAAIpC,MAAM,iCAAiCuC,GAAAA,GAAME,KAAI,GACpFF,GAAAA;QAEJ;AACA,YAAIH,IAAIpC,WAAW,OAAOoC,IAAIpC,UAAU,KAAK;AAE3C,gBAAM0C,aAAaC,gBAAgBP,IAAIC,QAAQO,IAAI,aAAA,CAAA;AACnD,cAAIV,UAAU,KAAK1B,YAAY;AAC7B,kBAAMqC,QAAOH,cAAc,KAAKjC,cAAcqC,KAAKC,IAAI,GAAGb,OAAAA;AAC1D,kBAAMc,MAAMH,KAAAA;AACZX;AACA;UACF;AACA,gBAAMK,MAAM,MAAMC,SAASJ,GAAAA;AAC3B,gBAAM,IAAItC,SAASsC,IAAIpC,QAAQ,QAAQoC,IAAIpC,MAAM,UAAUkC,UAAU,CAAA,cAAeK,GAAAA,GAAME,KAAI,GAAIF,GAAAA;QACpG;AACA,YAAI,CAACH,IAAIa,IAAI;AACX,gBAAMV,MAAM,MAAMC,SAASJ,GAAAA;AAC3B,gBAAM,IAAItC,SAASsC,IAAIpC,QAAQ,QAAQoC,IAAIpC,MAAM,KAAKuC,GAAAA,GAAME,KAAI,GAAIF,GAAAA;QACtE;AACA,cAAMW,OAAQ,MAAMd,IAAIc,KAAI;AAE5B,eAAQA,QAAQ,OAAOA,SAAS,YAAY,UAAUA,OAAQA,KAAKC,OAAcD;MACnF,SAASE,KAAK;AACZ,YAAIA,eAAetD,YAAYsD,IAAIpD,WAAW,OAAOoD,IAAIpD,SAAS,IAAK,OAAMoD;AAC7EjB,kBAAUiB;AACV,YAAIlB,WAAW,KAAK1B,WAAY,OAAM4C;AACtC,cAAMJ,MAAM,KAAKvC,cAAcqC,KAAKC,IAAI,GAAGb,OAAAA,CAAAA;AAC3CA;MACF;IACF;AACA,UAAMC,WAAW,IAAIpC,MAAM,aAAA;EAC7B;AACF;AAEA,SAASyB,QAAQC,SAA4B;AAC3C,MAAIA,mBAAmB4B,WAAY,QAAO5B;AAC1C,SAAO,IAAI4B,WAAW5B,OAAAA;AACxB;AAHSD;AAKT,eAAegB,SAASJ,KAAa;AACnC,MAAI;AACF,WAAO,MAAMA,IAAIkB,KAAI;EACvB,QAAQ;AACN,WAAO;EACT;AACF;AANed;AAQf,SAASG,gBAAgBY,QAAqB;AAC5C,MAAI,CAACA,OAAQ,QAAO;AACpB,QAAMC,IAAIC,OAAOF,MAAAA;AACjB,MAAIE,OAAOC,SAASF,CAAAA,KAAMA,KAAK,EAAG,QAAOA,IAAI;AAC7C,QAAMG,OAAOC,KAAKC,MAAMN,MAAAA;AACxB,MAAIE,OAAOC,SAASC,IAAAA,EAAO,QAAOb,KAAKgB,IAAI,GAAGH,OAAOC,KAAKG,IAAG,CAAA;AAC7D,SAAO;AACT;AAPSpB;AAST,SAASK,MAAMgB,IAAU;AACvB,SAAO,IAAIC,QAAQ,CAACC,MAAMC,WAAWD,GAAGF,EAAAA,CAAAA;AAC1C;AAFShB;;;AC5IT,qBAAyC;AACzC,WAAsB;AAoBtB,IAAMoB,kBAAkB;AACxB,IAAMC,cAAc;AAWb,SAASC,WAAWC,OAAa;AACtC,MAAIC,MAAWC,aAAQF,KAAAA;AACvB,SAAO,MAAM;AACX,UAAMG,YAAiBC,UAAKH,KAAKH,WAAAA;AACjC,YAAIO,2BAAWF,SAAAA,EAAY,QAAOA;AAClC,UAAMG,SAAcC,aAAQN,GAAAA;AAC5B,QAAIK,WAAWL,IAAK,QAAOO;AAC3BP,UAAMK;EACR;AACF;AATgBP;AAWhB,SAASU,OAAOT,OAAa;AAC3B,QAAMU,OAAOX,WAAWC,KAAAA;AACxB,MAAI,CAACU,KAAM,QAAO;IAAEC,MAAM,CAAC;EAAE;AAC7B,MAAI;AACF,UAAMA,OAAOC,KAAKC,UAAMC,6BAAaJ,MAAM,OAAA,CAAA;AAC3C,WAAO;MAAEA;MAAMC;IAAK;EACtB,QAAQ;AACN,WAAO;MAAED;MAAMC,MAAM,CAAC;IAAE;EAC1B;AACF;AATSF;AAWF,SAASM,cACdC,QAAwB,CAAC,GACzBC,MAAyBC,QAAQD,KAAG;AAEpC,QAAM,EAAEP,MAAMS,QAAQR,MAAMS,GAAE,IAAKX,OAAOO,MAAMK,OAAOH,QAAQG,IAAG,CAAA;AAElE,QAAMC,UACJN,MAAMM,UACNL,IAAIM,yBACJN,IAAIO,wBACJJ,GAAGK,YACHL,GAAGE,UACHzB,iBACA6B,QAAQ,QAAQ,EAAA;AAElB,QAAMC,MACJX,MAAMW,OACNV,IAAIW,2BACJX,IAAIY,+BACJT,GAAGU,aACHV,GAAGO,OACH;AAEF,QAAMI,YAAYf,MAAMe,aAAad,IAAIe,2BAA2BZ,GAAGW;AAEvE,MAAI,CAACJ,OAAO,CAACX,MAAMiB,aAAa;AAC9B,UAAM,IAAIC,MACR,6GAAA;EAEJ;AACA,MAAIP,OAAO,CAAC,YAAYQ,KAAKR,GAAAA,GAAM;AACjC,UAAM,IAAIO,MACR,gEAAgEP,IAAIS,MAAM,GAAG,CAAA,CAAA,UAAO;EAExF;AAEA,SAAO;IAAEd;IAAQK;IAAKI;IAAWZ;EAAO;AAC1C;AArCgBJ;;;ACrEhB,IAAAsB,kBAA+B;AAC/B,IAAAC,QAAsB;AACtB,wBAAe;AAkBf,eAAsBC,iBAAiBC,MAA6B;AAClE,QAAMC,MAAMD,KAAKC,QAAQ,CAACC,MAAcC,QAAQF,IAAIC,CAAAA;AACpD,QAAME,MAAMJ,KAAKK,eAAe;AAChC,QAAMC,OAAYC,cAAQP,KAAKQ,GAAG;AAElC,QAAMC,OAAO,MAAMC,YAAYJ,IAAAA;AAC/B,MAAIG,KAAKE,WAAW,GAAG;AACrBV,QAAIW,kBAAAA,QAAGC,OAAO,gCAAgCP,IAAAA,EAAM,CAAA;AACpD,WAAO;EACT;AAEAL,MAAIW,kBAAAA,QAAGE,KAAK,aAAaL,KAAKE,MAAM,6BAA6BX,KAAKe,OAAO,KAAKX,GAAAA,SAAO,CAAA;AAEzF,QAAMY,QAAsB,CAAA;AAC5B,aAAWC,WAAWR,MAAM;AAC1B,UAAMS,MAAWC,eAASb,MAAMW,OAAAA,EAASG,MAAWC,SAAG,EAAEC,KAAK,GAAA;AAC9D,UAAMC,MAAMvB,KAAKwB,YAAYC,QAAQzB,KAAKwB,WAAWN,IAAIQ,QAAQ,UAAU,EAAA,CAAA,IAAOC;AAClF,UAAMC,UAAU,MAAMC,gBAAAA,SAAGC,SAASb,OAAAA;AAClCD,UAAMe,KAAK;MAAEC,UAAeC,eAAShB,OAAAA;MAAUM;MAAKK;IAAQ,CAAA;AAC5D3B,QAAI,KAAKW,kBAAAA,QAAGsB,IAAI,QAAA,CAAA,IAAQhB,GAAAA,GAAMK,MAAMX,kBAAAA,QAAGsB,IAAI,MAAMX,GAAAA,GAAM,IAAI,EAAA,EAAI;EACjE;AAEA,QAAMY,SAAS,MAAMnC,KAAKoC,UAAUC,iBAAiBrC,KAAKe,SAASX,KAAKY,KAAAA;AACxEf,MAAIW,kBAAAA,QAAG0B,MAAM,iBAAiBH,OAAOpB,QAAQwB,OAAO,YAAYJ,OAAOK,SAAS7B,MAAM,eAAe,CAAA;AACrG,SAAOwB,OAAOK,SAAS7B;AACzB;AAzBsBZ;AA2BtB,eAAeW,YAAYF,KAAW;AACpC,QAAMiC,MAAgB,CAAA;AACtB,MAAIC;AACJ,MAAI;AACFA,cAAU,MAAMb,gBAAAA,SAAGc,QAAQnC,KAAK;MAAEoC,eAAe;IAAK,CAAA;EACxD,SAASC,KAAK;AACZ,UAAM,IAAIC,MAAM,yBAAyBtC,GAAAA,KAASqC,IAAcE,OAAO,EAAE;EAC3E;AACA,aAAWC,SAASN,SAAS;AAC3B,UAAMO,OAAY3B,WAAKd,KAAKwC,MAAME,IAAI;AACtC,QAAIF,MAAMG,YAAW,GAAI;AACvB,YAAMC,SAAS,MAAM1C,YAAYuC,IAAAA;AACjCR,UAAIV,KAAI,GAAIqB,MAAAA;IACd,WAAWJ,MAAMK,OAAM,KAAML,MAAME,KAAKI,SAAS,SAAA,GAAY;AAC3Db,UAAIV,KAAKkB,IAAAA;IACX;EACF;AACA,SAAOR,IAAIc,KAAI;AACjB;AAlBe7C;AAoBf,SAASe,QAAQ+B,QAAgBtC,KAAW;AAC1C,QAAMuC,OAAOD,OAAO9B,QAAQ,QAAQ,EAAA;AACpC,QAAMgC,QAAQxC,IAAIQ,QAAQ,QAAQ,EAAA;AAClC,SAAO,GAAG+B,IAAAA,IAAQC,KAAAA;AACpB;AAJSjC;;;ACnET,IAAAkC,qBAAe;AAef,eAAsBC,cAAcC,MAA0B;AAC5D,QAAMC,MAAMD,KAAKC,QAAQ,CAACC,MAAcC,QAAQF,IAAIC,CAAAA;AACpD,QAAME,MAAMJ,KAAKK,eAAe;AAChCJ,MAAIK,mBAAAA,QAAGC,KAAK,oBAAoBP,KAAKQ,IAAI,KAAKJ,GAAAA,SAAO,CAAA;AACrD,QAAMK,SAAS,MAAMT,KAAKU,UAAUX,cAAcC,KAAKQ,MAAMJ,GAAAA;AAC7DH,MAAIK,mBAAAA,QAAGK,MAAM,WAAWF,OAAOG,QAAQC,OAAO,cAAcJ,OAAOG,QAAQE,EAAE,IAAI,CAAA;AACjF,SAAOL,OAAOG,QAAQE;AACxB;AAPsBf;;;ACftB,IAAAgB,qBAAe;AAoBf,eAAsBC,OAAOC,OAAsB,CAAC,GAAC;AACnD,QAAMC,MAAMD,KAAKC,QAAQ,CAACC,MAAcC,QAAQF,IAAIC,CAAAA;AACpD,QAAME,YAAYJ,KAAKI,aAAaC,WAAWC;AAC/C,QAAMC,SAAiC,CAAA;AAGvC,MAAIC;AACJ,MAAI;AACFA,UAAMC,cAAc;MAAEC,QAAQV,KAAKU;MAAQC,KAAKX,KAAKW;MAAKC,WAAWZ,KAAKY;IAAU,CAAA;AACpFL,WAAOM,KAAK;MACVC,MAAM;MACNC,IAAI;MACJC,QAAQ,YAAYR,IAAIE,MAAM,GAAGF,IAAIS,SAAS,QAAQT,IAAIS,MAAM,MAAM,EAAA;IACxE,CAAA;EACF,SAASC,KAAK;AACZX,WAAOM,KAAK;MAAEC,MAAM;MAAUC,IAAI;MAAOC,QAASE,IAAcC;IAAQ,CAAA;AACxE,WAAOC,OAAOb,QAAQN,GAAAA;EACxB;AAEA,MAAI,CAACO,IAAII,WAAW;AAClBL,WAAOM,KAAK;MACVC,MAAM;MACNC,IAAI;MACJC,QAAQ;IACV,CAAA;EACF,OAAO;AACLT,WAAOM,KAAK;MAAEC,MAAM;MAAaC,IAAI;MAAMC,QAAQR,IAAII;IAAU,CAAA;EACnE;AAGA,QAAMS,YAAY,GAAGb,IAAIE,MAAM;AAC/B,MAAI;AACF,UAAMY,MAAM,MAAMlB,UAAUiB,WAAW;MACrCE,QAAQ;MACRC,SAAS;QAAEC,eAAe,UAAUjB,IAAIG,GAAG;MAAG;IAChD,CAAA;AACA,QAAIW,IAAIP,IAAI;AACVR,aAAOM,KAAK;QAAEC,MAAM;QAAYC,IAAI;QAAMC,QAAQ,GAAGK,SAAAA,WAAeC,IAAII,MAAM;MAAG,CAAA;AACjFnB,aAAOM,KAAK;QAAEC,MAAM;QAAaC,IAAI;QAAMC,QAAQ;MAAgB,CAAA;IACrE,WAAWM,IAAII,WAAW,OAAOJ,IAAII,WAAW,KAAK;AACnDnB,aAAOM,KAAK;QAAEC,MAAM;QAAYC,IAAI;QAAMC,QAAQ,GAAGK,SAAAA,eAAwBC,IAAII,MAAM;MAAI,CAAA;AAC3FnB,aAAOM,KAAK;QACVC,MAAM;QACNC,IAAI;QACJC,QAAQ,sBAAsBM,IAAII,MAAM;MAC1C,CAAA;IACF,OAAO;AACLnB,aAAOM,KAAK;QACVC,MAAM;QACNC,IAAI;QACJC,QAAQ,GAAGK,SAAAA,gBAAoBC,IAAII,MAAM;MAC3C,CAAA;IACF;EACF,SAASR,KAAK;AACZX,WAAOM,KAAK;MACVC,MAAM;MACNC,IAAI;MACJC,QAAQ,gBAAgBK,SAAAA,KAAeH,IAAcC,OAAO;IAC9D,CAAA;EACF;AAKA,MAAIX,IAAIG,IAAIgB,WAAW,KAAA,GAAQ;AAC7BpB,WAAOM,KAAK;MACVC,MAAM;MACNC,IAAI;MACJC,QAAQ;IACV,CAAA;EACF,WAAWR,IAAIG,IAAIgB,WAAW,KAAA,GAAQ;AACpCpB,WAAOM,KAAK;MACVC,MAAM;MACNC,IAAI;MACJC,QAAQ;IACV,CAAA;EACF;AAEA,SAAOI,OAAOb,QAAQN,GAAAA;AACxB;AA/EsBF;AAiFtB,SAASqB,OACPb,QACAN,KAAwB;AAExB,aAAW2B,KAAKrB,QAAQ;AACtB,UAAMsB,OAAOD,EAAEb,KAAKe,mBAAAA,QAAGC,MAAM,QAAA,IAAOD,mBAAAA,QAAGE,IAAI,QAAA;AAC3C/B,QAAI,KAAK4B,IAAAA,IAAQC,mBAAAA,QAAGG,KAAKL,EAAEd,KAAKoB,OAAO,EAAA,CAAA,CAAA,IAAQN,EAAEb,KAAKe,mBAAAA,QAAGK,IAAIP,EAAEZ,MAAM,IAAIc,mBAAAA,QAAGM,OAAOR,EAAEZ,MAAM,CAAA,EAAG;EAChG;AACA,QAAMD,KAAKR,OAAO8B,MAAM,CAACT,MAAMA,EAAEb,EAAE;AACnCd,MAAI,EAAA;AACJA,MAAIc,KAAKe,mBAAAA,QAAGC,MAAM,oBAAA,IAAwBD,mBAAAA,QAAGE,IAAI,4BAAA,CAAA;AACjD,SAAO;IAAEjB;IAAIR;EAAO;AACtB;AAZSa;;;ACrGT,IAAAkB,kBAA4C;AAC5C,IAAAC,QAAsB;AACtB,IAAAC,qBAAe;AAsBf,IAAMC,oBAAoB,KAAK,OAAO;AACtC,IAAMC,cAAc;AACpB,IAAMC,gBAAgB;AAStB,eAAsBC,gBACpBC,MAA4B;AAE5B,QAAMC,MAAMD,KAAKC,QAAQ,CAACC,MAAcC,QAAQF,IAAIC,CAAAA;AACpD,QAAME,YAAYJ,KAAKI,aAAaC,WAAWC;AAC/C,QAAMC,WAAWP,KAAKO,YAAYX;AAClC,QAAMY,SAASR,KAAKQ,WAAW;AAC/B,QAAMC,OAAYC,cAAQV,KAAKW,IAAI;AAEnC,QAAMC,OAAO,MAAMC,KAAKJ,IAAAA;AACxB,MAAIG,KAAKE,WAAW,GAAG;AACrBb,QAAIc,mBAAAA,QAAGC,OAAO,6BAA6BP,IAAAA,EAAM,CAAA;AACjD,WAAO;MAAEQ,UAAU;MAAGC,QAAQ;MAAGC,SAAS;IAAE;EAC9C;AAEAlB,MACEc,mBAAAA,QAAGK,KACD,aAAaR,KAAKE,MAAM,iBAAiBd,KAAKqB,UAAU,gBAAgBrB,KAAKqB,OAAO,KAAK,EAAA,QAAK,CAAA;AAIlG,MAAIJ,WAAW;AACf,MAAIC,SAAS;AACb,MAAIC,UAAU;AAEd,aAAWG,WAAWV,MAAM;AAC1B,UAAMW,OAAOC,aAAaf,MAAMa,OAAAA;AAChC,QAAI,CAACC,MAAM;AACTtB,UAAIc,mBAAAA,QAAGU,IAAI,YAAOH,OAAAA,gCAAkC,CAAA;AACpDJ;AACA;IACF;AAEA,UAAMQ,OAAO,MAAMC,gBAAAA,SAAGD,KAAKJ,OAAAA;AAC3B,QAAII,KAAKE,OAAOrB,UAAU;AACxBN,UAAIc,mBAAAA,QAAGC,OAAO,YAAOO,IAAAA,WAAUG,KAAKE,IAAI,sBAAsBrB,QAAAA,YAAoB,CAAA;AAClFY;AACA;IACF;AAEA,UAAMU,UAAU,MAAMF,gBAAAA,SAAGG,SAASR,SAAS,OAAA;AAC3C,UAAMS,KAAK,MAAMC,cAAc5B,WAAWJ,KAAKiC,QAAQjC,KAAKkC,KAAK;MAC/DC,MAAMZ;MACNM;MACAR,SAASrB,KAAKqB;MACde,aAAapC,KAAKoC;IACpB,CAAA;AACA,QAAIL,GAAGA,IAAI;AACT9B,UAAI,KAAKc,mBAAAA,QAAGsB,MAAM,QAAA,CAAA,IAAQd,IAAAA,EAAM;AAChCN;IACF,OAAO;AACLhB,UAAIc,mBAAAA,QAAGU,IAAI,YAAOF,IAAAA,WAAUQ,GAAGO,MAAM,EAAE,CAAA;AACvCpB;IACF;EACF;AAEAjB,MAAI,EAAA;AACJA,MACE,GAAGc,mBAAAA,QAAGwB,KAAK,UAAA,CAAA,IAAexB,mBAAAA,QAAGsB,MAAM,GAAGpB,QAAAA,WAAmB,CAAA,KACvDC,SAASH,mBAAAA,QAAGU,IAAI,GAAGP,MAAAA,SAAe,IAAI,GAAGA,MAAAA,SAAe,KACrDC,OAAAA,WAAkB;AAGzB,MAAID,SAAS,KAAKV,QAAQ;AACxB,UAAM,IAAIgC,MAAM,GAAGtB,MAAAA,2DAAiE;EACtF;AACA,SAAO;IAAED;IAAUC;IAAQC;EAAQ;AACrC;AAnEsBpB;AA0Ef,SAASyB,aAAaf,MAAcgC,KAAW;AACpD,QAAMC,eAAoBhC,cAAQD,IAAAA;AAClC,QAAMkC,WAAgBjC,cAAQ+B,GAAAA;AAC9B,MAAI,CAACE,SAASC,WAAWF,eAAoBG,SAAG,KAAKF,aAAaD,aAAc,QAAO;AACvF,QAAMI,MAAWC,eAASL,cAAcC,QAAAA;AACxC,MAAI,CAACG,OAAOA,IAAIF,WAAW,IAAA,KAAcI,iBAAWF,GAAAA,EAAM,QAAO;AACjE,SAAOA,IAAIG,MAAWJ,SAAG,EAAEK,KAAK,GAAA;AAClC;AAPgB1B;AAShB,eAAeX,KAAKsC,KAAW;AAC7B,QAAMC,MAAgB,CAAA;AACtB,MAAIC;AACJ,MAAI;AACFA,cAAU,MAAM1B,gBAAAA,SAAG2B,QAAQH,KAAK;MAAEI,eAAe;IAAK,CAAA;EACxD,QAAQ;AACN,WAAOH;EACT;AACA,aAAWI,SAASH,SAAS;AAE3B,QAAIG,MAAMC,eAAc,EAAI;AAC5B,UAAMC,OAAYR,WAAKC,KAAKK,MAAMG,IAAI;AACtC,QAAIH,MAAMI,YAAW,GAAI;AACvBR,UAAIS,KAAI,GAAK,MAAMhD,KAAK6C,IAAAA,CAAAA;IAC1B,WAAWF,MAAMM,OAAM,KAAMN,MAAMG,KAAKI,SAAS,MAAA,GAAS;AACxDX,UAAIS,KAAKH,IAAAA;IACX;EACF;AACA,SAAON,IAAIY,KAAI;AACjB;AAnBenD;AA4Bf,eAAemB,cACb5B,WACA6B,QACAC,KACA+B,MAAgB;AAEhB,QAAMC,MAAM,GAAGjC,OAAOkC,QAAQ,QAAQ,EAAA,CAAA;AACtC,MAAIC,aAAa;AACjB,WAASC,UAAU,GAAGA,WAAWxE,aAAawE,WAAW;AACvD,QAAI;AACF,YAAMC,MAAM,MAAMlE,UAAU8D,KAAK;QAC/BK,QAAQ;QACRC,SAAS;UAAE,gBAAgB;UAAoBC,eAAe,UAAUvC,GAAAA;QAAM;QAC9E+B,MAAMS,KAAKC,UAAUV,IAAAA;MACvB,CAAA;AACA,UAAIK,IAAIvC,GAAI,QAAO;QAAEA,IAAI;QAAMO,QAAQ,QAAQgC,IAAIM,MAAM;MAAG;AAC5DR,mBAAa,QAAQE,IAAIM,MAAM;AAE/B,UAAIN,IAAIM,WAAW,QAAQN,IAAIM,SAAS,OAAON,IAAIM,UAAU,MAAM;AACjE,eAAO;UAAE7C,IAAI;UAAOO,QAAQ8B;QAAW;MACzC;IACF,SAASS,KAAK;AACZT,mBAAcS,IAAcC;IAC9B;AACA,QAAIT,UAAUxE,aAAa;AACzB,YAAM,IAAIkF,QAAQ,CAACC,MAAMC,WAAWD,GAAGlF,gBAAgBoF,KAAKC,IAAI,GAAGd,OAAAA,CAAAA,CAAAA;IACrE;EACF;AACA,SAAO;IAAEtC,IAAI;IAAOO,QAAQ8B;EAAW;AACzC;AA7BepC;;;AClJf,IAAAoD,kBAA4C;AAC5C,IAAAC,QAAsB;AACtB,IAAAC,qBAAe;AAgBf,IAAMC,sBAAsB;AAQ5B,eAAsBC,UACpBC,UACAC,MAA0B;AAE1B,QAAMC,MAAMD,KAAKC,QAAQ,CAACC,MAAcC,QAAQF,IAAIC,CAAAA;AACpD,QAAME,OAAYC,cAAQN,QAAAA;AAC1B,MAAI,CAACK,KAAKE,SAAS,OAAA,GAAU;AAC3BL,QAAIM,mBAAAA,QAAGC,OAAO,YAAYJ,IAAAA,kDAAiD,CAAA;EAC7E;AACA,QAAMK,YAAiBC,WAAKN,MAAM,YAAY,aAAa,OAAA;AAC3D,QAAMO,QAAQ,MAAMC,UAAUH,SAAAA;AAC9B,MAAIE,MAAME,WAAW,GAAG;AACtBZ,QAAIM,mBAAAA,QAAGC,OAAO,8BAA8BC,SAAAA,EAAW,CAAA;AACvD,WAAO;MAAEK,UAAU;MAAGC,QAAQ;MAAGC,iBAAiB;IAAM;EAC1D;AACAf,MAAIM,mBAAAA,QAAGU,KAAK,aAAaN,MAAME,MAAM,2BAAsB,CAAA;AAC3D,SAAOK,UAAUP,OAAO,OAAOX,MAAMC,GAAAA;AACvC;AAjBsBH;AAsBtB,eAAsBqB,cACpBC,aACApB,MAA0B;AAE1B,QAAMC,MAAMD,KAAKC,QAAQ,CAACC,MAAcC,QAAQF,IAAIC,CAAAA;AACpD,QAAMmB,WAAgBhB,cAAQe,WAAAA;AAC9B,QAAME,OAAO,MAAMC,gBAAAA,SAAGD,KAAKD,QAAAA,EAAUG,MAAM,MAAM,IAAA;AACjD,MAAI,CAACF,MAAMG,OAAAA,GAAU;AACnB,UAAM,IAAIC,MAAM,4BAA4BL,QAAAA,EAAU;EACxD;AACApB,MAAIM,mBAAAA,QAAGU,KAAK,6BAA6BI,QAAAA,QAAW,CAAA;AACpD,SAAOH,UAAU;IAACG;KAAW,WAAWrB,MAAMC,GAAAA;AAChD;AAZsBkB;AActB,eAAeD,UACbP,OACAgB,UACA3B,MACAC,KAAwB;AAExB,QAAM2B,YAAY5B,KAAK4B,aAAaC,WAAWC;AAC/C,QAAMC,MAAM,GAAG/B,KAAKgC,OAAOC,QAAQ,QAAQ,EAAA,CAAA,GAAMpC,mBAAAA;AACjD,MAAIiB,WAAW;AACf,MAAIC,SAAS;AACb,MAAIC,kBAAkB;AAEtB,aAAWkB,QAAQvB,OAAO;AACxB,UAAMwB,UAAU,MAAMZ,gBAAAA,SAAGa,SAASF,IAAAA;AAClC,UAAMG,OAAO;MACXV;MACAW,UAAeC,eAASL,IAAAA;MACxBM,SAASxC,KAAKwC;;MAEdC,eAAeN,QAAQO,SAAS,QAAA;IAClC;AACA,QAAI;AACF,YAAMC,MAAM,MAAMf,UAAUG,KAAK;QAC/Ba,QAAQ;QACRC,SAAS;UAAE,gBAAgB;UAAoBC,eAAe,UAAU9C,KAAK+C,GAAG;QAAG;QACnFV,MAAMW,KAAKC,UAAUZ,IAAAA;MACvB,CAAA;AACA,UAAIM,IAAIO,WAAW,KAAK;AACtBlC,0BAAkB;AAClBf,YAAIM,mBAAAA,QAAGC,OAAO,YAAY+B,eAASL,IAAAA,CAAAA,6BAA6BrC,mBAAAA,gBAAmC,CAAA;MACrG,WAAW8C,IAAIQ,IAAI;AACjBlD,YAAI,KAAKM,mBAAAA,QAAG6C,MAAM,QAAA,CAAA,IAAab,eAASL,IAAAA,CAAAA,EAAO;AAC/CpB;MACF,OAAO;AACLb,YAAIM,mBAAAA,QAAG8C,IAAI,YAAYd,eAASL,IAAAA,CAAAA,gBAAgBS,IAAIO,MAAM,EAAE,CAAA;AAC5DnC;MACF;IACF,SAASuC,KAAK;AACZrD,UAAIM,mBAAAA,QAAG8C,IAAI,YAAYd,eAASL,IAAAA,CAAAA,WAAYoB,IAAcC,OAAO,EAAE,CAAA;AACnExC;IACF;EACF;AAEA,MAAIC,iBAAiB;AACnBf,QAAI,EAAA;AACJA,QACEM,mBAAAA,QAAGC,OACD,6BAA6BX,mBAAAA,iFAC6B,CAAA;EAGhE;AACA,SAAO;IAAEiB;IAAUC;IAAQC;EAAgB;AAC7C;AArDeE;AAuDf,eAAeN,UAAU4C,KAAW;AAClC,QAAMC,MAAgB,CAAA;AACtB,MAAIC;AACJ,MAAI;AACFA,cAAU,MAAMnC,gBAAAA,SAAGoC,QAAQH,KAAK;MAAEI,eAAe;IAAK,CAAA;EACxD,QAAQ;AACN,WAAOH;EACT;AACA,aAAWI,SAASH,SAAS;AAC3B,QAAIG,MAAMC,eAAc,EAAI;AAC5B,UAAMC,OAAYrD,WAAK8C,KAAKK,MAAMG,IAAI;AACtC,QAAIH,MAAMI,YAAW,GAAI;AACvBR,UAAIS,KAAI,GAAK,MAAMtD,UAAUmD,IAAAA,CAAAA;IAC/B,WAAWF,MAAMpC,OAAM,GAAI;AACzBgC,UAAIS,KAAKH,IAAAA;IACX;EACF;AACA,SAAON;AACT;AAlBe7C;;;ACrHf,IAAAuD,kBAA+B;AAC/B,IAAAC,QAAsB;AACtB,IAAAC,qBAAe;AAIR,IAAMC,sBAAsC;EACjD;EACA;EACA;EACA;EACA;EACA;;AAsBF,IAAMC,cAAc;;;;;;AAOpB,IAAMC,iBAAiB;;;;;;;;;;;AAGhB,SAASC,SAASC,UAAsB;AAC7C,QAAMC,QAAoB;IACxB;MAAEC,UAAU;MAAiBC,UAAUN;IAAY;IACnD;MAAEK,UAAU;MAAmBC,UAAUL,eAAeM,KAAI,IAAK;IAAK;;AAExEH,QAAMI,KAAK;IAAEH,UAAUI,YAAYN,QAAAA;IAAWG,UAAUI,WAAWP,QAAAA;EAAU,CAAA;AAC7E,SAAOC;AACT;AAPgBF;AAShB,SAASO,YAAYN,UAAsB;AACzC,UAAQA,UAAAA;IACN,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;EACX;AACF;AAfSM;AAiBT,SAASC,WAAWP,UAAsB;AACxC,UAAQA,UAAAA;IACN,KAAK;IACL,KAAK;IACL,KAAK;AACH,aAAO;;;;;;;;IACT,KAAK;AACH,aAAO;;;;;;;;;;IACT,KAAK;AACH,aAAO;;;;;;;;IACT,KAAK;AACH,aAAO;;;;;;;;EACX;AACF;AAbSO;AAeT,eAAsBC,aAAaC,MAAiB;AAClD,QAAMC,MAAMD,KAAKC,QAAQ,CAACC,MAAcC,QAAQF,IAAIC,CAAAA;AACpD,QAAME,MAAWC,cAAQL,KAAKI,OAAOE,QAAQF,IAAG,CAAA;AAChD,QAAMZ,QAAQF,SAASU,KAAKT,QAAQ;AACpC,QAAMgB,UAAoB,CAAA;AAC1B,QAAMC,UAAoB,CAAA;AAE1BP,MAAIQ,mBAAAA,QAAGC,KAAK,gCAAgCD,mBAAAA,QAAGE,KAAKX,KAAKT,QAAQ,CAAA,QAAI,CAAA;AAErE,aAAWqB,KAAKpB,OAAO;AACrB,UAAMqB,MAAWC,WAAKV,KAAKQ,EAAEnB,QAAQ;AACrC,UAAMsB,SAAS,MAAMC,gBAAAA,SAClBC,KAAKJ,GAAAA,EACLK,KAAK,MAAM,IAAA,EACXC,MAAM,MAAM,KAAA;AAEf,QAAInB,KAAKoB,QAAQ;AACfnB,UAAIQ,mBAAAA,QAAGY,IAAI,2BAA2BT,EAAEnB,QAAQ,GAAGsB,SAAS,iBAAiB,EAAA,EAAI,CAAA;AACjFd,UAAIQ,mBAAAA,QAAGY,IAAI,gBAAA,CAAA;AACX,iBAAWC,QAAQV,EAAElB,SAAS6B,MAAM,IAAA,EAAOtB,KAAIQ,mBAAAA,QAAGY,IAAI,YAAOC,IAAAA,EAAM,CAAA;AACnErB,UAAIQ,mBAAAA,QAAGY,IAAI,gBAAA,CAAA;AACX;IACF;AAEA,QAAIN,UAAU,CAACf,KAAKwB,OAAO;AACzBvB,UAAIQ,mBAAAA,QAAGgB,OAAO,YAAOb,EAAEnB,QAAQ,qDAAgD,CAAA;AAC/Ee,cAAQZ,KAAKgB,EAAEnB,QAAQ;AACvB;IACF;AAEA,UAAMuB,gBAAAA,SAAGU,MAAWC,cAAQd,GAAAA,GAAM;MAAEe,WAAW;IAAK,CAAA;AACpD,UAAMZ,gBAAAA,SAAGa,UAAUhB,KAAKD,EAAElB,UAAU,OAAA;AACpCO,QAAI,KAAKQ,mBAAAA,QAAGqB,MAAM,QAAA,CAAA,IAAQlB,EAAEnB,QAAQ,EAAE;AACtCc,YAAQX,KAAKgB,EAAEnB,QAAQ;EACzB;AAEA,MAAI,CAACO,KAAKoB,QAAQ;AAChBnB,QAAI,EAAA;AACJA,QAAIQ,mBAAAA,QAAGqB,MAAM,mEAAA,CAAA;AACb7B,QAAI,KAAKQ,mBAAAA,QAAGE,KAAK,iCAAA,CAAA,EAAoC;EACvD;AAEA,SAAO;IAAEnB;IAAOe;IAASC;EAAQ;AACnC;AA3CsBT;;;ACrFtB,IAAAgC,qBAAe;AAiCf,eAAsBC,WAAWC,MAAuB;AACtD,QAAMC,MAAMD,KAAKC,QAAQ,CAACC,MAAcC,QAAQF,IAAIC,CAAAA;AACpD,QAAME,YAAYJ,KAAKI,aAAaC,WAAWC;AAC/C,QAAMC,WAAWP,KAAKQ,cAAc;AACpC,MAAIC,QAAQT,KAAKS,SAASC,KAAKC,IAAG;AAElCV,MAAIW,mBAAAA,QAAGC,KAAK,8BAA8BN,QAAAA,sBAA8B,CAAA;AAExE,SAAO,CAACP,KAAKc,QAAQC,SAAS;AAC5B,UAAMC,SAAS,IAAIC,gBAAgB;MAAER,OAAOS,OAAOT,KAAAA;IAAO,CAAA;AAC1D,QAAIT,KAAKmB,UAAWH,QAAOI,IAAI,aAAapB,KAAKmB,SAAS;AAC1D,eAAW,CAACE,GAAGC,CAAAA,KAAMC,OAAOC,QAAQxB,KAAKyB,UAAU,CAAC,CAAA,EAAIT,QAAOI,IAAIC,GAAGC,CAAAA;AACtE,UAAMI,MAAM,GAAG1B,KAAK2B,OAAOC,QAAQ,QAAQ,EAAA,CAAA,kBAAqBZ,OAAOa,SAAQ,CAAA;AAE/E,QAAI;AACF,YAAMC,MAAM,MAAM1B,UAAUsB,KAAK;QAC/BK,QAAQ;QACRC,SAAS;UAAEC,eAAe,UAAUjC,KAAKkC,GAAG;QAAG;QAC/CpB,QAAQd,KAAKc;MACf,CAAA;AACA,UAAIgB,IAAIK,WAAW,KAAK;AACtBlC,YACEW,mBAAAA,QAAGwB,OACD,yGAAoG,CAAA;AAGxG;MACF;AACA,UAAIN,IAAIO,IAAI;AACV,cAAMC,OAAQ,MAAMR,IAAIS,KAAI;AAC5B,cAAMC,OAAmBC,MAAMC,QAAQJ,IAAAA,IAAQA,OAAOG,MAAMC,QAAQJ,MAAMK,IAAAA,IAAQL,KAAKK,OAAO,CAAA;AAC9F,mBAAWC,OAAOJ,MAAM;AACtB,gBAAMK,KAAK,OAAOD,IAAIC,OAAO,WAAW,IAAInC,KAAKkC,IAAIC,EAAE,EAAEC,YAAW,IAAK5B,OAAO0B,IAAIC,EAAE;AACtF,gBAAME,OAAOH,IAAIG,QAAQ;AACzB,gBAAMC,UAAUJ,IAAII,WAAW;AAC/B,gBAAMtB,OAAMkB,IAAIlB,MAAMd,mBAAAA,QAAGqC,IAAI,IAAIL,IAAIlB,GAAG,EAAE,IAAI;AAC9CzB,cAAI,GAAGW,mBAAAA,QAAGqC,IAAIJ,EAAAA,CAAAA,MAASjC,mBAAAA,QAAGsC,KAAKH,KAAKI,OAAO,EAAA,CAAA,CAAA,MAAUH,OAAAA,GAAUtB,IAAAA,EAAK;AAEpE,cAAI,OAAOkB,IAAIC,OAAO,SAAUpC,SAAQ2C,KAAKC,IAAI5C,OAAOmC,IAAIC,KAAK,CAAA;QACnE;AACA,YAAIL,KAAKc,WAAW,GAAG;AACrB7C,kBAAQC,KAAKC,IAAG;QAClB;MACF,OAAO;AACLV,YAAIW,mBAAAA,QAAGwB,OAAO,qBAAqBN,IAAIK,MAAM,EAAE,CAAA;MACjD;IACF,SAASoB,KAAK;AACZ,UAAKA,IAAcC,SAAS,aAAc;AAC1CvD,UAAIW,mBAAAA,QAAGwB,OAAO,eAAgBmB,IAAcP,OAAO,EAAE,CAAA;IACvD;AAEA,UAAMS,KAAKlD,UAAUP,KAAKc,MAAM;EAClC;AACF;AArDsBf;AAuDtB,SAAS0D,KAAKC,IAAY5C,QAAoB;AAC5C,SAAO,IAAI6C,QAAQ,CAACC,aAAAA;AAClB,UAAMC,IAAIC,WAAWF,UAASF,EAAAA;AAC9B5C,YAAQiD,iBAAiB,SAAS,MAAA;AAChCC,mBAAaH,CAAAA;AACbD,MAAAA,SAAAA;IACF,CAAA;EACF,CAAA;AACF;AARSH;AAWF,SAASQ,WAAWC,OAA2BvD,MAAMD,KAAKC,IAAG,GAAE;AACpE,MAAI,CAACuD,MAAO,QAAOvD;AACnB,QAAMwD,QAAQD,MAAMC,MAAM,iBAAA;AAC1B,MAAI,CAACA,OAAO;AACV,UAAMC,IAAIC,OAAOH,KAAAA;AACjB,WAAOG,OAAOC,SAASF,CAAAA,IAAKA,IAAIzD;EAClC;AACA,QAAM4D,QAAQC,SAASL,MAAM,CAAA,GAAI,EAAA;AACjC,QAAMM,OAAON,MAAM,CAAA;AACnB,QAAMO,OAAOD,SAAS,MAAM,MAAQA,SAAS,MAAM,MAASA,SAAS,MAAM,OAAY;AACvF,SAAO9D,MAAM4D,QAAQG;AACvB;AAXgBT;;;ATtFhB,IAAMU,UAAU;AAMT,SAASC,eAAAA;AACd,QAAMC,UAAU,IAAIC,yBAAAA;AACpBD,UACGE,KAAK,OAAA,EACLC,YAAY,yEAAA,EACZC,QAAQN,OAAAA;AAGXE,UACGK,QAAQ,QAAA,EACRF,YAAY,mEAAA,EACZG,OAAO,mBAAmB,gDAAA,EAC1BA,OAAO,eAAe,0BAAA,EACtBA,OAAO,kBAAkB,YAAA,EACzBC,OAAO,OAAOC,SAAAA;AACb,UAAMC,SAAS,MAAMC,OAAO;MAC1BC,QAAQH,KAAKG;MACbC,KAAKJ,KAAKI;MACVC,WAAWL,KAAKM;IAClB,CAAA;AACA,QAAI,CAACL,OAAOM,GAAIC,SAAQC,KAAK,CAAA;EAC/B,CAAA;AAGF,QAAMC,YAAYlB,QAAQK,QAAQ,WAAA,EAAaF,YAAY,sBAAA;AAC3De,YACGb,QAAQ,eAAA,EACRF,YAAY,qDAAA,EACZG,OAAO,mBAAmB,yDAAA,EAC1BA,OAAO,uBAAuB,uBAAuB,YAAA,EACrDA,OAAO,sBAAsB,8BAA8Ba,OAAO,KAAK,OAAO,IAAA,CAAA,EAC9Eb,OAAO,eAAe,kDAAA,EACtBA,OAAO,mBAAmB,cAAA,EAC1BA,OAAO,eAAe,8BAAA,EACtBC,OAAO,OAAOa,MAAcZ,SAAAA;AAC3B,UAAMa,MAAMC,cAAc;MACxBX,QAAQH,KAAKG;MACbC,KAAKJ,KAAKI;IACZ,CAAA;AACA,UAAMW,gBAAgB;MACpBH;MACAT,QAAQU,IAAIV;MACZC,KAAKS,IAAIT;MACTY,SAAShB,KAAKgB;MACdC,aAAajB,KAAKiB;MAClBC,UAAUC,OAAOnB,KAAKoB,OAAO;MAC7BC,QAAQrB,KAAKqB,WAAW;IAC1B,CAAA;EACF,CAAA;AAGF,QAAMC,UAAU9B,QAAQK,QAAQ,SAAA,EAAWF,YAAY,oDAAA;AACvD2B,UACGzB,QAAQ,mBAAA,EACRF,YAAY,wCAAA,EACZG,OAAO,mBAAmB,wBAAA,EAC1BA,OAAO,iBAAA,EACPA,OAAO,aAAA,EACPC,OAAO,OAAOwB,MAAcvB,SAAAA;AAC3B,UAAMa,MAAMC,cAAc;MAAEX,QAAQH,KAAKG;MAAQC,KAAKJ,KAAKI;IAAI,CAAA;AAC/D,UAAMoB,UAAUD,MAAM;MACpBpB,QAAQU,IAAIV;MACZC,KAAKS,IAAIT;MACTY,SAAShB,KAAKgB;IAChB,CAAA;EACF,CAAA;AACFM,UACGzB,QAAQ,0BAAA,EACRF,YAAY,wCAAA,EACZG,OAAO,mBAAmB,wBAAA,EAC1BA,OAAO,iBAAA,EACPA,OAAO,aAAA,EACPC,OAAO,OAAO0B,SAAiBzB,SAAAA;AAC9B,UAAMa,MAAMC,cAAc;MAAEX,QAAQH,KAAKG;MAAQC,KAAKJ,KAAKI;IAAI,CAAA;AAC/D,UAAMsB,cAAcD,SAAS;MAC3BtB,QAAQU,IAAIV;MACZC,KAAKS,IAAIT;MACTY,SAAShB,KAAKgB;IAChB,CAAA;EACF,CAAA;AAGFxB,UACGK,QAAQ,iBAAA,EACRF,YAAY,qDAAqDgC,oBAAoBC,KAAK,IAAA,CAAA,GAAQ,EAClG9B,OAAO,aAAa,yDAAA,EACpBA,OAAO,WAAW,0BAAA,EAClBC,OAAO,OAAO8B,UAAkB7B,SAAAA;AAC/B,QAAI,CAAC2B,oBAAoBG,SAASD,QAAAA,GAA2B;AAC3D,YAAM,IAAIE,MACR,yBAAyBF,QAAAA,mBAA2BF,oBAAoBC,KAAK,IAAA,CAAA,EAAO;IAExF;AACA,UAAMI,aAAa;MACjBH;MACAI,QAAQjC,KAAKiC;MACbC,OAAOlC,KAAKkC;IACd,CAAA;EACF,CAAA;AAGF,QAAMC,SAAS3C,QAAQK,QAAQ,QAAA,EAAUF,YAAY,iBAAA;AACrDwC,SACGtC,QAAQ,MAAA,EACRF,YAAY,qEAAA,EACZG,OAAO,oBAAoB,2BAAA,EAC3BA,OAAO,sBAAsB,gCAAA,EAC7BA,OAAO,mBAAmB,uBAAuB,MAAA,EACjDA,OAAO,iBAAA,EACPA,OAAO,aAAA,EACPA,OAAO,gBAAA,EACPC,OAAO,OAAOC,SAAAA;AACb,UAAMa,MAAMC,cAAc;MACxBX,QAAQH,KAAKG;MACbC,KAAKJ,KAAKI;MACVC,WAAWL,KAAKM;IAClB,CAAA;AACA,UAAM8B,SAAiC,CAAC;AACxC,UAAMC,aAAaC,MAAMC,QAAQvC,KAAKoC,MAAM,IAAIpC,KAAKoC,SAASpC,KAAKoC,SAAS;MAACpC,KAAKoC;QAAU,CAAA;AAC5F,eAAWI,MAAMH,YAAY;AAC3B,YAAM,CAACI,GAAGC,CAAAA,IAAK/B,OAAO6B,EAAAA,EAAIG,MAAM,GAAA;AAChC,UAAIF,KAAKC,EAAGN,QAAOK,CAAAA,IAAKC;IAC1B;AACA,UAAME,aAAa,IAAIC,gBAAAA;AACvB,UAAMC,QAAQ,6BAAA;AACZC,cAAQC,IAAIC,mBAAAA,QAAGC,IAAI,eAAA,CAAA;AACnBN,iBAAWO,MAAK;IAClB,GAHc;AAId3C,YAAQ4C,KAAK,UAAUN,KAAAA;AACvBtC,YAAQ4C,KAAK,WAAWN,KAAAA;AACxB,UAAMO,WAAW;MACflD,QAAQU,IAAIV;MACZC,KAAKS,IAAIT;MACTC,WAAWQ,IAAIR;MACfiD,OAAOC,WAAWvD,KAAKsD,KAAK;MAC5BE,YAAYrC,OAAOnB,KAAKyD,QAAQ,KAAK;MACrCrB;MACAsB,QAAQd,WAAWc;IACrB,CAAA;EACF,CAAA;AAGFlE,UACGK,QAAQ,mBAAA,EACRF,YAAY,2DAAA,EACZgE,eAAe,oBAAoB,wBAAA,EACnCA,eAAe,gBAAgB,sCAAA,EAC/B7D,OAAO,uBAAuB,uBAAuB,YAAA,EACrDA,OAAO,yBAAyB,oCAAA,EAChCA,OAAO,uBAAA,EACPA,OAAO,iBAAA,EACPA,OAAO,aAAA,EACPC,OAAO,OAAOC,SAAAA;AACb,UAAMa,MAAMC,cAAc;MAAEX,QAAQH,KAAKG;MAAQC,KAAKJ,KAAKI;MAAKC,WAAWL,KAAKM;IAAQ,CAAA;AACxF,UAAMsD,SAAS,IAAIC,UAAU;MAAE1D,QAAQU,IAAIV;MAAQC,KAAKS,IAAIT;IAAI,CAAA;AAChE,UAAM0D,iBAAiB;MACrB9C,SAAShB,KAAKgB;MACd+C,KAAK/D,KAAK+D;MACV9C,aAAajB,KAAKiB;MAClB+C,WAAWhE,KAAKgE;MAChBC,WAAWL;IACb,CAAA;EACF,CAAA;AAEFpE,UACGK,QAAQ,gBAAA,EACRF,YAAY,4CAAA,EACZgE,eAAe,iBAAiB,wBAAA,EAChC7D,OAAO,uBAAuB,uBAAuB,YAAA,EACrDA,OAAO,uBAAA,EACPA,OAAO,iBAAA,EACPA,OAAO,aAAA,EACPC,OAAO,OAAOC,SAAAA;AACb,UAAMa,MAAMC,cAAc;MAAEX,QAAQH,KAAKG;MAAQC,KAAKJ,KAAKI;MAAKC,WAAWL,KAAKM;IAAQ,CAAA;AACxF,UAAMsD,SAAS,IAAIC,UAAU;MAAE1D,QAAQU,IAAIV;MAAQC,KAAKS,IAAIT;IAAI,CAAA;AAChE,UAAM8D,cAAc;MAClBxE,MAAMM,KAAKN;MACXuB,aAAajB,KAAKiB;MAClBgD,WAAWL;IACb,CAAA;EACF,CAAA;AAEF,SAAOpE;AACT;AAvLgBD;AAyLhB,eAAsB4E,KAAKC,OAAiB5D,QAAQ4D,MAAI;AACtD,QAAM5E,UAAUD,aAAAA;AAChBC,UAAQ6E,aAAY;AACpB,MAAI;AACF,UAAM7E,QAAQ8E,WAAWF,IAAAA;AACzB,WAAO;EACT,SAASG,KAAK;AACZ,QAAIA,eAAeC,UAAU;AAC3BzB,cAAQ0B,MAAMxB,mBAAAA,QAAGyB,IAAI,cAAcH,IAAII,MAAM,MAAMJ,IAAIK,OAAO,EAAE,CAAA;AAChE,aAAO;IACT;AACA,UAAMC,SAASN;AACf,QAAIM,UAAU,OAAOA,WAAW,YAAY,UAAUA,QAAQ;AAC5D,UAAIA,OAAOC,SAAS,6BAA6BD,OAAOC,SAAS,oBAAqB,QAAO;AAC7F,UAAID,OAAOC,SAAS,iBAAkB,QAAO;IAC/C;AACA/B,YAAQ0B,MAAMxB,mBAAAA,QAAGyB,IAAKH,IAAcK,WAAWjE,OAAO4D,GAAAA,CAAAA,CAAAA;AACtD,WAAO;EACT;AACF;AAnBsBJ;AAuBtB,IAAMY,WAAW,MAAA;AACf,MAAI;AACF,UAAMC,QAAQxE,QAAQ4D,KAAK,CAAA,KAAM;AACjC,WAAO,sDAAsDa,KAAKD,KAAAA;EACpE,QAAQ;AACN,WAAO;EACT;AACF,GAAA;AAEA,IAAID,SAAS;AACXZ,OAAAA,EAAOe,KAAK,CAACJ,SAAStE,QAAQC,KAAKqE,IAAAA,CAAAA;AACrC;","names":["import_picocolors","ApiError","Error","status","message","body","name","ApiClient","apiUrl","key","fetchImpl","maxRetries","retryBaseMs","opts","replace","globalThis","fetch","uploadSourceMaps","version","environment","files","url","encodeURIComponent","form","FormData","f","bytes","toUint8","content","blob","Blob","type","append","filename","request","createRelease","method","attempt","lastErr","res","headers","authorization","txt","safeText","trim","retryAfter","parseRetryAfter","get","wait","Math","pow","sleep","ok","json","data","err","Uint8Array","text","header","n","Number","isFinite","date","Date","parse","max","now","ms","Promise","r","setTimeout","DEFAULT_API_URL","RC_FILENAME","findRcFile","start","dir","resolve","candidate","join","existsSync","parent","dirname","undefined","loadRc","file","data","JSON","parse","readFileSync","resolveConfig","input","env","process","rcFile","rc","cwd","apiUrl","INSTANTTASKS_ENDPOINT","INSTANTTASKS_API_URL","endpoint","replace","key","INSTANTTASKS_INGEST_KEY","INSTANTTASKS_MANAGEMENT_KEY","ingestKey","projectId","INSTANTTASKS_PROJECT_ID","optionalKey","Error","test","slice","import_node_fs","path","uploadSourcemaps","opts","log","s","console","env","environment","root","resolve","dir","maps","walkForMaps","length","pc","yellow","cyan","release","files","absPath","rel","relative","split","sep","join","url","urlPrefix","joinUrl","replace","undefined","content","fs","readFile","push","filename","basename","dim","result","apiClient","uploadSourceMaps","green","version","uploaded","out","entries","readdir","withFileTypes","err","Error","message","entry","full","name","isDirectory","nested","isFile","endsWith","sort","prefix","left","right","import_picocolors","createRelease","opts","log","s","console","env","environment","pc","cyan","name","result","apiClient","green","release","version","id","import_picocolors","doctor","opts","log","s","console","fetchImpl","globalThis","fetch","checks","cfg","resolveConfig","apiUrl","key","projectId","push","name","ok","detail","rcFile","err","message","finish","configUrl","res","method","headers","authorization","status","startsWith","c","mark","pc","green","red","bold","padEnd","dim","yellow","every","import_node_fs","path","import_picocolors","DEFAULT_MAX_BYTES","MAX_RETRIES","RETRY_BASE_MS","sourcemapUpload","opts","log","s","console","fetchImpl","globalThis","fetch","maxBytes","strict","root","resolve","dist","maps","walk","length","pc","yellow","uploaded","failed","skipped","cyan","release","absPath","safe","safeRelative","red","stat","fs","size","content","readFile","ok","postWithRetry","apiUrl","key","path","environment","green","detail","bold","Error","abs","resolvedRoot","resolved","startsWith","sep","rel","relative","isAbsolute","split","join","dir","out","entries","readdir","withFileTypes","entry","isSymbolicLink","full","name","isDirectory","push","isFile","endsWith","sort","body","url","replace","lastDetail","attempt","res","method","headers","authorization","JSON","stringify","status","err","message","Promise","r","setTimeout","Math","pow","import_node_fs","path","import_picocolors","NATIVE_SYMBOLS_PATH","uploadIos","dsymPath","opts","log","s","console","root","resolve","endsWith","pc","yellow","dwarfRoot","join","files","listFiles","length","uploaded","failed","endpointMissing","cyan","uploadAll","uploadAndroid","mappingPath","resolved","stat","fs","catch","isFile","Error","platform","fetchImpl","globalThis","fetch","url","apiUrl","replace","file","content","readFile","body","filename","basename","release","contentBase64","toString","res","method","headers","authorization","key","JSON","stringify","status","ok","green","red","err","message","dir","out","entries","readdir","withFileTypes","entry","isSymbolicLink","full","name","isDirectory","push","import_node_fs","path","import_picocolors","SUPPORTED_PLATFORMS","RC_TEMPLATE","README_SNIPPET","planInit","platform","files","filepath","contents","trim","push","snippetPath","snippetFor","initScaffold","opts","log","s","console","cwd","resolve","process","written","skipped","pc","cyan","bold","f","abs","join","exists","fs","stat","then","catch","dryRun","dim","line","split","force","yellow","mkdir","dirname","recursive","writeFile","green","import_picocolors","eventsTail","opts","log","s","console","fetchImpl","globalThis","fetch","interval","intervalMs","since","Date","now","pc","cyan","signal","aborted","params","URLSearchParams","String","projectId","set","k","v","Object","entries","filter","url","apiUrl","replace","toString","res","method","headers","authorization","key","status","yellow","ok","body","json","rows","Array","isArray","data","row","ts","toISOString","kind","message","dim","bold","padEnd","Math","max","length","err","name","wait","ms","Promise","resolve","t","setTimeout","addEventListener","clearTimeout","parseSince","input","match","n","Number","isFinite","value","parseInt","unit","mult","VERSION","buildProgram","program","Command","name","description","version","command","option","action","opts","result","doctor","apiUrl","key","projectId","project","ok","process","exit","sourcemap","String","dist","cfg","resolveConfig","sourcemapUpload","release","environment","maxBytes","Number","maxSize","strict","symbols","dsym","uploadIos","mapping","uploadAndroid","SUPPORTED_PLATFORMS","join","platform","includes","Error","initScaffold","dryRun","force","events","filter","rawFilters","Array","isArray","kv","k","v","split","controller","AbortController","onSig","console","log","pc","dim","abort","once","eventsTail","since","parseSince","intervalMs","interval","signal","requiredOption","client","ApiClient","uploadSourcemaps","dir","urlPrefix","apiClient","createRelease","main","argv","exitOverride","parseAsync","err","ApiError","error","red","status","message","anyErr","code","isEntry","argv1","test","then"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Builds the commander program. Exported separately so tests can drive it
|
|
5
|
+
* without spawning a child process.
|
|
6
|
+
*/
|
|
7
|
+
declare function buildProgram(): Command;
|
|
8
|
+
declare function main(argv?: string[]): Promise<number>;
|
|
9
|
+
|
|
10
|
+
export { buildProgram, main };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Builds the commander program. Exported separately so tests can drive it
|
|
5
|
+
* without spawning a child process.
|
|
6
|
+
*/
|
|
7
|
+
declare function buildProgram(): Command;
|
|
8
|
+
declare function main(argv?: string[]): Promise<number>;
|
|
9
|
+
|
|
10
|
+
export { buildProgram, main };
|