@guidekit/core 0.1.0-beta.1 → 0.1.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.cjs +1639 -582
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +571 -30
- package/dist/index.d.ts +571 -30
- package/dist/index.js +1637 -583
- package/dist/index.js.map +1 -1
- package/package.json +37 -14
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bus/index.ts","../src/resources/index.ts","../src/dom/index.ts","../src/context/index.ts","../src/errors/index.ts","../src/llm/openai-adapter.ts","../src/llm/index.ts","../src/llm/tool-executor.ts","../src/connectivity/index.ts","../src/navigation/index.ts","../src/voice/websocket-manager.ts","../src/voice/deepgram-stt.ts","../src/voice/elevenlabs-tts.ts","../src/voice/index.ts","../src/visual/index.ts","../src/awareness/index.ts","../src/awareness/proactive.ts","../src/llm/rate-limiter.ts","../src/i18n/index.ts","../src/auth/token-manager.ts","../src/core.ts"],"names":["LOG_PREFIX","manager","withTimeout","truncate","DEFAULT_TIMEOUT_MS","MAX_QUEUE_SIZE","lastIdx"],"mappings":"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","file":"index.cjs","sourcesContent":["// ---------------------------------------------------------------------------\n// GuideKit SDK - Typed EventBus\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical map of every event in the GuideKit system.\n *\n * Keys use a `namespace:name` convention (except the top-level `error` event).\n * Values are the payload types that accompany each event.\n */\nexport interface EventMap {\n // -- DOM events -----------------------------------------------------------\n 'dom:scan-complete': { pageModel: unknown; durationMs: number };\n 'dom:mutation-detected': { mutations: number; debounced: boolean };\n 'dom:route-change': { from: string; to: string };\n\n // -- LLM events -----------------------------------------------------------\n 'llm:response-start': { conversationId: string };\n 'llm:response-chunk': { text: string; done: boolean };\n 'llm:response-end': { conversationId: string; totalTokens: number };\n 'llm:tool-call': { name: string; arguments: Record<string, unknown> };\n 'llm:token-usage': { prompt: number; completion: number; total: number };\n\n // -- Voice events ---------------------------------------------------------\n 'voice:state-change': { from: string; to: string };\n 'voice:transcript': { text: string; isFinal: boolean; confidence: number };\n 'voice:tts-start': { utterance: string };\n 'voice:tts-end': { utterance: string; durationMs: number };\n 'voice:degraded': { reason: string; fallback: 'text' };\n\n // -- Auth events ----------------------------------------------------------\n 'auth:token-refreshed': { expiresAt: number };\n 'auth:token-refresh-failed': { error: Error; attemptsRemaining: number };\n 'auth:token-expired': Record<string, never>;\n\n // -- Connectivity events --------------------------------------------------\n 'connectivity:state-change': {\n state: 'online' | 'degraded' | 'offline';\n previous: 'online' | 'degraded' | 'offline';\n };\n\n // -- Awareness events -----------------------------------------------------\n 'awareness:dwell': { sectionId: string; durationMs: number };\n 'awareness:idle': { durationMs: number };\n 'awareness:rage-click': { selector: string; clicks: number };\n 'awareness:section-visible': { sectionId: string; ratio: number };\n\n // -- Visual events --------------------------------------------------------\n 'visual:spotlight-shown': { selector: string; sectionId?: string };\n 'visual:spotlight-dismissed': Record<string, never>;\n 'visual:tour-step': {\n stepIndex: number;\n totalSteps: number;\n sectionId: string;\n };\n\n // -- Top-level error event ------------------------------------------------\n error: Error;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helper types\n// ---------------------------------------------------------------------------\n\n/** Handler for a concrete, known event key. */\ntype TypedHandler<K extends keyof EventMap> = (data: EventMap[K]) => void;\n\n/** Handler for a wildcard (namespace) subscription. */\ntype WildcardHandler = (data: unknown, eventName: string) => void;\n\n/** Discriminated wrapper so we can store both kinds in one map. */\ntype StoredHandler =\n | { kind: 'typed'; fn: TypedHandler<any> }\n | { kind: 'wildcard'; fn: WildcardHandler };\n\n// ---------------------------------------------------------------------------\n// EventBus\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Bus]';\n\nexport class EventBus {\n /** Per-event listeners. Wildcard keys end with `:*`. */\n private readonly listeners = new Map<string, StoredHandler[]>();\n\n /** Listeners registered via `onAny`. */\n private readonly anyListeners: WildcardHandler[] = [];\n\n /** When true, every `emit` is logged to the console. */\n private readonly debug: boolean;\n\n constructor(options?: { debug?: boolean }) {\n this.debug = options?.debug ?? false;\n }\n\n // ---- on (specific event) ------------------------------------------------\n\n /**\n * Subscribe to a specific typed event.\n *\n * @returns An unsubscribe function.\n */\n on<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void,\n ): () => void;\n\n /**\n * Subscribe to a namespace wildcard (e.g. `'dom:*'`).\n * The handler receives `(data, eventName)`.\n *\n * @returns An unsubscribe function.\n */\n on(\n event: `${string}:*`,\n handler: (data: unknown, eventName: string) => void,\n ): () => void;\n\n /** Unified implementation. */\n on(event: string, handler: (...args: any[]) => void): () => void {\n const isWildcard = event.endsWith(':*');\n const stored: StoredHandler = isWildcard\n ? { kind: 'wildcard', fn: handler as WildcardHandler }\n : { kind: 'typed', fn: handler as TypedHandler<any> };\n\n let list = this.listeners.get(event);\n if (!list) {\n list = [];\n this.listeners.set(event, list);\n }\n list.push(stored);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const arr = this.listeners.get(event);\n if (!arr) return;\n const idx = arr.indexOf(stored);\n if (idx !== -1) arr.splice(idx, 1);\n if (arr.length === 0) this.listeners.delete(event);\n };\n }\n\n // ---- onAny --------------------------------------------------------------\n\n /**\n * Subscribe to **every** event emitted on the bus.\n *\n * @returns An unsubscribe function.\n */\n onAny(handler: (data: unknown, eventName: string) => void): () => void {\n this.anyListeners.push(handler);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const idx = this.anyListeners.indexOf(handler);\n if (idx !== -1) this.anyListeners.splice(idx, 1);\n };\n }\n\n // ---- emit ---------------------------------------------------------------\n\n /**\n * Emit a typed event.\n *\n * Handlers are invoked synchronously in registration order. If a handler\n * throws, the error is logged and remaining handlers still execute.\n */\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n if (this.debug) {\n console.log(LOG_PREFIX, event, data);\n }\n\n const eventKey = event as string;\n\n // 1. Exact-match listeners\n const exact = this.listeners.get(eventKey);\n if (exact) {\n // Snapshot to avoid issues if a handler adds/removes listeners\n const snapshot = exact.slice();\n for (const entry of snapshot) {\n this.invokeSafe(entry.fn, data, eventKey);\n }\n }\n\n // 2. Namespace wildcard listeners (e.g. \"dom:*\" matches \"dom:scan-complete\")\n const colonIdx = eventKey.indexOf(':');\n if (colonIdx !== -1) {\n const ns = eventKey.slice(0, colonIdx);\n const wildcardKey = `${ns}:*`;\n const wildcardList = this.listeners.get(wildcardKey);\n if (wildcardList) {\n const snapshot = wildcardList.slice();\n for (const entry of snapshot) {\n this.invokeSafe(entry.fn, data, eventKey);\n }\n }\n }\n\n // 3. `onAny` listeners\n if (this.anyListeners.length > 0) {\n const snapshot = this.anyListeners.slice();\n for (const fn of snapshot) {\n this.invokeSafe(fn, data, eventKey);\n }\n }\n }\n\n // ---- once ---------------------------------------------------------------\n\n /**\n * Subscribe to a specific event, automatically unsubscribing after the\n * first invocation.\n *\n * @returns An unsubscribe function (also cancels a not-yet-fired listener).\n */\n once<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void,\n ): () => void {\n const unsub = this.on(event, ((data: EventMap[K]) => {\n unsub();\n handler(data);\n }) as any);\n return unsub;\n }\n\n // ---- removeAll ----------------------------------------------------------\n\n /** Remove **all** listeners from the bus. */\n removeAll(): void {\n this.listeners.clear();\n this.anyListeners.length = 0;\n }\n\n // ---- listenerCount ------------------------------------------------------\n\n /**\n * Return the number of registered listeners.\n *\n * - If `event` is provided, returns the count for that specific event key\n * (including wildcard keys like `'dom:*'`).\n * - If omitted, returns the total across all events plus `onAny` listeners.\n */\n listenerCount(event?: string): number {\n if (event !== undefined) {\n return this.listeners.get(event)?.length ?? 0;\n }\n\n let total = this.anyListeners.length;\n for (const list of this.listeners.values()) {\n total += list.length;\n }\n return total;\n }\n\n // ---- private helpers ----------------------------------------------------\n\n /**\n * Invoke a handler inside a try/catch so one misbehaving handler never\n * prevents the remaining handlers from executing.\n */\n private invokeSafe(fn: (...args: any[]) => void, ...args: any[]): void {\n try {\n fn(...args);\n } catch (err) {\n console.error(\n LOG_PREFIX,\n 'Handler threw an error:',\n err,\n );\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new {@link EventBus} instance.\n *\n * ```ts\n * const bus = createEventBus({ debug: true });\n * const unsub = bus.on('dom:scan-complete', (data) => {\n * console.log(data.pageModel, data.durationMs);\n * });\n * bus.emit('dom:scan-complete', { pageModel: {}, durationMs: 42 });\n * unsub();\n * ```\n */\nexport function createEventBus(options?: { debug?: boolean }): EventBus {\n return new EventBus(options);\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Resource Lifecycle Manager\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Resources]';\n\n/** Timeout in milliseconds for each resource cleanup operation. */\nconst CLEANUP_TIMEOUT_MS = 2_000;\n\n// ---------------------------------------------------------------------------\n// Resource interface\n// ---------------------------------------------------------------------------\n\n/**\n * A disposable resource that the SDK tracks for deterministic cleanup.\n * Each resource has a unique name and a cleanup function that may be async.\n */\nexport interface Resource {\n name: string;\n cleanup: () => void | Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// ResourceManager\n// ---------------------------------------------------------------------------\n\n/** Lifecycle states for a ResourceManager instance. */\nexport type ResourceManagerState =\n | 'initializing'\n | 'ready'\n | 'tearing_down'\n | 'torn_down';\n\n/**\n * Manages the lifecycle of SDK resources (AbortControllers, event listeners,\n * WebSocket connections, etc.) and ensures deterministic cleanup on unmount.\n *\n * Resources are cleaned up sequentially — order matters because later\n * resources may depend on earlier ones still being alive during their own\n * cleanup phase.\n */\nexport class ResourceManager {\n readonly instanceId: string;\n\n private _state: ResourceManagerState = 'initializing';\n private readonly _resources: Map<string, Resource> = new Map();\n private _destroyPromise: Promise<void> | null = null;\n private _destroyCancelled = false;\n\n constructor(instanceId?: string) {\n this.instanceId = instanceId ?? generateId();\n debug(`Created ResourceManager \"${this.instanceId}\"`);\n }\n\n // -------------------------------------------------------------------------\n // State\n // -------------------------------------------------------------------------\n\n /** Current lifecycle state. */\n get state(): ResourceManagerState {\n return this._state;\n }\n\n /** Number of currently registered resources. */\n get resourceCount(): number {\n return this._resources.size;\n }\n\n // -------------------------------------------------------------------------\n // Registration\n // -------------------------------------------------------------------------\n\n /**\n * Register a resource for cleanup tracking.\n *\n * @throws If the manager has already been torn down.\n */\n register(resource: Resource): void {\n if (this._state === 'torn_down') {\n throw new Error(\n `${LOG_PREFIX} Cannot register resource \"${resource.name}\" — manager is torn down`,\n );\n }\n\n if (this._resources.has(resource.name)) {\n debug(\n `Replacing existing resource \"${resource.name}\" in \"${this.instanceId}\"`,\n );\n }\n\n this._resources.set(resource.name, resource);\n debug(\n `Registered \"${resource.name}\" in \"${this.instanceId}\" (total: ${this._resources.size})`,\n );\n }\n\n /**\n * Unregister a specific resource by name without invoking its cleanup.\n */\n unregister(name: string): void {\n const deleted = this._resources.delete(name);\n if (deleted) {\n debug(\n `Unregistered \"${name}\" from \"${this.instanceId}\" (total: ${this._resources.size})`,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // AbortController helper\n // -------------------------------------------------------------------------\n\n /**\n * Create a tracked AbortController. On destroy, its `abort()` method will\n * be called automatically.\n */\n createAbortController(name: string): AbortController {\n const controller = new AbortController();\n\n this.register({\n name,\n cleanup: () => {\n if (!controller.signal.aborted) {\n controller.abort();\n }\n },\n });\n\n return controller;\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle transitions\n // -------------------------------------------------------------------------\n\n /** Transition from `initializing` to `ready`. */\n markReady(): void {\n if (this._state === 'initializing') {\n this._state = 'ready';\n debug(`\"${this.instanceId}\" is now ready`);\n }\n }\n\n /**\n * Destroy all registered resources sequentially.\n *\n * Each resource gets up to {@link CLEANUP_TIMEOUT_MS}ms to complete.\n * If cleanup exceeds the timeout a warning is logged and the manager\n * proceeds to the next resource.\n *\n * After all resources are processed the state transitions to `torn_down`.\n * Calling `destroy()` multiple times returns the same promise.\n */\n async destroy(): Promise<void> {\n // Idempotent — return existing promise if already running / finished.\n if (this._destroyPromise) {\n return this._destroyPromise;\n }\n\n this._state = 'tearing_down';\n this._destroyCancelled = false;\n\n debug(\n `Destroying \"${this.instanceId}\" (${this._resources.size} resource(s))`,\n );\n\n this._destroyPromise = this._performDestroy();\n return this._destroyPromise;\n }\n\n /**\n * Cancel a pending destroy, transitioning back to `ready`.\n *\n * This exists to support React 18 StrictMode which unmounts then\n * immediately re-mounts components. If the re-mount arrives while\n * teardown is still in progress, cancelling prevents resource loss.\n *\n * @returns `true` if teardown was pending and has been cancelled.\n * `false` if already torn down or not currently tearing down.\n */\n cancelDestroy(): boolean {\n if (this._state !== 'tearing_down') {\n return false;\n }\n\n debug(`Cancelling destroy for \"${this.instanceId}\"`);\n this._destroyCancelled = true;\n this._state = 'ready';\n this._destroyPromise = null;\n return true;\n }\n\n // -------------------------------------------------------------------------\n // Internal\n // -------------------------------------------------------------------------\n\n /** Sequential cleanup with per-resource timeout. */\n private async _performDestroy(): Promise<void> {\n // Snapshot the resource names so we iterate a stable list.\n const names = Array.from(this._resources.keys());\n\n for (const name of names) {\n // If cancelDestroy() was called mid-teardown, bail out early.\n if (this._destroyCancelled) {\n debug(\n `Destroy cancelled mid-teardown for \"${this.instanceId}\" — stopping cleanup`,\n );\n return;\n }\n\n const resource = this._resources.get(name);\n if (!resource) {\n continue;\n }\n\n try {\n await withTimeout(resource.cleanup(), CLEANUP_TIMEOUT_MS, () => {\n console.warn(\n `${LOG_PREFIX} Cleanup timeout for \"${name}\" (${CLEANUP_TIMEOUT_MS}ms)`,\n );\n });\n } catch (err) {\n console.warn(\n `${LOG_PREFIX} Cleanup error for \"${name}\":`,\n err,\n );\n }\n\n this._resources.delete(name);\n }\n\n // Only transition to torn_down if we were not cancelled.\n if (!this._destroyCancelled) {\n this._state = 'torn_down';\n debug(`\"${this.instanceId}\" is now torn down`);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// SingletonGuard – ref-counted singleton map\n// ---------------------------------------------------------------------------\n\ninterface GuardEntry {\n manager: ResourceManager;\n refCount: number;\n pendingDestroyTimer: ReturnType<typeof setTimeout> | null;\n}\n\n/**\n * Ref-counted singleton guard keyed by `instanceId`.\n *\n * - `acquire()` increments the ref count (or creates the manager).\n * - `release()` decrements the ref count. When it reaches 0 a\n * `setTimeout(0)` is scheduled to allow React StrictMode re-mount to\n * reclaim the instance before it is destroyed.\n * - If a mount arrives during `TEARING_DOWN`, the teardown is cancelled\n * and the manager transitions back to `READY`.\n */\nexport class SingletonGuard {\n private static readonly _entries: Map<string, GuardEntry> = new Map();\n\n /**\n * Acquire (or create) a ResourceManager for the given instanceId.\n *\n * @param instanceId Unique identifier for the singleton slot.\n * @param factory Called to create a fresh ResourceManager when none\n * exists or the previous one has been torn down.\n */\n static acquire(\n instanceId: string,\n factory: () => ResourceManager,\n ): ResourceManager {\n const existing = SingletonGuard._entries.get(instanceId);\n\n if (existing) {\n // Cancel any pending deferred destruction.\n if (existing.pendingDestroyTimer !== null) {\n clearTimeout(existing.pendingDestroyTimer);\n existing.pendingDestroyTimer = null;\n debug(`Cleared pending destroy timer for \"${instanceId}\"`);\n }\n\n // If the manager is mid-teardown, cancel it.\n if (existing.manager.state === 'tearing_down') {\n const cancelled = existing.manager.cancelDestroy();\n if (cancelled) {\n debug(\n `Re-acquired \"${instanceId}\" — cancelled in-flight teardown`,\n );\n }\n }\n\n // If the previous manager was fully torn down, replace it.\n if (existing.manager.state === 'torn_down') {\n debug(\n `Previous manager for \"${instanceId}\" is torn down — creating new one`,\n );\n const manager = factory();\n SingletonGuard._entries.set(instanceId, {\n manager,\n refCount: 1,\n pendingDestroyTimer: null,\n });\n return manager;\n }\n\n existing.refCount += 1;\n debug(\n `Acquired \"${instanceId}\" (refCount: ${existing.refCount})`,\n );\n return existing.manager;\n }\n\n // First acquisition — create a new entry.\n const manager = factory();\n SingletonGuard._entries.set(instanceId, {\n manager,\n refCount: 1,\n pendingDestroyTimer: null,\n });\n debug(`Created new singleton for \"${instanceId}\"`);\n return manager;\n }\n\n /**\n * Release a reference to the manager. When the ref count drops to 0 a\n * `setTimeout(0)` delay is introduced before destruction so that React\n * StrictMode's synchronous re-mount can reclaim the instance.\n */\n static release(instanceId: string): void {\n const entry = SingletonGuard._entries.get(instanceId);\n if (!entry) {\n debug(`Release called for unknown instanceId \"${instanceId}\"`);\n return;\n }\n\n entry.refCount = Math.max(0, entry.refCount - 1);\n debug(`Released \"${instanceId}\" (refCount: ${entry.refCount})`);\n\n if (entry.refCount === 0) {\n // Defer destruction so StrictMode re-mount can reclaim.\n entry.pendingDestroyTimer = setTimeout(() => {\n entry.pendingDestroyTimer = null;\n\n // Double-check nobody re-acquired in the meantime.\n if (entry.refCount > 0) {\n return;\n }\n\n debug(`Destroying singleton \"${instanceId}\" (refCount is 0)`);\n entry.manager.destroy().then(() => {\n // Only remove from the map if it is still the same entry and\n // the manager successfully tore down.\n if (\n SingletonGuard._entries.get(instanceId) === entry &&\n entry.manager.state === 'torn_down'\n ) {\n SingletonGuard._entries.delete(instanceId);\n debug(`Removed singleton entry for \"${instanceId}\"`);\n }\n });\n }, 0);\n }\n }\n\n /**\n * Retrieve a manager by instanceId without affecting the ref count.\n * Returns `undefined` if no manager exists for the given id.\n */\n static get(instanceId: string): ResourceManager | undefined {\n return SingletonGuard._entries.get(instanceId)?.manager;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Race a (possibly async) operation against a timeout.\n * If the timeout wins, `onTimeout` is called and the function resolves\n * (it does **not** reject — the next resource should still be processed).\n */\nfunction withTimeout(\n work: void | Promise<void>,\n ms: number,\n onTimeout: () => void,\n): Promise<void> {\n // Synchronous cleanup — no timeout needed.\n if (!(work instanceof Promise)) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n onTimeout();\n resolve();\n }\n }, ms);\n\n work.then(\n () => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n resolve();\n }\n },\n (err) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n // Re-throw so the caller's catch block can log it.\n // We wrap in a rejected promise to keep the signature clean.\n resolve(Promise.reject(err));\n }\n },\n );\n });\n}\n\n/** Simple random ID generator (no crypto dependency required). */\nfunction generateId(): string {\n return `gk_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Conditional debug logging — only logs when globalThis has a truthy `__GUIDEKIT_DEBUG__` flag. */\nfunction debug(...args: unknown[]): void {\n if (\n typeof globalThis !== 'undefined' &&\n (globalThis as Record<string, unknown>).__GUIDEKIT_DEBUG__\n ) {\n console.debug(LOG_PREFIX, ...args);\n }\n}\n","/**\n * @module @guidekit/core/dom\n *\n * DOM intelligence engine for the GuideKit SDK.\n * Scans the current page and builds a structured PageModel that serves as\n * grounding context for the LLM on every turn.\n *\n * Key design decisions:\n * - SSR-safe: every browser API is guarded behind `typeof document/window`.\n * - Privacy-first: password fields and PII patterns are never captured.\n * - Budget-constrained: hard limits on node count and tree depth prevent\n * runaway scans on large pages.\n * - Mutation-resilient: MutationObserver is throttled and circuit-broken.\n */\n\nimport type {\n PageModel,\n PageSection,\n NavItem,\n InteractiveElement,\n FormSummary,\n FormField,\n OverlayElement,\n ScanMetadata,\n} from '../types/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_NODES = 5000;\nconst DEFAULT_MAX_SECTIONS = 20;\nconst DEFAULT_MAX_DEPTH = 15;\n\nconst MUTATION_DEBOUNCE_MS = 500;\nconst MUTATION_CIRCUIT_BREAKER_THRESHOLD = 100; // mutations per second\nconst CIRCUIT_BREAKER_COOLDOWN_MS = 2000;\nconst MIN_RESCAN_INTERVAL_MS = 2000;\n\nconst LOG_PREFIX = '[GuideKit:DOM]';\n\n/** Semantic tags that qualify as sections without additional attributes. */\nconst SECTION_TAGS = new Set([\n 'SECTION',\n 'ARTICLE',\n 'MAIN',\n 'ASIDE',\n 'HEADER',\n 'FOOTER',\n 'NAV',\n]);\n\n/** Tags that map to landmark roles for scoring. */\nconst LANDMARK_TAG_MAP: Record<string, string> = {\n HEADER: 'banner',\n FOOTER: 'contentinfo',\n NAV: 'navigation',\n MAIN: 'main',\n ASIDE: 'complementary',\n};\n\n/** Interactive element selectors. */\nconst INTERACTIVE_SELECTOR =\n 'button, a[href], input, select, textarea, [role=\"button\"], [role=\"link\"], [tabindex]';\n\n/** Tags whose text value must never be captured. */\nconst SENSITIVE_INPUT_TYPES = new Set(['password', 'tel', 'email']);\n\n/** PII regex patterns stripped from text content. */\nconst PII_PATTERNS: RegExp[] = [\n // Email addresses\n /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n // US phone numbers (various formats)\n /(\\+?1[-.\\s]?)?(\\(?\\d{3}\\)?[-.\\s]?)?\\d{3}[-.\\s]?\\d{4}/g,\n // SSN\n /\\b\\d{3}[-]?\\d{2}[-]?\\d{4}\\b/g,\n // Credit card numbers (basic)\n /\\b(?:\\d[ -]*?){13,19}\\b/g,\n];\n\n// ---------------------------------------------------------------------------\n// Utility helpers\n// ---------------------------------------------------------------------------\n\n/** Simple string hash (djb2). */\nfunction djb2Hash(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return (hash >>> 0).toString(36);\n}\n\n/** Strip PII from a string. */\nfunction stripPII(text: string): string {\n let result = text;\n for (const pattern of PII_PATTERNS) {\n // Reset lastIndex for global regexps that are reused\n pattern.lastIndex = 0;\n result = result.replace(pattern, '[REDACTED]');\n }\n return result;\n}\n\n/** Truncate a string to a max length, adding ellipsis if needed. */\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max).trimEnd() + '\\u2026';\n}\n\n/** Collapse whitespace in a string. */\nfunction collapseWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/** Get visible text content from an element, limited in length. */\nfunction getTextContent(el: Element, maxLen: number = 200): string {\n const raw = el.textContent ?? '';\n return stripPII(truncate(collapseWhitespace(raw), maxLen));\n}\n\n/** Check whether an element is visible in the layout sense (not IntersectionObserver). */\nfunction isElementVisible(el: Element): boolean {\n if (typeof window === 'undefined') return false;\n const style = window.getComputedStyle(el);\n return (\n style.display !== 'none' &&\n style.visibility !== 'hidden' &&\n style.opacity !== '0'\n );\n}\n\n/** Get an accessible label for an element. */\nfunction getAccessibleLabel(el: Element): string {\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n const ariaLabelledBy = el.getAttribute('aria-labelledby');\n if (ariaLabelledBy && typeof document !== 'undefined') {\n const labelEl = document.getElementById(ariaLabelledBy);\n if (labelEl) return collapseWhitespace(labelEl.textContent ?? '');\n }\n\n return '';\n}\n\n/** Request idle callback with fallback. */\nfunction scheduleIdle(cb: () => void): void {\n if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {\n (window as unknown as { requestIdleCallback: (cb: () => void) => void }).requestIdleCallback(cb);\n } else if (typeof setTimeout !== 'undefined') {\n setTimeout(cb, 0);\n } else {\n cb();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Selector builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a stable CSS selector for an element following the priority hierarchy:\n * 1. data-guidekit-target\n * 2. id\n * 3. data-testid\n * 4. aria-label\n * 5. Structural path fallback\n */\nfunction buildSelector(el: Element): string {\n // 1. GuideKit target (highest priority)\n const guideKitTarget = el.getAttribute('data-guidekit-target');\n if (guideKitTarget) {\n return `[data-guidekit-target=\"${guideKitTarget}\"]`;\n }\n\n // 2. ID\n const id = el.id;\n if (id && typeof document !== 'undefined') {\n // Verify uniqueness\n try {\n const matches = document.querySelectorAll(`#${CSS.escape(id)}`);\n if (matches.length === 1) {\n return `#${CSS.escape(id)}`;\n }\n } catch {\n // CSS.escape may not be available; fall through\n }\n }\n\n // 3. data-testid\n const testId = el.getAttribute('data-testid');\n if (testId) {\n return `[data-testid=\"${testId}\"]`;\n }\n\n // 4. aria-label\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) {\n return `[aria-label=\"${ariaLabel}\"]`;\n }\n\n // 5. Structural path fallback\n return buildStructuralPath(el);\n}\n\n/** Build a structural CSS selector path from root to the element. */\nfunction buildStructuralPath(el: Element): string {\n const parts: string[] = [];\n let current: Element | null = el;\n\n while (current && current !== document.documentElement) {\n const tag = current.tagName.toLowerCase();\n\n if (tag === 'body' || tag === 'html') {\n parts.unshift(tag);\n current = current.parentElement;\n continue;\n }\n\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (c) => c.tagName === current!.tagName,\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n parts.unshift(`${tag}:nth-child(${index})`);\n } else {\n parts.unshift(tag);\n }\n } else {\n parts.unshift(tag);\n }\n\n current = parent;\n }\n\n return parts.join(' > ');\n}\n\n// ---------------------------------------------------------------------------\n// Section ID generation\n// ---------------------------------------------------------------------------\n\nlet sectionCounter = 0;\n\nfunction generateSectionId(el: Element): string {\n const guideKitTarget = el.getAttribute('data-guidekit-target');\n if (guideKitTarget) return guideKitTarget;\n\n const id = el.id;\n if (id) return id;\n\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) {\n return ariaLabel\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n }\n\n sectionCounter += 1;\n return `section-${sectionCounter}`;\n}\n\n// ---------------------------------------------------------------------------\n// DOMScanner\n// ---------------------------------------------------------------------------\n\nexport interface DOMScannerOptions {\n rootElement?: HTMLElement;\n debug?: boolean;\n maxNodes?: number;\n maxSections?: number;\n maxDepth?: number;\n}\n\nexport class DOMScanner {\n private readonly root: HTMLElement | null;\n private readonly debug: boolean;\n private readonly maxNodes: number;\n private readonly maxSections: number;\n private readonly maxDepth: number;\n\n private cachedModel: PageModel | null = null;\n\n // Visibility tracking (updated via IntersectionObserver)\n private visibilityMap: Map<Element, number> = new Map();\n\n // MutationObserver state\n private observer: MutationObserver | null = null;\n private mutationCount = 0;\n private mutationWindowStart = 0;\n private circuitBroken = false;\n private circuitBrokenTimer: ReturnType<typeof setTimeout> | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private lastScanTime = 0;\n\n constructor(options?: DOMScannerOptions) {\n const isBrowser =\n typeof document !== 'undefined' && typeof window !== 'undefined';\n\n this.root = options?.rootElement ?? (isBrowser ? document.body : null);\n this.debug = options?.debug ?? false;\n this.maxNodes = options?.maxNodes ?? DEFAULT_MAX_NODES;\n this.maxSections = options?.maxSections ?? DEFAULT_MAX_SECTIONS;\n this.maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH;\n\n this.log('Initialised', {\n root: this.root?.tagName,\n maxNodes: this.maxNodes,\n maxSections: this.maxSections,\n maxDepth: this.maxDepth,\n });\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /** Perform a full scan and return a PageModel. */\n scan(): PageModel {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n this.log('SSR environment detected, returning empty model');\n return this.emptyModel();\n }\n\n if (!this.root) {\n this.log('No root element available, returning empty model');\n return this.emptyModel();\n }\n\n this.log('Starting scan');\n const startTime = performance.now();\n\n // Reset section counter per scan\n sectionCounter = 0;\n\n let nodesScanned = 0;\n let budgetExhausted = false;\n\n // Phase 1: Walk DOM and collect candidate section elements\n const candidateSections: Array<{ el: Element; depth: number }> = [];\n const allElements: Element[] = [];\n\n const walker = document.createTreeWalker(\n this.root,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node: Node): number => {\n const el = node as Element;\n\n // Skip guidekit-ignore subtrees\n if (el.hasAttribute('data-guidekit-ignore')) {\n return NodeFilter.FILTER_REJECT;\n }\n\n // Budget check\n if (nodesScanned >= this.maxNodes) {\n budgetExhausted = true;\n return NodeFilter.FILTER_REJECT;\n }\n\n nodesScanned++;\n return NodeFilter.FILTER_ACCEPT;\n },\n },\n );\n\n // Walk the tree\n let currentNode = walker.nextNode();\n while (currentNode) {\n const el = currentNode as Element;\n allElements.push(el);\n\n // Check if this is a candidate section\n const depth = this.getDepth(el);\n if (depth <= this.maxDepth && this.isSectionCandidate(el)) {\n candidateSections.push({ el, depth });\n }\n\n currentNode = walker.nextNode();\n }\n\n this.log(`Walked ${nodesScanned} nodes, found ${candidateSections.length} section candidates`);\n\n // Phase 2: Extract page data\n const sections = this.extractSections(candidateSections);\n const navigation = this.extractNavigation();\n const interactiveElements = this.extractInteractiveElements();\n const forms = this.extractForms();\n const activeOverlays = this.extractOverlays();\n const meta = this.extractMeta();\n\n const scanMetadata: ScanMetadata = {\n totalSectionsFound: candidateSections.length,\n sectionsIncluded: sections.length,\n totalNodesScanned: nodesScanned,\n scanBudgetExhausted: budgetExhausted,\n };\n\n const model: PageModel = {\n url: window.location.href,\n title: document.title ?? '',\n meta,\n sections,\n navigation,\n interactiveElements,\n forms,\n activeOverlays,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n orientation:\n window.innerWidth >= window.innerHeight ? 'landscape' : 'portrait',\n },\n allSectionsSummary: sections.map(\n (s) => `[${s.label}] ${s.summary}`,\n ),\n hash: '',\n timestamp: Date.now(),\n scanMetadata,\n };\n\n // Generate hash from key model content\n model.hash = this.generateHash(model);\n\n this.cachedModel = model;\n\n const elapsed = (performance.now() - startTime).toFixed(1);\n this.log(`Scan complete in ${elapsed}ms`, {\n sections: sections.length,\n navItems: navigation.length,\n interactive: interactiveElements.length,\n forms: forms.length,\n overlays: activeOverlays.length,\n nodesScanned,\n budgetExhausted,\n });\n\n return model;\n }\n\n /**\n * Set up a MutationObserver that rescans on DOM changes.\n * Returns a cleanup function to disconnect the observer.\n */\n observe(callback: (model: PageModel) => void): () => void {\n if (typeof MutationObserver === 'undefined' || !this.root) {\n this.log('MutationObserver not available or no root');\n return () => {};\n }\n\n this.log('Starting observation');\n\n const handleMutations = (_mutations: MutationRecord[]) => {\n const now = Date.now();\n\n // --- Circuit breaker ---\n if (now - this.mutationWindowStart > 1000) {\n // New one-second window\n this.mutationCount = _mutations.length;\n this.mutationWindowStart = now;\n } else {\n this.mutationCount += _mutations.length;\n }\n\n if (this.mutationCount > MUTATION_CIRCUIT_BREAKER_THRESHOLD) {\n if (!this.circuitBroken) {\n this.circuitBroken = true;\n this.log('Circuit breaker tripped — pausing observation');\n\n // Disconnect temporarily\n this.observer?.disconnect();\n\n this.circuitBrokenTimer = setTimeout(() => {\n this.circuitBroken = false;\n this.mutationCount = 0;\n this.log('Circuit breaker reset — resuming observation');\n this.startObserving();\n this.triggerRescan(callback);\n }, CIRCUIT_BREAKER_COOLDOWN_MS);\n }\n return;\n }\n\n // --- Debounce ---\n if (this.debounceTimer !== null) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n this.triggerRescan(callback);\n }, MUTATION_DEBOUNCE_MS);\n };\n\n this.observer = new MutationObserver(handleMutations);\n this.startObserving();\n\n // Return cleanup function\n return () => {\n this.log('Stopping observation');\n this.cleanup();\n };\n }\n\n /** Update visibility data from an IntersectionObserver. */\n updateVisibility(entries: IntersectionObserverEntry[]): void {\n for (const entry of entries) {\n this.visibilityMap.set(entry.target, entry.intersectionRatio);\n }\n }\n\n /** Get the current cached page model. */\n get currentModel(): PageModel | null {\n return this.cachedModel;\n }\n\n // -------------------------------------------------------------------------\n // Private: Observation helpers\n // -------------------------------------------------------------------------\n\n private startObserving(): void {\n if (!this.observer || !this.root) return;\n\n this.observer.observe(this.root, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\n 'class',\n 'style',\n 'hidden',\n 'aria-hidden',\n 'aria-label',\n 'role',\n 'data-guidekit-target',\n 'data-guidekit-ignore',\n 'disabled',\n ],\n });\n }\n\n private triggerRescan(callback: (model: PageModel) => void): void {\n const now = Date.now();\n if (now - this.lastScanTime < MIN_RESCAN_INTERVAL_MS) {\n this.log('Rescan throttled');\n return;\n }\n\n this.lastScanTime = now;\n\n scheduleIdle(() => {\n const model = this.scan();\n callback(model);\n });\n }\n\n private cleanup(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n if (this.debounceTimer !== null) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n if (this.circuitBrokenTimer !== null) {\n clearTimeout(this.circuitBrokenTimer);\n this.circuitBrokenTimer = null;\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Section extraction\n // -------------------------------------------------------------------------\n\n private isSectionCandidate(el: Element): boolean {\n const tag = el.tagName;\n\n // Semantic section tags\n if (SECTION_TAGS.has(tag)) return true;\n\n // Divs or other elements with role, aria-label, or id\n if (\n el.getAttribute('role') ||\n el.getAttribute('aria-label') ||\n el.id\n ) {\n return true;\n }\n\n return false;\n }\n\n private extractSections(\n candidates: Array<{ el: Element; depth: number }>,\n ): PageSection[] {\n const scored: PageSection[] = [];\n\n for (const { el, depth } of candidates) {\n const section = this.buildPageSection(el, depth);\n scored.push(section);\n }\n\n // Sort by score descending\n scored.sort((a, b) => b.score - a.score);\n\n // Take top N\n return scored.slice(0, this.maxSections);\n }\n\n private buildPageSection(el: Element, depth: number): PageSection {\n const tag = el.tagName;\n const selector = buildSelector(el);\n\n // Determine label\n const label = this.getSectionLabel(el);\n\n // Get summary from first ~100 chars of text\n const summary = getTextContent(el, 100);\n\n // Check visibility\n const visRatio = this.visibilityMap.get(el) ?? 0;\n const isVisible = visRatio > 0 || this.isInViewport(el);\n\n // Check for interactive elements\n const hasInteractive =\n el.querySelector(INTERACTIVE_SELECTOR) !== null;\n\n // Determine landmark\n const landmark = this.getLandmark(el);\n\n // Has heading?\n const hasHeading = el.querySelector('h1, h2, h3, h4, h5, h6') !== null;\n\n // Score\n const score = this.scoreSection({\n isVisible,\n hasInteractive,\n landmark,\n hasHeading,\n depth,\n el,\n });\n\n return {\n id: generateSectionId(el),\n selector,\n tagName: tag.toLowerCase(),\n label,\n summary,\n isVisible,\n visibilityRatio: visRatio,\n score,\n landmark: landmark ?? undefined,\n hasInteractiveElements: hasInteractive,\n depth,\n };\n }\n\n private getSectionLabel(el: Element): string {\n // 1. aria-label\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // 2. First heading\n const heading = el.querySelector('h1, h2, h3, h4, h5, h6');\n if (heading) {\n const text = collapseWhitespace(heading.textContent ?? '');\n if (text) return stripPII(truncate(text, 80));\n }\n\n // 3. id as fallback\n if (el.id) return el.id;\n\n // 4. Tag name\n return el.tagName.toLowerCase();\n }\n\n private getLandmark(el: Element): string | null {\n // Explicit role\n const role = el.getAttribute('role');\n if (role) return role;\n\n // Implicit landmark via tag\n const implicit = LANDMARK_TAG_MAP[el.tagName];\n if (implicit) return implicit;\n\n // section/article with aria-label count as landmarks\n if (\n (el.tagName === 'SECTION' || el.tagName === 'ARTICLE') &&\n el.getAttribute('aria-label')\n ) {\n return el.tagName === 'SECTION' ? 'region' : 'article';\n }\n\n return null;\n }\n\n private scoreSection(params: {\n isVisible: boolean;\n hasInteractive: boolean;\n landmark: string | null;\n hasHeading: boolean;\n depth: number;\n el: Element;\n }): number {\n let score = 0;\n\n if (params.isVisible) score += 100;\n if (params.hasInteractive) score += 20;\n if (params.landmark) score += 15;\n\n // Near scroll position\n if (typeof window !== 'undefined') {\n const rect = params.el.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n if (\n rect.top >= -viewportHeight &&\n rect.top <= viewportHeight * 2\n ) {\n score += 10;\n }\n }\n\n if (params.hasHeading) score += 5;\n\n // Depth penalty\n score -= params.depth * 2;\n\n return score;\n }\n\n // -------------------------------------------------------------------------\n // Private: Navigation extraction\n // -------------------------------------------------------------------------\n\n private extractNavigation(): NavItem[] {\n if (typeof document === 'undefined') return [];\n\n const navElements = this.root?.querySelectorAll('nav') ?? [];\n const items: NavItem[] = [];\n\n navElements.forEach((nav) => {\n if (nav.hasAttribute('data-guidekit-ignore')) return;\n\n const links = nav.querySelectorAll('a[href]');\n links.forEach((link) => {\n const anchor = link as HTMLAnchorElement;\n const label = collapseWhitespace(anchor.textContent ?? '');\n if (!label) return;\n\n const href = anchor.getAttribute('href') ?? '';\n const isCurrent =\n anchor.getAttribute('aria-current') === 'page' ||\n anchor.classList.contains('active') ||\n (typeof window !== 'undefined' && anchor.href === window.location.href);\n\n items.push({\n label: stripPII(truncate(label, 60)),\n href,\n isCurrent,\n selector: buildSelector(anchor),\n });\n });\n });\n\n return items;\n }\n\n // -------------------------------------------------------------------------\n // Private: Interactive elements extraction\n // -------------------------------------------------------------------------\n\n private extractInteractiveElements(): InteractiveElement[] {\n if (typeof document === 'undefined' || !this.root) return [];\n\n const elements = this.root.querySelectorAll(INTERACTIVE_SELECTOR);\n const result: InteractiveElement[] = [];\n\n elements.forEach((el) => {\n // Skip elements inside ignored subtrees\n if (el.closest('[data-guidekit-ignore]')) return;\n\n const htmlEl = el as HTMLElement;\n const tag = el.tagName.toLowerCase();\n const type = el.getAttribute('type') ?? undefined;\n\n // Skip sensitive input types — never capture their labels from value/placeholder\n const isSensitive =\n tag === 'input' && SENSITIVE_INPUT_TYPES.has(type ?? '');\n\n // Get label\n let label = getAccessibleLabel(el);\n if (!label && !isSensitive) {\n label = collapseWhitespace(el.textContent ?? '');\n }\n if (!label) {\n const placeholder = el.getAttribute('placeholder');\n if (placeholder && !isSensitive) {\n label = placeholder;\n }\n }\n if (!label && el.getAttribute('title')) {\n label = el.getAttribute('title') ?? '';\n }\n if (!label && isSensitive) {\n label = type ?? 'input';\n }\n label = stripPII(truncate(label, 60));\n\n const role = el.getAttribute('role') ?? undefined;\n const isDisabled =\n htmlEl.hasAttribute('disabled') ||\n htmlEl.getAttribute('aria-disabled') === 'true';\n const guideKitTarget =\n el.getAttribute('data-guidekit-target') ?? undefined;\n\n result.push({\n selector: buildSelector(el),\n tagName: tag,\n type,\n label,\n role,\n isDisabled,\n guideKitTarget,\n });\n });\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // Private: Form extraction\n // -------------------------------------------------------------------------\n\n private extractForms(): FormSummary[] {\n if (typeof document === 'undefined' || !this.root) return [];\n\n const formElements = this.root.querySelectorAll('form');\n const result: FormSummary[] = [];\n\n formElements.forEach((form) => {\n if (form.closest('[data-guidekit-ignore]')) return;\n\n const fields = this.extractFormFields(form);\n const hasValidationErrors = fields.some((f) => f.hasError);\n\n result.push({\n selector: buildSelector(form),\n id: form.id || undefined,\n action: form.action || undefined,\n fields,\n hasValidationErrors,\n });\n });\n\n return result;\n }\n\n private extractFormFields(form: HTMLFormElement): FormField[] {\n const fields: FormField[] = [];\n const fieldElements = form.querySelectorAll(\n 'input, select, textarea',\n );\n\n fieldElements.forEach((el) => {\n const input = el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n const name = input.name || input.id || '';\n const type =\n el.tagName === 'SELECT'\n ? 'select'\n : el.tagName === 'TEXTAREA'\n ? 'textarea'\n : (el as HTMLInputElement).type || 'text';\n\n // Find label\n let label = '';\n if (input.id && typeof document !== 'undefined') {\n const labelEl = document.querySelector(\n `label[for=\"${CSS.escape(input.id)}\"]`,\n );\n if (labelEl) {\n label = collapseWhitespace(labelEl.textContent ?? '');\n }\n }\n if (!label) {\n // Check for wrapping label\n const parentLabel = input.closest('label');\n if (parentLabel) {\n label = collapseWhitespace(parentLabel.textContent ?? '');\n }\n }\n if (!label) {\n label = getAccessibleLabel(el);\n }\n if (!label) {\n const placeholder = el.getAttribute('placeholder');\n label = placeholder ?? name;\n }\n label = stripPII(truncate(label, 60));\n\n // Required?\n const isRequired =\n input.hasAttribute('required') ||\n input.getAttribute('aria-required') === 'true';\n\n // Validation error\n const hasError =\n input.getAttribute('aria-invalid') === 'true' ||\n (input instanceof HTMLInputElement && !input.validity.valid && input.value !== '');\n\n let errorMessage: string | undefined;\n const errorId = input.getAttribute('aria-errormessage') ?? input.getAttribute('aria-describedby');\n if (hasError && errorId && typeof document !== 'undefined') {\n const errorEl = document.getElementById(errorId);\n if (errorEl) {\n errorMessage = collapseWhitespace(errorEl.textContent ?? '');\n }\n }\n if (hasError && !errorMessage && input instanceof HTMLInputElement) {\n errorMessage = input.validationMessage || undefined;\n }\n\n fields.push({\n selector: buildSelector(el),\n name,\n type,\n label,\n isRequired,\n hasError,\n errorMessage,\n });\n });\n\n return fields;\n }\n\n // -------------------------------------------------------------------------\n // Private: Overlay detection\n // -------------------------------------------------------------------------\n\n private extractOverlays(): OverlayElement[] {\n if (typeof document === 'undefined' || typeof window === 'undefined' || !this.root) {\n return [];\n }\n\n const result: OverlayElement[] = [];\n\n // 1. Elements with explicit dialog roles\n const dialogElements = this.root.querySelectorAll(\n '[role=\"dialog\"], [role=\"alertdialog\"], dialog',\n );\n dialogElements.forEach((el) => {\n if (el.closest('[data-guidekit-ignore]')) return;\n const label = getAccessibleLabel(el) || getTextContent(el, 40) || 'dialog';\n result.push({\n selector: buildSelector(el),\n type: 'modal',\n label: stripPII(label),\n isVisible: isElementVisible(el),\n });\n });\n\n // 2. Common modal patterns: high z-index + fixed/absolute positioning\n const allElements = this.root.querySelectorAll('*');\n const seen = new Set<Element>(dialogElements);\n\n allElements.forEach((el) => {\n if (seen.has(el)) return;\n if (el.closest('[data-guidekit-ignore]')) return;\n\n const style = window.getComputedStyle(el);\n const position = style.position;\n const zIndex = parseInt(style.zIndex, 10);\n\n if (\n (position === 'fixed' || position === 'absolute') &&\n !isNaN(zIndex) &&\n zIndex >= 1000\n ) {\n const visible = isElementVisible(el);\n if (!visible) return;\n\n // Determine overlay type heuristically\n const overlayType = this.classifyOverlay(el, style);\n if (!overlayType) return;\n\n const label =\n getAccessibleLabel(el) || getTextContent(el, 40) || overlayType;\n\n result.push({\n selector: buildSelector(el),\n type: overlayType,\n label: stripPII(label),\n isVisible: visible,\n });\n }\n });\n\n return result;\n }\n\n private classifyOverlay(\n el: Element,\n style: CSSStyleDeclaration,\n ): OverlayElement['type'] | null {\n const role = el.getAttribute('role');\n if (role === 'dialog' || role === 'alertdialog') return 'modal';\n if (role === 'menu' || role === 'listbox') return 'dropdown';\n\n // Check class names for hints\n const className = el.className?.toString?.() ?? '';\n const lower = className.toLowerCase();\n\n if (lower.includes('modal') || lower.includes('dialog')) return 'modal';\n if (lower.includes('drawer') || lower.includes('sidebar')) return 'drawer';\n if (\n lower.includes('dropdown') ||\n lower.includes('menu') ||\n lower.includes('popover')\n )\n return 'dropdown';\n\n // Fixed elements covering large area are likely modals\n const width = parseFloat(style.width);\n const height = parseFloat(style.height);\n if (\n typeof window !== 'undefined' &&\n !isNaN(width) &&\n !isNaN(height) &&\n width > window.innerWidth * 0.5 &&\n height > window.innerHeight * 0.5\n ) {\n return 'modal';\n }\n\n // Small positioned element is likely a popover\n if (!isNaN(width) && width < 400) return 'popover';\n\n return null;\n }\n\n // -------------------------------------------------------------------------\n // Private: Meta extraction\n // -------------------------------------------------------------------------\n\n private extractMeta(): PageModel['meta'] {\n if (typeof document === 'undefined') {\n return { description: '', h1: null, language: 'en' };\n }\n\n const descMeta = document.querySelector('meta[name=\"description\"]');\n const description = descMeta?.getAttribute('content') ?? '';\n\n const h1El = document.querySelector('h1');\n const h1 = h1El ? stripPII(collapseWhitespace(h1El.textContent ?? '')) : null;\n\n const language =\n document.documentElement.getAttribute('lang') ?? 'en';\n\n return {\n description: stripPII(description),\n h1,\n language,\n };\n }\n\n // -------------------------------------------------------------------------\n // Private: Helpers\n // -------------------------------------------------------------------------\n\n private getDepth(el: Element): number {\n let depth = 0;\n let current: Element | null = el;\n const root = this.root;\n\n while (current && current !== root && depth < this.maxDepth + 1) {\n current = current.parentElement;\n depth++;\n }\n\n return depth;\n }\n\n private isInViewport(el: Element): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const rect = el.getBoundingClientRect();\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n } catch {\n return false;\n }\n }\n\n private generateHash(model: PageModel): string {\n // Hash key structural content for change detection\n const content = [\n model.url,\n model.title,\n model.meta.h1 ?? '',\n model.sections.map((s) => `${s.id}:${s.label}`).join(','),\n model.navigation.map((n) => n.href).join(','),\n model.interactiveElements.length.toString(),\n model.forms.length.toString(),\n model.activeOverlays.length.toString(),\n ].join('|');\n\n return djb2Hash(content);\n }\n\n private emptyModel(): PageModel {\n return {\n url: typeof window !== 'undefined' ? window.location.href : '',\n title: typeof document !== 'undefined' ? document.title ?? '' : '',\n meta: { description: '', h1: null, language: 'en' },\n sections: [],\n navigation: [],\n interactiveElements: [],\n forms: [],\n activeOverlays: [],\n viewport: { width: 0, height: 0, orientation: 'portrait' },\n allSectionsSummary: [],\n hash: '',\n timestamp: Date.now(),\n scanMetadata: {\n totalSectionsFound: 0,\n sectionsIncluded: 0,\n totalNodesScanned: 0,\n scanBudgetExhausted: false,\n },\n };\n }\n\n private log(message: string, data?: Record<string, unknown>): void {\n if (!this.debug) return;\n if (typeof console !== 'undefined') {\n if (data) {\n console.log(`${LOG_PREFIX} ${message}`, data);\n } else {\n console.log(`${LOG_PREFIX} ${message}`);\n }\n }\n }\n}\n","/**\n * @module @guidekit/core/context\n *\n * Context manager for the GuideKit SDK.\n * Assembles the LLM system prompt from the current page model, manages\n * conversation history with automatic eviction, resolves content-map entries,\n * and persists session state across page navigations via sessionStorage.\n */\n\nimport type {\n PageModel,\n ConversationTurn,\n ContentMapInput,\n ContentMap,\n ContentMapEntry,\n AgentConfig,\n ToolDefinition,\n SessionState,\n} from '../types/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SESSION_STORAGE_KEY = 'guidekit:session';\nconst DEFAULT_MAX_TURNS = 20;\nconst DEFAULT_MAX_SESSION_SIZE_BYTES = 50_000; // 50 KB\nconst DEFAULT_TOKEN_BUDGET = 6_000; // ~1 500 tokens\nconst CONTENT_MAP_TIMEOUT_MS = 2_000;\nconst CONTENT_CACHE_TTL_MS = 30_000; // 30 seconds\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Measure byte-length of a string in UTF-8. */\nfunction byteLength(str: string): number {\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(str).byteLength;\n }\n // Fallback for environments without TextEncoder (unlikely in modern runtimes)\n let bytes = 0;\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n if (code <= 0x7f) bytes += 1;\n else if (code <= 0x7ff) bytes += 2;\n else if (code >= 0xd800 && code <= 0xdfff) {\n bytes += 4;\n i++; // surrogate pair\n } else bytes += 3;\n }\n return bytes;\n}\n\n/** Race a promise against a timeout, returning `null` on timeout. */\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T | null> {\n return new Promise<T | null>((resolve) => {\n let settled = false;\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve(null);\n }\n }, ms);\n\n promise\n .then((value) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n resolve(value);\n }\n })\n .catch(() => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n resolve(null);\n }\n });\n });\n}\n\n/** Check whether sessionStorage is available (SSR-safe). */\nfunction hasSessionStorage(): boolean {\n try {\n return (\n typeof window !== 'undefined' &&\n typeof window.sessionStorage !== 'undefined'\n );\n } catch {\n // In some environments, accessing sessionStorage itself can throw (e.g. sandboxed iframes).\n return false;\n }\n}\n\n/** Truncate a string to a maximum character count, appending an ellipsis if trimmed. */\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + '\\u2026';\n}\n\n// ---------------------------------------------------------------------------\n// Content cache entry\n// ---------------------------------------------------------------------------\n\ninterface CachedContent {\n entry: ContentMapEntry | null;\n expiresAt: number;\n}\n\n// ---------------------------------------------------------------------------\n// ContextManager\n// ---------------------------------------------------------------------------\n\nexport interface ContextManagerOptions {\n agent?: AgentConfig;\n contentMap?: ContentMapInput;\n maxTurns?: number;\n maxSessionSizeBytes?: number;\n tokenBudget?: number;\n debug?: boolean;\n}\n\nexport class ContextManager {\n private agent: AgentConfig;\n private contentMap: ContentMapInput | undefined;\n private maxTurns: number;\n private maxSessionSizeBytes: number;\n private tokenBudget: number;\n private debug: boolean;\n\n private history: ConversationTurn[] = [];\n private contentCache: Map<string, CachedContent> = new Map();\n\n // Session preferences (persisted across navigations)\n private _userPreference: 'voice' | 'text' = 'text';\n private _quietMode = false;\n private _pageContext: Record<string, unknown> = {};\n\n constructor(options?: ContextManagerOptions) {\n this.agent = options?.agent ?? {};\n this.contentMap = options?.contentMap;\n this.maxTurns = options?.maxTurns ?? DEFAULT_MAX_TURNS;\n this.maxSessionSizeBytes =\n options?.maxSessionSizeBytes ?? DEFAULT_MAX_SESSION_SIZE_BYTES;\n this.tokenBudget = options?.tokenBudget ?? DEFAULT_TOKEN_BUDGET;\n this.debug = options?.debug ?? false;\n }\n\n // -------------------------------------------------------------------------\n // System prompt\n // -------------------------------------------------------------------------\n\n /**\n * Build the full system prompt from the current page model and available\n * tools. The output is capped at `tokenBudget` characters so it fits\n * comfortably inside the LLM context window alongside conversation history.\n */\n buildSystemPrompt(pageModel: PageModel, tools: ToolDefinition[]): string {\n const parts: string[] = [];\n\n // -- Role ----------------------------------------------------------------\n parts.push(this.buildRoleSection());\n\n // -- Current Page --------------------------------------------------------\n parts.push(this.buildCurrentPageSection(pageModel));\n\n // -- Page Sections -------------------------------------------------------\n parts.push(this.buildPageSectionsSection(pageModel));\n\n // -- Navigation ----------------------------------------------------------\n if (pageModel.navigation.length > 0) {\n parts.push(this.buildNavigationSection(pageModel));\n }\n\n // -- Interactive Elements ------------------------------------------------\n if (pageModel.interactiveElements.length > 0) {\n parts.push(this.buildInteractiveElementsSection(pageModel));\n }\n\n // -- Forms ---------------------------------------------------------------\n if (pageModel.forms.length > 0) {\n parts.push(this.buildFormsSection(pageModel));\n }\n\n // -- User Viewport -------------------------------------------------------\n parts.push(this.buildViewportSection(pageModel));\n\n // -- Available Actions ---------------------------------------------------\n if (tools.length > 0) {\n parts.push(this.buildToolsSection(tools));\n }\n\n // -- Developer Context ---------------------------------------------------\n const pageCtxKeys = Object.keys(this._pageContext);\n if (pageCtxKeys.length > 0) {\n parts.push(this.buildPageContextSection());\n }\n\n // -- Guidelines ----------------------------------------------------------\n parts.push(this.buildGuidelinesSection());\n\n // Join and enforce budget\n let prompt = parts.join('\\n\\n');\n if (prompt.length > this.tokenBudget) {\n prompt = this.trimPromptToBudget(prompt, pageModel, tools);\n }\n\n return prompt;\n }\n\n // -------------------------------------------------------------------------\n // Conversation history\n // -------------------------------------------------------------------------\n\n /** Append a turn to the conversation history, enforcing size constraints. */\n addTurn(turn: ConversationTurn): void {\n this.history.push(turn);\n this.enforceHistoryLimits();\n }\n\n /** Return a copy of the current conversation history. */\n getHistory(): ConversationTurn[] {\n return this.history.slice();\n }\n\n /** Clear all conversation history. */\n clearHistory(): void {\n this.history = [];\n }\n\n // -------------------------------------------------------------------------\n // Content map\n // -------------------------------------------------------------------------\n\n /**\n * Resolve a `ContentMapEntry` for the given `sectionId`.\n *\n * - Static maps are looked up directly.\n * - Function-based maps are called with a 2-second timeout.\n * - Results are cached for 30 seconds per section ID.\n */\n async getContent(sectionId: string): Promise<ContentMapEntry | null> {\n // Check cache first\n const cached = this.contentCache.get(sectionId);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.entry;\n }\n\n if (this.contentMap === undefined) {\n return null;\n }\n\n let entry: ContentMapEntry | null;\n\n if (typeof this.contentMap === 'function') {\n try {\n const result = this.contentMap(sectionId);\n if (result instanceof Promise) {\n entry = await withTimeout(result, CONTENT_MAP_TIMEOUT_MS);\n } else {\n entry = result;\n }\n } catch (err) {\n this.log('Content map function threw for sectionId:', sectionId, err);\n entry = null;\n }\n } else {\n // Static Record<string, ContentMapEntry>\n entry = (this.contentMap as ContentMap)[sectionId] ?? null;\n }\n\n // Cache the result\n this.contentCache.set(sectionId, {\n entry,\n expiresAt: Date.now() + CONTENT_CACHE_TTL_MS,\n });\n\n return entry;\n }\n\n /** Replace the content map used for section lookups. Clears the cache. */\n setContentMap(contentMap: ContentMapInput): void {\n this.contentMap = contentMap;\n this.contentCache.clear();\n }\n\n // -------------------------------------------------------------------------\n // Session preferences\n // -------------------------------------------------------------------------\n\n get userPreference(): 'voice' | 'text' {\n return this._userPreference;\n }\n\n set userPreference(value: 'voice' | 'text') {\n this._userPreference = value;\n }\n\n get quietMode(): boolean {\n return this._quietMode;\n }\n\n set quietMode(value: boolean) {\n this._quietMode = value;\n }\n\n // -------------------------------------------------------------------------\n // Page context (dynamic context injection)\n // -------------------------------------------------------------------------\n\n /** Set developer-supplied page context (merged into system prompt). */\n setPageContext(context: Record<string, unknown>): void {\n this._pageContext = { ...this._pageContext, ...context };\n this.log('Page context updated', Object.keys(context));\n }\n\n /** Get the current page context. */\n getPageContext(): Record<string, unknown> {\n return { ...this._pageContext };\n }\n\n /** Clear all page context. */\n clearPageContext(): void {\n this._pageContext = {};\n }\n\n // -------------------------------------------------------------------------\n // Session persistence\n // -------------------------------------------------------------------------\n\n /** Persist the current session state to `sessionStorage`. */\n saveSession(): void {\n if (!hasSessionStorage()) return;\n\n const state = this.getSessionState();\n try {\n window.sessionStorage.setItem(\n SESSION_STORAGE_KEY,\n JSON.stringify(state),\n );\n } catch (err) {\n this.log('Failed to save session:', err);\n }\n }\n\n /** Restore a previously persisted session from `sessionStorage`. */\n restoreSession(): SessionState | null {\n if (!hasSessionStorage()) return null;\n\n try {\n const raw = window.sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (!raw) return null;\n\n const state = JSON.parse(raw) as SessionState;\n\n // Validate minimal shape\n if (\n !Array.isArray(state.conversationHistory) ||\n typeof state.currentUrl !== 'string'\n ) {\n this.log('Invalid session state, discarding.');\n return null;\n }\n\n // Restore conversation history\n this.history = state.conversationHistory;\n this.enforceHistoryLimits();\n\n // Restore preferences\n if (state.userPreference === 'voice' || state.userPreference === 'text') {\n this._userPreference = state.userPreference;\n }\n if (typeof state.quietMode === 'boolean') {\n this._quietMode = state.quietMode;\n }\n\n return state;\n } catch (err) {\n this.log('Failed to restore session:', err);\n return null;\n }\n }\n\n /** Build the current session state snapshot. */\n getSessionState(): SessionState {\n const serialised = JSON.stringify(this.history);\n const currentUrl =\n typeof window !== 'undefined' ? window.location.href : '';\n\n return {\n conversationHistory: this.history,\n currentUrl,\n agentStatus: 'idle',\n userPreference: this._userPreference,\n quietMode: this._quietMode,\n totalSizeBytes: byteLength(serialised),\n };\n }\n\n // -------------------------------------------------------------------------\n // Private — prompt section builders\n // -------------------------------------------------------------------------\n\n private buildRoleSection(): string {\n const name = this.agent.name || 'GuideKit';\n const personality =\n this.agent.personality ||\n 'You help users understand and navigate the site.';\n return `# Role\\nYou are ${name}, an AI guide embedded on this website.\\n${personality}`;\n }\n\n private buildCurrentPageSection(pageModel: PageModel): string {\n const lines = ['# Current Page'];\n lines.push(`URL: ${pageModel.url}`);\n lines.push(`Title: ${pageModel.title}`);\n if (pageModel.meta.description) {\n lines.push(`Description: ${pageModel.meta.description}`);\n }\n lines.push(`Language: ${pageModel.meta.language}`);\n return lines.join('\\n');\n }\n\n private buildPageSectionsSection(pageModel: PageModel): string {\n const { sectionsIncluded, totalSectionsFound } = pageModel.scanMetadata;\n const lines = [\n `# Page Sections (${sectionsIncluded} of ${totalSectionsFound})`,\n ];\n\n for (const section of pageModel.sections) {\n const vis = section.isVisible ? 'visible' : 'hidden';\n lines.push(\n `- [${section.id}] ${section.label}: ${truncate(section.summary, 120)} (${vis})`,\n );\n }\n\n if (sectionsIncluded < totalSectionsFound) {\n lines.push(\n `\\nNote: You see ${sectionsIncluded} of ${totalSectionsFound} sections. Use readPageContent to access more.`,\n );\n }\n\n return lines.join('\\n');\n }\n\n private buildNavigationSection(pageModel: PageModel): string {\n const lines = ['# Navigation'];\n for (const nav of pageModel.navigation) {\n const current = nav.isCurrent ? ' (current)' : '';\n lines.push(`- ${nav.label}: ${nav.href}${current}`);\n }\n return lines.join('\\n');\n }\n\n private buildInteractiveElementsSection(pageModel: PageModel): string {\n const lines = ['# Interactive Elements'];\n for (const el of pageModel.interactiveElements) {\n const disabled = el.isDisabled ? ' [disabled]' : '';\n lines.push(\n `- ${el.tagName}${el.type ? `[${el.type}]` : ''}: ${el.label}${disabled} (${el.selector})`,\n );\n }\n return lines.join('\\n');\n }\n\n private buildFormsSection(pageModel: PageModel): string {\n const lines = ['# Forms'];\n for (const form of pageModel.forms) {\n const formId = form.id ? ` id=\"${form.id}\"` : '';\n const errors = form.hasValidationErrors ? ' [has errors]' : '';\n lines.push(`- <form${formId}>${errors}`);\n for (const field of form.fields) {\n const req = field.isRequired ? ' *' : '';\n const err = field.hasError\n ? ` [error: ${field.errorMessage || 'invalid'}]`\n : '';\n lines.push(\n ` - ${field.label || field.name} (${field.type})${req}${err}`,\n );\n }\n }\n return lines.join('\\n');\n }\n\n private buildViewportSection(pageModel: PageModel): string {\n const { width, height, orientation } = pageModel.viewport;\n return `# User Viewport\\n${width}x${height}, ${orientation}`;\n }\n\n private buildToolsSection(tools: ToolDefinition[]): string {\n const lines = ['# Available Actions'];\n for (const tool of tools) {\n lines.push(`- ${tool.name}: ${tool.description}`);\n }\n return lines.join('\\n');\n }\n\n private buildPageContextSection(): string {\n const lines = ['# Developer Context'];\n for (const [key, value] of Object.entries(this._pageContext)) {\n const valStr =\n typeof value === 'string'\n ? value\n : JSON.stringify(value);\n lines.push(`- ${key}: ${truncate(String(valStr), 200)}`);\n }\n return lines.join('\\n');\n }\n\n private buildGuidelinesSection(): string {\n return [\n '# Guidelines',\n '- Always reference specific sections by their ID when guiding users',\n '- Use highlight() to point at elements you are discussing',\n '- Use scrollToSection() before highlighting offscreen elements',\n '- Never make up information not present in the page context',\n '- If asked about content you cannot see, use readPageContent to access it',\n '- Keep responses concise — 2-3 sentences unless the user asks for detail',\n ].join('\\n');\n }\n\n // -------------------------------------------------------------------------\n // Private — prompt trimming\n // -------------------------------------------------------------------------\n\n /**\n * When the assembled prompt exceeds the budget, progressively trim\n * lower-priority sections to fit.\n */\n private trimPromptToBudget(\n _fullPrompt: string,\n pageModel: PageModel,\n tools: ToolDefinition[],\n ): string {\n // Rebuild with trimming strategies applied in priority order:\n // 1. Truncate interactive elements list\n // 2. Truncate navigation list\n // 3. Truncate forms\n // 4. Truncate page sections\n\n const essentialParts: string[] = [\n this.buildRoleSection(),\n this.buildCurrentPageSection(pageModel),\n this.buildViewportSection(pageModel),\n this.buildGuidelinesSection(),\n ];\n\n if (tools.length > 0) {\n essentialParts.push(this.buildToolsSection(tools));\n }\n\n const essentialLength = essentialParts.reduce(\n (sum, p) => sum + p.length + 2,\n 0,\n );\n let remaining = this.tokenBudget - essentialLength;\n\n const optionalSections: string[] = [];\n\n // Page sections — highest priority optional section\n const sectionsStr = this.buildPageSectionsSection(pageModel);\n if (sectionsStr.length <= remaining) {\n optionalSections.push(sectionsStr);\n remaining -= sectionsStr.length + 2;\n } else if (remaining > 100) {\n optionalSections.push(truncate(sectionsStr, remaining));\n remaining = 0;\n }\n\n // Navigation\n if (remaining > 0 && pageModel.navigation.length > 0) {\n const navStr = this.buildNavigationSection(pageModel);\n if (navStr.length <= remaining) {\n optionalSections.push(navStr);\n remaining -= navStr.length + 2;\n } else if (remaining > 80) {\n optionalSections.push(truncate(navStr, remaining));\n remaining = 0;\n }\n }\n\n // Forms\n if (remaining > 0 && pageModel.forms.length > 0) {\n const formsStr = this.buildFormsSection(pageModel);\n if (formsStr.length <= remaining) {\n optionalSections.push(formsStr);\n remaining -= formsStr.length + 2;\n } else if (remaining > 80) {\n optionalSections.push(truncate(formsStr, remaining));\n remaining = 0;\n }\n }\n\n // Interactive elements\n if (remaining > 0 && pageModel.interactiveElements.length > 0) {\n const ieStr = this.buildInteractiveElementsSection(pageModel);\n if (ieStr.length <= remaining) {\n optionalSections.push(ieStr);\n } else if (remaining > 80) {\n optionalSections.push(truncate(ieStr, remaining));\n }\n }\n\n // Insert optional sections after current-page and before viewport\n const result = [\n essentialParts[0], // Role\n essentialParts[1], // Current Page\n ...optionalSections,\n essentialParts[2], // Viewport\n ...essentialParts.slice(3), // Tools + Guidelines\n ];\n\n return result.join('\\n\\n');\n }\n\n // -------------------------------------------------------------------------\n // Private — history management\n // -------------------------------------------------------------------------\n\n /**\n * Enforce `maxTurns` and `maxSessionSizeBytes` constraints on the\n * conversation history. When the history approaches 80% of `maxTurns`,\n * the oldest turns are summarised into a single recap turn.\n */\n private enforceHistoryLimits(): void {\n // -- Summarise when near capacity (>80% of maxTurns) --------------------\n const summariseThreshold = Math.floor(this.maxTurns * 0.8);\n if (this.history.length > summariseThreshold) {\n this.summariseOldestTurns();\n }\n\n // -- Hard cap on turn count ---------------------------------------------\n while (this.history.length > this.maxTurns) {\n this.history.shift();\n }\n\n // -- Enforce byte-size limit --------------------------------------------\n this.enforceByteLimit();\n }\n\n /**\n * Compress the oldest half of turns into a single recap turn so the\n * context window is used more efficiently.\n */\n private summariseOldestTurns(): void {\n if (this.history.length < 4) return; // Not enough to summarise\n\n const splitIndex = Math.floor(this.history.length / 2);\n const oldTurns = this.history.slice(0, splitIndex);\n const recentTurns = this.history.slice(splitIndex);\n\n // Build a compact recap from the old turns\n const recapLines: string[] = [];\n for (const turn of oldTurns) {\n const role = turn.role === 'user' ? 'User' : 'Assistant';\n recapLines.push(`${role}: ${truncate(turn.content, 150)}`);\n }\n\n const recapTurn: ConversationTurn = {\n role: 'assistant',\n content: `[Conversation recap]\\n${recapLines.join('\\n')}`,\n timestamp: oldTurns[oldTurns.length - 1]!.timestamp,\n };\n\n this.history = [recapTurn, ...recentTurns];\n }\n\n /** Evict oldest turns until the serialised history fits within the byte budget. */\n private enforceByteLimit(): void {\n while (this.history.length > 1) {\n const serialised = JSON.stringify(this.history);\n if (byteLength(serialised) <= this.maxSessionSizeBytes) break;\n this.history.shift();\n }\n }\n\n // -------------------------------------------------------------------------\n // Private — debug logging\n // -------------------------------------------------------------------------\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.debug('[GuideKit:ContextManager]', ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Error Hierarchy\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical error codes emitted by the SDK.\n * Keyed as `DOMAIN_DETAIL` so consumers can match on prefixes or exact values.\n */\nexport const ErrorCodes = {\n // Auth\n AUTH_INVALID_KEY: 'AUTH_INVALID_KEY',\n AUTH_EXPIRED_TOKEN: 'AUTH_EXPIRED_TOKEN',\n AUTH_TOKEN_REFRESH_FAILED: 'AUTH_TOKEN_REFRESH_FAILED',\n AUTH_ENDPOINT_FAILED: 'AUTH_ENDPOINT_FAILED',\n\n // Config\n CONFIG_INVALID_PROVIDER: 'CONFIG_INVALID_PROVIDER',\n CONFIG_MISSING_REQUIRED: 'CONFIG_MISSING_REQUIRED',\n\n // Init\n INIT_SHADOW_DOM_FAILED: 'INIT_SHADOW_DOM_FAILED',\n INIT_BROWSER_UNSUPPORTED: 'INIT_BROWSER_UNSUPPORTED',\n\n // Rate limit\n RATE_LIMIT_PROVIDER: 'RATE_LIMIT_PROVIDER',\n RATE_LIMIT_CLIENT: 'RATE_LIMIT_CLIENT',\n\n // Resources\n RESOURCE_EXHAUSTED_LLM: 'RESOURCE_EXHAUSTED_LLM',\n RESOURCE_EXHAUSTED_STT: 'RESOURCE_EXHAUSTED_STT',\n RESOURCE_EXHAUSTED_TTS: 'RESOURCE_EXHAUSTED_TTS',\n\n // Permission\n PERMISSION_MIC_DENIED: 'PERMISSION_MIC_DENIED',\n PERMISSION_MIC_UNAVAILABLE: 'PERMISSION_MIC_UNAVAILABLE',\n\n // Network\n NETWORK_WEBSOCKET_FAILED: 'NETWORK_WEBSOCKET_FAILED',\n NETWORK_CONNECTION_LOST: 'NETWORK_CONNECTION_LOST',\n NETWORK_TIMEOUT: 'NETWORK_TIMEOUT',\n\n // Timeout\n TIMEOUT_STT_CONNECT: 'TIMEOUT_STT_CONNECT',\n TIMEOUT_LLM_RESPONSE: 'TIMEOUT_LLM_RESPONSE',\n TIMEOUT_TTS_CONNECT: 'TIMEOUT_TTS_CONNECT',\n TIMEOUT_TTS_FIRST_AUDIO: 'TIMEOUT_TTS_FIRST_AUDIO',\n\n // Browser\n BROWSER_NO_WEB_AUDIO: 'BROWSER_NO_WEB_AUDIO',\n BROWSER_NO_WASM: 'BROWSER_NO_WASM',\n VAD_PACKAGE_MISSING: 'VAD_PACKAGE_MISSING',\n\n // Content\n CONTENT_FILTER_TRIGGERED: 'CONTENT_FILTER_TRIGGERED',\n\n // Privacy\n PRIVACY_HOOK_CANCELLED: 'PRIVACY_HOOK_CANCELLED',\n} as const;\n\n/** Union of every known error code string. */\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n// ---------------------------------------------------------------------------\n// Provider type\n// ---------------------------------------------------------------------------\n\nexport type Provider = 'deepgram' | 'elevenlabs' | 'gemini' | 'openai';\n\n// ---------------------------------------------------------------------------\n// Base options shared by every error constructor\n// ---------------------------------------------------------------------------\n\nexport interface GuideKitErrorOptions {\n code: string;\n message: string;\n provider?: Provider;\n recoverable: boolean;\n suggestion: string;\n docsUrl?: string;\n cause?: Error;\n}\n\n// ---------------------------------------------------------------------------\n// Base error class\n// ---------------------------------------------------------------------------\n\n/**\n * Root error for every failure surfaced by the GuideKit SDK.\n *\n * Every instance carries structured metadata so UI layers can present\n * actionable feedback without parsing message strings.\n */\nexport class GuideKitError extends Error {\n readonly code: string;\n readonly provider?: Provider;\n readonly recoverable: boolean;\n readonly suggestion: string;\n readonly docsUrl: string;\n\n constructor(options: GuideKitErrorOptions) {\n super(options.message, { cause: options.cause });\n\n // Fix the prototype chain so `instanceof` works correctly when\n // compiling to ES5 or when subclassing built-in Error.\n Object.setPrototypeOf(this, new.target.prototype);\n\n this.name = 'GuideKitError';\n this.code = options.code;\n this.provider = options.provider;\n this.recoverable = options.recoverable;\n this.suggestion = options.suggestion;\n this.docsUrl =\n options.docsUrl ?? `https://guidekit.dev/docs/error-codes#${options.code}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Specific error subclasses\n// ---------------------------------------------------------------------------\n\n/** Wrong or expired API key / token. */\nexport class AuthenticationError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'AuthenticationError';\n }\n}\n\n/** Invalid provider configuration supplied at init time. */\nexport class ConfigurationError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'ConfigurationError';\n }\n}\n\n/** SDK startup failure (Shadow DOM creation, browser too old, etc.). */\nexport class InitializationError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'InitializationError';\n }\n}\n\n/** Provider-side rate limit hit. Includes a retry hint. */\nexport class RateLimitError extends GuideKitError {\n readonly retryAfterMs: number;\n\n constructor(\n options: GuideKitErrorOptions & { retryAfterMs: number },\n ) {\n super({ ...options, recoverable: true });\n this.name = 'RateLimitError';\n this.retryAfterMs = options.retryAfterMs;\n }\n}\n\n/** Client-side cost / usage limits exhausted. */\nexport class ResourceExhaustedError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'ResourceExhaustedError';\n }\n}\n\n/** Microphone permission denied or device not available. */\nexport class PermissionError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'PermissionError';\n }\n}\n\n/** WebSocket dropped, HTTP connection failed, etc. */\nexport class NetworkError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: true, ...options });\n this.name = 'NetworkError';\n }\n}\n\n/** An operation exceeded its deadline. */\nexport class TimeoutError extends GuideKitError {\n readonly operationName: string;\n readonly timeoutMs: number;\n\n constructor(\n options: GuideKitErrorOptions & {\n operationName: string;\n timeoutMs: number;\n },\n ) {\n super({ ...options, recoverable: true });\n this.name = 'TimeoutError';\n this.operationName = options.operationName;\n this.timeoutMs = options.timeoutMs;\n }\n}\n\n/** Missing browser capability (Web Audio, WASM, VAD). */\nexport class BrowserSupportError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'BrowserSupportError';\n }\n}\n\n/** LLM safety / content filter triggered. */\nexport class ContentFilterError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'ContentFilterError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type guard\n// ---------------------------------------------------------------------------\n\n/**\n * Narrows an unknown caught value to `GuideKitError`.\n *\n * ```ts\n * try { ... } catch (err) {\n * if (isGuideKitError(err)) {\n * console.log(err.code, err.suggestion);\n * }\n * }\n * ```\n */\nexport function isGuideKitError(error: unknown): error is GuideKitError {\n return error instanceof GuideKitError;\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – OpenAI Adapter\n// ---------------------------------------------------------------------------\n\nimport type {\n LLMConfig,\n LLMProviderAdapter,\n ToolDefinition,\n ToolCall,\n TextChunk,\n ConversationTurn,\n} from '../types/index.js';\n\nimport {\n AuthenticationError,\n RateLimitError,\n NetworkError,\n TimeoutError,\n ErrorCodes,\n} from '../errors/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_OPENAI_MODEL = 'gpt-4o';\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst OPENAI_CHAT_URL = 'https://api.openai.com/v1/chat/completions';\n\n// ---------------------------------------------------------------------------\n// Token usage helper\n// ---------------------------------------------------------------------------\n\ninterface TokenUsage {\n prompt: number;\n completion: number;\n total: number;\n}\n\n// ---------------------------------------------------------------------------\n// OpenAIAdapter\n// ---------------------------------------------------------------------------\n\n/**\n * Adapter that translates between GuideKit's internal types and the\n * OpenAI Chat Completions API wire format. Handles streaming via SSE,\n * tool formatting, and response parsing.\n */\nexport class OpenAIAdapter implements LLMProviderAdapter {\n private readonly apiKey: string;\n private readonly model: string;\n\n constructor(config: Extract<LLMConfig, { provider: 'openai' }>) {\n this.apiKey = config.apiKey;\n this.model = config.model ?? DEFAULT_OPENAI_MODEL;\n }\n\n // -----------------------------------------------------------------------\n // LLMProviderAdapter implementation\n // -----------------------------------------------------------------------\n\n /**\n * Convert GuideKit tool definitions into OpenAI's `tools` format.\n * Each tool is wrapped as `{ type: 'function', function: { name, description, parameters } }`.\n */\n formatTools(tools: ToolDefinition[]): unknown {\n if (tools.length === 0) return undefined;\n\n return tools.map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n }\n\n /**\n * Convert an array of `ConversationTurn` objects into OpenAI's messages\n * format with `role: 'user' | 'assistant'`.\n */\n formatConversation(\n history: ConversationTurn[],\n ): Array<{ role: 'user' | 'assistant'; content: string }> {\n return history.map((turn) => ({\n role: turn.role,\n content: turn.content,\n }));\n }\n\n /**\n * Parse an OpenAI SSE streaming response into an async iterable of\n * `TextChunk` and `ToolCall` objects.\n *\n * The OpenAI streaming endpoint sends each chunk as a JSON object\n * prefixed by `data: `. The final line is `data: [DONE]`.\n * Text content arrives in `choices[0].delta.content` and tool calls\n * arrive in `choices[0].delta.tool_calls`.\n */\n async *parseResponse(\n stream: ReadableStream<Uint8Array>,\n ): AsyncIterable<TextChunk | ToolCall> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // Accumulators for tool calls that arrive incrementally across chunks.\n const pendingToolCalls = new Map<\n number,\n { id: string; name: string; argumentsJson: string }\n >();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Keep the last (possibly incomplete) line in the buffer.\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // SSE lines that are not data payloads.\n if (!trimmed.startsWith('data:')) continue;\n\n const jsonStr = trimmed.slice(5).trim();\n if (jsonStr === '' || jsonStr === '[DONE]') {\n if (jsonStr === '[DONE]') {\n // Flush any accumulated tool calls.\n yield* this.flushPendingToolCalls(pendingToolCalls);\n yield { text: '', done: true } as TextChunk;\n }\n continue;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(jsonStr) as Record<string, unknown>;\n } catch {\n // Malformed JSON chunk -- skip silently.\n continue;\n }\n\n yield* this.extractChunks(parsed, pendingToolCalls);\n }\n }\n\n // Flush any remaining data in the buffer.\n if (buffer.trim().startsWith('data:')) {\n const jsonStr = buffer.trim().slice(5).trim();\n if (jsonStr === '[DONE]') {\n yield* this.flushPendingToolCalls(pendingToolCalls);\n yield { text: '', done: true } as TextChunk;\n } else if (jsonStr !== '') {\n try {\n const parsed = JSON.parse(jsonStr) as Record<string, unknown>;\n yield* this.extractChunks(parsed, pendingToolCalls);\n } catch {\n // Ignore trailing malformed data.\n }\n }\n }\n\n // Flush any remaining tool calls that were not emitted.\n yield* this.flushPendingToolCalls(pendingToolCalls);\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Format a tool result so it can be sent back to OpenAI as a\n * `tool` role message with the `tool_call_id`.\n */\n formatToolResult(\n callId: string,\n result: unknown,\n ): { role: 'tool'; tool_call_id: string; content: string } {\n return {\n role: 'tool',\n tool_call_id: callId,\n content: typeof result === 'string' ? result : JSON.stringify(result),\n };\n }\n\n // -----------------------------------------------------------------------\n // Streaming request\n // -----------------------------------------------------------------------\n\n /**\n * Build and execute a streaming request to the OpenAI Chat Completions API.\n * Returns the raw `ReadableStream` for the response body together with\n * the raw Response object.\n */\n async streamRequest(params: {\n systemPrompt: string;\n contents: Array<{ role: string; content: string }>;\n tools?: unknown;\n signal?: AbortSignal;\n timeoutMs?: number;\n }): Promise<{\n stream: ReadableStream<Uint8Array>;\n response: Response;\n }> {\n const messages: Array<{ role: string; content: string }> = [\n { role: 'system', content: params.systemPrompt },\n ...params.contents,\n ];\n\n const body: Record<string, unknown> = {\n model: this.model,\n messages,\n stream: true,\n temperature: 0.7,\n top_p: 0.95,\n };\n\n if (params.tools) {\n body.tools = params.tools;\n }\n\n const timeoutMs = params.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n\n // Combine the external signal with our timeout signal.\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n if (params.signal) {\n // If the caller aborts, propagate to our controller.\n params.signal.addEventListener(\n 'abort',\n () => controller.abort(params.signal!.reason),\n { once: true },\n );\n }\n\n let response: Response;\n try {\n response = await fetch(OPENAI_CHAT_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (error: unknown) {\n clearTimeout(timeoutId);\n\n if (\n error instanceof DOMException &&\n error.name === 'AbortError'\n ) {\n // Distinguish caller abort from timeout.\n if (params.signal?.aborted) {\n throw error; // Re-throw caller abort as-is.\n }\n throw new TimeoutError({\n code: ErrorCodes.TIMEOUT_LLM_RESPONSE,\n message: `OpenAI request timed out after ${timeoutMs}ms`,\n provider: 'openai',\n recoverable: true,\n suggestion: 'Try again or increase the timeout.',\n operationName: 'openai.chatCompletions',\n timeoutMs,\n });\n }\n\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `Failed to connect to OpenAI API: ${(error as Error).message}`,\n provider: 'openai',\n suggestion:\n 'Check your network connection and try again.',\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n clearTimeout(timeoutId);\n\n // Handle HTTP-level errors.\n if (!response.ok) {\n await this.handleHttpError(response);\n }\n\n if (!response.body) {\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: 'OpenAI response body is null -- streaming unavailable.',\n provider: 'openai',\n suggestion: 'Retry the request.',\n });\n }\n\n return { stream: response.body, response };\n }\n\n // -----------------------------------------------------------------------\n // Internal helpers\n // -----------------------------------------------------------------------\n\n /**\n * Extract `TextChunk` and accumulate `ToolCall` data from a single parsed\n * OpenAI SSE JSON object.\n *\n * OpenAI tool calls arrive incrementally: the first chunk for a tool call\n * carries the `id` and `function.name`, while subsequent chunks append to\n * `function.arguments`. We accumulate these in `pendingToolCalls` and only\n * yield complete `ToolCall` objects when the finish_reason is 'tool_calls'\n * or when flushed.\n */\n private *extractChunks(\n parsed: Record<string, unknown>,\n pendingToolCalls: Map<\n number,\n { id: string; name: string; argumentsJson: string }\n >,\n ): Generator<TextChunk | ToolCall> {\n const choices = parsed.choices as\n | Array<Record<string, unknown>>\n | undefined;\n\n if (!choices || choices.length === 0) return;\n\n for (const choice of choices) {\n const delta = choice.delta as Record<string, unknown> | undefined;\n const finishReason = choice.finish_reason as string | null | undefined;\n\n if (delta) {\n // Handle text content.\n if (typeof delta.content === 'string' && delta.content !== '') {\n yield {\n text: delta.content,\n done: false,\n } as TextChunk;\n }\n\n // Handle incremental tool calls.\n const toolCallDeltas = delta.tool_calls as\n | Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>\n | undefined;\n\n if (toolCallDeltas) {\n for (const tc of toolCallDeltas) {\n const existing = pendingToolCalls.get(tc.index);\n if (existing) {\n // Append to existing tool call.\n if (tc.function?.arguments) {\n existing.argumentsJson += tc.function.arguments;\n }\n } else {\n // Start a new tool call accumulation.\n pendingToolCalls.set(tc.index, {\n id: tc.id ?? '',\n name: tc.function?.name ?? '',\n argumentsJson: tc.function?.arguments ?? '',\n });\n }\n }\n }\n }\n\n // When finish_reason is 'tool_calls', flush the accumulated tool calls.\n if (finishReason === 'tool_calls') {\n yield* this.flushPendingToolCalls(pendingToolCalls);\n }\n\n // When finish_reason is 'stop', yield a done text chunk.\n if (finishReason === 'stop') {\n yield { text: '', done: true } as TextChunk;\n }\n }\n }\n\n /**\n * Flush all accumulated pending tool calls as complete `ToolCall` objects.\n */\n private *flushPendingToolCalls(\n pendingToolCalls: Map<\n number,\n { id: string; name: string; argumentsJson: string }\n >,\n ): Generator<ToolCall> {\n // Sort by index to maintain order.\n const sorted = [...pendingToolCalls.entries()].sort(\n ([a], [b]) => a - b,\n );\n\n for (const [, tc] of sorted) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argumentsJson) as Record<string, unknown>;\n } catch {\n // If arguments cannot be parsed, use empty object.\n }\n\n yield {\n id: tc.id,\n name: tc.name,\n arguments: args,\n } as ToolCall;\n }\n\n pendingToolCalls.clear();\n }\n\n /**\n * Extract token usage from a parsed OpenAI response chunk.\n * Usage data typically appears in the final chunk when `stream_options`\n * includes `include_usage`, or in the non-streaming response.\n * Returns `null` if no usage data is present.\n */\n extractUsage(parsed: Record<string, unknown>): TokenUsage | null {\n const usage = parsed.usage as\n | {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n }\n | undefined;\n\n if (!usage) return null;\n\n return {\n prompt: usage.prompt_tokens ?? 0,\n completion: usage.completion_tokens ?? 0,\n total: usage.total_tokens ?? 0,\n };\n }\n\n /**\n * Check whether a parsed OpenAI chunk indicates the response was\n * blocked by a content filter.\n *\n * OpenAI signals content filtering through:\n * - `choices[].finish_reason === 'content_filter'`\n * - `choices[].content_filter_results` with `filtered: true`\n */\n isContentFiltered(parsed: Record<string, unknown>): boolean {\n const choices = parsed.choices as\n | Array<Record<string, unknown>>\n | undefined;\n\n if (!choices || choices.length === 0) return false;\n\n return choices.some((choice) => {\n // Check finish_reason.\n if (choice.finish_reason === 'content_filter') return true;\n\n // Check content_filter_results (Azure OpenAI style).\n const filterResults = choice.content_filter_results as\n | Record<string, { filtered?: boolean }>\n | undefined;\n\n if (filterResults) {\n return Object.values(filterResults).some((r) => r.filtered === true);\n }\n\n return false;\n });\n }\n\n /**\n * Translate an HTTP error response from OpenAI into the appropriate\n * GuideKit error class.\n */\n private async handleHttpError(response: Response): Promise<never> {\n let errorBody = '';\n try {\n errorBody = await response.text();\n } catch {\n // Ignore read failure.\n }\n\n const status = response.status;\n\n if (status === 401 || status === 403) {\n throw new AuthenticationError({\n code: ErrorCodes.AUTH_INVALID_KEY,\n message: `OpenAI API authentication failed (${status}): ${errorBody}`,\n provider: 'openai',\n suggestion:\n 'Verify your OpenAI API key is correct and has not expired.',\n });\n }\n\n if (status === 429) {\n const retryAfterHeader = response.headers.get('retry-after');\n const retryAfterMs = retryAfterHeader\n ? parseInt(retryAfterHeader, 10) * 1000\n : 60_000;\n\n throw new RateLimitError({\n code: ErrorCodes.RATE_LIMIT_PROVIDER,\n message: `OpenAI API rate limit exceeded (429): ${errorBody}`,\n provider: 'openai',\n recoverable: true,\n suggestion: `Rate limited by OpenAI. Retry after ${Math.ceil(retryAfterMs / 1000)}s.`,\n retryAfterMs,\n });\n }\n\n if (status >= 500) {\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `OpenAI API server error (${status}): ${errorBody}`,\n provider: 'openai',\n suggestion:\n 'The OpenAI API is experiencing issues. Please try again later.',\n });\n }\n\n // Fallback for other 4xx errors.\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `OpenAI API request failed (${status}): ${errorBody}`,\n provider: 'openai',\n suggestion: 'Check the request parameters and try again.',\n });\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – LLM Orchestrator & Gemini Adapter\n// ---------------------------------------------------------------------------\n\nimport type {\n LLMConfig,\n LLMProviderAdapter,\n ToolDefinition,\n ToolCall,\n TextChunk,\n ConversationTurn,\n} from '../types/index.js';\n\nimport {\n AuthenticationError,\n RateLimitError,\n NetworkError,\n TimeoutError,\n ContentFilterError,\n ErrorCodes,\n} from '../errors/index.js';\n\nimport { OpenAIAdapter } from './openai-adapter.js';\n\nexport { OpenAIAdapter } from './openai-adapter.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_GEMINI_MODEL = 'gemini-2.5-flash';\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst GEMINI_BASE_URL =\n 'https://generativelanguage.googleapis.com/v1beta/models';\n\n/**\n * Gemini safety categories with their corresponding enum names.\n * We apply `BLOCK_ONLY_HIGH` to every category by default so the model\n * is usable for general-purpose assistance without over-blocking.\n */\nconst DEFAULT_SAFETY_SETTINGS = [\n { category: 'HARM_CATEGORY_HARASSMENT', threshold: 'BLOCK_ONLY_HIGH' },\n { category: 'HARM_CATEGORY_HATE_SPEECH', threshold: 'BLOCK_ONLY_HIGH' },\n { category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT', threshold: 'BLOCK_ONLY_HIGH' },\n { category: 'HARM_CATEGORY_DANGEROUS_CONTENT', threshold: 'BLOCK_ONLY_HIGH' },\n];\n\n// ---------------------------------------------------------------------------\n// Token usage helper\n// ---------------------------------------------------------------------------\n\ninterface TokenUsage {\n prompt: number;\n completion: number;\n total: number;\n}\n\nfunction emptyUsage(): TokenUsage {\n return { prompt: 0, completion: 0, total: 0 };\n}\n\n// ---------------------------------------------------------------------------\n// GeminiAdapter\n// ---------------------------------------------------------------------------\n\n/**\n * Adapter that translates between GuideKit's internal types and the\n * Gemini REST API wire format. Handles streaming via SSE, tool formatting,\n * and response parsing.\n */\nexport class GeminiAdapter implements LLMProviderAdapter {\n private readonly apiKey: string;\n private readonly model: string;\n\n constructor(config: Extract<LLMConfig, { provider: 'gemini' }>) {\n this.apiKey = config.apiKey;\n this.model = config.model ?? DEFAULT_GEMINI_MODEL;\n }\n\n // -----------------------------------------------------------------------\n // LLMProviderAdapter implementation\n // -----------------------------------------------------------------------\n\n /**\n * Convert GuideKit tool definitions into Gemini's `functionDeclarations`\n * format, wrapped inside a `tools` array.\n */\n formatTools(tools: ToolDefinition[]): unknown {\n if (tools.length === 0) return undefined;\n\n return [\n {\n functionDeclarations: tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n })),\n },\n ];\n }\n\n /**\n * Convert an array of `ConversationTurn` objects into Gemini's `contents`\n * array with `role: 'user' | 'model'`.\n */\n formatConversation(\n history: ConversationTurn[],\n ): Array<{ role: string; parts: Array<{ text: string }> }> {\n return history.map((turn) => ({\n role: turn.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: turn.content }],\n }));\n }\n\n /**\n * Parse a Gemini SSE streaming response into an async iterable of\n * `TextChunk` and `ToolCall` objects.\n *\n * The Gemini `streamGenerateContent?alt=sse` endpoint sends each chunk\n * as a JSON object prefixed by `data: `. We parse line-by-line, extract\n * text parts and function call parts, and yield the appropriate types.\n */\n async *parseResponse(\n stream: ReadableStream<Uint8Array>,\n ): AsyncIterable<TextChunk | ToolCall> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Keep the last (possibly incomplete) line in the buffer.\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // SSE lines that are not data payloads.\n if (!trimmed.startsWith('data:')) continue;\n\n const jsonStr = trimmed.slice(5).trim();\n if (jsonStr === '' || jsonStr === '[DONE]') continue;\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(jsonStr) as Record<string, unknown>;\n } catch {\n // Malformed JSON chunk – skip silently.\n continue;\n }\n\n yield* this.extractChunks(parsed);\n }\n }\n\n // Flush any remaining data in the buffer.\n if (buffer.trim().startsWith('data:')) {\n const jsonStr = buffer.trim().slice(5).trim();\n if (jsonStr !== '' && jsonStr !== '[DONE]') {\n try {\n const parsed = JSON.parse(jsonStr) as Record<string, unknown>;\n yield* this.extractChunks(parsed);\n } catch {\n // Ignore trailing malformed data.\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Format a tool result so it can be sent back to Gemini as a\n * `functionResponse` part.\n */\n formatToolResult(\n callId: string,\n result: unknown,\n ): {\n role: string;\n parts: Array<{\n functionResponse: { name: string; response: { result: unknown } };\n }>;\n } {\n return {\n role: 'function',\n parts: [\n {\n functionResponse: {\n name: callId,\n response: { result },\n },\n },\n ],\n };\n }\n\n // -----------------------------------------------------------------------\n // Streaming request\n // -----------------------------------------------------------------------\n\n /**\n * Build and execute a streaming request to the Gemini API.\n * Returns the raw `ReadableStream` for the response body together with\n * a promise that resolves to token usage extracted from the final chunk.\n */\n async streamRequest(params: {\n systemPrompt: string;\n contents: Array<{ role: string; parts: Array<{ text: string }> }>;\n tools?: unknown;\n signal?: AbortSignal;\n timeoutMs?: number;\n }): Promise<{\n stream: ReadableStream<Uint8Array>;\n response: Response;\n }> {\n const url = `${GEMINI_BASE_URL}/${this.model}:streamGenerateContent?alt=sse&key=${this.apiKey}`;\n\n const body: Record<string, unknown> = {\n systemInstruction: {\n parts: [{ text: params.systemPrompt }],\n },\n contents: params.contents,\n safetySettings: DEFAULT_SAFETY_SETTINGS,\n generationConfig: {\n temperature: 0.7,\n topP: 0.95,\n topK: 40,\n },\n };\n\n if (params.tools) {\n body.tools = params.tools;\n }\n\n const timeoutMs = params.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n\n // Combine the external signal with our timeout signal.\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n if (params.signal) {\n // If the caller aborts, propagate to our controller.\n params.signal.addEventListener(\n 'abort',\n () => controller.abort(params.signal!.reason),\n { once: true },\n );\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (error: unknown) {\n clearTimeout(timeoutId);\n\n if (\n error instanceof DOMException &&\n error.name === 'AbortError'\n ) {\n // Distinguish caller abort from timeout.\n if (params.signal?.aborted) {\n throw error; // Re-throw caller abort as-is.\n }\n throw new TimeoutError({\n code: ErrorCodes.TIMEOUT_LLM_RESPONSE,\n message: `Gemini request timed out after ${timeoutMs}ms`,\n provider: 'gemini',\n recoverable: true,\n suggestion: 'Try again or increase the timeout.',\n operationName: 'gemini.streamGenerateContent',\n timeoutMs,\n });\n }\n\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `Failed to connect to Gemini API: ${(error as Error).message}`,\n provider: 'gemini',\n suggestion:\n 'Check your network connection and try again.',\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n clearTimeout(timeoutId);\n\n // Handle HTTP-level errors.\n if (!response.ok) {\n await this.handleHttpError(response);\n }\n\n if (!response.body) {\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: 'Gemini response body is null – streaming unavailable.',\n provider: 'gemini',\n suggestion: 'Retry the request.',\n });\n }\n\n return { stream: response.body, response };\n }\n\n // -----------------------------------------------------------------------\n // Internal helpers\n // -----------------------------------------------------------------------\n\n /**\n * Extract `TextChunk` and `ToolCall` items from a single parsed Gemini\n * SSE JSON object.\n */\n private *extractChunks(\n parsed: Record<string, unknown>,\n ): Generator<TextChunk | ToolCall> {\n const candidates = parsed.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n\n if (!candidates || candidates.length === 0) return;\n\n for (const candidate of candidates) {\n const content = candidate.content as\n | { parts?: Array<Record<string, unknown>> }\n | undefined;\n\n if (!content?.parts) continue;\n\n const finishReason = candidate.finishReason as string | undefined;\n const isDone =\n finishReason === 'STOP' || finishReason === 'MAX_TOKENS';\n\n for (const part of content.parts) {\n // Text part\n if (typeof part.text === 'string') {\n const textChunk: TextChunk = {\n text: part.text,\n done: isDone,\n };\n yield textChunk;\n }\n\n // Function call part\n if (part.functionCall) {\n const fc = part.functionCall as {\n name: string;\n args?: Record<string, unknown>;\n };\n const toolCall: ToolCall = {\n id: fc.name,\n name: fc.name,\n arguments: fc.args ?? {},\n };\n yield toolCall;\n }\n }\n }\n }\n\n /**\n * Extract token usage from a parsed Gemini response chunk.\n * Returns `null` if no usage metadata is present.\n */\n extractUsage(parsed: Record<string, unknown>): TokenUsage | null {\n const meta = parsed.usageMetadata as\n | {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n }\n | undefined;\n\n if (!meta) return null;\n\n return {\n prompt: meta.promptTokenCount ?? 0,\n completion: meta.candidatesTokenCount ?? 0,\n total: meta.totalTokenCount ?? 0,\n };\n }\n\n /**\n * Check whether a parsed Gemini chunk indicates the response was\n * blocked by a safety filter.\n */\n isContentFiltered(parsed: Record<string, unknown>): boolean {\n const candidates = parsed.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n\n if (!candidates || candidates.length === 0) {\n // If there is a promptFeedback.blockReason the response was blocked\n // before generation even started.\n const feedback = parsed.promptFeedback as\n | { blockReason?: string }\n | undefined;\n return feedback?.blockReason != null;\n }\n\n return candidates.some(\n (c) =>\n c.finishReason === 'SAFETY' ||\n c.finishReason === 'BLOCKED_REASON' ||\n c.finishReason === 'OTHER',\n );\n }\n\n /**\n * Translate an HTTP error response from Gemini into the appropriate\n * GuideKit error class.\n */\n private async handleHttpError(response: Response): Promise<never> {\n let errorBody = '';\n try {\n errorBody = await response.text();\n } catch {\n // Ignore read failure.\n }\n\n const status = response.status;\n\n if (status === 401 || status === 403) {\n throw new AuthenticationError({\n code: ErrorCodes.AUTH_INVALID_KEY,\n message: `Gemini API authentication failed (${status}): ${errorBody}`,\n provider: 'gemini',\n suggestion:\n 'Verify your Gemini API key is correct and has not expired.',\n });\n }\n\n if (status === 429) {\n const retryAfterHeader = response.headers.get('retry-after');\n const retryAfterMs = retryAfterHeader\n ? parseInt(retryAfterHeader, 10) * 1000\n : 60_000;\n\n throw new RateLimitError({\n code: ErrorCodes.RATE_LIMIT_PROVIDER,\n message: `Gemini API rate limit exceeded (429): ${errorBody}`,\n provider: 'gemini',\n recoverable: true,\n suggestion: `Rate limited by Gemini. Retry after ${Math.ceil(retryAfterMs / 1000)}s.`,\n retryAfterMs,\n });\n }\n\n if (status >= 500) {\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `Gemini API server error (${status}): ${errorBody}`,\n provider: 'gemini',\n suggestion:\n 'The Gemini API is experiencing issues. Please try again later.',\n });\n }\n\n // Fallback for other 4xx errors.\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `Gemini API request failed (${status}): ${errorBody}`,\n provider: 'gemini',\n suggestion: 'Check the request parameters and try again.',\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// LLMOrchestrator\n// ---------------------------------------------------------------------------\n\n/** Callback options accepted by `LLMOrchestrator`. */\ninterface OrchestratorCallbacks {\n onChunk?: (chunk: TextChunk) => void;\n onToolCall?: (toolCall: ToolCall) => void;\n onTokenUsage?: (usage: TokenUsage) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * High-level orchestrator that manages LLM interactions for the GuideKit SDK.\n *\n * Responsibilities:\n * - Owns the active `LLMProviderAdapter` (currently only `GeminiAdapter`).\n * - Streams responses from the provider, emitting callbacks for text chunks,\n * tool calls, and token usage.\n * - Handles content filter retries: if the initial response is blocked, it\n * retries once with a stripped-down prompt (no tools).\n * - Surfaces all errors through the SDK error hierarchy.\n */\nexport class LLMOrchestrator {\n private _adapter: LLMProviderAdapter;\n private _config: LLMConfig;\n private readonly debug: boolean;\n private readonly callbacks: OrchestratorCallbacks;\n\n constructor(options: {\n config: LLMConfig;\n debug?: boolean;\n onChunk?: (chunk: TextChunk) => void;\n onToolCall?: (toolCall: ToolCall) => void;\n onTokenUsage?: (usage: TokenUsage) => void;\n onError?: (error: Error) => void;\n }) {\n this._config = options.config;\n this.debug = options.debug ?? false;\n this.callbacks = {\n onChunk: options.onChunk,\n onToolCall: options.onToolCall,\n onTokenUsage: options.onTokenUsage,\n onError: options.onError,\n };\n this._adapter = this.createAdapter(options.config);\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /**\n * Send a message and stream the response from the LLM.\n *\n * Accumulates text and tool calls from the stream, invoking callbacks\n * as chunks arrive, and returns the complete result once the stream ends.\n */\n async sendMessage(params: {\n systemPrompt: string;\n history: ConversationTurn[];\n userMessage: string;\n tools?: ToolDefinition[];\n signal?: AbortSignal;\n }): Promise<{\n text: string;\n toolCalls: ToolCall[];\n usage: TokenUsage;\n }> {\n try {\n return await this.executeStream(params, /* isRetry */ false);\n } catch (error: unknown) {\n if (error instanceof ContentFilterError) {\n // Retry once without tools (simplified prompt).\n this.log('Content filter triggered – retrying without tools');\n try {\n return await this.executeStream(\n { ...params, tools: undefined },\n /* isRetry */ true,\n );\n } catch (_retryError: unknown) {\n const cfError = new ContentFilterError({\n code: ErrorCodes.CONTENT_FILTER_TRIGGERED,\n message:\n 'Response blocked by content safety filter after retry.',\n provider: this.providerName,\n suggestion:\n 'Rephrase your question or adjust safety settings.',\n });\n this.callbacks.onError?.(cfError);\n throw cfError;\n }\n }\n\n // For non-content-filter errors, notify and re-throw.\n if (error instanceof Error) {\n this.callbacks.onError?.(error);\n }\n throw error;\n }\n }\n\n /**\n * Hot-swap the LLM configuration. Creates a new adapter for the\n * updated provider/model.\n */\n updateConfig(config: LLMConfig): void {\n this._config = config;\n this._adapter = this.createAdapter(config);\n this.log(`Config updated: provider=${config.provider}`);\n }\n\n /** Get the current provider adapter. */\n get adapter(): LLMProviderAdapter {\n return this._adapter;\n }\n\n // -----------------------------------------------------------------------\n // Internal helpers\n // -----------------------------------------------------------------------\n\n /**\n * Execute a streaming LLM request and collect the results.\n */\n private async executeStream(\n params: {\n systemPrompt: string;\n history: ConversationTurn[];\n userMessage: string;\n tools?: ToolDefinition[];\n signal?: AbortSignal;\n },\n _isRetry: boolean,\n ): Promise<{\n text: string;\n toolCalls: ToolCall[];\n usage: TokenUsage;\n }> {\n // Currently only Gemini is supported.\n const geminiAdapter = this._adapter as GeminiAdapter;\n\n // Format conversation: history + the new user message.\n const historyContents = geminiAdapter.formatConversation(params.history);\n const contents = [\n ...historyContents,\n { role: 'user', parts: [{ text: params.userMessage }] },\n ];\n\n // Format tools if provided.\n const tools =\n params.tools && params.tools.length > 0\n ? geminiAdapter.formatTools(params.tools)\n : undefined;\n\n // Execute the streaming request.\n const { stream } = await geminiAdapter.streamRequest({\n systemPrompt: params.systemPrompt,\n contents,\n tools,\n signal: params.signal,\n });\n\n // Parse the stream and accumulate results.\n let fullText = '';\n const toolCalls: ToolCall[] = [];\n let usage: TokenUsage = emptyUsage();\n let wasContentFiltered = false;\n\n // We need to parse the SSE stream and also extract usage metadata.\n // The adapter's `parseResponse` yields text/tool chunks, but we also\n // need to inspect the raw JSON for usage and content filter info.\n // So we do our own SSE parsing here for the orchestrator layer.\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('data:')) continue;\n\n const jsonStr = trimmed.slice(5).trim();\n if (jsonStr === '' || jsonStr === '[DONE]') continue;\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(jsonStr) as Record<string, unknown>;\n } catch {\n continue;\n }\n\n // Check for content filtering.\n if (geminiAdapter.isContentFiltered(parsed)) {\n wasContentFiltered = true;\n break;\n }\n\n // Extract token usage (usually in the last chunk).\n const chunkUsage = geminiAdapter.extractUsage(parsed);\n if (chunkUsage) {\n usage = chunkUsage;\n }\n\n // Extract text and tool call chunks.\n const candidates = parsed.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n\n if (!candidates || candidates.length === 0) continue;\n\n for (const candidate of candidates) {\n const content = candidate.content as\n | { parts?: Array<Record<string, unknown>> }\n | undefined;\n\n if (!content?.parts) continue;\n\n const finishReason = candidate.finishReason as\n | string\n | undefined;\n const isDone =\n finishReason === 'STOP' ||\n finishReason === 'MAX_TOKENS';\n\n for (const part of content.parts) {\n // Handle text chunks.\n if (typeof part.text === 'string') {\n fullText += part.text;\n const chunk: TextChunk = { text: part.text, done: isDone };\n this.callbacks.onChunk?.(chunk);\n }\n\n // Handle function calls.\n if (part.functionCall) {\n const fc = part.functionCall as {\n name: string;\n args?: Record<string, unknown>;\n };\n const toolCall: ToolCall = {\n id: fc.name,\n name: fc.name,\n arguments: fc.args ?? {},\n };\n toolCalls.push(toolCall);\n this.callbacks.onToolCall?.(toolCall);\n }\n }\n }\n }\n\n if (wasContentFiltered) break;\n }\n\n // Process any remaining buffer.\n if (!wasContentFiltered && buffer.trim().startsWith('data:')) {\n const jsonStr = buffer.trim().slice(5).trim();\n if (jsonStr !== '' && jsonStr !== '[DONE]') {\n try {\n const parsed = JSON.parse(jsonStr) as Record<string, unknown>;\n if (geminiAdapter.isContentFiltered(parsed)) {\n wasContentFiltered = true;\n } else {\n const chunkUsage = geminiAdapter.extractUsage(parsed);\n if (chunkUsage) usage = chunkUsage;\n\n const candidates = parsed.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n\n if (candidates) {\n for (const candidate of candidates) {\n const content = candidate.content as\n | { parts?: Array<Record<string, unknown>> }\n | undefined;\n\n if (!content?.parts) continue;\n\n const finishReason = candidate.finishReason as\n | string\n | undefined;\n const isDone =\n finishReason === 'STOP' ||\n finishReason === 'MAX_TOKENS';\n\n for (const part of content.parts) {\n if (typeof part.text === 'string') {\n fullText += part.text;\n const chunk: TextChunk = {\n text: part.text,\n done: isDone,\n };\n this.callbacks.onChunk?.(chunk);\n }\n\n if (part.functionCall) {\n const fc = part.functionCall as {\n name: string;\n args?: Record<string, unknown>;\n };\n const toolCall: ToolCall = {\n id: fc.name,\n name: fc.name,\n arguments: fc.args ?? {},\n };\n toolCalls.push(toolCall);\n this.callbacks.onToolCall?.(toolCall);\n }\n }\n }\n }\n }\n } catch {\n // Ignore trailing malformed data.\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (wasContentFiltered) {\n throw new ContentFilterError({\n code: ErrorCodes.CONTENT_FILTER_TRIGGERED,\n message: 'Response was blocked by Gemini content safety filter.',\n provider: 'gemini',\n suggestion: 'Rephrase your question or adjust safety settings.',\n });\n }\n\n // Emit a final \"done\" chunk if we haven't already.\n if (fullText.length > 0) {\n this.callbacks.onChunk?.({ text: '', done: true });\n }\n\n // Report token usage.\n if (usage.total > 0) {\n this.callbacks.onTokenUsage?.(usage);\n }\n\n this.log(\n `Response complete: ${fullText.length} chars, ` +\n `${toolCalls.length} tool calls, ` +\n `${usage.total} tokens`,\n );\n\n return { text: fullText, toolCalls, usage };\n }\n\n /**\n * Create the appropriate adapter for the given config.\n * Currently only Gemini is implemented; other providers will be added\n * as the SDK evolves.\n */\n private createAdapter(config: LLMConfig): LLMProviderAdapter {\n switch (config.provider) {\n case 'gemini':\n return new GeminiAdapter(config);\n case 'openai':\n return new OpenAIAdapter(config);\n default:\n throw new Error(\n `LLM provider \"${(config as LLMConfig).provider}\" is not yet supported. ` +\n 'Currently only \"gemini\" and \"openai\" are implemented.',\n );\n }\n }\n\n /** Convenience accessor for the current provider name. */\n private get providerName(): 'gemini' | 'openai' | undefined {\n if (this._config.provider === 'gemini') return 'gemini';\n if (this._config.provider === 'openai') return 'openai';\n return undefined;\n }\n\n /** Log a debug message if debug mode is enabled. */\n private log(message: string): void {\n if (this.debug) {\n console.debug(`[GuideKit:LLM] ${message}`);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Multi-Turn Tool Executor\n// ---------------------------------------------------------------------------\n//\n// Implements a multi-turn tool execution loop that sits between the\n// LLMOrchestrator and callers. When the LLM returns tool calls, this\n// executor runs them, feeds results back, and repeats until the LLM\n// produces a text-only response or the round limit is reached.\n// ---------------------------------------------------------------------------\n\nimport type {\n ToolDefinition,\n ToolCall,\n ConversationTurn,\n} from '../types/index.js';\nimport type { LLMOrchestrator } from './index.js';\n\n// ---------------------------------------------------------------------------\n// Public interfaces\n// ---------------------------------------------------------------------------\n\n/**\n * A registered handler for a specific tool. The `name` must match the tool\n * definition's `name` field exactly.\n */\nexport interface ToolHandler {\n name: string;\n execute: (args: Record<string, unknown>) => Promise<unknown>;\n}\n\n/** Options for configuring the ToolExecutor. */\nexport interface ToolExecutorOptions {\n /** Max number of tool call rounds before forcing text response. Default: 5 */\n maxRounds?: number;\n /** Enable debug logging. */\n debug?: boolean;\n /** Called when a tool is about to be executed. */\n onToolCall?: (name: string, args: Record<string, unknown>) => void;\n /** Called when a tool execution completes. */\n onToolResult?: (name: string, result: unknown, durationMs: number) => void;\n /** Called when a tool execution fails. */\n onToolError?: (name: string, error: Error) => void;\n}\n\n/** A single executed tool call with its outcome. */\nexport interface ToolCallRecord {\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n durationMs: number;\n error?: string;\n}\n\n/** Aggregated token usage across all rounds. */\nexport interface AggregatedUsage {\n prompt: number;\n completion: number;\n total: number;\n}\n\n/** The complete result of a multi-turn tool execution session. */\nexport interface ToolExecutionResult {\n /** The final text response from the LLM. */\n text: string;\n /** All tool calls that were executed across every round. */\n toolCallsExecuted: ToolCallRecord[];\n /** Accumulated token usage across all LLM calls. */\n totalUsage: AggregatedUsage;\n /** Number of LLM round-trips performed. */\n rounds: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal types for tool-augmented conversation turns\n// ---------------------------------------------------------------------------\n\n/**\n * Internally, the tool executor needs richer turn types than the public\n * `ConversationTurn` (which only supports 'user' | 'assistant'). These\n * extended types carry tool call metadata and tool results so that each\n * LLM provider adapter can format them correctly.\n */\ninterface AssistantToolCallTurn {\n role: 'assistant';\n content: string;\n toolCalls: Array<{ id: string; name: string; args: Record<string, unknown> }>;\n timestamp: number;\n}\n\ninterface ToolResultTurn {\n role: 'tool';\n content: string;\n toolCallId: string;\n toolName: string;\n timestamp: number;\n}\n\n/**\n * A conversation turn that may be a standard turn, an assistant turn\n * with tool calls, or a tool result turn.\n */\ntype InternalTurn = ConversationTurn | AssistantToolCallTurn | ToolResultTurn;\n\n// ---------------------------------------------------------------------------\n// ToolExecutor\n// ---------------------------------------------------------------------------\n\n/**\n * Manages multi-turn LLM interactions involving tool calls.\n *\n * Flow:\n * 1. Send the user message to the LLM along with available tool definitions.\n * 2. If the LLM response includes tool calls, execute them in parallel.\n * 3. Feed tool results back to the LLM as additional conversation context.\n * 4. Repeat until the LLM produces a text-only response or `maxRounds`\n * is exceeded.\n */\nexport class ToolExecutor {\n private readonly maxRounds: number;\n private readonly debugEnabled: boolean;\n private readonly handlers = new Map<string, ToolHandler>();\n\n // Callbacks\n private readonly onToolCallCb?: (name: string, args: Record<string, unknown>) => void;\n private readonly onToolResultCb?: (name: string, result: unknown, durationMs: number) => void;\n private readonly onToolErrorCb?: (name: string, error: Error) => void;\n\n constructor(options?: ToolExecutorOptions) {\n this.maxRounds = options?.maxRounds ?? 5;\n this.debugEnabled = options?.debug ?? false;\n this.onToolCallCb = options?.onToolCall;\n this.onToolResultCb = options?.onToolResult;\n this.onToolErrorCb = options?.onToolError;\n }\n\n // -----------------------------------------------------------------------\n // Tool registration\n // -----------------------------------------------------------------------\n\n /** Register a tool handler. Overwrites any existing handler with the same name. */\n registerTool(handler: ToolHandler): void {\n this.handlers.set(handler.name, handler);\n this.log(`Registered tool: ${handler.name}`);\n }\n\n /** Unregister a tool by name. No-op if the tool is not registered. */\n unregisterTool(name: string): void {\n const deleted = this.handlers.delete(name);\n if (deleted) {\n this.log(`Unregistered tool: ${name}`);\n }\n }\n\n /** Check whether a tool handler is registered. */\n hasTool(name: string): boolean {\n return this.handlers.has(name);\n }\n\n /**\n * Build `ToolDefinition[]` from all registered handlers.\n *\n * Since `ToolHandler` only carries `name` and `execute`, the returned\n * definitions have empty descriptions and parameters. Callers that need\n * richer definitions should maintain their own `ToolDefinition[]` and\n * pass them directly to `executeWithTools`.\n */\n getToolDefinitions(): ToolDefinition[] {\n const definitions: ToolDefinition[] = [];\n for (const handler of this.handlers.values()) {\n definitions.push({\n name: handler.name,\n description: '',\n parameters: {},\n schemaVersion: 1,\n });\n }\n return definitions;\n }\n\n // -----------------------------------------------------------------------\n // Multi-turn execution loop\n // -----------------------------------------------------------------------\n\n /**\n * Execute a multi-turn conversation with tool calls.\n *\n * The method sends the initial user message to the LLM. If the LLM\n * responds with tool calls, each call is executed in parallel, the\n * results are appended to the conversation, and the updated context\n * is sent back to the LLM. This loop repeats until:\n *\n * - The LLM returns a text-only response (no tool calls), or\n * - `maxRounds` consecutive tool-calling rounds have been exhausted.\n *\n * When `maxRounds` is exceeded the executor returns whatever text the\n * LLM has produced so far (which may be empty).\n */\n async executeWithTools(params: {\n llm: LLMOrchestrator;\n systemPrompt: string;\n history: ConversationTurn[];\n userMessage: string;\n tools: ToolDefinition[];\n signal?: AbortSignal;\n }): Promise<ToolExecutionResult> {\n const { llm, systemPrompt, userMessage, tools, signal } = params;\n\n // Accumulate results across rounds.\n const allToolCalls: ToolCallRecord[] = [];\n const totalUsage: AggregatedUsage = { prompt: 0, completion: 0, total: 0 };\n let rounds = 0;\n let finalText = '';\n\n // Build the running conversation. We start with the caller-supplied\n // history and progressively append assistant / tool turns as the\n // loop executes. The initial history uses the standard ConversationTurn\n // type; tool-related turns use our internal extended types.\n const internalHistory: InternalTurn[] = [...params.history];\n\n // The user message for the *first* round. On subsequent rounds the\n // LLM is called with an empty user message because the new context\n // is conveyed through the tool result turns appended to the history.\n let currentUserMessage = userMessage;\n\n while (rounds < this.maxRounds) {\n // Check for abort before each round.\n if (signal?.aborted) {\n this.log('Aborted before round ' + (rounds + 1));\n break;\n }\n\n rounds++;\n this.log(`--- Round ${rounds} ---`);\n\n // Convert internal history to standard ConversationTurn[] for the\n // LLMOrchestrator, which only understands 'user' | 'assistant' roles.\n const llmHistory = this.flattenHistory(internalHistory);\n\n // Send to LLM.\n const response = await llm.sendMessage({\n systemPrompt,\n history: llmHistory,\n userMessage: currentUserMessage,\n tools,\n signal,\n });\n\n // Accumulate token usage.\n totalUsage.prompt += response.usage.prompt;\n totalUsage.completion += response.usage.completion;\n totalUsage.total += response.usage.total;\n\n // Capture any text the LLM produced alongside tool calls.\n if (response.text) {\n finalText = response.text;\n }\n\n // If there are no tool calls, we are done.\n if (response.toolCalls.length === 0) {\n this.log(`Round ${rounds}: text-only response, finishing loop`);\n break;\n }\n\n this.log(\n `Round ${rounds}: ${response.toolCalls.length} tool call(s) received`,\n );\n\n // Record the assistant turn with its tool calls.\n const assistantTurn: AssistantToolCallTurn = {\n role: 'assistant',\n content: response.text,\n toolCalls: response.toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.arguments,\n })),\n timestamp: Date.now(),\n };\n internalHistory.push(assistantTurn);\n\n // Execute all tool calls from this round in parallel.\n const toolResults = await this.executeToolCallsInParallel(\n response.toolCalls,\n signal,\n );\n\n // Append each tool result as a separate turn and record it.\n for (const tr of toolResults) {\n allToolCalls.push(tr.record);\n\n const resultTurn: ToolResultTurn = {\n role: 'tool',\n content: JSON.stringify(\n tr.record.error != null\n ? { error: tr.record.error }\n : tr.record.result,\n ),\n toolCallId: tr.toolCallId,\n toolName: tr.record.name,\n timestamp: Date.now(),\n };\n internalHistory.push(resultTurn);\n }\n\n // On subsequent rounds the new context is carried by the tool\n // result turns, so we send an empty user message.\n currentUserMessage = '';\n\n // Check abort again before looping.\n if (signal?.aborted) {\n this.log('Aborted after tool execution in round ' + rounds);\n break;\n }\n }\n\n if (rounds >= this.maxRounds && allToolCalls.length > 0) {\n this.log(\n `Max rounds (${this.maxRounds}) reached. Returning current text.`,\n );\n }\n\n this.log(\n `Execution complete: ${rounds} round(s), ` +\n `${allToolCalls.length} tool call(s), ` +\n `${totalUsage.total} total tokens`,\n );\n\n return {\n text: finalText,\n toolCallsExecuted: allToolCalls,\n totalUsage,\n rounds,\n };\n }\n\n // -----------------------------------------------------------------------\n // Private: execute a single tool call\n // -----------------------------------------------------------------------\n\n /**\n * Execute a single tool call by looking up the registered handler and\n * invoking it. Returns the result, any error message, and the wall-clock\n * duration in milliseconds.\n */\n private async executeTool(\n toolCall: ToolCall,\n ): Promise<{ result: unknown; error?: string; durationMs: number }> {\n const handler = this.handlers.get(toolCall.name);\n\n if (!handler) {\n const errorMsg = `Unknown tool: ${toolCall.name}`;\n this.log(errorMsg);\n return { result: undefined, error: errorMsg, durationMs: 0 };\n }\n\n this.onToolCallCb?.(toolCall.name, toolCall.arguments);\n\n const startTime = performance.now();\n\n try {\n const result = await handler.execute(toolCall.arguments);\n const durationMs = Math.round(performance.now() - startTime);\n\n this.onToolResultCb?.(toolCall.name, result, durationMs);\n this.log(\n `Tool \"${toolCall.name}\" completed in ${durationMs}ms`,\n );\n\n return { result, durationMs };\n } catch (err: unknown) {\n const durationMs = Math.round(performance.now() - startTime);\n const error = err instanceof Error ? err : new Error(String(err));\n\n this.onToolErrorCb?.(toolCall.name, error);\n this.log(\n `Tool \"${toolCall.name}\" failed after ${durationMs}ms: ${error.message}`,\n );\n\n return { result: undefined, error: error.message, durationMs };\n }\n }\n\n // -----------------------------------------------------------------------\n // Private: execute tool calls in parallel\n // -----------------------------------------------------------------------\n\n /**\n * Execute an array of tool calls concurrently. If the abort signal fires\n * mid-execution, already-started calls run to completion but the results\n * of all settled calls are still returned.\n */\n private async executeToolCallsInParallel(\n toolCalls: ToolCall[],\n signal?: AbortSignal,\n ): Promise<\n Array<{\n toolCallId: string;\n record: ToolCallRecord;\n }>\n > {\n // If already aborted, skip execution entirely.\n if (signal?.aborted) {\n return toolCalls.map((tc) => ({\n toolCallId: tc.id,\n record: {\n name: tc.name,\n args: tc.arguments,\n result: undefined,\n durationMs: 0,\n error: 'Execution aborted',\n },\n }));\n }\n\n const settled = await Promise.allSettled(\n toolCalls.map(async (tc) => {\n // Check abort before starting each call. Already-queued microtasks\n // will still run, but this avoids starting new work when possible.\n if (signal?.aborted) {\n return {\n toolCallId: tc.id,\n record: {\n name: tc.name,\n args: tc.arguments,\n result: undefined,\n durationMs: 0,\n error: 'Execution aborted',\n } satisfies ToolCallRecord,\n };\n }\n\n const outcome = await this.executeTool(tc);\n\n return {\n toolCallId: tc.id,\n record: {\n name: tc.name,\n args: tc.arguments,\n result: outcome.result,\n durationMs: outcome.durationMs,\n ...(outcome.error != null ? { error: outcome.error } : {}),\n } satisfies ToolCallRecord,\n };\n }),\n );\n\n // Collect results. Rejected promises are converted to error records.\n return settled.map((s, i) => {\n if (s.status === 'fulfilled') {\n return s.value;\n }\n\n // This branch should be unreachable because executeTool catches all\n // errors, but we handle it defensively.\n const tc = toolCalls[i]!;\n const errorMsg =\n s.reason instanceof Error ? s.reason.message : String(s.reason);\n\n return {\n toolCallId: tc.id,\n record: {\n name: tc.name,\n args: tc.arguments,\n result: undefined,\n durationMs: 0,\n error: errorMsg,\n },\n };\n });\n }\n\n // -----------------------------------------------------------------------\n // Private: flatten internal history for the LLMOrchestrator\n // -----------------------------------------------------------------------\n\n /**\n * Convert the internal turn representation (which includes 'tool' roles\n * and assistant turns with tool call metadata) into the flat\n * `ConversationTurn[]` that `LLMOrchestrator.sendMessage` expects.\n *\n * Strategy:\n * - Standard `ConversationTurn` objects pass through unchanged.\n * - `AssistantToolCallTurn` objects are converted to an assistant turn\n * whose content describes the tool calls that were made.\n * - `ToolResultTurn` objects are converted to user turns that report\n * the tool results so the LLM can incorporate them.\n *\n * This approach works with any LLM provider since it only uses the\n * 'user' | 'assistant' role discriminator.\n */\n private flattenHistory(turns: InternalTurn[]): ConversationTurn[] {\n const flat: ConversationTurn[] = [];\n\n for (const turn of turns) {\n if (this.isToolResultTurn(turn)) {\n // Encode tool results as user turns so the LLM sees them as\n // new information to process.\n flat.push({\n role: 'user',\n content: `[Tool result for \"${turn.toolName}\" (id: ${turn.toolCallId})]: ${turn.content}`,\n timestamp: turn.timestamp,\n });\n } else if (this.isAssistantToolCallTurn(turn)) {\n // Encode the assistant's tool call request as an assistant turn.\n const callDescriptions = turn.toolCalls\n .map(\n (tc) =>\n `[Calling tool \"${tc.name}\" (id: ${tc.id}) with args: ${JSON.stringify(tc.args)}]`,\n )\n .join('\\n');\n\n const content = turn.content\n ? `${turn.content}\\n\\n${callDescriptions}`\n : callDescriptions;\n\n flat.push({\n role: 'assistant',\n content,\n timestamp: turn.timestamp,\n });\n } else {\n // Standard ConversationTurn — pass through.\n flat.push(turn);\n }\n }\n\n return flat;\n }\n\n // -----------------------------------------------------------------------\n // Type guards\n // -----------------------------------------------------------------------\n\n private isToolResultTurn(turn: InternalTurn): turn is ToolResultTurn {\n return (turn as ToolResultTurn).role === 'tool';\n }\n\n private isAssistantToolCallTurn(\n turn: InternalTurn,\n ): turn is AssistantToolCallTurn {\n return (\n turn.role === 'assistant' &&\n Array.isArray((turn as AssistantToolCallTurn).toolCalls)\n );\n }\n\n // -----------------------------------------------------------------------\n // Debug logging\n // -----------------------------------------------------------------------\n\n private log(message: string): void {\n if (this.debugEnabled) {\n console.debug(`[GuideKit:ToolExecutor] ${message}`);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Network Connectivity Manager\n// ---------------------------------------------------------------------------\n\nimport type { ConnectionState } from '../types/index.js';\n\nconst LOG_PREFIX = '[GuideKit:Connectivity]';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Maximum number of messages held in the offline queue. */\nconst MAX_QUEUE_SIZE = 5;\n\n/** Number of recent pings used to compute rolling average latency. */\nconst ROLLING_WINDOW = 3;\n\n/** Latency threshold (ms) above which the connection is considered degraded. */\nconst DEGRADED_THRESHOLD_MS = 2_000;\n\n/** Ping intervals per state (ms). */\nconst PING_INTERVALS: Record<ConnectionState, number> = {\n online: 30_000,\n degraded: 5_000,\n offline: 10_000,\n};\n\n/** Timeout applied to each health-check fetch (ms). */\nconst PING_TIMEOUT_MS = 5_000;\n\n// ---------------------------------------------------------------------------\n// QueuedMessage\n// ---------------------------------------------------------------------------\n\n/** A message held for replay once connectivity is restored. */\nexport interface QueuedMessage {\n content: string;\n timestamp: number;\n pageUrl: string;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ConnectionManagerOptions {\n /** Server endpoint for lightweight health-check pings. */\n healthEndpoint?: string;\n /** When `true`, diagnostic messages are logged to the console. */\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// State-change subscriber\n// ---------------------------------------------------------------------------\n\ntype StateChangeCallback = (\n state: ConnectionState,\n previous: ConnectionState,\n) => void;\n\n// ---------------------------------------------------------------------------\n// ConnectionManager\n// ---------------------------------------------------------------------------\n\n/**\n * Monitors network connectivity and exposes a reactive {@link ConnectionState}.\n *\n * Strategy:\n * 1. Listen to `window.online` / `window.offline` events (coarse signal).\n * 2. Periodically ping the configured `healthEndpoint` (fine-grained signal).\n * 3. Compute a rolling average of the last {@link ROLLING_WINDOW} ping\n * latencies to detect degraded connections (> {@link DEGRADED_THRESHOLD_MS}).\n * 4. When fully offline (`navigator.onLine === false`), suspend pinging and\n * wait for the browser's `online` event before resuming.\n *\n * All browser APIs are gated behind `typeof window !== 'undefined'` so the\n * class can be safely imported (though not meaningfully used) in SSR contexts.\n */\nexport class ConnectionManager {\n // ---- Configuration ------------------------------------------------------\n\n private readonly healthEndpoint: string | undefined;\n private readonly debugEnabled: boolean;\n\n // ---- Internal state -----------------------------------------------------\n\n private _state: ConnectionState = 'online';\n private _running = false;\n\n /** Rolling window of recent ping latencies (ms). */\n private readonly pingLatencies: number[] = [];\n\n /** Queued messages awaiting replay on reconnect. */\n private readonly messageQueue: QueuedMessage[] = [];\n\n /** Registered state-change subscribers. */\n private readonly subscribers: Set<StateChangeCallback> = new Set();\n\n /** Timer handle for the periodic ping loop. */\n private pingTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Bound event handlers (stored for deterministic removal). */\n private readonly handleOnline: () => void;\n private readonly handleOffline: () => void;\n\n // -----------------------------------------------------------------------\n // Constructor\n // -----------------------------------------------------------------------\n\n constructor(options?: ConnectionManagerOptions) {\n this.healthEndpoint = options?.healthEndpoint;\n this.debugEnabled = options?.debug ?? false;\n\n // Pre-bind handlers so we can add/remove the exact same references.\n this.handleOnline = this.onBrowserOnline.bind(this);\n this.handleOffline = this.onBrowserOffline.bind(this);\n\n this.log('ConnectionManager created');\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /** Current connection state. */\n get state(): ConnectionState {\n return this._state;\n }\n\n /**\n * Start monitoring connectivity.\n *\n * Attaches browser event listeners and begins the periodic ping loop.\n * Calling `start()` when already running is a no-op.\n */\n start(): void {\n if (this._running) {\n return;\n }\n\n this._running = true;\n this.log('Monitoring started');\n\n if (typeof window !== 'undefined') {\n window.addEventListener('online', this.handleOnline);\n window.addEventListener('offline', this.handleOffline);\n\n // Seed initial state from the browser.\n if (!navigator.onLine) {\n this.transition('offline');\n }\n }\n\n this.schedulePing();\n }\n\n /**\n * Stop monitoring connectivity.\n *\n * Removes all event listeners, clears timers, and resets internal state.\n */\n stop(): void {\n if (!this._running) {\n return;\n }\n\n this._running = false;\n this.log('Monitoring stopped');\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('online', this.handleOnline);\n window.removeEventListener('offline', this.handleOffline);\n }\n\n this.clearPingTimer();\n this.pingLatencies.length = 0;\n }\n\n /**\n * Subscribe to connection state changes.\n *\n * @returns An unsubscribe function. Calling it more than once is safe.\n */\n onStateChange(callback: StateChangeCallback): () => void {\n this.subscribers.add(callback);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Queue a message for replay once the connection is restored.\n *\n * The queue is capped at {@link MAX_QUEUE_SIZE} messages. When the cap is\n * exceeded the oldest message is discarded.\n */\n queueMessage(message: QueuedMessage): void {\n if (this.messageQueue.length >= MAX_QUEUE_SIZE) {\n const discarded = this.messageQueue.shift();\n this.log('Queue full — discarded oldest message', discarded);\n }\n\n this.messageQueue.push(message);\n this.log(`Message queued (${this.messageQueue.length}/${MAX_QUEUE_SIZE})`);\n }\n\n /**\n * Drain the message queue and return its contents.\n *\n * Messages whose `pageUrl` no longer matches the current browser URL are\n * silently discarded (the user has navigated away since queueing).\n */\n drainQueue(): QueuedMessage[] {\n const currentUrl = this.getCurrentUrl();\n const valid: QueuedMessage[] = [];\n\n for (const msg of this.messageQueue) {\n if (msg.pageUrl === currentUrl) {\n valid.push(msg);\n } else {\n this.log('Discarded stale message (URL changed)', msg.pageUrl);\n }\n }\n\n this.messageQueue.length = 0;\n this.log(`Drained ${valid.length} message(s)`);\n return valid;\n }\n\n /**\n * Force an immediate connectivity check.\n *\n * @returns The updated {@link ConnectionState} after the check completes.\n */\n async checkNow(): Promise<ConnectionState> {\n // If the browser reports offline, skip the network request entirely.\n if (typeof window !== 'undefined' && !navigator.onLine) {\n this.transition('offline');\n return this._state;\n }\n\n await this.ping();\n return this._state;\n }\n\n // -----------------------------------------------------------------------\n // Browser event handlers\n // -----------------------------------------------------------------------\n\n private onBrowserOnline(): void {\n this.log('Browser \"online\" event received');\n\n // Reset latency history — the previous measurements are stale.\n this.pingLatencies.length = 0;\n\n // Optimistically assume online; the next ping will refine the state.\n this.transition('online');\n\n // Resume pinging if we are still in monitoring mode.\n if (this._running) {\n this.schedulePing();\n }\n }\n\n private onBrowserOffline(): void {\n this.log('Browser \"offline\" event received');\n this.transition('offline');\n\n // Suspend pinging — no point hitting the network when the browser\n // itself says we are offline. We will resume via `handleOnline`.\n this.clearPingTimer();\n }\n\n // -----------------------------------------------------------------------\n // Ping logic\n // -----------------------------------------------------------------------\n\n /**\n * Execute a single health-check ping and update state accordingly.\n */\n private async ping(): Promise<void> {\n if (!this.healthEndpoint) {\n // Without an endpoint we can only rely on navigator.onLine.\n if (typeof window !== 'undefined') {\n this.transition(navigator.onLine ? 'online' : 'offline');\n }\n return;\n }\n\n const start = Date.now();\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), PING_TIMEOUT_MS);\n\n try {\n await fetch(this.healthEndpoint, {\n method: 'HEAD',\n mode: 'no-cors',\n cache: 'no-store',\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeout);\n }\n\n const latency = Date.now() - start;\n this.recordLatency(latency);\n this.log(`Ping OK (${latency}ms)`);\n\n // Evaluate rolling average to decide between online / degraded.\n const avg = this.rollingAverage();\n if (avg > DEGRADED_THRESHOLD_MS) {\n this.transition('degraded');\n } else {\n this.transition('online');\n }\n } catch {\n this.log('Ping failed');\n\n // A failed ping when navigator reports offline is a clear offline.\n if (typeof window !== 'undefined' && !navigator.onLine) {\n this.transition('offline');\n } else {\n // Network may still be up, but the endpoint is unreachable —\n // treat as degraded rather than outright offline.\n this.transition('degraded');\n }\n }\n }\n\n /**\n * Record a latency sample, keeping only the last {@link ROLLING_WINDOW}\n * entries.\n */\n private recordLatency(ms: number): void {\n this.pingLatencies.push(ms);\n if (this.pingLatencies.length > ROLLING_WINDOW) {\n this.pingLatencies.shift();\n }\n }\n\n /** Compute the arithmetic mean of recorded latencies. */\n private rollingAverage(): number {\n if (this.pingLatencies.length === 0) return 0;\n\n let sum = 0;\n for (const v of this.pingLatencies) {\n sum += v;\n }\n return sum / this.pingLatencies.length;\n }\n\n // -----------------------------------------------------------------------\n // Ping scheduling\n // -----------------------------------------------------------------------\n\n /**\n * Schedule the next ping according to the current state's interval.\n *\n * When in the `offline` state, pinging is suspended entirely — the\n * manager waits for the browser's `online` event to resume.\n */\n private schedulePing(): void {\n this.clearPingTimer();\n\n if (!this._running) {\n return;\n }\n\n // While offline, do not ping. The browser `online` event will resume.\n if (this._state === 'offline') {\n return;\n }\n\n const interval = PING_INTERVALS[this._state];\n\n this.pingTimer = setTimeout(async () => {\n if (!this._running) return;\n\n await this.ping();\n\n // Schedule the next iteration (interval may have changed due to\n // a state transition during the ping).\n this.schedulePing();\n }, interval);\n }\n\n private clearPingTimer(): void {\n if (this.pingTimer !== null) {\n clearTimeout(this.pingTimer);\n this.pingTimer = null;\n }\n }\n\n // -----------------------------------------------------------------------\n // State transitions\n // -----------------------------------------------------------------------\n\n /**\n * Transition to a new state, notifying subscribers if the state actually\n * changed.\n */\n private transition(next: ConnectionState): void {\n const previous = this._state;\n if (previous === next) {\n return;\n }\n\n this._state = next;\n this.log(`State: ${previous} -> ${next}`);\n\n // Notify subscribers. Errors in callbacks are caught so one bad\n // subscriber does not prevent the rest from being notified.\n for (const cb of this.subscribers) {\n try {\n cb(next, previous);\n } catch (err) {\n console.error(LOG_PREFIX, 'Subscriber threw an error:', err);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Helpers\n // -----------------------------------------------------------------------\n\n /** Return the current page URL, or an empty string in SSR contexts. */\n private getCurrentUrl(): string {\n if (typeof window !== 'undefined') {\n return window.location.href;\n }\n return '';\n }\n\n /** Conditional debug logging. */\n private log(...args: unknown[]): void {\n if (this.debugEnabled) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Navigation Controller\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Nav]';\n\nexport interface NavigationControllerOptions {\n debug?: boolean;\n /** Developer-provided router for guaranteed SPA navigation. */\n router?: {\n push: (href: string) => void | Promise<void>;\n };\n}\n\n/**\n * Manages SPA navigation detection and programmatic routing.\n *\n * - Prefers the Navigation API (Chrome 102+) where available.\n * - Falls back to `popstate` + periodic URL polling (200ms).\n * - Developer can pass a `router` prop for guaranteed SPA nav.\n */\nexport class NavigationController {\n private readonly debug: boolean;\n private readonly router?: { push: (href: string) => void | Promise<void> };\n\n private currentUrl: string = '';\n private pollingTimer: ReturnType<typeof setInterval> | null = null;\n private callbacks: Array<(from: string, to: string) => void> = [];\n private cleanups: Array<() => void> = [];\n\n constructor(options?: NavigationControllerOptions) {\n this.debug = options?.debug ?? false;\n this.router = options?.router;\n }\n\n /** Start listening for navigation events. */\n start(): void {\n if (typeof window === 'undefined') return;\n\n this.currentUrl = window.location.href;\n\n // Prefer Navigation API\n if ('navigation' in window && typeof (window as any).navigation?.addEventListener === 'function') {\n const nav = (window as any).navigation;\n const handler = (event: any) => {\n const to = event.destination?.url ?? window.location.href;\n this.handleRouteChange(to);\n };\n nav.addEventListener('navigate', handler);\n this.cleanups.push(() => nav.removeEventListener('navigate', handler));\n\n if (this.debug) console.debug(LOG_PREFIX, 'Using Navigation API');\n } else {\n // Fallback: popstate + polling\n const popHandler = () => {\n this.handleRouteChange(window.location.href);\n };\n window.addEventListener('popstate', popHandler);\n this.cleanups.push(() => window.removeEventListener('popstate', popHandler));\n\n // Poll every 200ms for pushState changes\n this.pollingTimer = setInterval(() => {\n if (window.location.href !== this.currentUrl) {\n this.handleRouteChange(window.location.href);\n }\n }, 200);\n\n if (this.debug) console.debug(LOG_PREFIX, 'Using popstate + URL polling fallback');\n }\n }\n\n /** Stop listening for navigation events. */\n stop(): void {\n for (const cleanup of this.cleanups) {\n cleanup();\n }\n this.cleanups = [];\n\n if (this.pollingTimer !== null) {\n clearInterval(this.pollingTimer);\n this.pollingTimer = null;\n }\n }\n\n /**\n * Subscribe to route changes.\n * @returns Unsubscribe function.\n */\n onRouteChange(callback: (from: string, to: string) => void): () => void {\n this.callbacks.push(callback);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const idx = this.callbacks.indexOf(callback);\n if (idx !== -1) this.callbacks.splice(idx, 1);\n };\n }\n\n /**\n * Programmatically navigate to a URL.\n * Validates same-origin before navigating.\n */\n async navigate(href: string): Promise<boolean> {\n if (typeof window === 'undefined') return false;\n\n // Same-origin validation\n try {\n const target = new URL(href, window.location.origin);\n if (target.origin !== window.location.origin) {\n if (this.debug) console.warn(LOG_PREFIX, 'Blocked cross-origin navigation to', href);\n return false;\n }\n href = target.href;\n } catch {\n if (this.debug) console.warn(LOG_PREFIX, 'Invalid URL:', href);\n return false;\n }\n\n // Use developer-provided router if available\n if (this.router) {\n await this.router.push(href);\n return true;\n }\n\n // Fallback: update location\n window.location.href = href;\n return true;\n }\n\n /** Get the current URL. */\n get url(): string {\n if (typeof window === 'undefined') return '';\n return window.location.href;\n }\n\n private handleRouteChange(newUrl: string): void {\n if (newUrl === this.currentUrl) return;\n\n const from = this.currentUrl;\n this.currentUrl = newUrl;\n\n if (this.debug) console.debug(LOG_PREFIX, `Route change: ${from} → ${newUrl}`);\n\n for (const callback of this.callbacks.slice()) {\n try {\n callback(from, newUrl);\n } catch (err) {\n console.error(LOG_PREFIX, 'Route change handler error:', err);\n }\n }\n }\n}\n","// ----------------------------------------------------------------------------\n// WebSocket Connection Manager for STT/TTS\n// Manages WebSocket connections with automatic reconnection, exponential\n// backoff, send queueing, and SSR safety.\n// ----------------------------------------------------------------------------\n\nexport type WSState =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'reconnecting'\n | 'failed'\n | 'suspended';\n\nexport interface WebSocketManagerOptions {\n url: string | (() => string | Promise<string>);\n /** Max reconnection attempts before entering FAILED state. Default: 5 */\n maxReconnectAttempts?: number;\n /** Initial reconnect delay in ms. Default: 1000 */\n initialDelay?: number;\n /** Max reconnect delay in ms. Default: 30000 */\n maxDelay?: number;\n /** Connection timeout in ms. Default: 5000 */\n connectTimeoutMs?: number;\n /** Protocols to pass to WebSocket constructor */\n protocols?: string | string[];\n /** Debug logging */\n debug?: boolean;\n /** Label for logging (e.g., 'STT', 'TTS') */\n label?: string;\n}\n\ntype MessagePayload = string | ArrayBuffer | Blob;\n\nconst DEFAULT_MAX_RECONNECT_ATTEMPTS = 5;\nconst DEFAULT_INITIAL_DELAY = 1000;\nconst DEFAULT_MAX_DELAY = 30_000;\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5000;\nconst MAX_QUEUE_SIZE = 50;\n\ninterface ListenerRefs {\n onOpen: () => void;\n onClose: (e: CloseEvent) => void;\n onError: (e: Event) => void;\n onMessage: (e: MessageEvent) => void;\n}\n\nexport class WebSocketManager {\n // ── Options (resolved with defaults) ────────────────────────────────\n private readonly _url: string | (() => string | Promise<string>);\n private readonly _maxReconnectAttempts: number;\n private readonly _initialDelay: number;\n private readonly _maxDelay: number;\n private readonly _connectTimeoutMs: number;\n private readonly _protocols: string | string[] | undefined;\n private readonly _debug: boolean;\n private readonly _label: string;\n\n // ── Internal state ──────────────────────────────────────────────────\n private _state: WSState = 'disconnected';\n private _socket: WebSocket | null = null;\n private _reconnectAttempts = 0;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _connectTimer: ReturnType<typeof setTimeout> | null = null;\n private _destroyed = false;\n\n // ── Listener references (for proper cleanup) ──────────────────────\n private _listenerRefs = new WeakMap<WebSocket, ListenerRefs>();\n\n // ── Send queue ──────────────────────────────────────────────────────\n private _queue: MessagePayload[] = [];\n\n // ── Event listeners ─────────────────────────────────────────────────\n private _onOpenCallbacks: Set<() => void> = new Set();\n private _onCloseCallbacks: Set<(code: number, reason: string) => void> = new Set();\n private _onMessageCallbacks: Set<(data: MessageEvent) => void> = new Set();\n private _onErrorCallbacks: Set<(error: Event) => void> = new Set();\n private _onStateChangeCallbacks: Set<(state: WSState, previous: WSState) => void> = new Set();\n\n // ── Constructor ─────────────────────────────────────────────────────\n\n constructor(options: WebSocketManagerOptions) {\n this._url = options.url;\n this._maxReconnectAttempts = options.maxReconnectAttempts ?? DEFAULT_MAX_RECONNECT_ATTEMPTS;\n this._initialDelay = options.initialDelay ?? DEFAULT_INITIAL_DELAY;\n this._maxDelay = options.maxDelay ?? DEFAULT_MAX_DELAY;\n this._connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n this._protocols = options.protocols;\n this._debug = options.debug ?? false;\n this._label = options.label ?? 'WS';\n }\n\n // ── Public getters ──────────────────────────────────────────────────\n\n /** Current connection state */\n get state(): WSState {\n return this._state;\n }\n\n /** The underlying WebSocket (null if not connected) */\n get socket(): WebSocket | null {\n return this._socket;\n }\n\n // ── Connection lifecycle ────────────────────────────────────────────\n\n /** Connect to the WebSocket server */\n async connect(): Promise<void> {\n if (this._destroyed) {\n this._log('Cannot connect — manager is destroyed');\n return;\n }\n\n // SSR guard\n if (typeof WebSocket === 'undefined') {\n this._log('WebSocket is not available in this environment');\n return;\n }\n\n // If already connected or connecting, no-op\n if (this._state === 'connected' || this._state === 'connecting') {\n this._log(`Already in state \"${this._state}\", ignoring connect()`);\n return;\n }\n\n // A manual connect() call from FAILED state resets the attempt counter\n if (this._state === 'failed') {\n this._reconnectAttempts = 0;\n }\n\n this._setState('connecting');\n await this._attemptConnection();\n }\n\n /** Gracefully close the connection */\n close(code?: number, reason?: string): void {\n this._log('close() called');\n this._clearTimers();\n this._reconnectAttempts = 0;\n\n if (this._socket) {\n // Remove listeners before closing to prevent the close handler from\n // triggering reconnection logic.\n this._detachSocketListeners(this._socket);\n try {\n this._socket.close(code ?? 1000, reason ?? 'Client closed');\n } catch {\n // Socket may already be closed; ignore.\n }\n this._socket = null;\n }\n\n this._setState('disconnected');\n }\n\n /**\n * Send data through the WebSocket.\n * - If state is `connecting` or `reconnecting`, the message is queued.\n * - If state is `connected`, the message is sent immediately.\n * - If state is `failed` or `suspended`, an error is thrown.\n * - If state is `disconnected`, the message is queued (a reconnect may follow).\n */\n send(data: MessagePayload): void {\n if (this._state === 'failed') {\n throw new Error(\n `[GuideKit:WS:${this._label}] Cannot send — connection is in FAILED state. Call connect() to retry.`,\n );\n }\n\n if (this._state === 'suspended') {\n throw new Error(\n `[GuideKit:WS:${this._label}] Cannot send — connection is SUSPENDED. Call resume() first.`,\n );\n }\n\n if (this._state === 'connected' && this._socket?.readyState === WebSocket.OPEN) {\n this._socket.send(data);\n return;\n }\n\n // Queue the message for later delivery\n this._enqueue(data);\n }\n\n // ── Suspend / Resume ────────────────────────────────────────────────\n\n /** Suspend reconnection (e.g., during confirmed offline). No reconnection attempts. */\n suspend(): void {\n if (this._state === 'failed' || this._state === 'suspended') {\n this._log(`suspend() ignored — already in \"${this._state}\"`);\n return;\n }\n\n this._log('Suspending');\n this._clearTimers();\n\n // If there is an active socket, close it\n if (this._socket) {\n this._detachSocketListeners(this._socket);\n try {\n this._socket.close(1000, 'Suspended');\n } catch {\n // ignore\n }\n this._socket = null;\n }\n\n this._setState('suspended');\n }\n\n /** Resume from suspended state. Triggers reconnection. */\n resume(): void {\n if (this._state !== 'suspended') {\n this._log(`resume() ignored — not in SUSPENDED state (current: \"${this._state}\")`);\n return;\n }\n\n this._log('Resuming');\n this._reconnectAttempts = 0;\n this._setState('reconnecting');\n this._scheduleReconnect();\n }\n\n // ── Event registration ──────────────────────────────────────────────\n\n /** Register an onOpen handler. Returns an unsubscribe function. */\n onOpen(callback: () => void): () => void {\n this._onOpenCallbacks.add(callback);\n return () => {\n this._onOpenCallbacks.delete(callback);\n };\n }\n\n /** Register an onClose handler. Returns an unsubscribe function. */\n onClose(callback: (code: number, reason: string) => void): () => void {\n this._onCloseCallbacks.add(callback);\n return () => {\n this._onCloseCallbacks.delete(callback);\n };\n }\n\n /** Register an onMessage handler. Returns an unsubscribe function. */\n onMessage(callback: (data: MessageEvent) => void): () => void {\n this._onMessageCallbacks.add(callback);\n return () => {\n this._onMessageCallbacks.delete(callback);\n };\n }\n\n /** Register an onError handler. Returns an unsubscribe function. */\n onError(callback: (error: Event) => void): () => void {\n this._onErrorCallbacks.add(callback);\n return () => {\n this._onErrorCallbacks.delete(callback);\n };\n }\n\n /** Register a state change handler. Returns an unsubscribe function. */\n onStateChange(callback: (state: WSState, previous: WSState) => void): () => void {\n this._onStateChangeCallbacks.add(callback);\n return () => {\n this._onStateChangeCallbacks.delete(callback);\n };\n }\n\n // ── Destroy ─────────────────────────────────────────────────────────\n\n /** Destroy the manager and clean up all resources */\n destroy(): void {\n if (this._destroyed) return;\n this._destroyed = true;\n this._log('Destroying');\n\n this.close();\n this._queue = [];\n this._onOpenCallbacks.clear();\n this._onCloseCallbacks.clear();\n this._onMessageCallbacks.clear();\n this._onErrorCallbacks.clear();\n this._onStateChangeCallbacks.clear();\n }\n\n // ── Private: Connection logic ───────────────────────────────────────\n\n private async _resolveUrl(): Promise<string> {\n if (typeof this._url === 'function') {\n return await this._url();\n }\n return this._url;\n }\n\n private async _attemptConnection(): Promise<void> {\n // SSR guard\n if (typeof WebSocket === 'undefined') return;\n\n let url: string;\n try {\n url = await this._resolveUrl();\n } catch (err) {\n this._log(`URL resolution failed: ${err}`);\n this._handleConnectionFailure();\n return;\n }\n\n this._log(`Connecting to ${url}`);\n\n let ws: WebSocket;\n try {\n ws = this._protocols ? new WebSocket(url, this._protocols) : new WebSocket(url);\n } catch (err) {\n this._log(`WebSocket constructor threw: ${err}`);\n this._handleConnectionFailure();\n return;\n }\n\n // Binary type: arraybuffer is generally more useful than blob\n ws.binaryType = 'arraybuffer';\n\n this._socket = ws;\n\n // ── Connection timeout ──────────────────────────────────────────\n this._connectTimer = setTimeout(() => {\n if (ws.readyState === WebSocket.CONNECTING) {\n this._log('Connection timed out');\n // Force-close the socket; the close handler will trigger reconnection.\n ws.close();\n }\n }, this._connectTimeoutMs);\n\n // ── Socket event handlers ───────────────────────────────────────\n const onOpen = () => {\n this._clearConnectTimer();\n this._reconnectAttempts = 0;\n this._setState('connected');\n this._log('Connected');\n\n // Notify listeners\n for (const cb of this._onOpenCallbacks) {\n try {\n cb();\n } catch {\n // Swallow listener errors\n }\n }\n\n // Flush queued messages\n this._flushQueue();\n };\n\n const onClose = (event: CloseEvent) => {\n this._clearConnectTimer();\n this._log(`Socket closed — code=${event.code} reason=\"${event.reason}\"`);\n\n // Notify close listeners\n for (const cb of this._onCloseCallbacks) {\n try {\n cb(event.code, event.reason);\n } catch {\n // Swallow listener errors\n }\n }\n\n // Clean up this socket reference if it is the current one\n if (this._socket === ws) {\n this._socket = null;\n }\n\n // Only attempt reconnection if the manager hasn't been destroyed or\n // intentionally closed (state would be 'disconnected' in that case).\n if (\n !this._destroyed &&\n this._state !== 'disconnected' &&\n this._state !== 'suspended' &&\n this._state !== 'failed'\n ) {\n this._setState('disconnected');\n this._handleConnectionFailure();\n }\n };\n\n const onError = (event: Event) => {\n this._log('Socket error');\n for (const cb of this._onErrorCallbacks) {\n try {\n cb(event);\n } catch {\n // Swallow listener errors\n }\n }\n // The `close` event will follow the `error` event, so reconnection\n // logic is handled there.\n };\n\n const onMessage = (event: MessageEvent) => {\n for (const cb of this._onMessageCallbacks) {\n try {\n cb(event);\n } catch {\n // Swallow listener errors\n }\n }\n };\n\n ws.addEventListener('open', onOpen);\n ws.addEventListener('close', onClose);\n ws.addEventListener('error', onError);\n ws.addEventListener('message', onMessage);\n\n // Store references for later removal\n this._listenerRefs.set(ws, { onOpen, onClose, onError, onMessage });\n }\n\n private _detachSocketListeners(ws: WebSocket): void {\n const listeners = this._listenerRefs.get(ws);\n if (!listeners) return;\n ws.removeEventListener('open', listeners.onOpen);\n ws.removeEventListener('close', listeners.onClose);\n ws.removeEventListener('error', listeners.onError);\n ws.removeEventListener('message', listeners.onMessage);\n this._listenerRefs.delete(ws);\n }\n\n // ── Private: Reconnection ───────────────────────────────────────────\n\n private _handleConnectionFailure(): void {\n if (this._destroyed || this._state === 'suspended') return;\n\n this._reconnectAttempts++;\n\n if (this._reconnectAttempts > this._maxReconnectAttempts) {\n this._log(\n `Max reconnect attempts (${this._maxReconnectAttempts}) reached — entering FAILED state`,\n );\n this._setState('failed');\n return;\n }\n\n this._setState('reconnecting');\n this._scheduleReconnect();\n }\n\n private _scheduleReconnect(): void {\n if (this._destroyed) return;\n\n const delay = this._calculateBackoff(this._reconnectAttempts - 1);\n this._log(`Reconnecting in ${delay}ms (attempt ${this._reconnectAttempts}/${this._maxReconnectAttempts})`);\n\n this._reconnectTimer = setTimeout(async () => {\n this._reconnectTimer = null;\n if (this._destroyed || this._state === 'suspended' || this._state === 'failed') return;\n\n this._setState('connecting');\n await this._attemptConnection();\n }, delay);\n }\n\n /**\n * Exponential backoff with jitter.\n * delay = initialDelay * 2^attempt, capped at maxDelay, with +/-25% jitter.\n */\n private _calculateBackoff(attempt: number): number {\n const exponential = this._initialDelay * Math.pow(2, attempt);\n const capped = Math.min(exponential, this._maxDelay);\n // Jitter: random value between 0.75 and 1.25 of the capped delay\n const jitter = 0.75 + Math.random() * 0.5;\n return Math.round(capped * jitter);\n }\n\n // ── Private: Send queue ─────────────────────────────────────────────\n\n private _enqueue(data: MessagePayload): void {\n if (this._queue.length >= MAX_QUEUE_SIZE) {\n this._log('Send queue full — dropping oldest message');\n this._queue.shift();\n }\n this._queue.push(data);\n }\n\n private _flushQueue(): void {\n if (\n this._queue.length === 0 ||\n !this._socket ||\n this._socket.readyState !== WebSocket.OPEN\n ) {\n return;\n }\n\n this._log(`Flushing ${this._queue.length} queued message(s)`);\n const pending = this._queue.slice();\n this._queue = [];\n\n for (const msg of pending) {\n try {\n this._socket.send(msg);\n } catch (err) {\n this._log(`Failed to send queued message: ${err}`);\n // Re-queue remaining messages on failure\n // The current message is lost but remaining ones are preserved.\n break;\n }\n }\n }\n\n // ── Private: State management ───────────────────────────────────────\n\n private _setState(next: WSState): void {\n const prev = this._state;\n if (prev === next) return;\n\n this._state = next;\n this._log(`State: ${prev} -> ${next}`);\n\n for (const cb of this._onStateChangeCallbacks) {\n try {\n cb(next, prev);\n } catch {\n // Swallow listener errors\n }\n }\n }\n\n // ── Private: Timer management ───────────────────────────────────────\n\n private _clearTimers(): void {\n this._clearConnectTimer();\n this._clearReconnectTimer();\n }\n\n private _clearConnectTimer(): void {\n if (this._connectTimer !== null) {\n clearTimeout(this._connectTimer);\n this._connectTimer = null;\n }\n }\n\n private _clearReconnectTimer(): void {\n if (this._reconnectTimer !== null) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n }\n\n // ── Private: Logging ────────────────────────────────────────────────\n\n private _log(message: string): void {\n if (this._debug) {\n console.log(`[GuideKit:WS:${this._label}] ${message}`);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Deepgram Nova Real-Time Speech-to-Text Adapter\n// ---------------------------------------------------------------------------\n//\n// Streams microphone audio to Deepgram over a WebSocket and emits interim /\n// final transcript events. Designed for browser use; all browser-only APIs are\n// guarded behind `typeof window` checks so the module is safe to import at\n// build time in SSR environments.\n// ---------------------------------------------------------------------------\n\nimport { WebSocketManager } from './websocket-manager.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:STT]';\n\n/** Interval (ms) between KeepAlive messages sent to Deepgram. */\nconst KEEPALIVE_INTERVAL_MS = 10_000;\n\n/** Default Deepgram model. */\nconst DEFAULT_MODEL = 'nova-3';\n\n/** Default language. */\nconst DEFAULT_LANGUAGE = 'en';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface DeepgramSTTOptions {\n apiKey: string;\n model?: 'nova-2' | 'nova-3';\n language?: string;\n debug?: boolean;\n}\n\nexport interface TranscriptEvent {\n text: string;\n isFinal: boolean;\n confidence: number;\n timestamp: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert Float32Array PCM samples (range -1..1) to Int16Array (linear16).\n * Deepgram expects linear16 encoded audio frames.\n */\nfunction float32ToInt16(float32: Float32Array): Int16Array {\n const int16 = new Int16Array(float32.length);\n for (let i = 0; i < float32.length; i++) {\n // Clamp to [-1, 1] then scale to Int16 range.\n const s = Math.max(-1, Math.min(1, float32[i]!));\n int16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n return int16;\n}\n\n// ---------------------------------------------------------------------------\n// DeepgramSTT\n// ---------------------------------------------------------------------------\n\nexport class DeepgramSTT {\n // ---- Configuration ------------------------------------------------------\n\n private readonly apiKey: string;\n private readonly model: 'nova-2' | 'nova-3';\n private readonly language: string;\n private readonly debugEnabled: boolean;\n\n // ---- Internal state -----------------------------------------------------\n\n private wsManager: WebSocketManager | null = null;\n private keepAliveTimer: ReturnType<typeof setInterval> | null = null;\n private _connected = false;\n private _suspended = false;\n\n /** Registered transcript callbacks. */\n private readonly transcriptCallbacks: Set<(event: TranscriptEvent) => void> =\n new Set();\n\n // -----------------------------------------------------------------------\n // Constructor\n // -----------------------------------------------------------------------\n\n constructor(options: DeepgramSTTOptions) {\n this.apiKey = options.apiKey;\n this.model = options.model ?? DEFAULT_MODEL;\n this.language = options.language ?? DEFAULT_LANGUAGE;\n this.debugEnabled = options.debug ?? false;\n\n this.log('DeepgramSTT created', {\n model: this.model,\n language: this.language,\n });\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /** Whether the WebSocket is currently connected and ready. */\n get isConnected(): boolean {\n return this._connected;\n }\n\n /**\n * Open a WebSocket connection to Deepgram's real-time STT endpoint.\n *\n * Resolves once the connection is established and the socket is ready to\n * receive audio frames. Rejects if the connection cannot be established.\n */\n async connect(): Promise<void> {\n if (this._connected) {\n this.log('Already connected — skipping');\n return;\n }\n\n // SSR guard\n if (typeof WebSocket === 'undefined') {\n this.log('WebSocket API not available (SSR?) — cannot connect');\n return;\n }\n\n const url = this.buildUrl();\n this.log('Connecting to', url.replace(this.apiKey, '***'));\n\n this.wsManager = new WebSocketManager({\n url,\n protocols: [],\n debug: this.debugEnabled,\n label: 'Deepgram-STT',\n });\n\n this.wsManager.onOpen(() => {\n this._connected = true;\n this.startKeepAlive();\n this.log('Connected');\n });\n this.wsManager.onMessage((event: MessageEvent) => {\n this.handleMessage(event);\n });\n this.wsManager.onClose((code: number, reason: string) => {\n this.log('Connection closed', { code, reason });\n this.cleanup();\n });\n this.wsManager.onError((event: Event) => {\n this.log('WebSocket error', event);\n });\n\n return this.wsManager.connect();\n }\n\n /**\n * Send audio data to Deepgram for transcription.\n *\n * Accepts either `Float32Array` (Web Audio API output) or `Int16Array`\n * (already encoded as linear16). Float32 data is automatically converted\n * to Int16 before sending.\n */\n sendAudio(audioData: Float32Array | Int16Array): void {\n if (!this._connected || !this.wsManager || this._suspended) {\n return;\n }\n\n let buffer: ArrayBuffer;\n if (audioData instanceof Float32Array) {\n buffer = float32ToInt16(audioData).buffer as ArrayBuffer;\n } else {\n buffer = audioData.buffer as ArrayBuffer;\n }\n\n this.wsManager.send(buffer);\n }\n\n /**\n * Register a callback to receive transcript events.\n *\n * @returns An unsubscribe function. Calling it more than once is safe.\n */\n onTranscript(callback: (event: TranscriptEvent) => void): () => void {\n this.transcriptCallbacks.add(callback);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this.transcriptCallbacks.delete(callback);\n };\n }\n\n /**\n * Gracefully close the connection.\n *\n * Sends a `CloseStream` message to Deepgram so the server can finalise\n * any pending transcription before the socket is torn down.\n */\n close(): void {\n if (!this._connected || !this.wsManager) {\n this.log('Not connected — nothing to close');\n return;\n }\n\n this.log('Sending CloseStream and closing');\n this.stopKeepAlive();\n\n try {\n this.wsManager.send(JSON.stringify({ type: 'CloseStream' }));\n } catch {\n // Socket may already be closing — ignore.\n }\n\n this.wsManager.close();\n this.cleanup();\n }\n\n /** Force-destroy the connection without a graceful handshake. */\n destroy(): void {\n this.log('Destroying');\n this.stopKeepAlive();\n\n if (this.wsManager) {\n this.wsManager.destroy();\n this.wsManager = null;\n }\n\n this.cleanup();\n this.transcriptCallbacks.clear();\n }\n\n /**\n * Suspend the adapter (e.g. when the device goes offline).\n *\n * Stops the keepalive timer and marks the adapter as suspended so that\n * incoming `sendAudio` calls are silently dropped. The WebSocket itself\n * is left open; Deepgram will close it after an inactivity timeout if\n * the network truly went away.\n */\n suspend(): void {\n if (this._suspended) return;\n\n this._suspended = true;\n this.stopKeepAlive();\n this.log('Suspended');\n }\n\n /**\n * Resume after a prior `suspend()`. If the underlying connection is\n * still alive, the keepalive timer is restarted. If the connection was\n * lost while suspended, callers should `close()` / `destroy()` and\n * create a new instance.\n */\n resume(): void {\n if (!this._suspended) return;\n\n this._suspended = false;\n this.log('Resumed');\n\n if (this._connected && this.wsManager) {\n this.startKeepAlive();\n }\n }\n\n // -----------------------------------------------------------------------\n // Message handling\n // -----------------------------------------------------------------------\n\n /**\n * Parse incoming Deepgram JSON messages and emit transcript events.\n *\n * Deepgram sends `Results` messages with the following shape:\n * ```json\n * {\n * \"type\": \"Results\",\n * \"channel\": {\n * \"alternatives\": [{ \"transcript\": \"...\", \"confidence\": 0.97 }]\n * },\n * \"is_final\": true,\n * \"speech_final\": true\n * }\n * ```\n */\n private handleMessage(event: MessageEvent): void {\n // Binary messages are not expected — ignore.\n if (typeof event.data !== 'string') {\n return;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(event.data) as Record<string, unknown>;\n } catch {\n this.log('Failed to parse message', event.data);\n return;\n }\n\n const type = parsed['type'] as string | undefined;\n\n if (type === 'Results') {\n this.handleResultsMessage(parsed);\n } else if (type === 'Metadata') {\n this.log('Received metadata', parsed);\n } else if (type === 'Error') {\n this.log('Deepgram error', parsed);\n } else {\n this.log('Unknown message type', type, parsed);\n }\n }\n\n /**\n * Extract transcript data from a `Results` message and notify subscribers.\n */\n private handleResultsMessage(parsed: Record<string, unknown>): void {\n const channel = parsed['channel'] as\n | { alternatives?: { transcript?: string; confidence?: number }[] }\n | undefined;\n\n const alternatives = channel?.alternatives;\n if (!alternatives || alternatives.length === 0) {\n return;\n }\n\n const best = alternatives[0];\n if (!best) return;\n const transcript = best.transcript ?? '';\n const confidence = best.confidence ?? 0;\n\n // Deepgram sends empty transcripts for silence — skip those.\n if (transcript.trim() === '') {\n return;\n }\n\n const isFinal =\n (parsed['is_final'] === true) && (parsed['speech_final'] === true);\n\n const transcriptEvent: TranscriptEvent = {\n text: transcript,\n isFinal,\n confidence,\n timestamp: Date.now(),\n };\n\n this.log(\n isFinal ? 'Final transcript:' : 'Interim transcript:',\n transcript,\n `(${(confidence * 100).toFixed(1)}%)`,\n );\n\n this.emitTranscript(transcriptEvent);\n }\n\n // -----------------------------------------------------------------------\n // Keepalive\n // -----------------------------------------------------------------------\n\n /** Start the periodic KeepAlive heartbeat. */\n private startKeepAlive(): void {\n this.stopKeepAlive();\n\n this.keepAliveTimer = setInterval(() => {\n if (this._connected && this.wsManager && !this._suspended) {\n try {\n this.wsManager.send(JSON.stringify({ type: 'KeepAlive' }));\n this.log('Sent KeepAlive');\n } catch {\n this.log('Failed to send KeepAlive');\n }\n }\n }, KEEPALIVE_INTERVAL_MS);\n }\n\n /** Stop the KeepAlive heartbeat. */\n private stopKeepAlive(): void {\n if (this.keepAliveTimer !== null) {\n clearInterval(this.keepAliveTimer);\n this.keepAliveTimer = null;\n }\n }\n\n // -----------------------------------------------------------------------\n // Subscriber notification\n // -----------------------------------------------------------------------\n\n /**\n * Emit a transcript event to all registered callbacks.\n *\n * Errors thrown by individual callbacks are caught and logged so one\n * misbehaving subscriber does not prevent others from receiving the event.\n */\n private emitTranscript(event: TranscriptEvent): void {\n for (const cb of this.transcriptCallbacks) {\n try {\n cb(event);\n } catch (err) {\n console.error(LOG_PREFIX, 'Transcript callback threw:', err);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // URL building\n // -----------------------------------------------------------------------\n\n /** Build the Deepgram streaming endpoint URL with query parameters. */\n private buildUrl(): string {\n const params = new URLSearchParams({\n model: this.model,\n language: this.language,\n punctuate: 'true',\n interim_results: 'true',\n endpointing: '300',\n token: this.apiKey,\n });\n\n return `wss://api.deepgram.com/v1/listen?${params.toString()}`;\n }\n\n // -----------------------------------------------------------------------\n // Cleanup\n // -----------------------------------------------------------------------\n\n /** Reset internal state after disconnection. */\n private cleanup(): void {\n this._connected = false;\n this.stopKeepAlive();\n }\n\n // -----------------------------------------------------------------------\n // Logging\n // -----------------------------------------------------------------------\n\n /** Conditional debug logging. */\n private log(...args: unknown[]): void {\n if (this.debugEnabled) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – ElevenLabs Real-Time Text-to-Speech Adapter\n// ---------------------------------------------------------------------------\n//\n// Streams text to ElevenLabs over a WebSocket and receives audio chunks in\n// real time. Designed for browser use; all browser-only APIs are guarded\n// behind `typeof window` checks so the module is safe to import at build\n// time in SSR environments.\n// ---------------------------------------------------------------------------\n\nimport { WebSocketManager } from './websocket-manager.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:TTS]';\n\n/** Default ElevenLabs voice ID (Rachel). */\nconst DEFAULT_VOICE_ID = '21m00Tcm4TlvDq8ikWAM';\n\n/** Default model — ElevenLabs Flash v2.5 for lowest latency. */\nconst DEFAULT_MODEL_ID = 'eleven_flash_v2_5';\n\n/** Default voice stability setting (0–1). */\nconst DEFAULT_STABILITY = 0.5;\n\n/** Default similarity boost setting (0–1). */\nconst DEFAULT_SIMILARITY_BOOST = 0.75;\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface ElevenLabsTTSOptions {\n apiKey: string;\n voiceId?: string;\n modelId?: string;\n debug?: boolean;\n}\n\nexport interface TTSAudioEvent {\n audio: ArrayBuffer;\n /** Whether this is the final chunk for the current utterance. */\n isFinal: boolean;\n timestamp: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Decode a base64-encoded string into an `ArrayBuffer`.\n *\n * Uses the native `atob` function available in browsers. In SSR contexts\n * the adapter will never reach this code path because `connect()` is\n * guarded by a WebSocket availability check.\n */\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const length = binaryString.length;\n const bytes = new Uint8Array(length);\n for (let i = 0; i < length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n// ---------------------------------------------------------------------------\n// ElevenLabsTTS\n// ---------------------------------------------------------------------------\n\nexport class ElevenLabsTTS {\n // ---- Configuration ------------------------------------------------------\n\n private readonly apiKey: string;\n private readonly voiceId: string;\n private readonly modelId: string;\n private readonly debugEnabled: boolean;\n\n // ---- Internal state -----------------------------------------------------\n\n private wsManager: WebSocketManager | null = null;\n private _connected = false;\n private _suspended = false;\n\n /**\n * Whether the BOS (beginning-of-stream) handshake has been sent for the\n * current WebSocket session. ElevenLabs requires the first message to\n * contain voice settings and the API key before any text chunks.\n */\n private bosSent = false;\n\n /** Registered audio-event callbacks. */\n private readonly audioCallbacks: Set<(event: TTSAudioEvent) => void> =\n new Set();\n\n // -----------------------------------------------------------------------\n // Constructor\n // -----------------------------------------------------------------------\n\n constructor(options: ElevenLabsTTSOptions) {\n this.apiKey = options.apiKey;\n this.voiceId = options.voiceId ?? DEFAULT_VOICE_ID;\n this.modelId = options.modelId ?? DEFAULT_MODEL_ID;\n this.debugEnabled = options.debug ?? false;\n\n this.log('ElevenLabsTTS created', {\n voiceId: this.voiceId,\n modelId: this.modelId,\n });\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /** Whether the WebSocket is currently connected and ready. */\n get isConnected(): boolean {\n return this._connected;\n }\n\n /**\n * Open a WebSocket connection to the ElevenLabs streaming TTS endpoint.\n *\n * Resolves once the connection is established and the BOS handshake has\n * been sent. Rejects if the connection cannot be established.\n */\n async connect(): Promise<void> {\n if (this._connected) {\n this.log('Already connected — skipping');\n return;\n }\n\n // SSR guard\n if (typeof WebSocket === 'undefined') {\n this.log('WebSocket API not available (SSR?) — cannot connect');\n return;\n }\n\n const url = this.buildUrl();\n this.log('Connecting to', url);\n\n this.wsManager = new WebSocketManager({\n url,\n protocols: [],\n debug: this.debugEnabled,\n label: 'ElevenLabs-TTS',\n });\n\n this.wsManager.onOpen(() => {\n this._connected = true;\n this.sendBOS();\n this.log('Connected and BOS sent');\n });\n this.wsManager.onMessage((event: MessageEvent) => {\n this.handleMessage(event);\n });\n this.wsManager.onClose((code: number, reason: string) => {\n this.log('Connection closed', { code, reason });\n this.cleanup();\n });\n this.wsManager.onError((event: Event) => {\n this.log('WebSocket error', event);\n });\n\n return this.wsManager.connect();\n }\n\n /**\n * Send text to be synthesised into speech.\n *\n * May be called multiple times to stream text incrementally. Each call\n * sends a text chunk with `try_trigger_generation: true` so ElevenLabs\n * can begin synthesising as soon as it has enough context.\n *\n * Call {@link flush} when the complete utterance has been sent.\n */\n speak(text: string): void {\n if (!this._connected || !this.wsManager || this._suspended) {\n this.log('Cannot speak — not connected or suspended');\n return;\n }\n\n if (!text) {\n return;\n }\n\n const message = JSON.stringify({\n text,\n try_trigger_generation: true,\n });\n\n this.log('Sending text chunk:', text.slice(0, 80) + (text.length > 80 ? '...' : ''));\n this.wsManager.send(message);\n }\n\n /**\n * Signal the end of text input for the current utterance.\n *\n * Sends the EOS (end-of-stream) marker to ElevenLabs. The server will\n * flush any remaining audio and send a final chunk with `isFinal: true`.\n */\n flush(): void {\n if (!this._connected || !this.wsManager || this._suspended) {\n this.log('Cannot flush — not connected or suspended');\n return;\n }\n\n const message = JSON.stringify({ text: '' });\n this.log('Sending EOS (flush)');\n this.wsManager.send(message);\n }\n\n /**\n * Register a callback to receive audio output events.\n *\n * @returns An unsubscribe function. Calling it more than once is safe.\n */\n onAudio(callback: (event: TTSAudioEvent) => void): () => void {\n this.audioCallbacks.add(callback);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this.audioCallbacks.delete(callback);\n };\n }\n\n /** Gracefully close the connection by sending EOS then closing. */\n close(): void {\n if (!this._connected || !this.wsManager) {\n this.log('Not connected — nothing to close');\n return;\n }\n\n this.log('Closing connection');\n\n // Send EOS to let the server finalise any pending audio.\n try {\n this.wsManager.send(JSON.stringify({ text: '' }));\n } catch {\n // Socket may already be closing — ignore.\n }\n\n this.wsManager.close();\n this.cleanup();\n }\n\n /** Force-destroy the connection without a graceful handshake. */\n destroy(): void {\n this.log('Destroying');\n\n if (this.wsManager) {\n this.wsManager.destroy();\n this.wsManager = null;\n }\n\n this.cleanup();\n this.audioCallbacks.clear();\n }\n\n /**\n * Suspend the adapter (e.g. when the device goes offline).\n *\n * Marks the adapter as suspended so that calls to `speak()` and `flush()`\n * are silently dropped. The WebSocket itself is left open; ElevenLabs\n * will close it after an inactivity timeout if the network went away.\n */\n suspend(): void {\n if (this._suspended) return;\n\n this._suspended = true;\n this.log('Suspended');\n }\n\n /**\n * Resume after a prior `suspend()`. If the underlying connection is\n * still alive, the adapter returns to normal operation. If the connection\n * was lost while suspended, callers should `close()` / `destroy()` and\n * create a new instance.\n */\n resume(): void {\n if (!this._suspended) return;\n\n this._suspended = false;\n this.log('Resumed');\n }\n\n // -----------------------------------------------------------------------\n // BOS handshake\n // -----------------------------------------------------------------------\n\n /**\n * Send the BOS (beginning-of-stream) message.\n *\n * This must be the very first message on a new WebSocket session. It\n * carries the API key and voice settings.\n */\n private sendBOS(): void {\n if (!this.wsManager || this.bosSent) {\n return;\n }\n\n const bos = JSON.stringify({\n text: ' ',\n voice_settings: {\n stability: DEFAULT_STABILITY,\n similarity_boost: DEFAULT_SIMILARITY_BOOST,\n },\n xi_api_key: this.apiKey,\n });\n\n this.wsManager.send(bos);\n this.bosSent = true;\n this.log('BOS handshake sent');\n }\n\n // -----------------------------------------------------------------------\n // Message handling\n // -----------------------------------------------------------------------\n\n /**\n * Parse incoming ElevenLabs JSON messages and emit audio events.\n *\n * ElevenLabs sends messages with the following shape:\n * ```json\n * { \"audio\": \"base64encoded...\", \"isFinal\": false }\n * ```\n *\n * When `isFinal` is `true`, the server has finished synthesising the\n * current utterance (i.e. after EOS was sent).\n */\n private handleMessage(event: MessageEvent): void {\n // Binary messages are not expected from ElevenLabs — ignore.\n if (typeof event.data !== 'string') {\n return;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(event.data) as Record<string, unknown>;\n } catch {\n this.log('Failed to parse message', event.data);\n return;\n }\n\n // Handle error responses from ElevenLabs.\n if (parsed['error'] !== undefined) {\n this.log('ElevenLabs error:', parsed['error']);\n return;\n }\n\n // Handle alignment / metadata messages (no audio payload).\n if (parsed['audio'] === undefined || parsed['audio'] === null) {\n this.log('Non-audio message received', parsed);\n return;\n }\n\n const audioBase64 = parsed['audio'] as string;\n const isFinal = parsed['isFinal'] === true;\n\n // Skip empty audio chunks.\n if (!audioBase64 || audioBase64.length === 0) {\n if (isFinal) {\n // Emit a final event even without audio so consumers know the\n // utterance has ended.\n this.emitAudio({\n audio: new ArrayBuffer(0),\n isFinal: true,\n timestamp: Date.now(),\n });\n }\n return;\n }\n\n let audioBuffer: ArrayBuffer;\n try {\n audioBuffer = base64ToArrayBuffer(audioBase64);\n } catch (err) {\n this.log('Failed to decode base64 audio', err);\n return;\n }\n\n const audioEvent: TTSAudioEvent = {\n audio: audioBuffer,\n isFinal,\n timestamp: Date.now(),\n };\n\n this.log(\n isFinal ? 'Final audio chunk:' : 'Audio chunk:',\n `${audioBuffer.byteLength} bytes`,\n );\n\n this.emitAudio(audioEvent);\n }\n\n // -----------------------------------------------------------------------\n // Subscriber notification\n // -----------------------------------------------------------------------\n\n /**\n * Emit an audio event to all registered callbacks.\n *\n * Errors thrown by individual callbacks are caught and logged so one\n * misbehaving subscriber does not prevent others from receiving the event.\n */\n private emitAudio(event: TTSAudioEvent): void {\n for (const cb of this.audioCallbacks) {\n try {\n cb(event);\n } catch (err) {\n console.error(LOG_PREFIX, 'Audio callback threw:', err);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // URL building\n // -----------------------------------------------------------------------\n\n /** Build the ElevenLabs streaming TTS endpoint URL. */\n private buildUrl(): string {\n const params = new URLSearchParams({\n model_id: this.modelId,\n });\n\n return `wss://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(this.voiceId)}/stream-input?${params.toString()}`;\n }\n\n // -----------------------------------------------------------------------\n // Cleanup\n // -----------------------------------------------------------------------\n\n /** Reset internal state after disconnection. */\n private cleanup(): void {\n this._connected = false;\n this.bosSent = false;\n }\n\n // -----------------------------------------------------------------------\n // Logging\n // -----------------------------------------------------------------------\n\n /** Conditional debug logging. */\n private log(...args: unknown[]): void {\n if (this.debugEnabled) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Voice Pipeline (Phase 1b)\n// ---------------------------------------------------------------------------\n//\n// Orchestrates the full voice flow: Mic → VAD → STT → LLM → TTS → Speaker.\n//\n// Half-duplex state machine:\n// IDLE ──startListening()──► LISTENING\n// LISTENING ──final transcript──► PROCESSING\n// PROCESSING ──LLM response──► SPEAKING\n// SPEAKING ──TTS done──► IDLE\n// SPEAKING ──barge-in──► LISTENING\n// Any ──error──► ERROR\n// ERROR ──startListening()──► LISTENING\n//\n// SSR safe: all browser APIs are guarded behind `typeof window` checks.\n// AudioContext is only created in init() which must be called after a user\n// gesture to satisfy browser autoplay policies.\n// ---------------------------------------------------------------------------\n\nimport { EventBus, createEventBus } from '../bus/index.js';\nimport { BrowserSupportError, ErrorCodes, PermissionError } from '../errors/index.js';\nimport { DeepgramSTT } from './deepgram-stt.js';\nimport { ElevenLabsTTS } from './elevenlabs-tts.js';\n\nimport type { TranscriptEvent } from './deepgram-stt.js';\nimport type { TTSAudioEvent } from './elevenlabs-tts.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Voice]';\n\n/** Jitter buffer: accumulate this many ms of audio before starting playback. */\nconst JITTER_BUFFER_MS = 150;\n\n/** Echo detection: discard transcript if >60% word overlap within this window. */\nconst ECHO_WINDOW_MS = 3_000;\n\n/** Echo detection: minimum word overlap ratio to classify as echo. */\nconst ECHO_OVERLAP_THRESHOLD = 0.6;\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport type VoiceState = 'idle' | 'listening' | 'processing' | 'speaking' | 'error';\n\nexport interface VoicePipelineOptions {\n sttConfig: { provider: 'deepgram'; apiKey: string; model?: 'nova-2' | 'nova-3' };\n ttsConfig: { provider: 'elevenlabs'; apiKey: string; voiceId?: string; modelId?: string };\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Type declarations for environments with webkitAudioContext\n// ---------------------------------------------------------------------------\n\ndeclare global {\n // eslint-disable-next-line no-var\n var webkitAudioContext: typeof AudioContext | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Internals: VAD interface (dynamically imported from @guidekit/vad)\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal interface mirroring the public API of SileroVAD from @guidekit/vad.\n * Declared here so we can type the dynamically imported instance without a\n * hard compile-time dependency.\n */\ninterface VADInstance {\n init(): Promise<void>;\n start(stream: MediaStream): void;\n stop(): void;\n destroy(): Promise<void>;\n onSpeechStart(cb: (event: { type: string; timestamp: number; probability?: number }) => void): () => void;\n onSpeechEnd(cb: (event: { type: string; timestamp: number; probability?: number }) => void): () => void;\n readonly isSpeaking: boolean;\n readonly isReady: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Internals: Echo tracker\n// ---------------------------------------------------------------------------\n\ninterface EchoRecord {\n words: Set<string>;\n timestamp: number;\n}\n\n// ---------------------------------------------------------------------------\n// VoicePipeline\n// ---------------------------------------------------------------------------\n\nexport class VoicePipeline {\n // ── Configuration ────────────────────────────────────────────────────\n private readonly _sttConfig: VoicePipelineOptions['sttConfig'];\n private readonly _ttsConfig: VoicePipelineOptions['ttsConfig'];\n private readonly _debug: boolean;\n\n // ── State ────────────────────────────────────────────────────────────\n private _state: VoiceState = 'idle';\n private _destroyed = false;\n\n // ── EventBus (internal, for voice-specific events) ──────────────────\n private readonly _bus: EventBus;\n\n // ── Audio pipeline components ────────────────────────────────────────\n private _audioContext: AudioContext | null = null;\n private _mediaStream: MediaStream | null = null;\n private _vad: VADInstance | null = null;\n private _stt: DeepgramSTT | null = null;\n private _tts: ElevenLabsTTS | null = null;\n\n // ── Audio capture (mic → ScriptProcessor → STT) ─────────────────────\n private _micSourceNode: MediaStreamAudioSourceNode | null = null;\n private _captureProcessor: ScriptProcessorNode | null = null;\n private _isForwardingToSTT = false;\n\n // ── TTS playback ────────────────────────────────────────────────────\n private _playbackQueue: ArrayBuffer[] = [];\n private _jitterBufferTimer: ReturnType<typeof setTimeout> | null = null;\n private _isPlaybackStarted = false;\n private _nextPlaybackTime = 0;\n private _activeSourceNodes: Set<AudioBufferSourceNode> = new Set();\n private _lastScheduledSource: AudioBufferSourceNode | null = null;\n\n // ── Echo detection ──────────────────────────────────────────────────\n private _lastTTSEcho: EchoRecord | null = null;\n\n // ── Barge-in / abort ────────────────────────────────────────────────\n private _pendingLLMAbort: AbortController | null = null;\n\n // ── Subscriber management ───────────────────────────────────────────\n private readonly _stateChangeCallbacks: Set<(state: VoiceState, previous: VoiceState) => void> = new Set();\n private readonly _transcriptCallbacks: Set<(text: string, isFinal: boolean) => void> = new Set();\n\n // ── Cleanup handles ─────────────────────────────────────────────────\n private _unsubVADSpeechStart: (() => void) | null = null;\n private _unsubVADSpeechEnd: (() => void) | null = null;\n private _unsubSTTTranscript: (() => void) | null = null;\n private _unsubTTSAudio: (() => void) | null = null;\n\n // ────────────────────────────────────────────────────────────────────\n // Constructor\n // ────────────────────────────────────────────────────────────────────\n\n constructor(options: VoicePipelineOptions) {\n this._sttConfig = options.sttConfig;\n this._ttsConfig = options.ttsConfig;\n this._debug = options.debug ?? false;\n this._bus = createEventBus({ debug: this._debug });\n\n this._log('VoicePipeline created');\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Public getters\n // ────────────────────────────────────────────────────────────────────\n\n /** Current pipeline state. */\n get state(): VoiceState {\n return this._state;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // init() — call after user gesture\n // ────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize AudioContext, VAD model, and STT/TTS connections.\n *\n * **Must be called in response to a user gesture** (click / tap) to\n * satisfy browser autoplay policies.\n */\n async init(): Promise<void> {\n if (this._destroyed) {\n this._log('Cannot init — pipeline is destroyed');\n return;\n }\n\n // SSR guard\n if (typeof window === 'undefined') {\n this._log('SSR environment detected — skipping init');\n return;\n }\n\n if (this._audioContext) {\n this._log('Already initialized — skipping');\n return;\n }\n\n this._log('Initializing...');\n\n // ── 1. Create AudioContext ───────────────────────────────────────\n const AudioContextClass = this._resolveAudioContext();\n if (!AudioContextClass) {\n throw new BrowserSupportError({\n code: ErrorCodes.BROWSER_NO_WEB_AUDIO,\n message: 'Web Audio API is not supported in this browser.',\n suggestion: 'Use a modern browser such as Chrome, Firefox, or Safari.',\n });\n }\n\n this._audioContext = new AudioContextClass();\n this._log('AudioContext created, sampleRate:', this._audioContext.sampleRate);\n\n // Pre-warm the AudioContext with a silent buffer to avoid first-play delay\n this._prewarmAudioContext(this._audioContext);\n\n // ── 2. Load VAD model ───────────────────────────────────────────\n try {\n const vadModule = await import('@guidekit/vad');\n const SileroVAD = vadModule.SileroVAD;\n this._vad = new SileroVAD({ debug: this._debug }) as unknown as VADInstance;\n await this._vad.init();\n this._log('VAD model loaded');\n } catch (err) {\n throw new BrowserSupportError({\n code: ErrorCodes.VAD_PACKAGE_MISSING,\n message:\n 'Failed to load @guidekit/vad. Ensure the package is installed.',\n suggestion:\n 'Run: npm install @guidekit/vad — or check that WASM is supported.',\n cause: err instanceof Error ? err : undefined,\n });\n }\n\n // ── 3. Create STT adapter ───────────────────────────────────────\n this._stt = new DeepgramSTT({\n apiKey: this._sttConfig.apiKey,\n model: this._sttConfig.model,\n debug: this._debug,\n });\n\n // ── 4. Create TTS adapter ───────────────────────────────────────\n this._tts = new ElevenLabsTTS({\n apiKey: this._ttsConfig.apiKey,\n voiceId: this._ttsConfig.voiceId,\n modelId: this._ttsConfig.modelId,\n debug: this._debug,\n });\n\n this._log('Initialization complete');\n }\n\n // ────────────────────────────────────────────────────────────────────\n // startListening()\n // ────────────────────────────────────────────────────────────────────\n\n /**\n * Start listening: activate microphone, begin VAD + STT pipeline.\n *\n * Valid from: IDLE, ERROR, SPEAKING (barge-in path calls this internally).\n */\n async startListening(): Promise<void> {\n if (this._destroyed) return;\n\n if (!this._audioContext || !this._vad || !this._stt) {\n throw new BrowserSupportError({\n code: ErrorCodes.BROWSER_NO_WEB_AUDIO,\n message: 'Voice pipeline not initialized. Call init() first.',\n suggestion: 'Ensure init() is called after a user gesture before startListening().',\n });\n }\n\n // Resume AudioContext if it was suspended (browser policy)\n if (this._audioContext.state === 'suspended') {\n try {\n await this._audioContext.resume();\n } catch {\n // Ignore resume errors — the context may auto-resume on interaction\n }\n }\n\n // ── Get mic access ──────────────────────────────────────────────\n try {\n this._mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n },\n });\n this._log('Microphone access granted');\n } catch (err) {\n const isNotAllowed =\n err instanceof DOMException &&\n (err.name === 'NotAllowedError' || err.name === 'PermissionDeniedError');\n\n if (isNotAllowed) {\n const permErr = new PermissionError({\n code: ErrorCodes.PERMISSION_MIC_DENIED,\n message: 'Microphone permission was denied by the user.',\n suggestion: 'Allow microphone access in your browser settings and try again.',\n });\n this._setState('error');\n this._bus.emit('error', permErr);\n throw permErr;\n }\n\n const unavailErr = new PermissionError({\n code: ErrorCodes.PERMISSION_MIC_UNAVAILABLE,\n message: 'No microphone device available.',\n suggestion: 'Connect a microphone and try again.',\n cause: err instanceof Error ? err : undefined,\n });\n this._setState('error');\n this._bus.emit('error', unavailErr);\n throw unavailErr;\n }\n\n // ── Connect STT ─────────────────────────────────────────────────\n try {\n await this._stt.connect();\n this._log('STT connected');\n } catch (_err) {\n this._log('STT connection failed — degrading to text mode');\n this._bus.emit('voice:degraded', { reason: 'STT connection failed', fallback: 'text' });\n this._stopMicTracks();\n this._setState('error');\n return;\n }\n\n // ── Wire STT transcript events ──────────────────────────────────\n this._unsubSTTTranscript?.();\n this._unsubSTTTranscript = this._stt.onTranscript((event: TranscriptEvent) => {\n this._handleTranscript(event);\n });\n\n // ── Set up mic → ScriptProcessor for STT forwarding ─────────────\n this._setupMicCapture();\n\n // ── Start VAD on the MediaStream ────────────────────────────────\n this._unsubVADSpeechStart?.();\n this._unsubVADSpeechEnd?.();\n\n this._unsubVADSpeechStart = this._vad.onSpeechStart(() => {\n this._handleVADSpeechStart();\n });\n this._unsubVADSpeechEnd = this._vad.onSpeechEnd(() => {\n this._handleVADSpeechEnd();\n });\n\n this._vad.start(this._mediaStream);\n this._log('VAD started');\n\n // ── Transition state ────────────────────────────────────────────\n this._setState('listening');\n }\n\n // ────────────────────────────────────────────────────────────────────\n // stopListening()\n // ────────────────────────────────────────────────────────────────────\n\n /** Stop listening: deactivate mic and VAD. */\n stopListening(): void {\n if (this._destroyed) return;\n\n this._log('stopListening()');\n this._isForwardingToSTT = false;\n this._teardownMicCapture();\n this._vad?.stop();\n this._stt?.close();\n this._stopMicTracks();\n\n if (this._state === 'listening') {\n this._setState('idle');\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // processTranscript()\n // ────────────────────────────────────────────────────────────────────\n\n /**\n * Process a transcript through an LLM callback and speak the response.\n *\n * @param text - The user's transcript text.\n * @param sendToLLM - Async callback that sends text to the LLM and returns the response.\n */\n async processTranscript(\n text: string,\n sendToLLM: (text: string) => Promise<string>,\n ): Promise<void> {\n if (this._destroyed) return;\n\n this._setState('processing');\n\n // Set up abort controller for barge-in\n this._pendingLLMAbort = new AbortController();\n const signal = this._pendingLLMAbort.signal;\n\n let response: string;\n try {\n response = await sendToLLM(text);\n\n // Check if aborted during LLM call (barge-in)\n if (signal.aborted) {\n this._log('LLM response discarded (barge-in during processing)');\n return;\n }\n } catch (err) {\n if (signal.aborted) {\n this._log('LLM call aborted (barge-in)');\n return;\n }\n this._log('LLM call failed:', err);\n this._setState('error');\n return;\n } finally {\n this._pendingLLMAbort = null;\n }\n\n // Speak the response\n if (response && response.trim()) {\n await this.speak(response);\n } else {\n this._setState('idle');\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // speak()\n // ────────────────────────────────────────────────────────────────────\n\n /** Speak text via ElevenLabs TTS. */\n async speak(text: string): Promise<void> {\n if (this._destroyed || !text.trim()) return;\n\n if (!this._tts || !this._audioContext) {\n this._log('TTS or AudioContext not available — cannot speak');\n this._bus.emit('voice:degraded', { reason: 'TTS not available', fallback: 'text' });\n this._setState('idle');\n return;\n }\n\n this._setState('speaking');\n // Record echo info for later detection\n this._lastTTSEcho = {\n words: new Set(this._normalizeWords(text)),\n timestamp: Date.now(),\n };\n\n this._bus.emit('voice:tts-start', { utterance: text });\n\n // Connect TTS if needed\n try {\n if (!this._tts.isConnected) {\n await this._tts.connect();\n this._log('TTS connected');\n }\n } catch (_err) {\n this._log('TTS connection failed — degrading to text mode');\n this._bus.emit('voice:degraded', { reason: 'TTS connection failed', fallback: 'text' });\n this._bus.emit('voice:tts-end', { utterance: text, durationMs: 0 });\n this._setState('idle');\n return;\n }\n\n // Reset playback state\n this._playbackQueue = [];\n this._isPlaybackStarted = false;\n this._nextPlaybackTime = 0;\n this._jitterBufferTimer = null;\n\n // Wire TTS audio events\n this._unsubTTSAudio?.();\n const ttsStartTime = Date.now();\n\n await new Promise<void>((resolve) => {\n let resolved = false;\n const done = () => {\n if (resolved) return;\n resolved = true;\n this._unsubTTSAudio?.();\n this._unsubTTSAudio = null;\n\n const durationMs = Date.now() - ttsStartTime;\n this._bus.emit('voice:tts-end', { utterance: text, durationMs });\n\n // Only transition to idle if still in speaking state\n // (barge-in may have already changed state)\n if (this._state === 'speaking') {\n this._setState('idle');\n }\n resolve();\n };\n\n this._unsubTTSAudio = this._tts!.onAudio((event: TTSAudioEvent) => {\n this._handleTTSAudio(event, done);\n });\n\n // Send text and flush\n this._tts!.speak(text);\n this._tts!.flush();\n });\n }\n\n // ────────────────────────────────────────────────────────────────────\n // stopSpeaking() — barge-in\n // ────────────────────────────────────────────────────────────────────\n\n /** Stop current TTS playback immediately (barge-in). */\n stopSpeaking(): void {\n if (this._destroyed) return;\n\n this._log('stopSpeaking() — barge-in');\n\n // Stop all active AudioBufferSourceNodes\n for (const node of this._activeSourceNodes) {\n try {\n node.stop();\n node.disconnect();\n } catch {\n // Node may already be stopped\n }\n }\n this._activeSourceNodes.clear();\n this._lastScheduledSource = null;\n\n // Clear jitter buffer\n if (this._jitterBufferTimer !== null) {\n clearTimeout(this._jitterBufferTimer);\n this._jitterBufferTimer = null;\n }\n this._playbackQueue = [];\n this._isPlaybackStarted = false;\n\n // Abort pending LLM request\n if (this._pendingLLMAbort) {\n this._pendingLLMAbort.abort();\n this._pendingLLMAbort = null;\n }\n\n // Close and recreate TTS connection for next utterance\n if (this._tts?.isConnected) {\n this._tts.close();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // onStateChange()\n // ────────────────────────────────────────────────────────────────────\n\n /** Subscribe to state changes. Returns an unsubscribe function. */\n onStateChange(callback: (state: VoiceState, previous: VoiceState) => void): () => void {\n this._stateChangeCallbacks.add(callback);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this._stateChangeCallbacks.delete(callback);\n };\n }\n\n // ────────────────────────────────────────────────────────────────────\n // onTranscript()\n // ────────────────────────────────────────────────────────────────────\n\n /** Subscribe to transcript events. Returns an unsubscribe function. */\n onTranscript(callback: (text: string, isFinal: boolean) => void): () => void {\n this._transcriptCallbacks.add(callback);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this._transcriptCallbacks.delete(callback);\n };\n }\n\n // ────────────────────────────────────────────────────────────────────\n // destroy()\n // ────────────────────────────────────────────────────────────────────\n\n /** Destroy all resources held by the pipeline. */\n async destroy(): Promise<void> {\n if (this._destroyed) return;\n this._destroyed = true;\n this._log('Destroying...');\n\n // Stop everything\n this.stopSpeaking();\n this.stopListening();\n\n // Tear down subscriptions\n this._unsubVADSpeechStart?.();\n this._unsubVADSpeechEnd?.();\n this._unsubSTTTranscript?.();\n this._unsubTTSAudio?.();\n this._unsubVADSpeechStart = null;\n this._unsubVADSpeechEnd = null;\n this._unsubSTTTranscript = null;\n this._unsubTTSAudio = null;\n\n // Destroy subsystems\n if (this._vad) {\n try {\n await this._vad.destroy();\n } catch {\n // Ignore VAD destroy errors\n }\n this._vad = null;\n }\n\n if (this._stt) {\n this._stt.destroy();\n this._stt = null;\n }\n\n if (this._tts) {\n this._tts.destroy();\n this._tts = null;\n }\n\n // Close AudioContext\n if (this._audioContext) {\n try {\n await this._audioContext.close();\n } catch {\n // Ignore close errors\n }\n this._audioContext = null;\n }\n\n // Clean up mic tracks\n this._stopMicTracks();\n\n // Clear callbacks\n this._stateChangeCallbacks.clear();\n this._transcriptCallbacks.clear();\n this._bus.removeAll();\n\n this._log('Destroyed');\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: State machine\n // ════════════════════════════════════════════════════════════════════\n\n private _setState(next: VoiceState): void {\n const prev = this._state;\n if (prev === next) return;\n\n this._state = next;\n this._log(`State: ${prev} -> ${next}`);\n\n // Emit on internal bus\n this._bus.emit('voice:state-change', { from: prev, to: next });\n\n // Notify external subscribers\n for (const cb of this._stateChangeCallbacks) {\n try {\n cb(next, prev);\n } catch (err) {\n console.error(LOG_PREFIX, 'State change callback threw:', err);\n }\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: AudioContext helpers\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * Resolve the AudioContext constructor, with Safari webkitAudioContext\n * fallback. Returns null if Web Audio is not available.\n */\n private _resolveAudioContext(): typeof AudioContext | null {\n if (typeof AudioContext !== 'undefined') {\n return AudioContext;\n }\n if (typeof globalThis.webkitAudioContext !== 'undefined') {\n return globalThis.webkitAudioContext;\n }\n return null;\n }\n\n /**\n * Pre-warm the AudioContext by playing a silent buffer.\n * This forces the context into the \"running\" state and avoids a\n * noticeable delay on the first real playback.\n */\n private _prewarmAudioContext(ctx: AudioContext): void {\n try {\n const buffer = ctx.createBuffer(1, 1, ctx.sampleRate);\n const source = ctx.createBufferSource();\n source.buffer = buffer;\n source.connect(ctx.destination);\n source.start(0);\n this._log('AudioContext pre-warmed');\n } catch {\n // Non-critical — ignore\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: Mic capture → STT forwarding\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * Set up a ScriptProcessorNode to capture mic audio and forward it\n * to the STT adapter when `_isForwardingToSTT` is true.\n */\n private _setupMicCapture(): void {\n if (!this._audioContext || !this._mediaStream || !this._stt) return;\n\n this._micSourceNode = this._audioContext.createMediaStreamSource(this._mediaStream);\n\n // Buffer size of 4096 at 48 kHz ≈ 85 ms of audio per callback\n const bufferSize = 4096;\n this._captureProcessor = this._audioContext.createScriptProcessor(bufferSize, 1, 1);\n\n this._captureProcessor.onaudioprocess = (event: AudioProcessingEvent) => {\n if (!this._isForwardingToSTT || !this._stt) return;\n\n const inputData = event.inputBuffer.getChannelData(0);\n // DeepgramSTT.sendAudio accepts Float32Array and converts to Int16 internally\n this._stt.sendAudio(new Float32Array(inputData));\n };\n\n this._micSourceNode.connect(this._captureProcessor);\n // ScriptProcessorNode requires connection to destination to fire events\n this._captureProcessor.connect(this._audioContext.destination);\n this._log('Mic capture pipeline set up');\n }\n\n /** Tear down the mic capture ScriptProcessorNode. */\n private _teardownMicCapture(): void {\n if (this._captureProcessor) {\n try {\n this._captureProcessor.disconnect();\n } catch {\n // Ignore\n }\n this._captureProcessor.onaudioprocess = null;\n this._captureProcessor = null;\n }\n\n if (this._micSourceNode) {\n try {\n this._micSourceNode.disconnect();\n } catch {\n // Ignore\n }\n this._micSourceNode = null;\n }\n }\n\n /** Stop all tracks on the current MediaStream. */\n private _stopMicTracks(): void {\n if (this._mediaStream) {\n for (const track of this._mediaStream.getTracks()) {\n track.stop();\n }\n this._mediaStream = null;\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: VAD event handlers\n // ════════════════════════════════════════════════════════════════════\n\n private _handleVADSpeechStart(): void {\n this._log('VAD: speech-start, current state:', this._state);\n\n if (this._state === 'speaking') {\n // Barge-in: user is speaking while TTS is playing\n if (this._isEchoDetected()) {\n this._log('Echo detected — ignoring barge-in');\n return;\n }\n\n this._log('Barge-in detected');\n this.stopSpeaking();\n // Restart listening (we keep the mic stream alive)\n this._isForwardingToSTT = true;\n this._setState('listening');\n return;\n }\n\n if (this._state === 'listening') {\n // Start forwarding audio to STT\n this._isForwardingToSTT = true;\n this._log('Started forwarding audio to STT');\n }\n }\n\n private _handleVADSpeechEnd(): void {\n this._log('VAD: speech-end, current state:', this._state);\n\n if (this._state === 'listening') {\n // Stop forwarding to STT; we wait for a final transcript\n this._isForwardingToSTT = false;\n this._log('Stopped forwarding audio to STT');\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: STT transcript handler\n // ════════════════════════════════════════════════════════════════════\n\n private _handleTranscript(event: TranscriptEvent): void {\n const { text, isFinal } = event;\n\n if (!text || !text.trim()) return;\n\n // Echo detection: discard transcripts that match recent TTS output\n if (isFinal && this._isTranscriptEcho(text)) {\n this._log('Echo detected — discarding transcript:', text);\n return;\n }\n\n // Notify external transcript subscribers\n this._bus.emit('voice:transcript', {\n text,\n isFinal,\n confidence: event.confidence,\n });\n\n for (const cb of this._transcriptCallbacks) {\n try {\n cb(text, isFinal);\n } catch (err) {\n console.error(LOG_PREFIX, 'Transcript callback threw:', err);\n }\n }\n\n // On final transcript while listening → transition to PROCESSING\n // (The actual LLM call is driven by the consumer calling processTranscript)\n if (isFinal && this._state === 'listening') {\n this._log('Final transcript received:', text);\n this._isForwardingToSTT = false;\n // Note: we do NOT transition to PROCESSING here. The consumer is\n // responsible for calling processTranscript() which sets the state.\n // This keeps the pipeline composable — consumers can decide to\n // ignore transcripts, batch them, etc.\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: TTS audio playback\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * Handle an audio chunk from ElevenLabs TTS.\n *\n * Implements a jitter buffer: we accumulate audio for JITTER_BUFFER_MS\n * before starting playback to smooth out network jitter.\n */\n private _handleTTSAudio(event: TTSAudioEvent, onDone: () => void): void {\n if (this._state !== 'speaking') {\n // State changed (e.g. barge-in) — discard audio\n return;\n }\n\n if (event.isFinal && event.audio.byteLength === 0) {\n // Final marker with no audio — flush whatever we have and finish\n this._flushJitterBuffer(onDone);\n return;\n }\n\n if (event.audio.byteLength === 0) return;\n\n // Add to jitter buffer queue\n this._playbackQueue.push(event.audio);\n\n if (!this._isPlaybackStarted) {\n // Start the jitter buffer timer on the first chunk\n if (this._jitterBufferTimer === null) {\n this._jitterBufferTimer = setTimeout(() => {\n this._jitterBufferTimer = null;\n this._startPlayback(event.isFinal ? onDone : undefined);\n }, JITTER_BUFFER_MS);\n }\n } else {\n // Playback already started — decode and schedule immediately\n this._decodeAndSchedule(event.audio, event.isFinal ? onDone : undefined);\n }\n\n if (event.isFinal) {\n // Clear the jitter buffer timer since we got the final chunk\n if (this._jitterBufferTimer !== null) {\n clearTimeout(this._jitterBufferTimer);\n this._jitterBufferTimer = null;\n this._startPlayback(onDone);\n }\n }\n }\n\n /** Flush the jitter buffer and start playback. */\n private _flushJitterBuffer(onDone: () => void): void {\n if (this._jitterBufferTimer !== null) {\n clearTimeout(this._jitterBufferTimer);\n this._jitterBufferTimer = null;\n }\n\n if (this._playbackQueue.length > 0) {\n this._startPlayback(onDone);\n } else {\n // No audio to play — done immediately\n onDone();\n }\n }\n\n /**\n * Begin playback: decode all queued chunks and schedule them.\n * If `onDone` is provided, it is called when the last chunk finishes playing.\n */\n private _startPlayback(onDone?: () => void): void {\n if (this._isPlaybackStarted) {\n // Already started — just flush the remaining queue\n if (this._playbackQueue.length > 0) {\n const remaining = this._playbackQueue.splice(0);\n const lastIdx = remaining.length - 1;\n for (let i = 0; i < remaining.length; i++) {\n this._decodeAndSchedule(\n remaining[i]!,\n i === lastIdx ? onDone : undefined,\n );\n }\n } else if (onDone) {\n // If there are active sources wait for the last one, otherwise call done now\n if (this._lastScheduledSource) {\n const prevOnEnded = this._lastScheduledSource.onended;\n this._lastScheduledSource.onended = () => {\n if (typeof prevOnEnded === 'function') {\n prevOnEnded.call(this._lastScheduledSource!, new Event('ended'));\n }\n onDone();\n };\n } else {\n onDone();\n }\n }\n return;\n }\n\n this._isPlaybackStarted = true;\n this._nextPlaybackTime = 0;\n\n const queued = this._playbackQueue.splice(0);\n const lastIdx = queued.length - 1;\n\n for (let i = 0; i < queued.length; i++) {\n this._decodeAndSchedule(\n queued[i]!,\n i === lastIdx ? onDone : undefined,\n );\n }\n }\n\n /**\n * Decode an audio chunk (mp3 from ElevenLabs) and schedule it for\n * sequential playback via AudioBufferSourceNode.\n */\n private _decodeAndSchedule(audioData: ArrayBuffer, onDone?: () => void): void {\n if (!this._audioContext || this._state !== 'speaking') {\n onDone?.();\n return;\n }\n\n const ctx = this._audioContext;\n\n // decodeAudioData needs a copy because it detaches the ArrayBuffer\n const copy = audioData.slice(0);\n\n ctx.decodeAudioData(\n copy,\n (decodedBuffer) => {\n if (this._state !== 'speaking' || !this._audioContext) {\n onDone?.();\n return;\n }\n\n const source = ctx.createBufferSource();\n source.buffer = decodedBuffer;\n source.connect(ctx.destination);\n\n // Track active sources for barge-in cleanup\n this._activeSourceNodes.add(source);\n this._lastScheduledSource = source;\n\n source.onended = () => {\n this._activeSourceNodes.delete(source);\n if (this._lastScheduledSource === source) {\n this._lastScheduledSource = null;\n }\n\n // If this was the last source and we have onDone, call it\n if (onDone) {\n onDone();\n }\n };\n\n // Schedule playback sequentially\n const now = ctx.currentTime;\n const startTime = Math.max(now, this._nextPlaybackTime);\n source.start(startTime);\n this._nextPlaybackTime = startTime + decodedBuffer.duration;\n\n this._log(\n 'Scheduled audio chunk:',\n decodedBuffer.duration.toFixed(3) + 's',\n 'at',\n startTime.toFixed(3),\n );\n },\n (err) => {\n this._log('Failed to decode audio chunk:', err);\n onDone?.();\n },\n );\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: Echo detection\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * Check if VAD speech-start during SPEAKING state is likely echo from\n * the speaker playing TTS audio rather than genuine user speech.\n *\n * Simple heuristic: if we are still within the echo window of a recent\n * TTS utterance, treat it as potential echo.\n */\n private _isEchoDetected(): boolean {\n if (!this._lastTTSEcho) return false;\n const elapsed = Date.now() - this._lastTTSEcho.timestamp;\n // During active TTS playback, suppress barge-in only if within window\n // and the speaker is still audibly outputting. We use the echo window\n // as a conservative guard.\n return elapsed < ECHO_WINDOW_MS;\n }\n\n /**\n * Check if a transcript is an echo of recent TTS output.\n *\n * Uses word overlap: if intersection of words > 60% of max set size\n * and the transcript arrived within the echo window, discard it.\n */\n private _isTranscriptEcho(transcript: string): boolean {\n if (!this._lastTTSEcho) return false;\n\n const elapsed = Date.now() - this._lastTTSEcho.timestamp;\n if (elapsed > ECHO_WINDOW_MS) return false;\n\n const transcriptWords = new Set(this._normalizeWords(transcript));\n const ttsWords = this._lastTTSEcho.words;\n\n if (transcriptWords.size === 0 || ttsWords.size === 0) return false;\n\n // Compute intersection\n let intersectionCount = 0;\n for (const word of transcriptWords) {\n if (ttsWords.has(word)) {\n intersectionCount++;\n }\n }\n\n const maxSize = Math.max(transcriptWords.size, ttsWords.size);\n const overlap = intersectionCount / maxSize;\n\n this._log(\n 'Echo check: overlap =',\n (overlap * 100).toFixed(1) + '%,',\n 'threshold =',\n (ECHO_OVERLAP_THRESHOLD * 100).toFixed(1) + '%',\n );\n\n return overlap >= ECHO_OVERLAP_THRESHOLD;\n }\n\n /**\n * Normalize text into a set of lowercase words, stripping punctuation.\n */\n private _normalizeWords(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, '')\n .split(/\\s+/)\n .filter((w) => w.length > 0);\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: Logging\n // ════════════════════════════════════════════════════════════════════\n\n private _log(...args: unknown[]): void {\n if (this._debug) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport { WebSocketManager } from './websocket-manager.js';\nexport type { WSState, WebSocketManagerOptions } from './websocket-manager.js';\nexport { DeepgramSTT } from './deepgram-stt.js';\nexport type { DeepgramSTTOptions, TranscriptEvent } from './deepgram-stt.js';\nexport { ElevenLabsTTS } from './elevenlabs-tts.js';\nexport type { ElevenLabsTTSOptions, TTSAudioEvent } from './elevenlabs-tts.js';\n","/**\n * @module @guidekit/core/visual\n *\n * Visual Guidance System for the GuideKit SDK.\n * Provides spotlight overlays, tooltips, smooth scrolling, and guided tours\n * to visually direct users to page elements identified by the LLM.\n *\n * Key design decisions:\n * - Overlay lives on document.body (NOT Shadow DOM) so it can cover the entire page.\n * - Uses box-shadow cutout technique for the spotlight effect.\n * - Tracks element position via ResizeObserver + scroll listeners (NOT rAF polling).\n * - All text is set via textContent (never innerHTML) to prevent XSS.\n * - SSR-safe: every browser API is guarded behind typeof checks.\n * - Compositor-only animations (transform, opacity) for smooth 60fps.\n * - Respects prefers-reduced-motion.\n */\n\nimport { DOMScanner } from '../dom/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Visual]';\nconst DEFAULT_OVERLAY_COLOR = 'rgba(0, 0, 0, 0.5)';\nconst DEFAULT_SPOTLIGHT_COLOR = '#4a9eed';\nconst DEFAULT_ANIMATION_DURATION = 300;\nconst DEFAULT_SPOTLIGHT_PADDING = 8;\nconst AUTO_TOUR_INTERVAL_MS = 5000;\nconst TOOLTIP_ARROW_SIZE = 8;\nconst TOOLTIP_MARGIN = 12;\nconst OVERLAY_Z_INDEX = 999998;\nconst TOOLTIP_Z_INDEX = 999999;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface VisualGuidanceOptions {\n /** Color of the spotlight overlay. Default: 'rgba(0, 0, 0, 0.5)' */\n overlayColor?: string;\n /** Color of the spotlight cutout border. Default: '#4a9eed' */\n spotlightColor?: string;\n /** Animation duration in ms. Default: 300 */\n animationDuration?: number;\n /** Padding around the highlighted element in px. Default: 8 */\n spotlightPadding?: number;\n /** Enable debug logging. Default: false */\n debug?: boolean;\n}\n\nexport interface TooltipOptions {\n text: string;\n position?: 'top' | 'bottom' | 'left' | 'right' | 'auto';\n}\n\nexport interface SpotlightState {\n isActive: boolean;\n selector: string | null;\n sectionId: string | null;\n tooltip: string | null;\n}\n\ntype TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\n// ---------------------------------------------------------------------------\n// Utility: Scrollable ancestor detection\n// ---------------------------------------------------------------------------\n\n/**\n * Walk up the DOM tree and collect every ancestor that has an overflow\n * style allowing scroll (auto or scroll).\n */\nfunction getScrollableAncestors(element: Element): Element[] {\n if (typeof getComputedStyle === 'undefined') return [];\n\n const ancestors: Element[] = [];\n let parent = element.parentElement;\n while (parent) {\n const style = getComputedStyle(parent);\n const overflow = style.overflow + style.overflowX + style.overflowY;\n if (/(auto|scroll)/.test(overflow)) {\n ancestors.push(parent);\n }\n parent = parent.parentElement;\n }\n return ancestors;\n}\n\n/**\n * Detect whether the user prefers reduced motion.\n */\nfunction prefersReducedMotion(): boolean {\n if (typeof window === 'undefined') return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n// ---------------------------------------------------------------------------\n// VisualGuidance\n// ---------------------------------------------------------------------------\n\nexport class VisualGuidance {\n // Configuration\n private readonly overlayColor: string;\n private readonly spotlightColor: string;\n private readonly animationDuration: number;\n private readonly spotlightPadding: number;\n private readonly debug: boolean;\n\n // DOM elements (created lazily)\n private overlayEl: HTMLDivElement | null = null;\n private spotlightEl: HTMLDivElement | null = null;\n private tooltipEl: HTMLDivElement | null = null;\n private liveRegionEl: HTMLDivElement | null = null;\n\n // State\n private _state: SpotlightState = {\n isActive: false,\n selector: null,\n sectionId: null,\n tooltip: null,\n };\n\n // Tracking infrastructure\n private resizeObserver: ResizeObserver | null = null;\n private scrollListenerCleanups: Array<() => void> = [];\n private currentTargetElement: Element | null = null;\n\n // Tour state\n private tourSectionIds: string[] = [];\n private tourCurrentStep = -1;\n private tourMode: 'auto' | 'manual' = 'manual';\n private tourAutoTimer: ReturnType<typeof setTimeout> | null = null;\n private tourPausedByInteraction = false;\n\n // Subscribers\n private spotlightChangeCallbacks: Array<(state: SpotlightState) => void> = [];\n private tourStepCallbacks: Array<(step: number, total: number, sectionId: string) => void> = [];\n\n // DOMScanner for resolving sectionIds\n private domScanner: DOMScanner | null = null;\n\n // Track whether destroy() has been called\n private destroyed = false;\n\n constructor(options?: VisualGuidanceOptions) {\n this.overlayColor = options?.overlayColor ?? DEFAULT_OVERLAY_COLOR;\n this.spotlightColor = options?.spotlightColor ?? DEFAULT_SPOTLIGHT_COLOR;\n this.animationDuration = options?.animationDuration ?? DEFAULT_ANIMATION_DURATION;\n this.spotlightPadding = options?.spotlightPadding ?? DEFAULT_SPOTLIGHT_PADDING;\n this.debug = options?.debug ?? false;\n\n this.log('Initialised', {\n overlayColor: this.overlayColor,\n spotlightColor: this.spotlightColor,\n animationDuration: this.animationDuration,\n spotlightPadding: this.spotlightPadding,\n });\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /**\n * Highlight an element by selector or sectionId.\n * Returns true if the element was found and highlighted, false otherwise.\n */\n highlight(params: {\n sectionId?: string;\n selector?: string;\n tooltip?: string;\n position?: 'top' | 'bottom' | 'left' | 'right' | 'auto';\n }): boolean {\n if (typeof document === 'undefined') return false;\n if (this.destroyed) return false;\n\n const { sectionId, selector, tooltip, position } = params;\n\n // Resolve the target element\n const target = this.resolveTarget(sectionId, selector);\n if (!target) {\n this.log('Target element not found', { sectionId, selector });\n return false;\n }\n\n const resolvedSelector = selector ?? this.buildSelectorForElement(target);\n\n // Dismiss any existing highlight first (without notifying to avoid flicker)\n this.cleanupTrackingInfrastructure();\n\n // Update state\n this._state = {\n isActive: true,\n selector: resolvedSelector,\n sectionId: sectionId ?? null,\n tooltip: tooltip ?? null,\n };\n\n this.currentTargetElement = target;\n\n // Check if the element has zero size (e.g., display: none)\n const rect = target.getBoundingClientRect();\n const hasSize = rect.width > 0 && rect.height > 0;\n\n if (hasSize) {\n // Create/update overlay and spotlight\n this.ensureOverlay();\n this.ensureSpotlight();\n this.positionSpotlight(rect);\n this.showOverlay();\n } else {\n this.log('Element has zero size, showing tooltip only');\n }\n\n // Show tooltip if requested\n if (tooltip) {\n this.showTooltip(target, tooltip, position ?? 'auto');\n } else {\n this.removeTooltip();\n }\n\n // Set up position tracking\n this.setupPositionTracking(target);\n\n // Announce for screen readers\n const label = sectionId ?? resolvedSelector;\n this.announce(`Highlighting ${label}`);\n\n // Notify subscribers\n this.notifySpotlightChange();\n\n this.log('Highlighted element', { sectionId, selector: resolvedSelector, tooltip });\n return true;\n }\n\n /**\n * Remove the spotlight and all associated elements.\n */\n dismissHighlight(): void {\n if (typeof document === 'undefined') return;\n\n this.cleanupTrackingInfrastructure();\n this.hideOverlay();\n this.removeTooltip();\n this.removeAriaDescribedBy();\n\n this.currentTargetElement = null;\n\n this._state = {\n isActive: false,\n selector: null,\n sectionId: null,\n tooltip: null,\n };\n\n this.notifySpotlightChange();\n this.log('Highlight dismissed');\n }\n\n /**\n * Smooth scroll to a section by its sectionId.\n */\n scrollToSection(sectionId: string, offset?: number): void {\n if (typeof document === 'undefined') return;\n\n const target = this.resolveTarget(sectionId, undefined);\n if (!target) {\n this.log('scrollToSection: section not found', { sectionId });\n return;\n }\n\n this.scrollToElement(target, offset);\n this.log('Scrolled to section', { sectionId });\n }\n\n /**\n * Smooth scroll to an element by CSS selector.\n */\n scrollToSelector(selector: string, offset?: number): void {\n if (typeof document === 'undefined') return;\n\n let target: Element | null;\n try {\n target = document.querySelector(selector);\n } catch {\n this.log('scrollToSelector: invalid selector', { selector });\n return;\n }\n\n if (!target) {\n this.log('scrollToSelector: element not found', { selector });\n return;\n }\n\n this.scrollToElement(target, offset);\n this.log('Scrolled to selector', { selector });\n }\n\n /**\n * Start a guided tour through the given section IDs.\n */\n startTour(sectionIds: string[], mode: 'auto' | 'manual' = 'manual'): void {\n if (typeof document === 'undefined') return;\n if (this.destroyed) return;\n if (sectionIds.length === 0) return;\n\n // Stop any existing tour\n this.stopTour();\n\n this.tourSectionIds = [...sectionIds];\n this.tourMode = mode;\n this.tourCurrentStep = -1;\n this.tourPausedByInteraction = false;\n\n this.log('Tour started', { steps: sectionIds.length, mode });\n\n // Advance to the first step\n this.nextTourStep();\n }\n\n /**\n * Move to the next tour step. No-op if no tour is active.\n */\n nextTourStep(): void {\n if (this.tourSectionIds.length === 0) return;\n\n // Clear any existing auto timer\n this.clearAutoTimer();\n\n const nextStep = this.tourCurrentStep + 1;\n if (nextStep >= this.tourSectionIds.length) {\n // Tour complete\n this.stopTour();\n return;\n }\n\n this.tourCurrentStep = nextStep;\n this.tourPausedByInteraction = false;\n\n this.executeTourStep();\n }\n\n /**\n * Move to the previous tour step. No-op if no tour is active or at first step.\n */\n prevTourStep(): void {\n if (this.tourSectionIds.length === 0) return;\n if (this.tourCurrentStep <= 0) return;\n\n // Clear any existing auto timer\n this.clearAutoTimer();\n\n this.tourCurrentStep -= 1;\n this.tourPausedByInteraction = false;\n\n this.executeTourStep();\n }\n\n /**\n * Stop the tour and dismiss all highlights.\n */\n stopTour(): void {\n this.clearAutoTimer();\n\n const wasActive = this.tourSectionIds.length > 0;\n\n this.tourSectionIds = [];\n this.tourCurrentStep = -1;\n this.tourPausedByInteraction = false;\n\n this.dismissHighlight();\n\n if (wasActive) {\n this.log('Tour stopped');\n }\n }\n\n /**\n * Get the current spotlight state.\n */\n get state(): SpotlightState {\n return { ...this._state };\n }\n\n /**\n * Get the current tour state, or null if no tour is active.\n */\n get tourState(): { active: boolean; step: number; total: number } | null {\n if (this.tourSectionIds.length === 0) {\n return null;\n }\n return {\n active: true,\n step: this.tourCurrentStep,\n total: this.tourSectionIds.length,\n };\n }\n\n /**\n * Subscribe to spotlight state changes.\n * Returns an unsubscribe function.\n */\n onSpotlightChange(callback: (state: SpotlightState) => void): () => void {\n this.spotlightChangeCallbacks.push(callback);\n return () => {\n const idx = this.spotlightChangeCallbacks.indexOf(callback);\n if (idx !== -1) {\n this.spotlightChangeCallbacks.splice(idx, 1);\n }\n };\n }\n\n /**\n * Subscribe to tour step events.\n * Returns an unsubscribe function.\n */\n onTourStep(callback: (step: number, total: number, sectionId: string) => void): () => void {\n this.tourStepCallbacks.push(callback);\n return () => {\n const idx = this.tourStepCallbacks.indexOf(callback);\n if (idx !== -1) {\n this.tourStepCallbacks.splice(idx, 1);\n }\n };\n }\n\n /**\n * Clean up all DOM elements, observers, and event listeners.\n * After calling destroy(), the instance is unusable.\n */\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n\n this.stopTour();\n this.dismissHighlight();\n this.cleanupTrackingInfrastructure();\n\n // Remove overlay\n if (this.overlayEl?.parentNode) {\n this.overlayEl.parentNode.removeChild(this.overlayEl);\n }\n this.overlayEl = null;\n\n // Remove spotlight\n if (this.spotlightEl?.parentNode) {\n this.spotlightEl.parentNode.removeChild(this.spotlightEl);\n }\n this.spotlightEl = null;\n\n // Remove tooltip\n this.removeTooltip();\n\n // Remove live region\n if (this.liveRegionEl?.parentNode) {\n this.liveRegionEl.parentNode.removeChild(this.liveRegionEl);\n }\n this.liveRegionEl = null;\n\n // Disconnect resize observer\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n\n // Clear subscriber lists\n this.spotlightChangeCallbacks = [];\n this.tourStepCallbacks = [];\n\n this.domScanner = null;\n\n this.log('Destroyed');\n }\n\n // -------------------------------------------------------------------------\n // Private: Target resolution\n // -------------------------------------------------------------------------\n\n /**\n * Resolve a target element from either a sectionId or a CSS selector.\n * If sectionId is provided, uses DOMScanner to find the section's selector.\n */\n private resolveTarget(sectionId?: string, selector?: string): Element | null {\n if (typeof document === 'undefined') return null;\n\n // Try selector first if provided\n if (selector) {\n try {\n const el = document.querySelector(selector);\n if (el) return el;\n } catch {\n this.log('Invalid selector', { selector });\n }\n }\n\n // Try sectionId via DOMScanner\n if (sectionId) {\n // Try common patterns: data-guidekit-target, id, aria-label\n const strategies = [\n `[data-guidekit-target=\"${sectionId}\"]`,\n `#${CSS.escape(sectionId)}`,\n `[aria-label=\"${sectionId}\"]`,\n ];\n\n for (const strategy of strategies) {\n try {\n const el = document.querySelector(strategy);\n if (el) return el;\n } catch {\n // Invalid selector, try next\n }\n }\n\n // Fall back to DOMScanner for a full scan\n if (!this.domScanner) {\n this.domScanner = new DOMScanner({ debug: this.debug });\n }\n const model = this.domScanner.scan();\n const section = model.sections.find((s) => s.id === sectionId);\n if (section) {\n try {\n const el = document.querySelector(section.selector);\n if (el) return el;\n } catch {\n this.log('DOMScanner selector invalid', { selector: section.selector });\n }\n }\n }\n\n return null;\n }\n\n /**\n * Build a CSS selector for an element, using the same priority hierarchy\n * as the DOMScanner.\n */\n private buildSelectorForElement(el: Element): string {\n const guideKitTarget = el.getAttribute('data-guidekit-target');\n if (guideKitTarget) return `[data-guidekit-target=\"${guideKitTarget}\"]`;\n\n const id = el.id;\n if (id) {\n try {\n const escaped = CSS.escape(id);\n if (document.querySelectorAll(`#${escaped}`).length === 1) {\n return `#${escaped}`;\n }\n } catch {\n // Fall through\n }\n }\n\n const testId = el.getAttribute('data-testid');\n if (testId) return `[data-testid=\"${testId}\"]`;\n\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) return `[aria-label=\"${ariaLabel}\"]`;\n\n // Structural path fallback\n return this.buildStructuralPath(el);\n }\n\n private buildStructuralPath(el: Element): string {\n if (typeof document === 'undefined') return '';\n\n const parts: string[] = [];\n let current: Element | null = el;\n\n while (current && current !== document.documentElement) {\n const tag = current.tagName.toLowerCase();\n\n if (tag === 'body' || tag === 'html') {\n parts.unshift(tag);\n current = current.parentElement;\n continue;\n }\n\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (c) => c.tagName === current!.tagName,\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n parts.unshift(`${tag}:nth-child(${index})`);\n } else {\n parts.unshift(tag);\n }\n } else {\n parts.unshift(tag);\n }\n\n current = parent;\n }\n\n return parts.join(' > ');\n }\n\n // -------------------------------------------------------------------------\n // Private: Overlay management\n // -------------------------------------------------------------------------\n\n /**\n * Ensure the full-page overlay element exists on document.body.\n */\n private ensureOverlay(): void {\n if (typeof document === 'undefined') return;\n if (this.overlayEl) return;\n\n const overlay = document.createElement('div');\n overlay.setAttribute('aria-hidden', 'true');\n overlay.setAttribute('data-guidekit-overlay', 'true');\n overlay.style.cssText = [\n 'position: fixed',\n 'inset: 0',\n `z-index: ${OVERLAY_Z_INDEX}`,\n 'pointer-events: none',\n 'opacity: 0',\n `transition: opacity ${this.getTransitionDuration()}ms ease-out`,\n ].join('; ');\n\n document.body.appendChild(overlay);\n this.overlayEl = overlay;\n }\n\n /**\n * Ensure the spotlight (cutout) element exists on document.body.\n */\n private ensureSpotlight(): void {\n if (typeof document === 'undefined') return;\n if (this.spotlightEl) return;\n\n const spotlight = document.createElement('div');\n spotlight.setAttribute('aria-hidden', 'true');\n spotlight.setAttribute('data-guidekit-spotlight', 'true');\n\n const transitionDuration = this.getTransitionDuration();\n spotlight.style.cssText = [\n 'position: fixed',\n `z-index: ${OVERLAY_Z_INDEX}`,\n 'pointer-events: none',\n 'border-radius: 4px',\n `border: 2px solid ${this.spotlightColor}`,\n `box-shadow: 0 0 0 9999px ${this.overlayColor}`,\n 'will-change: transform, opacity',\n 'opacity: 0',\n `transition: transform ${transitionDuration}ms ease-out, opacity ${transitionDuration}ms ease-out, width ${transitionDuration}ms ease-out, height ${transitionDuration}ms ease-out`,\n ].join('; ');\n\n document.body.appendChild(spotlight);\n this.spotlightEl = spotlight;\n }\n\n /**\n * Position the spotlight element over the target's bounding rect.\n */\n private positionSpotlight(rect: DOMRect): void {\n if (!this.spotlightEl) return;\n\n const pad = this.spotlightPadding;\n const left = rect.left - pad;\n const top = rect.top - pad;\n const width = rect.width + pad * 2;\n const height = rect.height + pad * 2;\n\n this.spotlightEl.style.left = `${left}px`;\n this.spotlightEl.style.top = `${top}px`;\n this.spotlightEl.style.width = `${width}px`;\n this.spotlightEl.style.height = `${height}px`;\n }\n\n /**\n * Show the overlay and spotlight with entrance animation.\n */\n private showOverlay(): void {\n if (typeof document === 'undefined') return;\n\n // Force a reflow so the transition triggers\n if (this.overlayEl) {\n void this.overlayEl.offsetHeight;\n this.overlayEl.style.opacity = '1';\n }\n if (this.spotlightEl) {\n void this.spotlightEl.offsetHeight;\n this.spotlightEl.style.opacity = '1';\n }\n }\n\n /**\n * Hide the overlay and spotlight.\n */\n private hideOverlay(): void {\n if (this.overlayEl) {\n this.overlayEl.style.opacity = '0';\n }\n if (this.spotlightEl) {\n this.spotlightEl.style.opacity = '0';\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Tooltip management\n // -------------------------------------------------------------------------\n\n /**\n * Show a tooltip near the target element.\n */\n private showTooltip(\n target: Element,\n text: string,\n positionPref: 'top' | 'bottom' | 'left' | 'right' | 'auto',\n ): void {\n if (typeof document === 'undefined') return;\n\n // Create or reuse tooltip element\n if (!this.tooltipEl) {\n const tooltip = document.createElement('div');\n tooltip.setAttribute('role', 'tooltip');\n tooltip.setAttribute('data-guidekit-tooltip', 'true');\n\n const transitionDuration = this.getTransitionDuration();\n tooltip.style.cssText = [\n 'position: fixed',\n `z-index: ${TOOLTIP_Z_INDEX}`,\n 'pointer-events: none',\n 'background: #ffffff',\n 'color: #1a1a2e',\n 'padding: 10px 14px',\n 'border-radius: 8px',\n 'font-size: 14px',\n 'line-height: 1.4',\n 'max-width: 300px',\n 'box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15)',\n 'opacity: 0',\n `transition: opacity ${transitionDuration}ms ease-out`,\n 'font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n ].join('; ');\n\n document.body.appendChild(tooltip);\n this.tooltipEl = tooltip;\n }\n\n // Set text content (NEVER innerHTML to prevent XSS)\n this.tooltipEl.textContent = text;\n\n // Add step indicator if in a tour\n if (this.tourSectionIds.length > 0 && this.tourCurrentStep >= 0) {\n const stepText = `Step ${this.tourCurrentStep + 1} of ${this.tourSectionIds.length}`;\n this.tooltipEl.textContent = `${stepText}: ${text}`;\n }\n\n // Set aria-describedby on the target\n const tooltipId = 'guidekit-tooltip-' + Date.now();\n this.tooltipEl.id = tooltipId;\n if (target instanceof HTMLElement) {\n target.setAttribute('aria-describedby', tooltipId);\n }\n\n // Position the tooltip\n const rect = target.getBoundingClientRect();\n const position = positionPref === 'auto'\n ? this.computeAutoPosition(rect)\n : positionPref;\n\n this.positionTooltip(rect, position);\n\n // Animate in\n void this.tooltipEl.offsetHeight;\n this.tooltipEl.style.opacity = '1';\n }\n\n /**\n * Remove the tooltip element from the DOM.\n */\n private removeTooltip(): void {\n if (this.tooltipEl?.parentNode) {\n this.tooltipEl.parentNode.removeChild(this.tooltipEl);\n }\n this.tooltipEl = null;\n }\n\n /**\n * Remove aria-describedby from the current target element.\n */\n private removeAriaDescribedBy(): void {\n if (this.currentTargetElement instanceof HTMLElement) {\n this.currentTargetElement.removeAttribute('aria-describedby');\n }\n }\n\n /**\n * Compute the best auto-position for the tooltip relative to the target rect.\n * Preference order: bottom, top, right, left.\n */\n private computeAutoPosition(rect: DOMRect): TooltipPosition {\n if (typeof window === 'undefined') return 'bottom';\n\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n\n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n const spaceRight = viewportWidth - rect.right;\n const spaceLeft = rect.left;\n\n const minSpace = 80; // Minimum space needed for tooltip\n\n // Prefer bottom\n if (spaceBelow >= minSpace) return 'bottom';\n // Then top\n if (spaceAbove >= minSpace) return 'top';\n // Then right\n if (spaceRight >= minSpace) return 'right';\n // Then left\n if (spaceLeft >= minSpace) return 'left';\n\n // Default to bottom even if tight\n return 'bottom';\n }\n\n /**\n * Position the tooltip element relative to the target rect.\n */\n private positionTooltip(rect: DOMRect, position: TooltipPosition): void {\n if (!this.tooltipEl || typeof window === 'undefined') return;\n\n const pad = this.spotlightPadding;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // We need the tooltip's dimensions. Force layout to measure.\n this.tooltipEl.style.left = '0px';\n this.tooltipEl.style.top = '0px';\n const tooltipRect = this.tooltipEl.getBoundingClientRect();\n const tw = tooltipRect.width;\n const th = tooltipRect.height;\n\n let left = 0;\n let top = 0;\n\n switch (position) {\n case 'bottom':\n left = rect.left + rect.width / 2 - tw / 2;\n top = rect.bottom + pad + TOOLTIP_ARROW_SIZE + TOOLTIP_MARGIN;\n break;\n case 'top':\n left = rect.left + rect.width / 2 - tw / 2;\n top = rect.top - pad - th - TOOLTIP_ARROW_SIZE - TOOLTIP_MARGIN;\n break;\n case 'right':\n left = rect.right + pad + TOOLTIP_ARROW_SIZE + TOOLTIP_MARGIN;\n top = rect.top + rect.height / 2 - th / 2;\n break;\n case 'left':\n left = rect.left - pad - tw - TOOLTIP_ARROW_SIZE - TOOLTIP_MARGIN;\n top = rect.top + rect.height / 2 - th / 2;\n break;\n }\n\n // Clamp within viewport\n left = Math.max(8, Math.min(left, viewportWidth - tw - 8));\n top = Math.max(8, Math.min(top, viewportHeight - th - 8));\n\n this.tooltipEl.style.left = `${left}px`;\n this.tooltipEl.style.top = `${top}px`;\n\n // Remove any existing arrow pseudo-element styling (via data attribute)\n this.tooltipEl.setAttribute('data-guidekit-position', position);\n\n // Apply arrow using a CSS trick with box-shadow on a pseudo :before\n // Since we can't use CSS stylesheets easily, we inline arrow via border trick\n this.applyTooltipArrow(position, rect);\n }\n\n /**\n * Apply an arrow on the tooltip pointing toward the target element.\n * Uses a child div with CSS border triangle technique.\n */\n private applyTooltipArrow(position: TooltipPosition, targetRect: DOMRect): void {\n if (!this.tooltipEl) return;\n\n // Remove any existing arrow\n const existingArrow = this.tooltipEl.querySelector('[data-guidekit-arrow]');\n if (existingArrow) {\n existingArrow.remove();\n }\n\n const arrow = document.createElement('div');\n arrow.setAttribute('data-guidekit-arrow', 'true');\n arrow.setAttribute('aria-hidden', 'true');\n\n const size = TOOLTIP_ARROW_SIZE;\n const baseStyle = [\n 'position: absolute',\n 'width: 0',\n 'height: 0',\n 'border-style: solid',\n ];\n\n switch (position) {\n case 'bottom':\n arrow.style.cssText = [\n ...baseStyle,\n `border-width: 0 ${size}px ${size}px ${size}px`,\n `border-color: transparent transparent #ffffff transparent`,\n `top: -${size}px`,\n `left: 50%`,\n `margin-left: -${size}px`,\n ].join('; ');\n // Adjust arrow horizontal position to point at target center\n this.adjustArrowHorizontal(arrow, targetRect, size);\n break;\n case 'top':\n arrow.style.cssText = [\n ...baseStyle,\n `border-width: ${size}px ${size}px 0 ${size}px`,\n `border-color: #ffffff transparent transparent transparent`,\n `bottom: -${size}px`,\n `left: 50%`,\n `margin-left: -${size}px`,\n ].join('; ');\n this.adjustArrowHorizontal(arrow, targetRect, size);\n break;\n case 'right':\n arrow.style.cssText = [\n ...baseStyle,\n `border-width: ${size}px ${size}px ${size}px 0`,\n `border-color: transparent #ffffff transparent transparent`,\n `left: -${size}px`,\n `top: 50%`,\n `margin-top: -${size}px`,\n ].join('; ');\n break;\n case 'left':\n arrow.style.cssText = [\n ...baseStyle,\n `border-width: ${size}px 0 ${size}px ${size}px`,\n `border-color: transparent transparent transparent #ffffff`,\n `right: -${size}px`,\n `top: 50%`,\n `margin-top: -${size}px`,\n ].join('; ');\n break;\n }\n\n this.tooltipEl.appendChild(arrow);\n }\n\n /**\n * Adjust arrow horizontal position so it points toward the target center\n * even when the tooltip is clamped to viewport edges.\n */\n private adjustArrowHorizontal(arrow: HTMLDivElement, targetRect: DOMRect, size: number): void {\n if (!this.tooltipEl) return;\n\n const tooltipRect = this.tooltipEl.getBoundingClientRect();\n const targetCenter = targetRect.left + targetRect.width / 2;\n const arrowLeft = targetCenter - tooltipRect.left;\n\n // Clamp arrow within tooltip bounds\n const minLeft = size + 4;\n const maxLeft = tooltipRect.width - size - 4;\n const clampedLeft = Math.max(minLeft, Math.min(arrowLeft, maxLeft));\n\n arrow.style.left = `${clampedLeft}px`;\n arrow.style.marginLeft = `0`;\n }\n\n // -------------------------------------------------------------------------\n // Private: Position tracking\n // -------------------------------------------------------------------------\n\n /**\n * Set up ResizeObserver and scroll listeners to track the target element\n * and update spotlight/tooltip positions.\n */\n private setupPositionTracking(target: Element): void {\n this.cleanupTrackingInfrastructure();\n\n // ResizeObserver\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => {\n this.updatePositions();\n });\n this.resizeObserver.observe(target);\n // Also observe body for layout changes\n if (typeof document !== 'undefined') {\n this.resizeObserver.observe(document.body);\n }\n }\n\n // Scroll listeners on all scrollable ancestors + window\n const scrollableAncestors = getScrollableAncestors(target);\n\n const handleScroll = (): void => {\n this.updatePositions();\n\n // In auto-tour mode, pause on user interaction\n if (this.tourMode === 'auto' && !this.tourPausedByInteraction) {\n this.tourPausedByInteraction = true;\n this.clearAutoTimer();\n // Resume after a delay\n this.tourAutoTimer = setTimeout(() => {\n this.tourPausedByInteraction = false;\n this.scheduleAutoAdvance();\n }, AUTO_TOUR_INTERVAL_MS);\n }\n };\n\n // Attach to each scrollable ancestor\n for (const ancestor of scrollableAncestors) {\n ancestor.addEventListener('scroll', handleScroll, { passive: true });\n this.scrollListenerCleanups.push(() => {\n ancestor.removeEventListener('scroll', handleScroll);\n });\n }\n\n // Always attach to window for document-level scroll\n if (typeof window !== 'undefined') {\n window.addEventListener('scroll', handleScroll, { passive: true });\n this.scrollListenerCleanups.push(() => {\n window.removeEventListener('scroll', handleScroll);\n });\n\n // Also listen for window resize\n window.addEventListener('resize', handleScroll, { passive: true });\n this.scrollListenerCleanups.push(() => {\n window.removeEventListener('resize', handleScroll);\n });\n }\n }\n\n /**\n * Remove all tracking observers and event listeners.\n */\n private cleanupTrackingInfrastructure(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n\n for (const cleanup of this.scrollListenerCleanups) {\n cleanup();\n }\n this.scrollListenerCleanups = [];\n }\n\n /**\n * Update spotlight and tooltip positions based on the current target\n * element's bounding rect.\n */\n private updatePositions(): void {\n if (!this.currentTargetElement) return;\n\n const rect = this.currentTargetElement.getBoundingClientRect();\n const hasSize = rect.width > 0 && rect.height > 0;\n\n if (hasSize && this.spotlightEl) {\n this.positionSpotlight(rect);\n }\n\n if (this.tooltipEl && this._state.tooltip) {\n const position = this.tooltipEl.getAttribute('data-guidekit-position') as TooltipPosition | null;\n this.positionTooltip(rect, position ?? 'bottom');\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Smooth scrolling\n // -------------------------------------------------------------------------\n\n /**\n * Scroll to an element, respecting reduced motion preferences.\n */\n private scrollToElement(target: Element, offset?: number): void {\n if (typeof window === 'undefined') return;\n\n const behavior = prefersReducedMotion() ? 'instant' as ScrollBehavior : 'smooth';\n\n if (offset !== undefined && offset !== 0) {\n // Use window.scrollTo with calculated position for header offset\n const rect = target.getBoundingClientRect();\n const scrollTop = window.pageYOffset ?? document.documentElement.scrollTop;\n const targetTop = rect.top + scrollTop - offset;\n\n window.scrollTo({\n top: targetTop,\n behavior,\n });\n } else {\n target.scrollIntoView({\n behavior,\n block: 'center',\n });\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Tour logic\n // -------------------------------------------------------------------------\n\n /**\n * Execute the current tour step: scroll to and highlight the section.\n */\n private executeTourStep(): void {\n if (this.tourCurrentStep < 0 || this.tourCurrentStep >= this.tourSectionIds.length) {\n return;\n }\n\n const sectionId = this.tourSectionIds[this.tourCurrentStep] as string | undefined;\n if (!sectionId) return;\n\n const total = this.tourSectionIds.length;\n const step = this.tourCurrentStep;\n\n // Scroll to the section first\n this.scrollToSection(sectionId);\n\n // Slight delay to let scroll settle, then highlight\n // Use a timeout so scrollIntoView can initiate\n setTimeout(() => {\n if (this.destroyed) return;\n\n const tooltipText = `Step ${step + 1} of ${total}`;\n\n this.highlight({\n sectionId,\n tooltip: tooltipText,\n position: 'auto',\n });\n\n // Notify tour step subscribers\n for (const cb of this.tourStepCallbacks) {\n try {\n cb(step, total, sectionId);\n } catch (e) {\n this.log('Tour step callback error', { error: String(e) });\n }\n }\n\n // Schedule auto-advance if in auto mode\n if (this.tourMode === 'auto') {\n this.scheduleAutoAdvance();\n }\n }, 100);\n }\n\n /**\n * Schedule auto-advance to the next tour step.\n */\n private scheduleAutoAdvance(): void {\n this.clearAutoTimer();\n\n if (this.tourMode !== 'auto') return;\n if (this.tourPausedByInteraction) return;\n\n this.tourAutoTimer = setTimeout(() => {\n if (!this.destroyed && !this.tourPausedByInteraction) {\n this.nextTourStep();\n }\n }, AUTO_TOUR_INTERVAL_MS);\n }\n\n /**\n * Clear the auto-advance timer.\n */\n private clearAutoTimer(): void {\n if (this.tourAutoTimer !== null) {\n clearTimeout(this.tourAutoTimer);\n this.tourAutoTimer = null;\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Accessibility — aria-live announcements\n // -------------------------------------------------------------------------\n\n /**\n * Announce a message to screen readers via an aria-live region.\n */\n private announce(message: string): void {\n if (typeof document === 'undefined') return;\n\n if (!this.liveRegionEl) {\n const region = document.createElement('div');\n region.setAttribute('aria-live', 'assertive');\n region.setAttribute('aria-atomic', 'true');\n region.setAttribute('data-guidekit-live', 'true');\n region.style.cssText = [\n 'position: absolute',\n 'width: 1px',\n 'height: 1px',\n 'padding: 0',\n 'margin: -1px',\n 'overflow: hidden',\n 'clip: rect(0, 0, 0, 0)',\n 'white-space: nowrap',\n 'border: 0',\n ].join('; ');\n document.body.appendChild(region);\n this.liveRegionEl = region;\n }\n\n // Clear and re-set to trigger announcement\n this.liveRegionEl.textContent = '';\n // Use a microtask to ensure the DOM update is flushed before re-setting\n requestAnimationFrame(() => {\n if (this.liveRegionEl) {\n this.liveRegionEl.textContent = message;\n }\n });\n }\n\n // -------------------------------------------------------------------------\n // Private: Subscriber notifications\n // -------------------------------------------------------------------------\n\n private notifySpotlightChange(): void {\n const stateCopy = this.state;\n for (const cb of this.spotlightChangeCallbacks) {\n try {\n cb(stateCopy);\n } catch (e) {\n this.log('Spotlight change callback error', { error: String(e) });\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Utilities\n // -------------------------------------------------------------------------\n\n /**\n * Get the transition duration, respecting prefers-reduced-motion.\n */\n private getTransitionDuration(): number {\n return prefersReducedMotion() ? 0 : this.animationDuration;\n }\n\n /**\n * Debug logger.\n */\n private log(message: string, data?: Record<string, unknown>): void {\n if (!this.debug) return;\n if (typeof console !== 'undefined') {\n if (data) {\n console.log(`${LOG_PREFIX} ${message}`, data);\n } else {\n console.log(`${LOG_PREFIX} ${message}`);\n }\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – User Awareness System\n// ---------------------------------------------------------------------------\n// Monitors user behavior signals (scroll, dwell, idle, rage-click, section\n// visibility) and emits awareness events via the EventBus.\n// ---------------------------------------------------------------------------\n\nimport { EventBus } from '../bus/index.js';\n\nconst LOG_PREFIX = '[GuideKit:Awareness]';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_IDLE_TIMEOUT_MS = 60_000;\nconst DEFAULT_DWELL_TIMEOUT_MS = 8_000;\nconst DEFAULT_RAGE_CLICK_THRESHOLD = 3;\nconst DEFAULT_RAGE_CLICK_WINDOW_MS = 2_000;\nconst RAGE_CLICK_RADIUS_PX = 50;\nconst MOUSE_THROTTLE_MS = 200;\n\n/** Selectors used to discover observable sections. */\nconst SECTION_SELECTOR = [\n '[data-guidekit-target]',\n '[id]',\n 'main',\n 'section',\n 'article',\n 'aside',\n 'nav',\n 'header',\n 'footer',\n].join(', ');\n\n/** IntersectionObserver thresholds for section visibility. */\nconst IO_THRESHOLDS: number[] = [0, 0.25, 0.5, 0.75, 1.0];\n\n// ---------------------------------------------------------------------------\n// Exported types\n// ---------------------------------------------------------------------------\n\nexport interface AwarenessOptions {\n bus: EventBus;\n rootElement?: HTMLElement;\n idleTimeoutMs?: number;\n dwellTimeoutMs?: number;\n rageClickThreshold?: number;\n rageClickWindowMs?: number;\n debug?: boolean;\n}\n\nexport interface AwarenessState {\n scrollPercent: number;\n scrollDirection: 'up' | 'down' | 'none';\n focusedSectionId: string | null;\n focusedSectionDwellMs: number;\n isIdle: boolean;\n lastInteractionAt: number;\n visibleSections: Map<string, number>;\n}\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\ninterface ClickRecord {\n x: number;\n y: number;\n timestamp: number;\n target: Element;\n}\n\n// ---------------------------------------------------------------------------\n// AwarenessSystem\n// ---------------------------------------------------------------------------\n\n/**\n * Observes user interactions with the page and emits structured awareness\n * events on the shared {@link EventBus}.\n *\n * All browser API usage is gated behind `typeof window !== 'undefined'` so\n * the module can be safely imported in SSR contexts.\n */\nexport class AwarenessSystem {\n // ---- Configuration ------------------------------------------------------\n\n private readonly bus: EventBus;\n private readonly rootElement: HTMLElement | undefined;\n private readonly idleTimeoutMs: number;\n private readonly dwellTimeoutMs: number;\n private readonly rageClickThreshold: number;\n private readonly rageClickWindowMs: number;\n private readonly debugEnabled: boolean;\n\n // ---- Runtime state ------------------------------------------------------\n\n private running = false;\n\n /** AbortController whose signal is passed to every addEventListener call. */\n private abortController: AbortController | null = null;\n\n /** IntersectionObserver for section visibility tracking. */\n private sectionObserver: IntersectionObserver | null = null;\n\n /** Section id -> current visibility ratio. */\n private readonly visibleSections = new Map<string, number>();\n\n // ---- Scroll tracking ----------------------------------------------------\n\n private scrollPercent = 0;\n private scrollDirection: 'up' | 'down' | 'none' = 'none';\n private lastScrollY = 0;\n private scrollRafPending = false;\n\n // ---- Dwell detection ----------------------------------------------------\n\n private focusedSectionId: string | null = null;\n private focusedSectionSince = 0;\n private dwellTimer: ReturnType<typeof setInterval> | null = null;\n private dwellEmitted = false;\n\n // ---- Idle detection -----------------------------------------------------\n\n private lastInteractionAt = 0;\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\n private isIdle = false;\n\n // ---- Rage click detection -----------------------------------------------\n\n private readonly recentClicks: ClickRecord[] = [];\n\n // ---- Mouse throttle -----------------------------------------------------\n\n private lastMouseMoveAt = 0;\n\n // -----------------------------------------------------------------------\n // Constructor\n // -----------------------------------------------------------------------\n\n constructor(options: AwarenessOptions) {\n this.bus = options.bus;\n this.rootElement = options.rootElement;\n this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;\n this.dwellTimeoutMs = options.dwellTimeoutMs ?? DEFAULT_DWELL_TIMEOUT_MS;\n this.rageClickThreshold = options.rageClickThreshold ?? DEFAULT_RAGE_CLICK_THRESHOLD;\n this.rageClickWindowMs = options.rageClickWindowMs ?? DEFAULT_RAGE_CLICK_WINDOW_MS;\n this.debugEnabled = options.debug ?? false;\n\n this.log('AwarenessSystem created');\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /** Begin observing user behavior. No-op if already running or in SSR. */\n start(): void {\n if (this.running) return;\n if (typeof window === 'undefined') {\n this.log('SSR environment detected — start() is a no-op');\n return;\n }\n\n this.running = true;\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n\n this.lastInteractionAt = Date.now();\n this.lastScrollY = window.scrollY;\n\n // -- Event listeners (all using the shared AbortController signal) -----\n const listenerOpts = { signal, passive: true } as const;\n\n window.addEventListener('scroll', this.handleScroll, listenerOpts);\n window.addEventListener('mousemove', this.handleMouseMove, listenerOpts);\n window.addEventListener('keydown', this.handleInteraction, listenerOpts);\n window.addEventListener('click', this.handleClick, { signal });\n window.addEventListener('touchstart', this.handleInteraction, listenerOpts);\n window.addEventListener('touchend', this.handleInteraction, listenerOpts);\n\n // -- IntersectionObserver for sections ---------------------------------\n this.initSectionObserver();\n\n // -- Idle timer --------------------------------------------------------\n this.scheduleIdleTimer();\n\n // -- Dwell check interval ---------------------------------------------\n this.dwellTimer = setInterval(this.checkDwell, 1_000);\n\n this.log('Monitoring started');\n }\n\n /** Stop all observers and listeners. */\n stop(): void {\n if (!this.running) return;\n\n this.running = false;\n\n // Abort all listeners in one call.\n this.abortController?.abort();\n this.abortController = null;\n\n // Tear down IntersectionObserver.\n if (this.sectionObserver) {\n this.sectionObserver.disconnect();\n this.sectionObserver = null;\n }\n\n // Clear timers.\n this.clearIdleTimer();\n this.clearDwellTimer();\n\n // Reset state.\n this.visibleSections.clear();\n this.recentClicks.length = 0;\n this.focusedSectionId = null;\n this.focusedSectionSince = 0;\n this.dwellEmitted = false;\n this.isIdle = false;\n this.scrollPercent = 0;\n this.scrollDirection = 'none';\n this.scrollRafPending = false;\n\n this.log('Monitoring stopped');\n }\n\n /** Alias for {@link stop}. */\n destroy(): void {\n this.stop();\n }\n\n /** Return a snapshot of the current awareness state. */\n getState(): AwarenessState {\n const now = Date.now();\n const dwellMs =\n this.focusedSectionId !== null\n ? now - this.focusedSectionSince\n : 0;\n\n return {\n scrollPercent: this.scrollPercent,\n scrollDirection: this.scrollDirection,\n focusedSectionId: this.focusedSectionId,\n focusedSectionDwellMs: dwellMs,\n isIdle: this.isIdle,\n lastInteractionAt: this.lastInteractionAt,\n visibleSections: new Map(this.visibleSections),\n };\n }\n\n // -----------------------------------------------------------------------\n // Scroll tracking\n // -----------------------------------------------------------------------\n\n private readonly handleScroll = (): void => {\n this.recordInteraction();\n\n if (this.scrollRafPending) return;\n this.scrollRafPending = true;\n\n requestAnimationFrame(() => {\n this.scrollRafPending = false;\n if (!this.running) return;\n\n const y = window.scrollY;\n const maxScroll = document.documentElement.scrollHeight - window.innerHeight;\n this.scrollPercent = maxScroll > 0 ? Math.min(1, y / maxScroll) : 0;\n\n if (y > this.lastScrollY) {\n this.scrollDirection = 'down';\n } else if (y < this.lastScrollY) {\n this.scrollDirection = 'up';\n }\n // If y === lastScrollY, keep the current direction.\n\n this.lastScrollY = y;\n });\n };\n\n // -----------------------------------------------------------------------\n // Mouse tracking (throttled)\n // -----------------------------------------------------------------------\n\n private readonly handleMouseMove = (): void => {\n const now = Date.now();\n if (now - this.lastMouseMoveAt < MOUSE_THROTTLE_MS) return;\n this.lastMouseMoveAt = now;\n\n this.recordInteraction();\n };\n\n // -----------------------------------------------------------------------\n // Click tracking & rage click detection\n // -----------------------------------------------------------------------\n\n private readonly handleClick = (e: Event): void => {\n this.recordInteraction();\n\n const mouseEvent = e as MouseEvent;\n const target = mouseEvent.target as Element | null;\n if (!target) return;\n\n const now = Date.now();\n const record: ClickRecord = {\n x: mouseEvent.clientX,\n y: mouseEvent.clientY,\n timestamp: now,\n target,\n };\n\n this.recentClicks.push(record);\n\n // Prune clicks outside the rage-click time window.\n const windowStart = now - this.rageClickWindowMs;\n while (this.recentClicks.length > 0 && this.recentClicks[0]!.timestamp < windowStart) {\n this.recentClicks.shift();\n }\n\n // Check for rage clicks: N+ clicks within the window on the same\n // element or within a small radius.\n const nearby = this.recentClicks.filter((c) => {\n const sameElement = c.target === target;\n const dx = c.x - record.x;\n const dy = c.y - record.y;\n const withinRadius = Math.sqrt(dx * dx + dy * dy) <= RAGE_CLICK_RADIUS_PX;\n return sameElement || withinRadius;\n });\n\n if (nearby.length >= this.rageClickThreshold) {\n const selector = this.buildSelector(target);\n this.bus.emit('awareness:rage-click', {\n selector,\n clicks: nearby.length,\n });\n this.log(`Rage click detected (${nearby.length} clicks) on \"${selector}\"`);\n\n // Clear clicks so we don't keep re-emitting for the same burst.\n this.recentClicks.length = 0;\n }\n };\n\n // -----------------------------------------------------------------------\n // Generic interaction handler (touch, keydown)\n // -----------------------------------------------------------------------\n\n private readonly handleInteraction = (): void => {\n this.recordInteraction();\n };\n\n // -----------------------------------------------------------------------\n // Interaction bookkeeping (shared by all handlers)\n // -----------------------------------------------------------------------\n\n private recordInteraction(): void {\n this.lastInteractionAt = Date.now();\n\n // If user was idle, mark active again and reset idle timer.\n if (this.isIdle) {\n this.isIdle = false;\n this.log('User returned from idle');\n }\n\n this.scheduleIdleTimer();\n }\n\n // -----------------------------------------------------------------------\n // Idle detection\n // -----------------------------------------------------------------------\n\n private scheduleIdleTimer(): void {\n this.clearIdleTimer();\n\n this.idleTimer = setTimeout(() => {\n if (!this.running) return;\n\n this.isIdle = true;\n const durationMs = Date.now() - this.lastInteractionAt;\n\n this.bus.emit('awareness:idle', { durationMs });\n this.log(`User idle for ${durationMs}ms`);\n }, this.idleTimeoutMs);\n }\n\n private clearIdleTimer(): void {\n if (this.idleTimer !== null) {\n clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n }\n\n // -----------------------------------------------------------------------\n // Dwell detection\n // -----------------------------------------------------------------------\n\n /**\n * Periodically (every 1s) check whether the user has been focused on the\n * same section long enough to trigger a dwell event.\n */\n private readonly checkDwell = (): void => {\n if (!this.running) return;\n\n // Determine the section with the highest visibility ratio.\n let bestId: string | null = null;\n let bestRatio = 0;\n\n for (const [id, ratio] of this.visibleSections) {\n if (ratio > bestRatio) {\n bestRatio = ratio;\n bestId = id;\n }\n }\n\n // If the focused section changed, reset the dwell tracker.\n if (bestId !== this.focusedSectionId) {\n this.focusedSectionId = bestId;\n this.focusedSectionSince = Date.now();\n this.dwellEmitted = false;\n return;\n }\n\n // If we have a focused section and haven't emitted yet, check duration.\n if (this.focusedSectionId !== null && !this.dwellEmitted) {\n const dwellMs = Date.now() - this.focusedSectionSince;\n if (dwellMs >= this.dwellTimeoutMs) {\n this.dwellEmitted = true;\n this.bus.emit('awareness:dwell', {\n sectionId: this.focusedSectionId,\n durationMs: dwellMs,\n });\n this.log(`Dwell on \"${this.focusedSectionId}\" (${dwellMs}ms)`);\n }\n }\n };\n\n private clearDwellTimer(): void {\n if (this.dwellTimer !== null) {\n clearInterval(this.dwellTimer);\n this.dwellTimer = null;\n }\n }\n\n // -----------------------------------------------------------------------\n // IntersectionObserver — section visibility\n // -----------------------------------------------------------------------\n\n private initSectionObserver(): void {\n if (typeof IntersectionObserver === 'undefined') {\n this.log('IntersectionObserver not available — section tracking disabled');\n return;\n }\n\n this.sectionObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const sectionId = this.getSectionId(entry.target);\n if (!sectionId) continue;\n\n const ratio = Math.round(entry.intersectionRatio * 100) / 100;\n const previous = this.visibleSections.get(sectionId);\n\n if (previous === ratio) continue;\n\n if (ratio === 0) {\n this.visibleSections.delete(sectionId);\n } else {\n this.visibleSections.set(sectionId, ratio);\n }\n\n this.bus.emit('awareness:section-visible', {\n sectionId,\n ratio,\n });\n }\n },\n {\n root: this.rootElement ?? null,\n threshold: IO_THRESHOLDS,\n },\n );\n\n this.observeSections();\n }\n\n /**\n * Query the DOM for observable sections and start observing them.\n */\n private observeSections(): void {\n if (!this.sectionObserver) return;\n\n const root = this.rootElement ?? document;\n const elements = root.querySelectorAll(SECTION_SELECTOR);\n\n if (elements.length === 0) {\n this.log('No observable sections found');\n return;\n }\n\n for (const el of elements) {\n this.sectionObserver.observe(el);\n }\n\n this.log(`Observing ${elements.length} section(s)`);\n }\n\n // -----------------------------------------------------------------------\n // Helpers\n // -----------------------------------------------------------------------\n\n /**\n * Derive a stable string identifier for a DOM element used as a section.\n *\n * Priority: `data-guidekit-target` > `id` > tagName.\n */\n private getSectionId(el: Element): string | null {\n const guidekitTarget = el.getAttribute('data-guidekit-target');\n if (guidekitTarget) return guidekitTarget;\n\n const id = el.getAttribute('id');\n if (id) return `#${id}`;\n\n // For semantic landmarks, use the tag name (lowercase).\n const tag = el.tagName.toLowerCase();\n const landmarks = ['main', 'section', 'article', 'aside', 'nav', 'header', 'footer'];\n if (landmarks.includes(tag)) return tag;\n\n return null;\n }\n\n /**\n * Build a simple CSS selector string for an element, suitable for\n * inclusion in rage-click events.\n */\n private buildSelector(el: Element): string {\n // Prefer id.\n if (el.id) return `#${el.id}`;\n\n // data-guidekit-target\n const target = el.getAttribute('data-guidekit-target');\n if (target) return `[data-guidekit-target=\"${target}\"]`;\n\n // Construct a tag.class selector.\n const tag = el.tagName.toLowerCase();\n const classes = Array.from(el.classList)\n .slice(0, 3) // Limit to avoid absurdly long selectors\n .map((c) => `.${c}`)\n .join('');\n\n return `${tag}${classes}`;\n }\n\n /** Conditional debug logging. */\n private log(...args: unknown[]): void {\n if (this.debugEnabled) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Proactive Trigger Engine\n// ---------------------------------------------------------------------------\n// Listens to awareness events on the EventBus and decides when to\n// proactively engage the user. The engine itself never shows UI or sends\n// LLM messages — it communicates via the `onTrigger` callback so the core\n// orchestrator can decide what action to take.\n// ---------------------------------------------------------------------------\n\nimport { EventBus } from '../bus/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Proactive]';\nconst STORAGE_KEY = 'guidekit:visited';\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\n/** Progressive dwell cooldowns in ms: 30s → 60s → 120s → stop. */\nconst DWELL_COOLDOWNS = [30_000, 60_000, 120_000];\nconst DWELL_THRESHOLD_MS = 8_000;\nconst IDLE_THRESHOLD_MS = 60_000;\nconst NAVIGATION_COOLDOWN_MS = 30_000;\nconst FORM_ABANDON_MS = 15_000;\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface ProactiveOptions {\n bus: EventBus;\n debug?: boolean;\n /** Callback invoked whenever a proactive trigger fires. */\n onTrigger?: (trigger: ProactiveTrigger) => void;\n}\n\nexport type ProactiveTriggerType =\n | 'greeting'\n | 'idle-help'\n | 'dwell-commentary'\n | 'navigation-commentary'\n | 'frustration'\n | 'form-abandonment';\n\nexport interface ProactiveTrigger {\n type: ProactiveTriggerType;\n sectionId?: string;\n selector?: string;\n /** Suggested context message for the LLM. */\n message?: string;\n timestamp: number;\n}\n\n// ---------------------------------------------------------------------------\n// ProactiveTriggerEngine\n// ---------------------------------------------------------------------------\n\nexport class ProactiveTriggerEngine {\n private readonly bus: EventBus;\n private readonly debug: boolean;\n private readonly onTrigger?: (trigger: ProactiveTrigger) => void;\n\n /** Collected unsubscribe functions from bus.on(). */\n private unsubs: Array<() => void> = [];\n\n /** Cooldown map: trigger key → last-fired timestamp. */\n private cooldowns = new Map<string, number>();\n\n /** Progressive dwell: sectionId → number of times triggered. */\n private dwellCounts = new Map<string, number>();\n\n /** Track forms the user started interacting with. */\n private formTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n /** Track sections where frustration already fired (once per section). */\n private frustrationFired = new Set<string>();\n\n /** Track whether idle-help has fired on this page. */\n private idleFiredThisPage = false;\n\n private _quietMode = false;\n private started = false;\n\n constructor(options: ProactiveOptions) {\n this.bus = options.bus;\n this.debug = options.debug ?? false;\n this.onTrigger = options.onTrigger;\n }\n\n // ---- quietMode accessor -------------------------------------------------\n\n get quietMode(): boolean {\n return this._quietMode;\n }\n\n set quietMode(value: boolean) {\n this._quietMode = value;\n if (this.debug) {\n console.debug(LOG_PREFIX, `Quiet mode ${value ? 'enabled' : 'disabled'}`);\n }\n }\n\n // ---- Lifecycle -----------------------------------------------------------\n\n /** Subscribe to bus events and check for first-visit greeting. */\n start(): void {\n if (this.started) return;\n this.started = true;\n\n this.checkFirstVisitGreeting();\n\n // awareness:idle\n this.unsubs.push(\n this.bus.on('awareness:idle', (data) => {\n this.handleIdle(data.durationMs);\n }),\n );\n\n // awareness:dwell\n this.unsubs.push(\n this.bus.on('awareness:dwell', (data) => {\n this.handleDwell(data.sectionId, data.durationMs);\n }),\n );\n\n // awareness:rage-click\n this.unsubs.push(\n this.bus.on('awareness:rage-click', (data) => {\n this.handleRageClick(data.selector, data.clicks);\n }),\n );\n\n // dom:route-change — used for navigation commentary + page reset\n this.unsubs.push(\n this.bus.on('dom:route-change', (data) => {\n this.handleDomRouteChange(data.from, data.to);\n }),\n );\n\n if (this.debug) {\n console.debug(LOG_PREFIX, 'Started — subscribed to awareness & dom events');\n }\n }\n\n /** Unsubscribe all bus listeners and clear internal state. */\n stop(): void {\n for (const unsub of this.unsubs) {\n unsub();\n }\n this.unsubs = [];\n\n // Clear any pending form-abandonment timers\n for (const timer of this.formTimers.values()) {\n clearTimeout(timer);\n }\n this.formTimers.clear();\n\n this.started = false;\n\n if (this.debug) {\n console.debug(LOG_PREFIX, 'Stopped — all listeners removed');\n }\n }\n\n /** Alias for {@link stop}. */\n destroy(): void {\n this.stop();\n }\n\n // ---- External notifications ---------------------------------------------\n\n /**\n * Notify the engine about a route change.\n * Called from the NavigationController or externally.\n */\n onRouteChange(from: string, to: string): void {\n this.handleNavigation(from, to);\n }\n\n /**\n * Notify the engine that the user started interacting with a form.\n * If the user does not continue within {@link FORM_ABANDON_MS}, a\n * `form-abandonment` trigger fires (once per form).\n */\n onFormInteractionStart(formSelector: string): void {\n // If there is already a timer for this form, reset it\n const existing = this.formTimers.get(formSelector);\n if (existing) {\n clearTimeout(existing);\n }\n\n const timer = setTimeout(() => {\n this.formTimers.delete(formSelector);\n this.fireTrigger({\n type: 'form-abandonment',\n selector: formSelector,\n message: `User started a form (${formSelector}) but stopped interacting for ${FORM_ABANDON_MS / 1000}s. They may need help.`,\n }, `form-abandonment:${formSelector}`);\n }, FORM_ABANDON_MS);\n\n this.formTimers.set(formSelector, timer);\n\n if (this.debug) {\n console.debug(LOG_PREFIX, `Form interaction started: ${formSelector}`);\n }\n }\n\n /** Reset all cooldowns and internal tracking state (useful for testing). */\n resetCooldowns(): void {\n this.cooldowns.clear();\n this.dwellCounts.clear();\n this.frustrationFired.clear();\n this.idleFiredThisPage = false;\n\n for (const timer of this.formTimers.values()) {\n clearTimeout(timer);\n }\n this.formTimers.clear();\n\n if (this.debug) {\n console.debug(LOG_PREFIX, 'All cooldowns and state reset');\n }\n }\n\n // ---- Internal handlers ---------------------------------------------------\n\n private checkFirstVisitGreeting(): void {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return;\n }\n\n try {\n const visited = localStorage.getItem(STORAGE_KEY);\n\n if (visited === null) {\n // First visit ever — fire greeting\n localStorage.setItem(STORAGE_KEY, Date.now().toString());\n\n this.fireTrigger({\n type: 'greeting',\n message: 'First-time visitor detected. Show a visual greeting (no audio).',\n }, 'greeting');\n\n if (this.debug) {\n console.debug(LOG_PREFIX, 'First visit — greeting triggered');\n }\n return;\n }\n\n // Return visitor — check if within 7 days\n const visitedAt = parseInt(visited, 10);\n if (!Number.isNaN(visitedAt)) {\n const elapsed = Date.now() - visitedAt;\n if (elapsed <= SEVEN_DAYS_MS && this.debug) {\n console.debug(LOG_PREFIX, 'Return visitor within 7 days — silent');\n } else if (this.debug) {\n console.debug(LOG_PREFIX, 'Return visitor after 7 days');\n }\n }\n } catch {\n // localStorage may be unavailable (e.g. iframe sandbox)\n if (this.debug) {\n console.warn(LOG_PREFIX, 'localStorage unavailable — skipping greeting check');\n }\n }\n }\n\n private handleIdle(durationMs: number): void {\n if (durationMs < IDLE_THRESHOLD_MS) return;\n if (this.idleFiredThisPage) return;\n\n this.idleFiredThisPage = true;\n\n this.fireTrigger({\n type: 'idle-help',\n message: `User has been idle for ${Math.round(durationMs / 1000)}s. They may be stuck or unsure what to do next.`,\n }, 'idle-help');\n }\n\n private handleDwell(sectionId: string, durationMs: number): void {\n if (durationMs < DWELL_THRESHOLD_MS) return;\n\n const count = this.dwellCounts.get(sectionId) ?? 0;\n\n // After 4 dwell triggers for the same section, stop entirely\n if (count >= DWELL_COOLDOWNS.length + 1) {\n if (this.debug) {\n console.debug(LOG_PREFIX, `Dwell cap reached for section \"${sectionId}\" — suppressed`);\n }\n return;\n }\n\n // Check progressive cooldown\n if (count > 0) {\n const cooldownMs = DWELL_COOLDOWNS[Math.min(count - 1, DWELL_COOLDOWNS.length - 1)]!;\n const key = `dwell:${sectionId}`;\n const lastFired = this.cooldowns.get(key) ?? 0;\n\n if (Date.now() - lastFired < cooldownMs) {\n if (this.debug) {\n console.debug(LOG_PREFIX, `Dwell cooldown active for \"${sectionId}\" — suppressed`);\n }\n return;\n }\n }\n\n this.dwellCounts.set(sectionId, count + 1);\n\n this.fireTrigger({\n type: 'dwell-commentary',\n sectionId,\n message: `User has been dwelling on section \"${sectionId}\" for ${Math.round(durationMs / 1000)}s. They may need more context.`,\n }, `dwell:${sectionId}`);\n }\n\n private handleRageClick(selector: string, clicks: number): void {\n // Derive a \"section\" key from the selector for once-per-section tracking\n const sectionKey = selector;\n\n if (this.frustrationFired.has(sectionKey)) {\n if (this.debug) {\n console.debug(LOG_PREFIX, `Frustration already fired for \"${selector}\" — suppressed`);\n }\n return;\n }\n\n this.frustrationFired.add(sectionKey);\n\n this.fireTrigger({\n type: 'frustration',\n selector,\n message: `User rage-clicked (${clicks} clicks) on \"${selector}\". They seem frustrated — offer help.`,\n }, `frustration:${sectionKey}`);\n }\n\n private handleNavigation(from: string, to: string): void {\n // Reset per-page cooldowns on page change\n this.idleFiredThisPage = false;\n\n const key = 'navigation-commentary';\n if (this.isCooldownActive(key, NAVIGATION_COOLDOWN_MS)) {\n if (this.debug) {\n console.debug(LOG_PREFIX, 'Navigation cooldown active — suppressed');\n }\n return;\n }\n\n this.fireTrigger({\n type: 'navigation-commentary',\n message: `User navigated from \"${from}\" to \"${to}\". Offer context about the new page.`,\n }, key);\n }\n\n /**\n * Handler for the bus `dom:route-change` event.\n * Delegates to the shared navigation logic.\n */\n private handleDomRouteChange(from: string, to: string): void {\n this.handleNavigation(from, to);\n }\n\n // ---- Trigger dispatch ----------------------------------------------------\n\n /**\n * Fire a trigger if quiet mode is off, recording the cooldown timestamp.\n */\n private fireTrigger(\n partial: Omit<ProactiveTrigger, 'timestamp'>,\n cooldownKey: string,\n ): void {\n if (this._quietMode) {\n if (this.debug) {\n console.debug(LOG_PREFIX, `Quiet mode — suppressed trigger: ${partial.type}`);\n }\n return;\n }\n\n const trigger: ProactiveTrigger = {\n ...partial,\n timestamp: Date.now(),\n };\n\n this.cooldowns.set(cooldownKey, trigger.timestamp);\n\n if (this.debug) {\n console.debug(LOG_PREFIX, 'Trigger fired:', trigger.type, trigger);\n }\n\n if (this.onTrigger) {\n try {\n this.onTrigger(trigger);\n } catch (err) {\n console.error(LOG_PREFIX, 'onTrigger callback error:', err);\n }\n }\n }\n\n // ---- Cooldown helpers ----------------------------------------------------\n\n private isCooldownActive(key: string, cooldownMs: number): boolean {\n const lastFired = this.cooldowns.get(key);\n if (lastFired === undefined) return false;\n return Date.now() - lastFired < cooldownMs;\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Client-Side Rate Limiter\n// ---------------------------------------------------------------------------\n//\n// Cost-protection guardrails. These limits are trivially bypassable and exist\n// solely to:\n// 1. Protect users from unexpected costs on BYOK keys\n// 2. Prevent runaway SDK loops from burning through API quotas\n//\n// NOT a security measure — documented as \"cost protection, not security\".\n// ---------------------------------------------------------------------------\n\nimport { EventBus } from '../bus/index.js';\nimport {\n ResourceExhaustedError,\n ErrorCodes,\n} from '../errors/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:RateLimiter]';\n\nconst DEFAULT_MAX_LLM_CALLS_PER_MINUTE = 10;\nconst DEFAULT_MAX_STT_MINUTES_PER_SESSION = 60;\nconst DEFAULT_MAX_TTS_CHARS_PER_SESSION = 50_000;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface RateLimits {\n maxLLMCallsPerMinute?: number;\n maxSTTMinutesPerSession?: number;\n maxTTSCharsPerSession?: number;\n}\n\nexport interface RateLimiterOptions {\n bus?: EventBus;\n limits?: RateLimits;\n debug?: boolean;\n}\n\nexport interface RateLimiterState {\n llmCallsInWindow: number;\n sttMinutesUsed: number;\n ttsCharsUsed: number;\n llmWindowStart: number;\n}\n\n// ---------------------------------------------------------------------------\n// RateLimiter\n// ---------------------------------------------------------------------------\n\nexport class RateLimiter {\n private readonly bus: EventBus | null;\n private readonly debug: boolean;\n\n // Configurable limits\n private maxLLMCallsPerMinute: number;\n private maxSTTMinutesPerSession: number;\n private maxTTSCharsPerSession: number;\n\n // LLM: sliding window (timestamps of recent calls)\n private llmCallTimestamps: number[] = [];\n\n // STT: cumulative session total (milliseconds for precision)\n private sttMs = 0;\n private sttStartedAt: number | null = null;\n\n // TTS: cumulative session total (characters)\n private ttsChars = 0;\n\n constructor(options?: RateLimiterOptions) {\n this.bus = options?.bus ?? null;\n this.debug = options?.debug ?? false;\n\n const limits = options?.limits;\n this.maxLLMCallsPerMinute =\n limits?.maxLLMCallsPerMinute ?? DEFAULT_MAX_LLM_CALLS_PER_MINUTE;\n this.maxSTTMinutesPerSession =\n limits?.maxSTTMinutesPerSession ?? DEFAULT_MAX_STT_MINUTES_PER_SESSION;\n this.maxTTSCharsPerSession =\n limits?.maxTTSCharsPerSession ?? DEFAULT_MAX_TTS_CHARS_PER_SESSION;\n }\n\n // -------------------------------------------------------------------------\n // LLM rate limiting\n // -------------------------------------------------------------------------\n\n /**\n * Check whether an LLM call is allowed. If allowed, records the call.\n * Throws `ResourceExhaustedError` if the limit is exceeded.\n */\n checkLLMCall(): void {\n const now = Date.now();\n const windowStart = now - 60_000;\n\n // Prune timestamps outside the 1-minute window\n this.llmCallTimestamps = this.llmCallTimestamps.filter(\n (t) => t > windowStart,\n );\n\n if (this.llmCallTimestamps.length >= this.maxLLMCallsPerMinute) {\n const err = new ResourceExhaustedError({\n code: ErrorCodes.RATE_LIMIT_CLIENT,\n message: `LLM rate limit exceeded: ${this.maxLLMCallsPerMinute} calls per minute.`,\n suggestion: `Wait a moment before sending another message, or increase rateLimits.maxLLMCallsPerMinute.`,\n });\n this.emitError(err);\n throw err;\n }\n\n this.llmCallTimestamps.push(now);\n this.log('LLM call recorded', {\n count: this.llmCallTimestamps.length,\n max: this.maxLLMCallsPerMinute,\n });\n }\n\n // -------------------------------------------------------------------------\n // STT rate limiting\n // -------------------------------------------------------------------------\n\n /** Call when STT streaming starts. */\n sttStart(): void {\n if (this.sttStartedAt !== null) return; // already streaming\n this.sttStartedAt = Date.now();\n this.log('STT streaming started');\n }\n\n /** Call when STT streaming stops. Accumulates duration. */\n sttStop(): void {\n if (this.sttStartedAt === null) return;\n const elapsed = Date.now() - this.sttStartedAt;\n this.sttMs += elapsed;\n this.sttStartedAt = null;\n this.log('STT streaming stopped', {\n elapsedMs: elapsed,\n totalMinutes: this.sttMinutesUsed,\n });\n }\n\n /**\n * Check whether STT streaming is within limits.\n * Throws `ResourceExhaustedError` if exceeded.\n */\n checkSTT(): void {\n const totalMinutes = this.sttMinutesUsed;\n if (totalMinutes >= this.maxSTTMinutesPerSession) {\n this.sttStop(); // stop the clock\n const err = new ResourceExhaustedError({\n code: ErrorCodes.RATE_LIMIT_CLIENT,\n message: `STT session limit exceeded: ${this.maxSTTMinutesPerSession} minutes per session.`,\n suggestion: `Voice input limit reached. Use text input, or increase rateLimits.maxSTTMinutesPerSession.`,\n });\n this.emitError(err);\n throw err;\n }\n }\n\n /** Current STT minutes used (including active stream). */\n private get sttMinutesUsed(): number {\n let totalMs = this.sttMs;\n if (this.sttStartedAt !== null) {\n totalMs += Date.now() - this.sttStartedAt;\n }\n return totalMs / 60_000;\n }\n\n // -------------------------------------------------------------------------\n // TTS rate limiting\n // -------------------------------------------------------------------------\n\n /**\n * Record TTS character usage. Throws `ResourceExhaustedError` if limit exceeded.\n */\n checkTTS(charCount: number): void {\n if (this.ttsChars + charCount > this.maxTTSCharsPerSession) {\n const err = new ResourceExhaustedError({\n code: ErrorCodes.RATE_LIMIT_CLIENT,\n message: `TTS character limit exceeded: ${this.maxTTSCharsPerSession} characters per session.`,\n suggestion: `Voice output limit reached. Responses will be text-only, or increase rateLimits.maxTTSCharsPerSession.`,\n });\n this.emitError(err);\n throw err;\n }\n\n this.ttsChars += charCount;\n this.log('TTS chars recorded', {\n added: charCount,\n total: this.ttsChars,\n max: this.maxTTSCharsPerSession,\n });\n }\n\n // -------------------------------------------------------------------------\n // State & config\n // -------------------------------------------------------------------------\n\n /** Get the current rate limiter state for monitoring. */\n getState(): RateLimiterState {\n const now = Date.now();\n const windowStart = now - 60_000;\n return {\n llmCallsInWindow: this.llmCallTimestamps.filter((t) => t > windowStart)\n .length,\n sttMinutesUsed: Math.round(this.sttMinutesUsed * 100) / 100,\n ttsCharsUsed: this.ttsChars,\n llmWindowStart: windowStart,\n };\n }\n\n /** Update limits at runtime. */\n setLimits(limits: RateLimits): void {\n if (limits.maxLLMCallsPerMinute !== undefined) {\n this.maxLLMCallsPerMinute = limits.maxLLMCallsPerMinute;\n }\n if (limits.maxSTTMinutesPerSession !== undefined) {\n this.maxSTTMinutesPerSession = limits.maxSTTMinutesPerSession;\n }\n if (limits.maxTTSCharsPerSession !== undefined) {\n this.maxTTSCharsPerSession = limits.maxTTSCharsPerSession;\n }\n this.log('Limits updated', limits);\n }\n\n /** Reset all counters (e.g., for testing or new session). */\n reset(): void {\n this.llmCallTimestamps = [];\n this.sttMs = 0;\n this.sttStartedAt = null;\n this.ttsChars = 0;\n this.log('Counters reset');\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private emitError(err: ResourceExhaustedError): void {\n if (this.bus) {\n this.bus.emit('error', err);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// -----------------------------------------------------------------------\n// GuideKit SDK - Internationalization (i18n) Module\n// Provides localized strings for all SDK UI elements.\n// -----------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** All translatable string keys used by the SDK UI. */\nexport interface I18nStrings {\n // Widget\n widgetTitle: string;\n openAssistant: string;\n closeAssistant: string;\n closePanel: string;\n sendMessage: string;\n inputPlaceholder: string;\n listeningPlaceholder: string;\n startVoice: string;\n stopVoice: string;\n\n // Status\n statusOnline: string;\n statusConnecting: string;\n statusOffline: string;\n statusListening: string;\n statusSpeaking: string;\n statusProcessing: string;\n\n // Empty state\n emptyStateMessage: string;\n\n // Errors\n errorGeneric: string;\n errorNetwork: string;\n errorMicDenied: string;\n errorRateLimit: string;\n\n // Proactive\n greetingMessage: string;\n idleHelpMessage: string;\n\n // Voice\n voiceDegradedNotice: string;\n\n // Quiet mode\n quietModeOn: string;\n quietModeOff: string;\n}\n\nexport type SupportedLocale = 'en' | 'es' | 'fr' | 'de' | 'ja' | 'zh' | 'ar' | 'pt';\n\nexport type LocaleInput = SupportedLocale | 'auto' | I18nStrings;\n\nexport interface I18nOptions {\n locale?: LocaleInput;\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in locale data\n// ---------------------------------------------------------------------------\n\nconst en: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'Open assistant',\n closeAssistant: 'Close assistant',\n closePanel: 'Close assistant panel',\n sendMessage: 'Send message',\n inputPlaceholder: 'Ask a question...',\n listeningPlaceholder: 'Listening...',\n startVoice: 'Start voice input',\n stopVoice: 'Stop voice input',\n\n statusOnline: 'Online',\n statusConnecting: 'Connecting...',\n statusOffline: 'Offline',\n statusListening: 'Listening...',\n statusSpeaking: 'Speaking...',\n statusProcessing: 'Processing...',\n\n emptyStateMessage:\n 'Ask me anything about this page. I can help you navigate, understand content, and more.',\n\n errorGeneric: 'Something went wrong. Please try again.',\n errorNetwork: 'Connection lost. Reconnecting...',\n errorMicDenied:\n 'Microphone access was denied. Please enable it in your browser settings.',\n errorRateLimit: 'Too many requests. Please wait a moment.',\n\n greetingMessage: 'Hi! Need help navigating this page?',\n idleHelpMessage: 'Still here if you need help!',\n\n voiceDegradedNotice: 'Voice unavailable. Switched to text mode.',\n\n quietModeOn: 'Notifications paused',\n quietModeOff: 'Notifications resumed',\n};\n\nconst es: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'Abrir asistente',\n closeAssistant: 'Cerrar asistente',\n closePanel: 'Cerrar panel del asistente',\n sendMessage: 'Enviar mensaje',\n inputPlaceholder: 'Haz una pregunta...',\n listeningPlaceholder: 'Escuchando...',\n startVoice: 'Iniciar entrada de voz',\n stopVoice: 'Detener entrada de voz',\n\n statusOnline: 'En linea',\n statusConnecting: 'Conectando...',\n statusOffline: 'Sin conexion',\n statusListening: 'Escuchando...',\n statusSpeaking: 'Hablando...',\n statusProcessing: 'Procesando...',\n\n emptyStateMessage:\n 'Preguntame lo que quieras sobre esta pagina. Puedo ayudarte a navegar, entender el contenido y mucho mas.',\n\n errorGeneric: 'Algo salio mal. Por favor, intentalo de nuevo.',\n errorNetwork: 'Se perdio la conexion. Reconectando...',\n errorMicDenied:\n 'Se denego el acceso al microfono. Activalo en la configuracion de tu navegador.',\n errorRateLimit: 'Demasiadas solicitudes. Espera un momento, por favor.',\n\n greetingMessage: 'Hola! Necesitas ayuda para navegar esta pagina?',\n idleHelpMessage: 'Sigo aqui por si necesitas ayuda.',\n\n voiceDegradedNotice: 'Voz no disponible. Se cambio al modo de texto.',\n\n quietModeOn: 'Notificaciones en pausa',\n quietModeOff: 'Notificaciones reanudadas',\n};\n\nconst fr: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: \"Ouvrir l'assistant\",\n closeAssistant: \"Fermer l'assistant\",\n closePanel: \"Fermer le panneau de l'assistant\",\n sendMessage: 'Envoyer le message',\n inputPlaceholder: 'Posez une question...',\n listeningPlaceholder: \"A l'ecoute...\",\n startVoice: 'Activer la saisie vocale',\n stopVoice: 'Arreter la saisie vocale',\n\n statusOnline: 'En ligne',\n statusConnecting: 'Connexion en cours...',\n statusOffline: 'Hors ligne',\n statusListening: \"A l'ecoute...\",\n statusSpeaking: 'En train de parler...',\n statusProcessing: 'Traitement en cours...',\n\n emptyStateMessage:\n 'Posez-moi vos questions sur cette page. Je peux vous aider a naviguer, comprendre le contenu et bien plus.',\n\n errorGeneric: \"Une erreur s'est produite. Veuillez reessayer.\",\n errorNetwork: 'Connexion perdue. Reconnexion en cours...',\n errorMicDenied:\n \"L'acces au microphone a ete refuse. Veuillez l'activer dans les parametres de votre navigateur.\",\n errorRateLimit: 'Trop de requetes. Veuillez patienter un instant.',\n\n greetingMessage: 'Bonjour ! Besoin d\\'aide pour naviguer sur cette page ?',\n idleHelpMessage: 'Je suis toujours la si vous avez besoin d\\'aide !',\n\n voiceDegradedNotice: 'Voix indisponible. Passage en mode texte.',\n\n quietModeOn: 'Notifications en pause',\n quietModeOff: 'Notifications reprises',\n};\n\nconst de: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'Assistent oeffnen',\n closeAssistant: 'Assistent schliessen',\n closePanel: 'Assistenten-Panel schliessen',\n sendMessage: 'Nachricht senden',\n inputPlaceholder: 'Stelle eine Frage...',\n listeningPlaceholder: 'Hoert zu...',\n startVoice: 'Spracheingabe starten',\n stopVoice: 'Spracheingabe stoppen',\n\n statusOnline: 'Online',\n statusConnecting: 'Verbindung wird hergestellt...',\n statusOffline: 'Offline',\n statusListening: 'Hoert zu...',\n statusSpeaking: 'Spricht...',\n statusProcessing: 'Verarbeitung...',\n\n emptyStateMessage:\n 'Frag mich alles zu dieser Seite. Ich kann dir bei der Navigation helfen, Inhalte erklaeren und vieles mehr.',\n\n errorGeneric: 'Etwas ist schiefgelaufen. Bitte versuche es erneut.',\n errorNetwork: 'Verbindung verloren. Verbindung wird wiederhergestellt...',\n errorMicDenied:\n 'Mikrofonzugriff wurde verweigert. Bitte aktiviere ihn in deinen Browsereinstellungen.',\n errorRateLimit: 'Zu viele Anfragen. Bitte warte einen Moment.',\n\n greetingMessage: 'Hallo! Brauchst du Hilfe beim Navigieren auf dieser Seite?',\n idleHelpMessage: 'Ich bin noch da, falls du Hilfe brauchst!',\n\n voiceDegradedNotice: 'Sprache nicht verfuegbar. Wechsel zum Textmodus.',\n\n quietModeOn: 'Benachrichtigungen pausiert',\n quietModeOff: 'Benachrichtigungen fortgesetzt',\n};\n\nconst ja: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'アシスタントを開く',\n closeAssistant: 'アシスタントを閉じる',\n closePanel: 'アシスタントパネルを閉じる',\n sendMessage: 'メッセージを送信',\n inputPlaceholder: '質問してください...',\n listeningPlaceholder: '聞いています...',\n startVoice: '音声入力を開始',\n stopVoice: '音声入力を停止',\n\n statusOnline: 'オンライン',\n statusConnecting: '接続中...',\n statusOffline: 'オフライン',\n statusListening: '聞いています...',\n statusSpeaking: '話しています...',\n statusProcessing: '処理中...',\n\n emptyStateMessage:\n 'このページについて何でも聞いてください。ナビゲーション、コンテンツの理解など、お手伝いします。',\n\n errorGeneric: '問題が発生しました。もう一度お試しください。',\n errorNetwork: '接続が切断されました。再接続しています...',\n errorMicDenied:\n 'マイクへのアクセスが拒否されました。ブラウザの設定で有効にしてください。',\n errorRateLimit: 'リクエストが多すぎます。少々お待ちください。',\n\n greetingMessage: 'こんにちは!このページのナビゲーションでお手伝いしましょうか?',\n idleHelpMessage: 'お手伝いが必要でしたら、いつでもどうぞ!',\n\n voiceDegradedNotice: '音声が利用できません。テキストモードに切り替えました。',\n\n quietModeOn: '通知を一時停止中',\n quietModeOff: '通知を再開しました',\n};\n\nconst zh: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: '打开助手',\n closeAssistant: '关闭助手',\n closePanel: '关闭助手面板',\n sendMessage: '发送消息',\n inputPlaceholder: '请提问...',\n listeningPlaceholder: '正在聆听...',\n startVoice: '开始语音输入',\n stopVoice: '停止语音输入',\n\n statusOnline: '在线',\n statusConnecting: '连接中...',\n statusOffline: '离线',\n statusListening: '正在聆听...',\n statusSpeaking: '正在播报...',\n statusProcessing: '处理中...',\n\n emptyStateMessage:\n '关于这个页面,你可以问我任何问题。我可以帮你浏览页面、理解内容等等。',\n\n errorGeneric: '出了点问题,请重试。',\n errorNetwork: '连接已断开,正在重新连接...',\n errorMicDenied: '麦克风权限被拒绝,请在浏览器设置中开启。',\n errorRateLimit: '请求过于频繁,请稍候再试。',\n\n greetingMessage: '你好!需要帮你浏览这个页面吗?',\n idleHelpMessage: '我还在这里,随时可以帮忙!',\n\n voiceDegradedNotice: '语音不可用,已切换为文字模式。',\n\n quietModeOn: '通知已暂停',\n quietModeOff: '通知已恢复',\n};\n\nconst ar: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'فتح المساعد',\n closeAssistant: 'إغلاق المساعد',\n closePanel: 'إغلاق لوحة المساعد',\n sendMessage: 'إرسال الرسالة',\n inputPlaceholder: 'اطرح سؤالاً...',\n listeningPlaceholder: 'جارٍ الاستماع...',\n startVoice: 'بدء الإدخال الصوتي',\n stopVoice: 'إيقاف الإدخال الصوتي',\n\n statusOnline: 'متصل',\n statusConnecting: 'جارٍ الاتصال...',\n statusOffline: 'غير متصل',\n statusListening: 'جارٍ الاستماع...',\n statusSpeaking: 'جارٍ التحدث...',\n statusProcessing: 'جارٍ المعالجة...',\n\n emptyStateMessage:\n 'اسألني أي شيء عن هذه الصفحة. يمكنني مساعدتك في التنقل وفهم المحتوى والمزيد.',\n\n errorGeneric: 'حدث خطأ ما. يرجى المحاولة مرة أخرى.',\n errorNetwork: 'انقطع الاتصال. جارٍ إعادة الاتصال...',\n errorMicDenied:\n 'تم رفض الوصول إلى الميكروفون. يرجى تفعيله من إعدادات المتصفح.',\n errorRateLimit: 'طلبات كثيرة جداً. يرجى الانتظار لحظة.',\n\n greetingMessage: 'مرحباً! هل تحتاج مساعدة في تصفح هذه الصفحة؟',\n idleHelpMessage: 'ما زلت هنا إذا احتجت مساعدة!',\n\n voiceDegradedNotice: 'الصوت غير متاح. تم التبديل إلى الوضع النصي.',\n\n quietModeOn: 'الإشعارات متوقفة مؤقتاً',\n quietModeOff: 'تم استئناف الإشعارات',\n};\n\nconst pt: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'Abrir assistente',\n closeAssistant: 'Fechar assistente',\n closePanel: 'Fechar painel do assistente',\n sendMessage: 'Enviar mensagem',\n inputPlaceholder: 'Faca uma pergunta...',\n listeningPlaceholder: 'Ouvindo...',\n startVoice: 'Iniciar entrada de voz',\n stopVoice: 'Parar entrada de voz',\n\n statusOnline: 'Online',\n statusConnecting: 'Conectando...',\n statusOffline: 'Offline',\n statusListening: 'Ouvindo...',\n statusSpeaking: 'Falando...',\n statusProcessing: 'Processando...',\n\n emptyStateMessage:\n 'Pergunte-me o que quiser sobre esta pagina. Posso ajudar a navegar, entender o conteudo e muito mais.',\n\n errorGeneric: 'Algo deu errado. Por favor, tente novamente.',\n errorNetwork: 'Conexao perdida. Reconectando...',\n errorMicDenied:\n 'O acesso ao microfone foi negado. Ative-o nas configuracoes do seu navegador.',\n errorRateLimit: 'Muitas solicitacoes. Aguarde um momento, por favor.',\n\n greetingMessage: 'Ola! Precisa de ajuda para navegar nesta pagina?',\n idleHelpMessage: 'Ainda estou aqui se precisar de ajuda!',\n\n voiceDegradedNotice: 'Voz indisponivel. Alternado para o modo texto.',\n\n quietModeOn: 'Notificacoes pausadas',\n quietModeOff: 'Notificacoes retomadas',\n};\n\n// ---------------------------------------------------------------------------\n// Locale registry\n// ---------------------------------------------------------------------------\n\nconst BUILTIN_LOCALES: Record<SupportedLocale, I18nStrings> = {\n en,\n es,\n fr,\n de,\n ja,\n zh,\n ar,\n pt,\n};\n\nconst SUPPORTED_LOCALE_CODES = new Set<string>(Object.keys(BUILTIN_LOCALES));\n\nconst LOG_PREFIX = '[GuideKit:I18n]';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isSupportedLocale(code: string): code is SupportedLocale {\n return SUPPORTED_LOCALE_CODES.has(code);\n}\n\nfunction isI18nStrings(input: unknown): input is I18nStrings {\n if (typeof input !== 'object' || input === null) return false;\n // Check for a handful of required keys to distinguish from other objects\n const obj = input as Record<string, unknown>;\n return (\n typeof obj.widgetTitle === 'string' &&\n typeof obj.sendMessage === 'string' &&\n typeof obj.errorGeneric === 'string'\n );\n}\n\n/**\n * Detect the user's locale from the `<html lang>` attribute.\n * SSR-safe: returns 'en' when `document` is not available.\n */\nfunction detectLocaleFromDocument(): SupportedLocale {\n if (typeof document === 'undefined') {\n return 'en';\n }\n\n const htmlLang = document.documentElement?.lang;\n if (!htmlLang) {\n return 'en';\n }\n\n const normalized = htmlLang.trim().toLowerCase();\n\n // Exact match (e.g. 'en', 'pt')\n if (isSupportedLocale(normalized)) {\n return normalized;\n }\n\n // Language prefix match (e.g. 'en-US' -> 'en', 'pt-BR' -> 'pt')\n const prefix = normalized.split('-')[0] ?? '';\n if (isSupportedLocale(prefix)) {\n return prefix;\n }\n\n return 'en';\n}\n\n// ---------------------------------------------------------------------------\n// I18n class\n// ---------------------------------------------------------------------------\n\nexport class I18n {\n private strings: I18nStrings;\n private resolvedLocale: string;\n private debug: boolean;\n\n constructor(options?: I18nOptions) {\n this.debug = options?.debug ?? false;\n const locale = options?.locale ?? 'auto';\n const { strings, resolvedLocale } = this.resolve(locale);\n this.strings = strings;\n this.resolvedLocale = resolvedLocale;\n\n if (this.debug) {\n console.debug(`${LOG_PREFIX} Initialized with locale \"${this.resolvedLocale}\"`);\n }\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /** Get a translated string by key. */\n t(key: keyof I18nStrings): string {\n const value = this.strings[key];\n if (value === undefined) {\n if (this.debug) {\n console.warn(`${LOG_PREFIX} Missing translation key \"${key}\"`);\n }\n // Fallback to English for missing keys in custom string maps\n return en[key] ?? key;\n }\n return value;\n }\n\n /** Get all strings for the current locale. */\n getStrings(): I18nStrings {\n return { ...this.strings };\n }\n\n /** Change the current locale at runtime. */\n setLocale(locale: LocaleInput): void {\n const { strings, resolvedLocale } = this.resolve(locale);\n this.strings = strings;\n this.resolvedLocale = resolvedLocale;\n\n if (this.debug) {\n console.debug(`${LOG_PREFIX} Locale changed to \"${this.resolvedLocale}\"`);\n }\n }\n\n /** The current resolved locale code (e.g. 'en', 'fr', or 'custom'). */\n get currentLocale(): string {\n return this.resolvedLocale;\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private resolve(locale: LocaleInput): {\n strings: I18nStrings;\n resolvedLocale: string;\n } {\n // Custom string map provided directly\n if (isI18nStrings(locale)) {\n // Merge with English defaults so partial overrides still work\n return {\n strings: { ...en, ...locale },\n resolvedLocale: 'custom',\n };\n }\n\n // Auto-detect from the document\n if (locale === 'auto') {\n const detected = detectLocaleFromDocument();\n if (this.debug) {\n console.debug(`${LOG_PREFIX} Auto-detected locale \"${detected}\"`);\n }\n return {\n strings: BUILTIN_LOCALES[detected],\n resolvedLocale: detected,\n };\n }\n\n // Explicit supported locale code\n if (isSupportedLocale(locale)) {\n return {\n strings: BUILTIN_LOCALES[locale],\n resolvedLocale: locale,\n };\n }\n\n // Unknown locale code -- fall back to English\n if (this.debug) {\n console.warn(\n `${LOG_PREFIX} Unknown locale \"${String(locale)}\", falling back to \"en\"`,\n );\n }\n return {\n strings: en,\n resolvedLocale: 'en',\n };\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Client-side Token Manager\n// ---------------------------------------------------------------------------\n//\n// Handles the full token lifecycle:\n// - Fetch token from the developer's token endpoint on init\n// - Auto-refresh at 80% of TTL\n// - BroadcastChannel multi-tab coordination with leader election\n// - localStorage fallback for browsers without BroadcastChannel\n// - Emits auth events (token-refreshed, token-refresh-failed, token-expired)\n// ---------------------------------------------------------------------------\n\nimport type { EventBus } from '../bus/index.js';\nimport { AuthenticationError, ErrorCodes } from '../errors/index.js';\n\nconst LOG_PREFIX = '[GuideKit:Auth]';\nconst REFRESH_THRESHOLD = 0.8; // Refresh at 80% of TTL\nconst MAX_RETRY_ATTEMPTS = 3;\nconst RETRY_BASE_MS = 1_000;\nconst BC_CHANNEL_NAME = 'guidekit-token';\nconst LS_KEY_PREFIX = 'guidekit-token:';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TokenData {\n token: string;\n expiresAt: number; // Unix seconds\n expiresIn: number; // Seconds from issuance\n fetchedAt: number; // Date.now() when fetched\n}\n\nexport interface TokenManagerOptions {\n tokenEndpoint: string;\n instanceId: string;\n bus: EventBus;\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// TokenManager\n// ---------------------------------------------------------------------------\n\nexport class TokenManager {\n private readonly endpoint: string;\n private readonly instanceId: string;\n private readonly bus: EventBus;\n private readonly debug: boolean;\n\n private _token: TokenData | null = null;\n private _refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private _isLeader = false;\n private _bc: BroadcastChannel | null = null;\n private _destroyed = false;\n\n constructor(options: TokenManagerOptions) {\n this.endpoint = options.tokenEndpoint;\n this.instanceId = options.instanceId;\n this.bus = options.bus;\n this.debug = options.debug ?? false;\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /** Current token string, or null if not yet fetched. */\n get token(): string | null {\n return this._token?.token ?? null;\n }\n\n /** Current token data, or null if not yet fetched. */\n get tokenData(): TokenData | null {\n return this._token;\n }\n\n /** Whether this tab is the leader for token refresh. */\n get isLeader(): boolean {\n return this._isLeader;\n }\n\n /**\n * Initialize the token manager: elect leader, fetch initial token,\n * schedule auto-refresh.\n */\n async start(): Promise<void> {\n if (this._destroyed) return;\n\n this.setupBroadcastChannel();\n this.electLeader();\n\n // Try to load a cached token from localStorage first\n const cached = this.loadFromStorage();\n if (cached && !this.isExpired(cached)) {\n this._token = cached;\n this.log('Loaded cached token from localStorage');\n this.scheduleRefresh();\n return;\n }\n\n // Fetch a fresh token\n await this.fetchToken();\n }\n\n /**\n * Force a token refresh, regardless of TTL.\n */\n async refresh(): Promise<void> {\n await this.fetchToken();\n }\n\n /**\n * Clean up timers, BroadcastChannel, and release leader.\n */\n destroy(): void {\n this._destroyed = true;\n\n if (this._refreshTimer !== null) {\n clearTimeout(this._refreshTimer);\n this._refreshTimer = null;\n }\n\n if (this._bc) {\n this._bc.close();\n this._bc = null;\n }\n\n this._token = null;\n this._isLeader = false;\n }\n\n // -------------------------------------------------------------------------\n // Token fetching\n // -------------------------------------------------------------------------\n\n private async fetchToken(attempt = 1): Promise<void> {\n if (this._destroyed) return;\n\n this.log(`Fetching token (attempt ${attempt}/${MAX_RETRY_ATTEMPTS})`);\n\n try {\n const response = await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ instanceId: this.instanceId }),\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => '');\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError({\n code: ErrorCodes.AUTH_INVALID_KEY,\n message: `Token endpoint returned ${response.status}: ${body}`,\n suggestion: 'Check your tokenEndpoint URL and server authentication.',\n });\n }\n // Retryable server error\n throw new Error(`Token endpoint returned ${response.status}: ${body}`);\n }\n\n const data = await response.json() as {\n token?: string;\n expiresIn?: number;\n expiresAt?: number;\n };\n\n if (!data.token || typeof data.token !== 'string') {\n throw new AuthenticationError({\n code: ErrorCodes.AUTH_ENDPOINT_FAILED,\n message: 'Token endpoint response missing \"token\" field.',\n suggestion: 'Ensure your token endpoint returns { token, expiresIn, expiresAt }.',\n });\n }\n\n const tokenData: TokenData = {\n token: data.token,\n expiresAt: data.expiresAt ?? Math.floor(Date.now() / 1000) + (data.expiresIn ?? 900),\n expiresIn: data.expiresIn ?? 900,\n fetchedAt: Date.now(),\n };\n\n this._token = tokenData;\n this.saveToStorage(tokenData);\n this.broadcastToken(tokenData);\n this.scheduleRefresh();\n\n this.bus.emit('auth:token-refreshed', { expiresAt: tokenData.expiresAt });\n this.log(`Token fetched, expires at ${new Date(tokenData.expiresAt * 1000).toISOString()}`);\n } catch (error) {\n const remaining = MAX_RETRY_ATTEMPTS - attempt;\n\n if (remaining > 0 && !(error instanceof AuthenticationError)) {\n this.log(`Token fetch failed, retrying in ${RETRY_BASE_MS * attempt}ms`);\n this.bus.emit('auth:token-refresh-failed', {\n error: error instanceof Error ? error : new Error(String(error)),\n attemptsRemaining: remaining,\n });\n\n await new Promise((resolve) =>\n setTimeout(resolve, RETRY_BASE_MS * attempt),\n );\n return this.fetchToken(attempt + 1);\n }\n\n // All retries exhausted\n this.bus.emit('auth:token-refresh-failed', {\n error: error instanceof Error ? error : new Error(String(error)),\n attemptsRemaining: 0,\n });\n\n if (error instanceof AuthenticationError) throw error;\n\n throw new AuthenticationError({\n code: ErrorCodes.AUTH_ENDPOINT_FAILED,\n message: `Failed to fetch token after ${MAX_RETRY_ATTEMPTS} attempts: ${error instanceof Error ? error.message : String(error)}`,\n suggestion: 'Check your tokenEndpoint URL and network connection.',\n });\n }\n }\n\n // -------------------------------------------------------------------------\n // Auto-refresh scheduling\n // -------------------------------------------------------------------------\n\n private scheduleRefresh(): void {\n if (this._destroyed || !this._token) return;\n\n // Clear existing timer\n if (this._refreshTimer !== null) {\n clearTimeout(this._refreshTimer);\n }\n\n const now = Date.now();\n const tokenAgeMs = now - this._token.fetchedAt;\n const ttlMs = this._token.expiresIn * 1000;\n const refreshAtMs = ttlMs * REFRESH_THRESHOLD;\n const delayMs = Math.max(0, refreshAtMs - tokenAgeMs);\n\n this.log(`Scheduling refresh in ${Math.round(delayMs / 1000)}s (80% of ${this._token.expiresIn}s TTL)`);\n\n this._refreshTimer = setTimeout(() => {\n if (this._destroyed) return;\n\n // Only the leader refreshes\n if (this._isLeader) {\n this.log('Leader performing scheduled refresh');\n this.fetchToken().catch((err) => {\n this.log(`Scheduled refresh failed: ${err}`);\n });\n } else {\n this.log('Not leader, skipping refresh (will receive via BroadcastChannel)');\n // Schedule another check in case we become leader\n this.scheduleExpiredCheck();\n }\n }, delayMs);\n }\n\n private scheduleExpiredCheck(): void {\n if (this._destroyed || !this._token) return;\n\n const now = Date.now();\n const expiresAtMs = this._token.expiresAt * 1000;\n const delayMs = Math.max(0, expiresAtMs - now);\n\n this._refreshTimer = setTimeout(() => {\n if (this._destroyed) return;\n if (this._token && this.isExpired(this._token)) {\n this.bus.emit('auth:token-expired', {} as Record<string, never>);\n // Try to refresh as last resort\n this.electLeader();\n if (this._isLeader) {\n this.fetchToken().catch(() => {});\n }\n }\n }, delayMs);\n }\n\n // -------------------------------------------------------------------------\n // BroadcastChannel (multi-tab coordination)\n // -------------------------------------------------------------------------\n\n private setupBroadcastChannel(): void {\n if (typeof BroadcastChannel === 'undefined') {\n // Fallback: always be leader if no BroadcastChannel\n this._isLeader = true;\n this.log('BroadcastChannel unavailable, acting as leader');\n return;\n }\n\n try {\n this._bc = new BroadcastChannel(`${BC_CHANNEL_NAME}:${this.instanceId}`);\n this._bc.onmessage = (event) => {\n const msg = event.data as { type: string; token?: TokenData; tabId?: string };\n\n if (msg.type === 'token-updated' && msg.token) {\n this.log('Received token from leader via BroadcastChannel');\n this._token = msg.token;\n this.saveToStorage(msg.token);\n this.scheduleRefresh();\n this.bus.emit('auth:token-refreshed', { expiresAt: msg.token.expiresAt });\n }\n\n if (msg.type === 'leader-election') {\n // Another tab is claiming leadership — yield if we're not already leader\n // or if their tabId is lexicographically lower (deterministic)\n if (this._isLeader && msg.tabId && msg.tabId < this._tabId) {\n this._isLeader = false;\n this.log('Yielded leadership to another tab');\n }\n }\n };\n } catch {\n this._isLeader = true;\n this.log('BroadcastChannel setup failed, acting as leader');\n }\n }\n\n private readonly _tabId = typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).slice(2);\n\n private electLeader(): void {\n // Simple leader election: broadcast our intent, wait for contestation\n // If no BroadcastChannel, we're always leader\n if (!this._bc) {\n this._isLeader = true;\n return;\n }\n\n this._isLeader = true;\n try {\n this._bc.postMessage({\n type: 'leader-election',\n tabId: this._tabId,\n });\n } catch {\n // Channel may be closed\n }\n\n this.log(`Elected as leader (tabId: ${this._tabId.slice(0, 8)}...)`);\n }\n\n private broadcastToken(tokenData: TokenData): void {\n if (!this._bc) return;\n try {\n this._bc.postMessage({\n type: 'token-updated',\n token: tokenData,\n });\n } catch {\n // Channel may be closed\n }\n }\n\n // -------------------------------------------------------------------------\n // localStorage fallback\n // -------------------------------------------------------------------------\n\n private get storageKey(): string {\n return `${LS_KEY_PREFIX}${this.instanceId}`;\n }\n\n private saveToStorage(data: TokenData): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(this.storageKey, JSON.stringify(data));\n }\n } catch {\n // localStorage may be full or unavailable (incognito, SSR)\n }\n }\n\n private loadFromStorage(): TokenData | null {\n try {\n if (typeof localStorage === 'undefined') return null;\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return null;\n return JSON.parse(raw) as TokenData;\n } catch {\n return null;\n }\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n private isExpired(data: TokenData): boolean {\n const nowSec = Math.floor(Date.now() / 1000);\n return nowSec >= data.expiresAt;\n }\n\n private log(message: string): void {\n if (this.debug) {\n console.debug(`${LOG_PREFIX} ${message}`);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Core Orchestrator\n// ---------------------------------------------------------------------------\n//\n// The main class that wires all subsystems together. The constructor does NOT\n// call any browser APIs — everything is lazily initialized in `init()` so the\n// module is safe to import in SSR / Node environments.\n// ---------------------------------------------------------------------------\n\nimport { EventBus, createEventBus } from './bus/index.js';\nimport { ResourceManager, SingletonGuard } from './resources/index.js';\nimport { DOMScanner } from './dom/index.js';\nimport { ContextManager } from './context/index.js';\nimport { LLMOrchestrator } from './llm/index.js';\nimport { ToolExecutor } from './llm/tool-executor.js';\nimport { ConnectionManager } from './connectivity/index.js';\nimport { NavigationController } from './navigation/index.js';\nimport { VoicePipeline } from './voice/index.js';\nimport { VisualGuidance } from './visual/index.js';\nimport { AwarenessSystem } from './awareness/index.js';\nimport { ProactiveTriggerEngine } from './awareness/proactive.js';\nimport { RateLimiter } from './llm/rate-limiter.js';\nimport { I18n } from './i18n/index.js';\nimport { TokenManager } from './auth/token-manager.js';\nimport type {\n PageModel,\n AgentConfig,\n ContentMapInput,\n LLMConfig,\n STTConfig,\n TTSConfig,\n GuideKitOptions,\n ToolDefinition,\n GuideKitEvent,\n AgentState,\n GuideKitStore,\n} from './types/index.js';\nimport { GuideKitError, ConfigurationError, ErrorCodes } from './errors/index.js';\n\n// ---------------------------------------------------------------------------\n// Default deny-list for clickElement tool\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_CLICK_DENY = [\n '[type=\"submit\"]',\n '[type=\"reset\"]',\n 'button[formaction]',\n '[data-guidekit-no-click]',\n 'form',\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a UUID, guarded for non-browser environments where\n * `crypto.randomUUID()` may not be available.\n */\nfunction generateUUID(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID();\n }\n\n // Fallback: manual v4 UUID generation (RFC 4122 compliant)\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Options interface\n// ---------------------------------------------------------------------------\n\n/** Result of a health check on a single service. */\nexport interface HealthCheckStatus {\n status: 'ok' | 'degraded' | 'unavailable' | 'not-configured';\n latencyMs?: number;\n error?: string;\n}\n\n/** Full health check result. */\nexport interface HealthCheckResult {\n llm: HealthCheckStatus;\n stt: HealthCheckStatus;\n tts: HealthCheckStatus;\n mic: HealthCheckStatus;\n overall: 'ok' | 'degraded' | 'unavailable';\n}\n\n/** Context passed to onBeforeLLMCall for privacy filtering. */\nexport interface BeforeLLMCallContext {\n systemPrompt: string;\n userMessage: string;\n conversationHistory: Array<{ role: string; content: string }>;\n}\n\nexport interface GuideKitCoreOptions {\n tokenEndpoint?: string;\n stt?: STTConfig;\n tts?: TTSConfig;\n llm?: LLMConfig;\n agent?: AgentConfig;\n contentMap?: ContentMapInput;\n options?: GuideKitOptions;\n instanceId?: string;\n rootElement?: HTMLElement;\n onError?: (error: GuideKitError) => void;\n onEvent?: (event: GuideKitEvent) => void;\n onReady?: () => void;\n /**\n * Privacy hook: called before every LLM request. Return modified context\n * or throw to cancel the request. Use for custom PII scrubbing.\n */\n onBeforeLLMCall?: (context: BeforeLLMCallContext) => BeforeLLMCallContext | Promise<BeforeLLMCallContext>;\n}\n\n// ---------------------------------------------------------------------------\n// GuideKitCore\n// ---------------------------------------------------------------------------\n\nexport class GuideKitCore {\n // ---- Public readonly accessors ------------------------------------------\n\n readonly instanceId: string;\n readonly bus: EventBus;\n\n // ---- Subsystems (created lazily or on init) -----------------------------\n\n private resourceManager: ResourceManager;\n private domScanner: DOMScanner | null = null;\n private contextManager: ContextManager;\n private llmOrchestrator: LLMOrchestrator | null = null;\n private connectionManager: ConnectionManager | null = null;\n private navigationController: NavigationController | null = null;\n private voicePipeline: VoicePipeline | null = null;\n private visualGuidance: VisualGuidance | null = null;\n private toolExecutor: ToolExecutor | null = null;\n private awarenessSystem: AwarenessSystem | null = null;\n private proactiveEngine: ProactiveTriggerEngine | null = null;\n private rateLimiter: RateLimiter;\n private _i18n: I18n;\n private tokenManager: TokenManager | null = null;\n\n // ---- State --------------------------------------------------------------\n\n private _isReady = false;\n private _agentState: AgentState = { status: 'idle' };\n private _currentPageModel: PageModel | null = null;\n private readonly _options: GuideKitCoreOptions;\n private _debug: boolean;\n private _sendInFlight = false;\n private _instanceAbortController = new AbortController();\n private _initPromise: Promise<void> | null = null;\n\n // ---- Store for useSyncExternalStore -------------------------------------\n\n private storeListeners: Set<() => void> = new Set();\n private _storeSnapshot: GuideKitStore;\n\n // ---- Custom actions -----------------------------------------------------\n\n private customActions = new Map<\n string,\n {\n description: string;\n parameters: Record<string, unknown>;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n }\n >();\n\n // -------------------------------------------------------------------------\n // Constructor — NO browser APIs (SSR safe)\n // -------------------------------------------------------------------------\n\n constructor(options: GuideKitCoreOptions) {\n this._options = options;\n this.instanceId = options.instanceId ?? 'default';\n this._debug = options.options?.debug ?? false;\n\n // Create EventBus (no browser APIs)\n this.bus = createEventBus({ debug: this._debug });\n\n // Get or create ResourceManager via SingletonGuard\n this.resourceManager = SingletonGuard.acquire(\n this.instanceId,\n () => new ResourceManager(this.instanceId),\n );\n\n // Create ContextManager (no browser APIs in constructor)\n this.contextManager = new ContextManager({\n agent: options.agent,\n contentMap: options.contentMap,\n debug: this._debug,\n });\n\n // Create RateLimiter (no browser APIs)\n this.rateLimiter = new RateLimiter({\n bus: this.bus,\n limits: options.options?.rateLimits,\n debug: this._debug,\n });\n\n // Create I18n (auto-detect is SSR-safe)\n this._i18n = new I18n({\n locale: options.options?.locale as any ?? 'auto',\n debug: this._debug,\n });\n\n // Initialize store snapshot\n this._storeSnapshot = this.buildSnapshot();\n\n // Wire up error handler\n if (options.onError) {\n this.bus.on('error', (err) => {\n if (err instanceof GuideKitError) {\n options.onError!(err);\n }\n });\n }\n\n // Wire up event forwarding\n if (options.onEvent) {\n this.bus.onAny((data, eventName) => {\n options.onEvent!({\n type: eventName,\n data:\n typeof data === 'object' && data !== null\n ? (data as Record<string, unknown>)\n : {},\n timestamp: Date.now(),\n });\n });\n }\n }\n\n // -------------------------------------------------------------------------\n // init() — starts all browser-dependent subsystems\n // -------------------------------------------------------------------------\n\n async init(): Promise<void> {\n if (typeof window === 'undefined') return;\n if (this._isReady) return;\n if (this._initPromise) return this._initPromise;\n\n this._initPromise = this._doInit();\n try {\n await this._initPromise;\n } catch (err) {\n this._initPromise = null;\n throw err;\n }\n }\n\n private async _doInit(): Promise<void> {\n // Validate LLM config\n const llmConfig = this._options.llm;\n if (!llmConfig && !this._options.tokenEndpoint) {\n throw new ConfigurationError({\n code: ErrorCodes.CONFIG_MISSING_REQUIRED,\n message: 'Either tokenEndpoint or llm config must be provided.',\n suggestion:\n 'Add tokenEndpoint=\"/api/guidekit/token\" or llm={{ provider: \"gemini\", apiKey: \"...\" }} to GuideKitProvider.',\n });\n }\n\n // -- Token Manager (if tokenEndpoint is provided) -----------------------\n\n if (this._options.tokenEndpoint) {\n this.tokenManager = new TokenManager({\n tokenEndpoint: this._options.tokenEndpoint,\n instanceId: this.instanceId,\n bus: this.bus,\n debug: this._debug,\n });\n await this.tokenManager.start();\n this.resourceManager.register({\n name: 'token-manager',\n cleanup: () => this.tokenManager?.destroy(),\n });\n }\n\n // -- DOM Scanner --------------------------------------------------------\n\n this.domScanner = new DOMScanner({\n rootElement: this._options.rootElement,\n debug: this._debug,\n });\n\n // Initial scan\n this._currentPageModel = this.domScanner.scan();\n this.bus.emit('dom:scan-complete', {\n pageModel: this._currentPageModel,\n durationMs: 0,\n });\n\n // Set up MutationObserver for auto-rescan\n const unobserve = this.domScanner.observe((model) => {\n this._currentPageModel = model;\n this.bus.emit('dom:scan-complete', {\n pageModel: model,\n durationMs: 0,\n });\n this.notifyStoreListeners();\n });\n this.resourceManager.register({\n name: 'dom-observer',\n cleanup: unobserve,\n });\n\n // -- LLM Orchestrator ---------------------------------------------------\n\n if (llmConfig) {\n this.llmOrchestrator = new LLMOrchestrator({\n config: llmConfig,\n debug: this._debug,\n onChunk: (chunk) => {\n this.bus.emit('llm:response-chunk', chunk);\n },\n onToolCall: (toolCall) => {\n this.bus.emit('llm:tool-call', toolCall);\n },\n onTokenUsage: (usage) => {\n this.bus.emit('llm:token-usage', usage);\n },\n onError: (error) => {\n this.bus.emit('error', error);\n },\n });\n }\n\n // -- ConnectionManager --------------------------------------------------\n\n this.connectionManager = new ConnectionManager({\n healthEndpoint: this._options.tokenEndpoint\n ? this._options.tokenEndpoint.replace(/\\/token$/, '/health')\n : undefined,\n debug: this._debug,\n });\n this.connectionManager.onStateChange((state, previous) => {\n this.bus.emit('connectivity:state-change', { state, previous });\n });\n this.connectionManager.start();\n this.resourceManager.register({\n name: 'connection-manager',\n cleanup: () => this.connectionManager?.stop(),\n });\n\n // -- NavigationController -----------------------------------------------\n\n this.navigationController = new NavigationController({\n debug: this._debug,\n });\n this.navigationController.onRouteChange((from, to) => {\n this.bus.emit('dom:route-change', { from, to });\n\n // Re-scan DOM on route change (allow a brief settling period)\n if (this.domScanner) {\n setTimeout(() => {\n this._currentPageModel = this.domScanner!.scan();\n this.bus.emit('dom:scan-complete', {\n pageModel: this._currentPageModel,\n durationMs: 0,\n });\n this.notifyStoreListeners();\n }, 100);\n }\n });\n this.navigationController.start();\n this.resourceManager.register({\n name: 'navigation-controller',\n cleanup: () => this.navigationController?.stop(),\n });\n\n // -- Visual Guidance System -----------------------------------------------\n\n this.visualGuidance = new VisualGuidance({\n spotlightColor: this._options.options?.spotlightColor,\n debug: this._debug,\n });\n this.resourceManager.register({\n name: 'visual-guidance',\n cleanup: () => this.visualGuidance?.destroy(),\n });\n\n // -- Awareness System ---------------------------------------------------\n\n this.awarenessSystem = new AwarenessSystem({\n bus: this.bus,\n rootElement: this._options.rootElement,\n debug: this._debug,\n });\n this.awarenessSystem.start();\n this.resourceManager.register({\n name: 'awareness-system',\n cleanup: () => this.awarenessSystem?.destroy(),\n });\n\n // -- Proactive Trigger Engine ------------------------------------------\n\n this.proactiveEngine = new ProactiveTriggerEngine({\n bus: this.bus,\n debug: this._debug,\n onTrigger: (trigger) => {\n if (this._debug) {\n console.debug('[GuideKit:Core] Proactive trigger:', trigger.type, trigger);\n }\n // Forward as a generic event for developer hooks\n this._options.onEvent?.({\n type: `proactive:${trigger.type}`,\n data: trigger as unknown as Record<string, unknown>,\n timestamp: trigger.timestamp,\n });\n },\n });\n this.proactiveEngine.start();\n this.resourceManager.register({\n name: 'proactive-engine',\n cleanup: () => this.proactiveEngine?.destroy(),\n });\n\n // -- Tool Executor (multi-turn tool calling) ----------------------------\n\n this.toolExecutor = new ToolExecutor({\n maxRounds: 5,\n debug: this._debug,\n onToolCall: (name, args) => {\n this.bus.emit('llm:tool-call', { name, arguments: args });\n },\n });\n\n this.registerBuiltinTools();\n\n // -- Voice Pipeline (lazy — only init on first startListening) ----------\n\n if (this._options.stt && this._options.tts) {\n const sttConfig = this._options.stt;\n const ttsConfig = this._options.tts;\n\n if (sttConfig.provider === 'deepgram' && ttsConfig.provider === 'elevenlabs') {\n this.voicePipeline = new VoicePipeline({\n sttConfig: {\n provider: 'deepgram',\n apiKey: sttConfig.apiKey,\n model: 'model' in sttConfig ? sttConfig.model : undefined,\n },\n ttsConfig: {\n provider: 'elevenlabs',\n apiKey: ttsConfig.apiKey,\n voiceId: 'voiceId' in ttsConfig ? ttsConfig.voiceId : undefined,\n },\n debug: this._debug,\n });\n\n // Forward voice events to the EventBus\n this.voicePipeline.onStateChange((state, previous) => {\n this.bus.emit('voice:state-change', { from: previous, to: state });\n // Map voice state to agent state\n switch (state) {\n case 'listening':\n this.setAgentState({ status: 'listening', durationMs: 0 });\n break;\n case 'speaking':\n this.setAgentState({ status: 'speaking', utterance: '' });\n break;\n case 'idle':\n if (this._agentState.status !== 'processing') {\n this.setAgentState({ status: 'idle' });\n }\n break;\n }\n });\n\n this.voicePipeline.onTranscript((text, isFinal) => {\n this.bus.emit('voice:transcript', {\n text,\n isFinal,\n confidence: 0.95,\n });\n if (isFinal && text.trim()) {\n this.voicePipeline?.processTranscript(text, (t) => this.sendText(t));\n }\n });\n\n this.resourceManager.register({\n name: 'voice-pipeline',\n cleanup: () => this.voicePipeline?.destroy(),\n });\n }\n }\n\n // -- Restore session ----------------------------------------------------\n\n const session = this.contextManager.restoreSession();\n if (session && this._debug) {\n console.debug(\n '[GuideKit:Core] Restored session with',\n session.conversationHistory.length,\n 'turns',\n );\n }\n\n // -- Mark ready ---------------------------------------------------------\n\n this.resourceManager.markReady();\n this._isReady = true;\n this.notifyStoreListeners();\n this._options.onReady?.();\n\n if (this._debug) {\n console.debug('[GuideKit:Core] Initialized', {\n instanceId: this.instanceId,\n sections: this._currentPageModel?.sections.length,\n });\n }\n }\n\n // -------------------------------------------------------------------------\n // sendText — send a text message to the LLM\n // -------------------------------------------------------------------------\n\n async sendText(message_: string): Promise<string> {\n let message = message_;\n if (!this._isReady || !this.llmOrchestrator) {\n throw new ConfigurationError({\n code: ErrorCodes.CONFIG_MISSING_REQUIRED,\n message: 'SDK not initialized or LLM not configured.',\n suggestion:\n 'Ensure init() has been called and LLM config is provided.',\n });\n }\n\n if (this._sendInFlight) {\n throw new GuideKitError({\n code: 'SEND_IN_FLIGHT',\n message: 'A message is already being processed. Wait for it to complete.',\n recoverable: true,\n suggestion: 'Await the previous sendText() call before sending another message.',\n });\n }\n this._sendInFlight = true;\n\n const maxLen = this._options.options?.maxMessageLength ?? 10_000;\n if (message_.length > maxLen) {\n throw new GuideKitError({\n code: 'INPUT_TOO_LONG',\n message: `Message exceeds maximum length of ${maxLen} characters.`,\n recoverable: true,\n suggestion: `Shorten your message to ${maxLen} characters or fewer, or increase maxMessageLength in options.`,\n });\n }\n\n // Check rate limits before proceeding\n this.rateLimiter.checkLLMCall();\n\n // Update agent state\n this.setAgentState({ status: 'processing', transcript: message });\n\n // Add user turn\n this.contextManager.addTurn({\n role: 'user',\n content: message,\n timestamp: Date.now(),\n });\n\n // Build system prompt\n let systemPrompt = this.contextManager.buildSystemPrompt(\n this._currentPageModel!,\n this.getToolDefinitions(),\n );\n\n // Privacy hook — allow developer to scrub PII before LLM call\n if (this._options.onBeforeLLMCall) {\n try {\n const ctx = await this._options.onBeforeLLMCall({\n systemPrompt,\n userMessage: message,\n conversationHistory: this.contextManager\n .getHistory()\n .map((t) => ({ role: t.role, content: t.content })),\n });\n systemPrompt = ctx.systemPrompt;\n message = ctx.userMessage;\n } catch (hookErr) {\n // Hook threw — cancel the LLM call\n this.setAgentState({ status: 'idle' });\n const err =\n hookErr instanceof GuideKitError\n ? hookErr\n : new GuideKitError({\n code: ErrorCodes.PRIVACY_HOOK_CANCELLED,\n message:\n hookErr instanceof Error\n ? hookErr.message\n : 'onBeforeLLMCall hook cancelled the request.',\n recoverable: true,\n suggestion: 'Check your onBeforeLLMCall implementation.',\n });\n this.bus.emit('error', err);\n throw err;\n }\n }\n\n const conversationId = generateUUID();\n this.bus.emit('llm:response-start', { conversationId });\n\n try {\n let responseText: string;\n let totalTokens: number;\n\n // Use multi-turn ToolExecutor if available, else single-turn\n if (this.toolExecutor) {\n const result = await this.toolExecutor.executeWithTools({\n llm: this.llmOrchestrator,\n systemPrompt,\n history: this.contextManager.getHistory().slice(0, -1),\n userMessage: message,\n tools: this.getToolDefinitions(),\n signal: this._instanceAbortController.signal,\n });\n responseText = result.text;\n totalTokens = result.totalUsage.total;\n } else {\n const result = await this.llmOrchestrator.sendMessage({\n systemPrompt,\n history: this.contextManager.getHistory().slice(0, -1),\n userMessage: message,\n tools: this.getToolDefinitions(),\n signal: this._instanceAbortController.signal,\n });\n responseText = result.text;\n totalTokens = result.usage.total;\n }\n\n // Add assistant turn\n this.contextManager.addTurn({\n role: 'assistant',\n content: responseText,\n timestamp: Date.now(),\n });\n\n // Save session\n this.contextManager.saveSession();\n\n this.bus.emit('llm:response-end', {\n conversationId,\n totalTokens,\n });\n\n this.setAgentState({ status: 'idle' });\n\n return responseText;\n } catch (error) {\n const err =\n error instanceof GuideKitError\n ? error\n : new GuideKitError({\n code: 'UNKNOWN',\n message:\n error instanceof Error ? error.message : 'Unknown error',\n recoverable: false,\n suggestion: 'Check the console for details.',\n });\n\n this.setAgentState({ status: 'error', error: err });\n this.bus.emit('error', err);\n throw err;\n } finally {\n this._sendInFlight = false;\n }\n }\n\n // -------------------------------------------------------------------------\n // Accessors\n // -------------------------------------------------------------------------\n\n /** Get the current page model. */\n get pageModel(): PageModel | null {\n return this._currentPageModel;\n }\n\n /** Whether the SDK has been fully initialized. */\n get isReady(): boolean {\n return this._isReady;\n }\n\n /** Current agent state. */\n get agentState(): AgentState {\n return this._agentState;\n }\n\n /** Current auth token string, or null if not using token-based auth. */\n get currentToken(): string | null {\n return this.tokenManager?.token ?? null;\n }\n\n // -------------------------------------------------------------------------\n // Store subscription (for useSyncExternalStore)\n // -------------------------------------------------------------------------\n\n subscribe(listener: () => void): () => void {\n this.storeListeners.add(listener);\n return () => {\n this.storeListeners.delete(listener);\n };\n }\n\n getSnapshot(): GuideKitStore {\n return this._storeSnapshot;\n }\n\n // -------------------------------------------------------------------------\n // Custom actions\n // -------------------------------------------------------------------------\n\n registerAction(\n actionId: string,\n action: {\n description: string;\n parameters: Record<string, unknown>;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n },\n ): void {\n this.customActions.set(actionId, action);\n }\n\n // -------------------------------------------------------------------------\n // Voice control\n // -------------------------------------------------------------------------\n\n /** Start listening for voice input. Initializes voice pipeline on first call. */\n async startListening(): Promise<void> {\n if (!this.voicePipeline) {\n if (this._debug) {\n console.debug('[GuideKit:Core] No voice pipeline configured — cannot start listening');\n }\n return;\n }\n await this.voicePipeline.init();\n await this.voicePipeline.startListening();\n }\n\n /** Stop listening for voice input. */\n stopListening(): void {\n this.voicePipeline?.stopListening();\n }\n\n /** Stop current TTS playback (barge-in). */\n stopSpeaking(): void {\n this.voicePipeline?.stopSpeaking();\n }\n\n /** Whether voice pipeline is available. */\n get hasVoice(): boolean {\n return this.voicePipeline !== null;\n }\n\n // -------------------------------------------------------------------------\n // Visual guidance (public API)\n // -------------------------------------------------------------------------\n\n /** Highlight an element by sectionId or CSS selector. */\n highlight(params: {\n sectionId?: string;\n selector?: string;\n tooltip?: string;\n position?: 'top' | 'bottom' | 'left' | 'right' | 'auto';\n }): boolean {\n if (!this.visualGuidance) return false;\n const result = this.visualGuidance.highlight(params);\n if (result) {\n this.bus.emit('visual:spotlight-shown', {\n selector: params.selector ?? params.sectionId ?? '',\n sectionId: params.sectionId,\n });\n }\n return result;\n }\n\n /** Dismiss the current spotlight highlight. */\n dismissHighlight(): void {\n this.visualGuidance?.dismissHighlight();\n this.bus.emit('visual:spotlight-dismissed', {});\n }\n\n /** Smooth scroll to a section. */\n scrollToSection(sectionId: string, offset?: number): void {\n this.visualGuidance?.scrollToSection(sectionId, offset);\n }\n\n /** Smooth scroll to a CSS selector. */\n scrollToSelector(selector: string, offset?: number): void {\n this.visualGuidance?.scrollToSelector(selector, offset);\n }\n\n /** Start a guided tour. */\n startTour(sectionIds: string[], mode?: 'auto' | 'manual'): void {\n this.visualGuidance?.startTour(sectionIds, mode);\n }\n\n /** Advance to next tour step. */\n nextTourStep(): void {\n this.visualGuidance?.nextTourStep();\n }\n\n /** Go back to previous tour step. */\n prevTourStep(): void {\n this.visualGuidance?.prevTourStep();\n }\n\n /** Stop the guided tour. */\n stopTour(): void {\n this.visualGuidance?.stopTour();\n }\n\n /** Navigate to a same-origin URL. */\n async navigate(href: string): Promise<boolean> {\n if (!this.navigationController) return false;\n return this.navigationController.navigate(href);\n }\n\n // -------------------------------------------------------------------------\n // Context management\n // -------------------------------------------------------------------------\n\n setPageContext(context: Record<string, unknown>): void {\n this.contextManager.setPageContext(context);\n if (this._debug) {\n console.debug('[GuideKit:Core] setPageContext', context);\n }\n }\n\n /** Get the i18n instance for localized strings. */\n get i18n(): I18n {\n return this._i18n;\n }\n\n /** Get/set quiet mode on proactive triggers. */\n get quietMode(): boolean {\n return this.proactiveEngine?.quietMode ?? false;\n }\n\n set quietMode(value: boolean) {\n if (this.proactiveEngine) {\n this.proactiveEngine.quietMode = value;\n }\n this.contextManager.quietMode = value;\n }\n\n /** Get/set user preference (voice/text). */\n get userPreference(): 'voice' | 'text' {\n return this.contextManager.userPreference;\n }\n\n set userPreference(value: 'voice' | 'text') {\n this.contextManager.userPreference = value;\n }\n\n /** Get the rate limiter for monitoring usage. */\n get rateLimiterState() {\n return this.rateLimiter.getState();\n }\n\n // -------------------------------------------------------------------------\n // Health check\n // -------------------------------------------------------------------------\n\n /**\n * Check health of all connected services.\n * Returns per-service status and an overall assessment.\n */\n async checkHealth(): Promise<HealthCheckResult> {\n const results: HealthCheckResult = {\n llm: { status: 'not-configured' },\n stt: { status: 'not-configured' },\n tts: { status: 'not-configured' },\n mic: { status: 'not-configured' },\n overall: 'ok',\n };\n\n // LLM check\n if (this.llmOrchestrator) {\n try {\n const start = Date.now();\n // Lightweight check — just verify the orchestrator is alive\n results.llm = {\n status: 'ok',\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n results.llm = {\n status: 'unavailable',\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n }\n\n // STT check — verify config exists\n if (this._options.stt) {\n results.stt = { status: this.voicePipeline ? 'ok' : 'degraded' };\n }\n\n // TTS check — verify config exists\n if (this._options.tts) {\n results.tts = { status: this.voicePipeline ? 'ok' : 'degraded' };\n }\n\n // Mic check\n if (typeof navigator !== 'undefined' && navigator.mediaDevices) {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const hasMic = devices.some((d) => d.kind === 'audioinput');\n results.mic = { status: hasMic ? 'ok' : 'unavailable' };\n } catch (err) {\n results.mic = {\n status: 'unavailable',\n error: err instanceof Error ? err.message : 'Permission denied',\n };\n }\n }\n\n // Compute overall\n const statuses = [results.llm, results.stt, results.tts, results.mic];\n const configured = statuses.filter((s) => s.status !== 'not-configured');\n if (configured.some((s) => s.status === 'unavailable')) {\n results.overall = 'unavailable';\n } else if (configured.some((s) => s.status === 'degraded')) {\n results.overall = 'degraded';\n } else {\n results.overall = 'ok';\n }\n\n return results;\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n async destroy(): Promise<void> {\n this._instanceAbortController.abort();\n this.contextManager.saveSession();\n SingletonGuard.release(this.instanceId);\n this._isReady = false;\n this.notifyStoreListeners();\n\n if (this._debug) {\n console.debug('[GuideKit:Core] Destroyed instance', this.instanceId);\n }\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private setAgentState(state: AgentState): void {\n this._agentState = state;\n this.notifyStoreListeners();\n }\n\n private notifyStoreListeners(): void {\n this._storeSnapshot = this.buildSnapshot();\n for (const listener of this.storeListeners) {\n listener();\n }\n }\n\n private buildSnapshot(): GuideKitStore {\n return {\n status: {\n isReady: this._isReady,\n agentState: this._agentState,\n error:\n this._agentState.status === 'error'\n ? this._agentState.error\n : null,\n },\n voice: {\n isListening: this._agentState.status === 'listening',\n isSpeaking: this._agentState.status === 'speaking',\n },\n };\n }\n\n /**\n * Register all built-in tool handlers with the ToolExecutor.\n * Called once during init() after VisualGuidance and all subsystems are ready.\n */\n private registerBuiltinTools(): void {\n if (!this.toolExecutor) return;\n\n // highlight — spotlight an element\n this.toolExecutor.registerTool({\n name: 'highlight',\n execute: async (args) => {\n const sectionId = args.sectionId as string | undefined;\n const selector = args.selector as string | undefined;\n const tooltip = args.tooltip as string | undefined;\n const position = args.position as 'top' | 'bottom' | 'left' | 'right' | 'auto' | undefined;\n const result = this.highlight({ sectionId, selector, tooltip, position });\n return { success: result };\n },\n });\n\n // dismissHighlight — remove spotlight\n this.toolExecutor.registerTool({\n name: 'dismissHighlight',\n execute: async () => {\n this.dismissHighlight();\n return { success: true };\n },\n });\n\n // scrollToSection — smooth scroll\n this.toolExecutor.registerTool({\n name: 'scrollToSection',\n execute: async (args) => {\n const sectionId = args.sectionId as string;\n const offset = args.offset as number | undefined;\n this.scrollToSection(sectionId, offset);\n return { success: true };\n },\n });\n\n // navigate — SPA navigation (same-origin only)\n this.toolExecutor.registerTool({\n name: 'navigate',\n execute: async (args) => {\n const href = args.href as string;\n const result = await this.navigate(href);\n return { success: result, navigatedTo: result ? href : null };\n },\n });\n\n // startTour — guided tour\n this.toolExecutor.registerTool({\n name: 'startTour',\n execute: async (args) => {\n const sectionIds = args.sectionIds as string[];\n const mode = (args.mode as 'auto' | 'manual') ?? 'manual';\n this.startTour(sectionIds, mode);\n return { success: true, steps: sectionIds.length };\n },\n });\n\n // readPageContent — read section text or search\n this.toolExecutor.registerTool({\n name: 'readPageContent',\n execute: async (args) => {\n const sectionId = args.sectionId as string | undefined;\n const query = args.query as string | undefined;\n const model = this._currentPageModel;\n if (!model) return { error: 'No page model available' };\n\n if (sectionId) {\n const section = model.sections.find((s) => s.id === sectionId);\n if (section) {\n // Try dynamic contentMap for enriched content\n const contentMapResult = await this.contextManager.getContent(sectionId);\n return {\n sectionId: section.id,\n label: section.label,\n summary: section.summary,\n contentMap: contentMapResult,\n };\n }\n return { error: `Section \"${sectionId}\" not found` };\n }\n\n if (query) {\n const queryLower = query.toLowerCase();\n const matches = model.sections.filter(\n (s) =>\n s.label?.toLowerCase().includes(queryLower) ||\n s.summary?.toLowerCase().includes(queryLower),\n );\n return {\n query,\n results: matches.slice(0, 5).map((s) => ({\n sectionId: s.id,\n label: s.label,\n snippet: s.summary?.slice(0, 200),\n })),\n };\n }\n\n return { error: 'Provide either sectionId or query' };\n },\n });\n\n // getVisibleSections — list visible sections\n this.toolExecutor.registerTool({\n name: 'getVisibleSections',\n execute: async () => {\n const model = this._currentPageModel;\n if (!model) return { sections: [] };\n // Return top sections by score (already sorted)\n return {\n sections: model.sections.slice(0, 10).map((s) => ({\n id: s.id,\n label: s.label,\n selector: s.selector,\n score: s.score,\n })),\n };\n },\n });\n\n // clickElement — programmatic click (with default deny-list + whitelist/blacklist validation)\n this.toolExecutor.registerTool({\n name: 'clickElement',\n execute: async (args) => {\n if (typeof document === 'undefined') return { success: false, error: 'Not in browser' };\n const selector = args.selector as string;\n\n // Default deny-list: block dangerous elements unless developer explicitly allows\n const el = document.querySelector(selector);\n if (!el) return { success: false, error: `Element not found: ${selector}` };\n if (!(el instanceof HTMLElement)) return { success: false, error: 'Element is not clickable' };\n\n const clickableRules = this._options.options?.clickableSelectors;\n const isInDevAllowList = clickableRules?.allow?.some((pattern) => {\n try { return el.matches(pattern); } catch { return selector === pattern; }\n }) ?? false;\n\n // Check default deny-list (bypass only if element is in developer's explicit allow-list)\n if (!isInDevAllowList) {\n const defaultDenied = DEFAULT_CLICK_DENY.some((pattern) => {\n try { return el.matches(pattern); } catch { return false; }\n });\n if (defaultDenied) {\n return { success: false, error: `Selector \"${selector}\" matches the default deny list. Add it to clickableSelectors.allow to override.` };\n }\n }\n\n // Developer deny-list\n if (clickableRules?.deny?.length) {\n const denied = clickableRules.deny.some((pattern) => {\n try { return el.matches(pattern); } catch { return selector === pattern; }\n });\n if (denied) {\n return { success: false, error: `Selector \"${selector}\" is blocked by the deny list.` };\n }\n }\n\n // Developer allow-list (if provided, ONLY allow listed elements)\n if (clickableRules?.allow?.length && !isInDevAllowList) {\n return { success: false, error: `Selector \"${selector}\" is not in the allowed clickable selectors list.` };\n }\n\n el.click();\n return { success: true };\n },\n });\n\n // executeCustomAction — delegate to developer-registered actions\n this.toolExecutor.registerTool({\n name: 'executeCustomAction',\n execute: async (args) => {\n const actionId = args.actionId as string;\n const params = (args.params as Record<string, unknown>) ?? {};\n const action = this.customActions.get(actionId);\n if (!action) return { error: `Unknown action: ${actionId}` };\n try {\n const result = await action.handler(params);\n return { success: true, result };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n },\n });\n }\n\n private getToolDefinitions(): ToolDefinition[] {\n const builtinTools: ToolDefinition[] = [\n {\n name: 'highlight',\n description:\n 'Spotlight an element on the page to draw the user\\'s attention. Use sectionId to highlight a page section, or selector for a specific CSS selector. Optionally add a tooltip with explanation text.',\n parameters: {\n sectionId: { type: 'string', description: 'ID of the section to highlight' },\n selector: { type: 'string', description: 'CSS selector (overrides sectionId)' },\n tooltip: { type: 'string', description: 'Text to show in tooltip' },\n position: { type: 'string', enum: ['top', 'bottom', 'left', 'right', 'auto'], description: 'Tooltip position' },\n },\n schemaVersion: 1,\n },\n {\n name: 'dismissHighlight',\n description: 'Remove the current spotlight overlay.',\n parameters: {},\n schemaVersion: 1,\n },\n {\n name: 'scrollToSection',\n description:\n 'Smooth scroll to a section by its ID. Use offset to account for sticky headers.',\n parameters: {\n sectionId: { type: 'string', description: 'ID of the section to scroll to' },\n offset: { type: 'number', description: 'Pixel offset for sticky headers' },\n },\n schemaVersion: 1,\n },\n {\n name: 'navigate',\n description:\n 'Navigate to a different page within the same site. Only same-origin URLs are allowed.',\n parameters: {\n href: { type: 'string', description: 'URL or path to navigate to (same-origin only)' },\n },\n schemaVersion: 1,\n },\n {\n name: 'startTour',\n description:\n 'Start a guided tour through multiple sections in sequence.',\n parameters: {\n sectionIds: { type: 'array', items: { type: 'string' }, description: 'Section IDs in tour order' },\n mode: { type: 'string', enum: ['auto', 'manual'], description: 'auto advances automatically; manual waits for user' },\n },\n schemaVersion: 1,\n },\n {\n name: 'readPageContent',\n description:\n 'Read visible text content of a section by ID, or search across all sections by keyword.',\n parameters: {\n sectionId: { type: 'string', description: 'Section ID to read' },\n query: { type: 'string', description: 'Keyword to search for across sections' },\n },\n schemaVersion: 1,\n },\n {\n name: 'getVisibleSections',\n description:\n 'Get the list of sections currently visible in the user viewport.',\n parameters: {},\n schemaVersion: 1,\n },\n {\n name: 'clickElement',\n description:\n 'Programmatically click an interactive element on the page.',\n parameters: {\n selector: { type: 'string', description: 'CSS selector of the element to click' },\n },\n schemaVersion: 1,\n },\n {\n name: 'executeCustomAction',\n description:\n 'Execute a developer-registered custom action (e.g., add to cart, submit form).',\n parameters: {\n actionId: { type: 'string', description: 'ID of the custom action' },\n params: { type: 'object', description: 'Parameters for the action' },\n },\n schemaVersion: 1,\n },\n ];\n\n // Add custom actions as individual tool definitions for better LLM discoverability\n for (const [actionId, action] of this.customActions) {\n builtinTools.push({\n name: `action_${actionId}`,\n description: action.description,\n parameters: action.parameters,\n schemaVersion: 1,\n });\n }\n\n return builtinTools;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/bus/index.ts","../src/resources/index.ts","../src/dom/index.ts","../src/context/index.ts","../src/errors/index.ts","../src/llm/openai-adapter.ts","../src/llm/index.ts","../src/llm/tool-executor.ts","../src/connectivity/index.ts","../src/navigation/index.ts","../src/voice/websocket-manager.ts","../src/voice/deepgram-stt.ts","../src/voice/elevenlabs-stt.ts","../src/voice/elevenlabs-tts.ts","../src/voice/web-speech-stt.ts","../src/voice/web-speech-tts.ts","../src/voice/index.ts","../src/visual/index.ts","../src/awareness/index.ts","../src/awareness/proactive.ts","../src/llm/rate-limiter.ts","../src/i18n/index.ts","../src/auth/token-manager.ts","../src/core.ts"],"names":["LOG_PREFIX","manager","withTimeout","truncate","DEFAULT_TIMEOUT_MS","emptyUsage","errorMsg","MAX_QUEUE_SIZE","DEFAULT_LANGUAGE","float32ToInt16","lastIdx"],"mappings":";;;AA+EA,IAAM,UAAA,GAAa,gBAAA;AAEZ,IAAM,WAAN,MAAe;AAAA;AAAA,EAEH,SAAA,uBAAgB,GAAA,EAA6B;AAAA;AAAA,EAG7C,eAAkC,EAAC;AAAA;AAAA,EAGnC,KAAA;AAAA,EAEjB,YAAY,OAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,KAAA;AAAA,EACjC;AAAA;AAAA,EA0BA,EAAA,CAAG,OAAe,OAAA,EAA+C;AAC/D,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AACtC,IAAA,MAAM,MAAA,GAAwB,UAAA,GAC1B,EAAE,IAAA,EAAM,UAAA,EAAY,EAAA,EAAI,OAAA,EAA2B,GACnD,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,OAAA,EAA6B;AAEtD,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,EAAC;AACR,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,IAAI,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAEhB,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AACpC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAC9B,MAAA,IAAI,GAAA,KAAQ,EAAA,EAAI,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AACjC,MAAA,IAAI,IAAI,MAAA,KAAW,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IACnD,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,EAAiE;AACrE,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,OAAO,CAAA;AAE9B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,OAAO,CAAA;AAC7C,MAAA,IAAI,QAAQ,EAAA,EAAI,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACjD,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAA,CAA+B,OAAU,IAAA,EAAyB;AAChE,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,KAAA,EAAO,IAAI,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,QAAA,GAAW,KAAA;AAGjB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AAET,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,EAAM;AAC7B,MAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,QAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC1C;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA;AACrC,IAAA,IAAI,aAAa,EAAA,EAAI;AACnB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AACrC,MAAA,MAAM,WAAA,GAAc,GAAG,EAAE,CAAA,EAAA,CAAA;AACzB,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,WAAW,CAAA;AACnD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,QAAA,GAAW,aAAa,KAAA,EAAM;AACpC,QAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,UAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,KAAA,EAAM;AACzC,MAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,QAAA,IAAA,CAAK,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAA,CACE,OACA,OAAA,EACY;AACZ,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,KAAA,GAAQ,CAAC,IAAA,KAAsB;AACnD,MAAA,KAAA,EAAM;AACN,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA,EAAS;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAKA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,aAAa,MAAA,GAAS,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,cAAc,KAAA,EAAwB;AACpC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,GAAG,MAAA,IAAU,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,KAAA,GAAQ,KAAK,YAAA,CAAa,MAAA;AAC9B,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC1C,MAAA,KAAA,IAAS,IAAA,CAAK,MAAA;AAAA,IAChB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,UAAA,CAAW,OAAiC,IAAA,EAAmB;AACrE,IAAA,IAAI;AACF,MAAA,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACZ,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,UAAA;AAAA,QACA,yBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;AAkBO,SAAS,eAAe,OAAA,EAAyC;AACtE,EAAA,OAAO,IAAI,SAAS,OAAO,CAAA;AAC7B;;;ACpSA,IAAMA,WAAAA,GAAa,sBAAA;AAGnB,IAAM,kBAAA,GAAqB,GAAA;AAkCpB,IAAM,kBAAN,MAAsB;AAAA,EAClB,UAAA;AAAA,EAED,MAAA,GAA+B,cAAA;AAAA,EACtB,UAAA,uBAAwC,GAAA,EAAI;AAAA,EACrD,eAAA,GAAwC,IAAA;AAAA,EACxC,iBAAA,GAAoB,KAAA;AAAA,EAE5B,YAAY,UAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,UAAA,GAAa,cAAc,UAAA,EAAW;AAC3C,IAAA,KAAA,CAAM,CAAA,yBAAA,EAA4B,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAA,GAA8B;AAChC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,aAAA,GAAwB;AAC1B,IAAA,OAAO,KAAK,UAAA,CAAW,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,QAAA,EAA0B;AACjC,IAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AAC/B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,EAAGA,WAAU,CAAA,2BAAA,EAA8B,QAAA,CAAS,IAAI,CAAA,6BAAA;AAAA,OAC1D;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AACtC,MAAA,KAAA;AAAA,QACE,CAAA,6BAAA,EAAgC,QAAA,CAAS,IAAI,CAAA,MAAA,EAAS,KAAK,UAAU,CAAA,CAAA;AAAA,OACvE;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAC3C,IAAA,KAAA;AAAA,MACE,CAAA,YAAA,EAAe,SAAS,IAAI,CAAA,MAAA,EAAS,KAAK,UAAU,CAAA,UAAA,EAAa,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,KACvF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,IAAA,EAAoB;AAC7B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA;AAAA,QACE,CAAA,cAAA,EAAiB,IAAI,CAAA,QAAA,EAAW,IAAA,CAAK,UAAU,CAAA,UAAA,EAAa,IAAA,CAAK,WAAW,IAAI,CAAA,CAAA;AAAA,OAClF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,sBAAsB,IAAA,EAA+B;AACnD,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AAEvC,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACZ,IAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,IAAI,CAAC,UAAA,CAAW,MAAA,CAAO,OAAA,EAAS;AAC9B,UAAA,UAAA,CAAW,KAAA,EAAM;AAAA,QACnB;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,GAAkB;AAChB,IAAA,IAAI,IAAA,CAAK,WAAW,cAAA,EAAgB;AAClC,MAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,MAAA,KAAA,CAAM,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,cAAA,CAAgB,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAA,GAAyB;AAE7B,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,OAAO,IAAA,CAAK,eAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,cAAA;AACd,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAEzB,IAAA,KAAA;AAAA,MACE,eAAe,IAAA,CAAK,UAAU,CAAA,GAAA,EAAM,IAAA,CAAK,WAAW,IAAI,CAAA,aAAA;AAAA,KAC1D;AAEA,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,eAAA,EAAgB;AAC5C,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,aAAA,GAAyB;AACvB,IAAA,IAAI,IAAA,CAAK,WAAW,cAAA,EAAgB;AAClC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AACnD,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,eAAA,GAAiC;AAE7C,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAE/C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,MAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,QAAA,KAAA;AAAA,UACE,CAAA,oCAAA,EAAuC,KAAK,UAAU,CAAA,yBAAA;AAAA,SACxD;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AACzC,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AAKF,QAAA,MAAM,WAAA,CAAY,QAAA,CAAS,OAAA,EAAQ,EAAG,oBAAoB,MAAM;AAC9D,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,CAAA,EAAGA,WAAU,CAAA,sBAAA,EAAyB,IAAI,MAAM,kBAAkB,CAAA,GAAA;AAAA,WACpE;AAAA,QACF,CAAC,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,EAAGA,WAAU,CAAA,oBAAA,EAAuB,IAAI,CAAA,EAAA,CAAA;AAAA,UACxC;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,IAAI,CAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAC3B,MAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,MAAA,KAAA,CAAM,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,kBAAA,CAAoB,CAAA;AAAA,IAC/C;AAAA,EACF;AACF;AAsBO,IAAM,cAAA,GAAN,MAAM,eAAA,CAAe;AAAA,EAC1B,OAAwB,QAAA,mBAAoC,IAAI,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASpE,OAAO,OAAA,CACL,UAAA,EACA,OAAA,EACiB;AACjB,IAAA,MAAM,QAAA,GAAW,eAAA,CAAe,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAEvD,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,IAAI,QAAA,CAAS,wBAAwB,IAAA,EAAM;AACzC,QAAA,YAAA,CAAa,SAAS,mBAAmB,CAAA;AACzC,QAAA,QAAA,CAAS,mBAAA,GAAsB,IAAA;AAC/B,QAAA,KAAA,CAAM,CAAA,mCAAA,EAAsC,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,MAC3D;AAGA,MAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,KAAA,KAAU,cAAA,EAAgB;AAC7C,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAc;AACjD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,KAAA;AAAA,YACE,gBAAgB,UAAU,CAAA,qCAAA;AAAA,WAC5B;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,KAAA,KAAU,WAAA,EAAa;AAC1C,QAAA,KAAA;AAAA,UACE,yBAAyB,UAAU,CAAA,sCAAA;AAAA,SACrC;AACA,QAAA,MAAMC,WAAU,OAAA,EAAQ;AACxB,QAAA,eAAA,CAAe,QAAA,CAAS,IAAI,UAAA,EAAY;AAAA,UACtC,OAAA,EAAAA,QAAAA;AAAA,UACA,QAAA,EAAU,CAAA;AAAA,UACV,mBAAA,EAAqB;AAAA,SACtB,CAAA;AACD,QAAA,OAAOA,QAAAA;AAAA,MACT;AAEA,MAAA,QAAA,CAAS,QAAA,IAAY,CAAA;AACrB,MAAA,KAAA;AAAA,QACE,CAAA,UAAA,EAAa,UAAU,CAAA,aAAA,EAAgB,QAAA,CAAS,QAAQ,CAAA,CAAA;AAAA,OAC1D;AACA,MAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IAClB;AAGA,IAAA,MAAM,UAAU,OAAA,EAAQ;AACxB,IAAA,eAAA,CAAe,QAAA,CAAS,IAAI,UAAA,EAAY;AAAA,MACtC,OAAA;AAAA,MACA,QAAA,EAAU,CAAA;AAAA,MACV,mBAAA,EAAqB;AAAA,KACtB,CAAA;AACD,IAAA,KAAA,CAAM,CAAA,2BAAA,EAA8B,UAAU,CAAA,CAAA,CAAG,CAAA;AACjD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAQ,UAAA,EAA0B;AACvC,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAe,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AACpD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,CAAM,CAAA,uCAAA,EAA0C,UAAU,CAAA,CAAA,CAAG,CAAA;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,WAAW,CAAC,CAAA;AAC/C,IAAA,KAAA,CAAM,CAAA,UAAA,EAAa,UAAU,CAAA,aAAA,EAAgB,KAAA,CAAM,QAAQ,CAAA,CAAA,CAAG,CAAA;AAE9D,IAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAG;AAExB,MAAA,KAAA,CAAM,mBAAA,GAAsB,WAAW,MAAM;AAC3C,QAAA,KAAA,CAAM,mBAAA,GAAsB,IAAA;AAG5B,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA;AAAA,QACF;AAEA,QAAA,KAAA,CAAM,CAAA,sBAAA,EAAyB,UAAU,CAAA,iBAAA,CAAmB,CAAA;AAC5D,QAAA,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAQ,CAAE,IAAA,CAAK,MAAM;AAGjC,UAAA,IACE,eAAA,CAAe,SAAS,GAAA,CAAI,UAAU,MAAM,KAAA,IAC5C,KAAA,CAAM,OAAA,CAAQ,KAAA,KAAU,WAAA,EACxB;AACA,YAAA,eAAA,CAAe,QAAA,CAAS,OAAO,UAAU,CAAA;AACzC,YAAA,KAAA,CAAM,CAAA,6BAAA,EAAgC,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,UACrD;AAAA,QACF,CAAC,CAAA;AAAA,MACH,GAAG,CAAC,CAAA;AAAA,IACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,IAAI,UAAA,EAAiD;AAC1D,IAAA,OAAO,eAAA,CAAe,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA,EAAG,OAAA;AAAA,EAClD;AACF;AAWA,SAAS,WAAA,CACP,IAAA,EACA,EAAA,EACA,SAAA,EACe;AAEf,EAAA,IAAI,EAAE,gBAAgB,OAAA,CAAA,EAAU;AAC9B,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAEA,EAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACpC,IAAA,IAAI,OAAA,GAAU,KAAA;AAEd,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,SAAA,EAAU;AACV,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,GAAG,EAAE,CAAA;AAEL,IAAA,IAAA,CAAK,IAAA;AAAA,MACH,MAAM;AACJ,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AAAA,MACA,CAAC,GAAA,KAAQ;AACP,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,YAAA,CAAa,KAAK,CAAA;AAGlB,UAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAGA,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,MAAM,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAChF;AAGA,SAAS,SAAS,IAAA,EAAuB;AACvC,EAAA,IACE,OAAO,UAAA,KAAe,WAAA,IACrB,UAAA,CAAuC,kBAAA,EACxC;AACA,IAAA,OAAA,CAAQ,KAAA,CAAMD,WAAAA,EAAY,GAAG,IAAI,CAAA;AAAA,EACnC;AACF;;;AC7ZA,IAAM,iBAAA,GAAoB,GAAA;AAC1B,IAAM,oBAAA,GAAuB,EAAA;AAC7B,IAAM,iBAAA,GAAoB,EAAA;AAE1B,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,kCAAA,GAAqC,GAAA;AAC3C,IAAM,2BAAA,GAA8B,GAAA;AACpC,IAAM,sBAAA,GAAyB,GAAA;AAE/B,IAAMA,WAAAA,GAAa,gBAAA;AAGnB,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAM,gBAAA,GAA2C;AAAA,EAC/C,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,aAAA;AAAA,EACR,GAAA,EAAK,YAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAGA,IAAM,oBAAA,GACJ,sFAAA;AAGF,IAAM,wCAAwB,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,KAAA,EAAO,OAAO,CAAC,CAAA;AAGlE,IAAM,YAAA,GAAyB;AAAA;AAAA,EAE7B,iDAAA;AAAA;AAAA,EAEA,uDAAA;AAAA;AAAA,EAEA,8BAAA;AAAA;AAAA,EAEA;AACF,CAAA;AAOA,SAAS,SAAS,GAAA,EAAqB;AACrC,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,IAAA,GAAA,CAAS,QAAQ,CAAA,IAAK,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,GAAK,CAAA;AAAA,EACpD;AACA,EAAA,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA;AACjC;AAGA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAElC,IAAA,OAAA,CAAQ,SAAA,GAAY,CAAA;AACpB,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,YAAY,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,QAAA,CAAS,MAAc,GAAA,EAAqB;AACnD,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,GAAA,EAAK,OAAO,IAAA;AAC/B,EAAA,OAAO,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAE,SAAQ,GAAI,QAAA;AACxC;AAGA,SAAS,mBAAmB,IAAA,EAAsB;AAChD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACxC;AAGA,SAAS,cAAA,CAAe,EAAA,EAAa,MAAA,GAAiB,GAAA,EAAa;AACjE,EAAA,MAAM,GAAA,GAAM,GAAG,WAAA,IAAe,EAAA;AAC9B,EAAA,OAAO,SAAS,QAAA,CAAS,kBAAA,CAAmB,GAAG,CAAA,EAAG,MAAM,CAAC,CAAA;AAC3D;AAGA,SAAS,iBAAiB,EAAA,EAAsB;AAC9C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AACxC,EAAA,OACE,MAAM,OAAA,KAAY,MAAA,IAClB,MAAM,UAAA,KAAe,QAAA,IACrB,MAAM,OAAA,KAAY,GAAA;AAEtB;AAGA,SAAS,mBAAmB,EAAA,EAAqB;AAC/C,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA;AAC9C,EAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,EAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,YAAA,CAAa,iBAAiB,CAAA;AACxD,EAAA,IAAI,cAAA,IAAkB,OAAO,QAAA,KAAa,WAAA,EAAa;AACrD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,cAAc,CAAA;AACtD,IAAA,IAAI,OAAA,EAAS,OAAO,kBAAA,CAAmB,OAAA,CAAQ,eAAe,EAAE,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,EAAA;AACT;AAGA,SAAS,aAAa,EAAA,EAAsB;AAC1C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,qBAAA,IAAyB,MAAA,EAAQ;AACpE,IAAC,MAAA,CAAwE,oBAAoB,EAAE,CAAA;AAAA,EACjG,CAAA,MAAA,IAAW,OAAO,UAAA,KAAe,WAAA,EAAa;AAC5C,IAAA,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EAClB,CAAA,MAAO;AACL,IAAA,EAAA,EAAG;AAAA,EACL;AACF;AAcA,SAAS,cAAc,EAAA,EAAqB;AAE1C,EAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,YAAA,CAAa,sBAAsB,CAAA;AAC7D,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAO,0BAA0B,cAAc,CAAA,EAAA,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,KAAK,EAAA,CAAG,EAAA;AACd,EAAA,IAAI,EAAA,IAAM,OAAO,QAAA,KAAa,WAAA,EAAa;AAEzC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,SAAS,gBAAA,CAAiB,CAAA,CAAA,EAAI,IAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,CAAA;AAC9D,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA;AAC5C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,iBAAiB,MAAM,CAAA,EAAA,CAAA;AAAA,EAChC;AAGA,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA;AAC9C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,gBAAgB,SAAS,CAAA,EAAA,CAAA;AAAA,EAClC;AAGA,EAAA,OAAO,oBAAoB,EAAE,CAAA;AAC/B;AAGA,SAAS,oBAAoB,EAAA,EAAqB;AAChD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,OAAA,GAA0B,EAAA;AAE9B,EAAA,OAAO,OAAA,IAAW,OAAA,KAAY,QAAA,CAAS,eAAA,EAAiB;AACtD,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAExC,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,GAAA,KAAQ,MAAA,EAAQ;AACpC,MAAA,KAAA,CAAM,QAAQ,GAAG,CAAA;AACjB,MAAA,OAAA,GAAU,OAAA,CAAQ,aAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,OAAA,CAAQ,aAAA;AACvB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAA;AAAA,QAC3C,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,OAAA,CAAS;AAAA,OAChC;AACA,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,GAAI,CAAA;AAC1C,QAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAA,WAAA,EAAc,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,MACnB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,IACnB;AAEA,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AACzB;AAMA,IAAI,cAAA,GAAiB,CAAA;AAErB,SAAS,kBAAkB,EAAA,EAAqB;AAC9C,EAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,YAAA,CAAa,sBAAsB,CAAA;AAC7D,EAAA,IAAI,gBAAgB,OAAO,cAAA;AAE3B,EAAA,MAAM,KAAK,EAAA,CAAG,EAAA;AACd,EAAA,IAAI,IAAI,OAAO,EAAA;AAEf,EAAA,MAAM,SAAA,GAAY,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA;AAC9C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,SAAA,CACJ,aAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAAA,EACzB;AAEA,EAAA,cAAA,IAAkB,CAAA;AAClB,EAAA,OAAO,WAAW,cAAc,CAAA,CAAA;AAClC;AAcO,IAAM,aAAN,MAAiB;AAAA,EACL,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EAET,WAAA,GAAgC,IAAA;AAAA;AAAA,EAGhC,aAAA,uBAA0C,GAAA,EAAI;AAAA;AAAA,EAG9C,QAAA,GAAoC,IAAA;AAAA,EACpC,aAAA,GAAgB,CAAA;AAAA,EAChB,mBAAA,GAAsB,CAAA;AAAA,EACtB,aAAA,GAAgB,KAAA;AAAA,EAChB,kBAAA,GAA2D,IAAA;AAAA,EAC3D,aAAA,GAAsD,IAAA;AAAA,EACtD,YAAA,GAAe,CAAA;AAAA,EAEvB,YAAY,OAAA,EAA6B;AACvC,IAAA,MAAM,SAAA,GACJ,OAAO,QAAA,KAAa,WAAA,IAAe,OAAO,MAAA,KAAW,WAAA;AAEvD,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,EAAS,WAAA,KAAgB,SAAA,GAAY,SAAS,IAAA,GAAO,IAAA,CAAA;AACjE,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,KAAA;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,SAAS,QAAA,IAAY,iBAAA;AACrC,IAAA,IAAA,CAAK,WAAA,GAAc,SAAS,WAAA,IAAe,oBAAA;AAC3C,IAAA,IAAA,CAAK,QAAA,GAAW,SAAS,QAAA,IAAY,iBAAA;AAErC,IAAA,IAAA,CAAK,IAAI,aAAA,EAAe;AAAA,MACtB,IAAA,EAAM,KAAK,IAAA,EAAM,OAAA;AAAA,MACjB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,GAAkB;AAChB,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,OAAO,WAAW,WAAA,EAAa;AACpE,MAAA,IAAA,CAAK,IAAI,iDAAiD,CAAA;AAC1D,MAAA,OAAO,KAAK,UAAA,EAAW;AAAA,IACzB;AAEA,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,IAAA,CAAK,IAAI,kDAAkD,CAAA;AAC3D,MAAA,OAAO,KAAK,UAAA,EAAW;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,IAAI,eAAe,CAAA;AACxB,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAGlC,IAAA,cAAA,GAAiB,CAAA;AAEjB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,eAAA,GAAkB,KAAA;AAGtB,IAAA,MAAM,oBAA2D,EAAC;AAGlE,IAAA,MAAM,SAAS,QAAA,CAAS,gBAAA;AAAA,MACtB,IAAA,CAAK,IAAA;AAAA,MACL,UAAA,CAAW,YAAA;AAAA,MACX;AAAA,QACE,UAAA,EAAY,CAAC,IAAA,KAAuB;AAClC,UAAA,MAAM,EAAA,GAAK,IAAA;AAGX,UAAA,IAAI,EAAA,CAAG,YAAA,CAAa,sBAAsB,CAAA,EAAG;AAC3C,YAAA,OAAO,UAAA,CAAW,aAAA;AAAA,UACpB;AAGA,UAAA,IAAI,YAAA,IAAgB,KAAK,QAAA,EAAU;AACjC,YAAA,eAAA,GAAkB,IAAA;AAClB,YAAA,OAAO,UAAA,CAAW,aAAA;AAAA,UACpB;AAEA,UAAA,YAAA,EAAA;AACA,UAAA,OAAO,UAAA,CAAW,aAAA;AAAA,QACpB;AAAA;AACF,KACF;AAGA,IAAA,IAAI,WAAA,GAAc,OAAO,QAAA,EAAS;AAClC,IAAA,OAAO,WAAA,EAAa;AAClB,MAAA,MAAM,EAAA,GAAK,WAAA;AAIX,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AAC9B,MAAA,IAAI,SAAS,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,kBAAA,CAAmB,EAAE,CAAA,EAAG;AACzD,QAAA,iBAAA,CAAkB,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,EAAO,CAAA;AAAA,MACtC;AAEA,MAAA,WAAA,GAAc,OAAO,QAAA,EAAS;AAAA,IAChC;AAEA,IAAA,IAAA,CAAK,IAAI,CAAA,OAAA,EAAU,YAAY,CAAA,cAAA,EAAiB,iBAAA,CAAkB,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAG7F,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,iBAAiB,CAAA;AACvD,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,EAAkB;AAC1C,IAAA,MAAM,mBAAA,GAAsB,KAAK,0BAAA,EAA2B;AAC5D,IAAA,MAAM,KAAA,GAAQ,KAAK,YAAA,EAAa;AAChC,IAAA,MAAM,cAAA,GAAiB,KAAK,eAAA,EAAgB;AAC5C,IAAA,MAAM,IAAA,GAAO,KAAK,WAAA,EAAY;AAE9B,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,oBAAoB,iBAAA,CAAkB,MAAA;AAAA,MACtC,kBAAkB,QAAA,CAAS,MAAA;AAAA,MAC3B,iBAAA,EAAmB,YAAA;AAAA,MACnB,mBAAA,EAAqB;AAAA,KACvB;AAEA,IAAA,MAAM,KAAA,GAAmB;AAAA,MACvB,GAAA,EAAK,OAAO,QAAA,CAAS,IAAA;AAAA,MACrB,KAAA,EAAO,SAAS,KAAA,IAAS,EAAA;AAAA,MACzB,IAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,mBAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,OAAO,MAAA,CAAO,UAAA;AAAA,QACd,QAAQ,MAAA,CAAO,WAAA;AAAA,QACf,WAAA,EACE,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,cAAc,WAAA,GAAc;AAAA,OAC5D;AAAA,MACA,oBAAoB,QAAA,CAAS,GAAA;AAAA,QAC3B,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,EAAE,KAAK,CAAA,EAAA,EAAK,EAAE,OAAO,CAAA;AAAA,OAClC;AAAA,MACA,IAAA,EAAM,EAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB;AAAA,KACF;AAGA,IAAA,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAEpC,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAEnB,IAAA,MAAM,WAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA,EAAW,QAAQ,CAAC,CAAA;AACzD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,iBAAA,EAAoB,OAAO,CAAA,EAAA,CAAA,EAAM;AAAA,MACxC,UAAU,QAAA,CAAS,MAAA;AAAA,MACnB,UAAU,UAAA,CAAW,MAAA;AAAA,MACrB,aAAa,mBAAA,CAAoB,MAAA;AAAA,MACjC,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,UAAU,cAAA,CAAe,MAAA;AAAA,MACzB,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,QAAA,EAAkD;AACxD,IAAA,IAAI,OAAO,gBAAA,KAAqB,WAAA,IAAe,CAAC,KAAK,IAAA,EAAM;AACzD,MAAA,IAAA,CAAK,IAAI,2CAA2C,CAAA;AACpD,MAAA,OAAO,MAAM;AAAA,MAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,IAAI,sBAAsB,CAAA;AAE/B,IAAA,MAAM,eAAA,GAAkB,CAAC,UAAA,KAAiC;AACxD,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,MAAA,IAAI,GAAA,GAAM,IAAA,CAAK,mBAAA,GAAsB,GAAA,EAAM;AAEzC,QAAA,IAAA,CAAK,gBAAgB,UAAA,CAAW,MAAA;AAChC,QAAA,IAAA,CAAK,mBAAA,GAAsB,GAAA;AAAA,MAC7B,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,iBAAiB,UAAA,CAAW,MAAA;AAAA,MACnC;AAEA,MAAA,IAAI,IAAA,CAAK,gBAAgB,kCAAA,EAAoC;AAC3D,QAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,UAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,UAAA,IAAA,CAAK,IAAI,oDAA+C,CAAA;AAGxD,UAAA,IAAA,CAAK,UAAU,UAAA,EAAW;AAE1B,UAAA,IAAA,CAAK,kBAAA,GAAqB,WAAW,MAAM;AACzC,YAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,YAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,YAAA,IAAA,CAAK,IAAI,mDAA8C,CAAA;AACvD,YAAA,IAAA,CAAK,cAAA,EAAe;AACpB,YAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAAA,UAC7B,GAAG,2BAA2B,CAAA;AAAA,QAChC;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC/B,QAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAAA,MACjC;AAEA,MAAA,IAAA,CAAK,aAAA,GAAgB,WAAW,MAAM;AACpC,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAAA,MAC7B,GAAG,oBAAoB,CAAA;AAAA,IACzB,CAAA;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,eAAe,CAAA;AACpD,IAAA,IAAA,CAAK,cAAA,EAAe;AAGpB,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,IAAI,sBAAsB,CAAA;AAC/B,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,iBAAiB,OAAA,EAA4C;AAC3D,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,MAAM,iBAAiB,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,YAAA,GAAiC;AACnC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,IAAA,EAAM;AAElC,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM;AAAA,MAC/B,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,eAAA,EAAiB;AAAA,QACf,OAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA,sBAAA;AAAA,QACA,sBAAA;AAAA,QACA;AAAA;AACF,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,cAAc,QAAA,EAA4C;AAChE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,YAAA,GAAe,sBAAA,EAAwB;AACpD,MAAA,IAAA,CAAK,IAAI,kBAAkB,CAAA;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,GAAA;AAEpB,IAAA,YAAA,CAAa,MAAM;AACjB,MAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,IAAA,CAAK,SAAS,UAAA,EAAW;AACzB,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB;AACA,IAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC/B,MAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAC/B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AACA,IAAA,IAAI,IAAA,CAAK,uBAAuB,IAAA,EAAM;AACpC,MAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACpC,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,EAAA,EAAsB;AAC/C,IAAA,MAAM,MAAM,EAAA,CAAG,OAAA;AAGf,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,IAAA;AAGlC,IAAA,IACE,EAAA,CAAG,aAAa,MAAM,CAAA,IACtB,GAAG,YAAA,CAAa,YAAY,CAAA,IAC5B,EAAA,CAAG,EAAA,EACH;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,gBACN,UAAA,EACe;AACf,IAAA,MAAM,SAAwB,EAAC;AAE/B,IAAA,KAAA,MAAW,EAAE,EAAA,EAAI,KAAA,EAAM,IAAK,UAAA,EAAY;AACtC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,EAAA,EAAI,KAAK,CAAA;AAC/C,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IACrB;AAGA,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAGvC,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA;AAAA,EACzC;AAAA,EAEQ,gBAAA,CAAiB,IAAa,KAAA,EAA4B;AAChE,IAAA,MAAM,MAAM,EAAA,CAAG,OAAA;AACf,IAAA,MAAM,QAAA,GAAW,cAAc,EAAE,CAAA;AAGjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAA;AAGrC,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,EAAA,EAAI,GAAG,CAAA;AAGtC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA;AAC/C,IAAA,MAAM,SAAA,GAAY,QAAA,GAAW,CAAA,IAAK,IAAA,CAAK,aAAa,EAAE,CAAA;AAGtD,IAAA,MAAM,cAAA,GACJ,EAAA,CAAG,aAAA,CAAc,oBAAoB,CAAA,KAAM,IAAA;AAG7C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAGpC,IAAA,MAAM,UAAA,GAAa,EAAA,CAAG,aAAA,CAAc,wBAAwB,CAAA,KAAM,IAAA;AAGlE,IAAA,MAAM,KAAA,GAAQ,KAAK,YAAA,CAAa;AAAA,MAC9B,SAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,kBAAkB,EAAE,CAAA;AAAA,MACxB,QAAA;AAAA,MACA,OAAA,EAAS,IAAI,WAAA,EAAY;AAAA,MACzB,KAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA,EAAiB,QAAA;AAAA,MACjB,KAAA;AAAA,MACA,UAAU,QAAA,IAAY,MAAA;AAAA,MACtB,sBAAA,EAAwB,cAAA;AAAA,MACxB;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,gBAAgB,EAAA,EAAqB;AAE3C,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA;AAC9C,IAAA,IAAI,WAAW,OAAO,SAAA;AAGtB,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,aAAA,CAAc,wBAAwB,CAAA;AACzD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAA;AACzD,MAAA,IAAI,MAAM,OAAO,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,IAC9C;AAGA,IAAA,IAAI,EAAA,CAAG,EAAA,EAAI,OAAO,EAAA,CAAG,EAAA;AAGrB,IAAA,OAAO,EAAA,CAAG,QAAQ,WAAA,EAAY;AAAA,EAChC;AAAA,EAEQ,YAAY,EAAA,EAA4B;AAE9C,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA;AACnC,IAAA,IAAI,MAAM,OAAO,IAAA;AAGjB,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,EAAA,CAAG,OAAO,CAAA;AAC5C,IAAA,IAAI,UAAU,OAAO,QAAA;AAGrB,IAAA,IAAA,CACG,EAAA,CAAG,YAAY,SAAA,IAAa,EAAA,CAAG,YAAY,SAAA,KAC5C,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA,EAC5B;AACA,MAAA,OAAO,EAAA,CAAG,OAAA,KAAY,SAAA,GAAY,QAAA,GAAW,SAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAa,MAAA,EAOV;AACT,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,IAAI,MAAA,CAAO,WAAW,KAAA,IAAS,GAAA;AAC/B,IAAA,IAAI,MAAA,CAAO,gBAAgB,KAAA,IAAS,EAAA;AACpC,IAAA,IAAI,MAAA,CAAO,UAAU,KAAA,IAAS,EAAA;AAG9B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,EAAA,CAAG,qBAAA,EAAsB;AAC7C,MAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA;AAC9B,MAAA,IACE,KAAK,GAAA,IAAO,CAAC,kBACb,IAAA,CAAK,GAAA,IAAO,iBAAiB,CAAA,EAC7B;AACA,QAAA,KAAA,IAAS,EAAA;AAAA,MACX;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,YAAY,KAAA,IAAS,CAAA;AAGhC,IAAA,KAAA,IAAS,OAAO,KAAA,GAAQ,CAAA;AAExB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAA+B;AACrC,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,EAAC;AAE7C,IAAA,MAAM,cAAc,IAAA,CAAK,IAAA,EAAM,gBAAA,CAAiB,KAAK,KAAK,EAAC;AAC3D,IAAA,MAAM,QAAmB,EAAC;AAE1B,IAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC3B,MAAA,IAAI,GAAA,CAAI,YAAA,CAAa,sBAAsB,CAAA,EAAG;AAE9C,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,gBAAA,CAAiB,SAAS,CAAA;AAC5C,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,QAAA,MAAM,MAAA,GAAS,IAAA;AACf,QAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,MAAA,CAAO,WAAA,IAAe,EAAE,CAAA;AACzD,QAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA,IAAK,EAAA;AAC5C,QAAA,MAAM,YACJ,MAAA,CAAO,YAAA,CAAa,cAAc,CAAA,KAAM,UACxC,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,QAAQ,KACjC,OAAO,MAAA,KAAW,eAAe,MAAA,CAAO,IAAA,KAAS,OAAO,QAAA,CAAS,IAAA;AAEpE,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,KAAA,EAAO,QAAA,CAAS,QAAA,CAAS,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,UACnC,IAAA;AAAA,UACA,SAAA;AAAA,UACA,QAAA,EAAU,cAAc,MAAM;AAAA,SAC/B,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,0BAAA,GAAmD;AACzD,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,CAAC,IAAA,CAAK,IAAA,SAAa,EAAC;AAE3D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,oBAAoB,CAAA;AAChE,IAAA,MAAM,SAA+B,EAAC;AAEtC,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,EAAA,KAAO;AAEvB,MAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,wBAAwB,CAAA,EAAG;AAE1C,MAAA,MAAM,MAAA,GAAS,EAAA;AACf,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AAGxC,MAAA,MAAM,cACJ,GAAA,KAAQ,OAAA,IAAW,qBAAA,CAAsB,GAAA,CAAI,QAAQ,EAAE,CAAA;AAGzD,MAAA,IAAI,KAAA,GAAQ,mBAAmB,EAAE,CAAA;AACjC,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,WAAA,EAAa;AAC1B,QAAA,KAAA,GAAQ,kBAAA,CAAmB,EAAA,CAAG,WAAA,IAAe,EAAE,CAAA;AAAA,MACjD;AACA,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,WAAA,GAAc,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA;AACjD,QAAA,IAAI,WAAA,IAAe,CAAC,WAAA,EAAa;AAC/B,UAAA,KAAA,GAAQ,WAAA;AAAA,QACV;AAAA,MACF;AACA,MAAA,IAAI,CAAC,KAAA,IAAS,EAAA,CAAG,YAAA,CAAa,OAAO,CAAA,EAAG;AACtC,QAAA,KAAA,GAAQ,EAAA,CAAG,YAAA,CAAa,OAAO,CAAA,IAAK,EAAA;AAAA,MACtC;AACA,MAAA,IAAI,CAAC,SAAS,WAAA,EAAa;AACzB,QAAA,KAAA,GAAQ,IAAA,IAAQ,OAAA;AAAA,MAClB;AACA,MAAA,KAAA,GAAQ,QAAA,CAAS,QAAA,CAAS,KAAA,EAAO,EAAE,CAAC,CAAA;AAEpC,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AACxC,MAAA,MAAM,UAAA,GACJ,OAAO,YAAA,CAAa,UAAU,KAC9B,MAAA,CAAO,YAAA,CAAa,eAAe,CAAA,KAAM,MAAA;AAC3C,MAAA,MAAM,cAAA,GACJ,EAAA,CAAG,YAAA,CAAa,sBAAsB,CAAA,IAAK,MAAA;AAE7C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,cAAc,EAAE,CAAA;AAAA,QAC1B,OAAA,EAAS,GAAA;AAAA,QACT,IAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAA,GAA8B;AACpC,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,CAAC,IAAA,CAAK,IAAA,SAAa,EAAC;AAE3D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA;AACtD,IAAA,MAAM,SAAwB,EAAC;AAE/B,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC7B,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,wBAAwB,CAAA,EAAG;AAE5C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AAC1C,MAAA,MAAM,sBAAsB,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAEzD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,cAAc,IAAI,CAAA;AAAA,QAC5B,EAAA,EAAI,KAAK,EAAA,IAAM,MAAA;AAAA,QACf,MAAA,EAAQ,KAAK,MAAA,IAAU,MAAA;AAAA,QACvB,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,IAAA,EAAoC;AAC5D,IAAA,MAAM,SAAsB,EAAC;AAC7B,IAAA,MAAM,gBAAgB,IAAA,CAAK,gBAAA;AAAA,MACzB;AAAA,KACF;AAEA,IAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,EAAA,KAAO;AAC5B,MAAA,MAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,EAAA,IAAM,EAAA;AACvC,MAAA,MAAM,IAAA,GACJ,EAAA,CAAG,OAAA,KAAY,QAAA,GACX,QAAA,GACA,GAAG,OAAA,KAAY,UAAA,GACb,UAAA,GACC,EAAA,CAAwB,IAAA,IAAQ,MAAA;AAGzC,MAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,MAAA,IAAI,KAAA,CAAM,EAAA,IAAM,OAAO,QAAA,KAAa,WAAA,EAAa;AAC/C,QAAA,MAAM,UAAU,QAAA,CAAS,aAAA;AAAA,UACvB,CAAA,WAAA,EAAc,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAC,CAAA,EAAA;AAAA,SACpC;AACA,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,KAAA,GAAQ,kBAAA,CAAmB,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAA;AAAA,QACtD;AAAA,MACF;AACA,MAAA,IAAI,CAAC,KAAA,EAAO;AAEV,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA;AACzC,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,KAAA,GAAQ,kBAAA,CAAmB,WAAA,CAAY,WAAA,IAAe,EAAE,CAAA;AAAA,QAC1D;AAAA,MACF;AACA,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,KAAA,GAAQ,mBAAmB,EAAE,CAAA;AAAA,MAC/B;AACA,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,WAAA,GAAc,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA;AACjD,QAAA,KAAA,GAAQ,WAAA,IAAe,IAAA;AAAA,MACzB;AACA,MAAA,KAAA,GAAQ,QAAA,CAAS,QAAA,CAAS,KAAA,EAAO,EAAE,CAAC,CAAA;AAGpC,MAAA,MAAM,UAAA,GACJ,MAAM,YAAA,CAAa,UAAU,KAC7B,KAAA,CAAM,YAAA,CAAa,eAAe,CAAA,KAAM,MAAA;AAG1C,MAAA,MAAM,QAAA,GACJ,KAAA,CAAM,YAAA,CAAa,cAAc,CAAA,KAAM,MAAA,IACtC,KAAA,YAAiB,gBAAA,IAAoB,CAAC,KAAA,CAAM,QAAA,CAAS,KAAA,IAAS,MAAM,KAAA,KAAU,EAAA;AAEjF,MAAA,IAAI,YAAA;AACJ,MAAA,MAAM,UAAU,KAAA,CAAM,YAAA,CAAa,mBAAmB,CAAA,IAAK,KAAA,CAAM,aAAa,kBAAkB,CAAA;AAChG,MAAA,IAAI,QAAA,IAAY,OAAA,IAAW,OAAO,QAAA,KAAa,WAAA,EAAa;AAC1D,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,OAAO,CAAA;AAC/C,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,YAAA,GAAe,kBAAA,CAAmB,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAA;AAAA,QAC7D;AAAA,MACF;AACA,MAAA,IAAI,QAAA,IAAY,CAAC,YAAA,IAAgB,KAAA,YAAiB,gBAAA,EAAkB;AAClE,QAAA,YAAA,GAAe,MAAM,iBAAA,IAAqB,MAAA;AAAA,MAC5C;AAEA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,cAAc,EAAE,CAAA;AAAA,QAC1B,IAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAA,GAAoC;AAC1C,IAAA,IAAI,OAAO,aAAa,WAAA,IAAe,OAAO,WAAW,WAAA,IAAe,CAAC,KAAK,IAAA,EAAM;AAClF,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,SAA2B,EAAC;AAGlC,IAAA,MAAM,cAAA,GAAiB,KAAK,IAAA,CAAK,gBAAA;AAAA,MAC/B;AAAA,KACF;AACA,IAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,EAAA,KAAO;AAC7B,MAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,wBAAwB,CAAA,EAAG;AAC1C,MAAA,MAAM,QAAQ,kBAAA,CAAmB,EAAE,KAAK,cAAA,CAAe,EAAA,EAAI,EAAE,CAAA,IAAK,QAAA;AAClE,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,cAAc,EAAE,CAAA;AAAA,QAC1B,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAS,KAAK,CAAA;AAAA,QACrB,SAAA,EAAW,iBAAiB,EAAE;AAAA,OAC/B,CAAA;AAAA,IACH,CAAC,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAa,cAAc,CAAA;AAE5C,IAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,EAAA,KAAO;AAC1B,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,MAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,wBAAwB,CAAA,EAAG;AAE1C,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AACxC,MAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,MAAA,EAAQ,EAAE,CAAA,IAAK,CAAA;AAE7C,MAAA,IAAA,CACG,QAAA,KAAa,WAAW,QAAA,KAAa,UAAA,KACtC,CAAC,KAAA,CAAM,MAAM,CAAA,IACb,MAAA,IAAU,GAAA,EACV;AACA,QAAA,MAAM,OAAA,GAAU,iBAAiB,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,OAAA,EAAS;AAGd,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,EAAA,EAAI,KAAK,CAAA;AAClD,QAAA,IAAI,CAAC,WAAA,EAAa;AAElB,QAAA,MAAM,QACJ,kBAAA,CAAmB,EAAE,KAAK,cAAA,CAAe,EAAA,EAAI,EAAE,CAAA,IAAK,WAAA;AAEtD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,QAAA,EAAU,cAAc,EAAE,CAAA;AAAA,UAC1B,IAAA,EAAM,WAAA;AAAA,UACN,KAAA,EAAO,SAAS,KAAK,CAAA;AAAA,UACrB,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CACN,IACA,KAAA,EAC+B;AAC/B,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA;AACnC,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,aAAA,EAAe,OAAO,OAAA;AACxD,IAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,SAAA,EAAW,OAAO,UAAA;AAGlD,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,SAAA,EAAW,QAAA,IAAW,IAAK,EAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,UAAU,WAAA,EAAY;AAEpC,IAAA,IAAI,KAAA,CAAM,SAAS,OAAO,CAAA,IAAK,MAAM,QAAA,CAAS,QAAQ,GAAG,OAAO,OAAA;AAChE,IAAA,IAAI,KAAA,CAAM,SAAS,QAAQ,CAAA,IAAK,MAAM,QAAA,CAAS,SAAS,GAAG,OAAO,QAAA;AAClE,IAAA,IACE,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA,IACzB,KAAA,CAAM,SAAS,MAAM,CAAA,IACrB,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA;AAExB,MAAA,OAAO,UAAA;AAGT,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AACpC,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AACtC,IAAA,IACE,OAAO,MAAA,KAAW,WAAA,IAClB,CAAC,KAAA,CAAM,KAAK,KACZ,CAAC,KAAA,CAAM,MAAM,CAAA,IACb,QAAQ,MAAA,CAAO,UAAA,GAAa,OAC5B,MAAA,GAAS,MAAA,CAAO,cAAc,GAAA,EAC9B;AACA,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,IAAI,CAAC,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,GAAQ,KAAK,OAAO,SAAA;AAEzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAA,GAAiC;AACvC,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA,OAAO,EAAE,WAAA,EAAa,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,IACrD;AAEA,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,0BAA0B,CAAA;AAClE,IAAA,MAAM,WAAA,GAAc,QAAA,EAAU,YAAA,CAAa,SAAS,CAAA,IAAK,EAAA;AAEzD,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACxC,IAAA,MAAM,EAAA,GAAK,OAAO,QAAA,CAAS,kBAAA,CAAmB,KAAK,WAAA,IAAe,EAAE,CAAC,CAAA,GAAI,IAAA;AAEzE,IAAA,MAAM,QAAA,GACJ,QAAA,CAAS,eAAA,CAAgB,YAAA,CAAa,MAAM,CAAA,IAAK,IAAA;AAEnD,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,SAAS,WAAW,CAAA;AAAA,MACjC,EAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,SAAS,EAAA,EAAqB;AACpC,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,OAAA,GAA0B,EAAA;AAC9B,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,IAAA,OAAO,WAAW,OAAA,KAAY,IAAA,IAAQ,KAAA,GAAQ,IAAA,CAAK,WAAW,CAAA,EAAG;AAC/D,MAAA,OAAA,GAAU,OAAA,CAAQ,aAAA;AAClB,MAAA,KAAA,EAAA;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,aAAa,EAAA,EAAsB;AACzC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,MAAA,OACE,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,WAAA,IAClB,IAAA,CAAK,MAAA,GAAS,CAAA,IACd,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,UAAA,IACnB,IAAA,CAAK,KAAA,GAAQ,CAAA;AAAA,IAEjB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,aAAa,KAAA,EAA0B;AAE7C,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,KAAA,CAAM,GAAA;AAAA,MACN,KAAA,CAAM,KAAA;AAAA,MACN,KAAA,CAAM,KAAK,EAAA,IAAM,EAAA;AAAA,MACjB,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,MACxD,KAAA,CAAM,WAAW,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAC5C,KAAA,CAAM,mBAAA,CAAoB,MAAA,CAAO,QAAA,EAAS;AAAA,MAC1C,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,QAAA,EAAS;AAAA,MAC5B,KAAA,CAAM,cAAA,CAAe,MAAA,CAAO,QAAA;AAAS,KACvC,CAAE,KAAK,GAAG,CAAA;AAEV,IAAA,OAAO,SAAS,OAAO,CAAA;AAAA,EACzB;AAAA,EAEQ,UAAA,GAAwB;AAC9B,IAAA,OAAO;AAAA,MACL,KAAK,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,EAAA;AAAA,MAC5D,OAAO,OAAO,QAAA,KAAa,WAAA,GAAc,QAAA,CAAS,SAAS,EAAA,GAAK,EAAA;AAAA,MAChE,MAAM,EAAE,WAAA,EAAa,IAAI,EAAA,EAAI,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,MAClD,UAAU,EAAC;AAAA,MACX,YAAY,EAAC;AAAA,MACb,qBAAqB,EAAC;AAAA,MACtB,OAAO,EAAC;AAAA,MACR,gBAAgB,EAAC;AAAA,MACjB,UAAU,EAAE,KAAA,EAAO,GAAG,MAAA,EAAQ,CAAA,EAAG,aAAa,UAAA,EAAW;AAAA,MACzD,oBAAoB,EAAC;AAAA,MACrB,IAAA,EAAM,EAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,YAAA,EAAc;AAAA,QACZ,kBAAA,EAAoB,CAAA;AAAA,QACpB,gBAAA,EAAkB,CAAA;AAAA,QAClB,iBAAA,EAAmB,CAAA;AAAA,QACnB,mBAAA,EAAqB;AAAA;AACvB,KACF;AAAA,EACF;AAAA,EAEQ,GAAA,CAAI,SAAiB,IAAA,EAAsC;AACjE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,OAAA,CAAQ,IAAI,CAAA,EAAGA,WAAU,CAAA,CAAA,EAAI,OAAO,IAAI,IAAI,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAGA,WAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACF;;;ACxmCA,IAAM,mBAAA,GAAsB,kBAAA;AAC5B,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,8BAAA,GAAiC,GAAA;AACvC,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAM,oBAAA,GAAuB,GAAA;AAO7B,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,IAAI,OAAO,gBAAgB,WAAA,EAAa;AACtC,IAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,UAAA;AAAA,EACvC;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC7B,IAAA,IAAI,IAAA,IAAQ,KAAM,KAAA,IAAS,CAAA;AAAA,SAAA,IAClB,IAAA,IAAQ,MAAO,KAAA,IAAS,CAAA;AAAA,SAAA,IACxB,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,EAAQ;AACzC,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,CAAA,EAAA;AAAA,IACF,OAAO,KAAA,IAAS,CAAA;AAAA,EAClB;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAASE,YAAAA,CAAe,SAAqB,EAAA,EAA+B;AAC1E,EAAA,OAAO,IAAI,OAAA,CAAkB,CAAC,OAAA,KAAY;AACxC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd;AAAA,IACF,GAAG,EAAE,CAAA;AAEL,IAAA,OAAA,CACG,IAAA,CAAK,CAAC,KAAA,KAAU;AACf,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd;AAAA,IACF,CAAC,CAAA;AAAA,EACL,CAAC,CAAA;AACH;AAGA,SAAS,iBAAA,GAA6B;AACpC,EAAA,IAAI;AACF,IAAA,OACE,OAAO,MAAA,KAAW,WAAA,IAClB,OAAO,OAAO,cAAA,KAAmB,WAAA;AAAA,EAErC,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGA,SAASC,SAAAA,CAAS,KAAa,GAAA,EAAqB;AAClD,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,EAAK,OAAO,GAAA;AAC9B,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA,GAAI,QAAA;AACjC;AAwBO,IAAM,iBAAN,MAAqB;AAAA,EAClB,KAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EAEA,UAA8B,EAAC;AAAA,EAC/B,YAAA,uBAA+C,GAAA,EAAI;AAAA;AAAA,EAGnD,eAAA,GAAoC,MAAA;AAAA,EACpC,UAAA,GAAa,KAAA;AAAA,EACb,eAAwC,EAAC;AAAA,EAEjD,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,EAAC;AAChC,IAAA,IAAA,CAAK,aAAa,OAAA,EAAS,UAAA;AAC3B,IAAA,IAAA,CAAK,QAAA,GAAW,SAAS,QAAA,IAAY,iBAAA;AACrC,IAAA,IAAA,CAAK,mBAAA,GACH,SAAS,mBAAA,IAAuB,8BAAA;AAClC,IAAA,IAAA,CAAK,WAAA,GAAc,SAAS,WAAA,IAAe,oBAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,KAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,iBAAA,CAAkB,WAAsB,KAAA,EAAiC;AACvE,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,CAAA;AAGlC,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,uBAAA,CAAwB,SAAS,CAAC,CAAA;AAGlD,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,wBAAA,CAAyB,SAAS,CAAC,CAAA;AAGnD,IAAA,IAAI,SAAA,CAAU,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,sBAAA,CAAuB,SAAS,CAAC,CAAA;AAAA,IACnD;AAGA,IAAA,IAAI,SAAA,CAAU,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AAC5C,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,+BAAA,CAAgC,SAAS,CAAC,CAAA;AAAA,IAC5D;AAGA,IAAA,IAAI,SAAA,CAAU,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAC,CAAA;AAAA,IAC9C;AAGA,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,oBAAA,CAAqB,SAAS,CAAC,CAAA;AAG/C,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAC,CAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACjD,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,uBAAA,EAAyB,CAAA;AAAA,IAC3C;AAGA,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,sBAAA,EAAwB,CAAA;AAGxC,IAAA,IAAI,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAC9B,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,WAAA,EAAa;AACpC,MAAA,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,SAAA,EAAW,KAAK,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,IAAA,EAA8B;AACpC,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAI,CAAA;AACtB,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA;AAAA,EAGA,UAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EAC5B;AAAA;AAAA,EAGA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,WAAW,SAAA,EAAoD;AAEnE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AAC9C,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,KAAI,EAAG;AAC3C,MAAA,OAAO,MAAA,CAAO,KAAA;AAAA,IAChB;AAEA,IAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAW;AACjC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA;AAEJ,IAAA,IAAI,OAAO,IAAA,CAAK,UAAA,KAAe,UAAA,EAAY;AACzC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AACxC,QAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,UAAA,KAAA,GAAQ,MAAMD,YAAAA,CAAY,MAAA,EAAQ,sBAAsB,CAAA;AAAA,QAC1D,CAAA,MAAO;AACL,UAAA,KAAA,GAAQ,MAAA;AAAA,QACV;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,GAAA,CAAI,2CAAA,EAA6C,SAAA,EAAW,GAAG,CAAA;AACpE,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,KAAA,GAAS,IAAA,CAAK,UAAA,CAA0B,SAAS,CAAA,IAAK,IAAA;AAAA,IACxD;AAGA,IAAA,IAAA,CAAK,YAAA,CAAa,IAAI,SAAA,EAAW;AAAA,MAC/B,KAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACzB,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,cAAc,UAAA,EAAmC;AAC/C,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,cAAA,GAAmC;AACrC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,IAAI,eAAe,KAAA,EAAyB;AAC1C,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,EACzB;AAAA,EAEA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAI,UAAU,KAAA,EAAgB;AAC5B,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,OAAA,EAAwC;AACrD,IAAA,IAAA,CAAK,eAAe,EAAE,GAAG,IAAA,CAAK,YAAA,EAAc,GAAG,OAAA,EAAQ;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,sBAAA,EAAwB,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA,EAGA,cAAA,GAA0C;AACxC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,YAAA,EAAa;AAAA,EAChC;AAAA;AAAA,EAGA,gBAAA,GAAyB;AACvB,IAAA,IAAA,CAAK,eAAe,EAAC;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAA,GAAoB;AAClB,IAAA,IAAI,CAAC,mBAAkB,EAAG;AAE1B,IAAA,MAAM,KAAA,GAAQ,KAAK,eAAA,EAAgB;AACnC,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,cAAA,CAAe,OAAA;AAAA,QACpB,mBAAA;AAAA,QACA,IAAA,CAAK,UAAU,KAAK;AAAA,OACtB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,2BAA2B,GAAG,CAAA;AAAA,IACzC;AAAA,EACF;AAAA;AAAA,EAGA,cAAA,GAAsC;AACpC,IAAA,IAAI,CAAC,iBAAA,EAAkB,EAAG,OAAO,IAAA;AAEjC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,mBAAmB,CAAA;AAC7D,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAG5B,MAAA,IACE,CAAC,MAAM,OAAA,CAAQ,KAAA,CAAM,mBAAmB,CAAA,IACxC,OAAO,KAAA,CAAM,UAAA,KAAe,QAAA,EAC5B;AACA,QAAA,IAAA,CAAK,IAAI,oCAAoC,CAAA;AAC7C,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAA,CAAK,UAAU,KAAA,CAAM,mBAAA;AACrB,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAG1B,MAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,OAAA,IAAW,KAAA,CAAM,mBAAmB,MAAA,EAAQ;AACvE,QAAA,IAAA,CAAK,kBAAkB,KAAA,CAAM,cAAA;AAAA,MAC/B;AACA,MAAA,IAAI,OAAO,KAAA,CAAM,SAAA,KAAc,SAAA,EAAW;AACxC,QAAA,IAAA,CAAK,aAAa,KAAA,CAAM,SAAA;AAAA,MAC1B;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,8BAA8B,GAAG,CAAA;AAC1C,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,eAAA,GAAgC;AAC9B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAC9C,IAAA,MAAM,aACJ,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,EAAA;AAEzD,IAAA,OAAO;AAAA,MACL,qBAAqB,IAAA,CAAK,OAAA;AAAA,MAC1B,UAAA;AAAA,MACA,WAAA,EAAa,MAAA;AAAA,MACb,gBAAgB,IAAA,CAAK,eAAA;AAAA,MACrB,WAAW,IAAA,CAAK,UAAA;AAAA,MAChB,cAAA,EAAgB,WAAW,UAAU;AAAA,KACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAA,GAA2B;AACjC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,IAAQ,UAAA;AAChC,IAAA,MAAM,WAAA,GACJ,IAAA,CAAK,KAAA,CAAM,WAAA,IACX,kDAAA;AACF,IAAA,OAAO,CAAA;AAAA,QAAA,EAAmB,IAAI,CAAA;AAAA,EAA4C,WAAW,CAAA,CAAA;AAAA,EACvF;AAAA,EAEQ,wBAAwB,SAAA,EAA8B;AAC5D,IAAA,MAAM,KAAA,GAAQ,CAAC,gBAAgB,CAAA;AAC/B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,SAAA,CAAU,GAAG,CAAA,CAAE,CAAA;AAClC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,SAAA,CAAU,KAAK,CAAA,CAAE,CAAA;AACtC,IAAA,IAAI,SAAA,CAAU,KAAK,WAAA,EAAa;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,SAAA,CAAU,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAAA,IACzD;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AACjD,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,yBAAyB,SAAA,EAA8B;AAC7D,IAAA,MAAM,EAAE,gBAAA,EAAkB,kBAAA,EAAmB,GAAI,SAAA,CAAU,YAAA;AAC3D,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,CAAA,iBAAA,EAAoB,gBAAgB,CAAA,IAAA,EAAO,kBAAkB,CAAA,CAAA;AAAA,KAC/D;AAEA,IAAA,KAAA,MAAW,OAAA,IAAW,UAAU,QAAA,EAAU;AACxC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,SAAA,GAAY,SAAA,GAAY,QAAA;AAC5C,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,GAAA,EAAM,OAAA,CAAQ,EAAE,CAAA,EAAA,EAAK,OAAA,CAAQ,KAAK,CAAA,EAAA,EAAKC,SAAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,KAAK,GAAG,CAAA,CAAA;AAAA,OAC/E;AAAA,IACF;AAEA,IAAA,IAAI,mBAAmB,kBAAA,EAAoB;AACzC,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ;AAAA,cAAA,EAAmB,gBAAgB,OAAO,kBAAkB,CAAA,8CAAA;AAAA,OAC9D;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,uBAAuB,SAAA,EAA8B;AAC3D,IAAA,MAAM,KAAA,GAAQ,CAAC,cAAc,CAAA;AAC7B,IAAA,KAAA,MAAW,GAAA,IAAO,UAAU,UAAA,EAAY;AACtC,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,SAAA,GAAY,YAAA,GAAe,EAAA;AAC/C,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,GAAA,CAAI,KAAK,KAAK,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,CAAA,CAAE,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,gCAAgC,SAAA,EAA8B;AACpE,IAAA,MAAM,KAAA,GAAQ,CAAC,wBAAwB,CAAA;AACvC,IAAA,KAAA,MAAW,EAAA,IAAM,UAAU,mBAAA,EAAqB;AAC9C,MAAA,MAAM,QAAA,GAAW,EAAA,CAAG,UAAA,GAAa,aAAA,GAAgB,EAAA;AACjD,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,KAAK,EAAA,CAAG,OAAO,GAAG,EAAA,CAAG,IAAA,GAAO,IAAI,EAAA,CAAG,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,KAAK,EAAA,CAAG,KAAK,GAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,QAAQ,CAAA,CAAA;AAAA,OACzF;AAAA,IACF;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,kBAAkB,SAAA,EAA8B;AACtD,IAAA,MAAM,KAAA,GAAQ,CAAC,SAAS,CAAA;AACxB,IAAA,KAAA,MAAW,IAAA,IAAQ,UAAU,KAAA,EAAO;AAClC,MAAA,MAAM,SAAS,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,EAAE,CAAA,CAAA,CAAA,GAAM,EAAA;AAC9C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,mBAAA,GAAsB,eAAA,GAAkB,EAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AACvC,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,UAAA,GAAa,IAAA,GAAO,EAAA;AACtC,QAAA,MAAM,MAAM,KAAA,CAAM,QAAA,GACd,YAAY,KAAA,CAAM,YAAA,IAAgB,SAAS,CAAA,CAAA,CAAA,GAC3C,EAAA;AACJ,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,CAAA,IAAA,EAAO,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,EAAG,GAAG,CAAA;AAAA,SAC9D;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,qBAAqB,SAAA,EAA8B;AACzD,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,WAAA,KAAgB,SAAA,CAAU,QAAA;AACjD,IAAA,OAAO,CAAA;AAAA,EAAoB,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,EAAA,EAAK,WAAW,CAAA,CAAA;AAAA,EAC5D;AAAA,EAEQ,kBAAkB,KAAA,EAAiC;AACzD,IAAA,MAAM,KAAA,GAAQ,CAAC,qBAAqB,CAAA;AACpC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,uBAAA,GAAkC;AACxC,IAAA,MAAM,KAAA,GAAQ,CAAC,qBAAqB,CAAA;AACpC,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA,EAAG;AAC5D,MAAA,MAAM,SACJ,OAAO,KAAA,KAAU,WACb,KAAA,GACA,IAAA,CAAK,UAAU,KAAK,CAAA;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,EAAKA,SAAAA,CAAS,OAAO,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,sBAAA,GAAiC;AACvC,IAAA,OAAO;AAAA,MACL,cAAA;AAAA,MACA,qEAAA;AAAA,MACA,2DAAA;AAAA,MACA,gEAAA;AAAA,MACA,6DAAA;AAAA,MACA,2EAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,IAAI,CAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,kBAAA,CACN,WAAA,EACA,SAAA,EACA,KAAA,EACQ;AAOR,IAAA,MAAM,cAAA,GAA2B;AAAA,MAC/B,KAAK,gBAAA,EAAiB;AAAA,MACtB,IAAA,CAAK,wBAAwB,SAAS,CAAA;AAAA,MACtC,IAAA,CAAK,qBAAqB,SAAS,CAAA;AAAA,MACnC,KAAK,sBAAA;AAAuB,KAC9B;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAC,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,kBAAkB,cAAA,CAAe,MAAA;AAAA,MACrC,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,EAAE,MAAA,GAAS,CAAA;AAAA,MAC7B;AAAA,KACF;AACA,IAAA,IAAI,SAAA,GAAY,KAAK,WAAA,GAAc,eAAA;AAEnC,IAAA,MAAM,mBAA6B,EAAC;AAGpC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,wBAAA,CAAyB,SAAS,CAAA;AAC3D,IAAA,IAAI,WAAA,CAAY,UAAU,SAAA,EAAW;AACnC,MAAA,gBAAA,CAAiB,KAAK,WAAW,CAAA;AACjC,MAAA,SAAA,IAAa,YAAY,MAAA,GAAS,CAAA;AAAA,IACpC,CAAA,MAAA,IAAW,YAAY,GAAA,EAAK;AAC1B,MAAA,gBAAA,CAAiB,IAAA,CAAKA,SAAAA,CAAS,WAAA,EAAa,SAAS,CAAC,CAAA;AACtD,MAAA,SAAA,GAAY,CAAA;AAAA,IACd;AAGA,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,SAAA,CAAU,UAAA,CAAW,SAAS,CAAA,EAAG;AACpD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,sBAAA,CAAuB,SAAS,CAAA;AACpD,MAAA,IAAI,MAAA,CAAO,UAAU,SAAA,EAAW;AAC9B,QAAA,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAC5B,QAAA,SAAA,IAAa,OAAO,MAAA,GAAS,CAAA;AAAA,MAC/B,CAAA,MAAA,IAAW,YAAY,EAAA,EAAI;AACzB,QAAA,gBAAA,CAAiB,IAAA,CAAKA,SAAAA,CAAS,MAAA,EAAQ,SAAS,CAAC,CAAA;AACjD,QAAA,SAAA,GAAY,CAAA;AAAA,MACd;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA,EAAG;AAC/C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AACjD,MAAA,IAAI,QAAA,CAAS,UAAU,SAAA,EAAW;AAChC,QAAA,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAC9B,QAAA,SAAA,IAAa,SAAS,MAAA,GAAS,CAAA;AAAA,MACjC,CAAA,MAAA,IAAW,YAAY,EAAA,EAAI;AACzB,QAAA,gBAAA,CAAiB,IAAA,CAAKA,SAAAA,CAAS,QAAA,EAAU,SAAS,CAAC,CAAA;AACnD,QAAA,SAAA,GAAY,CAAA;AAAA,MACd;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,SAAA,CAAU,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAC7D,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,+BAAA,CAAgC,SAAS,CAAA;AAC5D,MAAA,IAAI,KAAA,CAAM,UAAU,SAAA,EAAW;AAC7B,QAAA,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,YAAY,EAAA,EAAI;AACzB,QAAA,gBAAA,CAAiB,IAAA,CAAKA,SAAAA,CAAS,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,MAClD;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,eAAe,CAAC,CAAA;AAAA;AAAA,MAChB,eAAe,CAAC,CAAA;AAAA;AAAA,MAChB,GAAG,gBAAA;AAAA,MACH,eAAe,CAAC,CAAA;AAAA;AAAA,MAChB,GAAG,cAAA,CAAe,KAAA,CAAM,CAAC;AAAA;AAAA,KAC3B;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,oBAAA,GAA6B;AAEnC,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,WAAW,GAAG,CAAA;AACzD,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,kBAAA,EAAoB;AAC5C,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC5B;AAGA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,QAAA,EAAU;AAC1C,MAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,IACrB;AAGA,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAE7B,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAC,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,GAAG,UAAU,CAAA;AACjD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAGjD,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,KAAS,MAAA,GAAS,MAAA,GAAS,WAAA;AAC7C,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,IAAI,CAAA,EAAA,EAAKA,UAAS,IAAA,CAAK,OAAA,EAAS,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,SAAA,GAA8B;AAAA,MAClC,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,CAAA;AAAA,EAAyB,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MACvD,SAAA,EAAW,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,CAAG;AAAA,KAC5C;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,CAAC,SAAA,EAAW,GAAG,WAAW,CAAA;AAAA,EAC3C;AAAA;AAAA,EAGQ,gBAAA,GAAyB;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAC9C,MAAA,IAAI,UAAA,CAAW,UAAU,CAAA,IAAK,IAAA,CAAK,mBAAA,EAAqB;AACxD,MAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,OAAO,IAAA,EAAuB;AACpC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAAA,EAA6B,GAAG,IAAI,CAAA;AAAA,IACpD;AAAA,EACF;AACF;;;ACtqBO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,oBAAA,EAAsB,sBAAA;AAAA;AAAA,EAGtB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,uBAAA,EAAyB,yBAAA;AAAA;AAAA,EAGzB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,wBAAA,EAA0B,0BAAA;AAAA;AAAA,EAG1B,mBAAA,EAAqB,qBAAA;AAAA,EACrB,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAGnB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAGxB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,0BAAA,EAA4B,4BAAA;AAAA;AAAA,EAG5B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAGjB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,uBAAA,EAAyB,yBAAA;AAAA;AAAA,EAGzB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,eAAA,EAAiB,iBAAA;AAAA,EACjB,mBAAA,EAAqB,qBAAA;AAAA;AAAA,EAGrB,wBAAA,EAA0B,0BAAA;AAAA;AAAA,EAG1B,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAGxB,OAAA,EAAS;AACX;AAmCO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,OAAA,EAA+B;AACzC,IAAA,KAAA,CAAM,QAAQ,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AAI/C,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAEhD,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,OAAA,GACH,OAAA,CAAQ,OAAA,IAAW,CAAA,sCAAA,EAAyC,QAAQ,IAAI,CAAA,CAAA;AAAA,EAC5E;AACF;AAOO,IAAM,mBAAA,GAAN,cAAkC,aAAA,CAAc;AAAA,EACrD,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM,EAAE,WAAA,EAAa,KAAA,EAAO,GAAG,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAGO,IAAM,kBAAA,GAAN,cAAiC,aAAA,CAAc;AAAA,EACpD,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM,EAAE,WAAA,EAAa,KAAA,EAAO,GAAG,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAGO,IAAM,mBAAA,GAAN,cAAkC,aAAA,CAAc;AAAA,EACrD,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM,EAAE,WAAA,EAAa,KAAA,EAAO,GAAG,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAGO,IAAM,cAAA,GAAN,cAA6B,aAAA,CAAc;AAAA,EACvC,YAAA;AAAA,EAET,YACE,OAAA,EACA;AACA,IAAA,KAAA,CAAM,EAAE,GAAG,OAAA,EAAS,WAAA,EAAa,MAAM,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAAA,EAC9B;AACF;AAGO,IAAM,sBAAA,GAAN,cAAqC,aAAA,CAAc;AAAA,EACxD,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM,EAAE,WAAA,EAAa,KAAA,EAAO,GAAG,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AAAA,EACd;AACF;AAGO,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAAA,EACjD,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM,EAAE,WAAA,EAAa,KAAA,EAAO,GAAG,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAGO,IAAM,YAAA,GAAN,cAA2B,aAAA,CAAc;AAAA,EAC9C,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM,EAAE,WAAA,EAAa,IAAA,EAAM,GAAG,SAAS,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAGO,IAAM,YAAA,GAAN,cAA2B,aAAA,CAAc;AAAA,EACrC,aAAA;AAAA,EACA,SAAA;AAAA,EAET,YACE,OAAA,EAIA;AACA,IAAA,KAAA,CAAM,EAAE,GAAG,OAAA,EAAS,WAAA,EAAa,MAAM,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAC7B,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAAA,EAC3B;AACF;AAGO,IAAM,mBAAA,GAAN,cAAkC,aAAA,CAAc;AAAA,EACrD,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM,EAAE,WAAA,EAAa,KAAA,EAAO,GAAG,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAGO,IAAM,kBAAA,GAAN,cAAiC,aAAA,CAAc;AAAA,EACpD,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM,EAAE,WAAA,EAAa,KAAA,EAAO,GAAG,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAiBO,SAAS,gBAAgB,KAAA,EAAwC;AACtE,EAAA,OAAO,KAAA,YAAiB,aAAA;AAC1B;;;AClPA,IAAM,oBAAA,GAAuB,QAAA;AAC7B,IAAM,kBAAA,GAAqB,IAAA;AAC3B,IAAM,eAAA,GAAkB,4CAAA;AAYxB,SAAS,UAAA,GAAyB;AAChC,EAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,OAAO,CAAA,EAAE;AAC9C;AA2BO,IAAM,gBAAN,MAAkD;AAAA,EACtC,MAAA;AAAA,EACA,KAAA;AAAA;AAAA,EAGT,sBAAA,GAAyB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzB,aAAyB,UAAA,EAAW;AAAA,EAE5C,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,IAAS,oBAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,IAAI,SAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY,KAAA,EAAkC;AAC5C,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAE/B,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC1B,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU;AAAA,QACR,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY,EAAE,GAAG,IAAA,CAAK,UAAA,EAAW;AAAA,UACjC,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY;AAAC;AAC9B;AACF,KACF,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBACE,OAAA,EACwD;AACxD,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC5B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK;AAAA,KAChB,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAO,cACL,MAAA,EACqC;AACrC,IAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,WAAA,GAAc,KAAA;AAClB,IAAA,IAAA,CAAK,aAAa,UAAA,EAAW;AAG7B,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAG3B;AAEF,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AAEV,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAE/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAG1B,UAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAElC,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACtC,UAAA,IAAI,OAAA,KAAY,EAAA,IAAM,OAAA,KAAY,QAAA,EAAU;AAC1C,YAAA,IAAI,YAAY,QAAA,EAAU;AAExB,cAAA,OAAO,IAAA,CAAK,sBAAsB,gBAAgB,CAAA;AAClD,cAAA,IAAI,CAAC,WAAA,EAAa;AAChB,gBAAA,WAAA,GAAc,IAAA;AACd,gBAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,cAC/B;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,MAAA;AACJ,UAAA,IAAI;AACF,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,UAC7B,CAAA,CAAA,MAAQ;AAEN,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA,EAAG;AAClC,YAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,cAC3B,MAAM,UAAA,CAAW,wBAAA;AAAA,cACjB,OAAA,EAAS,yDAAA;AAAA,cACT,QAAA,EAAU,QAAA;AAAA,cACV,UAAA,EAAY;AAAA,aACb,CAAA;AAAA,UACH;AAGA,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAC3C,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,UACpB;AAEA,UAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,gBAAA,EAAkB,WAAW,CAAA;AAC/D,UAAA,IAAI,CAAC,WAAA,IAAe,IAAA,CAAK,sBAAA,EAAwB;AAC/C,YAAA,WAAA,GAAc,IAAA;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,IAAA,EAAK,CAAE,UAAA,CAAW,OAAO,CAAA,EAAG;AACrC,QAAA,MAAM,UAAU,MAAA,CAAO,IAAA,GAAO,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAC5C,QAAA,IAAI,YAAY,QAAA,EAAU;AACxB,UAAA,OAAO,IAAA,CAAK,sBAAsB,gBAAgB,CAAA;AAClD,UAAA,IAAI,CAAC,WAAA,EAAa;AAChB,YAAA,WAAA,GAAc,IAAA;AACd,YAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,UAC/B;AAAA,QACF,CAAA,MAAA,IAAW,YAAY,EAAA,EAAI;AACzB,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEjC,YAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA,EAAG;AAClC,cAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,gBAC3B,MAAM,UAAA,CAAW,wBAAA;AAAA,gBACjB,OAAA,EAAS,yDAAA;AAAA,gBACT,QAAA,EAAU,QAAA;AAAA,gBACV,UAAA,EAAY;AAAA,eACb,CAAA;AAAA,YACH;AAEA,YAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAC3C,YAAA,IAAI,UAAA,EAAY;AACd,cAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,YACpB;AAEA,YAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,gBAAA,EAAkB,WAAW,CAAA;AAC/D,YAAA,IAAI,CAAC,WAAA,IAAe,IAAA,CAAK,sBAAA,EAAwB;AAC/C,cAAA,WAAA,GAAc,IAAA;AAAA,YAChB;AAAA,UACF,SAAS,KAAA,EAAgB;AAEvB,YAAA,IAAI,KAAA,YAAiB,oBAAoB,MAAM,KAAA;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAGA,MAAA,OAAO,IAAA,CAAK,sBAAsB,gBAAgB,CAAA;AAAA,IACpD,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,CACE,QACA,MAAA,EACyD;AACzD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,MAAA;AAAA,MACd,SAAS,OAAO,MAAA,KAAW,WAAW,MAAA,GAAS,IAAA,CAAK,UAAU,MAAM;AAAA,KACtE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cAAc,MAAA,EAUjB;AAED,IAAA,MAAM,gBAAgB,MAAA,CAAO,QAAA;AAC7B,IAAA,MAAM,QAAA,GAAqD;AAAA,MACzD,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,OAAO,YAAA,EAAa;AAAA,MAC/C,GAAG;AAAA,KACL;AAEA,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,MAAA,CAAO,aAAa,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,MAAA,EAAQ,IAAA;AAAA,MACR,WAAA,EAAa,GAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AAAA,IACtB;AAEA,IAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,kBAAA;AACtC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AAGvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAEhE,IAAA,IAAI,OAAO,MAAA,EAAQ;AAEjB,MAAA,MAAA,CAAO,MAAA,CAAO,gBAAA;AAAA,QACZ,OAAA;AAAA,QACA,MAAM,UAAA,CAAW,KAAA,CAAM,MAAA,CAAO,OAAQ,MAAM,CAAA;AAAA,QAC5C,EAAE,MAAM,IAAA;AAAK,OACf;AAAA,IACF;AAEA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAM,eAAA,EAAiB;AAAA,QACtC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,SACtC;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAAA,IACH,SAAS,KAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IACE,KAAA,YAAiB,YAAA,IACjB,KAAA,CAAM,IAAA,KAAS,YAAA,EACf;AAEA,QAAA,IAAI,MAAA,CAAO,QAAQ,OAAA,EAAS;AAC1B,UAAA,MAAM,KAAA;AAAA,QACR;AACA,QAAA,MAAM,IAAI,YAAA,CAAa;AAAA,UACrB,MAAM,UAAA,CAAW,oBAAA;AAAA,UACjB,OAAA,EAAS,kCAAkC,SAAS,CAAA,EAAA,CAAA;AAAA,UACpD,QAAA,EAAU,QAAA;AAAA,UACV,WAAA,EAAa,IAAA;AAAA,UACb,UAAA,EAAY,oCAAA;AAAA,UACZ,aAAA,EAAe,wBAAA;AAAA,UACf;AAAA,SACD,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,MAAM,UAAA,CAAW,uBAAA;AAAA,QACjB,OAAA,EAAS,CAAA,iCAAA,EAAqC,KAAA,CAAgB,OAAO,CAAA,CAAA;AAAA,QACrE,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EACE,8CAAA;AAAA,QACF,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAEA,IAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,MAAM,UAAA,CAAW,uBAAA;AAAA,QACjB,OAAA,EAAS,wDAAA;AAAA,QACT,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,CAAS,IAAA,EAAM,QAAA,EAAS;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,CAAS,aAAA,CACP,MAAA,EACA,gBAAA,EAIA,WAAA,EACiC;AACjC,IAAA,IAAA,CAAK,sBAAA,GAAyB,KAAA;AAE9B,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAIvB,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAEtC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,MAAA,MAAM,eAAe,MAAA,CAAO,aAAA;AAE5B,MAAA,IAAI,KAAA,EAAO;AAET,QAAA,IAAI,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,IAAY,KAAA,CAAM,YAAY,EAAA,EAAI;AAC7D,UAAA,MAAM;AAAA,YACJ,MAAM,KAAA,CAAM,OAAA;AAAA,YACZ,IAAA,EAAM;AAAA,WACR;AAAA,QACF;AAGA,QAAA,MAAM,iBAAiB,KAAA,CAAM,UAAA;AAQ7B,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,KAAA,MAAW,MAAM,cAAA,EAAgB;AAC/B,YAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA;AAC9C,YAAA,IAAI,QAAA,EAAU;AAEZ,cAAA,IAAI,EAAA,CAAG,UAAU,SAAA,EAAW;AAC1B,gBAAA,QAAA,CAAS,aAAA,IAAiB,GAAG,QAAA,CAAS,SAAA;AAAA,cACxC;AAAA,YACF,CAAA,MAAO;AAEL,cAAA,gBAAA,CAAiB,GAAA,CAAI,GAAG,KAAA,EAAO;AAAA,gBAC7B,EAAA,EAAI,GAAG,EAAA,IAAM,EAAA;AAAA,gBACb,IAAA,EAAM,EAAA,CAAG,QAAA,EAAU,IAAA,IAAQ,EAAA;AAAA,gBAC3B,aAAA,EAAe,EAAA,CAAG,QAAA,EAAU,SAAA,IAAa;AAAA,eAC1C,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,QAAA,OAAO,IAAA,CAAK,sBAAsB,gBAAgB,CAAA;AAAA,MACpD;AAGA,MAAA,IAAI,iBAAiB,MAAA,IAAU,CAAC,WAAA,IAAe,CAAC,KAAK,sBAAA,EAAwB;AAC3E,QAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAC9B,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,CAAS,sBACP,gBAAA,EAIqB;AAErB,IAAA,MAAM,SAAS,CAAC,GAAG,gBAAA,CAAiB,OAAA,EAAS,CAAA,CAAE,IAAA;AAAA,MAC7C,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA,GAAI;AAAA,KACpB;AAEA,IAAA,KAAA,MAAW,GAAG,EAAE,CAAA,IAAK,MAAA,EAAQ;AAC3B,MAAA,IAAI,OAAgC,EAAC;AACrC,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,aAAa,CAAA;AAAA,MACpC,SAAS,EAAA,EAAI;AACX,QAAA,OAAA,CAAQ,IAAA,CAAK,qDAAA,EAAuD,EAAA,CAAG,aAAa,CAAA;AAAA,MACtF;AAEA,MAAA,MAAM;AAAA,QACJ,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AAEA,IAAA,gBAAA,CAAiB,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,MAAA,EAAoD;AAC/D,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAQrB,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAM,aAAA,IAAiB,CAAA;AAAA,MAC/B,UAAA,EAAY,MAAM,iBAAA,IAAqB,CAAA;AAAA,MACvC,KAAA,EAAO,MAAM,YAAA,IAAgB;AAAA,KAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,kBAAkB,MAAA,EAA0C;AAC1D,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAIvB,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,KAAA;AAE7C,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW;AAE9B,MAAA,IAAI,MAAA,CAAO,aAAA,KAAkB,gBAAA,EAAkB,OAAO,IAAA;AAGtD,MAAA,MAAM,gBAAgB,MAAA,CAAO,sBAAA;AAI7B,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,OAAO,MAAA,CAAO,OAAO,aAAa,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,IAAI,CAAA;AAAA,MACrE;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAgB,QAAA,EAAoC;AAChE,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,IAAI;AACF,MAAA,SAAA,GAAY,MAAM,SAAS,IAAA,EAAK;AAAA,IAClC,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AAExB,IAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,MAAA,MAAM,IAAI,mBAAA,CAAoB;AAAA,QAC5B,MAAM,UAAA,CAAW,gBAAA;AAAA,QACjB,OAAA,EAAS,CAAA,kCAAA,EAAqC,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA;AAAA,QACnE,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EACE;AAAA,OACH,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAC3D,MAAA,MAAM,eAAe,gBAAA,GACjB,QAAA,CAAS,gBAAA,EAAkB,EAAE,IAAI,GAAA,GACjC,GAAA;AAEJ,MAAA,MAAM,IAAI,cAAA,CAAe;AAAA,QACvB,MAAM,UAAA,CAAW,mBAAA;AAAA,QACjB,OAAA,EAAS,yCAAyC,SAAS,CAAA,CAAA;AAAA,QAC3D,QAAA,EAAU,QAAA;AAAA,QACV,WAAA,EAAa,IAAA;AAAA,QACb,YAAY,CAAA,oCAAA,EAAuC,IAAA,CAAK,IAAA,CAAK,YAAA,GAAe,GAAI,CAAC,CAAA,EAAA,CAAA;AAAA,QACjF;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,MAAM,UAAA,CAAW,uBAAA;AAAA,QACjB,OAAA,EAAS,CAAA,yBAAA,EAA4B,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA;AAAA,QAC1D,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EACE;AAAA,OACH,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,IAAI,YAAA,CAAa;AAAA,MACrB,MAAM,UAAA,CAAW,uBAAA;AAAA,MACjB,OAAA,EAAS,CAAA,2BAAA,EAA8B,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA;AAAA,MAC5D,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AACF;;;ACvlBA,IAAM,oBAAA,GAAuB,kBAAA;AAC7B,IAAMC,mBAAAA,GAAqB,IAAA;AAC3B,IAAM,eAAA,GACJ,yDAAA;AAOF,IAAM,uBAAA,GAA0B;AAAA,EAC9B,EAAE,QAAA,EAAU,0BAAA,EAA4B,SAAA,EAAW,iBAAA,EAAkB;AAAA,EACrE,EAAE,QAAA,EAAU,2BAAA,EAA6B,SAAA,EAAW,iBAAA,EAAkB;AAAA,EACtE,EAAE,QAAA,EAAU,iCAAA,EAAmC,SAAA,EAAW,iBAAA,EAAkB;AAAA,EAC5E,EAAE,QAAA,EAAU,iCAAA,EAAmC,SAAA,EAAW,iBAAA;AAC5D,CAAA;AAYA,SAASC,WAAAA,GAAyB;AAChC,EAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,OAAO,CAAA,EAAE;AAC9C;AAWO,IAAM,gBAAN,MAAkD;AAAA,EACtC,MAAA;AAAA,EACA,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,aAAyBA,WAAAA,EAAW;AAAA,EAE5C,YAAY,MAAA,EAAoD;AAC9D,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,IAAS,oBAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,IAAI,SAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY,KAAA,EAAkC;AAC5C,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAE/B,IAAA,OAAO;AAAA,MACL;AAAA,QACE,oBAAA,EAAsB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UACzC,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY,EAAE,GAAG,IAAA,CAAK,UAAA,EAAW;AAAA,YACjC,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY;AAAC;AAC9B,SACF,CAAE;AAAA;AACJ,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBACE,OAAA,EACyD;AACzD,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC5B,IAAA,EAAM,IAAA,CAAK,IAAA,KAAS,WAAA,GAAc,OAAA,GAAU,MAAA;AAAA,MAC5C,OAAO,CAAC,EAAE,IAAA,EAAM,IAAA,CAAK,SAAS;AAAA,KAChC,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,cACL,MAAA,EACqC;AACrC,IAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAA,CAAK,aAAaA,WAAAA,EAAW;AAE7B,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AAEV,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAE/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAG1B,UAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAElC,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACtC,UAAA,IAAI,OAAA,KAAY,EAAA,IAAM,OAAA,KAAY,QAAA,EAAU;AAE5C,UAAA,IAAI,MAAA;AACJ,UAAA,IAAI;AACF,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,UAC7B,CAAA,CAAA,MAAQ;AAEN,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA,EAAG;AAClC,YAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,cAC3B,MAAM,UAAA,CAAW,wBAAA;AAAA,cACjB,OAAA,EAAS,yDAAA;AAAA,cACT,QAAA,EAAU,QAAA;AAAA,cACV,UAAA,EAAY;AAAA,aACb,CAAA;AAAA,UACH;AAGA,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAC3C,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,UACpB;AAEA,UAAA,OAAO,IAAA,CAAK,cAAc,MAAM,CAAA;AAAA,QAClC;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,IAAA,EAAK,CAAE,UAAA,CAAW,OAAO,CAAA,EAAG;AACrC,QAAA,MAAM,UAAU,MAAA,CAAO,IAAA,GAAO,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAC5C,QAAA,IAAI,OAAA,KAAY,EAAA,IAAM,OAAA,KAAY,QAAA,EAAU;AAC1C,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEjC,YAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA,EAAG;AAClC,cAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,gBAC3B,MAAM,UAAA,CAAW,wBAAA;AAAA,gBACjB,OAAA,EAAS,yDAAA;AAAA,gBACT,QAAA,EAAU,QAAA;AAAA,gBACV,UAAA,EAAY;AAAA,eACb,CAAA;AAAA,YACH;AAEA,YAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAC3C,YAAA,IAAI,UAAA,EAAY;AACd,cAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,YACpB;AAEA,YAAA,OAAO,IAAA,CAAK,cAAc,MAAM,CAAA;AAAA,UAClC,SAAS,KAAA,EAAgB;AAEvB,YAAA,IAAI,KAAA,YAAiB,oBAAoB,MAAM,KAAA;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,CACE,QACA,MAAA,EAMA;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL;AAAA,UACE,gBAAA,EAAkB;AAAA,YAChB,IAAA,EAAM,MAAA;AAAA,YACN,QAAA,EAAU,EAAE,MAAA;AAAO;AACrB;AACF;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,cAAc,MAAA,EAUjB;AAED,IAAA,MAAM,gBAAgB,MAAA,CAAO,QAAA;AAC7B,IAAA,MAAM,eAAe,MAAA,CAAO,WAAA,GACxB,CAAC,GAAG,aAAA,EAAe,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,MAAA,CAAO,aAAa,CAAA,EAAG,CAAA,GAC1E,aAAA;AAEJ,IAAA,MAAM,GAAA,GAAM,GAAG,eAAe,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,mCAAA,EAAsC,KAAK,MAAM,CAAA,CAAA;AAE7F,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,iBAAA,EAAmB;AAAA,QACjB,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,CAAO,cAAc;AAAA,OACvC;AAAA,MACA,QAAA,EAAU,YAAA;AAAA,MACV,cAAA,EAAgB,uBAAA;AAAA,MAChB,gBAAA,EAAkB;AAAA,QAChB,WAAA,EAAa,GAAA;AAAA,QACb,IAAA,EAAM,IAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAEA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AAAA,IACtB;AAEA,IAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAaD,mBAAAA;AACtC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AAGvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAEhE,IAAA,IAAI,OAAO,MAAA,EAAQ;AAEjB,MAAA,MAAA,CAAO,MAAA,CAAO,gBAAA;AAAA,QACZ,OAAA;AAAA,QACA,MAAM,UAAA,CAAW,KAAA,CAAM,MAAA,CAAO,OAAQ,MAAM,CAAA;AAAA,QAC5C,EAAE,MAAM,IAAA;AAAK,OACf;AAAA,IACF;AAEA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAM,GAAA,EAAK;AAAA,QAC1B,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAAA,IACH,SAAS,KAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IACE,KAAA,YAAiB,YAAA,IACjB,KAAA,CAAM,IAAA,KAAS,YAAA,EACf;AAEA,QAAA,IAAI,MAAA,CAAO,QAAQ,OAAA,EAAS;AAC1B,UAAA,MAAM,KAAA;AAAA,QACR;AACA,QAAA,MAAM,IAAI,YAAA,CAAa;AAAA,UACrB,MAAM,UAAA,CAAW,oBAAA;AAAA,UACjB,OAAA,EAAS,kCAAkC,SAAS,CAAA,EAAA,CAAA;AAAA,UACpD,QAAA,EAAU,QAAA;AAAA,UACV,WAAA,EAAa,IAAA;AAAA,UACb,UAAA,EAAY,oCAAA;AAAA,UACZ,aAAA,EAAe,8BAAA;AAAA,UACf;AAAA,SACD,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,MAAM,UAAA,CAAW,uBAAA;AAAA,QACjB,OAAA,EAAS,CAAA,iCAAA,EAAqC,KAAA,CAAgB,OAAO,CAAA,CAAA;AAAA,QACrE,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EACE,8CAAA;AAAA,QACF,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,OACzC,CAAA;AAAA,IACH;AAEA,IAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,MAAM,UAAA,CAAW,uBAAA;AAAA,QACjB,OAAA,EAAS,4DAAA;AAAA,QACT,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,CAAS,IAAA,EAAM,QAAA,EAAS;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,CAAS,cACP,MAAA,EACiC;AACjC,IAAA,MAAM,aAAa,MAAA,CAAO,UAAA;AAI1B,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAE5C,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAI1B,MAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AAErB,MAAA,MAAM,eAAe,SAAA,CAAU,YAAA;AAC/B,MAAA,MAAM,MAAA,GACJ,YAAA,KAAiB,MAAA,IAAU,YAAA,KAAiB,YAAA;AAE9C,MAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,KAAA,EAAO;AAEhC,QAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,UAAA,MAAM,SAAA,GAAuB;AAAA,YAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,IAAA,EAAM;AAAA,WACR;AACA,UAAA,MAAM,SAAA;AAAA,QACR;AAGA,QAAA,IAAI,KAAK,YAAA,EAAc;AACrB,UAAA,MAAM,KAAK,IAAA,CAAK,YAAA;AAIhB,UAAA,MAAM,QAAA,GAAqB;AAAA,YACzB,IAAI,EAAA,CAAG,IAAA;AAAA,YACP,MAAM,EAAA,CAAG,IAAA;AAAA,YACT,SAAA,EAAW,EAAA,CAAG,IAAA,IAAQ;AAAC,WACzB;AACA,UAAA,MAAM,QAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,MAAA,EAAoD;AAC/D,IAAA,MAAM,OAAO,MAAA,CAAO,aAAA;AAQpB,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAK,gBAAA,IAAoB,CAAA;AAAA,MACjC,UAAA,EAAY,KAAK,oBAAA,IAAwB,CAAA;AAAA,MACzC,KAAA,EAAO,KAAK,eAAA,IAAmB;AAAA,KACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,MAAA,EAA0C;AAC1D,IAAA,MAAM,aAAa,MAAA,CAAO,UAAA;AAI1B,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAG1C,MAAA,MAAM,WAAW,MAAA,CAAO,cAAA;AAGxB,MAAA,OAAO,UAAU,WAAA,IAAe,IAAA;AAAA,IAClC;AAEA,IAAA,OAAO,UAAA,CAAW,IAAA;AAAA,MAChB,CAAC,MACC,CAAA,CAAE,YAAA,KAAiB,YACnB,CAAA,CAAE,YAAA,KAAiB,gBAAA,IACnB,CAAA,CAAE,YAAA,KAAiB;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAgB,QAAA,EAAoC;AAChE,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,IAAI;AACF,MAAA,SAAA,GAAY,MAAM,SAAS,IAAA,EAAK;AAAA,IAClC,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AAExB,IAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,MAAA,MAAM,IAAI,mBAAA,CAAoB;AAAA,QAC5B,MAAM,UAAA,CAAW,gBAAA;AAAA,QACjB,OAAA,EAAS,CAAA,kCAAA,EAAqC,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA;AAAA,QACnE,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EACE;AAAA,OACH,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAC3D,MAAA,MAAM,eAAe,gBAAA,GACjB,QAAA,CAAS,gBAAA,EAAkB,EAAE,IAAI,GAAA,GACjC,GAAA;AAEJ,MAAA,MAAM,IAAI,cAAA,CAAe;AAAA,QACvB,MAAM,UAAA,CAAW,mBAAA;AAAA,QACjB,OAAA,EAAS,yCAAyC,SAAS,CAAA,CAAA;AAAA,QAC3D,QAAA,EAAU,QAAA;AAAA,QACV,WAAA,EAAa,IAAA;AAAA,QACb,YAAY,CAAA,oCAAA,EAAuC,IAAA,CAAK,IAAA,CAAK,YAAA,GAAe,GAAI,CAAC,CAAA,EAAA,CAAA;AAAA,QACjF;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,MAAM,UAAA,CAAW,uBAAA;AAAA,QACjB,OAAA,EAAS,CAAA,yBAAA,EAA4B,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA;AAAA,QAC1D,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EACE;AAAA,OACH,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,IAAI,YAAA,CAAa;AAAA,MACrB,MAAM,UAAA,CAAW,uBAAA;AAAA,MACjB,OAAA,EAAS,CAAA,2BAAA,EAA8B,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA;AAAA,MAC5D,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AACF;AA6BO,IAAM,kBAAN,MAAsB;AAAA,EACnB,QAAA;AAAA,EACA,OAAA;AAAA,EACS,KAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,OAAA,EAOT;AACD,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,MAAA;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,KAAA;AAC9B,IAAA,IAAA,CAAK,SAAA,GAAY;AAAA,MACf,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,SAAS,OAAA,CAAQ;AAAA,KACnB;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,YAAY,MAAA,EAUf;AACD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,aAAA;AAAA,QAAc,MAAA;AAAA;AAAA,QAAsB;AAAA,OAAK;AAAA,IAC7D,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiB,kBAAA,EAAoB;AAEvC,QAAA,IAAA,CAAK,IAAI,wDAAmD,CAAA;AAC5D,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,IAAA,CAAK,aAAA;AAAA,YAChB,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAA,EAAU;AAAA;AAAA,YAChB;AAAA,WAChB;AAAA,QACF,SAAS,WAAA,EAAsB;AAC7B,UAAA,MAAM,OAAA,GAAU,IAAI,kBAAA,CAAmB;AAAA,YACrC,MAAM,UAAA,CAAW,wBAAA;AAAA,YACjB,OAAA,EACE,wDAAA;AAAA,YACF,UAAU,IAAA,CAAK,YAAA;AAAA,YACf,UAAA,EACE;AAAA,WACH,CAAA;AACD,UAAA,IAAA,CAAK,SAAA,CAAU,UAAU,OAAO,CAAA;AAChC,UAAA,MAAM,OAAA;AAAA,QACR;AAAA,MACF;AAGA,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,IAAA,CAAK,SAAA,CAAU,UAAU,KAAK,CAAA;AAAA,MAChC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,MAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,UAAA,IAAc,MAAA,GAAS,MAAA,CAAO,QAAA,GAAW,gBAAA;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAE,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,IAAI,OAAA,GAA8B;AAChC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAc,aAAA,CACZ,MAAA,EAOA,QAAA,EAKC;AACD,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AAGrB,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,kBAAA,CAAmB,MAAA,CAAO,OAAO,CAAA;AAGjE,IAAA,MAAM,KAAA,GACJ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAClC,OAAA,CAAQ,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA,GAChC,MAAA;AAKN,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,QAAQ,aAAA,CAAc;AAAA,MAC7C,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,QAAA,EAAU,eAAA;AAAA,MACV,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,KAAA;AAAA,MACA,QAAQ,MAAA,CAAO;AAAA,KAChB,CAAA;AAMD,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,MAAM,YAAwB,EAAC;AAE/B,IAAA,WAAA,MAAiB,IAAA,IAAQ,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA,EAAG;AACtD,MAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,WAAA,IAAe,IAAA,EAAM;AAEzC,QAAA,MAAM,QAAA,GAAW,IAAA;AACjB,QAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AACvB,QAAA,IAAA,CAAK,SAAA,CAAU,aAAa,QAAQ,CAAA;AAAA,MACtC,CAAA,MAAO;AAEL,QAAA,MAAM,KAAA,GAAQ,IAAA;AACd,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,QAAA,IAAY,KAAA,CAAM,IAAA;AAAA,QACpB;AACA,QAAA,IAAA,CAAK,SAAA,CAAU,UAAU,KAAK,CAAA;AAAA,MAChC;AAAA,IACF;AAIA,IAAA,IAAA,CAAK,UAAU,OAAA,GAAU,EAAE,MAAM,EAAA,EAAI,IAAA,EAAM,MAAM,CAAA;AAIjD,IAAA,IAAI,QAAoBC,WAAAA,EAAW;AACnC,IAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,MAAA,KAAA,GAAS,OAAA,CAAiD,SAAA;AAAA,IAC5D;AAGA,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,SAAA,CAAU,eAAe,KAAK,CAAA;AAAA,IACrC;AAEA,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,CAAA,mBAAA,EAAsB,SAAS,MAAM,CAAA,QAAA,EAChC,UAAU,MAAM,CAAA,aAAA,EAChB,MAAM,KAAK,CAAA,OAAA;AAAA,KAClB;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAA,EAAM;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,cAAc,MAAA,EAAuC;AAE3D,IAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB;AAGA,IAAA,QAAQ,OAAO,QAAA;AAAU,MACvB,KAAK,QAAA;AACH,QAAA,OAAO,IAAI,cAAc,MAAM,CAAA;AAAA,MACjC;AACE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,cAAA,EAAkB,OAAgC,QAAQ,CAAA,0EAAA;AAAA,SAE5D;AAAA;AACJ,EACF;AAAA;AAAA,EAGA,IAAY,YAAA,GAAmC;AAC7C,IAAA,IAAI,UAAA,IAAc,IAAA,CAAK,OAAA,EAAS,OAAO,KAAK,OAAA,CAAQ,QAAA;AACpD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGQ,IAAI,OAAA,EAAuB;AACjC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,eAAA,EAAkB,OAAO,CAAA,CAAE,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;AC1qBO,IAAM,eAAN,MAAmB;AAAA,EACP,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,uBAAe,GAAA,EAAyB;AAAA;AAAA,EAGxC,YAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EAEjB,YAAY,OAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,CAAA;AACvC,IAAA,IAAA,CAAK,YAAA,GAAe,SAAS,KAAA,IAAS,KAAA;AACtC,IAAA,IAAA,CAAK,eAAe,OAAA,EAAS,UAAA;AAC7B,IAAA,IAAA,CAAK,iBAAiB,OAAA,EAAS,YAAA;AAC/B,IAAA,IAAA,CAAK,gBAAgB,OAAA,EAAS,WAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,OAAA,EAA4B;AACvC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,iBAAA,EAAoB,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,eAAe,IAAA,EAAoB;AACjC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AACzC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,IAAA,EAAuB;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,kBAAA,GAAuC;AACrC,IAAA,MAAM,cAAgC,EAAC;AACvC,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AAC5C,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,WAAA,EAAa,EAAA;AAAA,QACb,YAAY,EAAC;AAAA,QACb,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,iBAAiB,MAAA,EAOU;AAC/B,IAAA,MAAM,EAAE,GAAA,EAAK,YAAA,EAAc,WAAA,EAAa,KAAA,EAAO,QAAO,GAAI,MAAA;AAG1D,IAAA,MAAM,eAAiC,EAAC;AACxC,IAAA,MAAM,aAA8B,EAAE,MAAA,EAAQ,GAAG,UAAA,EAAY,CAAA,EAAG,OAAO,CAAA,EAAE;AACzE,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,SAAA,GAAY,EAAA;AAMhB,IAAA,MAAM,eAAA,GAAkC,CAAC,GAAG,MAAA,CAAO,OAAO,CAAA;AAK1D,IAAA,IAAI,kBAAA,GAAqB,WAAA;AAEzB,IAAA,OAAO,MAAA,GAAS,KAAK,SAAA,EAAW;AAE9B,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,IAAA,CAAK,GAAA,CAAI,uBAAA,IAA2B,MAAA,GAAS,CAAA,CAAE,CAAA;AAC/C,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,EAAA;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,UAAA,EAAa,MAAM,CAAA,IAAA,CAAM,CAAA;AAIlC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,eAAe,CAAA;AAGtD,MAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,WAAA,CAAY;AAAA,QACrC,YAAA;AAAA,QACA,OAAA,EAAS,UAAA;AAAA,QACT,WAAA,EAAa,kBAAA;AAAA,QACb,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAGD,MAAA,UAAA,CAAW,MAAA,IAAU,SAAS,KAAA,CAAM,MAAA;AACpC,MAAA,UAAA,CAAW,UAAA,IAAc,SAAS,KAAA,CAAM,UAAA;AACxC,MAAA,UAAA,CAAW,KAAA,IAAS,SAAS,KAAA,CAAM,KAAA;AAGnC,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,SAAA,GAAY,QAAA,CAAS,IAAA;AAAA,MACvB;AAGA,MAAA,IAAI,QAAA,CAAS,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACnC,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,MAAA,EAAS,MAAM,CAAA,oCAAA,CAAsC,CAAA;AAC9D,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,CAAA,MAAA,EAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,MAAM,CAAA,sBAAA;AAAA,OAC/C;AAGA,MAAA,MAAM,aAAA,GAAuC;AAAA,QAC3C,IAAA,EAAM,WAAA;AAAA,QACN,SAAS,QAAA,CAAS,IAAA;AAAA,QAClB,SAAA,EAAW,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,UACzC,IAAI,EAAA,CAAG,EAAA;AAAA,UACP,MAAM,EAAA,CAAG,IAAA;AAAA,UACT,MAAM,EAAA,CAAG;AAAA,SACX,CAAE,CAAA;AAAA,QACF,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AACA,MAAA,eAAA,CAAgB,KAAK,aAAa,CAAA;AAGlC,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,0BAAA;AAAA,QAC7B,QAAA,CAAS,SAAA;AAAA,QACT;AAAA,OACF;AAGA,MAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,QAAA,YAAA,CAAa,IAAA,CAAK,GAAG,MAAM,CAAA;AAE3B,QAAA,MAAM,UAAA,GAA6B;AAAA,UACjC,IAAA,EAAM,MAAA;AAAA,UACN,SAAS,IAAA,CAAK,SAAA;AAAA,YACZ,EAAA,CAAG,MAAA,CAAO,KAAA,IAAS,IAAA,GACf,EAAE,KAAA,EAAO,EAAA,CAAG,MAAA,CAAO,KAAA,EAAM,GACzB,EAAA,CAAG,MAAA,CAAO;AAAA,WAChB;AAAA,UACA,YAAY,EAAA,CAAG,UAAA;AAAA,UACf,QAAA,EAAU,GAAG,MAAA,CAAO,IAAA;AAAA,UACpB,SAAA,EAAW,KAAK,GAAA;AAAI,SACtB;AACA,QAAA,eAAA,CAAgB,KAAK,UAAU,CAAA;AAAA,MACjC;AAIA,MAAA,kBAAA,GAAqB,EAAA;AAGrB,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,IAAA,CAAK,GAAA,CAAI,2CAA2C,MAAM,CAAA;AAC1D,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,IAAU,KAAK,SAAA,EAAW;AAC5B,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,CAAA,YAAA,EAAe,KAAK,SAAS,CAAA,kCAAA;AAAA,OAC/B;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,uBAAuB,MAAM,CAAA,WAAA,EACxB,aAAa,MAAM,CAAA,eAAA,EACnB,WAAW,KAAK,CAAA,aAAA;AAAA,KACvB;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,iBAAA,EAAmB,YAAA;AAAA,MACnB,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,YACZ,QAAA,EACkE;AAClE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,IAAI,CAAA;AAE/C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,QAAA,GAAW,CAAA,cAAA,EAAiB,QAAA,CAAS,IAAI,CAAA,CAAA;AAC/C,MAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,MAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAW,KAAA,EAAO,QAAA,EAAU,YAAY,CAAA,EAAE;AAAA,IAC7D;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,SAAS,CAAA;AAErD,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,SAAS,CAAA;AACvD,MAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,KAAQ,SAAS,CAAA;AAE3D,MAAA,IAAA,CAAK,cAAA,GAAiB,QAAA,CAAS,IAAA,EAAM,MAAA,EAAQ,UAAU,CAAA;AACvD,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,CAAA,MAAA,EAAS,QAAA,CAAS,IAAI,CAAA,eAAA,EAAkB,UAAU,CAAA,EAAA;AAAA,OACpD;AAEA,MAAA,OAAO,EAAE,QAAQ,UAAA,EAAW;AAAA,IAC9B,SAAS,GAAA,EAAc;AACrB,MAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,KAAQ,SAAS,CAAA;AAC3D,MAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAEhE,MAAA,IAAA,CAAK,aAAA,GAAgB,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AACzC,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,SAAS,QAAA,CAAS,IAAI,kBAAkB,UAAU,CAAA,IAAA,EAAO,MAAM,OAAO,CAAA;AAAA,OACxE;AAEA,MAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAW,KAAA,EAAO,KAAA,CAAM,SAAS,UAAA,EAAW;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,0BAAA,CACZ,SAAA,EACA,MAAA,EAMA;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QAC5B,YAAY,EAAA,CAAG,EAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,MAAM,EAAA,CAAG,IAAA;AAAA,UACT,MAAM,EAAA,CAAG,SAAA;AAAA,UACT,MAAA,EAAQ,MAAA;AAAA,UACR,UAAA,EAAY,CAAA;AAAA,UACZ,KAAA,EAAO;AAAA;AACT,OACF,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC5B,SAAA,CAAU,GAAA,CAAI,OAAO,EAAA,KAAO;AAG1B,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,OAAO;AAAA,YACL,YAAY,EAAA,CAAG,EAAA;AAAA,YACf,MAAA,EAAQ;AAAA,cACN,MAAM,EAAA,CAAG,IAAA;AAAA,cACT,MAAM,EAAA,CAAG,SAAA;AAAA,cACT,MAAA,EAAQ,MAAA;AAAA,cACR,UAAA,EAAY,CAAA;AAAA,cACZ,KAAA,EAAO;AAAA;AACT,WACF;AAAA,QACF;AAEA,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAEzC,QAAA,OAAO;AAAA,UACL,YAAY,EAAA,CAAG,EAAA;AAAA,UACf,MAAA,EAAQ;AAAA,YACN,MAAM,EAAA,CAAG,IAAA;AAAA,YACT,MAAM,EAAA,CAAG,SAAA;AAAA,YACT,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,YAAY,OAAA,CAAQ,UAAA;AAAA,YACpB,GAAI,QAAQ,KAAA,IAAS,IAAA,GAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI;AAAC;AAC1D,SACF;AAAA,MACF,CAAC;AAAA,KACH;AAGA,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAC3B,MAAA,IAAI,CAAA,CAAE,WAAW,WAAA,EAAa;AAC5B,QAAA,OAAO,CAAA,CAAE,KAAA;AAAA,MACX;AAIA,MAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,MAAMC,SAAAA,GACJ,EAAE,MAAA,YAAkB,KAAA,GAAQ,EAAE,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA;AAChE,QAAA,OAAO;AAAA,UACL,UAAA,EAAY,WAAW,CAAC,CAAA,CAAA;AAAA,UACxB,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,SAAA;AAAA,YACN,MAAM,EAAC;AAAA,YACP,MAAA,EAAQ,MAAA;AAAA,YACR,UAAA,EAAY,CAAA;AAAA,YACZ,KAAA,EAAOA;AAAA;AACT,SACF;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GACJ,EAAE,MAAA,YAAkB,KAAA,GAAQ,EAAE,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA;AAEhE,MAAA,OAAO;AAAA,QACL,YAAY,EAAA,CAAG,EAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,MAAM,EAAA,CAAG,IAAA;AAAA,UACT,MAAM,EAAA,CAAG,SAAA;AAAA,UACT,MAAA,EAAQ,MAAA;AAAA,UACR,UAAA,EAAY,CAAA;AAAA,UACZ,KAAA,EAAO;AAAA;AACT,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBQ,eAAe,KAAA,EAA2C;AAChE,IAAA,MAAM,OAA2B,EAAC;AAElC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAG/B,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,qBAAqB,IAAA,CAAK,QAAQ,UAAU,IAAA,CAAK,UAAU,CAAA,IAAA,EAAO,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,UACvF,WAAW,IAAA,CAAK;AAAA,SACjB,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,IAAA,CAAK,uBAAA,CAAwB,IAAI,CAAA,EAAG;AAE7C,QAAA,MAAM,gBAAA,GAAmB,KAAK,SAAA,CAC3B,GAAA;AAAA,UACC,CAAC,EAAA,KACC,CAAA,eAAA,EAAkB,EAAA,CAAG,IAAI,CAAA,OAAA,EAAU,EAAA,CAAG,EAAE,CAAA,aAAA,EAAgB,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,IAAI,CAAC,CAAA,CAAA;AAAA,SACnF,CACC,KAAK,IAAI,CAAA;AAEZ,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,GACjB,CAAA,EAAG,KAAK,OAAO;;AAAA,EAAO,gBAAgB,CAAA,CAAA,GACtC,gBAAA;AAEJ,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,IAAA,EAAM,WAAA;AAAA,UACN,OAAA;AAAA,UACA,WAAW,IAAA,CAAK;AAAA,SACjB,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB,IAAA,EAA4C;AACnE,IAAA,OAAQ,KAAwB,IAAA,KAAS,MAAA;AAAA,EAC3C;AAAA,EAEQ,wBACN,IAAA,EAC+B;AAC/B,IAAA,OACE,KAAK,IAAA,KAAS,WAAA,IACd,KAAA,CAAM,OAAA,CAAS,KAA+B,SAAS,CAAA;AAAA,EAE3D;AAAA;AAAA;AAAA;AAAA,EAMQ,IAAI,OAAA,EAAuB;AACjC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAE,CAAA;AAAA,IACpD;AAAA,EACF;AACF;;;ACnjBA,IAAMN,WAAAA,GAAa,yBAAA;AAOnB,IAAM,cAAA,GAAiB,CAAA;AAGvB,IAAM,cAAA,GAAiB,CAAA;AAGvB,IAAM,qBAAA,GAAwB,GAAA;AAG9B,IAAM,cAAA,GAAkD;AAAA,EACtD,MAAA,EAAQ,GAAA;AAAA,EACR,QAAA,EAAU,GAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAGA,IAAM,eAAA,GAAkB,GAAA;AAmDjB,IAAM,oBAAN,MAAwB;AAAA;AAAA,EAGZ,cAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAIT,MAAA,GAA0B,QAAA;AAAA,EAC1B,QAAA,GAAW,KAAA;AAAA;AAAA,EAGF,gBAA0B,EAAC;AAAA;AAAA,EAG3B,eAAgC,EAAC;AAAA;AAAA,EAGjC,WAAA,uBAA4C,GAAA,EAAI;AAAA;AAAA,EAGzD,SAAA,GAAkD,IAAA;AAAA;AAAA,EAGzC,YAAA;AAAA,EACA,aAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,YAAY,OAAA,EAAoC;AAC9C,IAAA,IAAA,CAAK,iBAAiB,OAAA,EAAS,cAAA;AAC/B,IAAA,IAAA,CAAK,YAAA,GAAe,SAAS,KAAA,IAAS,KAAA;AAGtC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAClD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAEpD,IAAA,IAAA,CAAK,IAAI,2BAA2B,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAA,GAAyB;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,IAAI,oBAAoB,CAAA;AAE7B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,YAAY,CAAA;AACnD,MAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,aAAa,CAAA;AAGrD,MAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACrB,QAAA,IAAA,CAAK,WAAW,SAAS,CAAA;AAAA,MAC3B;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,GAAa;AACX,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,IAAI,oBAAoB,CAAA;AAE7B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,YAAY,CAAA;AACtD,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,aAAa,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,cAAc,MAAA,GAAS,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,QAAA,EAA2C;AACvD,IAAA,IAAA,CAAK,WAAA,CAAY,IAAI,QAAQ,CAAA;AAE7B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,QAAQ,CAAA;AAAA,IAClC,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,OAAA,EAA8B;AACzC,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,IAAU,cAAA,EAAgB;AAC9C,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,KAAA,EAAM;AAC1C,MAAA,IAAA,CAAK,GAAA,CAAI,8CAAyC,SAAS,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,OAAO,CAAA;AAC9B,IAAA,IAAA,CAAK,IAAI,CAAA,gBAAA,EAAmB,IAAA,CAAK,aAAa,MAAM,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAA,GAA8B;AAC5B,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,MAAM,QAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,YAAA,EAAc;AACnC,MAAA,IAAI,GAAA,CAAI,YAAY,UAAA,EAAY;AAC9B,QAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,GAAA,CAAI,uCAAA,EAAyC,GAAA,CAAI,OAAO,CAAA;AAAA,MAC/D;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAa,MAAA,GAAS,CAAA;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,QAAA,EAAW,KAAA,CAAM,MAAM,CAAA,WAAA,CAAa,CAAA;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,GAAqC;AAEzC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,UAAU,MAAA,EAAQ;AACtD,MAAA,IAAA,CAAK,WAAW,SAAS,CAAA;AACzB,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACd;AAEA,IAAA,MAAM,KAAK,IAAA,EAAK;AAChB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAA,GAAwB;AAC9B,IAAA,IAAA,CAAK,IAAI,iCAAiC,CAAA;AAG1C,IAAA,IAAA,CAAK,cAAc,MAAA,GAAS,CAAA;AAG5B,IAAA,IAAA,CAAK,WAAW,QAAQ,CAAA;AAGxB,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAA,CAAK,IAAI,kCAAkC,CAAA;AAC3C,IAAA,IAAA,CAAK,WAAW,SAAS,CAAA;AAIzB,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,IAAA,GAAsB;AAClC,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAExB,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,MAAA,GAAS,QAAA,GAAW,SAAS,CAAA;AAAA,MACzD;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AAEvB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,UAAU,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,eAAe,CAAA;AAEpE,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,CAAM,KAAK,cAAA,EAAgB;AAAA,UAC/B,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO,UAAA;AAAA,UACP,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AAAA,MACH,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,OAAO,CAAA;AAAA,MACtB;AAEA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC7B,MAAA,IAAA,CAAK,cAAc,OAAO,CAAA;AAC1B,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,SAAA,EAAY,OAAO,CAAA,GAAA,CAAK,CAAA;AAGjC,MAAA,MAAM,GAAA,GAAM,KAAK,cAAA,EAAe;AAChC,MAAA,IAAI,MAAM,qBAAA,EAAuB;AAC/B,QAAA,IAAA,CAAK,WAAW,UAAU,CAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,WAAW,QAAQ,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,IAAI,aAAa,CAAA;AAGtB,MAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,UAAU,MAAA,EAAQ;AACtD,QAAA,IAAA,CAAK,WAAW,SAAS,CAAA;AAAA,MAC3B,CAAA,MAAO;AAGL,QAAA,IAAA,CAAK,WAAW,UAAU,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,EAAA,EAAkB;AACtC,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,EAAE,CAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,cAAA,EAAgB;AAC9C,MAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA,EAGQ,cAAA,GAAyB;AAC/B,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAE5C,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,aAAA,EAAe;AAClC,MAAA,GAAA,IAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,GAAA,GAAM,KAAK,aAAA,CAAc,MAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AAE3C,IAAA,IAAA,CAAK,SAAA,GAAY,WAAW,YAAY;AACtC,MAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAEpB,MAAA,MAAM,KAAK,IAAA,EAAK;AAIhB,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB,GAAG,QAAQ,CAAA;AAAA,EACb;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,cAAc,IAAA,EAAM;AAC3B,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,WAAW,IAAA,EAA6B;AAC9C,IAAA,MAAM,WAAW,IAAA,CAAK,MAAA;AACtB,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,OAAA,EAAU,QAAQ,CAAA,IAAA,EAAO,IAAI,CAAA,CAAE,CAAA;AAIxC,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,WAAA,EAAa;AACjC,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,MAAM,QAAQ,CAAA;AAAA,MACnB,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAMA,WAAAA,EAAY,4BAAA,EAA8B,GAAG,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAA,GAAwB;AAC9B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAO,OAAO,QAAA,CAAS,IAAA;AAAA,IACzB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA,EAGQ,OAAO,IAAA,EAAuB;AACpC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAMA,WAAAA,EAAY,GAAG,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AACF;;;AC3bA,IAAMA,WAAAA,GAAa,gBAAA;AAiBZ,IAAM,uBAAN,MAA2B;AAAA,EACf,KAAA;AAAA,EACA,MAAA;AAAA,EAET,UAAA,GAAqB,EAAA;AAAA,EACrB,YAAA,GAAsD,IAAA;AAAA,EACtD,YAAuD,EAAC;AAAA,EACxD,WAA8B,EAAC;AAAA,EAEvC,YAAY,OAAA,EAAuC;AACjD,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,KAAA;AAC/B,IAAA,IAAA,CAAK,SAAS,OAAA,EAAS,MAAA;AAAA,EACzB;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,QAAA,CAAS,IAAA;AAGlC,IAAA,IAAI,gBAAgB,MAAA,IAAU,OAAQ,MAAA,CAAe,UAAA,EAAY,qBAAqB,UAAA,EAAY;AAChG,MAAA,MAAM,MAAO,MAAA,CAAe,UAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAe;AAC9B,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,WAAA,EAAa,GAAA,IAAO,OAAO,QAAA,CAAS,IAAA;AACrD,QAAA,IAAA,CAAK,kBAAkB,EAAE,CAAA;AAAA,MAC3B,CAAA;AACA,MAAA,GAAA,CAAI,gBAAA,CAAiB,YAAY,OAAO,CAAA;AACxC,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAM,IAAI,mBAAA,CAAoB,UAAA,EAAY,OAAO,CAAC,CAAA;AAErE,MAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAMA,aAAY,sBAAsB,CAAA;AAAA,IAClE,CAAA,MAAO;AAEL,MAAA,MAAM,aAAa,MAAM;AACvB,QAAA,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAAA,MAC7C,CAAA;AACA,MAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAC9C,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAM,OAAO,mBAAA,CAAoB,UAAA,EAAY,UAAU,CAAC,CAAA;AAG3E,MAAA,IAAA,CAAK,YAAA,GAAe,YAAY,MAAM;AACpC,QAAA,IAAI,MAAA,CAAO,QAAA,CAAS,IAAA,KAAS,IAAA,CAAK,UAAA,EAAY;AAC5C,UAAA,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAAA,QAC7C;AAAA,MACF,GAAG,GAAG,CAAA;AAEN,MAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAMA,aAAY,uCAAuC,CAAA;AAAA,IACnF;AAAA,EACF;AAAA;AAAA,EAGA,IAAA,GAAa;AACX,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,OAAA,EAAQ;AAAA,IACV;AACA,IAAA,IAAA,CAAK,WAAW,EAAC;AAEjB,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,EAAM;AAC9B,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,QAAA,EAA0D;AACtE,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAC5B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AAC3C,MAAA,IAAI,QAAQ,EAAA,EAAI,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,IAAA,EAAgC;AAC7C,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAG1C,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,IAAI,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,SAAS,MAAM,CAAA;AACnD,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ;AAC5C,QAAA,IAAI,KAAK,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAKA,WAAAA,EAAY,sCAAsC,IAAI,CAAA;AACnF,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAI,KAAK,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAKA,WAAAA,EAAY,gBAAgB,IAAI,CAAA;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAA,CAAO,SAAS,IAAA,GAAO,IAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,GAAA,GAAc;AAChB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAA;AAC1C,IAAA,OAAO,OAAO,QAAA,CAAS,IAAA;AAAA,EACzB;AAAA,EAEQ,kBAAkB,MAAA,EAAsB;AAC9C,IAAA,IAAI,MAAA,KAAW,KAAK,UAAA,EAAY;AAEhC,IAAA,MAAM,OAAO,IAAA,CAAK,UAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAElB,IAAA,IAAI,IAAA,CAAK,OAAO,OAAA,CAAQ,KAAA,CAAMA,aAAY,CAAA,cAAA,EAAiB,IAAI,CAAA,QAAA,EAAM,MAAM,CAAA,CAAE,CAAA;AAE7E,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,KAAA,EAAM,EAAG;AAC7C,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,MAAM,MAAM,CAAA;AAAA,MACvB,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAMA,WAAAA,EAAY,6BAAA,EAA+B,GAAG,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACF;;;ACtHA,IAAM,8BAAA,GAAiC,CAAA;AACvC,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,iBAAA,GAAoB,GAAA;AAC1B,IAAM,0BAAA,GAA6B,GAAA;AACnC,IAAMO,eAAAA,GAAiB,EAAA;AAShB,IAAM,mBAAN,MAAuB;AAAA;AAAA,EAEX,IAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAGT,MAAA,GAAkB,cAAA;AAAA,EAClB,OAAA,GAA4B,IAAA;AAAA,EAC5B,kBAAA,GAAqB,CAAA;AAAA,EACrB,eAAA,GAAwD,IAAA;AAAA,EACxD,aAAA,GAAsD,IAAA;AAAA,EACtD,UAAA,GAAa,KAAA;AAAA;AAAA,EAGb,aAAA,uBAAoB,OAAA,EAAiC;AAAA;AAAA,EAGrD,SAA2B,EAAC;AAAA;AAAA,EAG5B,gBAAA,uBAAwC,GAAA,EAAI;AAAA,EAC5C,iBAAA,uBAAqE,GAAA,EAAI;AAAA,EACzE,mBAAA,uBAA6D,GAAA,EAAI;AAAA,EACjE,iBAAA,uBAAqD,GAAA,EAAI;AAAA,EACzD,uBAAA,uBAAgF,GAAA,EAAI;AAAA;AAAA,EAI5F,YAAY,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,GAAA;AACpB,IAAA,IAAA,CAAK,qBAAA,GAAwB,QAAQ,oBAAA,IAAwB,8BAAA;AAC7D,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,YAAA,IAAgB,qBAAA;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,QAAA,IAAY,iBAAA;AACrC,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAQ,gBAAA,IAAoB,0BAAA;AACrD,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,SAAA;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,KAAA,IAAS,KAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,KAAA,IAAS,IAAA;AAAA,EACjC;AAAA;AAAA;AAAA,EAKA,IAAI,KAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,MAAA,GAA2B;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,KAAK,4CAAuC,CAAA;AACjD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,MAAA,IAAA,CAAK,KAAK,gDAAgD,CAAA;AAC1D,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,WAAA,IAAe,IAAA,CAAK,WAAW,YAAA,EAAc;AAC/D,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,kBAAA,EAAqB,IAAA,CAAK,MAAM,CAAA,qBAAA,CAAuB,CAAA;AACjE,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,WAAW,QAAA,EAAU;AAC5B,MAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,UAAU,YAAY,CAAA;AAC3B,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,EAChC;AAAA;AAAA,EAGA,KAAA,CAAM,MAAe,MAAA,EAAuB;AAC1C,IAAA,IAAA,CAAK,KAAK,gBAAgB,CAAA;AAC1B,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAE1B,IAAA,IAAI,KAAK,OAAA,EAAS;AAGhB,MAAA,IAAA,CAAK,sBAAA,CAAuB,KAAK,OAAO,CAAA;AACxC,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAA,IAAQ,GAAA,EAAM,UAAU,eAAe,CAAA;AAAA,MAC5D,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,UAAU,cAAc,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAK,IAAA,EAA4B;AAC/B,IAAA,IAAI,IAAA,CAAK,WAAW,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,aAAA,EAAgB,KAAK,MAAM,CAAA,4EAAA;AAAA,OAC7B;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AAC/B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,aAAA,EAAgB,KAAK,MAAM,CAAA,kEAAA;AAAA,OAC7B;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,MAAA,KAAW,WAAA,IAAe,KAAK,OAAA,EAAS,UAAA,KAAe,UAAU,IAAA,EAAM;AAC9E,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAI,CAAA;AACtB,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,QAAA,IAAY,IAAA,CAAK,WAAW,WAAA,EAAa;AAC3D,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,qCAAA,EAAmC,IAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AACtB,IAAA,IAAA,CAAK,YAAA,EAAa;AAGlB,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,sBAAA,CAAuB,KAAK,OAAO,CAAA;AACxC,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAM,WAAW,CAAA;AAAA,MACtC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,MAAA,GAAe;AACb,IAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,0DAAA,EAAwD,IAAA,CAAK,MAAM,CAAA,EAAA,CAAI,CAAA;AACjF,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAK,UAAU,CAAA;AACpB,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,IAAA,IAAA,CAAK,UAAU,cAAc,CAAA;AAC7B,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA,EAKA,OAAO,QAAA,EAAkC;AACvC,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAClC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AAAA,IACvC,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,QAAA,EAA8D;AACpE,IAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,QAAQ,CAAA;AACnC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,QAAQ,CAAA;AAAA,IACxC,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,UAAU,QAAA,EAAoD;AAC5D,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,QAAQ,CAAA;AACrC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,QAAQ,CAAA;AAAA,IAC1C,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,QAAQ,QAAA,EAA8C;AACpD,IAAA,IAAA,CAAK,iBAAA,CAAkB,IAAI,QAAQ,CAAA;AACnC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,QAAQ,CAAA;AAAA,IACxC,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,QAAA,EAAmE;AAC/E,IAAA,IAAA,CAAK,uBAAA,CAAwB,IAAI,QAAQ,CAAA;AACzC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,QAAQ,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AAEtB,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAC7B,IAAA,IAAA,CAAK,oBAAoB,KAAA,EAAM;AAC/B,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAC7B,IAAA,IAAA,CAAK,wBAAwB,KAAA,EAAM;AAAA,EACrC;AAAA;AAAA,EAIA,MAAc,WAAA,GAA+B;AAC3C,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,MAAA,OAAO,MAAM,KAAK,IAAA,EAAK;AAAA,IACzB;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA,EAEA,MAAc,kBAAA,GAAoC;AAEhD,IAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AAEtC,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,KAAK,WAAA,EAAY;AAAA,IAC/B,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAE,CAAA;AACzC,MAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAE,CAAA;AAEhC,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI;AACF,MAAA,EAAA,GAAK,IAAA,CAAK,UAAA,GAAa,IAAI,SAAA,CAAU,GAAA,EAAK,KAAK,UAAU,CAAA,GAAI,IAAI,SAAA,CAAU,GAAG,CAAA;AAAA,IAChF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,6BAAA,EAAgC,GAAG,CAAA,CAAE,CAAA;AAC/C,MAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,MAAA;AAAA,IACF;AAGA,IAAA,EAAA,CAAG,UAAA,GAAa,aAAA;AAEhB,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AAGf,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAW,MAAM;AACpC,MAAA,IAAI,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,UAAA,EAAY;AAC1C,QAAA,IAAA,CAAK,KAAK,sBAAsB,CAAA;AAEhC,QAAA,EAAA,CAAG,KAAA,EAAM;AAAA,MACX;AAAA,IACF,CAAA,EAAG,KAAK,iBAAiB,CAAA;AAGzB,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,MAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,MAAA,IAAA,CAAK,UAAU,WAAW,CAAA;AAC1B,MAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AAGrB,MAAA,KAAA,MAAW,EAAA,IAAM,KAAK,gBAAA,EAAkB;AACtC,QAAA,IAAI;AACF,UAAA,EAAA,EAAG;AAAA,QACL,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,WAAA,EAAY;AAAA,IACnB,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAsB;AACrC,MAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,MAAA,IAAA,CAAK,KAAK,CAAA,0BAAA,EAAwB,KAAA,CAAM,IAAI,CAAA,SAAA,EAAY,KAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAA;AAGvE,MAAA,KAAA,MAAW,EAAA,IAAM,KAAK,iBAAA,EAAmB;AACvC,QAAA,IAAI;AACF,UAAA,EAAA,CAAG,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAAA,QAC7B,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,CAAK,YAAY,EAAA,EAAI;AACvB,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACjB;AAIA,MAAA,IACE,CAAC,IAAA,CAAK,UAAA,IACN,IAAA,CAAK,MAAA,KAAW,cAAA,IAChB,IAAA,CAAK,MAAA,KAAW,WAAA,IAChB,IAAA,CAAK,MAAA,KAAW,QAAA,EAChB;AACA,QAAA,IAAA,CAAK,UAAU,cAAc,CAAA;AAC7B,QAAA,IAAA,CAAK,wBAAA,EAAyB;AAAA,MAChC;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAiB;AAChC,MAAA,IAAA,CAAK,KAAK,cAAc,CAAA;AACxB,MAAA,KAAA,MAAW,EAAA,IAAM,KAAK,iBAAA,EAAmB;AACvC,QAAA,IAAI;AACF,UAAA,EAAA,CAAG,KAAK,CAAA;AAAA,QACV,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IAGF,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAwB;AACzC,MAAA,KAAA,MAAW,EAAA,IAAM,KAAK,mBAAA,EAAqB;AACzC,QAAA,IAAI;AACF,UAAA,EAAA,CAAG,KAAK,CAAA;AAAA,QACV,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,EAAA,CAAG,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AAClC,IAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACpC,IAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACpC,IAAA,EAAA,CAAG,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAGxC,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,EAAA,EAAI,EAAE,QAAQ,OAAA,EAAS,OAAA,EAAS,WAAW,CAAA;AAAA,EACpE;AAAA,EAEQ,uBAAuB,EAAA,EAAqB;AAClD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA;AAC3C,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,EAAA,CAAG,mBAAA,CAAoB,MAAA,EAAQ,SAAA,CAAU,MAAM,CAAA;AAC/C,IAAA,EAAA,CAAG,mBAAA,CAAoB,OAAA,EAAS,SAAA,CAAU,OAAO,CAAA;AACjD,IAAA,EAAA,CAAG,mBAAA,CAAoB,OAAA,EAAS,SAAA,CAAU,OAAO,CAAA;AACjD,IAAA,EAAA,CAAG,mBAAA,CAAoB,SAAA,EAAW,SAAA,CAAU,SAAS,CAAA;AACrD,IAAA,IAAA,CAAK,aAAA,CAAc,OAAO,EAAE,CAAA;AAAA,EAC9B;AAAA;AAAA,EAIQ,wBAAA,GAAiC;AACvC,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,MAAA,KAAW,WAAA,EAAa;AAEpD,IAAA,IAAA,CAAK,kBAAA,EAAA;AAEL,IAAA,IAAI,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,qBAAA,EAAuB;AACxD,MAAA,IAAA,CAAK,IAAA;AAAA,QACH,CAAA,wBAAA,EAA2B,KAAK,qBAAqB,CAAA,sCAAA;AAAA,OACvD;AACA,MAAA,IAAA,CAAK,UAAU,QAAQ,CAAA;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAU,cAAc,CAAA;AAC7B,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA,EAEQ,kBAAA,GAA2B;AACjC,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAChE,IAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,KAAK,CAAA,YAAA,EAAe,KAAK,kBAAkB,CAAA,CAAA,EAAI,IAAA,CAAK,qBAAqB,CAAA,CAAA,CAAG,CAAA;AAEzG,IAAA,IAAA,CAAK,eAAA,GAAkB,WAAW,YAAY;AAC5C,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAI,KAAK,UAAA,IAAc,IAAA,CAAK,WAAW,WAAA,IAAe,IAAA,CAAK,WAAW,QAAA,EAAU;AAEhF,MAAA,IAAA,CAAK,UAAU,YAAY,CAAA;AAC3B,MAAA,MAAM,KAAK,kBAAA,EAAmB;AAAA,IAChC,GAAG,KAAK,CAAA;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,OAAA,EAAyB;AACjD,IAAA,MAAM,cAAc,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,KAAK,SAAS,CAAA;AAEnD,IAAA,MAAM,MAAA,GAAS,IAAA,GAAO,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA;AACtC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA,EAIQ,SAAS,IAAA,EAA4B;AAC3C,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,IAAUA,eAAAA,EAAgB;AACxC,MAAA,IAAA,CAAK,KAAK,gDAA2C,CAAA;AACrD,MAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,IACpB;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EACvB;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IACE,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,IACvB,CAAC,IAAA,CAAK,OAAA,IACN,IAAA,CAAK,OAAA,CAAQ,UAAA,KAAe,SAAA,CAAU,IAAA,EACtC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,kBAAA,CAAoB,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM;AAClC,IAAA,IAAA,CAAK,SAAS,EAAC;AAEf,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,MACvB,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,IAAA,CAAK,CAAA,+BAAA,EAAkC,GAAG,CAAA,CAAE,CAAA;AAGjD,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,UAAU,IAAA,EAAqB;AACrC,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA;AAClB,IAAA,IAAI,SAAS,IAAA,EAAM;AAEnB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,IAAA,EAAO,IAAI,CAAA,CAAE,CAAA;AAErC,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,uBAAA,EAAyB;AAC7C,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,MAAM,IAAI,CAAA;AAAA,MACf,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA,EAEQ,kBAAA,GAA2B;AACjC,IAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC/B,MAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAC/B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,IAAA,CAAK,oBAAoB,IAAA,EAAM;AACjC,MAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACjC,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAIQ,KAAK,OAAA,EAAuB;AAClC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,IAAI,CAAA,aAAA,EAAgB,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,IACvD;AAAA,EACF;AACF,CAAA;;;ACjhBA,IAAMP,WAAAA,GAAa,gBAAA;AAGnB,IAAM,qBAAA,GAAwB,GAAA;AAG9B,IAAM,aAAA,GAAgB,QAAA;AAGtB,IAAM,gBAAA,GAAmB,IAAA;AAqBzB,SAAS,eAAe,OAAA,EAAmC;AACzD,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAEvC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAE,CAAC,CAAA;AAC/C,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,QAAS,CAAA,GAAI,KAAA;AAAA,EACtC;AACA,EAAA,OAAO,KAAA;AACT;AAMO,IAAM,cAAN,MAAkB;AAAA;AAAA,EAGN,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAIT,SAAA,GAAqC,IAAA;AAAA,EACrC,cAAA,GAAwD,IAAA;AAAA,EACxD,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA;AAAA,EAGJ,mBAAA,uBACX,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAMV,YAAY,OAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,aAAA;AAC9B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,gBAAA;AACpC,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,KAAA,IAAS,KAAA;AAErC,IAAA,IAAA,CAAK,IAAI,qBAAA,EAAuB;AAAA,MAC9B,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,IAAI,mCAA8B,CAAA;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,MAAA,IAAA,CAAK,IAAI,0DAAqD,CAAA;AAC9D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,IAAI,eAAA,EAAiB,GAAA,CAAI,QAAQ,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAC,CAAA;AAEzD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB;AAAA,MACpC,GAAA;AAAA,MACA,WAAW,EAAC;AAAA,MACZ,OAAO,IAAA,CAAK,YAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,MAAM;AAC1B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,cAAA,EAAe;AACpB,MAAA,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,IACtB,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,CAAC,KAAA,KAAwB;AAChD,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,IAC1B,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,EAAc,MAAA,KAAmB;AACvD,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC9C,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,KAAA,KAAiB;AACvC,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAmB,KAAK,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,EAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,SAAA,EAA4C;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,SAAA,IAAa,KAAK,UAAA,EAAY;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,qBAAqB,YAAA,EAAc;AACrC,MAAA,MAAA,GAAS,cAAA,CAAe,SAAS,CAAA,CAAE,MAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,SAAA,CAAU,MAAA;AAAA,IACrB;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,QAAA,EAA2D;AACtE,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,QAAQ,CAAA;AAErC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,QAAQ,CAAA;AAAA,IAC1C,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,KAAK,SAAA,EAAW;AACvC,MAAA,IAAA,CAAK,IAAI,uCAAkC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAI,iCAAiC,CAAA;AAC1C,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,aAAA,EAAe,CAAC,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAI,YAAY,CAAA;AACrB,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,UAAU,OAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAEA,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,oBAAoB,KAAA,EAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,GAAe;AACb,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAElB,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBQ,cAAc,KAAA,EAA2B;AAE/C,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,KAAA,CAAM,IAAI,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,MAAM,CAAA;AAE1B,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,IAAA,CAAK,qBAAqB,MAAM,CAAA;AAAA,IAClC,CAAA,MAAA,IAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,IAAA,CAAK,GAAA,CAAI,qBAAqB,MAAM,CAAA;AAAA,IACtC,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAA,CAAK,GAAA,CAAI,kBAAkB,MAAM,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,GAAA,CAAI,sBAAA,EAAwB,IAAA,EAAM,MAAM,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,MAAA,EAAuC;AAClE,IAAA,MAAM,OAAA,GAAU,OAAO,SAAS,CAAA;AAIhC,IAAA,MAAM,eAAe,OAAA,EAAS,YAAA;AAC9B,IAAA,IAAI,CAAC,YAAA,IAAgB,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,aAAa,CAAC,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,EAAA;AACtC,IAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,CAAA;AAGtC,IAAA,IAAI,UAAA,CAAW,IAAA,EAAK,KAAM,EAAA,EAAI;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UACH,MAAA,CAAO,UAAU,MAAM,IAAA,IAAU,MAAA,CAAO,cAAc,CAAA,KAAM,IAAA;AAE/D,IAAA,MAAM,eAAA,GAAsC;AAAA,MAC1C,IAAA,EAAM,UAAA;AAAA,MACN,OAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,UAAU,mBAAA,GAAsB,qBAAA;AAAA,MAChC,UAAA;AAAA,MACA,CAAA,CAAA,EAAA,CAAK,UAAA,GAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA;AAAA,KACnC;AAEA,IAAA,IAAA,CAAK,eAAe,eAAe,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,IAAA,CAAK,cAAA,GAAiB,YAAY,MAAM;AACtC,MAAA,IAAI,KAAK,UAAA,IAAc,IAAA,CAAK,SAAA,IAAa,CAAC,KAAK,UAAA,EAAY;AACzD,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,WAAA,EAAa,CAAC,CAAA;AACzD,UAAA,IAAA,CAAK,IAAI,gBAAgB,CAAA;AAAA,QAC3B,CAAA,CAAA,MAAQ;AACN,UAAA,IAAA,CAAK,IAAI,0BAA0B,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF,GAAG,qBAAqB,CAAA;AAAA,EAC1B;AAAA;AAAA,EAGQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAChC,MAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AACjC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,eAAe,KAAA,EAAiC;AACtD,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,mBAAA,EAAqB;AACzC,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAK,CAAA;AAAA,MACV,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAMA,WAAAA,EAAY,4BAAA,EAA8B,GAAG,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,QAAA,GAAmB;AAGzB,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,SAAA,EAAW,MAAA;AAAA,MACX,eAAA,EAAiB,MAAA;AAAA,MACjB,WAAA,EAAa,KAAA;AAAA,MACb,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAED,IAAA,OAAO,CAAA,iCAAA,EAAoC,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAO,IAAA,EAAuB;AACpC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAMA,WAAAA,EAAY,GAAG,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AACF,CAAA;;;ACjaA,IAAMA,WAAAA,GAAa,2BAAA;AAEnB,IAAM,uBAAA,GACJ,oDAAA;AAEF,IAAMQ,iBAAAA,GAAmB,IAAA;AACzB,IAAM,oBAAA,GAAuB,EAAA;AAC7B,IAAM,WAAA,GAAc,IAAA;AAmBpB,SAASC,gBAAe,OAAA,EAAmC;AACzD,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAE,CAAC,CAAA;AAC/C,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,QAAS,CAAA,GAAI,KAAA;AAAA,EACtC;AACA,EAAA,OAAO,KAAA;AACT;AAMA,SAAS,cAAc,KAAA,EAA2B;AAChD,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AAEzC,EAAA,MAAM,UAAA,GAAa,IAAA;AACnB,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,UAAA,EAAY;AACjD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,IAAI,UAAU,CAAA;AAC9C,IAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,GAAG,KAAK,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAMO,IAAM,gBAAN,MAAoB;AAAA;AAAA,EAGR,MAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAIT,SAAA,GAAqC,IAAA;AAAA,EACrC,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA;AAAA,EAGJ,mBAAA,uBACX,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAMV,YAAY,OAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAYD,iBAAAA;AACpC,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,KAAA,IAAS,KAAA;AAErC,IAAA,IAAA,CAAK,IAAI,uBAAA,EAAyB,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,IAAI,mCAA8B,CAAA;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,MAAA,IAAA,CAAK,IAAI,0DAAqD,CAAA;AAC9D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,IAAI,eAAA,EAAiB,GAAA,CAAI,QAAQ,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAC,CAAA;AAEzD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB;AAAA,MACpC,GAAA;AAAA,MACA,WAAW,EAAC;AAAA,MACZ,OAAO,IAAA,CAAK,YAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,MAAM;AAC1B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,IACtB,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,CAAC,KAAA,KAAwB;AAChD,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,IAC1B,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,EAAc,MAAA,KAAmB;AACvD,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC9C,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,KAAA,KAAiB;AACvC,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAmB,KAAK,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,EAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,SAAA,EAA4C;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,SAAA,IAAa,KAAK,UAAA,EAAY;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GACJ,SAAA,YAAqB,YAAA,GAAeC,eAAAA,CAAe,SAAS,CAAA,GAAI,SAAA;AAElE,IAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAElC,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA;AAAA,MACb,KAAK,SAAA,CAAU;AAAA,QACb,IAAA,EAAM,mBAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,WAAA,EAAa;AAAA,OACd;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,QAAA,EAA2D;AACtE,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,QAAQ,CAAA;AAErC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,QAAQ,CAAA;AAAA,IAC1C,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,KAAK,SAAA,EAAW;AACvC,MAAA,IAAA,CAAK,IAAI,uCAAkC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAI,kCAAkC,CAAA;AAE3C,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAC,CAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAI,YAAY,CAAA;AAErB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,UAAU,OAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAEA,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,oBAAoB,KAAA,EAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,cAAc,KAAA,EAA2B;AAC/C,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,KAAA,CAAM,IAAI,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,MAAM,CAAA;AAE1B,IAAA,IAAI,IAAA,KAAS,sBAAA,IAA0B,IAAA,KAAS,oBAAA,EAAsB;AACpE,MAAA,IAAA,CAAK,uBAAA,CAAwB,MAAA,EAAQ,IAAA,KAAS,sBAAsB,CAAA;AAAA,IACtE,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,IAAA,EAAM,MAAM,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAA,CACN,QACA,OAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,OAAO,QAAQ,CAAA;AAI9B,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,EAAA;AAC7B,IAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,CAAA;AAEzC,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,EAAI;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eAAA,GAAsC;AAAA,MAC1C,IAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,UAAU,mBAAA,GAAsB,qBAAA;AAAA,MAChC,IAAA;AAAA,MACA,CAAA,CAAA,EAAA,CAAK,UAAA,GAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA;AAAA,KACnC;AAEA,IAAA,IAAA,CAAK,eAAe,eAAe,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,eAAe,KAAA,EAAiC;AACtD,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,mBAAA,EAAqB;AACzC,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAK,CAAA;AAAA,MACV,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAMT,WAAAA,EAAY,4BAAA,EAA8B,GAAG,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,QAAA,GAAmB;AACzB,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,YAAY,IAAA,CAAK,MAAA;AAAA,MACjB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,kBAAA,EAAoB,OAAO,oBAAoB;AAAA,KAChD,CAAA;AAED,IAAA,OAAO,CAAA,EAAG,uBAAuB,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAO,IAAA,EAAuB;AACpC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAMA,WAAAA,EAAY,GAAG,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AACF,CAAA;;;ACjXA,IAAMA,WAAAA,GAAa,gBAAA;AAGnB,IAAM,gBAAA,GAAmB,sBAAA;AAGzB,IAAM,gBAAA,GAAmB,mBAAA;AAGzB,IAAM,iBAAA,GAAoB,GAAA;AAG1B,IAAM,wBAAA,GAA2B,IAAA;AA+BjC,SAAS,oBAAoB,MAAA,EAA6B;AACxD,EAAA,MAAM,YAAA,GAAe,KAAK,MAAM,CAAA;AAChC,EAAA,MAAM,SAAS,YAAA,CAAa,MAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AACnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,YAAA,CAAa,UAAA,CAAW,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AAMO,IAAM,gBAAN,MAAoB;AAAA;AAAA,EAGR,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAIT,SAAA,GAAqC,IAAA;AAAA,EACrC,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,OAAA,GAAU,KAAA;AAAA;AAAA,EAGD,cAAA,uBACX,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAMV,YAAY,OAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AAClC,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,KAAA,IAAS,KAAA;AAErC,IAAA,IAAA,CAAK,IAAI,uBAAA,EAAyB;AAAA,MAChC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,SAAS,IAAA,CAAK;AAAA,KACf,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,IAAI,mCAA8B,CAAA;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,MAAA,IAAA,CAAK,IAAI,0DAAqD,CAAA;AAC9D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,GAAA,CAAI,iBAAiB,GAAG,CAAA;AAE7B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB;AAAA,MACpC,GAAA;AAAA,MACA,WAAW,EAAC;AAAA,MACZ,OAAO,IAAA,CAAK,YAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,MAAM;AAC1B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,IAAA,CAAK,IAAI,wBAAwB,CAAA;AAAA,IACnC,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,CAAC,KAAA,KAAwB;AAChD,MAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,IAC1B,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,EAAc,MAAA,KAAmB;AACvD,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC9C,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,KAAA,KAAiB;AACvC,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAmB,KAAK,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,EAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,SAAA,IAAa,KAAK,UAAA,EAAY;AAC1D,MAAA,IAAA,CAAK,IAAI,gDAA2C,CAAA;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU;AAAA,MAC7B,IAAA;AAAA,MACA,sBAAA,EAAwB;AAAA,KACzB,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,qBAAA,EAAuB,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,EAAA,GAAK,KAAA,GAAQ,EAAA,CAAG,CAAA;AACnF,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,SAAA,IAAa,KAAK,UAAA,EAAY;AAC1D,MAAA,IAAA,CAAK,IAAI,gDAA2C,CAAA;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,IAAI,qBAAqB,CAAA;AAC9B,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,QAAA,EAAsD;AAC5D,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,QAAQ,CAAA;AAEhC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,QAAQ,CAAA;AAAA,IACrC,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,KAAK,SAAA,EAAW;AACvC,MAAA,IAAA,CAAK,IAAI,uCAAkC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAI,oBAAoB,CAAA;AAG7B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAI,YAAY,CAAA;AAErB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,UAAU,OAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAEA,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,GAAe;AACb,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,OAAA,GAAgB;AACtB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,OAAA,EAAS;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU;AAAA,MACzB,IAAA,EAAM,GAAA;AAAA,MACN,cAAA,EAAgB;AAAA,QACd,SAAA,EAAW,iBAAA;AAAA,QACX,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,YAAY,IAAA,CAAK;AAAA,KAClB,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,GAAG,CAAA;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,IAAI,oBAAoB,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBQ,cAAc,KAAA,EAA2B;AAE/C,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,KAAA,CAAM,IAAI,CAAA;AAC9C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,OAAO,CAAA,KAAM,MAAA,EAAW;AACjC,MAAA,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,MAAA,CAAO,OAAO,CAAC,CAAA;AAC7C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,OAAO,CAAA,KAAM,UAAa,MAAA,CAAO,OAAO,MAAM,IAAA,EAAM;AAC7D,MAAA,IAAA,CAAK,GAAA,CAAI,8BAA8B,MAAM,CAAA;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,OAAO,OAAO,CAAA;AAClC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,SAAS,CAAA,KAAM,IAAA;AAGtC,IAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAC5C,MAAA,IAAI,OAAA,EAAS;AAGX,QAAA,IAAA,CAAK,SAAA,CAAU;AAAA,UACb,KAAA,EAAO,IAAI,WAAA,CAAY,CAAC,CAAA;AAAA,UACxB,OAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAW,KAAK,GAAA;AAAI,SACrB,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,oBAAoB,WAAW,CAAA;AAAA,IAC/C,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,iCAAiC,GAAG,CAAA;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAA4B;AAAA,MAChC,KAAA,EAAO,WAAA;AAAA,MACP,OAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,UAAU,oBAAA,GAAuB,cAAA;AAAA,MACjC,CAAA,EAAG,YAAY,UAAU,CAAA,MAAA;AAAA,KAC3B;AAEA,IAAA,IAAA,CAAK,UAAU,UAAU,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,UAAU,KAAA,EAA4B;AAC5C,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,cAAA,EAAgB;AACpC,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAK,CAAA;AAAA,MACV,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAMA,WAAAA,EAAY,uBAAA,EAAyB,GAAG,CAAA;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,QAAA,GAAmB;AACzB,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAED,IAAA,OAAO,CAAA,0CAAA,EAA6C,mBAAmB,IAAA,CAAK,OAAO,CAAC,CAAA,cAAA,EAAiB,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,EACxH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAO,IAAA,EAAuB;AACpC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAMA,WAAAA,EAAY,GAAG,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AACF,CAAA;;;AC/aA,IAAMA,WAAAA,GAAa,0BAAA;AAGnB,IAAMQ,iBAAAA,GAAmB,OAAA;AA+ElB,IAAM,eAAN,MAAmB;AAAA;AAAA,EAGP,QAAA;AAAA,EACA,UAAA;AAAA,EACA,qBAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAIT,WAAA,GAAgD,IAAA;AAAA,EAChD,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,gBAAA,GAAmB,KAAA;AAAA;AAAA,EAGV,mBAAA,uBACX,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAMV,WAAA,CAAY,OAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAYA,iBAAAA;AACpC,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,IAAA;AACxC,IAAA,IAAA,CAAK,qBAAA,GAAwB,QAAQ,cAAA,IAAkB,IAAA;AACvD,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,KAAA,IAAS,KAAA;AAErC,IAAA,IAAA,CAAK,IAAI,sBAAA,EAAwB;AAAA,MAC/B,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,gBAAgB,IAAA,CAAK;AAAA,KACtB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,WAAA,GAAuB;AAC5B,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,IAAA,OACE,OAAQ,MAAA,CAA8C,mBAAmB,MAAM,WAAA,IAC/E,OAAO,WAAW,uBAAA,KAA4B,WAAA;AAAA,EAElD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,IAAI,mCAA8B,CAAA;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,IAAA,CAAK,IAAI,gDAA2C,CAAA;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,sBAAA,GAAyB,KAAK,wBAAA,EAAyB;AAC7D,IAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,sBAAA,EAAuB;AAC9C,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,IAAA,CAAK,QAAA;AAC7B,IAAA,IAAA,CAAK,WAAA,CAAY,aAAa,IAAA,CAAK,UAAA;AACnC,IAAA,IAAA,CAAK,WAAA,CAAY,iBAAiB,IAAA,CAAK,qBAAA;AACvC,IAAA,IAAA,CAAK,YAAY,eAAA,GAAkB,CAAA;AAGnC,IAAA,IAAA,CAAK,WAAA,CAAY,UAAU,MAAM;AAC/B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,MAAA,IAAA,CAAK,IAAI,qBAAqB,CAAA;AAAA,IAChC,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,QAAA,GAAW,CAAC,KAAA,KAAkC;AAC7D,MAAA,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA,IACzB,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,GAAU,CAAC,KAAA,KAAuC;AACjE,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IACxB,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,QAAQ,MAAM;AAC7B,MAAA,IAAA,CAAK,IAAI,mBAAmB,CAAA;AAC5B,MAAA,MAAM,eAAe,IAAA,CAAK,UAAA;AAC1B,MAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAIlB,MAAA,IACE,IAAA,CAAK,cACL,CAAC,IAAA,CAAK,oBACN,CAAC,IAAA,CAAK,cACN,YAAA,EACA;AACA,QAAA,IAAA,CAAK,IAAI,wCAAwC,CAAA;AACjD,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,QAC1B,CAAA,CAAA,MAAQ;AACN,UAAA,IAAA,CAAK,IAAI,oCAAoC,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,CAAA;AAGA,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5C,MAAA,MAAM,UAAU,MAAY;AAC1B,QAAA,OAAA,EAAQ;AACR,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AAEA,MAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAA6C;AAC5D,QAAA,OAAA,EAAQ;AACR,QAAA,MAAA,CAAO,IAAI,MAAM,CAAA,yBAAA,EAA4B,KAAA,CAAM,KAAK,CAAA,QAAA,EAAM,KAAA,CAAM,OAAO,CAAA,CAAE,CAAC,CAAA;AAAA,MAChF,CAAA;AAEA,MAAA,MAAM,UAAU,MAAY;AAC1B,QAAA,IAAI,KAAK,WAAA,EAAa;AAEpB,UAAA,IAAA,CAAK,WAAA,CAAY,mBAAA,CAAoB,OAAA,EAAS,OAAmC,CAAA;AACjF,UAAA,IAAA,CAAK,WAAA,CAAY,mBAAA,CAAoB,OAAA,EAAS,OAAmC,CAAA;AAAA,QACnF;AAAA,MACF,CAAA;AAEA,MAAA,IAAA,CAAK,YAAa,gBAAA,CAAiB,OAAA,EAAS,SAAqC,EAAE,IAAA,EAAM,MAAM,CAAA;AAC/F,MAAA,IAAA,CAAK,YAAa,gBAAA,CAAiB,OAAA,EAAS,SAAqC,EAAE,IAAA,EAAM,MAAM,CAAA;AAE/F,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,YAAa,KAAA,EAAM;AAAA,MAC1B,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,EAAQ;AACR,QAAA,MAAA,CAAO,GAAG,CAAA;AAAA,MACZ;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,UAAA,EAA6C;AAAA,EAEvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,QAAA,EAA2D;AACtE,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,QAAQ,CAAA;AAErC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,QAAQ,CAAA;AAAA,IAC1C,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,IAAA,CAAK,IAAI,uCAAkC,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAI,qBAAqB,CAAA;AAC9B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAExB,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAI,YAAY,CAAA;AACrB,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAExB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,MACzB,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,YAAY,QAAA,GAAW,IAAA;AAC5B,MAAA,IAAA,CAAK,YAAY,OAAA,GAAU,IAAA;AAC3B,MAAA,IAAA,CAAK,YAAY,KAAA,GAAQ,IAAA;AACzB,MAAA,IAAA,CAAK,YAAY,OAAA,GAAU,IAAA;AAC3B,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAEA,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,oBAAoB,KAAA,EAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAExB,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AACvC,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,MACxB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAAe;AACb,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,IAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAGlB,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,CAAC,IAAA,CAAK,UAAA,EAAY;AACxC,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,MACzB,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,CAAK,IAAI,4CAA4C,CAAA;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,aAAa,KAAA,EAAqC;AACxD,IAAA,KAAA,IAAS,IAAI,KAAA,CAAM,WAAA,EAAa,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC7D,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAC9B,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,WAAA,GAAc,OAAO,CAAC,CAAA;AAC5B,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,MAAM,aAAa,WAAA,CAAY,UAAA;AAC/B,MAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,IAAA,OAAW,EAAA,EAAI;AAE7C,MAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAEvB,MAAA,MAAM,UAAA,GAAa,WAAA,CAAY,UAAA,GAAa,CAAA,GAAI,YAAY,UAAA,GAAa,IAAA;AAEzE,MAAA,MAAM,eAAA,GAAsC;AAAA,QAC1C,IAAA,EAAM,UAAA;AAAA,QACN,OAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AAEA,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,UAAU,mBAAA,GAAsB,qBAAA;AAAA,QAChC,UAAA;AAAA,QACA,CAAA,CAAA,EAAA,CAAK,UAAA,GAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA;AAAA,OACnC;AAEA,MAAA,IAAA,CAAK,eAAe,eAAe,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,YAAY,KAAA,EAA0C;AAC5D,IAAA,MAAM,YAAY,KAAA,CAAM,KAAA;AAExB,IAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,EAAsB,SAAA,EAAW,KAAA,CAAM,OAAO,CAAA;AAIvD,IAAA,IAAI,SAAA,KAAc,WAAA,IAAe,SAAA,KAAc,SAAA,EAAW;AACxD,MAAA,IAAA,CAAK,IAAI,qCAAgC,CAAA;AACzC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,MAAA,IAAA,CAAK,IAAI,mDAA8C,CAAA;AACvD,MAAA;AAAA,IACF;AAIA,IAAA,IACE,SAAA,KAAc,aAAA,IACd,SAAA,KAAc,qBAAA,IACd,cAAc,wBAAA,EACd;AACA,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,MAAA,IAAA,CAAK,IAAI,yCAAoC,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,eAAe,KAAA,EAAiC;AACtD,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,mBAAA,EAAqB;AACzC,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAK,CAAA;AAAA,MACV,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAMR,WAAAA,EAAY,4BAAA,EAA8B,GAAG,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,wBAAA,GAAgE;AACtE,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAE1C,IAAA,MAAM,GAAA,GAAM,MAAA;AACZ,IAAA,IAAI,OAAO,GAAA,CAAI,mBAAmB,CAAA,KAAM,WAAA,EAAa;AACnD,MAAA,OAAO,IAAI,mBAAmB,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,OAAO,UAAA,CAAW,uBAAA,KAA4B,WAAA,EAAa;AAC7D,MAAA,OAAO,UAAA,CAAW,uBAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAO,IAAA,EAAuB;AACpC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAMA,WAAAA,EAAY,GAAG,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AACF;;;AC/fA,IAAMA,YAAAA,GAAa,0BAAA;AAGnB,IAAM,YAAA,GAAe,CAAA;AAGrB,IAAM,aAAA,GAAgB,CAAA;AAGtB,IAAMQ,iBAAAA,GAAmB,OAAA;AA8BlB,IAAM,eAAN,MAAmB;AAAA;AAAA,EAGP,SAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAIT,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA;AAAA,EAGb,cAAA,GAA8C,IAAA;AAAA;AAAA,EAG9C,aAAA,GAAgB,KAAA;AAAA;AAAA,EAGP,cAAA,uBACX,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAMV,WAAA,CAAY,OAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,KAAA,IAAS,IAAA;AAClC,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,YAAA;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,aAAA;AAC9B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAYA,iBAAAA;AACpC,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,KAAA,IAAS,KAAA;AAErC,IAAA,IAAA,CAAK,IAAI,sBAAA,EAAwB;AAAA,MAC/B,OAAO,IAAA,CAAK,SAAA;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,WAAA,GAAuB;AAC5B,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,IAAA,OAAO,OAAO,OAAO,eAAA,KAAoB,WAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,IAAI,mCAA8B,CAAA;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,oBAAoB,WAAA,EAAa;AAClF,MAAA,IAAA,CAAK,IAAI,qDAAgD,CAAA;AACzD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,KAAK,UAAA,EAAW;AAGtB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA;AACnD,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,IAAA,CAAK,GAAA,CAAI,iBAAA,EAAmB,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAAA,MACtD,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,GAAA,CAAI,4BAAA,EAA8B,IAAA,CAAK,SAAA,EAAW,8BAAyB,CAAA;AAAA,MAClF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,UAAA,EAAY;AACvC,MAAA,IAAA,CAAK,IAAI,gDAA2C,CAAA;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAK,EAAG;AACzB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,oBAAoB,WAAA,EAAa;AAClF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,MAAA,CAAO,eAAA;AACrB,IAAA,MAAM,SAAA,GAAY,IAAI,wBAAA,CAAyB,IAAI,CAAA;AAGnD,IAAA,SAAA,CAAU,OAAO,IAAA,CAAK,QAAA;AACtB,IAAA,SAAA,CAAU,OAAO,IAAA,CAAK,IAAA;AACtB,IAAA,SAAA,CAAU,QAAQ,IAAA,CAAK,KAAA;AAEvB,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,SAAA,CAAU,QAAQ,IAAA,CAAK,cAAA;AAAA,IACzB;AAIA,IAAA,SAAA,CAAU,UAAU,MAAM;AACxB,MAAA,IAAA,CAAK,GAAA,CAAI,oBAAA,EAAsB,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,EAAA,GAAK,KAAA,GAAQ,EAAA,CAAG,CAAA;AAElF,MAAA,IAAA,CAAK,SAAA,CAAU;AAAA,QACb,KAAA,EAAO,IAAI,WAAA,CAAY,CAAC,CAAA;AAAA,QACxB,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,SAAA,CAAU,QAAQ,MAAM;AAEtB,MAAA,IAAA,CAAK,IAAI,iBAAiB,CAAA;AAE1B,MAAA,IAAA,CAAK,SAAA,CAAU;AAAA,QACb,KAAA,EAAO,IAAI,WAAA,CAAY,CAAC,CAAA;AAAA,QACxB,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,SAAA,CAAU,OAAA,GAAU,CAAC,KAAA,KAAqC;AAGxD,MAAA,IAAI,KAAA,CAAM,UAAU,UAAA,EAAY;AAC9B,QAAA,IAAA,CAAK,IAAI,qBAAqB,CAAA;AAC9B,QAAA,IAAA,CAAK,SAAA,CAAU;AAAA,UACb,KAAA,EAAO,IAAI,WAAA,CAAY,CAAC,CAAA;AAAA,UACxB,OAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAW,KAAK,GAAA;AAAI,SACrB,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,KAAA,CAAM,KAAK,CAAA;AAExC,MAAA,IAAA,CAAK,SAAA,CAAU;AAAA,QACb,KAAA,EAAO,IAAI,WAAA,CAAY,CAAC,CAAA;AAAA,QACxB,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,EAAA,GAAK,KAAA,GAAQ,EAAA,CAAG,CAAA;AACzE,IAAA,KAAA,CAAM,MAAM,SAAS,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,GAAc;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQ,QAAA,EAA+D;AACrE,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,QAAQ,CAAA;AAEhC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,QAAQ,CAAA;AAAA,IACrC,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,IAAA,GAAa;AACX,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,oBAAoB,WAAA,EAAa;AAClF,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAI,2BAA2B,CAAA;AACpC,IAAA,MAAA,CAAO,gBAAgB,MAAA,EAAO;AAAA,EAEhC;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAI,YAAY,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAElB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,oBAAoB,WAAA,EAAa;AAClF,MAAA,MAAA,CAAO,gBAAgB,KAAA,EAAM;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAElB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,oBAAoB,WAAA,EAAa;AAClF,MAAA,MAAA,CAAO,gBAAgB,MAAA,EAAO;AAAA,IAChC;AAEA,IAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAc,UAAA,GAA4B;AACxC,IAAA,IAAI,KAAK,aAAA,EAAe;AACxB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,oBAAoB,WAAA,EAAa;AAEpF,IAAA,MAAM,QAAQ,MAAA,CAAO,eAAA;AACrB,IAAA,IAAI,MAAA,GAAS,MAAM,SAAA,EAAU;AAE7B,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,MAAA,CAAO,MAAA,EAAQ,WAAW,CAAA;AACrD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,MAAA,MAAM,kBAAkB,MAAY;AAClC,QAAA,KAAA,CAAM,mBAAA,CAAoB,iBAAiB,eAAe,CAAA;AAC1D,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,MAAA,GAAS,MAAM,SAAA,EAAU;AACzB,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,IAAA,CAAK,GAAA,CAAI,wBAAA,EAA0B,MAAA,CAAO,MAAA,EAAQ,WAAW,CAAA;AAC7D,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AAGA,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,KAAA,CAAM,mBAAA,CAAoB,iBAAiB,eAAe,CAAA;AAC1D,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,IAAA,CAAK,IAAI,0DAAqD,CAAA;AAC9D,QAAA,OAAA,EAAQ;AAAA,MACV,GAAG,GAAK,CAAA;AAER,MAAA,KAAA,CAAM,gBAAA,CAAiB,iBAAiB,eAAe,CAAA;AAAA,IACzD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,IAAA,EAA2C;AAC3D,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,oBAAoB,WAAA,EAAa;AAClF,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,eAAA,CAAgB,SAAA,EAAU;AAChD,IAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AAGnC,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,KAAM,SAAS,CAAA;AACnE,IAAA,IAAI,OAAO,OAAO,KAAA;AAGlB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,SAAS,CAAC,CAAA;AAC3E,IAAA,IAAI,SAAS,OAAO,OAAA;AAGpB,IAAA,IAAI,UAAU,QAAA,CAAS,GAAG,CAAA,IAAK,SAAA,CAAU,UAAU,CAAA,EAAG;AACpD,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,SAAS,CAAC,CAAA;AAC/E,MAAA,IAAI,WAAW,OAAO,SAAA;AAAA,IACxB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,UAAU,KAAA,EAAqC;AACrD,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,cAAA,EAAgB;AACpC,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAK,CAAA;AAAA,MACV,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAMR,YAAAA,EAAY,uBAAA,EAAyB,GAAG,CAAA;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EAEpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAO,IAAA,EAAuB;AACpC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,GAAG,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AACF;;;AC3ZA,IAAMA,YAAAA,GAAa,kBAAA;AAGnB,IAAM,gBAAA,GAAmB,GAAA;AAGzB,IAAM,cAAA,GAAiB,GAAA;AAGvB,IAAM,sBAAA,GAAyB,GAAA;AA6DxB,IAAM,gBAAN,MAAoB;AAAA;AAAA,EAER,UAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAGT,MAAA,GAAqB,MAAA;AAAA,EACrB,UAAA,GAAa,KAAA;AAAA;AAAA,EAGJ,IAAA;AAAA;AAAA,EAGT,aAAA,GAAqC,IAAA;AAAA,EACrC,YAAA,GAAmC,IAAA;AAAA,EACnC,IAAA,GAA2B,IAAA;AAAA,EAC3B,IAAA,GAA0D,IAAA;AAAA,EAC1D,IAAA,GAA4C,IAAA;AAAA;AAAA,EAG5C,cAAA,GAAoD,IAAA;AAAA,EACpD,iBAAA,GAAgD,IAAA;AAAA,EAChD,kBAAA,GAAqB,KAAA;AAAA;AAAA,EAGrB,iBAAgC,EAAC;AAAA,EACjC,kBAAA,GAA2D,IAAA;AAAA,EAC3D,kBAAA,GAAqB,KAAA;AAAA,EACrB,iBAAA,GAAoB,CAAA;AAAA,EACpB,kBAAA,uBAAqD,GAAA,EAAI;AAAA,EACzD,oBAAA,GAAqD,IAAA;AAAA;AAAA,EAGrD,YAAA,GAAkC,IAAA;AAAA;AAAA,EAGlC,gBAAA,GAA2C,IAAA;AAAA;AAAA,EAGlC,qBAAA,uBAAoF,GAAA,EAAI;AAAA,EACxF,oBAAA,uBAA0E,GAAA,EAAI;AAAA;AAAA,EAGvF,oBAAA,GAA4C,IAAA;AAAA,EAC5C,kBAAA,GAA0C,IAAA;AAAA,EAC1C,mBAAA,GAA2C,IAAA;AAAA,EAC3C,cAAA,GAAsC,IAAA;AAAA;AAAA;AAAA;AAAA,EAM9C,YAAY,OAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,SAAA;AAC1B,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,SAAA;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,KAAA,IAAS,KAAA;AAC/B,IAAA,IAAA,CAAK,OAAO,cAAA,CAAe,EAAE,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA;AAEjD,IAAA,IAAA,CAAK,KAAK,uBAAuB,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,KAAK,0CAAqC,CAAA;AAC/C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,IAAA,CAAK,KAAK,+CAA0C,CAAA;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,KAAK,qCAAgC,CAAA;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAK,iBAAiB,CAAA;AAG3B,IAAA,MAAM,iBAAA,GAAoB,KAAK,oBAAA,EAAqB;AACpD,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,MAAM,IAAI,mBAAA,CAAoB;AAAA,QAC5B,MAAM,UAAA,CAAW,oBAAA;AAAA,QACjB,OAAA,EAAS,iDAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,iBAAA,EAAkB;AAC3C,IAAA,IAAA,CAAK,IAAA,CAAK,mCAAA,EAAqC,IAAA,CAAK,aAAA,CAAc,UAAU,CAAA;AAG5E,IAAA,IAAA,CAAK,oBAAA,CAAqB,KAAK,aAAa,CAAA;AAG5C,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,OAAO,eAAe,CAAA;AAC9C,MAAA,MAAM,YAAY,SAAA,CAAU,SAAA;AAC5B,MAAA,IAAA,CAAK,OAAO,IAAI,SAAA,CAAU,EAAE,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA;AAChD,MAAA,MAAM,IAAA,CAAK,KAAK,IAAA,EAAK;AACrB,MAAA,IAAA,CAAK,KAAK,kBAAkB,CAAA;AAAA,IAC9B,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,mBAAA,CAAoB;AAAA,QAC5B,MAAM,UAAA,CAAW,mBAAA;AAAA,QACjB,OAAA,EACE,gEAAA;AAAA,QACF,UAAA,EACE,wEAAA;AAAA,QACF,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM;AAAA,OACrC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,KAAa,UAAA,EAAY;AAC3C,MAAA,IAAA,CAAK,IAAA,GAAO,IAAI,WAAA,CAAY;AAAA,QAC1B,MAAA,EAAQ,KAAK,UAAA,CAAW,MAAA;AAAA,QACxB,KAAA,EAAO,KAAK,UAAA,CAAW,KAAA;AAAA,QACvB,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,CAAW,QAAA,KAAa,YAAA,EAAc;AACpD,MAAA,IAAA,CAAK,IAAA,GAAO,IAAI,aAAA,CAAc;AAAA,QAC5B,MAAA,EAAQ,KAAK,UAAA,CAAW,MAAA;AAAA,QACxB,QAAA,EAAU,KAAK,UAAA,CAAW,QAAA;AAAA,QAC1B,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,IAAA,GAAO,IAAI,YAAA,CAAa;AAAA,QAC3B,QAAA,EAAU,KAAK,UAAA,CAAW,QAAA;AAAA,QAC1B,UAAA,EAAY,KAAK,UAAA,CAAW,UAAA;AAAA,QAC5B,cAAA,EAAgB,KAAK,UAAA,CAAW,cAAA;AAAA,QAChC,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,KAAa,YAAA,EAAc;AAC7C,MAAA,IAAA,CAAK,IAAA,GAAO,IAAI,aAAA,CAAc;AAAA,QAC5B,MAAA,EAAQ,KAAK,UAAA,CAAW,MAAA;AAAA,QACxB,OAAA,EAAS,KAAK,UAAA,CAAW,OAAA;AAAA,QACzB,SAAS,SAAA,IAAa,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,WAAW,OAAA,GAAU,MAAA;AAAA,QAClE,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,IAAA,GAAO,IAAI,YAAA,CAAa;AAAA,QAC3B,KAAA,EAAO,KAAK,UAAA,CAAW,KAAA;AAAA,QACvB,IAAA,EAAM,KAAK,UAAA,CAAW,IAAA;AAAA,QACtB,KAAA,EAAO,KAAK,UAAA,CAAW,KAAA;AAAA,QACvB,QAAA,EAAU,KAAK,UAAA,CAAW,QAAA;AAAA,QAC1B,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,KAAK,yBAAyB,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cAAA,GAAgC;AACpC,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAI,CAAC,KAAK,aAAA,IAAiB,CAAC,KAAK,IAAA,IAAQ,CAAC,KAAK,IAAA,EAAM;AACnD,MAAA,MAAM,IAAI,mBAAA,CAAoB;AAAA,QAC5B,MAAM,UAAA,CAAW,oBAAA;AAAA,QACjB,OAAA,EAAS,oDAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,KAAA,KAAU,WAAA,EAAa;AAC5C,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,cAAc,MAAA,EAAO;AAAA,MAClC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,YAAA,GAAe,MAAM,SAAA,CAAU,YAAA,CAAa,YAAA,CAAa;AAAA,QAC5D,KAAA,EAAO;AAAA,UACL,gBAAA,EAAkB,IAAA;AAAA,UAClB,gBAAA,EAAkB;AAAA;AACpB,OACD,CAAA;AACD,MAAA,IAAA,CAAK,KAAK,2BAA2B,CAAA;AAAA,IACvC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,eACJ,GAAA,YAAe,YAAA,KACd,IAAI,IAAA,KAAS,iBAAA,IAAqB,IAAI,IAAA,KAAS,uBAAA,CAAA;AAElD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB;AAAA,UAClC,MAAM,UAAA,CAAW,qBAAA;AAAA,UACjB,OAAA,EAAS,+CAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACb,CAAA;AACD,QAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AACtB,QAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AAC/B,QAAA,MAAM,OAAA;AAAA,MACR;AAEA,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,CAAgB;AAAA,QACrC,MAAM,UAAA,CAAW,0BAAA;AAAA,QACjB,OAAA,EAAS,iCAAA;AAAA,QACT,UAAA,EAAY,qCAAA;AAAA,QACZ,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM;AAAA,OACrC,CAAA;AACD,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AACtB,MAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA;AAClC,MAAA,MAAM,UAAA;AAAA,IACR;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,KAAK,OAAA,EAAQ;AACxB,MAAA,IAAA,CAAK,KAAK,eAAe,CAAA;AAAA,IAC3B,SAAS,IAAA,EAAM;AACb,MAAA,IAAA,CAAK,KAAK,qDAAgD,CAAA;AAC1D,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,gBAAA,EAAkB,EAAE,QAAQ,uBAAA,EAAyB,QAAA,EAAU,QAAQ,CAAA;AACtF,MAAA,IAAA,CAAK,cAAA,EAAe;AACpB,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AACtB,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,mBAAA,IAAsB;AAC3B,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,CAAC,KAAA,KAA8B;AAC/E,MAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,IAC9B,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAGtB,IAAA,IAAA,CAAK,oBAAA,IAAuB;AAC5B,IAAA,IAAA,CAAK,kBAAA,IAAqB;AAE1B,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,MAAM;AACxD,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAM;AACpD,MAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,IAC3B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AACjC,IAAA,IAAA,CAAK,KAAK,aAAa,CAAA;AAGvB,IAAA,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAA,GAAsB;AACpB,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,KAAK,iBAAiB,CAAA;AAC3B,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,MAAM,IAAA,EAAK;AAChB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AAC/B,MAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,iBAAA,CACJ,IAAA,EACA,SAAA,EACe;AACf,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,UAAU,YAAY,CAAA;AAG3B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,eAAA,EAAgB;AAC5C,IAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,CAAiB,MAAA;AAErC,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,UAAU,IAAI,CAAA;AAG/B,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAA,CAAK,KAAK,qDAAqD,CAAA;AAC/D,QAAA;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAA,CAAK,KAAK,6BAA6B,CAAA;AACvC,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,GAAG,CAAA;AACjC,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AACtB,MAAA;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,IAAA,EAAK,EAAG;AAC/B,MAAA,MAAM,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAM,IAAA,EAA6B;AACvC,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,MAAK,EAAG;AAGrC,IAAA,MAAM,cAAA,GAAiB,KAAK,IAAA,YAAgB,YAAA;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAS,CAAC,IAAA,CAAK,aAAA,IAAiB,CAAC,cAAA,EAAiB;AAC1D,MAAA,IAAA,CAAK,KAAK,uDAAkD,CAAA;AAC5D,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,gBAAA,EAAkB,EAAE,QAAQ,mBAAA,EAAqB,QAAA,EAAU,QAAQ,CAAA;AAClF,MAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAU,UAAU,CAAA;AAEzB,IAAA,IAAA,CAAK,YAAA,GAAe;AAAA,MAClB,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,MACzC,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,IAAA,CAAK,KAAK,IAAA,CAAK,iBAAA,EAAmB,EAAE,SAAA,EAAW,MAAM,CAAA;AAGrD,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa;AAC1B,QAAA,MAAM,IAAA,CAAK,KAAK,OAAA,EAAQ;AACxB,QAAA,IAAA,CAAK,KAAK,eAAe,CAAA;AAAA,MAC3B;AAAA,IACF,SAAS,IAAA,EAAM;AACb,MAAA,IAAA,CAAK,KAAK,qDAAgD,CAAA;AAC1D,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,gBAAA,EAAkB,EAAE,QAAQ,uBAAA,EAAyB,QAAA,EAAU,QAAQ,CAAA;AACtF,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,eAAA,EAAiB,EAAE,WAAW,IAAA,EAAM,UAAA,EAAY,GAAG,CAAA;AAClE,MAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAG1B,IAAA,IAAA,CAAK,cAAA,IAAiB;AACtB,IAAA,MAAM,YAAA,GAAe,KAAK,GAAA,EAAI;AAE9B,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,MAAA,IAAI,QAAA,GAAW,KAAA;AACf,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,IAAI,QAAA,EAAU;AACd,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,IAAA,CAAK,cAAA,IAAiB;AACtB,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAEtB,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,YAAA;AAChC,QAAA,IAAA,CAAK,KAAK,IAAA,CAAK,eAAA,EAAiB,EAAE,SAAA,EAAW,IAAA,EAAM,YAAY,CAAA;AAI/D,QAAA,IAAI,IAAA,CAAK,WAAW,UAAA,EAAY;AAC9B,UAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,QACvB;AACA,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AAEA,MAAA,IAAI,cAAA,EAAgB;AAGlB,QAAA,IAAA,CAAK,cAAA,GAAkB,KAAK,IAAA,CAAsB,OAAA;AAAA,UAChD,CAAC,KAAA,KAAkC;AACjC,YAAA,IAAI,MAAM,OAAA,EAAS;AACjB,cAAA,IAAA,EAAK;AAAA,YACP;AAAA,UACF;AAAA,SACF;AACA,QAAC,IAAA,CAAK,IAAA,CAAsB,KAAA,CAAM,IAAI,CAAA;AAAA,MACxC,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,cAAA,GAAkB,KAAK,IAAA,CAAuB,OAAA;AAAA,UACjD,CAAC,KAAA,KAAyB;AACxB,YAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,IAAI,CAAA;AAAA,UAClC;AAAA,SACF;AACA,QAAC,IAAA,CAAK,IAAA,CAAuB,KAAA,CAAM,IAAI,CAAA;AACvC,QAAC,IAAA,CAAK,KAAuB,KAAA,EAAM;AAAA,MACrC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,GAAqB;AACnB,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,KAAK,gCAA2B,CAAA;AAGrC,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,kBAAA,EAAoB;AAC1C,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,IAAA,CAAK,UAAA,EAAW;AAAA,MAClB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAC9B,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAG5B,IAAA,IAAI,IAAA,CAAK,uBAAuB,IAAA,EAAM;AACpC,MAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACpC,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AACA,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAG1B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,IAAA,CAAK,gBAAgB,YAAA,EAAc;AACrC,MAAA,IAAA,CAAK,KAAK,IAAA,EAAK;AAAA,IACjB,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,EAAM,WAAA,EAAa;AACjC,MAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,QAAA,EAAyE;AACrF,IAAA,IAAA,CAAK,qBAAA,CAAsB,IAAI,QAAQ,CAAA;AACvC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,QAAQ,CAAA;AAAA,IAC5C,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,QAAA,EAAgE;AAC3E,IAAA,IAAA,CAAK,oBAAA,CAAqB,IAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAA,CAAK,oBAAA,CAAqB,OAAO,QAAQ,CAAA;AAAA,IAC3C,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,UAAA,EAAY;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,KAAK,eAAe,CAAA;AAGzB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,aAAA,EAAc;AAGnB,IAAA,IAAA,CAAK,oBAAA,IAAuB;AAC5B,IAAA,IAAA,CAAK,kBAAA,IAAqB;AAC1B,IAAA,IAAA,CAAK,mBAAA,IAAsB;AAC3B,IAAA,IAAA,CAAK,cAAA,IAAiB;AACtB,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAC5B,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAGtB,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,KAAK,OAAA,EAAQ;AAAA,MAC1B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd;AAEA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAA,CAAK,KAAK,OAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd;AAEA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAA,CAAK,KAAK,OAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd;AAGA,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,MACjC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AAGA,IAAA,IAAA,CAAK,cAAA,EAAe;AAGpB,IAAA,IAAA,CAAK,sBAAsB,KAAA,EAAM;AACjC,IAAA,IAAA,CAAK,qBAAqB,KAAA,EAAM;AAChC,IAAA,IAAA,CAAK,KAAK,SAAA,EAAU;AAEpB,IAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAU,IAAA,EAAwB;AACxC,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA;AAClB,IAAA,IAAI,SAAS,IAAA,EAAM;AAEnB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,IAAA,EAAO,IAAI,CAAA,CAAE,CAAA;AAGrC,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,oBAAA,EAAsB,EAAE,MAAM,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA;AAG7D,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,qBAAA,EAAuB;AAC3C,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,MAAM,IAAI,CAAA;AAAA,MACf,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,8BAAA,EAAgC,GAAG,CAAA;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,oBAAA,GAAmD;AACzD,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACvC,MAAA,OAAO,YAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAO,UAAA,CAAW,kBAAA,KAAuB,WAAA,EAAa;AACxD,MAAA,OAAO,UAAA,CAAW,kBAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,qBAAqB,GAAA,EAAyB;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,IAAI,UAAU,CAAA;AACpD,MAAA,MAAM,MAAA,GAAS,IAAI,kBAAA,EAAmB;AACtC,MAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAI,WAAW,CAAA;AAC9B,MAAA,MAAA,CAAO,MAAM,CAAC,CAAA;AACd,MAAA,IAAA,CAAK,KAAK,yBAAyB,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI,CAAC,KAAK,aAAA,IAAiB,CAAC,KAAK,YAAA,IAAgB,CAAC,KAAK,IAAA,EAAM;AAE7D,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,aAAA,CAAc,uBAAA,CAAwB,KAAK,YAAY,CAAA;AAGlF,IAAA,MAAM,UAAA,GAAa,IAAA;AACnB,IAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK,aAAA,CAAc,qBAAA,CAAsB,UAAA,EAAY,GAAG,CAAC,CAAA;AAElF,IAAA,IAAA,CAAK,iBAAA,CAAkB,cAAA,GAAiB,CAAC,KAAA,KAAgC;AACvE,MAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,IAAsB,CAAC,KAAK,IAAA,EAAM;AAE5C,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,WAAA,CAAY,cAAA,CAAe,CAAC,CAAA;AAEpD,MAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAI,YAAA,CAAa,SAAS,CAAC,CAAA;AAAA,IACjD,CAAA;AAEA,IAAA,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,IAAA,CAAK,iBAAiB,CAAA;AAElD,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAC7D,IAAA,IAAA,CAAK,KAAK,6BAA6B,CAAA;AAAA,EACzC;AAAA;AAAA,EAGQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,kBAAkB,UAAA,EAAW;AAAA,MACpC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,kBAAkB,cAAA,GAAiB,IAAA;AACxC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AAEA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,eAAe,UAAA,EAAW;AAAA,MACjC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,YAAA,CAAa,SAAA,EAAU,EAAG;AACjD,QAAA,KAAA,CAAM,IAAA,EAAK;AAAA,MACb;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAA,GAA8B;AACpC,IAAA,IAAA,CAAK,IAAA,CAAK,mCAAA,EAAqC,IAAA,CAAK,MAAM,CAAA;AAE1D,IAAA,IAAI,IAAA,CAAK,WAAW,UAAA,EAAY;AAE9B,MAAA,IAAI,IAAA,CAAK,iBAAgB,EAAG;AAC1B,QAAA,IAAA,CAAK,KAAK,wCAAmC,CAAA;AAC7C,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,KAAK,mBAAmB,CAAA;AAC7B,MAAA,IAAA,CAAK,YAAA,EAAa;AAElB,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,MAAA,IAAA,CAAK,UAAU,WAAW,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AAE/B,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,MAAA,IAAA,CAAK,KAAK,iCAAiC,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAA,CAAK,IAAA,CAAK,iCAAA,EAAmC,IAAA,CAAK,MAAM,CAAA;AAExD,IAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AAE/B,MAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,MAAA,IAAA,CAAK,KAAK,iCAAiC,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,KAAA,EAAiC;AACzD,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,KAAA;AAE1B,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAK,EAAG;AAG3B,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,IAAA,CAAK,+CAA0C,IAAI,CAAA;AACxD,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,kBAAA,EAAoB;AAAA,MACjC,IAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAY,KAAA,CAAM;AAAA,KACnB,CAAA;AAED,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,oBAAA,EAAsB;AAC1C,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,MAAM,OAAO,CAAA;AAAA,MAClB,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,4BAAA,EAA8B,GAAG,CAAA;AAAA,MAC7D;AAAA,IACF;AAIA,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,MAAA,KAAW,WAAA,EAAa;AAC1C,MAAA,IAAA,CAAK,IAAA,CAAK,8BAA8B,IAAI,CAAA;AAC5C,MAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAAA,IAK5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,eAAA,CAAgB,OAAsB,MAAA,EAA0B;AACtE,IAAA,IAAI,IAAA,CAAK,WAAW,UAAA,EAAY;AAE9B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,KAAA,CAAM,eAAe,CAAA,EAAG;AAEjD,MAAA,IAAA,CAAK,mBAAmB,MAAM,CAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,KAAA,CAAM,UAAA,KAAe,CAAA,EAAG;AAGlC,IAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAEpC,IAAA,IAAI,CAAC,KAAK,kBAAA,EAAoB;AAE5B,MAAA,IAAI,IAAA,CAAK,uBAAuB,IAAA,EAAM;AACpC,QAAA,IAAA,CAAK,kBAAA,GAAqB,WAAW,MAAM;AACzC,UAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,UAAA,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,OAAA,GAAU,MAAA,GAAS,MAAS,CAAA;AAAA,QACxD,GAAG,gBAAgB,CAAA;AAAA,MACrB;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,mBAAmB,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,OAAA,GAAU,SAAS,MAAS,CAAA;AAAA,IACzE;AAEA,IAAA,IAAI,MAAM,OAAA,EAAS;AAEjB,MAAA,IAAI,IAAA,CAAK,uBAAuB,IAAA,EAAM;AACpC,QAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACpC,QAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,QAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,mBAAmB,MAAA,EAA0B;AACnD,IAAA,IAAI,IAAA,CAAK,uBAAuB,IAAA,EAAM;AACpC,MAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACpC,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,IAC5B,CAAA,MAAO;AAEL,MAAA,MAAA,EAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,MAAA,EAA2B;AAChD,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAE3B,MAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAClC,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA;AAC9C,QAAA,MAAMU,QAAAA,GAAU,UAAU,MAAA,GAAS,CAAA;AACnC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,UAAA,IAAA,CAAK,kBAAA;AAAA,YACH,UAAU,CAAC,CAAA;AAAA,YACX,CAAA,KAAMA,WAAU,MAAA,GAAS;AAAA,WAC3B;AAAA,QACF;AAAA,MACF,WAAW,MAAA,EAAQ;AAEjB,QAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,UAAA,MAAM,WAAA,GAAc,KAAK,oBAAA,CAAqB,OAAA;AAC9C,UAAA,IAAA,CAAK,oBAAA,CAAqB,UAAU,MAAM;AACxC,YAAA,IAAI,OAAO,gBAAgB,UAAA,EAAY;AACrC,cAAA,WAAA,CAAY,KAAK,IAAA,CAAK,oBAAA,EAAuB,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,YACjE;AACA,YAAA,MAAA,EAAO;AAAA,UACT,CAAA;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAA,EAAO;AAAA,QACT;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAEzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,OAAO,MAAA,GAAS,CAAA;AAEhC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,IAAA,CAAK,kBAAA;AAAA,QACH,OAAO,CAAC,CAAA;AAAA,QACR,CAAA,KAAM,UAAU,MAAA,GAAS;AAAA,OAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAA,CAAmB,WAAwB,MAAA,EAA2B;AAK5E,IAAA,IAAI,YAAA,GAAe,KAAA;AACnB,IAAA,MAAM,UAAA,GAAa,SACf,MAAM;AACJ,MAAA,IAAI,YAAA,EAAc;AAClB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,MAAA,EAAO;AAAA,IACT,CAAA,GACA,MAAA;AAEJ,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,WAAW,UAAA,EAAY;AACrD,MAAA,UAAA,IAAa;AACb,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AAGjB,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA;AAE9B,IAAA,GAAA,CAAI,eAAA;AAAA,MACF,IAAA;AAAA,MACA,CAAC,aAAA,KAAkB;AACjB,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,UAAA,IAAc,CAAC,KAAK,aAAA,EAAe;AACrD,UAAA,UAAA,IAAa;AACb,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,IAAI,kBAAA,EAAmB;AACtC,QAAA,MAAA,CAAO,MAAA,GAAS,aAAA;AAChB,QAAA,MAAA,CAAO,OAAA,CAAQ,IAAI,WAAW,CAAA;AAG9B,QAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,MAAM,CAAA;AAClC,QAAA,IAAA,CAAK,oBAAA,GAAuB,MAAA;AAE5B,QAAA,MAAA,CAAO,UAAU,MAAM;AACrB,UAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,MAAM,CAAA;AACrC,UAAA,IAAI,IAAA,CAAK,yBAAyB,MAAA,EAAQ;AACxC,YAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAAA,UAC9B;AAGA,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,UAAA,EAAW;AAAA,UACb;AAAA,QACF,CAAA;AAGA,QAAA,MAAM,MAAM,GAAA,CAAI,WAAA;AAChB,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,iBAAiB,CAAA;AACtD,QAAA,MAAA,CAAO,MAAM,SAAS,CAAA;AACtB,QAAA,IAAA,CAAK,iBAAA,GAAoB,YAAY,aAAA,CAAc,QAAA;AAEnD,QAAA,IAAA,CAAK,IAAA;AAAA,UACH,wBAAA;AAAA,UACA,aAAA,CAAc,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AAAA,UACpC,IAAA;AAAA,UACA,SAAA,CAAU,QAAQ,CAAC;AAAA,SACrB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,GAAA,KAAQ;AACP,QAAA,IAAA,CAAK,IAAA,CAAK,iCAAiC,GAAG,CAAA;AAC9C,QAAA,UAAA,IAAa;AAAA,MACf;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,eAAA,GAA2B;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,KAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,YAAA,CAAa,SAAA;AAI/C,IAAA,OAAO,OAAA,GAAU,cAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBAAkB,UAAA,EAA6B;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,KAAA;AAE/B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,YAAA,CAAa,SAAA;AAC/C,IAAA,IAAI,OAAA,GAAU,gBAAgB,OAAO,KAAA;AAErC,IAAA,MAAM,kBAAkB,IAAI,GAAA,CAAI,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAC,CAAA;AAChE,IAAA,MAAM,QAAA,GAAW,KAAK,YAAA,CAAa,KAAA;AAEnC,IAAA,IAAI,gBAAgB,IAAA,KAAS,CAAA,IAAK,QAAA,CAAS,IAAA,KAAS,GAAG,OAAO,KAAA;AAG9D,IAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,IAAA,KAAA,MAAW,QAAQ,eAAA,EAAiB;AAClC,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,QAAA,iBAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,eAAA,CAAgB,IAAA,EAAM,SAAS,IAAI,CAAA;AAC5D,IAAA,MAAM,UAAU,iBAAA,GAAoB,OAAA;AAEpC,IAAA,IAAA,CAAK,IAAA;AAAA,MACH,uBAAA;AAAA,MAAA,CACC,OAAA,GAAU,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAA;AAAA,MAC7B,aAAA;AAAA,MAAA,CACC,sBAAA,GAAyB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,GAAI;AAAA,KAC9C;AAEA,IAAA,OAAO,OAAA,IAAW,sBAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,IAAA,EAAwB;AAC9C,IAAA,OAAO,IAAA,CACJ,WAAA,EAAY,CACZ,OAAA,CAAQ,YAAY,EAAE,CAAA,CACtB,KAAA,CAAM,KAAK,EACX,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAMQ,QAAQ,IAAA,EAAuB;AACrC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,KAAA,CAAMV,YAAAA,EAAY,GAAG,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AACF;;;ACnnCA,IAAMA,YAAAA,GAAa,mBAAA;AACnB,IAAM,qBAAA,GAAwB,oBAAA;AAC9B,IAAM,uBAAA,GAA0B,SAAA;AAChC,IAAM,0BAAA,GAA6B,GAAA;AACnC,IAAM,yBAAA,GAA4B,CAAA;AAClC,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,kBAAA,GAAqB,CAAA;AAC3B,IAAM,cAAA,GAAiB,EAAA;AACvB,IAAM,eAAA,GAAkB,MAAA;AACxB,IAAM,eAAA,GAAkB,MAAA;AAyCxB,SAAS,uBAAuB,OAAA,EAA6B;AAC3D,EAAA,IAAI,OAAO,gBAAA,KAAqB,WAAA,EAAa,OAAO,EAAC;AAErD,EAAA,MAAM,YAAuB,EAAC;AAC9B,EAAA,IAAI,SAAS,OAAA,CAAQ,aAAA;AACrB,EAAA,OAAO,MAAA,EAAQ;AACb,IAAA,MAAM,KAAA,GAAQ,iBAAiB,MAAM,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,YAAY,KAAA,CAAM,SAAA;AAC1D,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,EAAG;AAClC,MAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,IACvB;AACA,IAAA,MAAA,GAAS,MAAA,CAAO,aAAA;AAAA,EAClB;AACA,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,oBAAA,GAAgC;AACvC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAC/D;AAMO,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAET,YAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,KAAA;AAAA;AAAA,EAGT,SAAA,GAAmC,IAAA;AAAA,EACnC,WAAA,GAAqC,IAAA;AAAA,EACrC,SAAA,GAAmC,IAAA;AAAA,EACnC,YAAA,GAAsC,IAAA;AAAA;AAAA,EAGtC,MAAA,GAAyB;AAAA,IAC/B,QAAA,EAAU,KAAA;AAAA,IACV,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW,IAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGQ,cAAA,GAAwC,IAAA;AAAA,EACxC,yBAA4C,EAAC;AAAA,EAC7C,oBAAA,GAAuC,IAAA;AAAA;AAAA,EAGvC,iBAA2B,EAAC;AAAA,EAC5B,eAAA,GAAkB,EAAA;AAAA,EAClB,QAAA,GAA8B,QAAA;AAAA,EAC9B,aAAA,GAAsD,IAAA;AAAA,EACtD,uBAAA,GAA0B,KAAA;AAAA;AAAA,EAG1B,2BAAmE,EAAC;AAAA,EACpE,oBAAqF,EAAC;AAAA;AAAA,EAGtF,UAAA,GAAgC,IAAA;AAAA;AAAA,EAGhC,SAAA,GAAY,KAAA;AAAA,EAEpB,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,YAAA,GAAe,SAAS,YAAA,IAAgB,qBAAA;AAC7C,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAS,cAAA,IAAkB,uBAAA;AACjD,IAAA,IAAA,CAAK,iBAAA,GAAoB,SAAS,iBAAA,IAAqB,0BAAA;AACvD,IAAA,IAAA,CAAK,gBAAA,GAAmB,SAAS,gBAAA,IAAoB,yBAAA;AACrD,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,KAAA;AAE/B,IAAA,IAAA,CAAK,IAAI,aAAA,EAAe;AAAA,MACtB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,mBAAmB,IAAA,CAAK,iBAAA;AAAA,MACxB,kBAAkB,IAAA,CAAK;AAAA,KACxB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAU,MAAA,EAKE;AACV,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,KAAA;AAC5C,IAAA,IAAI,IAAA,CAAK,WAAW,OAAO,KAAA;AAE3B,IAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,UAAS,GAAI,MAAA;AAGnD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,QAAQ,CAAA;AACrD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAA,CAAK,GAAA,CAAI,0BAAA,EAA4B,EAAE,SAAA,EAAW,UAAU,CAAA;AAC5D,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,IAAA,CAAK,uBAAA,CAAwB,MAAM,CAAA;AAGxE,IAAA,IAAA,CAAK,6BAAA,EAA8B;AAGnC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,QAAA,EAAU,IAAA;AAAA,MACV,QAAA,EAAU,gBAAA;AAAA,MACV,WAAW,SAAA,IAAa,IAAA;AAAA,MACxB,SAAS,OAAA,IAAW;AAAA,KACtB;AAEA,IAAA,IAAA,CAAK,oBAAA,GAAuB,MAAA;AAG5B,IAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,KAAK,MAAA,GAAS,CAAA;AAEhD,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,MAAA,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAC3B,MAAA,IAAA,CAAK,WAAA,EAAY;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAI,6CAA6C,CAAA;AAAA,IACxD;AAGA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,OAAA,EAAS,QAAA,IAAY,MAAM,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAGA,IAAA,IAAA,CAAK,sBAAsB,MAAM,CAAA;AAGjC,IAAA,MAAM,QAAQ,SAAA,IAAa,gBAAA;AAC3B,IAAA,IAAA,CAAK,QAAA,CAAS,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAE,CAAA;AAGrC,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAE3B,IAAA,IAAA,CAAK,IAAI,qBAAA,EAAuB,EAAE,WAAW,QAAA,EAAU,gBAAA,EAAkB,SAAS,CAAA;AAClF,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAAyB;AACvB,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,IAAA,IAAA,CAAK,6BAAA,EAA8B;AACnC,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAE3B,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAE5B,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,QAAA,EAAU,KAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,IAAI,qBAAqB,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,WAAmB,MAAA,EAAuB;AACxD,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,MAAS,CAAA;AACtD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAA,CAAK,GAAA,CAAI,oCAAA,EAAsC,EAAE,SAAA,EAAW,CAAA;AAC5D,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,QAAQ,MAAM,CAAA;AACnC,IAAA,IAAA,CAAK,GAAA,CAAI,qBAAA,EAAuB,EAAE,SAAA,EAAW,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAiB,UAAkB,MAAA,EAAuB;AACxD,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,QAAA,CAAS,cAAc,QAAQ,CAAA;AAAA,IAC1C,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,GAAA,CAAI,oCAAA,EAAsC,EAAE,QAAA,EAAU,CAAA;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAA,CAAK,GAAA,CAAI,qCAAA,EAAuC,EAAE,QAAA,EAAU,CAAA;AAC5D,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,QAAQ,MAAM,CAAA;AACnC,IAAA,IAAA,CAAK,GAAA,CAAI,sBAAA,EAAwB,EAAE,QAAA,EAAU,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,UAAA,EAAsB,IAAA,GAA0B,QAAA,EAAgB;AACxE,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAG7B,IAAA,IAAA,CAAK,QAAA,EAAS;AAEd,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAC,GAAG,UAAU,CAAA;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,eAAA,GAAkB,EAAA;AACvB,IAAA,IAAA,CAAK,uBAAA,GAA0B,KAAA;AAE/B,IAAA,IAAA,CAAK,IAAI,cAAA,EAAgB,EAAE,OAAO,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AAG3D,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AAGtC,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,MAAM,QAAA,GAAW,KAAK,eAAA,GAAkB,CAAA;AACxC,IAAA,IAAI,QAAA,IAAY,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ;AAE1C,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAA;AACvB,IAAA,IAAA,CAAK,uBAAA,GAA0B,KAAA;AAE/B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AACtC,IAAA,IAAI,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAG/B,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,IAAA,CAAK,eAAA,IAAmB,CAAA;AACxB,IAAA,IAAA,CAAK,uBAAA,GAA0B,KAAA;AAE/B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,CAAA;AAE/C,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,IAAA,CAAK,eAAA,GAAkB,EAAA;AACvB,IAAA,IAAA,CAAK,uBAAA,GAA0B,KAAA;AAE/B,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAEtB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,IAAI,cAAc,CAAA;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAA,GAAwB;AAC1B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAqE;AACvE,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA;AAAA,MACR,MAAM,IAAA,CAAK,eAAA;AAAA,MACX,KAAA,EAAO,KAAK,cAAA,CAAe;AAAA,KAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,QAAA,EAAuD;AACvE,IAAA,IAAA,CAAK,wBAAA,CAAyB,KAAK,QAAQ,CAAA;AAC3C,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,wBAAA,CAAyB,OAAA,CAAQ,QAAQ,CAAA;AAC1D,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,IAAA,CAAK,wBAAA,CAAyB,MAAA,CAAO,GAAA,EAAK,CAAC,CAAA;AAAA,MAC7C;AAAA,IACF,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,QAAA,EAAgF;AACzF,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,QAAQ,CAAA;AACpC,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,QAAQ,CAAA;AACnD,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,GAAA,EAAK,CAAC,CAAA;AAAA,MACtC;AAAA,IACF,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,6BAAA,EAA8B;AAGnC,IAAA,IAAI,IAAA,CAAK,WAAW,UAAA,EAAY;AAC9B,MAAA,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA;AAAA,IACtD;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAGjB,IAAA,IAAI,IAAA,CAAK,aAAa,UAAA,EAAY;AAChC,MAAA,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,WAAW,CAAA;AAAA,IAC1D;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAGnB,IAAA,IAAA,CAAK,aAAA,EAAc;AAGnB,IAAA,IAAI,IAAA,CAAK,cAAc,UAAA,EAAY;AACjC,MAAA,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,YAAY,CAAA;AAAA,IAC5D;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAGpB,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,eAAe,UAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAGA,IAAA,IAAA,CAAK,2BAA2B,EAAC;AACjC,IAAA,IAAA,CAAK,oBAAoB,EAAC;AAE1B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAElB,IAAA,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,aAAA,CAAc,WAAoB,QAAA,EAAmC;AAC3E,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAG5C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC1C,QAAA,IAAI,IAAI,OAAO,EAAA;AAAA,MACjB,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,EAAE,QAAA,EAAU,CAAA;AAAA,MAC3C;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,EAAW;AAEb,MAAA,MAAM,UAAA,GAAa;AAAA,QACjB,0BAA0B,SAAS,CAAA,EAAA,CAAA;AAAA,QACnC,CAAA,CAAA,EAAI,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAAA,QACzB,gBAAgB,SAAS,CAAA,EAAA;AAAA,OAC3B;AAEA,MAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC1C,UAAA,IAAI,IAAI,OAAO,EAAA;AAAA,QACjB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,QAAA,IAAA,CAAK,aAAa,IAAI,UAAA,CAAW,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,MACxD;AACA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK;AACnC,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AAC7D,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAA;AAClD,UAAA,IAAI,IAAI,OAAO,EAAA;AAAA,QACjB,CAAA,CAAA,MAAQ;AACN,UAAA,IAAA,CAAK,IAAI,6BAAA,EAA+B,EAAE,QAAA,EAAU,OAAA,CAAQ,UAAU,CAAA;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,wBAAwB,EAAA,EAAqB;AACnD,IAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,YAAA,CAAa,sBAAsB,CAAA;AAC7D,IAAA,IAAI,cAAA,EAAgB,OAAO,CAAA,uBAAA,EAA0B,cAAc,CAAA,EAAA,CAAA;AAEnE,IAAA,MAAM,KAAK,EAAA,CAAG,EAAA;AACd,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAC7B,QAAA,IAAI,SAAS,gBAAA,CAAiB,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA,CAAE,WAAW,CAAA,EAAG;AACzD,UAAA,OAAO,IAAI,OAAO,CAAA,CAAA;AAAA,QACpB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA;AAC5C,IAAA,IAAI,MAAA,EAAQ,OAAO,CAAA,cAAA,EAAiB,MAAM,CAAA,EAAA,CAAA;AAE1C,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA;AAC9C,IAAA,IAAI,SAAA,EAAW,OAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,EAAA,CAAA;AAG/C,IAAA,OAAO,IAAA,CAAK,oBAAoB,EAAE,CAAA;AAAA,EACpC;AAAA,EAEQ,oBAAoB,EAAA,EAAqB;AAC/C,IAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,EAAA;AAE5C,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,OAAA,GAA0B,EAAA;AAE9B,IAAA,OAAO,OAAA,IAAW,OAAA,KAAY,QAAA,CAAS,eAAA,EAAiB;AACtD,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAExC,MAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,GAAA,KAAQ,MAAA,EAAQ;AACpC,QAAA,KAAA,CAAM,QAAQ,GAAG,CAAA;AACjB,QAAA,OAAA,GAAU,OAAA,CAAQ,aAAA;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAS,OAAA,CAAQ,aAAA;AACvB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAA;AAAA,UAC3C,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,OAAA,CAAS;AAAA,SAChC;AACA,QAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,GAAI,CAAA;AAC1C,UAAA,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAA,WAAA,EAAc,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,QACnB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,MACnB;AAEA,MAAA,OAAA,GAAU,MAAA;AAAA,IACZ;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,IAAI,KAAK,SAAA,EAAW;AAEpB,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,OAAA,CAAQ,YAAA,CAAa,eAAe,MAAM,CAAA;AAC1C,IAAA,OAAA,CAAQ,YAAA,CAAa,yBAAyB,MAAM,CAAA;AACpD,IAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA,MACtB,iBAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAY,eAAe,CAAA,CAAA;AAAA,MAC3B,sBAAA;AAAA,MACA,YAAA;AAAA,MACA,CAAA,oBAAA,EAAuB,IAAA,CAAK,qBAAA,EAAuB,CAAA,WAAA;AAAA,KACrD,CAAE,KAAK,IAAI,CAAA;AAEX,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACjC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,IAAI,KAAK,WAAA,EAAa;AAEtB,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,SAAA,CAAU,YAAA,CAAa,eAAe,MAAM,CAAA;AAC5C,IAAA,SAAA,CAAU,YAAA,CAAa,2BAA2B,MAAM,CAAA;AAExD,IAAA,MAAM,kBAAA,GAAqB,KAAK,qBAAA,EAAsB;AACtD,IAAA,SAAA,CAAU,MAAM,OAAA,GAAU;AAAA,MACxB,iBAAA;AAAA,MACA,YAAY,eAAe,CAAA,CAAA;AAAA,MAC3B,sBAAA;AAAA,MACA,oBAAA;AAAA,MACA,CAAA,kBAAA,EAAqB,KAAK,cAAc,CAAA,CAAA;AAAA,MACxC,CAAA,yBAAA,EAA4B,KAAK,YAAY,CAAA,CAAA;AAAA,MAC7C,iCAAA;AAAA,MACA,YAAA;AAAA,MACA,yBAAyB,kBAAkB,CAAA,qBAAA,EAAwB,kBAAkB,CAAA,mBAAA,EAAsB,kBAAkB,uBAAuB,kBAAkB,CAAA,WAAA;AAAA,KACxK,CAAE,KAAK,IAAI,CAAA;AAEX,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,SAAS,CAAA;AACnC,IAAA,IAAA,CAAK,WAAA,GAAc,SAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,IAAA,EAAqB;AAC7C,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAEvB,IAAA,MAAM,MAAM,IAAA,CAAK,gBAAA;AACjB,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,GAAO,GAAA;AACzB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,GAAM,GAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,GAAQ,GAAA,GAAM,CAAA;AACjC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,GAAA,GAAM,CAAA;AAEnC,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACrC,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AACnC,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACvC,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAGrC,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,KAAK,KAAK,SAAA,CAAU,YAAA;AACpB,MAAA,IAAA,CAAK,SAAA,CAAU,MAAM,OAAA,GAAU,GAAA;AAAA,IACjC;AACA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,KAAK,KAAK,WAAA,CAAY,YAAA;AACtB,MAAA,IAAA,CAAK,WAAA,CAAY,MAAM,OAAA,GAAU,GAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,SAAA,CAAU,MAAM,OAAA,GAAU,GAAA;AAAA,IACjC;AACA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,WAAA,CAAY,MAAM,OAAA,GAAU,GAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,WAAA,CACN,MAAA,EACA,IAAA,EACA,YAAA,EACM;AACN,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAGrC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,MAAA,OAAA,CAAQ,YAAA,CAAa,QAAQ,SAAS,CAAA;AACtC,MAAA,OAAA,CAAQ,YAAA,CAAa,yBAAyB,MAAM,CAAA;AAEpD,MAAA,MAAM,kBAAA,GAAqB,KAAK,qBAAA,EAAsB;AACtD,MAAA,OAAA,CAAQ,MAAM,OAAA,GAAU;AAAA,QACtB,iBAAA;AAAA,QACA,YAAY,eAAe,CAAA,CAAA;AAAA,QAC3B,sBAAA;AAAA,QACA,qBAAA;AAAA,QACA,gBAAA;AAAA,QACA,oBAAA;AAAA,QACA,oBAAA;AAAA,QACA,iBAAA;AAAA,QACA,kBAAA;AAAA,QACA,kBAAA;AAAA,QACA,4CAAA;AAAA,QACA,YAAA;AAAA,QACA,uBAAuB,kBAAkB,CAAA,WAAA,CAAA;AAAA,QACzC;AAAA,OACF,CAAE,KAAK,IAAI,CAAA;AAEX,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACjC,MAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AAAA,IACnB;AAGA,IAAA,IAAA,CAAK,UAAU,WAAA,GAAc,IAAA;AAG7B,IAAA,IAAI,KAAK,cAAA,CAAe,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAC/D,MAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,CAAK,eAAA,GAAkB,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,eAAe,MAAM,CAAA,CAAA;AAClF,MAAA,IAAA,CAAK,SAAA,CAAU,WAAA,GAAc,CAAA,EAAG,QAAQ,KAAK,IAAI,CAAA,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,SAAA,GAAY,mBAAA,GAAsB,IAAA,CAAK,GAAA,EAAI;AACjD,IAAA,IAAA,CAAK,UAAU,EAAA,GAAK,SAAA;AACpB,IAAA,IAAI,kBAAkB,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,YAAA,CAAa,oBAAoB,SAAS,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,IAAA,MAAM,WAAW,YAAA,KAAiB,MAAA,GAC9B,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA,GAC7B,YAAA;AAEJ,IAAA,IAAA,CAAK,eAAA,CAAgB,MAAM,QAAQ,CAAA;AAGnC,IAAA,KAAK,KAAK,SAAA,CAAU,YAAA;AACpB,IAAA,IAAA,CAAK,SAAA,CAAU,MAAM,OAAA,GAAU,GAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,WAAW,UAAA,EAAY;AAC9B,MAAA,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA;AAAA,IACtD;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAA,GAA8B;AACpC,IAAA,IAAI,IAAA,CAAK,gCAAgC,WAAA,EAAa;AACpD,MAAA,IAAA,CAAK,oBAAA,CAAqB,gBAAgB,kBAAkB,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB,IAAA,EAAgC;AAC1D,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,QAAA;AAE1C,IAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA;AAC9B,IAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA;AAE7B,IAAA,MAAM,UAAA,GAAa,iBAAiB,IAAA,CAAK,MAAA;AACzC,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA;AACxB,IAAA,MAAM,UAAA,GAAa,gBAAgB,IAAA,CAAK,KAAA;AACxC,IAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AAEvB,IAAA,MAAM,QAAA,GAAW,EAAA;AAGjB,IAAA,IAAI,UAAA,IAAc,UAAU,OAAO,QAAA;AAEnC,IAAA,IAAI,UAAA,IAAc,UAAU,OAAO,KAAA;AAEnC,IAAA,IAAI,UAAA,IAAc,UAAU,OAAO,OAAA;AAEnC,IAAA,IAAI,SAAA,IAAa,UAAU,OAAO,MAAA;AAGlC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,CAAgB,MAAe,QAAA,EAAiC;AACtE,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,OAAO,WAAW,WAAA,EAAa;AAEtD,IAAA,MAAM,MAAM,IAAA,CAAK,gBAAA;AACjB,IAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA;AAC7B,IAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA;AAG9B,IAAA,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,GAAO,KAAA;AAC5B,IAAA,IAAA,CAAK,SAAA,CAAU,MAAM,GAAA,GAAM,KAAA;AAC3B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,qBAAA,EAAsB;AACzD,IAAA,MAAM,KAAK,WAAA,CAAY,KAAA;AACvB,IAAA,MAAM,KAAK,WAAA,CAAY,MAAA;AAEvB,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,GAAA,GAAM,CAAA;AAEV,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,QAAA;AACH,QAAA,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,IAAI,EAAA,GAAK,CAAA;AACzC,QAAA,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,GAAA,GAAM,kBAAA,GAAqB,cAAA;AAC/C,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,IAAI,EAAA,GAAK,CAAA;AACzC,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,EAAA,GAAK,kBAAA,GAAqB,cAAA;AACjD,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,GAAA,GAAM,kBAAA,GAAqB,cAAA;AAC/C,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,IAAI,EAAA,GAAK,CAAA;AACxC,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,GAAA,GAAM,EAAA,GAAK,kBAAA,GAAqB,cAAA;AACnD,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,IAAI,EAAA,GAAK,CAAA;AACxC,QAAA;AAAA;AAIJ,IAAA,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,EAAM,aAAA,GAAgB,EAAA,GAAK,CAAC,CAAC,CAAA;AACzD,IAAA,GAAA,GAAM,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAK,cAAA,GAAiB,EAAA,GAAK,CAAC,CAAC,CAAA;AAExD,IAAA,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACnC,IAAA,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAGjC,IAAA,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,wBAAA,EAA0B,QAAQ,CAAA;AAI9D,IAAA,IAAA,CAAK,iBAAA,CAAkB,UAAU,IAAI,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,CAAkB,UAA2B,UAAA,EAA2B;AAC9E,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AAGrB,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,uBAAuB,CAAA;AAC1E,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,MAAA,EAAO;AAAA,IACvB;AAEA,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,KAAA,CAAM,YAAA,CAAa,uBAAuB,MAAM,CAAA;AAChD,IAAA,KAAA,CAAM,YAAA,CAAa,eAAe,MAAM,CAAA;AAExC,IAAA,MAAM,IAAA,GAAO,kBAAA;AACb,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,oBAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,QAAA;AACH,QAAA,KAAA,CAAM,MAAM,OAAA,GAAU;AAAA,UACpB,GAAG,SAAA;AAAA,UACH,CAAA,gBAAA,EAAmB,IAAI,CAAA,GAAA,EAAM,IAAI,MAAM,IAAI,CAAA,EAAA,CAAA;AAAA,UAC3C,CAAA,yDAAA,CAAA;AAAA,UACA,SAAS,IAAI,CAAA,EAAA,CAAA;AAAA,UACb,CAAA,SAAA,CAAA;AAAA,UACA,iBAAiB,IAAI,CAAA,EAAA;AAAA,SACvB,CAAE,KAAK,IAAI,CAAA;AAEX,QAAA,IAAA,CAAK,qBAAA,CAAsB,KAAA,EAAO,UAAA,EAAY,IAAI,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,KAAA,CAAM,MAAM,OAAA,GAAU;AAAA,UACpB,GAAG,SAAA;AAAA,UACH,CAAA,cAAA,EAAiB,IAAI,CAAA,GAAA,EAAM,IAAI,QAAQ,IAAI,CAAA,EAAA,CAAA;AAAA,UAC3C,CAAA,yDAAA,CAAA;AAAA,UACA,YAAY,IAAI,CAAA,EAAA,CAAA;AAAA,UAChB,CAAA,SAAA,CAAA;AAAA,UACA,iBAAiB,IAAI,CAAA,EAAA;AAAA,SACvB,CAAE,KAAK,IAAI,CAAA;AACX,QAAA,IAAA,CAAK,qBAAA,CAAsB,KAAA,EAAO,UAAA,EAAY,IAAI,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,KAAA,CAAM,MAAM,OAAA,GAAU;AAAA,UACpB,GAAG,SAAA;AAAA,UACH,CAAA,cAAA,EAAiB,IAAI,CAAA,GAAA,EAAM,IAAI,MAAM,IAAI,CAAA,IAAA,CAAA;AAAA,UACzC,CAAA,yDAAA,CAAA;AAAA,UACA,UAAU,IAAI,CAAA,EAAA,CAAA;AAAA,UACd,CAAA,QAAA,CAAA;AAAA,UACA,gBAAgB,IAAI,CAAA,EAAA;AAAA,SACtB,CAAE,KAAK,IAAI,CAAA;AACX,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,KAAA,CAAM,MAAM,OAAA,GAAU;AAAA,UACpB,GAAG,SAAA;AAAA,UACH,CAAA,cAAA,EAAiB,IAAI,CAAA,KAAA,EAAQ,IAAI,MAAM,IAAI,CAAA,EAAA,CAAA;AAAA,UAC3C,CAAA,yDAAA,CAAA;AAAA,UACA,WAAW,IAAI,CAAA,EAAA,CAAA;AAAA,UACf,CAAA,QAAA,CAAA;AAAA,UACA,gBAAgB,IAAI,CAAA,EAAA;AAAA,SACtB,CAAE,KAAK,IAAI,CAAA;AACX,QAAA;AAAA;AAGJ,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,KAAK,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAA,CAAsB,KAAA,EAAuB,UAAA,EAAqB,IAAA,EAAoB;AAC5F,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AAErB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,qBAAA,EAAsB;AACzD,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,IAAA,GAAO,UAAA,CAAW,KAAA,GAAQ,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,eAAe,WAAA,CAAY,IAAA;AAG7C,IAAA,MAAM,UAAU,IAAA,GAAO,CAAA;AACvB,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,GAAQ,IAAA,GAAO,CAAA;AAC3C,IAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,OAAA,EAAS,KAAK,GAAA,CAAI,SAAA,EAAW,OAAO,CAAC,CAAA;AAElE,IAAA,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,WAAW,CAAA,EAAA,CAAA;AACjC,IAAA,KAAA,CAAM,MAAM,UAAA,GAAa,CAAA,CAAA,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,sBAAsB,MAAA,EAAuB;AACnD,IAAA,IAAA,CAAK,6BAAA,EAA8B;AAGnC,IAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AACzC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe,MAAM;AAC7C,QAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,MACvB,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,cAAA,CAAe,QAAQ,MAAM,CAAA;AAElC,MAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,QAAA,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,MAC3C;AAAA,IACF;AAGA,IAAA,MAAM,mBAAA,GAAsB,uBAAuB,MAAM,CAAA;AAEzD,IAAA,MAAM,eAAe,MAAY;AAC/B,MAAA,IAAA,CAAK,eAAA,EAAgB;AAGrB,MAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,IAAU,CAAC,KAAK,uBAAA,EAAyB;AAC7D,QAAA,IAAA,CAAK,uBAAA,GAA0B,IAAA;AAC/B,QAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,QAAA,IAAA,CAAK,aAAA,GAAgB,WAAW,MAAM;AACpC,UAAA,IAAA,CAAK,uBAAA,GAA0B,KAAA;AAC/B,UAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,QAC3B,GAAG,qBAAqB,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA;AAGA,IAAA,KAAA,MAAW,YAAY,mBAAA,EAAqB;AAC1C,MAAA,QAAA,CAAS,iBAAiB,QAAA,EAAU,YAAA,EAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AACnE,MAAA,IAAA,CAAK,sBAAA,CAAuB,KAAK,MAAM;AACrC,QAAA,QAAA,CAAS,mBAAA,CAAoB,UAAU,YAAY,CAAA;AAAA,MACrD,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,YAAA,EAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AACjE,MAAA,IAAA,CAAK,sBAAA,CAAuB,KAAK,MAAM;AACrC,QAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,YAAY,CAAA;AAAA,MACnD,CAAC,CAAA;AAGD,MAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,YAAA,EAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AACjE,MAAA,IAAA,CAAK,sBAAA,CAAuB,KAAK,MAAM;AACrC,QAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,YAAY,CAAA;AAAA,MACnD,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,6BAAA,GAAsC;AAC5C,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,eAAe,UAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAEA,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,sBAAA,EAAwB;AACjD,MAAA,OAAA,EAAQ;AAAA,IACV;AACA,IAAA,IAAA,CAAK,yBAAyB,EAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAEhC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,oBAAA,CAAqB,qBAAA,EAAsB;AAC7D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,KAAK,MAAA,GAAS,CAAA;AAEhD,IAAA,IAAI,OAAA,IAAW,KAAK,WAAA,EAAa;AAC/B,MAAA,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AACzC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,wBAAwB,CAAA;AACrE,MAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,QAAA,IAAY,QAAQ,CAAA;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAA,CAAgB,QAAiB,MAAA,EAAuB;AAC9D,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,MAAM,QAAA,GAAW,oBAAA,EAAqB,GAAI,SAAA,GAA8B,QAAA;AAExE,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,CAAA,EAAG;AAExC,MAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,WAAA,IAAe,QAAA,CAAS,eAAA,CAAgB,SAAA;AACjE,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,GAAM,SAAA,GAAY,MAAA;AAEzC,MAAA,MAAA,CAAO,QAAA,CAAS;AAAA,QACd,GAAA,EAAK,SAAA;AAAA,QACL;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,cAAA,CAAe;AAAA,QACpB,QAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,KAAK,eAAA,GAAkB,CAAA,IAAK,KAAK,eAAA,IAAmB,IAAA,CAAK,eAAe,MAAA,EAAQ;AAClF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,eAAe,CAAA;AAC1D,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,KAAA,GAAQ,KAAK,cAAA,CAAe,MAAA;AAClC,IAAA,MAAM,OAAO,IAAA,CAAK,eAAA;AAGlB,IAAA,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAI9B,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAI,KAAK,SAAA,EAAW;AAEpB,MAAA,MAAM,WAAA,GAAc,CAAA,KAAA,EAAQ,IAAA,GAAO,CAAC,OAAO,KAAK,CAAA,CAAA;AAEhD,MAAA,IAAA,CAAK,SAAA,CAAU;AAAA,QACb,SAAA;AAAA,QACA,OAAA,EAAS,WAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACX,CAAA;AAGD,MAAA,KAAA,MAAW,EAAA,IAAM,KAAK,iBAAA,EAAmB;AACvC,QAAA,IAAI;AACF,UAAA,EAAA,CAAG,IAAA,EAAM,OAAO,SAAS,CAAA;AAAA,QAC3B,SAAS,CAAA,EAAG;AACV,UAAA,IAAA,CAAK,IAAI,0BAAA,EAA4B,EAAE,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA;AAAA,QAC3D;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,QAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,MAC3B;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAA4B;AAClC,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC9B,IAAA,IAAI,KAAK,uBAAA,EAAyB;AAElC,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAW,MAAM;AACpC,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,KAAK,uBAAA,EAAyB;AACpD,QAAA,IAAA,CAAK,YAAA,EAAa;AAAA,MACpB;AAAA,IACF,GAAG,qBAAqB,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC/B,MAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAC/B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,SAAS,OAAA,EAAuB;AACtC,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,MAAA,MAAA,CAAO,YAAA,CAAa,aAAa,WAAW,CAAA;AAC5C,MAAA,MAAA,CAAO,YAAA,CAAa,eAAe,MAAM,CAAA;AACzC,MAAA,MAAA,CAAO,YAAA,CAAa,sBAAsB,MAAM,CAAA;AAChD,MAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA,QACrB,oBAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAA;AAAA,QACA,kBAAA;AAAA,QACA,wBAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,IAAI,CAAA;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,MAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,IACtB;AAGA,IAAA,IAAA,CAAK,aAAa,WAAA,GAAc,EAAA;AAEhC,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,IAAA,CAAK,aAAa,WAAA,GAAc,OAAA;AAAA,MAClC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAA,GAA8B;AACpC,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AACvB,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,wBAAA,EAA0B;AAC9C,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,SAAS,CAAA;AAAA,MACd,SAAS,CAAA,EAAG;AACV,QAAA,IAAA,CAAK,IAAI,iCAAA,EAAmC,EAAE,OAAO,MAAA,CAAO,CAAC,GAAG,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,qBAAA,GAAgC;AACtC,IAAA,OAAO,oBAAA,EAAqB,GAAI,CAAA,GAAI,IAAA,CAAK,iBAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKQ,GAAA,CAAI,SAAiB,IAAA,EAAsC;AACjE,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,OAAA,CAAQ,IAAI,CAAA,EAAGA,YAAU,CAAA,CAAA,EAAI,OAAO,IAAI,IAAI,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAGA,YAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACF;;;AC5tCA,IAAMA,YAAAA,GAAa,sBAAA;AAMnB,IAAM,uBAAA,GAA0B,GAAA;AAChC,IAAM,wBAAA,GAA2B,GAAA;AACjC,IAAM,4BAAA,GAA+B,CAAA;AACrC,IAAM,4BAAA,GAA+B,GAAA;AACrC,IAAM,oBAAA,GAAuB,EAAA;AAC7B,IAAM,iBAAA,GAAoB,GAAA;AAG1B,IAAM,gBAAA,GAAmB;AAAA,EACvB,wBAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI,CAAA;AAGX,IAAM,gBAA0B,CAAC,CAAA,EAAG,IAAA,EAAM,GAAA,EAAK,MAAM,CAAG,CAAA;AAgDjD,IAAM,kBAAN,MAAsB;AAAA;AAAA,EAGV,GAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAIT,OAAA,GAAU,KAAA;AAAA;AAAA,EAGV,eAAA,GAA0C,IAAA;AAAA;AAAA,EAG1C,eAAA,GAA+C,IAAA;AAAA;AAAA,EAGtC,eAAA,uBAAsB,GAAA,EAAoB;AAAA;AAAA,EAInD,aAAA,GAAgB,CAAA;AAAA,EAChB,eAAA,GAA0C,MAAA;AAAA,EAC1C,WAAA,GAAc,CAAA;AAAA,EACd,gBAAA,GAAmB,KAAA;AAAA;AAAA,EAInB,gBAAA,GAAkC,IAAA;AAAA,EAClC,mBAAA,GAAsB,CAAA;AAAA,EACtB,UAAA,GAAoD,IAAA;AAAA,EACpD,YAAA,GAAe,KAAA;AAAA;AAAA,EAIf,iBAAA,GAAoB,CAAA;AAAA,EACpB,SAAA,GAAkD,IAAA;AAAA,EAClD,MAAA,GAAS,KAAA;AAAA;AAAA,EAIA,eAA8B,EAAC;AAAA;AAAA,EAIxC,eAAA,GAAkB,CAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,YAAY,OAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA;AACnB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,aAAA,IAAiB,uBAAA;AAC9C,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,cAAA,IAAkB,wBAAA;AAChD,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,4BAAA;AACxD,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAQ,iBAAA,IAAqB,4BAAA;AACtD,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,KAAA,IAAS,KAAA;AAErC,IAAA,IAAA,CAAK,IAAI,yBAAyB,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,IAAA,CAAK,IAAI,oDAA+C,CAAA;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC3C,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,IAAA,CAAK,eAAA;AAExB,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,GAAA,EAAI;AAClC,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,OAAA;AAG1B,IAAA,MAAM,YAAA,GAAe,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAK;AAE7C,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,YAAA,EAAc,YAAY,CAAA;AACjE,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,eAAA,EAAiB,YAAY,CAAA;AACvE,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,iBAAA,EAAmB,YAAY,CAAA;AACvE,IAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,IAAA,CAAK,WAAA,EAAa,EAAE,QAAQ,CAAA;AAC7D,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAA,EAAc,IAAA,CAAK,iBAAA,EAAmB,YAAY,CAAA;AAC1E,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,iBAAA,EAAmB,YAAY,CAAA;AAGxE,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAGzB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAGvB,IAAA,IAAA,CAAK,UAAA,GAAa,WAAA,CAAY,IAAA,CAAK,UAAA,EAAY,GAAK,CAAA;AAEpD,IAAA,IAAA,CAAK,IAAI,oBAAoB,CAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,IAAA,GAAa;AACX,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEnB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAGf,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAGvB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,gBAAgB,UAAA,EAAW;AAChC,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AAGA,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAGrB,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,aAAa,MAAA,GAAS,CAAA;AAC3B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,mBAAA,GAAsB,CAAA;AAC3B,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AAExB,IAAA,IAAA,CAAK,IAAI,oBAAoB,CAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA;AAAA,EAGA,QAAA,GAA2B;AACzB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,UACJ,IAAA,CAAK,gBAAA,KAAqB,IAAA,GACtB,GAAA,GAAM,KAAK,mBAAA,GACX,CAAA;AAEN,IAAA,OAAO;AAAA,MACL,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,qBAAA,EAAuB,OAAA;AAAA,MACvB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,mBAAmB,IAAA,CAAK,iBAAA;AAAA,MACxB,eAAA,EAAiB,IAAI,GAAA,CAAI,IAAA,CAAK,eAAe;AAAA,KAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMiB,eAAe,MAAY;AAC1C,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,IAAI,KAAK,gBAAA,EAAkB;AAC3B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAExB,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEnB,MAAA,MAAM,IAAI,MAAA,CAAO,OAAA;AACjB,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,eAAA,CAAgB,YAAA,GAAe,MAAA,CAAO,WAAA;AACjE,MAAA,IAAA,CAAK,aAAA,GAAgB,YAAY,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,SAAS,CAAA,GAAI,CAAA;AAElE,MAAA,IAAI,CAAA,GAAI,KAAK,WAAA,EAAa;AACxB,QAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,MACzB,CAAA,MAAA,IAAW,CAAA,GAAI,IAAA,CAAK,WAAA,EAAa;AAC/B,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MACzB;AAGA,MAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,IACrB,CAAC,CAAA;AAAA,EACH,CAAA;AAAA;AAAA;AAAA;AAAA,EAMiB,kBAAkB,MAAY;AAC7C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,eAAA,GAAkB,iBAAA,EAAmB;AACpD,IAAA,IAAA,CAAK,eAAA,GAAkB,GAAA;AAEvB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB,CAAA;AAAA;AAAA;AAAA;AAAA,EAMiB,WAAA,GAAc,CAAC,CAAA,KAAmB;AACjD,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,UAAA,GAAa,CAAA;AACnB,IAAA,MAAM,SAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,MAAA,GAAsB;AAAA,MAC1B,GAAG,UAAA,CAAW,OAAA;AAAA,MACd,GAAG,UAAA,CAAW,OAAA;AAAA,MACd,SAAA,EAAW,GAAA;AAAA,MACX;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,MAAM,CAAA;AAG7B,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,iBAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,aAAa,MAAA,GAAS,CAAA,IAAK,KAAK,YAAA,CAAa,CAAC,CAAA,CAAG,SAAA,GAAY,WAAA,EAAa;AACpF,MAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,IAC1B;AAIA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM;AAC7C,MAAA,MAAM,WAAA,GAAc,EAAE,MAAA,KAAW,MAAA;AACjC,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,CAAA;AACxB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,CAAA;AACxB,MAAA,MAAM,eAAe,IAAA,CAAK,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA,GAAK,EAAE,CAAA,IAAK,oBAAA;AACrD,MAAA,OAAO,WAAA,IAAe,YAAA;AAAA,IACxB,CAAC,CAAA;AAED,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,kBAAA,EAAoB;AAC5C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAC1C,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,sBAAA,EAAwB;AAAA,QACpC,QAAA;AAAA,QACA,QAAQ,MAAA,CAAO;AAAA,OAChB,CAAA;AACD,MAAA,IAAA,CAAK,IAAI,CAAA,qBAAA,EAAwB,MAAA,CAAO,MAAM,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,CAAG,CAAA;AAGzE,MAAA,IAAA,CAAK,aAAa,MAAA,GAAS,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAMiB,oBAAoB,MAAY;AAC/C,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB,CAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,GAAA,EAAI;AAGlC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,MAAA,IAAA,CAAK,IAAI,yBAAyB,CAAA;AAAA,IACpC;AAEA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,IAAA,CAAK,SAAA,GAAY,WAAW,MAAM;AAChC,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEnB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,iBAAA;AAErC,MAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,gBAAA,EAAkB,EAAE,YAAY,CAAA;AAC9C,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAA,EAAiB,UAAU,CAAA,EAAA,CAAI,CAAA;AAAA,IAC1C,CAAA,EAAG,KAAK,aAAa,CAAA;AAAA,EACvB;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,cAAc,IAAA,EAAM;AAC3B,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUiB,aAAa,MAAY;AACxC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAGnB,IAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,KAAK,eAAA,EAAiB;AAC9C,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,MAAA,GAAS,EAAA;AAAA,MACX;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,KAAW,KAAK,gBAAA,EAAkB;AACpC,MAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,MAAA,IAAA,CAAK,mBAAA,GAAsB,KAAK,GAAA,EAAI;AACpC,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,IAAA,IAAQ,CAAC,KAAK,YAAA,EAAc;AACxD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,mBAAA;AAClC,MAAA,IAAI,OAAA,IAAW,KAAK,cAAA,EAAgB;AAClC,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,QAAA,IAAA,CAAK,GAAA,CAAI,KAAK,iBAAA,EAAmB;AAAA,UAC/B,WAAW,IAAA,CAAK,gBAAA;AAAA,UAChB,UAAA,EAAY;AAAA,SACb,CAAA;AACD,QAAA,IAAA,CAAK,IAAI,CAAA,UAAA,EAAa,IAAA,CAAK,gBAAgB,CAAA,GAAA,EAAM,OAAO,CAAA,GAAA,CAAK,CAAA;AAAA,MAC/D;AAAA,IACF;AAAA,EACF,CAAA;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,OAAO,yBAAyB,WAAA,EAAa;AAC/C,MAAA,IAAA,CAAK,IAAI,qEAAgE,CAAA;AACzE,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,kBAAkB,IAAI,oBAAA;AAAA,MACzB,CAAC,OAAA,KAAY;AACX,QAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA;AAChD,UAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,UAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,iBAAA,GAAoB,GAAG,CAAA,GAAI,GAAA;AAC1D,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA;AAEnD,UAAA,IAAI,aAAa,KAAA,EAAO;AAExB,UAAA,IAAI,UAAU,CAAA,EAAG;AACf,YAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,SAAS,CAAA;AAAA,UACvC,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AAAA,UAC3C;AAEA,UAAA,IAAA,CAAK,GAAA,CAAI,KAAK,2BAAA,EAA6B;AAAA,YACzC,SAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF,CAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,KAAK,WAAA,IAAe,IAAA;AAAA,QAC1B,SAAA,EAAW;AAAA;AACb,KACF;AAEA,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAE3B,IAAA,MAAM,IAAA,GAAO,KAAK,WAAA,IAAe,QAAA;AACjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,gBAAgB,CAAA;AAEvD,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAI,8BAA8B,CAAA;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,IAAA,CAAK,eAAA,CAAgB,QAAQ,EAAE,CAAA;AAAA,IACjC;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,UAAA,EAAa,QAAA,CAAS,MAAM,CAAA,WAAA,CAAa,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,aAAa,EAAA,EAA4B;AAC/C,IAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,YAAA,CAAa,sBAAsB,CAAA;AAC7D,IAAA,IAAI,gBAAgB,OAAO,cAAA;AAE3B,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,YAAA,CAAa,IAAI,CAAA;AAC/B,IAAA,IAAI,EAAA,EAAI,OAAO,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAGrB,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,EAAQ,SAAA,EAAW,WAAW,OAAA,EAAS,KAAA,EAAO,UAAU,QAAQ,CAAA;AACnF,IAAA,IAAI,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,GAAA;AAEpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,EAAA,EAAqB;AAEzC,IAAA,IAAI,EAAA,CAAG,EAAA,EAAI,OAAO,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,CAAA;AAG3B,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,YAAA,CAAa,sBAAsB,CAAA;AACrD,IAAA,IAAI,MAAA,EAAQ,OAAO,CAAA,uBAAA,EAA0B,MAAM,CAAA,EAAA,CAAA;AAGnD,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,GAAG,SAAS,CAAA,CACpC,MAAM,CAAA,EAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA,CAClB,KAAK,EAAE,CAAA;AAEV,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAG,OAAO,CAAA,CAAA;AAAA,EACzB;AAAA;AAAA,EAGQ,OAAO,IAAA,EAAuB;AACpC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,GAAG,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AACF;;;AC9hBA,IAAMA,YAAAA,GAAa,sBAAA;AACnB,IAAM,WAAA,GAAc,kBAAA;AACpB,IAAM,aAAA,GAAgB,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAGzC,IAAM,eAAA,GAAkB,CAAC,GAAA,EAAQ,GAAA,EAAQ,IAAO,CAAA;AAChD,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,iBAAA,GAAoB,GAAA;AAC1B,IAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAM,eAAA,GAAkB,IAAA;AAkCjB,IAAM,yBAAN,MAA6B;AAAA,EACjB,GAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAGT,SAA4B,EAAC;AAAA;AAAA,EAG7B,SAAA,uBAAgB,GAAA,EAAoB;AAAA;AAAA,EAGpC,WAAA,uBAAkB,GAAA,EAAoB;AAAA;AAAA,EAGtC,UAAA,uBAAiB,GAAA,EAA2C;AAAA;AAAA,EAG5D,gBAAA,uBAAuB,GAAA,EAAY;AAAA;AAAA,EAGnC,iBAAA,GAAoB,KAAA;AAAA,EAEpB,UAAA,GAAa,KAAA;AAAA,EACb,OAAA,GAAU,KAAA;AAAA,EAElB,YAAY,OAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,KAAA;AAC9B,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAAA,EAC3B;AAAA;AAAA,EAIA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAI,UAAU,KAAA,EAAgB;AAC5B,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,MAAMA,YAAAA,EAAY,CAAA,WAAA,EAAc,KAAA,GAAQ,SAAA,GAAY,UAAU,CAAA,CAAE,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAEf,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAG7B,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACV,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,gBAAA,EAAkB,CAAC,IAAA,KAAS;AACtC,QAAA,IAAA,CAAK,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,MACjC,CAAC;AAAA,KACH;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACV,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,iBAAA,EAAmB,CAAC,IAAA,KAAS;AACvC,QAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AAAA,MAClD,CAAC;AAAA,KACH;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACV,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,sBAAA,EAAwB,CAAC,IAAA,KAAS;AAC5C,QAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,MACjD,CAAC;AAAA,KACH;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACV,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,kBAAA,EAAoB,CAAC,IAAA,KAAS;AACxC,QAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAA;AAAA,MAC9C,CAAC;AAAA,KACH;AAEA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAMA,cAAY,qDAAgD,CAAA;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA,EAGA,IAAA,GAAa;AACX,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,MAAA,KAAA,EAAM;AAAA,IACR;AACA,IAAA,IAAA,CAAK,SAAS,EAAC;AAGf,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO,EAAG;AAC5C,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AACA,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAEtB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAEf,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAMA,cAAY,sCAAiC,CAAA;AAAA,IAC7D;AAAA,EACF;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAA,CAAc,MAAc,EAAA,EAAkB;AAC5C,IAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uBAAuB,YAAA,EAA4B;AAEjD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,YAAY,CAAA;AACjD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,YAAA,CAAa,QAAQ,CAAA;AAAA,IACvB;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,YAAY,CAAA;AACnC,MAAA,IAAA,CAAK,WAAA,CAAY;AAAA,QACf,IAAA,EAAM,kBAAA;AAAA,QACN,QAAA,EAAU,YAAA;AAAA,QACV,OAAA,EAAS,CAAA,qBAAA,EAAwB,YAAY,CAAA,8BAAA,EAAiC,kBAAkB,GAAI,CAAA,sBAAA;AAAA,OACtG,EAAG,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAE,CAAA;AAAA,IACvC,GAAG,eAAe,CAAA;AAElB,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,YAAA,EAAc,KAAK,CAAA;AAEvC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,CAAA,0BAAA,EAA6B,YAAY,CAAA,CAAE,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA,EAGA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAEzB,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO,EAAG;AAC5C,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AACA,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAEtB,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAMA,cAAY,+BAA+B,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA,EAIQ,uBAAA,GAAgC;AACtC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,iBAAiB,WAAA,EAAa;AACxE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA;AAEhD,MAAA,IAAI,YAAY,IAAA,EAAM;AAEpB,QAAA,YAAA,CAAa,QAAQ,WAAA,EAAa,IAAA,CAAK,GAAA,EAAI,CAAE,UAAU,CAAA;AAEvD,QAAA,IAAA,CAAK,WAAA,CAAY;AAAA,UACf,IAAA,EAAM,UAAA;AAAA,UACN,OAAA,EAAS;AAAA,WACR,UAAU,CAAA;AAEb,QAAA,IAAI,KAAK,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAMA,cAAY,uCAAkC,CAAA;AAAA,QAC9D;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,EAAS,EAAE,CAAA;AACtC,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AAE3B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC7B,MAAA,IAAI,OAAA,IAAW,aAAA,IAAiB,IAAA,CAAK,KAAA,EAAO;AAC1C,QAAA,OAAA,CAAQ,KAAA,CAAMA,cAAY,4CAAuC,CAAA;AAAA,MACnE,CAAA,MAAA,IAAW,KAAK,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAMA,cAAY,6BAA6B,CAAA;AAAA,MACzD;AAAA,IACF,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAKA,cAAY,yDAAoD,CAAA;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,UAAA,EAA0B;AAC3C,IAAA,IAAI,aAAa,iBAAA,EAAmB;AACpC,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAE5B,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAEzB,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,WAAA;AAAA,MACN,SAAS,CAAA,uBAAA,EAA0B,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,GAAI,CAAC,CAAA,+CAAA;AAAA,OAC/D,WAAW,CAAA;AAAA,EAChB;AAAA,EAEQ,WAAA,CAAY,WAAmB,UAAA,EAA0B;AAC/D,IAAA,IAAI,aAAa,kBAAA,EAAoB;AAErC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,IAAK,CAAA;AAGjD,IAAA,IAAI,KAAA,IAAS,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,CAAA,+BAAA,EAAkC,SAAS,CAAA,mBAAA,CAAgB,CAAA;AAAA,MACvF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAM,UAAA,GAAa,gBAAgB,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG,eAAA,CAAgB,MAAA,GAAS,CAAC,CAAC,CAAA;AAClF,MAAA,MAAM,GAAA,GAAM,SAAS,SAAS,CAAA,CAAA;AAC9B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,IAAK,CAAA;AAE7C,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,UAAA,EAAY;AACvC,QAAA,IAAI,KAAK,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,CAAA,2BAAA,EAA8B,SAAS,CAAA,mBAAA,CAAgB,CAAA;AAAA,QACnF;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,KAAA,GAAQ,CAAC,CAAA;AAEzC,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,kBAAA;AAAA,MACN,SAAA;AAAA,MACA,OAAA,EAAS,sCAAsC,SAAS,CAAA,MAAA,EAAS,KAAK,KAAA,CAAM,UAAA,GAAa,GAAI,CAAC,CAAA,8BAAA;AAAA,KAChG,EAAG,CAAA,MAAA,EAAS,SAAS,CAAA,CAAE,CAAA;AAAA,EACzB;AAAA,EAEQ,eAAA,CAAgB,UAAkB,MAAA,EAAsB;AAE9D,IAAA,MAAM,UAAA,GAAa,QAAA;AAEnB,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,UAAU,CAAA,EAAG;AACzC,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,CAAA,+BAAA,EAAkC,QAAQ,CAAA,mBAAA,CAAgB,CAAA;AAAA,MACtF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,UAAU,CAAA;AAEpC,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,aAAA;AAAA,MACN,QAAA;AAAA,MACA,OAAA,EAAS,CAAA,mBAAA,EAAsB,MAAM,CAAA,aAAA,EAAgB,QAAQ,CAAA,0CAAA;AAAA,KAC/D,EAAG,CAAA,YAAA,EAAe,UAAU,CAAA,CAAE,CAAA;AAAA,EAChC;AAAA,EAEQ,gBAAA,CAAiB,MAAc,EAAA,EAAkB;AAEvD,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAEzB,IAAA,MAAM,GAAA,GAAM,uBAAA;AACZ,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,sBAAsB,CAAA,EAAG;AACtD,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAMA,cAAY,8CAAyC,CAAA;AAAA,MACrE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,uBAAA;AAAA,MACN,OAAA,EAAS,CAAA,qBAAA,EAAwB,IAAI,CAAA,MAAA,EAAS,EAAE,CAAA,oCAAA;AAAA,OAC/C,GAAG,CAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAA,CAAqB,MAAc,EAAA,EAAkB;AAC3D,IAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,WAAA,CACN,SACA,WAAA,EACM;AACN,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,CAAA,sCAAA,EAAoC,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,MAC9E;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,GAAG,OAAA;AAAA,MACH,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,WAAA,EAAa,OAAA,CAAQ,SAAS,CAAA;AAEjD,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,gBAAA,EAAkB,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,IACnE;AAEA,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,MACxB,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,2BAAA,EAA6B,GAAG,CAAA;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,gBAAA,CAAiB,KAAa,UAAA,EAA6B;AACjE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACxC,IAAA,IAAI,SAAA,KAAc,QAAW,OAAO,KAAA;AACpC,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,UAAA;AAAA,EAClC;AACF;;;AClYA,IAAMA,YAAAA,GAAa,wBAAA;AAEnB,IAAM,gCAAA,GAAmC,EAAA;AACzC,IAAM,mCAAA,GAAsC,EAAA;AAC5C,IAAM,iCAAA,GAAoC,GAAA;AA6BnC,IAAM,cAAN,MAAkB;AAAA,EACN,GAAA;AAAA,EACA,KAAA;AAAA;AAAA,EAGT,oBAAA;AAAA,EACA,uBAAA;AAAA,EACA,qBAAA;AAAA;AAAA,EAGA,oBAA8B,EAAC;AAAA;AAAA,EAG/B,KAAA,GAAQ,CAAA;AAAA,EACR,YAAA,GAA8B,IAAA;AAAA;AAAA,EAG9B,QAAA,GAAW,CAAA;AAAA,EAEnB,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,GAAA,GAAM,SAAS,GAAA,IAAO,IAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,KAAA;AAE/B,IAAA,MAAM,SAAS,OAAA,EAAS,MAAA;AACxB,IAAA,IAAA,CAAK,oBAAA,GACH,QAAQ,oBAAA,IAAwB,gCAAA;AAClC,IAAA,IAAA,CAAK,uBAAA,GACH,QAAQ,uBAAA,IAA2B,mCAAA;AACrC,IAAA,IAAA,CAAK,qBAAA,GACH,QAAQ,qBAAA,IAAyB,iCAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAA,GAAqB;AACnB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,cAAc,GAAA,GAAM,GAAA;AAG1B,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,iBAAA,CAAkB,MAAA;AAAA,MAC9C,CAAC,MAAM,CAAA,GAAI;AAAA,KACb;AAEA,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAA,IAAU,IAAA,CAAK,oBAAA,EAAsB;AAC9D,MAAA,MAAM,GAAA,GAAM,IAAI,sBAAA,CAAuB;AAAA,QACrC,MAAM,UAAA,CAAW,iBAAA;AAAA,QACjB,OAAA,EAAS,CAAA,yBAAA,EAA4B,IAAA,CAAK,oBAAoB,CAAA,kBAAA,CAAA;AAAA,QAC9D,UAAA,EAAY,CAAA,0FAAA;AAAA,OACb,CAAA;AACD,MAAA,IAAA,CAAK,UAAU,GAAG,CAAA;AAClB,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,GAAG,CAAA;AAC/B,IAAA,IAAA,CAAK,IAAI,mBAAA,EAAqB;AAAA,MAC5B,KAAA,EAAO,KAAK,iBAAA,CAAkB,MAAA;AAAA,MAC9B,KAAK,IAAA,CAAK;AAAA,KACX,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,GAAiB;AACf,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,EAAM;AAChC,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,GAAA,EAAI;AAC7B,IAAA,IAAA,CAAK,IAAI,uBAAuB,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,EAAM;AAChC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,YAAA;AAClC,IAAA,IAAA,CAAK,KAAA,IAAS,OAAA;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,IAAI,uBAAA,EAAyB;AAAA,MAChC,SAAA,EAAW,OAAA;AAAA,MACX,cAAc,IAAA,CAAK;AAAA,KACpB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAAiB;AACf,IAAA,MAAM,eAAe,IAAA,CAAK,cAAA;AAC1B,IAAA,IAAI,YAAA,IAAgB,KAAK,uBAAA,EAAyB;AAChD,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,MAAM,GAAA,GAAM,IAAI,sBAAA,CAAuB;AAAA,QACrC,MAAM,UAAA,CAAW,iBAAA;AAAA,QACjB,OAAA,EAAS,CAAA,4BAAA,EAA+B,IAAA,CAAK,uBAAuB,CAAA,qBAAA,CAAA;AAAA,QACpE,UAAA,EAAY,CAAA,0FAAA;AAAA,OACb,CAAA;AACD,MAAA,IAAA,CAAK,UAAU,GAAG,CAAA;AAClB,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,IAAY,cAAA,GAAyB;AACnC,IAAA,IAAI,UAAU,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,EAAM;AAC9B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,YAAA;AACnC,MAAA,MAAM,YAAA,GAAe,KAAK,uBAAA,GAA0B,GAAA;AACpD,MAAA,MAAM,cAAc,YAAA,GAAe,CAAA;AAEnC,MAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,EAAGA,YAAU,CAAA,wBAAA,EAA2B,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAM,CAAC,CAAA,0DAAA,EACrC,IAAA,CAAK,uBAAA,GAA0B,CAAC,CAAA,KAAA;AAAA,SAClE;AAEA,QAAA,IAAA,CAAK,KAAA,IAAS,WAAA;AACd,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,QAAA,OAAA,GAAU,IAAA,CAAK,KAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,OAAA,IAAW,QAAA;AAAA,MACb;AAAA,IACF;AACA,IAAA,OAAO,OAAA,GAAU,GAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,SAAA,EAAyB;AAChC,IAAA,IAAI,IAAA,CAAK,QAAA,GAAW,SAAA,GAAY,IAAA,CAAK,qBAAA,EAAuB;AAC1D,MAAA,MAAM,GAAA,GAAM,IAAI,sBAAA,CAAuB;AAAA,QACrC,MAAM,UAAA,CAAW,iBAAA;AAAA,QACjB,OAAA,EAAS,CAAA,8BAAA,EAAiC,IAAA,CAAK,qBAAqB,CAAA,wBAAA,CAAA;AAAA,QACpE,UAAA,EAAY,CAAA,sGAAA;AAAA,OACb,CAAA;AACD,MAAA,IAAA,CAAK,UAAU,GAAG,CAAA;AAClB,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,IAAA,CAAK,QAAA,IAAY,SAAA;AACjB,IAAA,IAAA,CAAK,IAAI,oBAAA,EAAsB;AAAA,MAC7B,KAAA,EAAO,SAAA;AAAA,MACP,OAAO,IAAA,CAAK,QAAA;AAAA,MACZ,KAAK,IAAA,CAAK;AAAA,KACX,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,GAA6B;AAC3B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,cAAc,GAAA,GAAM,GAAA;AAC1B,IAAA,OAAO;AAAA,MACL,gBAAA,EAAkB,KAAK,iBAAA,CAAkB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,GAAI,WAAW,CAAA,CACnE,MAAA;AAAA,MACH,gBAAgB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,cAAA,GAAiB,GAAG,CAAA,GAAI,GAAA;AAAA,MACxD,cAAc,IAAA,CAAK,QAAA;AAAA,MACnB,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAAA;AAAA,EAGA,UAAU,MAAA,EAA0B;AAClC,IAAA,IAAI,MAAA,CAAO,yBAAyB,MAAA,EAAW;AAC7C,MAAA,IAAA,CAAK,uBAAuB,MAAA,CAAO,oBAAA;AAAA,IACrC;AACA,IAAA,IAAI,MAAA,CAAO,4BAA4B,MAAA,EAAW;AAChD,MAAA,IAAA,CAAK,0BAA0B,MAAA,CAAO,uBAAA;AAAA,IACxC;AACA,IAAA,IAAI,MAAA,CAAO,0BAA0B,MAAA,EAAW;AAC9C,MAAA,IAAA,CAAK,wBAAwB,MAAA,CAAO,qBAAA;AAAA,IACtC;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,kBAAkB,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,oBAAoB,EAAC;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,IAAI,gBAAgB,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAU,GAAA,EAAmC;AACnD,IAAA,IAAI,KAAK,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,OAAO,IAAA,EAAuB;AACpC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAMA,YAAAA,EAAY,GAAG,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AACF;;;AC3MA,IAAM,EAAA,GAAkB;AAAA,EACtB,WAAA,EAAa,UAAA;AAAA,EACb,aAAA,EAAe,gBAAA;AAAA,EACf,cAAA,EAAgB,iBAAA;AAAA,EAChB,UAAA,EAAY,uBAAA;AAAA,EACZ,WAAA,EAAa,cAAA;AAAA,EACb,gBAAA,EAAkB,mBAAA;AAAA,EAClB,oBAAA,EAAsB,cAAA;AAAA,EACtB,UAAA,EAAY,mBAAA;AAAA,EACZ,SAAA,EAAW,kBAAA;AAAA,EAEX,YAAA,EAAc,QAAA;AAAA,EACd,gBAAA,EAAkB,eAAA;AAAA,EAClB,aAAA,EAAe,SAAA;AAAA,EACf,eAAA,EAAiB,cAAA;AAAA,EACjB,cAAA,EAAgB,aAAA;AAAA,EAChB,gBAAA,EAAkB,eAAA;AAAA,EAElB,iBAAA,EACE,yFAAA;AAAA,EAEF,YAAA,EAAc,yCAAA;AAAA,EACd,YAAA,EAAc,kCAAA;AAAA,EACd,cAAA,EACE,0EAAA;AAAA,EACF,cAAA,EAAgB,0CAAA;AAAA,EAEhB,eAAA,EAAiB,qCAAA;AAAA,EACjB,eAAA,EAAiB,8BAAA;AAAA,EAEjB,mBAAA,EAAqB,2CAAA;AAAA,EAErB,WAAA,EAAa,sBAAA;AAAA,EACb,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,EAAA,GAAkB;AAAA,EACtB,WAAA,EAAa,UAAA;AAAA,EACb,aAAA,EAAe,iBAAA;AAAA,EACf,cAAA,EAAgB,kBAAA;AAAA,EAChB,UAAA,EAAY,4BAAA;AAAA,EACZ,WAAA,EAAa,gBAAA;AAAA,EACb,gBAAA,EAAkB,qBAAA;AAAA,EAClB,oBAAA,EAAsB,eAAA;AAAA,EACtB,UAAA,EAAY,wBAAA;AAAA,EACZ,SAAA,EAAW,wBAAA;AAAA,EAEX,YAAA,EAAc,UAAA;AAAA,EACd,gBAAA,EAAkB,eAAA;AAAA,EAClB,aAAA,EAAe,cAAA;AAAA,EACf,eAAA,EAAiB,eAAA;AAAA,EACjB,cAAA,EAAgB,aAAA;AAAA,EAChB,gBAAA,EAAkB,eAAA;AAAA,EAElB,iBAAA,EACE,2GAAA;AAAA,EAEF,YAAA,EAAc,gDAAA;AAAA,EACd,YAAA,EAAc,wCAAA;AAAA,EACd,cAAA,EACE,iFAAA;AAAA,EACF,cAAA,EAAgB,uDAAA;AAAA,EAEhB,eAAA,EAAiB,iDAAA;AAAA,EACjB,eAAA,EAAiB,mCAAA;AAAA,EAEjB,mBAAA,EAAqB,gDAAA;AAAA,EAErB,WAAA,EAAa,yBAAA;AAAA,EACb,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,EAAA,GAAkB;AAAA,EACtB,WAAA,EAAa,UAAA;AAAA,EACb,aAAA,EAAe,oBAAA;AAAA,EACf,cAAA,EAAgB,oBAAA;AAAA,EAChB,UAAA,EAAY,kCAAA;AAAA,EACZ,WAAA,EAAa,oBAAA;AAAA,EACb,gBAAA,EAAkB,uBAAA;AAAA,EAClB,oBAAA,EAAsB,eAAA;AAAA,EACtB,UAAA,EAAY,0BAAA;AAAA,EACZ,SAAA,EAAW,0BAAA;AAAA,EAEX,YAAA,EAAc,UAAA;AAAA,EACd,gBAAA,EAAkB,uBAAA;AAAA,EAClB,aAAA,EAAe,YAAA;AAAA,EACf,eAAA,EAAiB,eAAA;AAAA,EACjB,cAAA,EAAgB,uBAAA;AAAA,EAChB,gBAAA,EAAkB,wBAAA;AAAA,EAElB,iBAAA,EACE,4GAAA;AAAA,EAEF,YAAA,EAAc,gDAAA;AAAA,EACd,YAAA,EAAc,2CAAA;AAAA,EACd,cAAA,EACE,iGAAA;AAAA,EACF,cAAA,EAAgB,kDAAA;AAAA,EAEhB,eAAA,EAAiB,wDAAA;AAAA,EACjB,eAAA,EAAiB,kDAAA;AAAA,EAEjB,mBAAA,EAAqB,2CAAA;AAAA,EAErB,WAAA,EAAa,wBAAA;AAAA,EACb,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,EAAA,GAAkB;AAAA,EACtB,WAAA,EAAa,UAAA;AAAA,EACb,aAAA,EAAe,mBAAA;AAAA,EACf,cAAA,EAAgB,sBAAA;AAAA,EAChB,UAAA,EAAY,8BAAA;AAAA,EACZ,WAAA,EAAa,kBAAA;AAAA,EACb,gBAAA,EAAkB,sBAAA;AAAA,EAClB,oBAAA,EAAsB,aAAA;AAAA,EACtB,UAAA,EAAY,uBAAA;AAAA,EACZ,SAAA,EAAW,uBAAA;AAAA,EAEX,YAAA,EAAc,QAAA;AAAA,EACd,gBAAA,EAAkB,gCAAA;AAAA,EAClB,aAAA,EAAe,SAAA;AAAA,EACf,eAAA,EAAiB,aAAA;AAAA,EACjB,cAAA,EAAgB,YAAA;AAAA,EAChB,gBAAA,EAAkB,iBAAA;AAAA,EAElB,iBAAA,EACE,6GAAA;AAAA,EAEF,YAAA,EAAc,qDAAA;AAAA,EACd,YAAA,EAAc,2DAAA;AAAA,EACd,cAAA,EACE,uFAAA;AAAA,EACF,cAAA,EAAgB,8CAAA;AAAA,EAEhB,eAAA,EAAiB,4DAAA;AAAA,EACjB,eAAA,EAAiB,2CAAA;AAAA,EAEjB,mBAAA,EAAqB,kDAAA;AAAA,EAErB,WAAA,EAAa,6BAAA;AAAA,EACb,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,EAAA,GAAkB;AAAA,EACtB,WAAA,EAAa,UAAA;AAAA,EACb,aAAA,EAAe,wDAAA;AAAA,EACf,cAAA,EAAgB,8DAAA;AAAA,EAChB,UAAA,EAAY,gFAAA;AAAA,EACZ,WAAA,EAAa,kDAAA;AAAA,EACb,gBAAA,EAAkB,qDAAA;AAAA,EAClB,oBAAA,EAAsB,yCAAA;AAAA,EACtB,UAAA,EAAY,4CAAA;AAAA,EACZ,SAAA,EAAW,4CAAA;AAAA,EAEX,YAAA,EAAc,gCAAA;AAAA,EACd,gBAAA,EAAkB,uBAAA;AAAA,EAClB,aAAA,EAAe,gCAAA;AAAA,EACf,eAAA,EAAiB,yCAAA;AAAA,EACjB,cAAA,EAAgB,yCAAA;AAAA,EAChB,gBAAA,EAAkB,uBAAA;AAAA,EAElB,iBAAA,EACE,4RAAA;AAAA,EAEF,YAAA,EAAc,sIAAA;AAAA,EACd,YAAA,EAAc,uHAAA;AAAA,EACd,cAAA,EACE,0NAAA;AAAA,EACF,cAAA,EAAgB,sIAAA;AAAA,EAEhB,eAAA,EAAiB,4LAAA;AAAA,EACjB,eAAA,EAAiB,0HAAA;AAAA,EAEjB,mBAAA,EAAqB,oKAAA;AAAA,EAErB,WAAA,EAAa,kDAAA;AAAA,EACb,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,EAAA,GAAkB;AAAA,EACtB,WAAA,EAAa,UAAA;AAAA,EACb,aAAA,EAAe,0BAAA;AAAA,EACf,cAAA,EAAgB,0BAAA;AAAA,EAChB,UAAA,EAAY,sCAAA;AAAA,EACZ,WAAA,EAAa,0BAAA;AAAA,EACb,gBAAA,EAAkB,uBAAA;AAAA,EAClB,oBAAA,EAAsB,6BAAA;AAAA,EACtB,UAAA,EAAY,sCAAA;AAAA,EACZ,SAAA,EAAW,sCAAA;AAAA,EAEX,YAAA,EAAc,cAAA;AAAA,EACd,gBAAA,EAAkB,uBAAA;AAAA,EAClB,aAAA,EAAe,cAAA;AAAA,EACf,eAAA,EAAiB,6BAAA;AAAA,EACjB,cAAA,EAAgB,6BAAA;AAAA,EAChB,gBAAA,EAAkB,uBAAA;AAAA,EAElB,iBAAA,EACE,8MAAA;AAAA,EAEF,YAAA,EAAc,8DAAA;AAAA,EACd,YAAA,EAAc,6EAAA;AAAA,EACd,cAAA,EAAgB,0HAAA;AAAA,EAChB,cAAA,EAAgB,gFAAA;AAAA,EAEhB,eAAA,EAAiB,4FAAA;AAAA,EACjB,eAAA,EAAiB,gFAAA;AAAA,EAEjB,mBAAA,EAAqB,4FAAA;AAAA,EAErB,WAAA,EAAa,gCAAA;AAAA,EACb,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,EAAA,GAAkB;AAAA,EACtB,WAAA,EAAa,UAAA;AAAA,EACb,aAAA,EAAe,+DAAA;AAAA,EACf,cAAA,EAAgB,2EAAA;AAAA,EAChB,UAAA,EAAY,oGAAA;AAAA,EACZ,WAAA,EAAa,2EAAA;AAAA,EACb,gBAAA,EAAkB,kEAAA;AAAA,EAClB,oBAAA,EAAsB,8EAAA;AAAA,EACtB,UAAA,EAAY,oGAAA;AAAA,EACZ,SAAA,EAAW,gHAAA;AAAA,EAEX,YAAA,EAAc,0BAAA;AAAA,EACd,gBAAA,EAAkB,wEAAA;AAAA,EAClB,aAAA,EAAe,6CAAA;AAAA,EACf,eAAA,EAAiB,8EAAA;AAAA,EACjB,cAAA,EAAgB,kEAAA;AAAA,EAChB,gBAAA,EAAkB,8EAAA;AAAA,EAElB,iBAAA,EACE,8XAAA;AAAA,EAEF,YAAA,EAAc,4KAAA;AAAA,EACd,YAAA,EAAc,kLAAA;AAAA,EACd,cAAA,EACE,yTAAA;AAAA,EACF,cAAA,EAAgB,6LAAA;AAAA,EAEhB,eAAA,EAAiB,4NAAA;AAAA,EACjB,eAAA,EAAiB,4IAAA;AAAA,EAEjB,mBAAA,EAAqB,uNAAA;AAAA,EAErB,WAAA,EAAa,kIAAA;AAAA,EACb,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,EAAA,GAAkB;AAAA,EACtB,WAAA,EAAa,UAAA;AAAA,EACb,aAAA,EAAe,kBAAA;AAAA,EACf,cAAA,EAAgB,mBAAA;AAAA,EAChB,UAAA,EAAY,6BAAA;AAAA,EACZ,WAAA,EAAa,iBAAA;AAAA,EACb,gBAAA,EAAkB,sBAAA;AAAA,EAClB,oBAAA,EAAsB,YAAA;AAAA,EACtB,UAAA,EAAY,wBAAA;AAAA,EACZ,SAAA,EAAW,sBAAA;AAAA,EAEX,YAAA,EAAc,QAAA;AAAA,EACd,gBAAA,EAAkB,eAAA;AAAA,EAClB,aAAA,EAAe,SAAA;AAAA,EACf,eAAA,EAAiB,YAAA;AAAA,EACjB,cAAA,EAAgB,YAAA;AAAA,EAChB,gBAAA,EAAkB,gBAAA;AAAA,EAElB,iBAAA,EACE,uGAAA;AAAA,EAEF,YAAA,EAAc,8CAAA;AAAA,EACd,YAAA,EAAc,kCAAA;AAAA,EACd,cAAA,EACE,+EAAA;AAAA,EACF,cAAA,EAAgB,qDAAA;AAAA,EAEhB,eAAA,EAAiB,kDAAA;AAAA,EACjB,eAAA,EAAiB,wCAAA;AAAA,EAEjB,mBAAA,EAAqB,gDAAA;AAAA,EAErB,WAAA,EAAa,uBAAA;AAAA,EACb,YAAA,EAAc;AAChB,CAAA;AAMA,IAAM,eAAA,GAAwD;AAAA,EAC5D,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,yBAAyB,IAAI,GAAA,CAAY,MAAA,CAAO,IAAA,CAAK,eAAe,CAAC,CAAA;AAE3E,IAAMA,YAAAA,GAAa,iBAAA;AAMnB,SAAS,kBAAkB,IAAA,EAAuC;AAChE,EAAA,OAAO,sBAAA,CAAuB,IAAI,IAAI,CAAA;AACxC;AAEA,SAAS,cAAc,KAAA,EAAsC;AAC3D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AAExD,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,OACE,OAAO,GAAA,CAAI,WAAA,KAAgB,QAAA,IAC3B,OAAO,IAAI,WAAA,KAAgB,QAAA,IAC3B,OAAO,GAAA,CAAI,YAAA,KAAiB,QAAA;AAEhC;AAMA,SAAS,wBAAA,GAA4C;AACnD,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,SAAS,eAAA,EAAiB,IAAA;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAG/C,EAAA,IAAI,iBAAA,CAAkB,UAAU,CAAA,EAAG;AACjC,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAS,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAC3C,EAAA,IAAI,iBAAA,CAAkB,MAAM,CAAA,EAAG;AAC7B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAMO,IAAM,OAAN,MAAW;AAAA,EACR,OAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA;AAAA,EAER,YAAY,OAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,IAAS,KAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,MAAA;AAClC,IAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,IAAA,CAAK,QAAQ,MAAM,CAAA;AACvD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AAEtB,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,MAAM,CAAA,EAAGA,YAAU,CAAA,0BAAA,EAA6B,IAAA,CAAK,cAAc,CAAA,CAAA,CAAG,CAAA;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,EAAE,GAAA,EAAgC;AAChC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAGA,YAAU,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,MAC/D;AAEA,MAAA,OAAO,EAAA,CAAG,GAAG,CAAA,KAAM,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK,QAAA,KAAa,YAAA,GAAe,GAAA,GAAM,CAAA,UAAA,EAAa,GAAG,CAAA,CAAA,CAAA,CAAA;AAAA,IACtH;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,UAAA,GAA0B;AACxB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAAA,EAC3B;AAAA;AAAA,EAGA,UAAU,MAAA,EAA2B;AACnC,IAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,IAAA,CAAK,QAAQ,MAAM,CAAA;AACvD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AAEtB,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,MAAM,CAAA,EAAGA,YAAU,CAAA,oBAAA,EAAuB,IAAA,CAAK,cAAc,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,aAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMQ,QAAQ,MAAA,EAGd;AAEA,IAAA,IAAI,aAAA,CAAc,MAAM,CAAA,EAAG;AAEzB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,EAAE,GAAG,EAAA,EAAI,GAAG,MAAA,EAAO;AAAA,QAC5B,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF;AAGA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,MAAM,WAAW,wBAAA,EAAyB;AAC1C,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAGA,YAAU,CAAA,uBAAA,EAA0B,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,MAClE;AACA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,gBAAgB,QAAQ,CAAA;AAAA,QACjC,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF;AAGA,IAAA,IAAI,iBAAA,CAAkB,MAAM,CAAA,EAAG;AAC7B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,gBAAgB,MAAM,CAAA;AAAA,QAC/B,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,EAAGA,YAAU,CAAA,iBAAA,EAAoB,MAAA,CAAO,MAAM,CAAC,CAAA,uBAAA;AAAA,OACjD;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,EAAA;AAAA,MACT,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AACF;;;AC/fA,IAAMA,YAAAA,GAAa,iBAAA;AACnB,IAAM,iBAAA,GAAoB,GAAA;AAC1B,IAAM,kBAAA,GAAqB,CAAA;AAC3B,IAAM,aAAA,GAAgB,GAAA;AACtB,IAAM,eAAA,GAAkB,gBAAA;AACxB,IAAM,aAAA,GAAgB,iBAAA;AAwBf,IAAM,eAAN,MAAmB;AAAA,EACP,QAAA;AAAA,EACA,UAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EAET,MAAA,GAA2B,IAAA;AAAA,EAC3B,aAAA,GAAsD,IAAA;AAAA,EACtD,SAAA,GAAY,KAAA;AAAA,EACZ,GAAA,GAA+B,IAAA;AAAA,EAC/B,UAAA,GAAa,KAAA;AAAA,EAErB,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,aAAA;AACxB,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,KAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,IAAS,IAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,IAAI,SAAA,GAA8B;AAChC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,QAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,WAAA,EAAY;AAGjB,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,EAAgB;AACpC,IAAA,IAAI,MAAA,IAAU,CAAC,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,MAAA,IAAA,CAAK,IAAI,uCAAuC,CAAA;AAChD,MAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,KAAK,UAAA,EAAW;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,KAAK,UAAA,EAAW;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAElB,IAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC/B,MAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAC/B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AAEA,IAAA,IAAI,KAAK,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AACf,MAAA,IAAA,CAAK,GAAA,GAAM,IAAA;AAAA,IACb;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,UAAA,CAAW,OAAA,GAAU,CAAA,EAAkB;AACnD,IAAA,IAAI,KAAK,UAAA,EAAY;AAErB,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAA,EAAI,kBAAkB,CAAA,CAAA,CAAG,CAAA;AAEpE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,QAAA,EAAU;AAAA,QAC1C,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,UAAA,EAAY,IAAA,CAAK,YAAY;AAAA,OACrD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,OAAO,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACjD,QAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,UAAA,MAAM,IAAI,mBAAA,CAAoB;AAAA,YAC5B,MAAM,UAAA,CAAW,gBAAA;AAAA,YACjB,OAAA,EAAS,CAAA,wBAAA,EAA2B,QAAA,CAAS,MAAM,KAAK,IAAI,CAAA,CAAA;AAAA,YAC5D,UAAA,EAAY;AAAA,WACb,CAAA;AAAA,QACH;AAEA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,SAAS,MAAM,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACvE;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAMjC,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,OAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AACjD,QAAA,MAAM,IAAI,mBAAA,CAAoB;AAAA,UAC5B,MAAM,UAAA,CAAW,oBAAA;AAAA,UACjB,OAAA,EAAS,gDAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,SAAA,GAAuB;AAAA,QAC3B,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAA,IAAK,IAAA,CAAK,SAAA,IAAa,GAAA,CAAA;AAAA,QAChF,SAAA,EAAW,KAAK,SAAA,IAAa,GAAA;AAAA,QAC7B,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AAEA,MAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,MAAA,IAAA,CAAK,cAAc,SAAS,CAAA;AAC5B,MAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAC7B,MAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,MAAA,IAAA,CAAK,IAAI,IAAA,CAAK,sBAAA,EAAwB,EAAE,SAAA,EAAW,SAAA,CAAU,WAAW,CAAA;AACxE,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,0BAAA,EAA6B,IAAI,IAAA,CAAK,SAAA,CAAU,YAAY,GAAI,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,CAAA;AAAA,IAC5F,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAY,kBAAA,GAAqB,OAAA;AAEvC,MAAA,IAAI,SAAA,GAAY,CAAA,IAAK,EAAE,KAAA,YAAiB,mBAAA,CAAA,EAAsB;AAC5D,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,gCAAA,EAAmC,aAAA,GAAgB,OAAO,CAAA,EAAA,CAAI,CAAA;AACvE,QAAA,IAAA,CAAK,GAAA,CAAI,KAAK,2BAAA,EAA6B;AAAA,UACzC,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAC/D,iBAAA,EAAmB;AAAA,SACpB,CAAA;AAED,QAAA,MAAM,IAAI,OAAA;AAAA,UAAQ,CAAC,OAAA,KACjB,UAAA,CAAW,OAAA,EAAS,gBAAgB,OAAO;AAAA,SAC7C;AACA,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,OAAA,GAAU,CAAC,CAAA;AAAA,MACpC;AAGA,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,2BAAA,EAA6B;AAAA,QACzC,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAC/D,iBAAA,EAAmB;AAAA,OACpB,CAAA;AAED,MAAA,IAAI,KAAA,YAAiB,qBAAqB,MAAM,KAAA;AAEhD,MAAA,MAAM,IAAI,mBAAA,CAAoB;AAAA,QAC5B,MAAM,UAAA,CAAW,oBAAA;AAAA,QACjB,OAAA,EAAS,CAAA,4BAAA,EAA+B,kBAAkB,CAAA,WAAA,EAAc,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,QAC9H,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,MAAA,EAAQ;AAGrC,IAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,EAAM;AAC/B,MAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAAA,IACjC;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,UAAA,GAAa,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,SAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,GAAA;AACtC,IAAA,MAAM,cAAc,KAAA,GAAQ,iBAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,UAAU,CAAA;AAEpD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,sBAAA,EAAyB,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAI,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,MAAA,CAAQ,CAAA;AAEtG,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAW,MAAM;AACpC,MAAA,IAAI,KAAK,UAAA,EAAY;AAGrB,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,IAAA,CAAK,IAAI,qCAAqC,CAAA;AAC9C,QAAA,IAAA,CAAK,UAAA,EAAW,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAC/B,UAAA,IAAA,CAAK,GAAA,CAAI,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAE,CAAA;AAAA,QAC7C,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAI,kEAAkE,CAAA;AAE3E,QAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,MAC5B;AAAA,IACF,GAAG,OAAO,CAAA;AAAA,EACZ;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,MAAA,EAAQ;AAErC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,GAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,GAAG,CAAA;AAE7C,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAW,MAAM;AACpC,MAAA,IAAI,KAAK,UAAA,EAAY;AACrB,MAAA,IAAI,KAAK,MAAA,IAAU,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA,EAAG;AAC9C,QAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,oBAAA,EAAsB,EAA2B,CAAA;AAE/D,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA,IAAI,KAAK,SAAA,EAAW;AAClB,UAAA,IAAA,CAAK,UAAA,EAAW,CAAE,KAAA,CAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF,GAAG,OAAO,CAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAA,GAA8B;AACpC,IAAA,IAAI,OAAO,qBAAqB,WAAA,EAAa;AAE3C,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,IAAA,CAAK,IAAI,gDAAgD,CAAA;AACzD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,GAAA,GAAM,IAAI,gBAAA,CAAiB,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AACvE,MAAA,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,CAAC,KAAA,KAAU;AAC9B,QAAA,MAAM,MAAM,KAAA,CAAM,IAAA;AAElB,QAAA,IAAI,GAAA,CAAI,IAAA,KAAS,eAAA,IAAmB,GAAA,CAAI,KAAA,EAAO;AAC7C,UAAA,IAAA,CAAK,IAAI,iDAAiD,CAAA;AAC1D,UAAA,IAAA,CAAK,SAAS,GAAA,CAAI,KAAA;AAClB,UAAA,IAAA,CAAK,aAAA,CAAc,IAAI,KAAK,CAAA;AAC5B,UAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,UAAA,IAAA,CAAK,GAAA,CAAI,KAAK,sBAAA,EAAwB,EAAE,WAAW,GAAA,CAAI,KAAA,CAAM,WAAW,CAAA;AAAA,QAC1E;AAEA,QAAA,IAAI,GAAA,CAAI,SAAS,iBAAA,EAAmB;AAGlC,UAAA,IAAI,KAAK,SAAA,IAAa,GAAA,CAAI,SAAS,GAAA,CAAI,KAAA,GAAQ,KAAK,MAAA,EAAQ;AAC1D,YAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,YAAA,IAAA,CAAK,IAAI,mCAAmC,CAAA;AAAA,UAC9C;AAAA,QACF;AAAA,MACF,CAAA;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,IAAA,CAAK,IAAI,iDAAiD,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEiB,SAAS,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,aAC9D,MAAA,CAAO,UAAA,EAAW,GAClB,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,EAE9B,WAAA,GAAoB;AAG1B,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,IAAI,WAAA,CAAY;AAAA,QACnB,IAAA,EAAM,iBAAA;AAAA,QACN,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,6BAA6B,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,IAAA,CAAM,CAAA;AAAA,EACrE;AAAA,EAEQ,eAAe,SAAA,EAA4B;AACjD,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,IAAI,WAAA,CAAY;AAAA,QACnB,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,IAAY,UAAA,GAAqB;AAC/B,IAAA,OAAO,CAAA,EAAG,aAAa,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,EAC3C;AAAA,EAEQ,cAAc,IAAA,EAAuB;AAC3C,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACvC,QAAA,YAAA,CAAa,QAAQ,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,eAAA,GAAoC;AAC1C,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,IAAA;AAChD,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAChD,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAU,IAAA,EAA0B;AAC1C,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAC3C,IAAA,OAAO,UAAU,IAAA,CAAK,SAAA;AAAA,EACxB;AAAA,EAEQ,IAAI,OAAA,EAAuB;AACjC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAGA,YAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IAC1C;AAAA,EACF;AACF;;;AClWA,IAAM,kBAAA,GAAqB;AAAA,EACzB,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAA;AAUA,SAAS,YAAA,GAAuB;AAC9B,EAAA,IACE,OAAO,MAAA,KAAW,WAAA,IAClB,OAAO,MAAA,CAAO,eAAe,UAAA,EAC7B;AACA,IAAA,OAAO,OAAO,UAAA,EAAW;AAAA,EAC3B;AAGA,EAAA,OAAO,sCAAA,CAAuC,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM;AACpE,IAAA,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA,GAAM,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,KAAM,GAAA,GAAM,CAAA,GAAK,IAAI,CAAA,GAAO,CAAA;AACtC,IAAA,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,EACtB,CAAC,CAAA;AACH;AAqDO,IAAM,eAAN,MAAmB;AAAA;AAAA,EAGf,UAAA;AAAA,EACA,GAAA;AAAA;AAAA,EAID,eAAA;AAAA,EACA,UAAA,GAAgC,IAAA;AAAA,EAChC,cAAA;AAAA,EACA,eAAA,GAA0C,IAAA;AAAA,EAC1C,iBAAA,GAA8C,IAAA;AAAA,EAC9C,oBAAA,GAAoD,IAAA;AAAA,EACpD,aAAA,GAAsC,IAAA;AAAA,EACtC,cAAA,GAAwC,IAAA;AAAA,EACxC,YAAA,GAAoC,IAAA;AAAA,EACpC,eAAA,GAA0C,IAAA;AAAA,EAC1C,eAAA,GAAiD,IAAA;AAAA,EACjD,WAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA,GAAoC,IAAA;AAAA;AAAA,EAIpC,QAAA,GAAW,KAAA;AAAA,EACX,WAAA,GAA0B,EAAE,MAAA,EAAQ,MAAA,EAAO;AAAA,EAC3C,iBAAA,GAAsC,IAAA;AAAA,EAC7B,QAAA;AAAA,EACT,MAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,wBAAA,GAA2B,IAAI,eAAA,EAAgB;AAAA,EAC/C,YAAA,GAAqC,IAAA;AAAA;AAAA,EAIrC,cAAA,uBAAsC,GAAA,EAAI;AAAA,EAC1C,cAAA;AAAA;AAAA,EAIA,aAAA,uBAAoB,GAAA,EAO1B;AAAA;AAAA;AAAA;AAAA,EAMF,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,SAAA;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,OAAA,EAAS,KAAA,IAAS,KAAA;AAGxC,IAAA,IAAA,CAAK,MAAM,cAAA,CAAe,EAAE,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA;AAGhD,IAAA,IAAA,CAAK,kBAAkB,cAAA,CAAe,OAAA;AAAA,MACpC,IAAA,CAAK,UAAA;AAAA,MACL,MAAM,IAAI,eAAA,CAAgB,IAAA,CAAK,UAAU;AAAA,KAC3C;AAGA,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe;AAAA,MACvC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAGD,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,CAAY;AAAA,MACjC,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,MAAA,EAAQ,QAAQ,OAAA,EAAS,UAAA;AAAA,MACzB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAGD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,IAAA,CAAK;AAAA,MACpB,MAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,MAAA,IAA0B,MAAA;AAAA,MACpD,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAGD,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,aAAA,EAAc;AAGzC,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC5B,QAAA,IAAI,eAAe,aAAA,EAAe;AAChC,UAAA,OAAA,CAAQ,QAAS,GAAG,CAAA;AAAA,QACtB;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,IAAA,EAAM,SAAA,KAAc;AAClC,QAAA,OAAA,CAAQ,OAAA,CAAS;AAAA,UACf,IAAA,EAAM,SAAA;AAAA,UACN,MACE,OAAO,IAAA,KAAS,YAAY,IAAA,KAAS,IAAA,GAChC,OACD,EAAC;AAAA,UACP,SAAA,EAAW,KAAK,GAAA;AAAI,SACrB,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAI,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA,CAAK,YAAA;AAEnC,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,OAAA,EAAQ;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,YAAA;AAAA,IACb,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,OAAA,GAAyB;AAErC,IAAA,MAAM,SAAA,GAAY,KAAK,QAAA,CAAS,GAAA;AAChC,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,IAAA,CAAK,SAAS,aAAA,EAAe;AAC9C,MAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,QAC3B,MAAM,UAAA,CAAW,uBAAA;AAAA,QACjB,OAAA,EAAS,sDAAA;AAAA,QACT,UAAA,EACE;AAAA,OACH,CAAA;AAAA,IACH;AAIA,IAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa;AAAA,QACnC,aAAA,EAAe,KAAK,QAAA,CAAS,aAAA;AAAA,QAC7B,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AACD,MAAA,MAAM,IAAA,CAAK,aAAa,KAAA,EAAM;AAC9B,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK;AACtB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN;AAAA,SAGF;AAAA,MACF;AACA,MAAA,IAAA,CAAK,gBAAgB,QAAA,CAAS;AAAA,QAC5B,IAAA,EAAM,eAAA;AAAA,QACN,OAAA,EAAS,MAAM,IAAA,CAAK,YAAA,EAAc,OAAA;AAAQ,OAC3C,CAAA;AAAA,IACH;AAIA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW;AAAA,MAC/B,WAAA,EAAa,KAAK,QAAA,CAAS,WAAA;AAAA,MAC3B,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAGD,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK;AAC9C,IAAA,IAAA,CAAK,GAAA,CAAI,KAAK,mBAAA,EAAqB;AAAA,MACjC,WAAW,IAAA,CAAK,iBAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACb,CAAA;AAGD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,CAAC,KAAA,KAAU;AACnD,MAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AACzB,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,mBAAA,EAAqB;AAAA,QACjC,SAAA,EAAW,KAAA;AAAA,QACX,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC5B,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,gBAAgB,QAAA,CAAS;AAAA,MAC5B,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACV,CAAA;AAID,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,CAAgB;AAAA,QACzC,MAAA,EAAQ,SAAA;AAAA,QACR,OAAO,IAAA,CAAK,MAAA;AAAA,QACZ,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,UAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,oBAAA,EAAsB,KAAK,CAAA;AAAA,QAC3C,CAAA;AAAA,QACA,UAAA,EAAY,CAAC,QAAA,KAAa;AACxB,UAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,eAAA,EAAiB,QAAQ,CAAA;AAAA,QACzC,CAAA;AAAA,QACA,YAAA,EAAc,CAAC,KAAA,KAAU;AACvB,UAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,iBAAA,EAAmB,KAAK,CAAA;AAAA,QACxC,CAAA;AAAA,QACA,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,UAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAAA,QAC9B;AAAA,OACD,CAAA;AAAA,IACH;AAIA,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,iBAAA,CAAkB;AAAA,MAC7C,cAAA,EAAgB,IAAA,CAAK,QAAA,CAAS,aAAA,GAC1B,IAAA,CAAK,SAAS,aAAA,CAAc,OAAA,CAAQ,UAAA,EAAY,SAAS,CAAA,GACzD,MAAA;AAAA,MACJ,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,iBAAA,CAAkB,aAAA,CAAc,CAAC,KAAA,EAAO,QAAA,KAAa;AACxD,MAAA,IAAA,CAAK,IAAI,IAAA,CAAK,2BAAA,EAA6B,EAAE,KAAA,EAAO,UAAU,CAAA;AAAA,IAChE,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAC7B,IAAA,IAAA,CAAK,gBAAgB,QAAA,CAAS;AAAA,MAC5B,IAAA,EAAM,oBAAA;AAAA,MACN,OAAA,EAAS,MAAM,IAAA,CAAK,iBAAA,EAAmB,IAAA;AAAK,KAC7C,CAAA;AAID,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAI,oBAAA,CAAqB;AAAA,MACnD,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,oBAAA,CAAqB,aAAA,CAAc,CAAC,IAAA,EAAM,EAAA,KAAO;AACpD,MAAA,IAAA,CAAK,IAAI,IAAA,CAAK,kBAAA,EAAoB,EAAE,IAAA,EAAM,IAAI,CAAA;AAG9C,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,UAAA,CAAY,IAAA,EAAK;AAC/C,UAAA,IAAA,CAAK,GAAA,CAAI,KAAK,mBAAA,EAAqB;AAAA,YACjC,WAAW,IAAA,CAAK,iBAAA;AAAA,YAChB,UAAA,EAAY;AAAA,WACb,CAAA;AACD,UAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,QAC5B,GAAG,GAAG,CAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,qBAAqB,KAAA,EAAM;AAChC,IAAA,IAAA,CAAK,gBAAgB,QAAA,CAAS;AAAA,MAC5B,IAAA,EAAM,uBAAA;AAAA,MACN,OAAA,EAAS,MAAM,IAAA,CAAK,oBAAA,EAAsB,IAAA;AAAK,KAChD,CAAA;AAID,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe;AAAA,MACvC,cAAA,EAAgB,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,cAAA;AAAA,MACvC,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,gBAAgB,QAAA,CAAS;AAAA,MAC5B,IAAA,EAAM,iBAAA;AAAA,MACN,OAAA,EAAS,MAAM,IAAA,CAAK,cAAA,EAAgB,OAAA;AAAQ,KAC7C,CAAA;AAID,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,CAAgB;AAAA,MACzC,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,WAAA,EAAa,KAAK,QAAA,CAAS,WAAA;AAAA,MAC3B,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,gBAAgB,QAAA,CAAS;AAAA,MAC5B,IAAA,EAAM,kBAAA;AAAA,MACN,OAAA,EAAS,MAAM,IAAA,CAAK,eAAA,EAAiB,OAAA;AAAQ,KAC9C,CAAA;AAID,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,sBAAA,CAAuB;AAAA,MAChD,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,SAAA,EAAW,CAAC,OAAA,KAAY;AACtB,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA,OAAA,CAAQ,KAAA,CAAM,oCAAA,EAAsC,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AAAA,QAC3E;AAEA,QAAA,IAAA,CAAK,SAAS,OAAA,GAAU;AAAA,UACtB,IAAA,EAAM,CAAA,UAAA,EAAa,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,UAC/B,IAAA,EAAM,OAAA;AAAA,UACN,WAAW,OAAA,CAAQ;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,gBAAgB,QAAA,CAAS;AAAA,MAC5B,IAAA,EAAM,kBAAA;AAAA,MACN,OAAA,EAAS,MAAM,IAAA,CAAK,eAAA,EAAiB,OAAA;AAAQ,KAC9C,CAAA;AAID,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa;AAAA,MACnC,SAAA,EAAW,CAAA;AAAA,MACX,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,UAAA,EAAY,CAAC,IAAA,EAAM,IAAA,KAAS;AAC1B,QAAA,IAAA,CAAK,IAAI,IAAA,CAAK,eAAA,EAAiB,EAAE,IAAA,EAAM,SAAA,EAAW,MAAM,CAAA;AAAA,MAC1D;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAM1B,IAAA;AACE,MAAA,MAAM,YAAuB,IAAA,CAAK,QAAA,CAAS,GAAA,IAAO,EAAE,UAAU,YAAA,EAAa;AAC3E,MAAA,MAAM,YAAuB,IAAA,CAAK,QAAA,CAAS,GAAA,IAAO,EAAE,UAAU,YAAA,EAAa;AAG3E,MAAA,IAAI,cAAA;AACJ,MAAA,IAAI,cAAA;AAEJ,MAAA,IAAI,SAAA,CAAU,aAAa,UAAA,EAAY;AACrC,QAAA,cAAA,GAAiB;AAAA,UACf,QAAA,EAAU,UAAA;AAAA,UACV,QAAQ,SAAA,CAAU,MAAA;AAAA,UAClB,OAAO,SAAA,CAAU;AAAA,SACnB;AAAA,MACF,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,KAAa,YAAA,EAAc;AAC9C,QAAA,cAAA,GAAiB;AAAA,UACf,QAAA,EAAU,YAAA;AAAA,UACV,QAAQ,SAAA,CAAU,MAAA;AAAA,UAClB,UAAU,SAAA,CAAU;AAAA,SACtB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,cAAA,GAAiB;AAAA,UACf,QAAA,EAAU,YAAA;AAAA,UACV,UAAU,SAAA,CAAU,QAAA;AAAA,UACpB,YAAY,SAAA,CAAU,UAAA;AAAA,UACtB,gBAAgB,SAAA,CAAU;AAAA,SAC5B;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,CAAU,aAAa,YAAA,EAAc;AACvC,QAAA,cAAA,GAAiB;AAAA,UACf,QAAA,EAAU,YAAA;AAAA,UACV,QAAQ,SAAA,CAAU,MAAA;AAAA,UAClB,OAAA,EAAS,SAAA,IAAa,SAAA,GAAY,SAAA,CAAU,OAAA,GAAU;AAAA,SACxD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,cAAA,GAAiB;AAAA,UACf,QAAA,EAAU,YAAA;AAAA,UACV,OAAO,SAAA,CAAU,KAAA;AAAA,UACjB,MAAM,SAAA,CAAU,IAAA;AAAA,UAChB,OAAO,SAAA,CAAU,KAAA;AAAA,UACjB,UAAU,SAAA,CAAU;AAAA,SACtB;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,CAAc;AAAA,UACrC,SAAA,EAAW,cAAA;AAAA,UACX,SAAA,EAAW,cAAA;AAAA,UACX,OAAO,IAAA,CAAK;AAAA,SACb,CAAA;AAGD,QAAA,IAAA,CAAK,aAAA,CAAc,aAAA,CAAc,CAAC,KAAA,EAAO,QAAA,KAAa;AACpD,UAAA,IAAA,CAAK,GAAA,CAAI,KAAK,oBAAA,EAAsB,EAAE,MAAM,QAAA,EAAU,EAAA,EAAI,OAAO,CAAA;AAEjE,UAAA,QAAQ,KAAA;AAAO,YACb,KAAK,WAAA;AACH,cAAA,IAAA,CAAK,cAAc,EAAE,MAAA,EAAQ,WAAA,EAAa,UAAA,EAAY,GAAG,CAAA;AACzD,cAAA;AAAA,YACF,KAAK,UAAA;AACH,cAAA,IAAA,CAAK,cAAc,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,IAAI,CAAA;AACxD,cAAA;AAAA,YACF,KAAK,MAAA;AACH,cAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,YAAA,EAAc;AAC5C,gBAAA,IAAA,CAAK,aAAA,CAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,cACvC;AACA,cAAA;AAAA;AACJ,QACF,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,aAAA,CAAc,YAAA,CAAa,CAAC,IAAA,EAAM,OAAA,KAAY;AACjD,UAAA,IAAA,CAAK,GAAA,CAAI,KAAK,kBAAA,EAAoB;AAAA,YAChC,IAAA;AAAA,YACA,OAAA;AAAA,YACA,UAAA,EAAY;AAAA,WACb,CAAA;AACD,UAAA,IAAI,OAAA,IAAW,IAAA,CAAK,IAAA,EAAK,EAAG;AAC1B,YAAA,IAAA,CAAK,aAAA,EAAe,kBAAkB,IAAA,EAAM,CAAC,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,UACrE;AAAA,QACF,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,gBAAgB,QAAA,CAAS;AAAA,UAC5B,IAAA,EAAM,gBAAA;AAAA,UACN,OAAA,EAAS,MAAM,IAAA,CAAK,aAAA,EAAe,OAAA;AAAQ,SAC5C,CAAA;AAAA,MACH,SAAS,IAAA,EAAM;AAEb,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,IAAI,KAAK,MAAA,EAAQ;AACf,UAAA,OAAA,CAAQ,MAAM,gEAAgE,CAAA;AAAA,QAChF;AAAA,MACF;AAAA,IACF;AAIA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,cAAA,EAAe;AACnD,IAAA,IAAI,OAAA,IAAW,KAAK,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,uCAAA;AAAA,QACA,QAAQ,mBAAA,CAAoB,MAAA;AAAA,QAC5B;AAAA,OACF;AAAA,IACF;AAIA,IAAA,IAAA,CAAK,gBAAgB,SAAA,EAAU;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,SAAS,OAAA,IAAU;AAExB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,MAAM,6BAAA,EAA+B;AAAA,QAC3C,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,QAAA,EAAU,IAAA,CAAK,iBAAA,EAAmB,QAAA,CAAS;AAAA,OAC5C,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,QAAA,EAAmC;AAChD,IAAA,IAAI,OAAA,GAAU,QAAA;AACd,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,eAAA,EAAiB;AAC3C,MAAA,MAAM,IAAI,kBAAA,CAAmB;AAAA,QAC3B,MAAM,UAAA,CAAW,uBAAA;AAAA,QACjB,OAAA,EAAS,4CAAA;AAAA,QACT,UAAA,EACE;AAAA,OACH,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,MAAM,IAAI,aAAA,CAAc;AAAA,QACtB,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS,gEAAA;AAAA,QACT,WAAA,EAAa,IAAA;AAAA,QACb,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAErB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,gBAAA,IAAoB,GAAA;AAC1D,IAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAI,aAAA,CAAc;AAAA,QACtB,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS,qCAAqC,MAAM,CAAA,YAAA,CAAA;AAAA,QACpD,WAAA,EAAa,IAAA;AAAA,QACb,UAAA,EAAY,2BAA2B,MAAM,CAAA,8DAAA;AAAA,OAC9C,CAAA;AAAA,IACH;AAGA,IAAA,IAAA,CAAK,YAAY,YAAA,EAAa;AAG9B,IAAA,IAAA,CAAK,cAAc,EAAE,MAAA,EAAQ,YAAA,EAAc,UAAA,EAAY,SAAS,CAAA;AAGhE,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ;AAAA,MAC1B,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,OAAA;AAAA,MACT,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAGD,IAAA,IAAI,YAAA,GAAe,KAAK,cAAA,CAAe,iBAAA;AAAA,MACrC,IAAA,CAAK,iBAAA;AAAA,MACL,KAAK,kBAAA;AAAmB,KAC1B;AAGA,IAAA,IAAI,IAAA,CAAK,SAAS,eAAA,EAAiB;AACjC,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB;AAAA,UAC9C,YAAA;AAAA,UACA,WAAA,EAAa,OAAA;AAAA,UACb,mBAAA,EAAqB,IAAA,CAAK,cAAA,CACvB,UAAA,GACA,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,MAAM,CAAA,CAAE,IAAA,EAAM,OAAA,EAAS,CAAA,CAAE,SAAQ,CAAE;AAAA,SACrD,CAAA;AACD,QAAA,YAAA,GAAe,GAAA,CAAI,YAAA;AACnB,QAAA,OAAA,GAAU,GAAA,CAAI,WAAA;AAAA,MAChB,SAAS,OAAA,EAAS;AAEhB,QAAA,IAAA,CAAK,aAAA,CAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AACrC,QAAA,MAAM,GAAA,GACJ,OAAA,YAAmB,aAAA,GACf,OAAA,GACA,IAAI,aAAA,CAAc;AAAA,UAChB,MAAM,UAAA,CAAW,sBAAA;AAAA,UACjB,OAAA,EACE,OAAA,YAAmB,KAAA,GACf,OAAA,CAAQ,OAAA,GACR,6CAAA;AAAA,UACN,WAAA,EAAa,IAAA;AAAA,UACb,UAAA,EAAY;AAAA,SACb,CAAA;AACP,QAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AAC1B,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,MAAM,iBAAiB,YAAA,EAAa;AACpC,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,oBAAA,EAAsB,EAAE,gBAAgB,CAAA;AAEtD,IAAA,IAAI;AACF,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI,WAAA;AAGJ,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB;AAAA,UACtD,KAAK,IAAA,CAAK,eAAA;AAAA,UACV,YAAA;AAAA,UACA,SAAS,IAAA,CAAK,cAAA,CAAe,YAAW,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAA;AAAA,UACrD,WAAA,EAAa,OAAA;AAAA,UACb,KAAA,EAAO,KAAK,kBAAA,EAAmB;AAAA,UAC/B,MAAA,EAAQ,KAAK,wBAAA,CAAyB;AAAA,SACvC,CAAA;AACD,QAAA,YAAA,GAAe,MAAA,CAAO,IAAA;AACtB,QAAA,WAAA,GAAc,OAAO,UAAA,CAAW,KAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY;AAAA,UACpD,YAAA;AAAA,UACA,SAAS,IAAA,CAAK,cAAA,CAAe,YAAW,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAA;AAAA,UACrD,WAAA,EAAa,OAAA;AAAA,UACb,KAAA,EAAO,KAAK,kBAAA,EAAmB;AAAA,UAC/B,MAAA,EAAQ,KAAK,wBAAA,CAAyB;AAAA,SACvC,CAAA;AACD,QAAA,YAAA,GAAe,MAAA,CAAO,IAAA;AACtB,QAAA,WAAA,GAAc,OAAO,KAAA,CAAM,KAAA;AAAA,MAC7B;AAGA,MAAA,IAAA,CAAK,eAAe,OAAA,CAAQ;AAAA,QAC1B,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,YAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAGD,MAAA,IAAA,CAAK,eAAe,WAAA,EAAY;AAEhC,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,kBAAA,EAAoB;AAAA,QAChC,cAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAA,CAAK,aAAA,CAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAErC,MAAA,OAAO,YAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GACJ,KAAA,YAAiB,aAAA,GACb,KAAA,GACA,IAAI,aAAA,CAAc;AAAA,QAChB,MAAM,UAAA,CAAW,OAAA;AAAA,QACjB,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,QAC3C,WAAA,EAAa,KAAA;AAAA,QACb,UAAA,EAAY;AAAA,OACb,CAAA;AAEP,MAAA,IAAA,CAAK,cAAc,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AAClD,MAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AAC1B,MAAA,MAAM,GAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,SAAA,GAA8B;AAChC,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,UAAA,GAAyB;AAC3B,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,YAAA,GAA8B;AAChC,IAAA,OAAO,IAAA,CAAK,cAAc,KAAA,IAAS,IAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,QAAA,EAAkC;AAC1C,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,QAAQ,CAAA;AAChC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,QAAQ,CAAA;AAAA,IACrC,CAAA;AAAA,EACF;AAAA,EAEA,WAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,CACE,UACA,MAAA,EAKM;AACN,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,GAAgC;AACpC,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA,OAAA,CAAQ,MAAM,4EAAuE,CAAA;AAAA,MACvF;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,cAAc,IAAA,EAAK;AAC9B,IAAA,MAAM,IAAA,CAAK,cAAc,cAAA,EAAe;AAAA,EAC1C;AAAA;AAAA,EAGA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,eAAe,aAAA,EAAc;AAAA,EACpC;AAAA;AAAA,EAGA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,eAAe,YAAA,EAAa;AAAA,EACnC;AAAA;AAAA,EAGA,IAAI,QAAA,GAAoB;AACtB,IAAA,OAAO,KAAK,aAAA,KAAkB,IAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,MAAA,EAKE;AACV,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,EAAgB,OAAO,KAAA;AACjC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,MAAM,CAAA;AACnD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,wBAAA,EAA0B;AAAA,QACtC,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,SAAA,IAAa,EAAA;AAAA,QACjD,WAAW,MAAA,CAAO;AAAA,OACnB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBAAA,GAAyB;AACvB,IAAA,IAAA,CAAK,gBAAgB,gBAAA,EAAiB;AACtC,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,4BAAA,EAA8B,EAAE,CAAA;AAAA,EAChD;AAAA;AAAA,EAGA,eAAA,CAAgB,WAAmB,MAAA,EAAuB;AACxD,IAAA,IAAA,CAAK,cAAA,EAAgB,eAAA,CAAgB,SAAA,EAAW,MAAM,CAAA;AAAA,EACxD;AAAA;AAAA,EAGA,gBAAA,CAAiB,UAAkB,MAAA,EAAuB;AACxD,IAAA,IAAA,CAAK,cAAA,EAAgB,gBAAA,CAAiB,QAAA,EAAU,MAAM,CAAA;AAAA,EACxD;AAAA;AAAA,EAGA,SAAA,CAAU,YAAsB,IAAA,EAAgC;AAC9D,IAAA,IAAA,CAAK,cAAA,EAAgB,SAAA,CAAU,UAAA,EAAY,IAAI,CAAA;AAAA,EACjD;AAAA;AAAA,EAGA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,gBAAgB,YAAA,EAAa;AAAA,EACpC;AAAA;AAAA,EAGA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,gBAAgB,YAAA,EAAa;AAAA,EACpC;AAAA;AAAA,EAGA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,gBAAgB,QAAA,EAAS;AAAA,EAChC;AAAA;AAAA,EAGA,MAAM,SAAS,IAAA,EAAgC;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,oBAAA,EAAsB,OAAO,KAAA;AACvC,IAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,QAAA,CAAS,IAAI,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,OAAA,EAAwC;AACrD,IAAA,IAAA,CAAK,cAAA,CAAe,eAAe,OAAO,CAAA;AAC1C,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,OAAO,CAAA;AAAA,IACzD;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,IAAA,GAAa;AACf,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,iBAAiB,SAAA,IAAa,KAAA;AAAA,EAC5C;AAAA,EAEA,IAAI,UAAU,KAAA,EAAgB;AAC5B,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,gBAAgB,SAAA,GAAY,KAAA;AAAA,IACnC;AACA,IAAA,IAAA,CAAK,eAAe,SAAA,GAAY,KAAA;AAAA,EAClC;AAAA;AAAA,EAGA,IAAI,cAAA,GAAmC;AACrC,IAAA,OAAO,KAAK,cAAA,CAAe,cAAA;AAAA,EAC7B;AAAA,EAEA,IAAI,eAAe,KAAA,EAAyB;AAC1C,IAAA,IAAA,CAAK,eAAe,cAAA,GAAiB,KAAA;AAAA,EACvC;AAAA;AAAA,EAGA,IAAI,gBAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,YAAY,QAAA,EAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAA,GAA0C;AAC9C,IAAA,MAAM,OAAA,GAA6B;AAAA,MACjC,GAAA,EAAK,EAAE,MAAA,EAAQ,gBAAA,EAAiB;AAAA,MAChC,GAAA,EAAK,EAAE,MAAA,EAAQ,gBAAA,EAAiB;AAAA,MAChC,GAAA,EAAK,EAAE,MAAA,EAAQ,gBAAA,EAAiB;AAAA,MAChC,GAAA,EAAK,EAAE,MAAA,EAAQ,gBAAA,EAAiB;AAAA,MAChC,OAAA,EAAS;AAAA,KACX;AAGA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AAEvB,QAAA,OAAA,CAAQ,GAAA,GAAM;AAAA,UACZ,MAAA,EAAQ,IAAA;AAAA,UACR,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SAC1B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,GAAA,GAAM;AAAA,UACZ,MAAA,EAAQ,aAAA;AAAA,UACR,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,SAC9C;AAAA,MACF;AAAA,IACF;AAIA,IAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK;AACrB,MAAA,OAAA,CAAQ,MAAM,EAAE,MAAA,EAAQ,IAAA,CAAK,aAAA,GAAgB,OAAO,UAAA,EAAW;AAAA,IACjE;AAGA,IAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK;AACrB,MAAA,OAAA,CAAQ,MAAM,EAAE,MAAA,EAAQ,IAAA,CAAK,aAAA,GAAgB,OAAO,UAAA,EAAW;AAAA,IACjE;AAGA,IAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,YAAA,EAAc;AAC9D,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,YAAA,CAAa,gBAAA,EAAiB;AAC9D,QAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,YAAY,CAAA;AAC1D,QAAA,OAAA,CAAQ,GAAA,GAAM,EAAE,MAAA,EAAQ,MAAA,GAAS,OAAO,aAAA,EAAc;AAAA,MACxD,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,GAAA,GAAM;AAAA,UACZ,MAAA,EAAQ,aAAA;AAAA,UACR,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,SAC9C;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,CAAQ,GAAA,EAAK,QAAQ,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,GAAG,CAAA;AACpE,IAAA,MAAM,aAAa,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,gBAAgB,CAAA;AACvE,IAAA,IAAI,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA,EAAG;AACtD,MAAA,OAAA,CAAQ,OAAA,GAAU,aAAA;AAAA,IACpB,CAAA,MAAA,IAAW,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,UAAU,CAAA,EAAG;AAC1D,MAAA,OAAA,CAAQ,OAAA,GAAU,UAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,IACpB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,yBAAyB,KAAA,EAAM;AACpC,IAAA,IAAA,CAAK,eAAe,WAAA,EAAY;AAChC,IAAA,cAAA,CAAe,OAAA,CAAQ,KAAK,UAAU,CAAA;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAE1B,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAA,EAAsC,IAAA,CAAK,UAAU,CAAA;AAAA,IACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,KAAA,EAAyB;AAC7C,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,aAAA,EAAc;AACzC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,cAAA,EAAgB;AAC1C,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,aAAA,GAA+B;AACrC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ;AAAA,QACN,SAAS,IAAA,CAAK,QAAA;AAAA,QACd,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,OACE,IAAA,CAAK,WAAA,CAAY,WAAW,OAAA,GACxB,IAAA,CAAK,YAAY,KAAA,GACjB;AAAA,OACR;AAAA,MACA,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,WAAA;AAAA,QACzC,UAAA,EAAY,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW;AAAA;AAC1C,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAA,GAAgH;AACtH,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,WAAA,EACE,oMAAA;AAAA,QACF,UAAA,EAAY;AAAA,UACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,gCAAA,EAAiC;AAAA,UAC3E,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,oCAAA,EAAqC;AAAA,UAC9E,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yBAAA,EAA0B;AAAA,UAClE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA,EAAG,aAAa,kBAAA;AAAmB,SAChH;AAAA,QACA,UAAU,EAAC;AAAA,QACX,aAAA,EAAe,CAAA;AAAA,QACf,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,UAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,UAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,UAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,UAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,UAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU,EAAE,WAAW,QAAA,EAAU,OAAA,EAAS,UAAU,CAAA;AACxE,UAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAAA,QAC3B;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,kBAAA;AAAA,QACN,WAAA,EAAa,uCAAA;AAAA,QACb,YAAY,EAAC;AAAA,QACb,UAAU,EAAC;AAAA,QACX,aAAA,EAAe,CAAA;AAAA,QACf,SAAS,YAAY;AACnB,UAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,UAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,QACzB;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,iBAAA;AAAA,QACN,WAAA,EACE,iFAAA;AAAA,QACF,UAAA,EAAY;AAAA,UACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,gCAAA,EAAiC;AAAA,UAC3E,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,iCAAA;AAAkC,SAC3E;AAAA,QACA,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,QACtB,aAAA,EAAe,CAAA;AAAA,QACf,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,UAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,UAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,UAAA,IAAA,CAAK,eAAA,CAAgB,WAAW,MAAM,CAAA;AACtC,UAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,QACzB;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,WAAA,EACE,uFAAA;AAAA,QACF,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+CAAA;AAAgD,SACvF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM,CAAA;AAAA,QACjB,aAAA,EAAe,CAAA;AAAA,QACf,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,UAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AACvC,UAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,WAAA,EAAa,MAAA,GAAS,OAAO,IAAA,EAAK;AAAA,QAC9D;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,WAAA,EACE,4DAAA;AAAA,QACF,UAAA,EAAY;AAAA,UACV,UAAA,EAAY,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,WAAA,EAAa,2BAAA,EAA4B;AAAA,UACjG,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,MAAA,EAAQ,QAAQ,CAAA,EAAG,WAAA,EAAa,oDAAA;AAAqD,SACtH;AAAA,QACA,QAAA,EAAU,CAAC,YAAY,CAAA;AAAA,QACvB,aAAA,EAAe,CAAA;AAAA,QACf,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,UAAA,MAAM,aAAa,IAAA,CAAK,UAAA;AACxB,UAAA,MAAM,IAAA,GAAQ,KAAK,IAAA,IAA8B,QAAA;AACjD,UAAA,IAAA,CAAK,SAAA,CAAU,YAAY,IAAI,CAAA;AAC/B,UAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,WAAW,MAAA,EAAO;AAAA,QACnD;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,iBAAA;AAAA,QACN,WAAA,EACE,yFAAA;AAAA,QACF,UAAA,EAAY;AAAA,UACV,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,oBAAA,EAAqB;AAAA,UAC/D,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uCAAA;AAAwC,SAChF;AAAA,QACA,UAAU,EAAC;AAAA,QACX,aAAA,EAAe,CAAA;AAAA,QACf,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,UAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,UAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,UAAA,MAAM,QAAQ,IAAA,CAAK,iBAAA;AACnB,UAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,OAAO,yBAAA,EAA0B;AAEtD,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AAC7D,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,cAAA,CAAe,WAAW,SAAS,CAAA;AACvE,cAAA,OAAO;AAAA,gBACL,WAAW,OAAA,CAAQ,EAAA;AAAA,gBACnB,OAAO,OAAA,CAAQ,KAAA;AAAA,gBACf,SAAS,OAAA,CAAQ,OAAA;AAAA,gBACjB,UAAA,EAAY;AAAA,eACd;AAAA,YACF;AACA,YAAA,OAAO,EAAE,KAAA,EAAO,CAAA,SAAA,EAAY,SAAS,CAAA,WAAA,CAAA,EAAc;AAAA,UACrD;AAEA,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,YAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,MAAA;AAAA,cAC7B,CAAC,CAAA,KACC,CAAA,CAAE,KAAA,EAAO,aAAY,CAAE,QAAA,CAAS,UAAU,CAAA,IAC1C,CAAA,CAAE,OAAA,EAAS,WAAA,EAAY,CAAE,SAAS,UAAU;AAAA,aAChD;AACA,YAAA,OAAO;AAAA,cACL,KAAA;AAAA,cACA,OAAA,EAAS,QAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,gBACvC,WAAW,CAAA,CAAE,EAAA;AAAA,gBACb,OAAO,CAAA,CAAE,KAAA;AAAA,gBACT,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,KAAA,CAAM,GAAG,GAAG;AAAA,eAClC,CAAE;AAAA,aACJ;AAAA,UACF;AAEA,UAAA,OAAO,EAAE,OAAO,mCAAA,EAAoC;AAAA,QACtD;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,oBAAA;AAAA,QACN,WAAA,EACE,kEAAA;AAAA,QACF,YAAY,EAAC;AAAA,QACb,UAAU,EAAC;AAAA,QACX,aAAA,EAAe,CAAA;AAAA,QACf,SAAS,YAAY;AACnB,UAAA,MAAM,QAAQ,IAAA,CAAK,iBAAA;AACnB,UAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,QAAA,EAAU,EAAC,EAAE;AAClC,UAAA,OAAO;AAAA,YACL,QAAA,EAAU,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,cAChD,IAAI,CAAA,CAAE,EAAA;AAAA,cACN,OAAO,CAAA,CAAE,KAAA;AAAA,cACT,UAAU,CAAA,CAAE,QAAA;AAAA,cACZ,OAAO,CAAA,CAAE;AAAA,aACX,CAAE;AAAA,WACJ;AAAA,QACF;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,cAAA;AAAA,QACN,WAAA,EACE,4DAAA;AAAA,QACF,UAAA,EAAY;AAAA,UACV,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,sCAAA;AAAuC,SAClF;AAAA,QACA,QAAA,EAAU,CAAC,UAAU,CAAA;AAAA,QACrB,aAAA,EAAe,CAAA;AAAA,QACf,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,UAAA,IAAI,OAAO,aAAa,WAAA,EAAa,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAO,gBAAA,EAAiB;AACtF,UAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAEtB,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC1C,UAAA,IAAI,CAAC,IAAI,OAAO,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,CAAA,mBAAA,EAAsB,QAAQ,CAAA,CAAA,EAAG;AAC1E,UAAA,IAAI,EAAE,cAAc,WAAA,CAAA,EAAc,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAO,0BAAA,EAA2B;AAE7F,UAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,kBAAA;AAC9C,UAAA,MAAM,gBAAA,GAAmB,cAAA,EAAgB,KAAA,EAAO,IAAA,CAAK,CAAC,OAAA,KAAY;AAChE,YAAA,IAAI;AAAE,cAAA,OAAO,EAAA,CAAG,QAAQ,OAAO,CAAA;AAAA,YAAG,CAAA,CAAA,MAAQ;AAAE,cAAA,OAAO,QAAA,KAAa,OAAA;AAAA,YAAS;AAAA,UAC3E,CAAC,CAAA,IAAK,KAAA;AAEN,UAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,YAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,IAAA,CAAK,CAAC,OAAA,KAAY;AACzD,cAAA,IAAI;AAAE,gBAAA,OAAO,EAAA,CAAG,QAAQ,OAAO,CAAA;AAAA,cAAG,CAAA,CAAA,MAAQ;AAAE,gBAAA,OAAO,KAAA;AAAA,cAAO;AAAA,YAC5D,CAAC,CAAA;AACD,YAAA,IAAI,aAAA,EAAe;AACjB,cAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,UAAA,EAAa,QAAQ,CAAA,gFAAA,CAAA,EAAmF;AAAA,YAC1I;AAAA,UACF;AAEA,UAAA,IAAI,cAAA,EAAgB,MAAM,MAAA,EAAQ;AAChC,YAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,CAAC,OAAA,KAAY;AACnD,cAAA,IAAI;AAAE,gBAAA,OAAO,EAAA,CAAG,QAAQ,OAAO,CAAA;AAAA,cAAG,CAAA,CAAA,MAAQ;AAAE,gBAAA,OAAO,QAAA,KAAa,OAAA;AAAA,cAAS;AAAA,YAC3E,CAAC,CAAA;AACD,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,UAAA,EAAa,QAAQ,CAAA,8BAAA,CAAA,EAAiC;AAAA,YACxF;AAAA,UACF;AAEA,UAAA,IAAI,cAAA,EAAgB,KAAA,EAAO,MAAA,IAAU,CAAC,gBAAA,EAAkB;AACtD,YAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,UAAA,EAAa,QAAQ,CAAA,iDAAA,CAAA,EAAoD;AAAA,UAC3G;AAEA,UAAA,EAAA,CAAG,KAAA,EAAM;AACT,UAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,QACzB;AAAA,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,qBAAA;AAAA,QACN,WAAA,EACE,gFAAA;AAAA,QACF,UAAA,EAAY;AAAA,UACV,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yBAAA,EAA0B;AAAA,UACnE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2BAAA;AAA4B,SACrE;AAAA,QACA,QAAA,EAAU,CAAC,UAAU,CAAA;AAAA,QACrB,aAAA,EAAe,CAAA;AAAA,QACf,OAAA,EAAS,OAAO,IAAA,KAAS;AACvB,UAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,UAAA,MAAM,MAAA,GAAU,IAAA,CAAK,MAAA,IAAsC,EAAC;AAC5D,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAC9C,UAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAE,KAAA,EAAO,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAA,EAAG;AAC3D,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AAC1C,YAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AAAA,UACjC,SAAS,GAAA,EAAK;AACZ,YAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAE;AAAA,UACnF;AAAA,QACF;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACxB,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,mBAAA,EAAoB,EAAG;AAC7C,MAAA,IAAA,CAAK,YAAA,CAAa,aAAa,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,IAC3E;AAAA,EACF;AAAA,EAEQ,kBAAA,GAAuC;AAC7C,IAAA,MAAM,YAAA,GAAiC,IAAA,CAAK,mBAAA,EAAoB,CAAE,GAAA;AAAA,MAChE,CAAC,EAAE,OAAA,EAAS,QAAA,EAAU,GAAG,KAAI,KAAM;AAAA,KACrC;AAGA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,CAAA,IAAK,KAAK,aAAA,EAAe;AACnD,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QAChB,IAAA,EAAM,UAAU,QAAQ,CAAA,CAAA;AAAA,QACxB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AACF","file":"index.cjs","sourcesContent":["// ---------------------------------------------------------------------------\n// GuideKit SDK - Typed EventBus\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical map of every event in the GuideKit system.\n *\n * Keys use a `namespace:name` convention (except the top-level `error` event).\n * Values are the payload types that accompany each event.\n */\nexport interface EventMap {\n // -- DOM events -----------------------------------------------------------\n 'dom:scan-complete': { pageModel: unknown; durationMs: number };\n 'dom:mutation-detected': { mutations: number; debounced: boolean };\n 'dom:route-change': { from: string; to: string };\n\n // -- LLM events -----------------------------------------------------------\n 'llm:response-start': { conversationId: string };\n 'llm:response-chunk': { text: string; done: boolean };\n 'llm:response-end': { conversationId: string; totalTokens: number };\n 'llm:tool-call': { name: string; arguments: Record<string, unknown> };\n 'llm:token-usage': { prompt: number; completion: number; total: number };\n\n // -- Voice events ---------------------------------------------------------\n 'voice:state-change': { from: string; to: string };\n 'voice:transcript': { text: string; isFinal: boolean; confidence: number };\n 'voice:tts-start': { utterance: string };\n 'voice:tts-end': { utterance: string; durationMs: number };\n 'voice:degraded': { reason: string; fallback: 'text' };\n\n // -- Auth events ----------------------------------------------------------\n 'auth:token-refreshed': { expiresAt: number };\n 'auth:token-refresh-failed': { error: Error; attemptsRemaining: number };\n 'auth:token-expired': Record<string, never>;\n\n // -- Connectivity events --------------------------------------------------\n 'connectivity:state-change': {\n state: 'online' | 'degraded' | 'offline';\n previous: 'online' | 'degraded' | 'offline';\n };\n\n // -- Awareness events -----------------------------------------------------\n 'awareness:dwell': { sectionId: string; durationMs: number };\n 'awareness:idle': { durationMs: number };\n 'awareness:rage-click': { selector: string; clicks: number };\n 'awareness:section-visible': { sectionId: string; ratio: number };\n\n // -- Visual events --------------------------------------------------------\n 'visual:spotlight-shown': { selector: string; sectionId?: string };\n 'visual:spotlight-dismissed': Record<string, never>;\n 'visual:tour-step': {\n stepIndex: number;\n totalSteps: number;\n sectionId: string;\n };\n\n // -- Top-level error event ------------------------------------------------\n error: Error;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helper types\n// ---------------------------------------------------------------------------\n\n/** Handler for a concrete, known event key. */\ntype TypedHandler<K extends keyof EventMap> = (data: EventMap[K]) => void;\n\n/** Handler for a wildcard (namespace) subscription. */\ntype WildcardHandler = (data: unknown, eventName: string) => void;\n\n/** Discriminated wrapper so we can store both kinds in one map. */\ntype StoredHandler =\n | { kind: 'typed'; fn: TypedHandler<any> }\n | { kind: 'wildcard'; fn: WildcardHandler };\n\n// ---------------------------------------------------------------------------\n// EventBus\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Bus]';\n\nexport class EventBus {\n /** Per-event listeners. Wildcard keys end with `:*`. */\n private readonly listeners = new Map<string, StoredHandler[]>();\n\n /** Listeners registered via `onAny`. */\n private readonly anyListeners: WildcardHandler[] = [];\n\n /** When true, every `emit` is logged to the console. */\n private readonly debug: boolean;\n\n constructor(options?: { debug?: boolean }) {\n this.debug = options?.debug ?? false;\n }\n\n // ---- on (specific event) ------------------------------------------------\n\n /**\n * Subscribe to a specific typed event.\n *\n * @returns An unsubscribe function.\n */\n on<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void,\n ): () => void;\n\n /**\n * Subscribe to a namespace wildcard (e.g. `'dom:*'`).\n * The handler receives `(data, eventName)`.\n *\n * @returns An unsubscribe function.\n */\n on(\n event: `${string}:*`,\n handler: (data: unknown, eventName: string) => void,\n ): () => void;\n\n /** Unified implementation. */\n on(event: string, handler: (...args: any[]) => void): () => void {\n const isWildcard = event.endsWith(':*');\n const stored: StoredHandler = isWildcard\n ? { kind: 'wildcard', fn: handler as WildcardHandler }\n : { kind: 'typed', fn: handler as TypedHandler<any> };\n\n let list = this.listeners.get(event);\n if (!list) {\n list = [];\n this.listeners.set(event, list);\n }\n list.push(stored);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const arr = this.listeners.get(event);\n if (!arr) return;\n const idx = arr.indexOf(stored);\n if (idx !== -1) arr.splice(idx, 1);\n if (arr.length === 0) this.listeners.delete(event);\n };\n }\n\n // ---- onAny --------------------------------------------------------------\n\n /**\n * Subscribe to **every** event emitted on the bus.\n *\n * @returns An unsubscribe function.\n */\n onAny(handler: (data: unknown, eventName: string) => void): () => void {\n this.anyListeners.push(handler);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const idx = this.anyListeners.indexOf(handler);\n if (idx !== -1) this.anyListeners.splice(idx, 1);\n };\n }\n\n // ---- emit ---------------------------------------------------------------\n\n /**\n * Emit a typed event.\n *\n * Handlers are invoked synchronously in registration order. If a handler\n * throws, the error is logged and remaining handlers still execute.\n */\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n if (this.debug) {\n console.log(LOG_PREFIX, event, data);\n }\n\n const eventKey = event as string;\n\n // 1. Exact-match listeners\n const exact = this.listeners.get(eventKey);\n if (exact) {\n // Snapshot to avoid issues if a handler adds/removes listeners\n const snapshot = exact.slice();\n for (const entry of snapshot) {\n this.invokeSafe(entry.fn, data, eventKey);\n }\n }\n\n // 2. Namespace wildcard listeners (e.g. \"dom:*\" matches \"dom:scan-complete\")\n const colonIdx = eventKey.indexOf(':');\n if (colonIdx !== -1) {\n const ns = eventKey.slice(0, colonIdx);\n const wildcardKey = `${ns}:*`;\n const wildcardList = this.listeners.get(wildcardKey);\n if (wildcardList) {\n const snapshot = wildcardList.slice();\n for (const entry of snapshot) {\n this.invokeSafe(entry.fn, data, eventKey);\n }\n }\n }\n\n // 3. `onAny` listeners\n if (this.anyListeners.length > 0) {\n const snapshot = this.anyListeners.slice();\n for (const fn of snapshot) {\n this.invokeSafe(fn, data, eventKey);\n }\n }\n }\n\n // ---- once ---------------------------------------------------------------\n\n /**\n * Subscribe to a specific event, automatically unsubscribing after the\n * first invocation.\n *\n * @returns An unsubscribe function (also cancels a not-yet-fired listener).\n */\n once<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void,\n ): () => void {\n const unsub = this.on(event, ((data: EventMap[K]) => {\n unsub();\n handler(data);\n }) as any);\n return unsub;\n }\n\n // ---- removeAll ----------------------------------------------------------\n\n /** Remove **all** listeners from the bus. */\n removeAll(): void {\n this.listeners.clear();\n this.anyListeners.length = 0;\n }\n\n // ---- listenerCount ------------------------------------------------------\n\n /**\n * Return the number of registered listeners.\n *\n * - If `event` is provided, returns the count for that specific event key\n * (including wildcard keys like `'dom:*'`).\n * - If omitted, returns the total across all events plus `onAny` listeners.\n */\n listenerCount(event?: string): number {\n if (event !== undefined) {\n return this.listeners.get(event)?.length ?? 0;\n }\n\n let total = this.anyListeners.length;\n for (const list of this.listeners.values()) {\n total += list.length;\n }\n return total;\n }\n\n // ---- private helpers ----------------------------------------------------\n\n /**\n * Invoke a handler inside a try/catch so one misbehaving handler never\n * prevents the remaining handlers from executing.\n */\n private invokeSafe(fn: (...args: any[]) => void, ...args: any[]): void {\n try {\n fn(...args);\n } catch (err) {\n console.error(\n LOG_PREFIX,\n 'Handler threw an error:',\n err,\n );\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new {@link EventBus} instance.\n *\n * ```ts\n * const bus = createEventBus({ debug: true });\n * const unsub = bus.on('dom:scan-complete', (data) => {\n * console.log(data.pageModel, data.durationMs);\n * });\n * bus.emit('dom:scan-complete', { pageModel: {}, durationMs: 42 });\n * unsub();\n * ```\n */\nexport function createEventBus(options?: { debug?: boolean }): EventBus {\n return new EventBus(options);\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Resource Lifecycle Manager\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Resources]';\n\n/** Timeout in milliseconds for each resource cleanup operation. */\nconst CLEANUP_TIMEOUT_MS = 2_000;\n\n// ---------------------------------------------------------------------------\n// Resource interface\n// ---------------------------------------------------------------------------\n\n/**\n * A disposable resource that the SDK tracks for deterministic cleanup.\n * Each resource has a unique name and a cleanup function that may be async.\n */\nexport interface Resource {\n name: string;\n cleanup: () => void | Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// ResourceManager\n// ---------------------------------------------------------------------------\n\n/** Lifecycle states for a ResourceManager instance. */\nexport type ResourceManagerState =\n | 'initializing'\n | 'ready'\n | 'tearing_down'\n | 'torn_down';\n\n/**\n * Manages the lifecycle of SDK resources (AbortControllers, event listeners,\n * WebSocket connections, etc.) and ensures deterministic cleanup on unmount.\n *\n * Resources are cleaned up sequentially — order matters because later\n * resources may depend on earlier ones still being alive during their own\n * cleanup phase.\n */\nexport class ResourceManager {\n readonly instanceId: string;\n\n private _state: ResourceManagerState = 'initializing';\n private readonly _resources: Map<string, Resource> = new Map();\n private _destroyPromise: Promise<void> | null = null;\n private _destroyCancelled = false;\n\n constructor(instanceId?: string) {\n this.instanceId = instanceId ?? generateId();\n debug(`Created ResourceManager \"${this.instanceId}\"`);\n }\n\n // -------------------------------------------------------------------------\n // State\n // -------------------------------------------------------------------------\n\n /** Current lifecycle state. */\n get state(): ResourceManagerState {\n return this._state;\n }\n\n /** Number of currently registered resources. */\n get resourceCount(): number {\n return this._resources.size;\n }\n\n // -------------------------------------------------------------------------\n // Registration\n // -------------------------------------------------------------------------\n\n /**\n * Register a resource for cleanup tracking.\n *\n * @throws If the manager has already been torn down.\n */\n register(resource: Resource): void {\n if (this._state === 'torn_down') {\n throw new Error(\n `${LOG_PREFIX} Cannot register resource \"${resource.name}\" — manager is torn down`,\n );\n }\n\n if (this._resources.has(resource.name)) {\n debug(\n `Replacing existing resource \"${resource.name}\" in \"${this.instanceId}\"`,\n );\n }\n\n this._resources.set(resource.name, resource);\n debug(\n `Registered \"${resource.name}\" in \"${this.instanceId}\" (total: ${this._resources.size})`,\n );\n }\n\n /**\n * Unregister a specific resource by name without invoking its cleanup.\n */\n unregister(name: string): void {\n const deleted = this._resources.delete(name);\n if (deleted) {\n debug(\n `Unregistered \"${name}\" from \"${this.instanceId}\" (total: ${this._resources.size})`,\n );\n }\n }\n\n // -------------------------------------------------------------------------\n // AbortController helper\n // -------------------------------------------------------------------------\n\n /**\n * Create a tracked AbortController. On destroy, its `abort()` method will\n * be called automatically.\n */\n createAbortController(name: string): AbortController {\n const controller = new AbortController();\n\n this.register({\n name,\n cleanup: () => {\n if (!controller.signal.aborted) {\n controller.abort();\n }\n },\n });\n\n return controller;\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle transitions\n // -------------------------------------------------------------------------\n\n /** Transition from `initializing` to `ready`. */\n markReady(): void {\n if (this._state === 'initializing') {\n this._state = 'ready';\n debug(`\"${this.instanceId}\" is now ready`);\n }\n }\n\n /**\n * Destroy all registered resources sequentially.\n *\n * Each resource gets up to {@link CLEANUP_TIMEOUT_MS}ms to complete.\n * If cleanup exceeds the timeout a warning is logged and the manager\n * proceeds to the next resource.\n *\n * After all resources are processed the state transitions to `torn_down`.\n * Calling `destroy()` multiple times returns the same promise.\n */\n async destroy(): Promise<void> {\n // Idempotent — return existing promise if already running / finished.\n if (this._destroyPromise) {\n return this._destroyPromise;\n }\n\n this._state = 'tearing_down';\n this._destroyCancelled = false;\n\n debug(\n `Destroying \"${this.instanceId}\" (${this._resources.size} resource(s))`,\n );\n\n this._destroyPromise = this._performDestroy();\n return this._destroyPromise;\n }\n\n /**\n * Cancel a pending destroy, transitioning back to `ready`.\n *\n * This exists to support React 18 StrictMode which unmounts then\n * immediately re-mounts components. If the re-mount arrives while\n * teardown is still in progress, cancelling prevents resource loss.\n *\n * @returns `true` if teardown was pending and has been cancelled.\n * `false` if already torn down or not currently tearing down.\n */\n cancelDestroy(): boolean {\n if (this._state !== 'tearing_down') {\n return false;\n }\n\n debug(`Cancelling destroy for \"${this.instanceId}\"`);\n this._destroyCancelled = true;\n this._state = 'ready';\n this._destroyPromise = null;\n return true;\n }\n\n // -------------------------------------------------------------------------\n // Internal\n // -------------------------------------------------------------------------\n\n /** Sequential cleanup with per-resource timeout. */\n private async _performDestroy(): Promise<void> {\n // Snapshot the resource names so we iterate a stable list.\n const names = Array.from(this._resources.keys());\n\n for (const name of names) {\n // If cancelDestroy() was called mid-teardown, bail out early.\n if (this._destroyCancelled) {\n debug(\n `Destroy cancelled mid-teardown for \"${this.instanceId}\" — stopping cleanup`,\n );\n return;\n }\n\n const resource = this._resources.get(name);\n if (!resource) {\n continue;\n }\n\n try {\n /**\n * Cleanup timeout: logs warning but resolves promise regardless.\n * Resources may leak if cleanup takes longer than the timeout period.\n */\n await withTimeout(resource.cleanup(), CLEANUP_TIMEOUT_MS, () => {\n console.warn(\n `${LOG_PREFIX} Cleanup timeout for \"${name}\" (${CLEANUP_TIMEOUT_MS}ms)`,\n );\n });\n } catch (err) {\n console.warn(\n `${LOG_PREFIX} Cleanup error for \"${name}\":`,\n err,\n );\n }\n\n this._resources.delete(name);\n }\n\n // Only transition to torn_down if we were not cancelled.\n if (!this._destroyCancelled) {\n this._state = 'torn_down';\n debug(`\"${this.instanceId}\" is now torn down`);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// SingletonGuard – ref-counted singleton map\n// ---------------------------------------------------------------------------\n\ninterface GuardEntry {\n manager: ResourceManager;\n refCount: number;\n pendingDestroyTimer: ReturnType<typeof setTimeout> | null;\n}\n\n/**\n * Ref-counted singleton guard keyed by `instanceId`.\n *\n * - `acquire()` increments the ref count (or creates the manager).\n * - `release()` decrements the ref count. When it reaches 0 a\n * `setTimeout(0)` is scheduled to allow React StrictMode re-mount to\n * reclaim the instance before it is destroyed.\n * - If a mount arrives during `TEARING_DOWN`, the teardown is cancelled\n * and the manager transitions back to `READY`.\n */\nexport class SingletonGuard {\n private static readonly _entries: Map<string, GuardEntry> = new Map();\n\n /**\n * Acquire (or create) a ResourceManager for the given instanceId.\n *\n * @param instanceId Unique identifier for the singleton slot.\n * @param factory Called to create a fresh ResourceManager when none\n * exists or the previous one has been torn down.\n */\n static acquire(\n instanceId: string,\n factory: () => ResourceManager,\n ): ResourceManager {\n const existing = SingletonGuard._entries.get(instanceId);\n\n if (existing) {\n // Cancel any pending deferred destruction.\n if (existing.pendingDestroyTimer !== null) {\n clearTimeout(existing.pendingDestroyTimer);\n existing.pendingDestroyTimer = null;\n debug(`Cleared pending destroy timer for \"${instanceId}\"`);\n }\n\n // If the manager is mid-teardown, cancel it.\n if (existing.manager.state === 'tearing_down') {\n const cancelled = existing.manager.cancelDestroy();\n if (cancelled) {\n debug(\n `Re-acquired \"${instanceId}\" — cancelled in-flight teardown`,\n );\n }\n }\n\n // If the previous manager was fully torn down, replace it.\n if (existing.manager.state === 'torn_down') {\n debug(\n `Previous manager for \"${instanceId}\" is torn down — creating new one`,\n );\n const manager = factory();\n SingletonGuard._entries.set(instanceId, {\n manager,\n refCount: 1,\n pendingDestroyTimer: null,\n });\n return manager;\n }\n\n existing.refCount += 1;\n debug(\n `Acquired \"${instanceId}\" (refCount: ${existing.refCount})`,\n );\n return existing.manager;\n }\n\n // First acquisition — create a new entry.\n const manager = factory();\n SingletonGuard._entries.set(instanceId, {\n manager,\n refCount: 1,\n pendingDestroyTimer: null,\n });\n debug(`Created new singleton for \"${instanceId}\"`);\n return manager;\n }\n\n /**\n * Release a reference to the manager. When the ref count drops to 0 a\n * `setTimeout(0)` delay is introduced before destruction so that React\n * StrictMode's synchronous re-mount can reclaim the instance.\n */\n static release(instanceId: string): void {\n const entry = SingletonGuard._entries.get(instanceId);\n if (!entry) {\n debug(`Release called for unknown instanceId \"${instanceId}\"`);\n return;\n }\n\n entry.refCount = Math.max(0, entry.refCount - 1);\n debug(`Released \"${instanceId}\" (refCount: ${entry.refCount})`);\n\n if (entry.refCount === 0) {\n // Defer destruction so StrictMode re-mount can reclaim.\n entry.pendingDestroyTimer = setTimeout(() => {\n entry.pendingDestroyTimer = null;\n\n // Double-check nobody re-acquired in the meantime.\n if (entry.refCount > 0) {\n return;\n }\n\n debug(`Destroying singleton \"${instanceId}\" (refCount is 0)`);\n entry.manager.destroy().then(() => {\n // Only remove from the map if it is still the same entry and\n // the manager successfully tore down.\n if (\n SingletonGuard._entries.get(instanceId) === entry &&\n entry.manager.state === 'torn_down'\n ) {\n SingletonGuard._entries.delete(instanceId);\n debug(`Removed singleton entry for \"${instanceId}\"`);\n }\n });\n }, 0);\n }\n }\n\n /**\n * Retrieve a manager by instanceId without affecting the ref count.\n * Returns `undefined` if no manager exists for the given id.\n */\n static get(instanceId: string): ResourceManager | undefined {\n return SingletonGuard._entries.get(instanceId)?.manager;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Race a (possibly async) operation against a timeout.\n * If the timeout wins, `onTimeout` is called and the function resolves\n * (it does **not** reject — the next resource should still be processed).\n */\nfunction withTimeout(\n work: void | Promise<void>,\n ms: number,\n onTimeout: () => void,\n): Promise<void> {\n // Synchronous cleanup — no timeout needed.\n if (!(work instanceof Promise)) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n onTimeout();\n resolve();\n }\n }, ms);\n\n work.then(\n () => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n resolve();\n }\n },\n (err) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n // Re-throw so the caller's catch block can log it.\n // We wrap in a rejected promise to keep the signature clean.\n resolve(Promise.reject(err));\n }\n },\n );\n });\n}\n\n/** Simple random ID generator (no crypto dependency required). */\nfunction generateId(): string {\n return `gk_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Conditional debug logging — only logs when globalThis has a truthy `__GUIDEKIT_DEBUG__` flag. */\nfunction debug(...args: unknown[]): void {\n if (\n typeof globalThis !== 'undefined' &&\n (globalThis as Record<string, unknown>).__GUIDEKIT_DEBUG__\n ) {\n console.debug(LOG_PREFIX, ...args);\n }\n}\n","/**\n * @module @guidekit/core/dom\n *\n * DOM intelligence engine for the GuideKit SDK.\n * Scans the current page and builds a structured PageModel that serves as\n * grounding context for the LLM on every turn.\n *\n * Key design decisions:\n * - SSR-safe: every browser API is guarded behind `typeof document/window`.\n * - Privacy-first: password fields and PII patterns are never captured.\n * - Budget-constrained: hard limits on node count and tree depth prevent\n * runaway scans on large pages.\n * - Mutation-resilient: MutationObserver is throttled and circuit-broken.\n */\n\nimport type {\n PageModel,\n PageSection,\n NavItem,\n InteractiveElement,\n FormSummary,\n FormField,\n OverlayElement,\n ScanMetadata,\n} from '../types/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_NODES = 5000;\nconst DEFAULT_MAX_SECTIONS = 20;\nconst DEFAULT_MAX_DEPTH = 15;\n\nconst MUTATION_DEBOUNCE_MS = 500;\nconst MUTATION_CIRCUIT_BREAKER_THRESHOLD = 100; // mutations per second\nconst CIRCUIT_BREAKER_COOLDOWN_MS = 2000;\nconst MIN_RESCAN_INTERVAL_MS = 2000;\n\nconst LOG_PREFIX = '[GuideKit:DOM]';\n\n/** Semantic tags that qualify as sections without additional attributes. */\nconst SECTION_TAGS = new Set([\n 'SECTION',\n 'ARTICLE',\n 'MAIN',\n 'ASIDE',\n 'HEADER',\n 'FOOTER',\n 'NAV',\n]);\n\n/** Tags that map to landmark roles for scoring. */\nconst LANDMARK_TAG_MAP: Record<string, string> = {\n HEADER: 'banner',\n FOOTER: 'contentinfo',\n NAV: 'navigation',\n MAIN: 'main',\n ASIDE: 'complementary',\n};\n\n/** Interactive element selectors. */\nconst INTERACTIVE_SELECTOR =\n 'button, a[href], input, select, textarea, [role=\"button\"], [role=\"link\"], [tabindex]';\n\n/** Tags whose text value must never be captured. */\nconst SENSITIVE_INPUT_TYPES = new Set(['password', 'tel', 'email']);\n\n/** PII regex patterns stripped from text content. */\nconst PII_PATTERNS: RegExp[] = [\n // Email addresses\n /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n // US phone numbers (various formats)\n /(\\+?1[-.\\s]?)?(\\(?\\d{3}\\)?[-.\\s]?)?\\d{3}[-.\\s]?\\d{4}/g,\n // SSN\n /\\b\\d{3}[-]?\\d{2}[-]?\\d{4}\\b/g,\n // Credit card numbers (basic)\n /\\b(?:\\d[ -]*?){13,19}\\b/g,\n];\n\n// ---------------------------------------------------------------------------\n// Utility helpers\n// ---------------------------------------------------------------------------\n\n/** Simple string hash (djb2). */\nfunction djb2Hash(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return (hash >>> 0).toString(36);\n}\n\n/** Strip PII from a string. */\nfunction stripPII(text: string): string {\n let result = text;\n for (const pattern of PII_PATTERNS) {\n // Reset lastIndex for global regexps that are reused\n pattern.lastIndex = 0;\n result = result.replace(pattern, '[REDACTED]');\n }\n return result;\n}\n\n/** Truncate a string to a max length, adding ellipsis if needed. */\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max).trimEnd() + '\\u2026';\n}\n\n/** Collapse whitespace in a string. */\nfunction collapseWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/** Get visible text content from an element, limited in length. */\nfunction getTextContent(el: Element, maxLen: number = 200): string {\n const raw = el.textContent ?? '';\n return stripPII(truncate(collapseWhitespace(raw), maxLen));\n}\n\n/** Check whether an element is visible in the layout sense (not IntersectionObserver). */\nfunction isElementVisible(el: Element): boolean {\n if (typeof window === 'undefined') return false;\n const style = window.getComputedStyle(el);\n return (\n style.display !== 'none' &&\n style.visibility !== 'hidden' &&\n style.opacity !== '0'\n );\n}\n\n/** Get an accessible label for an element. */\nfunction getAccessibleLabel(el: Element): string {\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n const ariaLabelledBy = el.getAttribute('aria-labelledby');\n if (ariaLabelledBy && typeof document !== 'undefined') {\n const labelEl = document.getElementById(ariaLabelledBy);\n if (labelEl) return collapseWhitespace(labelEl.textContent ?? '');\n }\n\n return '';\n}\n\n/** Request idle callback with fallback. */\nfunction scheduleIdle(cb: () => void): void {\n if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {\n (window as unknown as { requestIdleCallback: (cb: () => void) => void }).requestIdleCallback(cb);\n } else if (typeof setTimeout !== 'undefined') {\n setTimeout(cb, 0);\n } else {\n cb();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Selector builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a stable CSS selector for an element following the priority hierarchy:\n * 1. data-guidekit-target\n * 2. id\n * 3. data-testid\n * 4. aria-label\n * 5. Structural path fallback\n */\nfunction buildSelector(el: Element): string {\n // 1. GuideKit target (highest priority)\n const guideKitTarget = el.getAttribute('data-guidekit-target');\n if (guideKitTarget) {\n return `[data-guidekit-target=\"${guideKitTarget}\"]`;\n }\n\n // 2. ID\n const id = el.id;\n if (id && typeof document !== 'undefined') {\n // Verify uniqueness\n try {\n const matches = document.querySelectorAll(`#${CSS.escape(id)}`);\n if (matches.length === 1) {\n return `#${CSS.escape(id)}`;\n }\n } catch {\n // CSS.escape may not be available; fall through\n }\n }\n\n // 3. data-testid\n const testId = el.getAttribute('data-testid');\n if (testId) {\n return `[data-testid=\"${testId}\"]`;\n }\n\n // 4. aria-label\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) {\n return `[aria-label=\"${ariaLabel}\"]`;\n }\n\n // 5. Structural path fallback\n return buildStructuralPath(el);\n}\n\n/** Build a structural CSS selector path from root to the element. */\nfunction buildStructuralPath(el: Element): string {\n const parts: string[] = [];\n let current: Element | null = el;\n\n while (current && current !== document.documentElement) {\n const tag = current.tagName.toLowerCase();\n\n if (tag === 'body' || tag === 'html') {\n parts.unshift(tag);\n current = current.parentElement;\n continue;\n }\n\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (c) => c.tagName === current!.tagName,\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n parts.unshift(`${tag}:nth-child(${index})`);\n } else {\n parts.unshift(tag);\n }\n } else {\n parts.unshift(tag);\n }\n\n current = parent;\n }\n\n return parts.join(' > ');\n}\n\n// ---------------------------------------------------------------------------\n// Section ID generation\n// ---------------------------------------------------------------------------\n\nlet sectionCounter = 0;\n\nfunction generateSectionId(el: Element): string {\n const guideKitTarget = el.getAttribute('data-guidekit-target');\n if (guideKitTarget) return guideKitTarget;\n\n const id = el.id;\n if (id) return id;\n\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) {\n return ariaLabel\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n }\n\n sectionCounter += 1;\n return `section-${sectionCounter}`;\n}\n\n// ---------------------------------------------------------------------------\n// DOMScanner\n// ---------------------------------------------------------------------------\n\nexport interface DOMScannerOptions {\n rootElement?: HTMLElement;\n debug?: boolean;\n maxNodes?: number;\n maxSections?: number;\n maxDepth?: number;\n}\n\nexport class DOMScanner {\n private readonly root: HTMLElement | null;\n private readonly debug: boolean;\n private readonly maxNodes: number;\n private readonly maxSections: number;\n private readonly maxDepth: number;\n\n private cachedModel: PageModel | null = null;\n\n // Visibility tracking (updated via IntersectionObserver)\n private visibilityMap: Map<Element, number> = new Map();\n\n // MutationObserver state\n private observer: MutationObserver | null = null;\n private mutationCount = 0;\n private mutationWindowStart = 0;\n private circuitBroken = false;\n private circuitBrokenTimer: ReturnType<typeof setTimeout> | null = null;\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private lastScanTime = 0;\n\n constructor(options?: DOMScannerOptions) {\n const isBrowser =\n typeof document !== 'undefined' && typeof window !== 'undefined';\n\n this.root = options?.rootElement ?? (isBrowser ? document.body : null);\n this.debug = options?.debug ?? false;\n this.maxNodes = options?.maxNodes ?? DEFAULT_MAX_NODES;\n this.maxSections = options?.maxSections ?? DEFAULT_MAX_SECTIONS;\n this.maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH;\n\n this.log('Initialised', {\n root: this.root?.tagName,\n maxNodes: this.maxNodes,\n maxSections: this.maxSections,\n maxDepth: this.maxDepth,\n });\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /** Perform a full scan and return a PageModel. */\n scan(): PageModel {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n this.log('SSR environment detected, returning empty model');\n return this.emptyModel();\n }\n\n if (!this.root) {\n this.log('No root element available, returning empty model');\n return this.emptyModel();\n }\n\n this.log('Starting scan');\n const startTime = performance.now();\n\n // Reset section counter per scan\n sectionCounter = 0;\n\n let nodesScanned = 0;\n let budgetExhausted = false;\n\n // Phase 1: Walk DOM and collect candidate section elements\n const candidateSections: Array<{ el: Element; depth: number }> = [];\n const allElements: Element[] = [];\n\n const walker = document.createTreeWalker(\n this.root,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node: Node): number => {\n const el = node as Element;\n\n // Skip guidekit-ignore subtrees\n if (el.hasAttribute('data-guidekit-ignore')) {\n return NodeFilter.FILTER_REJECT;\n }\n\n // Budget check\n if (nodesScanned >= this.maxNodes) {\n budgetExhausted = true;\n return NodeFilter.FILTER_REJECT;\n }\n\n nodesScanned++;\n return NodeFilter.FILTER_ACCEPT;\n },\n },\n );\n\n // Walk the tree\n let currentNode = walker.nextNode();\n while (currentNode) {\n const el = currentNode as Element;\n allElements.push(el);\n\n // Check if this is a candidate section\n const depth = this.getDepth(el);\n if (depth <= this.maxDepth && this.isSectionCandidate(el)) {\n candidateSections.push({ el, depth });\n }\n\n currentNode = walker.nextNode();\n }\n\n this.log(`Walked ${nodesScanned} nodes, found ${candidateSections.length} section candidates`);\n\n // Phase 2: Extract page data\n const sections = this.extractSections(candidateSections);\n const navigation = this.extractNavigation();\n const interactiveElements = this.extractInteractiveElements();\n const forms = this.extractForms();\n const activeOverlays = this.extractOverlays();\n const meta = this.extractMeta();\n\n const scanMetadata: ScanMetadata = {\n totalSectionsFound: candidateSections.length,\n sectionsIncluded: sections.length,\n totalNodesScanned: nodesScanned,\n scanBudgetExhausted: budgetExhausted,\n };\n\n const model: PageModel = {\n url: window.location.href,\n title: document.title ?? '',\n meta,\n sections,\n navigation,\n interactiveElements,\n forms,\n activeOverlays,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n orientation:\n window.innerWidth >= window.innerHeight ? 'landscape' : 'portrait',\n },\n allSectionsSummary: sections.map(\n (s) => `[${s.label}] ${s.summary}`,\n ),\n hash: '',\n timestamp: Date.now(),\n scanMetadata,\n };\n\n // Generate hash from key model content\n model.hash = this.generateHash(model);\n\n this.cachedModel = model;\n\n const elapsed = (performance.now() - startTime).toFixed(1);\n this.log(`Scan complete in ${elapsed}ms`, {\n sections: sections.length,\n navItems: navigation.length,\n interactive: interactiveElements.length,\n forms: forms.length,\n overlays: activeOverlays.length,\n nodesScanned,\n budgetExhausted,\n });\n\n return model;\n }\n\n /**\n * Set up a MutationObserver that rescans on DOM changes.\n * Returns a cleanup function to disconnect the observer.\n */\n observe(callback: (model: PageModel) => void): () => void {\n if (typeof MutationObserver === 'undefined' || !this.root) {\n this.log('MutationObserver not available or no root');\n return () => {};\n }\n\n this.log('Starting observation');\n\n const handleMutations = (_mutations: MutationRecord[]) => {\n const now = Date.now();\n\n // --- Circuit breaker ---\n if (now - this.mutationWindowStart > 1000) {\n // New one-second window\n this.mutationCount = _mutations.length;\n this.mutationWindowStart = now;\n } else {\n this.mutationCount += _mutations.length;\n }\n\n if (this.mutationCount > MUTATION_CIRCUIT_BREAKER_THRESHOLD) {\n if (!this.circuitBroken) {\n this.circuitBroken = true;\n this.log('Circuit breaker tripped — pausing observation');\n\n // Disconnect temporarily\n this.observer?.disconnect();\n\n this.circuitBrokenTimer = setTimeout(() => {\n this.circuitBroken = false;\n this.mutationCount = 0;\n this.log('Circuit breaker reset — resuming observation');\n this.startObserving();\n this.triggerRescan(callback);\n }, CIRCUIT_BREAKER_COOLDOWN_MS);\n }\n return;\n }\n\n // --- Debounce ---\n if (this.debounceTimer !== null) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.debounceTimer = null;\n this.triggerRescan(callback);\n }, MUTATION_DEBOUNCE_MS);\n };\n\n this.observer = new MutationObserver(handleMutations);\n this.startObserving();\n\n // Return cleanup function\n return () => {\n this.log('Stopping observation');\n this.cleanup();\n };\n }\n\n /** Update visibility data from an IntersectionObserver. */\n updateVisibility(entries: IntersectionObserverEntry[]): void {\n for (const entry of entries) {\n this.visibilityMap.set(entry.target, entry.intersectionRatio);\n }\n }\n\n /** Get the current cached page model. */\n get currentModel(): PageModel | null {\n return this.cachedModel;\n }\n\n // -------------------------------------------------------------------------\n // Private: Observation helpers\n // -------------------------------------------------------------------------\n\n private startObserving(): void {\n if (!this.observer || !this.root) return;\n\n this.observer.observe(this.root, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\n 'class',\n 'style',\n 'hidden',\n 'aria-hidden',\n 'aria-label',\n 'role',\n 'data-guidekit-target',\n 'data-guidekit-ignore',\n 'disabled',\n ],\n });\n }\n\n private triggerRescan(callback: (model: PageModel) => void): void {\n const now = Date.now();\n if (now - this.lastScanTime < MIN_RESCAN_INTERVAL_MS) {\n this.log('Rescan throttled');\n return;\n }\n\n this.lastScanTime = now;\n\n scheduleIdle(() => {\n const model = this.scan();\n callback(model);\n });\n }\n\n private cleanup(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = null;\n }\n if (this.debounceTimer !== null) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n if (this.circuitBrokenTimer !== null) {\n clearTimeout(this.circuitBrokenTimer);\n this.circuitBrokenTimer = null;\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Section extraction\n // -------------------------------------------------------------------------\n\n private isSectionCandidate(el: Element): boolean {\n const tag = el.tagName;\n\n // Semantic section tags\n if (SECTION_TAGS.has(tag)) return true;\n\n // Divs or other elements with role, aria-label, or id\n if (\n el.getAttribute('role') ||\n el.getAttribute('aria-label') ||\n el.id\n ) {\n return true;\n }\n\n return false;\n }\n\n private extractSections(\n candidates: Array<{ el: Element; depth: number }>,\n ): PageSection[] {\n const scored: PageSection[] = [];\n\n for (const { el, depth } of candidates) {\n const section = this.buildPageSection(el, depth);\n scored.push(section);\n }\n\n // Sort by score descending\n scored.sort((a, b) => b.score - a.score);\n\n // Take top N\n return scored.slice(0, this.maxSections);\n }\n\n private buildPageSection(el: Element, depth: number): PageSection {\n const tag = el.tagName;\n const selector = buildSelector(el);\n\n // Determine label\n const label = this.getSectionLabel(el);\n\n // Get summary from first ~100 chars of text\n const summary = getTextContent(el, 100);\n\n // Check visibility\n const visRatio = this.visibilityMap.get(el) ?? 0;\n const isVisible = visRatio > 0 || this.isInViewport(el);\n\n // Check for interactive elements\n const hasInteractive =\n el.querySelector(INTERACTIVE_SELECTOR) !== null;\n\n // Determine landmark\n const landmark = this.getLandmark(el);\n\n // Has heading?\n const hasHeading = el.querySelector('h1, h2, h3, h4, h5, h6') !== null;\n\n // Score\n const score = this.scoreSection({\n isVisible,\n hasInteractive,\n landmark,\n hasHeading,\n depth,\n el,\n });\n\n return {\n id: generateSectionId(el),\n selector,\n tagName: tag.toLowerCase(),\n label,\n summary,\n isVisible,\n visibilityRatio: visRatio,\n score,\n landmark: landmark ?? undefined,\n hasInteractiveElements: hasInteractive,\n depth,\n };\n }\n\n private getSectionLabel(el: Element): string {\n // 1. aria-label\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // 2. First heading\n const heading = el.querySelector('h1, h2, h3, h4, h5, h6');\n if (heading) {\n const text = collapseWhitespace(heading.textContent ?? '');\n if (text) return stripPII(truncate(text, 80));\n }\n\n // 3. id as fallback\n if (el.id) return el.id;\n\n // 4. Tag name\n return el.tagName.toLowerCase();\n }\n\n private getLandmark(el: Element): string | null {\n // Explicit role\n const role = el.getAttribute('role');\n if (role) return role;\n\n // Implicit landmark via tag\n const implicit = LANDMARK_TAG_MAP[el.tagName];\n if (implicit) return implicit;\n\n // section/article with aria-label count as landmarks\n if (\n (el.tagName === 'SECTION' || el.tagName === 'ARTICLE') &&\n el.getAttribute('aria-label')\n ) {\n return el.tagName === 'SECTION' ? 'region' : 'article';\n }\n\n return null;\n }\n\n private scoreSection(params: {\n isVisible: boolean;\n hasInteractive: boolean;\n landmark: string | null;\n hasHeading: boolean;\n depth: number;\n el: Element;\n }): number {\n let score = 0;\n\n if (params.isVisible) score += 100;\n if (params.hasInteractive) score += 20;\n if (params.landmark) score += 15;\n\n // Near scroll position\n if (typeof window !== 'undefined') {\n const rect = params.el.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n if (\n rect.top >= -viewportHeight &&\n rect.top <= viewportHeight * 2\n ) {\n score += 10;\n }\n }\n\n if (params.hasHeading) score += 5;\n\n // Depth penalty\n score -= params.depth * 2;\n\n return score;\n }\n\n // -------------------------------------------------------------------------\n // Private: Navigation extraction\n // -------------------------------------------------------------------------\n\n private extractNavigation(): NavItem[] {\n if (typeof document === 'undefined') return [];\n\n const navElements = this.root?.querySelectorAll('nav') ?? [];\n const items: NavItem[] = [];\n\n navElements.forEach((nav) => {\n if (nav.hasAttribute('data-guidekit-ignore')) return;\n\n const links = nav.querySelectorAll('a[href]');\n links.forEach((link) => {\n const anchor = link as HTMLAnchorElement;\n const label = collapseWhitespace(anchor.textContent ?? '');\n if (!label) return;\n\n const href = anchor.getAttribute('href') ?? '';\n const isCurrent =\n anchor.getAttribute('aria-current') === 'page' ||\n anchor.classList.contains('active') ||\n (typeof window !== 'undefined' && anchor.href === window.location.href);\n\n items.push({\n label: stripPII(truncate(label, 60)),\n href,\n isCurrent,\n selector: buildSelector(anchor),\n });\n });\n });\n\n return items;\n }\n\n // -------------------------------------------------------------------------\n // Private: Interactive elements extraction\n // -------------------------------------------------------------------------\n\n private extractInteractiveElements(): InteractiveElement[] {\n if (typeof document === 'undefined' || !this.root) return [];\n\n const elements = this.root.querySelectorAll(INTERACTIVE_SELECTOR);\n const result: InteractiveElement[] = [];\n\n elements.forEach((el) => {\n // Skip elements inside ignored subtrees\n if (el.closest('[data-guidekit-ignore]')) return;\n\n const htmlEl = el as HTMLElement;\n const tag = el.tagName.toLowerCase();\n const type = el.getAttribute('type') ?? undefined;\n\n // Skip sensitive input types — never capture their labels from value/placeholder\n const isSensitive =\n tag === 'input' && SENSITIVE_INPUT_TYPES.has(type ?? '');\n\n // Get label\n let label = getAccessibleLabel(el);\n if (!label && !isSensitive) {\n label = collapseWhitespace(el.textContent ?? '');\n }\n if (!label) {\n const placeholder = el.getAttribute('placeholder');\n if (placeholder && !isSensitive) {\n label = placeholder;\n }\n }\n if (!label && el.getAttribute('title')) {\n label = el.getAttribute('title') ?? '';\n }\n if (!label && isSensitive) {\n label = type ?? 'input';\n }\n label = stripPII(truncate(label, 60));\n\n const role = el.getAttribute('role') ?? undefined;\n const isDisabled =\n htmlEl.hasAttribute('disabled') ||\n htmlEl.getAttribute('aria-disabled') === 'true';\n const guideKitTarget =\n el.getAttribute('data-guidekit-target') ?? undefined;\n\n result.push({\n selector: buildSelector(el),\n tagName: tag,\n type,\n label,\n role,\n isDisabled,\n guideKitTarget,\n });\n });\n\n return result;\n }\n\n // -------------------------------------------------------------------------\n // Private: Form extraction\n // -------------------------------------------------------------------------\n\n private extractForms(): FormSummary[] {\n if (typeof document === 'undefined' || !this.root) return [];\n\n const formElements = this.root.querySelectorAll('form');\n const result: FormSummary[] = [];\n\n formElements.forEach((form) => {\n if (form.closest('[data-guidekit-ignore]')) return;\n\n const fields = this.extractFormFields(form);\n const hasValidationErrors = fields.some((f) => f.hasError);\n\n result.push({\n selector: buildSelector(form),\n id: form.id || undefined,\n action: form.action || undefined,\n fields,\n hasValidationErrors,\n });\n });\n\n return result;\n }\n\n private extractFormFields(form: HTMLFormElement): FormField[] {\n const fields: FormField[] = [];\n const fieldElements = form.querySelectorAll(\n 'input, select, textarea',\n );\n\n fieldElements.forEach((el) => {\n const input = el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n const name = input.name || input.id || '';\n const type =\n el.tagName === 'SELECT'\n ? 'select'\n : el.tagName === 'TEXTAREA'\n ? 'textarea'\n : (el as HTMLInputElement).type || 'text';\n\n // Find label\n let label = '';\n if (input.id && typeof document !== 'undefined') {\n const labelEl = document.querySelector(\n `label[for=\"${CSS.escape(input.id)}\"]`,\n );\n if (labelEl) {\n label = collapseWhitespace(labelEl.textContent ?? '');\n }\n }\n if (!label) {\n // Check for wrapping label\n const parentLabel = input.closest('label');\n if (parentLabel) {\n label = collapseWhitespace(parentLabel.textContent ?? '');\n }\n }\n if (!label) {\n label = getAccessibleLabel(el);\n }\n if (!label) {\n const placeholder = el.getAttribute('placeholder');\n label = placeholder ?? name;\n }\n label = stripPII(truncate(label, 60));\n\n // Required?\n const isRequired =\n input.hasAttribute('required') ||\n input.getAttribute('aria-required') === 'true';\n\n // Validation error\n const hasError =\n input.getAttribute('aria-invalid') === 'true' ||\n (input instanceof HTMLInputElement && !input.validity.valid && input.value !== '');\n\n let errorMessage: string | undefined;\n const errorId = input.getAttribute('aria-errormessage') ?? input.getAttribute('aria-describedby');\n if (hasError && errorId && typeof document !== 'undefined') {\n const errorEl = document.getElementById(errorId);\n if (errorEl) {\n errorMessage = collapseWhitespace(errorEl.textContent ?? '');\n }\n }\n if (hasError && !errorMessage && input instanceof HTMLInputElement) {\n errorMessage = input.validationMessage || undefined;\n }\n\n fields.push({\n selector: buildSelector(el),\n name,\n type,\n label,\n isRequired,\n hasError,\n errorMessage,\n });\n });\n\n return fields;\n }\n\n // -------------------------------------------------------------------------\n // Private: Overlay detection\n // -------------------------------------------------------------------------\n\n private extractOverlays(): OverlayElement[] {\n if (typeof document === 'undefined' || typeof window === 'undefined' || !this.root) {\n return [];\n }\n\n const result: OverlayElement[] = [];\n\n // 1. Elements with explicit dialog roles\n const dialogElements = this.root.querySelectorAll(\n '[role=\"dialog\"], [role=\"alertdialog\"], dialog',\n );\n dialogElements.forEach((el) => {\n if (el.closest('[data-guidekit-ignore]')) return;\n const label = getAccessibleLabel(el) || getTextContent(el, 40) || 'dialog';\n result.push({\n selector: buildSelector(el),\n type: 'modal',\n label: stripPII(label),\n isVisible: isElementVisible(el),\n });\n });\n\n // 2. Common modal patterns: high z-index + fixed/absolute positioning\n const allElements = this.root.querySelectorAll('*');\n const seen = new Set<Element>(dialogElements);\n\n allElements.forEach((el) => {\n if (seen.has(el)) return;\n if (el.closest('[data-guidekit-ignore]')) return;\n\n const style = window.getComputedStyle(el);\n const position = style.position;\n const zIndex = parseInt(style.zIndex, 10) || 0;\n\n if (\n (position === 'fixed' || position === 'absolute') &&\n !isNaN(zIndex) &&\n zIndex >= 1000\n ) {\n const visible = isElementVisible(el);\n if (!visible) return;\n\n // Determine overlay type heuristically\n const overlayType = this.classifyOverlay(el, style);\n if (!overlayType) return;\n\n const label =\n getAccessibleLabel(el) || getTextContent(el, 40) || overlayType;\n\n result.push({\n selector: buildSelector(el),\n type: overlayType,\n label: stripPII(label),\n isVisible: visible,\n });\n }\n });\n\n return result;\n }\n\n private classifyOverlay(\n el: Element,\n style: CSSStyleDeclaration,\n ): OverlayElement['type'] | null {\n const role = el.getAttribute('role');\n if (role === 'dialog' || role === 'alertdialog') return 'modal';\n if (role === 'menu' || role === 'listbox') return 'dropdown';\n\n // Check class names for hints\n const className = el.className?.toString?.() ?? '';\n const lower = className.toLowerCase();\n\n if (lower.includes('modal') || lower.includes('dialog')) return 'modal';\n if (lower.includes('drawer') || lower.includes('sidebar')) return 'drawer';\n if (\n lower.includes('dropdown') ||\n lower.includes('menu') ||\n lower.includes('popover')\n )\n return 'dropdown';\n\n // Fixed elements covering large area are likely modals\n const width = parseFloat(style.width);\n const height = parseFloat(style.height);\n if (\n typeof window !== 'undefined' &&\n !isNaN(width) &&\n !isNaN(height) &&\n width > window.innerWidth * 0.5 &&\n height > window.innerHeight * 0.5\n ) {\n return 'modal';\n }\n\n // Small positioned element is likely a popover\n if (!isNaN(width) && width < 400) return 'popover';\n\n return null;\n }\n\n // -------------------------------------------------------------------------\n // Private: Meta extraction\n // -------------------------------------------------------------------------\n\n private extractMeta(): PageModel['meta'] {\n if (typeof document === 'undefined') {\n return { description: '', h1: null, language: 'en' };\n }\n\n const descMeta = document.querySelector('meta[name=\"description\"]');\n const description = descMeta?.getAttribute('content') ?? '';\n\n const h1El = document.querySelector('h1');\n const h1 = h1El ? stripPII(collapseWhitespace(h1El.textContent ?? '')) : null;\n\n const language =\n document.documentElement.getAttribute('lang') ?? 'en';\n\n return {\n description: stripPII(description),\n h1,\n language,\n };\n }\n\n // -------------------------------------------------------------------------\n // Private: Helpers\n // -------------------------------------------------------------------------\n\n private getDepth(el: Element): number {\n let depth = 0;\n let current: Element | null = el;\n const root = this.root;\n\n while (current && current !== root && depth < this.maxDepth + 1) {\n current = current.parentElement;\n depth++;\n }\n\n return depth;\n }\n\n private isInViewport(el: Element): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const rect = el.getBoundingClientRect();\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n } catch {\n return false;\n }\n }\n\n private generateHash(model: PageModel): string {\n // Hash key structural content for change detection\n const content = [\n model.url,\n model.title,\n model.meta.h1 ?? '',\n model.sections.map((s) => `${s.id}:${s.label}`).join(','),\n model.navigation.map((n) => n.href).join(','),\n model.interactiveElements.length.toString(),\n model.forms.length.toString(),\n model.activeOverlays.length.toString(),\n ].join('|');\n\n return djb2Hash(content);\n }\n\n private emptyModel(): PageModel {\n return {\n url: typeof window !== 'undefined' ? window.location.href : '',\n title: typeof document !== 'undefined' ? document.title ?? '' : '',\n meta: { description: '', h1: null, language: 'en' },\n sections: [],\n navigation: [],\n interactiveElements: [],\n forms: [],\n activeOverlays: [],\n viewport: { width: 0, height: 0, orientation: 'portrait' },\n allSectionsSummary: [],\n hash: '',\n timestamp: Date.now(),\n scanMetadata: {\n totalSectionsFound: 0,\n sectionsIncluded: 0,\n totalNodesScanned: 0,\n scanBudgetExhausted: false,\n },\n };\n }\n\n private log(message: string, data?: Record<string, unknown>): void {\n if (!this.debug) return;\n if (typeof console !== 'undefined') {\n if (data) {\n console.log(`${LOG_PREFIX} ${message}`, data);\n } else {\n console.log(`${LOG_PREFIX} ${message}`);\n }\n }\n }\n}\n","/**\n * @module @guidekit/core/context\n *\n * Context manager for the GuideKit SDK.\n * Assembles the LLM system prompt from the current page model, manages\n * conversation history with automatic eviction, resolves content-map entries,\n * and persists session state across page navigations via sessionStorage.\n */\n\nimport type {\n PageModel,\n ConversationTurn,\n ContentMapInput,\n ContentMap,\n ContentMapEntry,\n AgentConfig,\n ToolDefinition,\n SessionState,\n} from '../types/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SESSION_STORAGE_KEY = 'guidekit:session';\nconst DEFAULT_MAX_TURNS = 20;\nconst DEFAULT_MAX_SESSION_SIZE_BYTES = 50_000; // 50 KB\nconst DEFAULT_TOKEN_BUDGET = 6_000; // ~1 500 tokens\nconst CONTENT_MAP_TIMEOUT_MS = 2_000;\nconst CONTENT_CACHE_TTL_MS = 30_000; // 30 seconds\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Measure byte-length of a string in UTF-8. */\nfunction byteLength(str: string): number {\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(str).byteLength;\n }\n // Fallback for environments without TextEncoder (unlikely in modern runtimes)\n let bytes = 0;\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n if (code <= 0x7f) bytes += 1;\n else if (code <= 0x7ff) bytes += 2;\n else if (code >= 0xd800 && code <= 0xdfff) {\n bytes += 4;\n i++; // surrogate pair\n } else bytes += 3;\n }\n return bytes;\n}\n\n/** Race a promise against a timeout, returning `null` on timeout. */\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T | null> {\n return new Promise<T | null>((resolve) => {\n let settled = false;\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve(null);\n }\n }, ms);\n\n promise\n .then((value) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n resolve(value);\n }\n })\n .catch(() => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n resolve(null);\n }\n });\n });\n}\n\n/** Check whether sessionStorage is available (SSR-safe). */\nfunction hasSessionStorage(): boolean {\n try {\n return (\n typeof window !== 'undefined' &&\n typeof window.sessionStorage !== 'undefined'\n );\n } catch {\n // In some environments, accessing sessionStorage itself can throw (e.g. sandboxed iframes).\n return false;\n }\n}\n\n/** Truncate a string to a maximum character count, appending an ellipsis if trimmed. */\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 1) + '\\u2026';\n}\n\n// ---------------------------------------------------------------------------\n// Content cache entry\n// ---------------------------------------------------------------------------\n\ninterface CachedContent {\n entry: ContentMapEntry | null;\n expiresAt: number;\n}\n\n// ---------------------------------------------------------------------------\n// ContextManager\n// ---------------------------------------------------------------------------\n\nexport interface ContextManagerOptions {\n agent?: AgentConfig;\n contentMap?: ContentMapInput;\n maxTurns?: number;\n maxSessionSizeBytes?: number;\n tokenBudget?: number;\n debug?: boolean;\n}\n\nexport class ContextManager {\n private agent: AgentConfig;\n private contentMap: ContentMapInput | undefined;\n private maxTurns: number;\n private maxSessionSizeBytes: number;\n private tokenBudget: number;\n private debug: boolean;\n\n private history: ConversationTurn[] = [];\n private contentCache: Map<string, CachedContent> = new Map();\n\n // Session preferences (persisted across navigations)\n private _userPreference: 'voice' | 'text' = 'text';\n private _quietMode = false;\n private _pageContext: Record<string, unknown> = {};\n\n constructor(options?: ContextManagerOptions) {\n this.agent = options?.agent ?? {};\n this.contentMap = options?.contentMap;\n this.maxTurns = options?.maxTurns ?? DEFAULT_MAX_TURNS;\n this.maxSessionSizeBytes =\n options?.maxSessionSizeBytes ?? DEFAULT_MAX_SESSION_SIZE_BYTES;\n this.tokenBudget = options?.tokenBudget ?? DEFAULT_TOKEN_BUDGET;\n this.debug = options?.debug ?? false;\n }\n\n // -------------------------------------------------------------------------\n // System prompt\n // -------------------------------------------------------------------------\n\n /**\n * Build the full system prompt from the current page model and available\n * tools. The output is capped at `tokenBudget` characters so it fits\n * comfortably inside the LLM context window alongside conversation history.\n */\n buildSystemPrompt(pageModel: PageModel, tools: ToolDefinition[]): string {\n const parts: string[] = [];\n\n // -- Role ----------------------------------------------------------------\n parts.push(this.buildRoleSection());\n\n // -- Current Page --------------------------------------------------------\n parts.push(this.buildCurrentPageSection(pageModel));\n\n // -- Page Sections -------------------------------------------------------\n parts.push(this.buildPageSectionsSection(pageModel));\n\n // -- Navigation ----------------------------------------------------------\n if (pageModel.navigation.length > 0) {\n parts.push(this.buildNavigationSection(pageModel));\n }\n\n // -- Interactive Elements ------------------------------------------------\n if (pageModel.interactiveElements.length > 0) {\n parts.push(this.buildInteractiveElementsSection(pageModel));\n }\n\n // -- Forms ---------------------------------------------------------------\n if (pageModel.forms.length > 0) {\n parts.push(this.buildFormsSection(pageModel));\n }\n\n // -- User Viewport -------------------------------------------------------\n parts.push(this.buildViewportSection(pageModel));\n\n // -- Available Actions ---------------------------------------------------\n if (tools.length > 0) {\n parts.push(this.buildToolsSection(tools));\n }\n\n // -- Developer Context ---------------------------------------------------\n const pageCtxKeys = Object.keys(this._pageContext);\n if (pageCtxKeys.length > 0) {\n parts.push(this.buildPageContextSection());\n }\n\n // -- Guidelines ----------------------------------------------------------\n parts.push(this.buildGuidelinesSection());\n\n // Join and enforce budget\n let prompt = parts.join('\\n\\n');\n if (prompt.length > this.tokenBudget) {\n prompt = this.trimPromptToBudget(prompt, pageModel, tools);\n }\n\n return prompt;\n }\n\n // -------------------------------------------------------------------------\n // Conversation history\n // -------------------------------------------------------------------------\n\n /** Append a turn to the conversation history, enforcing size constraints. */\n addTurn(turn: ConversationTurn): void {\n this.history.push(turn);\n this.enforceHistoryLimits();\n }\n\n /** Return a copy of the current conversation history. */\n getHistory(): ConversationTurn[] {\n return this.history.slice();\n }\n\n /** Clear all conversation history. */\n clearHistory(): void {\n this.history = [];\n }\n\n // -------------------------------------------------------------------------\n // Content map\n // -------------------------------------------------------------------------\n\n /**\n * Resolve a `ContentMapEntry` for the given `sectionId`.\n *\n * - Static maps are looked up directly.\n * - Function-based maps are called with a 2-second timeout.\n * - Results are cached for 30 seconds per section ID.\n */\n async getContent(sectionId: string): Promise<ContentMapEntry | null> {\n // Check cache first\n const cached = this.contentCache.get(sectionId);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.entry;\n }\n\n if (this.contentMap === undefined) {\n return null;\n }\n\n let entry: ContentMapEntry | null;\n\n if (typeof this.contentMap === 'function') {\n try {\n const result = this.contentMap(sectionId);\n if (result instanceof Promise) {\n entry = await withTimeout(result, CONTENT_MAP_TIMEOUT_MS);\n } else {\n entry = result;\n }\n } catch (err) {\n this.log('Content map function threw for sectionId:', sectionId, err);\n entry = null;\n }\n } else {\n // Static Record<string, ContentMapEntry>\n entry = (this.contentMap as ContentMap)[sectionId] ?? null;\n }\n\n // Cache the result\n this.contentCache.set(sectionId, {\n entry,\n expiresAt: Date.now() + CONTENT_CACHE_TTL_MS,\n });\n\n return entry;\n }\n\n /** Replace the content map used for section lookups. Clears the cache. */\n setContentMap(contentMap: ContentMapInput): void {\n this.contentMap = contentMap;\n this.contentCache.clear();\n }\n\n // -------------------------------------------------------------------------\n // Session preferences\n // -------------------------------------------------------------------------\n\n get userPreference(): 'voice' | 'text' {\n return this._userPreference;\n }\n\n set userPreference(value: 'voice' | 'text') {\n this._userPreference = value;\n }\n\n get quietMode(): boolean {\n return this._quietMode;\n }\n\n set quietMode(value: boolean) {\n this._quietMode = value;\n }\n\n // -------------------------------------------------------------------------\n // Page context (dynamic context injection)\n // -------------------------------------------------------------------------\n\n /** Set developer-supplied page context (merged into system prompt). */\n setPageContext(context: Record<string, unknown>): void {\n this._pageContext = { ...this._pageContext, ...context };\n this.log('Page context updated', Object.keys(context));\n }\n\n /** Get the current page context. */\n getPageContext(): Record<string, unknown> {\n return { ...this._pageContext };\n }\n\n /** Clear all page context. */\n clearPageContext(): void {\n this._pageContext = {};\n }\n\n // -------------------------------------------------------------------------\n // Session persistence\n // -------------------------------------------------------------------------\n\n /** Persist the current session state to `sessionStorage`. */\n saveSession(): void {\n if (!hasSessionStorage()) return;\n\n const state = this.getSessionState();\n try {\n window.sessionStorage.setItem(\n SESSION_STORAGE_KEY,\n JSON.stringify(state),\n );\n } catch (err) {\n this.log('Failed to save session:', err);\n }\n }\n\n /** Restore a previously persisted session from `sessionStorage`. */\n restoreSession(): SessionState | null {\n if (!hasSessionStorage()) return null;\n\n try {\n const raw = window.sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (!raw) return null;\n\n const state = JSON.parse(raw) as SessionState;\n\n // Validate minimal shape\n if (\n !Array.isArray(state.conversationHistory) ||\n typeof state.currentUrl !== 'string'\n ) {\n this.log('Invalid session state, discarding.');\n return null;\n }\n\n // Restore conversation history\n this.history = state.conversationHistory;\n this.enforceHistoryLimits();\n\n // Restore preferences\n if (state.userPreference === 'voice' || state.userPreference === 'text') {\n this._userPreference = state.userPreference;\n }\n if (typeof state.quietMode === 'boolean') {\n this._quietMode = state.quietMode;\n }\n\n return state;\n } catch (err) {\n this.log('Failed to restore session:', err);\n return null;\n }\n }\n\n /** Build the current session state snapshot. */\n getSessionState(): SessionState {\n const serialised = JSON.stringify(this.history);\n const currentUrl =\n typeof window !== 'undefined' ? window.location.href : '';\n\n return {\n conversationHistory: this.history,\n currentUrl,\n agentStatus: 'idle',\n userPreference: this._userPreference,\n quietMode: this._quietMode,\n totalSizeBytes: byteLength(serialised),\n };\n }\n\n // -------------------------------------------------------------------------\n // Private — prompt section builders\n // -------------------------------------------------------------------------\n\n private buildRoleSection(): string {\n const name = this.agent.name || 'GuideKit';\n const personality =\n this.agent.personality ||\n 'You help users understand and navigate the site.';\n return `# Role\\nYou are ${name}, an AI guide embedded on this website.\\n${personality}`;\n }\n\n private buildCurrentPageSection(pageModel: PageModel): string {\n const lines = ['# Current Page'];\n lines.push(`URL: ${pageModel.url}`);\n lines.push(`Title: ${pageModel.title}`);\n if (pageModel.meta.description) {\n lines.push(`Description: ${pageModel.meta.description}`);\n }\n lines.push(`Language: ${pageModel.meta.language}`);\n return lines.join('\\n');\n }\n\n private buildPageSectionsSection(pageModel: PageModel): string {\n const { sectionsIncluded, totalSectionsFound } = pageModel.scanMetadata;\n const lines = [\n `# Page Sections (${sectionsIncluded} of ${totalSectionsFound})`,\n ];\n\n for (const section of pageModel.sections) {\n const vis = section.isVisible ? 'visible' : 'hidden';\n lines.push(\n `- [${section.id}] ${section.label}: ${truncate(section.summary, 120)} (${vis})`,\n );\n }\n\n if (sectionsIncluded < totalSectionsFound) {\n lines.push(\n `\\nNote: You see ${sectionsIncluded} of ${totalSectionsFound} sections. Use readPageContent to access more.`,\n );\n }\n\n return lines.join('\\n');\n }\n\n private buildNavigationSection(pageModel: PageModel): string {\n const lines = ['# Navigation'];\n for (const nav of pageModel.navigation) {\n const current = nav.isCurrent ? ' (current)' : '';\n lines.push(`- ${nav.label}: ${nav.href}${current}`);\n }\n return lines.join('\\n');\n }\n\n private buildInteractiveElementsSection(pageModel: PageModel): string {\n const lines = ['# Interactive Elements'];\n for (const el of pageModel.interactiveElements) {\n const disabled = el.isDisabled ? ' [disabled]' : '';\n lines.push(\n `- ${el.tagName}${el.type ? `[${el.type}]` : ''}: ${el.label}${disabled} (${el.selector})`,\n );\n }\n return lines.join('\\n');\n }\n\n private buildFormsSection(pageModel: PageModel): string {\n const lines = ['# Forms'];\n for (const form of pageModel.forms) {\n const formId = form.id ? ` id=\"${form.id}\"` : '';\n const errors = form.hasValidationErrors ? ' [has errors]' : '';\n lines.push(`- <form${formId}>${errors}`);\n for (const field of form.fields) {\n const req = field.isRequired ? ' *' : '';\n const err = field.hasError\n ? ` [error: ${field.errorMessage || 'invalid'}]`\n : '';\n lines.push(\n ` - ${field.label || field.name} (${field.type})${req}${err}`,\n );\n }\n }\n return lines.join('\\n');\n }\n\n private buildViewportSection(pageModel: PageModel): string {\n const { width, height, orientation } = pageModel.viewport;\n return `# User Viewport\\n${width}x${height}, ${orientation}`;\n }\n\n private buildToolsSection(tools: ToolDefinition[]): string {\n const lines = ['# Available Actions'];\n for (const tool of tools) {\n lines.push(`- ${tool.name}: ${tool.description}`);\n }\n return lines.join('\\n');\n }\n\n private buildPageContextSection(): string {\n const lines = ['# Developer Context'];\n for (const [key, value] of Object.entries(this._pageContext)) {\n const valStr =\n typeof value === 'string'\n ? value\n : JSON.stringify(value);\n lines.push(`- ${key}: ${truncate(String(valStr), 200)}`);\n }\n return lines.join('\\n');\n }\n\n private buildGuidelinesSection(): string {\n return [\n '# Guidelines',\n '- Always reference specific sections by their ID when guiding users',\n '- Use highlight() to point at elements you are discussing',\n '- Use scrollToSection() before highlighting offscreen elements',\n '- Never make up information not present in the page context',\n '- If asked about content you cannot see, use readPageContent to access it',\n '- Keep responses concise — 2-3 sentences unless the user asks for detail',\n ].join('\\n');\n }\n\n // -------------------------------------------------------------------------\n // Private — prompt trimming\n // -------------------------------------------------------------------------\n\n /**\n * When the assembled prompt exceeds the budget, progressively trim\n * lower-priority sections to fit.\n */\n private trimPromptToBudget(\n _fullPrompt: string,\n pageModel: PageModel,\n tools: ToolDefinition[],\n ): string {\n // Rebuild with trimming strategies applied in priority order:\n // 1. Truncate interactive elements list\n // 2. Truncate navigation list\n // 3. Truncate forms\n // 4. Truncate page sections\n\n const essentialParts: string[] = [\n this.buildRoleSection(),\n this.buildCurrentPageSection(pageModel),\n this.buildViewportSection(pageModel),\n this.buildGuidelinesSection(),\n ];\n\n if (tools.length > 0) {\n essentialParts.push(this.buildToolsSection(tools));\n }\n\n const essentialLength = essentialParts.reduce(\n (sum, p) => sum + p.length + 2,\n 0,\n );\n let remaining = this.tokenBudget - essentialLength;\n\n const optionalSections: string[] = [];\n\n // Page sections — highest priority optional section\n const sectionsStr = this.buildPageSectionsSection(pageModel);\n if (sectionsStr.length <= remaining) {\n optionalSections.push(sectionsStr);\n remaining -= sectionsStr.length + 2;\n } else if (remaining > 100) {\n optionalSections.push(truncate(sectionsStr, remaining));\n remaining = 0;\n }\n\n // Navigation\n if (remaining > 0 && pageModel.navigation.length > 0) {\n const navStr = this.buildNavigationSection(pageModel);\n if (navStr.length <= remaining) {\n optionalSections.push(navStr);\n remaining -= navStr.length + 2;\n } else if (remaining > 80) {\n optionalSections.push(truncate(navStr, remaining));\n remaining = 0;\n }\n }\n\n // Forms\n if (remaining > 0 && pageModel.forms.length > 0) {\n const formsStr = this.buildFormsSection(pageModel);\n if (formsStr.length <= remaining) {\n optionalSections.push(formsStr);\n remaining -= formsStr.length + 2;\n } else if (remaining > 80) {\n optionalSections.push(truncate(formsStr, remaining));\n remaining = 0;\n }\n }\n\n // Interactive elements\n if (remaining > 0 && pageModel.interactiveElements.length > 0) {\n const ieStr = this.buildInteractiveElementsSection(pageModel);\n if (ieStr.length <= remaining) {\n optionalSections.push(ieStr);\n } else if (remaining > 80) {\n optionalSections.push(truncate(ieStr, remaining));\n }\n }\n\n // Insert optional sections after current-page and before viewport\n const result = [\n essentialParts[0], // Role\n essentialParts[1], // Current Page\n ...optionalSections,\n essentialParts[2], // Viewport\n ...essentialParts.slice(3), // Tools + Guidelines\n ];\n\n return result.join('\\n\\n');\n }\n\n // -------------------------------------------------------------------------\n // Private — history management\n // -------------------------------------------------------------------------\n\n /**\n * Enforce `maxTurns` and `maxSessionSizeBytes` constraints on the\n * conversation history. When the history approaches 80% of `maxTurns`,\n * the oldest turns are summarised into a single recap turn.\n */\n private enforceHistoryLimits(): void {\n // -- Summarise when near capacity (>80% of maxTurns) --------------------\n const summariseThreshold = Math.floor(this.maxTurns * 0.8);\n if (this.history.length > summariseThreshold) {\n this.summariseOldestTurns();\n }\n\n // -- Hard cap on turn count ---------------------------------------------\n while (this.history.length > this.maxTurns) {\n this.history.shift();\n }\n\n // -- Enforce byte-size limit --------------------------------------------\n this.enforceByteLimit();\n }\n\n /**\n * Compress the oldest half of turns into a single recap turn so the\n * context window is used more efficiently.\n */\n private summariseOldestTurns(): void {\n if (this.history.length < 4) return; // Not enough to summarise\n\n const splitIndex = Math.floor(this.history.length / 2);\n const oldTurns = this.history.slice(0, splitIndex);\n const recentTurns = this.history.slice(splitIndex);\n\n // Build a compact recap from the old turns\n const recapLines: string[] = [];\n for (const turn of oldTurns) {\n const role = turn.role === 'user' ? 'User' : 'Assistant';\n recapLines.push(`${role}: ${truncate(turn.content, 150)}`);\n }\n\n const recapTurn: ConversationTurn = {\n role: 'assistant',\n content: `[Conversation recap]\\n${recapLines.join('\\n')}`,\n timestamp: oldTurns[oldTurns.length - 1]!.timestamp,\n };\n\n this.history = [recapTurn, ...recentTurns];\n }\n\n /** Evict oldest turns until the serialised history fits within the byte budget. */\n private enforceByteLimit(): void {\n while (this.history.length > 1) {\n const serialised = JSON.stringify(this.history);\n if (byteLength(serialised) <= this.maxSessionSizeBytes) break;\n this.history.shift();\n }\n }\n\n // -------------------------------------------------------------------------\n // Private — debug logging\n // -------------------------------------------------------------------------\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.debug('[GuideKit:ContextManager]', ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Error Hierarchy\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical error codes emitted by the SDK.\n * Keyed as `DOMAIN_DETAIL` so consumers can match on prefixes or exact values.\n */\nexport const ErrorCodes = {\n // Auth\n AUTH_INVALID_KEY: 'AUTH_INVALID_KEY',\n AUTH_EXPIRED_TOKEN: 'AUTH_EXPIRED_TOKEN',\n AUTH_TOKEN_REFRESH_FAILED: 'AUTH_TOKEN_REFRESH_FAILED',\n AUTH_ENDPOINT_FAILED: 'AUTH_ENDPOINT_FAILED',\n\n // Config\n CONFIG_INVALID_PROVIDER: 'CONFIG_INVALID_PROVIDER',\n CONFIG_MISSING_REQUIRED: 'CONFIG_MISSING_REQUIRED',\n\n // Init\n INIT_SHADOW_DOM_FAILED: 'INIT_SHADOW_DOM_FAILED',\n INIT_BROWSER_UNSUPPORTED: 'INIT_BROWSER_UNSUPPORTED',\n\n // Rate limit\n RATE_LIMIT_PROVIDER: 'RATE_LIMIT_PROVIDER',\n RATE_LIMIT_CLIENT: 'RATE_LIMIT_CLIENT',\n\n // Resources\n RESOURCE_EXHAUSTED_LLM: 'RESOURCE_EXHAUSTED_LLM',\n RESOURCE_EXHAUSTED_STT: 'RESOURCE_EXHAUSTED_STT',\n RESOURCE_EXHAUSTED_TTS: 'RESOURCE_EXHAUSTED_TTS',\n\n // Permission\n PERMISSION_MIC_DENIED: 'PERMISSION_MIC_DENIED',\n PERMISSION_MIC_UNAVAILABLE: 'PERMISSION_MIC_UNAVAILABLE',\n\n // Network\n NETWORK_WEBSOCKET_FAILED: 'NETWORK_WEBSOCKET_FAILED',\n NETWORK_CONNECTION_LOST: 'NETWORK_CONNECTION_LOST',\n NETWORK_TIMEOUT: 'NETWORK_TIMEOUT',\n\n // Timeout\n TIMEOUT_STT_CONNECT: 'TIMEOUT_STT_CONNECT',\n TIMEOUT_LLM_RESPONSE: 'TIMEOUT_LLM_RESPONSE',\n TIMEOUT_TTS_CONNECT: 'TIMEOUT_TTS_CONNECT',\n TIMEOUT_TTS_FIRST_AUDIO: 'TIMEOUT_TTS_FIRST_AUDIO',\n\n // Browser\n BROWSER_NO_WEB_AUDIO: 'BROWSER_NO_WEB_AUDIO',\n BROWSER_NO_WASM: 'BROWSER_NO_WASM',\n VAD_PACKAGE_MISSING: 'VAD_PACKAGE_MISSING',\n\n // Content\n CONTENT_FILTER_TRIGGERED: 'CONTENT_FILTER_TRIGGERED',\n\n // Privacy\n PRIVACY_HOOK_CANCELLED: 'PRIVACY_HOOK_CANCELLED',\n\n // General\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/** Union of every known error code string. */\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n// ---------------------------------------------------------------------------\n// Provider type\n// ---------------------------------------------------------------------------\n\nexport type Provider = 'deepgram' | 'elevenlabs' | 'gemini' | 'openai' | 'web-speech' | (string & {});\n\n// ---------------------------------------------------------------------------\n// Base options shared by every error constructor\n// ---------------------------------------------------------------------------\n\nexport interface GuideKitErrorOptions {\n code: string;\n message: string;\n provider?: Provider;\n recoverable: boolean;\n suggestion: string;\n docsUrl?: string;\n cause?: Error;\n}\n\n// ---------------------------------------------------------------------------\n// Base error class\n// ---------------------------------------------------------------------------\n\n/**\n * Root error for every failure surfaced by the GuideKit SDK.\n *\n * Every instance carries structured metadata so UI layers can present\n * actionable feedback without parsing message strings.\n */\nexport class GuideKitError extends Error {\n readonly code: string;\n readonly provider?: Provider;\n readonly recoverable: boolean;\n readonly suggestion: string;\n readonly docsUrl: string;\n\n constructor(options: GuideKitErrorOptions) {\n super(options.message, { cause: options.cause });\n\n // Fix the prototype chain so `instanceof` works correctly when\n // compiling to ES5 or when subclassing built-in Error.\n Object.setPrototypeOf(this, new.target.prototype);\n\n this.name = 'GuideKitError';\n this.code = options.code;\n this.provider = options.provider;\n this.recoverable = options.recoverable;\n this.suggestion = options.suggestion;\n this.docsUrl =\n options.docsUrl ?? `https://guidekit.dev/docs/error-codes#${options.code}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Specific error subclasses\n// ---------------------------------------------------------------------------\n\n/** Wrong or expired API key / token. */\nexport class AuthenticationError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'AuthenticationError';\n }\n}\n\n/** Invalid provider configuration supplied at init time. */\nexport class ConfigurationError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'ConfigurationError';\n }\n}\n\n/** SDK startup failure (Shadow DOM creation, browser too old, etc.). */\nexport class InitializationError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'InitializationError';\n }\n}\n\n/** Provider-side rate limit hit. Includes a retry hint. */\nexport class RateLimitError extends GuideKitError {\n readonly retryAfterMs: number;\n\n constructor(\n options: GuideKitErrorOptions & { retryAfterMs: number },\n ) {\n super({ ...options, recoverable: true });\n this.name = 'RateLimitError';\n this.retryAfterMs = options.retryAfterMs;\n }\n}\n\n/** Client-side cost / usage limits exhausted. */\nexport class ResourceExhaustedError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'ResourceExhaustedError';\n }\n}\n\n/** Microphone permission denied or device not available. */\nexport class PermissionError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'PermissionError';\n }\n}\n\n/** WebSocket dropped, HTTP connection failed, etc. */\nexport class NetworkError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: true, ...options });\n this.name = 'NetworkError';\n }\n}\n\n/** An operation exceeded its deadline. */\nexport class TimeoutError extends GuideKitError {\n readonly operationName: string;\n readonly timeoutMs: number;\n\n constructor(\n options: GuideKitErrorOptions & {\n operationName: string;\n timeoutMs: number;\n },\n ) {\n super({ ...options, recoverable: true });\n this.name = 'TimeoutError';\n this.operationName = options.operationName;\n this.timeoutMs = options.timeoutMs;\n }\n}\n\n/** Missing browser capability (Web Audio, WASM, VAD). */\nexport class BrowserSupportError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'BrowserSupportError';\n }\n}\n\n/** LLM safety / content filter triggered. */\nexport class ContentFilterError extends GuideKitError {\n constructor(\n options: Omit<GuideKitErrorOptions, 'recoverable'> & {\n recoverable?: boolean;\n },\n ) {\n super({ recoverable: false, ...options });\n this.name = 'ContentFilterError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Type guard\n// ---------------------------------------------------------------------------\n\n/**\n * Narrows an unknown caught value to `GuideKitError`.\n *\n * ```ts\n * try { ... } catch (err) {\n * if (isGuideKitError(err)) {\n * console.log(err.code, err.suggestion);\n * }\n * }\n * ```\n */\nexport function isGuideKitError(error: unknown): error is GuideKitError {\n return error instanceof GuideKitError;\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – OpenAI Adapter\n// ---------------------------------------------------------------------------\n\nimport type {\n LLMProviderAdapter,\n ToolDefinition,\n ToolCall,\n TextChunk,\n ConversationTurn,\n} from '../types/index.js';\n\nimport {\n AuthenticationError,\n RateLimitError,\n NetworkError,\n TimeoutError,\n ContentFilterError,\n ErrorCodes,\n} from '../errors/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_OPENAI_MODEL = 'gpt-4o';\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst OPENAI_CHAT_URL = 'https://api.openai.com/v1/chat/completions';\n\n// ---------------------------------------------------------------------------\n// Token usage helper\n// ---------------------------------------------------------------------------\n\ninterface TokenUsage {\n prompt: number;\n completion: number;\n total: number;\n}\n\nfunction emptyUsage(): TokenUsage {\n return { prompt: 0, completion: 0, total: 0 };\n}\n\n// ---------------------------------------------------------------------------\n// OpenAI adapter config\n// ---------------------------------------------------------------------------\n\n/** Configuration for the OpenAI adapter (custom adapter pattern). */\nexport interface OpenAIAdapterConfig {\n apiKey: string;\n model?: 'gpt-4o' | 'gpt-4o-mini' | (string & {});\n}\n\n// ---------------------------------------------------------------------------\n// OpenAIAdapter\n// ---------------------------------------------------------------------------\n\n/**\n * Adapter that translates between GuideKit's internal types and the\n * OpenAI Chat Completions API wire format. Handles streaming via SSE,\n * tool formatting, and response parsing.\n *\n * Usage as a custom adapter:\n * ```ts\n * import { OpenAIAdapter } from '@guidekit/core';\n * const llmConfig = { adapter: new OpenAIAdapter({ apiKey: '...', model: 'gpt-4o' }) };\n * ```\n */\nexport class OpenAIAdapter implements LLMProviderAdapter {\n private readonly apiKey: string;\n private readonly model: string;\n\n /** Tracks whether the last extractChunks call emitted a done chunk. */\n private lastExtractEmittedDone = false;\n\n /**\n * Token usage extracted from the most recent `parseResponse` call.\n * Updated as each SSE chunk is parsed.\n */\n private _lastUsage: TokenUsage = emptyUsage();\n\n constructor(config: OpenAIAdapterConfig) {\n this.apiKey = config.apiKey;\n this.model = config.model ?? DEFAULT_OPENAI_MODEL;\n }\n\n /** Token usage from the most recent parseResponse call. */\n get lastUsage(): TokenUsage {\n return this._lastUsage;\n }\n\n // -----------------------------------------------------------------------\n // LLMProviderAdapter implementation\n // -----------------------------------------------------------------------\n\n /**\n * Convert GuideKit tool definitions into OpenAI's `tools` format.\n * Each tool is wrapped as `{ type: 'function', function: { name, description, parameters } }`.\n */\n formatTools(tools: ToolDefinition[]): unknown {\n if (tools.length === 0) return undefined;\n\n return tools.map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: { ...tool.parameters },\n required: tool.required ?? [],\n },\n },\n }));\n }\n\n /**\n * Convert an array of `ConversationTurn` objects into OpenAI's messages\n * format with `role: 'user' | 'assistant'`.\n */\n formatConversation(\n history: ConversationTurn[],\n ): Array<{ role: 'user' | 'assistant'; content: string }> {\n return history.map((turn) => ({\n role: turn.role,\n content: turn.content,\n }));\n }\n\n /**\n * Parse an OpenAI SSE streaming response into an async iterable of\n * `TextChunk` and `ToolCall` objects.\n *\n * The OpenAI streaming endpoint sends each chunk as a JSON object\n * prefixed by `data: `. The final line is `data: [DONE]`.\n * Text content arrives in `choices[0].delta.content` and tool calls\n * arrive in `choices[0].delta.tool_calls`.\n *\n * This method also:\n * - Detects content filtering and throws `ContentFilterError`.\n * - Tracks token usage (accessible via `lastUsage` after iteration).\n */\n async *parseResponse(\n stream: ReadableStream<Uint8Array>,\n ): AsyncIterable<TextChunk | ToolCall> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let doneEmitted = false;\n this._lastUsage = emptyUsage();\n\n // Accumulators for tool calls that arrive incrementally across chunks.\n const pendingToolCalls = new Map<\n number,\n { id: string; name: string; argumentsJson: string }\n >();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Keep the last (possibly incomplete) line in the buffer.\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // SSE lines that are not data payloads.\n if (!trimmed.startsWith('data:')) continue;\n\n const jsonStr = trimmed.slice(5).trim();\n if (jsonStr === '' || jsonStr === '[DONE]') {\n if (jsonStr === '[DONE]') {\n // Flush any accumulated tool calls.\n yield* this.flushPendingToolCalls(pendingToolCalls);\n if (!doneEmitted) {\n doneEmitted = true;\n yield { text: '', done: true } as TextChunk;\n }\n }\n continue;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(jsonStr) as Record<string, unknown>;\n } catch {\n // Malformed JSON chunk -- skip silently.\n continue;\n }\n\n // Check for content filtering — throws if blocked.\n if (this.isContentFiltered(parsed)) {\n throw new ContentFilterError({\n code: ErrorCodes.CONTENT_FILTER_TRIGGERED,\n message: 'Response was blocked by provider content safety filter.',\n provider: 'openai',\n suggestion: 'Rephrase your question or adjust safety settings.',\n });\n }\n\n // Track token usage.\n const chunkUsage = this.extractUsage(parsed);\n if (chunkUsage) {\n this._lastUsage = chunkUsage;\n }\n\n yield* this.extractChunks(parsed, pendingToolCalls, doneEmitted);\n if (!doneEmitted && this.lastExtractEmittedDone) {\n doneEmitted = true;\n }\n }\n }\n\n // Flush any remaining data in the buffer.\n if (buffer.trim().startsWith('data:')) {\n const jsonStr = buffer.trim().slice(5).trim();\n if (jsonStr === '[DONE]') {\n yield* this.flushPendingToolCalls(pendingToolCalls);\n if (!doneEmitted) {\n doneEmitted = true;\n yield { text: '', done: true } as TextChunk;\n }\n } else if (jsonStr !== '') {\n try {\n const parsed = JSON.parse(jsonStr) as Record<string, unknown>;\n\n if (this.isContentFiltered(parsed)) {\n throw new ContentFilterError({\n code: ErrorCodes.CONTENT_FILTER_TRIGGERED,\n message: 'Response was blocked by provider content safety filter.',\n provider: 'openai',\n suggestion: 'Rephrase your question or adjust safety settings.',\n });\n }\n\n const chunkUsage = this.extractUsage(parsed);\n if (chunkUsage) {\n this._lastUsage = chunkUsage;\n }\n\n yield* this.extractChunks(parsed, pendingToolCalls, doneEmitted);\n if (!doneEmitted && this.lastExtractEmittedDone) {\n doneEmitted = true;\n }\n } catch (error: unknown) {\n // Re-throw ContentFilterError, ignore other parse errors.\n if (error instanceof ContentFilterError) throw error;\n }\n }\n }\n\n // Flush any remaining tool calls that were not emitted.\n yield* this.flushPendingToolCalls(pendingToolCalls);\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Format a tool result so it can be sent back to OpenAI as a\n * `tool` role message with the `tool_call_id`.\n */\n formatToolResult(\n callId: string,\n result: unknown,\n ): { role: 'tool'; tool_call_id: string; content: string } {\n return {\n role: 'tool',\n tool_call_id: callId,\n content: typeof result === 'string' ? result : JSON.stringify(result),\n };\n }\n\n // -----------------------------------------------------------------------\n // Streaming request\n // -----------------------------------------------------------------------\n\n /**\n * Build and execute a streaming request to the OpenAI Chat Completions API.\n * Returns the raw `ReadableStream` for the response body together with\n * the raw Response object.\n */\n async streamRequest(params: {\n systemPrompt: string;\n contents: unknown;\n userMessage?: string;\n tools?: unknown;\n signal?: AbortSignal;\n timeoutMs?: number;\n }): Promise<{\n stream: ReadableStream<Uint8Array>;\n response: Response;\n }> {\n // Build the full messages array: system prompt + history + user message.\n const contentsArray = params.contents as Array<{ role: string; content: string }>;\n const messages: Array<{ role: string; content: string }> = [\n { role: 'system', content: params.systemPrompt },\n ...contentsArray,\n ];\n\n if (params.userMessage) {\n messages.push({ role: 'user', content: params.userMessage });\n }\n\n const body: Record<string, unknown> = {\n model: this.model,\n messages,\n stream: true,\n temperature: 0.7,\n top_p: 0.95,\n };\n\n if (params.tools) {\n body.tools = params.tools;\n }\n\n const timeoutMs = params.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n\n // Combine the external signal with our timeout signal.\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n if (params.signal) {\n // If the caller aborts, propagate to our controller.\n params.signal.addEventListener(\n 'abort',\n () => controller.abort(params.signal!.reason),\n { once: true },\n );\n }\n\n let response: Response;\n try {\n response = await fetch(OPENAI_CHAT_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (error: unknown) {\n clearTimeout(timeoutId);\n\n if (\n error instanceof DOMException &&\n error.name === 'AbortError'\n ) {\n // Distinguish caller abort from timeout.\n if (params.signal?.aborted) {\n throw error; // Re-throw caller abort as-is.\n }\n throw new TimeoutError({\n code: ErrorCodes.TIMEOUT_LLM_RESPONSE,\n message: `OpenAI request timed out after ${timeoutMs}ms`,\n provider: 'openai',\n recoverable: true,\n suggestion: 'Try again or increase the timeout.',\n operationName: 'openai.chatCompletions',\n timeoutMs,\n });\n }\n\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `Failed to connect to OpenAI API: ${(error as Error).message}`,\n provider: 'openai',\n suggestion:\n 'Check your network connection and try again.',\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n clearTimeout(timeoutId);\n\n // Handle HTTP-level errors.\n if (!response.ok) {\n await this.handleHttpError(response);\n }\n\n if (!response.body) {\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: 'OpenAI response body is null -- streaming unavailable.',\n provider: 'openai',\n suggestion: 'Retry the request.',\n });\n }\n\n return { stream: response.body, response };\n }\n\n // -----------------------------------------------------------------------\n // Internal helpers\n // -----------------------------------------------------------------------\n\n /**\n * Extract `TextChunk` and accumulate `ToolCall` data from a single parsed\n * OpenAI SSE JSON object.\n *\n * OpenAI tool calls arrive incrementally: the first chunk for a tool call\n * carries the `id` and `function.name`, while subsequent chunks append to\n * `function.arguments`. We accumulate these in `pendingToolCalls` and only\n * yield complete `ToolCall` objects when the finish_reason is 'tool_calls'\n * or when flushed.\n */\n private *extractChunks(\n parsed: Record<string, unknown>,\n pendingToolCalls: Map<\n number,\n { id: string; name: string; argumentsJson: string }\n >,\n doneEmitted: boolean,\n ): Generator<TextChunk | ToolCall> {\n this.lastExtractEmittedDone = false;\n\n const choices = parsed.choices as\n | Array<Record<string, unknown>>\n | undefined;\n\n if (!choices || choices.length === 0) return;\n\n for (const choice of choices) {\n const delta = choice.delta as Record<string, unknown> | undefined;\n const finishReason = choice.finish_reason as string | null | undefined;\n\n if (delta) {\n // Handle text content.\n if (typeof delta.content === 'string' && delta.content !== '') {\n yield {\n text: delta.content,\n done: false,\n } as TextChunk;\n }\n\n // Handle incremental tool calls.\n const toolCallDeltas = delta.tool_calls as\n | Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>\n | undefined;\n\n if (toolCallDeltas) {\n for (const tc of toolCallDeltas) {\n const existing = pendingToolCalls.get(tc.index);\n if (existing) {\n // Append to existing tool call.\n if (tc.function?.arguments) {\n existing.argumentsJson += tc.function.arguments;\n }\n } else {\n // Start a new tool call accumulation.\n pendingToolCalls.set(tc.index, {\n id: tc.id ?? '',\n name: tc.function?.name ?? '',\n argumentsJson: tc.function?.arguments ?? '',\n });\n }\n }\n }\n }\n\n // When finish_reason is 'tool_calls', flush the accumulated tool calls.\n if (finishReason === 'tool_calls') {\n yield* this.flushPendingToolCalls(pendingToolCalls);\n }\n\n // When finish_reason is 'stop', yield a done text chunk (once only).\n if (finishReason === 'stop' && !doneEmitted && !this.lastExtractEmittedDone) {\n this.lastExtractEmittedDone = true;\n yield { text: '', done: true } as TextChunk;\n }\n }\n }\n\n /**\n * Flush all accumulated pending tool calls as complete `ToolCall` objects.\n */\n private *flushPendingToolCalls(\n pendingToolCalls: Map<\n number,\n { id: string; name: string; argumentsJson: string }\n >,\n ): Generator<ToolCall> {\n // Sort by index to maintain order.\n const sorted = [...pendingToolCalls.entries()].sort(\n ([a], [b]) => a - b,\n );\n\n for (const [, tc] of sorted) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argumentsJson) as Record<string, unknown>;\n } catch (_e) {\n console.warn('[GuideKit:LLM] Failed to parse tool call arguments:', tc.argumentsJson);\n }\n\n yield {\n id: tc.id,\n name: tc.name,\n arguments: args,\n } as ToolCall;\n }\n\n pendingToolCalls.clear();\n }\n\n /**\n * Extract token usage from a parsed OpenAI response chunk.\n * Usage data typically appears in the final chunk when `stream_options`\n * includes `include_usage`, or in the non-streaming response.\n * Returns `null` if no usage data is present.\n */\n extractUsage(parsed: Record<string, unknown>): TokenUsage | null {\n const usage = parsed.usage as\n | {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n }\n | undefined;\n\n if (!usage) return null;\n\n return {\n prompt: usage.prompt_tokens ?? 0,\n completion: usage.completion_tokens ?? 0,\n total: usage.total_tokens ?? 0,\n };\n }\n\n /**\n * Check whether a parsed OpenAI chunk indicates the response was\n * blocked by a content filter.\n *\n * OpenAI signals content filtering through:\n * - `choices[].finish_reason === 'content_filter'`\n * - `choices[].content_filter_results` with `filtered: true`\n */\n isContentFiltered(parsed: Record<string, unknown>): boolean {\n const choices = parsed.choices as\n | Array<Record<string, unknown>>\n | undefined;\n\n if (!choices || choices.length === 0) return false;\n\n return choices.some((choice) => {\n // Check finish_reason.\n if (choice.finish_reason === 'content_filter') return true;\n\n // Check content_filter_results (Azure OpenAI style).\n const filterResults = choice.content_filter_results as\n | Record<string, { filtered?: boolean }>\n | undefined;\n\n if (filterResults) {\n return Object.values(filterResults).some((r) => r.filtered === true);\n }\n\n return false;\n });\n }\n\n /**\n * Translate an HTTP error response from OpenAI into the appropriate\n * GuideKit error class.\n */\n private async handleHttpError(response: Response): Promise<never> {\n let errorBody = '';\n try {\n errorBody = await response.text();\n } catch {\n // Ignore read failure.\n }\n\n const status = response.status;\n\n if (status === 401 || status === 403) {\n throw new AuthenticationError({\n code: ErrorCodes.AUTH_INVALID_KEY,\n message: `OpenAI API authentication failed (${status}): ${errorBody}`,\n provider: 'openai',\n suggestion:\n 'Verify your OpenAI API key is correct and has not expired.',\n });\n }\n\n if (status === 429) {\n const retryAfterHeader = response.headers.get('retry-after');\n const retryAfterMs = retryAfterHeader\n ? parseInt(retryAfterHeader, 10) * 1000\n : 60_000;\n\n throw new RateLimitError({\n code: ErrorCodes.RATE_LIMIT_PROVIDER,\n message: `OpenAI API rate limit exceeded (429): ${errorBody}`,\n provider: 'openai',\n recoverable: true,\n suggestion: `Rate limited by OpenAI. Retry after ${Math.ceil(retryAfterMs / 1000)}s.`,\n retryAfterMs,\n });\n }\n\n if (status >= 500) {\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `OpenAI API server error (${status}): ${errorBody}`,\n provider: 'openai',\n suggestion:\n 'The OpenAI API is experiencing issues. Please try again later.',\n });\n }\n\n // Fallback for other 4xx errors.\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `OpenAI API request failed (${status}): ${errorBody}`,\n provider: 'openai',\n suggestion: 'Check the request parameters and try again.',\n });\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – LLM Orchestrator & Gemini Adapter\n// ---------------------------------------------------------------------------\n\nimport type {\n LLMConfig,\n LLMProviderAdapter,\n ToolDefinition,\n ToolCall,\n TextChunk,\n ConversationTurn,\n} from '../types/index.js';\n\nimport {\n AuthenticationError,\n RateLimitError,\n NetworkError,\n TimeoutError,\n ContentFilterError,\n ErrorCodes,\n} from '../errors/index.js';\n\nexport { OpenAIAdapter } from './openai-adapter.js';\nexport type { OpenAIAdapterConfig } from './openai-adapter.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_GEMINI_MODEL = 'gemini-2.5-flash';\nconst DEFAULT_TIMEOUT_MS = 15_000;\nconst GEMINI_BASE_URL =\n 'https://generativelanguage.googleapis.com/v1beta/models';\n\n/**\n * Gemini safety categories with their corresponding enum names.\n * We apply `BLOCK_ONLY_HIGH` to every category by default so the model\n * is usable for general-purpose assistance without over-blocking.\n */\nconst DEFAULT_SAFETY_SETTINGS = [\n { category: 'HARM_CATEGORY_HARASSMENT', threshold: 'BLOCK_ONLY_HIGH' },\n { category: 'HARM_CATEGORY_HATE_SPEECH', threshold: 'BLOCK_ONLY_HIGH' },\n { category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT', threshold: 'BLOCK_ONLY_HIGH' },\n { category: 'HARM_CATEGORY_DANGEROUS_CONTENT', threshold: 'BLOCK_ONLY_HIGH' },\n];\n\n// ---------------------------------------------------------------------------\n// Token usage helper\n// ---------------------------------------------------------------------------\n\ninterface TokenUsage {\n prompt: number;\n completion: number;\n total: number;\n}\n\nfunction emptyUsage(): TokenUsage {\n return { prompt: 0, completion: 0, total: 0 };\n}\n\n// ---------------------------------------------------------------------------\n// GeminiAdapter\n// ---------------------------------------------------------------------------\n\n/**\n * Adapter that translates between GuideKit's internal types and the\n * Gemini REST API wire format. Handles streaming via SSE, tool formatting,\n * and response parsing.\n */\nexport class GeminiAdapter implements LLMProviderAdapter {\n private readonly apiKey: string;\n private readonly model: string;\n\n /**\n * Token usage extracted from the most recent `parseResponse` call.\n * Updated as each SSE chunk is parsed; the final value reflects the\n * cumulative usage metadata sent by Gemini (typically in the last chunk).\n */\n private _lastUsage: TokenUsage = emptyUsage();\n\n constructor(config: Extract<LLMConfig, { provider: 'gemini' }>) {\n this.apiKey = config.apiKey;\n this.model = config.model ?? DEFAULT_GEMINI_MODEL;\n }\n\n /** Token usage from the most recent parseResponse call. */\n get lastUsage(): TokenUsage {\n return this._lastUsage;\n }\n\n // -----------------------------------------------------------------------\n // LLMProviderAdapter implementation\n // -----------------------------------------------------------------------\n\n /**\n * Convert GuideKit tool definitions into Gemini's `functionDeclarations`\n * format, wrapped inside a `tools` array.\n */\n formatTools(tools: ToolDefinition[]): unknown {\n if (tools.length === 0) return undefined;\n\n return [\n {\n functionDeclarations: tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: { ...tool.parameters },\n required: tool.required ?? [],\n },\n })),\n },\n ];\n }\n\n /**\n * Convert an array of `ConversationTurn` objects into Gemini's `contents`\n * array with `role: 'user' | 'model'`.\n */\n formatConversation(\n history: ConversationTurn[],\n ): Array<{ role: string; parts: Array<{ text: string }> }> {\n return history.map((turn) => ({\n role: turn.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: turn.content }],\n }));\n }\n\n /**\n * Parse a Gemini SSE streaming response into an async iterable of\n * `TextChunk` and `ToolCall` objects.\n *\n * The Gemini `streamGenerateContent?alt=sse` endpoint sends each chunk\n * as a JSON object prefixed by `data: `. We parse line-by-line, extract\n * text parts and function call parts, and yield the appropriate types.\n *\n * This method also:\n * - Detects content filtering and throws `ContentFilterError`.\n * - Tracks token usage (accessible via `lastUsage` after iteration).\n */\n async *parseResponse(\n stream: ReadableStream<Uint8Array>,\n ): AsyncIterable<TextChunk | ToolCall> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n this._lastUsage = emptyUsage();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Keep the last (possibly incomplete) line in the buffer.\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // SSE lines that are not data payloads.\n if (!trimmed.startsWith('data:')) continue;\n\n const jsonStr = trimmed.slice(5).trim();\n if (jsonStr === '' || jsonStr === '[DONE]') continue;\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(jsonStr) as Record<string, unknown>;\n } catch {\n // Malformed JSON chunk – skip silently.\n continue;\n }\n\n // Check for content filtering — throws if blocked.\n if (this.isContentFiltered(parsed)) {\n throw new ContentFilterError({\n code: ErrorCodes.CONTENT_FILTER_TRIGGERED,\n message: 'Response was blocked by provider content safety filter.',\n provider: 'gemini',\n suggestion: 'Rephrase your question or adjust safety settings.',\n });\n }\n\n // Track token usage (usually present in the last chunk).\n const chunkUsage = this.extractUsage(parsed);\n if (chunkUsage) {\n this._lastUsage = chunkUsage;\n }\n\n yield* this.extractChunks(parsed);\n }\n }\n\n // Flush any remaining data in the buffer.\n if (buffer.trim().startsWith('data:')) {\n const jsonStr = buffer.trim().slice(5).trim();\n if (jsonStr !== '' && jsonStr !== '[DONE]') {\n try {\n const parsed = JSON.parse(jsonStr) as Record<string, unknown>;\n\n if (this.isContentFiltered(parsed)) {\n throw new ContentFilterError({\n code: ErrorCodes.CONTENT_FILTER_TRIGGERED,\n message: 'Response was blocked by provider content safety filter.',\n provider: 'gemini',\n suggestion: 'Rephrase your question or adjust safety settings.',\n });\n }\n\n const chunkUsage = this.extractUsage(parsed);\n if (chunkUsage) {\n this._lastUsage = chunkUsage;\n }\n\n yield* this.extractChunks(parsed);\n } catch (error: unknown) {\n // Re-throw ContentFilterError, ignore other parse errors.\n if (error instanceof ContentFilterError) throw error;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Format a tool result so it can be sent back to Gemini as a\n * `functionResponse` part.\n */\n formatToolResult(\n callId: string,\n result: unknown,\n ): {\n role: string;\n parts: Array<{\n functionResponse: { name: string; response: { result: unknown } };\n }>;\n } {\n return {\n role: 'function',\n parts: [\n {\n functionResponse: {\n name: callId,\n response: { result },\n },\n },\n ],\n };\n }\n\n // -----------------------------------------------------------------------\n // Streaming request\n // -----------------------------------------------------------------------\n\n /**\n * Build and execute a streaming request to the Gemini API.\n * Returns the raw `ReadableStream` for the response body together with\n * the raw Response object.\n *\n * Note: The Gemini API key is passed as a URL query parameter (`key=`).\n * This is inherent to the Gemini REST SSE endpoint design; the key is\n * transmitted over HTTPS so it remains encrypted in transit. (H3)\n */\n async streamRequest(params: {\n systemPrompt: string;\n contents: unknown;\n userMessage?: string;\n tools?: unknown;\n signal?: AbortSignal;\n timeoutMs?: number;\n }): Promise<{\n stream: ReadableStream<Uint8Array>;\n response: Response;\n }> {\n // Build the full contents array: formatted history + the new user message.\n const contentsArray = params.contents as Array<unknown>;\n const fullContents = params.userMessage\n ? [...contentsArray, { role: 'user', parts: [{ text: params.userMessage }] }]\n : contentsArray;\n\n const url = `${GEMINI_BASE_URL}/${this.model}:streamGenerateContent?alt=sse&key=${this.apiKey}`;\n\n const body: Record<string, unknown> = {\n systemInstruction: {\n parts: [{ text: params.systemPrompt }],\n },\n contents: fullContents,\n safetySettings: DEFAULT_SAFETY_SETTINGS,\n generationConfig: {\n temperature: 0.7,\n topP: 0.95,\n topK: 40,\n },\n };\n\n if (params.tools) {\n body.tools = params.tools;\n }\n\n const timeoutMs = params.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n\n // Combine the external signal with our timeout signal.\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n if (params.signal) {\n // If the caller aborts, propagate to our controller.\n params.signal.addEventListener(\n 'abort',\n () => controller.abort(params.signal!.reason),\n { once: true },\n );\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (error: unknown) {\n clearTimeout(timeoutId);\n\n if (\n error instanceof DOMException &&\n error.name === 'AbortError'\n ) {\n // Distinguish caller abort from timeout.\n if (params.signal?.aborted) {\n throw error; // Re-throw caller abort as-is.\n }\n throw new TimeoutError({\n code: ErrorCodes.TIMEOUT_LLM_RESPONSE,\n message: `Gemini request timed out after ${timeoutMs}ms`,\n provider: 'gemini',\n recoverable: true,\n suggestion: 'Try again or increase the timeout.',\n operationName: 'gemini.streamGenerateContent',\n timeoutMs,\n });\n }\n\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `Failed to connect to Gemini API: ${(error as Error).message}`,\n provider: 'gemini',\n suggestion:\n 'Check your network connection and try again.',\n cause: error instanceof Error ? error : undefined,\n });\n }\n\n clearTimeout(timeoutId);\n\n // Handle HTTP-level errors.\n if (!response.ok) {\n await this.handleHttpError(response);\n }\n\n if (!response.body) {\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: 'Gemini response body is null – streaming unavailable.',\n provider: 'gemini',\n suggestion: 'Retry the request.',\n });\n }\n\n return { stream: response.body, response };\n }\n\n // -----------------------------------------------------------------------\n // Public helpers (LLMProviderAdapter interface)\n // -----------------------------------------------------------------------\n\n /**\n * Extract `TextChunk` and `ToolCall` items from a single parsed Gemini\n * SSE JSON object.\n */\n private *extractChunks(\n parsed: Record<string, unknown>,\n ): Generator<TextChunk | ToolCall> {\n const candidates = parsed.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n\n if (!candidates || candidates.length === 0) return;\n\n for (const candidate of candidates) {\n const content = candidate.content as\n | { parts?: Array<Record<string, unknown>> }\n | undefined;\n\n if (!content?.parts) continue;\n\n const finishReason = candidate.finishReason as string | undefined;\n const isDone =\n finishReason === 'STOP' || finishReason === 'MAX_TOKENS';\n\n for (const part of content.parts) {\n // Text part\n if (typeof part.text === 'string') {\n const textChunk: TextChunk = {\n text: part.text,\n done: isDone,\n };\n yield textChunk;\n }\n\n // Function call part\n if (part.functionCall) {\n const fc = part.functionCall as {\n name: string;\n args?: Record<string, unknown>;\n };\n const toolCall: ToolCall = {\n id: fc.name,\n name: fc.name,\n arguments: fc.args ?? {},\n };\n yield toolCall;\n }\n }\n }\n }\n\n /**\n * Extract token usage from a parsed Gemini response chunk.\n * Returns `null` if no usage metadata is present.\n */\n extractUsage(parsed: Record<string, unknown>): TokenUsage | null {\n const meta = parsed.usageMetadata as\n | {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n }\n | undefined;\n\n if (!meta) return null;\n\n return {\n prompt: meta.promptTokenCount ?? 0,\n completion: meta.candidatesTokenCount ?? 0,\n total: meta.totalTokenCount ?? 0,\n };\n }\n\n /**\n * Check whether a parsed Gemini chunk indicates the response was\n * blocked by a safety filter.\n */\n isContentFiltered(parsed: Record<string, unknown>): boolean {\n const candidates = parsed.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n\n if (!candidates || candidates.length === 0) {\n // If there is a promptFeedback.blockReason the response was blocked\n // before generation even started.\n const feedback = parsed.promptFeedback as\n | { blockReason?: string }\n | undefined;\n return feedback?.blockReason != null;\n }\n\n return candidates.some(\n (c) =>\n c.finishReason === 'SAFETY' ||\n c.finishReason === 'BLOCKED_REASON' ||\n c.finishReason === 'OTHER',\n );\n }\n\n /**\n * Translate an HTTP error response from Gemini into the appropriate\n * GuideKit error class.\n */\n private async handleHttpError(response: Response): Promise<never> {\n let errorBody = '';\n try {\n errorBody = await response.text();\n } catch {\n // Ignore read failure.\n }\n\n const status = response.status;\n\n if (status === 401 || status === 403) {\n throw new AuthenticationError({\n code: ErrorCodes.AUTH_INVALID_KEY,\n message: `Gemini API authentication failed (${status}): ${errorBody}`,\n provider: 'gemini',\n suggestion:\n 'Verify your Gemini API key is correct and has not expired.',\n });\n }\n\n if (status === 429) {\n const retryAfterHeader = response.headers.get('retry-after');\n const retryAfterMs = retryAfterHeader\n ? parseInt(retryAfterHeader, 10) * 1000\n : 60_000;\n\n throw new RateLimitError({\n code: ErrorCodes.RATE_LIMIT_PROVIDER,\n message: `Gemini API rate limit exceeded (429): ${errorBody}`,\n provider: 'gemini',\n recoverable: true,\n suggestion: `Rate limited by Gemini. Retry after ${Math.ceil(retryAfterMs / 1000)}s.`,\n retryAfterMs,\n });\n }\n\n if (status >= 500) {\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `Gemini API server error (${status}): ${errorBody}`,\n provider: 'gemini',\n suggestion:\n 'The Gemini API is experiencing issues. Please try again later.',\n });\n }\n\n // Fallback for other 4xx errors.\n throw new NetworkError({\n code: ErrorCodes.NETWORK_CONNECTION_LOST,\n message: `Gemini API request failed (${status}): ${errorBody}`,\n provider: 'gemini',\n suggestion: 'Check the request parameters and try again.',\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// LLMOrchestrator\n// ---------------------------------------------------------------------------\n\n/** Callback options accepted by `LLMOrchestrator`. */\ninterface OrchestratorCallbacks {\n onChunk?: (chunk: TextChunk) => void;\n onToolCall?: (toolCall: ToolCall) => void;\n onTokenUsage?: (usage: TokenUsage) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * High-level orchestrator that manages LLM interactions for the GuideKit SDK.\n *\n * Responsibilities:\n * - Owns the active `LLMProviderAdapter`.\n * - Streams responses from the provider, emitting callbacks for text chunks,\n * tool calls, and token usage.\n * - Handles content filter retries: if the initial response is blocked, it\n * retries once with a stripped-down prompt (no tools).\n * - Surfaces all errors through the SDK error hierarchy.\n *\n * The orchestrator is fully adapter-agnostic: all provider-specific logic\n * (SSE parsing, content filter detection, usage extraction) lives in the\n * adapter implementations.\n */\nexport class LLMOrchestrator {\n private _adapter: LLMProviderAdapter;\n private _config: LLMConfig;\n private readonly debug: boolean;\n private readonly callbacks: OrchestratorCallbacks;\n\n constructor(options: {\n config: LLMConfig;\n debug?: boolean;\n onChunk?: (chunk: TextChunk) => void;\n onToolCall?: (toolCall: ToolCall) => void;\n onTokenUsage?: (usage: TokenUsage) => void;\n onError?: (error: Error) => void;\n }) {\n this._config = options.config;\n this.debug = options.debug ?? false;\n this.callbacks = {\n onChunk: options.onChunk,\n onToolCall: options.onToolCall,\n onTokenUsage: options.onTokenUsage,\n onError: options.onError,\n };\n this._adapter = this.createAdapter(options.config);\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /**\n * Send a message and stream the response from the LLM.\n *\n * Accumulates text and tool calls from the stream, invoking callbacks\n * as chunks arrive, and returns the complete result once the stream ends.\n */\n async sendMessage(params: {\n systemPrompt: string;\n history: ConversationTurn[];\n userMessage: string;\n tools?: ToolDefinition[];\n signal?: AbortSignal;\n }): Promise<{\n text: string;\n toolCalls: ToolCall[];\n usage: TokenUsage;\n }> {\n try {\n return await this.executeStream(params, /* isRetry */ false);\n } catch (error: unknown) {\n if (error instanceof ContentFilterError) {\n // Retry once without tools (simplified prompt).\n this.log('Content filter triggered – retrying without tools');\n try {\n return await this.executeStream(\n { ...params, tools: undefined },\n /* isRetry */ true,\n );\n } catch (_retryError: unknown) {\n const cfError = new ContentFilterError({\n code: ErrorCodes.CONTENT_FILTER_TRIGGERED,\n message:\n 'Response blocked by content safety filter after retry.',\n provider: this.providerName,\n suggestion:\n 'Rephrase your question or adjust safety settings.',\n });\n this.callbacks.onError?.(cfError);\n throw cfError;\n }\n }\n\n // For non-content-filter errors, notify and re-throw.\n if (error instanceof Error) {\n this.callbacks.onError?.(error);\n }\n throw error;\n }\n }\n\n /**\n * Hot-swap the LLM configuration. Creates a new adapter for the\n * updated provider/model.\n */\n updateConfig(config: LLMConfig): void {\n this._config = config;\n this._adapter = this.createAdapter(config);\n const label = 'provider' in config ? config.provider : 'custom adapter';\n this.log(`Config updated: ${label}`);\n }\n\n /** Get the current provider adapter. */\n get adapter(): LLMProviderAdapter {\n return this._adapter;\n }\n\n // -----------------------------------------------------------------------\n // Internal helpers\n // -----------------------------------------------------------------------\n\n /**\n * Execute a streaming LLM request and collect the results.\n *\n * This method is fully adapter-agnostic: it delegates streaming,\n * response parsing, content-filter detection, and usage extraction\n * entirely to the active `LLMProviderAdapter`. No provider-specific\n * SSE parsing lives in the orchestrator.\n */\n private async executeStream(\n params: {\n systemPrompt: string;\n history: ConversationTurn[];\n userMessage: string;\n tools?: ToolDefinition[];\n signal?: AbortSignal;\n },\n _isRetry: boolean,\n ): Promise<{\n text: string;\n toolCalls: ToolCall[];\n usage: TokenUsage;\n }> {\n const adapter = this._adapter;\n\n // Format conversation history via the adapter.\n const historyContents = adapter.formatConversation(params.history);\n\n // Format tools if provided.\n const tools =\n params.tools && params.tools.length > 0\n ? adapter.formatTools(params.tools)\n : undefined;\n\n // Execute the streaming request via the adapter.\n // The adapter's streamRequest accepts the formatted history as `contents`\n // and appends the user message internally using `userMessage`.\n const { stream } = await adapter.streamRequest({\n systemPrompt: params.systemPrompt,\n contents: historyContents,\n userMessage: params.userMessage,\n tools,\n signal: params.signal,\n });\n\n // Parse the stream using the adapter's parseResponse.\n // Content filter detection and usage tracking are handled within\n // the adapter's parseResponse — a ContentFilterError will propagate\n // up naturally from the async iteration.\n let fullText = '';\n const toolCalls: ToolCall[] = [];\n\n for await (const item of adapter.parseResponse(stream)) {\n if ('name' in item && 'arguments' in item) {\n // ToolCall\n const toolCall = item as ToolCall;\n toolCalls.push(toolCall);\n this.callbacks.onToolCall?.(toolCall);\n } else {\n // TextChunk\n const chunk = item as TextChunk;\n if (chunk.text) {\n fullText += chunk.text;\n }\n this.callbacks.onChunk?.(chunk);\n }\n }\n\n // Always emit a final \"done\" chunk to signal stream completion,\n // regardless of whether text was received (M3 fix).\n this.callbacks.onChunk?.({ text: '', done: true });\n\n // Retrieve token usage from the adapter. The adapter tracks usage\n // internally during parseResponse via the `lastUsage` property.\n let usage: TokenUsage = emptyUsage();\n if ('lastUsage' in adapter) {\n usage = (adapter as unknown as { lastUsage: TokenUsage }).lastUsage;\n }\n\n // Report token usage.\n if (usage.total > 0) {\n this.callbacks.onTokenUsage?.(usage);\n }\n\n this.log(\n `Response complete: ${fullText.length} chars, ` +\n `${toolCalls.length} tool calls, ` +\n `${usage.total} tokens`,\n );\n\n return { text: fullText, toolCalls, usage };\n }\n\n /**\n * Create the appropriate adapter for the given config.\n *\n * Built-in providers:\n * - `'gemini'` — uses the bundled `GeminiAdapter`.\n *\n * Custom adapters:\n * - Pass `{ adapter: myAdapter }` to use any `LLMProviderAdapter`.\n * Example: `llm: { adapter: new OpenAIAdapter({ ... }) }`\n */\n private createAdapter(config: LLMConfig): LLMProviderAdapter {\n // Custom adapter — pass-through.\n if ('adapter' in config) {\n return config.adapter;\n }\n\n // Built-in providers.\n switch (config.provider) {\n case 'gemini':\n return new GeminiAdapter(config);\n default:\n throw new Error(\n `LLM provider \"${(config as { provider: string }).provider}\" is not yet supported. ` +\n 'Use { adapter: yourAdapter } for custom providers.',\n );\n }\n }\n\n /** Convenience accessor for the current provider name. */\n private get providerName(): string | undefined {\n if ('provider' in this._config) return this._config.provider;\n return undefined;\n }\n\n /** Log a debug message if debug mode is enabled. */\n private log(message: string): void {\n if (this.debug) {\n console.debug(`[GuideKit:LLM] ${message}`);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Multi-Turn Tool Executor\n// ---------------------------------------------------------------------------\n//\n// Implements a multi-turn tool execution loop that sits between the\n// LLMOrchestrator and callers. When the LLM returns tool calls, this\n// executor runs them, feeds results back, and repeats until the LLM\n// produces a text-only response or the round limit is reached.\n// ---------------------------------------------------------------------------\n\nimport type {\n ToolDefinition,\n ToolCall,\n ConversationTurn,\n} from '../types/index.js';\nimport type { LLMOrchestrator } from './index.js';\n\n// ---------------------------------------------------------------------------\n// Public interfaces\n// ---------------------------------------------------------------------------\n\n/**\n * A registered handler for a specific tool. The `name` must match the tool\n * definition's `name` field exactly.\n */\nexport interface ToolHandler {\n name: string;\n execute: (args: Record<string, unknown>) => Promise<unknown>;\n}\n\n/** Options for configuring the ToolExecutor. */\nexport interface ToolExecutorOptions {\n /** Max number of tool call rounds before forcing text response. Default: 5 */\n maxRounds?: number;\n /** Enable debug logging. */\n debug?: boolean;\n /** Called when a tool is about to be executed. */\n onToolCall?: (name: string, args: Record<string, unknown>) => void;\n /** Called when a tool execution completes. */\n onToolResult?: (name: string, result: unknown, durationMs: number) => void;\n /** Called when a tool execution fails. */\n onToolError?: (name: string, error: Error) => void;\n}\n\n/** A single executed tool call with its outcome. */\nexport interface ToolCallRecord {\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n durationMs: number;\n error?: string;\n}\n\n/** Aggregated token usage across all rounds. */\nexport interface AggregatedUsage {\n prompt: number;\n completion: number;\n total: number;\n}\n\n/** The complete result of a multi-turn tool execution session. */\nexport interface ToolExecutionResult {\n /** The final text response from the LLM. */\n text: string;\n /** All tool calls that were executed across every round. */\n toolCallsExecuted: ToolCallRecord[];\n /** Accumulated token usage across all LLM calls. */\n totalUsage: AggregatedUsage;\n /** Number of LLM round-trips performed. */\n rounds: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal types for tool-augmented conversation turns\n// ---------------------------------------------------------------------------\n\n/**\n * Internally, the tool executor needs richer turn types than the public\n * `ConversationTurn` (which only supports 'user' | 'assistant'). These\n * extended types carry tool call metadata and tool results so that each\n * LLM provider adapter can format them correctly.\n */\ninterface AssistantToolCallTurn {\n role: 'assistant';\n content: string;\n toolCalls: Array<{ id: string; name: string; args: Record<string, unknown> }>;\n timestamp: number;\n}\n\ninterface ToolResultTurn {\n role: 'tool';\n content: string;\n toolCallId: string;\n toolName: string;\n timestamp: number;\n}\n\n/**\n * A conversation turn that may be a standard turn, an assistant turn\n * with tool calls, or a tool result turn.\n */\ntype InternalTurn = ConversationTurn | AssistantToolCallTurn | ToolResultTurn;\n\n// ---------------------------------------------------------------------------\n// ToolExecutor\n// ---------------------------------------------------------------------------\n\n/**\n * Manages multi-turn LLM interactions involving tool calls.\n *\n * Flow:\n * 1. Send the user message to the LLM along with available tool definitions.\n * 2. If the LLM response includes tool calls, execute them in parallel.\n * 3. Feed tool results back to the LLM as additional conversation context.\n * 4. Repeat until the LLM produces a text-only response or `maxRounds`\n * is exceeded.\n */\nexport class ToolExecutor {\n private readonly maxRounds: number;\n private readonly debugEnabled: boolean;\n private readonly handlers = new Map<string, ToolHandler>();\n\n // Callbacks\n private readonly onToolCallCb?: (name: string, args: Record<string, unknown>) => void;\n private readonly onToolResultCb?: (name: string, result: unknown, durationMs: number) => void;\n private readonly onToolErrorCb?: (name: string, error: Error) => void;\n\n constructor(options?: ToolExecutorOptions) {\n this.maxRounds = options?.maxRounds ?? 5;\n this.debugEnabled = options?.debug ?? false;\n this.onToolCallCb = options?.onToolCall;\n this.onToolResultCb = options?.onToolResult;\n this.onToolErrorCb = options?.onToolError;\n }\n\n // -----------------------------------------------------------------------\n // Tool registration\n // -----------------------------------------------------------------------\n\n /** Register a tool handler. Overwrites any existing handler with the same name. */\n registerTool(handler: ToolHandler): void {\n this.handlers.set(handler.name, handler);\n this.log(`Registered tool: ${handler.name}`);\n }\n\n /** Unregister a tool by name. No-op if the tool is not registered. */\n unregisterTool(name: string): void {\n const deleted = this.handlers.delete(name);\n if (deleted) {\n this.log(`Unregistered tool: ${name}`);\n }\n }\n\n /** Check whether a tool handler is registered. */\n hasTool(name: string): boolean {\n return this.handlers.has(name);\n }\n\n /**\n * Build `ToolDefinition[]` from all registered handlers.\n *\n * Since `ToolHandler` only carries `name` and `execute`, the returned\n * definitions have empty descriptions and parameters. Callers that need\n * richer definitions should maintain their own `ToolDefinition[]` and\n * pass them directly to `executeWithTools`.\n */\n getToolDefinitions(): ToolDefinition[] {\n const definitions: ToolDefinition[] = [];\n for (const handler of this.handlers.values()) {\n definitions.push({\n name: handler.name,\n description: '',\n parameters: {},\n schemaVersion: 1,\n });\n }\n return definitions;\n }\n\n // -----------------------------------------------------------------------\n // Multi-turn execution loop\n // -----------------------------------------------------------------------\n\n /**\n * Execute a multi-turn conversation with tool calls.\n *\n * The method sends the initial user message to the LLM. If the LLM\n * responds with tool calls, each call is executed in parallel, the\n * results are appended to the conversation, and the updated context\n * is sent back to the LLM. This loop repeats until:\n *\n * - The LLM returns a text-only response (no tool calls), or\n * - `maxRounds` consecutive tool-calling rounds have been exhausted.\n *\n * When `maxRounds` is exceeded the executor returns whatever text the\n * LLM has produced so far (which may be empty).\n */\n async executeWithTools(params: {\n llm: LLMOrchestrator;\n systemPrompt: string;\n history: ConversationTurn[];\n userMessage: string;\n tools: ToolDefinition[];\n signal?: AbortSignal;\n }): Promise<ToolExecutionResult> {\n const { llm, systemPrompt, userMessage, tools, signal } = params;\n\n // Accumulate results across rounds.\n const allToolCalls: ToolCallRecord[] = [];\n const totalUsage: AggregatedUsage = { prompt: 0, completion: 0, total: 0 };\n let rounds = 0;\n let finalText = '';\n\n // Build the running conversation. We start with the caller-supplied\n // history and progressively append assistant / tool turns as the\n // loop executes. The initial history uses the standard ConversationTurn\n // type; tool-related turns use our internal extended types.\n const internalHistory: InternalTurn[] = [...params.history];\n\n // The user message for the *first* round. On subsequent rounds the\n // LLM is called with an empty user message because the new context\n // is conveyed through the tool result turns appended to the history.\n let currentUserMessage = userMessage;\n\n while (rounds < this.maxRounds) {\n // Check for abort before each round.\n if (signal?.aborted) {\n this.log('Aborted before round ' + (rounds + 1));\n break;\n }\n\n rounds++;\n this.log(`--- Round ${rounds} ---`);\n\n // Convert internal history to standard ConversationTurn[] for the\n // LLMOrchestrator, which only understands 'user' | 'assistant' roles.\n const llmHistory = this.flattenHistory(internalHistory);\n\n // Send to LLM.\n const response = await llm.sendMessage({\n systemPrompt,\n history: llmHistory,\n userMessage: currentUserMessage,\n tools,\n signal,\n });\n\n // Accumulate token usage.\n totalUsage.prompt += response.usage.prompt;\n totalUsage.completion += response.usage.completion;\n totalUsage.total += response.usage.total;\n\n // Capture any text the LLM produced alongside tool calls.\n if (response.text) {\n finalText = response.text;\n }\n\n // If there are no tool calls, we are done.\n if (response.toolCalls.length === 0) {\n this.log(`Round ${rounds}: text-only response, finishing loop`);\n break;\n }\n\n this.log(\n `Round ${rounds}: ${response.toolCalls.length} tool call(s) received`,\n );\n\n // Record the assistant turn with its tool calls.\n const assistantTurn: AssistantToolCallTurn = {\n role: 'assistant',\n content: response.text,\n toolCalls: response.toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.arguments,\n })),\n timestamp: Date.now(),\n };\n internalHistory.push(assistantTurn);\n\n // Execute all tool calls from this round in parallel.\n const toolResults = await this.executeToolCallsInParallel(\n response.toolCalls,\n signal,\n );\n\n // Append each tool result as a separate turn and record it.\n for (const tr of toolResults) {\n allToolCalls.push(tr.record);\n\n const resultTurn: ToolResultTurn = {\n role: 'tool',\n content: JSON.stringify(\n tr.record.error != null\n ? { error: tr.record.error }\n : tr.record.result,\n ),\n toolCallId: tr.toolCallId,\n toolName: tr.record.name,\n timestamp: Date.now(),\n };\n internalHistory.push(resultTurn);\n }\n\n // On subsequent rounds the new context is carried by the tool\n // result turns, so we send an empty user message.\n currentUserMessage = '';\n\n // Check abort again before looping.\n if (signal?.aborted) {\n this.log('Aborted after tool execution in round ' + rounds);\n break;\n }\n }\n\n if (rounds >= this.maxRounds) {\n this.log(\n `Max rounds (${this.maxRounds}) reached. Returning current text.`,\n );\n }\n\n this.log(\n `Execution complete: ${rounds} round(s), ` +\n `${allToolCalls.length} tool call(s), ` +\n `${totalUsage.total} total tokens`,\n );\n\n return {\n text: finalText,\n toolCallsExecuted: allToolCalls,\n totalUsage,\n rounds,\n };\n }\n\n // -----------------------------------------------------------------------\n // Private: execute a single tool call\n // -----------------------------------------------------------------------\n\n /**\n * Execute a single tool call by looking up the registered handler and\n * invoking it. Returns the result, any error message, and the wall-clock\n * duration in milliseconds.\n */\n private async executeTool(\n toolCall: ToolCall,\n ): Promise<{ result: unknown; error?: string; durationMs: number }> {\n const handler = this.handlers.get(toolCall.name);\n\n if (!handler) {\n const errorMsg = `Unknown tool: ${toolCall.name}`;\n this.log(errorMsg);\n return { result: undefined, error: errorMsg, durationMs: 0 };\n }\n\n this.onToolCallCb?.(toolCall.name, toolCall.arguments);\n\n const startTime = performance.now();\n\n try {\n const result = await handler.execute(toolCall.arguments);\n const durationMs = Math.round(performance.now() - startTime);\n\n this.onToolResultCb?.(toolCall.name, result, durationMs);\n this.log(\n `Tool \"${toolCall.name}\" completed in ${durationMs}ms`,\n );\n\n return { result, durationMs };\n } catch (err: unknown) {\n const durationMs = Math.round(performance.now() - startTime);\n const error = err instanceof Error ? err : new Error(String(err));\n\n this.onToolErrorCb?.(toolCall.name, error);\n this.log(\n `Tool \"${toolCall.name}\" failed after ${durationMs}ms: ${error.message}`,\n );\n\n return { result: undefined, error: error.message, durationMs };\n }\n }\n\n // -----------------------------------------------------------------------\n // Private: execute tool calls in parallel\n // -----------------------------------------------------------------------\n\n /**\n * Execute an array of tool calls concurrently. If the abort signal fires\n * mid-execution, already-started calls run to completion but the results\n * of all settled calls are still returned.\n */\n private async executeToolCallsInParallel(\n toolCalls: ToolCall[],\n signal?: AbortSignal,\n ): Promise<\n Array<{\n toolCallId: string;\n record: ToolCallRecord;\n }>\n > {\n // If already aborted, skip execution entirely.\n if (signal?.aborted) {\n return toolCalls.map((tc) => ({\n toolCallId: tc.id,\n record: {\n name: tc.name,\n args: tc.arguments,\n result: undefined,\n durationMs: 0,\n error: 'Execution aborted',\n },\n }));\n }\n\n const settled = await Promise.allSettled(\n toolCalls.map(async (tc) => {\n // Check abort before starting each call. Already-queued microtasks\n // will still run, but this avoids starting new work when possible.\n if (signal?.aborted) {\n return {\n toolCallId: tc.id,\n record: {\n name: tc.name,\n args: tc.arguments,\n result: undefined,\n durationMs: 0,\n error: 'Execution aborted',\n } satisfies ToolCallRecord,\n };\n }\n\n const outcome = await this.executeTool(tc);\n\n return {\n toolCallId: tc.id,\n record: {\n name: tc.name,\n args: tc.arguments,\n result: outcome.result,\n durationMs: outcome.durationMs,\n ...(outcome.error != null ? { error: outcome.error } : {}),\n } satisfies ToolCallRecord,\n };\n }),\n );\n\n // Collect results. Rejected promises are converted to error records.\n return settled.map((s, i) => {\n if (s.status === 'fulfilled') {\n return s.value;\n }\n\n // This branch should be unreachable because executeTool catches all\n // errors, but we handle it defensively.\n const tc = toolCalls[i];\n if (!tc) {\n const errorMsg =\n s.reason instanceof Error ? s.reason.message : String(s.reason);\n return {\n toolCallId: `unknown-${i}`,\n record: {\n name: 'unknown',\n args: {},\n result: undefined,\n durationMs: 0,\n error: errorMsg,\n },\n };\n }\n const errorMsg =\n s.reason instanceof Error ? s.reason.message : String(s.reason);\n\n return {\n toolCallId: tc.id,\n record: {\n name: tc.name,\n args: tc.arguments,\n result: undefined,\n durationMs: 0,\n error: errorMsg,\n },\n };\n });\n }\n\n // -----------------------------------------------------------------------\n // Private: flatten internal history for the LLMOrchestrator\n // -----------------------------------------------------------------------\n\n /**\n * Convert the internal turn representation (which includes 'tool' roles\n * and assistant turns with tool call metadata) into the flat\n * `ConversationTurn[]` that `LLMOrchestrator.sendMessage` expects.\n *\n * Strategy:\n * - Standard `ConversationTurn` objects pass through unchanged.\n * - `AssistantToolCallTurn` objects are converted to an assistant turn\n * whose content describes the tool calls that were made.\n * - `ToolResultTurn` objects are converted to user turns that report\n * the tool results so the LLM can incorporate them.\n *\n * This approach works with any LLM provider since it only uses the\n * 'user' | 'assistant' role discriminator.\n */\n private flattenHistory(turns: InternalTurn[]): ConversationTurn[] {\n const flat: ConversationTurn[] = [];\n\n for (const turn of turns) {\n if (this.isToolResultTurn(turn)) {\n // Encode tool results as user turns so the LLM sees them as\n // new information to process.\n flat.push({\n role: 'user',\n content: `[Tool result for \"${turn.toolName}\" (id: ${turn.toolCallId})]: ${turn.content}`,\n timestamp: turn.timestamp,\n });\n } else if (this.isAssistantToolCallTurn(turn)) {\n // Encode the assistant's tool call request as an assistant turn.\n const callDescriptions = turn.toolCalls\n .map(\n (tc) =>\n `[Calling tool \"${tc.name}\" (id: ${tc.id}) with args: ${JSON.stringify(tc.args)}]`,\n )\n .join('\\n');\n\n const content = turn.content\n ? `${turn.content}\\n\\n${callDescriptions}`\n : callDescriptions;\n\n flat.push({\n role: 'assistant',\n content,\n timestamp: turn.timestamp,\n });\n } else {\n // Standard ConversationTurn — pass through.\n flat.push(turn);\n }\n }\n\n return flat;\n }\n\n // -----------------------------------------------------------------------\n // Type guards\n // -----------------------------------------------------------------------\n\n private isToolResultTurn(turn: InternalTurn): turn is ToolResultTurn {\n return (turn as ToolResultTurn).role === 'tool';\n }\n\n private isAssistantToolCallTurn(\n turn: InternalTurn,\n ): turn is AssistantToolCallTurn {\n return (\n turn.role === 'assistant' &&\n Array.isArray((turn as AssistantToolCallTurn).toolCalls)\n );\n }\n\n // -----------------------------------------------------------------------\n // Debug logging\n // -----------------------------------------------------------------------\n\n private log(message: string): void {\n if (this.debugEnabled) {\n console.debug(`[GuideKit:ToolExecutor] ${message}`);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Network Connectivity Manager\n// ---------------------------------------------------------------------------\n\nimport type { ConnectionState } from '../types/index.js';\n\nconst LOG_PREFIX = '[GuideKit:Connectivity]';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Maximum number of messages held in the offline queue. */\nconst MAX_QUEUE_SIZE = 5;\n\n/** Number of recent pings used to compute rolling average latency. */\nconst ROLLING_WINDOW = 3;\n\n/** Latency threshold (ms) above which the connection is considered degraded. */\nconst DEGRADED_THRESHOLD_MS = 2_000;\n\n/** Ping intervals per state (ms). */\nconst PING_INTERVALS: Record<ConnectionState, number> = {\n online: 30_000,\n degraded: 5_000,\n offline: 10_000,\n};\n\n/** Timeout applied to each health-check fetch (ms). */\nconst PING_TIMEOUT_MS = 5_000;\n\n// ---------------------------------------------------------------------------\n// QueuedMessage\n// ---------------------------------------------------------------------------\n\n/** A message held for replay once connectivity is restored. */\nexport interface QueuedMessage {\n content: string;\n timestamp: number;\n pageUrl: string;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ConnectionManagerOptions {\n /** Server endpoint for lightweight health-check pings. */\n healthEndpoint?: string;\n /** When `true`, diagnostic messages are logged to the console. */\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// State-change subscriber\n// ---------------------------------------------------------------------------\n\ntype StateChangeCallback = (\n state: ConnectionState,\n previous: ConnectionState,\n) => void;\n\n// ---------------------------------------------------------------------------\n// ConnectionManager\n// ---------------------------------------------------------------------------\n\n/**\n * Monitors network connectivity and exposes a reactive {@link ConnectionState}.\n *\n * Strategy:\n * 1. Listen to `window.online` / `window.offline` events (coarse signal).\n * 2. Periodically ping the configured `healthEndpoint` (fine-grained signal).\n * 3. Compute a rolling average of the last {@link ROLLING_WINDOW} ping\n * latencies to detect degraded connections (> {@link DEGRADED_THRESHOLD_MS}).\n * 4. When fully offline (`navigator.onLine === false`), suspend pinging and\n * wait for the browser's `online` event before resuming.\n *\n * All browser APIs are gated behind `typeof window !== 'undefined'` so the\n * class can be safely imported (though not meaningfully used) in SSR contexts.\n */\nexport class ConnectionManager {\n // ---- Configuration ------------------------------------------------------\n\n private readonly healthEndpoint: string | undefined;\n private readonly debugEnabled: boolean;\n\n // ---- Internal state -----------------------------------------------------\n\n private _state: ConnectionState = 'online';\n private _running = false;\n\n /** Rolling window of recent ping latencies (ms). */\n private readonly pingLatencies: number[] = [];\n\n /** Queued messages awaiting replay on reconnect. */\n private readonly messageQueue: QueuedMessage[] = [];\n\n /** Registered state-change subscribers. */\n private readonly subscribers: Set<StateChangeCallback> = new Set();\n\n /** Timer handle for the periodic ping loop. */\n private pingTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Bound event handlers (stored for deterministic removal). */\n private readonly handleOnline: () => void;\n private readonly handleOffline: () => void;\n\n // -----------------------------------------------------------------------\n // Constructor\n // -----------------------------------------------------------------------\n\n constructor(options?: ConnectionManagerOptions) {\n this.healthEndpoint = options?.healthEndpoint;\n this.debugEnabled = options?.debug ?? false;\n\n // Pre-bind handlers so we can add/remove the exact same references.\n this.handleOnline = this.onBrowserOnline.bind(this);\n this.handleOffline = this.onBrowserOffline.bind(this);\n\n this.log('ConnectionManager created');\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /** Current connection state. */\n get state(): ConnectionState {\n return this._state;\n }\n\n /**\n * Start monitoring connectivity.\n *\n * Attaches browser event listeners and begins the periodic ping loop.\n * Calling `start()` when already running is a no-op.\n */\n start(): void {\n if (this._running) {\n return;\n }\n\n this._running = true;\n this.log('Monitoring started');\n\n if (typeof window !== 'undefined') {\n window.addEventListener('online', this.handleOnline);\n window.addEventListener('offline', this.handleOffline);\n\n // Seed initial state from the browser.\n if (!navigator.onLine) {\n this.transition('offline');\n }\n }\n\n this.schedulePing();\n }\n\n /**\n * Stop monitoring connectivity.\n *\n * Removes all event listeners, clears timers, and resets internal state.\n */\n stop(): void {\n if (!this._running) {\n return;\n }\n\n this._running = false;\n this.log('Monitoring stopped');\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('online', this.handleOnline);\n window.removeEventListener('offline', this.handleOffline);\n }\n\n this.clearPingTimer();\n this.pingLatencies.length = 0;\n }\n\n /**\n * Subscribe to connection state changes.\n *\n * @returns An unsubscribe function. Calling it more than once is safe.\n */\n onStateChange(callback: StateChangeCallback): () => void {\n this.subscribers.add(callback);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Queue a message for replay once the connection is restored.\n *\n * The queue is capped at {@link MAX_QUEUE_SIZE} messages. When the cap is\n * exceeded the oldest message is discarded.\n */\n queueMessage(message: QueuedMessage): void {\n if (this.messageQueue.length >= MAX_QUEUE_SIZE) {\n const discarded = this.messageQueue.shift();\n this.log('Queue full — discarded oldest message', discarded);\n }\n\n this.messageQueue.push(message);\n this.log(`Message queued (${this.messageQueue.length}/${MAX_QUEUE_SIZE})`);\n }\n\n /**\n * Drain the message queue and return its contents.\n *\n * Messages whose `pageUrl` no longer matches the current browser URL are\n * silently discarded (the user has navigated away since queueing).\n */\n drainQueue(): QueuedMessage[] {\n const currentUrl = this.getCurrentUrl();\n const valid: QueuedMessage[] = [];\n\n for (const msg of this.messageQueue) {\n if (msg.pageUrl === currentUrl) {\n valid.push(msg);\n } else {\n this.log('Discarded stale message (URL changed)', msg.pageUrl);\n }\n }\n\n this.messageQueue.length = 0;\n this.log(`Drained ${valid.length} message(s)`);\n return valid;\n }\n\n /**\n * Force an immediate connectivity check.\n *\n * @returns The updated {@link ConnectionState} after the check completes.\n */\n async checkNow(): Promise<ConnectionState> {\n // If the browser reports offline, skip the network request entirely.\n if (typeof window !== 'undefined' && !navigator.onLine) {\n this.transition('offline');\n return this._state;\n }\n\n await this.ping();\n return this._state;\n }\n\n // -----------------------------------------------------------------------\n // Browser event handlers\n // -----------------------------------------------------------------------\n\n private onBrowserOnline(): void {\n this.log('Browser \"online\" event received');\n\n // Reset latency history — the previous measurements are stale.\n this.pingLatencies.length = 0;\n\n // Optimistically assume online; the next ping will refine the state.\n this.transition('online');\n\n // Resume pinging if we are still in monitoring mode.\n if (this._running) {\n this.schedulePing();\n }\n }\n\n private onBrowserOffline(): void {\n this.log('Browser \"offline\" event received');\n this.transition('offline');\n\n // Suspend pinging — no point hitting the network when the browser\n // itself says we are offline. We will resume via `handleOnline`.\n this.clearPingTimer();\n }\n\n // -----------------------------------------------------------------------\n // Ping logic\n // -----------------------------------------------------------------------\n\n /**\n * Execute a single health-check ping and update state accordingly.\n */\n private async ping(): Promise<void> {\n if (!this.healthEndpoint) {\n // Without an endpoint we can only rely on navigator.onLine.\n if (typeof window !== 'undefined') {\n this.transition(navigator.onLine ? 'online' : 'offline');\n }\n return;\n }\n\n const start = Date.now();\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), PING_TIMEOUT_MS);\n\n try {\n await fetch(this.healthEndpoint, {\n method: 'HEAD',\n mode: 'no-cors',\n cache: 'no-store',\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeout);\n }\n\n const latency = Date.now() - start;\n this.recordLatency(latency);\n this.log(`Ping OK (${latency}ms)`);\n\n // Evaluate rolling average to decide between online / degraded.\n const avg = this.rollingAverage();\n if (avg > DEGRADED_THRESHOLD_MS) {\n this.transition('degraded');\n } else {\n this.transition('online');\n }\n } catch {\n this.log('Ping failed');\n\n // A failed ping when navigator reports offline is a clear offline.\n if (typeof window !== 'undefined' && !navigator.onLine) {\n this.transition('offline');\n } else {\n // Network may still be up, but the endpoint is unreachable —\n // treat as degraded rather than outright offline.\n this.transition('degraded');\n }\n }\n }\n\n /**\n * Record a latency sample, keeping only the last {@link ROLLING_WINDOW}\n * entries.\n */\n private recordLatency(ms: number): void {\n this.pingLatencies.push(ms);\n if (this.pingLatencies.length > ROLLING_WINDOW) {\n this.pingLatencies.shift();\n }\n }\n\n /** Compute the arithmetic mean of recorded latencies. */\n private rollingAverage(): number {\n if (this.pingLatencies.length === 0) return 0;\n\n let sum = 0;\n for (const v of this.pingLatencies) {\n sum += v;\n }\n return sum / this.pingLatencies.length;\n }\n\n // -----------------------------------------------------------------------\n // Ping scheduling\n // -----------------------------------------------------------------------\n\n /**\n * Schedule the next ping according to the current state's interval.\n *\n * When in the `offline` state, pinging is suspended entirely — the\n * manager waits for the browser's `online` event to resume.\n */\n private schedulePing(): void {\n this.clearPingTimer();\n\n if (!this._running) {\n return;\n }\n\n // While offline, do not ping. The browser `online` event will resume.\n if (this._state === 'offline') {\n return;\n }\n\n const interval = PING_INTERVALS[this._state];\n\n this.pingTimer = setTimeout(async () => {\n if (!this._running) return;\n\n await this.ping();\n\n // Schedule the next iteration (interval may have changed due to\n // a state transition during the ping).\n this.schedulePing();\n }, interval);\n }\n\n private clearPingTimer(): void {\n if (this.pingTimer !== null) {\n clearTimeout(this.pingTimer);\n this.pingTimer = null;\n }\n }\n\n // -----------------------------------------------------------------------\n // State transitions\n // -----------------------------------------------------------------------\n\n /**\n * Transition to a new state, notifying subscribers if the state actually\n * changed.\n */\n private transition(next: ConnectionState): void {\n const previous = this._state;\n if (previous === next) {\n return;\n }\n\n this._state = next;\n this.log(`State: ${previous} -> ${next}`);\n\n // Notify subscribers. Errors in callbacks are caught so one bad\n // subscriber does not prevent the rest from being notified.\n for (const cb of this.subscribers) {\n try {\n cb(next, previous);\n } catch (err) {\n console.error(LOG_PREFIX, 'Subscriber threw an error:', err);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Helpers\n // -----------------------------------------------------------------------\n\n /** Return the current page URL, or an empty string in SSR contexts. */\n private getCurrentUrl(): string {\n if (typeof window !== 'undefined') {\n return window.location.href;\n }\n return '';\n }\n\n /** Conditional debug logging. */\n private log(...args: unknown[]): void {\n if (this.debugEnabled) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Navigation Controller\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Nav]';\n\nexport interface NavigationControllerOptions {\n debug?: boolean;\n /** Developer-provided router for guaranteed SPA navigation. */\n router?: {\n push: (href: string) => void | Promise<void>;\n };\n}\n\n/**\n * Manages SPA navigation detection and programmatic routing.\n *\n * - Prefers the Navigation API (Chrome 102+) where available.\n * - Falls back to `popstate` + periodic URL polling (200ms).\n * - Developer can pass a `router` prop for guaranteed SPA nav.\n */\nexport class NavigationController {\n private readonly debug: boolean;\n private readonly router?: { push: (href: string) => void | Promise<void> };\n\n private currentUrl: string = '';\n private pollingTimer: ReturnType<typeof setInterval> | null = null;\n private callbacks: Array<(from: string, to: string) => void> = [];\n private cleanups: Array<() => void> = [];\n\n constructor(options?: NavigationControllerOptions) {\n this.debug = options?.debug ?? false;\n this.router = options?.router;\n }\n\n /** Start listening for navigation events. */\n start(): void {\n if (typeof window === 'undefined') return;\n\n this.currentUrl = window.location.href;\n\n // Prefer Navigation API\n if ('navigation' in window && typeof (window as any).navigation?.addEventListener === 'function') {\n const nav = (window as any).navigation;\n const handler = (event: any) => {\n const to = event.destination?.url ?? window.location.href;\n this.handleRouteChange(to);\n };\n nav.addEventListener('navigate', handler);\n this.cleanups.push(() => nav.removeEventListener('navigate', handler));\n\n if (this.debug) console.debug(LOG_PREFIX, 'Using Navigation API');\n } else {\n // Fallback: popstate + polling\n const popHandler = () => {\n this.handleRouteChange(window.location.href);\n };\n window.addEventListener('popstate', popHandler);\n this.cleanups.push(() => window.removeEventListener('popstate', popHandler));\n\n // Poll every 200ms for pushState changes\n this.pollingTimer = setInterval(() => {\n if (window.location.href !== this.currentUrl) {\n this.handleRouteChange(window.location.href);\n }\n }, 200);\n\n if (this.debug) console.debug(LOG_PREFIX, 'Using popstate + URL polling fallback');\n }\n }\n\n /** Stop listening for navigation events. */\n stop(): void {\n for (const cleanup of this.cleanups) {\n cleanup();\n }\n this.cleanups = [];\n\n if (this.pollingTimer !== null) {\n clearInterval(this.pollingTimer);\n this.pollingTimer = null;\n }\n }\n\n /**\n * Subscribe to route changes.\n * @returns Unsubscribe function.\n */\n onRouteChange(callback: (from: string, to: string) => void): () => void {\n this.callbacks.push(callback);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const idx = this.callbacks.indexOf(callback);\n if (idx !== -1) this.callbacks.splice(idx, 1);\n };\n }\n\n /**\n * Programmatically navigate to a URL.\n * Validates same-origin before navigating.\n */\n async navigate(href: string): Promise<boolean> {\n if (typeof window === 'undefined') return false;\n\n // Same-origin validation\n try {\n const target = new URL(href, window.location.origin);\n if (target.origin !== window.location.origin) {\n if (this.debug) console.warn(LOG_PREFIX, 'Blocked cross-origin navigation to', href);\n return false;\n }\n href = target.href;\n } catch {\n if (this.debug) console.warn(LOG_PREFIX, 'Invalid URL:', href);\n return false;\n }\n\n // Use developer-provided router if available\n if (this.router) {\n await this.router.push(href);\n return true;\n }\n\n // Fallback: update location\n window.location.href = href;\n return true;\n }\n\n /** Get the current URL. */\n get url(): string {\n if (typeof window === 'undefined') return '';\n return window.location.href;\n }\n\n private handleRouteChange(newUrl: string): void {\n if (newUrl === this.currentUrl) return;\n\n const from = this.currentUrl;\n this.currentUrl = newUrl;\n\n if (this.debug) console.debug(LOG_PREFIX, `Route change: ${from} → ${newUrl}`);\n\n for (const callback of this.callbacks.slice()) {\n try {\n callback(from, newUrl);\n } catch (err) {\n console.error(LOG_PREFIX, 'Route change handler error:', err);\n }\n }\n }\n}\n","// ----------------------------------------------------------------------------\n// WebSocket Connection Manager for STT/TTS\n// Manages WebSocket connections with automatic reconnection, exponential\n// backoff, send queueing, and SSR safety.\n// ----------------------------------------------------------------------------\n\nexport type WSState =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'reconnecting'\n | 'failed'\n | 'suspended';\n\nexport interface WebSocketManagerOptions {\n url: string | (() => string | Promise<string>);\n /** Max reconnection attempts before entering FAILED state. Default: 5 */\n maxReconnectAttempts?: number;\n /** Initial reconnect delay in ms. Default: 1000 */\n initialDelay?: number;\n /** Max reconnect delay in ms. Default: 30000 */\n maxDelay?: number;\n /** Connection timeout in ms. Default: 5000 */\n connectTimeoutMs?: number;\n /** Protocols to pass to WebSocket constructor */\n protocols?: string | string[];\n /** Debug logging */\n debug?: boolean;\n /** Label for logging (e.g., 'STT', 'TTS') */\n label?: string;\n}\n\ntype MessagePayload = string | ArrayBuffer | Blob;\n\nconst DEFAULT_MAX_RECONNECT_ATTEMPTS = 5;\nconst DEFAULT_INITIAL_DELAY = 1000;\nconst DEFAULT_MAX_DELAY = 30_000;\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5000;\nconst MAX_QUEUE_SIZE = 50;\n\ninterface ListenerRefs {\n onOpen: () => void;\n onClose: (e: CloseEvent) => void;\n onError: (e: Event) => void;\n onMessage: (e: MessageEvent) => void;\n}\n\nexport class WebSocketManager {\n // ── Options (resolved with defaults) ────────────────────────────────\n private readonly _url: string | (() => string | Promise<string>);\n private readonly _maxReconnectAttempts: number;\n private readonly _initialDelay: number;\n private readonly _maxDelay: number;\n private readonly _connectTimeoutMs: number;\n private readonly _protocols: string | string[] | undefined;\n private readonly _debug: boolean;\n private readonly _label: string;\n\n // ── Internal state ──────────────────────────────────────────────────\n private _state: WSState = 'disconnected';\n private _socket: WebSocket | null = null;\n private _reconnectAttempts = 0;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _connectTimer: ReturnType<typeof setTimeout> | null = null;\n private _destroyed = false;\n\n // ── Listener references (for proper cleanup) ──────────────────────\n private _listenerRefs = new WeakMap<WebSocket, ListenerRefs>();\n\n // ── Send queue ──────────────────────────────────────────────────────\n private _queue: MessagePayload[] = [];\n\n // ── Event listeners ─────────────────────────────────────────────────\n private _onOpenCallbacks: Set<() => void> = new Set();\n private _onCloseCallbacks: Set<(code: number, reason: string) => void> = new Set();\n private _onMessageCallbacks: Set<(data: MessageEvent) => void> = new Set();\n private _onErrorCallbacks: Set<(error: Event) => void> = new Set();\n private _onStateChangeCallbacks: Set<(state: WSState, previous: WSState) => void> = new Set();\n\n // ── Constructor ─────────────────────────────────────────────────────\n\n constructor(options: WebSocketManagerOptions) {\n this._url = options.url;\n this._maxReconnectAttempts = options.maxReconnectAttempts ?? DEFAULT_MAX_RECONNECT_ATTEMPTS;\n this._initialDelay = options.initialDelay ?? DEFAULT_INITIAL_DELAY;\n this._maxDelay = options.maxDelay ?? DEFAULT_MAX_DELAY;\n this._connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n this._protocols = options.protocols;\n this._debug = options.debug ?? false;\n this._label = options.label ?? 'WS';\n }\n\n // ── Public getters ──────────────────────────────────────────────────\n\n /** Current connection state */\n get state(): WSState {\n return this._state;\n }\n\n /** The underlying WebSocket (null if not connected) */\n get socket(): WebSocket | null {\n return this._socket;\n }\n\n // ── Connection lifecycle ────────────────────────────────────────────\n\n /** Connect to the WebSocket server */\n async connect(): Promise<void> {\n if (this._destroyed) {\n this._log('Cannot connect — manager is destroyed');\n return;\n }\n\n // SSR guard\n if (typeof WebSocket === 'undefined') {\n this._log('WebSocket is not available in this environment');\n return;\n }\n\n // If already connected or connecting, no-op\n if (this._state === 'connected' || this._state === 'connecting') {\n this._log(`Already in state \"${this._state}\", ignoring connect()`);\n return;\n }\n\n // A manual connect() call from FAILED state resets the attempt counter\n if (this._state === 'failed') {\n this._reconnectAttempts = 0;\n }\n\n this._setState('connecting');\n await this._attemptConnection();\n }\n\n /** Gracefully close the connection */\n close(code?: number, reason?: string): void {\n this._log('close() called');\n this._clearTimers();\n this._reconnectAttempts = 0;\n\n if (this._socket) {\n // Remove listeners before closing to prevent the close handler from\n // triggering reconnection logic.\n this._detachSocketListeners(this._socket);\n try {\n this._socket.close(code ?? 1000, reason ?? 'Client closed');\n } catch {\n // Socket may already be closed; ignore.\n }\n this._socket = null;\n }\n\n this._setState('disconnected');\n }\n\n /**\n * Send data through the WebSocket.\n * - If state is `connecting` or `reconnecting`, the message is queued.\n * - If state is `connected`, the message is sent immediately.\n * - If state is `failed` or `suspended`, an error is thrown.\n * - If state is `disconnected`, the message is queued (a reconnect may follow).\n */\n send(data: MessagePayload): void {\n if (this._state === 'failed') {\n throw new Error(\n `[GuideKit:WS:${this._label}] Cannot send — connection is in FAILED state. Call connect() to retry.`,\n );\n }\n\n if (this._state === 'suspended') {\n throw new Error(\n `[GuideKit:WS:${this._label}] Cannot send — connection is SUSPENDED. Call resume() first.`,\n );\n }\n\n if (this._state === 'connected' && this._socket?.readyState === WebSocket.OPEN) {\n this._socket.send(data);\n return;\n }\n\n // Queue the message for later delivery\n this._enqueue(data);\n }\n\n // ── Suspend / Resume ────────────────────────────────────────────────\n\n /** Suspend reconnection (e.g., during confirmed offline). No reconnection attempts. */\n suspend(): void {\n if (this._state === 'failed' || this._state === 'suspended') {\n this._log(`suspend() ignored — already in \"${this._state}\"`);\n return;\n }\n\n this._log('Suspending');\n this._clearTimers();\n\n // If there is an active socket, close it\n if (this._socket) {\n this._detachSocketListeners(this._socket);\n try {\n this._socket.close(1000, 'Suspended');\n } catch {\n // ignore\n }\n this._socket = null;\n }\n\n this._setState('suspended');\n }\n\n /** Resume from suspended state. Triggers reconnection. */\n resume(): void {\n if (this._state !== 'suspended') {\n this._log(`resume() ignored — not in SUSPENDED state (current: \"${this._state}\")`);\n return;\n }\n\n this._log('Resuming');\n this._reconnectAttempts = 0;\n this._setState('reconnecting');\n this._scheduleReconnect();\n }\n\n // ── Event registration ──────────────────────────────────────────────\n\n /** Register an onOpen handler. Returns an unsubscribe function. */\n onOpen(callback: () => void): () => void {\n this._onOpenCallbacks.add(callback);\n return () => {\n this._onOpenCallbacks.delete(callback);\n };\n }\n\n /** Register an onClose handler. Returns an unsubscribe function. */\n onClose(callback: (code: number, reason: string) => void): () => void {\n this._onCloseCallbacks.add(callback);\n return () => {\n this._onCloseCallbacks.delete(callback);\n };\n }\n\n /** Register an onMessage handler. Returns an unsubscribe function. */\n onMessage(callback: (data: MessageEvent) => void): () => void {\n this._onMessageCallbacks.add(callback);\n return () => {\n this._onMessageCallbacks.delete(callback);\n };\n }\n\n /** Register an onError handler. Returns an unsubscribe function. */\n onError(callback: (error: Event) => void): () => void {\n this._onErrorCallbacks.add(callback);\n return () => {\n this._onErrorCallbacks.delete(callback);\n };\n }\n\n /** Register a state change handler. Returns an unsubscribe function. */\n onStateChange(callback: (state: WSState, previous: WSState) => void): () => void {\n this._onStateChangeCallbacks.add(callback);\n return () => {\n this._onStateChangeCallbacks.delete(callback);\n };\n }\n\n // ── Destroy ─────────────────────────────────────────────────────────\n\n /** Destroy the manager and clean up all resources */\n destroy(): void {\n if (this._destroyed) return;\n this._destroyed = true;\n this._log('Destroying');\n\n this.close();\n this._queue = [];\n this._onOpenCallbacks.clear();\n this._onCloseCallbacks.clear();\n this._onMessageCallbacks.clear();\n this._onErrorCallbacks.clear();\n this._onStateChangeCallbacks.clear();\n }\n\n // ── Private: Connection logic ───────────────────────────────────────\n\n private async _resolveUrl(): Promise<string> {\n if (typeof this._url === 'function') {\n return await this._url();\n }\n return this._url;\n }\n\n private async _attemptConnection(): Promise<void> {\n // SSR guard\n if (typeof WebSocket === 'undefined') return;\n\n let url: string;\n try {\n url = await this._resolveUrl();\n } catch (err) {\n this._log(`URL resolution failed: ${err}`);\n this._handleConnectionFailure();\n return;\n }\n\n this._log(`Connecting to ${url}`);\n\n let ws: WebSocket;\n try {\n ws = this._protocols ? new WebSocket(url, this._protocols) : new WebSocket(url);\n } catch (err) {\n this._log(`WebSocket constructor threw: ${err}`);\n this._handleConnectionFailure();\n return;\n }\n\n // Binary type: arraybuffer is generally more useful than blob\n ws.binaryType = 'arraybuffer';\n\n this._socket = ws;\n\n // ── Connection timeout ──────────────────────────────────────────\n this._connectTimer = setTimeout(() => {\n if (ws.readyState === WebSocket.CONNECTING) {\n this._log('Connection timed out');\n // Force-close the socket; the close handler will trigger reconnection.\n ws.close();\n }\n }, this._connectTimeoutMs);\n\n // ── Socket event handlers ───────────────────────────────────────\n const onOpen = () => {\n this._clearConnectTimer();\n this._reconnectAttempts = 0;\n this._setState('connected');\n this._log('Connected');\n\n // Notify listeners\n for (const cb of this._onOpenCallbacks) {\n try {\n cb();\n } catch {\n // Swallow listener errors\n }\n }\n\n // Flush queued messages\n this._flushQueue();\n };\n\n const onClose = (event: CloseEvent) => {\n this._clearConnectTimer();\n this._log(`Socket closed — code=${event.code} reason=\"${event.reason}\"`);\n\n // Notify close listeners\n for (const cb of this._onCloseCallbacks) {\n try {\n cb(event.code, event.reason);\n } catch {\n // Swallow listener errors\n }\n }\n\n // Clean up this socket reference if it is the current one\n if (this._socket === ws) {\n this._socket = null;\n }\n\n // Only attempt reconnection if the manager hasn't been destroyed or\n // intentionally closed (state would be 'disconnected' in that case).\n if (\n !this._destroyed &&\n this._state !== 'disconnected' &&\n this._state !== 'suspended' &&\n this._state !== 'failed'\n ) {\n this._setState('disconnected');\n this._handleConnectionFailure();\n }\n };\n\n const onError = (event: Event) => {\n this._log('Socket error');\n for (const cb of this._onErrorCallbacks) {\n try {\n cb(event);\n } catch {\n // Swallow listener errors\n }\n }\n // The `close` event will follow the `error` event, so reconnection\n // logic is handled there.\n };\n\n const onMessage = (event: MessageEvent) => {\n for (const cb of this._onMessageCallbacks) {\n try {\n cb(event);\n } catch {\n // Swallow listener errors\n }\n }\n };\n\n ws.addEventListener('open', onOpen);\n ws.addEventListener('close', onClose);\n ws.addEventListener('error', onError);\n ws.addEventListener('message', onMessage);\n\n // Store references for later removal\n this._listenerRefs.set(ws, { onOpen, onClose, onError, onMessage });\n }\n\n private _detachSocketListeners(ws: WebSocket): void {\n const listeners = this._listenerRefs.get(ws);\n if (!listeners) return;\n ws.removeEventListener('open', listeners.onOpen);\n ws.removeEventListener('close', listeners.onClose);\n ws.removeEventListener('error', listeners.onError);\n ws.removeEventListener('message', listeners.onMessage);\n this._listenerRefs.delete(ws);\n }\n\n // ── Private: Reconnection ───────────────────────────────────────────\n\n private _handleConnectionFailure(): void {\n if (this._destroyed || this._state === 'suspended') return;\n\n this._reconnectAttempts++;\n\n if (this._reconnectAttempts > this._maxReconnectAttempts) {\n this._log(\n `Max reconnect attempts (${this._maxReconnectAttempts}) reached — entering FAILED state`,\n );\n this._setState('failed');\n return;\n }\n\n this._setState('reconnecting');\n this._scheduleReconnect();\n }\n\n private _scheduleReconnect(): void {\n if (this._destroyed) return;\n\n const delay = this._calculateBackoff(this._reconnectAttempts - 1);\n this._log(`Reconnecting in ${delay}ms (attempt ${this._reconnectAttempts}/${this._maxReconnectAttempts})`);\n\n this._reconnectTimer = setTimeout(async () => {\n this._reconnectTimer = null;\n if (this._destroyed || this._state === 'suspended' || this._state === 'failed') return;\n\n this._setState('connecting');\n await this._attemptConnection();\n }, delay);\n }\n\n /**\n * Exponential backoff with jitter.\n * delay = initialDelay * 2^attempt, capped at maxDelay, with +/-25% jitter.\n */\n private _calculateBackoff(attempt: number): number {\n const exponential = this._initialDelay * Math.pow(2, attempt);\n const capped = Math.min(exponential, this._maxDelay);\n // Jitter: random value between 0.75 and 1.25 of the capped delay\n const jitter = 0.75 + Math.random() * 0.5;\n return Math.round(capped * jitter);\n }\n\n // ── Private: Send queue ─────────────────────────────────────────────\n\n private _enqueue(data: MessagePayload): void {\n if (this._queue.length >= MAX_QUEUE_SIZE) {\n this._log('Send queue full — dropping oldest message');\n this._queue.shift();\n }\n this._queue.push(data);\n }\n\n private _flushQueue(): void {\n if (\n this._queue.length === 0 ||\n !this._socket ||\n this._socket.readyState !== WebSocket.OPEN\n ) {\n return;\n }\n\n this._log(`Flushing ${this._queue.length} queued message(s)`);\n const pending = this._queue.slice();\n this._queue = [];\n\n for (const msg of pending) {\n try {\n this._socket.send(msg);\n } catch (err) {\n this._log(`Failed to send queued message: ${err}`);\n // Re-queue remaining messages on failure\n // The current message is lost but remaining ones are preserved.\n break;\n }\n }\n }\n\n // ── Private: State management ───────────────────────────────────────\n\n private _setState(next: WSState): void {\n const prev = this._state;\n if (prev === next) return;\n\n this._state = next;\n this._log(`State: ${prev} -> ${next}`);\n\n for (const cb of this._onStateChangeCallbacks) {\n try {\n cb(next, prev);\n } catch {\n // Swallow listener errors\n }\n }\n }\n\n // ── Private: Timer management ───────────────────────────────────────\n\n private _clearTimers(): void {\n this._clearConnectTimer();\n this._clearReconnectTimer();\n }\n\n private _clearConnectTimer(): void {\n if (this._connectTimer !== null) {\n clearTimeout(this._connectTimer);\n this._connectTimer = null;\n }\n }\n\n private _clearReconnectTimer(): void {\n if (this._reconnectTimer !== null) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n }\n\n // ── Private: Logging ────────────────────────────────────────────────\n\n private _log(message: string): void {\n if (this._debug) {\n console.log(`[GuideKit:WS:${this._label}] ${message}`);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Deepgram Nova Real-Time Speech-to-Text Adapter\n// ---------------------------------------------------------------------------\n//\n// Streams microphone audio to Deepgram over a WebSocket and emits interim /\n// final transcript events. Designed for browser use; all browser-only APIs are\n// guarded behind `typeof window` checks so the module is safe to import at\n// build time in SSR environments.\n// ---------------------------------------------------------------------------\n\nimport { WebSocketManager } from './websocket-manager.js';\nimport type { STTTranscriptEvent } from '../types/index.js';\n\n// Re-export the shared type for consumers that only import from this module\nexport type { STTTranscriptEvent };\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:STT]';\n\n/** Interval (ms) between KeepAlive messages sent to Deepgram. */\nconst KEEPALIVE_INTERVAL_MS = 10_000;\n\n/** Default Deepgram model. */\nconst DEFAULT_MODEL = 'nova-3';\n\n/** Default language. */\nconst DEFAULT_LANGUAGE = 'en';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface DeepgramSTTOptions {\n apiKey: string;\n model?: 'nova-2' | 'nova-3';\n language?: string;\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert Float32Array PCM samples (range -1..1) to Int16Array (linear16).\n * Deepgram expects linear16 encoded audio frames.\n */\nfunction float32ToInt16(float32: Float32Array): Int16Array {\n const int16 = new Int16Array(float32.length);\n for (let i = 0; i < float32.length; i++) {\n // Clamp to [-1, 1] then scale to Int16 range.\n const s = Math.max(-1, Math.min(1, float32[i]!));\n int16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n return int16;\n}\n\n// ---------------------------------------------------------------------------\n// DeepgramSTT\n// ---------------------------------------------------------------------------\n\nexport class DeepgramSTT {\n // ---- Configuration ------------------------------------------------------\n\n private readonly apiKey: string;\n private readonly model: 'nova-2' | 'nova-3';\n private readonly language: string;\n private readonly debugEnabled: boolean;\n\n // ---- Internal state -----------------------------------------------------\n\n private wsManager: WebSocketManager | null = null;\n private keepAliveTimer: ReturnType<typeof setInterval> | null = null;\n private _connected = false;\n private _suspended = false;\n\n /** Registered transcript callbacks. */\n private readonly transcriptCallbacks: Set<(event: STTTranscriptEvent) => void> =\n new Set();\n\n // -----------------------------------------------------------------------\n // Constructor\n // -----------------------------------------------------------------------\n\n constructor(options: DeepgramSTTOptions) {\n this.apiKey = options.apiKey;\n this.model = options.model ?? DEFAULT_MODEL;\n this.language = options.language ?? DEFAULT_LANGUAGE;\n this.debugEnabled = options.debug ?? false;\n\n this.log('DeepgramSTT created', {\n model: this.model,\n language: this.language,\n });\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /** Whether the WebSocket is currently connected and ready. */\n get isConnected(): boolean {\n return this._connected;\n }\n\n /**\n * Open a WebSocket connection to Deepgram's real-time STT endpoint.\n *\n * Resolves once the connection is established and the socket is ready to\n * receive audio frames. Rejects if the connection cannot be established.\n */\n async connect(): Promise<void> {\n if (this._connected) {\n this.log('Already connected — skipping');\n return;\n }\n\n // SSR guard\n if (typeof WebSocket === 'undefined') {\n this.log('WebSocket API not available (SSR?) — cannot connect');\n return;\n }\n\n const url = this.buildUrl();\n this.log('Connecting to', url.replace(this.apiKey, '***'));\n\n this.wsManager = new WebSocketManager({\n url,\n protocols: [],\n debug: this.debugEnabled,\n label: 'Deepgram-STT',\n });\n\n this.wsManager.onOpen(() => {\n this._connected = true;\n this.startKeepAlive();\n this.log('Connected');\n });\n this.wsManager.onMessage((event: MessageEvent) => {\n this.handleMessage(event);\n });\n this.wsManager.onClose((code: number, reason: string) => {\n this.log('Connection closed', { code, reason });\n this.cleanup();\n });\n this.wsManager.onError((event: Event) => {\n this.log('WebSocket error', event);\n });\n\n return this.wsManager.connect();\n }\n\n /**\n * Send audio data to Deepgram for transcription.\n *\n * Accepts either `Float32Array` (Web Audio API output) or `Int16Array`\n * (already encoded as linear16). Float32 data is automatically converted\n * to Int16 before sending.\n */\n sendAudio(audioData: Float32Array | Int16Array): void {\n if (!this._connected || !this.wsManager || this._suspended) {\n return;\n }\n\n let buffer: ArrayBuffer;\n if (audioData instanceof Float32Array) {\n buffer = float32ToInt16(audioData).buffer as ArrayBuffer;\n } else {\n buffer = audioData.buffer as ArrayBuffer;\n }\n\n this.wsManager.send(buffer);\n }\n\n /**\n * Register a callback to receive transcript events.\n *\n * @returns An unsubscribe function. Calling it more than once is safe.\n */\n onTranscript(callback: (event: STTTranscriptEvent) => void): () => void {\n this.transcriptCallbacks.add(callback);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this.transcriptCallbacks.delete(callback);\n };\n }\n\n /**\n * Gracefully close the connection.\n *\n * Sends a `CloseStream` message to Deepgram so the server can finalise\n * any pending transcription before the socket is torn down.\n */\n close(): void {\n if (!this._connected || !this.wsManager) {\n this.log('Not connected — nothing to close');\n return;\n }\n\n this.log('Sending CloseStream and closing');\n this.stopKeepAlive();\n\n try {\n this.wsManager.send(JSON.stringify({ type: 'CloseStream' }));\n } catch {\n // Socket may already be closing — ignore.\n }\n\n this.wsManager.close();\n this.cleanup();\n }\n\n /** Force-destroy the connection without a graceful handshake. */\n destroy(): void {\n this.log('Destroying');\n this.stopKeepAlive();\n\n if (this.wsManager) {\n this.wsManager.destroy();\n this.wsManager = null;\n }\n\n this.cleanup();\n this.transcriptCallbacks.clear();\n }\n\n /**\n * Suspend the adapter (e.g. when the device goes offline).\n *\n * Stops the keepalive timer and marks the adapter as suspended so that\n * incoming `sendAudio` calls are silently dropped. The WebSocket itself\n * is left open; Deepgram will close it after an inactivity timeout if\n * the network truly went away.\n */\n suspend(): void {\n if (this._suspended) return;\n\n this._suspended = true;\n this.stopKeepAlive();\n this.log('Suspended');\n }\n\n /**\n * Resume after a prior `suspend()`. If the underlying connection is\n * still alive, the keepalive timer is restarted. If the connection was\n * lost while suspended, callers should `close()` / `destroy()` and\n * create a new instance.\n */\n resume(): void {\n if (!this._suspended) return;\n\n this._suspended = false;\n this.log('Resumed');\n\n if (this._connected && this.wsManager) {\n this.startKeepAlive();\n }\n }\n\n // -----------------------------------------------------------------------\n // Message handling\n // -----------------------------------------------------------------------\n\n /**\n * Parse incoming Deepgram JSON messages and emit transcript events.\n *\n * Deepgram sends `Results` messages with the following shape:\n * ```json\n * {\n * \"type\": \"Results\",\n * \"channel\": {\n * \"alternatives\": [{ \"transcript\": \"...\", \"confidence\": 0.97 }]\n * },\n * \"is_final\": true,\n * \"speech_final\": true\n * }\n * ```\n */\n private handleMessage(event: MessageEvent): void {\n // Binary messages are not expected — ignore.\n if (typeof event.data !== 'string') {\n return;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(event.data) as Record<string, unknown>;\n } catch {\n this.log('Failed to parse message', event.data);\n return;\n }\n\n const type = parsed['type'] as string | undefined;\n\n if (type === 'Results') {\n this.handleResultsMessage(parsed);\n } else if (type === 'Metadata') {\n this.log('Received metadata', parsed);\n } else if (type === 'Error') {\n this.log('Deepgram error', parsed);\n } else {\n this.log('Unknown message type', type, parsed);\n }\n }\n\n /**\n * Extract transcript data from a `Results` message and notify subscribers.\n */\n private handleResultsMessage(parsed: Record<string, unknown>): void {\n const channel = parsed['channel'] as\n | { alternatives?: { transcript?: string; confidence?: number }[] }\n | undefined;\n\n const alternatives = channel?.alternatives;\n if (!alternatives || alternatives.length === 0) {\n return;\n }\n\n const best = alternatives[0];\n if (!best) return;\n const transcript = best.transcript ?? '';\n const confidence = best.confidence ?? 0;\n\n // Deepgram sends empty transcripts for silence — skip those.\n if (transcript.trim() === '') {\n return;\n }\n\n const isFinal =\n (parsed['is_final'] === true) && (parsed['speech_final'] === true);\n\n const transcriptEvent: STTTranscriptEvent = {\n text: transcript,\n isFinal,\n confidence,\n timestamp: Date.now(),\n };\n\n this.log(\n isFinal ? 'Final transcript:' : 'Interim transcript:',\n transcript,\n `(${(confidence * 100).toFixed(1)}%)`,\n );\n\n this.emitTranscript(transcriptEvent);\n }\n\n // -----------------------------------------------------------------------\n // Keepalive\n // -----------------------------------------------------------------------\n\n /** Start the periodic KeepAlive heartbeat. */\n private startKeepAlive(): void {\n this.stopKeepAlive();\n\n this.keepAliveTimer = setInterval(() => {\n if (this._connected && this.wsManager && !this._suspended) {\n try {\n this.wsManager.send(JSON.stringify({ type: 'KeepAlive' }));\n this.log('Sent KeepAlive');\n } catch {\n this.log('Failed to send KeepAlive');\n }\n }\n }, KEEPALIVE_INTERVAL_MS);\n }\n\n /** Stop the KeepAlive heartbeat. */\n private stopKeepAlive(): void {\n if (this.keepAliveTimer !== null) {\n clearInterval(this.keepAliveTimer);\n this.keepAliveTimer = null;\n }\n }\n\n // -----------------------------------------------------------------------\n // Subscriber notification\n // -----------------------------------------------------------------------\n\n /**\n * Emit a transcript event to all registered callbacks.\n *\n * Errors thrown by individual callbacks are caught and logged so one\n * misbehaving subscriber does not prevent others from receiving the event.\n */\n private emitTranscript(event: STTTranscriptEvent): void {\n for (const cb of this.transcriptCallbacks) {\n try {\n cb(event);\n } catch (err) {\n console.error(LOG_PREFIX, 'Transcript callback threw:', err);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // URL building\n // -----------------------------------------------------------------------\n\n /** Build the Deepgram streaming endpoint URL with query parameters. */\n private buildUrl(): string {\n // NOTE: API key in WebSocket URL is inherent to Deepgram's WS protocol.\n // This is a known limitation — keys should only be session-scoped tokens.\n const params = new URLSearchParams({\n model: this.model,\n language: this.language,\n punctuate: 'true',\n interim_results: 'true',\n endpointing: '300',\n token: this.apiKey,\n });\n\n return `wss://api.deepgram.com/v1/listen?${params.toString()}`;\n }\n\n // -----------------------------------------------------------------------\n // Cleanup\n // -----------------------------------------------------------------------\n\n /** Reset internal state after disconnection. */\n private cleanup(): void {\n this._connected = false;\n this.stopKeepAlive();\n }\n\n // -----------------------------------------------------------------------\n // Logging\n // -----------------------------------------------------------------------\n\n /** Conditional debug logging. */\n private log(...args: unknown[]): void {\n if (this.debugEnabled) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – ElevenLabs Real-Time Speech-to-Text Adapter\n// ---------------------------------------------------------------------------\n//\n// Streams microphone audio to ElevenLabs over a WebSocket using JSON messages\n// with base64-encoded PCM audio. Emits interim / final transcript events.\n//\n// Protocol:\n// - Send: { type: 'input_audio_chunk', audio: <base64>, sample_rate: 16000 }\n// - Receive: { type: 'partial_transcript', result: { text, confidence } }\n// { type: 'committed_transcript', result: { text, confidence } }\n// - Close: send { type: 'commit_audio' } before closing socket\n// ---------------------------------------------------------------------------\n\nimport { WebSocketManager } from './websocket-manager.js';\nimport type { STTTranscriptEvent } from '../types/index.js';\n\n// Re-export the shared type for consumers that only import from this module\nexport type { STTTranscriptEvent };\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:ElevenLabs-STT]';\n\nconst ELEVENLABS_STT_ENDPOINT =\n 'wss://api.elevenlabs.io/v1/speech-to-text/realtime';\n\nconst DEFAULT_LANGUAGE = 'en';\nconst INACTIVITY_TIMEOUT_S = 30;\nconst SAMPLE_RATE = 16_000;\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface ElevenLabsSTTOptions {\n apiKey: string;\n language?: string;\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert Float32Array PCM samples (range -1..1) to Int16Array (linear16).\n */\nfunction float32ToInt16(float32: Float32Array): Int16Array {\n const int16 = new Int16Array(float32.length);\n for (let i = 0; i < float32.length; i++) {\n const s = Math.max(-1, Math.min(1, float32[i]!));\n int16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n return int16;\n}\n\n/**\n * Encode an Int16Array as a base64 string.\n * Uses chunked encoding to avoid stack overflow on large buffers.\n */\nfunction int16ToBase64(int16: Int16Array): string {\n const bytes = new Uint8Array(int16.buffer);\n // Replace character-by-character loop with chunked encoding\n const CHUNK_SIZE = 8192;\n let binary = '';\n for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {\n const chunk = bytes.subarray(i, i + CHUNK_SIZE);\n binary += String.fromCharCode(...chunk);\n }\n return btoa(binary);\n}\n\n// ---------------------------------------------------------------------------\n// ElevenLabsSTT\n// ---------------------------------------------------------------------------\n\nexport class ElevenLabsSTT {\n // ---- Configuration -------------------------------------------------------\n\n private readonly apiKey: string;\n private readonly language: string;\n private readonly debugEnabled: boolean;\n\n // ---- Internal state ------------------------------------------------------\n\n private wsManager: WebSocketManager | null = null;\n private _connected = false;\n private _suspended = false;\n\n /** Registered transcript callbacks. */\n private readonly transcriptCallbacks: Set<(event: STTTranscriptEvent) => void> =\n new Set();\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(options: ElevenLabsSTTOptions) {\n this.apiKey = options.apiKey;\n this.language = options.language ?? DEFAULT_LANGUAGE;\n this.debugEnabled = options.debug ?? false;\n\n this.log('ElevenLabsSTT created', { language: this.language });\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /** Whether the WebSocket is currently connected and ready. */\n get isConnected(): boolean {\n return this._connected;\n }\n\n /**\n * Open a WebSocket connection to ElevenLabs' real-time STT endpoint.\n *\n * Resolves once the connection is established and the socket is ready to\n * receive audio frames. Rejects if the connection cannot be established.\n */\n async connect(): Promise<void> {\n if (this._connected) {\n this.log('Already connected — skipping');\n return;\n }\n\n if (typeof WebSocket === 'undefined') {\n this.log('WebSocket API not available (SSR?) — cannot connect');\n return;\n }\n\n const url = this.buildUrl();\n this.log('Connecting to', url.replace(this.apiKey, '***'));\n\n this.wsManager = new WebSocketManager({\n url,\n protocols: [],\n debug: this.debugEnabled,\n label: 'ElevenLabs-STT',\n });\n\n this.wsManager.onOpen(() => {\n this._connected = true;\n this.log('Connected');\n });\n this.wsManager.onMessage((event: MessageEvent) => {\n this.handleMessage(event);\n });\n this.wsManager.onClose((code: number, reason: string) => {\n this.log('Connection closed', { code, reason });\n this.cleanup();\n });\n this.wsManager.onError((event: Event) => {\n this.log('WebSocket error', event);\n });\n\n return this.wsManager.connect();\n }\n\n /**\n * Send audio data to ElevenLabs for transcription.\n *\n * Accepts either `Float32Array` (Web Audio API output) or `Int16Array`\n * (already encoded as linear16). Float32 data is automatically converted\n * to Int16 before encoding. Audio is sent as a base64-encoded JSON message.\n */\n sendAudio(audioData: Float32Array | Int16Array): void {\n if (!this._connected || !this.wsManager || this._suspended) {\n return;\n }\n\n const int16 =\n audioData instanceof Float32Array ? float32ToInt16(audioData) : audioData;\n\n const base64 = int16ToBase64(int16);\n\n this.wsManager.send(\n JSON.stringify({\n type: 'input_audio_chunk',\n audio: base64,\n sample_rate: SAMPLE_RATE,\n }),\n );\n }\n\n /**\n * Register a callback to receive transcript events.\n *\n * @returns An unsubscribe function. Calling it more than once is safe.\n */\n onTranscript(callback: (event: STTTranscriptEvent) => void): () => void {\n this.transcriptCallbacks.add(callback);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this.transcriptCallbacks.delete(callback);\n };\n }\n\n /**\n * Gracefully close the connection.\n *\n * Sends a `commit_audio` message so ElevenLabs can finalise any pending\n * transcription before the socket is torn down.\n */\n close(): void {\n if (!this._connected || !this.wsManager) {\n this.log('Not connected — nothing to close');\n return;\n }\n\n this.log('Sending commit_audio and closing');\n\n try {\n this.wsManager.send(JSON.stringify({ type: 'commit_audio' }));\n } catch {\n // Socket may already be closing — ignore.\n }\n\n this.wsManager.close();\n this.cleanup();\n }\n\n /** Force-destroy the connection without a graceful handshake. */\n destroy(): void {\n this.log('Destroying');\n\n if (this.wsManager) {\n this.wsManager.destroy();\n this.wsManager = null;\n }\n\n this.cleanup();\n this.transcriptCallbacks.clear();\n }\n\n /**\n * Suspend the adapter (e.g. when the device goes offline).\n *\n * Marks the adapter as suspended so that incoming `sendAudio` calls are\n * silently dropped. The WebSocket itself is left open.\n */\n suspend(): void {\n if (this._suspended) return;\n\n this._suspended = true;\n this.log('Suspended');\n }\n\n /**\n * Resume after a prior `suspend()`.\n */\n resume(): void {\n if (!this._suspended) return;\n\n this._suspended = false;\n this.log('Resumed');\n }\n\n // -------------------------------------------------------------------------\n // Message handling\n // -------------------------------------------------------------------------\n\n /**\n * Parse incoming ElevenLabs JSON messages and emit transcript events.\n *\n * ElevenLabs sends two transcript message types:\n * - `partial_transcript`: interim result, `isFinal = false`\n * - `committed_transcript`: final result, `isFinal = true`\n */\n private handleMessage(event: MessageEvent): void {\n if (typeof event.data !== 'string') {\n return;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(event.data) as Record<string, unknown>;\n } catch {\n this.log('Failed to parse message', event.data);\n return;\n }\n\n const type = parsed['type'] as string | undefined;\n\n if (type === 'committed_transcript' || type === 'partial_transcript') {\n this.handleTranscriptMessage(parsed, type === 'committed_transcript');\n } else {\n this.log('Received message', type, parsed);\n }\n }\n\n /**\n * Extract transcript data from a transcript message and notify subscribers.\n */\n private handleTranscriptMessage(\n parsed: Record<string, unknown>,\n isFinal: boolean,\n ): void {\n const result = parsed['result'] as\n | { text?: string; confidence?: number }\n | undefined;\n\n const text = result?.text ?? '';\n const confidence = result?.confidence ?? 0;\n\n if (text.trim() === '') {\n return;\n }\n\n const transcriptEvent: STTTranscriptEvent = {\n text,\n isFinal,\n confidence,\n timestamp: Date.now(),\n };\n\n this.log(\n isFinal ? 'Final transcript:' : 'Interim transcript:',\n text,\n `(${(confidence * 100).toFixed(1)}%)`,\n );\n\n this.emitTranscript(transcriptEvent);\n }\n\n // -------------------------------------------------------------------------\n // Subscriber notification\n // -------------------------------------------------------------------------\n\n /**\n * Emit a transcript event to all registered callbacks.\n *\n * Errors thrown by individual callbacks are caught and logged so one\n * misbehaving subscriber does not prevent others from receiving the event.\n */\n private emitTranscript(event: STTTranscriptEvent): void {\n for (const cb of this.transcriptCallbacks) {\n try {\n cb(event);\n } catch (err) {\n console.error(LOG_PREFIX, 'Transcript callback threw:', err);\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // URL building\n // -------------------------------------------------------------------------\n\n /** Build the ElevenLabs streaming STT endpoint URL with auth query params. */\n private buildUrl(): string {\n const params = new URLSearchParams({\n xi_api_key: this.apiKey,\n language: this.language,\n inactivity_timeout: String(INACTIVITY_TIMEOUT_S),\n });\n\n return `${ELEVENLABS_STT_ENDPOINT}?${params.toString()}`;\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n /** Reset internal state after disconnection. */\n private cleanup(): void {\n this._connected = false;\n }\n\n // -------------------------------------------------------------------------\n // Logging\n // -------------------------------------------------------------------------\n\n /** Conditional debug logging. */\n private log(...args: unknown[]): void {\n if (this.debugEnabled) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – ElevenLabs Real-Time Text-to-Speech Adapter\n// ---------------------------------------------------------------------------\n//\n// Streams text to ElevenLabs over a WebSocket and receives audio chunks in\n// real time. Designed for browser use; all browser-only APIs are guarded\n// behind `typeof window` checks so the module is safe to import at build\n// time in SSR environments.\n// ---------------------------------------------------------------------------\n\nimport { WebSocketManager } from './websocket-manager.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:TTS]';\n\n/** Default ElevenLabs voice ID (Rachel). */\nconst DEFAULT_VOICE_ID = '21m00Tcm4TlvDq8ikWAM';\n\n/** Default model — ElevenLabs Flash v2.5 for lowest latency. */\nconst DEFAULT_MODEL_ID = 'eleven_flash_v2_5';\n\n/** Default voice stability setting (0–1). */\nconst DEFAULT_STABILITY = 0.5;\n\n/** Default similarity boost setting (0–1). */\nconst DEFAULT_SIMILARITY_BOOST = 0.75;\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface ElevenLabsTTSOptions {\n apiKey: string;\n voiceId?: string;\n modelId?: string;\n debug?: boolean;\n}\n\nexport interface TTSAudioEvent {\n audio: ArrayBuffer;\n /** Whether this is the final chunk for the current utterance. */\n isFinal: boolean;\n timestamp: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Decode a base64-encoded string into an `ArrayBuffer`.\n *\n * Uses the native `atob` function available in browsers. In SSR contexts\n * the adapter will never reach this code path because `connect()` is\n * guarded by a WebSocket availability check.\n */\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const length = binaryString.length;\n const bytes = new Uint8Array(length);\n for (let i = 0; i < length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n// ---------------------------------------------------------------------------\n// ElevenLabsTTS\n// ---------------------------------------------------------------------------\n\nexport class ElevenLabsTTS {\n // ---- Configuration ------------------------------------------------------\n\n private readonly apiKey: string;\n private readonly voiceId: string;\n private readonly modelId: string;\n private readonly debugEnabled: boolean;\n\n // ---- Internal state -----------------------------------------------------\n\n private wsManager: WebSocketManager | null = null;\n private _connected = false;\n private _suspended = false;\n\n /**\n * Whether the BOS (beginning-of-stream) handshake has been sent for the\n * current WebSocket session. ElevenLabs requires the first message to\n * contain voice settings and the API key before any text chunks.\n */\n private bosSent = false;\n\n /** Registered audio-event callbacks. */\n private readonly audioCallbacks: Set<(event: TTSAudioEvent) => void> =\n new Set();\n\n // -----------------------------------------------------------------------\n // Constructor\n // -----------------------------------------------------------------------\n\n constructor(options: ElevenLabsTTSOptions) {\n this.apiKey = options.apiKey;\n this.voiceId = options.voiceId ?? DEFAULT_VOICE_ID;\n this.modelId = options.modelId ?? DEFAULT_MODEL_ID;\n this.debugEnabled = options.debug ?? false;\n\n this.log('ElevenLabsTTS created', {\n voiceId: this.voiceId,\n modelId: this.modelId,\n });\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /** Whether the WebSocket is currently connected and ready. */\n get isConnected(): boolean {\n return this._connected;\n }\n\n /**\n * Open a WebSocket connection to the ElevenLabs streaming TTS endpoint.\n *\n * Resolves once the connection is established and the BOS handshake has\n * been sent. Rejects if the connection cannot be established.\n */\n async connect(): Promise<void> {\n if (this._connected) {\n this.log('Already connected — skipping');\n return;\n }\n\n // SSR guard\n if (typeof WebSocket === 'undefined') {\n this.log('WebSocket API not available (SSR?) — cannot connect');\n return;\n }\n\n const url = this.buildUrl();\n this.log('Connecting to', url);\n\n this.wsManager = new WebSocketManager({\n url,\n protocols: [],\n debug: this.debugEnabled,\n label: 'ElevenLabs-TTS',\n });\n\n this.wsManager.onOpen(() => {\n this._connected = true;\n this.sendBOS();\n this.log('Connected and BOS sent');\n });\n this.wsManager.onMessage((event: MessageEvent) => {\n this.handleMessage(event);\n });\n this.wsManager.onClose((code: number, reason: string) => {\n this.log('Connection closed', { code, reason });\n this.cleanup();\n });\n this.wsManager.onError((event: Event) => {\n this.log('WebSocket error', event);\n });\n\n return this.wsManager.connect();\n }\n\n /**\n * Send text to be synthesised into speech.\n *\n * May be called multiple times to stream text incrementally. Each call\n * sends a text chunk with `try_trigger_generation: true` so ElevenLabs\n * can begin synthesising as soon as it has enough context.\n *\n * Call {@link flush} when the complete utterance has been sent.\n */\n speak(text: string): void {\n if (!this._connected || !this.wsManager || this._suspended) {\n this.log('Cannot speak — not connected or suspended');\n return;\n }\n\n if (!text) {\n return;\n }\n\n const message = JSON.stringify({\n text,\n try_trigger_generation: true,\n });\n\n this.log('Sending text chunk:', text.slice(0, 80) + (text.length > 80 ? '...' : ''));\n this.wsManager.send(message);\n }\n\n /**\n * Signal the end of text input for the current utterance.\n *\n * Sends the EOS (end-of-stream) marker to ElevenLabs. The server will\n * flush any remaining audio and send a final chunk with `isFinal: true`.\n */\n flush(): void {\n if (!this._connected || !this.wsManager || this._suspended) {\n this.log('Cannot flush — not connected or suspended');\n return;\n }\n\n const message = JSON.stringify({ text: '' });\n this.log('Sending EOS (flush)');\n this.wsManager.send(message);\n }\n\n /**\n * Register a callback to receive audio output events.\n *\n * @returns An unsubscribe function. Calling it more than once is safe.\n */\n onAudio(callback: (event: TTSAudioEvent) => void): () => void {\n this.audioCallbacks.add(callback);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this.audioCallbacks.delete(callback);\n };\n }\n\n /** Gracefully close the connection by sending EOS then closing. */\n close(): void {\n if (!this._connected || !this.wsManager) {\n this.log('Not connected — nothing to close');\n return;\n }\n\n this.log('Closing connection');\n\n // Send EOS to let the server finalise any pending audio.\n try {\n this.wsManager.send(JSON.stringify({ text: '' }));\n } catch {\n // Socket may already be closing — ignore.\n }\n\n this.wsManager.close();\n this.cleanup();\n }\n\n /** Force-destroy the connection without a graceful handshake. */\n destroy(): void {\n this.log('Destroying');\n\n if (this.wsManager) {\n this.wsManager.destroy();\n this.wsManager = null;\n }\n\n this.cleanup();\n this.audioCallbacks.clear();\n }\n\n /**\n * Suspend the adapter (e.g. when the device goes offline).\n *\n * Marks the adapter as suspended so that calls to `speak()` and `flush()`\n * are silently dropped. The WebSocket itself is left open; ElevenLabs\n * will close it after an inactivity timeout if the network went away.\n */\n suspend(): void {\n if (this._suspended) return;\n\n this._suspended = true;\n this.log('Suspended');\n }\n\n /**\n * Resume after a prior `suspend()`. If the underlying connection is\n * still alive, the adapter returns to normal operation. If the connection\n * was lost while suspended, callers should `close()` / `destroy()` and\n * create a new instance.\n */\n resume(): void {\n if (!this._suspended) return;\n\n this._suspended = false;\n this.log('Resumed');\n }\n\n // -----------------------------------------------------------------------\n // BOS handshake\n // -----------------------------------------------------------------------\n\n /**\n * Send the BOS (beginning-of-stream) message.\n *\n * This must be the very first message on a new WebSocket session. It\n * carries the API key and voice settings.\n */\n private sendBOS(): void {\n if (!this.wsManager || this.bosSent) {\n return;\n }\n\n const bos = JSON.stringify({\n text: ' ',\n voice_settings: {\n stability: DEFAULT_STABILITY,\n similarity_boost: DEFAULT_SIMILARITY_BOOST,\n },\n xi_api_key: this.apiKey,\n });\n\n this.wsManager.send(bos);\n this.bosSent = true;\n this.log('BOS handshake sent');\n }\n\n // -----------------------------------------------------------------------\n // Message handling\n // -----------------------------------------------------------------------\n\n /**\n * Parse incoming ElevenLabs JSON messages and emit audio events.\n *\n * ElevenLabs sends messages with the following shape:\n * ```json\n * { \"audio\": \"base64encoded...\", \"isFinal\": false }\n * ```\n *\n * When `isFinal` is `true`, the server has finished synthesising the\n * current utterance (i.e. after EOS was sent).\n */\n private handleMessage(event: MessageEvent): void {\n // Binary messages are not expected from ElevenLabs — ignore.\n if (typeof event.data !== 'string') {\n return;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(event.data) as Record<string, unknown>;\n } catch {\n this.log('Failed to parse message', event.data);\n return;\n }\n\n // Handle error responses from ElevenLabs.\n if (parsed['error'] !== undefined) {\n this.log('ElevenLabs error:', parsed['error']);\n return;\n }\n\n // Handle alignment / metadata messages (no audio payload).\n if (parsed['audio'] === undefined || parsed['audio'] === null) {\n this.log('Non-audio message received', parsed);\n return;\n }\n\n const audioBase64 = parsed['audio'] as string;\n const isFinal = parsed['isFinal'] === true;\n\n // Skip empty audio chunks.\n if (!audioBase64 || audioBase64.length === 0) {\n if (isFinal) {\n // Emit a final event even without audio so consumers know the\n // utterance has ended.\n this.emitAudio({\n audio: new ArrayBuffer(0),\n isFinal: true,\n timestamp: Date.now(),\n });\n }\n return;\n }\n\n let audioBuffer: ArrayBuffer;\n try {\n audioBuffer = base64ToArrayBuffer(audioBase64);\n } catch (err) {\n this.log('Failed to decode base64 audio', err);\n return;\n }\n\n const audioEvent: TTSAudioEvent = {\n audio: audioBuffer,\n isFinal,\n timestamp: Date.now(),\n };\n\n this.log(\n isFinal ? 'Final audio chunk:' : 'Audio chunk:',\n `${audioBuffer.byteLength} bytes`,\n );\n\n this.emitAudio(audioEvent);\n }\n\n // -----------------------------------------------------------------------\n // Subscriber notification\n // -----------------------------------------------------------------------\n\n /**\n * Emit an audio event to all registered callbacks.\n *\n * Errors thrown by individual callbacks are caught and logged so one\n * misbehaving subscriber does not prevent others from receiving the event.\n */\n private emitAudio(event: TTSAudioEvent): void {\n for (const cb of this.audioCallbacks) {\n try {\n cb(event);\n } catch (err) {\n console.error(LOG_PREFIX, 'Audio callback threw:', err);\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // URL building\n // -----------------------------------------------------------------------\n\n /** Build the ElevenLabs streaming TTS endpoint URL. */\n private buildUrl(): string {\n const params = new URLSearchParams({\n model_id: this.modelId,\n });\n\n return `wss://api.elevenlabs.io/v1/text-to-speech/${encodeURIComponent(this.voiceId)}/stream-input?${params.toString()}`;\n }\n\n // -----------------------------------------------------------------------\n // Cleanup\n // -----------------------------------------------------------------------\n\n /** Reset internal state after disconnection. */\n private cleanup(): void {\n this._connected = false;\n this.bosSent = false;\n }\n\n // -----------------------------------------------------------------------\n // Logging\n // -----------------------------------------------------------------------\n\n /** Conditional debug logging. */\n private log(...args: unknown[]): void {\n if (this.debugEnabled) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Web Speech API Speech-to-Text Adapter\n// ---------------------------------------------------------------------------\n//\n// Browser-native SpeechRecognition adapter that requires no API keys or\n// external services. Uses the Web Speech API (SpeechRecognition) available\n// in most modern browsers. Designed as the zero-config default when no STT\n// provider is explicitly configured.\n//\n// SSR safe: all browser APIs are guarded behind `typeof window` checks so\n// the module is safe to import at build time in SSR environments.\n// ---------------------------------------------------------------------------\n\nimport type { STTTranscriptEvent } from '../types/index.js';\n\n// Re-export the shared type for consumers that only import from this module\nexport type { STTTranscriptEvent };\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:WebSpeech-STT]';\n\n/** Default language for speech recognition. */\nconst DEFAULT_LANGUAGE = 'en-US';\n\n// ---------------------------------------------------------------------------\n// Browser type declarations\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal type declarations for the Web Speech API SpeechRecognition\n * interface. These cover the subset used by this adapter. Full type\n * definitions are available in lib.dom.d.ts but may not be present in\n * all TS configurations.\n */\ninterface SpeechRecognitionEvent {\n readonly resultIndex: number;\n readonly results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionResultList {\n readonly length: number;\n item(index: number): SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n}\n\ninterface SpeechRecognitionResult {\n readonly length: number;\n readonly isFinal: boolean;\n item(index: number): SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n}\n\ninterface SpeechRecognitionAlternative {\n readonly transcript: string;\n readonly confidence: number;\n}\n\ninterface SpeechRecognitionErrorEvent {\n readonly error: string;\n readonly message: string;\n}\n\ninterface SpeechRecognitionInstance extends EventTarget {\n lang: string;\n continuous: boolean;\n interimResults: boolean;\n maxAlternatives: number;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onerror: ((event: SpeechRecognitionErrorEvent) => void) | null;\n onend: (() => void) | null;\n onstart: (() => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\ninterface SpeechRecognitionConstructor {\n new (): SpeechRecognitionInstance;\n}\n\n// Extend globalThis for webkit-prefixed SpeechRecognition\ndeclare global {\n // eslint-disable-next-line no-var\n var webkitSpeechRecognition: SpeechRecognitionConstructor | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface WebSpeechSTTOptions {\n language?: string;\n continuous?: boolean;\n interimResults?: boolean;\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// WebSpeechSTT\n// ---------------------------------------------------------------------------\n\nexport class WebSpeechSTT {\n // ---- Configuration -------------------------------------------------------\n\n private readonly language: string;\n private readonly continuous: boolean;\n private readonly interimResultsEnabled: boolean;\n private readonly debugEnabled: boolean;\n\n // ---- Internal state ------------------------------------------------------\n\n private recognition: SpeechRecognitionInstance | null = null;\n private _connected = false;\n private _suspended = false;\n\n /**\n * Whether we intentionally stopped recognition. Used to distinguish\n * between intentional stop and unexpected end (for auto-restart in\n * continuous mode).\n */\n private _intentionalStop = false;\n\n /** Registered transcript callbacks. */\n private readonly transcriptCallbacks: Set<(event: STTTranscriptEvent) => void> =\n new Set();\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(options: WebSpeechSTTOptions = {}) {\n this.language = options.language ?? DEFAULT_LANGUAGE;\n this.continuous = options.continuous ?? true;\n this.interimResultsEnabled = options.interimResults ?? true;\n this.debugEnabled = options.debug ?? false;\n\n this.log('WebSpeechSTT created', {\n language: this.language,\n continuous: this.continuous,\n interimResults: this.interimResultsEnabled,\n });\n }\n\n // -------------------------------------------------------------------------\n // Static methods\n // -------------------------------------------------------------------------\n\n /**\n * Check whether the Web Speech API SpeechRecognition is supported in the\n * current environment. Safe to call in SSR (returns false).\n */\n static isSupported(): boolean {\n if (typeof window === 'undefined') return false;\n return (\n typeof (window as unknown as Record<string, unknown>)['SpeechRecognition'] !== 'undefined' ||\n typeof globalThis.webkitSpeechRecognition !== 'undefined'\n );\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /** Whether recognition is currently active and connected. */\n get isConnected(): boolean {\n return this._connected;\n }\n\n /**\n * Start speech recognition.\n *\n * Creates the SpeechRecognition instance and begins listening. Resolves\n * once the recognition session has started. Rejects if the API is not\n * supported or the browser denies permission.\n */\n async connect(): Promise<void> {\n if (this._connected) {\n this.log('Already connected — skipping');\n return;\n }\n\n // SSR guard\n if (typeof window === 'undefined') {\n this.log('SSR environment detected — cannot connect');\n return;\n }\n\n const SpeechRecognitionClass = this.resolveSpeechRecognition();\n if (!SpeechRecognitionClass) {\n throw new Error(\n 'Web Speech API (SpeechRecognition) is not supported in this browser.',\n );\n }\n\n this.recognition = new SpeechRecognitionClass();\n this.recognition.lang = this.language;\n this.recognition.continuous = this.continuous;\n this.recognition.interimResults = this.interimResultsEnabled;\n this.recognition.maxAlternatives = 1;\n\n // Wire event handlers\n this.recognition.onstart = () => {\n this._connected = true;\n this._intentionalStop = false;\n this.log('Recognition started');\n };\n\n this.recognition.onresult = (event: SpeechRecognitionEvent) => {\n this.handleResult(event);\n };\n\n this.recognition.onerror = (event: SpeechRecognitionErrorEvent) => {\n this.handleError(event);\n };\n\n this.recognition.onend = () => {\n this.log('Recognition ended');\n const wasConnected = this._connected;\n this._connected = false;\n\n // In continuous mode, auto-restart if not intentionally stopped\n // and we were previously connected (not an error during startup).\n if (\n this.continuous &&\n !this._intentionalStop &&\n !this._suspended &&\n wasConnected\n ) {\n this.log('Auto-restarting continuous recognition');\n try {\n this.recognition?.start();\n } catch {\n this.log('Failed to auto-restart recognition');\n }\n }\n };\n\n // Start recognition\n return new Promise<void>((resolve, reject) => {\n const onStart = (): void => {\n cleanup();\n resolve();\n };\n\n const onError = (event: SpeechRecognitionErrorEvent): void => {\n cleanup();\n reject(new Error(`SpeechRecognition error: ${event.error} — ${event.message}`));\n };\n\n const cleanup = (): void => {\n if (this.recognition) {\n // Remove the one-shot listeners (keep the persistent ones)\n this.recognition.removeEventListener('start', onStart as unknown as EventListener);\n this.recognition.removeEventListener('error', onError as unknown as EventListener);\n }\n };\n\n this.recognition!.addEventListener('start', onStart as unknown as EventListener, { once: true });\n this.recognition!.addEventListener('error', onError as unknown as EventListener, { once: true });\n\n try {\n this.recognition!.start();\n } catch (err) {\n cleanup();\n reject(err);\n }\n });\n }\n\n /**\n * Send audio data. No-op for Web Speech API since it captures audio\n * directly from the microphone via the browser's internal pipeline.\n *\n * Provided for interface compatibility with WebSocket-based STT adapters\n * (DeepgramSTT, ElevenLabsSTT).\n */\n sendAudio(_audioData: Float32Array | Int16Array): void {\n // Web Speech API manages its own audio capture — nothing to do here.\n }\n\n /**\n * Register a callback to receive transcript events.\n *\n * @returns An unsubscribe function. Calling it more than once is safe.\n */\n onTranscript(callback: (event: STTTranscriptEvent) => void): () => void {\n this.transcriptCallbacks.add(callback);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this.transcriptCallbacks.delete(callback);\n };\n }\n\n /**\n * Gracefully stop recognition.\n *\n * Calls `stop()` on the SpeechRecognition instance which allows it to\n * deliver any pending final results before ending.\n */\n close(): void {\n if (!this.recognition) {\n this.log('Not connected — nothing to close');\n return;\n }\n\n this.log('Closing recognition');\n this._intentionalStop = true;\n\n try {\n this.recognition.stop();\n } catch {\n // Recognition may already be stopped\n }\n\n this.cleanup();\n }\n\n /** Force-destroy the recognition without waiting for pending results. */\n destroy(): void {\n this.log('Destroying');\n this._intentionalStop = true;\n\n if (this.recognition) {\n try {\n this.recognition.abort();\n } catch {\n // Recognition may already be stopped\n }\n this.recognition.onresult = null;\n this.recognition.onerror = null;\n this.recognition.onend = null;\n this.recognition.onstart = null;\n this.recognition = null;\n }\n\n this.cleanup();\n this.transcriptCallbacks.clear();\n }\n\n /**\n * Suspend the adapter (e.g. when the device goes offline).\n *\n * Stops recognition and marks the adapter as suspended so that auto-restart\n * does not trigger.\n */\n suspend(): void {\n if (this._suspended) return;\n\n this._suspended = true;\n this._intentionalStop = true;\n\n if (this.recognition && this._connected) {\n try {\n this.recognition.stop();\n } catch {\n // Ignore\n }\n }\n\n this.log('Suspended');\n }\n\n /**\n * Resume after a prior `suspend()`. Restarts recognition if it was\n * running before suspension.\n */\n resume(): void {\n if (!this._suspended) return;\n\n this._suspended = false;\n this._intentionalStop = false;\n this.log('Resumed');\n\n // Restart recognition if we have an instance\n if (this.recognition && !this._connected) {\n try {\n this.recognition.start();\n } catch {\n this.log('Failed to restart recognition after resume');\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Result handling\n // -------------------------------------------------------------------------\n\n /**\n * Handle SpeechRecognition result events.\n *\n * The `results` property is a SpeechRecognitionResultList containing all\n * results accumulated during this recognition session. We only process\n * results from `resultIndex` onward to avoid re-emitting old results.\n */\n private handleResult(event: SpeechRecognitionEvent): void {\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (!result) continue;\n\n const alternative = result[0];\n if (!alternative) continue;\n\n const transcript = alternative.transcript;\n if (!transcript || transcript.trim() === '') continue;\n\n const isFinal = result.isFinal;\n // Web Speech API confidence is 0 for interim results in some browsers\n const confidence = alternative.confidence > 0 ? alternative.confidence : 0.85;\n\n const transcriptEvent: STTTranscriptEvent = {\n text: transcript,\n isFinal,\n confidence,\n timestamp: Date.now(),\n };\n\n this.log(\n isFinal ? 'Final transcript:' : 'Interim transcript:',\n transcript,\n `(${(confidence * 100).toFixed(1)}%)`,\n );\n\n this.emitTranscript(transcriptEvent);\n }\n }\n\n // -------------------------------------------------------------------------\n // Error handling\n // -------------------------------------------------------------------------\n\n /**\n * Handle SpeechRecognition errors.\n *\n * Some errors are recoverable (e.g. `no-speech`) and some are fatal\n * (e.g. `not-allowed`). For recoverable errors in continuous mode,\n * recognition will auto-restart via the `onend` handler.\n */\n private handleError(event: SpeechRecognitionErrorEvent): void {\n const errorType = event.error;\n\n this.log('Recognition error:', errorType, event.message);\n\n // 'no-speech' and 'aborted' are common non-fatal errors\n // In continuous mode, the onend handler will auto-restart\n if (errorType === 'no-speech' || errorType === 'aborted') {\n this.log('Non-fatal error — will recover');\n return;\n }\n\n // 'network' errors may be transient\n if (errorType === 'network') {\n this.log('Network error — recognition may auto-restart');\n return;\n }\n\n // Fatal errors: 'not-allowed', 'service-not-allowed', 'language-not-supported'\n // For these, mark as intentionally stopped to prevent auto-restart\n if (\n errorType === 'not-allowed' ||\n errorType === 'service-not-allowed' ||\n errorType === 'language-not-supported'\n ) {\n this._intentionalStop = true;\n this.log('Fatal recognition error — stopping');\n }\n }\n\n // -------------------------------------------------------------------------\n // Subscriber notification\n // -------------------------------------------------------------------------\n\n /**\n * Emit a transcript event to all registered callbacks.\n *\n * Errors thrown by individual callbacks are caught and logged so one\n * misbehaving subscriber does not prevent others from receiving the event.\n */\n private emitTranscript(event: STTTranscriptEvent): void {\n for (const cb of this.transcriptCallbacks) {\n try {\n cb(event);\n } catch (err) {\n console.error(LOG_PREFIX, 'Transcript callback threw:', err);\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // SpeechRecognition resolution\n // -------------------------------------------------------------------------\n\n /**\n * Resolve the SpeechRecognition constructor, with the webkit-prefixed\n * fallback. Returns null if not available.\n */\n private resolveSpeechRecognition(): SpeechRecognitionConstructor | null {\n if (typeof window === 'undefined') return null;\n\n const win = window as unknown as Record<string, unknown>;\n if (typeof win['SpeechRecognition'] !== 'undefined') {\n return win['SpeechRecognition'] as SpeechRecognitionConstructor;\n }\n if (typeof globalThis.webkitSpeechRecognition !== 'undefined') {\n return globalThis.webkitSpeechRecognition;\n }\n return null;\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n /** Reset internal state after disconnection. */\n private cleanup(): void {\n this._connected = false;\n }\n\n // -------------------------------------------------------------------------\n // Logging\n // -------------------------------------------------------------------------\n\n /** Conditional debug logging. */\n private log(...args: unknown[]): void {\n if (this.debugEnabled) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Web Speech API Text-to-Speech Adapter\n// ---------------------------------------------------------------------------\n//\n// Browser-native SpeechSynthesis adapter that requires no API keys or\n// external services. Uses the Web Speech API (SpeechSynthesis) available\n// in all modern browsers. Designed as the zero-config default when no TTS\n// provider is explicitly configured.\n//\n// Unlike the WebSocket-based ElevenLabsTTS adapter, this adapter does not\n// stream audio chunks. Instead it uses the browser's built-in speech\n// synthesis engine and returns a Promise from speak() that resolves when\n// the utterance completes.\n//\n// SSR safe: all browser APIs are guarded behind `typeof window` checks so\n// the module is safe to import at build time in SSR environments.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:WebSpeech-TTS]';\n\n/** Default speech rate (1.0 is normal speed). */\nconst DEFAULT_RATE = 1.0;\n\n/** Default pitch (1.0 is normal pitch). */\nconst DEFAULT_PITCH = 1.0;\n\n/** Default language. */\nconst DEFAULT_LANGUAGE = 'en-US';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface WebSpeechTTSOptions {\n voice?: string;\n rate?: number;\n pitch?: number;\n language?: string;\n debug?: boolean;\n}\n\n/**\n * Audio event compatible with the TTSAudioEvent shape used by\n * VoicePipeline for ElevenLabs TTS. Web Speech API does not produce\n * raw audio buffers, so we emit events with empty buffers and use\n * isFinal to signal utterance completion.\n */\nexport interface WebSpeechTTSAudioEvent {\n audio: ArrayBuffer;\n isFinal: boolean;\n timestamp: number;\n}\n\n// ---------------------------------------------------------------------------\n// WebSpeechTTS\n// ---------------------------------------------------------------------------\n\nexport class WebSpeechTTS {\n // ---- Configuration -------------------------------------------------------\n\n private readonly voiceName: string | null;\n private readonly rate: number;\n private readonly pitch: number;\n private readonly language: string;\n private readonly debugEnabled: boolean;\n\n // ---- Internal state ------------------------------------------------------\n\n private _connected = false;\n private _suspended = false;\n\n /** Cached voice object resolved from voiceName. */\n private _resolvedVoice: SpeechSynthesisVoice | null = null;\n\n /** Whether voices have been loaded (they load async in some browsers). */\n private _voicesLoaded = false;\n\n /** Registered audio-event callbacks. */\n private readonly audioCallbacks: Set<(event: WebSpeechTTSAudioEvent) => void> =\n new Set();\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(options: WebSpeechTTSOptions = {}) {\n this.voiceName = options.voice ?? null;\n this.rate = options.rate ?? DEFAULT_RATE;\n this.pitch = options.pitch ?? DEFAULT_PITCH;\n this.language = options.language ?? DEFAULT_LANGUAGE;\n this.debugEnabled = options.debug ?? false;\n\n this.log('WebSpeechTTS created', {\n voice: this.voiceName,\n rate: this.rate,\n pitch: this.pitch,\n language: this.language,\n });\n }\n\n // -------------------------------------------------------------------------\n // Static methods\n // -------------------------------------------------------------------------\n\n /**\n * Check whether the Web Speech API SpeechSynthesis is supported in the\n * current environment. Safe to call in SSR (returns false).\n */\n static isSupported(): boolean {\n if (typeof window === 'undefined') return false;\n return typeof window.speechSynthesis !== 'undefined';\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /** Whether the adapter is connected (ready for speech). */\n get isConnected(): boolean {\n return this._connected;\n }\n\n /**\n * Initialize the adapter.\n *\n * Loads available voices and resolves the requested voice name. Voice\n * loading is async in some browsers (notably Chrome) so we wait for\n * the `voiceschanged` event if needed.\n */\n async connect(): Promise<void> {\n if (this._connected) {\n this.log('Already connected — skipping');\n return;\n }\n\n // SSR guard\n if (typeof window === 'undefined' || typeof window.speechSynthesis === 'undefined') {\n this.log('SpeechSynthesis not available — cannot connect');\n return;\n }\n\n // Load voices\n await this.loadVoices();\n\n // Resolve the requested voice\n if (this.voiceName) {\n this._resolvedVoice = this.findVoice(this.voiceName);\n if (this._resolvedVoice) {\n this.log('Resolved voice:', this._resolvedVoice.name);\n } else {\n this.log('Requested voice not found:', this.voiceName, '— using browser default');\n }\n }\n\n this._connected = true;\n this.log('Connected');\n }\n\n /**\n * Speak the given text using the browser's speech synthesis engine.\n *\n * Returns a Promise that resolves when the utterance completes or is\n * cancelled. Rejects if an error occurs during synthesis.\n *\n * Also emits audio events to registered callbacks for VoicePipeline\n * compatibility.\n */\n speak(text: string): void {\n if (!this._connected || this._suspended) {\n this.log('Cannot speak — not connected or suspended');\n return;\n }\n\n if (!text || !text.trim()) {\n return;\n }\n\n // SSR guard\n if (typeof window === 'undefined' || typeof window.speechSynthesis === 'undefined') {\n return;\n }\n\n const synth = window.speechSynthesis;\n const utterance = new SpeechSynthesisUtterance(text);\n\n // Apply settings\n utterance.lang = this.language;\n utterance.rate = this.rate;\n utterance.pitch = this.pitch;\n\n if (this._resolvedVoice) {\n utterance.voice = this._resolvedVoice;\n }\n\n\n\n utterance.onstart = () => {\n this.log('Utterance started:', text.slice(0, 80) + (text.length > 80 ? '...' : ''));\n // Emit a non-final event to signal playback has started\n this.emitAudio({\n audio: new ArrayBuffer(0),\n isFinal: false,\n timestamp: Date.now(),\n });\n };\n\n utterance.onend = () => {\n \n this.log('Utterance ended');\n // Emit final event to signal completion\n this.emitAudio({\n audio: new ArrayBuffer(0),\n isFinal: true,\n timestamp: Date.now(),\n });\n };\n\n utterance.onerror = (event: SpeechSynthesisErrorEvent) => {\n \n // 'canceled' is not a real error — it occurs when stop() is called\n if (event.error === 'canceled') {\n this.log('Utterance cancelled');\n this.emitAudio({\n audio: new ArrayBuffer(0),\n isFinal: true,\n timestamp: Date.now(),\n });\n return;\n }\n this.log('Utterance error:', event.error);\n // Still emit final to unblock the pipeline\n this.emitAudio({\n audio: new ArrayBuffer(0),\n isFinal: true,\n timestamp: Date.now(),\n });\n };\n\n this.log('Speaking:', text.slice(0, 80) + (text.length > 80 ? '...' : ''));\n synth.speak(utterance);\n }\n\n /**\n * Flush / finalize the current utterance.\n *\n * No-op for Web Speech API since each speak() call is a complete\n * utterance. Provided for interface compatibility with ElevenLabsTTS.\n */\n flush(): void {\n // Web Speech API utterances are self-contained — nothing to flush.\n }\n\n /**\n * Register a callback to receive audio output events.\n *\n * For Web Speech API, these events have empty audio buffers and are\n * used to signal utterance start/end for VoicePipeline state management.\n *\n * @returns An unsubscribe function. Calling it more than once is safe.\n */\n onAudio(callback: (event: WebSpeechTTSAudioEvent) => void): () => void {\n this.audioCallbacks.add(callback);\n\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this.audioCallbacks.delete(callback);\n };\n }\n\n /** Stop current speech synthesis and cancel any queued utterances. */\n stop(): void {\n if (typeof window === 'undefined' || typeof window.speechSynthesis === 'undefined') {\n return;\n }\n\n this.log('Stopping speech synthesis');\n window.speechSynthesis.cancel();\n\n }\n\n /** Gracefully close the adapter. */\n close(): void {\n this.log('Closing');\n this.stop();\n this.cleanup();\n }\n\n /** Force-destroy the adapter. */\n destroy(): void {\n this.log('Destroying');\n this.stop();\n this.cleanup();\n this.audioCallbacks.clear();\n }\n\n /**\n * Suspend the adapter (e.g. when the device goes offline).\n *\n * Pauses any active speech synthesis and marks the adapter as suspended.\n */\n suspend(): void {\n if (this._suspended) return;\n\n this._suspended = true;\n\n if (typeof window !== 'undefined' && typeof window.speechSynthesis !== 'undefined') {\n window.speechSynthesis.pause();\n }\n\n this.log('Suspended');\n }\n\n /**\n * Resume after a prior `suspend()`.\n */\n resume(): void {\n if (!this._suspended) return;\n\n this._suspended = false;\n\n if (typeof window !== 'undefined' && typeof window.speechSynthesis !== 'undefined') {\n window.speechSynthesis.resume();\n }\n\n this.log('Resumed');\n }\n\n // -------------------------------------------------------------------------\n // Voice loading\n // -------------------------------------------------------------------------\n\n /**\n * Load available voices from the browser.\n *\n * In Chrome and some other browsers, voices load asynchronously after\n * the page loads. We wait for the `voiceschanged` event with a timeout.\n */\n private async loadVoices(): Promise<void> {\n if (this._voicesLoaded) return;\n if (typeof window === 'undefined' || typeof window.speechSynthesis === 'undefined') return;\n\n const synth = window.speechSynthesis;\n let voices = synth.getVoices();\n\n if (voices.length > 0) {\n this._voicesLoaded = true;\n this.log('Voices loaded:', voices.length, 'available');\n return;\n }\n\n // Wait for voiceschanged event (Chrome loads voices async)\n await new Promise<void>((resolve) => {\n const onVoicesChanged = (): void => {\n synth.removeEventListener('voiceschanged', onVoicesChanged);\n clearTimeout(timeout);\n voices = synth.getVoices();\n this._voicesLoaded = true;\n this.log('Voices loaded (async):', voices.length, 'available');\n resolve();\n };\n\n // Timeout after 2 seconds — some browsers never fire voiceschanged\n const timeout = setTimeout(() => {\n synth.removeEventListener('voiceschanged', onVoicesChanged);\n this._voicesLoaded = true;\n this.log('Voices loading timed out — proceeding with defaults');\n resolve();\n }, 2_000);\n\n synth.addEventListener('voiceschanged', onVoicesChanged);\n });\n }\n\n /**\n * Find a voice by name (case-insensitive partial match).\n */\n private findVoice(name: string): SpeechSynthesisVoice | null {\n if (typeof window === 'undefined' || typeof window.speechSynthesis === 'undefined') {\n return null;\n }\n\n const voices = window.speechSynthesis.getVoices();\n const lowerName = name.toLowerCase();\n\n // Try exact match first\n const exact = voices.find((v) => v.name.toLowerCase() === lowerName);\n if (exact) return exact;\n\n // Try partial match\n const partial = voices.find((v) => v.name.toLowerCase().includes(lowerName));\n if (partial) return partial;\n\n // Try matching by language if voice name looks like a language code\n if (lowerName.includes('-') || lowerName.length <= 5) {\n const langMatch = voices.find((v) => v.lang.toLowerCase().startsWith(lowerName));\n if (langMatch) return langMatch;\n }\n\n return null;\n }\n\n // -------------------------------------------------------------------------\n // Subscriber notification\n // -------------------------------------------------------------------------\n\n /**\n * Emit an audio event to all registered callbacks.\n *\n * Errors thrown by individual callbacks are caught and logged so one\n * misbehaving subscriber does not prevent others from receiving the event.\n */\n private emitAudio(event: WebSpeechTTSAudioEvent): void {\n for (const cb of this.audioCallbacks) {\n try {\n cb(event);\n } catch (err) {\n console.error(LOG_PREFIX, 'Audio callback threw:', err);\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n /** Reset internal state. */\n private cleanup(): void {\n this._connected = false;\n\n }\n\n // -------------------------------------------------------------------------\n // Logging\n // -------------------------------------------------------------------------\n\n /** Conditional debug logging. */\n private log(...args: unknown[]): void {\n if (this.debugEnabled) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Voice Pipeline (Phase 1b)\n// ---------------------------------------------------------------------------\n//\n// Orchestrates the full voice flow: Mic → VAD → STT → LLM → TTS → Speaker.\n//\n// Half-duplex state machine:\n// IDLE ──startListening()──► LISTENING\n// LISTENING ──final transcript──► PROCESSING\n// PROCESSING ──LLM response──► SPEAKING\n// SPEAKING ──TTS done──► IDLE\n// SPEAKING ──barge-in──► LISTENING\n// Any ──error──► ERROR\n// ERROR ──startListening()──► LISTENING\n//\n// SSR safe: all browser APIs are guarded behind `typeof window` checks.\n// AudioContext is only created in init() which must be called after a user\n// gesture to satisfy browser autoplay policies.\n// ---------------------------------------------------------------------------\n\nimport { EventBus, createEventBus } from '../bus/index.js';\nimport { BrowserSupportError, ErrorCodes, PermissionError } from '../errors/index.js';\nimport { DeepgramSTT } from './deepgram-stt.js';\nimport { ElevenLabsSTT } from './elevenlabs-stt.js';\nimport { ElevenLabsTTS } from './elevenlabs-tts.js';\nimport { WebSpeechSTT } from './web-speech-stt.js';\nimport { WebSpeechTTS } from './web-speech-tts.js';\n\nimport type { STTTranscriptEvent } from '../types/index.js';\nimport type { TTSAudioEvent } from './elevenlabs-tts.js';\nimport type { WebSpeechTTSAudioEvent } from './web-speech-tts.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Voice]';\n\n/** Jitter buffer: accumulate this many ms of audio before starting playback. */\nconst JITTER_BUFFER_MS = 150;\n\n/** Echo detection: discard transcript if >60% word overlap within this window. */\nconst ECHO_WINDOW_MS = 3_000;\n\n/** Echo detection: minimum word overlap ratio to classify as echo. */\nconst ECHO_OVERLAP_THRESHOLD = 0.6;\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport type VoiceState = 'idle' | 'listening' | 'processing' | 'speaking' | 'error';\n\nexport interface VoicePipelineOptions {\n sttConfig:\n | { provider: 'deepgram'; apiKey: string; model?: 'nova-2' | 'nova-3' }\n | { provider: 'elevenlabs'; apiKey: string; language?: string }\n | { provider: 'web-speech'; language?: string; continuous?: boolean; interimResults?: boolean };\n ttsConfig:\n | { provider: 'elevenlabs'; apiKey: string; voiceId?: string; modelId?: string }\n | { provider: 'web-speech'; voice?: string; rate?: number; pitch?: number; language?: string };\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Type declarations for environments with webkitAudioContext\n// ---------------------------------------------------------------------------\n\ndeclare global {\n // eslint-disable-next-line no-var\n var webkitAudioContext: typeof AudioContext | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Internals: VAD interface (dynamically imported from @guidekit/vad)\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal interface mirroring the public API of SileroVAD from @guidekit/vad.\n * Declared here so we can type the dynamically imported instance without a\n * hard compile-time dependency.\n */\ninterface VADInstance {\n init(): Promise<void>;\n start(stream: MediaStream): void;\n stop(): void;\n destroy(): Promise<void>;\n onSpeechStart(cb: (event: { type: string; timestamp: number; probability?: number }) => void): () => void;\n onSpeechEnd(cb: (event: { type: string; timestamp: number; probability?: number }) => void): () => void;\n readonly isSpeaking: boolean;\n readonly isReady: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Internals: Echo tracker\n// ---------------------------------------------------------------------------\n\ninterface EchoRecord {\n words: Set<string>;\n timestamp: number;\n}\n\n// ---------------------------------------------------------------------------\n// VoicePipeline\n// ---------------------------------------------------------------------------\n\nexport class VoicePipeline {\n // ── Configuration ────────────────────────────────────────────────────\n private readonly _sttConfig: VoicePipelineOptions['sttConfig'];\n private readonly _ttsConfig: VoicePipelineOptions['ttsConfig'];\n private readonly _debug: boolean;\n\n // ── State ────────────────────────────────────────────────────────────\n private _state: VoiceState = 'idle';\n private _destroyed = false;\n\n // ── EventBus (internal, for voice-specific events) ──────────────────\n private readonly _bus: EventBus;\n\n // ── Audio pipeline components ────────────────────────────────────────\n private _audioContext: AudioContext | null = null;\n private _mediaStream: MediaStream | null = null;\n private _vad: VADInstance | null = null;\n private _stt: DeepgramSTT | ElevenLabsSTT | WebSpeechSTT | null = null;\n private _tts: ElevenLabsTTS | WebSpeechTTS | null = null;\n\n // ── Audio capture (mic → ScriptProcessor → STT) ─────────────────────\n private _micSourceNode: MediaStreamAudioSourceNode | null = null;\n private _captureProcessor: ScriptProcessorNode | null = null;\n private _isForwardingToSTT = false;\n\n // ── TTS playback ────────────────────────────────────────────────────\n private _playbackQueue: ArrayBuffer[] = [];\n private _jitterBufferTimer: ReturnType<typeof setTimeout> | null = null;\n private _isPlaybackStarted = false;\n private _nextPlaybackTime = 0;\n private _activeSourceNodes: Set<AudioBufferSourceNode> = new Set();\n private _lastScheduledSource: AudioBufferSourceNode | null = null;\n\n // ── Echo detection ──────────────────────────────────────────────────\n private _lastTTSEcho: EchoRecord | null = null;\n\n // ── Barge-in / abort ────────────────────────────────────────────────\n private _pendingLLMAbort: AbortController | null = null;\n\n // ── Subscriber management ───────────────────────────────────────────\n private readonly _stateChangeCallbacks: Set<(state: VoiceState, previous: VoiceState) => void> = new Set();\n private readonly _transcriptCallbacks: Set<(text: string, isFinal: boolean) => void> = new Set();\n\n // ── Cleanup handles ─────────────────────────────────────────────────\n private _unsubVADSpeechStart: (() => void) | null = null;\n private _unsubVADSpeechEnd: (() => void) | null = null;\n private _unsubSTTTranscript: (() => void) | null = null;\n private _unsubTTSAudio: (() => void) | null = null;\n\n // ────────────────────────────────────────────────────────────────────\n // Constructor\n // ────────────────────────────────────────────────────────────────────\n\n constructor(options: VoicePipelineOptions) {\n this._sttConfig = options.sttConfig;\n this._ttsConfig = options.ttsConfig;\n this._debug = options.debug ?? false;\n this._bus = createEventBus({ debug: this._debug });\n\n this._log('VoicePipeline created');\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Public getters\n // ────────────────────────────────────────────────────────────────────\n\n /** Current pipeline state. */\n get state(): VoiceState {\n return this._state;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // init() — call after user gesture\n // ────────────────────────────────────────────────────────────────────\n\n /**\n * Initialize AudioContext, VAD model, and STT/TTS connections.\n *\n * **Must be called in response to a user gesture** (click / tap) to\n * satisfy browser autoplay policies.\n */\n async init(): Promise<void> {\n if (this._destroyed) {\n this._log('Cannot init — pipeline is destroyed');\n return;\n }\n\n // SSR guard\n if (typeof window === 'undefined') {\n this._log('SSR environment detected — skipping init');\n return;\n }\n\n if (this._audioContext) {\n this._log('Already initialized — skipping');\n return;\n }\n\n this._log('Initializing...');\n\n // ── 1. Create AudioContext ───────────────────────────────────────\n const AudioContextClass = this._resolveAudioContext();\n if (!AudioContextClass) {\n throw new BrowserSupportError({\n code: ErrorCodes.BROWSER_NO_WEB_AUDIO,\n message: 'Web Audio API is not supported in this browser.',\n suggestion: 'Use a modern browser such as Chrome, Firefox, or Safari.',\n });\n }\n\n this._audioContext = new AudioContextClass();\n this._log('AudioContext created, sampleRate:', this._audioContext.sampleRate);\n\n // Pre-warm the AudioContext with a silent buffer to avoid first-play delay\n this._prewarmAudioContext(this._audioContext);\n\n // ── 2. Load VAD model ───────────────────────────────────────────\n try {\n const vadModule = await import('@guidekit/vad');\n const SileroVAD = vadModule.SileroVAD;\n this._vad = new SileroVAD({ debug: this._debug }) as unknown as VADInstance;\n await this._vad.init();\n this._log('VAD model loaded');\n } catch (err) {\n throw new BrowserSupportError({\n code: ErrorCodes.VAD_PACKAGE_MISSING,\n message:\n 'Failed to load @guidekit/vad. Ensure the package is installed.',\n suggestion:\n 'Run: npm install @guidekit/vad — or check that WASM is supported.',\n cause: err instanceof Error ? err : undefined,\n });\n }\n\n // ── 3. Create STT adapter ───────────────────────────────────────\n if (this._sttConfig.provider === 'deepgram') {\n this._stt = new DeepgramSTT({\n apiKey: this._sttConfig.apiKey,\n model: this._sttConfig.model,\n debug: this._debug,\n });\n } else if (this._sttConfig.provider === 'elevenlabs') {\n this._stt = new ElevenLabsSTT({\n apiKey: this._sttConfig.apiKey,\n language: this._sttConfig.language,\n debug: this._debug,\n });\n } else {\n // web-speech provider (browser-native, zero-config)\n this._stt = new WebSpeechSTT({\n language: this._sttConfig.language,\n continuous: this._sttConfig.continuous,\n interimResults: this._sttConfig.interimResults,\n debug: this._debug,\n });\n }\n\n // ── 4. Create TTS adapter ───────────────────────────────────────\n if (this._ttsConfig.provider === 'elevenlabs') {\n this._tts = new ElevenLabsTTS({\n apiKey: this._ttsConfig.apiKey,\n voiceId: this._ttsConfig.voiceId,\n modelId: 'modelId' in this._ttsConfig ? this._ttsConfig.modelId : undefined,\n debug: this._debug,\n });\n } else {\n // web-speech provider (browser-native, zero-config)\n this._tts = new WebSpeechTTS({\n voice: this._ttsConfig.voice,\n rate: this._ttsConfig.rate,\n pitch: this._ttsConfig.pitch,\n language: this._ttsConfig.language,\n debug: this._debug,\n });\n }\n\n this._log('Initialization complete');\n }\n\n // ────────────────────────────────────────────────────────────────────\n // startListening()\n // ────────────────────────────────────────────────────────────────────\n\n /**\n * Start listening: activate microphone, begin VAD + STT pipeline.\n *\n * Valid from: IDLE, ERROR, SPEAKING (barge-in path calls this internally).\n */\n async startListening(): Promise<void> {\n if (this._destroyed) return;\n\n if (!this._audioContext || !this._vad || !this._stt) {\n throw new BrowserSupportError({\n code: ErrorCodes.BROWSER_NO_WEB_AUDIO,\n message: 'Voice pipeline not initialized. Call init() first.',\n suggestion: 'Ensure init() is called after a user gesture before startListening().',\n });\n }\n\n // Resume AudioContext if it was suspended (browser policy)\n if (this._audioContext.state === 'suspended') {\n try {\n await this._audioContext.resume();\n } catch {\n // Ignore resume errors — the context may auto-resume on interaction\n }\n }\n\n // ── Get mic access ──────────────────────────────────────────────\n try {\n this._mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n },\n });\n this._log('Microphone access granted');\n } catch (err) {\n const isNotAllowed =\n err instanceof DOMException &&\n (err.name === 'NotAllowedError' || err.name === 'PermissionDeniedError');\n\n if (isNotAllowed) {\n const permErr = new PermissionError({\n code: ErrorCodes.PERMISSION_MIC_DENIED,\n message: 'Microphone permission was denied by the user.',\n suggestion: 'Allow microphone access in your browser settings and try again.',\n });\n this._setState('error');\n this._bus.emit('error', permErr);\n throw permErr;\n }\n\n const unavailErr = new PermissionError({\n code: ErrorCodes.PERMISSION_MIC_UNAVAILABLE,\n message: 'No microphone device available.',\n suggestion: 'Connect a microphone and try again.',\n cause: err instanceof Error ? err : undefined,\n });\n this._setState('error');\n this._bus.emit('error', unavailErr);\n throw unavailErr;\n }\n\n // ── Connect STT ─────────────────────────────────────────────────\n try {\n await this._stt.connect();\n this._log('STT connected');\n } catch (_err) {\n this._log('STT connection failed — degrading to text mode');\n this._bus.emit('voice:degraded', { reason: 'STT connection failed', fallback: 'text' });\n this._stopMicTracks();\n this._setState('error');\n return;\n }\n\n // ── Wire STT transcript events ──────────────────────────────────\n this._unsubSTTTranscript?.();\n this._unsubSTTTranscript = this._stt.onTranscript((event: STTTranscriptEvent) => {\n this._handleTranscript(event);\n });\n\n // ── Set up mic → ScriptProcessor for STT forwarding ─────────────\n this._setupMicCapture();\n\n // ── Start VAD on the MediaStream ────────────────────────────────\n this._unsubVADSpeechStart?.();\n this._unsubVADSpeechEnd?.();\n\n this._unsubVADSpeechStart = this._vad.onSpeechStart(() => {\n this._handleVADSpeechStart();\n });\n this._unsubVADSpeechEnd = this._vad.onSpeechEnd(() => {\n this._handleVADSpeechEnd();\n });\n\n this._vad.start(this._mediaStream);\n this._log('VAD started');\n\n // ── Transition state ────────────────────────────────────────────\n this._setState('listening');\n }\n\n // ────────────────────────────────────────────────────────────────────\n // stopListening()\n // ────────────────────────────────────────────────────────────────────\n\n /** Stop listening: deactivate mic and VAD. */\n stopListening(): void {\n if (this._destroyed) return;\n\n this._log('stopListening()');\n this._isForwardingToSTT = false;\n this._teardownMicCapture();\n this._vad?.stop();\n this._stt?.close();\n this._stopMicTracks();\n\n if (this._state === 'listening') {\n this._setState('idle');\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // processTranscript()\n // ────────────────────────────────────────────────────────────────────\n\n /**\n * Process a transcript through an LLM callback and speak the response.\n *\n * @param text - The user's transcript text.\n * @param sendToLLM - Async callback that sends text to the LLM and returns the response.\n */\n async processTranscript(\n text: string,\n sendToLLM: (text: string) => Promise<string>,\n ): Promise<void> {\n if (this._destroyed) return;\n\n this._setState('processing');\n\n // Set up abort controller for barge-in\n this._pendingLLMAbort = new AbortController();\n const signal = this._pendingLLMAbort.signal;\n\n let response: string;\n try {\n response = await sendToLLM(text);\n\n // Check if aborted during LLM call (barge-in)\n if (signal.aborted) {\n this._log('LLM response discarded (barge-in during processing)');\n return;\n }\n } catch (err) {\n if (signal.aborted) {\n this._log('LLM call aborted (barge-in)');\n return;\n }\n this._log('LLM call failed:', err);\n this._setState('error');\n return;\n } finally {\n this._pendingLLMAbort = null;\n }\n\n // Speak the response\n if (response && response.trim()) {\n await this.speak(response);\n } else {\n this._setState('idle');\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // speak()\n // ────────────────────────────────────────────────────────────────────\n\n /** Speak text via TTS (ElevenLabs or Web Speech API). */\n async speak(text: string): Promise<void> {\n if (this._destroyed || !text.trim()) return;\n\n // Web Speech TTS does not require AudioContext for playback\n const isWebSpeechTTS = this._tts instanceof WebSpeechTTS;\n if (!this._tts || (!this._audioContext && !isWebSpeechTTS)) {\n this._log('TTS or AudioContext not available — cannot speak');\n this._bus.emit('voice:degraded', { reason: 'TTS not available', fallback: 'text' });\n this._setState('idle');\n return;\n }\n\n this._setState('speaking');\n // Record echo info for later detection\n this._lastTTSEcho = {\n words: new Set(this._normalizeWords(text)),\n timestamp: Date.now(),\n };\n\n this._bus.emit('voice:tts-start', { utterance: text });\n\n // Connect TTS if needed\n try {\n if (!this._tts.isConnected) {\n await this._tts.connect();\n this._log('TTS connected');\n }\n } catch (_err) {\n this._log('TTS connection failed — degrading to text mode');\n this._bus.emit('voice:degraded', { reason: 'TTS connection failed', fallback: 'text' });\n this._bus.emit('voice:tts-end', { utterance: text, durationMs: 0 });\n this._setState('idle');\n return;\n }\n\n // Reset playback state\n this._playbackQueue = [];\n this._isPlaybackStarted = false;\n this._nextPlaybackTime = 0;\n this._jitterBufferTimer = null;\n\n // Wire TTS audio events\n this._unsubTTSAudio?.();\n const ttsStartTime = Date.now();\n\n await new Promise<void>((resolve) => {\n let resolved = false;\n const done = () => {\n if (resolved) return;\n resolved = true;\n this._unsubTTSAudio?.();\n this._unsubTTSAudio = null;\n\n const durationMs = Date.now() - ttsStartTime;\n this._bus.emit('voice:tts-end', { utterance: text, durationMs });\n\n // Only transition to idle if still in speaking state\n // (barge-in may have already changed state)\n if (this._state === 'speaking') {\n this._setState('idle');\n }\n resolve();\n };\n\n if (isWebSpeechTTS) {\n // Web Speech TTS: browser handles audio playback internally.\n // We only listen for start/end events to manage pipeline state.\n this._unsubTTSAudio = (this._tts as WebSpeechTTS).onAudio(\n (event: WebSpeechTTSAudioEvent) => {\n if (event.isFinal) {\n done();\n }\n },\n );\n (this._tts as WebSpeechTTS).speak(text);\n } else {\n // ElevenLabs TTS: audio arrives as chunks over WebSocket\n this._unsubTTSAudio = (this._tts as ElevenLabsTTS).onAudio(\n (event: TTSAudioEvent) => {\n this._handleTTSAudio(event, done);\n },\n );\n (this._tts as ElevenLabsTTS).speak(text);\n (this._tts as ElevenLabsTTS).flush();\n }\n });\n }\n\n // ────────────────────────────────────────────────────────────────────\n // stopSpeaking() — barge-in\n // ────────────────────────────────────────────────────────────────────\n\n /** Stop current TTS playback immediately (barge-in). */\n stopSpeaking(): void {\n if (this._destroyed) return;\n\n this._log('stopSpeaking() — barge-in');\n\n // Stop all active AudioBufferSourceNodes\n for (const node of this._activeSourceNodes) {\n try {\n node.stop();\n node.disconnect();\n } catch {\n // Node may already be stopped\n }\n }\n this._activeSourceNodes.clear();\n this._lastScheduledSource = null;\n\n // Clear jitter buffer\n if (this._jitterBufferTimer !== null) {\n clearTimeout(this._jitterBufferTimer);\n this._jitterBufferTimer = null;\n }\n this._playbackQueue = [];\n this._isPlaybackStarted = false;\n\n // Abort pending LLM request\n if (this._pendingLLMAbort) {\n this._pendingLLMAbort.abort();\n this._pendingLLMAbort = null;\n }\n\n // Stop Web Speech TTS playback or close ElevenLabs TTS connection\n if (this._tts instanceof WebSpeechTTS) {\n this._tts.stop();\n } else if (this._tts?.isConnected) {\n this._tts.close();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // onStateChange()\n // ────────────────────────────────────────────────────────────────────\n\n /** Subscribe to state changes. Returns an unsubscribe function. */\n onStateChange(callback: (state: VoiceState, previous: VoiceState) => void): () => void {\n this._stateChangeCallbacks.add(callback);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this._stateChangeCallbacks.delete(callback);\n };\n }\n\n // ────────────────────────────────────────────────────────────────────\n // onTranscript()\n // ────────────────────────────────────────────────────────────────────\n\n /** Subscribe to transcript events. Returns an unsubscribe function. */\n onTranscript(callback: (text: string, isFinal: boolean) => void): () => void {\n this._transcriptCallbacks.add(callback);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n this._transcriptCallbacks.delete(callback);\n };\n }\n\n // ────────────────────────────────────────────────────────────────────\n // destroy()\n // ────────────────────────────────────────────────────────────────────\n\n /** Destroy all resources held by the pipeline. */\n async destroy(): Promise<void> {\n if (this._destroyed) return;\n this._destroyed = true;\n this._log('Destroying...');\n\n // Stop everything\n this.stopSpeaking();\n this.stopListening();\n\n // Tear down subscriptions\n this._unsubVADSpeechStart?.();\n this._unsubVADSpeechEnd?.();\n this._unsubSTTTranscript?.();\n this._unsubTTSAudio?.();\n this._unsubVADSpeechStart = null;\n this._unsubVADSpeechEnd = null;\n this._unsubSTTTranscript = null;\n this._unsubTTSAudio = null;\n\n // Destroy subsystems\n if (this._vad) {\n try {\n await this._vad.destroy();\n } catch {\n // Ignore VAD destroy errors\n }\n this._vad = null;\n }\n\n if (this._stt) {\n this._stt.destroy();\n this._stt = null;\n }\n\n if (this._tts) {\n this._tts.destroy();\n this._tts = null;\n }\n\n // Close AudioContext\n if (this._audioContext) {\n try {\n await this._audioContext.close();\n } catch {\n // Ignore close errors\n }\n this._audioContext = null;\n }\n\n // Clean up mic tracks\n this._stopMicTracks();\n\n // Clear callbacks\n this._stateChangeCallbacks.clear();\n this._transcriptCallbacks.clear();\n this._bus.removeAll();\n\n this._log('Destroyed');\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: State machine\n // ════════════════════════════════════════════════════════════════════\n\n private _setState(next: VoiceState): void {\n const prev = this._state;\n if (prev === next) return;\n\n this._state = next;\n this._log(`State: ${prev} -> ${next}`);\n\n // Emit on internal bus\n this._bus.emit('voice:state-change', { from: prev, to: next });\n\n // Notify external subscribers\n for (const cb of this._stateChangeCallbacks) {\n try {\n cb(next, prev);\n } catch (err) {\n console.error(LOG_PREFIX, 'State change callback threw:', err);\n }\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: AudioContext helpers\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * Resolve the AudioContext constructor, with Safari webkitAudioContext\n * fallback. Returns null if Web Audio is not available.\n */\n private _resolveAudioContext(): typeof AudioContext | null {\n if (typeof AudioContext !== 'undefined') {\n return AudioContext;\n }\n if (typeof globalThis.webkitAudioContext !== 'undefined') {\n return globalThis.webkitAudioContext;\n }\n return null;\n }\n\n /**\n * Pre-warm the AudioContext by playing a silent buffer.\n * This forces the context into the \"running\" state and avoids a\n * noticeable delay on the first real playback.\n */\n private _prewarmAudioContext(ctx: AudioContext): void {\n try {\n const buffer = ctx.createBuffer(1, 1, ctx.sampleRate);\n const source = ctx.createBufferSource();\n source.buffer = buffer;\n source.connect(ctx.destination);\n source.start(0);\n this._log('AudioContext pre-warmed');\n } catch {\n // Non-critical — ignore\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: Mic capture → STT forwarding\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * Set up a ScriptProcessorNode to capture mic audio and forward it\n * to the STT adapter when `_isForwardingToSTT` is true.\n */\n private _setupMicCapture(): void {\n if (!this._audioContext || !this._mediaStream || !this._stt) return;\n\n this._micSourceNode = this._audioContext.createMediaStreamSource(this._mediaStream);\n\n // Buffer size of 4096 at 48 kHz ≈ 85 ms of audio per callback\n const bufferSize = 4096;\n this._captureProcessor = this._audioContext.createScriptProcessor(bufferSize, 1, 1);\n\n this._captureProcessor.onaudioprocess = (event: AudioProcessingEvent) => {\n if (!this._isForwardingToSTT || !this._stt) return;\n\n const inputData = event.inputBuffer.getChannelData(0);\n // DeepgramSTT.sendAudio accepts Float32Array and converts to Int16 internally\n this._stt.sendAudio(new Float32Array(inputData));\n };\n\n this._micSourceNode.connect(this._captureProcessor);\n // ScriptProcessorNode requires connection to destination to fire events\n this._captureProcessor.connect(this._audioContext.destination);\n this._log('Mic capture pipeline set up');\n }\n\n /** Tear down the mic capture ScriptProcessorNode. */\n private _teardownMicCapture(): void {\n if (this._captureProcessor) {\n try {\n this._captureProcessor.disconnect();\n } catch {\n // Ignore\n }\n this._captureProcessor.onaudioprocess = null;\n this._captureProcessor = null;\n }\n\n if (this._micSourceNode) {\n try {\n this._micSourceNode.disconnect();\n } catch {\n // Ignore\n }\n this._micSourceNode = null;\n }\n }\n\n /** Stop all tracks on the current MediaStream. */\n private _stopMicTracks(): void {\n if (this._mediaStream) {\n for (const track of this._mediaStream.getTracks()) {\n track.stop();\n }\n this._mediaStream = null;\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: VAD event handlers\n // ════════════════════════════════════════════════════════════════════\n\n private _handleVADSpeechStart(): void {\n this._log('VAD: speech-start, current state:', this._state);\n\n if (this._state === 'speaking') {\n // Barge-in: user is speaking while TTS is playing\n if (this._isEchoDetected()) {\n this._log('Echo detected — ignoring barge-in');\n return;\n }\n\n this._log('Barge-in detected');\n this.stopSpeaking();\n // Restart listening (we keep the mic stream alive)\n this._isForwardingToSTT = true;\n this._setState('listening');\n return;\n }\n\n if (this._state === 'listening') {\n // Start forwarding audio to STT\n this._isForwardingToSTT = true;\n this._log('Started forwarding audio to STT');\n }\n }\n\n private _handleVADSpeechEnd(): void {\n this._log('VAD: speech-end, current state:', this._state);\n\n if (this._state === 'listening') {\n // Stop forwarding to STT; we wait for a final transcript\n this._isForwardingToSTT = false;\n this._log('Stopped forwarding audio to STT');\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: STT transcript handler\n // ════════════════════════════════════════════════════════════════════\n\n private _handleTranscript(event: STTTranscriptEvent): void {\n const { text, isFinal } = event;\n\n if (!text || !text.trim()) return;\n\n // Echo detection: discard transcripts that match recent TTS output\n if (isFinal && this._isTranscriptEcho(text)) {\n this._log('Echo detected — discarding transcript:', text);\n return;\n }\n\n // Notify external transcript subscribers\n this._bus.emit('voice:transcript', {\n text,\n isFinal,\n confidence: event.confidence,\n });\n\n for (const cb of this._transcriptCallbacks) {\n try {\n cb(text, isFinal);\n } catch (err) {\n console.error(LOG_PREFIX, 'Transcript callback threw:', err);\n }\n }\n\n // On final transcript while listening → transition to PROCESSING\n // (The actual LLM call is driven by the consumer calling processTranscript)\n if (isFinal && this._state === 'listening') {\n this._log('Final transcript received:', text);\n this._isForwardingToSTT = false;\n // Note: we do NOT transition to PROCESSING here. The consumer is\n // responsible for calling processTranscript() which sets the state.\n // This keeps the pipeline composable — consumers can decide to\n // ignore transcripts, batch them, etc.\n }\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: TTS audio playback\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * Handle an audio chunk from ElevenLabs TTS.\n *\n * Implements a jitter buffer: we accumulate audio for JITTER_BUFFER_MS\n * before starting playback to smooth out network jitter.\n */\n private _handleTTSAudio(event: TTSAudioEvent, onDone: () => void): void {\n if (this._state !== 'speaking') {\n // State changed (e.g. barge-in) — discard audio\n return;\n }\n\n if (event.isFinal && event.audio.byteLength === 0) {\n // Final marker with no audio — flush whatever we have and finish\n this._flushJitterBuffer(onDone);\n return;\n }\n\n if (event.audio.byteLength === 0) return;\n\n // Add to jitter buffer queue\n this._playbackQueue.push(event.audio);\n\n if (!this._isPlaybackStarted) {\n // Start the jitter buffer timer on the first chunk\n if (this._jitterBufferTimer === null) {\n this._jitterBufferTimer = setTimeout(() => {\n this._jitterBufferTimer = null;\n this._startPlayback(event.isFinal ? onDone : undefined);\n }, JITTER_BUFFER_MS);\n }\n } else {\n // Playback already started — decode and schedule immediately\n this._decodeAndSchedule(event.audio, event.isFinal ? onDone : undefined);\n }\n\n if (event.isFinal) {\n // Clear the jitter buffer timer since we got the final chunk\n if (this._jitterBufferTimer !== null) {\n clearTimeout(this._jitterBufferTimer);\n this._jitterBufferTimer = null;\n this._startPlayback(onDone);\n }\n }\n }\n\n /** Flush the jitter buffer and start playback. */\n private _flushJitterBuffer(onDone: () => void): void {\n if (this._jitterBufferTimer !== null) {\n clearTimeout(this._jitterBufferTimer);\n this._jitterBufferTimer = null;\n }\n\n if (this._playbackQueue.length > 0) {\n this._startPlayback(onDone);\n } else {\n // No audio to play — done immediately\n onDone();\n }\n }\n\n /**\n * Begin playback: decode all queued chunks and schedule them.\n * If `onDone` is provided, it is called when the last chunk finishes playing.\n */\n private _startPlayback(onDone?: () => void): void {\n if (this._isPlaybackStarted) {\n // Already started — just flush the remaining queue\n if (this._playbackQueue.length > 0) {\n const remaining = this._playbackQueue.splice(0);\n const lastIdx = remaining.length - 1;\n for (let i = 0; i < remaining.length; i++) {\n this._decodeAndSchedule(\n remaining[i]!,\n i === lastIdx ? onDone : undefined,\n );\n }\n } else if (onDone) {\n // If there are active sources wait for the last one, otherwise call done now\n if (this._lastScheduledSource) {\n const prevOnEnded = this._lastScheduledSource.onended;\n this._lastScheduledSource.onended = () => {\n if (typeof prevOnEnded === 'function') {\n prevOnEnded.call(this._lastScheduledSource!, new Event('ended'));\n }\n onDone();\n };\n } else {\n onDone();\n }\n }\n return;\n }\n\n this._isPlaybackStarted = true;\n this._nextPlaybackTime = 0;\n\n const queued = this._playbackQueue.splice(0);\n const lastIdx = queued.length - 1;\n\n for (let i = 0; i < queued.length; i++) {\n this._decodeAndSchedule(\n queued[i]!,\n i === lastIdx ? onDone : undefined,\n );\n }\n }\n\n /**\n * Decode an audio chunk (mp3 from ElevenLabs) and schedule it for\n * sequential playback via AudioBufferSourceNode.\n */\n private _decodeAndSchedule(audioData: ArrayBuffer, onDone?: () => void): void {\n // Guard against multiple invocations of onDone. This can happen when\n // multiple pending decode operations reference the same callback, or\n // when both the success and error paths fire (e.g. state change\n // during decode).\n let onDoneCalled = false;\n const safeOnDone = onDone\n ? () => {\n if (onDoneCalled) return;\n onDoneCalled = true;\n onDone();\n }\n : undefined;\n\n if (!this._audioContext || this._state !== 'speaking') {\n safeOnDone?.();\n return;\n }\n\n const ctx = this._audioContext;\n\n // decodeAudioData needs a copy because it detaches the ArrayBuffer\n const copy = audioData.slice(0);\n\n ctx.decodeAudioData(\n copy,\n (decodedBuffer) => {\n if (this._state !== 'speaking' || !this._audioContext) {\n safeOnDone?.();\n return;\n }\n\n const source = ctx.createBufferSource();\n source.buffer = decodedBuffer;\n source.connect(ctx.destination);\n\n // Track active sources for barge-in cleanup\n this._activeSourceNodes.add(source);\n this._lastScheduledSource = source;\n\n source.onended = () => {\n this._activeSourceNodes.delete(source);\n if (this._lastScheduledSource === source) {\n this._lastScheduledSource = null;\n }\n\n // If this was the last source and we have onDone, call it\n if (safeOnDone) {\n safeOnDone();\n }\n };\n\n // Schedule playback sequentially\n const now = ctx.currentTime;\n const startTime = Math.max(now, this._nextPlaybackTime);\n source.start(startTime);\n this._nextPlaybackTime = startTime + decodedBuffer.duration;\n\n this._log(\n 'Scheduled audio chunk:',\n decodedBuffer.duration.toFixed(3) + 's',\n 'at',\n startTime.toFixed(3),\n );\n },\n (err) => {\n this._log('Failed to decode audio chunk:', err);\n safeOnDone?.();\n },\n );\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: Echo detection\n // ════════════════════════════════════════════════════════════════════\n\n /**\n * Check if VAD speech-start during SPEAKING state is likely echo from\n * the speaker playing TTS audio rather than genuine user speech.\n *\n * Simple heuristic: if we are still within the echo window of a recent\n * TTS utterance, treat it as potential echo.\n */\n private _isEchoDetected(): boolean {\n if (!this._lastTTSEcho) return false;\n const elapsed = Date.now() - this._lastTTSEcho.timestamp;\n // During active TTS playback, suppress barge-in only if within window\n // and the speaker is still audibly outputting. We use the echo window\n // as a conservative guard.\n return elapsed < ECHO_WINDOW_MS;\n }\n\n /**\n * Check if a transcript is an echo of recent TTS output.\n *\n * Uses word overlap: if intersection of words > 60% of max set size\n * and the transcript arrived within the echo window, discard it.\n */\n private _isTranscriptEcho(transcript: string): boolean {\n if (!this._lastTTSEcho) return false;\n\n const elapsed = Date.now() - this._lastTTSEcho.timestamp;\n if (elapsed > ECHO_WINDOW_MS) return false;\n\n const transcriptWords = new Set(this._normalizeWords(transcript));\n const ttsWords = this._lastTTSEcho.words;\n\n if (transcriptWords.size === 0 || ttsWords.size === 0) return false;\n\n // Compute intersection\n let intersectionCount = 0;\n for (const word of transcriptWords) {\n if (ttsWords.has(word)) {\n intersectionCount++;\n }\n }\n\n const maxSize = Math.max(transcriptWords.size, ttsWords.size);\n const overlap = intersectionCount / maxSize;\n\n this._log(\n 'Echo check: overlap =',\n (overlap * 100).toFixed(1) + '%,',\n 'threshold =',\n (ECHO_OVERLAP_THRESHOLD * 100).toFixed(1) + '%',\n );\n\n return overlap >= ECHO_OVERLAP_THRESHOLD;\n }\n\n /**\n * Normalize text into a set of lowercase words, stripping punctuation.\n */\n private _normalizeWords(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, '')\n .split(/\\s+/)\n .filter((w) => w.length > 0);\n }\n\n // ════════════════════════════════════════════════════════════════════\n // PRIVATE: Logging\n // ════════════════════════════════════════════════════════════════════\n\n private _log(...args: unknown[]): void {\n if (this._debug) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport { WebSocketManager } from './websocket-manager.js';\nexport type { WSState, WebSocketManagerOptions } from './websocket-manager.js';\nexport { DeepgramSTT } from './deepgram-stt.js';\nexport type { DeepgramSTTOptions, STTTranscriptEvent } from './deepgram-stt.js';\nexport { ElevenLabsSTT } from './elevenlabs-stt.js';\nexport type { ElevenLabsSTTOptions } from './elevenlabs-stt.js';\nexport { ElevenLabsTTS } from './elevenlabs-tts.js';\nexport type { ElevenLabsTTSOptions, TTSAudioEvent } from './elevenlabs-tts.js';\nexport { WebSpeechSTT } from './web-speech-stt.js';\nexport type { WebSpeechSTTOptions } from './web-speech-stt.js';\nexport { WebSpeechTTS } from './web-speech-tts.js';\nexport type { WebSpeechTTSOptions, WebSpeechTTSAudioEvent } from './web-speech-tts.js';\n","/**\n * @module @guidekit/core/visual\n *\n * Visual Guidance System for the GuideKit SDK.\n * Provides spotlight overlays, tooltips, smooth scrolling, and guided tours\n * to visually direct users to page elements identified by the LLM.\n *\n * Key design decisions:\n * - Overlay lives on document.body (NOT Shadow DOM) so it can cover the entire page.\n * - Uses box-shadow cutout technique for the spotlight effect.\n * - Tracks element position via ResizeObserver + scroll listeners (NOT rAF polling).\n * - All text is set via textContent (never innerHTML) to prevent XSS.\n * - SSR-safe: every browser API is guarded behind typeof checks.\n * - Compositor-only animations (transform, opacity) for smooth 60fps.\n * - Respects prefers-reduced-motion.\n */\n\nimport { DOMScanner } from '../dom/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Visual]';\nconst DEFAULT_OVERLAY_COLOR = 'rgba(0, 0, 0, 0.5)';\nconst DEFAULT_SPOTLIGHT_COLOR = '#4a9eed';\nconst DEFAULT_ANIMATION_DURATION = 300;\nconst DEFAULT_SPOTLIGHT_PADDING = 8;\nconst AUTO_TOUR_INTERVAL_MS = 5000;\nconst TOOLTIP_ARROW_SIZE = 8;\nconst TOOLTIP_MARGIN = 12;\nconst OVERLAY_Z_INDEX = 999998;\nconst TOOLTIP_Z_INDEX = 999999;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface VisualGuidanceOptions {\n /** Color of the spotlight overlay. Default: 'rgba(0, 0, 0, 0.5)' */\n overlayColor?: string;\n /** Color of the spotlight cutout border. Default: '#4a9eed' */\n spotlightColor?: string;\n /** Animation duration in ms. Default: 300 */\n animationDuration?: number;\n /** Padding around the highlighted element in px. Default: 8 */\n spotlightPadding?: number;\n /** Enable debug logging. Default: false */\n debug?: boolean;\n}\n\nexport interface TooltipOptions {\n text: string;\n position?: 'top' | 'bottom' | 'left' | 'right' | 'auto';\n}\n\nexport interface SpotlightState {\n isActive: boolean;\n selector: string | null;\n sectionId: string | null;\n tooltip: string | null;\n}\n\ntype TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\n// ---------------------------------------------------------------------------\n// Utility: Scrollable ancestor detection\n// ---------------------------------------------------------------------------\n\n/**\n * Walk up the DOM tree and collect every ancestor that has an overflow\n * style allowing scroll (auto or scroll).\n */\nfunction getScrollableAncestors(element: Element): Element[] {\n if (typeof getComputedStyle === 'undefined') return [];\n\n const ancestors: Element[] = [];\n let parent = element.parentElement;\n while (parent) {\n const style = getComputedStyle(parent);\n const overflow = style.overflow + style.overflowX + style.overflowY;\n if (/(auto|scroll)/.test(overflow)) {\n ancestors.push(parent);\n }\n parent = parent.parentElement;\n }\n return ancestors;\n}\n\n/**\n * Detect whether the user prefers reduced motion.\n */\nfunction prefersReducedMotion(): boolean {\n if (typeof window === 'undefined') return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n// ---------------------------------------------------------------------------\n// VisualGuidance\n// ---------------------------------------------------------------------------\n\nexport class VisualGuidance {\n // Configuration\n private readonly overlayColor: string;\n private readonly spotlightColor: string;\n private readonly animationDuration: number;\n private readonly spotlightPadding: number;\n private readonly debug: boolean;\n\n // DOM elements (created lazily)\n private overlayEl: HTMLDivElement | null = null;\n private spotlightEl: HTMLDivElement | null = null;\n private tooltipEl: HTMLDivElement | null = null;\n private liveRegionEl: HTMLDivElement | null = null;\n\n // State\n private _state: SpotlightState = {\n isActive: false,\n selector: null,\n sectionId: null,\n tooltip: null,\n };\n\n // Tracking infrastructure\n private resizeObserver: ResizeObserver | null = null;\n private scrollListenerCleanups: Array<() => void> = [];\n private currentTargetElement: Element | null = null;\n\n // Tour state\n private tourSectionIds: string[] = [];\n private tourCurrentStep = -1;\n private tourMode: 'auto' | 'manual' = 'manual';\n private tourAutoTimer: ReturnType<typeof setTimeout> | null = null;\n private tourPausedByInteraction = false;\n\n // Subscribers\n private spotlightChangeCallbacks: Array<(state: SpotlightState) => void> = [];\n private tourStepCallbacks: Array<(step: number, total: number, sectionId: string) => void> = [];\n\n // DOMScanner for resolving sectionIds\n private domScanner: DOMScanner | null = null;\n\n // Track whether destroy() has been called\n private destroyed = false;\n\n constructor(options?: VisualGuidanceOptions) {\n this.overlayColor = options?.overlayColor ?? DEFAULT_OVERLAY_COLOR;\n this.spotlightColor = options?.spotlightColor ?? DEFAULT_SPOTLIGHT_COLOR;\n this.animationDuration = options?.animationDuration ?? DEFAULT_ANIMATION_DURATION;\n this.spotlightPadding = options?.spotlightPadding ?? DEFAULT_SPOTLIGHT_PADDING;\n this.debug = options?.debug ?? false;\n\n this.log('Initialised', {\n overlayColor: this.overlayColor,\n spotlightColor: this.spotlightColor,\n animationDuration: this.animationDuration,\n spotlightPadding: this.spotlightPadding,\n });\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /**\n * Highlight an element by selector or sectionId.\n * Returns true if the element was found and highlighted, false otherwise.\n */\n highlight(params: {\n sectionId?: string;\n selector?: string;\n tooltip?: string;\n position?: 'top' | 'bottom' | 'left' | 'right' | 'auto';\n }): boolean {\n if (typeof document === 'undefined') return false;\n if (this.destroyed) return false;\n\n const { sectionId, selector, tooltip, position } = params;\n\n // Resolve the target element\n const target = this.resolveTarget(sectionId, selector);\n if (!target) {\n this.log('Target element not found', { sectionId, selector });\n return false;\n }\n\n const resolvedSelector = selector ?? this.buildSelectorForElement(target);\n\n // Dismiss any existing highlight first (without notifying to avoid flicker)\n this.cleanupTrackingInfrastructure();\n\n // Update state\n this._state = {\n isActive: true,\n selector: resolvedSelector,\n sectionId: sectionId ?? null,\n tooltip: tooltip ?? null,\n };\n\n this.currentTargetElement = target;\n\n // Check if the element has zero size (e.g., display: none)\n const rect = target.getBoundingClientRect();\n const hasSize = rect.width > 0 && rect.height > 0;\n\n if (hasSize) {\n // Create/update overlay and spotlight\n this.ensureOverlay();\n this.ensureSpotlight();\n this.positionSpotlight(rect);\n this.showOverlay();\n } else {\n this.log('Element has zero size, showing tooltip only');\n }\n\n // Show tooltip if requested\n if (tooltip) {\n this.showTooltip(target, tooltip, position ?? 'auto');\n } else {\n this.removeTooltip();\n }\n\n // Set up position tracking\n this.setupPositionTracking(target);\n\n // Announce for screen readers\n const label = sectionId ?? resolvedSelector;\n this.announce(`Highlighting ${label}`);\n\n // Notify subscribers\n this.notifySpotlightChange();\n\n this.log('Highlighted element', { sectionId, selector: resolvedSelector, tooltip });\n return true;\n }\n\n /**\n * Remove the spotlight and all associated elements.\n */\n dismissHighlight(): void {\n if (typeof document === 'undefined') return;\n\n this.cleanupTrackingInfrastructure();\n this.hideOverlay();\n this.removeTooltip();\n this.removeAriaDescribedBy();\n\n this.currentTargetElement = null;\n\n this._state = {\n isActive: false,\n selector: null,\n sectionId: null,\n tooltip: null,\n };\n\n this.notifySpotlightChange();\n this.log('Highlight dismissed');\n }\n\n /**\n * Smooth scroll to a section by its sectionId.\n */\n scrollToSection(sectionId: string, offset?: number): void {\n if (typeof document === 'undefined') return;\n\n const target = this.resolveTarget(sectionId, undefined);\n if (!target) {\n this.log('scrollToSection: section not found', { sectionId });\n return;\n }\n\n this.scrollToElement(target, offset);\n this.log('Scrolled to section', { sectionId });\n }\n\n /**\n * Smooth scroll to an element by CSS selector.\n */\n scrollToSelector(selector: string, offset?: number): void {\n if (typeof document === 'undefined') return;\n\n let target: Element | null;\n try {\n target = document.querySelector(selector);\n } catch {\n this.log('scrollToSelector: invalid selector', { selector });\n return;\n }\n\n if (!target) {\n this.log('scrollToSelector: element not found', { selector });\n return;\n }\n\n this.scrollToElement(target, offset);\n this.log('Scrolled to selector', { selector });\n }\n\n /**\n * Start a guided tour through the given section IDs.\n */\n startTour(sectionIds: string[], mode: 'auto' | 'manual' = 'manual'): void {\n if (typeof document === 'undefined') return;\n if (this.destroyed) return;\n if (sectionIds.length === 0) return;\n\n // Stop any existing tour\n this.stopTour();\n\n this.tourSectionIds = [...sectionIds];\n this.tourMode = mode;\n this.tourCurrentStep = -1;\n this.tourPausedByInteraction = false;\n\n this.log('Tour started', { steps: sectionIds.length, mode });\n\n // Advance to the first step\n this.nextTourStep();\n }\n\n /**\n * Move to the next tour step. No-op if no tour is active.\n */\n nextTourStep(): void {\n if (this.tourSectionIds.length === 0) return;\n\n // Clear any existing auto timer\n this.clearAutoTimer();\n\n const nextStep = this.tourCurrentStep + 1;\n if (nextStep >= this.tourSectionIds.length) {\n // Tour complete\n this.stopTour();\n return;\n }\n\n this.tourCurrentStep = nextStep;\n this.tourPausedByInteraction = false;\n\n this.executeTourStep();\n }\n\n /**\n * Move to the previous tour step. No-op if no tour is active or at first step.\n */\n prevTourStep(): void {\n if (this.tourSectionIds.length === 0) return;\n if (this.tourCurrentStep <= 0) return;\n\n // Clear any existing auto timer\n this.clearAutoTimer();\n\n this.tourCurrentStep -= 1;\n this.tourPausedByInteraction = false;\n\n this.executeTourStep();\n }\n\n /**\n * Stop the tour and dismiss all highlights.\n */\n stopTour(): void {\n this.clearAutoTimer();\n\n const wasActive = this.tourSectionIds.length > 0;\n\n this.tourSectionIds = [];\n this.tourCurrentStep = -1;\n this.tourPausedByInteraction = false;\n\n this.dismissHighlight();\n\n if (wasActive) {\n this.log('Tour stopped');\n }\n }\n\n /**\n * Get the current spotlight state.\n */\n get state(): SpotlightState {\n return { ...this._state };\n }\n\n /**\n * Get the current tour state, or null if no tour is active.\n */\n get tourState(): { active: boolean; step: number; total: number } | null {\n if (this.tourSectionIds.length === 0) {\n return null;\n }\n return {\n active: true,\n step: this.tourCurrentStep,\n total: this.tourSectionIds.length,\n };\n }\n\n /**\n * Subscribe to spotlight state changes.\n * Returns an unsubscribe function.\n */\n onSpotlightChange(callback: (state: SpotlightState) => void): () => void {\n this.spotlightChangeCallbacks.push(callback);\n return () => {\n const idx = this.spotlightChangeCallbacks.indexOf(callback);\n if (idx !== -1) {\n this.spotlightChangeCallbacks.splice(idx, 1);\n }\n };\n }\n\n /**\n * Subscribe to tour step events.\n * Returns an unsubscribe function.\n */\n onTourStep(callback: (step: number, total: number, sectionId: string) => void): () => void {\n this.tourStepCallbacks.push(callback);\n return () => {\n const idx = this.tourStepCallbacks.indexOf(callback);\n if (idx !== -1) {\n this.tourStepCallbacks.splice(idx, 1);\n }\n };\n }\n\n /**\n * Clean up all DOM elements, observers, and event listeners.\n * After calling destroy(), the instance is unusable.\n */\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n\n this.stopTour();\n this.dismissHighlight();\n this.cleanupTrackingInfrastructure();\n\n // Remove overlay\n if (this.overlayEl?.parentNode) {\n this.overlayEl.parentNode.removeChild(this.overlayEl);\n }\n this.overlayEl = null;\n\n // Remove spotlight\n if (this.spotlightEl?.parentNode) {\n this.spotlightEl.parentNode.removeChild(this.spotlightEl);\n }\n this.spotlightEl = null;\n\n // Remove tooltip\n this.removeTooltip();\n\n // Remove live region\n if (this.liveRegionEl?.parentNode) {\n this.liveRegionEl.parentNode.removeChild(this.liveRegionEl);\n }\n this.liveRegionEl = null;\n\n // Disconnect resize observer\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n\n // Clear subscriber lists\n this.spotlightChangeCallbacks = [];\n this.tourStepCallbacks = [];\n\n this.domScanner = null;\n\n this.log('Destroyed');\n }\n\n // -------------------------------------------------------------------------\n // Private: Target resolution\n // -------------------------------------------------------------------------\n\n /**\n * Resolve a target element from either a sectionId or a CSS selector.\n * If sectionId is provided, uses DOMScanner to find the section's selector.\n */\n private resolveTarget(sectionId?: string, selector?: string): Element | null {\n if (typeof document === 'undefined') return null;\n\n // Try selector first if provided\n if (selector) {\n try {\n const el = document.querySelector(selector);\n if (el) return el;\n } catch {\n this.log('Invalid selector', { selector });\n }\n }\n\n // Try sectionId via DOMScanner\n if (sectionId) {\n // Try common patterns: data-guidekit-target, id, aria-label\n const strategies = [\n `[data-guidekit-target=\"${sectionId}\"]`,\n `#${CSS.escape(sectionId)}`,\n `[aria-label=\"${sectionId}\"]`,\n ];\n\n for (const strategy of strategies) {\n try {\n const el = document.querySelector(strategy);\n if (el) return el;\n } catch {\n // Invalid selector, try next\n }\n }\n\n // Fall back to DOMScanner for a full scan\n if (!this.domScanner) {\n this.domScanner = new DOMScanner({ debug: this.debug });\n }\n const model = this.domScanner.scan();\n const section = model.sections.find((s) => s.id === sectionId);\n if (section) {\n try {\n const el = document.querySelector(section.selector);\n if (el) return el;\n } catch {\n this.log('DOMScanner selector invalid', { selector: section.selector });\n }\n }\n }\n\n return null;\n }\n\n /**\n * Build a CSS selector for an element, using the same priority hierarchy\n * as the DOMScanner.\n */\n private buildSelectorForElement(el: Element): string {\n const guideKitTarget = el.getAttribute('data-guidekit-target');\n if (guideKitTarget) return `[data-guidekit-target=\"${guideKitTarget}\"]`;\n\n const id = el.id;\n if (id) {\n try {\n const escaped = CSS.escape(id);\n if (document.querySelectorAll(`#${escaped}`).length === 1) {\n return `#${escaped}`;\n }\n } catch {\n // Fall through\n }\n }\n\n const testId = el.getAttribute('data-testid');\n if (testId) return `[data-testid=\"${testId}\"]`;\n\n const ariaLabel = el.getAttribute('aria-label');\n if (ariaLabel) return `[aria-label=\"${ariaLabel}\"]`;\n\n // Structural path fallback\n return this.buildStructuralPath(el);\n }\n\n private buildStructuralPath(el: Element): string {\n if (typeof document === 'undefined') return '';\n\n const parts: string[] = [];\n let current: Element | null = el;\n\n while (current && current !== document.documentElement) {\n const tag = current.tagName.toLowerCase();\n\n if (tag === 'body' || tag === 'html') {\n parts.unshift(tag);\n current = current.parentElement;\n continue;\n }\n\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (c) => c.tagName === current!.tagName,\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n parts.unshift(`${tag}:nth-child(${index})`);\n } else {\n parts.unshift(tag);\n }\n } else {\n parts.unshift(tag);\n }\n\n current = parent;\n }\n\n return parts.join(' > ');\n }\n\n // -------------------------------------------------------------------------\n // Private: Overlay management\n // -------------------------------------------------------------------------\n\n /**\n * Ensure the full-page overlay element exists on document.body.\n */\n private ensureOverlay(): void {\n if (typeof document === 'undefined') return;\n if (this.overlayEl) return;\n\n const overlay = document.createElement('div');\n overlay.setAttribute('aria-hidden', 'true');\n overlay.setAttribute('data-guidekit-overlay', 'true');\n overlay.style.cssText = [\n 'position: fixed',\n 'inset: 0',\n `z-index: ${OVERLAY_Z_INDEX}`,\n 'pointer-events: none',\n 'opacity: 0',\n `transition: opacity ${this.getTransitionDuration()}ms ease-out`,\n ].join('; ');\n\n document.body.appendChild(overlay);\n this.overlayEl = overlay;\n }\n\n /**\n * Ensure the spotlight (cutout) element exists on document.body.\n */\n private ensureSpotlight(): void {\n if (typeof document === 'undefined') return;\n if (this.spotlightEl) return;\n\n const spotlight = document.createElement('div');\n spotlight.setAttribute('aria-hidden', 'true');\n spotlight.setAttribute('data-guidekit-spotlight', 'true');\n\n const transitionDuration = this.getTransitionDuration();\n spotlight.style.cssText = [\n 'position: fixed',\n `z-index: ${OVERLAY_Z_INDEX}`,\n 'pointer-events: none',\n 'border-radius: 4px',\n `border: 2px solid ${this.spotlightColor}`,\n `box-shadow: 0 0 0 9999px ${this.overlayColor}`,\n 'will-change: transform, opacity',\n 'opacity: 0',\n `transition: transform ${transitionDuration}ms ease-out, opacity ${transitionDuration}ms ease-out, width ${transitionDuration}ms ease-out, height ${transitionDuration}ms ease-out`,\n ].join('; ');\n\n document.body.appendChild(spotlight);\n this.spotlightEl = spotlight;\n }\n\n /**\n * Position the spotlight element over the target's bounding rect.\n */\n private positionSpotlight(rect: DOMRect): void {\n if (!this.spotlightEl) return;\n\n const pad = this.spotlightPadding;\n const left = rect.left - pad;\n const top = rect.top - pad;\n const width = rect.width + pad * 2;\n const height = rect.height + pad * 2;\n\n this.spotlightEl.style.left = `${left}px`;\n this.spotlightEl.style.top = `${top}px`;\n this.spotlightEl.style.width = `${width}px`;\n this.spotlightEl.style.height = `${height}px`;\n }\n\n /**\n * Show the overlay and spotlight with entrance animation.\n */\n private showOverlay(): void {\n if (typeof document === 'undefined') return;\n\n // Force a reflow so the transition triggers\n if (this.overlayEl) {\n void this.overlayEl.offsetHeight;\n this.overlayEl.style.opacity = '1';\n }\n if (this.spotlightEl) {\n void this.spotlightEl.offsetHeight;\n this.spotlightEl.style.opacity = '1';\n }\n }\n\n /**\n * Hide the overlay and spotlight.\n */\n private hideOverlay(): void {\n if (this.overlayEl) {\n this.overlayEl.style.opacity = '0';\n }\n if (this.spotlightEl) {\n this.spotlightEl.style.opacity = '0';\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Tooltip management\n // -------------------------------------------------------------------------\n\n /**\n * Show a tooltip near the target element.\n */\n private showTooltip(\n target: Element,\n text: string,\n positionPref: 'top' | 'bottom' | 'left' | 'right' | 'auto',\n ): void {\n if (typeof document === 'undefined') return;\n\n // Create or reuse tooltip element\n if (!this.tooltipEl) {\n const tooltip = document.createElement('div');\n tooltip.setAttribute('role', 'tooltip');\n tooltip.setAttribute('data-guidekit-tooltip', 'true');\n\n const transitionDuration = this.getTransitionDuration();\n tooltip.style.cssText = [\n 'position: fixed',\n `z-index: ${TOOLTIP_Z_INDEX}`,\n 'pointer-events: none',\n 'background: #ffffff',\n 'color: #1a1a2e',\n 'padding: 10px 14px',\n 'border-radius: 8px',\n 'font-size: 14px',\n 'line-height: 1.4',\n 'max-width: 300px',\n 'box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15)',\n 'opacity: 0',\n `transition: opacity ${transitionDuration}ms ease-out`,\n 'font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n ].join('; ');\n\n document.body.appendChild(tooltip);\n this.tooltipEl = tooltip;\n }\n\n // Set text content (NEVER innerHTML to prevent XSS)\n this.tooltipEl.textContent = text;\n\n // Add step indicator if in a tour\n if (this.tourSectionIds.length > 0 && this.tourCurrentStep >= 0) {\n const stepText = `Step ${this.tourCurrentStep + 1} of ${this.tourSectionIds.length}`;\n this.tooltipEl.textContent = `${stepText}: ${text}`;\n }\n\n // Set aria-describedby on the target\n const tooltipId = 'guidekit-tooltip-' + Date.now();\n this.tooltipEl.id = tooltipId;\n if (target instanceof HTMLElement) {\n target.setAttribute('aria-describedby', tooltipId);\n }\n\n // Position the tooltip\n const rect = target.getBoundingClientRect();\n const position = positionPref === 'auto'\n ? this.computeAutoPosition(rect)\n : positionPref;\n\n this.positionTooltip(rect, position);\n\n // Animate in\n void this.tooltipEl.offsetHeight;\n this.tooltipEl.style.opacity = '1';\n }\n\n /**\n * Remove the tooltip element from the DOM.\n */\n private removeTooltip(): void {\n if (this.tooltipEl?.parentNode) {\n this.tooltipEl.parentNode.removeChild(this.tooltipEl);\n }\n this.tooltipEl = null;\n }\n\n /**\n * Remove aria-describedby from the current target element.\n */\n private removeAriaDescribedBy(): void {\n if (this.currentTargetElement instanceof HTMLElement) {\n this.currentTargetElement.removeAttribute('aria-describedby');\n }\n }\n\n /**\n * Compute the best auto-position for the tooltip relative to the target rect.\n * Preference order: bottom, top, right, left.\n */\n private computeAutoPosition(rect: DOMRect): TooltipPosition {\n if (typeof window === 'undefined') return 'bottom';\n\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n\n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n const spaceRight = viewportWidth - rect.right;\n const spaceLeft = rect.left;\n\n const minSpace = 80; // Minimum space needed for tooltip\n\n // Prefer bottom\n if (spaceBelow >= minSpace) return 'bottom';\n // Then top\n if (spaceAbove >= minSpace) return 'top';\n // Then right\n if (spaceRight >= minSpace) return 'right';\n // Then left\n if (spaceLeft >= minSpace) return 'left';\n\n // Default to bottom even if tight\n return 'bottom';\n }\n\n /**\n * Position the tooltip element relative to the target rect.\n */\n private positionTooltip(rect: DOMRect, position: TooltipPosition): void {\n if (!this.tooltipEl || typeof window === 'undefined') return;\n\n const pad = this.spotlightPadding;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // We need the tooltip's dimensions. Force layout to measure.\n this.tooltipEl.style.left = '0px';\n this.tooltipEl.style.top = '0px';\n const tooltipRect = this.tooltipEl.getBoundingClientRect();\n const tw = tooltipRect.width;\n const th = tooltipRect.height;\n\n let left = 0;\n let top = 0;\n\n switch (position) {\n case 'bottom':\n left = rect.left + rect.width / 2 - tw / 2;\n top = rect.bottom + pad + TOOLTIP_ARROW_SIZE + TOOLTIP_MARGIN;\n break;\n case 'top':\n left = rect.left + rect.width / 2 - tw / 2;\n top = rect.top - pad - th - TOOLTIP_ARROW_SIZE - TOOLTIP_MARGIN;\n break;\n case 'right':\n left = rect.right + pad + TOOLTIP_ARROW_SIZE + TOOLTIP_MARGIN;\n top = rect.top + rect.height / 2 - th / 2;\n break;\n case 'left':\n left = rect.left - pad - tw - TOOLTIP_ARROW_SIZE - TOOLTIP_MARGIN;\n top = rect.top + rect.height / 2 - th / 2;\n break;\n }\n\n // Clamp within viewport\n left = Math.max(8, Math.min(left, viewportWidth - tw - 8));\n top = Math.max(8, Math.min(top, viewportHeight - th - 8));\n\n this.tooltipEl.style.left = `${left}px`;\n this.tooltipEl.style.top = `${top}px`;\n\n // Remove any existing arrow pseudo-element styling (via data attribute)\n this.tooltipEl.setAttribute('data-guidekit-position', position);\n\n // Apply arrow using a CSS trick with box-shadow on a pseudo :before\n // Since we can't use CSS stylesheets easily, we inline arrow via border trick\n this.applyTooltipArrow(position, rect);\n }\n\n /**\n * Apply an arrow on the tooltip pointing toward the target element.\n * Uses a child div with CSS border triangle technique.\n */\n private applyTooltipArrow(position: TooltipPosition, targetRect: DOMRect): void {\n if (!this.tooltipEl) return;\n\n // Remove any existing arrow\n const existingArrow = this.tooltipEl.querySelector('[data-guidekit-arrow]');\n if (existingArrow) {\n existingArrow.remove();\n }\n\n const arrow = document.createElement('div');\n arrow.setAttribute('data-guidekit-arrow', 'true');\n arrow.setAttribute('aria-hidden', 'true');\n\n const size = TOOLTIP_ARROW_SIZE;\n const baseStyle = [\n 'position: absolute',\n 'width: 0',\n 'height: 0',\n 'border-style: solid',\n ];\n\n switch (position) {\n case 'bottom':\n arrow.style.cssText = [\n ...baseStyle,\n `border-width: 0 ${size}px ${size}px ${size}px`,\n `border-color: transparent transparent #ffffff transparent`,\n `top: -${size}px`,\n `left: 50%`,\n `margin-left: -${size}px`,\n ].join('; ');\n // Adjust arrow horizontal position to point at target center\n this.adjustArrowHorizontal(arrow, targetRect, size);\n break;\n case 'top':\n arrow.style.cssText = [\n ...baseStyle,\n `border-width: ${size}px ${size}px 0 ${size}px`,\n `border-color: #ffffff transparent transparent transparent`,\n `bottom: -${size}px`,\n `left: 50%`,\n `margin-left: -${size}px`,\n ].join('; ');\n this.adjustArrowHorizontal(arrow, targetRect, size);\n break;\n case 'right':\n arrow.style.cssText = [\n ...baseStyle,\n `border-width: ${size}px ${size}px ${size}px 0`,\n `border-color: transparent #ffffff transparent transparent`,\n `left: -${size}px`,\n `top: 50%`,\n `margin-top: -${size}px`,\n ].join('; ');\n break;\n case 'left':\n arrow.style.cssText = [\n ...baseStyle,\n `border-width: ${size}px 0 ${size}px ${size}px`,\n `border-color: transparent transparent transparent #ffffff`,\n `right: -${size}px`,\n `top: 50%`,\n `margin-top: -${size}px`,\n ].join('; ');\n break;\n }\n\n this.tooltipEl.appendChild(arrow);\n }\n\n /**\n * Adjust arrow horizontal position so it points toward the target center\n * even when the tooltip is clamped to viewport edges.\n */\n private adjustArrowHorizontal(arrow: HTMLDivElement, targetRect: DOMRect, size: number): void {\n if (!this.tooltipEl) return;\n\n const tooltipRect = this.tooltipEl.getBoundingClientRect();\n const targetCenter = targetRect.left + targetRect.width / 2;\n const arrowLeft = targetCenter - tooltipRect.left;\n\n // Clamp arrow within tooltip bounds\n const minLeft = size + 4;\n const maxLeft = tooltipRect.width - size - 4;\n const clampedLeft = Math.max(minLeft, Math.min(arrowLeft, maxLeft));\n\n arrow.style.left = `${clampedLeft}px`;\n arrow.style.marginLeft = `0`;\n }\n\n // -------------------------------------------------------------------------\n // Private: Position tracking\n // -------------------------------------------------------------------------\n\n /**\n * Set up ResizeObserver and scroll listeners to track the target element\n * and update spotlight/tooltip positions.\n */\n private setupPositionTracking(target: Element): void {\n this.cleanupTrackingInfrastructure();\n\n // ResizeObserver\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => {\n this.updatePositions();\n });\n this.resizeObserver.observe(target);\n // Also observe body for layout changes\n if (typeof document !== 'undefined') {\n this.resizeObserver.observe(document.body);\n }\n }\n\n // Scroll listeners on all scrollable ancestors + window\n const scrollableAncestors = getScrollableAncestors(target);\n\n const handleScroll = (): void => {\n this.updatePositions();\n\n // In auto-tour mode, pause on user interaction\n if (this.tourMode === 'auto' && !this.tourPausedByInteraction) {\n this.tourPausedByInteraction = true;\n this.clearAutoTimer();\n // Resume after a delay\n this.tourAutoTimer = setTimeout(() => {\n this.tourPausedByInteraction = false;\n this.scheduleAutoAdvance();\n }, AUTO_TOUR_INTERVAL_MS);\n }\n };\n\n // Attach to each scrollable ancestor\n for (const ancestor of scrollableAncestors) {\n ancestor.addEventListener('scroll', handleScroll, { passive: true });\n this.scrollListenerCleanups.push(() => {\n ancestor.removeEventListener('scroll', handleScroll);\n });\n }\n\n // Always attach to window for document-level scroll\n if (typeof window !== 'undefined') {\n window.addEventListener('scroll', handleScroll, { passive: true });\n this.scrollListenerCleanups.push(() => {\n window.removeEventListener('scroll', handleScroll);\n });\n\n // Also listen for window resize\n window.addEventListener('resize', handleScroll, { passive: true });\n this.scrollListenerCleanups.push(() => {\n window.removeEventListener('resize', handleScroll);\n });\n }\n }\n\n /**\n * Remove all tracking observers and event listeners.\n */\n private cleanupTrackingInfrastructure(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n\n for (const cleanup of this.scrollListenerCleanups) {\n cleanup();\n }\n this.scrollListenerCleanups = [];\n }\n\n /**\n * Update spotlight and tooltip positions based on the current target\n * element's bounding rect.\n */\n private updatePositions(): void {\n if (!this.currentTargetElement) return;\n\n const rect = this.currentTargetElement.getBoundingClientRect();\n const hasSize = rect.width > 0 && rect.height > 0;\n\n if (hasSize && this.spotlightEl) {\n this.positionSpotlight(rect);\n }\n\n if (this.tooltipEl && this._state.tooltip) {\n const position = this.tooltipEl.getAttribute('data-guidekit-position') as TooltipPosition | null;\n this.positionTooltip(rect, position ?? 'bottom');\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Smooth scrolling\n // -------------------------------------------------------------------------\n\n /**\n * Scroll to an element, respecting reduced motion preferences.\n */\n private scrollToElement(target: Element, offset?: number): void {\n if (typeof window === 'undefined') return;\n\n const behavior = prefersReducedMotion() ? 'instant' as ScrollBehavior : 'smooth';\n\n if (offset !== undefined && offset !== 0) {\n // Use window.scrollTo with calculated position for header offset\n const rect = target.getBoundingClientRect();\n const scrollTop = window.pageYOffset ?? document.documentElement.scrollTop;\n const targetTop = rect.top + scrollTop - offset;\n\n window.scrollTo({\n top: targetTop,\n behavior,\n });\n } else {\n target.scrollIntoView({\n behavior,\n block: 'center',\n });\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Tour logic\n // -------------------------------------------------------------------------\n\n /**\n * Execute the current tour step: scroll to and highlight the section.\n */\n private executeTourStep(): void {\n if (this.tourCurrentStep < 0 || this.tourCurrentStep >= this.tourSectionIds.length) {\n return;\n }\n\n const sectionId = this.tourSectionIds[this.tourCurrentStep] as string | undefined;\n if (!sectionId) return;\n\n const total = this.tourSectionIds.length;\n const step = this.tourCurrentStep;\n\n // Scroll to the section first\n this.scrollToSection(sectionId);\n\n // Slight delay to let scroll settle, then highlight\n // Use a timeout so scrollIntoView can initiate\n setTimeout(() => {\n if (this.destroyed) return;\n\n const tooltipText = `Step ${step + 1} of ${total}`;\n\n this.highlight({\n sectionId,\n tooltip: tooltipText,\n position: 'auto',\n });\n\n // Notify tour step subscribers\n for (const cb of this.tourStepCallbacks) {\n try {\n cb(step, total, sectionId);\n } catch (e) {\n this.log('Tour step callback error', { error: String(e) });\n }\n }\n\n // Schedule auto-advance if in auto mode\n if (this.tourMode === 'auto') {\n this.scheduleAutoAdvance();\n }\n }, 100);\n }\n\n /**\n * Schedule auto-advance to the next tour step.\n */\n private scheduleAutoAdvance(): void {\n this.clearAutoTimer();\n\n if (this.tourMode !== 'auto') return;\n if (this.tourPausedByInteraction) return;\n\n this.tourAutoTimer = setTimeout(() => {\n if (!this.destroyed && !this.tourPausedByInteraction) {\n this.nextTourStep();\n }\n }, AUTO_TOUR_INTERVAL_MS);\n }\n\n /**\n * Clear the auto-advance timer.\n */\n private clearAutoTimer(): void {\n if (this.tourAutoTimer !== null) {\n clearTimeout(this.tourAutoTimer);\n this.tourAutoTimer = null;\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Accessibility — aria-live announcements\n // -------------------------------------------------------------------------\n\n /**\n * Announce a message to screen readers via an aria-live region.\n */\n private announce(message: string): void {\n if (typeof document === 'undefined') return;\n\n if (!this.liveRegionEl) {\n const region = document.createElement('div');\n region.setAttribute('aria-live', 'assertive');\n region.setAttribute('aria-atomic', 'true');\n region.setAttribute('data-guidekit-live', 'true');\n region.style.cssText = [\n 'position: absolute',\n 'width: 1px',\n 'height: 1px',\n 'padding: 0',\n 'margin: -1px',\n 'overflow: hidden',\n 'clip: rect(0, 0, 0, 0)',\n 'white-space: nowrap',\n 'border: 0',\n ].join('; ');\n document.body.appendChild(region);\n this.liveRegionEl = region;\n }\n\n // Clear and re-set to trigger announcement\n this.liveRegionEl.textContent = '';\n // Use a microtask to ensure the DOM update is flushed before re-setting\n requestAnimationFrame(() => {\n if (this.liveRegionEl) {\n this.liveRegionEl.textContent = message;\n }\n });\n }\n\n // -------------------------------------------------------------------------\n // Private: Subscriber notifications\n // -------------------------------------------------------------------------\n\n private notifySpotlightChange(): void {\n const stateCopy = this.state;\n for (const cb of this.spotlightChangeCallbacks) {\n try {\n cb(stateCopy);\n } catch (e) {\n this.log('Spotlight change callback error', { error: String(e) });\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // Private: Utilities\n // -------------------------------------------------------------------------\n\n /**\n * Get the transition duration, respecting prefers-reduced-motion.\n */\n private getTransitionDuration(): number {\n return prefersReducedMotion() ? 0 : this.animationDuration;\n }\n\n /**\n * Debug logger.\n */\n private log(message: string, data?: Record<string, unknown>): void {\n if (!this.debug) return;\n if (typeof console !== 'undefined') {\n if (data) {\n console.log(`${LOG_PREFIX} ${message}`, data);\n } else {\n console.log(`${LOG_PREFIX} ${message}`);\n }\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – User Awareness System\n// ---------------------------------------------------------------------------\n// Monitors user behavior signals (scroll, dwell, idle, rage-click, section\n// visibility) and emits awareness events via the EventBus.\n// ---------------------------------------------------------------------------\n\nimport { EventBus } from '../bus/index.js';\n\nconst LOG_PREFIX = '[GuideKit:Awareness]';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_IDLE_TIMEOUT_MS = 60_000;\nconst DEFAULT_DWELL_TIMEOUT_MS = 8_000;\nconst DEFAULT_RAGE_CLICK_THRESHOLD = 3;\nconst DEFAULT_RAGE_CLICK_WINDOW_MS = 2_000;\nconst RAGE_CLICK_RADIUS_PX = 50;\nconst MOUSE_THROTTLE_MS = 200;\n\n/** Selectors used to discover observable sections. */\nconst SECTION_SELECTOR = [\n '[data-guidekit-target]',\n '[id]',\n 'main',\n 'section',\n 'article',\n 'aside',\n 'nav',\n 'header',\n 'footer',\n].join(', ');\n\n/** IntersectionObserver thresholds for section visibility. */\nconst IO_THRESHOLDS: number[] = [0, 0.25, 0.5, 0.75, 1.0];\n\n// ---------------------------------------------------------------------------\n// Exported types\n// ---------------------------------------------------------------------------\n\nexport interface AwarenessOptions {\n bus: EventBus;\n rootElement?: HTMLElement;\n idleTimeoutMs?: number;\n dwellTimeoutMs?: number;\n rageClickThreshold?: number;\n rageClickWindowMs?: number;\n debug?: boolean;\n}\n\nexport interface AwarenessState {\n scrollPercent: number;\n scrollDirection: 'up' | 'down' | 'none';\n focusedSectionId: string | null;\n focusedSectionDwellMs: number;\n isIdle: boolean;\n lastInteractionAt: number;\n visibleSections: Map<string, number>;\n}\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\ninterface ClickRecord {\n x: number;\n y: number;\n timestamp: number;\n target: Element;\n}\n\n// ---------------------------------------------------------------------------\n// AwarenessSystem\n// ---------------------------------------------------------------------------\n\n/**\n * Observes user interactions with the page and emits structured awareness\n * events on the shared {@link EventBus}.\n *\n * All browser API usage is gated behind `typeof window !== 'undefined'` so\n * the module can be safely imported in SSR contexts.\n */\nexport class AwarenessSystem {\n // ---- Configuration ------------------------------------------------------\n\n private readonly bus: EventBus;\n private readonly rootElement: HTMLElement | undefined;\n private readonly idleTimeoutMs: number;\n private readonly dwellTimeoutMs: number;\n private readonly rageClickThreshold: number;\n private readonly rageClickWindowMs: number;\n private readonly debugEnabled: boolean;\n\n // ---- Runtime state ------------------------------------------------------\n\n private running = false;\n\n /** AbortController whose signal is passed to every addEventListener call. */\n private abortController: AbortController | null = null;\n\n /** IntersectionObserver for section visibility tracking. */\n private sectionObserver: IntersectionObserver | null = null;\n\n /** Section id -> current visibility ratio. */\n private readonly visibleSections = new Map<string, number>();\n\n // ---- Scroll tracking ----------------------------------------------------\n\n private scrollPercent = 0;\n private scrollDirection: 'up' | 'down' | 'none' = 'none';\n private lastScrollY = 0;\n private scrollRafPending = false;\n\n // ---- Dwell detection ----------------------------------------------------\n\n private focusedSectionId: string | null = null;\n private focusedSectionSince = 0;\n private dwellTimer: ReturnType<typeof setInterval> | null = null;\n private dwellEmitted = false;\n\n // ---- Idle detection -----------------------------------------------------\n\n private lastInteractionAt = 0;\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\n private isIdle = false;\n\n // ---- Rage click detection -----------------------------------------------\n\n private readonly recentClicks: ClickRecord[] = [];\n\n // ---- Mouse throttle -----------------------------------------------------\n\n private lastMouseMoveAt = 0;\n\n // -----------------------------------------------------------------------\n // Constructor\n // -----------------------------------------------------------------------\n\n constructor(options: AwarenessOptions) {\n this.bus = options.bus;\n this.rootElement = options.rootElement;\n this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;\n this.dwellTimeoutMs = options.dwellTimeoutMs ?? DEFAULT_DWELL_TIMEOUT_MS;\n this.rageClickThreshold = options.rageClickThreshold ?? DEFAULT_RAGE_CLICK_THRESHOLD;\n this.rageClickWindowMs = options.rageClickWindowMs ?? DEFAULT_RAGE_CLICK_WINDOW_MS;\n this.debugEnabled = options.debug ?? false;\n\n this.log('AwarenessSystem created');\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /** Begin observing user behavior. No-op if already running or in SSR. */\n start(): void {\n if (this.running) return;\n if (typeof window === 'undefined') {\n this.log('SSR environment detected — start() is a no-op');\n return;\n }\n\n this.running = true;\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n\n this.lastInteractionAt = Date.now();\n this.lastScrollY = window.scrollY;\n\n // -- Event listeners (all using the shared AbortController signal) -----\n const listenerOpts = { signal, passive: true } as const;\n\n window.addEventListener('scroll', this.handleScroll, listenerOpts);\n window.addEventListener('mousemove', this.handleMouseMove, listenerOpts);\n window.addEventListener('keydown', this.handleInteraction, listenerOpts);\n window.addEventListener('click', this.handleClick, { signal });\n window.addEventListener('touchstart', this.handleInteraction, listenerOpts);\n window.addEventListener('touchend', this.handleInteraction, listenerOpts);\n\n // -- IntersectionObserver for sections ---------------------------------\n this.initSectionObserver();\n\n // -- Idle timer --------------------------------------------------------\n this.scheduleIdleTimer();\n\n // -- Dwell check interval ---------------------------------------------\n this.dwellTimer = setInterval(this.checkDwell, 1_000);\n\n this.log('Monitoring started');\n }\n\n /** Stop all observers and listeners. */\n stop(): void {\n if (!this.running) return;\n\n this.running = false;\n\n // Abort all listeners in one call.\n this.abortController?.abort();\n this.abortController = null;\n\n // Tear down IntersectionObserver.\n if (this.sectionObserver) {\n this.sectionObserver.disconnect();\n this.sectionObserver = null;\n }\n\n // Clear timers.\n this.clearIdleTimer();\n this.clearDwellTimer();\n\n // Reset state.\n this.visibleSections.clear();\n this.recentClicks.length = 0;\n this.focusedSectionId = null;\n this.focusedSectionSince = 0;\n this.dwellEmitted = false;\n this.isIdle = false;\n this.scrollPercent = 0;\n this.scrollDirection = 'none';\n this.scrollRafPending = false;\n\n this.log('Monitoring stopped');\n }\n\n /** Alias for {@link stop}. */\n destroy(): void {\n this.stop();\n }\n\n /** Return a snapshot of the current awareness state. */\n getState(): AwarenessState {\n const now = Date.now();\n const dwellMs =\n this.focusedSectionId !== null\n ? now - this.focusedSectionSince\n : 0;\n\n return {\n scrollPercent: this.scrollPercent,\n scrollDirection: this.scrollDirection,\n focusedSectionId: this.focusedSectionId,\n focusedSectionDwellMs: dwellMs,\n isIdle: this.isIdle,\n lastInteractionAt: this.lastInteractionAt,\n visibleSections: new Map(this.visibleSections),\n };\n }\n\n // -----------------------------------------------------------------------\n // Scroll tracking\n // -----------------------------------------------------------------------\n\n private readonly handleScroll = (): void => {\n this.recordInteraction();\n\n if (this.scrollRafPending) return;\n this.scrollRafPending = true;\n\n requestAnimationFrame(() => {\n this.scrollRafPending = false;\n if (!this.running) return;\n\n const y = window.scrollY;\n const maxScroll = document.documentElement.scrollHeight - window.innerHeight;\n this.scrollPercent = maxScroll > 0 ? Math.min(1, y / maxScroll) : 0;\n\n if (y > this.lastScrollY) {\n this.scrollDirection = 'down';\n } else if (y < this.lastScrollY) {\n this.scrollDirection = 'up';\n }\n // If y === lastScrollY, keep the current direction.\n\n this.lastScrollY = y;\n });\n };\n\n // -----------------------------------------------------------------------\n // Mouse tracking (throttled)\n // -----------------------------------------------------------------------\n\n private readonly handleMouseMove = (): void => {\n const now = Date.now();\n if (now - this.lastMouseMoveAt < MOUSE_THROTTLE_MS) return;\n this.lastMouseMoveAt = now;\n\n this.recordInteraction();\n };\n\n // -----------------------------------------------------------------------\n // Click tracking & rage click detection\n // -----------------------------------------------------------------------\n\n private readonly handleClick = (e: Event): void => {\n this.recordInteraction();\n\n const mouseEvent = e as MouseEvent;\n const target = mouseEvent.target as Element | null;\n if (!target) return;\n\n const now = Date.now();\n const record: ClickRecord = {\n x: mouseEvent.clientX,\n y: mouseEvent.clientY,\n timestamp: now,\n target,\n };\n\n this.recentClicks.push(record);\n\n // Prune clicks outside the rage-click time window.\n const windowStart = now - this.rageClickWindowMs;\n while (this.recentClicks.length > 0 && this.recentClicks[0]!.timestamp < windowStart) {\n this.recentClicks.shift();\n }\n\n // Check for rage clicks: N+ clicks within the window on the same\n // element or within a small radius.\n const nearby = this.recentClicks.filter((c) => {\n const sameElement = c.target === target;\n const dx = c.x - record.x;\n const dy = c.y - record.y;\n const withinRadius = Math.sqrt(dx * dx + dy * dy) <= RAGE_CLICK_RADIUS_PX;\n return sameElement || withinRadius;\n });\n\n if (nearby.length >= this.rageClickThreshold) {\n const selector = this.buildSelector(target);\n this.bus.emit('awareness:rage-click', {\n selector,\n clicks: nearby.length,\n });\n this.log(`Rage click detected (${nearby.length} clicks) on \"${selector}\"`);\n\n // Clear clicks so we don't keep re-emitting for the same burst.\n this.recentClicks.length = 0;\n }\n };\n\n // -----------------------------------------------------------------------\n // Generic interaction handler (touch, keydown)\n // -----------------------------------------------------------------------\n\n private readonly handleInteraction = (): void => {\n this.recordInteraction();\n };\n\n // -----------------------------------------------------------------------\n // Interaction bookkeeping (shared by all handlers)\n // -----------------------------------------------------------------------\n\n private recordInteraction(): void {\n this.lastInteractionAt = Date.now();\n\n // If user was idle, mark active again and reset idle timer.\n if (this.isIdle) {\n this.isIdle = false;\n this.log('User returned from idle');\n }\n\n this.scheduleIdleTimer();\n }\n\n // -----------------------------------------------------------------------\n // Idle detection\n // -----------------------------------------------------------------------\n\n private scheduleIdleTimer(): void {\n this.clearIdleTimer();\n\n this.idleTimer = setTimeout(() => {\n if (!this.running) return;\n\n this.isIdle = true;\n const durationMs = Date.now() - this.lastInteractionAt;\n\n this.bus.emit('awareness:idle', { durationMs });\n this.log(`User idle for ${durationMs}ms`);\n }, this.idleTimeoutMs);\n }\n\n private clearIdleTimer(): void {\n if (this.idleTimer !== null) {\n clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n }\n\n // -----------------------------------------------------------------------\n // Dwell detection\n // -----------------------------------------------------------------------\n\n /**\n * Periodically (every 1s) check whether the user has been focused on the\n * same section long enough to trigger a dwell event.\n */\n private readonly checkDwell = (): void => {\n if (!this.running) return;\n\n // Determine the section with the highest visibility ratio.\n let bestId: string | null = null;\n let bestRatio = 0;\n\n for (const [id, ratio] of this.visibleSections) {\n if (ratio > bestRatio) {\n bestRatio = ratio;\n bestId = id;\n }\n }\n\n // If the focused section changed, reset the dwell tracker.\n if (bestId !== this.focusedSectionId) {\n this.focusedSectionId = bestId;\n this.focusedSectionSince = Date.now();\n this.dwellEmitted = false;\n return;\n }\n\n // If we have a focused section and haven't emitted yet, check duration.\n if (this.focusedSectionId !== null && !this.dwellEmitted) {\n const dwellMs = Date.now() - this.focusedSectionSince;\n if (dwellMs >= this.dwellTimeoutMs) {\n this.dwellEmitted = true;\n this.bus.emit('awareness:dwell', {\n sectionId: this.focusedSectionId,\n durationMs: dwellMs,\n });\n this.log(`Dwell on \"${this.focusedSectionId}\" (${dwellMs}ms)`);\n }\n }\n };\n\n private clearDwellTimer(): void {\n if (this.dwellTimer !== null) {\n clearInterval(this.dwellTimer);\n this.dwellTimer = null;\n }\n }\n\n // -----------------------------------------------------------------------\n // IntersectionObserver — section visibility\n // -----------------------------------------------------------------------\n\n private initSectionObserver(): void {\n if (typeof IntersectionObserver === 'undefined') {\n this.log('IntersectionObserver not available — section tracking disabled');\n return;\n }\n\n this.sectionObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const sectionId = this.getSectionId(entry.target);\n if (!sectionId) continue;\n\n const ratio = Math.round(entry.intersectionRatio * 100) / 100;\n const previous = this.visibleSections.get(sectionId);\n\n if (previous === ratio) continue;\n\n if (ratio === 0) {\n this.visibleSections.delete(sectionId);\n } else {\n this.visibleSections.set(sectionId, ratio);\n }\n\n this.bus.emit('awareness:section-visible', {\n sectionId,\n ratio,\n });\n }\n },\n {\n root: this.rootElement ?? null,\n threshold: IO_THRESHOLDS,\n },\n );\n\n this.observeSections();\n }\n\n /**\n * Query the DOM for observable sections and start observing them.\n */\n private observeSections(): void {\n if (!this.sectionObserver) return;\n\n const root = this.rootElement ?? document;\n const elements = root.querySelectorAll(SECTION_SELECTOR);\n\n if (elements.length === 0) {\n this.log('No observable sections found');\n return;\n }\n\n for (const el of elements) {\n this.sectionObserver.observe(el);\n }\n\n this.log(`Observing ${elements.length} section(s)`);\n }\n\n // -----------------------------------------------------------------------\n // Helpers\n // -----------------------------------------------------------------------\n\n /**\n * Derive a stable string identifier for a DOM element used as a section.\n *\n * Priority: `data-guidekit-target` > `id` > tagName.\n */\n private getSectionId(el: Element): string | null {\n const guidekitTarget = el.getAttribute('data-guidekit-target');\n if (guidekitTarget) return guidekitTarget;\n\n const id = el.getAttribute('id');\n if (id) return `#${id}`;\n\n // For semantic landmarks, use the tag name (lowercase).\n const tag = el.tagName.toLowerCase();\n const landmarks = ['main', 'section', 'article', 'aside', 'nav', 'header', 'footer'];\n if (landmarks.includes(tag)) return tag;\n\n return null;\n }\n\n /**\n * Build a simple CSS selector string for an element, suitable for\n * inclusion in rage-click events.\n */\n private buildSelector(el: Element): string {\n // Prefer id.\n if (el.id) return `#${el.id}`;\n\n // data-guidekit-target\n const target = el.getAttribute('data-guidekit-target');\n if (target) return `[data-guidekit-target=\"${target}\"]`;\n\n // Construct a tag.class selector.\n const tag = el.tagName.toLowerCase();\n const classes = Array.from(el.classList)\n .slice(0, 3) // Limit to avoid absurdly long selectors\n .map((c) => `.${c}`)\n .join('');\n\n return `${tag}${classes}`;\n }\n\n /** Conditional debug logging. */\n private log(...args: unknown[]): void {\n if (this.debugEnabled) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Proactive Trigger Engine\n// ---------------------------------------------------------------------------\n// Listens to awareness events on the EventBus and decides when to\n// proactively engage the user. The engine itself never shows UI or sends\n// LLM messages — it communicates via the `onTrigger` callback so the core\n// orchestrator can decide what action to take.\n// ---------------------------------------------------------------------------\n\nimport { EventBus } from '../bus/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:Proactive]';\nconst STORAGE_KEY = 'guidekit:visited';\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\n/** Progressive dwell cooldowns in ms: 30s → 60s → 120s → stop. */\nconst DWELL_COOLDOWNS = [30_000, 60_000, 120_000];\nconst DWELL_THRESHOLD_MS = 8_000;\nconst IDLE_THRESHOLD_MS = 60_000;\nconst NAVIGATION_COOLDOWN_MS = 30_000;\nconst FORM_ABANDON_MS = 15_000;\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface ProactiveOptions {\n bus: EventBus;\n debug?: boolean;\n /** Callback invoked whenever a proactive trigger fires. */\n onTrigger?: (trigger: ProactiveTrigger) => void;\n}\n\nexport type ProactiveTriggerType =\n | 'greeting'\n | 'idle-help'\n | 'dwell-commentary'\n | 'navigation-commentary'\n | 'frustration'\n | 'form-abandonment';\n\nexport interface ProactiveTrigger {\n type: ProactiveTriggerType;\n sectionId?: string;\n selector?: string;\n /** Suggested context message for the LLM. */\n message?: string;\n timestamp: number;\n}\n\n// ---------------------------------------------------------------------------\n// ProactiveTriggerEngine\n// ---------------------------------------------------------------------------\n\nexport class ProactiveTriggerEngine {\n private readonly bus: EventBus;\n private readonly debug: boolean;\n private readonly onTrigger?: (trigger: ProactiveTrigger) => void;\n\n /** Collected unsubscribe functions from bus.on(). */\n private unsubs: Array<() => void> = [];\n\n /** Cooldown map: trigger key → last-fired timestamp. */\n private cooldowns = new Map<string, number>();\n\n /** Progressive dwell: sectionId → number of times triggered. */\n private dwellCounts = new Map<string, number>();\n\n /** Track forms the user started interacting with. */\n private formTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n /** Track sections where frustration already fired (once per section). */\n private frustrationFired = new Set<string>();\n\n /** Track whether idle-help has fired on this page. */\n private idleFiredThisPage = false;\n\n private _quietMode = false;\n private started = false;\n\n constructor(options: ProactiveOptions) {\n this.bus = options.bus;\n this.debug = options.debug ?? false;\n this.onTrigger = options.onTrigger;\n }\n\n // ---- quietMode accessor -------------------------------------------------\n\n get quietMode(): boolean {\n return this._quietMode;\n }\n\n set quietMode(value: boolean) {\n this._quietMode = value;\n if (this.debug) {\n console.debug(LOG_PREFIX, `Quiet mode ${value ? 'enabled' : 'disabled'}`);\n }\n }\n\n // ---- Lifecycle -----------------------------------------------------------\n\n /** Subscribe to bus events and check for first-visit greeting. */\n start(): void {\n if (this.started) return;\n this.started = true;\n\n this.checkFirstVisitGreeting();\n\n // awareness:idle\n this.unsubs.push(\n this.bus.on('awareness:idle', (data) => {\n this.handleIdle(data.durationMs);\n }),\n );\n\n // awareness:dwell\n this.unsubs.push(\n this.bus.on('awareness:dwell', (data) => {\n this.handleDwell(data.sectionId, data.durationMs);\n }),\n );\n\n // awareness:rage-click\n this.unsubs.push(\n this.bus.on('awareness:rage-click', (data) => {\n this.handleRageClick(data.selector, data.clicks);\n }),\n );\n\n // dom:route-change — used for navigation commentary + page reset\n this.unsubs.push(\n this.bus.on('dom:route-change', (data) => {\n this.handleDomRouteChange(data.from, data.to);\n }),\n );\n\n if (this.debug) {\n console.debug(LOG_PREFIX, 'Started — subscribed to awareness & dom events');\n }\n }\n\n /** Unsubscribe all bus listeners and clear internal state. */\n stop(): void {\n for (const unsub of this.unsubs) {\n unsub();\n }\n this.unsubs = [];\n\n // Clear any pending form-abandonment timers\n for (const timer of this.formTimers.values()) {\n clearTimeout(timer);\n }\n this.formTimers.clear();\n\n this.started = false;\n\n if (this.debug) {\n console.debug(LOG_PREFIX, 'Stopped — all listeners removed');\n }\n }\n\n /** Alias for {@link stop}. */\n destroy(): void {\n this.stop();\n }\n\n // ---- External notifications ---------------------------------------------\n\n /**\n * Notify the engine about a route change.\n * Called from the NavigationController or externally.\n */\n onRouteChange(from: string, to: string): void {\n this.handleNavigation(from, to);\n }\n\n /**\n * Notify the engine that the user started interacting with a form.\n * If the user does not continue within {@link FORM_ABANDON_MS}, a\n * `form-abandonment` trigger fires (once per form).\n */\n onFormInteractionStart(formSelector: string): void {\n // If there is already a timer for this form, reset it\n const existing = this.formTimers.get(formSelector);\n if (existing) {\n clearTimeout(existing);\n }\n\n const timer = setTimeout(() => {\n this.formTimers.delete(formSelector);\n this.fireTrigger({\n type: 'form-abandonment',\n selector: formSelector,\n message: `User started a form (${formSelector}) but stopped interacting for ${FORM_ABANDON_MS / 1000}s. They may need help.`,\n }, `form-abandonment:${formSelector}`);\n }, FORM_ABANDON_MS);\n\n this.formTimers.set(formSelector, timer);\n\n if (this.debug) {\n console.debug(LOG_PREFIX, `Form interaction started: ${formSelector}`);\n }\n }\n\n /** Reset all cooldowns and internal tracking state (useful for testing). */\n resetCooldowns(): void {\n this.cooldowns.clear();\n this.dwellCounts.clear();\n this.frustrationFired.clear();\n this.idleFiredThisPage = false;\n\n for (const timer of this.formTimers.values()) {\n clearTimeout(timer);\n }\n this.formTimers.clear();\n\n if (this.debug) {\n console.debug(LOG_PREFIX, 'All cooldowns and state reset');\n }\n }\n\n // ---- Internal handlers ---------------------------------------------------\n\n private checkFirstVisitGreeting(): void {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return;\n }\n\n try {\n const visited = localStorage.getItem(STORAGE_KEY);\n\n if (visited === null) {\n // First visit ever — fire greeting\n localStorage.setItem(STORAGE_KEY, Date.now().toString());\n\n this.fireTrigger({\n type: 'greeting',\n message: 'First-time visitor detected. Show a visual greeting (no audio).',\n }, 'greeting');\n\n if (this.debug) {\n console.debug(LOG_PREFIX, 'First visit — greeting triggered');\n }\n return;\n }\n\n // Return visitor — check if within 7 days\n const visitedAt = parseInt(visited, 10);\n if (Number.isNaN(visitedAt)) {\n // Stored timestamp is corrupt — skip return-visitor logic\n return;\n }\n\n const elapsed = Date.now() - visitedAt;\n if (elapsed <= SEVEN_DAYS_MS && this.debug) {\n console.debug(LOG_PREFIX, 'Return visitor within 7 days — silent');\n } else if (this.debug) {\n console.debug(LOG_PREFIX, 'Return visitor after 7 days');\n }\n } catch {\n // localStorage may be unavailable (e.g. iframe sandbox)\n if (this.debug) {\n console.warn(LOG_PREFIX, 'localStorage unavailable — skipping greeting check');\n }\n }\n }\n\n private handleIdle(durationMs: number): void {\n if (durationMs < IDLE_THRESHOLD_MS) return;\n if (this.idleFiredThisPage) return;\n\n this.idleFiredThisPage = true;\n\n this.fireTrigger({\n type: 'idle-help',\n message: `User has been idle for ${Math.round(durationMs / 1000)}s. They may be stuck or unsure what to do next.`,\n }, 'idle-help');\n }\n\n private handleDwell(sectionId: string, durationMs: number): void {\n if (durationMs < DWELL_THRESHOLD_MS) return;\n\n const count = this.dwellCounts.get(sectionId) ?? 0;\n\n // After 4 dwell triggers for the same section, stop entirely\n if (count >= DWELL_COOLDOWNS.length + 1) {\n if (this.debug) {\n console.debug(LOG_PREFIX, `Dwell cap reached for section \"${sectionId}\" — suppressed`);\n }\n return;\n }\n\n // Check progressive cooldown\n if (count > 0) {\n const cooldownMs = DWELL_COOLDOWNS[Math.min(count - 1, DWELL_COOLDOWNS.length - 1)]!;\n const key = `dwell:${sectionId}`;\n const lastFired = this.cooldowns.get(key) ?? 0;\n\n if (Date.now() - lastFired < cooldownMs) {\n if (this.debug) {\n console.debug(LOG_PREFIX, `Dwell cooldown active for \"${sectionId}\" — suppressed`);\n }\n return;\n }\n }\n\n this.dwellCounts.set(sectionId, count + 1);\n\n this.fireTrigger({\n type: 'dwell-commentary',\n sectionId,\n message: `User has been dwelling on section \"${sectionId}\" for ${Math.round(durationMs / 1000)}s. They may need more context.`,\n }, `dwell:${sectionId}`);\n }\n\n private handleRageClick(selector: string, clicks: number): void {\n // Derive a \"section\" key from the selector for once-per-section tracking\n const sectionKey = selector;\n\n if (this.frustrationFired.has(sectionKey)) {\n if (this.debug) {\n console.debug(LOG_PREFIX, `Frustration already fired for \"${selector}\" — suppressed`);\n }\n return;\n }\n\n this.frustrationFired.add(sectionKey);\n\n this.fireTrigger({\n type: 'frustration',\n selector,\n message: `User rage-clicked (${clicks} clicks) on \"${selector}\". They seem frustrated — offer help.`,\n }, `frustration:${sectionKey}`);\n }\n\n private handleNavigation(from: string, to: string): void {\n // Reset per-page cooldowns on page change\n this.idleFiredThisPage = false;\n\n const key = 'navigation-commentary';\n if (this.isCooldownActive(key, NAVIGATION_COOLDOWN_MS)) {\n if (this.debug) {\n console.debug(LOG_PREFIX, 'Navigation cooldown active — suppressed');\n }\n return;\n }\n\n this.fireTrigger({\n type: 'navigation-commentary',\n message: `User navigated from \"${from}\" to \"${to}\". Offer context about the new page.`,\n }, key);\n }\n\n /**\n * Handler for the bus `dom:route-change` event.\n * Delegates to the shared navigation logic.\n */\n private handleDomRouteChange(from: string, to: string): void {\n this.handleNavigation(from, to);\n }\n\n // ---- Trigger dispatch ----------------------------------------------------\n\n /**\n * Fire a trigger if quiet mode is off, recording the cooldown timestamp.\n */\n private fireTrigger(\n partial: Omit<ProactiveTrigger, 'timestamp'>,\n cooldownKey: string,\n ): void {\n if (this._quietMode) {\n if (this.debug) {\n console.debug(LOG_PREFIX, `Quiet mode — suppressed trigger: ${partial.type}`);\n }\n return;\n }\n\n const trigger: ProactiveTrigger = {\n ...partial,\n timestamp: Date.now(),\n };\n\n this.cooldowns.set(cooldownKey, trigger.timestamp);\n\n if (this.debug) {\n console.debug(LOG_PREFIX, 'Trigger fired:', trigger.type, trigger);\n }\n\n if (this.onTrigger) {\n try {\n this.onTrigger(trigger);\n } catch (err) {\n console.error(LOG_PREFIX, 'onTrigger callback error:', err);\n }\n }\n }\n\n // ---- Cooldown helpers ----------------------------------------------------\n\n private isCooldownActive(key: string, cooldownMs: number): boolean {\n const lastFired = this.cooldowns.get(key);\n if (lastFired === undefined) return false;\n return Date.now() - lastFired < cooldownMs;\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Client-Side Rate Limiter\n// ---------------------------------------------------------------------------\n//\n// Cost-protection guardrails. These limits are trivially bypassable and exist\n// solely to:\n// 1. Protect users from unexpected costs on BYOK keys\n// 2. Prevent runaway SDK loops from burning through API quotas\n//\n// NOT a security measure — documented as \"cost protection, not security\".\n// ---------------------------------------------------------------------------\n\nimport { EventBus } from '../bus/index.js';\nimport {\n ResourceExhaustedError,\n ErrorCodes,\n} from '../errors/index.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst LOG_PREFIX = '[GuideKit:RateLimiter]';\n\nconst DEFAULT_MAX_LLM_CALLS_PER_MINUTE = 10;\nconst DEFAULT_MAX_STT_MINUTES_PER_SESSION = 60;\nconst DEFAULT_MAX_TTS_CHARS_PER_SESSION = 50_000;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface RateLimits {\n maxLLMCallsPerMinute?: number;\n maxSTTMinutesPerSession?: number;\n maxTTSCharsPerSession?: number;\n}\n\nexport interface RateLimiterOptions {\n bus?: EventBus;\n limits?: RateLimits;\n debug?: boolean;\n}\n\nexport interface RateLimiterState {\n llmCallsInWindow: number;\n sttMinutesUsed: number;\n ttsCharsUsed: number;\n llmWindowStart: number;\n}\n\n// ---------------------------------------------------------------------------\n// RateLimiter\n// ---------------------------------------------------------------------------\n\nexport class RateLimiter {\n private readonly bus: EventBus | null;\n private readonly debug: boolean;\n\n // Configurable limits\n private maxLLMCallsPerMinute: number;\n private maxSTTMinutesPerSession: number;\n private maxTTSCharsPerSession: number;\n\n // LLM: sliding window (timestamps of recent calls)\n private llmCallTimestamps: number[] = [];\n\n // STT: cumulative session total (milliseconds for precision)\n private sttMs = 0;\n private sttStartedAt: number | null = null;\n\n // TTS: cumulative session total (characters)\n private ttsChars = 0;\n\n constructor(options?: RateLimiterOptions) {\n this.bus = options?.bus ?? null;\n this.debug = options?.debug ?? false;\n\n const limits = options?.limits;\n this.maxLLMCallsPerMinute =\n limits?.maxLLMCallsPerMinute ?? DEFAULT_MAX_LLM_CALLS_PER_MINUTE;\n this.maxSTTMinutesPerSession =\n limits?.maxSTTMinutesPerSession ?? DEFAULT_MAX_STT_MINUTES_PER_SESSION;\n this.maxTTSCharsPerSession =\n limits?.maxTTSCharsPerSession ?? DEFAULT_MAX_TTS_CHARS_PER_SESSION;\n }\n\n // -------------------------------------------------------------------------\n // LLM rate limiting\n // -------------------------------------------------------------------------\n\n /**\n * Check whether an LLM call is allowed. If allowed, records the call.\n * Throws `ResourceExhaustedError` if the limit is exceeded.\n */\n checkLLMCall(): void {\n const now = Date.now();\n const windowStart = now - 60_000;\n\n // Prune timestamps outside the 1-minute window\n this.llmCallTimestamps = this.llmCallTimestamps.filter(\n (t) => t > windowStart,\n );\n\n if (this.llmCallTimestamps.length >= this.maxLLMCallsPerMinute) {\n const err = new ResourceExhaustedError({\n code: ErrorCodes.RATE_LIMIT_CLIENT,\n message: `LLM rate limit exceeded: ${this.maxLLMCallsPerMinute} calls per minute.`,\n suggestion: `Wait a moment before sending another message, or increase rateLimits.maxLLMCallsPerMinute.`,\n });\n this.emitError(err);\n throw err;\n }\n\n this.llmCallTimestamps.push(now);\n this.log('LLM call recorded', {\n count: this.llmCallTimestamps.length,\n max: this.maxLLMCallsPerMinute,\n });\n }\n\n // -------------------------------------------------------------------------\n // STT rate limiting\n // -------------------------------------------------------------------------\n\n /** Call when STT streaming starts. */\n sttStart(): void {\n if (this.sttStartedAt !== null) return; // already streaming\n this.sttStartedAt = Date.now();\n this.log('STT streaming started');\n }\n\n /** Call when STT streaming stops. Accumulates duration. */\n sttStop(): void {\n if (this.sttStartedAt === null) return;\n const elapsed = Date.now() - this.sttStartedAt;\n this.sttMs += elapsed;\n this.sttStartedAt = null;\n this.log('STT streaming stopped', {\n elapsedMs: elapsed,\n totalMinutes: this.sttMinutesUsed,\n });\n }\n\n /**\n * Check whether STT streaming is within limits.\n * Throws `ResourceExhaustedError` if exceeded.\n */\n checkSTT(): void {\n const totalMinutes = this.sttMinutesUsed;\n if (totalMinutes >= this.maxSTTMinutesPerSession) {\n this.sttStop(); // stop the clock\n const err = new ResourceExhaustedError({\n code: ErrorCodes.RATE_LIMIT_CLIENT,\n message: `STT session limit exceeded: ${this.maxSTTMinutesPerSession} minutes per session.`,\n suggestion: `Voice input limit reached. Use text input, or increase rateLimits.maxSTTMinutesPerSession.`,\n });\n this.emitError(err);\n throw err;\n }\n }\n\n /** Current STT minutes used (including active stream). */\n private get sttMinutesUsed(): number {\n let totalMs = this.sttMs;\n if (this.sttStartedAt !== null) {\n const activeMs = Date.now() - this.sttStartedAt;\n const maxSessionMs = this.maxSTTMinutesPerSession * 60_000;\n const maxActiveMs = maxSessionMs * 2;\n\n if (activeMs > maxActiveMs) {\n console.warn(\n `${LOG_PREFIX} STT stream running for ${Math.round(activeMs / 60_000)}min without sttStop() — ` +\n `capping at 2x session limit (${this.maxSTTMinutesPerSession * 2}min).`,\n );\n // Auto-cap: freeze the accumulated time and clear the start marker\n this.sttMs += maxActiveMs;\n this.sttStartedAt = null;\n totalMs = this.sttMs;\n } else {\n totalMs += activeMs;\n }\n }\n return totalMs / 60_000;\n }\n\n // -------------------------------------------------------------------------\n // TTS rate limiting\n // -------------------------------------------------------------------------\n\n /**\n * Record TTS character usage. Throws `ResourceExhaustedError` if limit exceeded.\n */\n checkTTS(charCount: number): void {\n if (this.ttsChars + charCount > this.maxTTSCharsPerSession) {\n const err = new ResourceExhaustedError({\n code: ErrorCodes.RATE_LIMIT_CLIENT,\n message: `TTS character limit exceeded: ${this.maxTTSCharsPerSession} characters per session.`,\n suggestion: `Voice output limit reached. Responses will be text-only, or increase rateLimits.maxTTSCharsPerSession.`,\n });\n this.emitError(err);\n throw err;\n }\n\n this.ttsChars += charCount;\n this.log('TTS chars recorded', {\n added: charCount,\n total: this.ttsChars,\n max: this.maxTTSCharsPerSession,\n });\n }\n\n // -------------------------------------------------------------------------\n // State & config\n // -------------------------------------------------------------------------\n\n /** Get the current rate limiter state for monitoring. */\n getState(): RateLimiterState {\n const now = Date.now();\n const windowStart = now - 60_000;\n return {\n llmCallsInWindow: this.llmCallTimestamps.filter((t) => t > windowStart)\n .length,\n sttMinutesUsed: Math.round(this.sttMinutesUsed * 100) / 100,\n ttsCharsUsed: this.ttsChars,\n llmWindowStart: windowStart,\n };\n }\n\n /** Update limits at runtime. */\n setLimits(limits: RateLimits): void {\n if (limits.maxLLMCallsPerMinute !== undefined) {\n this.maxLLMCallsPerMinute = limits.maxLLMCallsPerMinute;\n }\n if (limits.maxSTTMinutesPerSession !== undefined) {\n this.maxSTTMinutesPerSession = limits.maxSTTMinutesPerSession;\n }\n if (limits.maxTTSCharsPerSession !== undefined) {\n this.maxTTSCharsPerSession = limits.maxTTSCharsPerSession;\n }\n this.log('Limits updated', limits);\n }\n\n /** Reset all counters (e.g., for testing or new session). */\n reset(): void {\n this.llmCallTimestamps = [];\n this.sttMs = 0;\n this.sttStartedAt = null;\n this.ttsChars = 0;\n this.log('Counters reset');\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private emitError(err: ResourceExhaustedError): void {\n if (this.bus) {\n this.bus.emit('error', err);\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.debug(LOG_PREFIX, ...args);\n }\n }\n}\n","// -----------------------------------------------------------------------\n// GuideKit SDK - Internationalization (i18n) Module\n// Provides localized strings for all SDK UI elements.\n// -----------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** All translatable string keys used by the SDK UI. */\nexport interface I18nStrings {\n // Widget\n widgetTitle: string;\n openAssistant: string;\n closeAssistant: string;\n closePanel: string;\n sendMessage: string;\n inputPlaceholder: string;\n listeningPlaceholder: string;\n startVoice: string;\n stopVoice: string;\n\n // Status\n statusOnline: string;\n statusConnecting: string;\n statusOffline: string;\n statusListening: string;\n statusSpeaking: string;\n statusProcessing: string;\n\n // Empty state\n emptyStateMessage: string;\n\n // Errors\n errorGeneric: string;\n errorNetwork: string;\n errorMicDenied: string;\n errorRateLimit: string;\n\n // Proactive\n greetingMessage: string;\n idleHelpMessage: string;\n\n // Voice\n voiceDegradedNotice: string;\n\n // Quiet mode\n quietModeOn: string;\n quietModeOff: string;\n}\n\nexport type SupportedLocale = 'en' | 'es' | 'fr' | 'de' | 'ja' | 'zh' | 'ar' | 'pt';\n\nexport type LocaleInput = SupportedLocale | 'auto' | I18nStrings;\n\nexport interface I18nOptions {\n locale?: LocaleInput;\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in locale data\n// ---------------------------------------------------------------------------\n\nconst en: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'Open assistant',\n closeAssistant: 'Close assistant',\n closePanel: 'Close assistant panel',\n sendMessage: 'Send message',\n inputPlaceholder: 'Ask a question...',\n listeningPlaceholder: 'Listening...',\n startVoice: 'Start voice input',\n stopVoice: 'Stop voice input',\n\n statusOnline: 'Online',\n statusConnecting: 'Connecting...',\n statusOffline: 'Offline',\n statusListening: 'Listening...',\n statusSpeaking: 'Speaking...',\n statusProcessing: 'Processing...',\n\n emptyStateMessage:\n 'Ask me anything about this page. I can help you navigate, understand content, and more.',\n\n errorGeneric: 'Something went wrong. Please try again.',\n errorNetwork: 'Connection lost. Reconnecting...',\n errorMicDenied:\n 'Microphone access was denied. Please enable it in your browser settings.',\n errorRateLimit: 'Too many requests. Please wait a moment.',\n\n greetingMessage: 'Hi! Need help navigating this page?',\n idleHelpMessage: 'Still here if you need help!',\n\n voiceDegradedNotice: 'Voice unavailable. Switched to text mode.',\n\n quietModeOn: 'Notifications paused',\n quietModeOff: 'Notifications resumed',\n};\n\nconst es: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'Abrir asistente',\n closeAssistant: 'Cerrar asistente',\n closePanel: 'Cerrar panel del asistente',\n sendMessage: 'Enviar mensaje',\n inputPlaceholder: 'Haz una pregunta...',\n listeningPlaceholder: 'Escuchando...',\n startVoice: 'Iniciar entrada de voz',\n stopVoice: 'Detener entrada de voz',\n\n statusOnline: 'En linea',\n statusConnecting: 'Conectando...',\n statusOffline: 'Sin conexion',\n statusListening: 'Escuchando...',\n statusSpeaking: 'Hablando...',\n statusProcessing: 'Procesando...',\n\n emptyStateMessage:\n 'Preguntame lo que quieras sobre esta pagina. Puedo ayudarte a navegar, entender el contenido y mucho mas.',\n\n errorGeneric: 'Algo salio mal. Por favor, intentalo de nuevo.',\n errorNetwork: 'Se perdio la conexion. Reconectando...',\n errorMicDenied:\n 'Se denego el acceso al microfono. Activalo en la configuracion de tu navegador.',\n errorRateLimit: 'Demasiadas solicitudes. Espera un momento, por favor.',\n\n greetingMessage: 'Hola! Necesitas ayuda para navegar esta pagina?',\n idleHelpMessage: 'Sigo aqui por si necesitas ayuda.',\n\n voiceDegradedNotice: 'Voz no disponible. Se cambio al modo de texto.',\n\n quietModeOn: 'Notificaciones en pausa',\n quietModeOff: 'Notificaciones reanudadas',\n};\n\nconst fr: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: \"Ouvrir l'assistant\",\n closeAssistant: \"Fermer l'assistant\",\n closePanel: \"Fermer le panneau de l'assistant\",\n sendMessage: 'Envoyer le message',\n inputPlaceholder: 'Posez une question...',\n listeningPlaceholder: \"A l'ecoute...\",\n startVoice: 'Activer la saisie vocale',\n stopVoice: 'Arreter la saisie vocale',\n\n statusOnline: 'En ligne',\n statusConnecting: 'Connexion en cours...',\n statusOffline: 'Hors ligne',\n statusListening: \"A l'ecoute...\",\n statusSpeaking: 'En train de parler...',\n statusProcessing: 'Traitement en cours...',\n\n emptyStateMessage:\n 'Posez-moi vos questions sur cette page. Je peux vous aider a naviguer, comprendre le contenu et bien plus.',\n\n errorGeneric: \"Une erreur s'est produite. Veuillez reessayer.\",\n errorNetwork: 'Connexion perdue. Reconnexion en cours...',\n errorMicDenied:\n \"L'acces au microphone a ete refuse. Veuillez l'activer dans les parametres de votre navigateur.\",\n errorRateLimit: 'Trop de requetes. Veuillez patienter un instant.',\n\n greetingMessage: 'Bonjour ! Besoin d\\'aide pour naviguer sur cette page ?',\n idleHelpMessage: 'Je suis toujours la si vous avez besoin d\\'aide !',\n\n voiceDegradedNotice: 'Voix indisponible. Passage en mode texte.',\n\n quietModeOn: 'Notifications en pause',\n quietModeOff: 'Notifications reprises',\n};\n\nconst de: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'Assistent oeffnen',\n closeAssistant: 'Assistent schliessen',\n closePanel: 'Assistenten-Panel schliessen',\n sendMessage: 'Nachricht senden',\n inputPlaceholder: 'Stelle eine Frage...',\n listeningPlaceholder: 'Hoert zu...',\n startVoice: 'Spracheingabe starten',\n stopVoice: 'Spracheingabe stoppen',\n\n statusOnline: 'Online',\n statusConnecting: 'Verbindung wird hergestellt...',\n statusOffline: 'Offline',\n statusListening: 'Hoert zu...',\n statusSpeaking: 'Spricht...',\n statusProcessing: 'Verarbeitung...',\n\n emptyStateMessage:\n 'Frag mich alles zu dieser Seite. Ich kann dir bei der Navigation helfen, Inhalte erklaeren und vieles mehr.',\n\n errorGeneric: 'Etwas ist schiefgelaufen. Bitte versuche es erneut.',\n errorNetwork: 'Verbindung verloren. Verbindung wird wiederhergestellt...',\n errorMicDenied:\n 'Mikrofonzugriff wurde verweigert. Bitte aktiviere ihn in deinen Browsereinstellungen.',\n errorRateLimit: 'Zu viele Anfragen. Bitte warte einen Moment.',\n\n greetingMessage: 'Hallo! Brauchst du Hilfe beim Navigieren auf dieser Seite?',\n idleHelpMessage: 'Ich bin noch da, falls du Hilfe brauchst!',\n\n voiceDegradedNotice: 'Sprache nicht verfuegbar. Wechsel zum Textmodus.',\n\n quietModeOn: 'Benachrichtigungen pausiert',\n quietModeOff: 'Benachrichtigungen fortgesetzt',\n};\n\nconst ja: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'アシスタントを開く',\n closeAssistant: 'アシスタントを閉じる',\n closePanel: 'アシスタントパネルを閉じる',\n sendMessage: 'メッセージを送信',\n inputPlaceholder: '質問してください...',\n listeningPlaceholder: '聞いています...',\n startVoice: '音声入力を開始',\n stopVoice: '音声入力を停止',\n\n statusOnline: 'オンライン',\n statusConnecting: '接続中...',\n statusOffline: 'オフライン',\n statusListening: '聞いています...',\n statusSpeaking: '話しています...',\n statusProcessing: '処理中...',\n\n emptyStateMessage:\n 'このページについて何でも聞いてください。ナビゲーション、コンテンツの理解など、お手伝いします。',\n\n errorGeneric: '問題が発生しました。もう一度お試しください。',\n errorNetwork: '接続が切断されました。再接続しています...',\n errorMicDenied:\n 'マイクへのアクセスが拒否されました。ブラウザの設定で有効にしてください。',\n errorRateLimit: 'リクエストが多すぎます。少々お待ちください。',\n\n greetingMessage: 'こんにちは!このページのナビゲーションでお手伝いしましょうか?',\n idleHelpMessage: 'お手伝いが必要でしたら、いつでもどうぞ!',\n\n voiceDegradedNotice: '音声が利用できません。テキストモードに切り替えました。',\n\n quietModeOn: '通知を一時停止中',\n quietModeOff: '通知を再開しました',\n};\n\nconst zh: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: '打开助手',\n closeAssistant: '关闭助手',\n closePanel: '关闭助手面板',\n sendMessage: '发送消息',\n inputPlaceholder: '请提问...',\n listeningPlaceholder: '正在聆听...',\n startVoice: '开始语音输入',\n stopVoice: '停止语音输入',\n\n statusOnline: '在线',\n statusConnecting: '连接中...',\n statusOffline: '离线',\n statusListening: '正在聆听...',\n statusSpeaking: '正在播报...',\n statusProcessing: '处理中...',\n\n emptyStateMessage:\n '关于这个页面,你可以问我任何问题。我可以帮你浏览页面、理解内容等等。',\n\n errorGeneric: '出了点问题,请重试。',\n errorNetwork: '连接已断开,正在重新连接...',\n errorMicDenied: '麦克风权限被拒绝,请在浏览器设置中开启。',\n errorRateLimit: '请求过于频繁,请稍候再试。',\n\n greetingMessage: '你好!需要帮你浏览这个页面吗?',\n idleHelpMessage: '我还在这里,随时可以帮忙!',\n\n voiceDegradedNotice: '语音不可用,已切换为文字模式。',\n\n quietModeOn: '通知已暂停',\n quietModeOff: '通知已恢复',\n};\n\nconst ar: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'فتح المساعد',\n closeAssistant: 'إغلاق المساعد',\n closePanel: 'إغلاق لوحة المساعد',\n sendMessage: 'إرسال الرسالة',\n inputPlaceholder: 'اطرح سؤالاً...',\n listeningPlaceholder: 'جارٍ الاستماع...',\n startVoice: 'بدء الإدخال الصوتي',\n stopVoice: 'إيقاف الإدخال الصوتي',\n\n statusOnline: 'متصل',\n statusConnecting: 'جارٍ الاتصال...',\n statusOffline: 'غير متصل',\n statusListening: 'جارٍ الاستماع...',\n statusSpeaking: 'جارٍ التحدث...',\n statusProcessing: 'جارٍ المعالجة...',\n\n emptyStateMessage:\n 'اسألني أي شيء عن هذه الصفحة. يمكنني مساعدتك في التنقل وفهم المحتوى والمزيد.',\n\n errorGeneric: 'حدث خطأ ما. يرجى المحاولة مرة أخرى.',\n errorNetwork: 'انقطع الاتصال. جارٍ إعادة الاتصال...',\n errorMicDenied:\n 'تم رفض الوصول إلى الميكروفون. يرجى تفعيله من إعدادات المتصفح.',\n errorRateLimit: 'طلبات كثيرة جداً. يرجى الانتظار لحظة.',\n\n greetingMessage: 'مرحباً! هل تحتاج مساعدة في تصفح هذه الصفحة؟',\n idleHelpMessage: 'ما زلت هنا إذا احتجت مساعدة!',\n\n voiceDegradedNotice: 'الصوت غير متاح. تم التبديل إلى الوضع النصي.',\n\n quietModeOn: 'الإشعارات متوقفة مؤقتاً',\n quietModeOff: 'تم استئناف الإشعارات',\n};\n\nconst pt: I18nStrings = {\n widgetTitle: 'GuideKit',\n openAssistant: 'Abrir assistente',\n closeAssistant: 'Fechar assistente',\n closePanel: 'Fechar painel do assistente',\n sendMessage: 'Enviar mensagem',\n inputPlaceholder: 'Faca uma pergunta...',\n listeningPlaceholder: 'Ouvindo...',\n startVoice: 'Iniciar entrada de voz',\n stopVoice: 'Parar entrada de voz',\n\n statusOnline: 'Online',\n statusConnecting: 'Conectando...',\n statusOffline: 'Offline',\n statusListening: 'Ouvindo...',\n statusSpeaking: 'Falando...',\n statusProcessing: 'Processando...',\n\n emptyStateMessage:\n 'Pergunte-me o que quiser sobre esta pagina. Posso ajudar a navegar, entender o conteudo e muito mais.',\n\n errorGeneric: 'Algo deu errado. Por favor, tente novamente.',\n errorNetwork: 'Conexao perdida. Reconectando...',\n errorMicDenied:\n 'O acesso ao microfone foi negado. Ative-o nas configuracoes do seu navegador.',\n errorRateLimit: 'Muitas solicitacoes. Aguarde um momento, por favor.',\n\n greetingMessage: 'Ola! Precisa de ajuda para navegar nesta pagina?',\n idleHelpMessage: 'Ainda estou aqui se precisar de ajuda!',\n\n voiceDegradedNotice: 'Voz indisponivel. Alternado para o modo texto.',\n\n quietModeOn: 'Notificacoes pausadas',\n quietModeOff: 'Notificacoes retomadas',\n};\n\n// ---------------------------------------------------------------------------\n// Locale registry\n// ---------------------------------------------------------------------------\n\nconst BUILTIN_LOCALES: Record<SupportedLocale, I18nStrings> = {\n en,\n es,\n fr,\n de,\n ja,\n zh,\n ar,\n pt,\n};\n\nconst SUPPORTED_LOCALE_CODES = new Set<string>(Object.keys(BUILTIN_LOCALES));\n\nconst LOG_PREFIX = '[GuideKit:I18n]';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isSupportedLocale(code: string): code is SupportedLocale {\n return SUPPORTED_LOCALE_CODES.has(code);\n}\n\nfunction isI18nStrings(input: unknown): input is I18nStrings {\n if (typeof input !== 'object' || input === null) return false;\n // Check for a handful of required keys to distinguish from other objects\n const obj = input as Record<string, unknown>;\n return (\n typeof obj.widgetTitle === 'string' &&\n typeof obj.sendMessage === 'string' &&\n typeof obj.errorGeneric === 'string'\n );\n}\n\n/**\n * Detect the user's locale from the `<html lang>` attribute.\n * SSR-safe: returns 'en' when `document` is not available.\n */\nfunction detectLocaleFromDocument(): SupportedLocale {\n if (typeof document === 'undefined') {\n return 'en';\n }\n\n const htmlLang = document.documentElement?.lang;\n if (!htmlLang) {\n return 'en';\n }\n\n const normalized = htmlLang.trim().toLowerCase();\n\n // Exact match (e.g. 'en', 'pt')\n if (isSupportedLocale(normalized)) {\n return normalized;\n }\n\n // Language prefix match (e.g. 'en-US' -> 'en', 'pt-BR' -> 'pt')\n const prefix = normalized.split('-')[0] ?? '';\n if (isSupportedLocale(prefix)) {\n return prefix;\n }\n\n return 'en';\n}\n\n// ---------------------------------------------------------------------------\n// I18n class\n// ---------------------------------------------------------------------------\n\nexport class I18n {\n private strings: I18nStrings;\n private resolvedLocale: string;\n private debug: boolean;\n\n constructor(options?: I18nOptions) {\n this.debug = options?.debug ?? false;\n const locale = options?.locale ?? 'auto';\n const { strings, resolvedLocale } = this.resolve(locale);\n this.strings = strings;\n this.resolvedLocale = resolvedLocale;\n\n if (this.debug) {\n console.debug(`${LOG_PREFIX} Initialized with locale \"${this.resolvedLocale}\"`);\n }\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /** Get a translated string by key. */\n t(key: keyof I18nStrings): string {\n const value = this.strings[key];\n if (value === undefined) {\n if (this.debug) {\n console.warn(`${LOG_PREFIX} Missing translation key \"${key}\"`);\n }\n // Fallback to English; in non-production show a debug marker\n return en[key] ?? (typeof process !== 'undefined' && process.env?.NODE_ENV === 'production' ? key : `[MISSING: ${key}]`);\n }\n return value;\n }\n\n /** Get all strings for the current locale. */\n getStrings(): I18nStrings {\n return { ...this.strings };\n }\n\n /** Change the current locale at runtime. */\n setLocale(locale: LocaleInput): void {\n const { strings, resolvedLocale } = this.resolve(locale);\n this.strings = strings;\n this.resolvedLocale = resolvedLocale;\n\n if (this.debug) {\n console.debug(`${LOG_PREFIX} Locale changed to \"${this.resolvedLocale}\"`);\n }\n }\n\n /** The current resolved locale code (e.g. 'en', 'fr', or 'custom'). */\n get currentLocale(): string {\n return this.resolvedLocale;\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private resolve(locale: LocaleInput): {\n strings: I18nStrings;\n resolvedLocale: string;\n } {\n // Custom string map provided directly\n if (isI18nStrings(locale)) {\n // Merge with English defaults so partial overrides still work\n return {\n strings: { ...en, ...locale },\n resolvedLocale: 'custom',\n };\n }\n\n // Auto-detect from the document\n if (locale === 'auto') {\n const detected = detectLocaleFromDocument();\n if (this.debug) {\n console.debug(`${LOG_PREFIX} Auto-detected locale \"${detected}\"`);\n }\n return {\n strings: BUILTIN_LOCALES[detected],\n resolvedLocale: detected,\n };\n }\n\n // Explicit supported locale code\n if (isSupportedLocale(locale)) {\n return {\n strings: BUILTIN_LOCALES[locale],\n resolvedLocale: locale,\n };\n }\n\n // Unknown locale code -- fall back to English\n if (this.debug) {\n console.warn(\n `${LOG_PREFIX} Unknown locale \"${String(locale)}\", falling back to \"en\"`,\n );\n }\n return {\n strings: en,\n resolvedLocale: 'en',\n };\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Client-side Token Manager\n// ---------------------------------------------------------------------------\n//\n// Handles the full token lifecycle:\n// - Fetch token from the developer's token endpoint on init\n// - Auto-refresh at 80% of TTL\n// - BroadcastChannel multi-tab coordination with leader election\n// - localStorage fallback for browsers without BroadcastChannel\n// - Emits auth events (token-refreshed, token-refresh-failed, token-expired)\n// ---------------------------------------------------------------------------\n\nimport type { EventBus } from '../bus/index.js';\nimport { AuthenticationError, ErrorCodes } from '../errors/index.js';\n\nconst LOG_PREFIX = '[GuideKit:Auth]';\nconst REFRESH_THRESHOLD = 0.8; // Refresh at 80% of TTL\nconst MAX_RETRY_ATTEMPTS = 3;\nconst RETRY_BASE_MS = 1_000;\nconst BC_CHANNEL_NAME = 'guidekit-token';\nconst LS_KEY_PREFIX = 'guidekit-token:';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TokenData {\n token: string;\n expiresAt: number; // Unix seconds\n expiresIn: number; // Seconds from issuance\n fetchedAt: number; // Date.now() when fetched\n}\n\nexport interface TokenManagerOptions {\n tokenEndpoint: string;\n instanceId: string;\n bus: EventBus;\n debug?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// TokenManager\n// ---------------------------------------------------------------------------\n\nexport class TokenManager {\n private readonly endpoint: string;\n private readonly instanceId: string;\n private readonly bus: EventBus;\n private readonly debug: boolean;\n\n private _token: TokenData | null = null;\n private _refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private _isLeader = false;\n private _bc: BroadcastChannel | null = null;\n private _destroyed = false;\n\n constructor(options: TokenManagerOptions) {\n this.endpoint = options.tokenEndpoint;\n this.instanceId = options.instanceId;\n this.bus = options.bus;\n this.debug = options.debug ?? false;\n }\n\n // -------------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------------\n\n /** Current token string, or null if not yet fetched. */\n get token(): string | null {\n return this._token?.token ?? null;\n }\n\n /** Current token data, or null if not yet fetched. */\n get tokenData(): TokenData | null {\n return this._token;\n }\n\n /** Whether this tab is the leader for token refresh. */\n get isLeader(): boolean {\n return this._isLeader;\n }\n\n /**\n * Initialize the token manager: elect leader, fetch initial token,\n * schedule auto-refresh.\n */\n async start(): Promise<void> {\n if (this._destroyed) return;\n\n this.setupBroadcastChannel();\n this.electLeader();\n\n // Try to load a cached token from localStorage first\n const cached = this.loadFromStorage();\n if (cached && !this.isExpired(cached)) {\n this._token = cached;\n this.log('Loaded cached token from localStorage');\n this.scheduleRefresh();\n return;\n }\n\n // Fetch a fresh token\n await this.fetchToken();\n }\n\n /**\n * Force a token refresh, regardless of TTL.\n */\n async refresh(): Promise<void> {\n await this.fetchToken();\n }\n\n /**\n * Clean up timers, BroadcastChannel, and release leader.\n */\n destroy(): void {\n this._destroyed = true;\n\n if (this._refreshTimer !== null) {\n clearTimeout(this._refreshTimer);\n this._refreshTimer = null;\n }\n\n if (this._bc) {\n this._bc.close();\n this._bc = null;\n }\n\n this._token = null;\n this._isLeader = false;\n }\n\n // -------------------------------------------------------------------------\n // Token fetching\n // -------------------------------------------------------------------------\n\n private async fetchToken(attempt = 1): Promise<void> {\n if (this._destroyed) return;\n\n this.log(`Fetching token (attempt ${attempt}/${MAX_RETRY_ATTEMPTS})`);\n\n try {\n const response = await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ instanceId: this.instanceId }),\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => '');\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError({\n code: ErrorCodes.AUTH_INVALID_KEY,\n message: `Token endpoint returned ${response.status}: ${body}`,\n suggestion: 'Check your tokenEndpoint URL and server authentication.',\n });\n }\n // Retryable server error\n throw new Error(`Token endpoint returned ${response.status}: ${body}`);\n }\n\n const data = await response.json() as {\n token?: string;\n expiresIn?: number;\n expiresAt?: number;\n };\n\n if (!data.token || typeof data.token !== 'string') {\n throw new AuthenticationError({\n code: ErrorCodes.AUTH_ENDPOINT_FAILED,\n message: 'Token endpoint response missing \"token\" field.',\n suggestion: 'Ensure your token endpoint returns { token, expiresIn, expiresAt }.',\n });\n }\n\n const tokenData: TokenData = {\n token: data.token,\n expiresAt: data.expiresAt ?? Math.floor(Date.now() / 1000) + (data.expiresIn ?? 900),\n expiresIn: data.expiresIn ?? 900,\n fetchedAt: Date.now(),\n };\n\n this._token = tokenData;\n this.saveToStorage(tokenData);\n this.broadcastToken(tokenData);\n this.scheduleRefresh();\n\n this.bus.emit('auth:token-refreshed', { expiresAt: tokenData.expiresAt });\n this.log(`Token fetched, expires at ${new Date(tokenData.expiresAt * 1000).toISOString()}`);\n } catch (error) {\n const remaining = MAX_RETRY_ATTEMPTS - attempt;\n\n if (remaining > 0 && !(error instanceof AuthenticationError)) {\n this.log(`Token fetch failed, retrying in ${RETRY_BASE_MS * attempt}ms`);\n this.bus.emit('auth:token-refresh-failed', {\n error: error instanceof Error ? error : new Error(String(error)),\n attemptsRemaining: remaining,\n });\n\n await new Promise((resolve) =>\n setTimeout(resolve, RETRY_BASE_MS * attempt),\n );\n return this.fetchToken(attempt + 1);\n }\n\n // All retries exhausted\n this.bus.emit('auth:token-refresh-failed', {\n error: error instanceof Error ? error : new Error(String(error)),\n attemptsRemaining: 0,\n });\n\n if (error instanceof AuthenticationError) throw error;\n\n throw new AuthenticationError({\n code: ErrorCodes.AUTH_ENDPOINT_FAILED,\n message: `Failed to fetch token after ${MAX_RETRY_ATTEMPTS} attempts: ${error instanceof Error ? error.message : String(error)}`,\n suggestion: 'Check your tokenEndpoint URL and network connection.',\n });\n }\n }\n\n // -------------------------------------------------------------------------\n // Auto-refresh scheduling\n // -------------------------------------------------------------------------\n\n private scheduleRefresh(): void {\n if (this._destroyed || !this._token) return;\n\n // Clear existing timer\n if (this._refreshTimer !== null) {\n clearTimeout(this._refreshTimer);\n }\n\n const now = Date.now();\n const tokenAgeMs = now - this._token.fetchedAt;\n const ttlMs = this._token.expiresIn * 1000;\n const refreshAtMs = ttlMs * REFRESH_THRESHOLD;\n const delayMs = Math.max(0, refreshAtMs - tokenAgeMs);\n\n this.log(`Scheduling refresh in ${Math.round(delayMs / 1000)}s (80% of ${this._token.expiresIn}s TTL)`);\n\n this._refreshTimer = setTimeout(() => {\n if (this._destroyed) return;\n\n // Only the leader refreshes\n if (this._isLeader) {\n this.log('Leader performing scheduled refresh');\n this.fetchToken().catch((err) => {\n this.log(`Scheduled refresh failed: ${err}`);\n });\n } else {\n this.log('Not leader, skipping refresh (will receive via BroadcastChannel)');\n // Schedule another check in case we become leader\n this.scheduleExpiredCheck();\n }\n }, delayMs);\n }\n\n private scheduleExpiredCheck(): void {\n if (this._destroyed || !this._token) return;\n\n const now = Date.now();\n const expiresAtMs = this._token.expiresAt * 1000;\n const delayMs = Math.max(0, expiresAtMs - now);\n\n this._refreshTimer = setTimeout(() => {\n if (this._destroyed) return;\n if (this._token && this.isExpired(this._token)) {\n this.bus.emit('auth:token-expired', {} as Record<string, never>);\n // Try to refresh as last resort\n this.electLeader();\n if (this._isLeader) {\n this.fetchToken().catch(() => {});\n }\n }\n }, delayMs);\n }\n\n // -------------------------------------------------------------------------\n // BroadcastChannel (multi-tab coordination)\n // -------------------------------------------------------------------------\n\n private setupBroadcastChannel(): void {\n if (typeof BroadcastChannel === 'undefined') {\n // Fallback: always be leader if no BroadcastChannel\n this._isLeader = true;\n this.log('BroadcastChannel unavailable, acting as leader');\n return;\n }\n\n try {\n this._bc = new BroadcastChannel(`${BC_CHANNEL_NAME}:${this.instanceId}`);\n this._bc.onmessage = (event) => {\n const msg = event.data as { type: string; token?: TokenData; tabId?: string };\n\n if (msg.type === 'token-updated' && msg.token) {\n this.log('Received token from leader via BroadcastChannel');\n this._token = msg.token;\n this.saveToStorage(msg.token);\n this.scheduleRefresh();\n this.bus.emit('auth:token-refreshed', { expiresAt: msg.token.expiresAt });\n }\n\n if (msg.type === 'leader-election') {\n // Another tab is claiming leadership — yield if we're not already leader\n // or if their tabId is lexicographically lower (deterministic)\n if (this._isLeader && msg.tabId && msg.tabId < this._tabId) {\n this._isLeader = false;\n this.log('Yielded leadership to another tab');\n }\n }\n };\n } catch {\n this._isLeader = true;\n this.log('BroadcastChannel setup failed, acting as leader');\n }\n }\n\n private readonly _tabId = typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).slice(2);\n\n private electLeader(): void {\n // Simple leader election: broadcast our intent, wait for contestation\n // If no BroadcastChannel, we're always leader\n if (!this._bc) {\n this._isLeader = true;\n return;\n }\n\n this._isLeader = true;\n try {\n this._bc.postMessage({\n type: 'leader-election',\n tabId: this._tabId,\n });\n } catch {\n // Channel may be closed\n }\n\n this.log(`Elected as leader (tabId: ${this._tabId.slice(0, 8)}...)`);\n }\n\n private broadcastToken(tokenData: TokenData): void {\n if (!this._bc) return;\n try {\n this._bc.postMessage({\n type: 'token-updated',\n token: tokenData,\n });\n } catch {\n // Channel may be closed\n }\n }\n\n // -------------------------------------------------------------------------\n // localStorage fallback\n // -------------------------------------------------------------------------\n\n private get storageKey(): string {\n return `${LS_KEY_PREFIX}${this.instanceId}`;\n }\n\n private saveToStorage(data: TokenData): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(this.storageKey, JSON.stringify(data));\n }\n } catch {\n // localStorage may be full or unavailable (incognito, SSR)\n }\n }\n\n private loadFromStorage(): TokenData | null {\n try {\n if (typeof localStorage === 'undefined') return null;\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return null;\n return JSON.parse(raw) as TokenData;\n } catch {\n return null;\n }\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n private isExpired(data: TokenData): boolean {\n const nowSec = Math.floor(Date.now() / 1000);\n return nowSec >= data.expiresAt;\n }\n\n private log(message: string): void {\n if (this.debug) {\n console.debug(`${LOG_PREFIX} ${message}`);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// GuideKit SDK – Core Orchestrator\n// ---------------------------------------------------------------------------\n//\n// The main class that wires all subsystems together. The constructor does NOT\n// call any browser APIs — everything is lazily initialized in `init()` so the\n// module is safe to import in SSR / Node environments.\n// ---------------------------------------------------------------------------\n\nimport { EventBus, createEventBus } from './bus/index.js';\nimport { ResourceManager, SingletonGuard } from './resources/index.js';\nimport { DOMScanner } from './dom/index.js';\nimport { ContextManager } from './context/index.js';\nimport { LLMOrchestrator } from './llm/index.js';\nimport { ToolExecutor } from './llm/tool-executor.js';\nimport { ConnectionManager } from './connectivity/index.js';\nimport { NavigationController } from './navigation/index.js';\nimport { VoicePipeline, type VoicePipelineOptions } from './voice/index.js';\nimport { VisualGuidance } from './visual/index.js';\nimport { AwarenessSystem } from './awareness/index.js';\nimport { ProactiveTriggerEngine } from './awareness/proactive.js';\nimport { RateLimiter } from './llm/rate-limiter.js';\nimport { I18n, type LocaleInput } from './i18n/index.js';\nimport { TokenManager } from './auth/token-manager.js';\nimport type {\n PageModel,\n AgentConfig,\n ContentMapInput,\n LLMConfig,\n STTConfig,\n TTSConfig,\n GuideKitOptions,\n ToolDefinition,\n ToolParameterSchema,\n GuideKitEvent,\n AgentState,\n GuideKitStore,\n} from './types/index.js';\nimport { GuideKitError, ConfigurationError, ErrorCodes } from './errors/index.js';\n\n// ---------------------------------------------------------------------------\n// Default deny-list for clickElement tool\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_CLICK_DENY = [\n '[type=\"submit\"]',\n '[type=\"reset\"]',\n 'button[formaction]',\n '[data-guidekit-no-click]',\n 'form',\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a UUID, guarded for non-browser environments where\n * `crypto.randomUUID()` may not be available.\n */\nfunction generateUUID(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID();\n }\n\n // Fallback: manual v4 UUID generation (RFC 4122 compliant)\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Options interface\n// ---------------------------------------------------------------------------\n\n/** Result of a health check on a single service. */\nexport interface HealthCheckStatus {\n status: 'ok' | 'degraded' | 'unavailable' | 'not-configured';\n latencyMs?: number;\n error?: string;\n}\n\n/** Full health check result. */\nexport interface HealthCheckResult {\n llm: HealthCheckStatus;\n stt: HealthCheckStatus;\n tts: HealthCheckStatus;\n mic: HealthCheckStatus;\n overall: 'ok' | 'degraded' | 'unavailable';\n}\n\n/** Context passed to onBeforeLLMCall for privacy filtering. */\nexport interface BeforeLLMCallContext {\n systemPrompt: string;\n userMessage: string;\n conversationHistory: Array<{ role: string; content: string }>;\n}\n\nexport interface GuideKitCoreOptions {\n tokenEndpoint?: string;\n stt?: STTConfig;\n tts?: TTSConfig;\n llm?: LLMConfig;\n agent?: AgentConfig;\n contentMap?: ContentMapInput;\n options?: GuideKitOptions;\n instanceId?: string;\n rootElement?: HTMLElement;\n onError?: (error: GuideKitError) => void;\n onEvent?: (event: GuideKitEvent) => void;\n onReady?: () => void;\n /**\n * Privacy hook: called before every LLM request. Return modified context\n * or throw to cancel the request. Use for custom PII scrubbing.\n */\n onBeforeLLMCall?: (context: BeforeLLMCallContext) => BeforeLLMCallContext | Promise<BeforeLLMCallContext>;\n}\n\n// ---------------------------------------------------------------------------\n// GuideKitCore\n// ---------------------------------------------------------------------------\n\nexport class GuideKitCore {\n // ---- Public readonly accessors ------------------------------------------\n\n readonly instanceId: string;\n readonly bus: EventBus;\n\n // ---- Subsystems (created lazily or on init) -----------------------------\n\n private resourceManager: ResourceManager;\n private domScanner: DOMScanner | null = null;\n private contextManager: ContextManager;\n private llmOrchestrator: LLMOrchestrator | null = null;\n private connectionManager: ConnectionManager | null = null;\n private navigationController: NavigationController | null = null;\n private voicePipeline: VoicePipeline | null = null;\n private visualGuidance: VisualGuidance | null = null;\n private toolExecutor: ToolExecutor | null = null;\n private awarenessSystem: AwarenessSystem | null = null;\n private proactiveEngine: ProactiveTriggerEngine | null = null;\n private rateLimiter: RateLimiter;\n private _i18n: I18n;\n private tokenManager: TokenManager | null = null;\n\n // ---- State --------------------------------------------------------------\n\n private _isReady = false;\n private _agentState: AgentState = { status: 'idle' };\n private _currentPageModel: PageModel | null = null;\n private readonly _options: GuideKitCoreOptions;\n private _debug: boolean;\n private _sendInFlight = false;\n private _instanceAbortController = new AbortController();\n private _initPromise: Promise<void> | null = null;\n\n // ---- Store for useSyncExternalStore -------------------------------------\n\n private storeListeners: Set<() => void> = new Set();\n private _storeSnapshot: GuideKitStore;\n\n // ---- Custom actions -----------------------------------------------------\n\n private customActions = new Map<\n string,\n {\n description: string;\n parameters: Record<string, unknown>;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n }\n >();\n\n // -------------------------------------------------------------------------\n // Constructor — NO browser APIs (SSR safe)\n // -------------------------------------------------------------------------\n\n constructor(options: GuideKitCoreOptions) {\n this._options = options;\n this.instanceId = options.instanceId ?? 'default';\n this._debug = options.options?.debug ?? false;\n\n // Create EventBus (no browser APIs)\n this.bus = createEventBus({ debug: this._debug });\n\n // Get or create ResourceManager via SingletonGuard\n this.resourceManager = SingletonGuard.acquire(\n this.instanceId,\n () => new ResourceManager(this.instanceId),\n );\n\n // Create ContextManager (no browser APIs in constructor)\n this.contextManager = new ContextManager({\n agent: options.agent,\n contentMap: options.contentMap,\n debug: this._debug,\n });\n\n // Create RateLimiter (no browser APIs)\n this.rateLimiter = new RateLimiter({\n bus: this.bus,\n limits: options.options?.rateLimits,\n debug: this._debug,\n });\n\n // Create I18n (auto-detect is SSR-safe)\n this._i18n = new I18n({\n locale: (options.options?.locale as LocaleInput) ?? 'auto',\n debug: this._debug,\n });\n\n // Initialize store snapshot\n this._storeSnapshot = this.buildSnapshot();\n\n // Wire up error handler\n if (options.onError) {\n this.bus.on('error', (err) => {\n if (err instanceof GuideKitError) {\n options.onError!(err);\n }\n });\n }\n\n // Wire up event forwarding\n if (options.onEvent) {\n this.bus.onAny((data, eventName) => {\n options.onEvent!({\n type: eventName,\n data:\n typeof data === 'object' && data !== null\n ? (data as Record<string, unknown>)\n : {},\n timestamp: Date.now(),\n });\n });\n }\n }\n\n // -------------------------------------------------------------------------\n // init() — starts all browser-dependent subsystems\n // -------------------------------------------------------------------------\n\n async init(): Promise<void> {\n if (typeof window === 'undefined') return;\n if (this._isReady) return;\n if (this._initPromise) return this._initPromise;\n\n this._initPromise = this._doInit();\n try {\n await this._initPromise;\n } catch (err) {\n this._initPromise = null;\n throw err;\n }\n }\n\n private async _doInit(): Promise<void> {\n // Validate LLM config\n const llmConfig = this._options.llm;\n if (!llmConfig && !this._options.tokenEndpoint) {\n throw new ConfigurationError({\n code: ErrorCodes.CONFIG_MISSING_REQUIRED,\n message: 'Either tokenEndpoint or llm config must be provided.',\n suggestion:\n 'Add tokenEndpoint=\"/api/guidekit/token\" or llm={{ provider: \"gemini\", apiKey: \"...\" }} to GuideKitProvider.',\n });\n }\n\n // -- Token Manager (if tokenEndpoint is provided) -----------------------\n\n if (this._options.tokenEndpoint) {\n this.tokenManager = new TokenManager({\n tokenEndpoint: this._options.tokenEndpoint,\n instanceId: this.instanceId,\n bus: this.bus,\n debug: this._debug,\n });\n await this.tokenManager.start();\n if (!this._options.llm) {\n console.warn(\n '[GuideKit] tokenEndpoint provided without llm config. ' +\n 'The session token handles auth only — llm: { provider, apiKey } is still required ' +\n 'for LLM calls. See: https://guidekit.dev/docs/provider#token-endpoint',\n );\n }\n this.resourceManager.register({\n name: 'token-manager',\n cleanup: () => this.tokenManager?.destroy(),\n });\n }\n\n // -- DOM Scanner --------------------------------------------------------\n\n this.domScanner = new DOMScanner({\n rootElement: this._options.rootElement,\n debug: this._debug,\n });\n\n // Initial scan\n this._currentPageModel = this.domScanner.scan();\n this.bus.emit('dom:scan-complete', {\n pageModel: this._currentPageModel,\n durationMs: 0,\n });\n\n // Set up MutationObserver for auto-rescan\n const unobserve = this.domScanner.observe((model) => {\n this._currentPageModel = model;\n this.bus.emit('dom:scan-complete', {\n pageModel: model,\n durationMs: 0,\n });\n this.notifyStoreListeners();\n });\n this.resourceManager.register({\n name: 'dom-observer',\n cleanup: unobserve,\n });\n\n // -- LLM Orchestrator ---------------------------------------------------\n\n if (llmConfig) {\n this.llmOrchestrator = new LLMOrchestrator({\n config: llmConfig,\n debug: this._debug,\n onChunk: (chunk) => {\n this.bus.emit('llm:response-chunk', chunk);\n },\n onToolCall: (toolCall) => {\n this.bus.emit('llm:tool-call', toolCall);\n },\n onTokenUsage: (usage) => {\n this.bus.emit('llm:token-usage', usage);\n },\n onError: (error) => {\n this.bus.emit('error', error);\n },\n });\n }\n\n // -- ConnectionManager --------------------------------------------------\n\n this.connectionManager = new ConnectionManager({\n healthEndpoint: this._options.tokenEndpoint\n ? this._options.tokenEndpoint.replace(/\\/token$/, '/health')\n : undefined,\n debug: this._debug,\n });\n this.connectionManager.onStateChange((state, previous) => {\n this.bus.emit('connectivity:state-change', { state, previous });\n });\n this.connectionManager.start();\n this.resourceManager.register({\n name: 'connection-manager',\n cleanup: () => this.connectionManager?.stop(),\n });\n\n // -- NavigationController -----------------------------------------------\n\n this.navigationController = new NavigationController({\n debug: this._debug,\n });\n this.navigationController.onRouteChange((from, to) => {\n this.bus.emit('dom:route-change', { from, to });\n\n // Re-scan DOM on route change (allow a brief settling period)\n if (this.domScanner) {\n setTimeout(() => {\n this._currentPageModel = this.domScanner!.scan();\n this.bus.emit('dom:scan-complete', {\n pageModel: this._currentPageModel,\n durationMs: 0,\n });\n this.notifyStoreListeners();\n }, 100);\n }\n });\n this.navigationController.start();\n this.resourceManager.register({\n name: 'navigation-controller',\n cleanup: () => this.navigationController?.stop(),\n });\n\n // -- Visual Guidance System -----------------------------------------------\n\n this.visualGuidance = new VisualGuidance({\n spotlightColor: this._options.options?.spotlightColor,\n debug: this._debug,\n });\n this.resourceManager.register({\n name: 'visual-guidance',\n cleanup: () => this.visualGuidance?.destroy(),\n });\n\n // -- Awareness System ---------------------------------------------------\n\n this.awarenessSystem = new AwarenessSystem({\n bus: this.bus,\n rootElement: this._options.rootElement,\n debug: this._debug,\n });\n this.awarenessSystem.start();\n this.resourceManager.register({\n name: 'awareness-system',\n cleanup: () => this.awarenessSystem?.destroy(),\n });\n\n // -- Proactive Trigger Engine ------------------------------------------\n\n this.proactiveEngine = new ProactiveTriggerEngine({\n bus: this.bus,\n debug: this._debug,\n onTrigger: (trigger) => {\n if (this._debug) {\n console.debug('[GuideKit:Core] Proactive trigger:', trigger.type, trigger);\n }\n // Forward as a generic event for developer hooks\n this._options.onEvent?.({\n type: `proactive:${trigger.type}`,\n data: trigger as unknown as Record<string, unknown>,\n timestamp: trigger.timestamp,\n });\n },\n });\n this.proactiveEngine.start();\n this.resourceManager.register({\n name: 'proactive-engine',\n cleanup: () => this.proactiveEngine?.destroy(),\n });\n\n // -- Tool Executor (multi-turn tool calling) ----------------------------\n\n this.toolExecutor = new ToolExecutor({\n maxRounds: 5,\n debug: this._debug,\n onToolCall: (name, args) => {\n this.bus.emit('llm:tool-call', { name, arguments: args });\n },\n });\n\n this.registerBuiltinTools();\n\n // -- Voice Pipeline (lazy — only init on first startListening) ----------\n // Default to web-speech (browser-native, zero-config) when no STT/TTS\n // config is provided. Falls back gracefully in non-browser environments.\n\n {\n const sttConfig: STTConfig = this._options.stt ?? { provider: 'web-speech' };\n const ttsConfig: TTSConfig = this._options.tts ?? { provider: 'web-speech' };\n\n // Build the VoicePipeline options based on provider type\n let voiceSttConfig: VoicePipelineOptions['sttConfig'];\n let voiceTtsConfig: VoicePipelineOptions['ttsConfig'];\n\n if (sttConfig.provider === 'deepgram') {\n voiceSttConfig = {\n provider: 'deepgram',\n apiKey: sttConfig.apiKey,\n model: sttConfig.model,\n };\n } else if (sttConfig.provider === 'elevenlabs') {\n voiceSttConfig = {\n provider: 'elevenlabs',\n apiKey: sttConfig.apiKey,\n language: sttConfig.language,\n };\n } else {\n voiceSttConfig = {\n provider: 'web-speech',\n language: sttConfig.language,\n continuous: sttConfig.continuous,\n interimResults: sttConfig.interimResults,\n };\n }\n\n if (ttsConfig.provider === 'elevenlabs') {\n voiceTtsConfig = {\n provider: 'elevenlabs',\n apiKey: ttsConfig.apiKey,\n voiceId: 'voiceId' in ttsConfig ? ttsConfig.voiceId : undefined,\n };\n } else {\n voiceTtsConfig = {\n provider: 'web-speech',\n voice: ttsConfig.voice,\n rate: ttsConfig.rate,\n pitch: ttsConfig.pitch,\n language: ttsConfig.language,\n };\n }\n\n try {\n this.voicePipeline = new VoicePipeline({\n sttConfig: voiceSttConfig,\n ttsConfig: voiceTtsConfig,\n debug: this._debug,\n });\n\n // Forward voice events to the EventBus\n this.voicePipeline.onStateChange((state, previous) => {\n this.bus.emit('voice:state-change', { from: previous, to: state });\n // Map voice state to agent state\n switch (state) {\n case 'listening':\n this.setAgentState({ status: 'listening', durationMs: 0 });\n break;\n case 'speaking':\n this.setAgentState({ status: 'speaking', utterance: '' });\n break;\n case 'idle':\n if (this._agentState.status !== 'processing') {\n this.setAgentState({ status: 'idle' });\n }\n break;\n }\n });\n\n this.voicePipeline.onTranscript((text, isFinal) => {\n this.bus.emit('voice:transcript', {\n text,\n isFinal,\n confidence: 0.95,\n });\n if (isFinal && text.trim()) {\n this.voicePipeline?.processTranscript(text, (t) => this.sendText(t));\n }\n });\n\n this.resourceManager.register({\n name: 'voice-pipeline',\n cleanup: () => this.voicePipeline?.destroy(),\n });\n } catch (_err) {\n // Voice pipeline may fail in non-browser environments (SSR, jsdom)\n this.voicePipeline = null as unknown as VoicePipeline;\n if (this._debug) {\n console.debug('[GuideKit:Core] Voice pipeline unavailable in this environment');\n }\n }\n }\n\n // -- Restore session ----------------------------------------------------\n\n const session = this.contextManager.restoreSession();\n if (session && this._debug) {\n console.debug(\n '[GuideKit:Core] Restored session with',\n session.conversationHistory.length,\n 'turns',\n );\n }\n\n // -- Mark ready ---------------------------------------------------------\n\n this.resourceManager.markReady();\n this._isReady = true;\n this.notifyStoreListeners();\n this._options.onReady?.();\n\n if (this._debug) {\n console.debug('[GuideKit:Core] Initialized', {\n instanceId: this.instanceId,\n sections: this._currentPageModel?.sections.length,\n });\n }\n }\n\n // -------------------------------------------------------------------------\n // sendText — send a text message to the LLM\n // -------------------------------------------------------------------------\n\n async sendText(message_: string): Promise<string> {\n let message = message_;\n if (!this._isReady || !this.llmOrchestrator) {\n throw new ConfigurationError({\n code: ErrorCodes.CONFIG_MISSING_REQUIRED,\n message: 'SDK not initialized or LLM not configured.',\n suggestion:\n 'Ensure init() has been called and LLM config is provided.',\n });\n }\n\n if (this._sendInFlight) {\n throw new GuideKitError({\n code: 'SEND_IN_FLIGHT',\n message: 'A message is already being processed. Wait for it to complete.',\n recoverable: true,\n suggestion: 'Await the previous sendText() call before sending another message.',\n });\n }\n this._sendInFlight = true;\n\n const maxLen = this._options.options?.maxMessageLength ?? 10_000;\n if (message_.length > maxLen) {\n throw new GuideKitError({\n code: 'INPUT_TOO_LONG',\n message: `Message exceeds maximum length of ${maxLen} characters.`,\n recoverable: true,\n suggestion: `Shorten your message to ${maxLen} characters or fewer, or increase maxMessageLength in options.`,\n });\n }\n\n // Check rate limits before proceeding\n this.rateLimiter.checkLLMCall();\n\n // Update agent state\n this.setAgentState({ status: 'processing', transcript: message });\n\n // Add user turn\n this.contextManager.addTurn({\n role: 'user',\n content: message,\n timestamp: Date.now(),\n });\n\n // Build system prompt\n let systemPrompt = this.contextManager.buildSystemPrompt(\n this._currentPageModel!,\n this.getToolDefinitions(),\n );\n\n // Privacy hook — allow developer to scrub PII before LLM call\n if (this._options.onBeforeLLMCall) {\n try {\n const ctx = await this._options.onBeforeLLMCall({\n systemPrompt,\n userMessage: message,\n conversationHistory: this.contextManager\n .getHistory()\n .map((t) => ({ role: t.role, content: t.content })),\n });\n systemPrompt = ctx.systemPrompt;\n message = ctx.userMessage;\n } catch (hookErr) {\n // Hook threw — cancel the LLM call\n this.setAgentState({ status: 'idle' });\n const err =\n hookErr instanceof GuideKitError\n ? hookErr\n : new GuideKitError({\n code: ErrorCodes.PRIVACY_HOOK_CANCELLED,\n message:\n hookErr instanceof Error\n ? hookErr.message\n : 'onBeforeLLMCall hook cancelled the request.',\n recoverable: true,\n suggestion: 'Check your onBeforeLLMCall implementation.',\n });\n this.bus.emit('error', err);\n throw err;\n }\n }\n\n const conversationId = generateUUID();\n this.bus.emit('llm:response-start', { conversationId });\n\n try {\n let responseText: string;\n let totalTokens: number;\n\n // Use multi-turn ToolExecutor if available, else single-turn\n if (this.toolExecutor) {\n const result = await this.toolExecutor.executeWithTools({\n llm: this.llmOrchestrator,\n systemPrompt,\n history: this.contextManager.getHistory().slice(0, -1),\n userMessage: message,\n tools: this.getToolDefinitions(),\n signal: this._instanceAbortController.signal,\n });\n responseText = result.text;\n totalTokens = result.totalUsage.total;\n } else {\n const result = await this.llmOrchestrator.sendMessage({\n systemPrompt,\n history: this.contextManager.getHistory().slice(0, -1),\n userMessage: message,\n tools: this.getToolDefinitions(),\n signal: this._instanceAbortController.signal,\n });\n responseText = result.text;\n totalTokens = result.usage.total;\n }\n\n // Add assistant turn\n this.contextManager.addTurn({\n role: 'assistant',\n content: responseText,\n timestamp: Date.now(),\n });\n\n // Save session\n this.contextManager.saveSession();\n\n this.bus.emit('llm:response-end', {\n conversationId,\n totalTokens,\n });\n\n this.setAgentState({ status: 'idle' });\n\n return responseText;\n } catch (error) {\n const err =\n error instanceof GuideKitError\n ? error\n : new GuideKitError({\n code: ErrorCodes.UNKNOWN,\n message:\n error instanceof Error ? error.message : 'Unknown error',\n recoverable: false,\n suggestion: 'Check the console for details.',\n });\n\n this.setAgentState({ status: 'error', error: err });\n this.bus.emit('error', err);\n throw err;\n } finally {\n this._sendInFlight = false;\n }\n }\n\n // -------------------------------------------------------------------------\n // Accessors\n // -------------------------------------------------------------------------\n\n /** Get the current page model. */\n get pageModel(): PageModel | null {\n return this._currentPageModel;\n }\n\n /** Whether the SDK has been fully initialized. */\n get isReady(): boolean {\n return this._isReady;\n }\n\n /** Current agent state. */\n get agentState(): AgentState {\n return this._agentState;\n }\n\n /** Current auth token string, or null if not using token-based auth. */\n get currentToken(): string | null {\n return this.tokenManager?.token ?? null;\n }\n\n // -------------------------------------------------------------------------\n // Store subscription (for useSyncExternalStore)\n // -------------------------------------------------------------------------\n\n subscribe(listener: () => void): () => void {\n this.storeListeners.add(listener);\n return () => {\n this.storeListeners.delete(listener);\n };\n }\n\n getSnapshot(): GuideKitStore {\n return this._storeSnapshot;\n }\n\n // -------------------------------------------------------------------------\n // Custom actions\n // -------------------------------------------------------------------------\n\n registerAction(\n actionId: string,\n action: {\n description: string;\n parameters: Record<string, unknown>;\n handler: (params: Record<string, unknown>) => Promise<unknown>;\n },\n ): void {\n this.customActions.set(actionId, action);\n }\n\n // -------------------------------------------------------------------------\n // Voice control\n // -------------------------------------------------------------------------\n\n /** Start listening for voice input. Initializes voice pipeline on first call. */\n async startListening(): Promise<void> {\n if (!this.voicePipeline) {\n if (this._debug) {\n console.debug('[GuideKit:Core] No voice pipeline configured — cannot start listening');\n }\n return;\n }\n await this.voicePipeline.init();\n await this.voicePipeline.startListening();\n }\n\n /** Stop listening for voice input. */\n stopListening(): void {\n this.voicePipeline?.stopListening();\n }\n\n /** Stop current TTS playback (barge-in). */\n stopSpeaking(): void {\n this.voicePipeline?.stopSpeaking();\n }\n\n /** Whether voice pipeline is available. */\n get hasVoice(): boolean {\n return this.voicePipeline !== null;\n }\n\n // -------------------------------------------------------------------------\n // Visual guidance (public API)\n // -------------------------------------------------------------------------\n\n /** Highlight an element by sectionId or CSS selector. */\n highlight(params: {\n sectionId?: string;\n selector?: string;\n tooltip?: string;\n position?: 'top' | 'bottom' | 'left' | 'right' | 'auto';\n }): boolean {\n if (!this.visualGuidance) return false;\n const result = this.visualGuidance.highlight(params);\n if (result) {\n this.bus.emit('visual:spotlight-shown', {\n selector: params.selector ?? params.sectionId ?? '',\n sectionId: params.sectionId,\n });\n }\n return result;\n }\n\n /** Dismiss the current spotlight highlight. */\n dismissHighlight(): void {\n this.visualGuidance?.dismissHighlight();\n this.bus.emit('visual:spotlight-dismissed', {});\n }\n\n /** Smooth scroll to a section. */\n scrollToSection(sectionId: string, offset?: number): void {\n this.visualGuidance?.scrollToSection(sectionId, offset);\n }\n\n /** Smooth scroll to a CSS selector. */\n scrollToSelector(selector: string, offset?: number): void {\n this.visualGuidance?.scrollToSelector(selector, offset);\n }\n\n /** Start a guided tour. */\n startTour(sectionIds: string[], mode?: 'auto' | 'manual'): void {\n this.visualGuidance?.startTour(sectionIds, mode);\n }\n\n /** Advance to next tour step. */\n nextTourStep(): void {\n this.visualGuidance?.nextTourStep();\n }\n\n /** Go back to previous tour step. */\n prevTourStep(): void {\n this.visualGuidance?.prevTourStep();\n }\n\n /** Stop the guided tour. */\n stopTour(): void {\n this.visualGuidance?.stopTour();\n }\n\n /** Navigate to a same-origin URL. */\n async navigate(href: string): Promise<boolean> {\n if (!this.navigationController) return false;\n return this.navigationController.navigate(href);\n }\n\n // -------------------------------------------------------------------------\n // Context management\n // -------------------------------------------------------------------------\n\n setPageContext(context: Record<string, unknown>): void {\n this.contextManager.setPageContext(context);\n if (this._debug) {\n console.debug('[GuideKit:Core] setPageContext', context);\n }\n }\n\n /** Get the i18n instance for localized strings. */\n get i18n(): I18n {\n return this._i18n;\n }\n\n /** Get/set quiet mode on proactive triggers. */\n get quietMode(): boolean {\n return this.proactiveEngine?.quietMode ?? false;\n }\n\n set quietMode(value: boolean) {\n if (this.proactiveEngine) {\n this.proactiveEngine.quietMode = value;\n }\n this.contextManager.quietMode = value;\n }\n\n /** Get/set user preference (voice/text). */\n get userPreference(): 'voice' | 'text' {\n return this.contextManager.userPreference;\n }\n\n set userPreference(value: 'voice' | 'text') {\n this.contextManager.userPreference = value;\n }\n\n /** Get the rate limiter for monitoring usage. */\n get rateLimiterState() {\n return this.rateLimiter.getState();\n }\n\n // -------------------------------------------------------------------------\n // Health check\n // -------------------------------------------------------------------------\n\n /**\n * Check health of all connected services.\n * Returns per-service status and an overall assessment.\n */\n async checkHealth(): Promise<HealthCheckResult> {\n const results: HealthCheckResult = {\n llm: { status: 'not-configured' },\n stt: { status: 'not-configured' },\n tts: { status: 'not-configured' },\n mic: { status: 'not-configured' },\n overall: 'ok',\n };\n\n // LLM check\n if (this.llmOrchestrator) {\n try {\n const start = Date.now();\n // Lightweight check — just verify the orchestrator is alive\n results.llm = {\n status: 'ok',\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n results.llm = {\n status: 'unavailable',\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n }\n\n // STT check — report as configured only if user explicitly provided STT config\n // or if voice pipeline is active (web-speech auto-default still works on demand)\n if (this._options.stt) {\n results.stt = { status: this.voicePipeline ? 'ok' : 'degraded' };\n }\n\n // TTS check — same logic as STT\n if (this._options.tts) {\n results.tts = { status: this.voicePipeline ? 'ok' : 'degraded' };\n }\n\n // Mic check\n if (typeof navigator !== 'undefined' && navigator.mediaDevices) {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const hasMic = devices.some((d) => d.kind === 'audioinput');\n results.mic = { status: hasMic ? 'ok' : 'unavailable' };\n } catch (err) {\n results.mic = {\n status: 'unavailable',\n error: err instanceof Error ? err.message : 'Permission denied',\n };\n }\n }\n\n // Compute overall\n const statuses = [results.llm, results.stt, results.tts, results.mic];\n const configured = statuses.filter((s) => s.status !== 'not-configured');\n if (configured.some((s) => s.status === 'unavailable')) {\n results.overall = 'unavailable';\n } else if (configured.some((s) => s.status === 'degraded')) {\n results.overall = 'degraded';\n } else {\n results.overall = 'ok';\n }\n\n return results;\n }\n\n // -------------------------------------------------------------------------\n // Cleanup\n // -------------------------------------------------------------------------\n\n async destroy(): Promise<void> {\n this._instanceAbortController.abort();\n this.contextManager.saveSession();\n SingletonGuard.release(this.instanceId);\n this._isReady = false;\n this.notifyStoreListeners();\n\n if (this._debug) {\n console.debug('[GuideKit:Core] Destroyed instance', this.instanceId);\n }\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n private setAgentState(state: AgentState): void {\n this._agentState = state;\n this.notifyStoreListeners();\n }\n\n private notifyStoreListeners(): void {\n this._storeSnapshot = this.buildSnapshot();\n for (const listener of this.storeListeners) {\n listener();\n }\n }\n\n private buildSnapshot(): GuideKitStore {\n return {\n status: {\n isReady: this._isReady,\n agentState: this._agentState,\n error:\n this._agentState.status === 'error'\n ? this._agentState.error\n : null,\n },\n voice: {\n isListening: this._agentState.status === 'listening',\n isSpeaking: this._agentState.status === 'speaking',\n },\n };\n }\n\n /**\n * Unified built-in tool specifications — single source of truth for both\n * tool definitions (sent to LLM) and handler registration.\n */\n private getBuiltinToolSpecs(): Array<ToolDefinition & { execute: (args: Record<string, unknown>) => Promise<unknown> }> {\n return [\n {\n name: 'highlight',\n description:\n 'Spotlight an element on the page to draw the user\\'s attention. Use sectionId to highlight a page section, or selector for a specific CSS selector. Optionally add a tooltip with explanation text.',\n parameters: {\n sectionId: { type: 'string', description: 'ID of the section to highlight' },\n selector: { type: 'string', description: 'CSS selector (overrides sectionId)' },\n tooltip: { type: 'string', description: 'Text to show in tooltip' },\n position: { type: 'string', enum: ['top', 'bottom', 'left', 'right', 'auto'], description: 'Tooltip position' },\n },\n required: [],\n schemaVersion: 1,\n execute: async (args) => {\n const sectionId = args.sectionId as string | undefined;\n const selector = args.selector as string | undefined;\n const tooltip = args.tooltip as string | undefined;\n const position = args.position as 'top' | 'bottom' | 'left' | 'right' | 'auto' | undefined;\n const result = this.highlight({ sectionId, selector, tooltip, position });\n return { success: result };\n },\n },\n {\n name: 'dismissHighlight',\n description: 'Remove the current spotlight overlay.',\n parameters: {},\n required: [],\n schemaVersion: 1,\n execute: async () => {\n this.dismissHighlight();\n return { success: true };\n },\n },\n {\n name: 'scrollToSection',\n description:\n 'Smooth scroll to a section by its ID. Use offset to account for sticky headers.',\n parameters: {\n sectionId: { type: 'string', description: 'ID of the section to scroll to' },\n offset: { type: 'number', description: 'Pixel offset for sticky headers' },\n },\n required: ['sectionId'],\n schemaVersion: 1,\n execute: async (args) => {\n const sectionId = args.sectionId as string;\n const offset = args.offset as number | undefined;\n this.scrollToSection(sectionId, offset);\n return { success: true };\n },\n },\n {\n name: 'navigate',\n description:\n 'Navigate to a different page within the same site. Only same-origin URLs are allowed.',\n parameters: {\n href: { type: 'string', description: 'URL or path to navigate to (same-origin only)' },\n },\n required: ['href'],\n schemaVersion: 1,\n execute: async (args) => {\n const href = args.href as string;\n const result = await this.navigate(href);\n return { success: result, navigatedTo: result ? href : null };\n },\n },\n {\n name: 'startTour',\n description:\n 'Start a guided tour through multiple sections in sequence.',\n parameters: {\n sectionIds: { type: 'array', items: { type: 'string' }, description: 'Section IDs in tour order' },\n mode: { type: 'string', enum: ['auto', 'manual'], description: 'auto advances automatically; manual waits for user' },\n },\n required: ['sectionIds'],\n schemaVersion: 1,\n execute: async (args) => {\n const sectionIds = args.sectionIds as string[];\n const mode = (args.mode as 'auto' | 'manual') ?? 'manual';\n this.startTour(sectionIds, mode);\n return { success: true, steps: sectionIds.length };\n },\n },\n {\n name: 'readPageContent',\n description:\n 'Read visible text content of a section by ID, or search across all sections by keyword.',\n parameters: {\n sectionId: { type: 'string', description: 'Section ID to read' },\n query: { type: 'string', description: 'Keyword to search for across sections' },\n },\n required: [],\n schemaVersion: 1,\n execute: async (args) => {\n const sectionId = args.sectionId as string | undefined;\n const query = args.query as string | undefined;\n const model = this._currentPageModel;\n if (!model) return { error: 'No page model available' };\n\n if (sectionId) {\n const section = model.sections.find((s) => s.id === sectionId);\n if (section) {\n const contentMapResult = await this.contextManager.getContent(sectionId);\n return {\n sectionId: section.id,\n label: section.label,\n summary: section.summary,\n contentMap: contentMapResult,\n };\n }\n return { error: `Section \"${sectionId}\" not found` };\n }\n\n if (query) {\n const queryLower = query.toLowerCase();\n const matches = model.sections.filter(\n (s) =>\n s.label?.toLowerCase().includes(queryLower) ||\n s.summary?.toLowerCase().includes(queryLower),\n );\n return {\n query,\n results: matches.slice(0, 5).map((s) => ({\n sectionId: s.id,\n label: s.label,\n snippet: s.summary?.slice(0, 200),\n })),\n };\n }\n\n return { error: 'Provide either sectionId or query' };\n },\n },\n {\n name: 'getVisibleSections',\n description:\n 'Get the list of sections currently visible in the user viewport.',\n parameters: {},\n required: [],\n schemaVersion: 1,\n execute: async () => {\n const model = this._currentPageModel;\n if (!model) return { sections: [] };\n return {\n sections: model.sections.slice(0, 10).map((s) => ({\n id: s.id,\n label: s.label,\n selector: s.selector,\n score: s.score,\n })),\n };\n },\n },\n {\n name: 'clickElement',\n description:\n 'Programmatically click an interactive element on the page.',\n parameters: {\n selector: { type: 'string', description: 'CSS selector of the element to click' },\n },\n required: ['selector'],\n schemaVersion: 1,\n execute: async (args) => {\n if (typeof document === 'undefined') return { success: false, error: 'Not in browser' };\n const selector = args.selector as string;\n\n const el = document.querySelector(selector);\n if (!el) return { success: false, error: `Element not found: ${selector}` };\n if (!(el instanceof HTMLElement)) return { success: false, error: 'Element is not clickable' };\n\n const clickableRules = this._options.options?.clickableSelectors;\n const isInDevAllowList = clickableRules?.allow?.some((pattern) => {\n try { return el.matches(pattern); } catch { return selector === pattern; }\n }) ?? false;\n\n if (!isInDevAllowList) {\n const defaultDenied = DEFAULT_CLICK_DENY.some((pattern) => {\n try { return el.matches(pattern); } catch { return false; }\n });\n if (defaultDenied) {\n return { success: false, error: `Selector \"${selector}\" matches the default deny list. Add it to clickableSelectors.allow to override.` };\n }\n }\n\n if (clickableRules?.deny?.length) {\n const denied = clickableRules.deny.some((pattern) => {\n try { return el.matches(pattern); } catch { return selector === pattern; }\n });\n if (denied) {\n return { success: false, error: `Selector \"${selector}\" is blocked by the deny list.` };\n }\n }\n\n if (clickableRules?.allow?.length && !isInDevAllowList) {\n return { success: false, error: `Selector \"${selector}\" is not in the allowed clickable selectors list.` };\n }\n\n el.click();\n return { success: true };\n },\n },\n {\n name: 'executeCustomAction',\n description:\n 'Execute a developer-registered custom action (e.g., add to cart, submit form).',\n parameters: {\n actionId: { type: 'string', description: 'ID of the custom action' },\n params: { type: 'object', description: 'Parameters for the action' },\n },\n required: ['actionId'],\n schemaVersion: 1,\n execute: async (args) => {\n const actionId = args.actionId as string;\n const params = (args.params as Record<string, unknown>) ?? {};\n const action = this.customActions.get(actionId);\n if (!action) return { error: `Unknown action: ${actionId}` };\n try {\n const result = await action.handler(params);\n return { success: true, result };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n },\n },\n ];\n }\n\n /**\n * Register all built-in tool handlers with the ToolExecutor.\n * Called once during init() after VisualGuidance and all subsystems are ready.\n */\n private registerBuiltinTools(): void {\n if (!this.toolExecutor) return;\n for (const spec of this.getBuiltinToolSpecs()) {\n this.toolExecutor.registerTool({ name: spec.name, execute: spec.execute });\n }\n }\n\n private getToolDefinitions(): ToolDefinition[] {\n const builtinTools: ToolDefinition[] = this.getBuiltinToolSpecs().map(\n ({ execute: _execute, ...def }) => def,\n );\n\n // Add custom actions as individual tool definitions for better LLM discoverability\n for (const [actionId, action] of this.customActions) {\n builtinTools.push({\n name: `action_${actionId}`,\n description: action.description,\n parameters: action.parameters as Record<string, ToolParameterSchema>,\n schemaVersion: 1,\n });\n }\n\n return builtinTools;\n }\n}\n"]}
|