@heybello/bello-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.es.js","sources":["../src/mountShadow.ts","../src/api.ts","../src/widget/useLiveKit.ts","../src/widget/ChatInput.tsx","../src/widget/transcriptionUtils.ts","../src/widget/useChatAndTranscription.ts","../src/widget/ChatEntry.tsx","../src/widget/BelloWidget.tsx","../src/index.css?inline","../src/polyfills.ts","../src/embed-runtime.tsx","../src/react-wrapper.tsx"],"sourcesContent":["export function ensureContainer(\n id = 'bello-widget-root'\n): HTMLElement {\n let el = document.getElementById(id);\n if (!el) {\n el = document.createElement('div');\n el.id = id;\n el.style.position = 'relative';\n el.style.zIndex = '2147483646';\n document.body.appendChild(el);\n }\n return el;\n}\n\nexport function createShadowHost(container: HTMLElement): ShadowRoot {\n let root = (container as any)._shadowRoot as ShadowRoot | undefined;\n if (!root) {\n root = container.attachShadow({ mode: 'open' });\n (container as any)._shadowRoot = root;\n }\n return root;\n}\n","import type {\n ConnectionDetails,\n InitOptions,\n PublicConfig,\n} from './types';\n\nfunction normalizeVars(\n v: unknown\n): Record<string, string> | undefined {\n if (!v || typeof v !== 'object') return undefined;\n const out: Record<string, string> = {};\n for (const [k, val] of Object.entries(v as Record<string, any>)) {\n if (val == null) continue;\n const key = k.startsWith('--') ? k : `--${k}`;\n out[key] = String(val);\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nexport async function fetchPublicConfig(\n opts: InitOptions\n): Promise<PublicConfig> {\n const base = opts.apiBaseUrl ?? '';\n const res = await fetch(\n `${base}/api/projects/${encodeURIComponent(opts.projectId)}`,\n {\n method: 'GET',\n mode: 'cors',\n credentials: 'omit',\n headers: { Accept: 'application/json' },\n }\n );\n if (!res.ok) throw new Error(`Config fetch failed: ${res.status}`);\n\n const project = await res.json();\n const wc =\n project?.project?.widget_config ?? project?.widget_config ?? {};\n\n const themeVars =\n normalizeVars(wc.theme_vars) ||\n normalizeVars(wc.themeVars) ||\n normalizeVars(wc.css_vars) ||\n undefined;\n\n return {\n widgetTitle:\n wc.widget_title ?? opts.widgetTitle ?? 'Chat with AI',\n widgetButtonTitle:\n wc.widget_button_title ??\n opts.widgetButtonTitle ??\n 'Start chat',\n orbStyle: wc.orb_style ?? opts.orbStyle ?? 'galaxy',\n theme: wc.theme ?? opts.theme ?? 'dark',\n position: wc.position ?? opts.position ?? 'bottom-right',\n themeVars,\n };\n}\n\nexport async function fetchConnectionDetails(\n opts: InitOptions\n): Promise<ConnectionDetails> {\n const base = opts.apiBaseUrl ?? '';\n const res = await fetch(\n `${base}/api/livekit/token/${encodeURIComponent(opts.projectId)}`,\n {\n method: 'POST',\n mode: 'cors',\n credentials: 'omit',\n headers: { 'Content-Type': 'application/json' },\n }\n );\n if (!res.ok) throw new Error(`Token fetch failed: ${res.status}`);\n const j = await res.json();\n return {\n serverUrl: j.serverUrl ?? j.livekit_url,\n participantToken: j.participantToken ?? j.token,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { Room, RoomEvent } from 'livekit-client';\nimport type { InitOptions } from '../types';\nimport { fetchConnectionDetails } from '../api';\n\n/**\n * Reliable LiveKit connect flow for embedded usage:\n * - Resumes AudioContext (autoplay policy)\n * - Atomic mic + connect with preConnectBuffer\n * - Basic event handling + cleanup\n */\nexport function useLiveKit(opts: InitOptions, enabled: boolean) {\n const room = useMemo(() => new Room(), []);\n const [error, setError] = useState<string | null>(null);\n const [connecting, setConnecting] = useState(false);\n const [connected, setConnected] = useState(false);\n\n useEffect(() => {\n if (!enabled) return;\n let cancelled = false;\n\n const enableAudioContext = async () => {\n try {\n const Ctx =\n (window as any).AudioContext ||\n (window as any).webkitAudioContext;\n if (Ctx) {\n const ctx = new Ctx();\n if (ctx.state === 'suspended') await ctx.resume();\n }\n } catch {\n // ignore\n }\n };\n\n const onMediaDevicesError = (err: Error) => {\n if (!cancelled) setError(`${err.name}: ${err.message}`);\n };\n const onDisconnected = () => {\n if (!cancelled) setConnected(false);\n };\n\n room.on(RoomEvent.MediaDevicesError, onMediaDevicesError);\n room.on(RoomEvent.Disconnected, onDisconnected);\n\n (async () => {\n try {\n setConnecting(true);\n await enableAudioContext();\n\n const { serverUrl, participantToken } =\n await fetchConnectionDetails(opts);\n if (cancelled) return;\n\n // Atomic connect: mic + connect concurrently\n await Promise.all([\n room.localParticipant.setMicrophoneEnabled(\n true,\n undefined,\n { preConnectBuffer: true }\n ),\n room.connect(serverUrl, participantToken),\n ]);\n\n if (!cancelled) setConnected(true);\n } catch (e: any) {\n if (!cancelled) {\n setError(`${e?.name ?? 'Error'}: ${e?.message ?? 'unknown'}`);\n }\n } finally {\n if (!cancelled) setConnecting(false);\n }\n })();\n\n return () => {\n cancelled = true;\n room.off(RoomEvent.MediaDevicesError, onMediaDevicesError);\n room.off(RoomEvent.Disconnected, onDisconnected);\n try {\n room.disconnect();\n } catch {}\n setConnected(false);\n setConnecting(false);\n };\n }, [enabled, room, opts.apiBaseUrl, opts.projectId]);\n\n return { room, error, setError, connecting, connected };\n}\n","import * as React from 'react';\n\nexport default function ChatInput({\n onSend,\n disabled,\n}: {\n onSend: (text: string) => void;\n disabled?: boolean;\n}) {\n const [message, setMessage] = React.useState('');\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const submit = (e: React.FormEvent) => {\n e.preventDefault();\n const txt = message.trim();\n if (!txt) return;\n onSend(txt);\n setMessage('');\n };\n\n React.useEffect(() => {\n if (!disabled) inputRef.current?.focus();\n }, [disabled]);\n\n return (\n <form className=\"chat-input-row\" onSubmit={submit}>\n <input\n ref={inputRef}\n type=\"text\"\n className=\"chat-input\"\n value={message}\n // disabled={disabled}\n autoComplete=\"off\"\n placeholder={disabled ? 'Connecting…' : 'Type a message…'}\n onChange={(e) => setMessage(e.target.value)}\n aria-label=\"Message\"\n />\n <button\n type=\"submit\"\n className=\"bello-trigger small\"\n disabled={disabled || message.trim().length === 0}\n aria-label=\"Send\"\n >\n Send\n </button>\n </form>\n );\n}\n","// src/widget/transcriptionUtils.ts\nimport type { Room } from 'livekit-client';\nimport type {\n TextStreamData,\n ReceivedChatMessage,\n} from '@livekit/components-react';\n\n/** Cache a sticky decision for each utterance so the side never flips mid-stream. */\nconst stickySide = new Map<string, boolean>(); // utteranceKey -> isLocal(user/right)\n\n/* -------------------------- helpers for your shape -------------------------- */\n\nfunction getAttr(t: any, k: string): string | undefined {\n return t?.streamInfo?.attributes?.[k] ?? t?.attributes?.[k];\n}\n\nfunction getIdentity(t: any): string | undefined {\n return (\n t?.participantInfo?.identity ??\n t?.participant?.identity ??\n t?.participantIdentity ??\n t?.participantSid\n );\n}\n\nfunction getTimestamp(t: any): number {\n const ts = t?.streamInfo?.timestamp ?? t?.timestamp ?? t?.time;\n return typeof ts === 'number' ? ts : Date.now();\n}\n\nexport function extractText(t: any): string {\n // Your payload: { text: \"...\" }\n return (\n t?.text ?? t?.alternatives?.[0]?.text ?? t?.result?.text ?? ''\n );\n}\n\nexport function isFinalUtterance(t: any): boolean {\n // Your payload uses \"lk.transcription_final\": \"true\" | \"false\"\n const f = getAttr(t, 'lk.transcription_final');\n if (typeof f === 'string') return f.toLowerCase() === 'true';\n\n // Other common shapes\n return Boolean(\n t?.isFinal ||\n t?.final ||\n t?.result?.is_final ||\n t?.result?.final ||\n t?.alternatives?.[0]?.isFinal\n );\n}\n\n/** A stable key per utterance: prefer LiveKit segment id, then stream id, then a fallback */\nexport function utteranceKeyOf(t: any): string {\n return (\n getAttr(t, 'lk.segment_id') ||\n t?.streamInfo?.id ||\n `${getIdentity(t) || 'p'}:${getTimestamp(t)}`\n );\n}\n\n/* -------------------------- side decision (sticky) -------------------------- */\n\nfunction rememberSide(key: string, v: boolean) {\n stickySide.set(key, v);\n return v;\n}\n\nfunction guessLocalByIdentity(id?: string): boolean | undefined {\n if (!id) return undefined;\n // Your identities look like \"user-844feb9f\" and \"agent-<...>\"\n if (id.startsWith('user-')) return true;\n if (id.startsWith('agent-')) return false;\n return undefined;\n}\n\n/** Decide \"isLocal\" once per utterance; trust identity hints and fall back to room.identity */\nexport function decideIsLocalOnce(\n key: string,\n t: any,\n room?: Room\n): boolean {\n if (stickySide.has(key)) return stickySide.get(key)!;\n\n // 1) Strong hint from identity prefix\n const id = getIdentity(t);\n const byPrefix = guessLocalByIdentity(id);\n if (typeof byPrefix === 'boolean')\n return rememberSide(key, byPrefix);\n\n // 2) Participant.isLocal (some shapes)\n const p = (t?.participant || {}) as any;\n if (typeof p?.isLocal === 'boolean')\n return rememberSide(key, p.isLocal);\n\n // 3) Match against room.localParticipant\n const lp = (room?.localParticipant as any) || {};\n const localId = lp.identity ?? lp.sid;\n if (localId && id)\n return rememberSide(key, String(localId) === String(id));\n\n // 4) Last resort: assume remote/agent\n return rememberSide(key, false);\n}\n\n/* -------------------------- main converter -------------------------- */\n\nexport function transcriptionToChatMessage(\n t: TextStreamData,\n room?: Room\n): ReceivedChatMessage {\n const anyT = t as any;\n const key = utteranceKeyOf(anyT);\n const ts = getTimestamp(anyT);\n const text = extractText(anyT);\n\n const identity = getIdentity(anyT);\n const isLocal = decideIsLocalOnce(key, anyT, room);\n\n // Compose a ReceivedChatMessage compatible shape\n return {\n id: `tx-${key}`, // one id per utterance (collapses partials into a single bubble)\n from: {\n // Compatible with ChatEntry expectations\n isLocal,\n name: isLocal ? 'You' : 'Agent',\n identity: identity ?? (isLocal ? 'local' : 'agent'),\n } as any,\n message: text,\n timestamp: ts,\n } as unknown as ReceivedChatMessage;\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n type ReceivedChatMessage,\n type TextStreamData,\n useChat,\n useRoomContext,\n useTranscriptions,\n} from '@livekit/components-react';\nimport {\n transcriptionToChatMessage,\n utteranceKeyOf,\n extractText,\n isFinalUtterance,\n} from './transcriptionUtils';\n\n/**\n * Merges LiveKit transcriptions + data channel chat:\n * - Sticky side per utterance (no flicker)\n * - Agent speech appears immediately (no need to type)\n * - Finalized voice turns persist\n * - Exposes `revision` so UIs can auto-scroll even when length is unchanged\n */\nexport default function useChatAndTranscription() {\n const transcriptions: TextStreamData[] = useTranscriptions();\n const chat = useChat();\n const room = useRoomContext();\n\n // Persistent store of utterances for the widget session\n const storeRef = useRef<\n Map<\n string,\n { msg: ReceivedChatMessage; final: boolean; lastText: string }\n >\n >(new Map());\n const orderRef = useRef<string[]>([]);\n const [, force] = useState(0);\n\n // Signature to detect updates even if the array is mutated in place\n const last = transcriptions[transcriptions.length - 1] as any;\n const txSig =\n transcriptions.length === 0\n ? '0'\n : `${transcriptions.length}:${utteranceKeyOf(\n last\n )}:${extractText(last)}:${isFinalUtterance(last) ? 1 : 0}`;\n\n useEffect(() => {\n if (!transcriptions?.length) return;\n\n let changed = false;\n\n for (const t of transcriptions) {\n const anyT = t as any;\n const k = `tx-${utteranceKeyOf(anyT)}`;\n const next = transcriptionToChatMessage(t, room as any);\n const txt = extractText(anyT);\n const fin = isFinalUtterance(anyT);\n\n const prev = storeRef.current.get(k);\n if (!prev) {\n storeRef.current.set(k, {\n msg: next,\n final: Boolean(fin),\n lastText: txt,\n });\n orderRef.current.push(k);\n changed = true;\n continue;\n }\n\n const needTextUpdate = txt && txt !== prev.lastText;\n const becameFinal = !prev.final && fin;\n\n if (needTextUpdate || becameFinal) {\n storeRef.current.set(k, {\n msg: {\n ...prev.msg,\n message: needTextUpdate ? txt : prev.msg.message,\n timestamp: Math.max(\n prev.msg.timestamp || 0,\n next.timestamp || 0\n ),\n from: {\n ...(prev.msg.from as any),\n isLocal: (prev.msg.from as any)?.isLocal,\n } as any,\n },\n final: prev.final || Boolean(fin),\n lastText: needTextUpdate ? txt : prev.lastText,\n });\n changed = true;\n }\n }\n\n if (changed) force((v) => v + 1);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [txSig, room]);\n\n // Build final list (utterances + data channel chat)\n const messages = useMemo(() => {\n const txMsgs: ReceivedChatMessage[] = orderRef.current\n .map((k) => storeRef.current.get(k)?.msg)\n .filter(Boolean) as ReceivedChatMessage[];\n\n const all = [...txMsgs, ...chat.chatMessages];\n all.sort((a, b) => (a.timestamp || 0) - (b.timestamp || 0));\n return all;\n }, [chat.chatMessages, txSig]);\n\n // Expose a revision that bumps on any voice change\n const revision = useMemo(() => txSig, [txSig]);\n\n return { messages, send: chat.send, revision };\n}\n","import type { ReceivedChatMessage } from '@livekit/components-react';\nimport { useRoomContext } from '@livekit/components-react';\n\nexport default function ChatEntry({\n entry,\n}: {\n entry: ReceivedChatMessage;\n}) {\n const room = useRoomContext();\n const lp = (room?.localParticipant as any) || {};\n const localId: string | undefined = lp.identity ?? lp.sid;\n\n const from: any = entry.from || {};\n const pid = from?.identity ?? from?.sid;\n\n // Prefer sticky flag, then identity match.\n const isUser =\n from?.isLocal === true ||\n (localId && pid && String(localId) === String(pid)) ||\n (typeof pid === 'string' && pid.startsWith('user-'));\n\n const who = isUser ? 'You' : from?.name || 'Agent';\n const time =\n typeof entry.timestamp === 'number'\n ? new Date(entry.timestamp)\n : new Date();\n const timeStr = time.toLocaleTimeString(undefined, {\n timeStyle: 'short',\n });\n\n return (\n <li\n className={`chat-entry ${isUser ? 'me' : 'them'}`}\n title={time.toString()}\n >\n {!isUser && <div className=\"chat-name\">{who}</div>}\n <div className={`chat-bubble ${isUser ? 'me' : 'them'}`}>\n <span className=\"chat-text\">{entry.message}</span>\n <span className=\"chat-time\">{timeStr}</span>\n </div>\n </li>\n );\n}\n","import {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { motion } from 'framer-motion';\nimport {\n RoomContext,\n RoomAudioRenderer,\n StartAudio,\n BarVisualizer,\n useVoiceAssistant,\n} from '@livekit/components-react';\nimport {\n Orb,\n galaxyPreset,\n oceanDepthsPreset,\n caribeanPreset,\n cherryBlossomPreset,\n emeraldPreset,\n multiColorPreset,\n goldenGlowPreset,\n volcanicPreset,\n} from 'react-ai-orb';\nimport { ChevronDown, Phone } from 'lucide-react'; // ← NEW\nimport type { InitOptions, Theme } from '../types';\nimport { useLiveKit } from './useLiveKit';\nimport ChatInput from './ChatInput';\nimport useChatAndTranscription from './useChatAndTranscription';\nimport ChatEntry from './ChatEntry';\n\nfunction preset(style: string) {\n switch (style) {\n case 'ocean-depths':\n return oceanDepthsPreset;\n case 'caribbean':\n return caribeanPreset;\n case 'cherry-blossom':\n return cherryBlossomPreset;\n case 'emerald':\n return emeraldPreset;\n case 'multi-color':\n return multiColorPreset;\n case 'golden-glow':\n return goldenGlowPreset;\n case 'volcanic':\n return volcanicPreset;\n case 'galaxy':\n default:\n return galaxyPreset;\n }\n}\n\nexport function BelloWidget({\n opts,\n theme,\n onClose,\n}: {\n opts: InitOptions;\n theme: Theme;\n onClose: () => void;\n}) {\n const [open, setOpen] = useState(false);\n\n // switches (default true if undefined)\n const agentOn = opts.agentEnabled !== false;\n const voiceOn = opts.voiceEnabled !== false;\n\n // only connect when widget is open AND agent is enabled\n const { room, error, setError, connecting, connected } = useLiveKit(\n opts,\n open && agentOn\n );\n\n // Programmatic open/close support\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n const t = detail?.type;\n if (t === 'open') setOpen(true);\n if (t === 'close') {\n setOpen(false);\n onClose();\n }\n };\n window.addEventListener('bello:event', handler as any);\n return () =>\n window.removeEventListener('bello:event', handler as any);\n }, [onClose]);\n\n const cfg = useMemo(\n () => ({\n title: opts.widgetTitle ?? 'Need support?',\n cta: opts.widgetButtonTitle ?? 'Chat with AI',\n pos: opts.position ?? 'bottom-right',\n orb: opts.orbStyle ?? 'galaxy',\n }),\n [opts]\n );\n\n const cls =\n theme === 'dark'\n ? 'theme-dark'\n : theme === 'glass'\n ? 'theme-glass'\n : 'theme-light';\n\n const collapse = () => {\n setOpen(false);\n onClose(); // triggers LiveKit cleanup (enabled becomes false)\n };\n\n return (\n <div className={cls}>\n {/* Launcher (closed) */}\n {!open && (\n <div className=\"bello-container bello-row\">\n <div className=\"px-3\">\n <Orb\n {...preset(cfg.orb)}\n size={0.7}\n animationSpeedBase={1}\n animationSpeedHue={1}\n mainOrbHueAnimation\n />\n </div>\n <div className=\"bello-title-container\">\n <div className=\"bello-hero\">{cfg.title}</div>\n <button\n className=\"bello-trigger\"\n onClick={() => setOpen(true)}\n >\n {cfg.cta}\n </button>\n </div>\n </div>\n )}\n\n {/* Widget (open) */}\n <motion.div\n className=\"bello-pop\"\n data-pos={cfg.pos}\n initial={false}\n animate={{\n opacity: open ? 1 : 0,\n scale: open ? 1 : 0.98,\n y: open ? 0 : 6,\n pointerEvents: open ? 'auto' : 'none',\n }}\n >\n <div className=\"bello-card bello-body\">\n {/* Header with END button */}\n <div className=\"bello-header\">\n <div className=\"bello-row\">\n <div className=\"pl-2\">\n <Orb\n {...preset(cfg.orb)}\n size={0.5}\n animationSpeedBase={1}\n animationSpeedHue={1}\n mainOrbHueAnimation\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"bello-title\">{cfg.title}</div>\n <div className=\"bello-subtitle\">\n {agentOn\n ? 'Voice & text assistant'\n : 'UI preview (agent off)'}\n </div>\n </div>\n </div>\n <button\n className=\"bello-trigger-danger small\"\n onClick={collapse}\n aria-label=\"End session\"\n title=\"End\"\n >\n <Phone size={14} />\n End\n </button>\n </div>\n\n {/* Body + Footer */}\n {error ? (\n <div className=\"bello-main\">\n <div className=\"bello-error\">\n <div className=\"bello-error-title\">Error</div>\n <div className=\"bello-error-text\">{error}</div>\n <button\n className=\"bello-trigger small mt\"\n onClick={() => setError(null)}\n >\n Dismiss\n </button>\n </div>\n </div>\n ) : agentOn ? (\n <RoomContext.Provider value={room}>\n <div className=\"bello-main\">\n {voiceOn && (\n <>\n <RoomAudioRenderer />\n <StartAudio label=\"Start Audio\" />\n <AgentAudioEnsurePlay />\n </>\n )}\n <TopStatus\n connecting={connecting}\n connected={connected}\n voiceOn={voiceOn}\n />\n <ChatRegion />\n </div>\n\n {/* FOOTER: chat input + send */}\n <div className=\"bello-footer\">\n <FooterInput connected={connected} />\n </div>\n </RoomContext.Provider>\n ) : (\n <>\n <div className=\"bello-main\">\n <div className=\"center\">\n <p className=\"status\">\n UI preview · Agent disabled\n </p>\n </div>\n <div className=\"chat-wrap\">\n <ol className=\"chat-list\" aria-live=\"polite\">\n <li className=\"chat-entry them\">\n <div className=\"chat-name\">Agent</div>\n <div className=\"chat-bubble them\">\n <span className=\"chat-text\">\n Hi! This is UI-only mode.\n </span>\n <span className=\"chat-time\">—</span>\n </div>\n </li>\n </ol>\n </div>\n </div>\n <div className=\"bello-footer\">\n <ChatInput disabled onSend={() => {}} />\n </div>\n </>\n )}\n </div>\n </motion.div>\n\n {/* FAB chevron — visible only when open (bottom corner) */}\n {open && (\n <button\n className=\"bello-fab\"\n onClick={collapse}\n aria-label=\"Collapse widget\"\n title=\"Collapse\"\n >\n <ChevronDown size={20} />\n </button>\n )}\n </div>\n );\n}\n\n/** Small status block above chat */\nfunction TopStatus({\n connecting,\n connected,\n voiceOn = true,\n}: {\n connecting: boolean;\n connected: boolean;\n voiceOn?: boolean;\n}) {\n const { state: agentState, audioTrack } = useVoiceAssistant();\n\n return (\n <div className=\"center\">\n {voiceOn && (\n <BarVisualizer\n barCount={5}\n options={{ minHeight: 6 }}\n className=\"bars\"\n trackRef={audioTrack}\n state={agentState}\n >\n <span className=\"bar\" />\n </BarVisualizer>\n )}\n <p className=\"status\">\n {connecting && 'Connecting…'}\n {!connecting &&\n connected &&\n (agentState === 'speaking'\n ? 'Agent speaking…'\n : agentState === 'listening'\n ? 'Agent listening…'\n : agentState === 'thinking'\n ? 'Agent thinking…'\n : 'Connected')}\n {!connecting && !connected && 'Ready'}\n </p>\n </div>\n );\n}\n\n/** Ensure agent audio plays if auto-attach fails. */\nfunction AgentAudioEnsurePlay() {\n const { audioTrack } = useVoiceAssistant();\n\n useEffect(() => {\n if (!audioTrack) return;\n\n const el = (audioTrack as any)?.attachedElements?.[0] as\n | HTMLAudioElement\n | undefined;\n const kick = (a: HTMLMediaElement) => {\n try {\n a.muted = false;\n (a as any).playsInline = true;\n const p = a.play();\n if (p && typeof p.then === 'function') p.catch(() => {});\n } catch {}\n };\n\n if (el) {\n kick(el);\n return;\n }\n\n try {\n const audio = new Audio();\n audio.autoplay = true;\n (audio as any).playsInline = true;\n audio.muted = false;\n\n if (typeof (audioTrack as any).attach === 'function') {\n (audioTrack as any).attach(audio);\n } else if ((audioTrack as any).mediaStream) {\n (audio as any).srcObject = (audioTrack as any).mediaStream;\n }\n kick(audio);\n } catch {}\n }, [audioTrack]);\n\n return null;\n}\n\n/** Messages only (no input here anymore) */\n\nfunction ChatRegion() {\n const { messages, revision } = useChatAndTranscription();\n\n // The <ol> that renders messages\n const listRef = useRef<HTMLOListElement>(null);\n // Invisible element at the end we can scroll to\n const endRef = useRef<HTMLDivElement>(null);\n // Whether we should keep snapping to the bottom\n const stickRef = useRef(true);\n\n // Track if the user manually scrolled up; if so, don't auto-stick until they return near the bottom\n useEffect(() => {\n // Try the nearest scrollable ancestor; if none, the list itself\n const listEl = listRef.current;\n if (!listEl) return;\n\n // Find the actual scrolling container (bubbles often sit inside a parent with overflow)\n const scroller =\n (listEl.closest(\n '.chat-wrap, .bello-main, .scroll-container'\n ) as HTMLElement) ||\n (listEl.parentElement as HTMLElement) ||\n (listEl as HTMLElement);\n\n const onScroll = () => {\n const nearBottom =\n scroller.scrollHeight -\n scroller.scrollTop -\n scroller.clientHeight <\n 80; // px threshold\n stickRef.current = nearBottom;\n };\n\n scroller.addEventListener('scroll', onScroll, { passive: true });\n // initialize\n onScroll();\n\n return () => scroller.removeEventListener('scroll', onScroll);\n }, []);\n\n // Auto-scroll when:\n // - revision changes (partial → text changed)\n // - a new message is appended (length)\n // - the last message id or text changes\n useLayoutEffect(() => {\n if (!stickRef.current) return;\n // wait for DOM paint so heights are correct\n requestAnimationFrame(() => {\n endRef.current?.scrollIntoView({\n block: 'end',\n inline: 'nearest',\n behavior: 'auto',\n });\n });\n }, [\n revision,\n messages.length,\n messages[messages.length - 1]?.id,\n messages[messages.length - 1]?.message,\n ]);\n\n return (\n <div className=\"chat-wrap\">\n <ol ref={listRef} className=\"chat-list\" aria-live=\"polite\">\n {messages.map((m) => (\n <ChatEntry key={m.id} entry={m} />\n ))}\n {/* sentinel */}\n <li aria-hidden=\"true\">\n <div ref={endRef} />\n </li>\n </ol>\n {/* your footer input stays outside this component if you moved it */}\n </div>\n );\n}\n\nexport default ChatRegion;\n\n/** Footer input that sends via data channel when connected */\nfunction FooterInput({ connected }: { connected: boolean }) {\n const { send } = useChatAndTranscription();\n return (\n <ChatInput\n disabled={!connected}\n onSend={(txt) => {\n const t = txt.trim();\n if (!t) return;\n send(t);\n }}\n />\n );\n}\n","export default \":host {\\n all: initial;\\n font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI,\\n Roboto, Arial, Noto Sans, 'Apple Color Emoji', 'Segoe UI Emoji';\\n\\n /* defaults (can be overridden via themeVars) */\\n --bello-bg: #111;\\n --bello-fg: #fff;\\n --bello-surface: #111;\\n --bello-border: rgba(255, 255, 255, 0.12);\\n --bello-cta-bg: #fff;\\n --bello-cta-fg: #111;\\n --bello-subtle: rgba(255, 255, 255, 0.72);\\n --bello-danger: #ff6b6b;\\n --bello-shadow: 0 10px 24px rgba(0, 0, 0, 0.18);\\n\\n --bello-radius: 12px;\\n --bello-radius-pill: 999px;\\n --bello-gap: 12px;\\n --bello-pop-offset: 50px;\\n\\n --bello-width: 420px;\\n --bello-height: 520px;\\n --bello-fab-size-width: 80px;\\n --bello-fab-size-height: 52px;\\n --bello-fab-gap: 12px;\\n}\\n\\n/* Themes only set alternate defaults; API variables still win */\\n.theme-light :host,\\n.theme-light {\\n --bello-bg: #fff;\\n --bello-fg: #111;\\n --bello-surface: #fff;\\n --bello-border: rgba(0, 0, 0, 0.08);\\n --bello-cta-bg: #111;\\n --bello-cta-fg: #fff;\\n --bello-subtle: rgba(17, 17, 17, 0.72);\\n}\\n.theme-glass :host,\\n.theme-glass {\\n --bello-surface: rgba(255, 255, 255, 0.1);\\n --bello-fg: #111;\\n --bello-border: rgba(255, 255, 255, 0.2);\\n --bello-cta-bg: #111;\\n --bello-cta-fg: #fff;\\n backdrop-filter: blur(10px);\\n}\\n\\n/* containers */\\n.bello-container {\\n border-radius: var(--bello-radius);\\n border: 1px solid var(--bello-border);\\n box-shadow: var(--bello-shadow);\\n padding: var(--bello-gap);\\n background: var(--bello-surface);\\n color: var(--bello-fg);\\n}\\n\\n.bello-title-container {\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n}\\n\\n.bello-card {\\n border-radius: var(--bello-radius);\\n border: 1px solid var(--bello-border);\\n background: var(--bello-surface);\\n color: var(--bello-fg);\\n}\\n\\n/* buttons */\\n.bello-trigger {\\n border-radius: var(--bello-radius-pill);\\n padding: 10px 18px;\\n font-weight: 600;\\n border: none;\\n cursor: pointer;\\n background: var(--bello-cta-bg);\\n color: var(--bello-cta-fg);\\n}\\n.bello-trigger.small {\\n padding: 8px 12px;\\n font-size: 12px;\\n}\\n.bello-trigger:hover {\\n opacity: 0.9;\\n}\\n\\n.bello-trigger-danger {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n border-radius: var(--bello-radius-pill);\\n padding: 10px 18px;\\n font-weight: 600;\\n border: none;\\n cursor: pointer;\\n background: var(--bello-danger);\\n color: #fff;\\n}\\n.bello-trigger-danger.small {\\n padding: 8px 12px;\\n font-size: 12px;\\n}\\n.bello-trigger-danger:hover {\\n opacity: 0.9;\\n}\\n\\n/* header */\\n.bello-header {\\n display: flex;\\n align-items: center;\\n gap: var(--bello-gap);\\n padding: var(--bello-gap);\\n border-bottom: 1px solid var(--bello-border);\\n justify-content: space-between;\\n}\\n.bello-title {\\n font-size: 14px;\\n font-weight: 600;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n.bello-subtitle {\\n font-size: 12px;\\n opacity: 0.8;\\n}\\n\\n/* body/sizing */\\n.bello-body {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n height: var(--bello-height);\\n width: var(--bello-width);\\n max-height: 80vh;\\n}\\n.bello-main {\\n flex: 1;\\n overflow: auto;\\n padding: var(--bello-gap);\\n}\\n/* The FAB is a sibling of .bello-pop inside the fixed anchor. */\\n.bello-fab {\\n position: absolute; /* relative to the fixed anchor created by embed.tsx */\\n z-index: 2; /* above the card, but below any global launchers */\\n width: var(--bello-fab-size-width);\\n height: var(--bello-fab-size-height);\\n border-radius: 999px;\\n border: 1px solid var(--bello-border);\\n background: var(--bello-cta-bg);\\n color: var(--bello-cta-fg);\\n box-shadow: var(--bello-shadow);\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n cursor: pointer;\\n /* default hidden positioning; specific corners below set the final spot */\\n top: auto;\\n right: auto;\\n bottom: auto;\\n left: auto;\\n}\\n.bello-fab:hover {\\n opacity: 0.9;\\n}\\n\\n/* Anchor the FAB to the SAME corner as the widget, but OUTSIDE the card. */\\n.bello-pop[data-pos='bottom-right'] ~ .bello-fab {\\n right: calc(-1 * var(--bello-fab-gap));\\n bottom: calc(-1 * var(--bello-fab-gap));\\n}\\n.bello-pop[data-pos='bottom-left'] ~ .bello-fab {\\n left: calc(-1 * var(--bello-fab-gap));\\n bottom: calc(-1 * var(--bello-fab-gap));\\n}\\n.bello-pop[data-pos='top-right'] ~ .bello-fab {\\n right: calc(-1 * var(--bello-fab-gap));\\n top: calc(-1 * var(--bello-fab-gap));\\n}\\n.bello-pop[data-pos='top-left'] ~ .bello-fab {\\n left: calc(-1 * var(--bello-fab-gap));\\n top: calc(-1 * var(--bello-fab-gap));\\n}\\n\\n.bello-footer {\\n height: 60px;\\n display: flex;\\n align-items: center;\\n justify-content: flex-end;\\n gap: 8px;\\n padding: 0 var(--bello-gap);\\n}\\n\\n.bello-footer .chat-input-row {\\n width: 100%;\\n}\\n/* popover positioning */\\n.bello-pop {\\n position: absolute;\\n transform-origin: bottom right;\\n}\\n.bello-pop[data-pos='bottom-right'] {\\n bottom: var(--bello-pop-offset);\\n right: 0;\\n}\\n.bello-pop[data-pos='bottom-left'] {\\n bottom: var(--bello-pop-offset);\\n left: 0;\\n transform-origin: bottom left;\\n}\\n.bello-pop[data-pos='top-right'] {\\n top: var(--bello-pop-offset);\\n right: 0;\\n transform-origin: top right;\\n}\\n.bello-pop[data-pos='top-left'] {\\n top: var(--bello-pop-offset);\\n left: 0;\\n transform-origin: top left;\\n}\\n\\n/* helpers */\\n.bello-row {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n}\\n.bello-hero {\\n font-weight: 700;\\n}\\n\\n.bello-error {\\n border: 1px solid var(--bello-danger);\\n padding: var(--bello-gap);\\n border-radius: 8px;\\n}\\n.bello-error-title {\\n font-weight: 700;\\n margin-bottom: 4px;\\n}\\n.bello-error-text {\\n font-size: 12px;\\n opacity: 0.9;\\n}\\n.center {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n flex-direction: column;\\n gap: 8px;\\n}\\n.status {\\n font-size: 12px;\\n opacity: 0.8;\\n}\\n\\n/* chat */\\n.chat-wrap {\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n height: 100%;\\n}\\n.chat-list {\\n list-style: none;\\n margin: 0;\\n padding: 0;\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n}\\n\\n.chat-entry {\\n display: flex;\\n flex-direction: column;\\n}\\n.chat-entry.me {\\n align-items: flex-end;\\n} /* YOU → right */\\n.chat-entry.them {\\n align-items: flex-start;\\n} /* AGENT → left */\\n\\n.chat-entry .chat-name {\\n font-size: 11px;\\n opacity: 0.7;\\n margin-bottom: 2px;\\n}\\n.chat-entry.me .chat-name {\\n align-self: flex-end;\\n}\\n.chat-entry.them .chat-name {\\n align-self: flex-start;\\n}\\n\\n.chat-bubble {\\n max-width: 75%;\\n padding: 8px 10px;\\n border-radius: 10px;\\n border: 1px solid var(--bello-border);\\n}\\n.chat-bubble.me {\\n background: rgba(0, 0, 0, 0.2);\\n} /* you (right) */\\n.chat-bubble.them {\\n background: rgba(255, 255, 255, 0.06);\\n} /* agent (left) */\\n\\n.chat-text {\\n display: inline-block;\\n}\\n.chat-time {\\n font-size: 10px;\\n opacity: 0.6;\\n margin-left: 8px;\\n}\\n\\n.chat-input-row {\\n display: flex;\\n gap: 8px;\\n align-items: center;\\n}\\n.chat-input {\\n flex: 1;\\n padding: 10px 12px;\\n border-radius: 8px;\\n border: 1px solid var(--bello-border);\\n background: transparent;\\n color: var(--bello-fg);\\n}\\n.chat-input::placeholder {\\n color: var(--bello-subtle);\\n}\\n\";","declare global {\n interface Window {\n process?: any;\n }\n}\n\nif (\n typeof window !== 'undefined' &&\n (window as any).process == null\n) {\n (window as any).process = {\n env: {\n NODE_ENV: (import.meta as any).env?.MODE || 'development',\n },\n };\n}\nexport {};\n","import { createRoot } from 'react-dom/client';\nimport { ensureContainer, createShadowHost } from './mountShadow';\nimport type { InitOptions, Theme, Cmd } from './types';\nimport { fetchPublicConfig } from './api';\nimport { BelloWidget } from './widget/BelloWidget';\nimport cssText from './index.css?inline';\nimport './polyfills';\n\nlet currentOpts: InitOptions | null = null;\nlet root: ReturnType<typeof createRoot> | null = null;\nlet shadowRootRef: ShadowRoot | null = null;\nlet hostEl: HTMLElement | null = null; // host element to carry CSS vars\n\nfunction mirrorHeadStylesInto(shadow: ShadowRoot) {\n const seen = new WeakSet<Node>();\n const copy = (node: Node) => {\n if (!(node instanceof HTMLElement)) return;\n if (node.tagName === 'STYLE' && !seen.has(node)) {\n const style = document.createElement('style');\n style.textContent =\n (node as HTMLStyleElement).textContent ?? '';\n shadow.appendChild(style);\n seen.add(node);\n }\n };\n document.head.querySelectorAll('style').forEach((n) => copy(n));\n const mo = new MutationObserver((mutations) => {\n for (const m of mutations) m.addedNodes.forEach(copy);\n });\n mo.observe(document.head, { childList: true });\n}\n\nfunction applyThemeVars(vars?: Record<string, string>) {\n if (!hostEl || !vars) return;\n for (const [k, v] of Object.entries(vars))\n hostEl.style.setProperty(k, v);\n}\n\nasync function mount(opts: InitOptions) {\n const publicCfg = await fetchPublicConfig(opts);\n currentOpts = {\n agentEnabled: opts.agentEnabled ?? true,\n voiceEnabled: opts.voiceEnabled ?? true,\n ...opts,\n theme: opts.theme ?? publicCfg.theme,\n orbStyle: opts.orbStyle ?? publicCfg.orbStyle,\n position: opts.position ?? publicCfg.position,\n widgetTitle: opts.widgetTitle ?? publicCfg.widgetTitle,\n widgetButtonTitle:\n opts.widgetButtonTitle ?? publicCfg.widgetButtonTitle,\n themeVars: {\n ...(publicCfg.themeVars ?? {}),\n ...(opts.themeVars ?? {}),\n },\n };\n const theme = (currentOpts.theme ?? 'dark') as Theme;\n\n const container = ensureContainer('bello-widget-root');\n hostEl = container; // CSS vars applied here; :host in shadow can read them\n const shadow = createShadowHost(container);\n shadowRootRef = shadow;\n\n // base CSS\n const style = document.createElement('style');\n style.textContent = cssText;\n shadow.appendChild(style);\n mirrorHeadStylesInto(shadow);\n\n // apply CSS variables (API/user)\n applyThemeVars(currentOpts.themeVars);\n\n const anchor = document.createElement('div');\n anchor.style.position = 'fixed';\n anchor.style.zIndex = '2147483647';\n const pos = currentOpts.position ?? 'bottom-right';\n const map: Record<string, Partial<CSSStyleDeclaration>> = {\n 'bottom-right': { bottom: '16px', right: '16px' },\n 'bottom-left': { bottom: '16px', left: '16px' },\n 'top-right': { top: '16px', right: '16px' },\n 'top-left': { top: '16px', left: '16px' },\n };\n Object.assign(anchor.style, map[pos]);\n\n shadow.appendChild(anchor);\n root = createRoot(anchor);\n root.render(\n <BelloWidget\n opts={currentOpts}\n theme={theme}\n onClose={() => {}}\n />\n );\n}\n\nfunction rerender() {\n if (!root || !shadowRootRef || !currentOpts) return;\n applyThemeVars(currentOpts.themeVars);\n root.render(\n <BelloWidget\n opts={currentOpts}\n theme={(currentOpts.theme ?? 'dark') as Theme}\n onClose={() => {}}\n />\n );\n}\n\nexport async function initWidget(opts: InitOptions) {\n if (typeof window === 'undefined') return;\n await mount(opts);\n}\n\nexport function updateWidget(opts: Partial<InitOptions>) {\n if (typeof window === 'undefined') return;\n currentOpts = {\n ...(currentOpts ?? {}),\n ...(opts ?? {}),\n } as InitOptions;\n rerender();\n}\n\nexport function dispatchWidgetEvent(type: 'open' | 'close') {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(\n new CustomEvent('bello:event', { detail: { type } })\n );\n}\n\nexport async function handleCommand(cmd: Cmd) {\n const [name, payload] = cmd;\n if (name === 'init') {\n await initWidget(payload);\n return;\n }\n if (name === 'update') {\n updateWidget(payload ?? {});\n return;\n }\n if (name === 'open' || name === 'close') {\n dispatchWidgetEvent(name);\n }\n}\n","import { useEffect, useRef } from 'react';\nimport type { InitOptions } from './types';\nimport { initWidget, updateWidget } from './embed-runtime';\n\nexport default function BelloWidget(props: InitOptions) {\n const inited = useRef(false);\n useEffect(() => {\n if (!inited.current) {\n initWidget(props);\n inited.current = true;\n } else {\n updateWidget(props);\n }\n }, [props]);\n return null;\n}\n"],"names":["BelloWidget"],"mappings":";;;;;;;;;;;AAAO,SAAS,eAAA,CACd,KAAK,mBAAA,EACQ;AACb,EAAA,IAAI,EAAA,GAAK,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA;AACnC,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,EAAA,GAAK,QAAA,CAAS,cAAc,KAAK,CAAA;AACjC,IAAA,EAAA,CAAG,EAAA,GAAK,EAAA;AACR,IAAA,EAAA,CAAG,MAAM,QAAA,GAAW,UAAA;AACpB,IAAA,EAAA,CAAG,MAAM,MAAA,GAAS,YAAA;AAClB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,iBAAiB,SAAA,EAAoC;AACnE,EAAA,IAAI,OAAQ,SAAA,CAAkB,WAAA;AAC9B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,IAAA,GAAO,SAAA,CAAU,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC9C,IAAC,UAAkB,WAAA,GAAc,IAAA;AAAA,EACnC;AACA,EAAA,OAAO,IAAA;AACT;;ACfA,SAAS,cACP,CAAA,EACoC;AACpC,EAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,UAAU,OAAO,MAAA;AACxC,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,CAAwB,CAAA,EAAG;AAC/D,IAAA,IAAI,OAAO,IAAA,EAAM;AACjB,IAAA,MAAM,MAAM,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,GAAI,CAAA,GAAI,KAAK,CAAC,CAAA,CAAA;AAC3C,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,GAAA,GAAM,MAAA;AACzC;AAEA,eAAsB,kBACpB,IAAA,EACuB;AACvB,EAAA,MAAM,IAAA,GAAO,KAAK,UAAA,IAAc,EAAA;AAChC,EAAA,MAAM,MAAM,MAAM,KAAA;AAAA,IAChB,GAAG,IAAI,CAAA,cAAA,EAAiB,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA;AAAA,IAC1D;AAAA,MACE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EAAa,MAAA;AAAA,MACb,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA;AAAmB;AACxC,GACF;AACA,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAEjE,EAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA,EAAK;AAC/B,EAAA,MAAM,KACJ,OAAA,EAAS,OAAA,EAAS,aAAA,IAAiB,OAAA,EAAS,iBAAiB,EAAC;AAEhE,EAAA,MAAM,SAAA,GACJ,aAAA,CAAc,EAAA,CAAG,UAAU,CAAA,IAC3B,aAAA,CAAc,EAAA,CAAG,SAAS,CAAA,IAC1B,aAAA,CAAc,EAAA,CAAG,QAAQ,CAAA,IACzB,MAAA;AAEF,EAAA,OAAO;AAAA,IACL,WAAA,EACE,EAAA,CAAG,YAAA,IAAgB,IAAA,CAAK,WAAA,IAAe,cAAA;AAAA,IACzC,iBAAA,EACE,EAAA,CAAG,mBAAA,IACH,IAAA,CAAK,iBAAA,IACL,YAAA;AAAA,IACF,QAAA,EAAU,EAAA,CAAG,SAAA,IAAa,IAAA,CAAK,QAAA,IAAY,QAAA;AAAA,IAC3C,KAAA,EAAO,EAAA,CAAG,KAAA,IAAS,IAAA,CAAK,KAAA,IAAS,MAAA;AAAA,IACjC,QAAA,EAAU,EAAA,CAAG,QAAA,IAAY,IAAA,CAAK,QAAA,IAAY,cAAA;AAAA,IAC1C;AAAA,GACF;AACF;AAEA,eAAsB,uBACpB,IAAA,EAC4B;AAC5B,EAAA,MAAM,IAAA,GAAO,KAAK,UAAA,IAAc,EAAA;AAChC,EAAA,MAAM,MAAM,MAAM,KAAA;AAAA,IAChB,GAAG,IAAI,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA;AAAA,IAC/D;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EAAa,MAAA;AAAA,MACb,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB;AAChD,GACF;AACA,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAChE,EAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,IAAA,EAAK;AACzB,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,WAAA;AAAA,IAC5B,gBAAA,EAAkB,CAAA,CAAE,gBAAA,IAAoB,CAAA,CAAE;AAAA,GAC5C;AACF;;AClEO,SAAS,UAAA,CAAW,MAAmB,OAAA,EAAkB;AAC9D,EAAA,MAAM,OAAO,OAAA,CAAQ,MAAM,IAAI,IAAA,EAAK,EAAG,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,MAAM,qBAAqB,YAAY;AACrC,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GACH,MAAA,CAAe,YAAA,IACf,MAAA,CAAe,kBAAA;AAClB,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,MAAM,GAAA,GAAM,IAAI,GAAA,EAAI;AACpB,UAAA,IAAI,GAAA,CAAI,KAAA,KAAU,WAAA,EAAa,MAAM,IAAI,MAAA,EAAO;AAAA,QAClD;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,mBAAA,GAAsB,CAAC,GAAA,KAAe;AAC1C,MAAA,IAAI,CAAC,WAAW,QAAA,CAAS,CAAA,EAAG,IAAI,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IACxD,CAAA;AACA,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAAA,IACpC,CAAA;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,CAAU,iBAAA,EAAmB,mBAAmB,CAAA;AACxD,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,CAAU,YAAA,EAAc,cAAc,CAAA;AAE9C,IAAA,CAAC,YAAY;AACX,MAAA,IAAI;AACF,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,MAAM,kBAAA,EAAmB;AAEzB,QAAA,MAAM,EAAE,SAAA,EAAW,gBAAA,EAAiB,GAClC,MAAM,uBAAuB,IAAI,CAAA;AACnC,QAAA,IAAI,SAAA,EAAW;AAGf,QAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,UAChB,KAAK,gBAAA,CAAiB,oBAAA;AAAA,YACpB,IAAA;AAAA,YACA,KAAA,CAAA;AAAA,YACA,EAAE,kBAAkB,IAAA;AAAK,WAC3B;AAAA,UACA,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,gBAAgB;AAAA,SACzC,CAAA;AAED,QAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,IAAI,CAAA;AAAA,MACnC,SAAS,CAAA,EAAQ;AACf,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,CAAA,EAAG,GAAG,IAAA,IAAQ,OAAO,KAAK,CAAA,EAAG,OAAA,IAAW,SAAS,CAAA,CAAE,CAAA;AAAA,QAC9D;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW,aAAA,CAAc,KAAK,CAAA;AAAA,MACrC;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,iBAAA,EAAmB,mBAAmB,CAAA;AACzD,MAAA,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,YAAA,EAAc,cAAc,CAAA;AAC/C,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,UAAA,EAAW;AAAA,MAClB,CAAA,CAAA,MAAQ;AAAA,MAAC;AACT,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,IAAA,EAAM,KAAK,UAAA,EAAY,IAAA,CAAK,SAAS,CAAC,CAAA;AAEnD,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,YAAY,SAAA,EAAU;AACxD;;ACrFA,SAAwB,SAAA,CAAU;AAAA,EAChC,MAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,KAAA,CAAM,SAAS,EAAE,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAyB,IAAI,CAAA;AAEpD,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAuB;AACrC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,GAAA,GAAM,QAAQ,IAAA,EAAK;AACzB,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAA,CAAO,GAAG,CAAA;AACV,IAAA,UAAA,CAAW,EAAE,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,QAAA,EAAU,QAAA,CAAS,OAAA,EAAS,KAAA,EAAM;AAAA,EACzC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,UAAU,MAAA,EACzC,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAU,YAAA;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QAEP,YAAA,EAAa,KAAA;AAAA,QACb,WAAA,EAAa,WAAW,kBAAA,GAAgB,sBAAA;AAAA,QACxC,UAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAC1C,YAAA,EAAW;AAAA;AAAA,KACb;AAAA,oBACA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,qBAAA;AAAA,QACV,QAAA,EAAU,QAAA,IAAY,OAAA,CAAQ,IAAA,GAAO,MAAA,KAAW,CAAA;AAAA,QAChD,YAAA,EAAW,MAAA;AAAA,QACZ,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA;AAEJ;;ACvCA,MAAM,UAAA,uBAAiB,GAAA,EAAqB;AAI5C,SAAS,OAAA,CAAQ,GAAQ,CAAA,EAA+B;AACtD,EAAA,OAAO,GAAG,UAAA,EAAY,UAAA,GAAa,CAAC,CAAA,IAAK,CAAA,EAAG,aAAa,CAAC,CAAA;AAC5D;AAEA,SAAS,YAAY,CAAA,EAA4B;AAC/C,EAAA,OACE,CAAA,EAAG,iBAAiB,QAAA,IACpB,CAAA,EAAG,aAAa,QAAA,IAChB,CAAA,EAAG,uBACH,CAAA,EAAG,cAAA;AAEP;AAEA,SAAS,aAAa,CAAA,EAAgB;AACpC,EAAA,MAAM,KAAK,CAAA,EAAG,UAAA,EAAY,SAAA,IAAa,CAAA,EAAG,aAAa,CAAA,EAAG,IAAA;AAC1D,EAAA,OAAO,OAAO,EAAA,KAAO,QAAA,GAAW,EAAA,GAAK,KAAK,GAAA,EAAI;AAChD;AAEO,SAAS,YAAY,CAAA,EAAgB;AAE1C,EAAA,OACE,CAAA,EAAG,QAAQ,CAAA,EAAG,YAAA,GAAe,CAAC,CAAA,EAAG,IAAA,IAAQ,CAAA,EAAG,MAAA,EAAQ,IAAA,IAAQ,EAAA;AAEhE;AAEO,SAAS,iBAAiB,CAAA,EAAiB;AAEhD,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAA,EAAG,wBAAwB,CAAA;AAC7C,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA,CAAE,aAAY,KAAM,MAAA;AAGtD,EAAA,OAAO,OAAA;AAAA,IACL,CAAA,EAAG,OAAA,IACD,CAAA,EAAG,KAAA,IACH,CAAA,EAAG,MAAA,EAAQ,QAAA,IACX,CAAA,EAAG,MAAA,EAAQ,KAAA,IACX,CAAA,EAAG,YAAA,GAAe,CAAC,CAAA,EAAG;AAAA,GAC1B;AACF;AAGO,SAAS,eAAe,CAAA,EAAgB;AAC7C,EAAA,OACE,OAAA,CAAQ,CAAA,EAAG,eAAe,CAAA,IAC1B,GAAG,UAAA,EAAY,EAAA,IACf,CAAA,EAAG,WAAA,CAAY,CAAC,CAAA,IAAK,GAAG,CAAA,CAAA,EAAI,YAAA,CAAa,CAAC,CAAC,CAAA,CAAA;AAE/C;AAIA,SAAS,YAAA,CAAa,KAAa,CAAA,EAAY;AAC7C,EAAA,UAAA,CAAW,GAAA,CAAI,KAAK,CAAC,CAAA;AACrB,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,qBAAqB,EAAA,EAAkC;AAC9D,EAAA,IAAI,CAAC,IAAI,OAAO,MAAA;AAEhB,EAAA,IAAI,EAAA,CAAG,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AACnC,EAAA,IAAI,EAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,KAAA;AACpC,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,iBAAA,CACd,GAAA,EACA,CAAA,EACA,IAAA,EACS;AACT,EAAA,IAAI,WAAW,GAAA,CAAI,GAAG,GAAG,OAAO,UAAA,CAAW,IAAI,GAAG,CAAA;AAGlD,EAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,EAAA,MAAM,QAAA,GAAW,qBAAqB,EAAE,CAAA;AACxC,EAAA,IAAI,OAAO,QAAA,KAAa,SAAA;AACtB,IAAA,OAAO,YAAA,CAAa,KAAK,QAAQ,CAAA;AAGnC,EAAA,MAAM,CAAA,GAAK,CAAA,EAAG,WAAA,IAAe,EAAC;AAC9B,EAAA,IAAI,OAAO,GAAG,OAAA,KAAY,SAAA;AACxB,IAAA,OAAO,YAAA,CAAa,GAAA,EAAK,CAAA,CAAE,OAAO,CAAA;AAGpC,EAAA,MAAM,EAAA,GAAM,IAAA,EAAM,gBAAA,IAA4B,EAAC;AAC/C,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,QAAA,IAAY,EAAA,CAAG,GAAA;AAClC,EAAA,IAAI,OAAA,IAAW,EAAA;AACb,IAAA,OAAO,aAAa,GAAA,EAAK,MAAA,CAAO,OAAO,CAAA,KAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAGzD,EAAA,OAAO,YAAA,CAAa,KAAK,KAAK,CAAA;AAChC;AAIO,SAAS,0BAAA,CACd,GACA,IAAA,EACqB;AACrB,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,MAAM,GAAA,GAAM,eAAe,IAAI,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,aAAa,IAAI,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAE7B,EAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,GAAA,EAAK,IAAA,EAAM,IAAI,CAAA;AAGjD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAM,GAAG,CAAA,CAAA;AAAA;AAAA,IACb,IAAA,EAAM;AAAA;AAAA,MAEJ,OAAA;AAAA,MACA,IAAA,EAAM,UAAU,KAAA,GAAQ,OAAA;AAAA,MACxB,QAAA,EAAU,QAAA,KAAa,OAAA,GAAU,OAAA,GAAU,OAAA;AAAA,KAC7C;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AACF;;AC7GA,SAAwB,uBAAA,GAA0B;AAChD,EAAA,MAAM,iBAAmC,iBAAA,EAAkB;AAC3D,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,OAAO,cAAA,EAAe;AAG5B,EAAA,MAAM,QAAA,GAAW,MAAA,iBAKf,IAAI,GAAA,EAAK,CAAA;AACX,EAAA,MAAM,QAAA,GAAW,MAAA,CAAiB,EAAE,CAAA;AACpC,EAAA,MAAM,GAAG,KAAK,CAAA,GAAI,SAAS,CAAC,CAAA;AAG5B,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,CAAA;AACrD,EAAA,MAAM,KAAA,GACJ,eAAe,MAAA,KAAW,CAAA,GACtB,MACA,CAAA,EAAG,cAAA,CAAe,MAAM,CAAA,CAAA,EAAI,cAAA;AAAA,IAC1B;AAAA,GACD,CAAA,CAAA,EAAI,WAAA,CAAY,IAAI,CAAC,IAAI,gBAAA,CAAiB,IAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,CAAA;AAE9D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAgB,MAAA,EAAQ;AAE7B,IAAA,IAAI,OAAA,GAAU,KAAA;AAEd,IAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,MAAA,MAAM,IAAA,GAAO,CAAA;AACb,MAAA,MAAM,CAAA,GAAI,CAAA,GAAA,EAAM,cAAA,CAAe,IAAI,CAAC,CAAA,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,0BAAA,CAA2B,CAAA,EAAG,IAAW,CAAA;AACtD,MAAA,MAAM,GAAA,GAAM,YAAY,IAAI,CAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,iBAAiB,IAAI,CAAA;AAEjC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA;AACnC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,EAAG;AAAA,UACtB,GAAA,EAAK,IAAA;AAAA,UACL,KAAA,EAAO,QAAQ,GAAG,CAAA;AAAA,UAClB,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAC,CAAA;AACvB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,GAAA,IAAO,GAAA,KAAQ,IAAA,CAAK,QAAA;AAC3C,MAAA,MAAM,WAAA,GAAc,CAAC,IAAA,CAAK,KAAA,IAAS,GAAA;AAEnC,MAAA,IAAI,kBAAkB,WAAA,EAAa;AACjC,QAAA,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,EAAG;AAAA,UACtB,GAAA,EAAK;AAAA,YACH,GAAG,IAAA,CAAK,GAAA;AAAA,YACR,OAAA,EAAS,cAAA,GAAiB,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,OAAA;AAAA,YACzC,WAAW,IAAA,CAAK,GAAA;AAAA,cACd,IAAA,CAAK,IAAI,SAAA,IAAa,CAAA;AAAA,cACtB,KAAK,SAAA,IAAa;AAAA,aACpB;AAAA,YACA,IAAA,EAAM;AAAA,cACJ,GAAI,KAAK,GAAA,CAAI,IAAA;AAAA,cACb,OAAA,EAAU,IAAA,CAAK,GAAA,CAAI,IAAA,EAAc;AAAA;AACnC,WACF;AAAA,UACA,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,OAAA,CAAQ,GAAG,CAAA;AAAA,UAChC,QAAA,EAAU,cAAA,GAAiB,GAAA,GAAM,IAAA,CAAK;AAAA,SACvC,CAAA;AACD,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS,KAAA,CAAM,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AAAA,EAEjC,CAAA,EAAG,CAAC,KAAA,EAAO,IAAI,CAAC,CAAA;AAGhB,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAM;AAC7B,IAAA,MAAM,MAAA,GAAgC,QAAA,CAAS,OAAA,CAC5C,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,GAAG,CAAA,CACvC,OAAO,OAAO,CAAA;AAEjB,IAAA,MAAM,MAAM,CAAC,GAAG,MAAA,EAAQ,GAAG,KAAK,YAAY,CAAA;AAC5C,IAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,SAAA,IAAa,CAAA,KAAM,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,CAAA;AAC1D,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,IAAA,CAAK,YAAA,EAAc,KAAK,CAAC,CAAA;AAG7B,EAAA,MAAM,WAAW,OAAA,CAAQ,MAAM,KAAA,EAAO,CAAC,KAAK,CAAC,CAAA;AAE7C,EAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,CAAK,MAAM,QAAA,EAAS;AAC/C;;AC9GA,SAAwB,SAAA,CAAU;AAAA,EAChC;AACF,CAAA,EAEG;AACD,EAAA,MAAM,OAAO,cAAA,EAAe;AAC5B,EAAA,MAAM,EAAA,GAAM,IAAA,EAAM,gBAAA,IAA4B,EAAC;AAC/C,EAAA,MAAM,OAAA,GAA8B,EAAA,CAAG,QAAA,IAAY,EAAA,CAAG,GAAA;AAEtD,EAAA,MAAM,IAAA,GAAY,KAAA,CAAM,IAAA,IAAQ,EAAC;AACjC,EAAA,MAAM,GAAA,GAAM,IAAA,EAAM,QAAA,IAAY,IAAA,EAAM,GAAA;AAGpC,EAAA,MAAM,SACJ,IAAA,EAAM,OAAA,KAAY,IAAA,IACjB,OAAA,IAAW,OAAO,MAAA,CAAO,OAAO,CAAA,KAAM,MAAA,CAAO,GAAG,CAAA,IAChD,OAAO,QAAQ,QAAA,IAAY,GAAA,CAAI,WAAW,OAAO,CAAA;AAEpD,EAAA,MAAM,GAAA,GAAM,MAAA,GAAS,KAAA,GAAQ,IAAA,EAAM,IAAA,IAAQ,OAAA;AAC3C,EAAA,MAAM,IAAA,GACJ,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,GACvB,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,mBACxB,IAAI,IAAA,EAAK;AACf,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAW;AAAA,IACjD,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,uBACE,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,WAAA,EAAc,MAAA,GAAS,IAAA,GAAO,MAAM,CAAA,CAAA;AAAA,MAC/C,KAAA,EAAO,KAAK,QAAA,EAAS;AAAA,MAEpB,QAAA,EAAA;AAAA,QAAA,CAAC,MAAA,oBAAU,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAa,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,6BAC3C,KAAA,EAAA,EAAI,SAAA,EAAW,eAAe,MAAA,GAAS,IAAA,GAAO,MAAM,CAAA,CAAA,EACnD,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAa,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ,CAAA;AAAA,0BAC3C,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAa,QAAA,EAAA,OAAA,EAAQ;AAAA,SAAA,EACvC;AAAA;AAAA;AAAA,GACF;AAEJ;;ACTA,SAAS,OAAO,KAAA,EAAe;AAC7B,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,cAAA;AACH,MAAA,OAAO,iBAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,gBAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,aAAA;AACH,MAAA,OAAO,gBAAA;AAAA,IACT,KAAK,aAAA;AACH,MAAA,OAAO,gBAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,QAAA;AAAA,IACL;AACE,MAAA,OAAO,YAAA;AAAA;AAEb;AAEO,SAASA,aAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AAGtC,EAAA,MAAM,OAAA,GAAU,KAAK,YAAA,KAAiB,KAAA;AACtC,EAAA,MAAM,OAAA,GAAU,KAAK,YAAA,KAAiB,KAAA;AAGtC,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,WAAU,GAAI,UAAA;AAAA,IACvD,IAAA;AAAA,IACA,IAAA,IAAQ;AAAA,GACV;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,MAAM,SAAU,CAAA,CAAkB,MAAA;AAClC,MAAA,MAAM,IAAI,MAAA,EAAQ,IAAA;AAClB,MAAA,IAAI,CAAA,KAAM,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA;AAC9B,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,OAAc,CAAA;AACrD,IAAA,OAAO,MACL,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,OAAc,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,GAAA,GAAM,OAAA;AAAA,IACV,OAAO;AAAA,MACL,KAAA,EAAO,KAAK,WAAA,IAAe,eAAA;AAAA,MAC3B,GAAA,EAAK,KAAK,iBAAA,IAAqB,cAAA;AAAA,MAC/B,GAAA,EAAK,KAAK,QAAA,IAAY,cAAA;AAAA,MACtB,GAAA,EAAK,KAAK,QAAA,IAAY;AAAA,KACxB,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,MACJ,KAAA,KAAU,MAAA,GACN,YAAA,GACA,KAAA,KAAU,UACV,aAAA,GACA,aAAA;AAEN,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAA,EAEb,QAAA,EAAA;AAAA,IAAA,CAAC,IAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EACb,QAAA,kBAAA,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACE,GAAG,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAAA,UAClB,IAAA,EAAM,GAAA;AAAA,UACN,kBAAA,EAAoB,CAAA;AAAA,UACpB,iBAAA,EAAmB,CAAA;AAAA,UACnB,mBAAA,EAAmB;AAAA;AAAA,OACrB,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAc,QAAA,EAAA,GAAA,CAAI,KAAA,EAAM,CAAA;AAAA,wBACvC,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,eAAA;AAAA,YACV,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,YAE1B,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA;AACP,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAIF,GAAA;AAAA,MAAC,MAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,SAAA,EAAU,WAAA;AAAA,QACV,YAAU,GAAA,CAAI,GAAA;AAAA,QACd,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS;AAAA,UACP,OAAA,EAAS,OAAO,CAAA,GAAI,CAAA;AAAA,UACpB,KAAA,EAAO,OAAO,CAAA,GAAI,IAAA;AAAA,UAClB,CAAA,EAAG,OAAO,CAAA,GAAI,CAAA;AAAA,UACd,aAAA,EAAe,OAAO,MAAA,GAAS;AAAA,SACjC;AAAA,QAEA,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAEb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EACb,QAAA,kBAAA,GAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACE,GAAG,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAAA,kBAClB,IAAA,EAAM,GAAA;AAAA,kBACN,kBAAA,EAAoB,CAAA;AAAA,kBACpB,iBAAA,EAAmB,CAAA;AAAA,kBACnB,mBAAA,EAAmB;AAAA;AAAA,eACrB,EACF,CAAA;AAAA,8BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,GAAA,CAAI,KAAA,EAAM,CAAA;AAAA,oCACvC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA,OAAA,GACG,2BACA,wBAAA,EACN;AAAA,eAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BACA,IAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,4BAAA;AAAA,gBACV,OAAA,EAAS,QAAA;AAAA,gBACT,YAAA,EAAW,aAAA;AAAA,gBACX,KAAA,EAAM,KAAA;AAAA,gBAEN,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,KAAA,EAAA,EAAM,MAAM,EAAA,EAAI,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA;AAErB,WAAA,EACF,CAAA;AAAA,UAGC,KAAA,uBACE,KAAA,EAAA,EAAI,SAAA,EAAU,cACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BACxC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,4BACzC,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,wBAAA;AAAA,gBACV,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,gBAC7B,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF,CAAA,EACF,IACE,OAAA,mBACF,IAAA,CAAC,YAAY,QAAA,EAAZ,EAAqB,OAAO,IAAA,EAC3B,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACZ,QAAA,EAAA;AAAA,cAAA,OAAA,oBACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,gCACnB,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,aAAA,EAAc,CAAA;AAAA,oCAC/B,oBAAA,EAAA,EAAqB;AAAA,eAAA,EACxB,CAAA;AAAA,8BAEF,GAAA;AAAA,gBAAC,SAAA;AAAA,gBAAA;AAAA,kBACC,UAAA;AAAA,kBACA,SAAA;AAAA,kBACA;AAAA;AAAA,eACF;AAAA,kCACC,UAAA,EAAA,EAAW;AAAA,aAAA,EACd,CAAA;AAAA,gCAGC,KAAA,EAAA,EAAI,SAAA,EAAU,gBACb,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,WAAsB,CAAA,EACrC;AAAA,WAAA,EACF,oBAEA,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,QAAA,EACb,QAAA,kBAAA,GAAA,CAAC,OAAE,SAAA,EAAU,QAAA,EAAS,4CAEtB,CAAA,EACF,CAAA;AAAA,8BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EAAY,WAAA,EAAU,QAAA,EAClC,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAG,WAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,gCAChC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAY,QAAA,EAAA,2BAAA,EAE5B,CAAA;AAAA,kCACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAY,QAAA,EAAA,QAAA,EAAC;AAAA,iBAAA,EAC/B;AAAA,eAAA,EACF,GACF,CAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BACA,GAAA,CAAC,SAAI,SAAA,EAAU,cAAA,EACb,8BAAC,SAAA,EAAA,EAAU,QAAA,EAAQ,IAAA,EAAC,MAAA,EAAQ,MAAM;AAAA,YAAC,GAAG,CAAA,EACxC;AAAA,WAAA,EACF;AAAA,SAAA,EAEJ;AAAA;AAAA,KACF;AAAA,IAGC,IAAA,oBACC,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,WAAA;AAAA,QACV,OAAA,EAAS,QAAA;AAAA,QACT,YAAA,EAAW,iBAAA;AAAA,QACX,KAAA,EAAM,UAAA;AAAA,QAEN,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AACzB,GAAA,EAEJ,CAAA;AAEJ;AAGA,SAAS,SAAA,CAAU;AAAA,EACjB,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAIG;AACD,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,UAAA,KAAe,iBAAA,EAAkB;AAE5D,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACZ,QAAA,EAAA;AAAA,IAAA,OAAA,oBACC,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,CAAA;AAAA,QACV,OAAA,EAAS,EAAE,SAAA,EAAW,CAAA,EAAE;AAAA,QACxB,SAAA,EAAU,MAAA;AAAA,QACV,QAAA,EAAU,UAAA;AAAA,QACV,KAAA,EAAO,UAAA;AAAA,QAEP,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,KAAA,EAAM;AAAA;AAAA,KACxB;AAAA,oBAEF,IAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EACV,QAAA,EAAA;AAAA,MAAA,UAAA,IAAc,kBAAA;AAAA,MACd,CAAC,UAAA,IACA,SAAA,KACC,UAAA,KAAe,UAAA,GACZ,sBAAA,GACA,UAAA,KAAe,WAAA,GACf,uBAAA,GACA,UAAA,KAAe,UAAA,GACf,sBAAA,GACA,WAAA,CAAA;AAAA,MACL,CAAC,UAAA,IAAc,CAAC,SAAA,IAAa;AAAA,KAAA,EAChC;AAAA,GAAA,EACF,CAAA;AAEJ;AAGA,SAAS,oBAAA,GAAuB;AAC9B,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,iBAAA,EAAkB;AAEzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,EAAA,GAAM,UAAA,EAAoB,gBAAA,GAAmB,CAAC,CAAA;AAGpD,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAwB;AACpC,MAAA,IAAI;AACF,QAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,QAAC,EAAU,WAAA,GAAc,IAAA;AACzB,QAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,QAAA,IAAI,KAAK,OAAO,CAAA,CAAE,SAAS,UAAA,EAAY,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACzD,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX,CAAA;AAEA,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,IAAA,CAAK,EAAE,CAAA;AACP,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,EAAM;AACxB,MAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,MAAC,MAAc,WAAA,GAAc,IAAA;AAC7B,MAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAEd,MAAA,IAAI,OAAQ,UAAA,CAAmB,MAAA,KAAW,UAAA,EAAY;AACpD,QAAC,UAAA,CAAmB,OAAO,KAAK,CAAA;AAAA,MAClC,CAAA,MAAA,IAAY,WAAmB,WAAA,EAAa;AAC1C,QAAC,KAAA,CAAc,YAAa,UAAA,CAAmB,WAAA;AAAA,MACjD;AACA,MAAA,IAAA,CAAK,KAAK,CAAA;AAAA,IACZ,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,UAAA,GAAa;AACpB,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,uBAAA,EAAwB;AAGvD,EAAA,MAAM,OAAA,GAAU,OAAyB,IAAI,CAAA;AAE7C,EAAA,MAAM,MAAA,GAAS,OAAuB,IAAI,CAAA;AAE1C,EAAA,MAAM,QAAA,GAAW,OAAO,IAAI,CAAA;AAG5B,EAAA,SAAA,CAAU,MAAM;AAEd,IAAA,MAAM,SAAS,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,IAAA,MAAM,WACH,MAAA,CAAO,OAAA;AAAA,MACN;AAAA,KACF,IACC,OAAO,aAAA,IACP,MAAA;AAEH,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,MAAM,aACJ,QAAA,CAAS,YAAA,GACP,QAAA,CAAS,SAAA,GACT,SAAS,YAAA,GACX,EAAA;AACF,MAAA,QAAA,CAAS,OAAA,GAAU,UAAA;AAAA,IACrB,CAAA;AAEA,IAAA,QAAA,CAAS,iBAAiB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAE/D,IAAA,QAAA,EAAS;AAET,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC9D,CAAA,EAAG,EAAE,CAAA;AAML,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AAEvB,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,MAAA,CAAO,SAAS,cAAA,CAAe;AAAA,QAC7B,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,QAAA;AAAA,IACA,QAAA,CAAS,MAAA;AAAA,IACT,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG,EAAA;AAAA,IAC/B,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG;AAAA,GAChC,CAAA;AAED,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAG,GAAA,EAAK,OAAA,EAAS,SAAA,EAAU,WAAA,EAAY,WAAA,EAAU,QAAA,EAC/C,QAAA,EAAA;AAAA,IAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACb,GAAA,CAAC,aAAqB,KAAA,EAAO,CAAA,EAAA,EAAb,CAAA,CAAE,EAAc,CACjC,CAAA;AAAA,oBAED,GAAA,CAAC,QAAG,aAAA,EAAY,MAAA,EACd,8BAAC,KAAA,EAAA,EAAI,GAAA,EAAK,QAAQ,CAAA,EACpB;AAAA,GAAA,EACF,CAAA,EAEF,CAAA;AAEJ;AAKA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAU,EAA2B;AAC1D,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,uBAAA,EAAwB;AACzC,EAAA,uBACE,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,UAAU,CAAC,SAAA;AAAA,MACX,MAAA,EAAQ,CAAC,GAAA,KAAQ;AACf,QAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,IAAA,CAAK,CAAC,CAAA;AAAA,MACR;AAAA;AAAA,GACF;AAEJ;;AC7bA,cAAe,ynOAAynO;;ACMxoO,IACE,OAAO,MAAA,KAAW,WAAA,IACjB,MAAA,CAAe,WAAW,IAAA,EAC3B;AACA,EAAC,OAAe,OAAA,GAAU;AAAA,IACxB,GAAA,EAAK;AAAA,MACH,QAAA,EAAW,MAAA,CAAA,IAAA,CAAoB,GAAA,EAAK,IAAA,IAAQ;AAAA;AAC9C,GACF;AACF;;ACPA,IAAI,WAAA,GAAkC,IAAA;AACtC,IAAI,IAAA,GAA6C,IAAA;AACjD,IAAI,aAAA,GAAmC,IAAA;AACvC,IAAI,MAAA,GAA6B,IAAA;AAEjC,SAAS,qBAAqB,MAAA,EAAoB;AAChD,EAAA,MAAM,IAAA,uBAAW,OAAA,EAAc;AAC/B,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAe;AAC3B,IAAA,IAAI,EAAE,gBAAgB,WAAA,CAAA,EAAc;AACpC,IAAA,IAAI,KAAK,OAAA,KAAY,OAAA,IAAW,CAAC,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/C,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,MAAA,KAAA,CAAM,WAAA,GACH,KAA0B,WAAA,IAAe,EAAA;AAC5C,MAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AACxB,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AACA,EAAA,QAAA,CAAS,IAAA,CAAK,iBAAiB,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAA,KAAM,IAAA,CAAK,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,EAAA,GAAK,IAAI,gBAAA,CAAiB,CAAC,SAAA,KAAc;AAC7C,IAAA,KAAA,MAAW,CAAA,IAAK,SAAA,EAAW,CAAA,CAAE,UAAA,CAAW,QAAQ,IAAI,CAAA;AAAA,EACtD,CAAC,CAAA;AACD,EAAA,EAAA,CAAG,QAAQ,QAAA,CAAS,IAAA,EAAM,EAAE,SAAA,EAAW,MAAM,CAAA;AAC/C;AAEA,SAAS,eAAe,IAAA,EAA+B;AACrD,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,EAAM;AACtB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,QAAQ,IAAI,CAAA;AACtC,IAAA,MAAA,CAAO,KAAA,CAAM,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AACjC;AAEA,eAAe,MAAM,IAAA,EAAmB;AACtC,EAAA,MAAM,SAAA,GAAY,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAC9C,EAAA,WAAA,GAAc;AAAA,IACZ,YAAA,EAAc,KAAK,YAAA,IAAgB,IAAA;AAAA,IACnC,YAAA,EAAc,KAAK,YAAA,IAAgB,IAAA;AAAA,IACnC,GAAG,IAAA;AAAA,IACH,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,SAAA,CAAU,KAAA;AAAA,IAC/B,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,SAAA,CAAU,QAAA;AAAA,IACrC,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,SAAA,CAAU,QAAA;AAAA,IACrC,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,SAAA,CAAU,WAAA;AAAA,IAC3C,iBAAA,EACE,IAAA,CAAK,iBAAA,IAAqB,SAAA,CAAU,iBAAA;AAAA,IACtC,SAAA,EAAW;AAAA,MACT,GAAI,SAAA,CAAU,SAAA,IAAa,EAAC;AAAA,MAC5B,GAAI,IAAA,CAAK,SAAA,IAAa;AAAC;AACzB,GACF;AACA,EAAA,MAAM,KAAA,GAAS,YAAY,KAAA,IAAS,MAAA;AAEpC,EAAA,MAAM,SAAA,GAAY,gBAAgB,mBAAmB,CAAA;AACrD,EAAA,MAAA,GAAS,SAAA;AACT,EAAA,MAAM,MAAA,GAAS,iBAAiB,SAAS,CAAA;AACzC,EAAA,aAAA,GAAgB,MAAA;AAGhB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,WAAA,GAAc,OAAA;AACpB,EAAA,MAAA,CAAO,YAAY,KAAK,CAAA;AACxB,EAAA,oBAAA,CAAqB,MAAM,CAAA;AAG3B,EAAA,cAAA,CAAe,YAAY,SAAS,CAAA;AAEpC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,MAAM,QAAA,GAAW,OAAA;AACxB,EAAA,MAAA,CAAO,MAAM,MAAA,GAAS,YAAA;AACtB,EAAA,MAAM,GAAA,GAAM,YAAY,QAAA,IAAY,cAAA;AACpC,EAAA,MAAM,GAAA,GAAoD;AAAA,IACxD,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,IAChD,aAAA,EAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,IAC9C,WAAA,EAAa,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,IAC1C,UAAA,EAAY,EAAE,GAAA,EAAK,MAAA,EAAQ,MAAM,MAAA;AAAO,GAC1C;AACA,EAAA,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AAEpC,EAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AACzB,EAAA,IAAA,GAAO,WAAW,MAAM,CAAA;AACxB,EAAA,IAAA,CAAK,MAAA;AAAA,oBACH,GAAA;AAAA,MAACA,aAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,WAAA;AAAA,QACN,KAAA;AAAA,QACA,SAAS,MAAM;AAAA,QAAC;AAAA;AAAA;AAClB,GACF;AACF;AAEA,SAAS,QAAA,GAAW;AAClB,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,aAAA,IAAiB,CAAC,WAAA,EAAa;AAC7C,EAAA,cAAA,CAAe,YAAY,SAAS,CAAA;AACpC,EAAA,IAAA,CAAK,MAAA;AAAA,oBACH,GAAA;AAAA,MAACA,aAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAQ,YAAY,KAAA,IAAS,MAAA;AAAA,QAC7B,SAAS,MAAM;AAAA,QAAC;AAAA;AAAA;AAClB,GACF;AACF;AAEA,eAAsB,WAAW,IAAA,EAAmB;AAClD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,MAAM,MAAM,IAAI,CAAA;AAClB;AAEO,SAAS,aAAa,IAAA,EAA4B;AACvD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,WAAA,GAAc;AAAA,IACZ,GAAI,eAAe,EAAC;AAAA,IACpB,GAAI,QAAQ;AAAC,GACf;AACA,EAAA,QAAA,EAAS;AACX;;AClHA,SAAwB,YAAY,KAAA,EAAoB;AACtD,EAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACV,EAAA,OAAO,IAAA;AACT;;;;"}
@@ -0,0 +1,34 @@
1
+ export type OrbStyle = 'galaxy' | 'ocean-depths' | 'caribbean' | 'cherry-blossom' | 'emerald' | 'multi-color' | 'golden-glow' | 'volcanic';
2
+ export type Theme = 'light' | 'dark' | 'glass';
3
+ export type InitOptions = {
4
+ projectId: string;
5
+ apiBaseUrl?: string;
6
+ position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
7
+ theme?: Theme;
8
+ orbStyle?: OrbStyle;
9
+ widgetTitle?: string;
10
+ widgetButtonTitle?: string;
11
+ /** Master switch: when false, no LiveKit connect (UI-only). Default: true */
12
+ agentEnabled?: boolean;
13
+ /** Voice playback & visualizer toggle. Default: true */
14
+ voiceEnabled?: boolean;
15
+ /** Optional CSS variables map (e.g. {"--bello-bg":"#101010"}) */
16
+ themeVars?: Record<string, string>;
17
+ };
18
+ export type PublicConfig = {
19
+ widgetTitle: string;
20
+ widgetButtonTitle: string;
21
+ orbStyle: OrbStyle;
22
+ theme: Theme;
23
+ position: NonNullable<InitOptions['position']>;
24
+ /** Server-provided CSS variables */
25
+ themeVars?: Record<string, string>;
26
+ };
27
+ export type ConnectionDetails = {
28
+ serverUrl: string;
29
+ participantToken: string;
30
+ };
31
+ export type Cmd = ['init', InitOptions] | ['open'] | ['close'] | ['update', Partial<InitOptions>];
32
+ export type BelloQueue = Cmd[] & {
33
+ push?: (c: Cmd) => number;
34
+ };
package/dist/vite.svg ADDED
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
@@ -0,0 +1,9 @@
1
+ import type { InitOptions, Theme } from '../types';
2
+ export declare function BelloWidget({ opts, theme, onClose, }: {
3
+ opts: InitOptions;
4
+ theme: Theme;
5
+ onClose: () => void;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ /** Messages only (no input here anymore) */
8
+ declare function ChatRegion(): import("react/jsx-runtime").JSX.Element;
9
+ export default ChatRegion;
@@ -0,0 +1,4 @@
1
+ import type { ReceivedChatMessage } from '@livekit/components-react';
2
+ export default function ChatEntry({ entry, }: {
3
+ entry: ReceivedChatMessage;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,4 @@
1
+ export default function ChatInput({ onSend, disabled, }: {
2
+ onSend: (text: string) => void;
3
+ disabled?: boolean;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import type { TextStreamData, ReceivedChatMessage } from '@livekit/components-react';
2
+ import type { Room } from 'livekit-client';
3
+ /**
4
+ * Public helper used by the hook, intentionally mimicking your Next.js signature:
5
+ * transcriptionToChatMessage(transcription, room)
6
+ */
7
+ export declare function transcriptionToChatMessage(t: TextStreamData, room?: Room): ReceivedChatMessage;
@@ -0,0 +1,9 @@
1
+ import type { Room } from 'livekit-client';
2
+ import type { TextStreamData, ReceivedChatMessage } from '@livekit/components-react';
3
+ export declare function extractText(t: any): string;
4
+ export declare function isFinalUtterance(t: any): boolean;
5
+ /** A stable key per utterance: prefer LiveKit segment id, then stream id, then a fallback */
6
+ export declare function utteranceKeyOf(t: any): string;
7
+ /** Decide "isLocal" once per utterance; trust identity hints and fall back to room.identity */
8
+ export declare function decideIsLocalOnce(key: string, t: any, room?: Room): boolean;
9
+ export declare function transcriptionToChatMessage(t: TextStreamData, room?: Room): ReceivedChatMessage;
@@ -0,0 +1,13 @@
1
+ import { type ReceivedChatMessage } from '@livekit/components-react';
2
+ /**
3
+ * Merges LiveKit transcriptions + data channel chat:
4
+ * - Sticky side per utterance (no flicker)
5
+ * - Agent speech appears immediately (no need to type)
6
+ * - Finalized voice turns persist
7
+ * - Exposes `revision` so UIs can auto-scroll even when length is unchanged
8
+ */
9
+ export default function useChatAndTranscription(): {
10
+ messages: ReceivedChatMessage[];
11
+ send: (message: string, options?: import("livekit-client").SendTextOptions) => Promise<ReceivedChatMessage>;
12
+ revision: string;
13
+ };
@@ -0,0 +1,15 @@
1
+ import { Room } from 'livekit-client';
2
+ import type { InitOptions } from '../types';
3
+ /**
4
+ * Reliable LiveKit connect flow for embedded usage:
5
+ * - Resumes AudioContext (autoplay policy)
6
+ * - Atomic mic + connect with preConnectBuffer
7
+ * - Basic event handling + cleanup
8
+ */
9
+ export declare function useLiveKit(opts: InitOptions, enabled: boolean): {
10
+ room: Room;
11
+ error: string | null;
12
+ setError: import("react").Dispatch<import("react").SetStateAction<string | null>>;
13
+ connecting: boolean;
14
+ connected: boolean;
15
+ };
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@heybello/bello-sdk",
3
+ "private": false,
4
+ "description": "Bello SDK for embedding Bello in your applications",
5
+ "version": "0.1.0",
6
+ "type": "module",
7
+ "main": "dist/bello-embed.umd.cjs",
8
+ "module": "dist/bello-embed.es.js",
9
+ "unpkg": "dist/bello-embed.iife.js",
10
+ "types": "dist/types.d.ts",
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "sideEffects": false,
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/types.d.ts",
18
+ "import": "./dist/bello-embed.es.js",
19
+ "require": "./dist/bello-embed.umd.cjs",
20
+ "default": "./dist/bello-embed.iife.js"
21
+ },
22
+ "./react": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/react.es.js",
25
+ "require": "./dist/react.cjs"
26
+ },
27
+ "./iife": {
28
+ "default": "./dist/bello-embed.iife.js"
29
+ }
30
+ },
31
+ "scripts": {
32
+ "dev:embed": "vite build --mode embed --watch",
33
+ "serve:root": "serve . -l 5174",
34
+ "dev:iife": "concurrently -k \"pnpm dev:embed\" \"pnpm serve:root\"",
35
+ "build:embed": "vite build --mode embed",
36
+ "build:react": "rollup -c",
37
+ "build:types": "tsc -p tsconfig.build.json",
38
+ "build": "rm -rf dist && pnpm build:embed && pnpm build:react && pnpm build:types"
39
+ },
40
+ "dependencies": {
41
+ "@livekit/components-react": "^2.9.14",
42
+ "framer-motion": "^12.23.12",
43
+ "livekit-client": "^2.15.6",
44
+ "lucide": "^0.544.0",
45
+ "lucide-react": "^0.544.0",
46
+ "react": "^19.0.0",
47
+ "react-ai-orb": "^1.0.13",
48
+ "react-dom": "^19.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "@eslint/js": "^9.33.0",
52
+ "@types/react": "^19.1.10",
53
+ "@types/react-dom": "^19.1.7",
54
+ "@vitejs/plugin-react-swc": "^4.0.0",
55
+ "@rollup/plugin-commonjs": "^28.0.1",
56
+ "@rollup/plugin-node-resolve": "^15.3.0",
57
+ "@rollup/plugin-replace": "^5.0.7",
58
+ "concurrently": "^8.2.2",
59
+ "eslint": "^9.33.0",
60
+ "eslint-plugin-react-hooks": "^5.2.0",
61
+ "eslint-plugin-react-refresh": "^0.4.20",
62
+ "globals": "^16.3.0",
63
+ "rollup": "^4.34.0",
64
+ "rollup-plugin-esbuild": "^6.1.1",
65
+ "sass-embedded": "^1.92.1",
66
+ "serve": "^14.2.3",
67
+ "typescript": "~5.8.3",
68
+ "typescript-eslint": "^8.39.1",
69
+ "vite": "^7.1.2"
70
+ }
71
+ }