@timeax/digital-service-engine 0.0.1
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/dist/core/index.cjs +2933 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +507 -0
- package/dist/core/index.d.ts +507 -0
- package/dist/core/index.js +2899 -0
- package/dist/core/index.js.map +1 -0
- package/dist/react/index.cjs +4015 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +1572 -0
- package/dist/react/index.d.ts +1572 -0
- package/dist/react/index.js +3984 -0
- package/dist/react/index.js.map +1 -0
- package/dist/schema/index.cjs +19 -0
- package/dist/schema/index.cjs.map +1 -0
- package/dist/schema/index.d.cts +671 -0
- package/dist/schema/index.d.ts +671 -0
- package/dist/schema/index.js +1 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/workspace/index.cjs +9755 -0
- package/dist/workspace/index.cjs.map +1 -0
- package/dist/workspace/index.d.cts +1995 -0
- package/dist/workspace/index.d.ts +1995 -0
- package/dist/workspace/index.js +9711 -0
- package/dist/workspace/index.js.map +1 -0
- package/package.json +97 -0
- package/schema/editor-snapshot.schema.json +1138 -0
- package/schema/policies.schema.json +148 -0
- package/schema/service-props.schema.json +772 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/react/index.ts","../../src/react/canvas/events.ts","../../src/utils/retry-queue.ts","../../src/react/canvas/comments.ts","../../src/react/canvas/editor.ts","../../src/core/normalise.ts","../../src/utils/index.ts","../../src/core/policy.ts","../../src/utils/util.ts","../../src/react/canvas/selection.ts","../../src/react/canvas/api.ts","../../src/react/inputs/form-context.tsx","../../src/react/inputs/registry.ts","../../src/react/inputs/provider.tsx","../../src/react/inputs/wrapper.tsx"],"sourcesContent":["export * from \"../schema\";\nexport * from \"./canvas/events\";\nexport * from \"./canvas/api\";\nexport * from \"./inputs/form-context\";\nexport * from \"./inputs/registry\";\nexport * from \"./inputs/provider\";\nexport * from \"./inputs/wrapper\";\n","// Lightweight, typed event bus\r\nexport type EventMap = Record<string, unknown>;\r\n\r\nexport class EventBus<E extends EventMap> {\r\n private listeners = new Map<keyof E, Set<(p: any) => void>>();\r\n\r\n on<K extends keyof E>(event: K, handler: (payload: E[K]) => void): () => void {\r\n const set = this.listeners.get(event) ?? new Set();\r\n set.add(handler as any);\r\n this.listeners.set(event, set);\r\n return () => {\r\n set.delete(handler as any);\r\n };\r\n }\r\n\r\n once<K extends keyof E>(event: K, handler: (payload: E[K]) => void): () => void {\r\n const off = this.on(event, (p) => {\r\n off();\r\n handler(p);\r\n });\r\n return off;\r\n }\r\n\r\n emit<K extends keyof E>(event: K, payload: E[K]): void {\r\n const set = this.listeners.get(event);\r\n if (!set || set.size === 0) return;\r\n for (const h of Array.from(set)) try {\r\n (h as any)(payload);\r\n } catch { /* swallow */\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n}","// noinspection JSIgnoredPromiseFromCall\r\n\r\nexport type RetryStatus = 'scheduled' | 'retrying' | 'succeeded' | 'failed' | 'cancelled';\r\n\r\nexport type RetryOptions = {\r\n enabled?: boolean; // default true\r\n maxAttempts?: number; // default 5\r\n baseDelayMs?: number; // default 800\r\n maxDelayMs?: number; // default 20_000\r\n jitter?: boolean; // default true\r\n /** Run the first attempt immediately (no initial delay) */\r\n immediateFirst?: boolean;\r\n};\r\n\r\nexport type RetryJob = {\r\n /** Stable id for de-duplication (e.g., \"comments:create_thread:loc_abc\") */\r\n id: string;\r\n /** Called on each attempt; return true to signal success, false/throw to retry */\r\n perform: (attempt: number) => Promise<boolean>;\r\n onStatus?: (status: RetryStatus, meta?: { attempt: number; nextDelayMs?: number; error?: unknown }) => void;\r\n};\r\n\r\nexport class RetryQueue {\r\n private readonly opts: Required<RetryOptions>;\r\n private jobs = new Map<string, { job: RetryJob; attempt: number; timer?: any; cancelled?: boolean }>();\r\n private paused = false;\r\n\r\n constructor(opts: RetryOptions = {}) {\r\n this.opts = {\r\n enabled: opts.enabled ?? true,\r\n maxAttempts: opts.maxAttempts ?? 5,\r\n baseDelayMs: opts.baseDelayMs ?? 800,\r\n maxDelayMs: opts.maxDelayMs ?? 20_000,\r\n jitter: opts.jitter ?? true,\r\n immediateFirst: opts.immediateFirst ?? false,\r\n };\r\n }\r\n\r\n pause() {\r\n this.paused = true;\r\n }\r\n\r\n resume() {\r\n this.paused = false;\r\n this.flush();\r\n }\r\n\r\n /** Enqueue or no-op if a job with same id already exists */\r\n enqueue(job: RetryJob): boolean {\r\n if (!this.opts.enabled) return false;\r\n if (this.jobs.has(job.id)) return false;\r\n this.jobs.set(job.id, {job, attempt: 0});\r\n job.onStatus?.('scheduled', {attempt: 0});\r\n this.kick(job.id);\r\n return true;\r\n }\r\n\r\n /** Force retry now (resets backoff); returns false if not found */\r\n triggerNow(id: string): boolean {\r\n const rec = this.jobs.get(id);\r\n if (!rec) return false;\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.timer = undefined;\r\n this.kick(id, true);\r\n return true;\r\n }\r\n\r\n cancel(id: string): boolean {\r\n const rec = this.jobs.get(id);\r\n if (!rec) return false;\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.cancelled = true;\r\n rec.job.onStatus?.('cancelled', {attempt: rec.attempt});\r\n this.jobs.delete(id);\r\n return true;\r\n }\r\n\r\n pendingIds(): string[] {\r\n return Array.from(this.jobs.keys());\r\n }\r\n\r\n size(): number {\r\n return this.jobs.size;\r\n }\r\n\r\n isQueued(id: string): boolean {\r\n return this.jobs.has(id);\r\n }\r\n\r\n drain(): void {\r\n for (const [id, rec] of this.jobs.entries()) {\r\n if (rec.timer) clearTimeout(rec.timer);\r\n rec.cancelled = true;\r\n rec.job.onStatus?.('cancelled', {attempt: rec.attempt});\r\n this.jobs.delete(id);\r\n }\r\n }\r\n\r\n private flush() {\r\n for (const id of this.jobs.keys()) this.kick(id);\r\n }\r\n\r\n private delayFor(attempt: number): number {\r\n const {baseDelayMs, maxDelayMs, jitter} = this.opts;\r\n const exp = Math.min(maxDelayMs, baseDelayMs * Math.pow(2, Math.max(0, attempt - 1)));\r\n if (!jitter) return exp;\r\n const r = Math.random() * 0.4 + 0.8; // 0.8x .. 1.2x\r\n return Math.min(maxDelayMs, Math.floor(exp * r));\r\n }\r\n\r\n private async kick(id: string, immediate = false) {\r\n const rec = this.jobs.get(id);\r\n if (!rec || rec.cancelled) return;\r\n\r\n if (this.paused && !immediate) return;\r\n\r\n const attempt = rec.attempt + 1;\r\n const run = async () => {\r\n if (rec.cancelled) return;\r\n rec.job.onStatus?.('retrying', {attempt});\r\n try {\r\n const ok = await rec.job.perform(attempt);\r\n if (ok) {\r\n rec.job.onStatus?.('succeeded', {attempt});\r\n this.jobs.delete(id);\r\n return;\r\n }\r\n } catch (err) {\r\n // fallthrough to schedule next\r\n rec.job.onStatus?.('failed', {attempt, error: err});\r\n }\r\n\r\n if (attempt >= this.opts.maxAttempts) {\r\n rec.job.onStatus?.('failed', {attempt});\r\n this.jobs.delete(id);\r\n return;\r\n }\r\n\r\n rec.attempt = attempt;\r\n const delay = this.delayFor(attempt);\r\n rec.job.onStatus?.('scheduled', {attempt, nextDelayMs: delay});\r\n rec.timer = setTimeout(() => this.kick(id), delay);\r\n };\r\n\r\n if (immediate) await run();\r\n else {\r\n // First attempt: respect immediateFirst option; otherwise, schedule immediately\r\n const delay = this.opts.immediateFirst && attempt === 1 ? 0 : this.delayFor(attempt);\r\n\r\n if (delay) {\r\n rec.job.onStatus?.('scheduled', {attempt: 0, nextDelayMs: delay});\r\n rec.timer = setTimeout(run, delay);\r\n } else {\r\n void run();\r\n }\r\n }\r\n }\r\n}","// src/react/canvas/comments.ts\nimport type { EventBus } from \"@/react\";\nimport type { CanvasEvents } from \"@/schema/canvas-types\";\nimport type {\n CommentsBackend,\n BackendError,\n BackendScope,\n} from \"../workspace/context/backend\";\nimport {\n RetryQueue,\n type RetryOptions as RetryOpts,\n} from \"../../utils/retry-queue\";\nimport {\n CommentAnchor,\n CommentId,\n CommentMessage,\n CommentThread,\n ThreadId,\n} from \"@/schema/comments\";\n\nlet __seq = 0;\nconst newLocalId = (p = \"loc\"): string =>\n `${p}_${Date.now().toString(36)}_${(++__seq).toString(36)}`;\n\ntype SyncState = \"pending\" | \"synced\" | \"error\";\ntype SyncThread = CommentThread & { _sync?: SyncState };\n\ntype CommentsDeps = {\n backend?: CommentsBackend<CommentThread, CommentMessage, CommentAnchor>;\n getScope?: () => BackendScope | undefined;\n retry?: RetryOpts;\n};\n\nexport class CommentsAPI {\n private threads = new Map<ThreadId, SyncThread>();\n private bus: EventBus<CanvasEvents>;\n private deps: CommentsDeps;\n private retry: RetryQueue;\n\n constructor(bus: EventBus<CanvasEvents>, deps: CommentsDeps = {}) {\n this.bus = bus;\n this.deps = deps;\n this.retry = new RetryQueue(deps.retry);\n }\n\n private scope(): BackendScope | undefined {\n return this.deps.getScope?.();\n }\n\n private emitSync(\n op: CanvasEvents[\"comment:sync\"][\"op\"],\n threadId: string,\n messageId: string | undefined,\n status: CanvasEvents[\"comment:sync\"][\"status\"],\n meta: {\n attempt: number;\n nextDelayMs?: number;\n error?: BackendError | unknown;\n },\n ): void {\n this.bus.emit(\"comment:sync\", {\n op,\n threadId,\n messageId,\n status,\n attempt: meta.attempt,\n nextDelayMs: meta.nextDelayMs,\n error: meta.error,\n });\n }\n\n /* ─── Persistence bridge ───────────────────────────── */\n\n async loadAll(): Promise<void> {\n if (!this.deps.backend) return;\n\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend.listThreads(scope);\n\n if (!res.ok) {\n this.bus.emit(\"error\", {\n message: res.error.message,\n code: res.error.code,\n meta: res.error.meta,\n });\n return;\n }\n\n this.threads.clear();\n for (const th of res.value) {\n this.threads.set(th.id, { ...(th as CommentThread), _sync: \"synced\" });\n }\n\n // signal refresh (kept as-is)\n this.bus.emit(\"comment:thread:update\", { thread: undefined as any });\n }\n\n /* ─── Query ─────────────────────────────────────────── */\n\n list(): CommentThread[] {\n return Array.from(this.threads.values())\n .sort((a, b) => a.createdAt - b.createdAt)\n .map((t) => t as CommentThread);\n }\n\n get(id: ThreadId): CommentThread | undefined {\n return this.threads.get(id) as CommentThread | undefined;\n }\n\n /* ─── Mutations (optimistic if backend present) ─────── */\n\n async create(\n anchor: CommentAnchor,\n initialBody: string,\n meta?: Record<string, unknown>,\n ): Promise<ThreadId> {\n const now = Date.now();\n const localId = newLocalId(\"t\");\n const msgId = newLocalId(\"m\");\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n\n const local: SyncThread = {\n id: localId,\n anchor,\n resolved: false,\n createdAt: now,\n updatedAt: now,\n messages: [{ id: msgId, body: initialBody, createdAt: now }],\n meta,\n _sync: hasBackend ? \"pending\" : \"synced\",\n };\n\n this.threads.set(localId, local);\n this.bus.emit(\"comment:thread:create\", { thread: local as any });\n\n if (!this.deps.backend) return localId;\n\n const performOnce = async (): Promise<ThreadId> => {\n const scope = this.scope();\n if (!scope) return localId;\n\n const res = await this.deps.backend!.createThread(scope, {\n anchor,\n body: initialBody,\n meta,\n });\n\n if (!res.ok) throw res.error;\n\n // Swap local→server on success (kept behavior)\n this.threads.delete(localId);\n\n const serverTh: SyncThread = {\n ...(res.value as CommentThread),\n _sync: \"synced\",\n };\n\n this.threads.set(serverTh.id, serverTh);\n this.bus.emit(\"comment:thread:update\", { thread: serverTh as any });\n\n return serverTh.id;\n };\n\n try {\n const serverId = await performOnce();\n return serverId;\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:create_thread:${branchKey}:${localId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"create_thread\",\n localId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n local._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Create failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: local as any });\n\n return localId;\n }\n }\n\n async reply(\n threadId: ThreadId,\n body: string,\n meta?: Record<string, unknown>,\n ): Promise<CommentId> {\n const th = this.ensure(threadId);\n const now = Date.now();\n const localMid = newLocalId(\"m\");\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n\n const localMsg: CommentMessage = {\n id: localMid,\n body,\n createdAt: now,\n meta,\n };\n\n th.messages.push(localMsg);\n th.updatedAt = now;\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:message:create\", {\n threadId,\n message: localMsg as any,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return localMid;\n\n const performOnce = async (): Promise<CommentId> => {\n const scope = this.scope();\n if (!scope) return localMid;\n\n const res = await this.deps.backend!.addMessage(scope, {\n threadId: th.id,\n body,\n meta,\n });\n\n if (!res.ok) throw res.error;\n\n const serverMsg = res.value as CommentMessage;\n const idx = th.messages.findIndex((m) => m.id === localMid);\n if (idx >= 0) th.messages[idx] = serverMsg;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n return serverMsg.id;\n };\n\n try {\n const serverMid = await performOnce();\n return serverMid;\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:add_message:${branchKey}:${threadId}:${localMid}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"add_message\",\n threadId,\n localMid,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Reply failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n return localMid;\n }\n }\n\n async editMessage(\n threadId: ThreadId,\n messageId: CommentId,\n body: string,\n ): Promise<void> {\n const th = this.ensure(threadId);\n const orig = th.messages.find((m) => m.id === messageId);\n if (!orig) return;\n\n const previous = { ...orig };\n orig.body = body;\n orig.editedAt = Date.now();\n th.updatedAt = orig.editedAt;\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.editMessage(scope, {\n threadId: th.id,\n messageId,\n body,\n });\n\n if (!res.ok) throw res.error;\n\n const idx = th.messages.findIndex((m) => m.id === messageId);\n if (idx >= 0) th.messages[idx] = res.value as CommentMessage;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:edit_message:${branchKey}:${threadId}:${messageId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"edit_message\",\n threadId,\n messageId,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n const idx = th.messages.findIndex((m) => m.id === messageId);\n if (idx >= 0) th.messages[idx] = previous;\n\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Edit failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async deleteMessage(\n threadId: ThreadId,\n messageId: CommentId,\n ): Promise<void> {\n const th = this.ensure(threadId);\n const backup = [...th.messages];\n\n th.messages = th.messages.filter((m) => m.id !== messageId);\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.deleteMessage(scope, {\n threadId: th.id,\n messageId,\n });\n\n if (!res.ok) throw res.error;\n\n th._sync = \"synced\";\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:delete_message:${branchKey}:${threadId}:${messageId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"delete_message\",\n threadId,\n messageId,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.messages = backup;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Delete failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async move(threadId: ThreadId, anchor: CommentAnchor): Promise<void> {\n const th = this.ensure(threadId);\n const prev = th.anchor;\n\n th.anchor = anchor;\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:move\", { thread: th as any });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.moveThread(scope, {\n threadId: th.id,\n anchor,\n });\n\n if (!res.ok) throw res.error;\n\n this.threads.set(th.id, { ...(res.value as CommentThread), _sync: \"synced\" });\n this.bus.emit(\"comment:thread:update\", {\n thread: this.threads.get(threadId)! as any,\n });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:move_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"move_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.anchor = prev;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Move failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async resolve(threadId: ThreadId, value = true): Promise<void> {\n const th = this.ensure(threadId);\n const prev = th.resolved;\n\n th.resolved = value;\n th.updatedAt = Date.now();\n\n const hasBackend = Boolean(this.deps.backend && this.scope());\n th._sync ??= hasBackend ? \"pending\" : \"synced\";\n\n this.bus.emit(\"comment:resolve\", { thread: th as any, resolved: value });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.resolveThread(scope, {\n threadId: th.id,\n resolved: value,\n });\n\n if (!res.ok) throw res.error;\n\n this.threads.set(th.id, { ...(res.value as CommentThread), _sync: \"synced\" });\n this.bus.emit(\"comment:thread:update\", {\n thread: this.threads.get(threadId)! as any,\n });\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:resolve_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"resolve_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n th.resolved = prev;\n th._sync = \"error\";\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Resolve failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: th as any });\n }\n }\n\n async deleteThread(threadId: ThreadId): Promise<void> {\n const prev = this.threads.get(threadId);\n if (!prev) return;\n\n this.threads.delete(threadId);\n this.bus.emit(\"comment:thread:delete\", { threadId });\n\n if (!this.deps.backend) return;\n\n const performOnce = async (): Promise<void> => {\n const scope = this.scope();\n if (!scope) return;\n\n const res = await this.deps.backend!.deleteThread(scope, { threadId });\n if (!res.ok) throw res.error;\n };\n\n try {\n await performOnce();\n } catch (err) {\n const scope = this.scope();\n const branchKey = scope?.branchId ?? \"no_branch\";\n const jobId = `comments:delete_thread:${branchKey}:${threadId}`;\n\n this.retry.enqueue({\n id: jobId,\n perform: async () => {\n try {\n await performOnce();\n return true;\n } catch {\n return false;\n }\n },\n onStatus: (status, meta2) =>\n this.emitSync(\n \"delete_thread\",\n threadId,\n undefined,\n status,\n meta2 ?? { attempt: 0 },\n ),\n });\n\n // rollback deletion so user can retry\n this.threads.set(threadId, prev);\n this.bus.emit(\"error\", {\n message: (err as BackendError)?.message ?? \"Delete thread failed\",\n code: (err as BackendError)?.code,\n meta: err,\n });\n this.bus.emit(\"comment:thread:update\", { thread: prev as any });\n }\n }\n\n // Optional helpers for UI controls\n retryJob(jobId: string): boolean {\n return this.retry.triggerNow(jobId);\n }\n\n cancelJob(jobId: string): boolean {\n return this.retry.cancel(jobId);\n }\n\n pendingJobs(): string[] {\n return this.retry.pendingIds();\n }\n\n /* ─── internal ────────────────────────────────────────── */\n private ensure(threadId: ThreadId): SyncThread {\n const th = this.threads.get(threadId);\n if (!th) throw new Error(`Comment thread not found: ${threadId}`);\n return th;\n }\n}","import { cloneDeep } from \"lodash-es\";\nimport type { Builder } from \"@/core\";\nimport { normalise } from \"@/core\";\nimport type {\n Command,\n DgpServiceCapability,\n DgpServiceMap,\n DynamicRule,\n EditorEvents,\n EditorOptions,\n EditorSnapshot,\n FallbackSettings,\n Field,\n ServiceProps,\n Tag,\n} from \"@/schema\";\nimport type { CanvasAPI } from \"./api\";\nimport { compilePolicies, type PolicyDiagnostic } from \"@/core/policy\";\nimport { constraintFitOk, rateOk, toFiniteNumber } from \"@/utils/util\";\n\nconst MAX_LIMIT = 100;\ntype WireKind = \"bind\" | \"include\" | \"exclude\" | \"service\";\n\n// Addressing nodes\nexport type TagRef = { kind: \"tag\"; id: string };\nexport type FieldRef = { kind: \"field\"; id: string };\nexport type OptionRef = { kind: \"option\"; fieldId: string; id: string };\nexport type NodeRef = TagRef | FieldRef | OptionRef;\n\nexport type DuplicateOptions = {\n // tags\n withChildren?: boolean; // default false\n // fields\n copyBindings?: boolean; // default true\n copyIncludesExcludes?: boolean; // default false\n copyOptionMaps?: boolean; // default false\n // all\n id?: string; // force an id instead of auto\n labelStrategy?: (old: string) => string; // override default \"Label (copy)\" logic\n nameStrategy?: (old?: string) => string | undefined; // for fields; default suffix \"_copy\"\n optionIdStrategy?: (old: string) => string; // for options; default add \"_copy\"\n};\n\nconst isTagId = (id: string) => id.startsWith(\"t:\");\nconst isFieldId = (id: string) => id.startsWith(\"f:\");\nconst isOptionId = (id: string) => id.startsWith(\"o:\");\n\n// owner lookup (linear, OK for editor; index if you want later)\nfunction ownerOfOption(\n props: ServiceProps,\n optionId: string,\n): { fieldId: string; index: number } | null {\n for (const f of props.fields ?? []) {\n const idx = (f.options ?? []).findIndex((o) => o.id === optionId);\n if (idx >= 0) return { fieldId: f.id, index: idx };\n }\n return null;\n}\n\nfunction ensureServiceExists(opts: EditorOptions, id: any) {\n if (typeof opts.serviceExists === \"function\") {\n if (!opts.serviceExists(id))\n throw new Error(`service_not_found:${String(id)}`);\n return;\n }\n if (opts.serviceMap) {\n if (!Object.prototype.hasOwnProperty.call(opts.serviceMap, id as any)) {\n throw new Error(`service_not_found:${String(id)}`);\n }\n return;\n }\n // Host didn't provide a way to verify — fail so they wire one.\n throw new Error(\"service_checker_missing\");\n}\n\nexport class Editor {\n private builder: Builder;\n private api: CanvasAPI;\n private readonly opts: Required<EditorOptions>;\n private history: EditorSnapshot[] = [];\n private index = -1; // points to current snapshot\n private txnDepth = 0;\n private txnLabel?: string;\n private stagedBefore?: EditorSnapshot;\n private _lastPolicyDiagnostics?: PolicyDiagnostic[];\n constructor(builder: Builder, api: CanvasAPI, opts: EditorOptions = {}) {\n this.builder = builder;\n this.api = api;\n // @ts-ignore\n this.opts = {\n historyLimit: Math.max(\n 1,\n Math.min(opts.historyLimit ?? MAX_LIMIT, 1000),\n ),\n validateAfterEach: opts.validateAfterEach ?? false,\n };\n // seed initial snapshot\n this.pushHistory(this.makeSnapshot(\"init\"));\n }\n\n /* ───────────────────────── Public API ───────────────────────── */\n\n getProps(): ServiceProps {\n return this.builder.getProps();\n }\n\n transact(label: string, fn: () => void): void {\n const wasTop = this.txnDepth === 0;\n let ok = false;\n if (wasTop) {\n this.txnLabel = label;\n this.stagedBefore = this.makeSnapshot(label + \":before\");\n }\n this.txnDepth++;\n try {\n fn();\n ok = true;\n } finally {\n this.txnDepth--;\n if (wasTop) {\n if (ok) {\n this.commit(label); // push one history entry\n } else if (this.stagedBefore) {\n this.loadSnapshot(this.stagedBefore, \"undo\"); // rollback to pre-txn state\n }\n this.txnLabel = undefined;\n this.stagedBefore = undefined;\n }\n }\n }\n\n exec(cmd: Command): void {\n try {\n const before = this.makeSnapshot(cmd.name + \":before\");\n cmd.do();\n this.afterMutation(cmd.name, before);\n } catch (err) {\n this.emit(\"editor:error\", {\n message: (err as Error)?.message ?? String(err),\n code: \"command\",\n });\n throw err;\n }\n }\n\n undo(): boolean {\n if (this.index <= 0) return false;\n this.index--;\n this.loadSnapshot(this.history[this.index], \"undo\");\n this.emit(\"editor:undo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n redo(): boolean {\n if (this.index >= this.history.length - 1) return false;\n this.index++;\n this.loadSnapshot(this.history[this.index], \"redo\");\n this.emit(\"editor:redo\", {\n stackSize: this.history.length,\n index: this.index,\n });\n return true;\n }\n\n clearService(id: string) {\n this.setService(id, { service_id: undefined });\n }\n\n /* ───────────── Convenience editing ops (command-wrapped) ───────────── */\n duplicate(ref: NodeRef, opts: DuplicateOptions = {}): string {\n const snapBefore = this.makeSnapshot(\"duplicate:before\");\n try {\n let newId = \"\";\n this.transact(\"duplicate\", () => {\n if (ref.kind === \"tag\") {\n newId = this.duplicateTag(ref.id, opts);\n } else if (ref.kind === \"field\") {\n newId = this.duplicateField(ref.id, opts);\n } else {\n newId = this.duplicateOption(ref.fieldId, ref.id, opts);\n }\n });\n return newId;\n } catch (err) {\n // rollback to be safe\n this.loadSnapshot(snapBefore, \"undo\");\n throw err;\n }\n }\n\n /**\n * Update the display label for a node and refresh the graph so node labels stay in sync.\n * Supports: tag (\"t:*\"), field (\"f:*\"), option (\"o:*\").\n * IDs are NOT changed; only the human-readable label.\n */\n reLabel(id: string, nextLabel: string): void {\n const label = String(nextLabel ?? \"\").trim();\n\n this.exec({\n name: \"reLabel\",\n do: () =>\n this.patchProps((p) => {\n // Tag\n if (isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (!t) return;\n if ((t.label ?? \"\") === label) return;\n t.label = label;\n // graph nodes mirror builder, so rebuild\n this.api.refreshGraph();\n return;\n }\n\n // Option (find owner field → option)\n if (isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (!o) return;\n if ((o.label ?? \"\") === label) return;\n o.label = label;\n this.api.refreshGraph();\n return;\n }\n\n // Field (default)\n const fld = (p.fields ?? []).find((x) => x.id === id);\n if (!fld) return;\n if ((fld.label ?? \"\") === label) return;\n fld.label = label;\n this.api.refreshGraph();\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /**\n * Assign or change a field's `name`. Only allowed when the field (and its options) have NO service mapping.\n * - If `nextName` is empty/blank → removes the `name`.\n * - Emits an error if the field or any of its options carry a `service_id`.\n * - Emits an error if `nextName` collides with an existing field's name (case-sensitive).\n */\n setFieldName(fieldId: string, nextName: string | null | undefined): void {\n const raw = typeof nextName === \"string\" ? nextName : \"\";\n const name = raw.trim();\n\n this.exec({\n name: \"setFieldName\",\n do: () =>\n this.patchProps((p) => {\n const fields = p.fields ?? [];\n const f = fields.find((x) => x.id === fieldId);\n if (!f) {\n this.api.emit(\"error\", {\n code: \"field_not_found\",\n message: `Field not found: ${fieldId}`,\n meta: { fieldId },\n });\n return;\n }\n\n // Disallow if the field itself maps to a service\n const fieldHasService =\n typeof (f as any).service_id === \"number\";\n\n // Disallow if any option maps to a service\n const optionHasService = Array.isArray(f.options)\n ? f.options.some(\n (o) => typeof (o as any).service_id === \"number\",\n )\n : false;\n\n if (fieldHasService || optionHasService) {\n this.api.emit(\"error\", {\n code: \"field_has_service_mapping\",\n message:\n \"Cannot set a name on a field that maps to a service (either the field or one of its options has a service_id).\",\n meta: {\n fieldId,\n fieldHasService,\n optionHasService,\n },\n });\n return;\n }\n\n // If clearing, remove the key to keep payload lean\n if (name.length === 0) {\n if (\"name\" in f) delete (f as any).name;\n return;\n }\n\n // Prevent name collisions with other fields\n const collision = fields.find(\n (x) => x.id !== fieldId && (x.name ?? \"\") === name,\n );\n if (collision) {\n this.api.emit(\"error\", {\n code: \"field_name_collision\",\n message: `Another field already uses the name \"${name}\".`,\n meta: { fieldId, otherFieldId: collision.id },\n });\n return;\n }\n\n // Assign\n (f as any).name = name;\n }),\n undo: () => this.api.undo(),\n });\n }\n getLastPolicyDiagnostics(): PolicyDiagnostic[] | undefined {\n return this._lastPolicyDiagnostics;\n }\n /* ───────────────────── Internals: duplicate impls ───────────────────── */\n\n private duplicateTag(tagId: string, opts: DuplicateOptions): string {\n const props = this.builder.getProps();\n const tags = props.filters ?? [];\n const src = tags.find((t) => t.id === tagId);\n if (!src) throw new Error(`Tag not found: ${tagId}`);\n\n // generate new id + label\n const id = opts.id ?? this.uniqueId(src.id);\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\n\n if (!opts.withChildren) {\n // shallow copy\n this.patchProps((p) => {\n const clone = { ...src, id, label };\n // keep same parent\n clone.bind_id = src.bind_id;\n // includes/excludes are field ids—copy them as-is\n clone.constraints_overrides = undefined;\n clone.constraints_origin = undefined;\n // insert after original among siblings: we can rebuild array with splice\n const arr = p.filters ?? [];\n const idx = arr.findIndex((t) => t.id === tagId);\n arr.splice(idx + 1, 0, clone);\n p.filters = arr;\n });\n return id;\n }\n\n // deep clone subtree: map oldTagId -> newTagId\n const idMap = new Map<string, string>();\n const collect = (t: typeof src, acc: (typeof src)[]) => {\n acc.push(t);\n for (const child of tags.filter((x) => x.bind_id === t.id))\n collect(child as any, acc);\n };\n const subtree: (typeof src)[] = [];\n collect(src, subtree);\n\n // allocate ids\n for (const n of subtree)\n idMap.set(n.id, n.id === src.id ? id : this.uniqueId(n.id));\n\n // build clones\n const clones = subtree.map((n) => {\n const cloned = { ...n };\n cloned.id = idMap.get(n.id)!;\n cloned.label =\n n.id === src.id\n ? label\n : (opts.labelStrategy ?? nextCopyLabel)(n.label ?? n.id);\n\n // rewire parent if parent is in subtree\n cloned.bind_id = n.bind_id\n ? (idMap.get(n.bind_id) ?? n.bind_id)\n : undefined;\n\n // scrub derived meta (will be re-created by normalise)\n cloned.constraints_origin = undefined;\n cloned.constraints_overrides = undefined;\n return cloned;\n });\n\n this.patchProps((p) => {\n const arr = p.filters ?? [];\n // insert root clone after original\n const rootIdx = arr.findIndex((t) => t.id === tagId);\n arr.splice(rootIdx + 1, 0, clones[0] as any);\n // append other clones (order: parent before children to keep grouping stable)\n for (const c of clones.slice(1)) arr.push(c as any);\n p.filters = arr;\n });\n\n return id;\n }\n\n private duplicateField(fieldId: string, opts: DuplicateOptions): string {\n const props = this.builder.getProps();\n const fields = props.fields ?? [];\n const src = fields.find((f) => f.id === fieldId);\n if (!src) throw new Error(`Field not found: ${fieldId}`);\n\n const id = opts.id ?? this.uniqueId(src.id);\n const label = (opts.labelStrategy ?? nextCopyLabel)(src.label ?? id);\n const name = opts.nameStrategy\n ? opts.nameStrategy(src.name)\n : nextCopyName(src.name);\n\n // helper to create new option ids\n const optId = (old: string) =>\n this.uniqueOptionId(\n id,\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(old),\n );\n\n // deep copy options with new ids\n const clonedOptions = (src.options ?? []).map((o) => ({\n ...o,\n id: optId(o.id),\n label: (opts.labelStrategy ?? nextCopyLabel)(o.label ?? o.id),\n }));\n\n const cloned = {\n ...src,\n id,\n label,\n name,\n bind_id: (opts.copyBindings ?? true) ? src.bind_id : undefined,\n options: clonedOptions,\n } as typeof src;\n\n // map: oldOptId -> newOptId (only if options exist)\n const optionIdMap = new Map<string, string>();\n (src.options ?? []).forEach((o, i) => {\n const newOptId = clonedOptions[i]?.id ?? o.id;\n optionIdMap.set(o.id, newOptId);\n });\n\n this.patchProps((p) => {\n // insert clone after original\n const arr = p.fields ?? [];\n const idx = arr.findIndex((f) => f.id === fieldId);\n arr.splice(idx + 1, 0, cloned as any);\n p.fields = arr;\n\n // copy tag-level includes/excludes (field ids)\n if (opts.copyIncludesExcludes) {\n for (const t of p.filters ?? []) {\n if (t.includes?.includes(fieldId)) {\n const s = new Set(t.includes);\n s.add(id);\n t.includes = Array.from(s);\n }\n if (t.excludes?.includes(fieldId)) {\n const s = new Set(t.excludes);\n s.add(id);\n t.excludes = Array.from(s);\n }\n }\n }\n\n // copy button maps (keys are only field ids OR option ids)\n if (opts.copyOptionMaps) {\n const maps: Array<\n \"includes_for_buttons\" | \"excludes_for_buttons\"\n > = [\"includes_for_buttons\", \"excludes_for_buttons\"];\n\n for (const mapKey of maps) {\n const srcMap = (p as any)[mapKey] ?? {};\n const nextMap: Record<string, string[]> = { ...srcMap };\n\n for (const [key, targets] of Object.entries(\n srcMap as Record<string, string[]>,\n )) {\n // A) non-option button: key === original field id → duplicate under new field id\n if (key === fieldId) {\n const newKey = id;\n const merged = new Set([\n ...(nextMap[newKey] ?? []),\n ...targets,\n ]);\n nextMap[newKey] = Array.from(merged);\n continue;\n }\n\n // B) option button: key === one of the original option ids → duplicate under new option id\n if (optionIdMap.has(key)) {\n const newKey = optionIdMap.get(key)!;\n const merged = new Set([\n ...(nextMap[newKey] ?? []),\n ...targets,\n ]);\n nextMap[newKey] = Array.from(merged);\n }\n }\n\n (p as any)[mapKey] = nextMap;\n }\n }\n });\n\n return id;\n }\n\n private duplicateOption(\n fieldId: string,\n optionId: string,\n opts: DuplicateOptions,\n ): string {\n const props = this.builder.getProps();\n const fields = props.fields ?? [];\n const f = fields.find((x) => x.id === fieldId);\n if (!f) throw new Error(`Field not found: ${fieldId}`);\n const optIdx = (f.options ?? []).findIndex((o) => o.id === optionId);\n if (optIdx < 0)\n throw new Error(`Option not found: ${fieldId}::${optionId}`);\n const src = (f.options ?? [])[optIdx];\n\n const newId = this.uniqueOptionId(\n fieldId,\n (opts.optionIdStrategy ?? defaultOptionIdStrategy)(src.id),\n );\n const newLabel = (opts.labelStrategy ?? nextCopyLabel)(\n src.label ?? src.id,\n );\n\n this.patchProps((p) => {\n const fld = (p.fields ?? []).find((x) => x.id === fieldId)!;\n const arr = fld.options ?? [];\n const clone = { ...src, id: newId, label: newLabel };\n arr.splice(optIdx + 1, 0, clone);\n fld.options = arr;\n\n // Option-level maps are NOT copied by default (safer)\n if (opts.copyOptionMaps) {\n const oldKey = `${fieldId}::${optionId}`;\n const newKey = `${fieldId}::${newId}`;\n for (const mapKey of [\n \"includes_for_buttons\",\n \"excludes_for_buttons\",\n ] as const) {\n const m = p[mapKey] ?? {};\n if (m[oldKey]) {\n m[newKey] = Array.from(new Set(m[oldKey]));\n p[mapKey] = m as any;\n }\n }\n }\n });\n\n return newId;\n }\n\n /* ───────────────────── Helpers: uniqueness & naming ───────────────────── */\n\n private uniqueId(base: string): string {\n const props = this.builder.getProps();\n const taken = new Set<string>([\n ...(props.filters ?? []).map((t) => t.id),\n ...(props.fields ?? []).map((f) => f.id),\n ]);\n let candidate = nextCopyId(base);\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\n return candidate;\n }\n\n private uniqueOptionId(fieldId: string, base: string): string {\n const props = this.builder.getProps();\n const fld = (props.fields ?? []).find((f) => f.id === fieldId);\n const taken = new Set((fld?.options ?? []).map((o) => o.id));\n let candidate = base;\n if (taken.has(candidate)) candidate = nextCopyId(candidate);\n while (taken.has(candidate)) candidate = bumpSuffix(candidate);\n return candidate;\n }\n\n //---------\n\n /**\n * Reorder a node:\n * - Tag: among its siblings (same bind_id) inside filters[]\n * - Field: inside order_for_tags[scopeTagId] (you must pass scopeTagId)\n * - Option: use placeOption() instead\n */\n placeNode(\n id: string,\n opts: {\n scopeTagId?: string;\n beforeId?: string;\n afterId?: string;\n index?: number;\n },\n ) {\n if (isTagId(id)) {\n // … your existing tag sibling reorder logic …\n this.exec({\n name: \"placeTag\",\n do: () =>\n this.patchProps((p) => {\n const all = p.filters ?? [];\n const cur = all.find((t) => t.id === id);\n if (!cur) return;\n const groupKey = cur.bind_id ?? \"__root__\";\n const siblings = all.filter(\n (t) => (t.bind_id ?? \"__root__\") === groupKey,\n );\n\n const curIdx = siblings.findIndex((t) => t.id === id);\n if (curIdx < 0) return;\n const pulled = siblings.splice(curIdx, 1)[0];\n\n let dest =\n typeof opts.index === \"number\"\n ? opts.index\n : undefined;\n if (opts.beforeId)\n dest = Math.max(\n 0,\n siblings.findIndex(\n (t) => t.id === opts.beforeId,\n ),\n );\n if (opts.afterId)\n dest = Math.min(\n siblings.length,\n siblings.findIndex(\n (t) => t.id === opts.afterId,\n ) + 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = siblings.length;\n\n // stitch back: leave other groups untouched, replace this group in order\n const out: Tag[] = [];\n for (const t of all) {\n const sameGroup =\n (t.bind_id ?? \"__root__\") === groupKey;\n if (!sameGroup) {\n out.push(t);\n }\n // if (!used.has(t.id) && t.id !== id) continue; // skip old group entries\n }\n siblings.splice(dest, 0, pulled);\n p.filters = [...out, ...siblings];\n }),\n undo: () => this.api.undo(),\n });\n } else if (isFieldId(id)) {\n if (!opts.scopeTagId)\n throw new Error(\"placeNode(field): scopeTagId is required\");\n const fieldId = id;\n const tagId = opts.scopeTagId;\n\n this.exec({\n name: \"placeField\",\n do: () =>\n this.patchProps((p) => {\n const map = (p.order_for_tags ??= {});\n const arr = (map[tagId] ??= []);\n const curIdx = arr.indexOf(fieldId);\n if (curIdx >= 0) arr.splice(curIdx, 1);\n\n let dest =\n typeof opts.index === \"number\"\n ? opts.index\n : undefined;\n if (opts.beforeId)\n dest = Math.max(0, arr.indexOf(opts.beforeId));\n if (opts.afterId)\n dest = Math.min(\n arr.length,\n arr.indexOf(opts.afterId) + 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = arr.length;\n\n arr.splice(dest, 0, fieldId);\n }),\n undo: () => this.api.undo(),\n });\n } else if (isOptionId(id)) {\n // defer to placeOption for options\n this.placeOption(id, opts);\n } else {\n throw new Error(\"placeNode: unknown id prefix\");\n }\n }\n\n placeOption(\n optionId: string,\n opts: { beforeId?: string; afterId?: string; index?: number },\n ) {\n if (!isOptionId(optionId))\n throw new Error('placeOption: optionId must start with \"o:\"');\n\n this.exec({\n name: \"placeOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n\n const curIdx = f.options.findIndex(\n (o) => o.id === optionId,\n );\n if (curIdx < 0) return;\n\n const pulled = f.options.splice(curIdx, 1)[0];\n\n let dest =\n typeof opts.index === \"number\" ? opts.index : undefined;\n if (opts.beforeId)\n dest = Math.max(\n 0,\n f.options.findIndex((o) => o.id === opts.beforeId),\n );\n if (opts.afterId)\n dest = Math.min(\n f.options.length,\n f.options.findIndex((o) => o.id === opts.afterId) +\n 1,\n );\n if (dest === undefined || Number.isNaN(dest))\n dest = f.options.length;\n\n f.options.splice(dest, 0, pulled);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n addOption(\n fieldId: string,\n input: {\n id?: string;\n label: string;\n service_id?: number;\n pricing_role?: \"base\" | \"utility\" | \"addon\";\n [k: string]: any;\n },\n ): string {\n // decide id up-front so we can return synchronously\n const id = input.id ?? this.genId(\"o\");\n\n this.exec({\n name: \"addOption\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\n if (!f)\n throw new Error(\n `addOption: field '${fieldId}' not found`,\n );\n const list = (f.options ??= []);\n if (list.some((o) => o.id === id))\n throw new Error(`Option id '${id}' already exists`);\n // @ts-ignore\n list.push({ ...input, id });\n }),\n undo: () => this.api.undo(),\n });\n\n return id;\n }\n\n updateOption(\n optionId: string,\n patch: Partial<\n {\n label: string;\n service_id: number;\n pricing_role: \"base\" | \"utility\" | \"addon\";\n } & Record<string, any>\n >,\n ) {\n if (!isOptionId(optionId))\n throw new Error('updateOption: optionId must start with \"o:\"');\n this.exec({\n name: \"updateOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n const o = f.options.find((x) => x.id === optionId);\n if (o) Object.assign(o, patch);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n removeOption(optionId: string) {\n if (!isOptionId(optionId))\n throw new Error('removeOption: optionId must start with \"o:\"');\n this.exec({\n name: \"removeOption\",\n do: () =>\n this.patchProps((p) => {\n const owner = ownerOfOption(p, optionId);\n if (!owner) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === owner.fieldId,\n );\n if (!f?.options) return;\n f.options = f.options.filter((o) => o.id !== optionId);\n\n // prune option-level include/exclude maps keyed by the option id\n const maps: Array<\n \"includes_for_options\" | \"excludes_for_options\"\n > = [\"includes_for_options\", \"excludes_for_options\"];\n for (const m of maps) {\n const map = (p as any)[m] as\n | Record<string, string[]>\n | undefined;\n if (!map) continue;\n if (map[optionId]) delete map[optionId];\n if (!Object.keys(map).length) delete (p as any)[m];\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n editLabel(id: string, label: string): void {\n const next = (label ?? \"\").trim();\n if (!next) throw new Error(\"Label cannot be empty\");\n\n this.exec({\n name: \"editLabel\",\n do: () =>\n this.patchProps((p) => {\n if (isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (t) t.label = next;\n return;\n }\n if (isFieldId(id)) {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (f) f.label = next;\n return;\n }\n if (isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (o) o.label = next;\n return;\n }\n throw new Error(\"editLabel: unsupported id\");\n }),\n undo: () => this.api.undo(),\n });\n }\n\n editName(fieldId: string, name: string | undefined) {\n this.exec({\n name: \"editName\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === fieldId);\n if (!f) return;\n f.name = name;\n }),\n undo: () => this.api.undo(),\n });\n }\n\n setService(\n id: string,\n input: { service_id?: number; pricing_role?: \"base\" | \"utility\" },\n ): void {\n this.exec({\n name: \"setService\",\n do: () =>\n this.patchProps((p) => {\n const hasSidKey = Object.prototype.hasOwnProperty.call(\n input,\n \"service_id\",\n );\n const validId =\n hasSidKey &&\n typeof input.service_id === \"number\" &&\n Number.isFinite(input.service_id);\n const sid: number | undefined = validId\n ? Number(input.service_id)\n : undefined;\n const nextRole = input.pricing_role;\n\n // ── TAG ───────────────────────────────────────────────────\n if (isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n if (!t) return;\n\n // role not applicable for tags\n if (hasSidKey) {\n if (sid === undefined) delete (t as any).service_id;\n else t.service_id = sid;\n }\n return;\n }\n\n // ── OPTION ───────────────────────────────────────────────\n if (isOptionId(id)) {\n const own = ownerOfOption(p, id);\n if (!own) return;\n const f = (p.fields ?? []).find(\n (x) => x.id === own.fieldId,\n );\n const o = f?.options?.find((x) => x.id === id);\n if (!o) return;\n\n const currentRole = (o.pricing_role ?? \"base\") as\n | \"base\"\n | \"utility\";\n const role = nextRole ?? currentRole;\n\n if (role === \"utility\") {\n // Utilities cannot have service_id, and if switching to utility, strip any existing sid.\n if (hasSidKey && sid !== undefined) {\n this.api.emit(\"error\", {\n message:\n \"Utilities cannot have service_id (option).\",\n code: \"utility_service_conflict\",\n meta: { id, service_id: sid },\n });\n }\n o.pricing_role = \"utility\";\n if (\"service_id\" in o) delete (o as any).service_id;\n return;\n }\n\n // role === 'base'\n if (nextRole) o.pricing_role = \"base\";\n if (hasSidKey) {\n if (sid === undefined) delete (o as any).service_id;\n else o.service_id = sid;\n }\n return;\n }\n\n // ── FIELD (button-able) ─────────────────────────────────\n // Field ids usually look like \"f:*\" in your project; we’ll treat any non-tag/non-option as field.\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f) {\n throw new Error(\n 'setService only supports tag (\"t:*\"), option (\"o:*\"), or field (\"f:*\") ids',\n );\n }\n\n const isOptionBased =\n Array.isArray(f.options) && f.options.length > 0;\n const isButton = !!(f as any).button;\n\n // Move/normalize role at field level if provided\n if (nextRole) {\n f.pricing_role = nextRole;\n }\n const effectiveRole = (f.pricing_role ?? \"base\") as\n | \"base\"\n | \"utility\";\n\n // If the field is option-based, services must live on options, not on the field.\n if (isOptionBased) {\n if (hasSidKey) {\n this.api.emit(\"error\", {\n message:\n \"Cannot set service_id on an option-based field. Assign service_id on its options instead.\",\n code: \"field_option_based_service_forbidden\",\n meta: { id, service_id: sid },\n });\n }\n // Still allow changing pricing_role at field level (acts as a default for options),\n // but never write/keep service_id on the field itself.\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // For non-option fields, only \"button\" fields are allowed to carry a service_id.\n if (!isButton) {\n if (hasSidKey) {\n this.api.emit(\"error\", {\n message:\n \"Only button fields (without options) can have a service_id.\",\n code: \"non_button_field_service_forbidden\",\n meta: { id, service_id: sid },\n });\n }\n // Ensure we don't keep any stray sid\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // Button field + role checks\n if (effectiveRole === \"utility\") {\n // Utilities cannot have service_id at all.\n if (hasSidKey && sid !== undefined) {\n this.api.emit(\"error\", {\n message:\n \"Utilities cannot have service_id (field).\",\n code: \"utility_service_conflict\",\n meta: { id, service_id: sid },\n });\n }\n if (\"service_id\" in (f as any))\n delete (f as any).service_id;\n return;\n }\n\n // Button field with role 'base' → allow setting/clearing sid\n if (hasSidKey) {\n if (sid === undefined) delete (f as any).service_id;\n else (f as any).service_id = sid;\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n addTag(\n partial: Omit<Tag, \"id\" | \"label\"> & { id?: string; label: string },\n ) {\n const id = partial.id ?? this.genId(\"t\");\n const payload = { ...partial, id };\n this.exec({\n name: \"addTag\",\n do: () =>\n this.patchProps((p) => {\n p.filters = [...(p.filters ?? []), payload];\n }),\n undo: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\n }),\n });\n }\n\n updateTag(id: string, patch: Partial<Tag>) {\n let prev: Tag | undefined;\n this.exec({\n name: \"updateTag\",\n do: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).map((t) => {\n if (t.id !== id) return t;\n prev = t;\n return { ...t, ...patch };\n });\n }),\n undo: () =>\n this.patchProps((p) => {\n p.filters = (p.filters ?? []).map((t) =>\n t.id === id && prev ? prev : t,\n );\n }),\n });\n }\n\n removeTag(id: string) {\n let prevSlice!: ServiceProps;\n this.exec({\n name: \"removeTag\",\n do: () =>\n this.patchProps((p) => {\n prevSlice = cloneDeep(p);\n // noinspection DuplicatedCode\n p.filters = (p.filters ?? []).filter((t) => t.id !== id);\n // drop references\n for (const t of p.filters ?? []) {\n if (t.bind_id === id) delete t.bind_id;\n t.includes = (t.includes ?? []).filter((x) => x !== id);\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\n }\n for (const f of p.fields ?? []) {\n if (Array.isArray(f.bind_id))\n f.bind_id = f.bind_id.filter((x) => x !== id);\n else if (f.bind_id === id) delete f.bind_id;\n }\n }),\n undo: () => this.replaceProps(prevSlice),\n });\n }\n\n addField(\n partial: Omit<Field, \"id\" | \"label\" | \"type\"> & {\n id?: string;\n label: string;\n type: Field[\"type\"];\n },\n ) {\n const id = partial.id ?? this.genId(\"f\");\n const payload = { ...partial, id };\n this.exec({\n name: \"addField\",\n do: () =>\n this.patchProps((p) => {\n p.fields = [...(p.fields ?? []), payload as Field];\n }),\n undo: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n }),\n });\n }\n\n updateField(id: string, patch: Partial<Field>) {\n let prev: Field | undefined;\n this.exec({\n name: \"updateField\",\n do: () =>\n this.patchProps((p) => {\n // @ts-ignore\n p.fields = (p.fields ?? []).map((f) => {\n if (f.id !== id) return f;\n prev = f;\n return { ...f, ...patch };\n });\n }),\n undo: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).map((f) =>\n f.id === id && prev ? prev : f,\n );\n }),\n });\n }\n\n removeField(id: string) {\n let prevSlice!: ServiceProps;\n this.exec({\n name: \"removeField\",\n do: () =>\n this.patchProps((p) => {\n prevSlice = cloneDeep(p);\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n // prune option maps that reference this field\n for (const mapKey of [\n \"includes_for_buttons\",\n \"excludes_for_buttons\",\n ] as const) {\n const m = p[mapKey];\n if (!m) continue;\n for (const k of Object.keys(m)) {\n m[k] = (m[k] ?? []).filter((fid) => fid !== id);\n if (!m[k]?.length) delete m[k];\n }\n }\n for (const t of p.filters ?? []) {\n t.includes = (t.includes ?? []).filter((x) => x !== id);\n t.excludes = (t.excludes ?? []).filter((x) => x !== id);\n }\n }),\n undo: () => this.replaceProps(prevSlice),\n });\n }\n\n remove(id: string) {\n if (isTagId(id)) {\n this.exec({\n name: \"removeTag\",\n do: () =>\n this.patchProps((p) => {\n // noinspection DuplicatedCode\n p.filters = (p.filters ?? []).filter(\n (t) => t.id !== id,\n );\n\n // detach children + prune includes/excludes references\n for (const t of p.filters ?? []) {\n if (t.bind_id === id) delete t.bind_id;\n t.includes = (t.includes ?? []).filter(\n (x) => x !== id,\n );\n t.excludes = (t.excludes ?? []).filter(\n (x) => x !== id,\n );\n }\n\n // remove tag from field.bind_id arrays\n for (const f of p.fields ?? []) {\n if (Array.isArray(f.bind_id))\n f.bind_id = f.bind_id.filter(\n (x) => x !== id,\n ) as any;\n else if (f.bind_id === id) delete f.bind_id;\n }\n\n // prune per-tag ordering entry and stale field ids\n if (p.order_for_tags?.[id]) delete p.order_for_tags[id];\n for (const k of Object.keys(p.order_for_tags ?? {})) {\n p.order_for_tags![k] = (\n p.order_for_tags![k] ?? []\n ).filter((fid) =>\n (p.fields ?? []).some((f) => f.id === fid),\n );\n if (!p.order_for_tags![k].length)\n delete p.order_for_tags![k];\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (isFieldId(id)) {\n this.exec({\n name: \"removeField\",\n do: () =>\n this.patchProps((p) => {\n p.fields = (p.fields ?? []).filter((f) => f.id !== id);\n\n // prune tag includes/excludes\n for (const t of p.filters ?? []) {\n t.includes = (t.includes ?? []).filter(\n (x) => x !== id,\n );\n t.excludes = (t.excludes ?? []).filter(\n (x) => x !== id,\n );\n }\n\n // prune per-tag ordering\n for (const k of Object.keys(p.order_for_tags ?? {})) {\n p.order_for_tags![k] = (\n p.order_for_tags![k] ?? []\n ).filter((fid) => fid !== id);\n if (!p.order_for_tags![k].length)\n delete p.order_for_tags![k];\n }\n\n // prune option maps that reference this field id\n const maps: Array<\n \"includes_for_options\" | \"excludes_for_options\"\n > = [\"includes_for_options\", \"excludes_for_options\"];\n for (const m of maps) {\n const map = (p as any)[m] as\n | Record<string, string[]>\n | undefined;\n if (!map) continue;\n for (const key of Object.keys(map)) {\n map[key] = (map[key] ?? []).filter(\n (fid) => fid !== id,\n );\n if (!map[key]?.length) delete map[key];\n }\n if (!Object.keys(map).length) delete (p as any)[m];\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (isOptionId(id)) {\n this.removeOption(id);\n return;\n }\n\n throw new Error(\"remove: unknown id prefix\");\n }\n\n getNode(\n id: string,\n ):\n | { kind: \"tag\"; data?: Tag; owners: { parentTagId?: string } }\n | { kind: \"field\"; data?: Field; owners: { bindTagIds: string[] } }\n | { kind: \"option\"; data?: any; owners: { fieldId?: string } } {\n const props = this.builder.getProps();\n if (isTagId(id)) {\n const t = (props.filters ?? []).find((x) => x.id === id);\n return {\n kind: \"tag\",\n data: t,\n owners: { parentTagId: t?.bind_id },\n };\n }\n if (isFieldId(id)) {\n const f = (props.fields ?? []).find((x) => x.id === id);\n const bind = Array.isArray(f?.bind_id)\n ? (f!.bind_id as string[])\n : f?.bind_id\n ? [f.bind_id]\n : [];\n return { kind: \"field\", data: f, owners: { bindTagIds: bind } };\n }\n if (isOptionId(id)) {\n const own = ownerOfOption(props, id);\n const f = own\n ? (props.fields ?? []).find((x) => x.id === own.fieldId)\n : undefined;\n const o = f?.options?.find((x) => x.id === id);\n return {\n kind: \"option\",\n data: o,\n owners: { fieldId: own?.fieldId },\n };\n }\n // you can extend for service lookup if desired\n return { kind: \"option\", data: undefined, owners: {} };\n }\n\n getFieldQuantityRule(id: string): QuantityRule | undefined {\n const props = this.builder.getProps();\n const f = (props.fields ?? []).find((x) => x.id === id);\n if (!f) return undefined;\n return normalizeQuantityRule((f as any).meta?.quantity);\n }\n\n setFieldQuantityRule(id: string, rule: unknown): void {\n this.exec({\n name: \"setFieldQuantityRule\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f) return;\n\n const normalized = normalizeQuantityRule(rule);\n\n if (!normalized) {\n // Drop invalid shapes entirely\n if ((f as any).meta?.quantity !== undefined) {\n delete (f as any).meta.quantity;\n // Clean up empty meta object\n if (\n (f as any).meta &&\n Object.keys((f as any).meta).length === 0\n ) {\n delete (f as any).meta;\n }\n }\n return;\n }\n\n // Keep other meta keys intact\n (f as any).meta = {\n ...(f as any).meta,\n quantity: normalized,\n };\n }),\n undo: () => this.api.undo(),\n });\n }\n\n clearFieldQuantityRule(id: string): void {\n this.exec({\n name: \"clearFieldQuantityRule\",\n do: () =>\n this.patchProps((p) => {\n const f = (p.fields ?? []).find((x) => x.id === id);\n if (!f || !(f as any).meta?.quantity) return;\n delete (f as any).meta.quantity;\n if (\n (f as any).meta &&\n Object.keys((f as any).meta).length === 0\n ) {\n delete (f as any).meta;\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /** Walk ancestors for a tag and detect if parent→child would create a cycle */\n private wouldCreateTagCycle(\n p: ServiceProps,\n parentId: string,\n childId: string,\n ): boolean {\n if (parentId === childId) return true;\n const tagById = new Map((p.filters ?? []).map((t) => [t.id, t]));\n let cur: string | undefined = parentId;\n const guard = new Set<string>();\n while (cur) {\n if (cur === childId) return true; // child is ancestor of parent → cycle\n if (guard.has(cur)) break;\n guard.add(cur);\n cur = tagById.get(cur)?.bind_id;\n }\n return false;\n }\n\n private wouldCreateIncludeExcludeCycle(\n p: ServiceProps,\n receiverId: string,\n targetId: string,\n ): boolean {\n // Simple case: A includes A or A excludes A\n if (receiverId === targetId) return true;\n\n // We want to prevent A including/excluding B if B includes/excludes A.\n const getDirectRelations = (id: string): string[] => {\n if (isTagId(id)) {\n const t = (p.filters ?? []).find((x) => x.id === id);\n return [...(t?.includes ?? []), ...(t?.excludes ?? [])];\n }\n // For buttons and options\n const inc = p.includes_for_buttons?.[id] ?? [];\n const exc = p.excludes_for_buttons?.[id] ?? [];\n return [...inc, ...exc];\n };\n\n const visited = new Set<string>();\n const stack = [targetId];\n\n while (stack.length > 0) {\n const curr = stack.pop()!;\n if (curr === receiverId) return true;\n if (visited.has(curr)) continue;\n visited.add(curr);\n\n stack.push(...getDirectRelations(curr));\n }\n\n return false;\n }\n\n include(receiverId: string, idOrIds: string | string[]) {\n this.exec({\n name: \"include\",\n do: () =>\n this.patchProps((p) => {\n const receiver = this.getNode(receiverId);\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\n if (\n receiver.kind === \"tag\" ||\n (receiver.kind === \"field\" &&\n (receiver.data as any)?.button) ||\n receiver.kind === \"option\"\n ) {\n if (receiver.kind === \"tag\") {\n const t = (p.filters ?? []).find(\n (x) => x.id === receiverId,\n );\n if (t) {\n const accepted: string[] = [];\n const next = new Set(t.includes ?? []);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"include\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n (t.includes?.length ?? 0) > 0\n ) {\n t.includes = Array.from(next);\n }\n\n if (t.excludes) {\n t.excludes = t.excludes.filter(\n (x) => !accepted.includes(x),\n );\n if (t.excludes.length === 0) {\n delete t.excludes;\n }\n }\n }\n } else {\n const accepted: string[] = [];\n const current =\n p.includes_for_buttons?.[receiverId] ?? [];\n const next = new Set(current);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} including ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"include\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n current.length > 0\n ) {\n if (!p.includes_for_buttons)\n p.includes_for_buttons = {};\n p.includes_for_buttons[receiverId] =\n Array.from(next);\n }\n\n if (p.excludes_for_buttons?.[receiverId]) {\n p.excludes_for_buttons[receiverId] =\n p.excludes_for_buttons[receiverId].filter(\n (x) => !accepted.includes(x),\n );\n if (\n p.excludes_for_buttons[receiverId]\n .length === 0\n ) {\n delete p.excludes_for_buttons[receiverId];\n }\n }\n }\n\n // ensure normalise doesn't drop it (test environment might not have all nodes)\n if (!p.fields) p.fields = [];\n if (!p.filters) p.filters = [];\n } else {\n throw new Error(\n \"Receiver must be a tag, button field, or option\",\n );\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n exclude(receiverId: string, idOrIds: string | string[]) {\n this.exec({\n name: \"exclude\",\n do: () =>\n this.patchProps((p) => {\n const receiver = this.getNode(receiverId);\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\n if (\n receiver.kind === \"tag\" ||\n (receiver.kind === \"field\" &&\n (receiver.data as any)?.button) ||\n receiver.kind === \"option\"\n ) {\n if (receiver.kind === \"tag\") {\n const t = (p.filters ?? []).find(\n (x) => x.id === receiverId,\n );\n if (t) {\n const accepted: string[] = [];\n const next = new Set(t.excludes ?? []);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"exclude\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n (t.excludes?.length ?? 0) > 0\n ) {\n t.excludes = Array.from(next);\n }\n\n if (t.includes) {\n t.includes = t.includes.filter(\n (x) => !accepted.includes(x),\n );\n if (t.includes.length === 0) {\n delete t.includes;\n }\n }\n }\n } else {\n const accepted: string[] = [];\n const current =\n p.excludes_for_buttons?.[receiverId] ?? [];\n const next = new Set(current);\n for (const id of ids) {\n if (\n this.wouldCreateIncludeExcludeCycle(\n p,\n receiverId,\n id,\n )\n ) {\n this.emit(\"editor:error\", {\n message: `Cycle detected: ${receiverId} excluding ${id} would create a cycle.`,\n code: \"cycle_detected\",\n meta: {\n receiverId,\n targetId: id,\n type: \"exclude\",\n },\n });\n continue;\n }\n next.add(id);\n accepted.push(id);\n }\n if (\n accepted.length > 0 ||\n current.length > 0\n ) {\n if (!p.excludes_for_buttons)\n p.excludes_for_buttons = {};\n p.excludes_for_buttons[receiverId] =\n Array.from(next);\n }\n\n if (p.includes_for_buttons?.[receiverId]) {\n p.includes_for_buttons[receiverId] =\n p.includes_for_buttons[receiverId].filter(\n (x) => !accepted.includes(x),\n );\n if (\n p.includes_for_buttons[receiverId]\n .length === 0\n ) {\n delete p.includes_for_buttons[receiverId];\n }\n }\n }\n\n // ensure normalise doesn't drop it (test environment might not have all nodes)\n if (!p.fields) p.fields = [];\n if (!p.filters) p.filters = [];\n } else {\n throw new Error(\n \"Receiver must be a tag, button field, or option\",\n );\n }\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /* ──────────────────────────────────────────────────────────────────────────\n * CONNECT\n * ────────────────────────────────────────────────────────────────────────── */\n connect(kind: WireKind, fromId: string, toId: string): void {\n this.exec({\n name: `connect:${kind}`,\n do: () =>\n this.patchProps((p) => {\n /* ── BIND ─────────────────────────────────────────────── */\n if (kind === \"bind\") {\n // Tag → Tag: set child.bind_id = parent (cycle-safe)\n if (isTagId(fromId) && isTagId(toId)) {\n if (this.wouldCreateTagCycle(p, fromId, toId)) {\n throw new Error(\n `bind would create a cycle: ${fromId} → ${toId}`,\n );\n }\n const child = (p.filters ?? []).find(\n (t) => t.id === toId,\n );\n if (child) child.bind_id = fromId;\n return;\n }\n // Tag → Field (or Field → Tag): ensure field.bind_id contains the tag\n if (\n (isTagId(fromId) && isFieldId(toId)) ||\n (isFieldId(fromId) && isTagId(toId))\n ) {\n const fieldId = isFieldId(toId) ? toId : fromId;\n const tagId = isTagId(fromId) ? fromId : toId;\n const f = (p.fields ?? []).find(\n (x) => x.id === fieldId,\n );\n if (!f) return;\n if (!f.bind_id) {\n f.bind_id = tagId;\n return;\n }\n if (typeof f.bind_id === \"string\") {\n if (f.bind_id !== tagId)\n f.bind_id = [f.bind_id, tagId];\n return;\n }\n if (!f.bind_id.includes(tagId))\n f.bind_id.push(tagId);\n return;\n }\n throw new Error(\n `bind: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── INCLUDE / EXCLUDE (Tag→Field, Option→Field) ──────── */\n if (kind === \"include\" || kind === \"exclude\") {\n const key =\n kind === \"include\" ? \"includes\" : \"excludes\";\n\n // Tag → Field: mutate tag.includes/excludes\n if (isTagId(fromId) && isFieldId(toId)) {\n const t = (p.filters ?? []).find(\n (x) => x.id === fromId,\n );\n if (!t) return;\n const arr = (t[key] ??= []);\n if (!arr.includes(toId)) arr.push(toId);\n return;\n }\n\n // Option → Field: mutate includes_for_options / excludes_for_options using optionId\n if (isOptionId(fromId) && isFieldId(toId)) {\n const mapKey =\n kind === \"include\"\n ? \"includes_for_options\"\n : \"excludes_for_options\";\n const maps = (p as any)[mapKey] as\n | Record<string, string[]>\n | undefined;\n const next = { ...(maps ?? {}) };\n const arr = next[fromId] ?? [];\n if (!arr.includes(toId)) arr.push(toId);\n next[fromId] = arr;\n (p as any)[mapKey] = next;\n return;\n }\n\n throw new Error(\n `${kind}: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── SERVICE (Service→Tag | Service→Option) ───────────── */\n // inside connect(kind, from, to)\n if (kind === \"service\") {\n // ONLY ensure it exists; no type checks/parsing\n ensureServiceExists(this.opts, fromId);\n\n if (toId.startsWith(\"t:\")) {\n this.exec({\n name: \"connect:service→tag\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find(\n (x) => x.id === toId,\n );\n if (t) (t as any).service_id = fromId; // store as-is\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (toId.startsWith(\"o:\")) {\n this.exec({\n name: \"connect:service→option\",\n do: () =>\n this.patchProps((p) => {\n for (const f of p.fields ?? []) {\n const o = f.options?.find(\n (x) => x.id === toId,\n );\n if (o) {\n (o as any).service_id = fromId;\n return;\n }\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n throw new Error(\n 'service: to must be a tag (\"t:*\") or option (\"o:*\")',\n );\n }\n\n throw new Error(`Unknown connect kind: ${kind}`);\n }),\n undo: () => this.api.undo(), // snapshot-based undo will restore prior state\n });\n }\n\n /* ──────────────────────────────────────────────────────────────────────────\n * DISCONNECT\n * ────────────────────────────────────────────────────────────────────────── */\n disconnect(kind: WireKind, fromId: string, toId: string): void {\n this.exec({\n name: `disconnect:${kind}`,\n do: () =>\n this.patchProps((p) => {\n /* ── BIND ─────────────────────────────────────────────── */\n if (kind === \"bind\") {\n // Tag → Tag\n if (isTagId(fromId) && isTagId(toId)) {\n const child = (p.filters ?? []).find(\n (t) => t.id === toId,\n );\n if (child?.bind_id === fromId) delete child.bind_id;\n return;\n }\n // Tag ↔ Field\n if (\n (isTagId(fromId) && isFieldId(toId)) ||\n (isFieldId(fromId) && isTagId(toId))\n ) {\n const fieldId = isFieldId(toId) ? toId : fromId;\n const tagId = isTagId(fromId) ? fromId : toId;\n const f = (p.fields ?? []).find(\n (x) => x.id === fieldId,\n );\n if (!f?.bind_id) return;\n if (typeof f.bind_id === \"string\") {\n if (f.bind_id === tagId) delete f.bind_id;\n return;\n }\n f.bind_id = f.bind_id.filter(\n (x) => x !== tagId,\n ) as any;\n if (f.bind_id?.length === 0) delete f.bind_id;\n return;\n }\n throw new Error(\n `unbind: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── INCLUDE / EXCLUDE (Tag→Field, Option→Field) ──────── */\n if (kind === \"include\" || kind === \"exclude\") {\n const key =\n kind === \"include\" ? \"includes\" : \"excludes\";\n\n // Tag → Field\n if (isTagId(fromId) && isFieldId(toId)) {\n const t = (p.filters ?? []).find(\n (x) => x.id === fromId,\n );\n if (!t) return;\n t[key] = (t[key] ?? []).filter((x) => x !== toId);\n if (!t[key]?.length) delete (t as any)[key];\n return;\n }\n\n // Option → Field\n if (isOptionId(fromId) && isFieldId(toId)) {\n const mapKey =\n kind === \"include\"\n ? \"includes_for_options\"\n : \"excludes_for_options\";\n const maps = (p as any)[mapKey] as\n | Record<string, string[]>\n | undefined;\n if (!maps) return;\n if (maps[fromId]) {\n maps[fromId] = (maps[fromId] ?? []).filter(\n (fid) => fid !== toId,\n );\n if (!maps[fromId]?.length) delete maps[fromId];\n }\n if (!Object.keys(maps).length)\n delete (p as any)[mapKey];\n return;\n }\n\n throw new Error(\n `${kind}: unsupported route ${fromId} → ${toId}`,\n );\n }\n\n /* ── SERVICE (Service→Tag | Service→Option) ───────────── */\n if (kind === \"service\") {\n // STILL only ensure it exists; no type checks/parsing\n ensureServiceExists(this.opts, fromId);\n\n if (toId.startsWith(\"t:\")) {\n this.exec({\n name: \"disconnect:service→tag\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find(\n (x) => x.id === toId,\n );\n if (t) delete (t as any).service_id;\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n if (toId.startsWith(\"o:\")) {\n this.exec({\n name: \"disconnect:service→option\",\n do: () =>\n this.patchProps((p) => {\n for (const f of p.fields ?? []) {\n const o = f.options?.find(\n (x) => x.id === toId,\n );\n if (o) {\n delete (o as any).service_id;\n return;\n }\n }\n }),\n undo: () => this.api.undo(),\n });\n return;\n }\n\n throw new Error(\n 'service: to must be a tag (\"t:*\") or option (\"o:*\")',\n );\n }\n\n throw new Error(`Unknown disconnect kind: ${kind}`);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n setConstraint(tagId: string, flag: string, value: boolean | undefined) {\n let prev: boolean | undefined;\n this.exec({\n name: \"setConstraint\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n prev = t.constraints?.[flag];\n if (!t.constraints) t.constraints = {};\n if (value === undefined) delete t.constraints[flag];\n else t.constraints[flag] = value;\n }),\n undo: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n if (!t.constraints) t.constraints = {};\n if (prev === undefined) delete t.constraints[flag];\n else t.constraints[flag] = prev;\n }),\n });\n // After mutation, normalise() will propagate effective constraints & meta\n }\n\n /**\n * Clear a constraint override by removing the local constraint that conflicts with an ancestor.\n */\n clearConstraintOverride(tagId: string, flag: string) {\n let prev: boolean | undefined;\n let prevOverride: any;\n this.exec({\n name: \"clearConstraintOverride\",\n do: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n prev = t.constraints?.[flag];\n prevOverride = t.constraints_overrides?.[flag];\n\n if (t.constraints) delete t.constraints[flag];\n if (t.constraints_overrides)\n delete t.constraints_overrides[flag];\n }),\n undo: () =>\n this.patchProps((p) => {\n const t = (p.filters ?? []).find((x) => x.id === tagId);\n if (!t) return;\n if (prev !== undefined) {\n if (!t.constraints) t.constraints = {};\n t.constraints[flag] = prev;\n }\n if (prevOverride !== undefined) {\n if (!t.constraints_overrides)\n t.constraints_overrides = {};\n t.constraints_overrides[flag] = prevOverride;\n }\n }),\n });\n }\n\n /**\n * Clear a constraint from a tag and its descendants.\n * If a descendant has an override, it assigns that override's value as local.\n */\n clearConstraint(tagId: string, flag: string) {\n this.exec({\n name: \"clearConstraint\",\n do: () =>\n this.patchProps((p) => {\n const tags = p.filters ?? [];\n const byId = new Map(tags.map((t) => [t.id, t]));\n const children = new Map<string, string[]>();\n for (const t of tags) {\n if (t.bind_id) {\n if (!children.has(t.bind_id))\n children.set(t.bind_id, []);\n children.get(t.bind_id)!.push(t.id);\n }\n }\n\n const process = (id: string) => {\n const t = byId.get(id);\n if (!t) return;\n\n const override = t.constraints_overrides?.[flag];\n if (override) {\n if (!t.constraints) t.constraints = {};\n t.constraints[flag] = override.from;\n delete t.constraints_overrides![flag];\n if (\n Object.keys(t.constraints_overrides ?? {})\n .length === 0\n ) {\n delete t.constraints_overrides;\n }\n } else {\n if (t.constraints) {\n delete t.constraints[flag];\n if (Object.keys(t.constraints).length === 0) {\n delete t.constraints;\n }\n }\n }\n\n for (const childId of children.get(id) ?? []) {\n process(childId);\n }\n };\n\n process(tagId);\n }),\n undo: () => this.api.undo(),\n });\n }\n\n /* ───────────────────── Internals ───────────────────── */\n\n private replaceProps(next: ServiceProps): void {\n // Ensure canonical shape + constraint propagation\n const norm = normalise(next, {\n constraints: this.builder\n .getConstraints()\n .map((item) => item.label),\n defaultPricingRole: \"base\",\n });\n this.builder.load(norm);\n this.api.refreshGraph();\n }\n\n private patchProps(mut: (p: ServiceProps) => void): void {\n const cur = cloneDeep(this.builder.getProps());\n mut(cur);\n this.replaceProps(cur);\n }\n\n private afterMutation(command: string, _before: EditorSnapshot) {\n if (this.txnDepth > 0) return; // delay until commit()\n this.pushHistory(this.makeSnapshot(command));\n this.emit(\"editor:command\", { name: command });\n if (this.opts.validateAfterEach)\n this.emit(\"editor:change\", {\n props: this.builder.getProps(),\n reason: \"validate\",\n command,\n });\n else\n this.emit(\"editor:change\", {\n props: this.builder.getProps(),\n reason: \"mutation\",\n command,\n });\n }\n\n private commit(label: string) {\n const snap = this.makeSnapshot(label);\n this.pushHistory(snap);\n this.emit(\"editor:change\", {\n props: snap.props,\n reason: \"transaction\",\n command: this.txnLabel,\n });\n }\n\n private makeSnapshot(_why: string): EditorSnapshot {\n const props = cloneDeep(this.builder.getProps());\n const canvas = this.api.snapshot();\n return {\n props,\n layout: {\n canvas,\n },\n };\n }\n\n private loadSnapshot(s: EditorSnapshot, reason: \"undo\" | \"redo\") {\n this.builder.load(cloneDeep(s.props));\n\n const layout = s.layout;\n const canvas = layout?.canvas;\n\n if (canvas) {\n if (canvas.positions) this.api.setPositions(canvas.positions);\n if (canvas.viewport) this.api.setViewport(canvas.viewport);\n if (canvas.selection)\n this.api.select(\n Array.isArray(canvas.selection)\n ? canvas.selection\n : Array.from(canvas.selection),\n );\n } else {\n this.api.refreshGraph();\n }\n this.emit(\"editor:change\", { props: this.builder.getProps(), reason });\n }\n\n private pushHistory(snap: EditorSnapshot) {\n // truncate forward\n if (this.index < this.history.length - 1) {\n this.history = this.history.slice(0, this.index + 1);\n }\n this.history.push(snap);\n // trim from start if beyond limit\n const over = this.history.length - this.opts.historyLimit;\n if (over > 0) {\n this.history.splice(0, over);\n this.index = this.history.length - 1;\n } else {\n this.index = this.history.length - 1;\n }\n }\n\n // IDs like \"t:1\", \"f:2\", \"o:3\" — must be unique across tags, fields, options.\n private genId(prefix: \"t\" | \"f\" | \"o\"): string {\n const props = this.builder.getProps();\n const taken = new Set<string>([\n ...(props.filters ?? []).map((t) => t.id),\n ...(props.fields ?? []).map((f) => f.id),\n ...(props.fields ?? []).flatMap(\n (f) => f.options?.map((o) => o.id) ?? [],\n ),\n ]);\n for (let i = 1; i < 10_000; i++) {\n const id = `${prefix}:${i}`;\n if (!taken.has(id)) return id;\n }\n throw new Error(\"Unable to generate id\");\n }\n\n private emit<K extends keyof (EditorEvents & any)>(\n event: K,\n payload: (EditorEvents & any)[K],\n ) {\n // Reuse CanvasAPI’s bus so consumers have a single stream\n this.api.emit(event as any, payload as any);\n }\n\n /**\n * Suggest/filter candidate services against the current visible-group\n * (single tag) context.\n *\n * - Excludes services already used in this group.\n * - Applies capability presence, tag constraints, rate policy, and compiled policies.\n *\n * @param candidates service ids to evaluate\n * @param ctx\n * @param ctx.tagId active visible-group tag id\n * @param ctx.usedServiceIds services already selected for this visible group (first is treated as \"primary\" for rate policy)\n * @param ctx.effectiveConstraints effective constraints for the active tag (dripfeed/refill/cancel)\n * @param ctx.policies raw JSON policies (will be compiled via compilePolicies)\n * @param ctx.fallback fallback/rate settings (defaults applied if omitted)\n */\n public filterServicesForVisibleGroup(\n candidates: Array<number | string>,\n ctx: {\n tagId: string;\n usedServiceIds: Array<number | string>;\n effectiveConstraints?: Partial<\n Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>\n >;\n policies?: unknown;\n fallback?: FallbackSettings;\n },\n ): ServiceCheck[] {\n const svcMap: DgpServiceMap =\n (this as any).opts?.serviceMap ??\n (this.builder as any).getServiceMap?.() ??\n {};\n\n const usedSet = new Set(ctx.usedServiceIds.map(String));\n const primary = ctx.usedServiceIds[0]; // group \"primary\" (first used); rate policy compares against this when present\n\n const fb: FallbackSettings = {\n requireConstraintFit: true,\n ratePolicy: { kind: \"lte_primary\" },\n selectionStrategy: \"priority\",\n mode: \"strict\",\n ...(ctx.fallback ?? {}),\n };\n\n // Compile policies once here; you asked for the evaluate path to call compilePolicies.\n const evaluatePoliciesRaw = (\n raw: unknown,\n serviceIds: Array<number | string>,\n tagId: string,\n ) => {\n const { policies } = compilePolicies(raw);\n return evaluateServicePolicies(policies, serviceIds, svcMap, tagId);\n };\n\n const out: ServiceCheck[] = [];\n\n for (const id of candidates) {\n // Skip already-used services in this group\n if (usedSet.has(String(id))) continue;\n\n const cap = svcMap[Number(id)];\n if (!cap) {\n out.push({\n id,\n ok: false,\n fitsConstraints: false,\n passesRate: false,\n passesPolicies: false,\n reasons: [\"missing_capability\"],\n });\n continue;\n }\n\n // Constraints (only flags explicitly true at tag are \"required\")\n const fitsConstraints = constraintFitOk(\n svcMap,\n cap.id,\n ctx.effectiveConstraints ?? {},\n );\n\n // Rate policy vs primary (if any); if no primary, consider pass\n const passesRate =\n primary == null ? true : rateOk(svcMap, id, primary, fb);\n\n // Policies: compile + evaluate with current used + candidate\n const polRes = evaluatePoliciesRaw(\n ctx.policies ?? [],\n [...ctx.usedServiceIds, id],\n ctx.tagId,\n );\n const passesPolicies = polRes.ok;\n\n const reasons: ServiceCheck[\"reasons\"] = [];\n if (!fitsConstraints) reasons.push(\"constraint_mismatch\");\n if (!passesRate) reasons.push(\"rate_policy\");\n if (!passesPolicies) reasons.push(\"policy_error\");\n\n out.push({\n id,\n ok: fitsConstraints && passesRate && passesPolicies,\n fitsConstraints,\n passesRate,\n passesPolicies,\n policyErrors: polRes.errors.length ? polRes.errors : undefined,\n policyWarnings: polRes.warnings.length\n ? polRes.warnings\n : undefined,\n reasons,\n cap,\n rate: toFiniteNumber(cap.rate),\n });\n }\n\n return out;\n }\n}\n\nfunction nextCopyLabel(old: string): string {\n // \"Label\" -> \"Label (copy)\", \"Label (copy)\" -> \"Label (copy 2)\"\n // noinspection RegExpUnnecessaryNonCapturingGroup\n const m = old.match(/^(.*?)(?:\\s*\\(copy(?:\\s+(\\d+))?\\))$/i);\n if (!m) return `${old} (copy)`;\n const stem = m[1].trim();\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\n return `${stem} (copy ${n})`;\n}\n\nfunction nextCopyName(old?: string): string | undefined {\n if (!old) return undefined;\n // \"name\" -> \"name_copy\", \"name_copy\" -> \"name_copy2\", \"name_copy2\" -> \"name_copy3\"\n const m = old.match(/^(.*?)(_copy(\\d+)?)$/i);\n if (!m) return `${old}_copy`;\n const stem = m[1];\n const n = m[3] ? parseInt(m[3], 10) + 1 : 2;\n return `${stem}_copy${n}`;\n}\n\nfunction defaultOptionIdStrategy(old: string): string {\n // \"basic\" -> \"basic_copy\" / \"basic_copy2\"…\n return nextCopyId(old);\n}\n\nfunction nextCopyId(old: string): string {\n // \"tag_1\" -> \"tag_1_copy\" or bumps trailing copy N\n // noinspection RegExpUnnecessaryNonCapturingGroup\n const m = old.match(/^(.*?)(?:_copy(\\d+)?)$/i);\n if (!m) return `${old}_copy`;\n const stem = m[1];\n const n = m[2] ? parseInt(m[2], 10) + 1 : 2;\n return `${stem}_copy${n}`;\n}\n\nfunction bumpSuffix(old: string): string {\n // \"foo_copy\" -> \"foo_copy2\", \"foo_copy2\" -> \"foo_copy3\"\n const m = old.match(/^(.*?)(\\d+)$/);\n if (!m) return `${old}2`;\n const stem = m[1];\n return `${stem}${parseInt(m[2], 10) + 1}`;\n}\n\n// Accept only these shapes; drop everything else.\ntype QuantityRule = { valueBy: \"value\" | \"length\" | \"eval\"; code?: string };\n\nfunction normalizeQuantityRule(input: unknown): QuantityRule | undefined {\n if (!input || typeof input !== \"object\") return undefined;\n const v = input as any;\n const vb = v.valueBy;\n if (vb !== \"value\" && vb !== \"length\" && vb !== \"eval\") return undefined;\n\n const out: QuantityRule = { valueBy: vb };\n if (vb === \"eval\" && typeof v.code === \"string\" && v.code.trim()) {\n out.code = v.code;\n }\n // For non-eval, any provided code is dropped.\n return out;\n}\n\n// ---- Policy evaluation (compiled rules) -------------------------------------\n\nfunction evaluateServicePolicies(\n rules: DynamicRule[] | undefined,\n svcIds: (string | number)[],\n svcMap: DgpServiceMap,\n tagId: string,\n): { ok: boolean; errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n if (!rules || !rules.length) return { ok: true, errors, warnings };\n\n const relevant = rules.filter(\n (r) =>\n r.subject === \"services\" &&\n (r.scope === \"visible_group\" || r.scope === \"global\"),\n );\n\n for (const r of relevant) {\n const ids = svcIds.filter((id) =>\n matchesRuleFilter(svcMap[Number(id)], r, tagId),\n );\n const projection = r.projection || \"service.id\";\n const values = ids.map((id) =>\n policyProjectValue(svcMap[Number(id)], projection),\n );\n\n let ok = true;\n switch (r.op) {\n case \"all_equal\":\n ok = values.length <= 1 || values.every((v) => v === values[0]);\n break;\n case \"unique\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size === values.length;\n break;\n }\n case \"no_mix\": {\n const uniq = new Set(values.map((v) => String(v)));\n ok = uniq.size <= 1;\n break;\n }\n case \"all_true\":\n ok = values.every((v) => !!v);\n break;\n case \"any_true\":\n ok = values.some((v) => !!v);\n break;\n case \"max_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length <= n : true;\n break;\n }\n case \"min_count\": {\n const n = typeof r.value === \"number\" ? r.value : NaN;\n ok = Number.isFinite(n) ? values.length >= n : true;\n break;\n }\n default:\n ok = true;\n }\n\n if (!ok) {\n if ((r.severity ?? \"error\") === \"error\")\n errors.push(r.id ?? \"policy_error\");\n else warnings.push(r.id ?? \"policy_warning\");\n }\n }\n\n return { ok: errors.length === 0, errors, warnings };\n}\n\nfunction policyProjectValue(\n cap: DgpServiceCapability | undefined,\n projection: string,\n) {\n if (!cap) return undefined;\n const key = projection.startsWith(\"service.\")\n ? projection.slice(8)\n : projection;\n return (cap as any)[key];\n}\n\nfunction matchesRuleFilter(\n cap: DgpServiceCapability | undefined,\n rule: DynamicRule,\n tagId: string,\n): boolean {\n if (!cap) return false;\n const f = rule.filter;\n if (!f) return true;\n\n if (f.tag_id && !toStrSet(f.tag_id).has(String(tagId))) return false;\n // role is intentionally ignored at suggestion-time (unknown), as discussed.\n return true;\n}\n\nfunction toStrSet(v: string | string[] | number | number[]): Set<string> {\n const arr = Array.isArray(v) ? v : [v];\n const s = new Set<string>();\n for (const x of arr) s.add(String(x));\n return s;\n}\n\ntype ServiceCheck = {\n id: number | string;\n ok: boolean;\n fitsConstraints: boolean;\n passesRate: boolean;\n passesPolicies: boolean;\n policyErrors?: string[];\n policyWarnings?: string[];\n reasons: Array<\n | \"constraint_mismatch\"\n | \"rate_policy\"\n | \"policy_error\"\n | \"missing_capability\"\n >;\n cap?: DgpServiceCapability;\n rate?: number;\n};\n","// src/core/normalise.ts\n\nimport { cloneDeep } from \"lodash-es\";\nimport type {\n Field,\n FieldOption,\n PricingRole,\n ServiceFallback,\n ServiceIdRef,\n ServiceProps,\n Tag,\n} from \"@/schema\";\n\nexport type NormaliseOptions = {\n /** default pricing role for fields/options when missing */\n defaultPricingRole?: PricingRole; // default: 'base',\n constraints?: string[];\n};\n\nexport function normalise(\n input: unknown,\n opts: NormaliseOptions = {},\n): ServiceProps {\n const defRole: PricingRole = opts.defaultPricingRole ?? \"base\";\n const constraints = opts.constraints ?? [\"refill\", \"cancel\", \"dripfeed\"];\n const obj = toObject(input);\n\n // ── Canonical top-level keys only\n const rawFilters = Array.isArray((obj as any).filters)\n ? (obj as any).filters\n : [];\n const rawFields = Array.isArray((obj as any).fields)\n ? (obj as any).fields\n : [];\n\n const includes_for_buttons = toStringArrayMap(\n (obj as any).includes_for_buttons,\n );\n const excludes_for_buttons = toStringArrayMap(\n (obj as any).excludes_for_buttons,\n );\n\n // Tags & fields\n let filters: Tag[] = rawFilters.map((t: any) => coerceTag(t, constraints));\n const fields: Field[] = rawFields.map((f: any) => coerceField(f, defRole));\n\n // ── Ensure a root tag exists (id: 't:root')\n if (!filters.some((t) => t.id === \"t:root\")) {\n filters = [{ id: \"t:root\", label: \"Root\" }, ...filters];\n }\n\n // Canonical fallbacks only\n const fallbacks = coerceFallbacks((obj as any).fallbacks);\n\n const out: ServiceProps = {\n filters,\n fields,\n order_for_tags: (obj as any).order_for_tags,\n ...(isNonEmpty(includes_for_buttons) && { includes_for_buttons }),\n ...(isNonEmpty(excludes_for_buttons) && { excludes_for_buttons }),\n ...(fallbacks &&\n (isNonEmpty(fallbacks.nodes) || isNonEmpty(fallbacks.global)) && {\n fallbacks,\n }),\n schema_version:\n typeof (obj as any).schema_version === \"string\"\n ? (obj as any).schema_version\n : \"1.0\",\n };\n\n propagateConstraints(out, constraints);\n return out;\n}\n\n/* ───────────────────────── Constraint propagation ───────────────────────── */\n\n/**\n * Propagate constraint flags down the tag tree:\n * - Any flag defined on an ancestor overrides the child's local value.\n * - Writes back the effective value to each tag.constraints.\n * - Records provenance in tag.constraints_origin[flag] = <originTagId>.\n * - Records child overrides in tag.constraints_overrides[flag] = { from, to, origin }.\n *\n * IMPORTANT: Children inherit the **effective** value from their parent,\n * not the parent's raw local. This ensures overridden values keep propagating.\n */\nfunction propagateConstraints(props: ServiceProps, flagKeys: string[]): void {\n const tags = Array.isArray(props.filters) ? props.filters : [];\n if (!tags.length) return;\n\n const byId = new Map(tags.map((t) => [t.id, t]));\n const children = new Map<string, Tag[]>();\n\n for (const t of tags) {\n const pid = t.bind_id;\n if (!pid || !byId.has(pid)) continue;\n if (!children.has(pid)) children.set(pid, []);\n children.get(pid)!.push(t);\n }\n\n const roots = tags.filter((t) => !t.bind_id || !byId.has(t.bind_id));\n const starts = roots.length ? roots : tags;\n\n type Inherited = Partial<Record<string, { val: boolean; origin: string }>>;\n const visited = new Set<string>();\n\n const visit = (tag: Tag, inherited: Inherited) => {\n if (visited.has(tag.id)) return;\n visited.add(tag.id);\n\n // If the tag already has overrides, it means it was already normalised once.\n // We should use the 'from' value as our local baseline for this pass\n // so that we don't lose the original local intent.\n const local = cloneDeep(tag.constraints ?? {});\n if (tag.constraints_overrides) {\n for (const [k, over] of Object.entries(tag.constraints_overrides)) {\n if (over) local[k] = over.from;\n }\n }\n\n const next: Partial<Record<string, boolean>> = {};\n const origin: Partial<Record<string, string>> = {};\n const overrides: NonNullable<Tag[\"constraints_overrides\"]> = {};\n\n for (const k of flagKeys) {\n const inh = inherited[k];\n const prev = local[k];\n\n if (inh) {\n if (prev === undefined || prev === inh.val) {\n next[k] = inh.val;\n origin[k] = inh.origin;\n } else {\n next[k] = inh.val;\n origin[k] = inh.origin;\n overrides[k] = {\n from: prev as boolean,\n to: inh.val,\n origin: inh.origin,\n };\n }\n } else if (prev !== undefined) {\n next[k] = prev as boolean;\n origin[k] = tag.id;\n }\n }\n\n tag.constraints = Object.keys(next).length ? next : undefined;\n tag.constraints_origin = Object.keys(origin).length ? origin : undefined;\n tag.constraints_overrides = Object.keys(overrides).length ? overrides : undefined;\n\n const passDown: Inherited = { ...inherited };\n for (const k of flagKeys) {\n if (next[k] !== undefined && origin[k] !== undefined) {\n passDown[k] = { val: next[k] as boolean, origin: origin[k]! };\n }\n }\n for (const c of children.get(tag.id) ?? []) visit(c, passDown);\n };\n\n for (const r of starts) visit(r, {});\n}\n\n/* ───────────────────────────── coercers ───────────────────────────── */\n\nfunction coerceTag(src: any, flagKeys: string[]): Tag {\n if (!src || typeof src !== \"object\") src = {};\n const id = str(src.id);\n const label = str(src.label);\n const bind_id = str(src.bind_id) || (id == \"t:root\" ? undefined : \"t:root\");\n const service_id = toNumberOrUndefined(src.service_id);\n\n const includes = toStringArray(src.includes);\n const excludes = toStringArray(src.excludes);\n\n let constraints: Record<string, boolean> | undefined = undefined;\n if (src.constraints && typeof src.constraints === \"object\") {\n constraints = {};\n for (const k of flagKeys) {\n const v = (src.constraints as any)[k];\n if (v !== undefined) {\n constraints[k] = bool(v)!;\n }\n }\n if (Object.keys(constraints).length === 0) {\n constraints = undefined;\n }\n }\n\n const constraints_overrides =\n src.constraints_overrides && typeof src.constraints_overrides === \"object\"\n ? (src.constraints_overrides as Tag[\"constraints_overrides\"])\n : undefined;\n\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? (src.meta as Record<string, unknown>)\n : undefined;\n\n const tag: Tag = {\n id: \"\",\n label: \"\",\n ...(id && { id }),\n ...(label && { label }),\n ...(bind_id && { bind_id }),\n ...(service_id !== undefined && { service_id }),\n ...(constraints && { constraints }),\n ...(constraints_overrides && { constraints_overrides }),\n ...(includes.length && { includes: dedupe(includes) }),\n ...(excludes.length && { excludes: dedupe(excludes) }),\n ...(meta && { meta }),\n };\n return tag;\n}\nfunction coerceField(src: any, defRole: PricingRole): Field {\n if (!src || typeof src !== \"object\") src = {};\n\n const bind_id = normaliseBindId(src.bind_id);\n const type = str(src.type) || \"text\";\n const id = str(src.id);\n const name = typeof src.name === \"string\" ? src.name : undefined;\n\n // BaseFieldUI (trimmed)\n const label = str(src.label) || \"\";\n const required = !!src.required;\n\n // host-defined UI schema + defaults (pass-through if objects)\n const ui =\n src.ui && typeof src.ui === \"object\"\n ? (src.ui as Record<string, unknown>)\n : undefined;\n const defaults =\n src.defaults && typeof src.defaults === \"object\"\n ? (src.defaults as Record<string, unknown>)\n : undefined;\n\n // field-level role (used as default for options)\n const pricing_role: PricingRole =\n src.pricing_role === \"utility\" || src.pricing_role === \"base\"\n ? src.pricing_role\n : defRole;\n\n // options\n const srcHasOptions = Array.isArray(src.options) && src.options.length > 0;\n const options = srcHasOptions\n ? (src.options as any[]).map((o) => coerceOption(o, pricing_role))\n : undefined;\n\n // custom component (only for type === 'custom')\n const component =\n type === \"custom\" ? str(src.component) || undefined : undefined;\n\n // meta (pass-through)\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? { ...(src.meta as any) }\n : undefined;\n\n // button rule:\n // - option-based fields are always buttons\n // - otherwise, respect explicit boolean true\n const button: boolean = srcHasOptions ? true : src.button === true;\n\n // field-level service_id is allowed only for *buttons* with base role\n const field_service_id_raw = toNumberOrUndefined(src.service_id);\n const field_service_id =\n button &&\n pricing_role !== \"utility\" &&\n field_service_id_raw !== undefined\n ? field_service_id_raw\n : undefined;\n\n const field: Field = {\n id,\n type,\n ...(bind_id !== undefined && { bind_id }),\n ...(name && { name }),\n ...(options && options.length && { options }),\n ...(component && { component }),\n pricing_role,\n label,\n required,\n ...(ui && { ui: ui as any }),\n ...(defaults && { defaults }),\n ...(meta && { meta }),\n ...(button ? { button } : {}),\n ...(field_service_id !== undefined && { service_id: field_service_id }),\n };\n\n return field;\n}\n\nfunction coerceOption(src: any, inheritRole: PricingRole): FieldOption {\n if (!src || typeof src !== \"object\") src = {};\n const id = str(src.id);\n const label = str(src.label);\n const service_id = toNumberOrUndefined(src.service_id);\n const value =\n typeof src.value === \"string\" || typeof src.value === \"number\"\n ? (src.value as string | number)\n : undefined;\n\n const pricing_role: PricingRole =\n src.pricing_role === \"utility\" || src.pricing_role === \"base\"\n ? src.pricing_role\n : inheritRole;\n\n const meta =\n src.meta && typeof src.meta === \"object\"\n ? (src.meta as Record<string, unknown>)\n : undefined;\n\n const option: FieldOption = {\n id: \"\",\n label: \"\",\n ...(id && { id }),\n ...(label && { label }),\n ...(value !== undefined && { value }),\n ...(service_id !== undefined && { service_id }),\n pricing_role,\n ...(meta && { meta }),\n };\n return option;\n}\n\n/* ───────────────────────── fallbacks (canonical only) ───────────────────────── */\n\nfunction coerceFallbacks(src: any): ServiceFallback | undefined {\n if (!src || typeof src !== \"object\") return undefined;\n\n const out: ServiceFallback = {};\n const g = (src as any).global;\n const n = (src as any).nodes;\n\n if (g && typeof g === \"object\") {\n const rg: Record<string, ServiceIdRef[]> = {};\n for (const [k, v] of Object.entries(g)) {\n const key = String(k);\n const arr = toServiceIdArray(v);\n const clean = dedupe(arr.filter((x) => String(x) !== key));\n if (clean.length) rg[key] = clean;\n }\n if (Object.keys(rg).length) out.global = rg;\n }\n\n if (n && typeof n === \"object\") {\n const rn: Record<string, ServiceIdRef[]> = {};\n for (const [nodeId, v] of Object.entries(n)) {\n const key = String(nodeId);\n const arr = toServiceIdArray(v);\n const clean = dedupe(arr.filter((x) => String(x) !== key));\n if (clean.length) rn[key] = clean;\n }\n if (Object.keys(rn).length) out.nodes = rn;\n }\n\n return out.nodes || out.global ? out : undefined;\n}\n\n/* ───────────────────────── utilities ───────────────────────── */\n\nfunction toObject(input: unknown): Record<string, unknown> {\n if (input && typeof input === \"object\")\n return input as Record<string, unknown>;\n throw new TypeError(\"normalise(): expected an object payload\");\n}\n\nfunction normaliseBindId(bind: unknown): string | string[] | undefined {\n if (typeof bind === \"string\" && bind.trim()) return bind.trim();\n if (Array.isArray(bind)) {\n const arr = dedupe(bind.map((b) => String(b).trim()).filter(Boolean));\n if (arr.length === 0) return undefined;\n if (arr.length === 1) return arr[0];\n return arr;\n }\n return undefined;\n}\n\nfunction toStringArrayMap(src: any): Record<string, string[]> | undefined {\n if (!src || typeof src !== \"object\") return undefined;\n const out: Record<string, string[]> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!k) continue;\n const arr = toStringArray(v);\n if (arr.length) out[k] = dedupe(arr);\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction toStringArray(v: any): string[] {\n if (!Array.isArray(v)) return [];\n return v.map((x) => String(x)).filter((s) => !!s && s.trim().length > 0);\n}\n\nfunction toNumberOrUndefined(v: any): number | undefined {\n if (v === null || v === undefined) return undefined;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction str(v: any): string | undefined {\n if (typeof v === \"string\" && v.trim().length > 0) return v.trim();\n return undefined;\n}\n\nfunction bool(v: any): boolean | undefined {\n if (v === undefined) return undefined;\n return !!v;\n}\n\nfunction dedupe<T>(arr: T[]): T[] {\n return Array.from(new Set(arr));\n}\n\nfunction isNonEmpty<T extends Record<string, any> | undefined>(\n obj: T,\n): obj is NonNullable<T> {\n return !!obj && Object.keys(obj).length > 0;\n}\n\nfunction toServiceIdArray(v: any): ServiceIdRef[] {\n if (!Array.isArray(v)) return [];\n return v\n .map((x) =>\n typeof x === \"number\" || typeof x === \"string\" ? x : String(x),\n )\n .filter(\n (x) => x !== \"\" && x !== null && x !== undefined,\n ) as ServiceIdRef[];\n}\n","import { Field } from \"@/schema\";\n\n/**\n * Heuristic: multi-select if type hints ('multiselect'|'checkbox') or meta.multi === true.\n * Hosts can rely on meta.multi if using custom type strings.\n */\nexport function isMultiField(f: Field): boolean {\n const t = (f.type || \"\").toLowerCase();\n const metaMulti = !!f.meta?.multi;\n return t === \"multiselect\" || t === \"checkbox\" || metaMulti;\n}\n","// src/core/policy.ts\nimport type { DynamicRule, ValidatorOptions } from \"@/schema/validation\";\n\nexport type PolicyDiagnostic = {\n ruleIndex: number;\n ruleId?: string;\n severity: \"error\" | \"warning\";\n message: string;\n path?: string; // e.g. \"filter.role\", \"op\"\n};\n\nconst ALLOWED_SCOPES = new Set<DynamicRule[\"scope\"]>([\n \"global\",\n \"visible_group\",\n]);\nconst ALLOWED_SUBJECTS = new Set<DynamicRule[\"subject\"]>([\"services\"]);\nconst ALLOWED_OPS = new Set<DynamicRule[\"op\"]>([\n \"all_equal\",\n \"unique\",\n \"no_mix\",\n \"all_true\",\n \"any_true\",\n \"max_count\",\n \"min_count\",\n]);\nconst ALLOWED_ROLES = new Set<NonNullable<DynamicRule[\"filter\"]>[\"role\"]>([\n \"base\",\n \"utility\",\n \"both\",\n]);\nconst ALLOWED_SEVERITIES = new Set<NonNullable<DynamicRule[\"severity\"]>>([\n \"error\",\n \"warning\",\n]);\n\nconst ALLOWED_WHERE_OPS = new Set<\n NonNullable<NonNullable<DynamicRule[\"filter\"]>[\"where\"]>[number][\"op\"]\n>([\"eq\", \"neq\", \"in\", \"nin\", \"exists\", \"truthy\", \"falsy\"]);\n\ntype WhereClause = NonNullable<\n NonNullable<DynamicRule[\"filter\"]>[\"where\"]\n>[number];\n\nfunction normaliseWhere(\n src: unknown,\n d: PolicyDiagnostic[],\n i: number,\n id: string,\n): WhereClause[] | undefined {\n if (src === undefined) return undefined;\n if (!Array.isArray(src)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: \"filter.where must be an array; ignored.\",\n path: \"filter.where\",\n });\n return undefined;\n }\n\n const out: WhereClause[] = [];\n\n src.forEach((raw, j) => {\n const obj: any = raw && typeof raw === \"object\" ? raw : null;\n const path: string | undefined =\n typeof obj?.path === \"string\" && obj.path.trim()\n ? obj.path.trim()\n : undefined;\n\n if (!path) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}].path must be a non-empty string; entry ignored.`,\n path: `filter.where[${j}].path`,\n });\n return;\n }\n\n if (!path.startsWith(\"service.\")) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}].path should start with \"service.\" for subject \"services\".`,\n path: `filter.where[${j}].path`,\n });\n }\n\n const opRaw: unknown = obj?.op;\n const op: WhereClause[\"op\"] =\n opRaw === undefined\n ? \"eq\"\n : typeof opRaw === \"string\" &&\n ALLOWED_WHERE_OPS.has(opRaw as any)\n ? (opRaw as any)\n : \"eq\";\n\n if (\n opRaw !== undefined &&\n !(typeof opRaw === \"string\" && ALLOWED_WHERE_OPS.has(opRaw as any))\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `Unknown filter.where[${j}].op; defaulted to \"eq\".`,\n path: `filter.where[${j}].op`,\n });\n }\n\n const value: unknown = obj?.value;\n\n // validate value requirements lightly (non-fatal)\n if (op === \"exists\" || op === \"truthy\" || op === \"falsy\") {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}] op \"${op}\" does not use \"value\".`,\n path: `filter.where[${j}].value`,\n });\n }\n } else if (op === \"in\" || op === \"nin\") {\n if (!Array.isArray(value)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `filter.where[${j}] op \"${op}\" expects an array \"value\".`,\n path: `filter.where[${j}].value`,\n });\n }\n }\n\n out.push({ path, op, value });\n });\n\n return out.length ? out : undefined;\n}\n\n/**\n * Compile & validate arbitrary JSON into DynamicRule[] with defaults:\n * - scope: (default) \"visible_group\"\n * - subject: (default) \"services\"\n * - filter.role: (default) \"both\"\n * - severity: (default) \"error\"\n * - projection: (default) \"service.id\"\n *\n * Returns normalized rules + diagnostics (errors/warnings).\n */\nexport function compilePolicies(raw: unknown): {\n policies: DynamicRule[];\n diagnostics: PolicyDiagnostic[];\n} {\n const diagnostics: PolicyDiagnostic[] = [];\n const policies: DynamicRule[] = [];\n\n if (!Array.isArray(raw)) {\n diagnostics.push({\n ruleIndex: -1,\n severity: \"error\",\n message: \"Policies root must be an array.\",\n });\n return { policies, diagnostics };\n }\n\n raw.forEach((entry, i) => {\n const d: PolicyDiagnostic[] = [];\n const src = entry && typeof entry === \"object\" ? (entry as any) : {};\n\n let id: string | undefined =\n typeof src.id === \"string\" && src.id.trim()\n ? src.id.trim()\n : undefined;\n\n // id default\n if (!id) {\n id = `policy_${i + 1}`;\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Missing \"id\"; generated automatically.',\n path: \"id\",\n });\n }\n\n // ✅ label: required by DynamicRule; default to id\n const label: string =\n typeof src.label === \"string\" && src.label.trim()\n ? src.label.trim()\n : id;\n\n if (!(typeof src.label === \"string\" && src.label.trim())) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Missing \"label\"; defaulted to rule id.',\n path: \"label\",\n });\n }\n\n // scope default + validation\n let scope: DynamicRule[\"scope\"] = ALLOWED_SCOPES.has(src.scope)\n ? src.scope\n : src.scope === undefined\n ? \"visible_group\"\n : \"visible_group\";\n if (src.scope !== undefined && !ALLOWED_SCOPES.has(src.scope)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"scope\"; defaulted to \"visible_group\".',\n path: \"scope\",\n });\n }\n\n // subject default + validation\n let subject: DynamicRule[\"subject\"] = ALLOWED_SUBJECTS.has(src.subject)\n ? src.subject\n : \"services\";\n if (src.subject !== undefined && !ALLOWED_SUBJECTS.has(src.subject)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"subject\"; defaulted to \"services\".',\n path: \"subject\",\n });\n }\n\n // op required & valid\n const op: DynamicRule[\"op\"] = src.op;\n if (!ALLOWED_OPS.has(op)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"error\",\n message: `Invalid \"op\": ${String(op)}.`,\n path: \"op\",\n });\n }\n\n // projection default\n let projection: string | undefined =\n typeof src.projection === \"string\" && src.projection.trim()\n ? src.projection.trim()\n : \"service.id\";\n\n // For services subject, encourage service.* projection\n if (\n subject === \"services\" &&\n projection &&\n !projection.startsWith(\"service.\")\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message:\n 'Projection should start with \"service.\" for subject \"services\".',\n path: \"projection\",\n });\n }\n\n const filterSrc =\n src.filter && typeof src.filter === \"object\"\n ? (src.filter as DynamicRule[\"filter\"])\n : undefined;\n\n const role: NonNullable<DynamicRule[\"filter\"]>[\"role\"] =\n filterSrc?.role && ALLOWED_ROLES.has(filterSrc.role)\n ? filterSrc.role\n : \"both\";\n\n if (filterSrc?.role && !ALLOWED_ROLES.has(filterSrc.role)) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown filter.role; defaulted to \"both\".',\n path: \"filter.role\",\n });\n }\n\n const filter: DynamicRule[\"filter\"] | undefined = {\n role,\n tag_id:\n filterSrc?.tag_id !== undefined\n ? Array.isArray(filterSrc.tag_id)\n ? filterSrc.tag_id\n : [filterSrc.tag_id]\n : undefined,\n field_id:\n filterSrc?.field_id !== undefined\n ? Array.isArray(filterSrc.field_id)\n ? filterSrc.field_id\n : [filterSrc.field_id]\n : undefined,\n where: normaliseWhere((filterSrc as any)?.where, d, i, id),\n };\n\n // severity default\n const severity: NonNullable<DynamicRule[\"severity\"]> =\n ALLOWED_SEVERITIES.has(src.severity) ? src.severity : \"error\";\n if (\n src.severity !== undefined &&\n !ALLOWED_SEVERITIES.has(src.severity)\n ) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: 'Unknown \"severity\"; defaulted to \"error\".',\n path: \"severity\",\n });\n }\n\n // value requirements by op\n const value = src.value;\n if (op === \"max_count\" || op === \"min_count\") {\n if (!(typeof value === \"number\" && Number.isFinite(value))) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"error\",\n message: `\"${op}\" requires numeric \"value\".`,\n path: \"value\",\n });\n }\n } else if (op === \"all_true\" || op === \"any_true\") {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `\"${op}\" ignores \"value\"; it checks all/any true.`,\n path: \"value\",\n });\n }\n } else {\n if (value !== undefined) {\n d.push({\n ruleIndex: i,\n ruleId: id,\n severity: \"warning\",\n message: `\"${op}\" does not use \"value\".`,\n path: \"value\",\n });\n }\n }\n\n // assemble rule if no fatal (error-level) diagnostics for op/value\n const hasFatal = d.some((x) => x.severity === \"error\");\n if (!hasFatal) {\n const rule: DynamicRule = {\n id,\n label, // ✅ now always present\n scope,\n subject,\n filter,\n projection,\n op,\n value: value as any,\n severity,\n message:\n typeof src.message === \"string\" ? src.message : undefined,\n };\n policies.push(rule);\n }\n\n diagnostics.push(...d);\n });\n\n return { policies, diagnostics };\n}\n\n/** Split diagnostics for convenience in UI */\nexport function splitPolicyDiagnostics(diags: PolicyDiagnostic[]): {\n errors: PolicyDiagnostic[];\n warnings: PolicyDiagnostic[];\n} {\n return {\n errors: diags.filter((d) => d.severity === \"error\"),\n warnings: diags.filter((d) => d.severity === \"warning\"),\n };\n}\n\n/**\n * Convenience helper: compile policies and pass to validator options.\n * You can use this in your editor before calling validate().\n */\nexport function withCompiledPolicies(\n opts: ValidatorOptions,\n rawPolicies: unknown,\n): { opts: ValidatorOptions; diagnostics: PolicyDiagnostic[] } {\n const { policies, diagnostics } = compilePolicies(rawPolicies);\n return { opts: { ...opts, policies }, diagnostics };\n}\n","import type { DgpServiceMap, DgpServiceCapability } from \"@/schema/provider\";\r\nimport type { FallbackSettings } from \"@/schema/validation\";\r\n\r\n/**\r\n * Safely convert unknown to a finite number. Returns NaN if not finite.\r\n */\r\nexport function toFiniteNumber(v: unknown): number {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : NaN;\r\n}\r\n\r\n/**\r\n * Check if a candidate service satisfies the active tag constraints.\r\n * Only flags explicitly set to true are treated as required.\r\n */\r\nexport function constraintFitOk(\r\n svcMap: DgpServiceMap,\r\n candidate: string | number,\r\n constraints: Partial<Record<\"refill\" | \"cancel\" | \"dripfeed\", boolean>>,\r\n): boolean {\r\n const cap: DgpServiceCapability | undefined = svcMap[Number(candidate)];\r\n if (!cap) return false;\r\n\r\n if (constraints.dripfeed === true && !cap.dripfeed) return false;\r\n if (constraints.refill === true && !cap.refill) return false;\r\n return !(constraints.cancel === true && !cap.cancel);\r\n\r\n}\r\n\r\n/**\r\n * Evaluate candidate rate against primary according to the fallback rate policy.\r\n * If either service is missing or rates are not finite, returns false.\r\n */\r\nexport function rateOk(\r\n svcMap: DgpServiceMap,\r\n candidate: string | number,\r\n primary: string | number,\r\n policy: FallbackSettings,\r\n): boolean {\r\n const cand = svcMap[Number(candidate)];\r\n const prim = svcMap[Number(primary)];\r\n if (!cand || !prim) return false;\r\n\r\n const cRate = toFiniteNumber(cand.rate);\r\n const pRate = toFiniteNumber(prim.rate);\r\n if (!Number.isFinite(cRate) || !Number.isFinite(pRate)) return false;\r\n\r\n const rp = policy.ratePolicy ?? { kind: \"lte_primary\" as const };\r\n switch (rp.kind) {\r\n case \"lte_primary\":\r\n return cRate <= pRate;\r\n case \"within_pct\": {\r\n const pct = Math.max(0, rp.pct ?? 0);\r\n return cRate <= pRate * (1 + pct / 100);\r\n }\r\n case \"at_least_pct_lower\": {\r\n const pct = Math.max(0, rp.pct ?? 0);\r\n return cRate <= pRate * (1 - pct / 100);\r\n }\r\n default:\r\n return false;\r\n }\r\n}\r\n","// src/react/canvas/selection.ts\nimport type { Builder } from \"@/core\";\nimport type { Field, PricingRole, ServiceProps, Tag } from \"@/schema\";\nimport type { DgpServiceCapability } from \"@/schema/provider\";\n\nexport type Env = \"client\" | \"workspace\";\n\nexport type VisibleGroup = {\n tagId?: string;\n tag?: Tag;\n fields: Field[];\n fieldIds: string[];\n parentTags?: Tag[];\n childrenTags?: Tag[];\n /** In order of selection: tag base (unless overridden) then selected options */\n services?: DgpServiceCapability[];\n};\n\n// Returned by visibleGroup():\nexport type VisibleGroupResult =\n | { kind: \"single\"; group: VisibleGroup }\n | { kind: \"multi\"; groups: string[] };\n\ntype ChangeEvt = { ids: string[]; primary?: string };\ntype Listener = (e: ChangeEvt) => void;\n\nconst isTagId = (id: string) => typeof id === \"string\" && id.startsWith(\"t:\");\nconst isOptionId = (id: string) =>\n typeof id === \"string\" && id.startsWith(\"o:\");\n\nexport type SelectionOptions = {\n env?: Env;\n rootTagId?: string;\n /** Resolve service capability from an id (used for `services` array) */\n resolveService?: (id: any) => DgpServiceCapability | undefined;\n};\n\nexport class Selection {\n private set = new Set<string>();\n private primaryId: string | undefined;\n private currentTagId: string | undefined;\n private onChangeFns: Listener[] = [];\n\n constructor(\n private readonly builder: Builder,\n private readonly opts: SelectionOptions,\n ) {}\n\n // ── Public mutators ──────────────────────────────────────────────────────\n replace(id?: string | null) {\n if (!id) return this.clear();\n this.set.clear();\n this.set.add(id);\n this.primaryId = id;\n this.updateCurrentTagFrom(id);\n this.emit();\n }\n\n add(id: string) {\n this.set.add(id);\n this.primaryId = id;\n this.updateCurrentTagFrom(id);\n this.emit();\n }\n\n remove(id: string) {\n if (!this.set.delete(id)) return;\n if (this.primaryId === id) {\n this.primaryId = this.set.values().next().value;\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\n }\n this.emit();\n }\n\n toggle(id: string) {\n if (this.set.has(id)) this.remove(id);\n else this.add(id);\n }\n\n many(ids: Iterable<string>, primary?: string) {\n this.set = new Set(ids);\n this.primaryId = primary ?? this.set.values().next().value;\n if (this.primaryId) this.updateCurrentTagFrom(this.primaryId);\n this.emit();\n }\n\n clear() {\n if (!this.set.size && !this.primaryId) return;\n this.set.clear();\n this.primaryId = undefined;\n this.emit();\n }\n\n // ── Read APIs ────────────────────────────────────────────────────────────\n all(): ReadonlySet<string> {\n return this.set;\n }\n\n has(id: string): boolean {\n return this.set.has(id);\n }\n\n primary(): string | undefined {\n return this.primaryId;\n }\n\n currentTag(): string | undefined {\n return this.currentTagId;\n }\n\n onChange(fn: Listener): () => void {\n this.onChangeFns.push(fn);\n return () => {\n const i = this.onChangeFns.indexOf(fn);\n if (i >= 0) this.onChangeFns.splice(i, 1);\n };\n }\n\n // ── Main: visible group snapshot (env-aware) ─────────────────────────────\n visibleGroup(): VisibleGroupResult {\n const props = this.builder.getProps() as ServiceProps;\n\n // WORKSPACE: >1 tag selected → return raw selection set\n if ((this.opts.env ?? \"client\") === \"workspace\") {\n const tagIds = Array.from(this.set).filter(isTagId);\n if (tagIds.length > 1) {\n return { kind: \"multi\", groups: Array.from(this.set) };\n }\n }\n\n const tagId = this.resolveTagContextId(props);\n if (!tagId)\n return { kind: \"single\", group: { fields: [], fieldIds: [] } };\n\n const group = this.computeGroupForTag(props, tagId);\n return { kind: \"single\", group };\n }\n\n // ── Internals ────────────────────────────────────────────────────────────\n private emit() {\n const payload: ChangeEvt = {\n ids: Array.from(this.set),\n primary: this.primaryId,\n };\n for (const fn of this.onChangeFns) fn(payload);\n }\n\n private updateCurrentTagFrom(id: string) {\n const props = this.builder.getProps() as ServiceProps;\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n\n if (tags.some((t) => t.id === id)) {\n this.currentTagId = id;\n return;\n }\n const f = fields.find((x) => x.id === id);\n if (f?.bind_id) {\n this.currentTagId = Array.isArray(f.bind_id)\n ? f.bind_id[0]\n : f.bind_id;\n return;\n }\n\n if (isOptionId(id)) {\n const host = fields.find((x) =>\n (x.options ?? []).some((o) => o.id === id),\n );\n if (host?.bind_id) {\n this.currentTagId = Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n return;\n }\n }\n\n if (id.includes(\"::\")) {\n const [fid] = id.split(\"::\");\n const host = fields.find((x) => x.id === fid);\n if (host?.bind_id) {\n this.currentTagId = Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n return;\n }\n }\n }\n\n private resolveTagContextId(props: ServiceProps): string | undefined {\n if (this.currentTagId) return this.currentTagId;\n\n for (const id of this.set) if (isTagId(id)) return id;\n\n const fields = props.fields ?? [];\n for (const id of this.set) {\n const f = fields.find((x) => x.id === id);\n if (f?.bind_id)\n return Array.isArray(f.bind_id) ? f.bind_id[0] : f.bind_id;\n }\n\n for (const id of this.set) {\n if (isOptionId(id)) {\n const host = fields.find((x) =>\n (x.options ?? []).some((o) => o.id === id),\n );\n if (host?.bind_id)\n return Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n }\n if (id.includes(\"::\")) {\n const [fid] = id.split(\"::\");\n const host = fields.find((x) => x.id === fid);\n if (host?.bind_id)\n return Array.isArray(host.bind_id)\n ? host.bind_id[0]\n : host.bind_id;\n }\n }\n\n return this.opts.rootTagId;\n }\n\n private selectedButtonTriggerIds(props: ServiceProps): string[] {\n const fields = props.fields ?? [];\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n\n const out: string[] = [];\n for (const selId of this.set) {\n // option ids are triggers\n if (selId.startsWith(\"o:\")) {\n out.push(selId);\n continue;\n }\n\n // field ids are triggers ONLY if the field is a button\n const f = fieldById.get(selId);\n if (f?.button === true) out.push(selId);\n }\n\n return out;\n }\n\n private computeGroupForTag(\n props: ServiceProps,\n tagId: string,\n ): VisibleGroup {\n const tags = props.filters ?? [];\n const fields = props.fields ?? [];\n const tagById = new Map(tags.map((t) => [t.id, t]));\n const tag = tagById.get(tagId);\n\n // ---- delegate visible fields to builder\n const selectedTriggerIds = this.selectedButtonTriggerIds(props);\n const fieldIds = this.builder.visibleFields(tagId, selectedTriggerIds);\n\n const fieldById = new Map(fields.map((f) => [f.id, f]));\n const visible = fieldIds\n .map((id) => fieldById.get(id))\n .filter(Boolean) as Field[];\n\n // ---- ancestry & immediate children (unchanged)\n const parentTags: Tag[] = [];\n let cur = tag?.bind_id;\n const guard = new Set<string>();\n while (cur && !guard.has(cur)) {\n const t = tagById.get(cur);\n if (!t) break;\n parentTags.push(t);\n guard.add(cur);\n cur = t.bind_id;\n }\n const childrenTags = tags.filter((t) => t.bind_id === tagId);\n\n // ---- services: tag base (unless overridden) → selected OPTIONs + selected BUTTON FIELDs (in insertion order)\n const services: DgpServiceCapability[] = [];\n const resolve = this.opts.resolveService;\n\n // 1) tag base\n let baseAddedFromTag = false;\n if (tag?.service_id != null) {\n services.push(\n resolve?.(tag.service_id) ??\n ({ id: tag.service_id } as DgpServiceCapability),\n );\n baseAddedFromTag = true;\n }\n\n // 2) walk selected ids in insertion order\n let baseOverridden = false;\n for (const selId of this.set) {\n // OPTION selected\n const opt = this.findOptionById(fields, selId);\n if (opt?.service_id != null) {\n const role = (opt.pricing_role ?? \"base\") as PricingRole;\n const cap =\n resolve?.(opt.service_id) ??\n ({ id: opt.service_id } as DgpServiceCapability);\n\n baseOverridden = this.addServiceByRole(\n services,\n cap,\n role,\n baseAddedFromTag,\n baseOverridden,\n );\n continue;\n }\n\n // BUTTON FIELD selected\n const f = fieldById.get(selId);\n if (f?.button === true && f.service_id != null) {\n const role = (f.pricing_role ?? \"base\") as PricingRole;\n const cap =\n resolve?.(f.service_id) ??\n ({ id: f.service_id } as DgpServiceCapability);\n\n baseOverridden = this.addServiceByRole(\n services,\n cap,\n role,\n baseAddedFromTag,\n baseOverridden,\n );\n }\n }\n\n return {\n tagId,\n tag,\n fields: visible,\n fieldIds,\n parentTags,\n childrenTags,\n services,\n };\n }\n\n private addServiceByRole(\n services: DgpServiceCapability[],\n cap: DgpServiceCapability,\n role: PricingRole,\n baseAddedFromTag: boolean,\n baseOverridden: boolean,\n ): boolean {\n if (role === \"base\") {\n if (!baseOverridden) {\n if (baseAddedFromTag && services.length > 0) {\n services[0] = cap;\n } else {\n services.unshift(cap);\n }\n return true;\n } else {\n services.push(cap);\n }\n } else {\n services.push(cap);\n }\n return baseOverridden;\n }\n\n private findOptionById(fields: Field[], selId: string) {\n if (isOptionId(selId)) {\n for (const f of fields) {\n const o = f.options?.find((x) => x.id === selId);\n if (o) return o;\n }\n }\n if (selId.includes(\"::\")) {\n const [fid, oid] = selId.split(\"::\");\n const f = fields.find((x) => x.id === fid);\n const o = f?.options?.find((x) => x.id === oid || x.id === selId);\n if (o) return o;\n }\n return undefined;\n }\n}\n","import { EventBus } from \"@/react\";\nimport type {\n CanvasEvents,\n CanvasOptions,\n CanvasState,\n DraftWire,\n NodePositions,\n Viewport,\n} from \"@/schema/canvas-types\";\nimport type { Builder } from \"@/core\";\nimport type { EdgeKind, GraphSnapshot } from \"@/schema/graph\";\nimport { CommentsAPI } from \"./comments\";\nimport { CanvasBackendOptions } from \"./backend\";\nimport { Editor } from \"./editor\";\nimport { Selection } from \"./selection\";\nimport type { BackendScope } from \"@/react/workspace/context/backend\";\n\nexport class CanvasAPI {\n private bus = new EventBus<CanvasEvents>();\n private readonly state: CanvasState;\n public readonly builder: Builder;\n public readonly editor: Editor;\n private readonly autoEmit: boolean;\n readonly comments: CommentsAPI;\n readonly selection: Selection;\n\n constructor(\n builder: Builder,\n opts: CanvasOptions & CanvasBackendOptions = {},\n ) {\n this.builder = builder;\n this.autoEmit = opts.autoEmitState ?? true;\n this.selection = new Selection(builder, {\n env: \"workspace\",\n rootTagId: \"t:root\",\n });\n\n const graph = builder.tree();\n this.state = {\n graph,\n positions: {},\n selection: new Set(),\n highlighted: new Set(),\n viewport: { x: 0, y: 0, zoom: 1, ...opts.initialViewport },\n version: 1,\n };\n\n this.selection.onChange(({ ids }) => {\n // mirror into CanvasState for snapshot/versioning consumers\n this.state.selection = new Set(ids);\n this.bump();\n\n // keep existing event contract\n this.bus.emit(\"selection:change\", { ids });\n\n // keep existing auto-emit behaviour\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n });\n\n // compose comments with backend (if provided)\n const scopeProvider: (() => BackendScope | undefined) | undefined =\n (opts as unknown as { getScope?: () => BackendScope | undefined })\n .getScope ??\n (() => {\n const anyOpts = opts as unknown as Partial<{\n workspaceId: string;\n actorId: string;\n branchId: string;\n }>;\n\n if (\n !anyOpts.workspaceId ||\n !anyOpts.actorId ||\n !anyOpts.branchId\n ) {\n return undefined;\n }\n\n return {\n workspaceId: anyOpts.workspaceId,\n actorId: anyOpts.actorId,\n branchId: anyOpts.branchId,\n };\n });\n\n this.comments = new CommentsAPI(this.bus, {\n backend: opts.backend?.comments,\n getScope: scopeProvider,\n });\n\n this.editor = new Editor(builder, this, {\n serviceMap: builder.getServiceMap(),\n serviceExists: (id) => builder.getServiceMap().hasOwnProperty(id),\n ...opts,\n });\n\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n /* ─── Events ─────────────────────────────────────────────── */\n on = this.bus.on.bind(this.bus);\n once = this.bus.once.bind(this.bus);\n\n public emit<K extends keyof CanvasEvents>(\n event: K,\n payload: CanvasEvents[K],\n ): void {\n this.bus.emit(event, payload);\n }\n\n /* ─── State accessors ───────────────────────────────────── */\n snapshot(): CanvasState {\n // return an immutable-looking view\n return {\n ...this.state,\n selection: new Set(this.state.selection),\n highlighted: new Set(this.state.highlighted),\n graph: {\n nodes: [...this.state.graph.nodes],\n edges: [...this.state.graph.edges],\n },\n positions: { ...this.state.positions },\n };\n }\n\n getGraph(): GraphSnapshot {\n return this.state.graph;\n }\n\n getSelection(): string[] {\n return Array.from(this.state.selection);\n }\n\n getViewport(): Viewport {\n return { ...this.state.viewport };\n }\n\n /* ─── Graph lifecycle ───────────────────────────────────── */\n refreshGraph(): void {\n this.state.graph = this.builder.tree();\n this.bump();\n this.bus.emit(\"graph:update\", this.state.graph);\n }\n\n setPositions(pos: NodePositions): void {\n this.state.positions = { ...this.state.positions, ...pos };\n this.bump();\n }\n\n setPosition(id: string, x: number, y: number): void {\n this.state.positions[id] = { x, y };\n this.bump();\n }\n\n /* ─── Selection ─────────────────────────────────────────── */\n select(ids: string[] | Set<string>): void {\n this.selection.many(ids);\n }\n\n addToSelection(ids: string[] | Set<string>): void {\n const next = new Set(this.selection.all());\n let primary: string | undefined;\n\n for (const id of ids as any) {\n next.add(id);\n primary = id;\n }\n\n this.selection.many(next, primary);\n }\n\n toggleSelection(id: string): void {\n this.selection.toggle(id);\n }\n\n clearSelection(): void {\n this.selection.clear();\n }\n\n selectComments(threadId?: string): void {\n this.bus.emit(\"comment:select\", { threadId });\n }\n\n /* ─── Highlight / Hover ─────────────────────────────────── */\n setHighlighted(ids: string[] | Set<string>): void {\n this.state.highlighted = new Set(ids as any);\n this.bump();\n }\n\n setHover(id?: string): void {\n this.state.hoverId = id;\n this.bump();\n this.bus.emit(\"hover:change\", { id });\n }\n\n /* ─── Viewport ──────────────────────────────────────────── */\n setViewport(v: Partial<Viewport>): void {\n this.state.viewport = { ...this.state.viewport, ...v };\n this.bump();\n this.bus.emit(\"viewport:change\", this.getViewport());\n }\n\n /* ─── Wiring draft (for bind/include/exclude UX) ────────── */\n startWire(from: string, kind: DraftWire[\"kind\"]): void {\n this.state.draftWire = { from, kind };\n this.bump();\n this.bus.emit(\"wire:preview\", { from, kind });\n }\n\n previewWire(to?: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:preview\", { from: dw.from, to, kind: dw.kind });\n }\n\n commitWire(to: string): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n // Headless API emits; the adapter/host decides how to mutate Builder\n this.bus.emit(\"wire:commit\", { from: dw.from, to, kind: dw.kind });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n cancelWire(): void {\n const dw = this.state.draftWire;\n if (!dw) return;\n this.bus.emit(\"wire:cancel\", { from: dw.from });\n this.state.draftWire = undefined;\n this.bump();\n }\n\n /* ─── Utilities ─────────────────────────────────────────── */\n private bump(): void {\n this.state.version++;\n if (this.autoEmit) this.bus.emit(\"state:change\", this.snapshot());\n }\n\n dispose(): void {\n this.bus.clear();\n }\n\n undo() {\n this.builder.undo();\n this.refreshGraph();\n }\n\n private edgeRel: EdgeKind = \"bind\";\n\n getEdgeRel(): EdgeKind {\n return this.edgeRel;\n }\n\n public setEdgeRel(rel: EdgeKind) {\n if (this.edgeRel === rel) return; // ← correct: skip only if identical\n this.edgeRel = rel;\n this.bus.emit(\"edge:change\", rel);\n }\n\n /* ─── Option-node visibility (per field) ───────────────────────────────── */\n\n /** Internal mirror of which fields should show their options as nodes. */\n private shownOptionFields = new Set<string>();\n\n /** Return the field ids whose options are currently set to be visible as nodes. */\n getShownOptionFields(): string[] {\n return Array.from(this.shownOptionFields);\n }\n\n /** True if this field’s options are shown as nodes. */\n isFieldOptionsShown(fieldId: string): boolean {\n return this.shownOptionFields.has(String(fieldId));\n }\n\n /**\n * Set visibility of option nodes for a field, then rebuild the graph.\n * When shown = true, the Builder will emit option nodes for this field.\n */\n setFieldOptionsShown(fieldId: string, shown: boolean): void {\n const id = String(fieldId);\n const before = this.shownOptionFields.has(id);\n if (shown && !before) this.shownOptionFields.add(id);\n else if (!shown && before) this.shownOptionFields.delete(id);\n else return; // no-op\n\n // Push to builder options and refresh\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n /** Toggle option-node visibility for a field. Returns the new visibility. */\n toggleFieldOptions(fieldId: string): boolean {\n const next = !this.isFieldOptionsShown(fieldId);\n this.setFieldOptionsShown(fieldId, next);\n return next;\n }\n\n /**\n * Replace the whole set of fields whose options are visible as nodes.\n * Useful for restoring a saved UI state.\n */\n setShownOptionFields(ids: Iterable<string>): void {\n const next = new Set(Array.from(ids, String));\n // Fast-path: if identical set, skip work\n if (\n next.size === this.shownOptionFields.size &&\n Array.from(next).every((id) => this.shownOptionFields.has(id))\n ) {\n return;\n }\n this.shownOptionFields = next;\n this.builder.setOptions({\n showOptionNodes: new Set(this.shownOptionFields),\n });\n this.refreshGraph();\n }\n\n getConstraints() {\n return this.builder.getConstraints();\n }\n\n getServiceProps() {\n return this.builder.getProps();\n }\n}\n","import React, {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport type { ReactNode } from \"react\";\r\nimport type { Scalar } from \"@/schema/order\";\r\n\r\nexport type FormSnapshot = {\r\n values: Record<string, Scalar | Scalar[]>;\r\n selections: Record<string, string[]>;\r\n};\r\n\r\nexport type FormApi = {\r\n /** Scalar/array value by fieldId (non-option inputs) */\r\n get: (fieldId: string) => Scalar | Scalar[] | undefined;\r\n set: (fieldId: string, value: Scalar | Scalar[]) => void;\r\n\r\n /** Option selections by fieldId (array of optionIds) */\r\n getSelections: (fieldId: string) => string[];\r\n setSelections: (fieldId: string, optionIds: string[]) => void;\r\n toggleSelection: (fieldId: string, optionId: string) => void;\r\n\r\n /** Read-only snapshot for debugging */\r\n snapshot: () => FormSnapshot;\r\n\r\n /** Simple subscribe (re-render triggers) */\r\n subscribe: (fn: () => void) => () => void;\r\n};\r\n\r\nconst FormCtx = createContext<FormApi | null>(null);\r\n\r\nexport function FormProvider({\r\n initial,\r\n children,\r\n}: {\r\n initial?: Partial<FormSnapshot>;\r\n children: ReactNode;\r\n}) {\r\n const [values, setValues] = useState<Record<string, Scalar | Scalar[]>>(\r\n initial?.values ?? {},\r\n );\r\n const [selections, setSelections] = useState<Record<string, string[]>>(\r\n initial?.selections ?? {},\r\n );\r\n const subsRef = useRef(new Set<() => void>());\r\n\r\n const publish = useCallback(() => {\r\n for (const fn of Array.from(subsRef.current)) {\r\n try {\r\n fn();\r\n } catch {\r\n /* noop */\r\n }\r\n }\r\n }, []);\r\n\r\n const api = useMemo<FormApi>(\r\n () => ({\r\n get: (fieldId) => values[fieldId],\r\n set: (fieldId, value) => {\r\n setValues((prev) => {\r\n if (prev[fieldId] === value) return prev;\r\n const next = { ...prev, [fieldId]: value };\r\n return next;\r\n });\r\n publish();\r\n },\r\n\r\n getSelections: (fieldId) => selections[fieldId] ?? [],\r\n setSelections: (fieldId, optionIds) => {\r\n setSelections((prev) => {\r\n const next = {\r\n ...prev,\r\n [fieldId]: Array.from(new Set(optionIds)),\r\n };\r\n return next;\r\n });\r\n publish();\r\n },\r\n toggleSelection: (fieldId, optionId) => {\r\n setSelections((prev) => {\r\n const cur = new Set(prev[fieldId] ?? []);\r\n if (cur.has(optionId)) cur.delete(optionId);\r\n else cur.add(optionId);\r\n return { ...prev, [fieldId]: Array.from(cur) };\r\n });\r\n publish();\r\n },\r\n\r\n snapshot: () => ({\r\n values: { ...values },\r\n selections: { ...selections },\r\n }),\r\n\r\n subscribe: (fn) => {\r\n subsRef.current.add(fn);\r\n return () => subsRef.current.delete(fn);\r\n },\r\n }),\r\n [publish, selections, values],\r\n );\r\n\r\n return <FormCtx.Provider value={api}>{children}</FormCtx.Provider>;\r\n}\r\n\r\n/** Strict hook (throws if no provider) */\r\nexport function useFormApi(): FormApi {\r\n const ctx = useContext(FormCtx);\r\n if (!ctx) throw new Error(\"useFormApi must be used within <FormProvider>\");\r\n return ctx;\r\n}\r\n\r\n/** Optional hook (returns null if no provider) */\r\nexport function useOptionalFormApi(): FormApi | null {\r\n return useContext(FormCtx);\r\n}\r\n\r\n/** Field-scoped helpers */\r\n\r\nexport function useFormField(fieldId: string): {\r\n value: Scalar | Scalar[] | undefined;\r\n set: (value: Scalar | Scalar[]) => void;\r\n} {\r\n const api = useFormApi();\r\n const value = api.get(fieldId);\r\n const set = (v: Scalar | Scalar[]) => api.set(fieldId, v);\r\n return { value, set };\r\n}\r\n\r\nexport function useFormSelections(fieldId: string): {\r\n selected: string[];\r\n set: (optionIds: string[]) => void;\r\n toggle: (optionId: string) => void;\r\n} {\r\n const api = useFormApi();\r\n return {\r\n selected: api.getSelections(fieldId),\r\n set: (arr: string[]) => api.setSelections(fieldId, arr),\r\n toggle: (oid: string) => api.toggleSelection(fieldId, oid),\r\n };\r\n}\r\n","import type React from 'react';\r\nimport type {Scalar} from \"@/schema/order\";\r\n\r\n/** Matches your InputWrapper’s expectations */\r\nexport type InputKind = string; // e.g. \"text\", \"number\", \"select\", \"custom:Rating\"\r\nexport type InputVariant = 'default' | (string & {});\r\n\r\nexport type InputAdapter = {\r\n /** Prop name where the value goes on the host component (default: \"value\") */\r\n valueProp?: string;\r\n /** Prop name of the change handler on the host component (default: \"onChange\") */\r\n changeProp?: string;\r\n /**\r\n * Normalize the host's change payload into a Scalar | Scalar[] your form will store.\r\n * If omitted, `next as Scalar | Scalar[]` is used.\r\n */\r\n getValue?: (next: unknown, prev: unknown) => Scalar | Scalar[];\r\n};\r\n\r\nexport type InputDescriptor = {\r\n Component: React.ComponentType<Record<string, unknown>>;\r\n adapter?: InputAdapter;\r\n defaultProps?: Record<string, unknown>;\r\n};\r\n\r\ntype VariantMap = Map<InputVariant, InputDescriptor>;\r\ntype RegistryStore = Map<InputKind, VariantMap>;\r\n\r\nexport type Registry = {\r\n get(kind: InputKind, variant?: InputVariant): InputDescriptor | undefined;\r\n register(kind: InputKind, descriptor: InputDescriptor, variant?: InputVariant): void;\r\n unregister(kind: InputKind, variant?: InputVariant): void;\r\n registerMany(entries: Array<{ kind: InputKind; descriptor: InputDescriptor; variant?: InputVariant }>): void;\r\n /** low-level escape hatch */\r\n _store: RegistryStore;\r\n};\r\n\r\nexport function createInputRegistry(): Registry {\r\n const store: RegistryStore = new Map();\r\n\r\n const get = (kind: InputKind, variant?: InputVariant): InputDescriptor | undefined => {\r\n const vm = store.get(kind);\r\n if (!vm) return undefined;\r\n const v = (variant ?? 'default') as InputVariant;\r\n return vm.get(v) ?? vm.get('default');\r\n };\r\n\r\n const register = (kind: InputKind, descriptor: InputDescriptor, variant?: InputVariant): void => {\r\n let vm = store.get(kind);\r\n if (!vm) {\r\n vm = new Map<InputVariant, InputDescriptor>();\r\n store.set(kind, vm);\r\n }\r\n vm.set((variant ?? 'default') as InputVariant, descriptor);\r\n };\r\n\r\n const unregister = (kind: InputKind, variant?: InputVariant): void => {\r\n const vm = store.get(kind);\r\n if (!vm) return;\r\n const key = (variant ?? 'default') as InputVariant;\r\n vm.delete(key);\r\n if (vm.size === 0) store.delete(kind);\r\n };\r\n\r\n const registerMany = (entries: Array<{ kind: InputKind; descriptor: InputDescriptor; variant?: InputVariant }>): void => {\r\n for (const e of entries) register(e.kind, e.descriptor, e.variant);\r\n };\r\n\r\n return { get, register, unregister, registerMany, _store: store };\r\n}\r\n\r\n/** Helper used by InputWrapper */\r\nexport function resolveInputDescriptor(\r\n registry: Registry,\r\n kind: InputKind,\r\n variant?: InputVariant\r\n): InputDescriptor | undefined {\r\n return registry.get(kind, variant);\r\n}","import React, { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createInputRegistry } from \"@/react\";\nimport type {\n Registry,\n InputDescriptor,\n InputKind,\n InputVariant,\n} from \"@/react\";\n\ntype InputsCtxValue = {\n registry: Registry;\n register: (\n kind: InputKind,\n descriptor: InputDescriptor,\n variant?: InputVariant,\n ) => void;\n unregister: (kind: InputKind, variant?: InputVariant) => void;\n registerMany: (\n entries: Array<{\n kind: InputKind;\n descriptor: InputDescriptor;\n variant?: InputVariant;\n }>,\n ) => void;\n};\n\nconst Ctx = createContext<InputsCtxValue | null>(null);\n\nexport function Provider({\n children,\n initialRegistry,\n}: {\n children: ReactNode;\n /** Optional pre-built registry (e.g., you registered built-ins/customs before mounting) */\n initialRegistry?: Registry;\n}) {\n const registry = useMemo(\n () => initialRegistry ?? createInputRegistry(),\n [initialRegistry],\n );\n\n const value = useMemo<InputsCtxValue>(\n () => ({\n registry,\n register: registry.register,\n unregister: registry.unregister,\n registerMany: registry.registerMany,\n }),\n [registry],\n );\n\n return <Ctx.Provider value={value}>{children}</Ctx.Provider>;\n}\n\nexport function useInputs(): InputsCtxValue {\n const v = useContext(Ctx);\n if (!v) throw new Error(\"useInputs() must be used within <InputsProvider>\");\n return v;\n}\n","import React, { useMemo } from \"react\";\r\nimport type {\r\n Field,\r\n FieldOption,\r\n UtilityMark,\r\n WithQuantityDefault,\r\n} from \"@/schema\";\r\nimport type { ButtonValue, Scalar } from \"@/schema/order\";\r\nimport { useInputs } from \"@/react\";\r\nimport type { InputDescriptor, InputVariant, InputKind } from \"@/react\";\r\nimport { resolveInputDescriptor } from \"@/react\";\r\nimport { isMultiField } from \"@/utils\";\r\nimport { useOptionalFormApi } from \"@/react\";\r\n\r\nexport type InputWrapperProps = {\r\n field: Field;\r\n disabled?: boolean;\r\n /** Extra props to forward to the host component (low priority, overridden by adapter wiring). */\r\n extraProps?: Record<string, unknown>;\r\n};\r\n\r\nexport type OnChangeValue = ButtonValue | ButtonValue[]; // multi-select allowed\r\n\r\nfunction toKind(field: Field): InputKind {\r\n if (field.type === \"custom\") {\r\n const comp = (field.component ?? \"\").trim();\r\n return `custom:${comp}` as InputKind;\r\n }\r\n return field.type as InputKind;\r\n}\r\n\r\nfunction toVariant(field: Field): InputVariant | undefined {\r\n const v = (field as any).meta?.variant;\r\n return typeof v === \"string\" && v.trim() ? (v as InputVariant) : undefined;\r\n}\r\n\r\nexport function Wrapper({\r\n field,\r\n disabled,\r\n extraProps,\r\n}: InputWrapperProps) {\r\n const { registry } = useInputs();\r\n const form = useOptionalFormApi();\r\n\r\n const kind = toKind(field);\r\n const variant = toVariant(field);\r\n\r\n const descriptor: InputDescriptor | undefined = useMemo(\r\n () => resolveInputDescriptor(registry, kind, variant),\r\n [kind, registry, variant],\r\n );\r\n\r\n if (!descriptor) {\r\n // eslint-disable-next-line no-console\r\n console.warn(\"[InputWrapper] No descriptor for\", {\r\n kind,\r\n variant,\r\n field,\r\n });\r\n return null;\r\n }\r\n\r\n const { Component, adapter, defaultProps } = descriptor;\r\n const valueProp = adapter?.valueProp ?? \"value\";\r\n const changeProp = adapter?.changeProp ?? \"onChange\";\r\n\r\n // Shape/intention\r\n const isOptionBased =\r\n Array.isArray(field.options) && field.options.length > 0;\r\n const multi = !!(isOptionBased && isMultiField(field));\r\n const isButton = field.button === true || isOptionBased;\r\n\r\n // Helpers\r\n const optionById = useMemo(() => {\r\n if (!isOptionBased) return new Map<string, FieldOption>();\r\n return new Map((field.options ?? []).map((o) => [o.id, o]));\r\n }, [isOptionBased, field.options]);\r\n\r\n const enrich = (bv: ButtonValue): ButtonValue => {\r\n // Option-based button → derive from option\r\n if (isOptionBased) {\r\n const opt = optionById.get(bv.id);\r\n if (opt) {\r\n const role = (opt.pricing_role ?? \"base\") as \"base\" | \"utility\";\r\n const sid = (opt as any).service_id as number | undefined;\r\n const meta = (opt.meta ?? field.meta) as\r\n | (Record<string, unknown> &\r\n UtilityMark &\r\n WithQuantityDefault)\r\n | undefined;\r\n\r\n // utility must not carry a service_id\r\n return {\r\n ...bv,\r\n pricing_role: role,\r\n service_id: role === \"utility\" ? undefined : sid,\r\n ...(meta ? { meta } : {}),\r\n };\r\n }\r\n // fallback: unknown option id → just return as-is\r\n return bv;\r\n }\r\n\r\n // Option-less button → derive from field\r\n const role = (field.pricing_role ?? \"base\") as \"base\" | \"utility\";\r\n const sid = (field as any).service_id as number | undefined;\r\n const meta = field.meta as\r\n | (Record<string, unknown> & UtilityMark & WithQuantityDefault)\r\n | undefined;\r\n\r\n return {\r\n ...bv,\r\n pricing_role: role,\r\n service_id: role === \"utility\" ? undefined : sid,\r\n ...(meta ? { meta } : {}),\r\n };\r\n };\r\n\r\n function normalizeToButtonValues(input: unknown): ButtonValue[] {\r\n const coerceOne = (v: unknown): ButtonValue | null => {\r\n if (v && typeof v === \"object\" && \"id\" in (v as any)) {\r\n const id = String((v as any).id);\r\n const valueRaw = (v as any).value;\r\n const value =\r\n typeof valueRaw === \"number\" || typeof valueRaw === \"string\"\r\n ? (valueRaw as number | string)\r\n : 1; // default\r\n return enrich({ id, value });\r\n }\r\n // If host returned a primitive, assume it's the id; default value=1\r\n if (typeof v === \"string\" || typeof v === \"number\") {\r\n return enrich({ id: String(v), value: 1 });\r\n }\r\n return null;\r\n };\r\n\r\n if (Array.isArray(input)) {\r\n const arr: ButtonValue[] = [];\r\n for (const x of input) {\r\n const one = coerceOne(x);\r\n if (one) arr.push(one);\r\n }\r\n return arr;\r\n }\r\n const one = coerceOne(input);\r\n return one ? [one] : [];\r\n }\r\n\r\n // Current value bindings\r\n let current: Scalar | Scalar[] | undefined = undefined;\r\n let onChange: ((v: unknown) => void) | undefined = undefined;\r\n\r\n if (form) {\r\n if (isButton) {\r\n if (isOptionBased) {\r\n // For option buttons, current is the selected option ids (single or array)\r\n const selIds = form.getSelections(field.id);\r\n current = multi ? selIds : (selIds[0] ?? null);\r\n\r\n onChange = (next: unknown) => {\r\n const normalized = adapter?.getValue\r\n ? adapter.getValue(next, current)\r\n : next;\r\n const bvs = normalizeToButtonValues(normalized);\r\n const ids = bvs.map((b) => b.id);\r\n\r\n // Update selections with ids\r\n form.setSelections(field.id, Array.from(new Set(ids)));\r\n\r\n // Optionally store the value(s) for per_value utilities or quantity logic\r\n const values = multi ? bvs : (bvs[0] ?? null);\r\n form.set(field.id, values);\r\n };\r\n } else {\r\n // Option-less button (e.g., switch/checkbox acting as action button)\r\n // We keep a scalar \"value\" in form.values and maintain selection id presence for \"active\" state.\r\n const val = form.get(field.id);\r\n current = val;\r\n\r\n onChange = (next: unknown) => {\r\n const normalized = adapter?.getValue\r\n ? adapter.getValue(next, current)\r\n : next;\r\n const bvs = normalizeToButtonValues(normalized);\r\n const first = bvs[0]; // single semantics for option-less button\r\n\r\n // If host toggled \"off\", allow value = 0 or empty → clear selection\r\n const active =\r\n first &&\r\n (typeof first.value === \"number\"\r\n ? first.value !== 0\r\n : String(first.value).length > 0);\r\n\r\n if (active) {\r\n form.setSelections(field.id, [field.id]);\r\n form.set(field.id, first.value as Scalar);\r\n } else {\r\n form.setSelections(field.id, []);\r\n form.set(field.id, null as unknown as Scalar);\r\n }\r\n };\r\n }\r\n } else {\r\n // Non-button (plain input)\r\n current = form.get(field.id);\r\n onChange = (next: unknown) => {\r\n const normalized = adapter?.getValue\r\n ? adapter.getValue(next, current)\r\n : (next as Scalar | Scalar[]);\r\n form.set(field.id, normalized as Scalar | Scalar[]);\r\n };\r\n }\r\n }\r\n\r\n const hostProps: Record<string, unknown> = {\r\n id: field.id,\r\n field,\r\n disabled: !!disabled,\r\n ...(defaultProps ?? {}),\r\n ...(extraProps ?? {}),\r\n ...(isOptionBased ? { options: field.options as FieldOption[] } : {}),\r\n };\r\n\r\n if (form) {\r\n hostProps[valueProp] = current as unknown;\r\n hostProps[changeProp] = onChange as unknown;\r\n }\r\n\r\n return <Component {...hostProps} />;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,WAAN,MAAmC;AAAA,EAAnC;AACH,SAAQ,YAAY,oBAAI,IAAoC;AAAA;AAAA,EAE5D,GAAsB,OAAU,SAA8C;AANlF;AAOQ,UAAM,OAAM,UAAK,UAAU,IAAI,KAAK,MAAxB,YAA6B,oBAAI,IAAI;AACjD,QAAI,IAAI,OAAc;AACtB,SAAK,UAAU,IAAI,OAAO,GAAG;AAC7B,WAAO,MAAM;AACT,UAAI,OAAO,OAAc;AAAA,IAC7B;AAAA,EACJ;AAAA,EAEA,KAAwB,OAAU,SAA8C;AAC5E,UAAM,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM;AAC9B,UAAI;AACJ,cAAQ,CAAC;AAAA,IACb,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,KAAwB,OAAU,SAAqB;AACnD,UAAM,MAAM,KAAK,UAAU,IAAI,KAAK;AACpC,QAAI,CAAC,OAAO,IAAI,SAAS,EAAG;AAC5B,eAAW,KAAK,MAAM,KAAK,GAAG,EAAG,KAAI;AACjC,MAAC,EAAU,OAAO;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,EACJ;AAAA,EAEA,QAAc;AACV,SAAK,UAAU,MAAM;AAAA,EACzB;AACJ;;;ACbO,IAAM,aAAN,MAAiB;AAAA,EAKpB,YAAY,OAAqB,CAAC,GAAG;AAHrC,SAAQ,OAAO,oBAAI,IAAkF;AACrG,SAAQ,SAAS;AAzBrB;AA4BQ,SAAK,OAAO;AAAA,MACR,UAAS,UAAK,YAAL,YAAgB;AAAA,MACzB,cAAa,UAAK,gBAAL,YAAoB;AAAA,MACjC,cAAa,UAAK,gBAAL,YAAoB;AAAA,MACjC,aAAY,UAAK,eAAL,YAAmB;AAAA,MAC/B,SAAQ,UAAK,WAAL,YAAe;AAAA,MACvB,iBAAgB,UAAK,mBAAL,YAAuB;AAAA,IAC3C;AAAA,EACJ;AAAA,EAEA,QAAQ;AACJ,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,SAAS;AACL,SAAK,SAAS;AACd,SAAK,MAAM;AAAA,EACf;AAAA;AAAA,EAGA,QAAQ,KAAwB;AAhDpC;AAiDQ,QAAI,CAAC,KAAK,KAAK,QAAS,QAAO;AAC/B,QAAI,KAAK,KAAK,IAAI,IAAI,EAAE,EAAG,QAAO;AAClC,SAAK,KAAK,IAAI,IAAI,IAAI,EAAC,KAAK,SAAS,EAAC,CAAC;AACvC,cAAI,aAAJ,6BAAe,aAAa,EAAC,SAAS,EAAC;AACvC,SAAK,KAAK,IAAI,EAAE;AAChB,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,WAAW,IAAqB;AAC5B,UAAM,MAAM,KAAK,KAAK,IAAI,EAAE;AAC5B,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,IAAI,MAAO,cAAa,IAAI,KAAK;AACrC,QAAI,QAAQ;AACZ,SAAK,KAAK,IAAI,IAAI;AAClB,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,IAAqB;AAnEhC;AAoEQ,UAAM,MAAM,KAAK,KAAK,IAAI,EAAE;AAC5B,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,IAAI,MAAO,cAAa,IAAI,KAAK;AACrC,QAAI,YAAY;AAChB,oBAAI,KAAI,aAAR,4BAAmB,aAAa,EAAC,SAAS,IAAI,QAAO;AACrD,SAAK,KAAK,OAAO,EAAE;AACnB,WAAO;AAAA,EACX;AAAA,EAEA,aAAuB;AACnB,WAAO,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,EACtC;AAAA,EAEA,OAAe;AACX,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EAEA,SAAS,IAAqB;AAC1B,WAAO,KAAK,KAAK,IAAI,EAAE;AAAA,EAC3B;AAAA,EAEA,QAAc;AAzFlB;AA0FQ,eAAW,CAAC,IAAI,GAAG,KAAK,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAI,IAAI,MAAO,cAAa,IAAI,KAAK;AACrC,UAAI,YAAY;AAChB,sBAAI,KAAI,aAAR,4BAAmB,aAAa,EAAC,SAAS,IAAI,QAAO;AACrD,WAAK,KAAK,OAAO,EAAE;AAAA,IACvB;AAAA,EACJ;AAAA,EAEQ,QAAQ;AACZ,eAAW,MAAM,KAAK,KAAK,KAAK,EAAG,MAAK,KAAK,EAAE;AAAA,EACnD;AAAA,EAEQ,SAAS,SAAyB;AACtC,UAAM,EAAC,aAAa,YAAY,OAAM,IAAI,KAAK;AAC/C,UAAM,MAAM,KAAK,IAAI,YAAY,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC;AACpF,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,KAAK,OAAO,IAAI,MAAM;AAChC,WAAO,KAAK,IAAI,YAAY,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,EACnD;AAAA,EAEA,MAAc,KAAK,IAAY,YAAY,OAAO;AA9GtD;AA+GQ,UAAM,MAAM,KAAK,KAAK,IAAI,EAAE;AAC5B,QAAI,CAAC,OAAO,IAAI,UAAW;AAE3B,QAAI,KAAK,UAAU,CAAC,UAAW;AAE/B,UAAM,UAAU,IAAI,UAAU;AAC9B,UAAM,MAAM,YAAY;AArHhC,UAAAA,KAAAC,KAAA;AAsHY,UAAI,IAAI,UAAW;AACnB,OAAAA,OAAAD,MAAA,IAAI,KAAI,aAAR,gBAAAC,IAAA,KAAAD,KAAmB,YAAY,EAAC,QAAO;AACvC,UAAI;AACA,cAAM,KAAK,MAAM,IAAI,IAAI,QAAQ,OAAO;AACxC,YAAI,IAAI;AACJ,0BAAI,KAAI,aAAR,4BAAmB,aAAa,EAAC,QAAO;AACxC,eAAK,KAAK,OAAO,EAAE;AACnB;AAAA,QACJ;AAAA,MACJ,SAAS,KAAK;AAEV,wBAAI,KAAI,aAAR,4BAAmB,UAAU,EAAC,SAAS,OAAO,IAAG;AAAA,MACrD;AAEA,UAAI,WAAW,KAAK,KAAK,aAAa;AAClC,wBAAI,KAAI,aAAR,4BAAmB,UAAU,EAAC,QAAO;AACrC,aAAK,KAAK,OAAO,EAAE;AACnB;AAAA,MACJ;AAEA,UAAI,UAAU;AACd,YAAM,QAAQ,KAAK,SAAS,OAAO;AACnC,sBAAI,KAAI,aAAR,4BAAmB,aAAa,EAAC,SAAS,aAAa,MAAK;AAC5D,UAAI,QAAQ,WAAW,MAAM,KAAK,KAAK,EAAE,GAAG,KAAK;AAAA,IACrD;AAEA,QAAI,UAAW,OAAM,IAAI;AAAA,SACpB;AAED,YAAM,QAAQ,KAAK,KAAK,kBAAkB,YAAY,IAAI,IAAI,KAAK,SAAS,OAAO;AAEnF,UAAI,OAAO;AACP,wBAAI,KAAI,aAAR,4BAAmB,aAAa,EAAC,SAAS,GAAG,aAAa,MAAK;AAC/D,YAAI,QAAQ,WAAW,KAAK,KAAK;AAAA,MACrC,OAAO;AACH,aAAK,IAAI;AAAA,MACb;AAAA,IACJ;AAAA,EACJ;AACJ;;;ACzIA,IAAI,QAAQ;AACZ,IAAM,aAAa,CAAC,IAAI,UACpB,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,SAAS,EAAE,CAAC;AAWtD,IAAM,cAAN,MAAkB;AAAA,EAMrB,YAAY,KAA6B,OAAqB,CAAC,GAAG;AALlE,SAAQ,UAAU,oBAAI,IAA0B;AAM5C,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,QAAQ,IAAI,WAAW,KAAK,KAAK;AAAA,EAC1C;AAAA,EAEQ,QAAkC;AA7C9C;AA8CQ,YAAO,gBAAK,MAAK,aAAV;AAAA,EACX;AAAA,EAEQ,SACJ,IACA,UACA,WACA,QACA,MAKI;AACJ,SAAK,IAAI,KAAK,gBAAgB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,OAAO,KAAK;AAAA,IAChB,CAAC;AAAA,EACL;AAAA;AAAA,EAIA,MAAM,UAAyB;AAC3B,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,QAAQ,KAAK,MAAM;AACzB,QAAI,CAAC,MAAO;AAEZ,UAAM,MAAM,MAAM,KAAK,KAAK,QAAQ,YAAY,KAAK;AAErD,QAAI,CAAC,IAAI,IAAI;AACT,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,SAAS,IAAI,MAAM;AAAA,QACnB,MAAM,IAAI,MAAM;AAAA,QAChB,MAAM,IAAI,MAAM;AAAA,MACpB,CAAC;AACD;AAAA,IACJ;AAEA,SAAK,QAAQ,MAAM;AACnB,eAAW,MAAM,IAAI,OAAO;AACxB,WAAK,QAAQ,IAAI,GAAG,IAAI,EAAE,GAAI,IAAsB,OAAO,SAAS,CAAC;AAAA,IACzE;AAGA,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,OAAiB,CAAC;AAAA,EACvE;AAAA;AAAA,EAIA,OAAwB;AACpB,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,EACxC,IAAI,CAAC,MAAM,CAAkB;AAAA,EACtC;AAAA,EAEA,IAAI,IAAyC;AACzC,WAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,EAC9B;AAAA;AAAA,EAIA,MAAM,OACF,QACA,aACA,MACiB;AArHzB;AAsHQ,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,UAAU,WAAW,GAAG;AAC9B,UAAM,QAAQ,WAAW,GAAG;AAE5B,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAE5D,UAAM,QAAoB;AAAA,MACtB,IAAI;AAAA,MACJ;AAAA,MACA,UAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,MACX,UAAU,CAAC,EAAE,IAAI,OAAO,MAAM,aAAa,WAAW,IAAI,CAAC;AAAA,MAC3D;AAAA,MACA,OAAO,aAAa,YAAY;AAAA,IACpC;AAEA,SAAK,QAAQ,IAAI,SAAS,KAAK;AAC/B,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,MAAa,CAAC;AAE/D,QAAI,CAAC,KAAK,KAAK,QAAS,QAAO;AAE/B,UAAM,cAAc,YAA+B;AAC/C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO,QAAO;AAEnB,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,aAAa,OAAO;AAAA,QACrD;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAGvB,WAAK,QAAQ,OAAO,OAAO;AAE3B,YAAM,WAAuB;AAAA,QACzB,GAAI,IAAI;AAAA,QACR,OAAO;AAAA,MACX;AAEA,WAAK,QAAQ,IAAI,SAAS,IAAI,QAAQ;AACtC,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,SAAgB,CAAC;AAElE,aAAO,SAAS;AAAA,IACpB;AAEA,QAAI;AACA,YAAM,WAAW,MAAM,YAAY;AACnC,aAAO;AAAA,IACX,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,0BAA0B,SAAS,IAAI,OAAO;AAE5D,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,YAAM,QAAQ;AACd,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,MAAa,CAAC;AAE/D,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAM,MACF,UACA,MACA,MACkB;AAlN1B;AAmNQ,UAAM,KAAK,KAAK,OAAO,QAAQ;AAC/B,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,WAAW,WAAW,GAAG;AAE/B,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAE5D,UAAM,WAA2B;AAAA,MAC7B,IAAI;AAAA,MACJ;AAAA,MACA,WAAW;AAAA,MACX;AAAA,IACJ;AAEA,OAAG,SAAS,KAAK,QAAQ;AACzB,OAAG,YAAY;AACf,aAAG,UAAH,eAAG,QAAU,aAAa,YAAY;AAEtC,SAAK,IAAI,KAAK,0BAA0B;AAAA,MACpC;AAAA,MACA,SAAS;AAAA,IACb,CAAC;AACD,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,QAAI,CAAC,KAAK,KAAK,QAAS,QAAO;AAE/B,UAAM,cAAc,YAAgC;AAChD,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO,QAAO;AAEnB,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,WAAW,OAAO;AAAA,QACnD,UAAU,GAAG;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAEvB,YAAM,YAAY,IAAI;AACtB,YAAM,MAAM,GAAG,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ;AAC1D,UAAI,OAAO,EAAG,IAAG,SAAS,GAAG,IAAI;AAEjC,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,aAAO,UAAU;AAAA,IACrB;AAEA,QAAI;AACA,YAAM,YAAY,MAAM,YAAY;AACpC,aAAO;AAAA,IACX,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,wBAAwB,SAAS,IAAI,QAAQ,IAAI,QAAQ;AAEvE,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAM,YACF,UACA,WACA,MACa;AA9SrB;AA+SQ,UAAM,KAAK,KAAK,OAAO,QAAQ;AAC/B,UAAM,OAAO,GAAG,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AACvD,QAAI,CAAC,KAAM;AAEX,UAAM,WAAW,EAAE,GAAG,KAAK;AAC3B,SAAK,OAAO;AACZ,SAAK,WAAW,KAAK,IAAI;AACzB,OAAG,YAAY,KAAK;AAEpB,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAC5D,aAAG,UAAH,eAAG,QAAU,aAAa,YAAY;AAEtC,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,cAAc,YAA2B;AAC3C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO;AAEZ,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,YAAY,OAAO;AAAA,QACpD,UAAU,GAAG;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAEvB,YAAM,MAAM,GAAG,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS;AAC3D,UAAI,OAAO,EAAG,IAAG,SAAS,GAAG,IAAI,IAAI;AAErC,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAEA,QAAI;AACA,YAAM,YAAY;AAAA,IACtB,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,yBAAyB,SAAS,IAAI,QAAQ,IAAI,SAAS;AAEzE,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,YAAM,MAAM,GAAG,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS;AAC3D,UAAI,OAAO,EAAG,IAAG,SAAS,GAAG,IAAI;AAEjC,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAAA,EACJ;AAAA,EAEA,MAAM,cACF,UACA,WACa;AA7XrB;AA8XQ,UAAM,KAAK,KAAK,OAAO,QAAQ;AAC/B,UAAM,SAAS,CAAC,GAAG,GAAG,QAAQ;AAE9B,OAAG,WAAW,GAAG,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS;AAC1D,OAAG,YAAY,KAAK,IAAI;AAExB,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAC5D,aAAG,UAAH,eAAG,QAAU,aAAa,YAAY;AAEtC,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,cAAc,YAA2B;AAC3C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO;AAEZ,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,cAAc,OAAO;AAAA,QACtD,UAAU,GAAG;AAAA,QACb;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAEvB,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAEA,QAAI;AACA,YAAM,YAAY;AAAA,IACtB,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,2BAA2B,SAAS,IAAI,QAAQ,IAAI,SAAS;AAE3E,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,SAAG,WAAW;AACd,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAAA,EACJ;AAAA,EAEA,MAAM,KAAK,UAAoB,QAAsC;AAhczE;AAicQ,UAAM,KAAK,KAAK,OAAO,QAAQ;AAC/B,UAAM,OAAO,GAAG;AAEhB,OAAG,SAAS;AACZ,OAAG,YAAY,KAAK,IAAI;AAExB,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAC5D,aAAG,UAAH,eAAG,QAAU,aAAa,YAAY;AAEtC,SAAK,IAAI,KAAK,gBAAgB,EAAE,QAAQ,GAAU,CAAC;AACnD,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,cAAc,YAA2B;AAC3C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO;AAEZ,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,WAAW,OAAO;AAAA,QACnD,UAAU,GAAG;AAAA,QACb;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAEvB,WAAK,QAAQ,IAAI,GAAG,IAAI,EAAE,GAAI,IAAI,OAAyB,OAAO,SAAS,CAAC;AAC5E,WAAK,IAAI,KAAK,yBAAyB;AAAA,QACnC,QAAQ,KAAK,QAAQ,IAAI,QAAQ;AAAA,MACrC,CAAC;AAAA,IACL;AAEA,QAAI;AACA,YAAM,YAAY;AAAA,IACtB,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,wBAAwB,SAAS,IAAI,QAAQ;AAE3D,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,SAAG,SAAS;AACZ,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAAA,EACJ;AAAA,EAEA,MAAM,QAAQ,UAAoB,QAAQ,MAAqB;AAtgBnE;AAugBQ,UAAM,KAAK,KAAK,OAAO,QAAQ;AAC/B,UAAM,OAAO,GAAG;AAEhB,OAAG,WAAW;AACd,OAAG,YAAY,KAAK,IAAI;AAExB,UAAM,aAAa,QAAQ,KAAK,KAAK,WAAW,KAAK,MAAM,CAAC;AAC5D,aAAG,UAAH,eAAG,QAAU,aAAa,YAAY;AAEtC,SAAK,IAAI,KAAK,mBAAmB,EAAE,QAAQ,IAAW,UAAU,MAAM,CAAC;AACvE,SAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAE5D,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,cAAc,YAA2B;AAC3C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO;AAEZ,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,cAAc,OAAO;AAAA,QACtD,UAAU,GAAG;AAAA,QACb,UAAU;AAAA,MACd,CAAC;AAED,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAEvB,WAAK,QAAQ,IAAI,GAAG,IAAI,EAAE,GAAI,IAAI,OAAyB,OAAO,SAAS,CAAC;AAC5E,WAAK,IAAI,KAAK,yBAAyB;AAAA,QACnC,QAAQ,KAAK,QAAQ,IAAI,QAAQ;AAAA,MACrC,CAAC;AAAA,IACL;AAEA,QAAI;AACA,YAAM,YAAY;AAAA,IACtB,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,2BAA2B,SAAS,IAAI,QAAQ;AAE9D,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAED,SAAG,WAAW;AACd,SAAG,QAAQ;AACX,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,GAAU,CAAC;AAAA,IAChE;AAAA,EACJ;AAAA,EAEA,MAAM,aAAa,UAAmC;AA5kB1D;AA6kBQ,UAAM,OAAO,KAAK,QAAQ,IAAI,QAAQ;AACtC,QAAI,CAAC,KAAM;AAEX,SAAK,QAAQ,OAAO,QAAQ;AAC5B,SAAK,IAAI,KAAK,yBAAyB,EAAE,SAAS,CAAC;AAEnD,QAAI,CAAC,KAAK,KAAK,QAAS;AAExB,UAAM,cAAc,YAA2B;AAC3C,YAAM,QAAQ,KAAK,MAAM;AACzB,UAAI,CAAC,MAAO;AAEZ,YAAM,MAAM,MAAM,KAAK,KAAK,QAAS,aAAa,OAAO,EAAE,SAAS,CAAC;AACrE,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI;AAAA,IAC3B;AAEA,QAAI;AACA,YAAM,YAAY;AAAA,IACtB,SAAS,KAAK;AACV,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,aAAY,oCAAO,aAAP,YAAmB;AACrC,YAAM,QAAQ,0BAA0B,SAAS,IAAI,QAAQ;AAE7D,WAAK,MAAM,QAAQ;AAAA,QACf,IAAI;AAAA,QACJ,SAAS,YAAY;AACjB,cAAI;AACA,kBAAM,YAAY;AAClB,mBAAO;AAAA,UACX,QAAQ;AACJ,mBAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,UAAU,CAAC,QAAQ,UACf,KAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAS,EAAE,SAAS,EAAE;AAAA,QAC1B;AAAA,MACR,CAAC;AAGD,WAAK,QAAQ,IAAI,UAAU,IAAI;AAC/B,WAAK,IAAI,KAAK,SAAS;AAAA,QACnB,UAAU,gCAAsB,YAAtB,YAAiC;AAAA,QAC3C,MAAO,2BAAsB;AAAA,QAC7B,MAAM;AAAA,MACV,CAAC;AACD,WAAK,IAAI,KAAK,yBAAyB,EAAE,QAAQ,KAAY,CAAC;AAAA,IAClE;AAAA,EACJ;AAAA;AAAA,EAGA,SAAS,OAAwB;AAC7B,WAAO,KAAK,MAAM,WAAW,KAAK;AAAA,EACtC;AAAA,EAEA,UAAU,OAAwB;AAC9B,WAAO,KAAK,MAAM,OAAO,KAAK;AAAA,EAClC;AAAA,EAEA,cAAwB;AACpB,WAAO,KAAK,MAAM,WAAW;AAAA,EACjC;AAAA;AAAA,EAGQ,OAAO,UAAgC;AAC3C,UAAM,KAAK,KAAK,QAAQ,IAAI,QAAQ;AACpC,QAAI,CAAC,GAAI,OAAM,IAAI,MAAM,6BAA6B,QAAQ,EAAE;AAChE,WAAO;AAAA,EACX;AACJ;;;ACtpBA,IAAAE,oBAA0B;;;ACE1B,uBAA0B;AAiBnB,SAAS,UACZ,OACA,OAAyB,CAAC,GACd;AAtBhB;AAuBI,QAAM,WAAuB,UAAK,uBAAL,YAA2B;AACxD,QAAM,eAAc,UAAK,gBAAL,YAAoB,CAAC,UAAU,UAAU,UAAU;AACvE,QAAM,MAAM,SAAS,KAAK;AAG1B,QAAM,aAAa,MAAM,QAAS,IAAY,OAAO,IAC9C,IAAY,UACb,CAAC;AACP,QAAM,YAAY,MAAM,QAAS,IAAY,MAAM,IAC5C,IAAY,SACb,CAAC;AAEP,QAAM,uBAAuB;AAAA,IACxB,IAAY;AAAA,EACjB;AACA,QAAM,uBAAuB;AAAA,IACxB,IAAY;AAAA,EACjB;AAGA,MAAI,UAAiB,WAAW,IAAI,CAAC,MAAW,UAAU,GAAG,WAAW,CAAC;AACzE,QAAM,SAAkB,UAAU,IAAI,CAAC,MAAW,YAAY,GAAG,OAAO,CAAC;AAGzE,MAAI,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,GAAG;AACzC,cAAU,CAAC,EAAE,IAAI,UAAU,OAAO,OAAO,GAAG,GAAG,OAAO;AAAA,EAC1D;AAGA,QAAM,YAAY,gBAAiB,IAAY,SAAS;AAExD,QAAM,MAAoB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,gBAAiB,IAAY;AAAA,IAC7B,GAAI,WAAW,oBAAoB,KAAK,EAAE,qBAAqB;AAAA,IAC/D,GAAI,WAAW,oBAAoB,KAAK,EAAE,qBAAqB;AAAA,IAC/D,GAAI,cACC,WAAW,UAAU,KAAK,KAAK,WAAW,UAAU,MAAM,MAAM;AAAA,MAC7D;AAAA,IACJ;AAAA,IACJ,gBACI,OAAQ,IAAY,mBAAmB,WAChC,IAAY,iBACb;AAAA,EACd;AAEA,uBAAqB,KAAK,WAAW;AACrC,SAAO;AACX;AAcA,SAAS,qBAAqB,OAAqB,UAA0B;AACzE,QAAM,OAAO,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,UAAU,CAAC;AAC7D,MAAI,CAAC,KAAK,OAAQ;AAElB,QAAM,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/C,QAAM,WAAW,oBAAI,IAAmB;AAExC,aAAW,KAAK,MAAM;AAClB,UAAM,MAAM,EAAE;AACd,QAAI,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,EAAG;AAC5B,QAAI,CAAC,SAAS,IAAI,GAAG,EAAG,UAAS,IAAI,KAAK,CAAC,CAAC;AAC5C,aAAS,IAAI,GAAG,EAAG,KAAK,CAAC;AAAA,EAC7B;AAEA,QAAM,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC;AACnE,QAAM,SAAS,MAAM,SAAS,QAAQ;AAGtC,QAAM,UAAU,oBAAI,IAAY;AAEhC,QAAM,QAAQ,CAAC,KAAU,cAAyB;AA1GtD;AA2GQ,QAAI,QAAQ,IAAI,IAAI,EAAE,EAAG;AACzB,YAAQ,IAAI,IAAI,EAAE;AAKlB,UAAM,YAAQ,6BAAU,SAAI,gBAAJ,YAAmB,CAAC,CAAC;AAC7C,QAAI,IAAI,uBAAuB;AAC3B,iBAAW,CAAC,GAAG,IAAI,KAAK,OAAO,QAAQ,IAAI,qBAAqB,GAAG;AAC/D,YAAI,KAAM,OAAM,CAAC,IAAI,KAAK;AAAA,MAC9B;AAAA,IACJ;AAEA,UAAM,OAAyC,CAAC;AAChD,UAAM,SAA0C,CAAC;AACjD,UAAM,YAAuD,CAAC;AAE9D,eAAW,KAAK,UAAU;AACtB,YAAM,MAAM,UAAU,CAAC;AACvB,YAAM,OAAO,MAAM,CAAC;AAEpB,UAAI,KAAK;AACL,YAAI,SAAS,UAAa,SAAS,IAAI,KAAK;AACxC,eAAK,CAAC,IAAI,IAAI;AACd,iBAAO,CAAC,IAAI,IAAI;AAAA,QACpB,OAAO;AACH,eAAK,CAAC,IAAI,IAAI;AACd,iBAAO,CAAC,IAAI,IAAI;AAChB,oBAAU,CAAC,IAAI;AAAA,YACX,MAAM;AAAA,YACN,IAAI,IAAI;AAAA,YACR,QAAQ,IAAI;AAAA,UAChB;AAAA,QACJ;AAAA,MACJ,WAAW,SAAS,QAAW;AAC3B,aAAK,CAAC,IAAI;AACV,eAAO,CAAC,IAAI,IAAI;AAAA,MACpB;AAAA,IACJ;AAEA,QAAI,cAAc,OAAO,KAAK,IAAI,EAAE,SAAS,OAAO;AACpD,QAAI,qBAAqB,OAAO,KAAK,MAAM,EAAE,SAAS,SAAS;AAC/D,QAAI,wBAAwB,OAAO,KAAK,SAAS,EAAE,SAAS,YAAY;AAExE,UAAM,WAAsB,EAAE,GAAG,UAAU;AAC3C,eAAW,KAAK,UAAU;AACtB,UAAI,KAAK,CAAC,MAAM,UAAa,OAAO,CAAC,MAAM,QAAW;AAClD,iBAAS,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,GAAc,QAAQ,OAAO,CAAC,EAAG;AAAA,MAChE;AAAA,IACJ;AACA,eAAW,MAAK,cAAS,IAAI,IAAI,EAAE,MAAnB,YAAwB,CAAC,EAAG,OAAM,GAAG,QAAQ;AAAA,EACjE;AAEA,aAAW,KAAK,OAAQ,OAAM,GAAG,CAAC,CAAC;AACvC;AAIA,SAAS,UAAU,KAAU,UAAyB;AAClD,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,OAAM,CAAC;AAC5C,QAAM,KAAK,IAAI,IAAI,EAAE;AACrB,QAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,QAAM,UAAU,IAAI,IAAI,OAAO,MAAM,MAAM,WAAW,SAAY;AAClE,QAAM,aAAa,oBAAoB,IAAI,UAAU;AAErD,QAAM,WAAW,cAAc,IAAI,QAAQ;AAC3C,QAAM,WAAW,cAAc,IAAI,QAAQ;AAE3C,MAAI,cAAmD;AACvD,MAAI,IAAI,eAAe,OAAO,IAAI,gBAAgB,UAAU;AACxD,kBAAc,CAAC;AACf,eAAW,KAAK,UAAU;AACtB,YAAM,IAAK,IAAI,YAAoB,CAAC;AACpC,UAAI,MAAM,QAAW;AACjB,oBAAY,CAAC,IAAI,KAAK,CAAC;AAAA,MAC3B;AAAA,IACJ;AACA,QAAI,OAAO,KAAK,WAAW,EAAE,WAAW,GAAG;AACvC,oBAAc;AAAA,IAClB;AAAA,EACJ;AAEA,QAAM,wBACF,IAAI,yBAAyB,OAAO,IAAI,0BAA0B,WAC3D,IAAI,wBACL;AAEV,QAAM,OACF,IAAI,QAAQ,OAAO,IAAI,SAAS,WACzB,IAAI,OACL;AAEV,QAAM,MAAW;AAAA,IACb,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,GAAI,MAAM,EAAE,GAAG;AAAA,IACf,GAAI,SAAS,EAAE,MAAM;AAAA,IACrB,GAAI,WAAW,EAAE,QAAQ;AAAA,IACzB,GAAI,eAAe,UAAa,EAAE,WAAW;AAAA,IAC7C,GAAI,eAAe,EAAE,YAAY;AAAA,IACjC,GAAI,yBAAyB,EAAE,sBAAsB;AAAA,IACrD,GAAI,SAAS,UAAU,EAAE,UAAU,OAAO,QAAQ,EAAE;AAAA,IACpD,GAAI,SAAS,UAAU,EAAE,UAAU,OAAO,QAAQ,EAAE;AAAA,IACpD,GAAI,QAAQ,EAAE,KAAK;AAAA,EACvB;AACA,SAAO;AACX;AACA,SAAS,YAAY,KAAU,SAA6B;AACxD,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,OAAM,CAAC;AAE5C,QAAM,UAAU,gBAAgB,IAAI,OAAO;AAC3C,QAAM,OAAO,IAAI,IAAI,IAAI,KAAK;AAC9B,QAAM,KAAK,IAAI,IAAI,EAAE;AACrB,QAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAGvD,QAAM,QAAQ,IAAI,IAAI,KAAK,KAAK;AAChC,QAAM,WAAW,CAAC,CAAC,IAAI;AAGvB,QAAM,KACF,IAAI,MAAM,OAAO,IAAI,OAAO,WACrB,IAAI,KACL;AACV,QAAM,WACF,IAAI,YAAY,OAAO,IAAI,aAAa,WACjC,IAAI,WACL;AAGV,QAAM,eACF,IAAI,iBAAiB,aAAa,IAAI,iBAAiB,SACjD,IAAI,eACJ;AAGV,QAAM,gBAAgB,MAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,QAAQ,SAAS;AACzE,QAAM,UAAU,gBACT,IAAI,QAAkB,IAAI,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,IAC/D;AAGN,QAAM,YACF,SAAS,WAAW,IAAI,IAAI,SAAS,KAAK,SAAY;AAG1D,QAAM,OACF,IAAI,QAAQ,OAAO,IAAI,SAAS,WAC1B,EAAE,GAAI,IAAI,KAAa,IACvB;AAKV,QAAM,SAAkB,gBAAgB,OAAO,IAAI,WAAW;AAG9D,QAAM,uBAAuB,oBAAoB,IAAI,UAAU;AAC/D,QAAM,mBACF,UACA,iBAAiB,aACjB,yBAAyB,SACnB,uBACA;AAEV,QAAM,QAAe;AAAA,IACjB;AAAA,IACA;AAAA,IACA,GAAI,YAAY,UAAa,EAAE,QAAQ;AAAA,IACvC,GAAI,QAAQ,EAAE,KAAK;AAAA,IACnB,GAAI,WAAW,QAAQ,UAAU,EAAE,QAAQ;AAAA,IAC3C,GAAI,aAAa,EAAE,UAAU;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,MAAM,EAAE,GAAc;AAAA,IAC1B,GAAI,YAAY,EAAE,SAAS;AAAA,IAC3B,GAAI,QAAQ,EAAE,KAAK;AAAA,IACnB,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3B,GAAI,qBAAqB,UAAa,EAAE,YAAY,iBAAiB;AAAA,EACzE;AAEA,SAAO;AACX;AAEA,SAAS,aAAa,KAAU,aAAuC;AACnE,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,OAAM,CAAC;AAC5C,QAAM,KAAK,IAAI,IAAI,EAAE;AACrB,QAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,QAAM,aAAa,oBAAoB,IAAI,UAAU;AACrD,QAAM,QACF,OAAO,IAAI,UAAU,YAAY,OAAO,IAAI,UAAU,WAC/C,IAAI,QACL;AAEV,QAAM,eACF,IAAI,iBAAiB,aAAa,IAAI,iBAAiB,SACjD,IAAI,eACJ;AAEV,QAAM,OACF,IAAI,QAAQ,OAAO,IAAI,SAAS,WACzB,IAAI,OACL;AAEV,QAAM,SAAsB;AAAA,IACxB,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,GAAI,MAAM,EAAE,GAAG;AAAA,IACf,GAAI,SAAS,EAAE,MAAM;AAAA,IACrB,GAAI,UAAU,UAAa,EAAE,MAAM;AAAA,IACnC,GAAI,eAAe,UAAa,EAAE,WAAW;AAAA,IAC7C;AAAA,IACA,GAAI,QAAQ,EAAE,KAAK;AAAA,EACvB;AACA,SAAO;AACX;AAIA,SAAS,gBAAgB,KAAuC;AAC5D,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAE5C,QAAM,MAAuB,CAAC;AAC9B,QAAM,IAAK,IAAY;AACvB,QAAM,IAAK,IAAY;AAEvB,MAAI,KAAK,OAAO,MAAM,UAAU;AAC5B,UAAM,KAAqC,CAAC;AAC5C,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,CAAC,GAAG;AACpC,YAAM,MAAM,OAAO,CAAC;AACpB,YAAM,MAAM,iBAAiB,CAAC;AAC9B,YAAM,QAAQ,OAAO,IAAI,OAAO,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC;AACzD,UAAI,MAAM,OAAQ,IAAG,GAAG,IAAI;AAAA,IAChC;AACA,QAAI,OAAO,KAAK,EAAE,EAAE,OAAQ,KAAI,SAAS;AAAA,EAC7C;AAEA,MAAI,KAAK,OAAO,MAAM,UAAU;AAC5B,UAAM,KAAqC,CAAC;AAC5C,eAAW,CAAC,QAAQ,CAAC,KAAK,OAAO,QAAQ,CAAC,GAAG;AACzC,YAAM,MAAM,OAAO,MAAM;AACzB,YAAM,MAAM,iBAAiB,CAAC;AAC9B,YAAM,QAAQ,OAAO,IAAI,OAAO,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC;AACzD,UAAI,MAAM,OAAQ,IAAG,GAAG,IAAI;AAAA,IAChC;AACA,QAAI,OAAO,KAAK,EAAE,EAAE,OAAQ,KAAI,QAAQ;AAAA,EAC5C;AAEA,SAAO,IAAI,SAAS,IAAI,SAAS,MAAM;AAC3C;AAIA,SAAS,SAAS,OAAyC;AACvD,MAAI,SAAS,OAAO,UAAU;AAC1B,WAAO;AACX,QAAM,IAAI,UAAU,yCAAyC;AACjE;AAEA,SAAS,gBAAgB,MAA8C;AACnE,MAAI,OAAO,SAAS,YAAY,KAAK,KAAK,EAAG,QAAO,KAAK,KAAK;AAC9D,MAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,UAAM,MAAM,OAAO,KAAK,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC;AACpE,QAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,QAAI,IAAI,WAAW,EAAG,QAAO,IAAI,CAAC;AAClC,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,SAAS,iBAAiB,KAAgD;AACtE,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,MAAgC,CAAC;AACvC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACtC,QAAI,CAAC,EAAG;AACR,UAAM,MAAM,cAAc,CAAC;AAC3B,QAAI,IAAI,OAAQ,KAAI,CAAC,IAAI,OAAO,GAAG;AAAA,EACvC;AACA,SAAO,OAAO,KAAK,GAAG,EAAE,SAAS,MAAM;AAC3C;AAEA,SAAS,cAAc,GAAkB;AACrC,MAAI,CAAC,MAAM,QAAQ,CAAC,EAAG,QAAO,CAAC;AAC/B,SAAO,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC;AAC3E;AAEA,SAAS,oBAAoB,GAA4B;AACrD,MAAI,MAAM,QAAQ,MAAM,OAAW,QAAO;AAC1C,QAAM,IAAI,OAAO,CAAC;AAClB,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AACpC;AAEA,SAAS,IAAI,GAA4B;AACrC,MAAI,OAAO,MAAM,YAAY,EAAE,KAAK,EAAE,SAAS,EAAG,QAAO,EAAE,KAAK;AAChE,SAAO;AACX;AAEA,SAAS,KAAK,GAA6B;AACvC,MAAI,MAAM,OAAW,QAAO;AAC5B,SAAO,CAAC,CAAC;AACb;AAEA,SAAS,OAAU,KAAe;AAC9B,SAAO,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC;AAClC;AAEA,SAAS,WACL,KACqB;AACrB,SAAO,CAAC,CAAC,OAAO,OAAO,KAAK,GAAG,EAAE,SAAS;AAC9C;AAEA,SAAS,iBAAiB,GAAwB;AAC9C,MAAI,CAAC,MAAM,QAAQ,CAAC,EAAG,QAAO,CAAC;AAC/B,SAAO,EACF;AAAA,IAAI,CAAC,MACF,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAAA,EACjE,EACC;AAAA,IACG,CAAC,MAAM,MAAM,MAAM,MAAM,QAAQ,MAAM;AAAA,EAC3C;AACR;;;ACvaO,SAAS,aAAa,GAAmB;AANhD;AAOI,QAAM,KAAK,EAAE,QAAQ,IAAI,YAAY;AACrC,QAAM,YAAY,CAAC,GAAC,OAAE,SAAF,mBAAQ;AAC5B,SAAO,MAAM,iBAAiB,MAAM,cAAc;AACtD;;;ACCA,IAAM,iBAAiB,oBAAI,IAA0B;AAAA,EACjD;AAAA,EACA;AACJ,CAAC;AACD,IAAM,mBAAmB,oBAAI,IAA4B,CAAC,UAAU,CAAC;AACrE,IAAM,cAAc,oBAAI,IAAuB;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AACD,IAAM,gBAAgB,oBAAI,IAAgD;AAAA,EACtE;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AACD,IAAM,qBAAqB,oBAAI,IAA0C;AAAA,EACrE;AAAA,EACA;AACJ,CAAC;AAED,IAAM,oBAAoB,oBAAI,IAE5B,CAAC,MAAM,OAAO,MAAM,OAAO,UAAU,UAAU,OAAO,CAAC;AAMzD,SAAS,eACL,KACA,GACA,GACA,IACyB;AACzB,MAAI,QAAQ,OAAW,QAAO;AAC9B,MAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACrB,MAAE,KAAK;AAAA,MACH,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACX;AAEA,QAAM,MAAqB,CAAC;AAE5B,MAAI,QAAQ,CAAC,KAAK,MAAM;AACpB,UAAM,MAAW,OAAO,OAAO,QAAQ,WAAW,MAAM;AACxD,UAAM,OACF,QAAO,2BAAK,UAAS,YAAY,IAAI,KAAK,KAAK,IACzC,IAAI,KAAK,KAAK,IACd;AAEV,QAAI,CAAC,MAAM;AACP,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS,gBAAgB,CAAC;AAAA,QAC1B,MAAM,gBAAgB,CAAC;AAAA,MAC3B,CAAC;AACD;AAAA,IACJ;AAEA,QAAI,CAAC,KAAK,WAAW,UAAU,GAAG;AAC9B,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS,gBAAgB,CAAC;AAAA,QAC1B,MAAM,gBAAgB,CAAC;AAAA,MAC3B,CAAC;AAAA,IACL;AAEA,UAAM,QAAiB,2BAAK;AAC5B,UAAM,KACF,UAAU,SACJ,OACA,OAAO,UAAU,YACf,kBAAkB,IAAI,KAAY,IACjC,QACD;AAEZ,QACI,UAAU,UACV,EAAE,OAAO,UAAU,YAAY,kBAAkB,IAAI,KAAY,IACnE;AACE,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS,wBAAwB,CAAC;AAAA,QAClC,MAAM,gBAAgB,CAAC;AAAA,MAC3B,CAAC;AAAA,IACL;AAEA,UAAM,QAAiB,2BAAK;AAG5B,QAAI,OAAO,YAAY,OAAO,YAAY,OAAO,SAAS;AACtD,UAAI,UAAU,QAAW;AACrB,UAAE,KAAK;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS,gBAAgB,CAAC,SAAS,EAAE;AAAA,UACrC,MAAM,gBAAgB,CAAC;AAAA,QAC3B,CAAC;AAAA,MACL;AAAA,IACJ,WAAW,OAAO,QAAQ,OAAO,OAAO;AACpC,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB,UAAE,KAAK;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS,gBAAgB,CAAC,SAAS,EAAE;AAAA,UACrC,MAAM,gBAAgB,CAAC;AAAA,QAC3B,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,QAAI,KAAK,EAAE,MAAM,IAAI,MAAM,CAAC;AAAA,EAChC,CAAC;AAED,SAAO,IAAI,SAAS,MAAM;AAC9B;AAYO,SAAS,gBAAgB,KAG9B;AACE,QAAM,cAAkC,CAAC;AACzC,QAAM,WAA0B,CAAC;AAEjC,MAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACrB,gBAAY,KAAK;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,MACV,SAAS;AAAA,IACb,CAAC;AACD,WAAO,EAAE,UAAU,YAAY;AAAA,EACnC;AAEA,MAAI,QAAQ,CAAC,OAAO,MAAM;AACtB,UAAM,IAAwB,CAAC;AAC/B,UAAM,MAAM,SAAS,OAAO,UAAU,WAAY,QAAgB,CAAC;AAEnE,QAAI,KACA,OAAO,IAAI,OAAO,YAAY,IAAI,GAAG,KAAK,IACpC,IAAI,GAAG,KAAK,IACZ;AAGV,QAAI,CAAC,IAAI;AACL,WAAK,UAAU,IAAI,CAAC;AACpB,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,UAAM,QACF,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,KAAK,IAC1C,IAAI,MAAM,KAAK,IACf;AAEV,QAAI,EAAE,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,KAAK,IAAI;AACtD,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,QAAI,QAA8B,eAAe,IAAI,IAAI,KAAK,IACxD,IAAI,QACJ,IAAI,UAAU,SACZ,kBACA;AACR,QAAI,IAAI,UAAU,UAAa,CAAC,eAAe,IAAI,IAAI,KAAK,GAAG;AAC3D,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,QAAI,UAAkC,iBAAiB,IAAI,IAAI,OAAO,IAChE,IAAI,UACJ;AACN,QAAI,IAAI,YAAY,UAAa,CAAC,iBAAiB,IAAI,IAAI,OAAO,GAAG;AACjE,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,UAAM,KAAwB,IAAI;AAClC,QAAI,CAAC,YAAY,IAAI,EAAE,GAAG;AACtB,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS,iBAAiB,OAAO,EAAE,CAAC;AAAA,QACpC,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,QAAI,aACA,OAAO,IAAI,eAAe,YAAY,IAAI,WAAW,KAAK,IACpD,IAAI,WAAW,KAAK,IACpB;AAGV,QACI,YAAY,cACZ,cACA,CAAC,WAAW,WAAW,UAAU,GACnC;AACE,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SACI;AAAA,QACJ,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAEA,UAAM,YACF,IAAI,UAAU,OAAO,IAAI,WAAW,WAC7B,IAAI,SACL;AAEV,UAAM,QACF,uCAAW,SAAQ,cAAc,IAAI,UAAU,IAAI,IAC7C,UAAU,OACV;AAEV,SAAI,uCAAW,SAAQ,CAAC,cAAc,IAAI,UAAU,IAAI,GAAG;AACvD,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAEA,UAAM,SAA4C;AAAA,MAC9C;AAAA,MACA,SACI,uCAAW,YAAW,SAChB,MAAM,QAAQ,UAAU,MAAM,IAC1B,UAAU,SACV,CAAC,UAAU,MAAM,IACrB;AAAA,MACV,WACI,uCAAW,cAAa,SAClB,MAAM,QAAQ,UAAU,QAAQ,IAC5B,UAAU,WACV,CAAC,UAAU,QAAQ,IACvB;AAAA,MACV,OAAO,eAAgB,uCAAmB,OAAO,GAAG,GAAG,EAAE;AAAA,IAC7D;AAGA,UAAM,WACF,mBAAmB,IAAI,IAAI,QAAQ,IAAI,IAAI,WAAW;AAC1D,QACI,IAAI,aAAa,UACjB,CAAC,mBAAmB,IAAI,IAAI,QAAQ,GACtC;AACE,QAAE,KAAK;AAAA,QACH,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAAA,IACL;AAGA,UAAM,QAAQ,IAAI;AAClB,QAAI,OAAO,eAAe,OAAO,aAAa;AAC1C,UAAI,EAAE,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI;AACxD,UAAE,KAAK;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS,IAAI,EAAE;AAAA,UACf,MAAM;AAAA,QACV,CAAC;AAAA,MACL;AAAA,IACJ,WAAW,OAAO,cAAc,OAAO,YAAY;AAC/C,UAAI,UAAU,QAAW;AACrB,UAAE,KAAK;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS,IAAI,EAAE;AAAA,UACf,MAAM;AAAA,QACV,CAAC;AAAA,MACL;AAAA,IACJ,OAAO;AACH,UAAI,UAAU,QAAW;AACrB,UAAE,KAAK;AAAA,UACH,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS,IAAI,EAAE;AAAA,UACf,MAAM;AAAA,QACV,CAAC;AAAA,MACL;AAAA,IACJ;AAGA,UAAM,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO;AACrD,QAAI,CAAC,UAAU;AACX,YAAM,OAAoB;AAAA,QACtB;AAAA,QACA;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SACI,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,MACxD;AACA,eAAS,KAAK,IAAI;AAAA,IACtB;AAEA,gBAAY,KAAK,GAAG,CAAC;AAAA,EACzB,CAAC;AAED,SAAO,EAAE,UAAU,YAAY;AACnC;;;ACvXO,SAAS,eAAe,GAAoB;AAC/C,QAAM,IAAI,OAAO,CAAC;AAClB,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AACpC;AAMO,SAAS,gBACZ,QACA,WACA,aACO;AACP,QAAM,MAAwC,OAAO,OAAO,SAAS,CAAC;AACtE,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,YAAY,aAAa,QAAQ,CAAC,IAAI,SAAU,QAAO;AAC3D,MAAI,YAAY,WAAW,QAAQ,CAAC,IAAI,OAAQ,QAAO;AACvD,SAAO,EAAE,YAAY,WAAW,QAAQ,CAAC,IAAI;AAEjD;AAMO,SAAS,OACZ,QACA,WACA,SACA,QACO;AAtCX;AAuCI,QAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,QAAM,OAAO,OAAO,OAAO,OAAO,CAAC;AACnC,MAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAE3B,QAAM,QAAQ,eAAe,KAAK,IAAI;AACtC,QAAM,QAAQ,eAAe,KAAK,IAAI;AACtC,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAE/D,QAAM,MAAK,YAAO,eAAP,YAAqB,EAAE,MAAM,cAAuB;AAC/D,UAAQ,GAAG,MAAM;AAAA,IACb,KAAK;AACD,aAAO,SAAS;AAAA,IACpB,KAAK,cAAc;AACf,YAAM,MAAM,KAAK,IAAI,IAAG,QAAG,QAAH,YAAU,CAAC;AACnC,aAAO,SAAS,SAAS,IAAI,MAAM;AAAA,IACvC;AAAA,IACA,KAAK,sBAAsB;AACvB,YAAM,MAAM,KAAK,IAAI,IAAG,QAAG,QAAH,YAAU,CAAC;AACnC,aAAO,SAAS,SAAS,IAAI,MAAM;AAAA,IACvC;AAAA,IACA;AACI,aAAO;AAAA,EACf;AACJ;;;AJ1CA,IAAM,YAAY;AAuBlB,IAAM,UAAU,CAAC,OAAe,GAAG,WAAW,IAAI;AAClD,IAAM,YAAY,CAAC,OAAe,GAAG,WAAW,IAAI;AACpD,IAAM,aAAa,CAAC,OAAe,GAAG,WAAW,IAAI;AAGrD,SAAS,cACL,OACA,UACyC;AAnD7C;AAoDI,aAAW,MAAK,WAAM,WAAN,YAAgB,CAAC,GAAG;AAChC,UAAM,QAAO,OAAE,YAAF,YAAa,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ;AAChE,QAAI,OAAO,EAAG,QAAO,EAAE,SAAS,EAAE,IAAI,OAAO,IAAI;AAAA,EACrD;AACA,SAAO;AACX;AAEA,SAAS,oBAAoB,MAAqB,IAAS;AACvD,MAAI,OAAO,KAAK,kBAAkB,YAAY;AAC1C,QAAI,CAAC,KAAK,cAAc,EAAE;AACtB,YAAM,IAAI,MAAM,qBAAqB,OAAO,EAAE,CAAC,EAAE;AACrD;AAAA,EACJ;AACA,MAAI,KAAK,YAAY;AACjB,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,YAAY,EAAS,GAAG;AACnE,YAAM,IAAI,MAAM,qBAAqB,OAAO,EAAE,CAAC,EAAE;AAAA,IACrD;AACA;AAAA,EACJ;AAEA,QAAM,IAAI,MAAM,yBAAyB;AAC7C;AAEO,IAAM,SAAN,MAAa;AAAA,EAUhB,YAAY,SAAkB,KAAgB,OAAsB,CAAC,GAAG;AANxE,SAAQ,UAA4B,CAAC;AACrC,SAAQ,QAAQ;AAChB;AAAA,SAAQ,WAAW;AAjFvB;AAsFQ,SAAK,UAAU;AACf,SAAK,MAAM;AAEX,SAAK,OAAO;AAAA,MACR,cAAc,KAAK;AAAA,QACf;AAAA,QACA,KAAK,KAAI,UAAK,iBAAL,YAAqB,WAAW,GAAI;AAAA,MACjD;AAAA,MACA,oBAAmB,UAAK,sBAAL,YAA0B;AAAA,IACjD;AAEA,SAAK,YAAY,KAAK,aAAa,MAAM,CAAC;AAAA,EAC9C;AAAA;AAAA,EAIA,WAAyB;AACrB,WAAO,KAAK,QAAQ,SAAS;AAAA,EACjC;AAAA,EAEA,SAAS,OAAe,IAAsB;AAC1C,UAAM,SAAS,KAAK,aAAa;AACjC,QAAI,KAAK;AACT,QAAI,QAAQ;AACR,WAAK,WAAW;AAChB,WAAK,eAAe,KAAK,aAAa,QAAQ,SAAS;AAAA,IAC3D;AACA,SAAK;AACL,QAAI;AACA,SAAG;AACH,WAAK;AAAA,IACT,UAAE;AACE,WAAK;AACL,UAAI,QAAQ;AACR,YAAI,IAAI;AACJ,eAAK,OAAO,KAAK;AAAA,QACrB,WAAW,KAAK,cAAc;AAC1B,eAAK,aAAa,KAAK,cAAc,MAAM;AAAA,QAC/C;AACA,aAAK,WAAW;AAChB,aAAK,eAAe;AAAA,MACxB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,KAAK,KAAoB;AAnI7B;AAoIQ,QAAI;AACA,YAAM,SAAS,KAAK,aAAa,IAAI,OAAO,SAAS;AACrD,UAAI,GAAG;AACP,WAAK,cAAc,IAAI,MAAM,MAAM;AAAA,IACvC,SAAS,KAAK;AACV,WAAK,KAAK,gBAAgB;AAAA,QACtB,UAAU,gCAAe,YAAf,YAA0B,OAAO,GAAG;AAAA,QAC9C,MAAM;AAAA,MACV,CAAC;AACD,YAAM;AAAA,IACV;AAAA,EACJ;AAAA,EAEA,OAAgB;AACZ,QAAI,KAAK,SAAS,EAAG,QAAO;AAC5B,SAAK;AACL,SAAK,aAAa,KAAK,QAAQ,KAAK,KAAK,GAAG,MAAM;AAClD,SAAK,KAAK,eAAe;AAAA,MACrB,WAAW,KAAK,QAAQ;AAAA,MACxB,OAAO,KAAK;AAAA,IAChB,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,OAAgB;AACZ,QAAI,KAAK,SAAS,KAAK,QAAQ,SAAS,EAAG,QAAO;AAClD,SAAK;AACL,SAAK,aAAa,KAAK,QAAQ,KAAK,KAAK,GAAG,MAAM;AAClD,SAAK,KAAK,eAAe;AAAA,MACrB,WAAW,KAAK,QAAQ;AAAA,MACxB,OAAO,KAAK;AAAA,IAChB,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAEA,aAAa,IAAY;AACrB,SAAK,WAAW,IAAI,EAAE,YAAY,OAAU,CAAC;AAAA,EACjD;AAAA;AAAA,EAGA,UAAU,KAAc,OAAyB,CAAC,GAAW;AACzD,UAAM,aAAa,KAAK,aAAa,kBAAkB;AACvD,QAAI;AACA,UAAI,QAAQ;AACZ,WAAK,SAAS,aAAa,MAAM;AAC7B,YAAI,IAAI,SAAS,OAAO;AACpB,kBAAQ,KAAK,aAAa,IAAI,IAAI,IAAI;AAAA,QAC1C,WAAW,IAAI,SAAS,SAAS;AAC7B,kBAAQ,KAAK,eAAe,IAAI,IAAI,IAAI;AAAA,QAC5C,OAAO;AACH,kBAAQ,KAAK,gBAAgB,IAAI,SAAS,IAAI,IAAI,IAAI;AAAA,QAC1D;AAAA,MACJ,CAAC;AACD,aAAO;AAAA,IACX,SAAS,KAAK;AAEV,WAAK,aAAa,YAAY,MAAM;AACpC,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,IAAY,WAAyB;AACzC,UAAM,QAAQ,OAAO,gCAAa,EAAE,EAAE,KAAK;AAE3C,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AA5MvC;AA8MoB,YAAI,QAAQ,EAAE,GAAG;AACb,gBAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,cAAI,CAAC,EAAG;AACR,gBAAK,OAAE,UAAF,YAAW,QAAQ,MAAO;AAC/B,YAAE,QAAQ;AAEV,eAAK,IAAI,aAAa;AACtB;AAAA,QACJ;AAGA,YAAI,WAAW,EAAE,GAAG;AAChB,gBAAM,MAAM,cAAc,GAAG,EAAE;AAC/B,cAAI,CAAC,IAAK;AACV,gBAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAAA,YACvB,CAAC,MAAM,EAAE,OAAO,IAAI;AAAA,UACxB;AACA,gBAAM,KAAI,4BAAG,YAAH,mBAAY,KAAK,CAAC,MAAM,EAAE,OAAO;AAC3C,cAAI,CAAC,EAAG;AACR,gBAAK,OAAE,UAAF,YAAW,QAAQ,MAAO;AAC/B,YAAE,QAAQ;AACV,eAAK,IAAI,aAAa;AACtB;AAAA,QACJ;AAGA,cAAM,QAAO,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACpD,YAAI,CAAC,IAAK;AACV,cAAK,SAAI,UAAJ,YAAa,QAAQ,MAAO;AACjC,YAAI,QAAQ;AACZ,aAAK,IAAI,aAAa;AAAA,MAC1B,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,SAAiB,UAA2C;AACrE,UAAM,MAAM,OAAO,aAAa,WAAW,WAAW;AACtD,UAAM,OAAO,IAAI,KAAK;AAEtB,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AA/PvC;AAgQoB,cAAM,UAAS,OAAE,WAAF,YAAY,CAAC;AAC5B,cAAM,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC7C,YAAI,CAAC,GAAG;AACJ,eAAK,IAAI,KAAK,SAAS;AAAA,YACnB,MAAM;AAAA,YACN,SAAS,oBAAoB,OAAO;AAAA,YACpC,MAAM,EAAE,QAAQ;AAAA,UACpB,CAAC;AACD;AAAA,QACJ;AAGA,cAAM,kBACF,OAAQ,EAAU,eAAe;AAGrC,cAAM,mBAAmB,MAAM,QAAQ,EAAE,OAAO,IAC1C,EAAE,QAAQ;AAAA,UACN,CAAC,MAAM,OAAQ,EAAU,eAAe;AAAA,QAC5C,IACA;AAEN,YAAI,mBAAmB,kBAAkB;AACrC,eAAK,IAAI,KAAK,SAAS;AAAA,YACnB,MAAM;AAAA,YACN,SACI;AAAA,YACJ,MAAM;AAAA,cACF;AAAA,cACA;AAAA,cACA;AAAA,YACJ;AAAA,UACJ,CAAC;AACD;AAAA,QACJ;AAGA,YAAI,KAAK,WAAW,GAAG;AACnB,cAAI,UAAU,EAAG,QAAQ,EAAU;AACnC;AAAA,QACJ;AAGA,cAAM,YAAY,OAAO;AAAA,UACrB,CAAC,MAAG;AA5S5B,gBAAAC;AA4S+B,qBAAE,OAAO,aAAYA,MAAA,EAAE,SAAF,OAAAA,MAAU,QAAQ;AAAA;AAAA,QAClD;AACA,YAAI,WAAW;AACX,eAAK,IAAI,KAAK,SAAS;AAAA,YACnB,MAAM;AAAA,YACN,SAAS,wCAAwC,IAAI;AAAA,YACrD,MAAM,EAAE,SAAS,cAAc,UAAU,GAAG;AAAA,UAChD,CAAC;AACD;AAAA,QACJ;AAGA,QAAC,EAAU,OAAO;AAAA,MACtB,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA,EACA,2BAA2D;AACvD,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGQ,aAAa,OAAe,MAAgC;AAlUxE;AAmUQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,UAAM,QAAO,WAAM,YAAN,YAAiB,CAAC;AAC/B,UAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAC3C,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,kBAAkB,KAAK,EAAE;AAGnD,UAAM,MAAK,UAAK,OAAL,YAAW,KAAK,SAAS,IAAI,EAAE;AAC1C,UAAM,UAAS,UAAK,kBAAL,YAAsB,gBAAe,SAAI,UAAJ,YAAa,EAAE;AAEnE,QAAI,CAAC,KAAK,cAAc;AAEpB,WAAK,WAAW,CAAC,MAAM;AA9UnC,YAAAA;AA+UgB,cAAM,QAAQ,EAAE,GAAG,KAAK,IAAI,MAAM;AAElC,cAAM,UAAU,IAAI;AAEpB,cAAM,wBAAwB;AAC9B,cAAM,qBAAqB;AAE3B,cAAM,OAAMA,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC;AAC1B,cAAM,MAAM,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK;AAC/C,YAAI,OAAO,MAAM,GAAG,GAAG,KAAK;AAC5B,UAAE,UAAU;AAAA,MAChB,CAAC;AACD,aAAO;AAAA,IACX;AAGA,UAAM,QAAQ,oBAAI,IAAoB;AACtC,UAAM,UAAU,CAAC,GAAe,QAAwB;AACpD,UAAI,KAAK,CAAC;AACV,iBAAW,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE;AACrD,gBAAQ,OAAc,GAAG;AAAA,IACjC;AACA,UAAM,UAA0B,CAAC;AACjC,YAAQ,KAAK,OAAO;AAGpB,eAAW,KAAK;AACZ,YAAM,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,KAAK,KAAK,SAAS,EAAE,EAAE,CAAC;AAG9D,UAAM,SAAS,QAAQ,IAAI,CAAC,MAAM;AA7W1C,UAAAA,KAAAC,KAAAC;AA8WY,YAAM,SAAS,EAAE,GAAG,EAAE;AACtB,aAAO,KAAK,MAAM,IAAI,EAAE,EAAE;AAC1B,aAAO,QACH,EAAE,OAAO,IAAI,KACP,UACCF,MAAA,KAAK,kBAAL,OAAAA,MAAsB,gBAAeC,MAAA,EAAE,UAAF,OAAAA,MAAW,EAAE,EAAE;AAG/D,aAAO,UAAU,EAAE,WACZC,MAAA,MAAM,IAAI,EAAE,OAAO,MAAnB,OAAAA,MAAwB,EAAE,UAC3B;AAGN,aAAO,qBAAqB;AAC5B,aAAO,wBAAwB;AAC/B,aAAO;AAAA,IACX,CAAC;AAED,SAAK,WAAW,CAAC,MAAM;AAhY/B,UAAAF;AAiYY,YAAM,OAAMA,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC;AAE1B,YAAM,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK;AACnD,UAAI,OAAO,UAAU,GAAG,GAAG,OAAO,CAAC,CAAQ;AAE3C,iBAAW,KAAK,OAAO,MAAM,CAAC,EAAG,KAAI,KAAK,CAAQ;AAClD,QAAE,UAAU;AAAA,IAChB,CAAC;AAED,WAAO;AAAA,EACX;AAAA,EAEQ,eAAe,SAAiB,MAAgC;AA7Y5E;AA8YQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,UAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAChC,UAAM,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC/C,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AAEvD,UAAM,MAAK,UAAK,OAAL,YAAW,KAAK,SAAS,IAAI,EAAE;AAC1C,UAAM,UAAS,UAAK,kBAAL,YAAsB,gBAAe,SAAI,UAAJ,YAAa,EAAE;AACnE,UAAM,OAAO,KAAK,eACZ,KAAK,aAAa,IAAI,IAAI,IAC1B,aAAa,IAAI,IAAI;AAG3B,UAAM,QAAQ,CAAC,QAAa;AA1ZpC,UAAAA;AA2ZY,kBAAK;AAAA,QACD;AAAA,UACCA,MAAA,KAAK,qBAAL,OAAAA,MAAyB,yBAAyB,GAAG;AAAA,MAC1D;AAAA;AAGJ,UAAM,kBAAiB,SAAI,YAAJ,YAAe,CAAC,GAAG,IAAI,CAAC,MAAG;AAja1D,UAAAA,KAAAC;AAia8D;AAAA,QAClD,GAAG;AAAA,QACH,IAAI,MAAM,EAAE,EAAE;AAAA,QACd,SAAQD,MAAA,KAAK,kBAAL,OAAAA,MAAsB,gBAAeC,MAAA,EAAE,UAAF,OAAAA,MAAW,EAAE,EAAE;AAAA,MAChE;AAAA,KAAE;AAEF,UAAM,SAAS;AAAA,MACX,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAU,UAAK,iBAAL,YAAqB,QAAQ,IAAI,UAAU;AAAA,MACrD,SAAS;AAAA,IACb;AAGA,UAAM,cAAc,oBAAI,IAAoB;AAC5C,MAAC,SAAI,YAAJ,YAAe,CAAC,GAAG,QAAQ,CAAC,GAAG,MAAM;AAlb9C,UAAAD,KAAAC;AAmbY,YAAM,YAAWA,OAAAD,MAAA,cAAc,CAAC,MAAf,gBAAAA,IAAkB,OAAlB,OAAAC,MAAwB,EAAE;AAC3C,kBAAY,IAAI,EAAE,IAAI,QAAQ;AAAA,IAClC,CAAC;AAED,SAAK,WAAW,CAAC,MAAM;AAvb/B,UAAAD,KAAAC,KAAAC,KAAAC,KAAAC,KAAAC,KAAAC;AAybY,YAAM,OAAMN,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC;AACzB,YAAM,MAAM,IAAI,UAAU,CAAC,MAAM,EAAE,OAAO,OAAO;AACjD,UAAI,OAAO,MAAM,GAAG,GAAG,MAAa;AACpC,QAAE,SAAS;AAGX,UAAI,KAAK,sBAAsB;AAC3B,mBAAW,MAAKC,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC,GAAG;AAC7B,eAAIC,MAAA,EAAE,aAAF,gBAAAA,IAAY,SAAS,UAAU;AAC/B,kBAAM,IAAI,IAAI,IAAI,EAAE,QAAQ;AAC5B,cAAE,IAAI,EAAE;AACR,cAAE,WAAW,MAAM,KAAK,CAAC;AAAA,UAC7B;AACA,eAAIC,MAAA,EAAE,aAAF,gBAAAA,IAAY,SAAS,UAAU;AAC/B,kBAAM,IAAI,IAAI,IAAI,EAAE,QAAQ;AAC5B,cAAE,IAAI,EAAE;AACR,cAAE,WAAW,MAAM,KAAK,CAAC;AAAA,UAC7B;AAAA,QACJ;AAAA,MACJ;AAGA,UAAI,KAAK,gBAAgB;AACrB,cAAM,OAEF,CAAC,wBAAwB,sBAAsB;AAEnD,mBAAW,UAAU,MAAM;AACvB,gBAAM,UAAUC,MAAA,EAAU,MAAM,MAAhB,OAAAA,MAAqB,CAAC;AACtC,gBAAM,UAAoC,EAAE,GAAG,OAAO;AAEtD,qBAAW,CAAC,KAAK,OAAO,KAAK,OAAO;AAAA,YAChC;AAAA,UACJ,GAAG;AAEC,gBAAI,QAAQ,SAAS;AACjB,oBAAM,SAAS;AACf,oBAAM,SAAS,oBAAI,IAAI;AAAA,gBACnB,IAAIC,MAAA,QAAQ,MAAM,MAAd,OAAAA,MAAmB,CAAC;AAAA,gBACxB,GAAG;AAAA,cACP,CAAC;AACD,sBAAQ,MAAM,IAAI,MAAM,KAAK,MAAM;AACnC;AAAA,YACJ;AAGA,gBAAI,YAAY,IAAI,GAAG,GAAG;AACtB,oBAAM,SAAS,YAAY,IAAI,GAAG;AAClC,oBAAM,SAAS,oBAAI,IAAI;AAAA,gBACnB,IAAIC,MAAA,QAAQ,MAAM,MAAd,OAAAA,MAAmB,CAAC;AAAA,gBACxB,GAAG;AAAA,cACP,CAAC;AACD,sBAAQ,MAAM,IAAI,MAAM,KAAK,MAAM;AAAA,YACvC;AAAA,UACJ;AAEA,UAAC,EAAU,MAAM,IAAI;AAAA,QACzB;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX;AAAA,EAEQ,gBACJ,SACA,UACA,MACM;AA7fd;AA8fQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,UAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAChC,UAAM,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC7C,QAAI,CAAC,EAAG,OAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AACrD,UAAM,WAAU,OAAE,YAAF,YAAa,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ;AACnE,QAAI,SAAS;AACT,YAAM,IAAI,MAAM,qBAAqB,OAAO,KAAK,QAAQ,EAAE;AAC/D,UAAM,QAAO,OAAE,YAAF,YAAa,CAAC,GAAG,MAAM;AAEpC,UAAM,QAAQ,KAAK;AAAA,MACf;AAAA,QACC,UAAK,qBAAL,YAAyB,yBAAyB,IAAI,EAAE;AAAA,IAC7D;AACA,UAAM,aAAY,UAAK,kBAAL,YAAsB;AAAA,OACpC,SAAI,UAAJ,YAAa,IAAI;AAAA,IACrB;AAEA,SAAK,WAAW,CAAC,MAAM;AA/gB/B,UAAAN,KAAAC,KAAAC;AAghBY,YAAM,QAAOF,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACzD,YAAM,OAAMC,MAAA,IAAI,YAAJ,OAAAA,MAAe,CAAC;AAC5B,YAAM,QAAQ,EAAE,GAAG,KAAK,IAAI,OAAO,OAAO,SAAS;AACnD,UAAI,OAAO,SAAS,GAAG,GAAG,KAAK;AAC/B,UAAI,UAAU;AAGd,UAAI,KAAK,gBAAgB;AACrB,cAAM,SAAS,GAAG,OAAO,KAAK,QAAQ;AACtC,cAAM,SAAS,GAAG,OAAO,KAAK,KAAK;AACnC,mBAAW,UAAU;AAAA,UACjB;AAAA,UACA;AAAA,QACJ,GAAY;AACR,gBAAM,KAAIC,MAAA,EAAE,MAAM,MAAR,OAAAA,MAAa,CAAC;AACxB,cAAI,EAAE,MAAM,GAAG;AACX,cAAE,MAAM,IAAI,MAAM,KAAK,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;AACzC,cAAE,MAAM,IAAI;AAAA,UAChB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX;AAAA;AAAA,EAIQ,SAAS,MAAsB;AA5iB3C;AA6iBQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,UAAM,QAAQ,oBAAI,IAAY;AAAA,MAC1B,KAAI,WAAM,YAAN,YAAiB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MACxC,KAAI,WAAM,WAAN,YAAgB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC3C,CAAC;AACD,QAAI,YAAY,WAAW,IAAI;AAC/B,WAAO,MAAM,IAAI,SAAS,EAAG,aAAY,WAAW,SAAS;AAC7D,WAAO;AAAA,EACX;AAAA,EAEQ,eAAe,SAAiB,MAAsB;AAvjBlE;AAwjBQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,UAAM,QAAO,WAAM,WAAN,YAAgB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC7D,UAAM,QAAQ,IAAI,MAAK,gCAAK,YAAL,YAAgB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC3D,QAAI,YAAY;AAChB,QAAI,MAAM,IAAI,SAAS,EAAG,aAAY,WAAW,SAAS;AAC1D,WAAO,MAAM,IAAI,SAAS,EAAG,aAAY,WAAW,SAAS;AAC7D,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UACI,IACA,MAMF;AACE,QAAI,QAAQ,EAAE,GAAG;AAEb,WAAK,KAAK;AAAA,QACN,MAAM;AAAA,QACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAvlB3C;AAwlBwB,gBAAM,OAAM,OAAE,YAAF,YAAa,CAAC;AAC1B,gBAAM,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACvC,cAAI,CAAC,IAAK;AACV,gBAAM,YAAW,SAAI,YAAJ,YAAe;AAChC,gBAAM,WAAW,IAAI;AAAA,YACjB,CAAC,MAAG;AA7lBhC,kBAAAF;AA6lBoC,uBAAAA,MAAA,EAAE,YAAF,OAAAA,MAAa,gBAAgB;AAAA;AAAA,UACzC;AAEA,gBAAM,SAAS,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AACpD,cAAI,SAAS,EAAG;AAChB,gBAAM,SAAS,SAAS,OAAO,QAAQ,CAAC,EAAE,CAAC;AAE3C,cAAI,OACA,OAAO,KAAK,UAAU,WAChB,KAAK,QACL;AACV,cAAI,KAAK;AACL,mBAAO,KAAK;AAAA,cACR;AAAA,cACA,SAAS;AAAA,gBACL,CAAC,MAAM,EAAE,OAAO,KAAK;AAAA,cACzB;AAAA,YACJ;AACJ,cAAI,KAAK;AACL,mBAAO,KAAK;AAAA,cACR,SAAS;AAAA,cACT,SAAS;AAAA,gBACL,CAAC,MAAM,EAAE,OAAO,KAAK;AAAA,cACzB,IAAI;AAAA,YACR;AACJ,cAAI,SAAS,UAAa,OAAO,MAAM,IAAI;AACvC,mBAAO,SAAS;AAGpB,gBAAM,MAAa,CAAC;AACpB,qBAAW,KAAK,KAAK;AACjB,kBAAM,cACD,OAAE,YAAF,YAAa,gBAAgB;AAClC,gBAAI,CAAC,WAAW;AACZ,kBAAI,KAAK,CAAC;AAAA,YACd;AAAA,UAEJ;AACA,mBAAS,OAAO,MAAM,GAAG,MAAM;AAC/B,YAAE,UAAU,CAAC,GAAG,KAAK,GAAG,QAAQ;AAAA,QACpC,CAAC;AAAA,QACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,MAC9B,CAAC;AAAA,IACL,WAAW,UAAU,EAAE,GAAG;AACtB,UAAI,CAAC,KAAK;AACN,cAAM,IAAI,MAAM,0CAA0C;AAC9D,YAAM,UAAU;AAChB,YAAM,QAAQ,KAAK;AAEnB,WAAK,KAAK;AAAA,QACN,MAAM;AAAA,QACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAjpB3C;AAkpBwB,gBAAM,OAAO,OAAE,mBAAF,cAAE,iBAAmB,CAAC;AACnC,gBAAM,OAAO,6CAAe,CAAC;AAC7B,gBAAM,SAAS,IAAI,QAAQ,OAAO;AAClC,cAAI,UAAU,EAAG,KAAI,OAAO,QAAQ,CAAC;AAErC,cAAI,OACA,OAAO,KAAK,UAAU,WAChB,KAAK,QACL;AACV,cAAI,KAAK;AACL,mBAAO,KAAK,IAAI,GAAG,IAAI,QAAQ,KAAK,QAAQ,CAAC;AACjD,cAAI,KAAK;AACL,mBAAO,KAAK;AAAA,cACR,IAAI;AAAA,cACJ,IAAI,QAAQ,KAAK,OAAO,IAAI;AAAA,YAChC;AACJ,cAAI,SAAS,UAAa,OAAO,MAAM,IAAI;AACvC,mBAAO,IAAI;AAEf,cAAI,OAAO,MAAM,GAAG,OAAO;AAAA,QAC/B,CAAC;AAAA,QACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,MAC9B,CAAC;AAAA,IACL,WAAW,WAAW,EAAE,GAAG;AAEvB,WAAK,YAAY,IAAI,IAAI;AAAA,IAC7B,OAAO;AACH,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAClD;AAAA,EACJ;AAAA,EAEA,YACI,UACA,MACF;AACE,QAAI,CAAC,WAAW,QAAQ;AACpB,YAAM,IAAI,MAAM,4CAA4C;AAEhE,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AA3rBvC;AA4rBoB,cAAM,QAAQ,cAAc,GAAG,QAAQ;AACvC,YAAI,CAAC,MAAO;AACZ,cAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAAA,UACvB,CAAC,MAAM,EAAE,OAAO,MAAM;AAAA,QAC1B;AACA,YAAI,EAAC,uBAAG,SAAS;AAEjB,cAAM,SAAS,EAAE,QAAQ;AAAA,UACrB,CAAC,MAAM,EAAE,OAAO;AAAA,QACpB;AACA,YAAI,SAAS,EAAG;AAEhB,cAAM,SAAS,EAAE,QAAQ,OAAO,QAAQ,CAAC,EAAE,CAAC;AAE5C,YAAI,OACA,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAClD,YAAI,KAAK;AACL,iBAAO,KAAK;AAAA,YACR;AAAA,YACA,EAAE,QAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ;AAAA,UACrD;AACJ,YAAI,KAAK;AACL,iBAAO,KAAK;AAAA,YACR,EAAE,QAAQ;AAAA,YACV,EAAE,QAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,IAC5C;AAAA,UACR;AACJ,YAAI,SAAS,UAAa,OAAO,MAAM,IAAI;AACvC,iBAAO,EAAE,QAAQ;AAErB,UAAE,QAAQ,OAAO,MAAM,GAAG,MAAM;AAAA,MACpC,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA,EAEA,UACI,SACA,OAOM;AAzuBd;AA2uBQ,UAAM,MAAK,WAAM,OAAN,YAAY,KAAK,MAAM,GAAG;AAErC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAhvBvC,YAAAA,KAAA;AAivBoB,cAAM,MAAKA,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACvD,YAAI,CAAC;AACD,gBAAM,IAAI;AAAA,YACN,qBAAqB,OAAO;AAAA,UAChC;AACJ,cAAM,QAAQ,OAAE,YAAF,cAAE,UAAY,CAAC;AAC7B,YAAI,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC5B,gBAAM,IAAI,MAAM,cAAc,EAAE,kBAAkB;AAEtD,aAAK,KAAK,EAAE,GAAG,OAAO,GAAG,CAAC;AAAA,MAC9B,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAED,WAAO;AAAA,EACX;AAAA,EAEA,aACI,UACA,OAOF;AACE,QAAI,CAAC,WAAW,QAAQ;AACpB,YAAM,IAAI,MAAM,6CAA6C;AACjE,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAjxBvC;AAkxBoB,cAAM,QAAQ,cAAc,GAAG,QAAQ;AACvC,YAAI,CAAC,MAAO;AACZ,cAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAAA,UACvB,CAAC,MAAM,EAAE,OAAO,MAAM;AAAA,QAC1B;AACA,YAAI,EAAC,uBAAG,SAAS;AACjB,cAAM,IAAI,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AACjD,YAAI,EAAG,QAAO,OAAO,GAAG,KAAK;AAAA,MACjC,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA,EAEA,aAAa,UAAkB;AAC3B,QAAI,CAAC,WAAW,QAAQ;AACpB,YAAM,IAAI,MAAM,6CAA6C;AACjE,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAryBvC;AAsyBoB,cAAM,QAAQ,cAAc,GAAG,QAAQ;AACvC,YAAI,CAAC,MAAO;AACZ,cAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAAA,UACvB,CAAC,MAAM,EAAE,OAAO,MAAM;AAAA,QAC1B;AACA,YAAI,EAAC,uBAAG,SAAS;AACjB,UAAE,UAAU,EAAE,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,QAAQ;AAGrD,cAAM,OAEF,CAAC,wBAAwB,sBAAsB;AACnD,mBAAW,KAAK,MAAM;AAClB,gBAAM,MAAO,EAAU,CAAC;AAGxB,cAAI,CAAC,IAAK;AACV,cAAI,IAAI,QAAQ,EAAG,QAAO,IAAI,QAAQ;AACtC,cAAI,CAAC,OAAO,KAAK,GAAG,EAAE,OAAQ,QAAQ,EAAU,CAAC;AAAA,QACrD;AAAA,MACJ,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA,EAEA,UAAU,IAAY,OAAqB;AACvC,UAAM,QAAQ,wBAAS,IAAI,KAAK;AAChC,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,uBAAuB;AAElD,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAt0BvC;AAu0BoB,YAAI,QAAQ,EAAE,GAAG;AACb,gBAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,cAAI,EAAG,GAAE,QAAQ;AACjB;AAAA,QACJ;AACA,YAAI,UAAU,EAAE,GAAG;AACf,gBAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,cAAI,EAAG,GAAE,QAAQ;AACjB;AAAA,QACJ;AACA,YAAI,WAAW,EAAE,GAAG;AAChB,gBAAM,MAAM,cAAc,GAAG,EAAE;AAC/B,cAAI,CAAC,IAAK;AACV,gBAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAAA,YACvB,CAAC,MAAM,EAAE,OAAO,IAAI;AAAA,UACxB;AACA,gBAAM,KAAI,4BAAG,YAAH,mBAAY,KAAK,CAAC,MAAM,EAAE,OAAO;AAC3C,cAAI,EAAG,GAAE,QAAQ;AACjB;AAAA,QACJ;AACA,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC/C,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA,EAEA,SAAS,SAAiB,MAA0B;AAChD,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAr2BvC;AAs2BoB,cAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACvD,YAAI,CAAC,EAAG;AACR,UAAE,OAAO;AAAA,MACb,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA,EAEA,WACI,IACA,OACI;AACJ,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAr3BvC;AAs3BoB,cAAM,YAAY,OAAO,UAAU,eAAe;AAAA,UAC9C;AAAA,UACA;AAAA,QACJ;AACA,cAAM,UACF,aACA,OAAO,MAAM,eAAe,YAC5B,OAAO,SAAS,MAAM,UAAU;AACpC,cAAM,MAA0B,UAC1B,OAAO,MAAM,UAAU,IACvB;AACN,cAAM,WAAW,MAAM;AAGvB,YAAI,QAAQ,EAAE,GAAG;AACb,gBAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,cAAI,CAAC,EAAG;AAGR,cAAI,WAAW;AACX,gBAAI,QAAQ,OAAW,QAAQ,EAAU;AAAA,gBACpC,GAAE,aAAa;AAAA,UACxB;AACA;AAAA,QACJ;AAGA,YAAI,WAAW,EAAE,GAAG;AAChB,gBAAM,MAAM,cAAc,GAAG,EAAE;AAC/B,cAAI,CAAC,IAAK;AACV,gBAAMO,OAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAAA,YACvB,CAAC,MAAM,EAAE,OAAO,IAAI;AAAA,UACxB;AACA,gBAAM,KAAI,KAAAA,MAAA,gBAAAA,GAAG,YAAH,mBAAY,KAAK,CAAC,MAAM,EAAE,OAAO;AAC3C,cAAI,CAAC,EAAG;AAER,gBAAM,eAAe,OAAE,iBAAF,YAAkB;AAGvC,gBAAM,OAAO,8BAAY;AAEzB,cAAI,SAAS,WAAW;AAEpB,gBAAI,aAAa,QAAQ,QAAW;AAChC,mBAAK,IAAI,KAAK,SAAS;AAAA,gBACnB,SACI;AAAA,gBACJ,MAAM;AAAA,gBACN,MAAM,EAAE,IAAI,YAAY,IAAI;AAAA,cAChC,CAAC;AAAA,YACL;AACA,cAAE,eAAe;AACjB,gBAAI,gBAAgB,EAAG,QAAQ,EAAU;AACzC;AAAA,UACJ;AAGA,cAAI,SAAU,GAAE,eAAe;AAC/B,cAAI,WAAW;AACX,gBAAI,QAAQ,OAAW,QAAQ,EAAU;AAAA,gBACpC,GAAE,aAAa;AAAA,UACxB;AACA;AAAA,QACJ;AAIA,cAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,YAAI,CAAC,GAAG;AACJ,gBAAM,IAAI;AAAA,YACN;AAAA,UACJ;AAAA,QACJ;AAEA,cAAM,gBACF,MAAM,QAAQ,EAAE,OAAO,KAAK,EAAE,QAAQ,SAAS;AACnD,cAAM,WAAW,CAAC,CAAE,EAAU;AAG9B,YAAI,UAAU;AACV,YAAE,eAAe;AAAA,QACrB;AACA,cAAM,iBAAiB,OAAE,iBAAF,YAAkB;AAKzC,YAAI,eAAe;AACf,cAAI,WAAW;AACX,iBAAK,IAAI,KAAK,SAAS;AAAA,cACnB,SACI;AAAA,cACJ,MAAM;AAAA,cACN,MAAM,EAAE,IAAI,YAAY,IAAI;AAAA,YAChC,CAAC;AAAA,UACL;AAGA,cAAI,gBAAiB;AACjB,mBAAQ,EAAU;AACtB;AAAA,QACJ;AAGA,YAAI,CAAC,UAAU;AACX,cAAI,WAAW;AACX,iBAAK,IAAI,KAAK,SAAS;AAAA,cACnB,SACI;AAAA,cACJ,MAAM;AAAA,cACN,MAAM,EAAE,IAAI,YAAY,IAAI;AAAA,YAChC,CAAC;AAAA,UACL;AAEA,cAAI,gBAAiB;AACjB,mBAAQ,EAAU;AACtB;AAAA,QACJ;AAGA,YAAI,kBAAkB,WAAW;AAE7B,cAAI,aAAa,QAAQ,QAAW;AAChC,iBAAK,IAAI,KAAK,SAAS;AAAA,cACnB,SACI;AAAA,cACJ,MAAM;AAAA,cACN,MAAM,EAAE,IAAI,YAAY,IAAI;AAAA,YAChC,CAAC;AAAA,UACL;AACA,cAAI,gBAAiB;AACjB,mBAAQ,EAAU;AACtB;AAAA,QACJ;AAGA,YAAI,WAAW;AACX,cAAI,QAAQ,OAAW,QAAQ,EAAU;AAAA,cACpC,CAAC,EAAU,aAAa;AAAA,QACjC;AAAA,MACJ,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA,EAEA,OACI,SACF;AAzgCN;AA0gCQ,UAAM,MAAK,aAAQ,OAAR,YAAc,KAAK,MAAM,GAAG;AACvC,UAAM,UAAU,EAAE,GAAG,SAAS,GAAG;AACjC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AA/gCvC,YAAAP;AAghCoB,UAAE,UAAU,CAAC,IAAIA,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC,GAAI,OAAO;AAAA,MAC9C,CAAC;AAAA,MACL,MAAM,MACF,KAAK,WAAW,CAAC,MAAM;AAnhCvC,YAAAA;AAohCoB,UAAE,YAAWA,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,MAC3D,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EAEA,UAAU,IAAY,OAAqB;AACvC,QAAI;AACJ,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AA9hCvC;AA+hCoB,UAAE,YAAW,OAAE,YAAF,YAAa,CAAC,GAAG,IAAI,CAAC,MAAM;AACrC,cAAI,EAAE,OAAO,GAAI,QAAO;AACxB,iBAAO;AACP,iBAAO,EAAE,GAAG,GAAG,GAAG,MAAM;AAAA,QAC5B,CAAC;AAAA,MACL,CAAC;AAAA,MACL,MAAM,MACF,KAAK,WAAW,CAAC,MAAM;AAtiCvC;AAuiCoB,UAAE,YAAW,OAAE,YAAF,YAAa,CAAC,GAAG;AAAA,UAAI,CAAC,MAC/B,EAAE,OAAO,MAAM,OAAO,OAAO;AAAA,QACjC;AAAA,MACJ,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EAEA,UAAU,IAAY;AAClB,QAAI;AACJ,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAnjCvC;AAojCoB,wBAAY,6BAAU,CAAC;AAEvB,UAAE,YAAW,OAAE,YAAF,YAAa,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAEvD,mBAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,cAAI,EAAE,YAAY,GAAI,QAAO,EAAE;AAC/B,YAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AACtD,YAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AAAA,QAC1D;AACA,mBAAW,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAC5B,cAAI,MAAM,QAAQ,EAAE,OAAO;AACvB,cAAE,UAAU,EAAE,QAAQ,OAAO,CAAC,MAAM,MAAM,EAAE;AAAA,mBACvC,EAAE,YAAY,GAAI,QAAO,EAAE;AAAA,QACxC;AAAA,MACJ,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,aAAa,SAAS;AAAA,IAC3C,CAAC;AAAA,EACL;AAAA,EAEA,SACI,SAKF;AA7kCN;AA8kCQ,UAAM,MAAK,aAAQ,OAAR,YAAc,KAAK,MAAM,GAAG;AACvC,UAAM,UAAU,EAAE,GAAG,SAAS,GAAG;AACjC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAnlCvC,YAAAA;AAolCoB,UAAE,SAAS,CAAC,IAAIA,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC,GAAI,OAAgB;AAAA,MACrD,CAAC;AAAA,MACL,MAAM,MACF,KAAK,WAAW,CAAC,MAAM;AAvlCvC,YAAAA;AAwlCoB,UAAE,WAAUA,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,MACzD,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EAEA,YAAY,IAAY,OAAuB;AAC3C,QAAI;AACJ,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAlmCvC;AAomCoB,UAAE,WAAU,OAAE,WAAF,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM;AACnC,cAAI,EAAE,OAAO,GAAI,QAAO;AACxB,iBAAO;AACP,iBAAO,EAAE,GAAG,GAAG,GAAG,MAAM;AAAA,QAC5B,CAAC;AAAA,MACL,CAAC;AAAA,MACL,MAAM,MACF,KAAK,WAAW,CAAC,MAAM;AA3mCvC;AA4mCoB,UAAE,WAAU,OAAE,WAAF,YAAY,CAAC,GAAG;AAAA,UAAI,CAAC,MAC7B,EAAE,OAAO,MAAM,OAAO,OAAO;AAAA,QACjC;AAAA,MACJ,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EAEA,YAAY,IAAY;AACpB,QAAI;AACJ,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAxnCvC;AAynCoB,wBAAY,6BAAU,CAAC;AACvB,UAAE,WAAU,OAAE,WAAF,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAErD,mBAAW,UAAU;AAAA,UACjB;AAAA,UACA;AAAA,QACJ,GAAY;AACR,gBAAM,IAAI,EAAE,MAAM;AAClB,cAAI,CAAC,EAAG;AACR,qBAAW,KAAK,OAAO,KAAK,CAAC,GAAG;AAC5B,cAAE,CAAC,MAAK,OAAE,CAAC,MAAH,YAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,QAAQ,EAAE;AAC9C,gBAAI,GAAC,OAAE,CAAC,MAAH,mBAAM,QAAQ,QAAO,EAAE,CAAC;AAAA,UACjC;AAAA,QACJ;AACA,mBAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,YAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AACtD,YAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,EAAE;AAAA,QAC1D;AAAA,MACJ,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,aAAa,SAAS;AAAA,IAC3C,CAAC;AAAA,EACL;AAAA,EAEA,OAAO,IAAY;AACf,QAAI,QAAQ,EAAE,GAAG;AACb,WAAK,KAAK;AAAA,QACN,MAAM;AAAA,QACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AArpC3C;AAupCwB,YAAE,YAAW,OAAE,YAAF,YAAa,CAAC,GAAG;AAAA,YAC1B,CAAC,MAAM,EAAE,OAAO;AAAA,UACpB;AAGA,qBAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,gBAAI,EAAE,YAAY,GAAI,QAAO,EAAE;AAC/B,cAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG;AAAA,cAC5B,CAAC,MAAM,MAAM;AAAA,YACjB;AACA,cAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG;AAAA,cAC5B,CAAC,MAAM,MAAM;AAAA,YACjB;AAAA,UACJ;AAGA,qBAAW,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAC5B,gBAAI,MAAM,QAAQ,EAAE,OAAO;AACvB,gBAAE,UAAU,EAAE,QAAQ;AAAA,gBAClB,CAAC,MAAM,MAAM;AAAA,cACjB;AAAA,qBACK,EAAE,YAAY,GAAI,QAAO,EAAE;AAAA,UACxC;AAGA,eAAI,OAAE,mBAAF,mBAAmB,IAAK,QAAO,EAAE,eAAe,EAAE;AACtD,qBAAW,KAAK,OAAO,MAAK,OAAE,mBAAF,YAAoB,CAAC,CAAC,GAAG;AACjD,cAAE,eAAgB,CAAC,MACf,OAAE,eAAgB,CAAC,MAAnB,YAAwB,CAAC,GAC3B;AAAA,cAAO,CAAC,QAAK;AAprC3C,oBAAAA;AAqrCiC,yBAAAA,MAAA,EAAE,WAAF,OAAAA,MAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG;AAAA;AAAA,YAC7C;AACA,gBAAI,CAAC,EAAE,eAAgB,CAAC,EAAE;AACtB,qBAAO,EAAE,eAAgB,CAAC;AAAA,UAClC;AAAA,QACJ,CAAC;AAAA,QACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,MAC9B,CAAC;AACD;AAAA,IACJ;AAEA,QAAI,UAAU,EAAE,GAAG;AACf,WAAK,KAAK;AAAA,QACN,MAAM;AAAA,QACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AApsC3C;AAqsCwB,YAAE,WAAU,OAAE,WAAF,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAGrD,qBAAW,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAC7B,cAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG;AAAA,cAC5B,CAAC,MAAM,MAAM;AAAA,YACjB;AACA,cAAE,aAAY,OAAE,aAAF,YAAc,CAAC,GAAG;AAAA,cAC5B,CAAC,MAAM,MAAM;AAAA,YACjB;AAAA,UACJ;AAGA,qBAAW,KAAK,OAAO,MAAK,OAAE,mBAAF,YAAoB,CAAC,CAAC,GAAG;AACjD,cAAE,eAAgB,CAAC,MACf,OAAE,eAAgB,CAAC,MAAnB,YAAwB,CAAC,GAC3B,OAAO,CAAC,QAAQ,QAAQ,EAAE;AAC5B,gBAAI,CAAC,EAAE,eAAgB,CAAC,EAAE;AACtB,qBAAO,EAAE,eAAgB,CAAC;AAAA,UAClC;AAGA,gBAAM,OAEF,CAAC,wBAAwB,sBAAsB;AACnD,qBAAW,KAAK,MAAM;AAClB,kBAAM,MAAO,EAAU,CAAC;AAGxB,gBAAI,CAAC,IAAK;AACV,uBAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAChC,kBAAI,GAAG,MAAK,SAAI,GAAG,MAAP,YAAY,CAAC,GAAG;AAAA,gBACxB,CAAC,QAAQ,QAAQ;AAAA,cACrB;AACA,kBAAI,GAAC,SAAI,GAAG,MAAP,mBAAU,QAAQ,QAAO,IAAI,GAAG;AAAA,YACzC;AACA,gBAAI,CAAC,OAAO,KAAK,GAAG,EAAE,OAAQ,QAAQ,EAAU,CAAC;AAAA,UACrD;AAAA,QACJ,CAAC;AAAA,QACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,MAC9B,CAAC;AACD;AAAA,IACJ;AAEA,QAAI,WAAW,EAAE,GAAG;AAChB,WAAK,aAAa,EAAE;AACpB;AAAA,IACJ;AAEA,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC/C;AAAA,EAEA,QACI,IAI+D;AA9vCvE;AA+vCQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,QAAI,QAAQ,EAAE,GAAG;AACb,YAAM,MAAK,WAAM,YAAN,YAAiB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACvD,aAAO;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ,EAAE,aAAa,uBAAG,QAAQ;AAAA,MACtC;AAAA,IACJ;AACA,QAAI,UAAU,EAAE,GAAG;AACf,YAAM,MAAK,WAAM,WAAN,YAAgB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACtD,YAAM,OAAO,MAAM,QAAQ,uBAAG,OAAO,IAC9B,EAAG,WACJ,uBAAG,WACD,CAAC,EAAE,OAAO,IACV,CAAC;AACT,aAAO,EAAE,MAAM,SAAS,MAAM,GAAG,QAAQ,EAAE,YAAY,KAAK,EAAE;AAAA,IAClE;AACA,QAAI,WAAW,EAAE,GAAG;AAChB,YAAM,MAAM,cAAc,OAAO,EAAE;AACnC,YAAM,IAAI,QACH,WAAM,WAAN,YAAgB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,IACrD;AACN,YAAM,KAAI,4BAAG,YAAH,mBAAY,KAAK,CAAC,MAAM,EAAE,OAAO;AAC3C,aAAO;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ,EAAE,SAAS,2BAAK,QAAQ;AAAA,MACpC;AAAA,IACJ;AAEA,WAAO,EAAE,MAAM,UAAU,MAAM,QAAW,QAAQ,CAAC,EAAE;AAAA,EACzD;AAAA,EAEA,qBAAqB,IAAsC;AAjyC/D;AAkyCQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,UAAM,MAAK,WAAM,WAAN,YAAgB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACtD,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,uBAAuB,OAAU,SAAV,mBAAgB,QAAQ;AAAA,EAC1D;AAAA,EAEA,qBAAqB,IAAY,MAAqB;AAClD,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AA5yCvC;AA6yCoB,cAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,YAAI,CAAC,EAAG;AAER,cAAM,aAAa,sBAAsB,IAAI;AAE7C,YAAI,CAAC,YAAY;AAEb,gBAAK,OAAU,SAAV,mBAAgB,cAAa,QAAW;AACzC,mBAAQ,EAAU,KAAK;AAEvB,gBACK,EAAU,QACX,OAAO,KAAM,EAAU,IAAI,EAAE,WAAW,GAC1C;AACE,qBAAQ,EAAU;AAAA,YACtB;AAAA,UACJ;AACA;AAAA,QACJ;AAGA,QAAC,EAAU,OAAO;AAAA,UACd,GAAI,EAAU;AAAA,UACd,UAAU;AAAA,QACd;AAAA,MACJ,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA,EAEA,uBAAuB,IAAkB;AACrC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AA/0CvC;AAg1CoB,cAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,YAAI,CAAC,KAAK,GAAE,OAAU,SAAV,mBAAgB,UAAU;AACtC,eAAQ,EAAU,KAAK;AACvB,YACK,EAAU,QACX,OAAO,KAAM,EAAU,IAAI,EAAE,WAAW,GAC1C;AACE,iBAAQ,EAAU;AAAA,QACtB;AAAA,MACJ,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA;AAAA,EAGQ,oBACJ,GACA,UACA,SACO;AAn2Cf;AAo2CQ,QAAI,aAAa,QAAS,QAAO;AACjC,UAAM,UAAU,IAAI,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/D,QAAI,MAA0B;AAC9B,UAAM,QAAQ,oBAAI,IAAY;AAC9B,WAAO,KAAK;AACR,UAAI,QAAQ,QAAS,QAAO;AAC5B,UAAI,MAAM,IAAI,GAAG,EAAG;AACpB,YAAM,IAAI,GAAG;AACb,aAAM,aAAQ,IAAI,GAAG,MAAf,mBAAkB;AAAA,IAC5B;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,+BACJ,GACA,YACA,UACO;AAEP,QAAI,eAAe,SAAU,QAAO;AAGpC,UAAM,qBAAqB,CAAC,OAAyB;AA13C7D;AA23CY,UAAI,QAAQ,EAAE,GAAG;AACb,cAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,eAAO,CAAC,IAAI,4BAAG,aAAH,YAAe,CAAC,GAAI,IAAI,4BAAG,aAAH,YAAe,CAAC,CAAE;AAAA,MAC1D;AAEA,YAAM,OAAM,aAAE,yBAAF,mBAAyB,QAAzB,YAAgC,CAAC;AAC7C,YAAM,OAAM,aAAE,yBAAF,mBAAyB,QAAzB,YAAgC,CAAC;AAC7C,aAAO,CAAC,GAAG,KAAK,GAAG,GAAG;AAAA,IAC1B;AAEA,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,QAAQ,CAAC,QAAQ;AAEvB,WAAO,MAAM,SAAS,GAAG;AACrB,YAAM,OAAO,MAAM,IAAI;AACvB,UAAI,SAAS,WAAY,QAAO;AAChC,UAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,cAAQ,IAAI,IAAI;AAEhB,YAAM,KAAK,GAAG,mBAAmB,IAAI,CAAC;AAAA,IAC1C;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,YAAoB,SAA4B;AACpD,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAx5CvC;AAy5CoB,cAAM,WAAW,KAAK,QAAQ,UAAU;AACxC,cAAM,MAAM,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACvD,YACI,SAAS,SAAS,SACjB,SAAS,SAAS,aACd,cAAS,SAAT,mBAAuB,WAC5B,SAAS,SAAS,UACpB;AACE,cAAI,SAAS,SAAS,OAAO;AACzB,kBAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAAA,cACxB,CAAC,MAAM,EAAE,OAAO;AAAA,YACpB;AACA,gBAAI,GAAG;AACH,oBAAM,WAAqB,CAAC;AAC5B,oBAAM,OAAO,IAAI,KAAI,OAAE,aAAF,YAAc,CAAC,CAAC;AACrC,yBAAW,MAAM,KAAK;AAClB,oBACI,KAAK;AAAA,kBACD;AAAA,kBACA;AAAA,kBACA;AAAA,gBACJ,GACF;AACE,uBAAK,KAAK,gBAAgB;AAAA,oBACtB,SAAS,mBAAmB,UAAU,cAAc,EAAE;AAAA,oBACtD,MAAM;AAAA,oBACN,MAAM;AAAA,sBACF;AAAA,sBACA,UAAU;AAAA,sBACV,MAAM;AAAA,oBACV;AAAA,kBACJ,CAAC;AACD;AAAA,gBACJ;AACA,qBAAK,IAAI,EAAE;AACX,yBAAS,KAAK,EAAE;AAAA,cACpB;AACA,kBACI,SAAS,SAAS,OACjB,aAAE,aAAF,mBAAY,WAAZ,YAAsB,KAAK,GAC9B;AACE,kBAAE,WAAW,MAAM,KAAK,IAAI;AAAA,cAChC;AAEA,kBAAI,EAAE,UAAU;AACZ,kBAAE,WAAW,EAAE,SAAS;AAAA,kBACpB,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC;AAAA,gBAC/B;AACA,oBAAI,EAAE,SAAS,WAAW,GAAG;AACzB,yBAAO,EAAE;AAAA,gBACb;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ,OAAO;AACH,kBAAM,WAAqB,CAAC;AAC5B,kBAAM,WACF,aAAE,yBAAF,mBAAyB,gBAAzB,YAAwC,CAAC;AAC7C,kBAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,uBAAW,MAAM,KAAK;AAClB,kBACI,KAAK;AAAA,gBACD;AAAA,gBACA;AAAA,gBACA;AAAA,cACJ,GACF;AACE,qBAAK,KAAK,gBAAgB;AAAA,kBACtB,SAAS,mBAAmB,UAAU,cAAc,EAAE;AAAA,kBACtD,MAAM;AAAA,kBACN,MAAM;AAAA,oBACF;AAAA,oBACA,UAAU;AAAA,oBACV,MAAM;AAAA,kBACV;AAAA,gBACJ,CAAC;AACD;AAAA,cACJ;AACA,mBAAK,IAAI,EAAE;AACX,uBAAS,KAAK,EAAE;AAAA,YACpB;AACA,gBACI,SAAS,SAAS,KAClB,QAAQ,SAAS,GACnB;AACE,kBAAI,CAAC,EAAE;AACH,kBAAE,uBAAuB,CAAC;AAC9B,gBAAE,qBAAqB,UAAU,IAC7B,MAAM,KAAK,IAAI;AAAA,YACvB;AAEA,iBAAI,OAAE,yBAAF,mBAAyB,aAAa;AACtC,gBAAE,qBAAqB,UAAU,IAC7B,EAAE,qBAAqB,UAAU,EAAE;AAAA,gBAC/B,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC;AAAA,cAC/B;AACJ,kBACI,EAAE,qBAAqB,UAAU,EAC5B,WAAW,GAClB;AACE,uBAAO,EAAE,qBAAqB,UAAU;AAAA,cAC5C;AAAA,YACJ;AAAA,UACJ;AAGA,cAAI,CAAC,EAAE,OAAQ,GAAE,SAAS,CAAC;AAC3B,cAAI,CAAC,EAAE,QAAS,GAAE,UAAU,CAAC;AAAA,QACjC,OAAO;AACH,gBAAM,IAAI;AAAA,YACN;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA,EAEA,QAAQ,YAAoB,SAA4B;AACpD,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAlhDvC;AAmhDoB,cAAM,WAAW,KAAK,QAAQ,UAAU;AACxC,cAAM,MAAM,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACvD,YACI,SAAS,SAAS,SACjB,SAAS,SAAS,aACd,cAAS,SAAT,mBAAuB,WAC5B,SAAS,SAAS,UACpB;AACE,cAAI,SAAS,SAAS,OAAO;AACzB,kBAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAAA,cACxB,CAAC,MAAM,EAAE,OAAO;AAAA,YACpB;AACA,gBAAI,GAAG;AACH,oBAAM,WAAqB,CAAC;AAC5B,oBAAM,OAAO,IAAI,KAAI,OAAE,aAAF,YAAc,CAAC,CAAC;AACrC,yBAAW,MAAM,KAAK;AAClB,oBACI,KAAK;AAAA,kBACD;AAAA,kBACA;AAAA,kBACA;AAAA,gBACJ,GACF;AACE,uBAAK,KAAK,gBAAgB;AAAA,oBACtB,SAAS,mBAAmB,UAAU,cAAc,EAAE;AAAA,oBACtD,MAAM;AAAA,oBACN,MAAM;AAAA,sBACF;AAAA,sBACA,UAAU;AAAA,sBACV,MAAM;AAAA,oBACV;AAAA,kBACJ,CAAC;AACD;AAAA,gBACJ;AACA,qBAAK,IAAI,EAAE;AACX,yBAAS,KAAK,EAAE;AAAA,cACpB;AACA,kBACI,SAAS,SAAS,OACjB,aAAE,aAAF,mBAAY,WAAZ,YAAsB,KAAK,GAC9B;AACE,kBAAE,WAAW,MAAM,KAAK,IAAI;AAAA,cAChC;AAEA,kBAAI,EAAE,UAAU;AACZ,kBAAE,WAAW,EAAE,SAAS;AAAA,kBACpB,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC;AAAA,gBAC/B;AACA,oBAAI,EAAE,SAAS,WAAW,GAAG;AACzB,yBAAO,EAAE;AAAA,gBACb;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ,OAAO;AACH,kBAAM,WAAqB,CAAC;AAC5B,kBAAM,WACF,aAAE,yBAAF,mBAAyB,gBAAzB,YAAwC,CAAC;AAC7C,kBAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,uBAAW,MAAM,KAAK;AAClB,kBACI,KAAK;AAAA,gBACD;AAAA,gBACA;AAAA,gBACA;AAAA,cACJ,GACF;AACE,qBAAK,KAAK,gBAAgB;AAAA,kBACtB,SAAS,mBAAmB,UAAU,cAAc,EAAE;AAAA,kBACtD,MAAM;AAAA,kBACN,MAAM;AAAA,oBACF;AAAA,oBACA,UAAU;AAAA,oBACV,MAAM;AAAA,kBACV;AAAA,gBACJ,CAAC;AACD;AAAA,cACJ;AACA,mBAAK,IAAI,EAAE;AACX,uBAAS,KAAK,EAAE;AAAA,YACpB;AACA,gBACI,SAAS,SAAS,KAClB,QAAQ,SAAS,GACnB;AACE,kBAAI,CAAC,EAAE;AACH,kBAAE,uBAAuB,CAAC;AAC9B,gBAAE,qBAAqB,UAAU,IAC7B,MAAM,KAAK,IAAI;AAAA,YACvB;AAEA,iBAAI,OAAE,yBAAF,mBAAyB,aAAa;AACtC,gBAAE,qBAAqB,UAAU,IAC7B,EAAE,qBAAqB,UAAU,EAAE;AAAA,gBAC/B,CAAC,MAAM,CAAC,SAAS,SAAS,CAAC;AAAA,cAC/B;AACJ,kBACI,EAAE,qBAAqB,UAAU,EAC5B,WAAW,GAClB;AACE,uBAAO,EAAE,qBAAqB,UAAU;AAAA,cAC5C;AAAA,YACJ;AAAA,UACJ;AAGA,cAAI,CAAC,EAAE,OAAQ,GAAE,SAAS,CAAC;AAC3B,cAAI,CAAC,EAAE,QAAS,GAAE,UAAU,CAAC;AAAA,QACjC,OAAO;AACH,gBAAM,IAAI;AAAA,YACN;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAgB,QAAgB,MAAoB;AACxD,SAAK,KAAK;AAAA,MACN,MAAM,WAAW,IAAI;AAAA,MACrB,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AA/oDvC;AAipDoB,YAAI,SAAS,QAAQ;AAEjB,cAAI,QAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG;AAClC,gBAAI,KAAK,oBAAoB,GAAG,QAAQ,IAAI,GAAG;AAC3C,oBAAM,IAAI;AAAA,gBACN,8BAA8B,MAAM,WAAM,IAAI;AAAA,cAClD;AAAA,YACJ;AACA,kBAAM,UAAS,OAAE,YAAF,YAAa,CAAC,GAAG;AAAA,cAC5B,CAAC,MAAM,EAAE,OAAO;AAAA,YACpB;AACA,gBAAI,MAAO,OAAM,UAAU;AAC3B;AAAA,UACJ;AAEA,cACK,QAAQ,MAAM,KAAK,UAAU,IAAI,KACjC,UAAU,MAAM,KAAK,QAAQ,IAAI,GACpC;AACE,kBAAM,UAAU,UAAU,IAAI,IAAI,OAAO;AACzC,kBAAM,QAAQ,QAAQ,MAAM,IAAI,SAAS;AACzC,kBAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAAA,cACvB,CAAC,MAAM,EAAE,OAAO;AAAA,YACpB;AACA,gBAAI,CAAC,EAAG;AACR,gBAAI,CAAC,EAAE,SAAS;AACZ,gBAAE,UAAU;AACZ;AAAA,YACJ;AACA,gBAAI,OAAO,EAAE,YAAY,UAAU;AAC/B,kBAAI,EAAE,YAAY;AACd,kBAAE,UAAU,CAAC,EAAE,SAAS,KAAK;AACjC;AAAA,YACJ;AACA,gBAAI,CAAC,EAAE,QAAQ,SAAS,KAAK;AACzB,gBAAE,QAAQ,KAAK,KAAK;AACxB;AAAA,UACJ;AACA,gBAAM,IAAI;AAAA,YACN,2BAA2B,MAAM,WAAM,IAAI;AAAA,UAC/C;AAAA,QACJ;AAGA,YAAI,SAAS,aAAa,SAAS,WAAW;AAC1C,gBAAM,MACF,SAAS,YAAY,aAAa;AAGtC,cAAI,QAAQ,MAAM,KAAK,UAAU,IAAI,GAAG;AACpC,kBAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAAA,cACxB,CAAC,MAAM,EAAE,OAAO;AAAA,YACpB;AACA,gBAAI,CAAC,EAAG;AACR,kBAAM,OAAO,qCAAW,CAAC;AACzB,gBAAI,CAAC,IAAI,SAAS,IAAI,EAAG,KAAI,KAAK,IAAI;AACtC;AAAA,UACJ;AAGA,cAAI,WAAW,MAAM,KAAK,UAAU,IAAI,GAAG;AACvC,kBAAM,SACF,SAAS,YACH,yBACA;AACV,kBAAM,OAAQ,EAAU,MAAM;AAG9B,kBAAM,OAAO,EAAE,GAAI,sBAAQ,CAAC,EAAG;AAC/B,kBAAM,OAAM,UAAK,MAAM,MAAX,YAAgB,CAAC;AAC7B,gBAAI,CAAC,IAAI,SAAS,IAAI,EAAG,KAAI,KAAK,IAAI;AACtC,iBAAK,MAAM,IAAI;AACf,YAAC,EAAU,MAAM,IAAI;AACrB;AAAA,UACJ;AAEA,gBAAM,IAAI;AAAA,YACN,GAAG,IAAI,uBAAuB,MAAM,WAAM,IAAI;AAAA,UAClD;AAAA,QACJ;AAIA,YAAI,SAAS,WAAW;AAEpB,8BAAoB,KAAK,MAAM,MAAM;AAErC,cAAI,KAAK,WAAW,IAAI,GAAG;AACvB,iBAAK,KAAK;AAAA,cACN,MAAM;AAAA,cACN,IAAI,MACA,KAAK,WAAW,CAACQ,OAAM;AA5uD3D,oBAAAR;AA6uDwC,sBAAM,MAAKA,MAAAQ,GAAE,YAAF,OAAAR,MAAa,CAAC,GAAG;AAAA,kBACxB,CAAC,MAAM,EAAE,OAAO;AAAA,gBACpB;AACA,oBAAI,EAAG,CAAC,EAAU,aAAa;AAAA,cACnC,CAAC;AAAA,cACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,YAC9B,CAAC;AACD;AAAA,UACJ;AAEA,cAAI,KAAK,WAAW,IAAI,GAAG;AACvB,iBAAK,KAAK;AAAA,cACN,MAAM;AAAA,cACN,IAAI,MACA,KAAK,WAAW,CAACQ,OAAM;AA3vD3D,oBAAAR,KAAAC;AA4vDwC,2BAAW,MAAKD,MAAAQ,GAAE,WAAF,OAAAR,MAAY,CAAC,GAAG;AAC5B,wBAAM,KAAIC,MAAA,EAAE,YAAF,gBAAAA,IAAW;AAAA,oBACjB,CAAC,MAAM,EAAE,OAAO;AAAA;AAEpB,sBAAI,GAAG;AACH,oBAAC,EAAU,aAAa;AACxB;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ,CAAC;AAAA,cACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,YAC9B,CAAC;AACD;AAAA,UACJ;AAEA,gBAAM,IAAI;AAAA,YACN;AAAA,UACJ;AAAA,QACJ;AAEA,cAAM,IAAI,MAAM,yBAAyB,IAAI,EAAE;AAAA,MACnD,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAgB,QAAgB,MAAoB;AAC3D,SAAK,KAAK;AAAA,MACN,MAAM,cAAc,IAAI;AAAA,MACxB,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AA7xDvC;AA+xDoB,YAAI,SAAS,QAAQ;AAEjB,cAAI,QAAQ,MAAM,KAAK,QAAQ,IAAI,GAAG;AAClC,kBAAM,UAAS,OAAE,YAAF,YAAa,CAAC,GAAG;AAAA,cAC5B,CAAC,MAAM,EAAE,OAAO;AAAA,YACpB;AACA,iBAAI,+BAAO,aAAY,OAAQ,QAAO,MAAM;AAC5C;AAAA,UACJ;AAEA,cACK,QAAQ,MAAM,KAAK,UAAU,IAAI,KACjC,UAAU,MAAM,KAAK,QAAQ,IAAI,GACpC;AACE,kBAAM,UAAU,UAAU,IAAI,IAAI,OAAO;AACzC,kBAAM,QAAQ,QAAQ,MAAM,IAAI,SAAS;AACzC,kBAAM,MAAK,OAAE,WAAF,YAAY,CAAC,GAAG;AAAA,cACvB,CAAC,MAAM,EAAE,OAAO;AAAA,YACpB;AACA,gBAAI,EAAC,uBAAG,SAAS;AACjB,gBAAI,OAAO,EAAE,YAAY,UAAU;AAC/B,kBAAI,EAAE,YAAY,MAAO,QAAO,EAAE;AAClC;AAAA,YACJ;AACA,cAAE,UAAU,EAAE,QAAQ;AAAA,cAClB,CAAC,MAAM,MAAM;AAAA,YACjB;AACA,kBAAI,OAAE,YAAF,mBAAW,YAAW,EAAG,QAAO,EAAE;AACtC;AAAA,UACJ;AACA,gBAAM,IAAI;AAAA,YACN,6BAA6B,MAAM,WAAM,IAAI;AAAA,UACjD;AAAA,QACJ;AAGA,YAAI,SAAS,aAAa,SAAS,WAAW;AAC1C,gBAAM,MACF,SAAS,YAAY,aAAa;AAGtC,cAAI,QAAQ,MAAM,KAAK,UAAU,IAAI,GAAG;AACpC,kBAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG;AAAA,cACxB,CAAC,MAAM,EAAE,OAAO;AAAA,YACpB;AACA,gBAAI,CAAC,EAAG;AACR,cAAE,GAAG,MAAK,OAAE,GAAG,MAAL,YAAU,CAAC,GAAG,OAAO,CAAC,MAAM,MAAM,IAAI;AAChD,gBAAI,GAAC,OAAE,GAAG,MAAL,mBAAQ,QAAQ,QAAQ,EAAU,GAAG;AAC1C;AAAA,UACJ;AAGA,cAAI,WAAW,MAAM,KAAK,UAAU,IAAI,GAAG;AACvC,kBAAM,SACF,SAAS,YACH,yBACA;AACV,kBAAM,OAAQ,EAAU,MAAM;AAG9B,gBAAI,CAAC,KAAM;AACX,gBAAI,KAAK,MAAM,GAAG;AACd,mBAAK,MAAM,MAAK,UAAK,MAAM,MAAX,YAAgB,CAAC,GAAG;AAAA,gBAChC,CAAC,QAAQ,QAAQ;AAAA,cACrB;AACA,kBAAI,GAAC,UAAK,MAAM,MAAX,mBAAc,QAAQ,QAAO,KAAK,MAAM;AAAA,YACjD;AACA,gBAAI,CAAC,OAAO,KAAK,IAAI,EAAE;AACnB,qBAAQ,EAAU,MAAM;AAC5B;AAAA,UACJ;AAEA,gBAAM,IAAI;AAAA,YACN,GAAG,IAAI,uBAAuB,MAAM,WAAM,IAAI;AAAA,UAClD;AAAA,QACJ;AAGA,YAAI,SAAS,WAAW;AAEpB,8BAAoB,KAAK,MAAM,MAAM;AAErC,cAAI,KAAK,WAAW,IAAI,GAAG;AACvB,iBAAK,KAAK;AAAA,cACN,MAAM;AAAA,cACN,IAAI,MACA,KAAK,WAAW,CAACO,OAAM;AAr3D3D,oBAAAR;AAs3DwC,sBAAM,MAAKA,MAAAQ,GAAE,YAAF,OAAAR,MAAa,CAAC,GAAG;AAAA,kBACxB,CAAC,MAAM,EAAE,OAAO;AAAA,gBACpB;AACA,oBAAI,EAAG,QAAQ,EAAU;AAAA,cAC7B,CAAC;AAAA,cACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,YAC9B,CAAC;AACD;AAAA,UACJ;AAEA,cAAI,KAAK,WAAW,IAAI,GAAG;AACvB,iBAAK,KAAK;AAAA,cACN,MAAM;AAAA,cACN,IAAI,MACA,KAAK,WAAW,CAACQ,OAAM;AAp4D3D,oBAAAR,KAAAC;AAq4DwC,2BAAW,MAAKD,MAAAQ,GAAE,WAAF,OAAAR,MAAY,CAAC,GAAG;AAC5B,wBAAM,KAAIC,MAAA,EAAE,YAAF,gBAAAA,IAAW;AAAA,oBACjB,CAAC,MAAM,EAAE,OAAO;AAAA;AAEpB,sBAAI,GAAG;AACH,2BAAQ,EAAU;AAClB;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ,CAAC;AAAA,cACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,YAC9B,CAAC;AACD;AAAA,UACJ;AAEA,gBAAM,IAAI;AAAA,YACN;AAAA,UACJ;AAAA,QACJ;AAEA,cAAM,IAAI,MAAM,4BAA4B,IAAI,EAAE;AAAA,MACtD,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA,EAEA,cAAc,OAAe,MAAc,OAA4B;AACnE,QAAI;AACJ,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAp6DvC;AAq6DoB,cAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACtD,YAAI,CAAC,EAAG;AACR,gBAAO,OAAE,gBAAF,mBAAgB;AACvB,YAAI,CAAC,EAAE,YAAa,GAAE,cAAc,CAAC;AACrC,YAAI,UAAU,OAAW,QAAO,EAAE,YAAY,IAAI;AAAA,YAC7C,GAAE,YAAY,IAAI,IAAI;AAAA,MAC/B,CAAC;AAAA,MACL,MAAM,MACF,KAAK,WAAW,CAAC,MAAM;AA76DvC;AA86DoB,cAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACtD,YAAI,CAAC,EAAG;AACR,YAAI,CAAC,EAAE,YAAa,GAAE,cAAc,CAAC;AACrC,YAAI,SAAS,OAAW,QAAO,EAAE,YAAY,IAAI;AAAA,YAC5C,GAAE,YAAY,IAAI,IAAI;AAAA,MAC/B,CAAC;AAAA,IACT,CAAC;AAAA,EAEL;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,OAAe,MAAc;AACjD,QAAI;AACJ,QAAI;AACJ,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAj8DvC;AAk8DoB,cAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACtD,YAAI,CAAC,EAAG;AACR,gBAAO,OAAE,gBAAF,mBAAgB;AACvB,wBAAe,OAAE,0BAAF,mBAA0B;AAEzC,YAAI,EAAE,YAAa,QAAO,EAAE,YAAY,IAAI;AAC5C,YAAI,EAAE;AACF,iBAAO,EAAE,sBAAsB,IAAI;AAAA,MAC3C,CAAC;AAAA,MACL,MAAM,MACF,KAAK,WAAW,CAAC,MAAM;AA58DvC;AA68DoB,cAAM,MAAK,OAAE,YAAF,YAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACtD,YAAI,CAAC,EAAG;AACR,YAAI,SAAS,QAAW;AACpB,cAAI,CAAC,EAAE,YAAa,GAAE,cAAc,CAAC;AACrC,YAAE,YAAY,IAAI,IAAI;AAAA,QAC1B;AACA,YAAI,iBAAiB,QAAW;AAC5B,cAAI,CAAC,EAAE;AACH,cAAE,wBAAwB,CAAC;AAC/B,YAAE,sBAAsB,IAAI,IAAI;AAAA,QACpC;AAAA,MACJ,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,OAAe,MAAc;AACzC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,IAAI,MACA,KAAK,WAAW,CAAC,MAAM;AAp+DvC;AAq+DoB,cAAM,QAAO,OAAE,YAAF,YAAa,CAAC;AAC3B,cAAM,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/C,cAAM,WAAW,oBAAI,IAAsB;AAC3C,mBAAW,KAAK,MAAM;AAClB,cAAI,EAAE,SAAS;AACX,gBAAI,CAAC,SAAS,IAAI,EAAE,OAAO;AACvB,uBAAS,IAAI,EAAE,SAAS,CAAC,CAAC;AAC9B,qBAAS,IAAI,EAAE,OAAO,EAAG,KAAK,EAAE,EAAE;AAAA,UACtC;AAAA,QACJ;AAEA,cAAM,UAAU,CAAC,OAAe;AAh/DpD,cAAAD,KAAA;AAi/DwB,gBAAM,IAAI,KAAK,IAAI,EAAE;AACrB,cAAI,CAAC,EAAG;AAER,gBAAM,YAAWA,MAAA,EAAE,0BAAF,gBAAAA,IAA0B;AAC3C,cAAI,UAAU;AACV,gBAAI,CAAC,EAAE,YAAa,GAAE,cAAc,CAAC;AACrC,cAAE,YAAY,IAAI,IAAI,SAAS;AAC/B,mBAAO,EAAE,sBAAuB,IAAI;AACpC,gBACI,OAAO,MAAK,OAAE,0BAAF,YAA2B,CAAC,CAAC,EACpC,WAAW,GAClB;AACE,qBAAO,EAAE;AAAA,YACb;AAAA,UACJ,OAAO;AACH,gBAAI,EAAE,aAAa;AACf,qBAAO,EAAE,YAAY,IAAI;AACzB,kBAAI,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,GAAG;AACzC,uBAAO,EAAE;AAAA,cACb;AAAA,YACJ;AAAA,UACJ;AAEA,qBAAW,YAAW,cAAS,IAAI,EAAE,MAAf,YAAoB,CAAC,GAAG;AAC1C,oBAAQ,OAAO;AAAA,UACnB;AAAA,QACJ;AAEA,gBAAQ,KAAK;AAAA,MACjB,CAAC;AAAA,MACL,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA;AAAA,EAIQ,aAAa,MAA0B;AAE3C,UAAM,OAAO,UAAU,MAAM;AAAA,MACzB,aAAa,KAAK,QACb,eAAe,EACf,IAAI,CAAC,SAAS,KAAK,KAAK;AAAA,MAC7B,oBAAoB;AAAA,IACxB,CAAC;AACD,SAAK,QAAQ,KAAK,IAAI;AACtB,SAAK,IAAI,aAAa;AAAA,EAC1B;AAAA,EAEQ,WAAW,KAAsC;AACrD,UAAM,UAAM,6BAAU,KAAK,QAAQ,SAAS,CAAC;AAC7C,QAAI,GAAG;AACP,SAAK,aAAa,GAAG;AAAA,EACzB;AAAA,EAEQ,cAAc,SAAiB,SAAyB;AAC5D,QAAI,KAAK,WAAW,EAAG;AACvB,SAAK,YAAY,KAAK,aAAa,OAAO,CAAC;AAC3C,SAAK,KAAK,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAC7C,QAAI,KAAK,KAAK;AACV,WAAK,KAAK,iBAAiB;AAAA,QACvB,OAAO,KAAK,QAAQ,SAAS;AAAA,QAC7B,QAAQ;AAAA,QACR;AAAA,MACJ,CAAC;AAAA;AAED,WAAK,KAAK,iBAAiB;AAAA,QACvB,OAAO,KAAK,QAAQ,SAAS;AAAA,QAC7B,QAAQ;AAAA,QACR;AAAA,MACJ,CAAC;AAAA,EACT;AAAA,EAEQ,OAAO,OAAe;AAC1B,UAAM,OAAO,KAAK,aAAa,KAAK;AACpC,SAAK,YAAY,IAAI;AACrB,SAAK,KAAK,iBAAiB;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,IAClB,CAAC;AAAA,EACL;AAAA,EAEQ,aAAa,MAA8B;AAC/C,UAAM,YAAQ,6BAAU,KAAK,QAAQ,SAAS,CAAC;AAC/C,UAAM,SAAS,KAAK,IAAI,SAAS;AACjC,WAAO;AAAA,MACH;AAAA,MACA,QAAQ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,aAAa,GAAmB,QAAyB;AAC7D,SAAK,QAAQ,SAAK,6BAAU,EAAE,KAAK,CAAC;AAEpC,UAAM,SAAS,EAAE;AACjB,UAAM,SAAS,iCAAQ;AAEvB,QAAI,QAAQ;AACR,UAAI,OAAO,UAAW,MAAK,IAAI,aAAa,OAAO,SAAS;AAC5D,UAAI,OAAO,SAAU,MAAK,IAAI,YAAY,OAAO,QAAQ;AACzD,UAAI,OAAO;AACP,aAAK,IAAI;AAAA,UACL,MAAM,QAAQ,OAAO,SAAS,IACxB,OAAO,YACP,MAAM,KAAK,OAAO,SAAS;AAAA,QACrC;AAAA,IACR,OAAO;AACH,WAAK,IAAI,aAAa;AAAA,IAC1B;AACA,SAAK,KAAK,iBAAiB,EAAE,OAAO,KAAK,QAAQ,SAAS,GAAG,OAAO,CAAC;AAAA,EACzE;AAAA,EAEQ,YAAY,MAAsB;AAEtC,QAAI,KAAK,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACtC,WAAK,UAAU,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,CAAC;AAAA,IACvD;AACA,SAAK,QAAQ,KAAK,IAAI;AAEtB,UAAM,OAAO,KAAK,QAAQ,SAAS,KAAK,KAAK;AAC7C,QAAI,OAAO,GAAG;AACV,WAAK,QAAQ,OAAO,GAAG,IAAI;AAC3B,WAAK,QAAQ,KAAK,QAAQ,SAAS;AAAA,IACvC,OAAO;AACH,WAAK,QAAQ,KAAK,QAAQ,SAAS;AAAA,IACvC;AAAA,EACJ;AAAA;AAAA,EAGQ,MAAM,QAAiC;AApnEnD;AAqnEQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,UAAM,QAAQ,oBAAI,IAAY;AAAA,MAC1B,KAAI,WAAM,YAAN,YAAiB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MACxC,KAAI,WAAM,WAAN,YAAgB,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MACvC,KAAI,WAAM,WAAN,YAAgB,CAAC,GAAG;AAAA,QACpB,CAAC,MAAG;AA1nEpB,cAAAA,KAAAC;AA0nEuB,kBAAAA,OAAAD,MAAA,EAAE,YAAF,gBAAAA,IAAW,IAAI,CAAC,MAAM,EAAE,QAAxB,OAAAC,MAA+B,CAAC;AAAA;AAAA,MAC3C;AAAA,IACJ,CAAC;AACD,aAAS,IAAI,GAAG,IAAI,KAAQ,KAAK;AAC7B,YAAM,KAAK,GAAG,MAAM,IAAI,CAAC;AACzB,UAAI,CAAC,MAAM,IAAI,EAAE,EAAG,QAAO;AAAA,IAC/B;AACA,UAAM,IAAI,MAAM,uBAAuB;AAAA,EAC3C;AAAA,EAEQ,KACJ,OACA,SACF;AAEE,SAAK,IAAI,KAAK,OAAc,OAAc;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBO,8BACH,YACA,KASc;AAtqEtB;AAuqEQ,UAAM,UACD,sBAAa,SAAb,mBAAmB,eAAnB,aACA,gBAAK,SAAgB,kBAArB,gCADA,YAED,CAAC;AAEL,UAAM,UAAU,IAAI,IAAI,IAAI,eAAe,IAAI,MAAM,CAAC;AACtD,UAAM,UAAU,IAAI,eAAe,CAAC;AAEpC,UAAM,KAAuB;AAAA,MACzB,sBAAsB;AAAA,MACtB,YAAY,EAAE,MAAM,cAAc;AAAA,MAClC,mBAAmB;AAAA,MACnB,MAAM;AAAA,MACN,IAAI,SAAI,aAAJ,YAAgB,CAAC;AAAA,IACzB;AAGA,UAAM,sBAAsB,CACxB,KACA,YACA,UACC;AACD,YAAM,EAAE,SAAS,IAAI,gBAAgB,GAAG;AACxC,aAAO,wBAAwB,UAAU,YAAY,QAAQ,KAAK;AAAA,IACtE;AAEA,UAAM,MAAsB,CAAC;AAE7B,eAAW,MAAM,YAAY;AAEzB,UAAI,QAAQ,IAAI,OAAO,EAAE,CAAC,EAAG;AAE7B,YAAM,MAAM,OAAO,OAAO,EAAE,CAAC;AAC7B,UAAI,CAAC,KAAK;AACN,YAAI,KAAK;AAAA,UACL;AAAA,UACA,IAAI;AAAA,UACJ,iBAAiB;AAAA,UACjB,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,SAAS,CAAC,oBAAoB;AAAA,QAClC,CAAC;AACD;AAAA,MACJ;AAGA,YAAM,kBAAkB;AAAA,QACpB;AAAA,QACA,IAAI;AAAA,SACJ,SAAI,yBAAJ,YAA4B,CAAC;AAAA,MACjC;AAGA,YAAM,aACF,WAAW,OAAO,OAAO,OAAO,QAAQ,IAAI,SAAS,EAAE;AAG3D,YAAM,SAAS;AAAA,SACX,SAAI,aAAJ,YAAgB,CAAC;AAAA,QACjB,CAAC,GAAG,IAAI,gBAAgB,EAAE;AAAA,QAC1B,IAAI;AAAA,MACR;AACA,YAAM,iBAAiB,OAAO;AAE9B,YAAM,UAAmC,CAAC;AAC1C,UAAI,CAAC,gBAAiB,SAAQ,KAAK,qBAAqB;AACxD,UAAI,CAAC,WAAY,SAAQ,KAAK,aAAa;AAC3C,UAAI,CAAC,eAAgB,SAAQ,KAAK,cAAc;AAEhD,UAAI,KAAK;AAAA,QACL;AAAA,QACA,IAAI,mBAAmB,cAAc;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,OAAO,OAAO,SAAS,OAAO,SAAS;AAAA,QACrD,gBAAgB,OAAO,SAAS,SAC1B,OAAO,WACP;AAAA,QACN;AAAA,QACA;AAAA,QACA,MAAM,eAAe,IAAI,IAAI;AAAA,MACjC,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AACJ;AAEA,SAAS,cAAc,KAAqB;AAGxC,QAAM,IAAI,IAAI,MAAM,sCAAsC;AAC1D,MAAI,CAAC,EAAG,QAAO,GAAG,GAAG;AACrB,QAAM,OAAO,EAAE,CAAC,EAAE,KAAK;AACvB,QAAM,IAAI,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI;AAC1C,SAAO,GAAG,IAAI,UAAU,CAAC;AAC7B;AAEA,SAAS,aAAa,KAAkC;AACpD,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,IAAI,IAAI,MAAM,uBAAuB;AAC3C,MAAI,CAAC,EAAG,QAAO,GAAG,GAAG;AACrB,QAAM,OAAO,EAAE,CAAC;AAChB,QAAM,IAAI,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI;AAC1C,SAAO,GAAG,IAAI,QAAQ,CAAC;AAC3B;AAEA,SAAS,wBAAwB,KAAqB;AAElD,SAAO,WAAW,GAAG;AACzB;AAEA,SAAS,WAAW,KAAqB;AAGrC,QAAM,IAAI,IAAI,MAAM,yBAAyB;AAC7C,MAAI,CAAC,EAAG,QAAO,GAAG,GAAG;AACrB,QAAM,OAAO,EAAE,CAAC;AAChB,QAAM,IAAI,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI;AAC1C,SAAO,GAAG,IAAI,QAAQ,CAAC;AAC3B;AAEA,SAAS,WAAW,KAAqB;AAErC,QAAM,IAAI,IAAI,MAAM,cAAc;AAClC,MAAI,CAAC,EAAG,QAAO,GAAG,GAAG;AACrB,QAAM,OAAO,EAAE,CAAC;AAChB,SAAO,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;AAC3C;AAKA,SAAS,sBAAsB,OAA0C;AACrE,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,IAAI;AACV,QAAM,KAAK,EAAE;AACb,MAAI,OAAO,WAAW,OAAO,YAAY,OAAO,OAAQ,QAAO;AAE/D,QAAM,MAAoB,EAAE,SAAS,GAAG;AACxC,MAAI,OAAO,UAAU,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,KAAK,GAAG;AAC9D,QAAI,OAAO,EAAE;AAAA,EACjB;AAEA,SAAO;AACX;AAIA,SAAS,wBACL,OACA,QACA,QACA,OACqD;AAn0EzD;AAo0EI,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAC5B,MAAI,CAAC,SAAS,CAAC,MAAM,OAAQ,QAAO,EAAE,IAAI,MAAM,QAAQ,SAAS;AAEjE,QAAM,WAAW,MAAM;AAAA,IACnB,CAAC,MACG,EAAE,YAAY,eACb,EAAE,UAAU,mBAAmB,EAAE,UAAU;AAAA,EACpD;AAEA,aAAW,KAAK,UAAU;AACtB,UAAM,MAAM,OAAO;AAAA,MAAO,CAAC,OACvB,kBAAkB,OAAO,OAAO,EAAE,CAAC,GAAG,GAAG,KAAK;AAAA,IAClD;AACA,UAAM,aAAa,EAAE,cAAc;AACnC,UAAM,SAAS,IAAI;AAAA,MAAI,CAAC,OACpB,mBAAmB,OAAO,OAAO,EAAE,CAAC,GAAG,UAAU;AAAA,IACrD;AAEA,QAAI,KAAK;AACT,YAAQ,EAAE,IAAI;AAAA,MACV,KAAK;AACD,aAAK,OAAO,UAAU,KAAK,OAAO,MAAM,CAAC,MAAM,MAAM,OAAO,CAAC,CAAC;AAC9D;AAAA,MACJ,KAAK,UAAU;AACX,cAAM,OAAO,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC;AACjD,aAAK,KAAK,SAAS,OAAO;AAC1B;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AACX,cAAM,OAAO,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC;AACjD,aAAK,KAAK,QAAQ;AAClB;AAAA,MACJ;AAAA,MACA,KAAK;AACD,aAAK,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5B;AAAA,MACJ,KAAK;AACD,aAAK,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3B;AAAA,MACJ,KAAK,aAAa;AACd,cAAM,IAAI,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AAClD,aAAK,OAAO,SAAS,CAAC,IAAI,OAAO,UAAU,IAAI;AAC/C;AAAA,MACJ;AAAA,MACA,KAAK,aAAa;AACd,cAAM,IAAI,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AAClD,aAAK,OAAO,SAAS,CAAC,IAAI,OAAO,UAAU,IAAI;AAC/C;AAAA,MACJ;AAAA,MACA;AACI,aAAK;AAAA,IACb;AAEA,QAAI,CAAC,IAAI;AACL,YAAK,OAAE,aAAF,YAAc,aAAa;AAC5B,eAAO,MAAK,OAAE,OAAF,YAAQ,cAAc;AAAA,UACjC,UAAS,MAAK,OAAE,OAAF,YAAQ,gBAAgB;AAAA,IAC/C;AAAA,EACJ;AAEA,SAAO,EAAE,IAAI,OAAO,WAAW,GAAG,QAAQ,SAAS;AACvD;AAEA,SAAS,mBACL,KACA,YACF;AACE,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,MAAM,WAAW,WAAW,UAAU,IACtC,WAAW,MAAM,CAAC,IAClB;AACN,SAAQ,IAAY,GAAG;AAC3B;AAEA,SAAS,kBACL,KACA,MACA,OACO;AACP,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,KAAK;AACf,MAAI,CAAC,EAAG,QAAO;AAEf,MAAI,EAAE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,OAAO,KAAK,CAAC,EAAG,QAAO;AAE/D,SAAO;AACX;AAEA,SAAS,SAAS,GAAuD;AACrE,QAAM,MAAM,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;AACrC,QAAM,IAAI,oBAAI,IAAY;AAC1B,aAAW,KAAK,IAAK,GAAE,IAAI,OAAO,CAAC,CAAC;AACpC,SAAO;AACX;;;AKx4EA,IAAMQ,WAAU,CAAC,OAAe,OAAO,OAAO,YAAY,GAAG,WAAW,IAAI;AAC5E,IAAMC,cAAa,CAAC,OAChB,OAAO,OAAO,YAAY,GAAG,WAAW,IAAI;AASzC,IAAM,YAAN,MAAgB;AAAA,EAMnB,YACqB,SACA,MACnB;AAFmB;AACA;AAPrB,SAAQ,MAAM,oBAAI,IAAY;AAG9B,SAAQ,cAA0B,CAAC;AAAA,EAKhC;AAAA;AAAA,EAGH,QAAQ,IAAoB;AACxB,QAAI,CAAC,GAAI,QAAO,KAAK,MAAM;AAC3B,SAAK,IAAI,MAAM;AACf,SAAK,IAAI,IAAI,EAAE;AACf,SAAK,YAAY;AACjB,SAAK,qBAAqB,EAAE;AAC5B,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,IAAY;AACZ,SAAK,IAAI,IAAI,EAAE;AACf,SAAK,YAAY;AACjB,SAAK,qBAAqB,EAAE;AAC5B,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,IAAY;AACf,QAAI,CAAC,KAAK,IAAI,OAAO,EAAE,EAAG;AAC1B,QAAI,KAAK,cAAc,IAAI;AACvB,WAAK,YAAY,KAAK,IAAI,OAAO,EAAE,KAAK,EAAE;AAC1C,UAAI,KAAK,UAAW,MAAK,qBAAqB,KAAK,SAAS;AAAA,IAChE;AACA,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,IAAY;AACf,QAAI,KAAK,IAAI,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,QAC/B,MAAK,IAAI,EAAE;AAAA,EACpB;AAAA,EAEA,KAAK,KAAuB,SAAkB;AAC1C,SAAK,MAAM,IAAI,IAAI,GAAG;AACtB,SAAK,YAAY,4BAAW,KAAK,IAAI,OAAO,EAAE,KAAK,EAAE;AACrD,QAAI,KAAK,UAAW,MAAK,qBAAqB,KAAK,SAAS;AAC5D,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,QAAQ;AACJ,QAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,UAAW;AACvC,SAAK,IAAI,MAAM;AACf,SAAK,YAAY;AACjB,SAAK,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAA2B;AACvB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,IAAqB;AACrB,WAAO,KAAK,IAAI,IAAI,EAAE;AAAA,EAC1B;AAAA,EAEA,UAA8B;AAC1B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,aAAiC;AAC7B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAAS,IAA0B;AAC/B,SAAK,YAAY,KAAK,EAAE;AACxB,WAAO,MAAM;AACT,YAAM,IAAI,KAAK,YAAY,QAAQ,EAAE;AACrC,UAAI,KAAK,EAAG,MAAK,YAAY,OAAO,GAAG,CAAC;AAAA,IAC5C;AAAA,EACJ;AAAA;AAAA,EAGA,eAAmC;AAvHvC;AAwHQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AAGpC,UAAK,UAAK,KAAK,QAAV,YAAiB,cAAc,aAAa;AAC7C,YAAM,SAAS,MAAM,KAAK,KAAK,GAAG,EAAE,OAAOD,QAAO;AAClD,UAAI,OAAO,SAAS,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS,QAAQ,MAAM,KAAK,KAAK,GAAG,EAAE;AAAA,MACzD;AAAA,IACJ;AAEA,UAAM,QAAQ,KAAK,oBAAoB,KAAK;AAC5C,QAAI,CAAC;AACD,aAAO,EAAE,MAAM,UAAU,OAAO,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE;AAEjE,UAAM,QAAQ,KAAK,mBAAmB,OAAO,KAAK;AAClD,WAAO,EAAE,MAAM,UAAU,MAAM;AAAA,EACnC;AAAA;AAAA,EAGQ,OAAO;AACX,UAAM,UAAqB;AAAA,MACvB,KAAK,MAAM,KAAK,KAAK,GAAG;AAAA,MACxB,SAAS,KAAK;AAAA,IAClB;AACA,eAAW,MAAM,KAAK,YAAa,IAAG,OAAO;AAAA,EACjD;AAAA,EAEQ,qBAAqB,IAAY;AAnJ7C;AAoJQ,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,UAAM,QAAO,WAAM,YAAN,YAAiB,CAAC;AAC/B,UAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAEhC,QAAI,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG;AAC/B,WAAK,eAAe;AACpB;AAAA,IACJ;AACA,UAAM,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACxC,QAAI,uBAAG,SAAS;AACZ,WAAK,eAAe,MAAM,QAAQ,EAAE,OAAO,IACrC,EAAE,QAAQ,CAAC,IACX,EAAE;AACR;AAAA,IACJ;AAEA,QAAIC,YAAW,EAAE,GAAG;AAChB,YAAM,OAAO,OAAO;AAAA,QAAK,CAAC,MAAG;AArKzC,cAAAC;AAsKiB,mBAAAA,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA;AAAA,MAC7C;AACA,UAAI,6BAAM,SAAS;AACf,aAAK,eAAe,MAAM,QAAQ,KAAK,OAAO,IACxC,KAAK,QAAQ,CAAC,IACd,KAAK;AACX;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,GAAG,SAAS,IAAI,GAAG;AACnB,YAAM,CAAC,GAAG,IAAI,GAAG,MAAM,IAAI;AAC3B,YAAM,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG;AAC5C,UAAI,6BAAM,SAAS;AACf,aAAK,eAAe,MAAM,QAAQ,KAAK,OAAO,IACxC,KAAK,QAAQ,CAAC,IACd,KAAK;AACX;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,oBAAoB,OAAyC;AA5LzE;AA6LQ,QAAI,KAAK,aAAc,QAAO,KAAK;AAEnC,eAAW,MAAM,KAAK,IAAK,KAAIF,SAAQ,EAAE,EAAG,QAAO;AAEnD,UAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAChC,eAAW,MAAM,KAAK,KAAK;AACvB,YAAM,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACxC,UAAI,uBAAG;AACH,eAAO,MAAM,QAAQ,EAAE,OAAO,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;AAAA,IAC3D;AAEA,eAAW,MAAM,KAAK,KAAK;AACvB,UAAIC,YAAW,EAAE,GAAG;AAChB,cAAM,OAAO,OAAO;AAAA,UAAK,CAAC,MAAG;AA1M7C,gBAAAC;AA2MqB,qBAAAA,MAAA,EAAE,YAAF,OAAAA,MAAa,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA;AAAA,QAC7C;AACA,YAAI,6BAAM;AACN,iBAAO,MAAM,QAAQ,KAAK,OAAO,IAC3B,KAAK,QAAQ,CAAC,IACd,KAAK;AAAA,MACnB;AACA,UAAI,GAAG,SAAS,IAAI,GAAG;AACnB,cAAM,CAAC,GAAG,IAAI,GAAG,MAAM,IAAI;AAC3B,cAAM,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG;AAC5C,YAAI,6BAAM;AACN,iBAAO,MAAM,QAAQ,KAAK,OAAO,IAC3B,KAAK,QAAQ,CAAC,IACd,KAAK;AAAA,MACnB;AAAA,IACJ;AAEA,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EAEQ,yBAAyB,OAA+B;AA/NpE;AAgOQ,UAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAChC,UAAM,YAAY,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAEtD,UAAM,MAAgB,CAAC;AACvB,eAAW,SAAS,KAAK,KAAK;AAE1B,UAAI,MAAM,WAAW,IAAI,GAAG;AACxB,YAAI,KAAK,KAAK;AACd;AAAA,MACJ;AAGA,YAAM,IAAI,UAAU,IAAI,KAAK;AAC7B,WAAI,uBAAG,YAAW,KAAM,KAAI,KAAK,KAAK;AAAA,IAC1C;AAEA,WAAO;AAAA,EACX;AAAA,EAEQ,mBACJ,OACA,OACY;AAtPpB;AAuPQ,UAAM,QAAO,WAAM,YAAN,YAAiB,CAAC;AAC/B,UAAM,UAAS,WAAM,WAAN,YAAgB,CAAC;AAChC,UAAM,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAClD,UAAM,MAAM,QAAQ,IAAI,KAAK;AAG7B,UAAM,qBAAqB,KAAK,yBAAyB,KAAK;AAC9D,UAAM,WAAW,KAAK,QAAQ,cAAc,OAAO,kBAAkB;AAErE,UAAM,YAAY,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACtD,UAAM,UAAU,SACX,IAAI,CAAC,OAAO,UAAU,IAAI,EAAE,CAAC,EAC7B,OAAO,OAAO;AAGnB,UAAM,aAAoB,CAAC;AAC3B,QAAI,MAAM,2BAAK;AACf,UAAM,QAAQ,oBAAI,IAAY;AAC9B,WAAO,OAAO,CAAC,MAAM,IAAI,GAAG,GAAG;AAC3B,YAAM,IAAI,QAAQ,IAAI,GAAG;AACzB,UAAI,CAAC,EAAG;AACR,iBAAW,KAAK,CAAC;AACjB,YAAM,IAAI,GAAG;AACb,YAAM,EAAE;AAAA,IACZ;AACA,UAAM,eAAe,KAAK,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK;AAG3D,UAAM,WAAmC,CAAC;AAC1C,UAAM,UAAU,KAAK,KAAK;AAG1B,QAAI,mBAAmB;AACvB,SAAI,2BAAK,eAAc,MAAM;AACzB,eAAS;AAAA,SACL,wCAAU,IAAI,gBAAd,YACK,EAAE,IAAI,IAAI,WAAW;AAAA,MAC9B;AACA,yBAAmB;AAAA,IACvB;AAGA,QAAI,iBAAiB;AACrB,eAAW,SAAS,KAAK,KAAK;AAE1B,YAAM,MAAM,KAAK,eAAe,QAAQ,KAAK;AAC7C,WAAI,2BAAK,eAAc,MAAM;AACzB,cAAM,QAAQ,SAAI,iBAAJ,YAAoB;AAClC,cAAM,OACF,wCAAU,IAAI,gBAAd,YACC,EAAE,IAAI,IAAI,WAAW;AAE1B,yBAAiB,KAAK;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AACA;AAAA,MACJ;AAGA,YAAM,IAAI,UAAU,IAAI,KAAK;AAC7B,WAAI,uBAAG,YAAW,QAAQ,EAAE,cAAc,MAAM;AAC5C,cAAM,QAAQ,OAAE,iBAAF,YAAkB;AAChC,cAAM,OACF,wCAAU,EAAE,gBAAZ,YACC,EAAE,IAAI,EAAE,WAAW;AAExB,yBAAiB,KAAK;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,iBACJ,UACA,KACA,MACA,kBACA,gBACO;AACP,QAAI,SAAS,QAAQ;AACjB,UAAI,CAAC,gBAAgB;AACjB,YAAI,oBAAoB,SAAS,SAAS,GAAG;AACzC,mBAAS,CAAC,IAAI;AAAA,QAClB,OAAO;AACH,mBAAS,QAAQ,GAAG;AAAA,QACxB;AACA,eAAO;AAAA,MACX,OAAO;AACH,iBAAS,KAAK,GAAG;AAAA,MACrB;AAAA,IACJ,OAAO;AACH,eAAS,KAAK,GAAG;AAAA,IACrB;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,eAAe,QAAiB,OAAe;AA1W3D;AA2WQ,QAAID,YAAW,KAAK,GAAG;AACnB,iBAAW,KAAK,QAAQ;AACpB,cAAM,KAAI,OAAE,YAAF,mBAAW,KAAK,CAAC,MAAM,EAAE,OAAO;AAC1C,YAAI,EAAG,QAAO;AAAA,MAClB;AAAA,IACJ;AACA,QAAI,MAAM,SAAS,IAAI,GAAG;AACtB,YAAM,CAAC,KAAK,GAAG,IAAI,MAAM,MAAM,IAAI;AACnC,YAAM,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG;AACzC,YAAM,KAAI,4BAAG,YAAH,mBAAY,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE,OAAO;AAC3D,UAAI,EAAG,QAAO;AAAA,IAClB;AACA,WAAO;AAAA,EACX;AACJ;;;ACxWO,IAAM,YAAN,MAAgB;AAAA,EASnB,YACI,SACA,OAA6C,CAAC,GAChD;AAXF,SAAQ,MAAM,IAAI,SAAuB;AAkFzC;AAAA,cAAK,KAAK,IAAI,GAAG,KAAK,KAAK,GAAG;AAC9B,gBAAO,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG;AAkJlC,SAAQ,UAAoB;AAe5B;AAAA;AAAA,SAAQ,oBAAoB,oBAAI,IAAY;AAtQhD;AA8BQ,SAAK,UAAU;AACf,SAAK,YAAW,UAAK,kBAAL,YAAsB;AACtC,SAAK,YAAY,IAAI,UAAU,SAAS;AAAA,MACpC,KAAK;AAAA,MACL,WAAW;AAAA,IACf,CAAC;AAED,UAAM,QAAQ,QAAQ,KAAK;AAC3B,SAAK,QAAQ;AAAA,MACT;AAAA,MACA,WAAW,CAAC;AAAA,MACZ,WAAW,oBAAI,IAAI;AAAA,MACnB,aAAa,oBAAI,IAAI;AAAA,MACrB,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,GAAG,KAAK,gBAAgB;AAAA,MACzD,SAAS;AAAA,IACb;AAEA,SAAK,UAAU,SAAS,CAAC,EAAE,IAAI,MAAM;AAEjC,WAAK,MAAM,YAAY,IAAI,IAAI,GAAG;AAClC,WAAK,KAAK;AAGV,WAAK,IAAI,KAAK,oBAAoB,EAAE,IAAI,CAAC;AAGzC,UAAI,KAAK,SAAU,MAAK,IAAI,KAAK,gBAAgB,KAAK,SAAS,CAAC;AAAA,IACpE,CAAC;AAGD,UAAM,iBACD,UACI,aADJ,aAEA,MAAM;AACH,YAAM,UAAU;AAMhB,UACI,CAAC,QAAQ,eACT,CAAC,QAAQ,WACT,CAAC,QAAQ,UACX;AACE,eAAO;AAAA,MACX;AAEA,aAAO;AAAA,QACH,aAAa,QAAQ;AAAA,QACrB,SAAS,QAAQ;AAAA,QACjB,UAAU,QAAQ;AAAA,MACtB;AAAA,IACJ;AAEJ,SAAK,WAAW,IAAI,YAAY,KAAK,KAAK;AAAA,MACtC,UAAS,UAAK,YAAL,mBAAc;AAAA,MACvB,UAAU;AAAA,IACd,CAAC;AAED,SAAK,SAAS,IAAI,OAAO,SAAS,MAAM;AAAA,MACpC,YAAY,QAAQ,cAAc;AAAA,MAClC,eAAe,CAAC,OAAO,QAAQ,cAAc,EAAE,eAAe,EAAE;AAAA,MAChE,GAAG;AAAA,IACP,CAAC;AAED,QAAI,KAAK,SAAU,MAAK,IAAI,KAAK,gBAAgB,KAAK,SAAS,CAAC;AAAA,EACpE;AAAA,EAMO,KACH,OACA,SACI;AACJ,SAAK,IAAI,KAAK,OAAO,OAAO;AAAA,EAChC;AAAA;AAAA,EAGA,WAAwB;AAEpB,WAAO;AAAA,MACH,GAAG,KAAK;AAAA,MACR,WAAW,IAAI,IAAI,KAAK,MAAM,SAAS;AAAA,MACvC,aAAa,IAAI,IAAI,KAAK,MAAM,WAAW;AAAA,MAC3C,OAAO;AAAA,QACH,OAAO,CAAC,GAAG,KAAK,MAAM,MAAM,KAAK;AAAA,QACjC,OAAO,CAAC,GAAG,KAAK,MAAM,MAAM,KAAK;AAAA,MACrC;AAAA,MACA,WAAW,EAAE,GAAG,KAAK,MAAM,UAAU;AAAA,IACzC;AAAA,EACJ;AAAA,EAEA,WAA0B;AACtB,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,eAAyB;AACrB,WAAO,MAAM,KAAK,KAAK,MAAM,SAAS;AAAA,EAC1C;AAAA,EAEA,cAAwB;AACpB,WAAO,EAAE,GAAG,KAAK,MAAM,SAAS;AAAA,EACpC;AAAA;AAAA,EAGA,eAAqB;AACjB,SAAK,MAAM,QAAQ,KAAK,QAAQ,KAAK;AACrC,SAAK,KAAK;AACV,SAAK,IAAI,KAAK,gBAAgB,KAAK,MAAM,KAAK;AAAA,EAClD;AAAA,EAEA,aAAa,KAA0B;AACnC,SAAK,MAAM,YAAY,EAAE,GAAG,KAAK,MAAM,WAAW,GAAG,IAAI;AACzD,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,YAAY,IAAY,GAAW,GAAiB;AAChD,SAAK,MAAM,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE;AAClC,SAAK,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,OAAO,KAAmC;AACtC,SAAK,UAAU,KAAK,GAAG;AAAA,EAC3B;AAAA,EAEA,eAAe,KAAmC;AAC9C,UAAM,OAAO,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AACzC,QAAI;AAEJ,eAAW,MAAM,KAAY;AACzB,WAAK,IAAI,EAAE;AACX,gBAAU;AAAA,IACd;AAEA,SAAK,UAAU,KAAK,MAAM,OAAO;AAAA,EACrC;AAAA,EAEA,gBAAgB,IAAkB;AAC9B,SAAK,UAAU,OAAO,EAAE;AAAA,EAC5B;AAAA,EAEA,iBAAuB;AACnB,SAAK,UAAU,MAAM;AAAA,EACzB;AAAA,EAEA,eAAe,UAAyB;AACpC,SAAK,IAAI,KAAK,kBAAkB,EAAE,SAAS,CAAC;AAAA,EAChD;AAAA;AAAA,EAGA,eAAe,KAAmC;AAC9C,SAAK,MAAM,cAAc,IAAI,IAAI,GAAU;AAC3C,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,SAAS,IAAmB;AACxB,SAAK,MAAM,UAAU;AACrB,SAAK,KAAK;AACV,SAAK,IAAI,KAAK,gBAAgB,EAAE,GAAG,CAAC;AAAA,EACxC;AAAA;AAAA,EAGA,YAAY,GAA4B;AACpC,SAAK,MAAM,WAAW,EAAE,GAAG,KAAK,MAAM,UAAU,GAAG,EAAE;AACrD,SAAK,KAAK;AACV,SAAK,IAAI,KAAK,mBAAmB,KAAK,YAAY,CAAC;AAAA,EACvD;AAAA;AAAA,EAGA,UAAU,MAAc,MAA+B;AACnD,SAAK,MAAM,YAAY,EAAE,MAAM,KAAK;AACpC,SAAK,KAAK;AACV,SAAK,IAAI,KAAK,gBAAgB,EAAE,MAAM,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,YAAY,IAAmB;AAC3B,UAAM,KAAK,KAAK,MAAM;AACtB,QAAI,CAAC,GAAI;AACT,SAAK,IAAI,KAAK,gBAAgB,EAAE,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,KAAK,CAAC;AAAA,EACtE;AAAA,EAEA,WAAW,IAAkB;AACzB,UAAM,KAAK,KAAK,MAAM;AACtB,QAAI,CAAC,GAAI;AAET,SAAK,IAAI,KAAK,eAAe,EAAE,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,KAAK,CAAC;AACjE,SAAK,MAAM,YAAY;AACvB,SAAK,KAAK;AAAA,EACd;AAAA,EAEA,aAAmB;AACf,UAAM,KAAK,KAAK,MAAM;AACtB,QAAI,CAAC,GAAI;AACT,SAAK,IAAI,KAAK,eAAe,EAAE,MAAM,GAAG,KAAK,CAAC;AAC9C,SAAK,MAAM,YAAY;AACvB,SAAK,KAAK;AAAA,EACd;AAAA;AAAA,EAGQ,OAAa;AACjB,SAAK,MAAM;AACX,QAAI,KAAK,SAAU,MAAK,IAAI,KAAK,gBAAgB,KAAK,SAAS,CAAC;AAAA,EACpE;AAAA,EAEA,UAAgB;AACZ,SAAK,IAAI,MAAM;AAAA,EACnB;AAAA,EAEA,OAAO;AACH,SAAK,QAAQ,KAAK;AAClB,SAAK,aAAa;AAAA,EACtB;AAAA,EAIA,aAAuB;AACnB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,WAAW,KAAe;AAC7B,QAAI,KAAK,YAAY,IAAK;AAC1B,SAAK,UAAU;AACf,SAAK,IAAI,KAAK,eAAe,GAAG;AAAA,EACpC;AAAA;AAAA,EAQA,uBAAiC;AAC7B,WAAO,MAAM,KAAK,KAAK,iBAAiB;AAAA,EAC5C;AAAA;AAAA,EAGA,oBAAoB,SAA0B;AAC1C,WAAO,KAAK,kBAAkB,IAAI,OAAO,OAAO,CAAC;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,SAAiB,OAAsB;AACxD,UAAM,KAAK,OAAO,OAAO;AACzB,UAAM,SAAS,KAAK,kBAAkB,IAAI,EAAE;AAC5C,QAAI,SAAS,CAAC,OAAQ,MAAK,kBAAkB,IAAI,EAAE;AAAA,aAC1C,CAAC,SAAS,OAAQ,MAAK,kBAAkB,OAAO,EAAE;AAAA,QACtD;AAGL,SAAK,QAAQ,WAAW;AAAA,MACpB,iBAAiB,IAAI,IAAI,KAAK,iBAAiB;AAAA,IACnD,CAAC;AACD,SAAK,aAAa;AAAA,EACtB;AAAA;AAAA,EAGA,mBAAmB,SAA0B;AACzC,UAAM,OAAO,CAAC,KAAK,oBAAoB,OAAO;AAC9C,SAAK,qBAAqB,SAAS,IAAI;AACvC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,KAA6B;AAC9C,UAAM,OAAO,IAAI,IAAI,MAAM,KAAK,KAAK,MAAM,CAAC;AAE5C,QACI,KAAK,SAAS,KAAK,kBAAkB,QACrC,MAAM,KAAK,IAAI,EAAE,MAAM,CAAC,OAAO,KAAK,kBAAkB,IAAI,EAAE,CAAC,GAC/D;AACE;AAAA,IACJ;AACA,SAAK,oBAAoB;AACzB,SAAK,QAAQ,WAAW;AAAA,MACpB,iBAAiB,IAAI,IAAI,KAAK,iBAAiB;AAAA,IACnD,CAAC;AACD,SAAK,aAAa;AAAA,EACtB;AAAA,EAEA,iBAAiB;AACb,WAAO,KAAK,QAAQ,eAAe;AAAA,EACvC;AAAA,EAEA,kBAAkB;AACd,WAAO,KAAK,QAAQ,SAAS;AAAA,EACjC;AACJ;;;ACtUA,IAAAE,gBAOO;AAmGI;AAzEX,IAAM,cAAU,6BAA8B,IAAI;AAE3C,SAAS,aAAa;AAAA,EACzB;AAAA,EACA;AACJ,GAGG;AAzCH;AA0CI,QAAM,CAAC,QAAQ,SAAS,QAAI;AAAA,KACxB,wCAAS,WAAT,YAAmB,CAAC;AAAA,EACxB;AACA,QAAM,CAAC,YAAY,aAAa,QAAI;AAAA,KAChC,wCAAS,eAAT,YAAuB,CAAC;AAAA,EAC5B;AACA,QAAM,cAAU,sBAAO,oBAAI,IAAgB,CAAC;AAE5C,QAAM,cAAU,2BAAY,MAAM;AAC9B,eAAW,MAAM,MAAM,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI;AACA,WAAG;AAAA,MACP,QAAQ;AAAA,MAER;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,UAAM;AAAA,IACR,OAAO;AAAA,MACH,KAAK,CAAC,YAAY,OAAO,OAAO;AAAA,MAChC,KAAK,CAAC,SAAS,UAAU;AACrB,kBAAU,CAAC,SAAS;AAChB,cAAI,KAAK,OAAO,MAAM,MAAO,QAAO;AACpC,gBAAM,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM;AACzC,iBAAO;AAAA,QACX,CAAC;AACD,gBAAQ;AAAA,MACZ;AAAA,MAEA,eAAe,CAAC,YAAS;AAxErC,YAAAC;AAwEwC,gBAAAA,MAAA,WAAW,OAAO,MAAlB,OAAAA,MAAuB,CAAC;AAAA;AAAA,MACpD,eAAe,CAAC,SAAS,cAAc;AACnC,sBAAc,CAAC,SAAS;AACpB,gBAAM,OAAO;AAAA,YACT,GAAG;AAAA,YACH,CAAC,OAAO,GAAG,MAAM,KAAK,IAAI,IAAI,SAAS,CAAC;AAAA,UAC5C;AACA,iBAAO;AAAA,QACX,CAAC;AACD,gBAAQ;AAAA,MACZ;AAAA,MACA,iBAAiB,CAAC,SAAS,aAAa;AACpC,sBAAc,CAAC,SAAS;AApFxC,cAAAA;AAqFoB,gBAAM,MAAM,IAAI,KAAIA,MAAA,KAAK,OAAO,MAAZ,OAAAA,MAAiB,CAAC,CAAC;AACvC,cAAI,IAAI,IAAI,QAAQ,EAAG,KAAI,OAAO,QAAQ;AAAA,cACrC,KAAI,IAAI,QAAQ;AACrB,iBAAO,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,KAAK,GAAG,EAAE;AAAA,QACjD,CAAC;AACD,gBAAQ;AAAA,MACZ;AAAA,MAEA,UAAU,OAAO;AAAA,QACb,QAAQ,EAAE,GAAG,OAAO;AAAA,QACpB,YAAY,EAAE,GAAG,WAAW;AAAA,MAChC;AAAA,MAEA,WAAW,CAAC,OAAO;AACf,gBAAQ,QAAQ,IAAI,EAAE;AACtB,eAAO,MAAM,QAAQ,QAAQ,OAAO,EAAE;AAAA,MAC1C;AAAA,IACJ;AAAA,IACA,CAAC,SAAS,YAAY,MAAM;AAAA,EAChC;AAEA,SAAO,4CAAC,QAAQ,UAAR,EAAiB,OAAO,KAAM,UAAS;AACnD;AAGO,SAAS,aAAsB;AAClC,QAAM,UAAM,0BAAW,OAAO;AAC9B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,+CAA+C;AACzE,SAAO;AACX;AAGO,SAAS,qBAAqC;AACjD,aAAO,0BAAW,OAAO;AAC7B;AAIO,SAAS,aAAa,SAG3B;AACE,QAAM,MAAM,WAAW;AACvB,QAAM,QAAQ,IAAI,IAAI,OAAO;AAC7B,QAAM,MAAM,CAAC,MAAyB,IAAI,IAAI,SAAS,CAAC;AACxD,SAAO,EAAE,OAAO,IAAI;AACxB;AAEO,SAAS,kBAAkB,SAIhC;AACE,QAAM,MAAM,WAAW;AACvB,SAAO;AAAA,IACH,UAAU,IAAI,cAAc,OAAO;AAAA,IACnC,KAAK,CAAC,QAAkB,IAAI,cAAc,SAAS,GAAG;AAAA,IACtD,QAAQ,CAAC,QAAgB,IAAI,gBAAgB,SAAS,GAAG;AAAA,EAC7D;AACJ;;;AC3GO,SAAS,sBAAgC;AAC5C,QAAM,QAAuB,oBAAI,IAAI;AAErC,QAAM,MAAM,CAAC,MAAiB,YAAwD;AAxC1F;AAyCQ,UAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAI,CAAC,GAAI,QAAO;AAChB,UAAM,IAAK,4BAAW;AACtB,YAAO,QAAG,IAAI,CAAC,MAAR,YAAa,GAAG,IAAI,SAAS;AAAA,EACxC;AAEA,QAAM,WAAW,CAAC,MAAiB,YAA6B,YAAiC;AAC7F,QAAI,KAAK,MAAM,IAAI,IAAI;AACvB,QAAI,CAAC,IAAI;AACL,WAAK,oBAAI,IAAmC;AAC5C,YAAM,IAAI,MAAM,EAAE;AAAA,IACtB;AACA,OAAG,IAAK,4BAAW,WAA4B,UAAU;AAAA,EAC7D;AAEA,QAAM,aAAa,CAAC,MAAiB,YAAiC;AAClE,UAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAI,CAAC,GAAI;AACT,UAAM,MAAO,4BAAW;AACxB,OAAG,OAAO,GAAG;AACb,QAAI,GAAG,SAAS,EAAG,OAAM,OAAO,IAAI;AAAA,EACxC;AAEA,QAAM,eAAe,CAAC,YAAmG;AACrH,eAAW,KAAK,QAAS,UAAS,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO;AAAA,EACrE;AAEA,SAAO,EAAE,KAAK,UAAU,YAAY,cAAc,QAAQ,MAAM;AACpE;AAGO,SAAS,uBACZ,UACA,MACA,SAC2B;AAC3B,SAAO,SAAS,IAAI,MAAM,OAAO;AACrC;;;AC9EA,IAAAC,gBAA0D;AAoD/C,IAAAC,sBAAA;AAzBX,IAAM,UAAM,6BAAqC,IAAI;AAE9C,SAAS,SAAS;AAAA,EACrB;AAAA,EACA;AACJ,GAIG;AACC,QAAM,eAAW;AAAA,IACb,MAAM,4CAAmB,oBAAoB;AAAA,IAC7C,CAAC,eAAe;AAAA,EACpB;AAEA,QAAM,YAAQ;AAAA,IACV,OAAO;AAAA,MACH;AAAA,MACA,UAAU,SAAS;AAAA,MACnB,YAAY,SAAS;AAAA,MACrB,cAAc,SAAS;AAAA,IAC3B;AAAA,IACA,CAAC,QAAQ;AAAA,EACb;AAEA,SAAO,6CAAC,IAAI,UAAJ,EAAa,OAAe,UAAS;AACjD;AAEO,SAAS,YAA4B;AACxC,QAAM,QAAI,0BAAW,GAAG;AACxB,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,kDAAkD;AAC1E,SAAO;AACX;;;AC3DA,IAAAC,gBAA+B;AAoOpB,IAAAC,sBAAA;AA7MX,SAAS,OAAO,OAAyB;AAvBzC;AAwBI,MAAI,MAAM,SAAS,UAAU;AACzB,UAAM,SAAQ,WAAM,cAAN,YAAmB,IAAI,KAAK;AAC1C,WAAO,UAAU,IAAI;AAAA,EACzB;AACA,SAAO,MAAM;AACjB;AAEA,SAAS,UAAU,OAAwC;AA/B3D;AAgCI,QAAM,KAAK,WAAc,SAAd,mBAAoB;AAC/B,SAAO,OAAO,MAAM,YAAY,EAAE,KAAK,IAAK,IAAqB;AACrE;AAEO,SAAS,QAAQ;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACJ,GAAsB;AAxCtB;AAyCI,QAAM,EAAE,SAAS,IAAI,UAAU;AAC/B,QAAM,OAAO,mBAAmB;AAEhC,QAAM,OAAO,OAAO,KAAK;AACzB,QAAM,UAAU,UAAU,KAAK;AAE/B,QAAM,iBAA0C;AAAA,IAC5C,MAAM,uBAAuB,UAAU,MAAM,OAAO;AAAA,IACpD,CAAC,MAAM,UAAU,OAAO;AAAA,EAC5B;AAEA,MAAI,CAAC,YAAY;AAEb,YAAQ,KAAK,oCAAoC;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACX;AAEA,QAAM,EAAE,WAAW,SAAS,aAAa,IAAI;AAC7C,QAAM,aAAY,wCAAS,cAAT,YAAsB;AACxC,QAAM,cAAa,wCAAS,eAAT,YAAuB;AAG1C,QAAM,gBACF,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,SAAS;AAC3D,QAAM,QAAQ,CAAC,EAAE,iBAAiB,aAAa,KAAK;AACpD,QAAM,WAAW,MAAM,WAAW,QAAQ;AAG1C,QAAM,iBAAa,uBAAQ,MAAM;AAzErC,QAAAC;AA0EQ,QAAI,CAAC,cAAe,QAAO,oBAAI,IAAyB;AACxD,WAAO,IAAI,MAAKA,MAAA,MAAM,YAAN,OAAAA,MAAiB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,EAC9D,GAAG,CAAC,eAAe,MAAM,OAAO,CAAC;AAEjC,QAAM,SAAS,CAAC,OAAiC;AA9ErD,QAAAA,KAAAC,KAAAC;AAgFQ,QAAI,eAAe;AACf,YAAM,MAAM,WAAW,IAAI,GAAG,EAAE;AAChC,UAAI,KAAK;AACL,cAAMC,SAAQH,MAAA,IAAI,iBAAJ,OAAAA,MAAoB;AAClC,cAAMI,OAAO,IAAY;AACzB,cAAMC,SAAQJ,MAAA,IAAI,SAAJ,OAAAA,MAAY,MAAM;AAOhC,eAAO;AAAA,UACH,GAAG;AAAA,UACH,cAAcE;AAAA,UACd,YAAYA,UAAS,YAAY,SAAYC;AAAA,UAC7C,GAAIC,QAAO,EAAE,MAAAA,MAAK,IAAI,CAAC;AAAA,QAC3B;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAGA,UAAM,QAAQH,MAAA,MAAM,iBAAN,OAAAA,MAAsB;AACpC,UAAM,MAAO,MAAc;AAC3B,UAAM,OAAO,MAAM;AAInB,WAAO;AAAA,MACH,GAAG;AAAA,MACH,cAAc;AAAA,MACd,YAAY,SAAS,YAAY,SAAY;AAAA,MAC7C,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IAC3B;AAAA,EACJ;AAEA,WAAS,wBAAwB,OAA+B;AAC5D,UAAM,YAAY,CAAC,MAAmC;AAClD,UAAI,KAAK,OAAO,MAAM,YAAY,QAAS,GAAW;AAClD,cAAM,KAAK,OAAQ,EAAU,EAAE;AAC/B,cAAM,WAAY,EAAU;AAC5B,cAAM,QACF,OAAO,aAAa,YAAY,OAAO,aAAa,WAC7C,WACD;AACV,eAAO,OAAO,EAAE,IAAI,MAAM,CAAC;AAAA,MAC/B;AAEA,UAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAChD,eAAO,OAAO,EAAE,IAAI,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,MAC7C;AACA,aAAO;AAAA,IACX;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,YAAM,MAAqB,CAAC;AAC5B,iBAAW,KAAK,OAAO;AACnB,cAAMI,OAAM,UAAU,CAAC;AACvB,YAAIA,KAAK,KAAI,KAAKA,IAAG;AAAA,MACzB;AACA,aAAO;AAAA,IACX;AACA,UAAM,MAAM,UAAU,KAAK;AAC3B,WAAO,MAAM,CAAC,GAAG,IAAI,CAAC;AAAA,EAC1B;AAGA,MAAI,UAAyC;AAC7C,MAAI,WAA+C;AAEnD,MAAI,MAAM;AACN,QAAI,UAAU;AACV,UAAI,eAAe;AAEf,cAAM,SAAS,KAAK,cAAc,MAAM,EAAE;AAC1C,kBAAU,QAAQ,UAAU,YAAO,CAAC,MAAR,YAAa;AAEzC,mBAAW,CAAC,SAAkB;AA/J9C,cAAAN;AAgKoB,gBAAM,cAAa,mCAAS,YACtB,QAAQ,SAAS,MAAM,OAAO,IAC9B;AACN,gBAAM,MAAM,wBAAwB,UAAU;AAC9C,gBAAM,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AAG/B,eAAK,cAAc,MAAM,IAAI,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAGrD,gBAAM,SAAS,QAAQ,OAAOA,MAAA,IAAI,CAAC,MAAL,OAAAA,MAAU;AACxC,eAAK,IAAI,MAAM,IAAI,MAAM;AAAA,QAC7B;AAAA,MACJ,OAAO;AAGH,cAAM,MAAM,KAAK,IAAI,MAAM,EAAE;AAC7B,kBAAU;AAEV,mBAAW,CAAC,SAAkB;AAC1B,gBAAM,cAAa,mCAAS,YACtB,QAAQ,SAAS,MAAM,OAAO,IAC9B;AACN,gBAAM,MAAM,wBAAwB,UAAU;AAC9C,gBAAM,QAAQ,IAAI,CAAC;AAGnB,gBAAM,SACF,UACC,OAAO,MAAM,UAAU,WAClB,MAAM,UAAU,IAChB,OAAO,MAAM,KAAK,EAAE,SAAS;AAEvC,cAAI,QAAQ;AACR,iBAAK,cAAc,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;AACvC,iBAAK,IAAI,MAAM,IAAI,MAAM,KAAe;AAAA,UAC5C,OAAO;AACH,iBAAK,cAAc,MAAM,IAAI,CAAC,CAAC;AAC/B,iBAAK,IAAI,MAAM,IAAI,IAAyB;AAAA,UAChD;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,OAAO;AAEH,gBAAU,KAAK,IAAI,MAAM,EAAE;AAC3B,iBAAW,CAAC,SAAkB;AAC1B,cAAM,cAAa,mCAAS,YACtB,QAAQ,SAAS,MAAM,OAAO,IAC7B;AACP,aAAK,IAAI,MAAM,IAAI,UAA+B;AAAA,MACtD;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,YAAqC;AAAA,IACvC,IAAI,MAAM;AAAA,IACV;AAAA,IACA,UAAU,CAAC,CAAC;AAAA,IACZ,GAAI,sCAAgB,CAAC;AAAA,IACrB,GAAI,kCAAc,CAAC;AAAA,IACnB,GAAI,gBAAgB,EAAE,SAAS,MAAM,QAAyB,IAAI,CAAC;AAAA,EACvE;AAEA,MAAI,MAAM;AACN,cAAU,SAAS,IAAI;AACvB,cAAU,UAAU,IAAI;AAAA,EAC5B;AAEA,SAAO,6CAAC,aAAW,GAAG,WAAW;AACrC;","names":["_a","_b","import_lodash_es","_a","_b","_c","_d","_e","_f","_g","f","p","isTagId","isOptionId","_a","import_react","_a","import_react","import_jsx_runtime","import_react","import_jsx_runtime","_a","_b","_c","role","sid","meta","one"]}
|